ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8gICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX198IHwgfCB8ICBfIFx8IHwgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfCAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlzdG9yeSBvZiBDaGFuZ2VzCgpEYW5pZWwgKDI4IE5vdmVtYmVyIDIwMDApCi0gSSBmaWxsZWQgaW4gbW9yZSBlcnJvciBjb2RlcyBpbiB0aGUgbWFuIHBhZ2UgZXJyb3IgY29kZSBsaXN0IHRoYXQgaGFkIGJlZW4KICBsYWdnaW5nLgoKLSBKYW1lcyBHcmlmZml0aHMgbWFpbGVkIG1lIGEgZmluZSBwYXRjaCB0aGF0IGludHJvZHVjZXMgdGhlIENVUkxPUFRfTUFYUkVESVJTCiAgbGliY3VybCBvcHRpb24uIFdoZW4gdXNlZCwgaXQnbGwgcHJldmVudCBsb2NhdGlvbiBmb2xsb3dpbmcgbW9yZSB0aGFuIHRoZQogIHNldCBudW1iZXIgb2YgdGltZXMuIEl0IGlzIHVzZWZ1bCB0byBicmVhayBvdXQgb2YgZW5kbGVzcyByZWRpcmVjdC1sb29wcy4KCkRhbmllbCAoMjcgTm92ZW1iZXIgMjAwMCkKLSBBZGRlZCB0d28gdGVzdCBjYXNlcyBmb3IgZmlsZTovLy4KCkRhbmllbCAoMjIgTm92ZW1iZXIgMjAwMCkKLSBBZGRlZCB0aGUgbGliY3VybCBDVVJMT1BUX0ZJTEVUSU1FIHNldG9wdCwgd2hlbiBzZXQgaXQgdHJpZXMgdG8gZ2V0IHRoZQogIG1vZGlmaWVkIHRpbWUgb2YgdGhlIHJlbW90ZSBkb2N1bWVudC4gVGhpcyBpcyBhIHNwZWNpYWwgb3B0aW9uIHNpbmNlIGl0CiAgaW52b2x2ZXMgYW4gZXh0cmEgc2V0IG9mIGNvbW1hbmRzIG9uIEZUUCBzZXJ2ZXJzLiAoVXNpbmcgdGhlIE1EVE0gY29tbWFuZAogIHdoaWNoIGlzIG5vdCBpbiB0aGUgUkZDOTU5KQoKICBjdXJsX2Vhc3lfZ2V0aW5mbygpIGdvdCBhIGNvcnJlc3BvbmRpbmcgQ1VSTElORk9fRklMRVRJTUUgdG8gZ2V0IHRoZSB0aW1lCiAgYWZ0ZXIgYSB0cmFuc2Zlci4gSXQnbGwgcmV0dXJuIGEgemVybyBpZiBDVVJMT1BUX0ZJTEVUSU1FIHdhc24ndCB1c2VkIG9yIGlmCiAgdGhlIHRpbWUgd2Fzbid0IHBvc3NpYmxlIHRvIGdldC4KCiAgLS1oZWFkLy1JIHVzZWQgb24gYSBGVFAgc2VydmVyIHdpbGwgbm93IHByZXNlbnQgYSAnTGFzdC1Nb2RpZmllZDonIGhlYWRlcgogIGlmIGN1cmwgY291bGQgZ2V0IHRoZSB0aW1lIG9mIHRoZSBzcGVjaWZpZWQgZmlsZS4KCi0gQWRkZWQgdGhlIG9wdGlvbiAnLS1jYWNlcnQgW2ZpbGVdJyB0byBjdXJsLCB3aGljaCBhbGxvd3MgYSBzcGVjaWZpZWQgUEVNCiAgZmlsZSB0byBiZSB1c2VkIHRvIHZlcmlmeSB0aGUgcGVlcidzIGNlcnRpZmljYXRlIHdoZW4gZG9pbmcgSFRUUFMKICBjb25uZWN0aW9ucy4gVGhpcyBoYXMgYmVlbiByZXF1ZXN0ZWQsIHJhdGhlciByZWNlbnRseSBieSBIdWxrYSBCb2h1c2xhdiBidXQKICBvdGhlcnMgaGF2ZSBhc2tlZCBmb3IgaXQgYmVmb3JlIGFzIHdlbGwuCgpEYW5pZWwgKDIxIE5vdmVtYmVyIDIwMDApCi0gTnVtZXJvdXMgZml4ZXMgdGhlIHRlc3Qgc3VpdGUgaGFzIGJyb3VnaHQgaW50byB0aGUgZGF5bGlnaHQ6CgogICAqIGN1cmxfdW5lc2NhcGUoKSBjb3VsZCByZXR1cm4gYSB0b28gbG9uZyBzdHJpbmcKICAgKiBvbiBmdHAgdHJhbnNmZXIgZmFpbHVyZXMsIHRoZXJlIGNvdWxkIGJlIG1lbW9yeSBsZWFrcwogICAqIGZ0cCBDV0QgY291bGQgdXNlIGJhZCBkaXJlY3RvcnkgbmFtZXMKICAgKiBtZW1kZWJ1ZyBub3cgdXNlcyB0aGUgbXByaW50ZigpIHJvdXRpbmVzIGZvciBiZXR0ZXIgcG9ydGFiaWxpdHkKICAgKiBmcmVlKE5VTEwpIHJlbW92ZWQgd2hlbiBkb2luZyByZXN1bWVkIHRyYW5zZmVycwoKLSBBZGRlZCBhIGJ1bmNoIG9mIHRlc3QgY2FzZXMgZm9yIEZUUC4KCi0gR2VuZXJhbCBjbGVhbnVwcyB0byBtYWtlIGxlc3Mgd2FybmluZ3Mgd2l0aCBnY2MgLVdhbGwgLXBlZGFudGljLgoKLSBJIG1hZGUgdGhlIHRlc3RzL2Z0cHNlcnZlci5wbCB3b3JrIHdpdGggdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBmdHAKICBvcGVyYXRpb25zLiBQT1JULCBQQVNWLCBSRVRSLCBTVE9SLCBMSVNULCBTSVpFLCBVU0VSLCBQQVNTIGFsbCB3b3JrIG5vdy4gTm93CiAgYWxsIEkgaGF2ZSB0byBkbyBpcyBpbnRlZ3JhdGUgdGhlIGZ0cCBzZXJ2ZXIgZG9pbmdzIGluIHRoZSBydW50ZXN0cy5wbAogIHNjcmlwdCBzbyB0aGF0IGZ0cCB0ZXN0cyBjYW4gYmUgcnVuIHRoZSBzYW1lIHdheSBodHRwIHRlc3RzIGFscmVhZHkgcnVuLgoKRGFuaWVsICgyMCBOb3ZlbWJlciAyMDAwKQotIE1hZGUgbGliY3VybCBjYXBhYmxlIG9mIGRlYWxpbmcgd2l0aCBhbnktbGVuZ3RoIFVSTHMuIFRoZSBmb3JtZXIgbGltaXQgb2YKICA0MDk2IGJ5dGVzIHdhcyBhIGJpdCBhbm5veWluZyB3aGVuIHBlb3BsZSB3YW50ZWQgdG8gdXNlIGN1cmwgdG8gcmVhbGx5IG1ha2UKICBsaWZlIHRvdWdoIG9uIGEgd2ViIHNlcnZlci4gTm93LCB0aGUgY29tbWFuZCBsaW5lIGxpbWl0IGlzIHRoZSBtb3N0IGFubm95aW5nCiAgYnV0IHRoYXQgY2FuIGJlIGNpcmN1bXZlbnRlZCBieSB1c2luZyBhIGNvbmZpZyBmaWxlLgoKICBOT1RFOiB0aGVyZSBpcyBzdGlsbCBhIDQwOTYtYnl0ZSBsaW1pdCBvbiBVUkxzIGV4dHJhY3RlZCBmcm9tIExvY2F0aW9uOgogIGhlYWRlcnMuCgotIENvcnJlY3RlZCB0aGUgc3BlbGxpbmcgb2YgJ3Jlc29sdmUnIGluIHR3byBlcnJvciBtZXNzYWdlcy4KCi0gQWxleGFuZGVyIEtvdXJha29zIHBvc3RlZCBhIGJ1ZyByZXBvcnQgYW5kIGEgcGF0Y2ggdGhhdCBjb3JyZWN0ZWQgaXQhIEl0CiAgdHVybmVkIG91dCB0aGF0IGx5bnggYW5kIHdnZXQgc3VwcG9ydCBsb3dlcmNhc2UgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZXMKICB3aGVyZSBjdXJsIG9ubHkgbG9va2VkIGZvciB0aGUgdXBwZXJjYXNlIHZlcnNpb25zLiBOb3cgY3VybCB3aWxsIHVzZSB0aGUKICBsb3dlcmNhc2UgdmVyc2lvbnMgaWYgdGhleSBleGlzdCwgYnV0IGlmIHRoZXkgZG9uJ3QsIGl0J2xsIHVzZSB0aGUgdXBwZXJjYXNlCiAgdmVyc2lvbnMuCgpEYW5pZWwgKDE3IE5vdmVtYmVyIDIwMDApCi0gY3VybF9mb3JtZnJlZSgpIHdhcyBhZGRlZC4gSG93IGNvbWUgbm8gb25lIG1pc3NlZCB0aGF0IG9uZSBiZWZvcmU/IEkgcmFuIHRoZQogIHRlc3Qgc3VpdGUgd2l0aCB0aGUgbWFsbG9jIGRlYnVnIGVuYWJsZWQgYW5kIGdvdCBsb3RzIG9mICJuaWNlIiB3YXJuaW5ncyBvbgogIG1lbW9yeSBsZWFrcy4gVGhlIG1vc3Qgc2VyaW91cyBvbmUgd2FzIHRoaXMuIFRoZXJlIHdlcmUgYWxzbyBsZWFrcyBpbiB0aGUKICBjb29raWUgaGFuZGxpbmcsIGFuZCBhIGZldyBlcnJvcnMgd2hlbiBjdXJsIGZhaWxlZCB0byBjb25uZWN0IGFuZCBzaW1pbGFyCiAgdGhpbmdzLiBNb3JlIHRlc3RzIGNhc2VzIHdlcmUgYWRkZWQgdG8gY292ZXIgdXAgYW5kIHRvIHZlcmlmeSB0aGF0IHRoZXNlCiAgcHJvYmxlbXMgaGF2ZSBiZWVuIHJlbW92ZWQuCgotIE11Y2hvIHVwZGF0ZWQgY29uZmlnIGZpbGUgcGFyc2VyIChJJ20gZGVhZCB0aXJlZCBvZiBhbGwgdGhlIGJ1ZyByZXBvcnRzIGFuZAogIHdlaXJkIGJlaGF2aW91ciBJIGdldCBvbiB0aGUgZm9ybWVyIG9uZSkuIEl0IHdvcmtzIHNsaWdodGx5IGRpZmZlcmVudGx5IG5vdywKICBhbHRob3VnaCBJIGRvdWJ0IG1hbnkgcGVvcGxlIHdpbGwgbm90aWNlIHRoZSBkaWZmZXJlbmNlcy4gVGhlIG1haW4KICBkaWZmZXJlbmNlIGJlaW5nIHRoYXQgaWYgeW91IHVzZSBvcHRpb25zIHRoYXQgcmVxdWlyZSBwYXJhbWV0ZXJzLCB0aGV5IG11c3QKICBib3RoIGJlIHNwZWNpZmllZCBvbiB0aGUgc2FtZSBsaW5lLiBXaXRoIHRoaXMgbmV3IHBhcnNlciwgeW91IGNhbiBhbHNvCiAgc3BlY2lmeSBsb25nIG9wdGlvbnMgd2l0aG91dCAnLS0nIGFuZCB5b3UgbWF5IHNlcGFyYXRlIG9wdGlvbnMgYW5kCiAgcGFyYW1ldGVycyB3aXRoIDogb3IgPS4gSXQgbWFrZXMgYSBjb25maWcgZmlsZSBsaW5lIGNvdWxkIGxvb2sgbGlrZToKCiAgICAgICAgdXNlci1hZ2VudCA9ICJmb29iYXIgYW5kIHNvbWV0aGluZyIKCiAgUGFyYW1ldGVycyB3aXRoaW4gcXVvdGVzIG1heSBjb250YWluIHNwYWNlcy4gV2l0aG91dCBxdW90ZXMsIHRoZXkncmUKICBleHBlY3RlZCB0byBiZSBhIHNpbmdsZSBub24tc3BhY2Ugd29yZC4KCiAgSGFkIHRvIHBhdGNoIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQgcGFyc2VyIGEgbGl0dGxlIHRvIG1ha2UgdGhpcyB3b3JrLgoKLSBBZGRlZCAtLXVybCBhcyBhbiBvcHRpb24gdG8gYWxsb3cgdGhlIFVSTCB0byBiZSBzcGVjaWZpZWQgdGhpcyB3YXkuIEl0IG1ha2VzCiAgd2F5IG5pY2VyIGNvbmZpZyBmaWxlcy4gVGhlIHByZXZpb3VzIHdheSBvZiBzcGVjaWZ5aW5nIFVSTHMgaW4gdGhlIGNvbmZpZwogIGZpbGUgZG9lc24ndCB3b3JrIGFueW1vcmUuCgpEYW5pZWwgKDE1IE5vdmVtYmVyIDIwMDApCi0gVXNpbmcgY2VydGFpbiBjaGFyYWN0ZXJzIGluIHVzZXJuYW1lcyBvciBwYXNzd29yZHMgZm9yIEhUVFAgYXV0aGVudGljYXRpb24KICBmYWlsZWQuIFRoaXMgd2FzIGR1ZSB0byB0aGUgbXByaW50ZigpIHRoYXQgaGFkIGEgc2lsbHkgY2hlY2sgZm9yIGxldHRlcnMsCiAgYW5kIGlmIHRoZXkgd2VyZW4ndCBpc3ByaW50KCkgdGhleSB3ZXJlbid0IG91dHB1dGVkICJhcy1pcyIuIFRoaXMgY2F1c2VkCiAgcGFzc3dvcmRzIGFuZCB1c2VybmFtZXMgdXNpbmcgJ6cnIChmb3IgZXhhbXBsZSkgdG8gZmFpbC4KClZlcnNpb24gNy40LjIKCkRhbmllbCAoMTUgTm92ZW1iZXIgMjAwMCkKLSAndGVzdHMvcnVudGVzdHMucGwnIG5vdyBzb3J0cyB0aGUgdGVzdCBjYXNlcyBwcm9wZXJseSB3aGVuICdhbGwnIGlzIHVzZWQuCgpEYW5pZWwgKDE0IE5vdmVtYmVyIDIwMDApCi0gSSBmZWxsIG92ZXIgdGhlIGRyYWZ0LWlldGYtZnRwZXh0LW1sc3QtMTIudHh0IEludGVybmV0IERyYWZ0IHRpdGxlZAogICJFeHRlbnNpb25zIHRvIEZUUCIgdGhhdCBjb250YWlucyBhIGRlZmluZWQgd2F5IGhvdyB0aGUgZnRwIGNvbW1hbmQgU0laRQogIGNvdWxkIGJlIGFzc3VtZWQgdG8gd29yay4KCi0gTGF1cmVudCBQYXBpZXIgcG9zdGVkIGEgYnVnIHJlcG9ydCBhYm91dCB1c2luZyAiLUMgLSIgYW5kIEZUUCB1cGxvYWRpbmcgYQogIGZpbGUgdGhhdCBpc24ndCBwcnNlbnQgb24gdGhlIHNlcnZlci4gVGhlIHNlcnZlciBtaWdodCB0aGVuIHJldHVybiBhIDU1MCBhbmQKICBjdXJsIHdpbGwgZmFpbC4gU2hvdWxkIGl0IGluc3RlYWQgYXMgTGF1cmVudCBQYXBpZXIgc3VnZ2VzdHMsIHN0YXJ0CiAgdXBsb2FkaW5nIGZyb20gdGhlIGJlZ2lubmluZyBhcyBhIG5vcm1hbCB1cGxvYWQ/CgpEYW5pZWwgKDEzIE5vdmVtYmVyIDIwMDApCi0gRml4ZWQgYSBjcmFzaCB3aXRoIHRoZSBmb2xsb3dsb2NhdGlvbiBjb3VudGVyLgoKLSBXaGlsZSB3cml0aW5nIHRlc3QgY2FzZXMgZm9yIHRoZSB0ZXN0IHN1aXRlLCBJIGRpc2NvdmVyZWQgYW4gb2xkIGxpbWl0YXRpb24KICB0aGF0IHByZXZlbnRlZCAtbyBhbmQgLVQgdG8gYmUgdXNlZCBhdCB0aGUgc2FtZSB0aW1lLiBJIHJlbW92ZWQgdGhpcwogIGltbWVkaWF0ZWx5IGFzIHRoaXMgaGFzIG5vIHJlbGV2YW5jZSBpbiB0aGUgY3VycmVudCBsaWJjdXJsLgogIAotIENocmlzIEZhaGVydHkgZml4ZWQgYSBmcmVlLXR3aWNlIHByb2JsZW0gaW4gbGliL2ZpbGUuYwoKLSBJIGZpeGVkIHRoZSBwZXJsIGh0dHAgc2VydmVyIHByb2JsZW0gaW4gdGhlIHRlc3Qgc3VpdGUuCgpWZXJzaW9uIDcuNC4yIHByZTQKCkRhbmllbCAoMTAgTm92ZW1iZXIgMjAwMCkKLSBJJ3ZlIChmaW5hbGx5KSBzdGFydGVkIHdvcmtpbmcgb24gdGhlIGN1cmwgdGVzdCBzdWl0ZS4gSXQgaXMgaW4gdGhlIG5ldwogIHRlc3RzLyBkaXJlY3RvcnkuIEl0IHJlcXVpcmVzIHNoIGFuZCBwZXJsLiBUaGVyZSdzIGEgVENQIHNlcnZlciBpbiBwZXJsIGFuZAogIG1vc3Qgb2YgdGhlIG90aGVyIHN0dWZmIHJ1bm5pbmcgYSBwcmV0dHkgc2ltcGxlIHNoZWxsIHNjcmlwdC4KCiAgSSd2ZSBvbmx5IG1hZGUgZm91ciB0ZXN0IGNhc2VzIHNvIGZhciwgYnV0IGl0IHByb3ZlcyB0aGUgc3lzdGVtIGNhbiB3b3JrLgoKLSBMYXVyZW50IFBhcGllciBub3RpY2VkIHRoYXQgY3VybCBkaWRuJ3Qgc2V0IFRZUEUgd2hlbiBkb2luZyAtLWhlYWQgY2hlY2tzCiAgZm9yIHNpemVzIG9uIEZUUCBzZXJ2ZXJzLiBTb21lIHNlcnZlcnMgc2VlbSB0byByZXR1cm4gZGlmZmVyZW50IHNpemVzCiAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgQVNDSUkgb3IgQklOQVJZIGlzIHVzZWQhCgotIExhdXJlbnQgUGFwaWVyIGRldGVjdGVkIHRoYXQgaWYgeW91IGFwcGVuZGVkIGEgRlRQIHVwbG9hZCBhbmQgZXZlcnl0aGluZyB3YXMKICBhbHJlYWR5IHVwbG9hZGVkLCBjdXJsIHdvdWxkIGhhbmcuCgotIEFuZ3VzIE1hY2theSdzIGdldHBhc3NfcigpIGluIGxpYi9nZXRwYXNzLmMgaXMgbm93IGNvbXBsaWFudCB3aXRoIHRoZQogIGdldHBhc3NfcigpIGZ1bmN0aW9uIGl0IHNlZW1zIHNvbWUgc3lzdGVtcyBhY3R1YWxseSBoYXZlLgogIAotIFZlbmthdGFyYW1hbmEgTW9ra2FwYXRpIGRldGVjdGVkIGEgYnVnIGluIHRoZSBjb29raWUgcGFyc2VyIGFuZCBjb3JyZWN0ZWQKICBpdC4gIElmIHRoZSBjb29raWUgd2FzIHNldCBmb3IgdGhlIGZ1bGwgaG9zdCBuYW1lIChkb21haW49ZnVsbC5ob3N0LmNvbSksCiAgdGhlIGNvb2tpZSB3YXMgbmV2ZXIgc2VudCBiYWNrIGJlY2F1c2Ugb2YgYSBmYXVsdHkgbGVuZ3RoIGNvbXBhcmlzb24gYmV0d2VlbgogIHRoZSBzZXQgZG9tYWluIGxlbmd0aCBhbmQgdGhlIGN1cnJlbnQgaG9zdCBuYW1lLgoKRGFuaWVsICg5IE5vdmVtYmVyIDIwMDApCi0gQWRkZWQgYSBjb25maWd1cmUgY2hlY2sgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxzb2NrZXQgKE9TLzIgc2VlbXMgdG8gbmVlZAogIGl0KS4gQWRkZWQgYSBjaGVjayBmb3IgUlNBZ2x1ZS9yc2FyZWYgZm9yIHRoZSBjYXNlcyB3aGVyZSBsaWJjcnlwdG8gaXMgZm91bmQKICBidXQgbGlic3NsIGlzbid0LiBJIGhhdmVuJ3QgdmVyaWZpZWQgdGhpcyBmaXggeWV0IHRob3VnaCwgYXMgSSBoYXZlIG5vCiAgc3lzdGVtIHRoYXQgcmVxdWlyZXMgdGhvc2UgbGlicyB0byBidWlsZC4KICAKVmVyc2lvbiA3LjQuMiBwcmUzCgpEYW5pZWwgKDcgTm92ZW1iZXIgMjAwMCkKLSBSZW1vdmVkIHBlcnJvcigpIG91dHB1dHMgZnJvbSBnZXRwYXNzLmMuIEFuZ3VzIE1hY2theSBhbHNvIGFncmVlZCB0byBhCiAgc2xpZ2h0bHkgbW9kaWZpZWQgbGljZW5zZSBvZiB0aGUgZ2V0cGFzcy5jIGZpbGUgYXMgdGhlIHByb3RvdHlwZSB3YXMgY2hhbmdlZC4KCkRhbmllbCAoNiBOb3ZlbWJlciAyMDAwKQotIEFkZGVkIHBvc3NpYmlsaXR5IHRvIHNldCBhIHBhc3N3b3JkIGNhbGxiYWNrIHRvIHVzZSBpbnN0ZWFkIG9mIHRoZSBidWlsdC1pbi4KICBUaGV5J3JlIGNvbnRyb2xlZCB3aXRoIGN1cmxfZWFzeV9zZXRvcHQoKSBvZiBjb3Vyc2UsIHRoZSB0YWdzIGFyZQogIENVUkxPUFRfUEFTU1dERlVOQ1RJT04gYW5kIENVUkxPUFRfUEFTU1dEREFUQS4KCi0gVXNlZCBULiBCaGFyYXRoJ3MgdGhpbmtpbmcgYW5kIGZpeGVkIHRoZSB0aW1lcnMgdGhhdCBzaG93ZWQgdGVycmlibHkgd3JvbmcKICB0aW1lcyB3aGVuIGxvY2F0aW9uOiBoZWFkZXJzIHdlcmUgZm9sbG93ZWQuCgotIEVtbWFudWVsIFR5Y2hvbiBkaXNjb3ZlcmVkIHRoYXQgY3VybCBkaWRuJ3QgcmVhbGx5IGxpa2UgdXNlciBuYW1lcyBvbmx5IGluCiAgdGhlIFVSTC4gSSBjb3JyZWN0ZWQgdGhpcyBhbmQgSSBhbHNvIGZpeGVkIHRoZSBzaW5jZSBsb25nIGxpdmluZyBwcm9ibGVtCiAgd2l0aCBVUkwgZW5jb2RlZCB1c2VyIG5hbWVzIGFuZCBwYXNzd29yZHMgaW4gdGhlIFVSTHMuIFRoZXkgc2hvdWxkIHdvcmsgbm93LgogIApEYW5pZWwgKDIgTm92ZW1iZXIgMjAwMCkKLSBXaGVuIEkgYWRkZWQgLS1pbnRlcmZhY2UsIHRoZSBuZXcgZXJyb3IgY29kZSB0aGF0IHdhcyBhZGRlZCB3aXRoIGl0IHdhcwogIGluc2VydGVkIGluIHRoZSB3cm9uZyBwbGFjZSBhbmQgdGh1cyBhbGwgZXJyb3IgY29kZXMgZnJvbSAzNSBhbmQgdXB3YXJkcyBnb3QKICBpbmNyZWFzZWQgb25lIHN0ZXAuIFRoaXMgaXMgbm93IGNvcnJlY3RlZCwgd2UncmUgYmFjayBhdCB0aGUgcHJldmlvdXMKICBudW1iZXJzLiBBbGwgbmV3IGV4aXQgY29kZXMgc2hvdWxkIGJlIGFkZGVkIGF0IHRoZSBlbmQuCgpEYW5pZWwgKDEgTm92ZW1iZXIgMjAwMCkKLSBBZGRlZCBhIGNoZWNrIGZvciBzaWduYWwoKSBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCBzbyB0aGF0IGlmIHNpZ2FjdGlvbigpCiAgaXNuJ3QgcHJlc2VudCwgd2UgY2FuIHVzZSBzaWduYWwoKSBpbnN0ZWFkLgoKLSBJJ20gaGF2aW5nIGEgbGljZW5zZSBkaXNjdXNzaW9uIGdvaW5nIG9uIHByaXZhdGVseS4gVGhlIGlzc3VlIGlzIHlldCBhZ2FpbgogIEdQTC1saWNlbnNlZCBwcm9ncmFtcyB0aGF0IGhhdmUgcHJvYmxlbXMgd2l0aCBNUEwuIEkgYW0gbGVhbmluZyB0b3dhcmRzCiAgbWFraW5nIGEga2luZCBvZiBkdWFsLWxpY2Vuc2UgdGhhdCB3aWxsIHNvbHZlIHRoaXMgb25jZSBhbmQgZm9yIGFsbC4uLgoKRGFuaWVsICgzMSBPY3RvYmVyIDIwMDApCi0gQWRkZWQgdGhlIHBhY2thZ2VzLyBkaXJlY3RvcnkuIEkgaW50ZW5kIHRvIGxldCB0aGlzIGNvbnRhaW4gc29tZSBkb2NzIGFuZAogIHRlbXBsYXRlcyBvbiBob3cgdG8gZ2VuZXJhdGUgY3VzdG9tLWZvcm1hdCBwYWNrYWdlcyBmb3IgdmFyaW91cyBwbGF0Zm9ybXMuCiAgSSd2ZSBub3cgcmVtb3ZlZCB0aGUgUlBNIHJlbGF0ZWQgY3VybC5zcGVjIGZpbGVzIGZyb20gdGhlIGFyY2hpdmUgcm9vdC4KCkRhbmllbCAoMzAgT2N0b2JlciAyMDAwKQotIFQuIEJoYXJhdGggYnJvdWdodCBhIHNldCBvZiBwYXRjaGVzIHRoYXQgYnJpbmcgbmV3IGZ1bmN0aW9uYWxpdHkgdG8KICBjdXJsX2Vhc3lfZ2V0aW5mbygpIGFuZCBjdXJsX2Vhc3lfc2V0b3B0KCkuIE5vdyB5b3UgY2FuIHJlcXVlc3QgcGVlcgogIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiB3aXRoIHRoZSAqc2V0b3B0KCkgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiBvcHRpb24KICBhbmQgdGhlbiB1c2UgdGhlIENVUkxPUFRfQ0FJTkZPIHRvIHNldCB0aGUgY2VydGlmaWNhdGUgdG8gdmVyaWZ5IHRoZSByZW1vdGUKICBwZWVyIGFnYWluc3QuIEFmdGVyIGFuIHN1Y2ggYW4gb3BlcmF0aW9uIHdpdGggYSB2ZXJpZmljYXRpb24gcmVxdWVzdCwgdGhlCiAgKl9nZXRpbmZvKCkgb3B0aW9uIENVUkxJTkZPX1NTTF9WRVJJRllSRVNVTFQgd2lsbCByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQKICB3aGV0aGVyIHRoZSB2ZXJpZmljYXRpb24gc3VjY2VlZGVkIG9yIG5vdC4gIAoKRGFuaWVsICgyNyBPY3RvYmVyIDIwMDApCi0gR2VvcmcgSG9ybiBicm91Z2h0IHVzIGEgc3BsZW5kaWQgcGF0Y2ggdGhhdCBzb2x2ZXMgdGhlIGxvbmctc3RhbmRpbmcKICBhbm5veWluZyBwcm9ibGVtIHdpdGggdGltZW91dHMgdGhhdCBtYWRlIGN1cmwgZXhpdCB3aXRoIHNpbGx5IGV4aXQgY29kZXMKICAod2hpY2ggYXMgYmVlbiBjb21tZW50ZWQgb3V0IGxhdGVseSkuIFRoaXMgc29sdXRpb24gaXMgc2lnYWN0aW9uKCkgYmFzZWQgYW5kCiAgb2YgY291cnNlIHRoZW4gb25seSB3b3JrcyBmb3IgdW5peGVzIChhbmQgb25seSB0aG9zZSB1bml4ZXMgdGhhdCBhY3R1YWxseQogIGhhdmUgdGhlIHNpZ2FjdGlvbigpIGZ1bmN0aW9uKS4KCkRhbmllbCAoMjYgT2N0b2JlciAyMDAwKQotIEJq9nJuIFN0ZW5iZXJnIHN1cHBsaWVkIGEgcGF0Y2ggdGhhdCBmaXhlZCB0aGUgZmxhdyBtZW50aW9uZWQgYnkgS2V2aW4gUm90aAogIHRoYXQgbWFkZSB0aGUgcGFzc3dvcmQgZ2V0IGVjaG9lZCB3aGVuIHByb21wdGVkIGZvciBpbnRlcmFjdGl2ZWx5LiBUaGUKICBnZXRwYXNzKCkgZnVuY3Rpb24gKG5vdyBrbm93biBhcyBteV9nZXRwYXNzKCkpIHdhcyBhbHNvIGZpeGVkIHRvIG5vdCB1c2UgYW55CiAgc3RhdGljIGJ1ZmZlcnMuIFRoaXMgYWxzbyBtZWFucyB3ZSBjYW5ub3QgdXNlIHRoZSAic3RhbmRhcmQiIGdldHBhc3MoKQogIGZ1bmN0aW9uIGV2ZW4gZm9yIHRob3NlIHN5c3RlbXMgdGhhdCBoYXZlIGl0LCBzaW5jZSBpdCBpc24ndCB0aHJlYWQtc2FmZS4KICAKLSBLZXZpbiBSb3RoIGZvdW5kIG91dCB0aGF0IGlmIHlvdSdkIHdyaXRlIGEgY29uZmlnIGZpbGUgd2l0aCAnLXYgdXJsJywgdGhlCiAgdXJsIHdvdWxkIG5vdCBiZSB1c2VkIGFzICJkZWZhdWx0IFVSTCIgYXMgZG9jdW1lbnRlZCwgYWx0aG91Z2ggaWYgeW91IHdyb3RlCiAgaXQgJ3VybCAtdicgaXQgd29ya2VkISBUaGlzIGhhcyBiZWVuIGNvcnJlY3RlZCBub3cuCgotIEtldmluIFJvdGgncyBpZGVhIG9mIHVzaW5nIG11bHRpcGxlIC1kIG9wdGlvbnMgb24gdGhlIHNhbWUgY29tbWFuZCBsaW5lIHdhcwogIGp1c3QgYnJpbGxpYW50LCBhbmQgSSBjb3VsZG4ndCByZWFsbHkgdGhpbmsgb2YgYW55IHJlYXNvbiB3aHkgd2Ugc2hvdWxkbid0CiAgc3VwcG9ydCBpdCEgVGhlIGFwcGVuZCBmdW5jdGlvbiBhbHdheXMgYXBwZW5kICcmJyBhbmQgdGhlbiB0aGUgbmV3IC1kCiAgY2h1bmsuIFRoaXMgZW5hYmxlcyBjb25zdHJ1Y3RzIGxpa2UgdGhlIGZvbGxvd2luZzoKCiAgICAgICAgY3VybCAtZCBuYW1lPWRhbmllbCAtZCBhZ2U9dW5rbm93biBmb29iYXJzaXRlLmNvbQoKRGFuaWVsICgyNCBPY3RvYmVyIDIwMDApCi0gSSBmaXhlZCB0aGUgbGliL21lbWRlYnVnLmMgc291cmNlIHNvIHRoYXQgaXQgY29tcGlsZXMgb24gTGludXggYW5kIG90aGVyCiAgc3lzdGVtcy4gSXQgd2lsbCBiZSB1c2VmdWwgb25lIGRheSB3aGVuIHNvbWVvbmUgZWxzZSBidXQgbWUgd2FudHMgdG8gcnVuIHRoZQogIG1lbW9yeSBkZWJ1Z2dpbmcgc3lzdGVtLgoKRGFuaWVsICgyMyBPY3RvYmVyIDIwMDApCi0gSSBtb2RpZmllZCB0aGUgbWFrZXRneiBhbmQgY29uZmlndXJlIHNjcmlwdHMsIHNvIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQKICB3aWxsIGZldGNoIHRoZSB2ZXJzaW9uIG51bWJlciBmcm9tIHRoZSBpbmNsdWRlL2N1cmwvY3VybC5oIGhlYWRlciBmaWxlcywgYW5kCiAgdGhlbiB0aGUgbWFrZXRneiBkb2Vzbid0IGhhdmUgdG8gcmVidWlsZCB0aGUgY29uZmlndXJlIHNjcmlwdCB3aGVuIEkgYnVpbGQKICByZWxlYXNlLWFyY2hpdmVzLgoKLSBCavZybiBTdGVuYmVyZyBhbmQgTGludXMgTmllbHNlbiBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgdGhhdCBjdXJsIHdhcyBzaWxseQogIGVub3VnaCB0byBub3QgYWxsb3cgQC1sZXR0ZXJzIGluIHBhc3N3b3JkcyB3aGVuIHRoZXkgd2VyZSBzcGVjaWZpZWQgd2l0aCB0aGUKICAtdSBvciAtVSBmbGFncyAoQ1VSTE9QVF9VU0VSUFdEIGFuZCBDVVJMT1BUX1BST1hZVVNFUlBXRCkuIFRoaXMgYWxzbwogIHN1Z2dlc3RzIHRoYXQgY3VybCBwcm9iYWJseSBzaG91bGQgdXJsLWRlY29kZSB0aGUgcGFzc3dvcmQgcGllY2Ugb2YgYW4gVVJMCiAgc28gdGhhdCB5b3UgY291bGQgcGFzcyBhbiBlbmNvZGVkIEAtbGV0dGVyIHRoZXJlLi4uCiAgCkRhbmllbCAoMjAgT2N0b2JlciAyMDAwKQotIFlldCBhbm90aGVyIGh0dHAgc2VydmVyIGJhcmZlZCBvbiBjdXJsJ3MgcmVxdWVzdCB0aGF0IGluY2x1ZGUgdGhlIHBvcnQKICBudW1iZXIgaW4gdGhlIEhvc3Q6IGhlYWRlciBhbHdheXMuIEkgbm93IG9ubHkgaW5jbHVkZSB0aGUgcG9ydCBudW1iZXIgaWYgaXQKICBpc24ndCB0aGUgZGVmYXVsdCAoODAgZm9yIEhUVFAsIDQ0MyBmb3IgSFRUUFMpLiB3d3cucGVybC5jb20gdHVybmVkIG91dCB0bwogIHJ1biBvbmUgb2YgdGhvc2UgbmFzdHkgc2VydmVycy4KCi0gVGhlIFBIUDQgbW9kdWxlIGZvciBjdXJsIGhhZCBwcm9ibGVtcyB3aXRoIHJlZmVyZXIgdGhhdCBzZWVtcyB0byBoYXZlIGJlZW4KICBjb3JyZWN0ZWQganVzdCB5ZXN0ZXJkYXkuIChTdGVybGluZyBIdWdoZXMgb2YgdGhlIFBIUCB0ZWFtIGNvbmZpcm1lZCB0aGlzKQoKRGFuaWVsICgxNyBPY3RvYmVyIDIwMDApCi0gVmxhZGltaXIgT2Jsb21vdiByZXBvcnRlZCB0aGF0IHRoZSAtWSBhbmQgLXkgb3B0aW9ucyBkaWRuJ3Qgd29yay4gVGhleQogIGRpZG4ndCB3b3JrIGZvciBtZSBlaXRoZXIuIFRoaXMgb25jZSBhZ2FpbiBwcm92ZXMgd2Ugc2hvdWxkIGhhdmUgdGhhdCB0ZXN0CiAgc3VpdGUuLi4KICAKLSBJIGZpbmFsbHkgY2hhbmdlZCB0aGUgZXJyb3IgbWVzc2FnZSBsaWJjdXJsIHJldHVybnMgaWYgeW91IHRyeSBhIGh0dHBzOi8vCiAgVVJMIHdoZW4gdGhlIGxpYnJhcnkgd2Fzbid0IGJ1aWxkIHdpdGggU1NMIGVuYWJsZWQuIEl0IHdpbGwgbm93IHJldHVybiB0aGlzCiAgZXJyb3I6CiAgICAgICAgImxpYmN1cmwgd2FzIGJ1aWx0IHdpdGggU1NMIGRpc2FibGVkLCBodHRwczogbm90IHN1cHBvcnRlZCEiCgogIEkgcmVhbGx5IGhvcGUgaXQgd2lsbCBtYWtlIGl0IGEgYml0IGNsZWFyZXIgdG8gdXNlcnMgd2hlcmUgdGhlIGFjdHVhbAogIHByb2JsZW0gbGllcy4KClZlcnNpb24gNy40LjEKCkRhbmllbCAoMTYgT2N0b2JlciAyMDAwKQotIEkgZm9yZ290IHRvIHJlbW92ZSBzb21lIG9mIHRoZSBtYWxsb2MgZGVidWcgZGVmaW5lcyBmcm9tIHRoZSBtYWtlZmlsZXMgaW4KICB0aGUgcmVsZWFzZSBhcmNoaXZlIChvZiBjb3Vyc2UpLgoKVmVyc2lvbiA3LjQKCkRhbmllbCAoMTYgT2N0b2JlciAyMDAwKQotIFRoZSBidWZmZXIgb3ZlcmZsb3cgbWVudGlvbmVkIGJlbG93IHdhcyBwb3N0ZWQgdG8gYnVndHJhcSBvbiBGcmlkYXkgMTN0aC4KCkRhbmllbCAoMTIgT2N0b2JlciAyMDAwKQotIENvbGluIFJvYmVydCBQaGlwcHMgZWxlZ2FudGx5IGNvcnJlY3RlZCBhIGJ1ZmZlciBvdmVyZmxvdy4gSXQgY291bGQgYmUgdXNlZAogIGJ5IGFuIGV2aWwgZnRwIHNlcnZlciB0byBjcmFzaCBjdXJsLiBJIHRvb2sgdGhlIG9wcG9ydHVuaXR5IG9mIHJlcGxhY2luZyBhCiAgZmV3IG90aGVyIHNwcmludGYoKXMgaW50byBzbnByaW50ZigpcyBhcyB3ZWxsLgoKRGFuaWVsICgxMSBPY3RvYmVyIDIwMDApCi0gRm91bmQgc29tZSBtb3JlIG1lbW9yeSBsZWFrcy4gVGhpcyBuZXcgc2ltcGxlIG1lbW9yeSBkZWJ1Z2dlciBoYXMgdHVybmVkIG91dAogIHJlYWxseSB1c2VmdWwhCgpWZXJzaW9uIDcuNCBwcmU2CgpEYW5pZWwgKDkgT2N0b2JlciAyMDAwKQotIEZsb3JpYW4gS29lbmlnIHBvaW50ZWQgb3V0IHRoYXQgdGhlIGJvb2wgdHlwZWRlZiBpbiB0aGUgY3VybC9jdXJsLmggaW5jbHVkZQogIGZpbGUgd2FzIGJyZWFraW5nIFBIUCA0LjAuMyBjb21waWxpbmcuIFRoZSBib29sIHR5cGVkZWYgaXMgbm90IHVzZWQgaW4gdGhlCiAgcHVibGljIGludGVyZmFjZSBhbmQgd2FzIHdyb25nbHkgaW5zZXJ0ZWQgaW4gdGhhdCBoZWFkZXIgZmlsZS4KCi0gSvZyZyBIYXJ0cm90aCBjb3JyZWN0ZWQgYSBtaW5vciBtZW1vcnkgbGVhayBpbiB0aGUgc3JjL3VybGdsb2IuYyBzdHVmZi4gSXQKICBkaWRuJ3QgaGFybSBhbnlvbmUgc2luY2UgdGhlIG1lbW9yeSBpcyBmcmVlKCllZCBvbiBleGl0IGFueXdheS4KCi0gQ29ycmVjdGVkIHRoZSBzcmMvbWFpbi5jLiBXZSB1c2UgdGhlIF9NUFJJTlRGX1JFUExBQ0UgI2RlZmluZSB0byB1c2Ugb3VyCiAgbGliY3VybC1wcmludGYoKSBmdW5jdGlvbnMuIFRoaXMgZ2l2ZXMgdXMgc25wcmludGYoKSBldCBhbCBvbiBhbGwKICBwbGF0Zm9ybXMuIEkgY29udmVydGVkIHRoZSBhbGxvY2F0ZWQgdXNlcmFnZW50IHN0cmluZyB0byBvbmUgdGhhdCB1c2VzIGEKICBsb2NhbCBidWZmZXIuCgotIEkndmUgc2V0IGFuICNpZiAwIHNlY3Rpb24gYXJvdW5kIHRoZSBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIGhlYWRlcgogIGdlbmVyYXRlZCBpbiBsaWIvZm9ybWRhdGEuYy4gVGhpcyB3aWxsIGhvcGVmdWxseSBtYWtlIGN1cmwgZG8gbW9yZQogIFBIUC1mcmllbmRseSBtdWx0aS1wYXJ0IHBvc3RzLgoKVmVyc2lvbiA3LjQgcHJlNQoKRGFuaWVsICg5IE9jdG9iZXIgMjAwMCkKLSBOaWNvIEJhZ2d1cyBmb3VuZCBvdXQgdGhhdCBjdXJsJ3MgYWJpbGl0eSB0byBmb3JjZSBhIEFTQ0lJIGRvd25sb2FkIHdoZW4KICB1c2luZyBGVFAgd2FzIG5vIGxvbmdlciB3b3JraW5nISBJIGNvcnJlY3RlZCB0aGlzLiBUaGlzIHByb2JsZW0gd2FzIHByb2JhYmx5CiAgaW50cm9kdWNlZCB3aGVuIEkgcmVkZXNpZ25lZCBsaWJjdXJsIGZvciB2ZXJzaW9uIDcuCgotIEdlb3JnIEhvcm4gcHJvdmlkZWQgYSBzb3VyY2UgZXhhbXBsZSB0aGF0IHByb3ZlZCBhIG1lbW9yeSBsZWFrIGluIGxpYmN1cmwuCiAgSSBhZGRlZCBzaW1wbGUgbWVtb3J5IGRlYnVnZ2luZyBmYWNpbGl0aWVzIGFuZCBub3cgd2UgY2FuIG1ha2UgbGliY3VybCBsb2cKICBhbGwgbWVtb3J5IGZpZGRsaW5nIGZ1bmN0aW9ucy4gQW4gYWRkaXRpb25hbCBwZXJsIHNjcmlwdCBpcyB1c2VkIHRvIGFuYWx5emUKICB0aGUgb3V0cHV0IGxvZ2ZpbGUgYW5kIHRvIG1hdGNoIG1hbGxvYygpcyB3aXRoIGZyZWUoKXMgZXRjLiBUaGUgbWVtb3J5IGxlYWsKICBHZW9yZyBmb3VuZCB0dXJuZWQgb3V0IHRvIGJlIHRoZSBtYWluIGNvb2tpZSBzdHJ1Y3QgdGhhdCBjb29raWVfY2xlYW51cCgpCiAgZGlkbid0IGZyZWUhIFRoZSBwZXJsIHNjcmlwdCBpcyBuYW1lZCBtZW1hbmFseXplLnBsIGFuZCBpdCBpcyBhdmFpbGFibGUgaW4KICB0aGUgQ1ZTIHJlc3Bvc2l0b3J5LCBub3QgaW4gdGhlIHJlbGVhc2UgYXJjaGl2ZS4KCkRhbmllbCAoOCBPY3RvYmVyIDIwMDApCi0gR2VvcmcgSG9ybiBmb3VuZCBhIEdldEhvc3QoKSBwcm9ibGVtLiBJdCB0dXJuZWQgb3V0IGl0IG5ldmVyIGFzc2lnbmVkIHRoZQogIHBvaW50ZXIgaW4gdGhlIHRoaXJkIGFyZ3VtZW50IHByb3Blcmx5ISBUaGlzIGNvdWxkIG1ha2UgYSBjcmFzaCwgb3IgYXQgYmVzdAogIGEgbWVtb3J5IGxlYWshCgpWZXJzaW9uIDcuNCBwcmU0CgpEYW5pZWwgKDYgT2N0b2JlciAyMDAwKQotIElzIHRoZSAtRiBwb3N0IGZvbGxvd2luZyB0aGUgUkZDIDE4Njcgc3BlYz8gV2UgaGFkIHRoaXMgZGljdXNzaW9uIG9uIHRoZQogIG1haWxpbmcgbGlzdCBzaW5jZSBpdCBhcHBlYXJzIGN1cmwgY2FuJ3QgcG9zdCAtRiBmb3JtIHBvc3RzIHRvIGEgUEhQCiAgcmVjZWl2ZXIuLi4gSSd2ZSBiZWVuIGluIHRvdWNoIHdpdGggdGhlIFBIUCBkZXZlbG9wZXJzIGFib3V0IHRoaXMuCgotIERvbWVuaWNvIEFuZHJlb2xpIGZvdW5kIG91dCB0aGF0IHRoZSBsb25nIG9wdGlvbiAnLS1wcm94eScgd2Fzbid0IHdvcmtpbmcKICBhbnltb3JlISBUaGUgb3B0aW9uIHBhcnNlciBnb3QgY29uZnVzZWQgd2hlbiBJIGFkZGVkIHRoZSAtLXByb3h5dHVubmVsIGZvcgogIDcuMy4gVGhpcyB3YXMgaW5kZWVkIGEgdmVyeSBvbGQgZmxhdyB0aGF0IGhhc24ndCB0dXJuZWQgdXAgdW50aWwgbm93Li4uCgotIEr2cm4gSGFydHJvdGggcHJvdmlkZWQgcGF0Y2hlcywgdXBkYXRlZCBtYWtlZmlsZXMgYW5kIHR3byBuZXcgZmlsZXMgZm9yIERMTAogIHN0dWZmIG9uIHdpbjMyLiBIZSBhbHNvIHBvaW50ZWQgb3V0IHRoYXQgbGliIHNvdXJjZSBmaWxlcyB3ZXJlIGNvbXBpbGVkIHdpdGgKICAtSS4uL3NyYyB3aGljaCBpc24ndCBvbmx5IHdyb25nIGJ1dCBwbGFpbiBzdHVwaWQhCgotIFRyb2VscyBXYWxzdGVkIEhhbnNlbiBmaXhlZCBhIHByb2JsZW0gd2l0aCBIVFRQIHJlc3VtZS4gQ3VybCBwcmV2aW91c2x5IHVzZWQKICBhIGxvY2FsIHZhcmlhYmxlIGJhZGx5LCB0aGF0IGNvdWxkIGxlYWQgdG8gY3Jhc2hlcy4KClZlcnNpb24gNy40IHByZTMKCkRhbmllbCAoNCBPY3RvYmVyIDIwMDApCi0gTW9yZSBkb2NzIHdyaXR0ZW4uIFRoZSBjdXJsX2Vhc3lfZ2V0aW5mby4zIG1hbiBwYWdlIGlzIG5vdyBwcmV0dHkgYWNjdXJhdGUsCiAgYXMgaXMgdGhlIC13IHNlY3Rpb24gaW4gY3VybC4xLiBJIGFkZGVkIHR3byBvcHRpb25zIHRvIGVuYWJsZSB0aGUgdXNlciB0bwogIGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVjZWl2ZWQgaGVhZGVycycgc2l6ZSBhbmQgdGhlIHNpemUgb2YgdGhlIEhUVFAKICByZXF1ZXN0LiBULiBCaGFyYXRoIHJlcXVlc3RlZCB0aGVtLgogIApEYW5pZWwgKDMgT2N0b2JlciAyMDAwKQotIENvcnJlY3RlZCBhIHNldmVyIGZyZWUoKSBiZWZvcmUgdXNlIGluIHRoZSBuZXcgYWRkX2J1ZmZlcl9zZW5kKCkhIDstKQoKVmVyc2lvbiA3LjQgcHJlMgoKRGFuaWVsICgzIE9jdG9iZXIgMjAwMCkKLSBKYXNvbiBTLiBQcmllYmUgc2VudCBtZSBwYXRjaGVzIHRoYXQgY2hhbmdlZCB0aGUgd2F5IGN1cmwgaXNzdWVzIEhUVFAKICByZXF1ZXN0cy4gVGhlIGVudGlyZSByZXF1ZXN0IGlzIG5vdyBpc3N1ZWQgaW4gb25lIHNpbmdsZSBzaG90LiBJdCBkaWRuJ3QgZG8KICB0aGlzIHByZXZpb3VzbHksIGFuZCBpdCBoYXMgdHVybmVkIG91dCB0aGF0IHNpbmNlIHRoZSBjb21tb24gYnJvd3NlcnMgZG8gaXQKICB0aGlzIHdheSwgc29tZSBzaXRlcyBoYXZlIHR1cm5lZCBvdXQgdG8gd29yayB3aXRoIGJyb3dzZXJzIGJ1dCBub3Qgd2l0aAogIGN1cmwhIEFsdGhvdWdoIHRoaXMgaXMgbm90IGEgY2xpZW50LXNpZGUgcHJvYmxlbSwgd2Ugd2FudCB0byBiZSBhYmxlIHRvCiAgZnVsbHkgZW11bGF0ZSBicm93c2VycywgYW5kIHRodXMgd2UgaGF2ZSBub3cgYWRqdXN0ZWQgdGhlIG5ldHdvcmtpbmcgbGF5ZXIKICB0byBzbGlnaHRseSBtb3JlIGFwcGVhciBhcyBhIGJyb3dzZXIuIEkgYWRqdXN0ZWQgSmFzb24ncyBwYXRjaCwgdGhlIGZhdWx0cwogIGFyZSBwcm9iYWJseSBtaW5lLgoKRGFuaWVsICgyIE9jdG9iZXIgMjAwMCkKLSBBbnlvbmUgd2hvIGV2ZXIgdXBsb2FkZWQgZGF0YSB3aXRoIGN1cmwgb24gYSBzbG93IGxpbmsgaGFzIG5vdGljZWQgdGhhdCB0aGUKICBwcm9nZXNzIG1ldGVyIGlzIHVwZGF0ZWQgdmVyeSBpbmZyZXF1ZW50bHkuIFRoYXQgaXMgZHVlIHRvIHRoZSBsYXJnZSBidWZmZXIKICBzaXplIGN1cmwgaXMgdXNpbmcuIEl0IHJlYWRzIDUwS2IgYW5kIHNlbmRzIGl0LCB1cGRhdGVzIHRoZSBwcm9ncmVzcyBtZXRlcgogIGFuZCBsb29wcy4gNTBLYiBpcyB2ZXJ5IG11Y2ggb24gYSBzbG93IGxpbmssIGFsdGhvdWdoIGl0IGlzIHByZXR0eSBuZWF0IHRvCiAgdXNlIG9uIGEgZmFzdCBvbmUuCgogIEkndmUgbm93IG1hZGUgYW4gYWRqdXN0bWVudCB0aGF0IG1ha2VzIGN1cmwgdXNlIGEgMktiIGJ1ZmZlciBmb3IgdXBsb2FkcyB0bwogIHN0YXJ0IHdpdGguIElmIGN1cmwncyBhdmVyYWdlIHVwbG9hZCBzcGVlZCBpcyBmYXN0ZXIgdGhhbiBidWZmZXIgc2l6ZSBieXRlcwogIHBlciBzZWNvbmQsIGN1cmwgd2lsbCBpbmNyZWFzZSB0aGUgdXNlZCBidWZmZXIgc2l6ZSB1cCB0byBtYXggNTBLYi4gSXQKICBzaG91bGQgbWFrZSB0aGUgcHJvZ3Jlc3MgbWV0ZXIgd29yayBiZXR0ZXIuCiAgClZlcnNpb24gNy40IHByZTEKCkRhbmllbCAoMjkgU2VwdGVtYmVyIDIwMDApCi0gUmlwcGVkIG91dCB0aGUgLXcgc3R1ZmYgZnJvbSB0aGUgbGlicmFyeSBhbmQgcHV0IGluIHRoZSBjdXJsIHRvb2wuIEl0IGdldHMKICBhbGwgdGhlIHJlbGV2YW50IGluZm8gZnJvbSB0aGUgbGlicmFyeSB1c2luZyB0aGUgbmV3IGN1cmxfZWFzeV9nZXRpbmZvKCkKICBmdW5jdGlvbi4KCi0gYnJhZCBhdCBvcGVuYnNkLm9yZyBtYWlsZWQgbWUgYSBwYXRjaCB0aGF0IGNvcnJlY3RlZCBteSBrZXJiZXJvcyBtaXN0YWtlIGFuZAogIHJlbW92ZWQgYSBjb21waWxlciB3YXJuaW5nIGZyb20gaG9zdGlwLmMgdGhhdCBPcGVuQlNEIHBlb3BsZSBnZXQuCgpEYW5pZWwgKDI4IFNlcHRlbWJlciAyMDAwKQotIE9mIGNvdXJzZSAoSSBzaG91bGQgcHJvYmFibHkgZ2V0IHB1bmlzaGVkIHNvbWVob3cpIEkgZGlkbid0IHByb3Blcmx5IGNvcnJlY3QKICB0aGUgI2luY2x1ZGUgbGluZXMgZm9yIHRoZSBiYXNlNjQgc3R1ZmYgaW4gdGhlIGtlcmJlcm9zIHNvdXJjZXMgaW4gdGhlIGp1c3QKICByZWxlYXNlZCA3LjMgcGFja2FnZS4gVGhleSBzdGlsbCBpbmNsdWRlIHRoZSAqX2tyYi5oIGZpbGVzISBOb3csIHRoZSBlcnJvcgogIGlzIHNvb28gdmVyeSBlYXN5IHRvIHNwb3QgYW5kIGZpeCBzbyBJIHdvbid0IGJvdGhlciB3aXRoIGEgcXVpY2sgYnVnIGZpeAogIHJlbGVhc2UuIEknbGwgcG9zdCBhIHBhdGNoIHdoZW5ldmVyIG9uZSBpcyBuZWVkZWQgaW5zdGVhZC4gSXQnbGwgYmUKICBhdmFpbGFibGUgaW4gdGhlIENWUyBpbiBhIGZldyBtaW51dGVzIGFueXdheS4KClZlcnNpb24gNy4zCgpEYW5pZWwgKDI4IFNlcHRlbWJlciAyMDAwKQotIFJlbW92ZWQgdGhlIGJhc2U2NF9rcmIuW2NoXSBmaWxlcy4gVGhleSd2ZSBub3cgcmVwbGFjZWQgdGhlIGZvcm1lcgogIGJhc2U2NC5bY2hdIGZpbGVzLgoKRGFuaWVsICgyNiBTZXB0ZW1iZXIgMjAwMCkKLSBVcGRhdGVkIHNvbWUgZG9jcy4KCi0gSSBjaGFuZ2VkIHRoZSBPcGVuU1NMIGZpeCB0byB3b3JrIHdpdGggb2xkZXIgdmVyc2lvbnMgYXMgd2VsbC4gVGhlIHBvc3RlZAogIHBhdGNoIHdhcyBvbmx5IHdvcmtpbmcgd2l0aCAwLjkuNiBhbmQgbm8gb2xkZXIgb25lcy4KICAKVmVyc2lvbiA3LjMtcHJlOAoKRGFuaWVsICgyNSBTZXB0ZW1iZXIgMjAwMCkKLSBFcmRtdXQgUGZlaWZlciBpbmZvcm1lZCB1cyB0aGF0IGN1cmwgZGlkbid0IGJ1aWxkIHdpdGggT3BlblNTTCAwLjkuNiBhbmQKICBzaG93ZWQgdXMgd2hhdCBuZWVkZWQgdG8gZ2V0IHBhdGNoZWQgaW4gb3JkZXIgdG8gbWFrZSBpdCBidWlsZCBwcm9wZXJseQogIGFnYWluLgoKLSBEaXJrIEtydXNjaGV3c2tpIGZvdW5kIGEgYnVnIGluIHRoZSBjb29raWUgcGFyc2VyLiBJIG1hZGUgYW4gYWx0ZXJuYXRpdmUKICBhcHByb2FjaCB0byB0aGUgc29sdXRpb24gRGlyayBoaW1zZWxmIHN1Z2dlc3RlZC4gVGhlIGJ1ZyBtYWRlIGEgY29va2llCiAgaGVhZGVyIHRoYXQgZGlkbid0IGVuZCB3aXRoIGEgdHJhaWxpbmcgc2VtaWNvbG9uIHRvIG5vdCBnZXQgcGFyc2VkLgoKLSBJJ3ZlIG1hcmtlZCAtYyBhbmQgLXQgZGVwcmVjYXRlZCBub3cuIElmIHlvdSB1c2UgYW55IG9mIHRoZW0sIGN1cmwgd2lsbCB0ZWxsCiAgeW91IHRvIHVzZSAiLUMgLSIgb3IgIi1UIC0iIGluc3RlYWQuIEkgZG9uJ3QgdGhpbmsgb2NjdXB5aW5nIHR3byBsZXR0ZXJzIGZvcgogIG5lYXJseSBpZGVudGljYWwgZnVuY3Rpb25zIGlzIGdvb2QgdXNlLiBBbHNvLCAtVCAtIGtpbmQgb2YgZm9sbG93cyB0aGUgY3VybAogIHRyYWRpdGlvbiBvZiB1c2luZyAtIGZvciBzdGRpbiB3aGVyZSBhIGZpbGUgbmFtZSBpcyBleHBlY3RlZC4KCkRhbmllbCAoMjMgU2VwdGVtYmVyIDIwMDApCi0gTWFydGluIEhlZGVuZmFsayBwcm92aWRlZCB0aGUgcGF0Y2ggdGhhdCBmaW5hbGx5IG1hZGUgdGhlIGtyYjQgZnRwIHVwbG9hZAogIHdvcmshCgpEYW5pZWwgKDIxIFNlcHRlbWJlciAyMDAwKQotIFRoZSBrZXJiZXJvcyBjb2RlIGlzIG5vdCBxdWl0ZSB0aHJlYWQtc2FmZSB5ZXQuIFRoZXJlIGFyZSBhIGZldyBtb3JlIGdsb2JhbHMKICB0aGF0IG5lZWQgdG8gYmUgdGFrZSBjYXJlIG9mLiBMZXQncyBnZXQgdGhlIHVwbG9hZCB3b3JraW5nIGZpcnN0IQoKRGFuaWVsICgyMCBTZXB0ZW1iZXIgMjAwMCkKLSBSaWNoYXJkIFByZXNjb3R0IHNvbHZlZCBhbm90aGVyIG5hbWUgbG9va3VwIGJ1ZmZlciBzaXplIHByb2JsZW0uIEkgdG9vayB0aGlzCiAgb3Bwb3J0dW5pdHkgdG8gcmV3cml0ZSB0aGUgR2V0SG9zdCgpIGZ1bmN0aW9uLiBXaXRoIHRoZXNlIGxhcmdlIGJ1ZmZlcgogIHNpemVzLCBJIHRoaW5rIGtlZXBpbmcgdGhlbSBhcyBsb2NhbCBhcnJheXMgcXVpY2tseSB0dXJuIHVnbHkuIEkgbm93IHVzZQogIG1hbGxvYygpIHRvIGdldCB0aGUgYnVmZmVyIG1lbW9yeS4gVGhhbmtzIHRvIHRoaXMsIEkgbm93IGNhbiByZWFsbG9jKCkgdG8gYQogIGxhcmdlIGJ1ZmZlciBpbiBjYXNlIG9mIGRlbWFuZCAoZXJybm8gPT0gRVJBTkdFKSBpbiBjYXNlIGEgc29sdXRpb24gbGlrZQogIHRoYXQgd291bGQgYmVjb21lIG5lY2Vzc2FyeS4gSSBzdGlsbCB3YW50IHRvIGF2b2lkIHRoYXQga2luZCBvZiBuYXN0aW5lc3MuCgotIFRyaWVkIHRvIGNvbXBpbGUgYW5kIHJ1biBjdXJsIG9uIExpbnV4IGZvciBhbHBoYSBhbmQgRnJlZUJTRCBmb3IgYWxwaGEuIFdlbnQKICBhcyBzbW9vdGggYXMgaXQgY291bGQuCgotIEFkZGVkIGEgZG9jcy9leGFtcGxlcyBkaXJlY3Rvcnkgd2l0aCB0d28gdGlueSBleGFtcGxlIHNvdXJjZXMgdGhhdCBzaG93IGhvdwogIHRvIHVzZSBsaWJjdXJsLiBJIGhvcGUgdXNlcnMgd2lsbCBzdXBwbHkgbWUgd2l0aCBtb3JlIHVzZWZ1bCBleGFtcGxlcwogIGZ1cnRoZXIgb24uCgotIEFwcGxpZWQgYSBwYXRjaCBieSBK9nJuIEhhcnRyb3RoIHRvIG5vIGxvbmdlciB1c2UgdGhlIHdvcmQgJ2ludGVmYWNlJyBpbiB0aGUKICBjb25maWcgc3RydWN0IGluIHRoZSBzcmMvbWFpbi5jIGZpbGUgc2luY2UgY2VydGFpbiBjb21waWxlcnMgaGF2ZSB0aGF0IHdvcmQKICAicmVzZXJ2ZXJlZCIuICBJIGZpZ3VyZSB0aGF0IGlzIHNvbWUga2luZCBvZiBDKysgZGVjZWFzZS4KCi0gVXBkYXRlZCB0aGUgY3VybC4xIG1hbiBwYWdlIHdpdGggLS1pbnRlcmZhY2UgYW5kIC0ta3JiNC4KCi0gTW9kaWZpZWQgdGhlIGJhc2U2NEVuY29kZSgpIGZ1bmN0aW9uIHRvIHdvcmsgbGlrZSB0aGUga2VyYmVyb3Mgb25lLCBzbyB0aGF0CiAgSSBjb3VsZCByZW1vdmUgdGhlIHVzZSBvZiB0aGF0LiBUaGVyZSBpcyBubyBuZWVkIGZvciAqdHdvKiBiYXNlNjQgZW5jb2RpbmcKICBmdW5jdGlvbnMhIDstKQoKVmVyc2lvbiA3LjNwcmU1CgpEYW5pZWwgKDE5IFNlcHRlbWJlciAyMDAwKQotIFRoZSBrZXJiZXJvczQtbGF5ZXIgc291cmNlIGNvZGUgdGhhdCBpcyBtdWNoICJpbmZsdWVuY2VkIiBieSB0aGUgb3JpZ2luYWwKICBrcmI0IHNvdXJjZSBjb2RlLCB0aHJvdWdoIHlhZmMgaW50byBjdXJsLCB3YXMgdXNpbmcgcXVpdGUgYSBsb3Qgb2YgZ2xvYmFsCiAgdmFyaWFibGVzLiBsaWJjdXJsIGNhbid0IHdvcmsgcHJvcGVybHkgd2l0aCBnbG9iYWxzIGxpa2UgdGhhdCB3aHkgSSBoYWQgdG8KICBjbGVhbiB1cCBhbG1vc3QgZXZlcnkgZnVuY3Rpb24gaW4gdGhlIG5ldyBzZWN1cml0eS5jIHRvIG1ha2UgdGhlbSB1c2UKICBjb25uZWN0aW9uIHNwZWNpZmljIHZhcmlhYmxlcyBpbnN0ZWFkIG9mIHRoZSBnbG9iYWxzLiBJIGp1c3QgaG9wZSBJIGRpZG4ndAogIGRlc3Ryb3kgYW55dGhpbmcgbm93Li4uIDotKSBjb25maWd1cmUgdXBkYXRlZCwgdmVyc2lvbiBzdHJpbmcgbm93IHJlZmxlY3RzCiAga3JiNCBidWlsdC1pbi4gSXQgYWxtb3N0IHdvcmtzIG5vdy4gT25seSB1cGxvYWRzIGFyZSBzdGlsbCBiZWluZyBuYXVnaHR5LgoKVmVyc2lvbiA3LjNwcmUzCgpEYW5pZWwgKDE4IFNlcHRlbWJlciAyMDAwKQotIE1hcnRpbiBIZWRlbmZhbGsgc3VwcGxpZWQgYSBtYWpvciBwYXRjaCB0aGF0IGludHJvZHVjZXMga3JiNC1mdHAgc3VwcG9ydCB0bwogIGN1cmwuIE1hcnRpbiBpcyB0aGUgcHJpbWFyeSBhdXRob3Igb2YgdGhlIGZ0cCBjbGllbnQgbmFtZWQgeWFmYyBhbmQgaGUgZGlkCiAgbm90IGhlc2l0YXRlIHRvIGhlbHAgdXMgaW1wbGVtZW50IHRoaXMgd2hlbiBJIGFza2VkIGhpbS4gTWFueSBhbmQgc2luY2VyZQogIHRoYW5rcyB0byBhIHNwbGVuZGlkIGVmZm9ydC4gSXQgZGlkbid0IGV2ZW4gdGFrZSBtYW55IGhvdXJzIQoKLSBTdGVwaGVuIEtpY2sgc3VwcGxpZWQgYSBiaWcgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VzIHRoZSAtLWludGVyZmFjZSBmbGFnIHRvCiAgdGhlIGN1cmwgdG9vbCBhbmQgQ1VSTE9QVF9JTlRFUkZBQ0UgZm9yIGxpYmN1cmwuIEl0IGFsbG93cyB5b3UgdG8gc3BlY2lmeSBhbgogIG91dGdvaW5nIGludGVyZmFjZSB0byB1c2UgZm9yIHlvdXIgcmVxdWVzdC4gVGhpcyBtYXkgbm90IHdvcmsgb24gYWxsCiAgcGxhdGZvcm1zLiBUaGlzIG5lZWRzIHRlc3RpbmcuCgotIFJpY2hhcmQgUHJlc2NvdHQgbm90aWNlZCB0aGF0IGN1cmwgb24gVHJ1NjQgdW5peCBjb3VsZCBjb3JlIGR1bXBlZCBpZiB0aGUKICBuYW1lIGRpZG4ndCByZXNvbHZlIHByb3Blcmx5LiBUaGlzIHdhcyBkdWUgdG8gdGhlIEdldEhvc3QoKSBmdW5jdGlvbiBub3QKICByZXR1cm5pbmcgYW4gZXJyb3IgZXZlbiB0aG91Z2ggaXQgZmFpbGVkIG9uIHNvbWUgcGxhdGZvcm1zIQoKRGFuaWVsICgxNSBTZXB0ZW1iZXIgMjAwMCkKLSBVcGRhdGVkIGFsbCBzb3J0cyBvZiBkb2N1bWVudHMgaW4gcmVnYXJkcyB0byB0aGUgbmV3IHByb3h5dHVubmVsIHN1cHBvcnQuCgpWZXJzaW9uIDcuM3ByZTIKCkRhbmllbCAoMTUgU2VwdGVtYmVyIDIwMDApCi0gS2FpLVV3ZSBSb21tZWwgcG9pbnRlZCBvdXQgYSBwcm9ibGVtIGluIHRoZSBodHRwcHJveHl0dW5uZWwgc3R1ZmYgZm9yIGZ0cC4KICBBZGp1c3RlZCBpdC4gQWRkZWQgYmV0dGVyIGluZm8gbWVzc2FnZSB3aGVuIHNldHRpbmcgdXAgdGhlIHR1bm5lbCBhbmQgdGhlCiAgcGFzdiBtZXNzYWdlIHdoZW4gZG9pbmcgdGhlIHNlY29uZCBjb25uZWN0LgogIApWZXJzaW9uIDcuM3ByZTEKCkRhbmllbCAoMTUgU2VwdGVtYmVyIDIwMDApCi0gbGliY3VybCBub3cgYWxsb3dzICJodHRwcHJveHl0dW5uZWwiIHRvIGFuIGFyYml0cmFyeSBob3N0IGFuZCBwb3J0IG5hbWUuIFRoZQogIHNlY29uZCBjb25uZWN0aW9uIG9uIGZ0cCBuZWVkZWQgdGhhdC4KCi0gVGhlQXJ0T2ZIVFRQU2NyaXB0aW5nIHdhcyBjb3JyZWN0ZWQgYWxsIG92ZXIuIEkgYm90aCB0eXBlIGFuZCBzcGVsbCByZWFsbHkKICBiYWQgYXQgdGltZXMhCiAgCkRhbmllbCAoMTQgU2VwdGVtYmVyIDIwMDApCi0gLXAvLS1wcm94eXR1bm5lbCB3YXMgYWRkZWQgdG8gJ2N1cmwnLiBJdCB1c2VzIHRoZSBuZXcKICBDVVJMT1BUX0hUVFBQUk9YWVRVTk5FTCBsaWJjdXJsIG9wdGlvbiB0aGF0IGFsbG93cyAiYW55IiBwcm90b2NvbCB0byB0dW5uZWwKICB0aHJvdWdoIHRoZSBzcGVjaWZpZWQgaHR0cCBwcm94eS4gQXQgdGhlIG1vbWVudCwgdGhpcyBzaG91bGQgd29yayB3aXRoIGZ0cC4KCkRhbmllbCAoMTMgU2VwdGVtYmVyIDIwMDApCi0gSm9jaGVuIFNjaGFldWJsZSBmb3VuZCB0aGF0IGZpbGU6Ly8gZGlkbid0IHdvcmsgYXMgZXhwZWN0ZWQuIENvcnJlY3RlZCB0aGlzCiAgYW5kIG1haWxlZCB0aGUgcGF0Y2ggdG8gdGhlIG1haWxpbmcgbGlzdC4KCkRhbmllbCAoNyBTZXB0ZW1iZXIgMjAwMCkKLSBJIGNoYW5nZWQgdGhlICNkZWZpbmUgVCgpIGluIGN1cmwuaCBzaW5jZSBpdCB0dXJuZWQgb3V0IGl0IHdhc24ndCByZWFsbHkKICBhIGdvb2Qgc3ltYm9sIHRvIHVzZSAod2hlbiB5b3UgY29tcGlsZWQgUEhQIHdpdGggY3VybCBhcyBhIG1vZHVsZSwgdGhhdAogIGRlZmluZSBjb2xsaWRlZCB3aXRoIHNvbWUgSU1BUCBkZWZpbmUgb3Igc29tZXRoaW5nKS4gVGhpcyB3YXMgcG9zdGVkIHRvIHRoZQogIFBIUCBidWcgdHJhY2tlci4KCi0gSSBhZGRlZCBleHRlcm4gIkMiIHN0dWZmIGluIHR3byBoZWFkZXIgZmlsZXMgdG8gYmV0dGVyIGFsbG93IGxpYmN1cmwgdXNhZ2UKICBpbiBDKysgc29yY2VzLiBEaXNjdXNzaW9ucyBvbiB0aGUgbGliY3VybCBsaXN0IHdpdGggRGFubnkgSG9yc3dlbGwgbGVhZCB0bwogIHRoaXMuCgpWZXJzaW9uIDcuMi4xCgpEYW5pZWwgKDMxIEF1Z3VzdCAyMDAwKQotIEFsYmVydCBDaGluLUEtWW91bmcgZml4ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgKmFnYWluKiBhbmQgbm93IGl0IHNlZW1zIHRvCiAgZGV0ZWN0IExpbnV4IG5hbWUgcmVzb2x2aW5nIHByb3Blcmx5ISAoaGVhcmQgdGhhdCBiZWZvcmU/KQoKLSBUcm9lbHMgV2Fsc3RlZCBIYW5zZW4gcG9pbnRlZCBvdXQgdGhhdCBkb3dubG9hZGluZyBhIGZpbGUgY29udGFpbmluZyB0aGUKICBsZXR0ZXIgJysnIGZyb20gYW4gZnRwIHNlcnZlciBkaWRuJ3Qgd29yay4gSXQgZGlkIHdvcmsgZnJvbSBIVFRQIHRob3VnaCBhbmQKICB0aGUgcmVhc29uIHdhcyBteSBsYW1lIFVSTCBkZWNvZGVyLgoKLSBJIGhhcHBlbmVkIHRvIG5vdGljZSB0aGF0IC1JIGRpZG4ndCBhdCBhbGwgd29yayBvbiBmdHAgYW55bW9yZS4gSSBjb3JyZWN0ZWQKICB0aGF0LgoKVmVyc2lvbiA3LjIKCkRhbmllbCAoMzAgQXVndXN0IDIwMDApCi0gVW5kZXJzdGFuZGluZyBBSVggaXMgYSBoYXJkIHRhc2suIEkgYmVsaWV2ZSBJJ2xsIG5ldmVyIGZpZ3VyZSBvdXQgd2h5IHRoZXkKICBzb2x2ZSB0aGluZ3Mgc28gZGlmZmVyZW50bHkgZnJvbSB0aGUgb3RoZXIgdW5peGVzLiBOb3csIEknbSBsZWZ0IHdpdGggdGhlCiAgQUlYIDQuMyBydW4tdGltZSB3YXJuaW5ncyBhYm91dCBkdXBsaWNhdGUgc3ltYm9scyB0aGF0IGFjY29yZGluZyB0byB0aGlzCiAgYXJ0aWNsZSAoaHR0cDovL3d3dy5nZW9jcmF3bGVyLmNvbS9hcmNoaXZlcy8zLzQwNS8xOTk5LzkvMC8yNTkzNDI4LykgaXMgYQogIGxpYnRvb2wgZmxhdy4gSSB0cmllZCB0aGUgbWVudGlvbmVkIHBhdGNoLCBhbHRob3VnaCB0aGF0IHN0b3BzIHRoZSBsaW5raW5nCiAgY29tcGxldGVseS4KCiAgU28sIGlmIEkgc2VsZWN0IHRvIGlnbm9yZSB0aGUgbGQgd2FybmluZ3MgdGhlcmUgYXJlIGNvbXBpbGVyIHdhcm5pbmdzIHRoYXQKICBmaWxsIHRoZSBzY3JlZW4gcHJldHR5IGJhZCB3aGVuIGN1cmwgY29tcGlsZXMuIEl0IHR1cm5zIG91dCB0aGF0IGlmIEkgd2FudAogIHRvICcjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+JywgSSBjYW4gZ2V0IHRpZCBvZiB0aGUgd2FybmluZ3MgYnkgaW5jbHVkZSB0aGUKICBmb2xsb3dpbmcgdGhyZWUgaW5jbHVkZSBmaWxlcyBiZWZvcmUgdGhhdCBvbmU6CgogICAgICAgICNpbmNsdWRlIDxuZXQvaWZfZGwuaD4KICAgICAgICAjaW5jbHVkZSA8c3lzL21idWYuaD4KICAgICAgICAjaW5jbHVkZSA8bmV0aW5ldC9pZl9ldGhlci5oPgoKICBOb3csIGlzIGl0IHJlYWxseSBzYW5lIHRvIGFkZCB0aG9zZSBpbmNsdWRlIGZpbGVzIGJlZm9yZSBhcnBhL2luZXQuaCBpbiBhbGwKICB0aGUgc291cmNlIGZpbGVzIHRoYXQgaW5jbHVkZSBpdD8KCiAgVGhhbmtzIHRvIEFsYmVydCBDaGluLUEtWW91bmcgYXQgdGhld3JpdHRlbndvcmQuY29tIHdobyBnYXZlIG1lIHRoZSBBSVgKICBsb2dpbiB0byB0cnkgZXZlcnl0aGluZyBvbi4KCkRhbmllbCAoMjQgQXVndXN0IDIwMDApCi0gSmFuIFNjaG1pZHQgc3VwcGxpZWQgdXMgYSBuZXcgVkM2IG1ha2VmaWxlIGZvciBXaW5kb3dzIGFzIHRoZSBwcmV2aW91cyBvbmUKICB3YXMgbm90IHVwIHRvIGRhdGUgYnV0IGxhY2tlZCBzZXZlcmFsIG9iamVjdCBmaWxlcy4KCi0gTW9yZSB3b3JrIG9uIHRoZSBuYW1pbmcuCgotIEFsYmVydCBDaGluLUEtWW91bmcgcHJvdmlkZWQgYSBjb25maWd1cmUtY2hlY2sgZm9yIGxhcmdlIGZpbGUgc3VwcG9ydCwgYXMKICBzb21lIHN5c3RlbXMgc2VlbSB0byBuZWVkIHRoYXQgZm9yIHRoZW0gdG8gd29yay4gSGFkIHRvIGNoYW5nZSB0aGUgcG9zaXRpb24KICBmb3IgdGhlIGNvbmZpZy5oIGluY2x1ZGUgZmlsZSBpbiBldmVyeSAuYyBmaWxlIGluIHRoZSBsaWJjdXJsIGRpci4uLgoKLSBBcyBzdWdnZXN0ZWQgb24gdGhlIG1haWxpbmcgbGlzdCAoYnkgVHJveSBFbmdlbCksIEkgZGlkIHVzZSBhIC0tZGF0YS1iaW5hcnkKICBvcHRpb24gaW5zdGVhZCBvZiB0aGUgbWVzc3kgd2F5IEkndmUgbGVmdCBkZXNjcmliZWQgYmVsb3cuIEl0IHNlZW1zIHRvCiAgd29yay4gVGhlIGxpYmN1cmwgZml4IHJlbWFpbmVkIHRoZSBzYW1lIGFzIHllc3RlcmRheS4KCkRhbmllbCAoMjMgQXVndXN0IDIwMDApCi0gQmFjayBvbiB0aGUgLWQgc3RyaXBwaW5nIG5ld2xpbmVzIHRoaW5nLiBUaGUgJ3BsYWluIHBvc3QnIHRoaW5nIHdhcyBhZGRlZAogIHdoZW4gSSBoYWQgbm8gdGhvdWdodCBvZiB0aGF0IG9uZSBjb3VsZCBhY3R1YWxseSBwb3N0IGJpbmFyeSBkYXRhIHdpdGgKICBpdC4gTm93LCBJIGhhdmUgdG8gYWRkIHRoaXMgZnVuY3Rpb25hbGl0eSBpbiBhIGdyYWNlZnVsIG1hbm5lciBhbmQgSSB0aGluawogIEkndmUgbWFuYWdlZCB0byBjb21lIHVwIHdpdGggYSB3YXk6ICctZCBAZmlsZTtiaW5hcnknIHdpbGwgdGh1cyBwb3N0IHRoZQogIGZpbGUgYmluYXJ5LCBleGFjdGx5IGFzIGl0cyBjb250ZW50cyBhcmUuIEl0IGlzIGltcGxlbWVudGVkIHdpdGggYSBuZXcKICAqc2V0b3B0KCkgb3B0aW9uIChDVVJMT1BUX1BPU1RGSUVMRFNJWkUpIHRvIHNldCB0aGUgcG9zdGZpZWxkIHNpemUsIHNpbmNlCiAgbGliY3VybCBjYW4ndCBzdHJsZW4oKSB0aGUgZGF0YSBpbiB0aGVzZSBjYXNlcy4KCi0gQWxiZXJ0IENoaW4tQS1Zb3VuZyBtYWRlIHNvbWUgdmVyeSBzZXJpb3VzIGVmZm9ydHMgYW5kIGFsbCB0aGUgbmFtZQogIHJlc29sdmluZyBwcm9ibGVtcyBzZWVtIHRvIGhhdmUgYmVlbiBzb3J0ZWQgb3V0IG5vdyBvbiBhbGwgdGhlIHBsYXRmb3JtcwogIHRoYXQgcHJldmlvdXNseSBzaG93ZWQgdGhlbS4gSSdsbCBtYWtlIGFub3RoZXIgcmVsZWFzZSBub3cgYW55ZGF5IGJlY2F1c2Ugb2YKICB0aGlzLgoKLSBUaGUgRkFRIHdhcyBtdWNoIGVuaGFuY2VkIHdoZW4gaXQgY29tZXMgdG8gdGhlIGxpY2Vuc2luZyBpc3N1ZXMgdGhhbmtzIHRvCiAgQmpvcm4gUmVlc2UuCgpEYW5pZWwgKDIxIEF1Z3VzdCAyMDAwKQotIFJpY2sgV2VseWtvY2h5IHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB3aGVuIHlvdSB1c2UgLWQgdG8gcG9zdCBhbmQgeW91IHdhbnQgdG8KICBrZWVwIHRoZSBuZXdsaW5lcywgYXMgY3VybCBzdHJpcHMgdGhlbSBvZmYgYXMgYSBib251cyBiZWZvcmUgcG9zdGluZy4uLgogIFRoaXMgbmVlZHMgdG8gYmUgYWRkcmVzc2VkLgoKVmVyc2lvbiA3LjEuMQoKRGFuaWVsICgyMSBBdWd1c3QgMjAwMCkKLSBHb3QgbW9yZSBwZW9wbGUgaW52b2x2ZWQgaW4gdGhlIGdldGhvc3RieW5hbWVfcigpIG1lc3MuIENhb2xhbiBNY05hbWFyYSBzZW50CiAgbWUgY29uZmlndXJlLWNvZGUgdGhhdCB0dXJuZWQgb3V0IHRvIGJlIHZlcnkgc2ltaWxhciB0byBteSBleGlzdGluZyB0ZXN0cwogIHdoaWNoIG9ubHkgbWFrZSBtZSBtb3JlIHN1cmUgSSdtIG9uIHRoZSByaWdodCBwYXRoLiBJIGNoYW5nZWQgdGhlIG9yZGVyIG9mCiAgdGhlIHRlc3RzIHNsaWdodGx5LCBhcyBpdCBzZWVtcyB0aGF0IHNvbWUgY29tcGlsZXJzIGRvbid0IHllbGwgZXJyb3IgaWYgYQogIGZ1bmN0aW9uIGlzIHVzZWQgd2l0aCB0b28gbWFueSBwYXJhbWV0ZXJzLiBUaHVzLCB0aGUgZmlyc3QgdGVzdGVkIGZ1bmN0aW9uCiAgd2lsbCBzZWVtIG9rLi4uIExldCdzIGhvcGUgbW9yZSBjb21waWxlcnMgdGhpbmsgb2YgdG9vLWZldyBwYXJhbWV0ZXJzIGFzIGJhZAogIG1hbm5lcnMsIGFzIHdlJ3JlIG5vdyB0cnlpbmcgdGhlIGZ1bmN0aW9ucyBpbiB0aGF0IG9yZGVyOyBmZXdlciBmaXJzdC4gSQogIHNob3VsZCBhbHNvIGFkZCB0aGF0IExhcnMgSGVja2luZyBtYWlsZWQgbWUgYW5kIHZvbHVudGVlcmVkIHRvIHJ1biB0ZXN0cyBvbgogIGEgZmV3IG9kZCBzeXN0ZW1zLiBDb2FsYW4gaXMga2VlcGluZyBoaXMgd29yayBvdmVyIGF0CiAgaHR0cDovL3d3dy5jc24udWwuaWUvfmNhb2xhbi9wdWJsaW5rL2dldGhvc3RieW5hbWVfci8uIE1pZ2h0IGJlIGhhbmR5IGluIHRoZQogIGZ1dHVyZSBhcyB3ZWxsLgoKRGFuaWVsICgxOCBBdWd1c3QgMjAwMCkKLSBJIG5vdGljZWQgSSBoYWRuJ3QgaW5jcmVhc2VkIHRoZSBuYW1lIGxvb2t1cCBidWZmZXIgaW4gbGliL2Z0cC5jLiBJIGRvbid0CiAgdGhpbmsgdGhpcyBpcyB0aGUgcmVhc29uIGZvciB0aGUgY29udGludWVkIHRyb3VibGUgdGhvdWdoLgoKRGFuaWVsICgxNyBBdWd1c3QgMjAwMCkKLSBGcmVkIE5veiBjb3JyZWN0ZWQgbXkgc3R1cGlkIG1pc3Rha2VzIGluIHRoZSBnZXRob3N0YnluYW1lX3IoKSBmbHVmZi4gSXQKICBzaG91bGQgYWZmZWN0IHNvbWUgQUlYLCBEaWdpdGFsIFVuaXggYW5kIEhQVVggMTAgc3lzdGVtcy4KCkRhbmllbCAoMTUgQXVndXN0IDIwMDApCi0gTWF0aGlldSBMZWdhcmUgY29tcGlsZWQgYW5kIGJ1aWxkIDcuMSB3aXRob3V0IGVycm9ycyBvbiBib3RoIEFJWCA0LjIgYXMgd2VsbAogIGFzIEFJWCA0LjMuIE5vdyB3aHkgZGlkIHByb2JsZW1zIG9jY3VyIGJlZm9yZT8KCi0gRnJlZCBOb3ogcmVwb3J0ZWQgYSAtdy8tLXdyaXRlLW91dCBidWcgdGhhdCBjYXVzZWQgaXQgdG8gbWFsZnVuY3Rpb24gd2hlbgogIHVzZWQgY29tYmluZWQgd2l0aCBtdWx0aXBsZSBVUkwgcmV0cmlldmFsZXMuIEFsbCBidXQgdGhlIGZpcnN0IGRpc3BsYXkgZ290CiAgc2NyZXdlZCB1cCEKCkRhbmllbCAoMTEgQXVndXN0IDIwMDApCi0gSmFzb24gUHJpZWJlIGFuZCBhbiBhbm9ueW1vdXMgZnJpZW5kIGZvdW5kIHNvbWUgaG9zdCBuYW1lcyB0aGUgTGludXggdmVyc2lvbgogIG9mIGN1cmwgY291bGQgbm90IHJlc29sdmUuIEl0IHR1cm5lZCBvdXQgdGhlIGJ1ZmZlciB1c2VkIHRvIHJldHJpZXZlIHRoYXQKICBpbmZvcm1hdGlvbiB3YXMgdG9vIHNtYWxsLiBGaXhlZC4gT25lIGNvdWxkIGFyZ3VlIGFib3V0IHRoZSB1c2VmdWxuZXNzIG9mCiAgbm90IGhhdmluZyB0aGUgc2xpZ2h0ZXN0IHRyYWNlIG9mIGEgbWFuIHBhZ2UgZm9yIGdldGhvc3RieW5hbWVfcigpIG9uIG15CiAgTGludXggUmVkaGF0IGluc3RhbGxhdGlvbi4uLgoKRGFuaWVsICgxMCBBdWd1c3QgMjAwMCkKLSBCYWxhamkgUyBSYW8gd2FzIGZpcnN0IGluIGxpbmUgdG8gbm90ZSB0aGUgbWlzc2luZyBwb3NzaWJpbGl0eSB0byByZXBsYWNlCiAgdGhlIENvbnRlbnQtVHlwZTogYW5kIENvbnRlbnQtTGVuZ3RoOiBoZWFkZXJzIHdoZW4gZG9pbmcgLWQgcG9zdHMuIEkgYWRkZWQKICB0aGUgcG9zc2liaWxpdHkganVzdCBub3cuIEl0IHNlZW1zIHNvbWUgcGVvcGxlIHdhbnRzIHRvIGRvIHN0YW5kYXJkIHBvc3RzCiAgdXNpbmcgY3VzdG9tIENvbnRlbnQtVHlwZXMuCgpEYW5pZWwgKDggQXVndXN0IDIwMDApCi0gTWlrZSBEb3dlbGwgY29ycmVjdGx5IGRpc2NvdmVyZWQgdGhhdCBjdXJsIGRpZCBub3QgYXBwcm92ZSBvZiBVUkxzIHdpdGggbm8KICB1c2VyIG5hbWUgYnV0IHBhc3N3b3JkLiBBcyBpbiAnaHR0cDovLzpmb29AaGF4eC5zZScuIEkgY29ycmVjdGVkIHRoaXMuCgpWZXJzaW9uIDcuMQoKRGFuaWVsICg3IEF1Z3VzdCAyMDAwKQotIE15IEFJWCA0IGZpeCBkb2VzIG5vdCB3b3JrLiBJIG5lZWQgaGVscCBmcm9tIGEgQUlYIDQgaGFja2VyLgoKLSBJIGFkZGVkIG15IG5ldyBkb2N1bWVudCBpbiB0aGUgZG9jcyBkaXJlY3RvcnkuIEl0IGlzIGFpbWVkIHRvIGJlY29tZSBhIHNvcnQKICBvZiB0dXRvcmlhbCBvbiBob3cgdG8gZG8gSFRUUCBzY3JpcHRpbmcgd2l0aCBjdXJsLgoKRGFuaWVsICg0IEF1Z3VzdCAyMDAwKQotIFdvcmtpbmcgd2l0aCBSaWNoIEdyYXkgb24gY29tcGlsaW5nIGN1cmwgZm9yIGxvdHMgb2YgZGlmZmVyZW50IHBsYXRmb3Jtcy4KICBNeSBmaXggZm9yIEFJWCAzLjIgd2FzIG5vdCBnb29kIGVub3VnaCBhbmQgd2FzIHNsaWdodGx5IGNoYW5nZWQsIEkgaGFkIHRvCiAgbW92ZSBhbiBpbmNsdWRlIGZpbGUgYmVmb3JlIGFub3RoZXIsIGFzIGlzIG5vdyBkZXNjcmliZWQgaW4gdGhlIHNvdXJjZS4KCiAgQUlYIDQuMiAoNC5YPykgaGFzIGRpZmZlcmVudCBnZXRob3N0YnluYW1lX3IoKSBhbmQgZ2V0aG9zdGJ5YWRkcl9yKCkKICBmdW5jdGlvbnMgdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdCBkaWRuJ3QgY2hlY2sgZm9yIGFuZCB0aHVzIHRoZSBjb21waWxlCiAgYnJva2Ugd2l0aCBhbiBlcnJvci4gSSBoYXZlIG5vdyBjaGFuZ2VkIHRoZSBnZXRob3N0YnluYW1lX3IoKSBjaGVjayBpbiB0aGUKICBjb25maWd1cmUgZmlsZSB0byBzdXBwb3J0IGFsbCB0aHJlZSB2ZXJzaW9ucyBvZiBib3RoIHRoZXNlIGZ1bmN0aW9ucy4gTXkKICBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgdGhlIEFJWC1zdHlsZSBpcyB0aG91Z2ggbm90IHlldCB2ZXJpZmllZCBhbmQgSSBtYXkKICBnZXQgcHJvYmxlbXMgdG8gZml4IGl0IGlmIGl0IHR1cm5zIG91dCB0byBidWcgc2luY2UgSSBkb24ndCBoYXZlIGFjY2VzcyB0bwogIGFueSBzeXN0ZW0gdXNpbmcgdGhhdC4KCiAgRm9yIHByb2JsZW1zIGxpa2UgdGhhdCwgSSBtYWRlIHRoZSBjb25maWd1cmUgc2NyaXB0IGFsbG93IC0tZGlzYWJsZS10aHJlYWQKICB0byBjb21wbGV0ZWx5IHN3aXRjaCBvZmYgdGhlIGNoZWNrIGZvciB0aHJlYWRzYWZlIHZlcnNpb25zIG9mIGEgZmV3CiAgZnVuY3Rpb25zIGFuZCB0aHVzIGdvIHdpdGggdGhlICJnb29kIG9sZCB2ZXJzaW9ucyIgdGhhdCB0ZW5kIHRvIHdvcmsKICBhbHRob3VnaCB3aWxsIGJyZWFrIHRocmVhZC1zYWZlbmVzcyBmb3IgbGliY3VybC4gTW9zdCBwZW9wbGUgd29uJ3QgdXNlCiAgbGliY3VybCBmb3Igb3RoZXIgdGhpbmdzIHRoYW4gY3VybCB0aG91Z2gsIGFuZCBjdXJsIGRvZXNuJ3QgbmVlZCBhCiAgdGhyZWFkLXNhZmUgbGliLgoKLSBXb3JraW5nIG9uIG15IGJpZyB0dXRvcmlhbCBhYm91dCBIVFRQIHNjcmlwdGluZyB3aXRoIGN1cmwuCgpEYW5pZWwgKDEgQXVndXN0IDIwMDApCi0gUmljaCBHcmF5IHNwb3R0ZWQgYSBwcm9ibGVtIGluIHNyYy9zZXR1cC5oIGNhdXNlZCBieSBhICNkZWZpbmUgc3RyZXF1YWwoKQogIHRoYXQgd2FzIGp1c3QgYSBsZWZ0LW92ZXIgZnJvbSBwYXNzZWQgdGltZXMuIFRoZSBzdHJlcXVhbCgpIGlzIG5vdyBhIHRydWUKICBmdW5jdGlvbiBzdXBwbGllZCBieSBsaWJjdXJsIGZvciBhIHBvcnRhYmxlIGNhc2UgaW5zZW5zaXRpdmUgc3RyaW5nCiAgY29tcGFyaXNvbi4gSSBhZGRlZCB0aGUgcHJvdG90eXBlcyBpbiBpbmNsdWRlL2N1cmwuaCBhbmQgcmVtb3ZlZCB0aGUKICBub3cgb2Jzb2xldGUgI2RlZmluZS4KCi0gSWdvciBLaHJpc3RvcGhvcm92IG1hZGUgYSBmaXggdG8gYWxsb3cgcmVzdW1lZCBkb3dubG9hZCBmcm9tIFN1bidzCiAgSmF2YVdlYlNlcnZlci8xLjEuMS4gSXQgc2VlbXMgdGhhdCB0aGVpciBzZXJ2ZXIgc2VuZHMgYmFkIENvbnRlbnQtUmFuZ2UKICBoZWFkZXJzLgoKLSBUaGUgbWFrZWZpbGVzIGZvcmNlZCBhIHN0YXRpYyBsaWJyYXJ5IGJ1aWxkLCB3aGljaCBpcyBiYWQgc2luY2Ugd2Ugbm93IHVzZQogIGxpYnRvb2wgYW5kIHRodXMgaGF2ZSBleGNlbGxlbnQgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCEgQWxiZXJ0IENoaW4tQS1Zb3VuZwogIGZvdW5kIG91dC4KClZlcnNpb24gNy4wLjExYmV0YQoKRGFuaWVsICgxIEF1Z3VzdCAyMDAwKQotIEFsYmVydCBDaGluLUEtWW91bmcgcG9pbnRlZCBvdXQgdGhhdCAnbWFrZSBpbnN0YWxsJyBkaWQgbm90IHByb3Blcmx5IGNyZWF0ZQogIHRoZSBoZWFkZXIgaW5jbHVkZSBkaXJlY3RvcnksIHdoeSBpdCBmYWlsZWQgdG8gaW5zdGFsbCB0aGUgaGVhZGVyIGZpbGVzIGFzCiAgaXQgc2hvdWxkLiBBdXRvbWFrZSBpc24ndCByZWFsbHkgZXF1aXBwZWQgdG8gZGVhbCB3aXRoIHN1YmRpcmVjdG9yaWVzCiAgd2l0aG91dCBNYWtlZmlsZXMgaW4gYW55IG5pY2Ugd2F5LiBJIGhhZCB0byBydW4gYWhlYWQgYW5kIGFkZCBNYWtlZmlsZXMgaW4KICBib3RoIGluY2x1ZGUgYW5kIGluY2x1ZGUvY3VybCBiZWZvcmUgSSBtYW5hZ2VkIHRvIGNyZWF0ZSBhIHRvcC1sZXZlbAogIG1ha2VmaWxlIHRoYXQgc3VjY2VlZHMgaW4gaW5zdGFsbCBldmVyeXRoaW5nIHByb3Blcmx5IQoKLSBPaywgbm8gbW9yZSAiZmVhdHVyZXMiIGFkZGVkIG5vdy4gTGV0J3MganVzdCB2ZXJpZnkgdGhhdCB0aGVyZSdzIG5vIG1ham9yCiAgZmxhd3MgYWRkZWQgbm93LgoKRGFuaWVsICgzMSBKdWx5IDIwMDApCi0gQm90aCBKZWZmIFNjaGFzbnkgYW5kIEtldGlsIEZyb3luIGFza2VkIG1lIGhvdyB0byB0ZWxsIGN1cmwgbm90IHRvIHNlbmQgb25lCiAgb2YgdGhvc2UgaW50ZXJuYWxseSBnZW5lcmF0ZWQgaGVhZGVycy4gVGhleSBkaWRuJ3Qgc2V0dGxlIHdpdGggdGhlIGJsYW5rCiAgb25lcyB5b3UgY291bGQgdGVsbCBjdXJsIHRvIHVzZS4gSSByZXdyb3RlIHRoZSBoZWFkZXItcmVwbGFjZSBzdHVmZiBhCiAgbGl0dGxlLiBOb3csIGlmIHlvdSByZXBsYWNlIGFuIGludGVybmFsIGhlYWRlciB3aXRoIHlvdXIgb3duIGFuZCB0aGF0IG5ldwogIG9uZSBpcyBhIGJsYW5rIGhlYWRlciB5b3Ugd2lsbCBvbmx5IHJlbW92ZSB0aGUgaW50ZXJuYWwgb25lIGFuZCBub3QgZ2V0IGFueQogIGJsYW5rLiBJIGNvdWxkbid0IGZpZ3VyZSBvdXQgYW55IGNhc2Ugd2hlbiB5b3Ugd2FudCB0aGF0IGJsYW5rIGhlYWRlci4KCkRhbmllbCAoMjkgSnVseSAyMDAwKQotIEl0IHN0cnVjayBtZSB0aGF0IHRoZSBsaWIgdXNlZCBsb2NhbHRpbWUoKSB3aGljaCBpcyBub3QgdGhyZWFkLXNhZmUsIHNvIG5vdwogIEkgdXNlIGxvY2FsdGltZV9yKCkgaW4gdGhlIHN5c3RlbXMgdGhhdCBoYXMgaXQuCgotIEkgd2VudCB0aHJvdWdoIHRoaXMgZW50aXJlIGRvY3VtZW50IGFuZCByZW1vdmVkIGFsbCBlbWFpbCBhZGRyZXNzZXMgYW5kIGxlZnQKICBuYW1lcyBvbmx5LiBJJ3ZlIHJlYWxseSBtYWRlIGFuIGVmZm9ydCB0byBhbHdheXMgbm90ZSB3aG8gYnJvdWdodCBiZSBidWcKICByZXBvcnRzIG9yIGZpeGVzLCBidXQgbW9yZSBhbmQgbW9yZSBwZW9wbGUgYXNrIG1lIHRvIHJlbW92ZSB0aGUgZW1haWwKICBhZGRyZXNzZXMgc2luY2UgdGhleSBiZWNvbWUgdmljdGltcyBmb3Igc3BhbXMgdGhpcyB3YXkuIEdvcmRvbiBCZWF0b24gZ290IG1lCiAgd29ya2luZyBvbiB0aGlzLgoKRGFuaWVsICgyNyBKdWx5IDIwMDApCi0gSvZybiBIYXJ0cm90aCBmb3VuZCBvdXQgdGhhdCB3aGVuIHlvdSBzcGVjaWZpZWQgYSBIVFRQIHByb3h5IGluIGFuCiAgZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIHVzZWQgLUwsIGN1cmwgZmFpbGVkIGluIHRoZSBzZWNvbmQgZmV0Y2guIEkKICBjb3JyZWN0ZWQgdGhpcyBwcm9ibGVtIGFuZCBwb3N0ZWQgYSBwYXRjaCB0byB0aGUgbGlzdC4gTm8gbmVlZCBmb3IgYW4gZXh0cmEKICBiZXRhIHJlbGVhc2UganVzdCBmb3IgdGhpcy4KClZlcnNpb24gNy4wLjEwYmV0YQoKRGFuaWVsICgyNyBKdWx5IDIwMDApCi0gU28sIGxpYnRvb2wgcmVwbGFjZWQgdHdvIG9mIG15IGZpbGVzIHdpdGggc3ltYm9saWMgbGlua3MgYW5kIEkgZm9yZ290IHRvIGFkZAogIHRoZSB0d28gbmV3IGxpYnRvb2wgZmlsZXMgdG8gdGhlIHJlbGVhc2UgYXJjaGl2ZSAoYW5kIHRoZXkgd2VyZSBhZGRlZCBhcwogIHN5bWxpbmtzIGFzIHdlbGwhKSBUaGlzIG9mIGNvdXJzZSBsZWFkIHRvIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZmFpbGVkCiAgb24gNy4wLjkuLi4KClZlcnNpb24gNy4wLjliZXRhCgpEYW5pZWwgKDI1IEp1bHkgMjAwMCkKLSBLcmlzdGlhbiBL9mhudG9wcCA8a3JpcyBhdCBrb2VobnRvcHAuZGU+IGJyb3VnaHQgYSBmaXggdGhhdCBtYWtlcyBsaWJjdXJsCiAgbGlidG9vbGlmaWVkLCBqdXN0IGFzIHdlJ3ZlIHdhbnRlZCBmb3IgYSB3aGlsZSBub3cuIEhlIGFsc28gbWFkZSB0aGUKICByZWNlbnRseSBhZGRlZCBtYW4gcGFnZXMgZ2V0IGluc3RhbGxlZCBwcm9wZXJseSBvbiAnbWFrZSBpbnN0YWxsJyBhbmQgc29tZQogIG90aGVyIG5pY2UgY2xlYW51cHMuCgotIEluIGEgZGlzY3Vzc2lvbiB3aXRoIEVldHUgT2phbmVuIGl0IHN0cnVjayBtZSB0aGF0IGlmIHdlIHVzZSBjdXJsIHRvIGdldCBhCiAgcGFnZSB1c2luZyBhIHBhc3N3b3JkLCBhbmQgdGhhdCBwYWdlIHRoZW4gc2VuZHMgYSBMb2NhdGlvbjogdG8gYW5vdGhlcgogIHNlcnZlciB0aGF0IGN1cmwgZm9sbG93cywgY3VybCB3aWxsIHNlbmQgdGhlIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgdG8gdGhhdAogIHNlcnZlciBhcyB3ZWxsLgoKICBOb3csIEknbGwgbmV2ZXIgYmUgYWJsZSB0byBtYWtlIGN1cmwgZG8gTG9jYXRpb246IGZvbGxvd2luZyBhbGwgdGhhdCBwZXJmZWN0CiAgYW5kIHlvdSdyZSBhbGwgc29vbmVyIG9yIGxhdGVyIHJlcXVpcmVkIHRvIHdyaXRlIGEgc2NyaXB0IHRvIGRvIHNldmVyYWwKICBmZXRjaGVzIHdoZW4geW91J3JlIGRvaW5nIGFkdmFuY2VkIHN0dWZmLCBidXQgbm93IEkndmUgbW9kaWZpZWQgY3VybCB0byBhdAogIGxlYXN0ICpvbmx5KiBzZW5kIHRoZSB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIHRvIHRoZSBvcmlnaW5hbCBzZXJ2ZXIuIFdoaWNoCiAgbWVhbnMgdGhhdCBpZiBnZXQgYSBwYWdlIGZyb20gc2VydmVyIEEgd2l0aCBhIHBhc3N3b3JkLCB0aGF0IGZvcndhcmRzIGN1cmwKICB0byBzZXJ2ZXIgQiwgY3VybCB3b24ndCB1c2UgdGhlIHBhc3N3b3JkIHRoZXJlLiBJZiBzZXJ2ZXIgQiB0aGVuIGZvcndhcmRzCiAgY3VybCBiYWNrIHRvIHNlcnZlciBBIGFnYWluLCB0aGUgcGFzc3dvcmQgd2lsbCBiZSB1c2VkIGFnYWluLgoKICBUaGlzIGlzIG5vdCBhIHBlcmZlY3QgaW1wbGVtZW50YXRpb24sIGFzIGluIGEgYnJvd3NlciBjYXNlIGl0IHdvdWxkIG9ubHkgdXNlCiAgdGhlIHBhc3N3b3JkIGlmIHRoZSBsZWZ0LXByZWZpeCBvZiB0aGUgZmlyc3QgcGF0aCBpcyB0aGUgc2FtZS4gSSBqdXN0IHRoaW5rCiAgdGhhdCB0aGlzIGZpeCBwcmV2ZW50cyBhIHNvbWV3aGF0IGx1cmt5ICJzZWN1cml0eSBob2xlIi4KCiAgQXMgYSBzaWRlLW5vdGUgaW4gdGhpcyBzdWJqZWN0OiBIVFRQIHBhc3N3b3JkcyBhcmUgc2VudCBpbiBjbGVhcnRleHQgYW5kCiAgd2lsbCBuZXZlciBiZSBjb25zaWRlcmVkIHRvIGJlIHNhZmUgb3Igc2VjdXJlLiBVc2UgSFRUUFMgZm9yIHRoYXQuCgotIEFzIGRpc2N1c3NlZCBvbiB0aGUgbWFpbGluZyBsaXN0LCBJIGNvbnZlcnRlZCB0aGUgRlRQIHJlc3BvbnNlIHJlYWRpbmcKICBmdW5jdGlvbiBpbnRvIHVzaW5nIHNlbGVjdCgpIHdoaWNoIHRoZW4gYWxsb3dzIHRpbWVvdXRzIChldmVuIHVuZGVyIHdpbjMyISkKICBpZiB0aGUgY29tbWFuZC1yZXBseSBzZXNzaW9uIGdldHMgdG9vIHNsb3cgb3IgZGllcyBjb21wbGV0ZWx5LiBJIG1hZGUgYQogIGRlZmF1bHQgdGltZW91dCBvbiAzNjAwIHNlY29uZHMgdW5sZXNzIGFueXRoaW5nIGVsc2UgaXMgc3BlY2lmaWVkLCBzaW5jZSBJCiAgZG9uJ3QgdGhpbmsgYW55b25lIHdhbnRzIHRvIHdhaXQgbW9yZSB0aGFuIHRoYXQgZm9yIGEgc2luZ2xlIGNoYXJhY3RlciB0bwogIGdldCByZWNlaXZlZC4uLgoKLSBUb3JzdGVuIEZvZXJ0c2NoIDx0b3JzdGVuLmZvZXJ0c2NoIGF0IGdteC5uZXQ+IGJyb3VnaHQgYSBzZXQgb2YgZml4ZXMgZm9yCiAgdGhlIHJmYzE4NjcgZm9ybSBwb3N0cy4gSGUgaW50cm9kdWNlZCAnbmFtZT08ZmlsZScgd2hpY2ggYnJpbmdzIGEgbWVhbnMgdG8KICBzdXVwbHkgdmVyeSBsYXJnZSB0ZXh0IGNodW5rcyByZWFkIGZyb20gdGhlIGdpdmVuIGZpbGUgbmFtZS4gSXQgZGlmZmVycyBmcm9tCiAgJ25hbWU9QGZpbGUnIGluIHRoZSB3YXkgdGhhdCB0aGlzIGxhdHRlciB0aGluZyBpcyBtYXJrZWQgaW4gdGhlIHVwbG9hZGVkCiAgY29udGVudHMgYXMgYSBmaWxlIHVwbG9hZCwgd2hpbGUgdGhlIGZpcnN0IGlzIGp1c3QgdGV4dCAoYXMgaW4gYSBpbnB1dCBvcgogIHRleHRhcmVhIGZpZWxkKS4gVG9yc3RlbiBhbHNvIGNvcnJlY3RlZCBhIGJ1ZyB0aGF0IHdvdWxkIGhhcHBlbiBpZiB5b3UgdXNlZAogICVzIG9yIHNpbWlsYXIgaW4gYSAtRiBmaWxlIG5hbWUuCgotIEFzIGRpc2NvdmVyZWQgYnkgTmljbyBCYWdndXMgPE5pY28uQmFnZ3VzIGF0IG1haWwuaW5nLm5sPiwgd2hlbiB0cmFuc2ZlcnJpbmcKICBmaWxlcyB0by9mcm9tIEZUUCB1c2luZyB0eXBlIEFTQ0lJIGN1cmwgc2hvdWxkIG5vdCBleHBlY3QgdGhlIHRyYW5zZmVyIHRvIGJlCiAgdGhlIGV4YWN0IHNpemUgcmVwb3J0ZWQgYnkgdGhlIHNlcnZlciBhcyB0aGUgZmlsZSBzaXplLiBTaW5jZSBBU0NJSSBtYXkgdmVyeQogIHdlbGwgbWVhbiB0aGF0IHRoZSBjb250ZW50IGlzIHRyYW5zbGF0ZWQgd2hpbGUgdHJhbnNmZXJlZCwgdGhlIGZpbmFsIHNpemUKICBtYXkgdmVyeSB3ZWxsIGRpZmZlci4gVGhlcmVmb3IsIGN1cmwgbm93IGlnbm9yZXMgdGhlIGZpbGUgc2l6ZSB3aGVuIGRvaW5nCiAgQVNDSUkgdHJhbnNmZXJzIGluIEZUUC4KCkRhbmllbCAoMjQgSnVseSAyMDAwKQotIEFkZGVkIENVUkxPUFRfUFJPWFlQT1JUIHRvIHRoZSBjdXJsX2Vhc3lfc2V0b3B0KCkgY2FsbCB0byBhbGxvdyB0aGUgcHJveHkKICBwb3J0IG51bWJlciB0byBiZSBzZXQgc2VwYXJhdGVseSBmcm9tIHRoZSBwcm94eSBob3N0IG5hbWUuCgotIEFuZHJldyA8YW5kcmV3IGF0IHVnaC5uZXQuYXU+IHBvaW50ZWQgb3V0IGEgbmV0cmMgbWFudWFsIGJ1Zy4KCi0gVGhlIEZUUCB0cmFuc2ZlciBjb2RlIG5vdyBhY2NlcHRzIGEgMjUwLWNvZGUgYXMgd2VsbCBhcyB0aGUgcHJldmlvdXNseQogIGFjY2VwdGVkIDIyNiwgYWZ0ZXIgYSBzdWNjZXNzZnVsIGZpbGUgdHJhbnNmZXIuIE1vaGFuIDxtbmFpciBhdAogIGV2ZXJncmVlbi1mdW5kcy5jb20+IHBvaW50ZWQgdGhpcyBvdXQuCgotIFRoZSBjaGVjayBmb3IgKmJvdGgqIG5zbCBhbmQgc29ja2V0IHdhcyBuZXZlciBhZGRlZCBpbiB0aGUgdjcgY29uZmlndXJlLmluCiAgd2hlbiBJIG1vdmVkIHRoZSBtYWluIGJyYW5jaC4gSSByZS1hZGRlZCB0aGF0IGNoZWNrIHRvIGNvbmZpZ3VyZS5pbi4gVGhpcyB3YXMKICBkaXNjb3ZlcmVkIGJ5IFJpY2ggR3JheS4KCi0gSG93YXJkLCBCbGFpc2UgPEJsYWlzZS5Ib3dhcmQgYXQgZmFjdGl2YS5jb20+IHBvaW50ZWQgb3V0IGEgbWlzc2luZyBmcmVlKCkgaW4KICBjdXJsX2Rpc2Nvbm5lY3QoKSB3aGljaCBvZiBjb3Vyc2UgbWVhbnQgbGliY3VybCBhdGUgbWVtb3J5LgoKLSBCcmlhbiBFLiBHYWxsZXcgbm90ZWQgdGhhdCB0aGUgSFRUUCAnSG9zdDonIGhlYWRlciBjdXJsIHNlbnQgZGlkIG5vdAogIHByb3Blcmx5IGluY2x1ZGUgdGhlIHBvcnQgbnVtYmVyIGlmIG5vbi1kZWZhdWx0IHBvcnRzIHdlcmUgdXNlZC4gVGhpcyBzaG91bGQKICBub3cgaGF2ZSBiZWVuIGZpeGVkLgoKLSBIVFRQIGNvbm5lY3QgZXJyb3JzIG5vdyByZXR1cm4gZXJyb3JzIGVhcmxpZXIuIFRoaXMgd2FzIG1vc3Qgbm90YWJseSBjYXVzaW5nCiAgcHJvYmxlbXMgd2hlbiB0aGUgSFRUUFMgY2VydGlmaWNhdGUgaGFkIHByb2JsZW1zIGFuZCBsYXRlciBjYXVzZWQgYSBjcmFzaC4KICBNYW55IHRoYW5rcyB0byBHcmVnb3J5IE5pY2hvbGxzIDxnbmljaG9sbHMgYXQgbGV2ZWw4LmNvbT4gZm9yIGRpc2NvdmVyaW5nCiAgYW5kIHN1Z2dlc3RpbmcgYSBmaXguLi4KCkRhbmllbCAoMjEgSnVuZSAyMDAwKQotIEFmdGVyIGEgImJ1ZyByZXBvcnQiIEkgcmVjZWl2ZWQgd2hlcmUgdGhlIHVzZXIgd2FzIHVzaW5nIGJvdGggLUYgYW5kIC1JIGluIGEKICBIVFRQIHJlcXVlc3QgKGl0IHNldmVybHkgY29uZnVzZWQgdGhlIGxpYnJhcnkgSSBzaG91bGQgYWRkKSwgSSBhZGRlZCBzb21lCiAgY2hlY2tzIHRvIHNyYy9tYWluLmMgdGhhdCBwcmV2ZW50cyBzZXR0aW5nIG1vcmUgdGhhbiBvbmUgSFRUUCByZXF1ZXN0CiAgY29tbWFuZCwgbm8gbWF0dGVyIHdoYXQgdGhlIHVzZXIgd2FudHMhIDstKQoKVmVyc2lvbiA3LjAuOGJldGEKCkRhbmllbCAoMjAgSnVuZSAyMDAwKQotIEkgZGlkIGEgbWFqb3IgcmVwbGFjZSBpbiBtYW55IGZpbGVzIHRvIHVzZSB0aGUgbmV3IGN1cmwgZG9tYWluIGhheHguc2UKICBpbnN0ZWFkIG9mIHRoZSBwcmV2aW91cyBvbmUuCgotIEFzIEVldHUgT2phbmVuIHN1Z2dlc3RlZCwgSSBmaW5hbGx5IHRvb2sgdGhlIHN0ZXAgYW5kIG5vdyBsaWJjdXJsIG5vIGxvbmdlcgogIG1ha2VzIGEgUE9TVCBhZnRlciBpdCBoYXMgZm9sbG93ZWQgYSBsb2NhdGlvbi4gV2hlbiB0aGUgaW5pdGlhbCBQT1NUIGhhcwogIGJlZW4gZG9uZSwgaXQnbGwgdHVybmVkIGludG8gYSBHRVQgZm9yIHRoZSBmdXJ0aGVyIHJlcXVlc3RzLiBUaGlzIGlzIG9ubHkKICBpbnRlcmVzdGluZyB3aGVuIHVzaW5nIC1MLy0tbG9jYXRpb24gKmFuZCogZG9pbmcgYSBQT1NUIGF0IHRoZSBzYW1lIHRpbWUuCgogIFdoaWxlIG1lc3Npbmcgd2l0aCB0aGlzLCBJIGFkZGVkIGFub3RoZXIgd2VpcmQgZmVhdHVyZSBJIGNhbGwgJ2F1dG8KICByZWZlcmVyJy4gSWYgeW91IGFwcGVuZCAnO2F1dG8nIHRvIHRoZSByaWdodCBvZiBhIGdpdmVuIHJlZmVyZXIgc3RyaW5nIChvcgogIG9ubHkgdXNlIHRoYXQgc3RyaW5nIGFzIHJlZmVyZXIpLCBsaWJjdXJsIHdpbGwgYXV0b21hdGljYWxseSBzZXQgdGhlCiAgcHJldmlvdWQgVVJMIGFzIHJlZmVyZWQgd2hlbiBpdCBmb2xsb3dzIGEgTG9jYXRpb246IGFuZCBnZXRzIGEgc3VjY2VlZGluZwogIGRvY3VtZW50LgoKLSBNeSBoZXJvIFJpY2ggR3JheSBmb3VuZCB0aGUgdmVyeSBvYnNjdXJlIEZUUCBidWcgdGhhdCBoYXBwZW5lZCB0byBoaW0gb25seQogIHdoZW4gcGFzc2luZyB0aHJvdWdoIGEgcGFydGljdWxhciBmaXJld2FsbCBhbmQgdXNpbmcgdGhlIFBPUlQgY29tbWFuZC4gSXQKICB0dXJuZWQgb3V0IHRoYXQgUE9SVCB3YXMgdGhlIG9ubHkgY29tbWFuZCBpbiB0aGUgbGliL2Z0cC5jIHNvdXJjZSB0aGF0CiAgZGlkbid0IHNlbmQgYSBwcm9wZXIgXHJcbiBzZXF1ZW5jZSBidXQgaW5zdGVhZCB1c2VkIHRoZSBmYXVsdHkgXG4gd2hpY2ggYXMKICBpdCBzZWVtZWQgaXMgc3VwcG9ydGVkIGJ5IG1vc3QgbWFqb3IgZnRwIHNlcnZlcnMuLi4gOi1PCgpWZXJzaW9uIDcuMC43YmV0YQoKRGFuaWVsICgxNiBKdW5lIDIwMDApCi0gSSBoYWQgYXZvaWRlZCB0aGlzIGxvbmcgZW5vdWdoIG5vdywgc28gSSBtb3ZlZCB0aGUgYWx0ZXJuYXRpdmUgcHJvZ3Jlc3MgYmFyCiAgc3R1ZmYgZnJvbSB0aGUgbGliIGFuZCBhZGRlZCBpdCB0byB0aGUgY2xpZW50IGNvZGUuIFRoaXMgaXMgbm93IHVzaW5nIHRoZQogIHJlY2VudGx5IGFkZGVkIHByb2dyZXNzIGNhbGxiYWNrIGFuZCBpdCBzZWVtcyB0byB3b3JrIHByZXR0eSBtdWNoIGxpa2UKICBiZWZvcmUuIFNpbmNlIGl0IGlzIG9ubHkgb25lIHByb2dyZXNzIGJhciBhbmQgeW91IGFuZCBkb3dubG9hZCBhbmQgdXBsb2FkIGF0CiAgdGhlIHNhbWUgdGltZSwgdGhpcyBiYXIgc2hvd3MgdGhlIGNvbWJpbmVkIHByb2dyZXNzIG9mIGJvdGggZGlyZWN0aW9ucy4gVGhpcwogIGNvZGUgd2FzIGp1c3QgcG9ydGVkIGZyb20gdGhlIG9sZCBwbGFjZSB0byB0aGlzLCBMYXJzIGlzIHN0aWxsIG91ciBzYXZpb3VyIQogIDstKSBUaGlzIGFsc28gbWFkZSB0aGUgZG9jdW1lbnRhdGlvbiBtb3JlIGFjY3VyYXRlIHNpbmNlIEkgbmV2ZXIgcmVtb3ZlZAogIHRoaXMgZnVuY3Rpb24gZnJvbSBhbnkgZG9jcyEgQWx0aG91Z2ggSSBub3cgcmVtb3ZlZCB0aGUgQ1VSTE9QVF9QUk9HUkVTU01PREUKICBmcm9tIHRoZSBsaWJyYXJ5IHNpbmNlIHRoZSBsaWIgaGFzIG9ubHkgb25lIGludGVybmFsIHByb2dyZXNzIG1ldGVyIGFuZCBpdAogIHdpbGwgbmV2ZXIgZ2V0IGFub3RoZXIuIEl0IGlzIGFsdGhvdWdoIGxpa2VseSB0aGF0IHRoZSBpbnRlcm5hbCBvbmUgYWxzbwogIHdpbGwgYmUgbW92ZWQgdG8gdGhlIGNsaWVudCBjb2RlIGluIHRoZSBmdXR1cmUgKHdoZW4gSSBoYXZlIG90aGVyIG1lYW5zIG9mCiAgZ2V0dGluZyB0aGUgd3JpdGVvdXQgZGF0YSBhbmQgbW92ZSB0aGF0IHRvbyB0byB0aGUgY2xpZW50KS4KCi0gSSB0b29rIHRoZSBvcHBvcnR1bml0eSB0byB2ZXJpZnkgdGhhdCBzdGFuZGFyZCBwcm9ncmVzcyBtZXRlciB3b3JrcyBhbmQgSQogIGZvdW5kIG91dCBpdCBkaWRuJ3QgZ2V0IGluaXRlZCBwcm9wZXJseS4gR3Jyci4gSSBjb3JyZWN0ZWQgdGhhdCBhcyB3ZWxsLgoKRGFuaWVsICgxNSBKdW5lIDIwMDApCi0gSSB0aG91Z2h0IEknZCBiZXR0ZXIgdmVyaWZ5IHRoYXQgdGhlIC1GIG9wdGlvbiBzdGlsbCB3b3JrcyBpbiB2NyBhbmQgb2YKICBjb3Vyc2UgaXQgZGlkbid0Li4uIDotLyBBbnl3YXksIEkgaGFkIHRoZSBwcm9ibGVtcyBJIGNvdWxkIGRpc2NvdmVyCiAgY29ycmVjdGVkLiBBYm91dCBvbmUgbW9udGggb2YgYmV0YSB0ZXN0aW5nIGFuZCBub3QgYSBzaW5nbGUgcGVyc29uIGhhcyB1c2VkCiAgdGhpcyBmZWF0dXJlIHdpdGggdjc/CgotIEJq9nJuIGNvcnJlY3RseSBwb2ludGVkIG91dCB0aGF0IHRoZSAtLXByb2dyZXNzLWJhciBzdGlsbCBkb2Vzbid0IHdvcmsgaW4KICB2Ny4gSG0uCgpEYW5pZWwgKDE0IEp1bmUgMjAwMCkKLSBUaW0gVGFzc29uaXMgZGlzY292ZXJlZCB0aGF0IGN1cmwgNyBkaWRuJ3QgaGFuZGxlIG5vcm1hbCBodHRwIFBPU1QgYXMgaXQKICBzaG91bGQuIEkgY29ycmVjdGVkIHRoaXMuCgpWZXJzaW9uIDcuMC42YmV0YQoKRGFuaWVsICgxNCBKdW5lIDIwMDApCi0gQmr2cm4gU3RlbmJlcmcgcG9pbnRlZCBvdXQgc2V2ZXJhbCBwcm9ibGVtcyAocmVsYXRlZCB0byB3aW4zMiBjb21waWxpbmcpOgogIGxpYi9zdHJlcXVhbC5jIGhhZCBhIGJhZCAjaWZkZWYgZm9yIG9uZSBvZiB0aGUgc3RyaW5nIGNvbXBhcmlzb25zICh3aW4zMikKICBzcmMvbWFpbi5jIGhhZCBzZXZlcmFsIG1pbm9yIHByb2JsZW1zCiAgbGliL21ha2VmaWxlLm0zMiBoYWQgZ2V0cGFzcy5bY29dIHR3aWNlCiAgc3JjL2NvbmZpZy13aW4zMi5oIGxhY2tlZCB0aGUgSEFWRV9GQ05UTF9IIGRlZmluZQogIGJvdGggY29uZmlnLXdpbjMyLmggZmlsZXMgbm93IG9ubHkgc2V0IHRoZSBIQVZFX1VOSVNURF9IIGRlZmluZSBpZiB0aGUKICBkZWZpbmUgTUlOR1czMiBpcyBzZXQsIGFuZCBJIG1vZGlmaWVkIHNyYy9tYWtlZmlsZS5tMzIgYW5kIGxpYi9tYWtlZmlsZS5tMzIKICB0byBzZXQgaXQuCgpWZXJzaW9uIDcuMC41YmV0YQoKRGFuaWVsICgxNCBKdW5lIDIwMDApCi0gQXBwbGllZCBMdW9uZyBEaW5oIER1bmcncyBjb21tZW50cyBhYm91dCBhIGZldyB3aW4zMiBjb21waWxlIHByb2JsZW1zLgoKLSBBcHBsaWVkIEJq9nJuIFN0ZW5iZXJnJ3Mgc3VnZ2VzdGVkIGZpeCB0aGF0IHR1cm5zIHRoZSB3aW4zMiBzdGRvdXQgdG8KICBiaW5hcnkuIEl0IHdvbid0IGRvIGl0IGlmIHRoZSAtQiAvIC0tdXNlLWFzY2lpIG9wdGlvbiBpcyB1c2VkLiBUaGF0IG9wdGlvbgogIGlzIG5vdyBhbiBleHRlbmRlZCB2ZXJzaW9uIG9mIHRoZSBwcmV2aW91cyAtQiAvLS1mdHAtLWFzY2lpLiBUaGUgZmxhZyB3YXMKICBhbHJlYWR5IGluIHVzZSBiZSB0aGUgbGRhcCBhcyB3ZWxsIHNvIHRoZSBuZXcgbmFtZSBmaXRzIHByZXR0eSBnb29kLiBUaGUKICBsaWJjeXJsIENVUkxPUFRfVFJBTlNGRVJURVhUIHdhcyBhbHNvIGludHJvZHVjZWQgYXMgYW4gYWxpYXMgdG8gdGhlIG5vdwogIG9ic29sZXRlIENVUkxPUFRfRlRQQVNDSUkuIENhbid0IHZlcmlmeSB0aGlzIGZpeCBteXNlbGYgYXMgSSBoYXZlIG5vIHdpbjMyCiAgY29tcGlsZXIgYXJvdW5kLgoKRGFuaWVsICgxMyBKdW5lIDIwMDApCi0gTHVvbmcgRGluaCBEdW5nIDxkdW5nIGF0IHNjaC5ibWUuaHU+IGZvdW5kIGEgcHJvYmxlbSBpbiBjdXJsX2Vhc3lfY2xlYW51cCgpCiAgc2luY2UgaXQgZnJlZSgpZWQgdGhlIG1haW4gY3VybCBzdHJ1Y3QgKnR3aWNlKi4gVGhpcyBpcyBub3cgY29ycmVjdGVkLgoKRGFuaWVsICg5IEp1bmUgMjAwMCkKLSBVcGRhdGVkIHRoZSBSRVNPVVJDRVMgZmlsZSwgYWRkZWQgYSBSRUFETUUud2luMzIgZmlsZS4KCkRhbmllbCAoOCBKdW5lIDIwMDApCi0gU28gSSBmaW5hbGx5IGFkZGVkIHRoZSBwcm9ncmVzcyBjYWxsYmFjayB0byB0aGUgKnNldG9wdCgpIG9wdGlvbnMgYW5kIGl0CiAgc2hvdWxkIHdvcmsgbm93LiBJIGRvbid0IGhhdmUgdGhlIGVuZXJneSB0byB3cml0ZSBhbnkgdGVzdCBwcm9ncmFtIGZvciBpdAogIHJpZ2h0IG5vdy4KLSBNYWRlIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0eXBlZGVmcyBwdWJsaWMgaW4gY3VybC9jdXJsLmggZm9yIGNvbWZvcnQuIEp1c3QKICBpbiBjYXNlIGFueW9uZSB3YW5uYSBmaWRkbGUgd2l0aCBzdWNoIHBvaW50ZXJzLgotIFVwZGF0ZWQgdGhlIGN1cmxfZWFzeV9zZXRvcHQoKSBtYW4gcGFnZSBhY2NvcmRpbmdseS4KClZlcnNpb24gNy4wLjRiZXRhCgpEYW5pZWwgKDIgSnVuZSAyMDAwKQotIEkgbm90aWNlZCB0aGF0IHdoZW4gZG9pbmcgTG9jYXRpb246IGZvbGxvd2luZywgd2UgbG9zdCBjdXN0b20gaGVhZGVycyBpbiBhbGwKICBidXQgdGhlIGZpcnN0IHJlcXVlc3QuCi0gUmVtb3ZlZCB0aGUgJ0h0dHBQb3N0JyBzdHJ1Y3QgYW5kIG1vdmVkIHRoZSBoZWFkZXIgc3R1ZmYgdG8gdGhlIG1vcmUgZ2VuZXJpYwogIGN1cmxfc2xpc3QuCi0gQWRkZWQgc29tZSBiZXR0ZXIgc2xpc3QtY2xlYW51cHMgaW4gc3JjL21haW4uYwoKVmVyc2lvbiA3LjAuM2JldGEKCkRhbmllbCAoMzEgTWF5IDIwMDApCi0gU28gSSBkaXNjb3ZlcmVkIHRoYXQgSSByZWxlYXNlZCB0aGUgNy4wLjJiZXRhIHdpdGhvdXQgaXQgYmVpbmcgYWJsZSB0bwogIGNvbXBpbGUgdW5kZXIgTGludXguIGdldGhvc3RieW5hbWVfcigpIGFuZCBnZXRob3N0YnlhZGRyX3IoKSB0dXJuZWQgb3V0IHRvCiAgZmVhdHVyZSBhIGRpZmZlcmVudCBhbW91bnQgb2YgYXJndW1lbnRzIG9uIGRpZmZlcmVudCBzeXN0ZW1zIHNvIEkgaGFkIHRvIGFkZAogIGEgY29uZmlndXJlIGNoZWNrIGZvciB0aGlzIGFuZCBhZGp1c3QgdGhlIGNvZGUgc2xpZ2h0bHkuCgpWZXJzaW9uIDcuMC4yYmV0YQoKRGFuaWVsICgyOSBNYXkgMjAwMCkKLSBDb3JyZWN0ZWQgdGhlIGJpdHMuKiBhc3NpZ25tZW50cyB3aGVuIHVzaW5nIENVUkxPUFQgb3B0aW9ucyB0aGF0IG9ubHkKICB0b2dnbGVzIG9uZSBvZiB0aG9zZSBiaXRzLgoKLSBBcHBsaWVkIHRoZSBodWdlIHBhdGNoZXMgZnJvbSBEYXZpZCBMZUJsYW5jIDxkbGVibGFuYyBhdCBxbnguY29tPiB0aGF0IGFkZAogIHVzYWdlIG9mIHRoZSBnZXRob3N0YnluYW1lX3IoKSBhbmQgc2ltaWxhciBmdW5jdGlvbnMgaW4gY2FzZSB0aGV5J3JlIGFyb3VuZCwKICBzaW5jZSB0aGF0IG1ha2UgbGliY3VybCBtdWNoIGJldHRlciB0aHJlYWRzYWZlIGluIG1hbnkgc3lzdGVtcyAoc3VjaCBhcwogIHNvbGFyaXMpLiBJIGFkZGVkIHRoZSBjaGVja3MgZm9yIHRoZXNlIGZ1bmN0aW9ucyB0byB0aGUgY29uZmlndXJlIHNjcmlwdC4KCiAgSSBjYW4ndCBleHBsYWluIHdoeSwgYnV0IHRoZSBpbmV0X250b2FfcigpIGZ1bmN0aW9uIGRpZCBub3QgYXBwZWFyIGluIG15CiAgU29sYXJpcyBpbmNsdWRlIGZpbGVzLCBJIGhhZCB0byBhZGQgbXkgb3duIGluY2x1ZGUgZmlsZSBmb3IgdGhpcyBmb3Igbm93LgoKRGFuaWVsICgyMiBNYXkgMjAwMCkKLSBK9nJuIEhhcnRyb3RoIGJyb3VnaHQgbWUgZml4ZXMgdG8gbWFrZSB0aGUgd2luMzIgdmVyc2lvbiBjb21waWxlIHByb3Blcmx5IGFzCiAgd2VsbCBhcyBhIHJlbmFtZSBvZiB0aGUgJ2ludGVyZmFjZScgZmllbGQgaW4gdGhlIHVybGRhdGEgc3RydWN0LCBhcyBpdCBzZWVtcwogIHRvIGJlIHJlc2VydmVkIGluIHNvbWUgZ2NjIHZlcnNpb25zIQoKLSBSaWNoIEdyYXkgc3RydWNrIGJhY2sgd2l0aCB5ZXQgc29tZSBwb3J0YWJpbGl0eSByZXBvcnRzLiBEYXRhIEdlbmVyYWwgREcvVVgKICBuZWVkZWQgYSBsaXR0bGUgZml4IGluIGxpYi9sZGFwLmMgc2luY2UgaXQgZG9lc24ndCBoYXZlIFJUTERfR0xPQkFMIGRlZmluZWQuCiAgTW9yZSBmaXhlcyBhcmUgZXhwZWN0ZWQgYXMgYSByZXN1bHQgb2YgUmljaGllcyB2ZXJ5IGhlbHBmdWwgd29yay4KClZlcnNpb24gNy4wLjFiZXRhCgpEYW5pZWwgKDIxIE1heSAyMDAwKQotIFVwZGF0ZWQgbG90cyBvZiAjZGVmaW5lcywgZW51bXMgYW5kIHZhcmlhYmxlIHR5cGUgbmFtZXMgaW4gdGhlIGxpYnJhcnkuIE5vCiAgbW9yZSB3ZWlyZCBVUkcgb3IgVVJMVEFHIHByZWZpeGVzLiBBbGwgdHlwZXMgYW5kIG5hbWVzIHNob3VsZCBiZSBjdXJsLQogIHByZWZpeGVkIHRvIGF2b2lkIG5hbWUgc3BhY2UgY2xhc2hlcy4gVGhlIEZMQUdTLXBhcmFtZXRlciB0byB0aGUgZm9ybWVyCiAgY3VybF91cmxnZXQoKSBoYXMgYmVlbiBjb252ZXJ0ZWQgaW50byBhIGJ1bmNoIG9mIGZsYWdzIHRvIHVzZSBpbiBzZXBhcmF0ZQogIHNldG9wdCBjYWxscy4gSSdtIHN0aWxsIGZvY3VzaW5nIG9uIHRoZSBlYXN5LWludGVyZmFjZSwgYXMgdGhlIGN1cmwgdG9vbCBpcwogIG5vdyB1c2luZyB0aGF0LgoKLSBCam9ybiBSZWVzZSBoYXMgcHJvdmlkZWQgbWUgd2l0aCBhbiBhc3luY2hyb25vdXMgbmFtZSByZXNvbHZlciB0aGF0IEkgcGxhbgogIHRvIHVzZSBpbiB1cGNvbWluZyB2ZXJzaW9ucyBvZiBjdXJsIHRvIGJlIGFibGUgdG8gZ3JhY2VmdWxseSB0aW1lb3V0IG5hbWUKICBsb29rdXBzLgoKVmVyc2lvbiA3LjBiZXRhCgpEYW5pZWwgKDE4IE1heSAyMDAwKQotIEludHJvZHVjZWQgTElCQ1VSTF9WRVJTSU9OX05VTSB0byB0aGUgY3VybC5oIGluY2x1ZGUgZmlsZSB0byBiZXR0ZXIgYWxsb3cKICBzb3VyY2UgY29kZXMgdG8gYmUgZGVwZW5kZW50IG9uIHRoZSBsaWIgdmVyc2lvbi4gVGhpcyBkZWZpbmUgaXMgbm93IHNldCB0bwogIGEgZGV4YWRlY2ltYWwgbnVtYmVyLCB3aXRoIDggYml0cyBlYWNoIGZvciBtYWpvciBudW1iZXIsIG1pbm9yIG51bWJlciBhbmQKICBwYXRjaCBudW1iZXIuIEluIG90aGVyIHdvcmRzLCB2ZXJzaW9uIDEuMi4zIHdvdWxkIG1ha2UgaXQgMHgwMTAyMDMuIEl0IGFsc28KICBtYWtlcyBhIGxhcmdlciBudW1iZXIgYSBuZXdlciB2ZXJzaW9uLgoKRGFuaWVsICgxNyBNYXkgMjAwMCkKLSBNYXJ0aW4gS2FtbWVyaG9mZXIgY29ycmVjdGx5IHBvaW50ZWQgb3V0IHNldmVyYWwgZmxhd3MgaW4gdGhlIEZUUCByYW5nZQogIG9wdGlvbi4gSSBjb3JyZWN0ZWQgdGhlbS4KLSBSZW1vdmVkIHRoZSB3aW4zMiB3aW5zb2NrIGluaXQgY3JhcCBmcm9tIHRoZSBsaWIgdG8gdGhlIHNyYy9tYWluLmMgZmlsZQogIGluIHRoZSBhcHBsaWNhdGlvbiBpbnN0ZWFkLiBUaGV5IGNhbid0IGJlIGluIHRoZSBsaWIsIGVzcGVjaWFsbHkgbm90IGZvcgogIG11bHRpdGhyZWFkZWQgcHVycG9zZXMuCgpEYW5pZWwgKDE2IE1heSAyMDAwKQotIFJld3JvdGUgdGhlIHNyYy9tYWluLmMgc291cmNlIHRvIHVzZSB0aGUgbmV3IGVhc3ktaW50ZXJmYWNlIHRvIGxpYmN1cmwgNy4KICBUaGVyZSBpcyBzdGlsbCBtb3JlIHdvcmsgdG8gZG8sIGJ1dCB0aGUgZmlyc3Qgc3RlcCBpcyBub3cgdGFrZW4uCiAgPGN1cmwvZWFzeS5oPiBpcyB0aGUgaW5jbHVkZSBmaWxlIHRvIHVzZS4KCkRhbmllbCAoMTQgTWF5IDIwMDApCi0gRlRQIFVSTHMgYXJlIG5vdyB0cmVhdGVkIHNsaWdodGx5IGRpZmZlcmVudCwgbW9yZSBhY2NvcmRpbmcgdG8gUkZDIDE3MzguCi0gRlRQIHNlc3Npb25zIGFyZSBub3cgcGVyZm9ybWVkIGRpZmZlcmVudGx5LCB3aXRoIENXRCBjb21tYW5kcyB0byBjaGFuZ2UKICBkaXJlY3RvcnkgaW5zdGVhZCBvZiBSRVRSL1NUT1IvTElTVCB3aXRoIHRoZSBmdWxsIHBhdGguIERpc2N1c3Npb25zIHdpdGgKICBSaWNoIEdyYXkgbWFkZSBtZSBub3RpY2UgdGhlc2UgcHJvYmxlbXMuCi0gSmFubmUgSm9oYW5zc29uIGRpc2NvdmVyZWQgYW5kIGNvcnJlY3RlZCBhIGJ1ZmZlciBvdmVyZmxvdyBpbiB0aGUKICBzcmMvdXNyZ2xvYi5jIGZpbGUuCi0gSSBoYWQgdG8gYWRkIGEgbGliL3N0cmVxdWFsLmMgZmlsZSBmb3IgZG9pbmcgY2FzZSBpbnNlbnNpdGl2ZSBzdHJpbmcKICBjb21wYXJlcyBvbiBhbGwgcGxhdGZvcm1zLgoKRGFuaWVsICg4IE1heSAyMDAwKToKLSBCZWVuIHdvcmtpbmcgbG90cyBvbiB0aGUgbmV3IGxpYi4KLSBUb2dldGhlciB3aXRoIFJpY2ggR3JheSwgSSd2ZSB0cmllZCB0byBhZGp1c3QgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gd29yawogIGJldHRlciBvbiB0aGUgTkNSIE1QLVJBUyBVbml4LgoKRGFuaWVsICgyIE1heSAyMDAwKToKLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIHBvaW50ZWQgb3V0IHRoYXQgSSBoYWQgYSBmZXcgdG9vIG1hbnkgaW5zdHJ1Y3Rpb25zIGluCiAgY29uZmlndXJlLmluIHRoYXQgZGlkbid0IGRvIGFueSBnb29kLgoKRGFuaWVsICgyNCBBcHJpbCAyMDAwKToKLSBBZGRlZCBhIG5ldyBwYXJhZ3JhcGggdG8gdGhlIEZBUSBhYm91dCB3aGF0IHRvIGRvIHdoZW4gY29uZmlndXJlIGNhbid0CiAgZmluZCBPcGVuU1NMIGV2ZW4gdGhvdWdoIGl0IGlzIGluc3RhbGxlZC4gU3VwcGxpZWQgYnkgQm9iIEFsbGlzb24KCkRhbmllbCAoMTIgQXByaWwgMjAwMCk6Ci0gU3RhcnRlZCBtZXNzaW5nIGFyb3VuZCBiaWctdGltZSB0byBjb252ZXJ0IHRoZSBvbGQgbGlicmFyeSBpbnRlcmZhY2UgdG8gYQogIGJldHRlciBvbmUuLi4KCkRhbmllbCAoOCBBcHJpbCAyMDAwKToKLSBNYWRlIHRoZSBwcm9ncmVzcyBiYXIgbG9vayBiZXR0ZXIgZm9yIGZpbGUgc2l6ZXMgYmV0d2VlbiA5OTk5IGtpbG9ieXRlcwogIGFuZCAxMDAgbWVnYWJ5dGVzLiBUaGV5J3JlIG5vdyBkaXNwbGF5ZWQgWFguWE0uCi0gSSBhbHNvIG5vdGljZWQgdGhhdCBmdHAgZmV0Y2hlcyB0aHJvdWdoIEhUVFAgcHJveGllcyBkaWRuJ3QgYWRkIHRoZSB1c2VyCiAgYWdlbnQgc3RyaW5nLiBJdCBkb2VzIG5vdy4KLSBIYWJpYmllIDxoYWJpYmllIGF0IE1haWxhbmROZXdzLmNvbT4gc3VwcGxpZWQgYSBwcmV0dHkgZ29vZCB3YXkgdG8gYnVpbGQgUlBNcwogIG9uIGEgTGludXggbWFjaGluZS4gSXQgc3RpbGwgYSkgcmVxdWlyZXMgbWUgdG8gYmUgcm9vdCB0byBkbyBpdCwgYikgbGVhdmVzCiAgdGhlIHJwbSBwYWNrYWdlcyBsYXlpbmcgYXQgc29tZSBvZGQgcGxhY2Ugb24gbXkgZGlzayBjKSBkb2Vzbid0IHdvcmsgdG8KICBidWlsZCB0aGUgc3NsIHZlcnNpb24gb2YgY3VybCBzaW5jZSBJIGRpZG4ndCBpbnN0YWxsIG9wZW5zc2wgZnJvbSBhbiBycG0KICBwYWNrYWdlIHNvIG5vdyB0aGUgcnBtIGNyYXAgdGhpbmtzIEkgZG9uJ3QgaGF2ZSBvcGVuc3NsIGFuZCByZWZ1c2VzIHRvIGJ1aWxkCiAgYSBwYWNrYWdlIHRoYXQgZGVwZW5kcyBvbiBzc2wuLi4gRGlkIEkgbWVudGlvbiBJIGRvbid0IGdldCBhbG9uZyB3aXRoIFJQTT8KLSBPbmNlIGFnYWluIEkgcmVjZWl2ZWQgYSBidWcgcmVwb3J0IGFib3V0IGF1dG9jb25mIG5vdCBzZXR0aW5nIC1MIHByaW9yIHRvIC1sCiAgb24gdGhlIGNvbW1hbmQgbGluZSB3aGVuIGNoZWNraW5nIGZvciBsaWJzLiBJbiB0aGlzIGNhc2UgaXQgbWFkZSB0aGUgbmF0aXZlCiAgY2MgY29tcGlsZXIgb24gU29sYXJpcyA3IHRvIGZhaWwgdGhlIE9wZW5TU0wgY2hlY2suIFRoaXMgaGFzIHByZXZpb3VzbHkgYmVlbgogIHJlcG9ydGVkIHRvIGNhdXNlIHByb2JsZW1zIG9uIEhQLVVYIGFuZCBpcyBhIGtub3duIGZsYXcgaW4gYXV0b2NvbmYgMi4xMy4gSXQKICBpcyBhIHBpdHkgdGhlcmUncyBubyBuZXdlciByZWxlYXNlIGFyb3VuZC4uLgoKRGFuaWVsICg0IEFwcmlsIDIwMDApOgotIE1hcmNvIEcuIFNhbHZhZ25vIHN1cHBsaWVkIG1lIHdpdGggdHdvIGZpeGVzIHRoYXQKICBhcHBlYXJhbnRseSBtYWtlcyB0aGUgT1MvMiBwb3J0IHdvcmsgYmV0dGVyIHdpdGggbXVsdGlwbGUgVVJMcy4KCkRhbmllbCAoMiBBcHJpbCAyMDAwKToKLSBBbm90aGVyIExvY2F0aW9uOiBmaXguIFRoaXMgdGltZSwgd2hlbiBjdXJsIGNvbm5lY3RlZCB0byBhIHBvcnQgYW5kIHRoZW4KICBmb2xsb3dlZCBhIGxvY2F0aW9uIHdpdGggYW4gYWJzb2x1dGUgVVJMIHRvIGFub3RoZXIgcG9ydCwgaXQgbWlzYmVoYXZlZC4KCkRhbmllbCAoMjcgTWFyY2ggMjAwMCk6Ci0gSC4gRGFwaG5lIEx1b25nIHBvaW50ZWQgb3V0IHRoYXQgY3VybCB3YXMgd3JvbmdseQogIG1lc3NpbmcgdXAgdGhlIHByb3h5IHN0cmluZyB3aGVuIGZldGNoaW5nIGEgZG9jdW1lbnQgdGhyb3VnaCBhIGh0dHAgcHJveHksCiAgd2hpY2ggc2NyZXdlZCB1cCBtdWx0aXBsZSBmZXRjaGVzIHN1Y2ggYXMgaW4gbG9jYXRpb246IGZvbGxvd2luZ3MuCgpEYW5pZWwgKDIzIE1hcmNoIDIwMDApOgotIE1hcmNvIEcuIFNhbHZhZ25vIGNvcnJlY3RlZCBteSBiYWRseSBhcHBsaWVkIHBhdGNoIGhlCiAgYWN0dWFsbHkgYWxyZWFkeSB0b2xkIG1lIGFib3V0IQoKLSBILiBEYXBobmUgTHVvbmcgYnJvdWdodCBtZSBhIGZpeCB0aGF0IG5vdyBtYWtlcyBjdXJsCiAgaWdub3JlIHNlbGVjdCgpIGVycm9ycyBpbiB0aGUgZG93bmxvYWQgaWYgZXJybm8gaXMgRUlOVFIsIHdoaWNoIHR1cm5zIG91dCB0bwogIGhhcHBlbiBldmVyeSBub3cgYW5kIHRoZW4gd2hlbiB1c2luZyBsaWJjdXJsIG11bHRpLXRocmVhZGVkLi4uCgpEYW5pZWwgKDIyIE1hcmNoIDIwMDApOgotIFdoYW0gQmFuZyBzdXBwbGllZCBhIGNvdXBsZSBvZiB3aW4zMiBmaXhlcy4gSEFWRV9VTkFNRQogIHdhcyBhY2NpZGVudGFsbHkgI2RlZmluZWQgaW4gY29uZmlnLXdpbjMyLmgsIHdoaWNoIGl0IHNob3VsZG4ndCBoYXZlIGJlZW4uCiAgVGhlIEhBVkVfVU5JU1REX0ggaXMgbm90IGRlZmluZWQgd2hlbiBjb21waWxpbmcgd2l0aCB0aGUgTWFrZWZpbGUudmM2CiAgbWFrZWZpbGUgZm9yIE1TIFZDKysuCgpEYW5pZWwgKDIxIE1hcmNoIDIwMDApOgotIEkgcmVtb3ZlZCB0aGUgQUNfUFJPR19JTlNUQUxMIG1hY3JvIGZyb20gY29uZmlndXJlLmluLCBzaW5jZSBpdCBhcHBlYXJzIHRoYXQKICBvbmUgb2YgdGhlIEFNXyogbWFjcm9zIHNlYXJjaGVzIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwgYWxyZWFkeS4gSmFubmUKICBKb2hhbnNzb24gbWFkZSBtZSBhd2FyZSBvZiB0aGlzLgoKVmVyc2lvbiA2LjUuMgoKRGFuaWVsICgyMSBNYXJjaCAyMDAwKToKLSBQYXVsIEhhcnJpbmd0b24gcXVpY2tseSBwb2ludGVkIG91dCB0byBtZSB0aGF0IDYuNS4xCiAgY3Jhc2hlcyBoYXJkLiBJIHVwbG9hZCA2LjUuMiBub3cgYXMgcXVpY2tseSBhcyBwb3NzaWJsZSEgVGhlIHByb2JsZW0gd2FzCiAgdGhlIC1EIGFkanVzdG1lbnRzIGluIHNyYy9tYWluLmMuCgpWZXJzaW9uIDYuNS4xCgpEYW5pZWwgKDIwIE1hcmNoIDIwMDApOgotIEFuIGFub255bW91cyBwb3N0IG9uIHNvdXJjZWZvcmdlIGNvcnJlY3RseSBwb2ludGVkIG91dCBhIHBvc3NpYmxlIGJ1ZmZlcgogIG92ZXJmbG93IGluIHRoZSBjdXJsX3VuZXNjYXBlKCkgZnVuY3Rpb24gZm9yIFVSTCBjb252ZXJzaW9ucy4gVGhlIG1haW4KICBwcm9ibGVtIHdpdGggdGhpcyBidWcgaXMgdGhhdCB0aGUgZnRwIGRvd25sb2FkIHVzZXMgdGhhdCBmdW5jdGlvbiBhbmQgdGhpcwogIHNpbmdsZS0gYnl0ZSBvdmVyZmxvdyBjb3VsZCBsZWFkIHRvIHZlcnkgb2RkIGJ1Z3MgKGFzIG9uZSByZXBvcnRlZCBieSBKYW5uZQogIEpvaGFuc3NvbikuCgpEYW5pZWwgKDE5IE1hcmNoIDIwMDApOgotIE1hcmNvIEcuIFNhbHZhZ25vIHN1cHBsaWVkIG1lIHdpdGggYSBzZXJpZXMgb2YgcGF0Y2hlcwogIHRoYXQgbm93IGFsbG93cyBjdXJsIHRvIGdldCBjb21waWxlZCBvbiBPUy8yLiBJdCBldmVuIGluY2x1ZGVzIGEgc2VjdGlvbiBpbgogIHRoZSBJTlNUQUxMIGZpbGUuIFZlcnkgbmljZSBqb2IhCgpEYW5pZWwgKDE3IE1hcmNoIDIwMDApOgotIFdoYW0gQmFuZyBzdXBwbGllZCBhIHBhdGNoIGZvciB0aGUgbGliL01ha2VmaWxlLnZjNgogIGZpbGUuIFdlIHN0aWxsIG5lZWQgc29tZSBmaXhlcyBmb3IgdGhlIGNvbmZpZy13aW4zMi5oIHNpbmNlIGl0IGFwcGVhcnMgdGhhdAogIFZDKysgYW5kIG1pbmd3MzIgaGF2ZSBkaWZmZXJlbnQgb3BpbmlvbnMgYWJvdXQgKGF0IGxlYXN0KSB1bmlzdGQuaCdzCiAgZXhpc3RlbmNlLgoKRGFuaWVsICgxNSBNYXJjaCAyMDAwKToKLSBJIG1vZGlmaWVkIHRoZSAtRC8tLWR1bXAtaGVhZGVyIHdvcmtpbmdzIHNvIHRoYXQgaXQgZG9lc24ndCB3cml0ZSBhbnl0aGluZwogIHRvIHRoZSBmaWxlIHVudGlsIGl0IG5lZWRzIHRvLiBUaGlzIHdheSwgeW91IGNhbiBhY3R1YWxseSB1c2UgLWIgYW5kIC1ECiAgb24gdGhlIHNhbWUgZmlsZSBpZiB5b3Ugd2FudCByZXBlYXRlZCBpbnZva2VzIHRvIHN0b3JlIGFuZCByZWFkIHRoZSBjb29raWVzCiAgaW4gdGhhdCBvbmUgc2luZ2xlIGZpbGUuCgotIFBva2VkIGFyb3VuZCBpbiBsb3RzIG9mIHRleHRzLiBBZGRlZCB0aGUgQlVHUyBmaWxlIGZvciBidWcgcmVwb3J0aW5nIHN0dWZmLgogIEFkZGVkIHRoZSBjbGFzc2ljIEhUVFAgUE9TVCBxdWVzdGlvbiB0byB0aGUgRkFRLCByZW1vdmVkIHNvbWUgI2lmZGVmIFdJTjMyCiAgc3R1ZmYgZnJvbSB0aGUgc291cmNlcyAodGhleSdyZSBjb3ZlcmVkIGJ5IHRoZSBjb25maWctd2luMzIuaCBub3cpLgoKLSBQYXNjYWwgR2F1ZGV0dGUgZml4ZWQgYSBtaXNzaW5nIGxkYXAuYyBwcm9ibGVtIGluIHRoZQogIE1ha2VmaWxlLnZjNiBmaWxlLiBIZSBhbHNvIGFkZHJlc3NlZCBhIHByb2JsZW0gaW4gc3JjL2NvbmZpZy13aW4zMi5oLgoKRGFuaWVsICgxNCBNYXJjaCAyMDAwKToKLSBQYXVsIEhhcnJpbmd0b24gcG9pbnRlZCBvdXQgdGhhdCB0aGUgJ2h0dHBfY29kZScgdmFyaWFibGUgaW4gdGhlIC13IG91dHB1dAogIHdhcyBuZXZlciB3cml0dGVuLiBJIGZpeGVkIGl0IG5vdy4KCi0gSmFubmUgSm9oYW5zc29uIHJlcG9ydGVkIHRoZSBjb21wbGFpbnRzIHRoYXQgT3BlbkJTRCBkb2VzCiAgd2hlbiBnZXRkYXRlLmMgI2luY2x1ZGVzIG1hbGxvYy5oLiBJdCBjbGFpbXMgc3RkbGliLmggc2hvdWxkIGJlIGluY2x1ZGVkCiAgaW5zdGVhZC4gSSBhZGRlZCAjaWZkZWYgSEFWRV9NQUxMT0NfSCBjb2RlIGluIGdldGRhdGUueSBhbmQgdHdvIGNoZWNrcyBpbgogIHRoZSBjb25maWd1cmUuaW4gZm9yIG1hbGxvYy5oIGFuZCBzdGRsaWIuaC4KClZlcnNpb24gNi41CgpEYW5pZWwgKDEzIE1hcmNoIDIwMDApOgotIDxjdXJsIGF0IHNwYW0ud29sdmVzYmFuZS5uZXQ+IHBvaW50ZWQgb3V0IHRoYXQgdGhlIHdheSBjdXJsIHNlbnQgY29va2llcyBpbiBhCiAgc2luZ2xlIGxpbmUgd2Fzbid0IGVuam95ZWQgYnkgSUlTNC4wIHNlcnZlcnMuIEluIG15IHZpZXcsIHRoYXQgaXMgbm90IHdoYXQKICB0aGUgc3RhbmRhcmRzIHNheSwgYnV0IEkgYWRkZWQgYSB3aGl0ZSBzcGFjZSBiZXR3ZWVuIHRoZSBuYW1lL3ZhbHVlIHBhaXJzIHRvCiAgcGVyaGFwcyBtYWtlIHRoZW0gd29yayBiZXR0ZXIuCgotIEFkZGVkIHRoZSBwZXJsIGNoZWNrIGJhY2sgaW4gdGhlIGNvbmZpZ3VyZS5pbiBhZ2FpbiBzaW5jZSB0aGUgbWtoZWxwLnBsCiAgc2NyaXB0IG5lZWRzIGl0IQoKLSBNYWRlIHNvbWUgYmVhdXRpZmljYXRpb25zIGluIHRoZSBjdXJsIG1hbiBwYWdlLgoKRGFuaWVsICgzIE1hcmNoIDIwMDApOgotIEr2cm4gaGVscGVkIG1lIHVwZGF0ZSB0aGUgY29uZmlnLXdpbjMyLmggZmlsZXMgd2l0aCBIQVZFX1NFVFZCVUYgYW5kCiAgSEFWRV9TVFJEVVAuCgpEYW5pZWwgKDMgTWFyY2ggMjAwMCk6Ci0gVXBsb2FkZWQgdGhlIDYuNXByZTIgcGFja2FnZS4KCkRhbmllbCAoMiBNYXJjaCAyMDAwKToKLSBSZW1vdmVkIHRoZSBwZXJsLXByb2dyYW1zIGZyb20gdGhlIGRpc3RyaWJ1dGlvbiwgdGhleSBuZXZlciBtYWRlIG1hbnkgcGVvcGxlCiAgaGFwcHkgYW5kIEknbGwgc3RpbGwga2VlcCB0aGVtIGF2YWlsYWJsZSBvbiB0aGUgd2ViLgoKLSBBZGRlZCB0aGUgLXcgYW5kIC1OIHN0dWZmIHRvIHRoZSBtYW4gcGFnZS4gRG9jdW1lbnRlZCB0aGUgbmV3IHByb2dyZXNzIG1ldGVyCiAgZGlzcGxheSBpbiBSRUFETUUuY3VybC4KCi0gSvZybiBIYXJ0cm90aCwgQ2hyaXMgPGNiYXlsaXNzIGF0IGNzYy5jb21lPiBhbmQgVWxmCiAgTfZsbGVyIGZyb20gdGhlIG9wZW5zc2wgZGV2ZWxvcG1lbnQgdGVhbSBoZWxwZWQgYnJpbmdpbmcgbWUgdGhlIGRldGFpbHMgZm9yCiAgZml4aW5nIGFuIE9wZW5TU0wgdXNhZ2UgZmxhdy4gSXQgYmVjYW1lIGFwcGFyZW50IHdoZW4gdGhleSByZWxlYXNlZCBvcGVuc3NsCiAgMC45LjUgc2luY2UgdGhhdCBiYXJmZWQgb24gY3VybCdzIGJhZCBiZWhhdmlvciAobm90IHNlZWRpbmcgYSByYW5kb20gbnVtYmVyCiAgdGhpbmcpLgoKLSBZZXQgYW5vdGhlciBvcHRpb246IC1OLy0tbm8tYnVmZmVyIGRpc2FibGVzIGJ1ZmZlcmluZyBpbiB0aGUgb3V0cHV0IHN0cmVhbS4KICBQcm9iYWJseSBtb3N0IHVzZWZ1bCBmb3IgdmVyeSBzbG93IHRyYW5zZmVycyB3aGVuIHlvdSByZWFsbHkgd2FudCB0byBnZXQKICBldmVyeSBieXRlIGN1cmwgcmVjZWl2ZXMgd2l0aGluIHNvbWUgcHJlZmVycmVkIHRpbWUuIEFuZHJldyA8dG1yIGF0IGdjaS5uZXQ+CiAgc3VnZ2VzdGVkIHRoaXMuCgotIERhbWllbiBBZGFudCBtYWlsZWQgbWUgaGlzIGZpeGVzIGZvciBtYWtpbmcgY3VybCBjb21waWxlIG9uIFVsdHJpeC4KCkRhbmllbCAoMjQgRmVicnVhcnkgMjAwMCk6Ci0gQXBwbGllZCBK9nJuIEhhcnRyb3RoJ3MgZml4ZXMgZm9yIGNvbmZpZy13aW4zMi5oIGFuZCBsaWIvTWFrZWZpbGUudzMyLgoKICBJIHNob3VsZCBhbHNvIG1ha2UgYSBub3RlIGhlcmUsIGlmIG5vdGhpbmcgZWxzZSB0byBteXNlbGYsIHRoYXQgd2hlbiB1c2luZwogIHRoZSAlLXN5bnRheCBmb3IgdmFyaWFibGVzIGluIERPUyBjb21tYW5kIHByb21wdHMsIHlvdSBtdXN0IHVzZSB0d28gJS0KICBsZXR0ZXJzIGZvciBlYWNoIG9uZSBzaW5jZSB0aGF0IGlzIGFuIGVzY2FwZSBsZXR0ZXIgdGhlcmUhIE1heWJlIEkgc2hvdWxkCiAgdXNlIGFub3RoZXIgbGV0dGVyIGluc3RlYWQhCgotIEFkZGVkIG1vcmUgdmFyaWFibGVzIHRvIC13OgoKICAnaHR0cF9jb2RlJwogICd0aW1lX25hbWVsb29rdXAnCiAgJ3RpbWVfY29ubmVjdCcKICAndGltZV9wcmV0cmFuc2ZlcicKICAndXJsX2VmZmVjdGl2ZScKCi0gTWFkZSAtd0BmaWxlbmFtZSByZWFkIHRoZSBzeW50YXggZnJvbSBhIGZpbGUgYW5kIC13QC0gcmVhZHMgdGhlIHN5bnRheCBmcm9tCiAgc3RkaW4gaW4gdGhlIGdvb2Qgb2xkICJzdGFuZGFyZCIgY3VybCB3YXkuCgpEYW5pZWwgKDIyIEZlYnJ1YXJ5IDIwMDApOgotIFJlbGVhc2VkIGEgNi41cHJlMSB2ZXJzaW9uIHRvIGdldCBzb21lIHRlc3QgYW5kIHVzZXIgZmVlZGJhY2suCgpEYW5pZWwgKDIxIEZlYnJ1YXJ5IDIwMDApOgoKLSBJIGFkZGVkIHRoZSAtdy8tLXdyaXRlLW91dCBmbGFnIGFuZCBzb21lIHZhcmlhYmxlcyB0byBnbyB3aXRoIGl0LiAtdyBpcyBhCiAgc2luZ2xlIHN0cmluZywgd2hhdGV2ZXIgeW91IGVudGVyIHRoZXJlIHdpbGwgYmUgd3JpdHRlbiBvdXQgd2hlbiBjdXJsIGhhcwogIGNvbXBsZXRlZCBhIHN1Y2Nlc3NmdWwgcmVxdWVzdC4gVGhlcmUgYXJlIHNvbWUgdmFyaWFibGUgc3Vic3RpdHV0aW9ucyBhbmQKICB0aGV5IGFyZSBzcGVjaWZpZWQgYXMgJyV7dmFyaWFibGV9JyAod2l0aG91dCB0aGUgcXVvdGVzKS4gVmFyaWFibGVzIHRoYXQKICBleGlzdCBhcyBvZiB0aGlzIG1vbWVudCBhcmU6CgogICAgICAgIHRvdGFsX3RpbWUgICAgIC0gdG90YWwgdHJhbnNmZXIgdGltZSBpbiBzZWNvbmRzICh3aXRoIDIgZGVjaW1hbHMpCiAgICAgICAgc2l6ZV9kb3dubG9hZCAgLSB0b3RhbCBkb3dubG9hZGVkIGFtb3VudCBvZiBieXRlcwogICAgICAgIHNpemVfdXBsb2FkICAgIC0gdG90YWwgdXBsb2FkZWQgYW1vdW50IG9mIGJ5dGVzCiAgICAgICAgc3BlZWRfZG93bmxvYWQgLSB0aGUgYXZlcmFnZSBzcGVlZCBvZiB0aGUgZW50aXJlIGRvd25sb2FkCiAgICAgICAgc3BlZWRfdXBsb2FkICAgLSB0aGUgYXZlcmFnZSBzcGVlZCBvZiB0aGUgZW50aXJlIHVwbG9hZAoKICBJIHdpbGwgb2YgY291cnNlIGFkZCBtb3JlIHZhcmlhYmxlcywgYnV0IEkgbmVlZCBpbnB1dCBvbiB0aGVzZSBhbmQgb3RoZXJzLgoKLSBJdCBzdHJ1Y2sgbWUgdGhhdCB0aGUgLSMgcHJvZ3Jlc3MgYmFyIHdpbGwgYmUgaGFyZCB0byBqdXN0IGFwcGx5IG9uIHRoZSBuZXcKICBwcm9ncmVzcyBiYXIgY29uY2VwdC4gSSBuZWVkIHNvbWUgZmVlZGJhY2sgb24gdGhpcyBiZWZvcmUgdGhhdCdsbCBnZXQgcmUtCiAgaW50cm9kdWNlZCEgOi0vCgpEYW5pZWwgKDE2IEZlYnJ1YXJ5IDIwMDApOgotIEr2cm4gSGFydHJvdGggYnJvdWdodCBtZSBzb21lIGZpeGVzIGZvciB0aGUgcHJvZ3Jlc3MgbWV0ZXIgYW5kIEkgY29udGludWVkCiAgd29ya2luZyBvbiBpdC4gSXQgc2VlbXMgdG8gd29yayBmb3IgaHR0cCBkb3dubG9hZCwgaHR0cCBwb3N0LCBmdHAgZG93bmxvYWQKICBhbmQgZnRwIHVwbG9hZC4gSXQgc2hvdWxkIGJlIGEgcHJldHR5IGdvb2QgdGVzdCBpdCB3b3JrcyBnZW5lcmFsbHkgZ29vZC4KCi0gU3RpbGwgbmVlZCB0byBhZGQgdGhlIC0jIHByb2dyZXNzIGJhciBpbnRvIHRoZSBuZXcgc3R5bGUgcHJvZ3Jlc3MgaW50ZXJmYWNlLgoKLSBHb25uYSBoYXZlIGEgZ28gYXQgbXkgbmV3IG91dHB1dCBvcHRpb24gcGFyYW1ldGVyIG5leHQuCgpEYW5pZWwgKDE1IEZlYnJ1YXJ5IDIwMDApOgotIFRoZSBwcm9ncmVzcyBtZXRlciBzdHVmZiBpcyBzbG93bHkgdGFraW5nIHBsYWNlLiBUaGVyZSdzIG1vcmUgbGVmdCBiZWZvcmUgaXQKICBpcyB3b3JraW5nIG9rIGFuZCBldmVyeXRoaW5nIGlzIHRlc3RlZCwgYnV0IHdlJ3JlIHJlYWNoaW5nIHRoZXJlLiBTbG93bHkhCgpEYW5pZWwgKDExIEZlYnJ1YXJ5IDIwMDApOgotIFBhdWwgTWFycXVpcyBmaXhlZCB0aGUgY29uZmlnIGZpbGUgcGFyc2luZyBvZiBjdXJsIHRvCiAgZGVhbCB3aXRoIGFueS1sZW5ndGggbGluZXMsIHJlbW92aW5nIHRoZSBwcmV2aW91cyBsaW1pdCBvZiA0Sy4KCi0gRWV0dSBPamFuZW4ncyBzdWdnZXN0aW9uIG9mIHN1cHBvcnRpbmcgdGhlIEAtc3R5bGUgZm9yIC1iCiAgaXMgaW1wbGVtZW50ZWQuIE5vdyAtYkA8ZmlsZW5hbWU+IHdvcmtzIGFzIHdlbGwgYXMgdGhlIG9sZCBzdHlsZS4gLWJALSBhbHNvCiAgc2ltaWxhcmx5IHJlYWRzIHRoZSBjb29raWVzIGZyb20gc3RkaW4uCgotIFJlbWluZGVyOiAtRCBzaG91bGQgbm90IHdyaXRlIHRvIHRoZSBmaWxlIHVudGlsIGl0IG5lZWRzIHRvLCBpbiB0aGUgc2FtZSB3YXkKICAtbyBkb2VzLiBUaGF0IHdvdWxkIGVuYWJsZSBjdXJsIHRvIHVzZSAtYiBhbmQgLUQgb24gdGhlIHNhbWUgZmlsZS4uLgoKLSBFbGxpcyBQcml0Y2hhcmQgbWFkZSBnZXRkYXRlLnkgd29yayBmb3IgTWFjT1MgWC4KCi0gUGF1bCBIYXJyaW5ndG9uIGhlbHBlZCBtZSBvdXQgZmluZGluZyB0aGUgY3Jhc2ggaW4gdGhlCiAgY29va2llIHBhcnNlci4gSGUgYWxzbyBwb2ludGVkIG91dCBjdXJsJ3MgaGFiaXQgb2Ygc2VuZGluZyBlbXB0eSBjb29raWVzIHRvCiAgdGhlIHNlcnZlci4KCkRhbmllbCAoOCBGZWJydWFyeSAyMDAwKToKIC0gUm9uIFphcHAgY29ycmVjdGVkIGEgcHJvYmxlbSBpbiBzcmMvdXJsZ2xvYi5jIHRoYXQKICAgcHJldmVudGVkIGN1cmwgZnJvbSBnZXR0aW5nIGNvbXBpbGVkIG9uIHN1bm9zIDQuIFRoZSBwcm9ibGVtIGhhZCB0byBkbwogICB3aXRoIHRoZSBkaWZmZXJlbmNlIGluIHNwcmludGYoKSByZXR1cm4gY29kZSB0eXBlcy4KCiAtIFRyYW5zZmVyKCkgc2hvdWxkIG5vdyBiZSBhYmxlIHRvIGRvd25sb2FkIGFuZCB1cGxvYWQgc2ltdWx0YW5lb3VzbHkuIExldCdzCiAgIGRvIHNvbWUgcHJvZ3Jlc3MgbWV0ZXIgZml4ZXMgbGF0ZXIgdGhpcyB3ZWVrLgoKRGFuaWVsICgzMSBKYW51YXJ5IDIwMDApOgogLSBQYXVsIEhhcnJpbmd0b24gZm91bmQgYW5vdGhlciBjb3JlIGR1bXAgaW4gdGhlIGNvb2tpZQogICBwYXJzZXIuIEN1cmwgZG9lc24ndCBwcm9wZXJseSByZWNvZ25pemUgdGhlICd2ZXJzaW9uJyBrZXl3b3JkIGFuZCBJIHRoaW5rCiAgIHRoYXQgaXMgd2hhdCBjYXVzZWQgdGhpcy4gSSBuZWVkIHRvIHJlZnJlc2ggc29tZSBzcGVjcyBvbiBjb29raWVzIGFuZCBzZWUKICAgd2hhdCBlbHNlIGN1cmwgbGFja3MgdG8gaW1wcm92ZSB0aGlzIGEgYml0IG1vcmUgb25jZSBhbmQgZm9yIGFsbC4KCiAgIFJGQyAyMTA5IGNsZWFybHkgc3BlY2lmaWVzIGhvdyBjb29raWVzIHNob3VsZCBiZSBkZWFsdCB3aXRoIHdoZW4gdGhleSBhcmUKICAgY29tcGxpYW50IHdpdGggdGhhdCBzcGVjLiBJIGRvbid0IHRoaW5rIG1hbnkgc2VydmVycyBhcmUgdGhvdWdoLi4uCgogLSBNYXJrIFcuIEVpY2hpbiBmb3VuZCB0aGF0IHdoaWxlIGN1cmwgaXMgdXBsb2FkaW5nIGEgZm9ybQogICB0byBhIHdlYiBzaXRlLCBpdCBkb2Vzbid0IHJlYWQgaW5jb21pbmcgZGF0YSB3aHkgaXQnbGwgaGFuZyBhZnRlciBhIHdoaWxlCiAgIHNpbmNlIHRoZSBzb2NrZXQgInBpcGUiIGJlY29tZXMgZnVsbC4KCiAgIEl0IHRvb2sgbWUgdHdvIGhvdXJzIHRvIHJld3JpdGUgRG93bmxvYWQoKSBhbmQgVXBsb2FkKCkgaW50byB0aGUgbmV3CiAgIHNpbmdsZSBmdW5jdGlvbiBUcmFuc2ZlcigpLiBJdCBldmVuIHNlZW1zIHRvIHdvcmshIE1vcmUgdGVzdGluZyBpcyByZXF1aXJlZAogICBvZiBjb3Vyc2UuLi4gSSBzaG91bGQgZ2V0IHRoZSBoZWFkZXItc2VuZGluZyB0b2dldGhlciBpbiBhIGtpbmQgb2YgcXVldWUKICAgYW5kIGxldCB0aGVtIGdldCAidXBsb2FkZWQiIGluIFRyYW5zZmVyKCkgYXMgd2VsbC4KCiAtIFpoaWJpYW8gV3UgcG9pbnRlZCBvdXQgYSBjdXJsIGJ1ZyBpbiB0aGUgbG9jYXRpb246IGFyZWEsCiAgIGFsdGhvdWdoIEkgZGlkIG5vdCBnZXQgYSByZXByb2R1Y2libGUgd2F5IHRvIGRvIHRoaXMgd2h5IEkgaGF2ZSB0byB3YWl0CiAgIHdpdGggZml4aW5nIGFueXRoaW5nLgoKIC0gQm9iIFNjaGFkZXIgc3VnZ2VzdGVkIEkgc2hvdWxkIGltcGxlbWVudCByZXN1bWUKICAgc3VwcG9ydCBmb3IgdGhlIEhUVFAgUFVUIG9wZXJhdGlvbiwgYW5kIGFzIEkgdGhpbmsgaXQgaXMgYSB2YWxpZCBzdWdnZXN0aW9uCiAgIEknbGwgd29yayBvbiBpdC4KCkRhbmllbCAoMjUgSmFudWFyeSAyMDAwKToKIC0gTSBUcmF2aXMgT2JlbmhhdXMgcG9pbnRlZCBvdXQgYSBtYW51YWwgbWl4dXAgd2l0aCAteSBhbmQgLVkgdGhhdCB3YXMKICAgY29ycmVjdGVkLgoKIC0gSmVucyBTY2hsZXVzZW5lciBwb2ludGVkIG91dCBhIHByb2JsZW0gdG8gY29tcGlsZQogICBjdXJsIG9uIEFJWCA0LjEuNCBhbmQgZ2F2ZSBtZSBhIHNvbHV0aW9uLiBUaGlzIHByb2JsZW0gd2FzIGFscmVhZHkgZml4ZWQKICAgYnkgSvZybidzIHJlY2VudCAjaW5jbHVkZSBtb2RpZmljYXRpb25zIQoKRGFuaWVsICgxOSBKYW51YXJ5IDIwMDApOgogLSBPc2thciBMaWxqZWJsYWQgcG9pbnRlZCBvdXQgYW5kIGNvcnJlY3RlZCBhIHByb2JsZW0KICAgaW4gdGhlIExvY2F0aW9uOiBmb2xsb3dpbmcgc3lzdGVtIHRoYXQgbWFkZSBjdXJsIGZvbGxvd2luZyBhIGxvY2F0aW9uOiB0byBhCiAgIGRpZmZlcmVudCBwcm90b2NvbCB0byBmYWlsLgoKICAgQXQgSmFudWFyeSAzMXN0IEkgcmUtY29uc2lkZXJlZCB0aGlzIGZpeCBhbmQgdGhlIHN1cnJvdW5kaW5nIHNvdXJjZSBjb2RlLiBJCiAgIGNvdWxkIG5vdCByZWFsbHkgc2VlIHRoYXQgdGhlIHBhdGNoIGRpZCBhbnkgZGlmZmVyZW5jZSwgd2h5IEkgcmVtb3ZlZCBpdAogICBhZ2FpbiBmb3IgZnVydGhlciByZXNlYXJjaCBhbmQgZGVidWdnaW5nLiAoSXQgZGlzYWJsZWQgbG9jYXRpb246IGZvbGxvd2luZwogICBvbiBzZXJ2ZXIgbm90IHJ1bm5pbmcgb24gZGVmYXVsdCBwb3J0cy4pCgogLSBK9nJuIEhhcnRyb3RoIGJyb3VnaHQgYSBmaXggdGhhdCBvbmNlIGFnYWluCiAgIG1hZGUgaXQgcG9zc2libGUgdG8gc2VsZWN0IHByb2dyZXNzIGJhci4KCiAtIEr2cm4gYWxzbyBmaXhlZCBhIGZldyBpbmNsdWRlIHByb2JsZW1zLgoKVmVyc2lvbiA2LjQKCkRhbmllbCAoMTcgSmFudWFyeSAyMDAwKToKIC0gQmFzZWQgb24gc3VnZ2VzdGlvbnMgZnJvbSBCavZybiBTdGVuYmVyZywgSSBtYWRlIHRoZQogICBwcm9ncmVzcyBkZWFsIGJldHRlciB3aXRoIGxhcmdlciBmaWxlcyBhbmQgYWRkZWQgYSAiVGltZSIgZmllbGQgd2hpY2ggc2hvd3MKICAgdGhlIHRpbWUgc3BlbnQgb24gdGhlIGRvd25sb2FkIHNvIGZhci4KIC0gSSdtIG5vdyB1c2luZyB0aGUgQ1ZTIHJlcG9zaXRvcnkgb24gc291cmNlZm9yZ2UubmV0LCB3aGljaCBhbHNvIGFsbG93cyB3ZWIKICAgYnJvd3NpbmcuIFNlZSBodHRwOi8vY3VybC5oYXh4Lm51LgoKRGFuaWVsICgxMCBKYW51YXJ5IDIwMDApOgogLSBSZW51bWJlcmVkIHNvbWUgZW51bXMgaW4gY3VybC9jdXJsLmggc2luY2UgdGFnIG51bWJlciAzNSB3YXMgdXNlZCB0d2ljZSEKIC0gQWRkZWQgInBvc3RxdW90ZSIgc3VwcG9ydCB0byB0aGUgZnRwIHNlY3Rpb24gdGhhdCBlbmFibGVzIHBvc3QtZnRwLXRyYW5zZmVyCiAgIHF1b3RlIGNvbW1hbmRzLgogLSBOb3cgbWFkZSB0aGUgLVEvLS1xdW90ZSBwYXJhbWV0ZXIgcmVjb2duaXplICctJyBhcyBhIHByZWZpeCwgd2hpY2ggbWVhbnMKICAgdGhhdCBjb21tYW5kIHdpbGwgYmUgaXNzdWVkIEFGVEVSIGEgc3VjY2Vzc2Z1bCBmdHAgdHJhbnNmZXIuIFRoaXMgY2FuIG9mCiAgIGNvdXJzZSBiZSB1c2VkIHRvIGRlbGV0ZSBvciByZW5hbWUgYSBmaWxlIGFmdGVyIGl0IGhhcyBiZWVuIHVwbG9hZGVkIG9yCiAgIGRvd25sb2FkZWQuIFVzZSB5b3VyIGltYWdpbmF0aW9uISA7LSkKIC0gU2luY2UgSSBkbyB0aGUgbWFpbiBkZXZlbG9wbWVudCBvbiBzb2xhcmlzIDIuNiBub3csIEkgaGFkIHRvIGRvd25sb2FkIGFuZAogICBpbnN0YWxsIEdOVSBncm9mZiB0byBnZW5lcmF0ZSB0aGUgaHVnZWhlbHAuYyBmaWxlLiBUaGUgc29sYXJpcyBucm9mZiBjb3JlcwogICBvbiB0aGUgbWFuIHBhZ2UhIFNvLCBpbiBvcmRlciB0byBtYWtlIHRoZSBzb2xhcmlzIGNvbmZpZ3VyZSBzY3JpcHQgZmluZCBhCiAgIGJldHRlciByZXN1bHQgSSBtYWRlIGducm9mZiBnZXQgY2hlY2tlZCBwcmlvciB0byB0aGUgcmVndWxhciBucm9mZi4KIC0gQWRkZWQgYWxsIHRoZSBjdXJsIGV4aXQgY29kZXMgdG8gdGhlIG1hbiBwYWdlLgogLSBKaW0gR2FsbGFnaGVyIHByb3Blcmx5IHRyYWNrZWQgZG93biBhIGJ1ZyBpbiBhdXRvY29uZgogICAyLjEzLiBUaGUgQUNfQ0hFQ0tfTElCKCkgbWFjcm8gd3JvbmdmdWxseSB1c2VzIHRoZSAtbCBmbGFnIGJlZm9yZSB0aGUgLUwKICAgZmxhZyB0byAnbGQnIHdoaWNoIGNhdXNlcyB0aGUgSFAtVVggMTAuMjAgZmxhdm91ciB0byBmYWlsIG9uIGFsbCBsaWJjaGVja3MKICAgYW5kIHRoZXJlZm9yZSB5b3UgY2FuJ3QgbWFrZSB0aGUgY29uZmlndXJlIHNjcmlwdCBmaW5kIHRoZSBvcGVuc3NsIGxpYnMhCgpEYW5pZWwgKDI4IERlY2VtYmVyIDE5OTkpOgogLSBUaW0gVmVyaG9ldmVuIGNvcnJlY3RseSBpZGVudGlmaWVkIHRoYXQgY3VybAogICBkb2Vzbid0IHN1cHBvcnQgVVJMIGZvcm1hdHRlZCBmaWxlIG5hbWVzIHdoZW4gZ2V0dGluZyBmdHAuIE5vdywgdGhlcmUncyBhCiAgIHByb2JsZW0gd2l0aCBnZXR0aW5nIHZlcnkgd2VpcmQgZmlsZSBuYW1lcyBvZmYgRlRQIHNlcnZlcnMuIFJGQyA5NTkgZGVmaW5lcwogICB0aGF0IHRoZSBmaWxlIG5hbWUgc3ludGF4IHRvIHVzZSBzaG91bGQgYmUgdGhlIHNhbWUgYXMgaW4gdGhlIG5hdGl2ZSBPUyBvZgogICB0aGUgc2VydmVyLiBTaW5jZSB3ZSBkb24ndCBrbm93IHRoZSBwZWVyIHNlcnZlciBzeXN0ZW0gd2UgY3VycmVudGx5IGp1c3QKICAgdHJhbnNsYXRlIHRoZSBVUkwgc3ludGF4IGludG8gcGxhaW4gbGV0dGVycy4gSXQgaXMgc3RpbGwgYmV0dGVyIGFuZCB3aXRoCiAgIHRoZSBzb2xhcmlzIDIuNi1zdXBwbGllZCBmdHAgc2VydmVyIGl0IHdvcmtzIHdpdGggc3BhY2VzIGluIHRoZSBmaWxlIG5hbWVzLgoKRGFuaWVsICgyNyBEZWNlbWJlciAxOTk5KToKIC0gV2hlbiBjdXJsIHBhcnNlZCBjb29raWVzIHN0cmFpZ2h0IG9mZiBhIHJlbW90ZSBzaXRlLCBpdCBjb3JydXB0ZWQgdGhlIGlucHV0CiAgIGRhdGEsIHdoaWNoLCBpZiB0aGUgZG93bmxvYWRlZCBoZWFkZXJzIHdlcmUgc3RvcmVkIG1hZGUgdmVyeSBvZGQgY2hhcmFjdGVycwogICBpbiB0aGUgc2F2ZWQgZGF0YS4gQ29ycmVjdGx5IGlkZW50aWZpZWQgYW5kIHJlcG9ydGVkIGJ5IFBhdWwgSGFycmluZ3Rvbi4KCkRhbmllbCAoMTMgRGVjZW1iZXIgMTk5OSk6CiAtIEdlbmVyYWwgY2xlYW51cHMgaW4gdGhlIGxpYnJhcnkgaW50ZXJmYWNlLiBUaGVyZSBoYWQgYmVlbiBzb21lIGJhZCBrbHVkZ2VzCiAgIGFkZGVkIGR1cmluZyB0aW1lcyBvZiBzdHJlc3MgYW5kIEkgZGlkIG15IGJlc3QgdG8gY2xlYW4gdGhlbSBvZmYuIEl0IHdhcwogICBib3RoIHJlZ2FyZGluZyB0aGUgbGliIEFQSSBhcyB3ZWxsIGFzIGluY2x1ZGUgZmlsZSBjb25mdXNpb25zLgoKRGFuaWVsICgzIERlY2VtYmVyIDE5OTkpOgogLSBBIHNtYWxsIC0tc3RkZXJyIGJ1ZyB3YXMgcmVwb3J0ZWQgYnkgRWV0dSBPamFuZW4uLi4KCiAtIHdobyBhbHNvIGJyb3VnaHQgdGhlIHN1Z2dlc3Rpb24gb2YgZXh0ZW5kaW5nIHRoZSAtWCBmbGFnIHRvIGZ0cCBsaXN0IGFzCiAgIHdlbGwuIFNvLCBub3cgaXQgaXMgYW5kIHRoZSBsb25nIG9wdGlvbiBpcyBub3cgLS1yZXF1ZXN0IGluc3RlYWQuIEl0IGlzCiAgIG9ubHkgZm9yIGZ0cCBsaXN0IGZvciBub3cgKGFuZCB0aGUgZm9ybWVyIGh0dHAgc3R1ZmYgdG9vIG9mIGNvdXJzZSkuCgpMYXJzIEouIEFhcyAoMjQgTm92ZW1iZXIgMTk5OSk6CiAtIFBhdGNoZWQgY3VybCB0byBjb21waWxlIGFuZCBidWlsZCB1bmRlciBCZU9TLiBEb2Vzbid0IHdvcmsgeWV0IHRob3VnaCEKCiAtIENvcnJlY3RlZCB0aGUgTWFrZWZpbGUuYW0gZmlsZXMgdG8gYWxsb3cgcHV0dGluZyBvYmplY3QgZmlsZXMgaW4KICAgZGlmZmVyZW50IGRpcmVjdG9yaWVzIHRoYW4gdGhlIHNvdXJjZXMuCgpWZXJzaW9uIDYuMy4xCgpEYW5pZWwgKDIzIE5vdmVtYmVyIDE5OTkpOgogLSBJJ3ZlIGhhZCB0aGlzIG1ham9yIGRpc2sgY3Jhc2guIE15IGdvb2Qgb2xkIHRydXN0LXdvcnRoeSBzb3VyY2UgZGlzayBkaWVkCiAgIGFsb25nIHdpdGggdGhlIG1hY2hpbmUgdGhhdCBob3N0ZWQgaXQuIFRoYW5rIGdvb2RuZXNzIG1vc3Qgb2YgYWxsIHRoZQogICB0aGluZ3MgSSd2ZSBkb25lIGFyZSBlaXRoZXIgYmFja2VkIHVwIGVsc2V3aGVyZSBvciBzdG9yZWQgaW4gdGhpcyBDVlMKICAgc2VydmVyIQoKIC0gTWljaGFlbCBTLiBTdGV1ZXIgcG9pbnRlZCBvdXQgYSBidWcgaW4gdGhlIC1GIGhhbmRsaW5nCiAgIHRoYXQgbWFkZSBjdXJsIGhhbmcgaWYgeW91IHBvc3RlZCBhbiBlbXB0eSB2YXJpYWJsZSBzdWNoIGFzICctRiBuYW1lPScuIEl0CiAgIHdhcyBvbmUgb2YgdGhvc2Ugb2xkIGJ1Z3MgdGhhdCBuZXZlciBoYXZlIHdvcmtlZCBwcm9wZXJseS4uLgoKIC0gSmFzb24gQmFpZXR0byBwb2ludGVkIG91dCBhIGdlbmVyYWwgZmxhdyBpbiB0aGUgSFRUUAogICBkb3dubG9hZC4gQ3VybCBkaWRuJ3QgY29tcGxhaW4gaWYgaXQgd2FzIHByZW1hdHVyZWx5IGFib3J0ZWQgYmVmb3JlIHRoZQogICBlbnRpcmUgZG93bmxvYWQgd2FzIGNvbXBsZXRlZC4gSXQgZG9lcyBub3cuCgpEYW5pZWwgKDE5IE5vdmVtYmVyIDE5OTkpOgogLSBDaHJpcyBNYWx0YnkgdmVyeSBhY2N1cmF0ZWx5IGNyaXRpY2l6ZWQgdGhlIGxhY2sgb2YKICAgcmV0dXJuIGNvZGUgY2hlY2tzIG9uIHRoZSBmd3JpdGUoKSBjYWxscy4gSSBkaWQgYSB0aG9yb3VnaCBjaGVjayBmb3IgYWxsCiAgIG9jY3VycmVuY2VzIGFuZCBjb3JyZWN0ZWQgdGhpcy4KCkRhbmllbCAoMTcgTm92ZW1iZXIgMTk5OSk6CiAtIFBhdWwgSGFycmluZ3RvbiBwb2ludGVkIG91dCB0aGF0IHRoZSAtbS8tLW1heC10aW1lIG9wdGlvbgogICBkb2Vzbid0IHdvcmsgZm9yIHRoZSBzbG93IHN5c3RlbSBjYWxscyBsaWtlIGdldGhvc3RieW5hbWUoKS4uLiBJIGRvbid0IGhhdmUKICAgYW55IGdvb2QgZml4IHlldCwganVzdCBhIHNsaWdodGx5IGxlc3MgYmFkIG9uZSB0aGF0IG1ha2VzIGN1cmwgZXhpdCBoYXJkCiAgIHdoZW4gdGhlIHRpbWVvdXQgaXMgcmVhY2hlZC4KCiAtIEJqb3JuIFJlZXNlIGhlbHBlZCBtZSBwb2ludCBvdXQgYSBwb3NzaWJsZSBwcm9ibGVtIHRoYXQgbWlnaHQgYmUgdGhlIHJlYXNvbgogICB3aHkgVGhvbWFzIEh1cnN0IGV4cGVyaWVuY2UgcHJvYmxlbXMgaW4gaGlzIEFtaWdhIHZlcnNpb24uCgogRGFuaWVsICgxMiBOb3ZlbWJlciAxOTk5KToKIC0gSSBmb3VuZCBhIGNyYXNoIGluIHRoZSBuZXcgY29va2llIGZpbGUgcGFyc2VyLiBJdCBjcmFzaGVkIHdoZW4geW91IGdhdmUKICAgYSBwbGFpbiBodHRwIGhlYWRlciBmaWxlIGFzIGlucHV0Li4uCgpWZXJzaW9uIDYuMwoKIERhbmllbCAoMTAgTm92ZW1iZXIgMTk5OSk6CiAtIEkga2luZCBvZiBmb3VuZCBvdXQgdGhhdCB0aGUgSFRUUCB0aW1lLWNvbmRpdGlvbmFsIEdFVHMgKC16KSBhcmVuJ3QgYWx3YXlzCiAgIHJlc3BlY3RlZCBieSB0aGUgd2ViIHNlcnZlciBhbmQgdGhlIGRvY3VtZW50IGlzIHRoZXJlZm9yZSBzZW50IGluIHdob2xlCiAgIGFnYWluLCBldmVuIHRob3VnaCBpdCBkb2Vzbid0IG1hdGNoIHRoZSByZXF1ZXN0ZWQgY29uZGl0aW9uLiBBZnRlciByZWFkaW5nCiAgIHNlY3Rpb24gMTMuMy40IG9mIFJGQyAyNjE2LCBJIHRoaW5rIEknbSBkb2luZyB0aGUgcmlnaHQgdGhpbmcgbm93IHdoZW4gSSBkbwogICBteSBvd24gY2hlY2sgYXMgd2VsbC4gSWYgY3VybCB0aGlua3MgdGhlIGNvbmRpdGlvbiBpc24ndCBtZXQsIHRoZSB0cmFuc2ZlcgogICBpcyBhYm9ydGVkIHByZW1hdHVyZWx5IChhZnRlciBhbGwgdGhlIGhlYWRlcnMgaGF2ZSBiZWVuIHJlY2VpdmVkKS4KCiAtIEFmdGVyIGNvbW1lbnRzIGZyb20gUm9iZXJ0IExpbmRlbiBJIGFsc28gcmV3cm90ZSBzb21lIHBhcnRzIG9mIHRoZSBtYW4gcGFnZQogICB0byBiZXR0ZXIgZGVzY3JpYmUgaG93IHRoZSAtRiB3b3Jrcy4KCiAtIE1pY2hhZWwgQW50aSBwdXQgdXAgYSBuZXcgY3VybCBkb3dubG9hZCBtaXJyb3IgaW4KICAgQ2hpbmE6ICBodHRwOi8vd3d3LnBzaG93aW5nLmNvbS9jdXJsLwoKIC0gSSBhZGRlZCB0aGUgbGlzdCBvZiBkb3dubG9hZCBtaXJyb3JzIHRvIHRoZSBSRUFETUUgZmlsZQoKIC0gSSBkaWQgYWRkIG1vcmUgZXhwbGFuYXRpb25zIHRvIHRoZSBtYW4gcGFnZQoKIERhbmllbCAoOCBOb3ZlbWJlciAxOTk5KToKIC0gSSBtYWRlIHRoZSAtYi8tLWNvb2tpZSBvcHRpb24gY2FwYWJsZSBvZiByZWFkaW5nIG5ldHNjYXBlIGZvcm1hdHRlZCBjb29raWUKICAgZmlsZXMgYXMgd2VsbCBhcyBub3JtYWwgaHR0cC1oZWFkZXIgZmlsZXMuIEl0IHNob3VsZCBiZSBhYmxlIHRvCiAgIHRyYW5zcGFyZW50bHkgZmlndXJlIG91dCB3aGF0IGtpbmQgb2YgZmlsZSBpdCBnb3QgYXMgaW5wdXQuCgogRGFuaWVsICgyOSBPY3RvYmVyIDE5OTkpOgogLSBBbm90aGVyIG9uZSBvZiBTZWJhc3RpYWFuIHZhbiBFcmsncyBpZGVhcyAodGhhdCBoYXMgYmVlbiByZXF1ZXN0ZWQgYmVmb3JlCiAgIGJ1dCBJIHNlZW0gdG8gaGF2ZSBmb3Jnb3R0ZW4gd2hvIGl0IHdhcyksIGlzIHRvIGFkZCBzdXBwb3J0IGZvciByYW5nZXMgaW4KICAgRlRQIGRvd25sb2Fkcy4gQXMgdXN1YWwsIG9uZSByZXF1ZXN0IGlzIGp1c3QgYSByZXF1ZXN0LCB3aGVuIHRoZXkncmUgdHdvCiAgIGl0IGlzIGEgZGVtYW5kLiBJJ3ZlIGFkZGVkIHNpbXBsZSBzdXBwb3J0IGZvciBYLVkgc3R5bGUgZmV0Y2hlcy4gWCBoYXMgdG8KICAgYmUgdGhlIGxvd2VyIG51bWJlciwgdGhvdWdoIHlvdSBtYXkgb21pdCBvbmUgb2YgdGhlIG51bWJlcnMuIFVzZSB0aGUgLXIvCiAgIC0tcmFuZ2Ugc3dpdGNoIChwcmV2aW91c2x5IEhUVFAtb25seSkuCgogLSBTZWJhc3RpYWFuIHZhbiBFcmsgc3VnZ2VzdGVkIHRoYXQgY3VybCBzaG91bGQgYmUKICAgYWJsZSB0byBzaG93IHRoZSBmaWxlIHNpemUgb2YgYSBzcGVjaWZpZWQgZmlsZS4gSSB0aGluayB0aGlzIGlzIGEgc3BsZW5kaWQKICAgaWRlYSBhbmQgdGhlIC1JIGZsYWcgaXMgbm93IHdvcmtpbmcgZm9yIEZUUC4gSXQgZGlzcGxheXMgdGhlIGZpbGUgc2l6ZSBpbgogICB0aGlzIG1hbm5lcjoKICAgICAgICBDb250ZW50LUxlbmd0aDogWFhYWAogICBBcyBpdCByZXNlbWJsZXMgbm9ybWFsIGhlYWRlcnMsIGFuZCBsZWF2ZXMgdXMgdGhlIG9wcG9ydHVuaXR5IHRvIGFkZCBtb3JlCiAgIGluZm8gaW4gdGhhdCBkaXNwbGF5IGlmIHdlIGNhbiBjb21lIHVwIHdpdGggbW9yZSBpbiB0aGUgZnV0dXJlISBJdCBhbHNvCiAgIG1ha2VzIHNlbnNlIHNpbmNlIGlmIHlvdSBhY2Nlc3MgZnRwIHRocm91Z2ggYSBIVFRQIHByb3h5LCB5b3UnZCBnZXQgdGhlCiAgIGZpbGUgc2l6ZSB0aGUgc2FtZSB3YXkuCgogICBJIGNoYW5nZWQgdGhlIG9yZGVyIG9mIHRoZSBRVU9URSBjb21tYW5kIGV4ZWN1dGlvbnMuIFRoZXkncmUgbm93IGV4ZWN1dGVkCiAgIGp1c3QgYWZ0ZXIgdGhlIGxvZ2luIGFuZCBiZWZvcmUgYW55IG90aGVyIGNvbW1hbmQuIEkgbWFkZSB0aGlzIHRvIGVuYWJsZQogICBxdW90ZSBjb21tYW5kcyB0byBydW4gYmVmb3JlIHRoZSAtSSBzdHVmZiBpcyBkb25lIHRvby4KCiAtIEkgZm91bmQgb3V0IHRoYXQgLUQvLS1kdW1wLWhlYWRlciBhbmQgLVYvLS12ZXJzaW9uIHdlcmVuJ3QgZG9jdW1lbnRlZCBpbgogICB0aGUgbWFuIHBhZ2UuCgogLSBNYW55IEhUVFAvMS4xIHNlcnZlcnMgZG8gbm90IHN1cHBvcnQgcmFuZ2VzLiBEb24ndCBhc2sgbWUgd2h5LiBJIGRpZCBhZGQKICAgc29tZSB0ZXh0IGFib3V0IHRoaXMgaW4gdGhlIG1hbiBwYWdlIGZvciB0aGUgcmFuZ2Ugb3B0aW9uLiBUaGUgdGhyZWFkIGluCiAgIHRoZSBtYWlsaW5nIGxpc3QgdGhhdCBzdGFydGVkIHRoaXMgd2FzIGluaXRpYXRlZCBieSBNaWNoYWVsIEFudGkuCgogLSBJIGdldCByZXBvcnRzIGFib3V0IG5yb2ZmIGNyYXNoZXMgb24gc29sYXJpcyAyLjYrIHdoZW4gZGlzcGxheWluZyB0aGUgY3VybAogICBtYW4gcGFnZS4gU3dpdGNoIHRvIGducm9mZiBpbnN0ZWFkLCBpdCBpcyByZXBvcnRlZCB0byB3b3JrKCEpLiBBZGFtIEJhcmNsYXkKICAgcmVwb3J0ZWQgYW5kIGJyb3VnaHQgdGhlIHN1Z2dlc3Rpb24uCgogLSBJbiBhIGRpYWxvZ3VlIHdpdGggSm9oYW5uZXMgRy4gS3Jpc3RpbnNzb24gd2UgY2FtZQogICB1cCB3aXRoIHRoZSBpZGVhIHRvIGxldCAtSC8tLWhlYWRlciBzcGVjaWZpZWQgaGVhZGVycyByZXBsYWNlIHRoZQogICBpbnRlcm5hbGx5IGdlbmVyYXRlZCBoZWFkZXJzLCBpZiB5b3UgaGFwcGVuZWQgdG8gc2VsZWN0IHRvIGFkZCBhIGhlYWRlcgogICB0aGF0IGN1cmwgbm9ybWFsbHkgdXNlcyBieSBpdHNlbGYuIFRoZSBhZHZhbnRhZ2Ugd2l0aCB0aGlzIGlzIG5vdCBlbnRpcmVseQogICBvYnZpb3VzLCBidXQgaW4gSm9oYW5uZXMnIGNhc2UgaXQgbWVhbnMgdGhhdCBoZSBjYW4gdXNlIGFub3RoZXIgSG9zdDogdGhhbgogICB0aGUgb25lIGN1cmwgd291bGQgc2V0LgoKIERhbmllbCAoMjcgT2N0b2JlciAxOTk5KToKIC0gSm9uZ2tpIFN1d2FuZGkgYnJvdWdodCBhIG5pY2UgcGF0Y2ggZm9yICh5ZXQgYW5vdGhlcikgY3Jhc2ggd2hlbiBmb2xsb3dpbmcKICAgYSBsb2NhdGlvbjouIFRoaXMgdGltZSB5b3UgaGFkIHRvIGZvbGxvdyBhIGh0dHBzOi8vIHNlcnZlcidzIHJlZGlyZWN0IHRvCiAgIGdldCB0aGUgY29yZS4KClZlcnNpb24gNi4yCgogRGFuaWVsICgyMSBPY3RvYmVyIDE5OTkpOgogLSBJIHRoaW5rIEkgbWFuYWdlZCB0byByZW1vdmUgdGhlIHN1c3BpY2lvdXMgKG5pbCkgdGhhdCBoYXMgYmVlbiBzZWVuIGp1c3QKICAgYmVmb3JlIHRoZSAiSG9zdDoiIGluIEhUVFAgcmVxdWVzdHMgd2hlbiAtdiB3YXMgdXNlZC4KIC0gSSBmb3VuZCBvdXQgdGhhdCBpZiB5b3UgZm9sbG93ZWQgYSBsb2NhdGlvbjogd2hlbiB1c2luZyBhIHByb3h5LCB3aXRob3V0CiAgIGhhdmluZyBzcGVjaWZpZWQgaHR0cDovLyBpbiB0aGUgVVJMLCB0aGUgcHJvdG9jb2wgcGFydCB3YXMgYWRkZWQgb25jZSBhZ2FpbgogICB3aGVuIG1vdmluZyB0byB0aGUgbmV4dCBVUkwhIChUaGUgcHJvdG9jb2wgcGFydCBoYXMgdG8gYmUgYWRkZWQgdG8gdGhlCiAgIFVSTCB3aGVuIGdvaW5nIHRocm91Z2ggYSBwcm94eSBzaW5jZSBpdCBoYXMgbm8gcHJvdG9jb2wtZ3Vlc3Npbmcgc3lzdGVtCiAgIHN1Y2ggYXMgY3VybCBoYXMuKQogLSBCZW5qYW1pbiBSaXRjZXkgcmVwb3J0ZWQgYSBjb3JlIGR1bXAgdW5kZXIgc29sYXJpcyAyLjYKICAgd2l0aCBPcGVuU1NMIDAuOS40LiBJdCB0dXJuZWQgb3V0IHRoaXMgd2FzIGR1ZSB0byBhIGJhZCBmcmVlKCkgaW4gbWFpbi5jCiAgIHRoYXQgb2NjdXJyZWQgYWZ0ZXIgdGhlIGRvd25sb2FkIHdhcyBkb25lIGFuZCBjb21wbGV0ZWQuCiAtIEJlbmphbWluIGZvdW5kIGZ0cCBkb3dubG9hZHMgdG8gc2hvdyB0aGUgZmlyc3QgbGluZSBvZiB0aGUgZG93bmxvYWQgbWV0ZXIKICAgdG8gZ2V0IHdyaXR0ZW4gdHdpY2UsIGFuZCBJIHJlbW92ZWQgdGhhdCBwcm9ibGVtLiBJdCB3YXMgaW50cm9kdWNlZCB3aXRoCiAgIHRoZSBtdWx0aXBsZSBVUkwgc3VwcG9ydC4KIC0gRGFuIFppdHRlciBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgdGhhdCBjdXJsIDYuMSBhbmQgZWFybGllciB2ZXJzaW9ucyBkaWRuJ3QKICAgaG9ub3IgUkZDIDI2MTYgY2hhcHRlciA0IHNlY3Rpb24gMiwgIk1lc3NhZ2UgSGVhZGVycyI6ICIuLi5GaWVsZCBuYW1lcyBhcmUKICAgY2FzZS1pbnNlbnNpdGl2ZS4uLiIgIEhUVFAgaGVhZGVyIHBhcnNpbmcgYXNzdW1lZCBhIGNlcnRhaW4gY2FzaW5nLiBEYW4KICAgYWxzbyBwcm92aWRlZCBtZSB3aXRoIGEgcGF0Y2ggdGhhdCBjb3JyZWN0ZWQgdGhpcywgd2hpY2ggSSB0b29rIHRoZSBsaWJlcnR5CiAgIG9mIGVkaXRpbmcgc2xpZ2h0bHkuCiAtIERhbiBaaXR0ZXIgYWxzbyBwcm92aWRlZCBhIG5pY2UgcGF0Y2ggZm9yIGNvbmZpZy5ndWVzcyB0byBiZXR0ZXIgcmVjb2duaXplCiAgIHRoZSBNYWMgT1MgWAogLSBEYW4gYWxzbyBjb3JyZWN0ZWQgYSBtaW5vciBwcm9ibGVtIGluIHRoZSBsaWIvTWFrZWZpbGUgdGhhdCBjYXVzZWQgbGlua2luZwogICB0byBmYWlsIG9uIE9TIFguCgogRGFuaWVsICgxOSBPY3RvYmVyIDE5OTkpOgogLSBMZW4gTWFyaW5hY2NpbyBjYW1lIHVwIHdpdGggc29tZSBwcm9ibGVtcyB3aXRoIGN1cmwuICBTaW5jZSBXaW5kb3dzIGhhcyBhCiAgIGNyaXBwbGVkIHNoZWxsLCBpdCBjYW4ndCByZWRpcmVjdCBzdGRlcnIgYW5kIHRoYXQgY2F1c2VzIHRyb3VibGUuIEkgYWRkZWQKICAgLS1zdGRlcnIgdG9kYXkgd2hpY2ggYWxsb3dzIHRoZSB1c2VyIHRvIHJlZGlyZWN0IHRoZSBzdGRlcnIgc3RyZWFtIHRvIGEKICAgZmlsZSBvciBzdGRvdXQuCgogRGFuaWVsICgxOCBPY3RvYmVyIDE5OTkpOgogLSBUaGUgY29uZmlndXJlIHNjcmlwdCBub3cgdW5kZXJzdGFuZHMgdGhlICctLXdpdGhvdXQtc3NsJyBmbGFnLCB3aGljaCBub3cKICAgdG90YWxseSBkaXNhYmxlIFNTTC9odHRwcyBzdXBwb3J0LiBQcmV2aW91c2x5IGl0IHdhc24ndCBwb3NzaWJsZSB0byBmb3JjZQogICB0aGUgY29uZmlndXJlIHNjcmlwdCB0byBsZWF2ZSBTU0wgYWxvbmUuIFRoZSBwcmV2aW91cyBmdW5jdGlvbmFsaXR5IGhhcwogICBiZWVuIHJldGFpbmVkLiBUcm95IEVuZ2VsIGhlbHBlZCB0ZXN0IHRoaXMgbmV3IG9uZS4KClZlcnNpb24gNi4xCgogRGFuaWVsICgxNyBPY3RvYmVyIDE5OTkpOgogLSBJIGlmZGVmJ2VkIG9yIGNvbW1lbnRlZCBhbGwgdGhlIHpsaWIgc3R1ZmYgaW4gdGhlIHNvdXJjZXMgYW5kIGNvbmZpZ3VyZQogICBzY3JpcHQuIEl0IHR1cm5lZCBvdXQgd2UgbmVlZGVkIHRvIG1vY2sgbW9yZSB3aXRoIHpsaWIgdGhhbiBJIGluaXRpYWxseQogICB0aG91Z2h0LCB0byBtYWtlIGl0IGNhcGFibGUgb2YgZG93bmxvYWRpbmcgY29tcHJlc3NlZCBIVFRQIGRvY3VtZW50cyBhbmQKICAgdW5jb21wcmVzcyB0aGVtIG9uIHRoZSBmbHkuIEkgZGlkbid0IG1lYW4gdGhlIHpsaWIgcGFydHMgb2YgY3VybCB0byBiZWNvbWUKICAgbW9yZSB0aGFuIG1pbm9yIHNvIHRoaXMgbWVhbnMgSSBoYWx0IHRoZSB6bGliIGV4cGVkaXRpb24gZm9yIG5vdyBhbmQgd2FpdAogICB1bnRpbCBzb21lb25lIGVpdGhlciB3cml0ZXMgdGhlIGNvZGUgb3IgemxpYiBnZXRzIHVwZGF0ZWQgYW5kIGJldHRlcgogICBhZGp1c3RlZCBmb3IgdGhpcyBraW5kIG9mIHVzYWdlLiAgSSB3b24ndCBnZXQgaW50byBkZXRhaWxzIGhlcmUsIGJ1dCBhCiAgIHNob3J0IGEgc3VtbWFyeSBpcyBzdWl0YWJsZToKICAgLSB6bGliIGNhbid0IGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHdoZXRoZXIgdG8gdXNlIHpsaWIgb3IgZ3ppcAogICAgIGRlY29tcHJlc3Npb24gbWV0aG9kcy4KICAgLSB6bGliIGlzIHZlcnkgbmVhdCBmb3IgcmVhZGluZyBnemlwcGVkIGZpbGVzIGZyb20gYSBmaWxlIGRlc2NyaXB0b3IsCiAgICAgYWx0aG91Z2ggbm90IGFzIG5pY2UgZm9yIHJlYWRpbmcgYnVmZmVyLWJhc2VkIGRhdGEgc3VjaCBhcyB3ZSB3b3VsZAogICAgIHdhbnQgaXQuCiAgIC0gdGhlcmUgYXJlIHN0aWxsIHNvbWUgcHJvYmxlbXMgd2l0aCB0aGUgd2luMzIgdmVyc2lvbiB3aGVuIHJlYWRpbmcgZnJvbQogICAgIGEgZmlsZSBkZXNjcmlwdG9yIGlmIHRoYXQgaXMgYSBzb2NrZXQKCiBEYW5pZWwgKDE0IE9jdG9iZXIgMTk5OSk6CiAtIE1vdmVkIHRoZSAoZXh0ZXJuYWwpIGluY2x1ZGUgZmlsZXMgZm9yIGxpYmN1cmwgaW50byBhIHN1YmRpcmVjdG9yeSBuYW1lZAogICBjdXJsIGFuZCBhZGp1c3RlZCBhbGwgI2luY2x1ZGUgbGluZXMgdG8gdXNlIDxjdXJsL1hYWFg+IHRvIG1haW50YWluIGEKICAgYmV0dGVyIG5hbWUgc3BhY2UgYW5kIGNvbnRyb2wgb2YgdGhlIGhlYWRlcnMuIFRoaXMgaGFzIGJlZW4gcmVxdWVzdGVkLgoKIERhbmllbCAoMTIgT2N0b2JlciAxOTk5KToKIC0gSSBtb2RpZmllZCB0aGUgJ21ha2V0Z3onIHNjcmlwdCB0byBwZXJmb3JtIGEgJ21ha2UnIHRvbyBiZWZvcmUgYSByZWxlYXNlCiAgIGFyY2hpdmUgaXMgcHV0IHRvZ2V0aGVyIGluIGFuIGF0dGVtcHQgdG8gbWFrZSB0aGUgdGltZSBzdGFtcHMgYmV0dGVyIGFuZAogICBob3BlZnVsbHkgYXZvaWQgdGhlIGRvdWJsZSBjb25maWd1cmUtcnVubmluZyB0aGF0IHVzZSB0byBvY2N1ci4KCiBEYW5pZWwgKDExIE9jdG9iZXIgMTk5OSk6CiAtIEFwcGxpZWQgSvZybidzIHBhdGNoZXMgdGhhdCBmaXhlcyB6bGliIGZvciBtaW5ndzMyIGNvbXBpbGVzIGFzIHdlbGwgYXMKICAgc29tZSBvdGhlciBtaXNzaW5nIHpsaWIgI2lmZGVmIGFuZCBtb3JlIHRleHQgb24gdGhlIG11bHRpcGxlIFVSTCBkb2NzIGluCiAgIHRoZSBtYW4gcGFnZS4KClZlcnNpb24gNi4xYmV0YQoKIERhbmllbCAoNiBPY3RvYmVyIDE5OTkpOgogLSBEb3VnbGFzIEUuIFdlZ3NjaGVpZCBzZW50IG1lIGEgcGF0Y2ggdGhhdCBtYWRlIHRoZSBleGFjdCBzYW1lIHRoaW5nIGFzIEkKICAganVzdCBtYWRlOiB0aGUgLWQgc3dpdGNoIGlzIG5vdyBjYXBhYmxlIG9mIHJlYWRpbmcgcG9zdCBkYXRhIGZyb20gYSBuYW1lZAogICBmaWxlIG9yIHN0ZGluLiAgVXNlIGl0IHNpbWlsYXJseSB0byB0aGUgLUYuIFRvIHJlYWQgdGhlIHBvc3QgZGF0YSBmcm9tIGEKICAgZ2l2ZW4gZmlsZToKCiAgICAgICAgY3VybCAtZCBAcGF0aC90by9maWxlbmFtZSB3d3cucG9zdHNpdGUuY29tCgogICBvciBsZXQgY3VybCByZWFkIGl0IG91dCBmcm9tIHN0ZGluOgoKICAgICAgICBjdXJsIC1kIEAtIHd3dy5wb3N0aXQuY29tCgogSvZybiBIYXJ0cm90aCAoMyBPY3RvYmVyIDE5OTkpOgogLSBCcm91Z2h0IHNvbWUgbW9yZSBwYXRjaGVzIGZvciBtdWx0aXBsZSBVUkwgZnVuY3Rpb25hbGl0eS4gVGhlIE1JTUUKICAgc2VwYXJhdGlvbiBpZGVhcyBhcmUgYWxtb3N0IHNjcmFwcGVkIG5vdywgYW5kIGEgY3VzdG9tIHNlcGFyYXRvciBpcyBiZWluZwogICB1c2VkIGluc3RlYWQuIFRoaXMgaXMgc3RpbGwgY29tcGlsZS10aW1lICJmbGFnZ2VkIi4KCiBEYW5pZWwKIC0gVXBkYXRlZCBjdXJsLjEgd2l0aCBtdWx0aXBsZSBVUkwgaW5mby4KCiBEYW5pZWwgKDMwIFNlcHRlbWJlciAxOTk5KToKIC0gRmVsaXggdm9uIExlaXRuZXIgYnJvdWdodCBvcGVuc3NsLWNoZWNrIGZpeGVzIGZvciBjb25maWd1cmUuaW4gdG8gd29yawogICBvdXQtb2YtdGhlLWJveCB3aGVuIHRoZSBvcGVuc3NsIGZpbGVzIGFyZSBpbnN0YWxsZWQgaW4gdGhlIHN5c3RlbSBkZWZhdWx0CiAgIGRpcnMuCgogRGFuaWVsICgyOCBTZXB0ZW1iZXIgMTk5OSkKIC0gQWRkZWQgbGlieiBmdW5jdGlvbmFsaXR5LiBUaGlzIHNob3VsZCBlbmFibGUgZGVjb21wcmVzc2luZyBnemlwLCBjb21wcmVzcwogICBvciBkZWZsYXRlIGVuY29kaW5nIEhUVFAgZG9jdW1lbnRzLiBJdCBhbHNvIG1ha2VzIGN1cmwgc2VuZCBhbiBhY2NlcHQgdGhhdAogICBpdCBhY2NlcHRzIHRoYXQga2luZCBvZiBlbmNvZGluZy4gQ29tcHJlc3NlZCBjb250ZW50cyB1c3VhbGx5IHNob3J0ZW5zCiAgIGRvd25sb2FkIHRpbWUuIEkgKm5lZWQqIHNvbWVvbmUgdG8gdGVsbCBtZSBhIHNpdGUgdGhhdCB1c2VzIGNvbXByZXNzZWQgSFRUUAogICBkb2N1bWVudHMgc28gdGhhdCBJIGNhbiB0ZXN0IHRoaXMgb3V0IHByb3Blcmx5LgoKIC0gQXMgYSByZXN1bHQgb2YgdGhlIGFkZGluZyBvZiB6bGliIGF3YXJlbmVzcywgSSBjaGFuZ2VkIHRoZSB2ZXJzaW9uIHN0cmluZwogICBhIGxpdHRsZS4gSSBwbGFuIHRvIGFkZCBvcGVubGRhcCB2ZXJzaW9uIHJlcG9ydGluZyBpbiB0aGVyZSB0b28uCgogRGFuaWVsICgxNyBTZXB0ZW1iZXIgMTk5OSkKIC0gTWFkZSB0aGUgLUYgb3B0aW9uIGFsbG93IHN0ZGluIHdoZW4gc3BlY2lmeWluZyBmaWxlcy4gQnkgdXNpbmcgJy0nIGluc3RlYWQKICAgb2YgZmlsZSBuYW1lLCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQgZnJvbSBzdGRpbi4KClZlcnNpb24gNi4wCgogRGFuaWVsICgxMyBTZXB0ZW1iZXIgMTk5OSkKIC0gQWRkZWQgLVgvLS1odHRwLXJlcXVlc3QgPHJlcXVlc3Q+IHRvIGVuYWJsZSBhbnkgSFRUUCBjb21tYW5kIHRvIGJlIHNlbnQuCiAgIERvIG5vdCB0aGF0IHlvdXIgc2VydmVyIGhhcyB0byBzdXBwb3J0IHRoZSBleGFjdCBzdHJpbmcgeW91IGVudGVyLiBUaGlzCiAgIHNob3VsZCBwb3NzaWJseSBhIHN0cmluZyBsaWtlIERFTEVURSBvciBUUkFDRS4KCiAtIEFwcGxpZWQgRG91Z2xhcycgbWluZ3czMi1maXhlcyBmb3IgdGhlIG1ha2VmaWxlcy4KCiBEYW5pZWwgKDEwIFNlcHRlbWJlciAxOTk5KQogLSBEb3VnbGFzIEUuIFdlZ3NjaGVpZCBwb2ludGVkIG91dCBhIHByb2JsZW0uIEN1cmwgZGlkbid0IGNoZWNrIHRoZSBGVFAKICAgc2VydmVycyByZXR1cm4gY29kZSBwcm9wZXJseSBhZnRlciB0aGUgLS1xdW90ZSBjb21tYW5kcyB3ZXJlIGlzc3VlZC4gSXQKICAgdG9vayBhbnl0aGluZyBub24gMjAwIGFzIGFuIGVycm9yLCB3aGVuIGFsbCAyWFggY29kZXMgc2hvdWxkIGJlIGFjY2VwdGVkIGFzCiAgIE9LLgoKIC0gU2VuZGluZyBjb29raWVzIHRvIHRoZSBzYW1lIHNpdGUgaW4gbXVsdGlwbGUgbGluZXMgbGlrZSBjdXJsIHVzZWQgdG8gZG8KICAgdHVybmVkIG91dCB0byBiZSBiYWQgYW5kIGJyZWFraW5nIHRoZSBjb29raWUgc3BlY3MuIEN1cmwgbm93IHNlbmRzIGFsbAogICBjb29raWVzIG9uIGEgc2luZ2xlIENvb2tpZTogbGluZS4gQ3VybCBpcyBub3QgeWV0IFJGQyAyMTA5IGNvbXBsaWFudCwgYnV0IEkKICAgZG91YnQgdGhhdCBtYW55IHNlcnZlcnMgZG8gdXNlIHRoYXQgc3ludGF4ICh5ZXQpLgoKIERhbmllbCAoOCBTZXB0ZW1iZXIgMTk5OSkKIC0gSvZybiBoZWxwZWQgbWUgbWFrZSBzdXJlIGl0IHN0aWxsIGNvbXBpbGVzIG5pY2VseSB3aXRoIG1pbmd3MzIgdW5kZXIgd2luMzIuCgogRGFuaWVsICg3IFNlcHRlbWJlciAxOTk5KQogLSBGVFAgdXBsb2FkIHRocm91Z2ggcHJveHkgaXMgbm93IHR1cm5lZCBpbnRvIGEgSFRUUCBQVVQuIFJlcXVlc3RlZCBieQogICBTdGVmYW4gS2FudGhhay4KCiAtIEFkZGVkIHRoZSBsZGFwIGZpbGVzIHRvIHRoZSAubTMyIG1ha2VmaWxlLgoKIERhbmllbCAoMyBTZXB0ZW1iZXIgMTk5OSkKIC0gTWFkZSBjb29raWUgbWF0Y2hpbmcgd29yayB3aGlsZSB1c2luZyBIVFRQIHByb3h5LgoKIEJqb3JuIFJlZXNlICgzMSBBdWd1c3QgMTk5OSkKIC0gUGFzc2VkIGhpcyBsZGFwOi8vIHBhdGNoLiBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyB0aGUgb3BlbmxkYXAgc2hhcmVkCiAgIGxpYnJhcnkgdG8gYmUgaW5zdGFsbGVkIGFuZCB0aGF0IExEX0xJQlJBUllfUEFUSCBwb2ludHMgdG8gdGhlCiAgIGRpcmVjdG9yeSB3aGVyZSB0aGUgbGliIHdpbGwgYmUgZm91bmQgd2hlbiBjdXJsIGlzIHJ1biB3aXRoIGEKICAgbGRhcDovLyBVUkwuCgogSvZybiBIYXJ0cm90aCAoMzEgQXVndXN0IDE5OTkpCiAtIE1hZGUgdGhlIE1pbmd3MzIgbWFrZWZpbGVzIGludG8gc2luZ2xlIGZpbGVzLgogLSBNYWRlIGZpbGU6Ly8gd29yayBmb3IgV2luMzIuIFRoZSBzYW1lIGNvZGUgaXMgbm93IHVzZWQgZm9yIHVuaXggYXMgd2VsbCBmb3IKICAgcGVyZm9ybWFuY2UgcmVhc29ucy4KCiBEb3VnbGFzIEUuIFdlZ3NjaGVpZCAoMzAgQXVndXN0IDE5OTkpCiAtIFBhdGNoZWQgdGhlIE1pbmd3MzIgbWFrZWZpbGVzIGZvciBTU0wgYnVpbGRzLgoKIE1hdHRoZXcgQ2xhcmtlICgzMCBBdWd1c3QgMTk5OSkKIC0gTWFkZSBhIGNvb2wgcGF0Y2ggZm9yIGNvbmZpZ3VyZS5pbiB0byBhbGxvdyAtLXdpdGgtc3NsIHRvIHNwZWNpZnkgdGhlCiAgIHJvb3QgZGlyIG9mIHRoZSBvcGVuc3NsIGluc3RhbGxhdGlvbiwgYXMgaW4KCiAgICAgICAgLi9jb25maWd1cmUgLS13aXRoLXNzbD0vdXNyL3NzbF9oZXJlCgogLSBDb3JyZWN0ZWQgdGhlICdyZWNvbmYnIHNjcmlwdCB0byB3b3JrIGJldHRlciB3aXRoIHNvbWUgc2hlbGxzLgoKIEr2cm4gSGFydHJvdGggKDI2IEF1Z3VzdCAxOTk5KQogLSBGaXhlZCB0aGUgTWluZ3czMiBtYWtlZmlsZXMgaW4gbGliLyBhbmQgY29ycmVjdGVkIHRoZSBmaWxlLmMgZm9yIHdpbjMyCiAgIGNvbXBpbGVzLgoKVmVyc2lvbiA1LjExCgogRGFuaWVsICgyNSBBdWd1c3QgMTk5OSkKIC0gSm9obiBXZWlzbWlsbGVyIHBvaW50ZWQgb3V0IGEgYnVnIGluIHRoZSBoZWFkZXItbGluZQogICByZWFsbG9jKCkgc3lzdGVtIGluIGRvd25sb2FkLmMuCgogLSBJIGFkZGVkIGxpYi9maWxlLltjaF0gdG8gb2ZmZXIgYSBmaXJzdCwgc2ltcGxlLCBmaWxlOi8vIHN1cHBvcnQuIEl0CiAgIHByb2JhYmx5IHdvbid0IGRvIG11Y2ggZ29vZCBvbiB3aW4zMiBzeXN0ZW0gYXQgdGhpcyBwb2ludCwgYnV0IEkgc2VlIGl0CiAgIGFzIGEgc3RhcnQuCgogLSBNYWRlIHRoZSByZWxlYXNlIGFyY2hpdmVzIGdldCBhIE1ha2VmaWxlIGluIHRoZSByb290IGRpciwgd2hpY2ggY2FuIGJlCiAgIHVzZWQgdG8gc3RhcnQgdGhlIGNvbXBpbGluZy9idWlsZGluZyBwcm9jZXNzIGVhc2llci4gSSBoYXZlbid0IHJlYWxseQogICBjaGFuZ2VkIGFueSBJTlNUQUxMIHRleHQgeWV0LCBJIHdhbnRlZCB0byBnZXQgc29tZSBmZWVkLWJhY2sgb24gdGhpcwogICBmaXJzdC4KCiBEYW5pZWwgKDE3IEF1Z3VzdCAxOTk5KQogLSBBbm90aGVyIExvY2F0aW9uOiBidWcuIEN1cmwgZGlkbid0IGRvIHByb3BlciByZWxhdGl2ZSBsb2NhdGlvbnMgaWYgdGhlCiAgIG9yaWdpbmFsIFVSTCBoYWQgY2dpLXBhcmFtZXRlcnMgdGhhdCBjb250YWluZWQgYSBzbGFzaC4gTnVzdSdzIHBhZ2UKICAgYWdhaW4uCgogLSBDb3JyZWN0ZWQgdGhlIE5PX1BST1hZIHVzYWdlLiBJdCBpcyBhIGxpc3Qgb2Ygc3Vic3RyaW5ncyB0aGF0IGlmIG9uZSBvZgogICB0aGVtIG1hdGNoZXMgdGhlIHRhaWwgb2YgdGhlIGhvc3QgbmFtZSBpdCBzaG91bGQgY29ubmVjdCB0bywgY3VybCBzaG91bGQKICAgbm90IHVzZSBhIHByb3h5IHRvIGNvbm5lY3QgdGhlcmUuIFBvaW50ZWQgb3V0IHRvIG1lIGJ5IERvdWdsYXMKICAgRS4gV2Vnc2NoZWlkLiAgSSBhbHNvIGNoYW5nZWQgdGhlIFJFQURNRSB0ZXh0IGEgbGl0dGxlIHJlZ2FyZGluZyB0aGlzLgoKIERhbmllbCAoMTYgQXVndXN0IDE5OTkpCiAtIEZpeGVkIGEgbWVtb3J5IGJ1ZyB3aXRoIGh0dHAtc2VydmVycyB0aGF0IHNlbnQgTG9jYXRpb246IHRvIGEgTG9jYXRpb246CiAgIHBhZ2UuIE51c3UncyBwYWdlIHNob3dlZCB0aGlzIHRvby4KCiAtIE1hZGUgY29va2llcyB3b3JrIGEgbG90IGJldHRlci4gU2V0dGluZyB0aGUgc2FtZSBjb29raWUgbmFtZSBzZXZlcmFsIHRpbWVzCiAgIHVzZWQgdG8gYWRkIG1vcmUgY29va2llcyBpbnN0ZWFkIG9mIHJlcGxhY2luZyB0aGUgZm9ybWVyIG9uZSB3aGljaCBpdAogICBzaG91bGQndmUuIE51c3UgPG51cyBhdCBpbnRlcmdvcmoucm8+IGJyb3VnaHQgbWUgYW4gVVJMIHRoYXQgbWFkZSB0aGlzCiAgIHBhaW5mdWxseSB2aXNpYmxlLi4uCgogVHJveSAoMTUgQXVndXN0IDE5OTkpCiAtIEJyb3VnaHQgbmV3IC5zcGVjIGZpbGVzIGFzIHdlbGwgYXMgYSBwYXRjaCBmb3IgY29uZmlndXJlLmluIHRoYXQgbGV0cyB0aGUKICAgY29uZmlndXJlIHNjcmlwdCBmaW5kIHRoZSBvcGVuc3NsIGZpbGVzIGJldHRlciwgZXZlbiB3aGVuIHRoZSBpbmNsdWRlCiAgIGZpbGVzIGFyZSBpbiAvdXNyL2luY2x1ZGUvb3BlbnNzbAoKVmVyc2lvbiA1LjEwCgogRGFuaWVsICgxMyBBdWd1c3QgMTk5OSkKIC0gU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2IoKSBoYXMgYmVlbiBtb2RpZmllZCBpbiB0aGUgMC45LjQgdmVyc2lvbiBvZgogICBPcGVuU1NMLiBOb3cgd2h5IGNvdWxkbid0IHRoZXkgc2ltcGx5IGFkZCBhICpuZXcqIGZ1bmN0aW9uIGluc3RlYWQgb2YKICAgbW9kaWZ5aW5nIHRoZSBwYXJhbWV0ZXJzIG9mIGFuIGFscmVhZHkgZXhpc3RpbmcgZnVuY3Rpb24/IFRoaXMgd2F5LCB3ZSBnZXQKICAgYSBjb21waWxlciB3YXJuaW5nIGlmIGNvbXBpbGluZyB3aXRoIDAuOS40IGJ1dCBub3Qgd2l0aCBlYXJsaWVyLiBTbywgSSBoYWQKICAgdG8gY29tZSB1cCB3aXRoIGEgI2lmIGNvbnN0cnVjdGlvbiB0aGF0IGRlYWxzIHdpdGggdGhpcy4uLgoKIC0gTWFkZSBjdXJsIG91dHB1dCB0aGUgU1NMIHZlcnNpb24gbnVtYmVyIGdldCBkaXNwbGF5ZWQgcHJvcGVybHkgd2l0aCAwLjkuNC4KCiBUcm95ICgxMiBBdWd1c3QgMTk5OSkKIC0gQWRkZWQgTWluZ1czMiAoR0NDLTIuOTUpIHN1cHBvcnQgdW5kZXIgV2luMzIuIFRoZSBJTlNUQUxMIGZpbGUgd2FzIGFsc28KICAgYSBiaXQgcmVhcnJhbmdlZC4KIAogRGFuaWVsICgxMiBBdWd1c3QgMTk5OSkKIC0gSSBoYWQgdG8gY29weSBhIGdvb2QgPGFycGEvdGVsbmV0Lmg+IGluY2x1ZGUgZmlsZSBpbnRvIHRoZSBjdXJsIHNvdXJjZQogICB0cmVlIHRvIGVuYWJsZSB0aGUgc2lsbHkgd2luMzIgc3lzdGVtcyB0byBjb21waWxlLiBUaGUgZGlzdHJpYnV0aW9uIHJpZ2h0cwogICBhbGxvd3MgdXMgdG8gZG8gdGhhdCBhcyBsb25nIGFzIHRoZSBmaWxlIHJlbWFpbnMgdW5tb2RpZmllZC4KCiAtIEkgY29ycmVjdGVkIGEgZmV3IG1pbm9yIHRoaW5ncyB0aGF0IG1hZGUgdGhlIGNvbXBpbGVyIGNvbXBsYWluIHdoZW4KICAgLVdhbGwgLXBlZGFudGljIHdhcyB1c2VkLgoKIC0gSSdtIG1vdmluZyB0aGUgb2ZmaWNpYWwgY3VybCB3ZWIgcGFnZSB0byBodHRwOi8vY3VybC5oYXh4Lm51LiBJIHRoaW5rIGl0CiAgIHdpbGwgbWFrZSBpdCBlYXNpZXIgdG8gcmVtZW1iZXIgYXMgaXQgaXMgYSBsb3Qgc2hvcnRlciBhbmQgbGVzcyBjcnlwdGljLgogICBUaGUgb2xkIG9uZSBzdGlsbCB3b3JrcyBhbmQgc2hvd3MgdGhlIHNhbWUgaW5mby4KCiBEYW5pZWwgKDExIEF1Z3VzdCAxOTk5KQogLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIG1haWxlZCBtZSBhbm90aGVyIGNvcnJlY3Rpb24gZm9yIE5ST0ZGIGluIHRoZQogICBjb25maWd1cmUuaW4gdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBiZXR0ZXIgZm9yIElSSVggdXNlcnMuCgogRGFuaWVsICgxMCBBdWd1c3QgMTk5OSkKIC0gQWxiZXJ0IENoaW4tQS1Zb3VuZyBoZWxwZWQgbWUgd2l0aCBzb21lIHN0dXBpZCBNYWtlZmlsZSB0aGluZ3MsIGFzIHdlbGwgYXMKICAgc29tZSBmaWRkbGluZyB3aXRoIHRoZSBnZXRkYXRlLmMgc3R1ZmYgdGhhdCBoZSBoYWQgcHJvYmxlbXMgd2l0aCB1bmRlcgogICBIUC1VWCB2MTAuIGdldGRhdGUueSB3aWxsIG5vdyBiZSBjb21waWxlZCBpbnRvIGdldGRhdGUuYyBpZiB0aGUgYXBwcm9wcmlhdGUKICAgeWFjYyBvciBiaXNvbiBpcyBmb3VuZCBieSB0aGUgY29uZmlndXJlIHNjcmlwdC4gU2luY2UgdGhpcyBpcyBzbGlnaHRseSBuZXcsCiAgIHdlIG5lZWQgdG8gdGVzdCB0aGUgb3V0cHV0IGdldGRhdGUuYyB3aXRoIHdpbjMyIHN5c3RlbXMgdG8gbWFrZSBzdXJlIGl0CiAgIHN0aWxsIGNvbXBpbGVzIHRoZXJlLgoKIERhbmllbCAoNSBBdWd1c3QgMTk5OSkKIC0gSSd2ZSBqdXN0IHNldHVwIGEgbmV3IG1haWxpbmcgbGlzdCB3aXRoIHRoZSBpbnRlbnRpb24gdG8ga2VlcCBkaXNjdXNzaW9ucwogICBhcm91bmQgbGliY3VybCBkZXZlbG9wbWVudCBpbiBpdC4gSSBtYWlubHkgZXhwZWN0IGl0IHRvIGJlIGZvciB0aG91Z2h0cyBhbmQKICAgYnJhaW5zdG9ybWluZyBhcm91bmQgYSAibmV4dCBnZW5lcmF0aW9uIiBsaWJyYXJ5LCByYXRoZXIgdGhhbiBuaXRwaWNraW5nCiAgIGFib3V0IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9yIGRldGFpbHMgaW4gdGhlIGN1cnJlbnQgbGliY3VybC4KCiAgIFRvIGpvaW4gb3VyIGhhcHB5IGJ1bmNoIG9mIGZ1dHVyZS1sb29raW5nIGdlZWtzLCBlbnRlciAnc3Vic2NyaWJlCiAgIDxhZGRyZXNzPicgaW4gdGhlIGJvZHkgb2YgYSBtYWlsIGFuZCBzZW5kIGl0IHRvCiAgIGxpYmN1cmwtcmVxdWVzdEBsaXN0c2Vydi5mdHMuZnJvbnRlYy5zZS4gIEN1cmwgYnVnIHJlcG9ydHMsIHRoZSB1c3VhbCBjdXJsCiAgIHRhbGsgYW5kIGV2ZXJ5dGhpbmcgZWxzZSBzaG91bGQgc3RpbGwgYmUga2VwdCBpbiB0aGlzIG1haWxpbmcgbGlzdC4gSSd2ZQogICBzdGFydGVkIHRvIGFyY2hpdmUgdGhpcyBtYWlsaW5nIGxpc3QgYW5kIGhhdmUgcHV0IHRoZSBsaWJjdXJsIHdlYiBwYWdlIGF0CiAgIHd3dy5mdHMuZnJvbnRlYy5zZS9+ZGFzdC9saWJjdXJsLy4KCiAtIFN0ZWZhbiBLYW50aGFrIGNvbnRhY3RlZCBtZSByZWdhcmRpbmcgYSBmZXcgcHJvYmxlbXMgaW4gdGhlIGNvbmZpZ3VyZQogICBzY3JpcHQgd2hpY2ggaGUgZGlzY292ZXJlZCB3aGVuIHRyeWluZyB0byBtYWtlIGN1cmwgY29tcGlsZSBhbmQgYnVpbGQgdW5kZXIKICAgU2llbWVucyBTSU5JWC1aIFY1LjQyQjIwMDQhCgogLSBNYXJjdXMgS2xlaW4gdmVyeSBhY2N1cmF0ZWx5IGluZm9ybWVkIG1lIHRoYXQgc3JjL3ZlcnNpb24uaCB3YXMgbm90IHByZXNlbnQKICAgaW4gdGhlIENWUyByZXBvc2l0b3J5LiBPaCwgaG93IHNpbGx5Li4uCgogLSBMaW51cyBOaWVsc2VuIHJld3JvdGUgdGhlIHRlbG5ldDovLyBwYXJ0IGFuZCBub3cgY3VybCBvZmZlcnMgbGltaXRlZCB0ZWxuZXQKICAgc3VwcG9ydC4gSWYgeW91IHJ1biBjdXJsIGxpa2UgJ2N1cmwgdGVsbmV0Oi8vaG9zdCcgeW91J2xsIGdldCBhbGwgb3V0cHV0IG9uCiAgIHRoZSBzY3JlZW4gYW5kIGN1cmwgd2lsbCByZWFkIGlucHV0IGZyb20gc3RkaW4uIFlvdSdsbCBiZSBhYmxlIHRvIGxvZ2luIGFuZAogICBydW4gY29tbWFuZHMgZXRjLCBidXQgc2luY2UgdGhlIG91dHB1dCBpcyBidWZmZXJlZCwgZXhwZWN0IHRvIGdldCBhIGxpdHRsZQogICB3ZWlyZCBvdXRwdXQuCgogICBUaGlzIGlzIHN0aWxsIGluIGl0cyBpbmZhbmN5IGFuZCBpdCBtaWdodCBnZXQgY2hhbmdlZC4gV2UgbmVlZCB5b3VyCiAgIGZlZWQtYmFjayBhbmQgaW5wdXQgaW4gaG93IHRoaXMgaXMgYmVzdCBkb25lLgoKICAgV0lOMzIgTk9URTogSSBiZXQgd2UnbGwgZ2V0IHByb2JsZW1zIHdoZW4gdHJ5aW5nIHRvIGNvbXBpbGUgdGhlIGN1cnJlbnQKICAgbGliL3RlbG5ldC5jIG9uIHdpbjMyLCBidXQgSSB0aGluayB3ZSBjYW4gc29ydCB0aGVtIG91dCBpbiB0aW1lLgoKIC0gRGF2aWQgU2FuZGVyc29uIHJlcG9ydGVkIHRoYXQgRk9SQ0VfQUxMT0NBX0ggb3IgSEFWRV9BTExPQ0FfSCBtdXN0IGJlCiAgIGRlZmluZWQgZm9yIGdldGRhdGUuYyB0byBjb21waWxlIHByb3Blcmx5IG9uIEhQLVVYIDExLjAuIEkgdXBkYXRlZCB0aGUKICAgY29uZmlndXJlIHNjcmlwdCB0byBjaGVjayBmb3IgYWxsb2NhLmggd2hpY2ggc2hvdWxkIG1ha2UgaXQuCgogRGFuaWVsICg0IEF1Z3VzdCAxOTk5KQogLSBJIGZpbmFsbHkgZ290IHRvIHVuZGVyc3RhbmQgTWFyY3VzIEtsZWluJ3MgZnRwIGRvd25sb2FkIHJlc3VtZSBwcm9ibGVtLAogICB3aGljaCB0dXJucyBvdXQgdG8gYmUgZHVlIHRvIGRpZmZlcmVudCBvdXRwdXRzIGZyb20gZGlmZmVyZW50IGZ0cAogICBzZXJ2ZXJzLiBJdCBtYWtlcyBmdHAgZG93bmxvYWQgcmVzdW1pbmcgYSBsaXR0bGUgdHJpY2tpZXIsIGJ1dCBJJ3ZlIG1hZGUKICAgc29tZSBtb2RpZmljYXRpb25zIEkgcmVhbGx5IGJlbGlldmUgd2lsbCB3b3JrIGZvciBtb3N0IGZ0cCBzZXJ2ZXJzIGFuZCBJIGRvCiAgIGhvcGUgeW91IHJlcG9ydCBpZiB5b3UgaGF2ZSBwcm9ibGVtcyB3aXRoIHRoaXMhCgogLSBBZGRlZCB0ZXh0IGFib3V0IGZpbGUgdHJhbnNmZXIgcmVzdW1pbmcgdG8gUkVBRE1FLmN1cmwuCgogRGFuaWVsICgyIEF1Z3VzdCAxOTk5KQogLSBBcHBsaWVkIGEgcHJvZ3Jlc3MtYmFyIHBhdGNoIGZyb20gTGFycyBKLiBBYXMuIEl0IG9mZmVycwogICBhIG5ldyBzdHlsZWQgcHJvZ3Jlc3MgYmFyIGVuYWJsZWQgd2l0aCAtIy8tLXByb2dyZXNzLWJhci4gCgogVC4gWWFtYWRhIDx0YWkgYXQgaW1hc3kub3IuanA+ICgzMCBKdWx5IDE5OTkpCiAtIEl0IGJyZWFrcyB3aXRoIHNlZ2ZhdWx0IHdoZW4gMSkgY3VybCBpcyB1c2luZyAubmV0cmMgdG8gb2J0YWluCiAgIHVzZXJuYW1lL3Bhc3N3b3JkIChvcHRpb24gJy1uJyksIGFuZCAyKSBpcyBhdXRvbWF0aWNhbGx5IHJlZGlyZWN0ZWQgdG8KICAgYW5vdGhlciBsb2NhdGlvbiAob3B0aW9uICctTCcpLgoKICAgVGhlcmUgaXMgYSBzbWFsbCBidWcgaW4gbGliL3VybC5jIChibG9jayBzdGFydGluZyBmcm9tIGxpbmUgNjQxKSwgd2hpY2gKICAgdHJpZXMgdG8gdGFrZSBvdXQgdXNlcm5hbWUvcGFzc3dvcmQgZnJvbSB1c2VyLSBzdXBwbGllZCBjb21tYW5kLWxpbmUKICAgYXJndW1lbnQgKCctdScgb3B0aW9uKS4gVGhpcyBibG9jayBpcyBuZXZlciBleGVjdXRlZCBvbiBmaXJzdCBhdHRlbXB0IHNpbmNlCiAgIENPTkZfVVNFUlBXRCBiaXQgaXNuJ3Qgc2V0IGF0IGZpcnN0LCBidXQgY3VybCBsYXRlciB0dXJucyBpdCBvbiB3aGVuIGl0CiAgIGNoZWNrcyBmb3IgQ09ORl9ORVRSQyBiaXQuIFNvIHdoZW4gY3VybCB0cmllcyB0byByZWRvIGV2ZXJ5dGhpbmcgZHVlIHRvCiAgIHJlZGlyZWN0aW9uLCBpdCBzZWdmYXVsdHMgdHJ5aW5nIHRvIGFjY2VzcyAqZGF0YS0+dXNlcnB3ZC4KClZlcnNpb24gNS45LjEKCiBEYW5pZWwgKDMwIEp1bHkgMTk5OSkKIC0gU3RldmUgV2FsY2ggcG9pbnRlZCBvdXQgdGhhdCB0aGVyZSBpcyBhIG1lbW9yeSBsZWFrIGluIHRoZSBmb3JtZGF0YQogICBmdW5jdGlvbnMuIEkgYWRkZWQgYSBGb3JtRnJlZSgpIGZ1bmN0aW9uIHRoYXQgaXMgbm93IHVzZWQgYW5kIHN1cHBvc2VkIHRvCiAgIGNvcnJlY3QgdGhpcyBmbGF3LgoKIC0gTWFyayBXb3R0b24gcmVwb3J0ZWQ6CiAgICdjdXJsIC1MIGh0dHBzOi8vd3d3LmN3YS5jb20uYXUvJyBjb3JlIGR1bXBzLiAgSSBtYW5hZ2VkIHRvIGN1cmUgdGhpcyBieQogICBjb3JyZWN0aW5nIHRoZSBjbGVhbnVwIHByb2NlZHVyZS4gVGhlIGJ1ZyBzZWVtcyB0byBiZSBnb25lIHdpdGggbXkgT3BlblNTTAogICAwLjkuMmIsIGFsdGhvdWdoIHN0aWxsIG9jY3VycyB3aGVuIEkgcnVuIHRoZSB+MTAwIHllYXJzIG9sZCBTU0xlYXkgMC44LjAuIEkKICAgZG9uJ3Qga25vdyB3aGV0aGVyIGl0IGlzIGN1cmwgb3IgU1NMZWF5IHRoYXQgaXMgdG8gYmxhbWUgZm9yIHRoYXQuCgogLSBNYXJjdXMgS2xlaW46CiAgIFJlcG9ydGVkIGFuIEZUUCB1cGxvYWQgcmVzdW1lIGJ1ZyB0aGF0IEkgcmVhbGx5IGNhbid0IHJlcGVhdCBub3IgdW5kZXJzdGFuZC4KICAgSSBsZWF2ZSBpdCBoZXJlIHNvIHRoYXQgaXQgd29uJ3QgYmUgZm9yZ290dGVuLgoKIERhbmllbCAoMjkgSnVseSAxOTk5KQogLSBDb3N0eWEgU2h1bHl1cGluIHN1Z2dlc3RlZCBzdXBwb3J0IGZvciBsb25nZXIgVVJMcyB3aGVuIGZvbGxvd2luZyBMb2NhdGlvbjoKICAgYW5kIEkgY291bGQgb25seSBhZ3JlZSBhbmQgZml4IGl0IQoKIC0gTGVpZ2ggUHVyZGllIGZvdW5kIGEgcHJvYmxlbSBpbiB0aGUgdXBsb2FkL1BPU1QgZGVwYXJ0bWVudC4gSXQgdHVybmVkIG91dAogICB0aGF0IGh0dHAuYyBhY2NpZGVudGFseSBjbGVhcmVkIHRoZSBwb2ludGVyIGluc3RlYWQgb2YgdGhlIGJ5dGUgY291bnRlcgogICB3aGVuIHN1cHBvc2VkIHRvLgoKIC0gQ29zdHlhIFNodWx5dXBpbiBwb2ludGVkIG91dCBhIHByb2JsZW0gd2l0aCBwb3J0IG51bWJlcnMgYW5kIExvY2F0aW9uOi4gSWYKICAgeW91IGhhZCBhIHNlcnZlciBhdCBhIG5vbi1zdGFuZGFyZCBwb3J0IHRoYXQgcmVkaXJlY3RlZCB0byBhbiBVUkwgdXNpbmcgYQogICBzdGFuZGFyZCBwb3J0IG51bWJlciwgY3VybCBzdGlsbCB1c2VkIHRoYXQgZmlyc3QgcG9ydCBudW1iZXIuCgogLSBSYWxwaCBCZWNrbWFubiBwb2ludGVkIG91dCBhIHByb2JsZW0gd2hlbiB1c2luZyBib3RoIENPTkZfRk9MTE9XTE9DQVRJT04KICAgYW5kIENPTkZfRkFJTE9ORVJST1Igc2ltdWx0YW5lb3VzbHkuIFNpbmNlIHRoZSBDT05GX0ZBSUxPTkVSUk9SIGV4aXRzIG9uCiAgIHRoZSAzMDItY29kZSB0aGF0IHRoZSBmb2xsb3cgbG9jYXRpb24gaGVhZGVyIG91dHB1dHMgaXQgd2lsbCBuZXZlciBzaG93IGFueQogICBodG1sIG9uIGxvY2F0aW9uOiBwYWdlcy4gSSBoYXZlIG5vdyBtYWRlIGl0IGxvb2sgZm9yID49NDAwIGNvZGVzIGlmCiAgIENPTkZfRk9MTE9XTE9DQVRJT04gaXMgc2V0LgoKIC0gJ3N0cnVjdCBzbGlzdCcgaXMgbm93IHJlbmFtZWQgdG8gJ3N0cnVjdCBjdXJsX3NsaXN0JyAoYXMgc3VnZ2VzdGVkIGJ5IFJhbHBoCiAgIEJlY2ttYW5uKS4KCiAtIEpvc2h1YSBTd2luayBhbmQgUmljayBXZWx5a29jaHkgd2VyZSB0aGUgZmlyc3QgdG8gcG9pbnQgb3V0IHRvIG1lIHRoYXQgdGhlCiAgIGxhdGVzdCBPcGVuU1NMIHBhY2thZ2Ugbm93IGhhdmUgbW92ZWQgdGhlIHN0YW5kYXJkIGluY2x1ZGUgcGF0aC4gSXQgaXMgbm93CiAgIGluIC91c3IvbG9jYWwvc3NsL2luY2x1ZGUvb3BlbnNzbCBhbmQgSSBoYXZlIG5vdyBtb2RpZmllZCB0aGUgLS1lbmFibGUtc3NsCiAgIG9wdGlvbiBmb3IgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gdXNlIHRoYXQgYXMgdGhlIHByaW1hcnkgcGF0aCwgYW5kIEkKICAgbGVhdmUgdGhlIGZvcm1lciBwYXRoIHRvbyB0byB3b3JrIHdpdGggb2xkZXIgcGFja2FnZXMgb2YgT3BlblNTTCB0b28uCgogRGFuaWVsICg5IEp1bmUgMTk5OSkKIC0gSSBmaW5hbGx5IHVuZGVyc3Rvb2QgdGhlIElSSVggcHJvYmxlbSBhbmQgbm93IGl0IHNlZW0gdG8gY29tcGlsZSBvbiBpdCEKICAgSSBhbSBnb25uYSByZW1vdmUgdGhvc2UgI2RlZmluZSBzdHJjYXNlY21wKCkgdGhpbmdzIG9uY2UgYW5kIGZvciBhbGwgbm93LgoKIERhbmllbCAoNCBKdW5lIDE5OTkpCiAtIEkgYWRqdXN0ZWQgdGhlIEZUUCByZXBseSAyMjcgcGFyc2VyIHRvIG1ha2UgdGhlIFBBU1YgY29tbWFuZCB3b3JrIGJldHRlcgogICB3aXRoIG1vcmUgZnRwIHNlcnZlcnMuIEFwcGVhcmFudGx5IHRoZSBSb3hlbiBDaGFsbGFuZ2VyIHNlcnZlciByZXBsaWVkCiAgIHNvbWV0aGluZyBjdXJsIDUuOSBjb3VsZCBkZWFsIHdpdGghIDotKCBSZXBvcnRlZCBieSBBc2hsZXkgUmVpZC1Nb250YW5hcm8KICAgYW5kIE1hcmsgQnV0bGVyIGJyb3VnaHQgYSBzb2x1dGlvbiBmb3IgaXQuCgogRGFuaWVsICgyNiBNYXkgMTk5OSkKIC0gUmVhcnJhbmdlZC4gUkVBRE1FIGlzIG5ldywgdGhlIG9sZCBvbmUgaXMgbm93IFJFQURNRS5jdXJsIGFuZCBJIGFkZGVkIGEKICAgUkVBRE1FLmxpYmN1cmwgd2l0aCB0ZXh0IEkgZ290IGZyb20gUmFscGggQmVja21hbm4uCgogLSBJIGFsc28gdXBkYXRlZCB0aGUgSU5TVEFMTCB0ZXh0LgoKIERhbmllbCAoMjUgTWF5IDE5OTkpCiAtIERhdmlkIEpvbmF0aGFuIExvd3NreSBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgdGhhdCBjdXJsIGRpZG4ndCBwcm9wZXJseSBkZWFsCiAgIHdpdGggZm9ybSBwb3N0aW5nIHdoZXJlIHRoZSB2YXJpYWJsZSBzaG91bGRuJ3QgaGF2ZSBhbnkgY29udGVudCwgYXMgaW4gY3VybAogICAtRiAiZm9ybT0iIHd3dy5zaXRlLmNvbS4gSXQgd2FzIG5vdyBmaXhlZC4KClZlcnNpb24gNS45CgogRGFuaWVsICgyMiBNYXkgMTk5OSkKIC0gSSd2ZSBnb3QgYSBidWcgcmVwb3J0IGZyb20gQWFyb24gU2NhcmlzYnJpY2sgaW4gd2hpY2ggaGUgc3RhdGVzIGhlIGhhcyBzb21lCiAgIHByb2JsZW1zIHdpdGggLUwgdW5kZXIgRnJlZUJTRCAzLjAuIEkgaGF2ZSBwcmV2aW91c2x5IGdvdCBhbm90aGVyIGJ1ZwogICByZXBvcnQgZnJvbSBTdGVmYW4gR3JldGhlciB3aGljaCBwb2ludHMgYXQgYW4gZXJyb3Igd2l0aCBzaW1pbGFyIHN5bXB0aG9tcwogICB3aGVuIHVzaW5nIHdpbjMyLiBJIG1hZGUgdGhlIGFsbG9jYXRpb24gb2YgdGhlIG5ldyB1cmwgc3RyaW5nIGEgYml0IGZhc3RlcgogICBhbmQgZGlmZmVyZW50LCBkb24ndCBrbm93IGlmIGl0IGFjdHVhbGx5IGltcHJvdmVzIGFueXRoaW5nIHRob3VnaC4uLgoKIERhbmllbCAoMjAgTWF5IDE5OTkpCiAtIE1hZGUgdGhlIGNvb2tpZSBwYXJzZXIgZGVhbCB3aXRoIENSTEYgbmV3bGluZXMgdG9vLgoKIERhbmllbCAoMTkgTWF5IDE5OTkpCiAtIERvd25sb2FkKCkgZGlkbid0IHByb3Blcmx5IGRlYWwgd2l0aCBmYWlsaW5nIHJldHVybiBjb2RlcyBmcm9tIHRoZSBzcmVhZCgpCiAgIGZ1bmN0aW9uLiBBZGFtIENveW5lIGZvdW5kIHRoZSBwcm9ibGVtIGluIHRoZSB3aW4zMiB2ZXJzaW9uLCBhbmQgVHJveSBFbmdlbAogICBoZWxwZWQgbWUgb3V0IGlzb2xhdGluZyBpdC4KCiBEYW5pZWwgKDE2IE1heSAxOTk5KQogLSBSaWNoYXJkIEFkYW1zIHBvaW50ZWQgb3V0IGEgYnVnIEkgaW50cm9kdWNlZCBpbiA1LjguIC0tZHVtcC1oZWFkZXIgZG9lc24ndAogICB3b3JrIGFueW1vcmUhIDotLyBJIGZpeGVkIGl0IG5vdy4KCiAtIEFmdGVyIGEgc3VnZ2VzdGlvbiBieSBKb3NodWEgU3dpbmsgSSBhZGRlZCAtUyAvIC0tc2hvdy1lcnJvciB0byBmb3JjZSBjdXJsCiAgIHRvIGRpc3BsYXkgdGhlIGVycm9yIG1lc3NhZ2UgaW4gY2FzZSBvZiBhbiBlcnJvciwgZXZlbiBpZiAtcy8tLXNpbGVudCB3YXMKICAgdXNlZC4KCiBEYW5pZWwgKDEwIE1heSAxOTk5KQogLSBJIG1vdmVkIHRoZSBzdHVmZiBjb25jZXJuaW5nIEhUVFAsIERJQ1QgYW5kIFRFTE5FVCBpdCB0aGVpciBvd24gc291cmNlCiAgIGZpbGVzIG5vdy4gSXQgaXMgYSBiZWdpbm5pbmcgb24gbXkgY2xlYW4tdXAgb2YgdGhlIHNvdXJjZXMgdG8gbWFrZSB0aGVtCiAgIGxheWVyIGFsbCB0aG9zZSBwcm90b2NvbHMgYmV0dGVyIHRvIGVuYWJsZSBtb3JlIHRvIGJlIGFkZGVkIGVhc2llciBpbiB0aGUKICAgZnV0dXJlIQoKIC0gTGVvbiBCcmVlZHQgc2VudCBtZSBzb21lIGZpbGVzIEkndmUgbm90IHB1dCBpbnRvIHRoZSBtYWluIGN1cmwKICAgYXJjaGl2ZS4gVGhleSdyZSBmb3IgY3JlYXRpbmcgdGhlIERlYmlhbiBwYWNrYWdlIHRoaW5naWUuIEhlIGFsc28gc2VudCBtZSBhCiAgIGRlYmlhbiBwYWNrYWdlIHRoYXQgSSd2ZSBtYWRlIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgYXQgdGhlIHdlYiBwYWdlCgogRGFuaWVsICg5IE1heSAxOTk5KQogLSBNYWRlIGl0IGNvbXBpbGUgb24gY3lnd2luIHRvby4KCiBUcm95IEVuZ2VsICg3IE1heSAxOTk5KQogLSBCcm91Z2h0IGEgc2VyaWVzIG9mIHBhdGNoZXMgdG8gYWxsb3cgY3VybCB0byBjb21waWxlIHNtb290aGx5IG9uIE1TVkMrKyA2CiAgIGFnYWluIQoKIERhbmllbCAoNiBNYXkgMTk5OSkKIC0gSSBjaGFuZ2VkIHRoZSAjaWZkZWYgSEFWRV9TVFJGVElNRSBwbGFjZW1lbnQgZm9yIHRoZSAteiBjb2RlIHNvIHRoYXQgaXQKICAgd2lsbCBiZSBlYXNpZXIgdG8gZGlzY292ZXIgc3lzdGVtcyB0aGF0IGRvbid0IGhhdmUgdGhhdCBmdW5jdGlvbiBhbmQgdGh1cwogICBjYW4ndCB1c2UgLXogc3VjY2Vzc2Z1bGx5LiBNYWRlIHRoZSBzdHJmdGltZSgpIGdldCB1c2VkIGlmIFdJTjMyIGlzIGRlZmluZWQKICAgdG9vLgoKVmVyc2lvbiA1LjgKCiBEYW5pZWwgKDUgTWF5IDE5OTkpCiAtIEkndmUgaGFkIGl0IHdpdGggdGhpcyBhdXRvY29uZi9hdXRvbWFrZSBtZXNzLiBJdCBzZWVtcyB0byB3b3JrIGFsbHJpZ2h0CiAgIGZvciBtb3N0IHBlb3BsZSB3aG8gZG9uJ3QgaGF2ZSBhdXRvbWFrZSBpbnN0YWxsZWQsIGJ1dCBmb3IgdGhvc2Ugd2hvIGhhdmUKICAgdGhlcmUgYXJlIHByb2JsZW1zIGFsbCBvdmVyLgoKICAgSSd2ZSBnb3QgbGlrZSBmaXZlIGRpZmZlcmVudCBidWcgcmVwb3J0cyBvbiB0aGlzIG9ubHkgdGhlIGxhc3QKICAgd2Vlay4uLiBDbGF1ZGlvIE5ldmVzIGFuZCBGZWRlcmljbyBCaWFuY2hpIGFuZCByb290IDxkdWdnZXJqMDAxIGF0CiAgIGhhd2FpaS5yci5jb20+IGFyZSBzb21lIG9mIHRoZW0gcmVwb3J0aW5nIHRoaXMuCgogICBDdXJyZW50bHksIEkgaGF2ZSBubyByZWFsbHkgZ29vZCBmaXggc2luY2UgSSB3YW50IHRvIHVzZSBhdXRvbWFrZSBteXNlbGYgdG8KICAgZ2VuZXJhdGUgdGhlIE1ha2VmaWxlLmluIGZpbGVzLiBJJ3ZlIGZvdW5kIG91dCB0aGF0IHRoZSBAU0hFTExALXByb2JsZW1zCiAgIGNhbiBvZnRlbiBiZSBmaXhlZCBieSBtYW51YWxseSBpbnZva2luZyAnYXV0b21ha2UnIGluIHRoZSBhcmNoaXZlIHJvb3QKICAgYmVmb3JlIHlvdSBydW4gLi9jb25maWd1cmUuLi4gSSd2ZSBoYWNrZWQgbXkgbWFrZXRneiBzY3JpcHQgbm93IHRvIGZpZGRsZQogICBhIGJpdCB3aXRoIHRoaXMgYW5kIG15IHRlc3RzIHNlZW0gdG8gd29yayBiZXR0ZXIgdGhhbiBiZWZvcmUgYXQgbGVhc3QhCgogRGFuaWVsICg0IE1heSAxOTk5KQogLSBta2hlbHAucGwgaGFzIGJlZW4gZG9pbmcgYmFkbHkgbGF0ZWx5LiBJIGNvcnJlY3RlZCBhIGNhc2UgcHJvYmxlbSBpbgogICB0aGUgcmVnZXhlcy4KCiAtIEkndmUgbm93IHJlbWFkZSB0aGUgLW8gb3B0aW9uIHRvIG5vdCB0b3VjaCB0aGUgZmlsZSB1bmxlc3MgaXQgbmVlZHMgdG8uCiAgIEkgaGFkIHRvIGRvIHRoaXMgdG8gbWFrZSAteiBvcHRpb24gcmVhbGx5IGZpbmUsIHNpbmNlIG5vdyB5b3UgY2FuIG1ha2UgYQogICBjdXJsIGZldGNoIGFuZCB1c2UgYSBsb2NhbCBjb3B5J3MgdGltZSB3aGVuIGRvd25sb2FkaW5nIHRvIHRoYXQgZmlsZSwgYXMKICAgaW46CgogICAgICAgIGN1cmwgLXogZHVtcCAtbyBkdW1wIHJlbW90ZS5zaXRlLmNvbS9maWxlLmh0bWwKCiAgIFRoaXMgd2lsbCBvbmx5IGdldCB0aGUgZmlsZSBpZiB0aGUgcmVtb3RlIG9uZSBpcyBuZXdlciB0aGFuIHRoZSBsb2NhbC4KICAgSSdtIGF3YXJlIHRoYXQgdGhpcyBhbHRlcnMgcHJldmlvdXMgYmVoYXZpb3VyIGEgbGl0dGxlLiBTb21lIHNjcmlwdHMgb3V0CiAgIHRoZXJlIG1heSBkZXBlbmQgb24gdGhhdCB0aGUgZmlsZSBpcyBhbHdheXMgdG91Y2hlZC4uLgoKIC0gQ29ycmVjdGVkIGEgYnVnIGluIHRoZSBTU0x2Mi92MyBzZWxlY3Rpb24uCgogLSBGZWxpeCB2b24gTGVpdG5lciByZXF1ZXN0ZWQgdGhhdCBjdXJsIHNob3VsZCBiZSBhYmxlIHRvIHNlbmQKICAgIklmLU1vZGlmaWVkLVNpbmNlIiBoZWFkZXJzLCB3aGljaCBpbmRlZWQgaXMgYSBmYWlyIGlkZWEuICBJIGltcGxlbWVudGVkIGl0CiAgIHJpZ2h0IGF3YXkhIFRyeSAteiA8ZXhwcmVzc2lvbj4gd2hlcmUgZXhwcmVzc2lvbiBpcyBhIGZ1bGwgR05VIGRhdGUKICAgZXhwcmVzc2lvbiBvciBhIGZpbGUgbmFtZSB0byBnZXQgdGhlIGRhdGUgZnJvbSEKCiBTdGVwaGFuIExhZ2VyaG9sbSAoMzAgQXByIDE5OTkpCiAtIFBvaW50ZWQgb3V0IGEgcHJvYmxlbSB3aXRoIHRoZSBzcmMvTWFrZWZpbGUgZm9yIEZyZWVCU0QuIFRoZSBSTSB2YXJpYWJsZQogICBpc24ndCBzZXQgYW5kIGNhdXNlcyB0aGUgbWFrZSB0byBmYWlsLgoKIERhbmllbCAoMjYgQXByaWwgMTk5OSkKIC0gQW0gSSBzaWxseSBvciB3aGF0PyBJcnZpbmcgV29sZmUgcG9pbnRlZCBvdXQgdG8gbWUgdGhhdCB0aGUgY3VybCB2ZXJzaW9uCiAgIG51bWJlciB3YXMgbm90IHNldCBwcm9wZXJseS4gSGFzbid0IGJlZW4gc2luY2UgNS42LiBUaGlzIHdhcyBkdWUgdG8gYSBidWcKICAgaW4gbXkgbWFrZXRneiBzY3JpcHQhCgogRGF2aWQgRXJpa3Nzb24gKDI1IEFwciAxOTk5KQogLSBGb3VuZCBhIGJ1ZyBpbiBjb29raWVzLmMgdGhhdCBtYWRlIGl0IGNyYXNoIGF0IHRpbWVzLgoKVmVyc2lvbiA1LjcuMQoKIERvdWcgS2F1Zm1hbiAoMjMgQXByIDE5OTkpCiAtIEJyb3VnaHQgdHdvIHN1bm9zIDQgZml4ZXMuIE9uZSBvZiB0aGVtIGJlaW5nIHRoZSBob3N0aXAuYyBmaXggbWVudGlvbmVkCiAgIGJlbG93IGFuZCB0aGUgb3RoZXIgb25lIGEgY29ycmVjdGlvbiBpbiBpbmNsdWRlL3N0ZGNoZWFkZXJzLmgKCiAtIEFkZGVkIGEgcGFyYWdyYXBoIGFib3V0IGNvbXBpbGluZyB3aXRoIHRoZSBVUy12ZXJzaW9uIG9mIG9wZW5zc2wgdG8gdGhlCiAgIElOU1RBTEwgZmlsZS4KCiBEYW5pZWwKIC0gTmV3IG1haWxpbmcgbGlzdCBhZGRyZXNzLiBJbmZvIHVwZGF0ZWQgb24gdGhlIHdlYiBwYWdlIGFzIHdlbGwgYXMgaW4gdGhlCiAgIFJFQURNRSBmaWxlCgogR3JlZyBPbnVmZXIgKDIwIEFwciAxOTk5KQogLSBob3N0aXAuYyBkaWRuJ3QgY29tcGlsZSBwcm9wZXJseSBvbiBTdW5PUyA1LjUuMS4KICAgSXQgbmVlZHMgYW4gI2luY2x1ZGUgPHN5cy90eXBlcy5oPgoKVmVyc2lvbiA1LjcKCiBEYW5pZWwgKEFwciAyMCAxOTk5KQogLSBEZWNpZGVkIHRvIHVwbG9hZCBhIG5vbi1iZXRhIHZlcnNpb24gcmlnaHQgbm93IQoKIC0gTWFkZSBjdXJsIHN1cHBvcnQgYW55LWxlbmd0aCBIVFRQIGhlYWRlcnMuIFRoZSBkZXN0aW5hdGlvbiBidWZmZXIgaXMgbm93CiAgIHNpbXBseSBlbmxhcmdlZCBldmVyeSB0aW1lIGl0IHR1cm5zIG91dCB0byBiZSB0b28gc21hbGwhCgogLSBBZGRlZCB0aGUgRkFRIGZpbGUgdG8gdGhlIGFyY2hpdmUuIFN0aWxsIGEgYml0IHNtYWxsaXNoLCBidXQgaXQgaXMgYQogICBzdGFydC4KCiBFcmljIFRoZWxpbiAoMTUgQXByIDE5OTkpCiAtIE1hZGUgLUQgYWNjZXB0ICctJyBpbnN0ZWFkIG9mIGZpbGVuYW1lIHRvIHdyaXRlIHRvIHN0ZG91dC4KClZlcnNpb24gNS42LjNiZXRhCgogRGFuaWVsIChBcHIgMTIgMTk5OSkKCiAtIENoYW5nZWQgdHdvICNpZmRlZiBXSU4zMiB0byBiZXR0ZXIgI2lmZGVmIDxlcnJvcmNvZGU+IHdoZW4gY29ubmVjdCgpaW5nCiAgIGluIHVybC5jIGFuZCBmdHAuYy4gTWFrZXMgY3lnd2luMzIgZGVhbCB3aXRoIHRoZW0gYmV0dGVyIHRvby4gV2Ugc2hvdWxkCiAgIHRyeSB0byBnZXQgc29tZSBkZWNlbnQgd2luMzItcmVwbGFjZW1lbnQgdGhlcmUuIEFueW9uZT8KCiAtIFRoZSBvbGQgLTMvLS1jcmxmIG9wdGlvbiBpcyBub3cgT05MWSAtLWNybGYhCgogLSBJIGNoYW5nZWQgdGhlICJTU0wgZml4IiB0byBhIG1vcmUgbGFtZSBvbmUsIGJ1dCB0aGF0IGRvZXNuJ3QgcmVtb3ZlIGFzCiAgIG11Y2ggZnVuY3Rpb25hbGl0eS4gTm93IEkndmUgZW5hYmxlZCB0aGUgbGliIHRvIHNlbGVjdCB3aGF0IFNTTCB2ZXJzaW9uIGl0CiAgIHNob3VsZCB0cnkgZmlyc3QuIEFwcGVhcmFudGx5IHNvbWUgb2xkZXIgU1NMLXNlcnZlcnMgZG9uJ3QgbGlrZSB3aGVuIHlvdQogICB0YWxrIHYzIHdpdGggdGhlbSBzbyB5b3UgbmVlZCB0byBiZSBhYmxlIHRvIGZvcmNlIGN1cmwgdG8gdGFsayB2MiBmcm9tIHRoZQogICBzdGFydC4gVGhlIGZpeCBkYXRlZCBBcHJpbCA2IGFuZCBwb3N0ZWQgb24gdGhlIG1haWxpbmcgbGlzdCBmb3JjZWQgY3VybCB0bwogICB1c2UgdjIgYXQgYWxsIHRpbWVzIHVzaW5nIGEgbW9kZXJuIE9wZW5TU0wgdmVyc2lvbiwgYnV0IHdlIGRvbid0IHJlYWxseQogICB3YW50IHN1Y2ggYSBjcmlwcGxlZCBzb2x1dGlvbi4KIAogLSBNYXJjIEJvdWNoZXIgc2VudCBtZSBhIHBhdGNoIHRoYXQgY29ycmVjdGVkIGEgbWF0aCBlcnJvciBmb3IgdGhlCiAgICJDdXJyLlNwZWVkIiBwcm9ncmVzcyBtZXRlci4KCiAtIEVyaWMgVGhlbGluIHNlbnQgbWUgYSBwYXRjaCB0aGF0IGVuYWJsZXMgJy1LIC0nIHRvIHJlYWQgYSBjb25maWcgZmlsZSBmcm9tCiAgIHN0ZGluLgoKIC0gSSBmb3VuZCBvdXQgd2UgZGlkbid0IGNsb3NlIHRoZSBmaWxlIHByb3Blcmx5IGJlZm9yZSBzbyBJIGFkZGVkIGl0IQoKIERhbmllbCAoQXByIDkgMTk5OSkKIC0gWXUgWGluIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB3aXRoIGZ0cCBkb3dubG9hZCByZXN1bWUuICBJdCBkaWRuJ3Qgd29yayBhdAogICBhbGwhIDstTwoKIERhbmllbCAoQXByIDYgMTk5OSkKIC0gQ29ycmVjdGVkIHRoZSB2ZXJzaW9uIHN0cmluZyBwYXJ0IGdlbmVyYXRlZCBmb3IgdGhlIFNTTCB2ZXJzaW9uLgoKIC0gSSBmb3VuZCBhIHdheSB0byBtYWtlIHNvbWUgb3RoZXIgU1NMIHBhZ2Ugd29yayB3aXRoIG9wZW5zc2wgMC45LjErIHRoYXQKICAgcHJldmlvdXNseSBkaWRuJ3QgKHNzbGVheSAwLjguMCB3b3JrcyB3aXRoIGl0IHRob3VnaCEpLiBUcnlpbmcgdG8gZ2V0CiAgIHNvbWUgcmVhbCBpbmZvIGZyb20gdGhlIE9wZW5TU0wgZ3V5cyB0byBzZWUgaG93IEkgc2hvdWxkIGRvIHRvIGJlaGF2ZSB0aGUKICAgYmVzdCB3YXkuIFNTTGVheSAwLjguMCBzaG91bGRuJ3QgYmUgdGhhdCBtdWNoIGluIHVzZSBhbnl3YXkgdGhlc2UgZGF5cyEKClZlcnNpb24gNS42LjJiZXRhCgogRGFuaWVsIChBcHIgNCAxOTk5KQogLSBGaW5hbGx5IGhhdmUgY3VybCBtb3JlIGNvb2tpZSAiYXdhcmUiLiBOb3cgcmVhZCBjYXJlZnVsbHkuIFRoaXMgaXMgaG93CiAgIGl0IHdvcmtzLgogICBUbyBtYWtlIGN1cmwgcmVhZCBjb29raWVzIGZyb20gYW4gYWxyZWFkeSBleGlzdGluZyBmaWxlLCBpbiBwbGFpbiBoZWFkZXItCiAgIGZvcm1hdCAobGlrZSBmcm9tIHRoZSBoZWFkZXJzIG9mIGEgcHJldmlvdXMgZmV0Y2gpIGludm9rZSBjdXJsIHdpdGggdGhlCiAgIC1iIGZsYWcgbGlrZToKCiAgICAgICAgY3VybCAtYiBmaWxlIGh0dHA6Ly9zaXRlL2Zvby5odG1sCgogICBDdXJsIHdpbGwgdGhlbiB1c2UgYWxsIGNvb2tpZXMgaXQgZmluZHMgbWF0Y2hpbmcuIFRoZSBvbGQgc3R5bGUgdGhhdCBzZXRzCiAgIGEgc2luZ2xlIGNvb2tpZSB3aXRoIC1iIGlzIHN0aWxsIHN1cHBvcnRlZCBhbmQgaXMgdXNlZCBpZiB0aGUgc3RyaW5nCiAgIGZvbGxvd2luZyAtYiBpbmNsdWRlcyBhICc9JyBsZXR0ZXIsIGFzIGluICItYiBuYW1lPWRhbmllbCIuCgogICBUbyBtYWtlIGN1cmwgcmVhZCB0aGUgY29va2llcyBzZW50IGluIGNvbWJpbmF0aW9uIHdpdGggYSBsb2NhdGlvbjogKHdoaWNoCiAgIHNpdGVzIG9mdGVuIGRvKSBwb2ludCBjdXJsIHRvIHJlYWQgYSBub24tZXhpc3RpbmcgZmlsZSBhdCBmaXJzdCAoaS5lCiAgIHRvIHN0YXJ0IHdpdGggbm8gZXhpc3RpbmcgY29va2llcyksIGxpa2U6CgogICAgICAgIGN1cmwgLWIgbm93aGVyZSBodHRwOi8vc2l0ZS9zZXRjb29raWVhbmRyZWxvY2F0ZS5odG1sCgogLSBBZGRlZCBhIHBhcmFncmFwaCBpbiB0aGUgVE9ETyBmaWxlIGFib3V0IHRoZSBTU0wgcHJvYmxlbXMgcmVjZW50bHkKICAgcmVwb3J0ZWQuIEV2aWRlbnRseSwgc29tZSBraW5kIG9mIFNTTC1wcm9ibGVtIGN1cmwgbWF5IG5lZWQgdG8gYWRkcmVzcy4KCiAtIEJldHRlciAiTG9jYXRpb246IiBmb2xsb3dpbmcuCgogRG91Z2xhcyBFLiBXZWdzY2hlaWQgKFR1ZSwgMzAgTWFyIDE5OTkpCiAtIEEgc3Vic2Vjb25kIGRpc3BsYXkgcGF0Y2guCgogRGFuaWVsIChNYXIgMTQgMTk5OSkKIC0gSSd2ZSBzZXBhcmF0ZWQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIGxpYmN1cmwgYW5kIGN1cmwgbm93LiBUbyBtYWtlCiAgIHRoaW5ncyBhIGxpdHRsZSBlYXNpZXIsIEkgZGVjaWRlZCB0byBzdGFydCB0aGUgY3VybCBudW1iZXJpbmcgZnJvbQogICA1LjYgYW5kIHRoZSBmb3JtZXIgdmVyc2lvbiBudW1iZXIga25vd24gYXMgImN1cmwiIGlzIG5vdyB0aGUgb25lCiAgIHNldCBmb3IgbGliY3VybC4KCiAtIFJlbW92ZWQgdGhlICdlbmFibGUtbm8tcGFzcycgZnJvbSBjb25maWd1cmUsIEkgZG91YnQgYW55b25lIHdhbnRlZAogICB0aGF0LgoKIC0gTWFkZSBsb3RzIG9mIHRpbnkgYWRqdXN0bWVudHMgdG8gY29tcGlsZSBzbW9vdGhseSB3aXRoIGN5Z3dpbiB1bmRlcgogICB3aW4zMi4gSXQncyBhIGtpbGxlciBmb3IgcG9ydGluZyB0aGlzIHRvIHdpbjMyLCBieWUgYnllIFZDKyshIDstKQogICBDb21waWxlcyBhbmQgYnVpbGRzIG91dC1vZi10aGUtYm94IG5vdy4gU2VlIHRoZSBuZXcgd29yZGluZ3MgaW4KICAgSU5TVEFMTCBmb3IgZGV0YWlscy4KCiAtIEJlZ2lubmluZyBleHBlcmltZW50cyB3aXRoIGRvd25sb2FkaW5nIG11bHRpcGxlIGRvY3VtZW50IGZyb20gYSBodHRwCiAgIHNlcnZlciB3aGlsZSByZW1haW5pbmcgY29ubmVjdGVkLgoKVmVyc2lvbiA1LjZiZXRhCgogRGFuaWVsIChNYXIgMTMgMTk5OSkKIC0gU2luY2UgSSd2ZSBjaGFuZ2VkIHNvIG11Y2gsIEkgdGhvdWdodCBJJ2QganVzdCBnbyBhaGVhZCBhbmQgaW1wbGVtZW50IHRoZQogICBzdWdnZXN0aW9uIGZyb20gRG91Z2xhcyBFLiBXZWdzY2hlaWQuIC1EIG9yIC0tZHVtcC1oZWFkZXIgaXMgbm93IHN0b3JpbmcKICAgSFRUUCBoZWFkZXJzIHNlcGFyYXRlbHkgaW4gdGhlIHNwZWNpZmllZCBmaWxlLgoKIC0gQWRkZWQgbmV3IHRleHQgdG8gSU5TVEFMTCBvbiB3aGF0IHRvIGRvIHRvIGJ1aWxkIHRoaXMgb24gd2luMzIgbm93LgoKIC0gQWFhcmdoLiBJIGhhZCB0byB0YWtlIGEgc3RlcCBiYWNrIGFuZCBwcmVmaXggdGhlIHNoYXJlZCAjaW5jbHVkZSBmaWxlcwogICBpbiB0aGUgc291cmNlcyB3aXRoICIuLi9pbmNsdWRlLyIgdG8gcGxlYXNlIFZDKysuLi4KCiBEYW5pZWwgKE1hciAxMiAxOTk5KQogLSBTcGxpdCB0aGUgdXJsLmMgc291cmNlIGludG8gbWFueSB0aW55IHNvdXJjZXMgZm9yIGJldHRlciByZWFkYWJpbGl0eQogICBhbmQgc21hbGxlciBzaXplLgoKIERhbmllbCAoTWFyIDExIDE5OTkpCiAtIFN0YXJ0ZWQgdG8gY2hhbmdlIHN0dWZmIGZvciBhIG1vdmUgdG8gbWFrZSBsaWJjdXJsIGFuZCBhIG1vcmUgc2VwYXJhdGUKICAgY3VybCBhcHBsaWNhdGlvbiB0aGF0IHVzZXMgdGhlIGxpYmN1cmwuIE1hZGUgdGhlIGxpYmN1cmwgc291cmNlcyBpbnRvCiAgIHRoZSBuZXcgbGliIGRpcmVjdG9yeSB3aGlsZSB0aGUgY3VybCBhcHBsaWNhdGlvbiB3aWxsIHJlbWFpbiBpbiBzcmMgYXMKICAgYmVmb3JlLiBOZXcgbWFrZWZpbGVzLCBhZGp1c3RlZCBjb25maWd1cmUgc2NyaXB0IGFuZCBzby4KCiAgIGxpYmN1cmwuYSBidWlsdCBxdWlja2x5IGFuZCBlYXNpbHkuIEkgYmV0dGVyIG1ha2UgYSBiZXR0ZXIgaW50ZXJmYWNlIHRvCiAgIHRoZSBsaWIgZnVuY3Rpb25zIHRob3VnaC4KCiAgIFRoZSBuZXcgcm9vdCBkaXIgaW5jbHVkZS8gaXMgc3VwcG9zZWQgdG8gY29udGFpbiB0aGUgcHVibGljIGluZm9ybWF0aW9uCiAgIGFib3V0IHRoZSBuZXcgbGliY3VybC4gSXQgaXMgYSBsaXR0bGUgdWdseSBzbyBmYXIgOi0pCgoKIERhbmllbCAoTWFyIDEgMTk5OSkKIC0gVG9kZCBLYXVmbWFubiBzZW50IG1lIGEgZ29vZCBsaW5rIHRvIE5ldHNjYXBlJ3MgY29va2llIHNwZWMgYXMgd2VsbCBhcyB0aGUKICAgaW5mbyB0aGF0IFJGQyAyMTA5IHNwZWNpZmllcyBob3cgdG8gdXNlIHRoZW0uICBUaGUgbGluayBpcyBub3cgaW4gdGhlCiAgIFJFQURNRSBhbmQgdGhlIFJGQyBpbiB0aGUgUkVTT1VSQ0VTLgoKIERhbmllbCAoRmViIDIzIDE5OTkpCiAtIEZpbmFsbHkgbWFkZSBjb25maWd1cmUgYWNjZXB0IC0td2l0aC1zc2wgdG8gbG9vayBmb3IgU1NMIGxpYnMgYW5kIGluY2x1ZGVzCiAgIGluIHRoZSAic3RhbmRhcmQiIHBsYWNlIC91c3IvbG9jYWwvc3NsLi4uCgogRGFuaWVsIChGZWIgMjIgMTk5OSkKIC0gVmVyaWZpZWQgdGhhdCBjdXJsIGxpbmtlZCBmaW5lIHdpdGggT3BlblNTTCAwLjkuMWMgd2hpY2ggc2VlbXMgdG8gYmUKICAgdGhlIG1vc3QgcmVjZW50LgoKIEhlbnJpIEdvbWV6IChGcmkgRmViICA1IDE5OTkpCiAtIFNlbnQgaW4gYW4gdXBkYXRlZCBjdXJsLXNzbC5zcGVjLiBJIHN0aWxsIG1pc3MgdGhlIHNjcmlwdCB0aGF0IGJ1aWxkcyBhbgogICBSUE0gYXV0b21hdGljYWxseS4uLgoKVmVyc2lvbiA1LjUuMQoKIE1hcmsgQnV0bGVyICgyNyBKYW4gMTk5OSkKIC0gQ29ycmVjdGVkIHByb2JsZW1zIGluIERvd25sb2FkKCkuCgogRGFuaXRlbCBTdGVuYmVyZyAoMjUgSmFuIDE5OTkpCiAtIEplcmVtaWUgUGV0aXQgcG9pbnRlZCBvdXQgYSBmZXcgZmxhd3MgaW4gdGhlIHNvdXJjZSB0aGF0IHByZXZlbnRlZCBpdCBmcm9tCiAgIGNvbXBpbGUgd2FybmluZyBmcmVlIHdpdGggdGhlIG5hdGl2ZSBjb21waWxlciB1bmRlciBEaWdpdGFsIFVuaXggdjQuMGQuCgpWZXJzaW9uIDUuNQoKIERhbmllbCBTdGVuYmVyZyAoMTUgSmFuIDE5OTkpCiAtIEFkZGVkIEJqb3JucyBzbWFsbCB0ZXh0IHRvIHRoZSBSRUFETUUgYWJvdXQgdGhlIERJQ1QgcHJvdG9jb2wuCgogRGFuaWVsIFN0ZW5iZXJnICgxMSBKYW4gMTk5OSkKIC0gPGpzd2luayBhdCBzb2Z0Y29tLm5ldD4gcmVwb3J0ZWQgYWJvdXQgdGhlIHdpbjMyLXZlcnNpb2luOiAiRG9lc24ndCB1c2UKICAgQUxMX1BST1hZIGVudmlyb25tZW50IHZhcmlhYmxlIi4gVHVybmVkIG91dCB0byBiZSBiZWNhdXNlIG9mIHRoZSBzdGF0aWMtCiAgIGJ1ZmZlciBuYXR1cmUgb2YgdGhlIHdpbjMyIGVudmlyb25tZW50IHZhcmlhYmxlIGNhbGxzIQoKIEJqb3JuIFJlZXNlICgxMCBKYW4gMTk5OSkKIC0gSSBoYXZlIGF0dGFjaGVkIGEgc2ltcGxlIGFkZGl0aW9uIGZvciB0aGUgRElDVCBwcm90b2NvbCAoUkZDIDIyMjkpLgogICBJdCBwZXJmb3JtcyBkaWN0aW9uYXJ5IGxvb2t1cHMuIFRoZSBvdXRwdXQgc3RpbGwgbmVlZHMgdG8gYmUgYmV0dGVyCiAgIGZvcm1hdHRlZC4KCiAgIFRvIHRlc3QgaXQgdHJ5ICh0aGUgZXhhY3QgZm9ybWF0LCBhbmQgbW9yZSBleGFtcGxlcyBhcmUgZGVzY3JpYmVkIGluCiAgIHRoZSBSRkMpCgogICAgICAgIGRpY3Q6Ly9kaWN0Lm9yZy9tOmhlbGxvCiAgICAgICAgZGljdDovL2RpY3Qub3JnL206aGVsbG86OnNvdW5kZXgKCgogVmljZW50ZSBHYXJjaWEgKDEwIEphbiAxOTk5KQogLSBDb3JyZWN0ZWQgdGhlIHByb2dyZXNzIG1ldGVyIGZvciBmaWxlcyBsYXJnZXIgdGhhbiAyME1CLgoKIERhbmllbCBTdGVuYmVyZyAoNyBKYW4gMTk5OSkKIC0gQ29ycmVjdGVkIHRoZSAtdCBhbmQgLVQgaGVscCB0ZXh0cy4gVGhleSBjbGFpbWVkIHRvIGJlIEZUUCBvbmx5LgoKVmVyc2lvbiA1LjQKCiBEYW5pZWwgU3RlbmJlcmcKICg3IEphbiAxOTk5KQogLSBJcnZpbmcgV29sZmUgcmVwb3J0ZWQgdGhhdCBjdXJsIC1zIGRpZG4ndCBhbHdheXMgc3VwcmVzcyB0aGUgcHJvZ3Jlc3MKICAgcmVwb3J0aW5nLiBJdCB3YXMgdGhlIGZvcm0gcG9zdCB0aGF0IGF1dG9hbXRpY2FsbHkgYWx3YXlzIHN3aXRjaGVkIGl0IG9uCiAgIGFnYWluLiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQhCgogKDQgSmFuIDE5OTkpCiAtIEFuZHJlYXMgS29zdHlya2Egc3VnZ2VzdGVkIEknZCBhZGQgUFVUIGFuZCBoZSBoZWxwZWQgbWUgb3V0IHRvIHRlc3QgaXQuIElmCiAgIHlvdSB1c2UgLXQgb3IgLVQgbm93IG9uIGEgaHR0cCBvciBodHRwcyBzZXJ2ZXIsIFBVVCB3aWxsIGJlIHVzZWQgZm9yIGZpbGUKICAgdXBsb2FkLgoKICAgSSByZW1vdmVkIHRoZSBmb3JtZXIgdXNlIG9mIC1UIHdpdGggSFRUUC4gSSBkb3VidCBhbnlvbmUgZXZlciByZWFsbHkgdXNlZAogICB0aGF0LgoKICg0IEphbiAxOTk5KQogLSBFcmlrIEphY29ic2VuIGZvdW5kIGEgd2lkdGggYnVnIGluIHRoZSBtcHJpbnRmKCkgZnVuY3Rpb24uICBJIGNvcnJlY3RlZCBpdAogICBub3cuCgogKDQgSmFuIDE5OTkpCiAtIEFzIEpvaG4gVi4gQ2hvdyBwb2ludGVkIG91dCB0byBtZSwgY3VybCBhY2NlcHRlZCB2ZXJ5IGxpbWl0ZWQgVVJMIHNpemVzLiBJdAogICBzaG91bGQgbm93IGFjY2VwdCBwYXRoIHBhcnRzIHRoYXQgYXJlIHVwIHRvIGF0IGxlYXN0IDQwOTYgYnl0ZXMuCgogLSBTb21laG93IEkgc2NyZXdlZCB1cCB3aGVuIGFwcGx5aW5nIHRoZSBBSVggZml4IGZyb20gR2lsYmVydCBSYW1pcmV6LCBzbwogICBJIHJlZGlkIHRoYXQgbm93LgoKVmVyc2lvbiA1LjNhICh3aW4zMiBvbmx5KQoKIFRyb3kgRW5nZWwKIC0gQ29ycmVjdGVkIGEgd2luMzIgYnVnIGluIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBwYXJ0LgoKVmVyc2lvbiA1LjMKCiBHaWxiZXJ0IFJhbWlyZXogSnIuICgyMSBEZWMgMTk5OCkKIC0gSSBoYXZlIGltcGxlbWVudGVkIHRoZSAicXVvdGUiIGZ1bmN0aW9uIG9mIEZUUCBjbGllbnRzLiBJdCBhbGxvd3MgeW91IHRvCiAgIHNlbmQgYXJiaXRyYXJ5IGNvbW1hbmRzIHRvIHRoZSByZW1vdGUgRlRQIHNlcnZlci4gSSBjaG9zZSB0aGUgLVEvLS1xdW90ZQogICBjb21tYW5kLWxpbmUgYXJndW1lbnRzLgoKICAgWW91IGNhbiBoYXZlIG1vcmUgdGhhbiBvbmUgcXVvdGVkIHN0cmluZywgYW5kIGN1cmwgd2lsbCBhcHBseSB0aGVtIGluCiAgIG9yZGVyLiAgVGhpcyBpcyB3aGF0IEkgdXNlIGZvciBteSBNVlMgdXBsb2FkOgoKICBjdXJsIC1CIC0tY3JsZiAtUSAic2l0ZSBscmVjbD04MCIgLVEgInNpdGUgYmxrPTgwMDAiIC1UIGZpbGUgZnRwOi8vb3MzOTAvdGVzdAoKICAgQ3VybCB3aWxsIHNlbmQgdGhlIHR3byBxdW90ZWQgInNpdGUiIGNvbW1hbmRzIGluIHRoZSBwcm9wZXIgb3JkZXIuCgogLSBNYWRlIGl0IGNvbXBpbGUgc21vb3RobHkgb24gQUlYLgoKIEdpbGJlcnQgUmFtaXJleiBKci4gKDE4IERlYyAxOTk4KQogLSBCcm91Z2h0IGFuIE1WUyBwYXRjaDogLTMvLS1tdnMsIGZvciBmdHAgdXBsb2FkIHRvIHRoZSBNVlMgZnRwIHNlcnZlci4KCiBUcm95IEVuZ2VsICgxNyBEZWMgMTk5OCkKIC0gQnJvdWdodCBhIGNvcnJlY3Rpb24gdGhhdCBmaXhlcyB0aGUgd2luMzIgY3VybCBidWcuCgogRGFuaWVsIFN0ZW5iZXJnCiAtIEEgYnVnLCBwb2ludGVkIG91dCB0byBtZSBieSBEciBILiBULiBMZXVuZywgY2F1c2VkIGN1cmwgdG8gY3Jhc2ggb24gdGhlIC1BCiAgIGZsYWcgb24gY2VydGFpbiBzeXN0ZW1zLiBBY3R1YWxseSwgYWxsIHN5c3RlbXMgc2hvdWxkJ3ZlIQoKIC0gQWRkZWQgYSBmZXcgZGVmaW5lcyB0byBtYWtlIGRpcmVjdG9yaWVzL2ZpbGUgbmFtZXMgZ2V0IGJ1aWxkIG5pY2VyICh3aXRoIF8KICAgaW5zdGVhZCBvZiAuIGFuZCBcIGluc3RlYWQgb2YgLyBpbiB3aW4zMikuCgogLSBzdGV2ZSA8ZmlzayBhdCBwb2xhci5ib3dkb2luLmVkdT4gcmVwb3J0ZWQgYSB3ZWlyZCBidWcgdGhhdCBvY2N1cmVkIGlmIHRoZQogICBmdHAgc2VydmVyIHJlc3BvbnNlIGxpbmUgaGFkIGEgcGFyZW50aGVzaXMgb24gdGhlIGxpbmUgYmVmb3JlIHRoZSAoc2l6ZSkKICAgaW5mby4gSSBob3BlIGl0IHdvcmtzIGJldHRlciBub3chCgpWZXJzaW9uIDUuMi4xCgogU3RldmVuIEcuIEpvaG5zb24gKERlYyAxNCwgMTk5OCkKIC0gQnJvdWdodCBhIGZpeCB0aGF0IGNvcnJlY3RlZCBhIGNyYXNoIGluIDUuMiBkdWUgdG8gYmFkIHRyZWF0bWVudCBvZiB0aGUKICAgZW52aXJvbm1lbnQgdmFyaWFibGVzLgoKVmVyc2lvbiA1LjIKCiBEYW5pZWwgU3RlbmJlcmcgKERlYyAxNCwgMTk5OCkKIC0gUmV3cm90ZSB0aGUgbWtoZWxwIHNjcmlwdCBhbmQgbm93LCB0aGUgbWtoZWxwLnBsIHNjcmlwdCBnZW5lcmF0ZXMgdGhlCiAgIGh1Z2VoZWxwLmMgZmlsZSBmcm9tIHRoZSBSRUFETUUgKmFuZCogdGhlIG1hbiBwYWdlIGZpbGUgY3VybC4xLiBCeSB1c2luZwogICBib3RoIGZpbGVzLCBJIG5vIGxvbmdlciBuZWVkIHRvIGhhdmUgZG91YmxlIGluZm9ybWF0aW9uIGluIGJvdGggdGhlIG1hbgogICBwYWdlIGFuZCB0aGUgUkVBRE1FIGFzIHdlbGwuIFNvLCB3aW4zMi11c2VycyB3aWxsIG9ubHkgaGF2ZSB0aGUgaHVnZWhlbHAuYwogICBmaWxlIGZvciBhbGwgaW5mbywgYnV0IHRoZW4sIHRoZXkgZG93bmxvYWQgdGhlIHBsYWluIGJpbmFyeSBtb3N0IHRpbWVzCiAgIGFueXdheS4KCiAtIGdjYzIuOC4xIHdpdGggdGhlIC1XYWxsIGZsYWcgY29tcGxhaW50cyBhIGxvdCBvbiBzdWJzY3JpcHQgaGFzIHR5cGUgYGNoYXInCiAgIGlmIEkgZG9uJ3QgZXhwbGljaXRseSB0eXBlY2FzdCB0aGUgYXJndW1lbnQgdG8gaXNkaWdpdCgpIG9yIGlzc3BhY2UoKSB0bwogICBpbnQuIFNvIEkgZGlkIHRvIGNvbXBpbGUgd2FybmluZyBmcmVlIHdpdGggdGhhdCB0b28uCgogLSBBZGRlZCBjaGVja3MgZm9yICdsb25nIGRvdWJsZScgYW5kICdsb25nIGxvbmcnIGluIHRoZSBjb25maWd1cmUgc2NyaXB0LiBJCiAgIG5lZWQgdGhvc2UgZm9yIHRoZSBtcHJpbnRmLmMgc291cmNlIHRvIGNvbXBpbGUgd2VsbCBvbiBub24gbG9uZyBsb25nCiAgIGNvbWZvcm1pbmcgc3lzdGVtcyEKClZlcnNpb24gNS4xIChub3QgcHVibGljbHkgcmVsZWFzZWQpCgogRGFuaWVsIFN0ZW5iZXJnIChEZWMgMTAsIDE5OTgpCiAtIEkgZ290IGEgcmVxdWVzdCBmb3IgYSBwcmUtY29tcGlsZWQgTlQgQWxwaGEgdmVyc2lvbi4gQW55b25lPwoKIC0gQWRkZWQgTHlueC9DRVJOIHd3dyBsaWIgcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGUgc3VwcG9ydC4gVGhhdCBtZWFucyBjdXJsCiAgIG5vdyByZWFkcyBhbmQgdW5kZXJzdGFuZHMgdGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXM6CgoJSFRUUF9QUk9YWSwgSFRUUFNfUFJPWFksIEZUUF9QUk9YWSwgR09QSEVSX1BST1hZCgogICBUaGV5IHNob3VsZCBiZSBzZXQgZm9yIHByb3RvY29sLXNwZWNpZmljIHByb3hpZXMuIEdlbmVyYWwgcHJveHkgc2hvdWxkIGJlCiAgIHNldCB3aXRoCgkKCUFMTF9QUk9YWQoKICAgQW5kIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgaG9zdCBuYW1lcyB0aGF0IHNob3VsZG4ndCBnbyB0aHJvdWdoIGFueQogICBwcm94eSBpcyBzZXQgaW4gKG9ubHkgYW4gYXN0ZXJpc2ssICcqJyBtYXRjaGVzIGFsbCBob3N0cykuCgoJTk9fUFJPWFkKCiAgIFRoZSB1c2FnZSBvZiB0aGUgLXgvLS1wcm94eSBmbGFnIG92ZXJyaWRlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLgoKIC0gUHJveHkgY2FuIG5vdyBiZSBzcGVjaWZpZWQgd2l0aCBhIHByb2NvdG9sOi8vIHByZWZpeC4KCiAtIFdyb3RlIHRoZSBjdXJsLjEgbWFuIHBhZ2UuCgogLSBJbnRyb2R1Y2VkIGEgd2hvbGUgbmV3IGR5bmFtaWMgYnVmZmVyIHN5c3RlbSBmb3IgYWxsIHNwcmludGYoKXMuIEl0IGlzCiAgIGJhc2VkIG9uIHRoZSAqcHJpbnRmKCkgcGFja2FnZSBieSB5b3VycyB0cnVseSBhbmQgQmpvcm4gUmVlc2UuIEhvcGVmdWxseSwKICAgdGhlcmUgYXJlbid0IHRoYXQgbWFueSBidWZmZXIgb3ZlcmZsb3cgcmlza3MgbGVmdCBub3cuCgogLSBBaCwgSSBzaG91bGQgbWVudGlvbiBJJ3ZlIGNvbXBpbGVkIGFuZCBidWlsdCBjdXJsIHN1Y2Nlc3NmdWxseSB1bmRlcgogICBzb2xhcmlzIDIuNiB3aXRoIGdjYyBub3csIGdjYyAyLjcuMiB3b24ndCB3b3JrIGJ1dCAyLjguMSBkaWQgb2suCgogT3JlbiBUaXJvc2ggKERlYyAzLCAxOTk4KQogLSBCcm91Z2h0IHR3byAuc3BlYyBmaWxlcywgdG8gdXNlIHdoZW4gY3JlYXRpbmcgKExpbnV4KSBSZWRoYXQgc3R5bGUgUlBNCiAgIHBhY2thZ2VzLiBUaGV5J3JlIG5hbWVkIGN1cmwuc3BlYyBhbmQgY3VybC1zc2wuc3BlYy4KCiBUcm95IEVuZ2VsCiAtIFN1cHBsaWVkIHRoZSBzcmMvTWFrZWZpbGUudmM2IGZvciBlYXN5IGNvbXBpbGluZyB3aXRoIFZDKysgdW5kZXIgV2luMzIuCgpWZXJzaW9uIDUuMAoKIERhbmllbCBTdGVuYmVyZyAoRGVjIDEsIDE5OTgpCiAtIE5vdCBhIHNpbmdsZSBidWcgcmVwb3J0IGluIGFnZXMuCiAtIENvcnJlY3RlZCBnZXRwYXNzLmMgYW5kIG1haW4uYyB0byBjb21waWxlIHdhcm5pbmcgYW5kIGVycm9yIGZyZWUgd2l0aCB0aGUKICAgV2luMzIgVkMrKyBjcmFwLgoKVmVyc2lvbiA1LjAgYmV0YSAyNAoKIERhbmllbCBTdGVuYmVyZyAoTm92IDIwLCAxOTk4KQoKIEhPVyBUTyBCVUlMRCBBIFJFTEVBU0UgQVJDSElWRToKCiAqIFByZS1yZXF1aXNpdGUgc29mdHdhcmU6CiAgIFdoYXQJCSAgICAgVG8gYnVpbGQgd2hhdCAgICAgICAgICAgICBSZWFkcyBkYXRhIGZyb20KICAgPT09PSAgICAgICAgICAgICAgPT09PT09PT09PT09PSAgICAgICAgICAgICA9PT09PT09PT09PT09PT0KICAgR05VIGF1dG9tYWtlICAgICAgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQgICBjb25maWd1cmUuaW4KICAgICBHTlUgbWFrZSgxKSAgICAgIC0gIiAtCiAgICAgR05VIGdjYygxKSAgICAgICAtICIgLQogICBHTlUgYXV0b2NvbmYgICAgICBjb25maWd1cmUgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZS5pbgogICBHTlUgYXV0b2hlYWRlcigyKSBjb25maWcuaC5pbgkgICAgICAgY29uZmlndXJlLmluLCBhY2NvbmZpZy5oCgogKiBNYWtlIHN1cmUgYWxsIGZpbGVzIHRoYXQgc2hvdWxkIGJlIHBhcnQgb2YgdGhlIGFyY2hpdmUgYXJlIHB1dCBpbiBGSUxFUy4KCiAqIFJ1biAnLi9tYWtldGd6JyBhbmQgZW50ZXIgdmVyc2lvbiBudW1iZXIgb2YgdGhlIG5ldyB0byBiZWNvbWUgYXJjaGl2ZS4KCiAgIG1ha2V0Z3ogZG9lczoKCiAgIC0gRW50ZXJzIHRoZSBuZXdseSBjcmVhdGVkIHZlcnNpb24gbnVtYmVyIGluIHVybC5oLgogICAtIChJZiB5b3UgZG9uJ3QgaGF2ZSBhdXRvbWFrZSwgdGhpcyBzY3JpcHQgd2lsbCB3YXJuIGFib3V0IHRoYXQsIGJ1dCB1bmxlc3MKICAgICB5b3UgaGF2ZSBjaGFuZ2VkIHRoZSBNYWtlZmlsZS5hbSBmaWxlcywgdGhhdCBpcyBub3RoaW5nIHRvIGNhcmUgYWJvdXQuKQogICAgIElmIHlvdSBoYXZlIGl0LCBpdCdsbCBydW4gaXQuCiAgIC0gSWYgeW91IGhhdmUgYXV0b2NvbmYsIHRoZSBjb25maWd1cmUuaW4gd2lsbCBiZSBlZGl0ZWQgdG8gZ2V0IHRoZSBuZXdseQogICAgIGNyZWF0ZWQgdmVyc2lvbiBudW1iZXIgYW5kIGF1dG9jb25mIHdpbGwgYmUgcnVuLgogICAtIENyZWF0ZXMgYSBuZXcgZGlyZWN0b3J5IG5hbWVkIGN1cmwtPHZlcnNpb24+LiAoQWN0dWFsbHksIGl0IHVzZXMgdGhlIGJhc2UKICAgICBuYW1lIG9mIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB1cCB0byB0aGUgZmlyc3QgJy0nLikKICAgLSBDb3BpZXMgYWxsIGZpbGVzIG1lbnRpb25lZCBpbiBGSUxFUyB0byB0aGUgbmV3IGRpcmVjdG9yeS4gU2F2aW5nCiAgICAgcGVybWlzc2lvbnMgYW5kIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCiAgIC0gVXNlcyB0YXIgdG8gY3JlYXRlIGFuIGFyY2hpdmUgb2YgaXQgYWxsLCBuYW1lZCBjdXJsLTx2ZXJzaW9uPi50YXIuZ3oKICAgLSBnemlwcyB0aGUgYXJjaGl2ZQogICAtIFJlbW92ZXMgdGhlIG5ldyBkaXJlY3RvcnkgYW5kIGFsbCBpdHMgY29udGVudHMuCgogKiBXaGVuIGRvbmUsIHlvdSBoYXZlIGFuIGFyY2hpdmUgc3RvcmVkIGluIHlvdXIgZGlyZWN0b3J5IG5hbWVkCiAgIGN1cmwtPHZlcnNpb24+LnRhci5nei4KCiAgIERvbmUhCgogICAoMSkgVGhleSdyZSByZXF1aXJlZCB0byBtYWtlIGF1dG9tYWtlIHJ1biBwcm9wZXJseS4KICAgKDIpIEl0IGlzIGRpc3RyaWJ1dGVkIGFzIGEgcGFydCBvZiB0aGUgR05VIGF1dG9jb25mIGFyY2hpdmUuCgogRGFuaWVsIFN0ZW5iZXJnIChOb3YgMTgsIDE5OTgpCiAtIEkgY2hhbmdlZCB0aGUgVEFHLXN5c3RlbS4gSWYgeW91IGV2ZXIgdXNlZCB1cmxnZXQoKSBmcm9tIHRoaXMgcGFja2FnZSBpbgogICBhbm90aGVyIHByb2R1Y3QsIHlvdSBuZWVkIHRvIHJlY29tcGlsZSB3aXRoIHRoZSBuZXcgaGVhZGVycy4gSSBkaWQgdGhpcwogICBuZXcgc3R1ZmYgdG8gYmV0dGVyIGRlYWwgd2l0aCBkaWZmZXJlbnQgY29tcGlsZXJzIGFuZCBzeXN0ZW0gd2l0aCBkaWZmZXJlbnQKICAgdmFyaWFibGUgc2l6ZXMuIEkgdGhpbmsgaXQgbWFrZXMgaXQgYSBsaXR0bGUgbW9yZSBwb3J0YWJsZS4gVGhpcyBwcm92ZXMKICAgdG8gY29tcGlsZSB3YXJuaW5nIGZyZWUgd2l0aCB0aGUgcHJvYmxlbWF0aWMgSVJJWCBjb21waWxlciEKIC0gV2luMzIgY29tcGlsZWQgd2l0aCBhIHNpbGx5IGVycm9yLiBDb3JyZWN0ZWQgbm93LgogLSBCcmlhbiBDaGFwbGluIHJlcG9ydGVkIHlldCBhbm90aGVyIHByb2JsZW0gaW4KICAgbXVsdGlsaW5lIEZUUCByZXNwb25zZXMuIEkndmUgdHJpZWQgdG8gY29ycmVjdCBpdC4gSSBtYWlsZWQgaGltIGEgbmV3CiAgIHZlcnNpb24gYW5kIEkgaG9wZSBoZSBnZXRzIGJhY2sgc29vbiB3aXRoIHBvc2l0aXZlIGZlZWRiYWNrIQogLSBJbXByb3ZlZCB0aGUgJ21ha2V0Z3onIHRvIGNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgdHJlZSB3aGljaCBpdCBtYWtlcwogICBhbiBhcmNoaXZlIGZyb20gaW5zdGVhZCBvZiB0aGUgcHJldmlvdXMgcmVuYW1pbmcgb2YgdGhlIGN1cnJlbnQgb25lLgogLSBNYWlsaW5nIGxpc3Qgb3BlbmVkIChzZWUgUkVBRE1FKS4KIC0gTWFkZSAtdiBtb3JlIHZlcmJvc2Ugb24gdGhlIFBBU1Ygc2VjdGlvbiBvZiBmdHAgdHJhbnNmZXJzLiBOb3cgaXQgdGVsbHMKICAgaG9zdCBuYW1lIGFuZCBJUCBvZiB0aGUgbmV3IGhvc3QgKGFuZCBwb3J0IG51bWJlcikuIEkgYWxzbyBhZGRlZCBhIHNlY3Rpb24KICAgYWJvdXQgUE9SVCB2cyBQQVNWIGluIHRoZSBSRUFETUUuCgpWZXJzaW9uIDUuMCBiZXRhIDIxCgogQW5ndXMgTWFja2F5IChOb3YgMTUsIDE5OTgpCiAtIEludHJvZHVjZWQgYXV0b21ha2Ugc3R1ZmYuCgogRGFuaWVsIFN0ZW5iZXJnIChOb3YgMTMsIDE5OTgpCiAtIEp1c3QgbWFkZSBhIHN1Y2Nlc3NmdWwgR0VUIG9mIGEgZG9jdW1lbnQgZnJvbSBhbiBTU0wtc2VydmVyIHVzaW5nIG15IG93bgogICBwcml2YXRlIGNlcnRpZmljYXRlIGZvciBhdXRoZW50aWNhdGlvbiEgVGhlIGNlcnRpZmljYXRlIGhhcyB0byBiZSBpbiBQRU0KICAgZm9ybWF0LiBZb3UgZG8gdGhhdCB0aGUgZWFzaWVzdCB3YXkgKGFsdGhvdWdoIG5vdCAqdGhhdCogZWFzeSkgYnkKICAgZG93bmxvYWRpbmcgdGhlIFNTTHllYXkgUEtDUyMxMi1wYXRjaCBieSBEciBTdGVwaGVuIE4uIEhlbnNvbiBmcm9tIGhpcyBzaXRlCiAgIGF0OiBodHRwOi8vd3d3LmRyaC1jb25zdWx0YW5jeS5kZW1vbi5jby51ay8uIFVzaW5nIGhpcyB0b29sLCB5b3UgY2FuCiAgIGNvbnZlcnQgYW55IG1vZGVybiBOZXRzY2FwZSBvciAoZXZlbikgTVNJRSBjZXJ0aWZpY2F0ZSB0byBQRU0tZm9ybWF0LiAgVXNlCiAgIGl0IHdpdGggJ2N1cmwgLUUgPGNlcnRpZmljYXRlOnBhc3N3b3JkPiBodHRwczovL3NpdGUuY29tJy4gIElmIHRoaXMgaXNuJ3QgYQogICBjb29sIGZlYXR1cmUsIHRoZW4gSSBkb24ndCBrbm93IHdoYXQgY29vbCBmZWF0dXJlcyBsb29rIGxpa2UhIDstKQogLSBXb3JraW5nIHNsb3dseSBvbiB0ZWxuZXQgY29ubmVjdGlvbnMuICNkZWZpbmUgVFJZX1RFTE5FVCB0byB0cnkgaXQgb3V0LgogICAoY3VybCAtdSB1c2VyOnBhc3N3ZCAidGVsbmV0Oi8vaG9zdC5jb20vY2F0IC5sb2dpbiIgaXMgb25lIGV4YW1wbGUpIEkgZG8KICAgaGF2ZSBwcm9ibGVtIHRvIGRlZmluZSBob3cgaXQgc2hvdWxkIHdvcmsuIFRoZSBwcmltZSBwdXJwb3NlIGZvciB0aGlzIG11c3QKICAgYmUgdG8gZ2V0ICg4Yml0IGNsZWFuKSBmaWxlcyB2aWEgdGVsbmV0LCBhbmQgaXQgcmVhbGx5IGlzbid0IHRoYXQgZWFzeSB0bwogICBnZXQgZmlsZXMgdGhpcyB3YXkuIFN0aWxsIGhhdmluZyBwcm9ibGVtcyB3aXRoIFxuIGJlaW5nIGNvbnZlcnRlZCB0byBcclxuLgoKIEFuZ3VzIE1hY2theSAoTm92IDEyLCAxOTk4KQogLSBDb3JyZWN0ZWQgYW5vdGhlciBidWcgaW4gdGhlIGxvbmcgcGFyYW1ldGVyIG5hbWUgcGFyc2VyLgogLSBNb2RpZmllZCBnZXRwYXNzLmMgKE5PVEU6IHNlZSB0aGUgc3BlY2lhbCBsaWNlbnNpbmcgaW4gdGhlIHRvcCBvZiB0aGF0CiAgIHNvdXJjZSBmaWxlKS4KCiBEYW5pZWwgU3RlbmJlcmcgKE5vdiAxMiwgMTk5OCkKIC0gV2UgbWF5IGhhdmUgcmVtb3ZlZCB0aGUgc2lsbHkgd2FybmluZ3MgZnJvbSB1cmwuYyB3aGVuIGNvbXBpbGVkIHVuZGVyIElSSVguCiAgIFRoYW5rcyBhZ2FpbiB0byBCam9ybiBSZWVzZSBhbmQgTWFydGluIFN0YWFlbC4KIC0gV3JvdGUgZm9ybWZpbmQucGwgd2hpY2ggaXMgYSBuZXcgcGVybCBzY3JpcHQgaW50ZW5kZWQgdG8gaGVscCB5b3UgZmluZCBvdXQKICAgaG93IGEgRk9STSBzdWJtaXNzaW9uIHNob3VsZCBiZSBkb25lLiBUaGlzIG5lZWRzIGEgbGl0dGxlIG1vcmUgd29yayB0byBnZXQKICAgcmVhbGx5IGdvb2QuCgogRGFuaWVsIFN0ZW5iZXJnIChOb3YgMTEsIDE5OTgpCiAtIE1hZGUgdGhlIEhUVFAgaGVhZGVyLWNoZWNrZXIgYWNjZXB0IHdoaXRlIHNwYWNlcyBiZWZvcmUgdGhlIEhUVFAvMS4/IGxpbmUuCiAgIEFwcGVhcmFudGx5IHNvbWUgcHJveGllcy9zaXRlcyBhZGQgc3VjaCBhdCB0aW1lcyAobXkgdGVzdCBwcm94eSBkaWQgd2hlbiBJCiAgIGRvd25sb2FkZWQgYSBnb3BoZXIgcGFnZSB3aXRoIGl0KSEKIC0gTW92ZWQgdGhlIGZvcm1lciAtaCB0byAtTSBhbmQgbWFkZSAtaCBzaG93IHRoZSBzaG9ydCBoZWxwIHRleHQgaW5zdGVhZC4gSQogICBoYWQgdG8gZW5hYmxlIGEgZm9yY2VkIGhlbHAgdGV4dCBvcHRpb24uIE5vdyBhbiBldmVuIHNob3J0ZXIgaGVscCB0ZXh0IHdpbGwKICAgYmUgcHJlc2VudGVkIHdoZW4gYW4gdW5rbm93biBvcHRpb24gYW5kIHNpbWlsYXIsIGlzIHVzZWQuCiAtIHN0ZGNoZWFkZXJzLmggZGlkbid0IHdvcmsgd2l0aCBJUklYIDYuNCBuYXRpdmUgY2MgY29tcGlsZXIuIEkgaG9wZSBteQogICBjaGFuZ2VzIGRvbid0IG1ha2Ugb3RoZXIgdmVyc2lvbnMgZ28gbnV0cyBpbnN0ZWFkLgoKIERhbmllbCBTdGVuYmVyZyAoTm92IDEwLCAxOTk4KQogLSBBZGRlZCBhIHdlaXJkIGNoZWNrIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIGNoZWNrIGZvciB0aGUgc2lsbHkgQUlYCiAgIHdhcm5pbmdzIGFib3V0IG15ICNkZWZpbmUgc3RyY2FzZWNtcCgpIHN0dWZmLiBJIGRvIHRoYXQgZGVmaW5lIHRvIHByZXZlbnQKICAgbWUgYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyB0byBhY2NpZGVudGFseSB1c2UgdGhhdCBmdW5jdGlvbiBuYW1lIGluc3RlYWQKICAgb2Ygc3RyZXF1YWwoKS4uLgogLSBJIGJ1Z2ZpeGVkIEFuZ3VzJ3MgZ2V0cGFzcy5jIHZlcnkgbGl0dGxlLgogLSBGaXhlZCB0aGUgdmVyYm9zZSBmbGFnIG5hbWVzIHRvIGdldG9wdC1zdHlsZSwgaS5lICdjdXJsIC0tbG9jJyB3aWxsIGJlCiAgIHN1ZmZpY2llbnQgaW5zdGVhZCBvZiAtLWxvY2F0aW9uIGFzICJsb2MiIGlzIGEgdW5pcXVlIHByZWZpeC4gQWxzbywgYW55dGhpbmcKICAgYWZ0ZXIgYSAnLS0nIGlzIHRyZWF0ZWQgYXMgYW4gVVJMLiBTbyBpZiB5b3UgZG8gaGF2ZSBhIGhvc3Qgd2l0aCBhIHdlZWVpcmQKICAgbmFtZSB5b3UgY2FuIGRvICdjdXJsIC0tIC1ob3N0LmNvbScuCiAtIEFub3RoZXIgZ2V0b3B0LWFkanVzdDsgY3VybCBub3cgYWNjZXB0cyBmbGFncyBhZnRlciB0aGUgVVJMIG9uIHRoZSBjb21tYW5kCiAgIGxpbmUuICdjdXJsIHd3dy5mb28uY29tIC1PJyBpcyBwZXJmZWN0bHkgdmFsaWQuCiAtIENvcnJlY3RlZCB0aGUgLmN1cmxyYyBwYXJzZXIgc28gdGhhdCBzdHJ0b2soKSBpcyBubyBsb25nZXIgdXNlZCBhbmQgSQogICBiZWxpZXZlIGl0IHdvcmtzIGJldHRlci4gRXZlbiBVUkxzIGNhbiBiZSBzcGVjaWZpZWQgaW4gaXQgbm93LgoKIEFuZ3VzIE1hY2theSAoTm92IDksIDE5OTgpCiAtIFJlcGxhY2VkIGdldHBhc3MuYyB3aXRoIGEgbmV3bHkgd3JpdHRlbiBvbmUsIG5vdCB1bmRlciBHUEwgbGljZW5zZQogLSBDaGFuZ2VkIE9TIHRvIGEgI2RlZmluZSBpbiBjb25maWcuaCBpbnN0ZWFkIG9mIGNvbXBpbGVyIGZsYWcKIC0gTWFrZWZpbGUgbm93IHVzZXMgLURIQVZFX0NPTkZJR19ICgogRGFuaWVsIFN0ZW5iZXJnIChOb3YgOSwgMTk5OCkKIC0gT2ssIEkgZXhwYW5kZWQgdGhlIHRnei10YXJnZXQgdG8gdXBkYXRlIHRoZSB2ZXJzaW9uIHN0cmluZyBvbiBlYWNoIG9jY2F0aW9uCiAgIEkgYnVpbGQgYSByZWxlYXNlIGFyY2hpdmUhCiAtIEkgcmVhY3RlZCBvbiBBbmd1cyBNYWNrYXkncyBpbml0aWF0aXZlIGFuZCByZW1hZGUgdGhlIHBhcmFtZXRlciBwYXJzZXIgdG8KICAgYmUgbW9yZSBnZXRvcHQgY29tcGxpYW50LiBDdXJsIG5vdyBzdXBwb3J0cyAibWVyZ2VkIiBmbGFncyBhcyBpbiAKCWN1cmwgLWxzdiBmdHAuc2l0ZS5jb20KICAgRG8gbm90ZSB0aGF0IEkgaGFkIHRvIG1vdmUgdGhyZWUgc2hvcnQtbmFtZXMgb2YgdGhlIG9wdGlvbnMuIFBhcmFtZXRlcnMKICAgdGhhdCBuZWVkcyBhbiBhZGRpdGlvbmFsIHN0cmluZyBzdWNoIGFzIC14IG11c3QgYmUgc3RhbmQtYWxvbmUgb3IgdGhlCiAgIGxhc3QgaW4gYSBtZXJnZWQgc2VxdWVuY2U6CgljdXJsIC1sc3ggbXktcHJveHkgZnRwLnNpdGUuY29tCiAgIGlzIG9rLCBidXQgdXNpbmcgdGhlIGZsYWdzIGluIGEgZGlmZmVyZW50IG9yZGVyIGxpa2UgJy1seHMnIHdvdWxkIGNhdXNlCiAgIHVuZXhwZWN0ZWQgcmVzdWx0cyAoYXMgdGhlICdzJyBvcHRpb24gd291bGQgYmUgc2tpcHBlZCkuCiAtIEkndmUgY2hhbmdlZCB0aGUgaGVhZGVycyBpbiBhbGwgZmlsZXMgdGhhdCBhcmUgc3ViamVjdCB0byB0aGUgTW96UEwKICAgbGljZW5zZSwgYXMgdGhleSBhcmUgc3VwcG9zZWQgdG8gbG9vayBsaWtlIHdoZW4gY29uZm9ybWluZy4KIC0gTWFkZSB0aGUgY29uZmlndXJlIHNjcmlwdCBtYWtlIHRoZSBjb25maWcuaC4gVGhlIGZvcm1lciBjb25maWcuaCBpcyBub3cKICAgc2V0dXAuaC4KIC0gVGhlIFJFU09VUkNFUyBhbmQgVE9ETyBmaWxlcyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGFyY2hpdmUuCgogQW5ndXMgTWFja2F5IChOb3YgNSwgMTk5OCkKIC0gRml4ZWQgZ2V0cGFzcy5jIGFuZCB2YXJpb3VzIGNvbmZpZ3VyZSBzdHVmZgoKIERhbmllbCBTdGVuYmVyZyAoTm92IDMsIDE5OTgpCiAtIFVzZSAtSC8tLWhlYWRlciBmb3IgY3VzdG9tIEhUVFAtaGVhZGVycy4gTGV0cyB5b3UgcGFzcyBvbiB5b3VyIG93bgogICBzcGVjaWZpZWQgaGVhZGVycyB0byB0aGUgcmVtb3RlIHNlcnZlci4gSSB3b3VsZG4ndCByZWNvbW1lbmQgdHJ5aW5nIHRvIHVzZQogICBhIGhlYWRlciB3aXRoIGEgZGVmaW5lZCB1c2FnZSBhY2NvcmRpbmcgdG8gc3RhbmRhcmRzLiBVc2UgdGhpcyBmbGFnIG9uY2UKICAgZm9yIGV2ZXJ5IGN1c3RvbSBoZWFkZXIgeW91IHdhbnQgdG8gYWRkLgogLSBVc2UgLUIvLS1mdHAtYXNjaWkgdG8gZm9yY2UgZnRwIHRvIHVzZSBBU0NJSSBtb2RlIHdoZW4gdHJhbnNmZXJpbmcgZmlsZXMuCiAtIENvcnJlY3RlZCB0aGUgJ2dldGxpbmtzLnBsJyBzY3JpcHQsIEkgYWNjaWRlbnRhbGx5IGxlZnQgbXkgc2lsbHkgcHJveHkKICAgdXNhZ2UgaW4gdGhlcmUhIFNpbmNlIHRoZSBpbnRyb2R1Y3Rpb24gb2YgdGhlIC5jdXJscmMgZmlsZSwgaXQgaXMgZWFzaWVyIHRvCiAgIHdyaXRlIHNjcmlwdHMgdGhhdCB1c2UgY3VybCBzaW5jZSBwcm94aWVzIGFuZCBzdHVmZiBzaG91bGQgYmUgaW4gdGhlCiAgIC5jdXJscmMgZmlsZSBhbnl3YXkuCiAtIEludHJvZHVjaW5nIHRoZSBuZXcgLUYgZmxhZyBmb3IgSFRUUCBQT1NULiBJdCBzdXBwb3J0cyBtdWx0aXBhcnQvZm9ybS1kYXRhCiAgIHdoaWNoIG1lYW5zIGl0IGlzIGdvbm5hIGJlIHBvc3NpYmxlIHRvIHVwbG9hZCBmaWxlcyBldGMgdGhyb3VnaCBIVFRQIFBPU1QuCiAgIFNoaXJheiBLYW5nYSBhc2tlZCBmb3IgdGhlIGZlYXR1cmUgYW5kIG15IGJyb3RoZXIsCiAgIEJq9nJuIFN0ZW5iZXJnIGhlbHBlZCBtZSBkZXNpZ24gdGhlIHVzZXIKICAgaW50ZXJmYWNlIGZvciB0aGlzIGJlYXN0LiAgVGhpcyBmZWF0dXJlIHJlcXVpcmVzIHF1aXRlIHNvbWUgZG9jcywKICAgc2luY2UgaXQgaGFzIHR1cm5lZCBvdXQgbm90IG9ubHkgcXVpdGUgY2FwYWJsZSwgYnV0IGFsc28gY29tcGxpY2F0ZWQhIDotKQogLSBBIG5vdGUgaGVyZSwgc2luY2UgSSd2ZSByZWNlaXZlZCBtYWlsIGFib3V0IGl0LiBTU0xlYXkgdmVyc2lvbnMgcHJpb3IgdG8KICAgMC44IHdpbGwgKm5vdCogd29yayB3aXRoIGN1cmwhCiAtIFdpbCBMYW5nZm9yZCByZXBvcnRlZCBhIGJ1ZyB0aGF0IG9jY3VycmVkIHNpbmNlIGN1cmwKICAgZGlkIG5vdCBwcm9wZXJseSB1c2UgQ1JMRiB3aGVuIGlzc3VpbmcgZnRwIGNvbW1hbmRzLiBJIGZpeGVkIGl0LgogLSBSZWFycmFuZ2VkIHRoZSBvcmRlciBjb25maWcgZmlsZXMgYXJlIHJlYWQuIC5jdXJscmMgaXMgbm93ICphbHdheXMqIHJlYWQKICAgZmlyc3QgYW5kIGJlZm9yZSB0aGUgY29tbWFuZCBsaW5lIGZsYWdzLiAtSyBjb25maWcgZmlsZXMgdGhlbiBhY3QgYXMKICAgYWRkaXRpb25hbCBjb25maWcgaXRlbXMuCiAtIFVzZSAtcSBBUyBUSEUgRklSU1QgT1BUSU9OIHNwZWNpZmllZCB0byBwcmV2ZW50IC5jdXJscmMgZnJvbSBiZWluZyByZWFkLgogLSBZb3UgY2FuIG5vdyBkaXNhYmxlIGEgcHJveHkgYnkgdXNpbmcgLXggIiIuIFVzZWZ1bCBpZiB0aGUgLmN1cmxyYyBmaWxlCiAgIHNwZWNpZmllcyBhIHByb3h5IGFuZCB5b3Ugd2FubmEgZmV0Y2ggc29tZXRoaW5nIHdpdGhvdXQgZ29pbmcgdGhyb3VnaAogICB0aGF0LgogLSBJJ20gdGhpbmtpbmcgb2YgZHJvcHBpbmcgdGhlIC1wIHN1cHBvcnQuIEl0cyByZWFsbHkgbm90IHVzZWZ1bCBzaW5jZSBwb3J0cwogICBjb3VsZCAoYW5kIHNob3VsZD8pIGJlIHNwZWNpZmllZCBhcyA6PHBvcnQ+IGFwcGVuZGVkIG9uIHRoZSBob3N0IG5hbWUKICAgaW5zdGVhZCwgYm90aCBpbiBVUkxzIGFuZCB0byBwcm94eSBob3N0IG5hbWVzLgogLSBNYXJ0aW4gU3RhYWVsIHJlcG9ydHMgY3VybCAtTCBidWdzIHVuZGVyIFdpbmRvd3MgTlQKICAgKHRlc3Qgd2l0aCBVUkwgaHR0cDovL2NvbWUudG8vc2NzZGUpLiBUaGlzIGJ1ZyBpcyBub3QgcHJlc2VudCBpbiB0aGlzCiAgIHZlcnNpb24gYW55bW9yZS4KIC0gQWRkZWQgc3VwcG9ydCBmb3IgdGhlIHdlaXJkIEZUUCBVUkwgdHlwZT0gdGhpbmcuIFlvdSBjYW4gZG93bmxvYWQgYSBmaWxlCiAgIHVzaW5nIEFTQ0lJIHRyYW5zZmVyIGJ5IGFwcGVuZGluZyAiO3R5cGU9QSIgdG8gdGhlIHJpZ2h0IG9mIGl0LiBPdGhlcgogICBhdmFpbGFibGUgdHlwZXMgYXJlIHR5cGU9RCBmb3IgZGlyLWxpc3QgKE5MU1QpIGFuZCB0eXBlPUkgZm9yIGJpbmFyeQogICB0cmFuc2Zlci4gSSBjYW4ndCBzYXkgSSd2ZSBldmVyIHNlZW4gYW55b25lIHVzZSB0aGlzIGtpbmQgb2YgVVJMIHRob3VnaCEKICAgOi0pCiAtIFRyb3kgRW5nZWwgcG9pbnRlZCBvdXQgYSBidWcgaW4gbXkgZ2V0ZW52KCJIT01FIikKICAgdXNhZ2UgZm9yIHdpbjMyIHN5c3RlbXMuIEkgaW50cm9kdWNlIGdldGVudi5jIHRvIGJldHRlciBjb3BlIHdpdGgKICAgdGhpcy4gTXIgRW5nZWwgaGVscHMgbWUgd2l0aCB0aGUgZGV0YWlscyBhcm91bmQgdGhhdC4uLgogLSBBIGxpdHRsZSBub3RlIHRvIG15c2VsZiBhbmQgb3RoZXJzLCBJIHNob3VsZCBtYWtlIHRoZSB3aW4zMi1iaW5hcnkgYnVpbHQKICAgd2l0aCBTU0wgc3VwcG9ydC4uLgogLSBSeWFuIE5lbHNvbiBzZW50IG1lIGNvbW1lbnRzIGFib3V0IGJ1aWxkaW5nIGN1cmwKICAgd2l0aCBTU0wgdW5kZXIgRnJlZUJTRC4gU2VlIHRoZSBNYWtlZmlsZSBmb3IgZGV0YWlscy4gVXNpbmcgdGhlIGNvbmZpZ3VyZQogICBzY3JpcHQsIGl0IHNob3VsZCB3b3JrIGJldHRlciBhbmQgYXV0b21hdGljYWxseSBub3cuLi4KIC0gQ2xlYW5lZCB1cCBpbiB0aGUgcG9ydCBudW1iZXIgbWVzcyBpbiB0aGUgc291cmNlLiBObyBsb25nZXIgc3RvcmVzIGFuZCB1c2VzCiAgIHByb3h5IHBvcnQgbnVtYmVyIHNlcGFyYXRlIGZyb20gbm9ybWFsIHBvcnQgbnVtYmVyLgogLSAnY29uZmlndXJlJyBzY3JpcHQgd29ya2luZy4gQ29uZmlybWVkIGNvbXBpbGVzIG9uOgogICAgSG9zdCAgICAgICAgIFNTTCAgQ29tcGlsZXIKICAgIFN1bk9TIDUuNSAgICBubyAgIGdjYwogICAgU3VuT1MgNS41LjEgIHllcyAgZ2NjCiAgICBTdW5PUyA1LjYgICAgbm8gICBjYyAgKHdpdGggZ2NjLCBpdCBoYXMgdGhlICJnY2MgaW5jbHVkZSBmaWxlcyIgcHJvYmxlbSkKICAgIFN1bk9TIDQuMS4zICBubyAgIGdjYyAod2l0aG91dCBBTlNJIEMgaGVhZGVycykKICAgIFN1bk9TIDQuMS4yICBubyAgIGdjYyAobmF0aXZlIGNvbXBpbGVyIGZhaWxlZCkKICAgIExpbnV4IDIuMC4xOCBubyAgIGdjYwogICAgTGludXggMi4wLjMyIHllcyAgZ2NjCiAgICBMaW51eCAyLjAuMzUgbm8gICBnY2MgKHdpdGggZ2xpYmMpCiAgICBJUklYIDYuMiAgICAgbm8gICBnY2MgKGNjIGNvbXBpbGVzIGdlbmVyYXRlIGEgZmV3IHdhcm5pbmdzKQogICAgSVJJWCA2LjQgICAgIG5vICAgY2MgIChnZW5lcmF0ZWQgd2FybmluZ3MgdGhvdWdoKQogICAgV2luMzIgICAgICAgIG5vICAgQm9ybGFuZAogICAgT1NGNC4wCSBubyAgID8KCiAtIE9vb3BzLiBUaGUgNWJldGEgKGFuZCA0LjEwKSB1bmRlciB3aW4zMiBmYWlsZWQgaWYgdGhlIEhPTUUgdmFyaWFibGUgd2Fzbid0CiAgIHNldC4KIC0gV2hlbiB1c2luZyBhIHByb3h5LCBjdXJsIG5vdyBndWVzc2VzIGFuZCB1c2VzIHRoZSBwcm90b2NvbCBwYXJ0IGluIGNhc2VzCiAgIGxpa2U6CgljdXJsIC14IHByb3h5OjgwIHd3dy5zaXRlLmNvbQogICBQcm94aWVzIG5vcm1hbGx5IGdvIG51dHMgdW5sZXNzIGh0dHA6Ly8gaXMgcHJlcGVuZGVkIHRvIHRoZSBob3N0IG5hbWUsIHNvCiAgIGlmIGN1cmwgaXMgdXNlZCBsaWtlIHRoaXMsIGl0IGd1ZXNzZXMgcHJvdG9jb2wgYW5kIGFwcGVuZHMgdGhlIHByb3RvY29sCiAgIHN0cmluZyBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGUgcHJveHkuIEl0IGFscmVhZHkgZGlkIHRoaXMgd2hlbiB1c2VkCiAgIHdpdGhvdXQgcHJveHkuCiAtIEJldHRlciBwb3J0IHVzYWdlIHdpdGggU1NMIHRocm91Z2ggcHJveHkgbm93LiBJZiB5b3Ugc3BlY2lmaWVkIGEgZGlmZmVyZW50CiAgIGh0dHBzLXBvcnQgd2hlbiBhY2Nlc3NpbmcgdGhyb3VnaCBhIHByb3h5LCBpdCBkaWRuJ3QgdXNlIHRoYXQgbnVtYmVyCiAgIGNvcnJlY3RseS4gSSBhbHNvIHJld3JvdGUgdGhlIGNvZGUgdGhhdCBwYXJzZXMgdGhlIHN0dWZmIHJlYWQgZnJvbSB0aGUKICAgcHJveHkgd2hlbiB5b3Ugd2FubmEgY29ubmVjdCB0aHJvdWdoIGl0IHdpdGggU1NMLgogLSBCam9ybiBSZWVzZSBoZWxwZWQgbWUgd29yayBhcm91bmQgb25lIG9mIHRoZSBjb21waWxlcgogICB3YXJuaW5ncyBvbiBJUklYIG5hdGl2ZSBjYyBjb21waWxlcy4KClZlcnNpb24gNC4xMCAoT2N0IDI2LCAxOTk4KQogRGFuaWVsIFN0ZW5iZXJnCiAtIEpvaG4gQS4gQnJpc3RvciBzdWdnZXN0ZWQgYSBjb25maWcgZmlsZSBzd2l0Y2gsCiAgIGFuZCBzaW5jZSBJJ3ZlIGJlZW4gaGF2aW5nIHRoYXQgaWRlYSBraW5kIG9mIGluIHRoZSBiYWNrZ3JvdW5kIGZvciBhIGxvbmcKICAgdGltZSBJIHJld3JvdGUgdGhlIHBhcmFtZXRlciBwYXJzaW5nIGZ1bmN0aW9uIGEgbGl0dGxlIGFuZCBub3cgSSBpbnRyb2R1Y2UKICAgdGhlIC1LLy0tY29uZmlnIGZsYWcuIEkgYWxzbyBtYWRlIGN1cmwgKmFsd2F5cyogKHVubGVzcyAtSyBpcyB1c2VkKSB0cnkgdG8KICAgbG9hZCB0aGUgLmN1cmxyYyBmaWxlIGZvciBjb21tYW5kIGxpbmUgcGFyYW1ldGVycy4gVGhlIHN5bnRheCBmb3IgdGhlCiAgIGNvbmZpZyBmaWxlIGlzIHRoZSBzdGFuZGFyZCBjb21tYW5kIGxpbmUgYXJndW1lbnQgc3R5bGUuIERldGFpbHMgaW4gJ2N1cmwKICAgLWgnIG9yIHRoZSBSRUFETUUuCiAtIEkgcmVtb3ZlZCB0aGUgLWsgb3B0aW9uLiBLZWVwLWFsaXZlIGlzbid0IHJlYWxseSBhbnl0aGluZyBhbnlvbmUgd291bGQKICAgd2FudCB0byBlbmFibGUgd2l0aCBjdXJsIGFueXdheS4KIC0gTWFydGluIFN0YWFlbCBoZWxwZWQgbWUgYWRkIHRoZSAnaXJpeCcgdGFyZ2V0LiBOb3cKICAgIm1ha2UgaXJpeCIgc2hvdWxkIGJ1aWxkIGN1cmwgc3VjY2Vzc2Z1bGx5IG9uIG5vbi1nY2MgU0dJIG1hY2hpbmVzLgogLSBTaW5nbGUgc3dpdGNoZXMgbm93IHRvZ2dsZSBiZWhhdmlvdXJzLiBJLmUgaWYgeW91IHVzZSAtdiAtdiB0aGUgc2Vjb25kCiAgIHdpbGwgc3dpdGNoIG9mZiB0aGUgdmVyYm9zZSBtb2RlIHRoZSBmaXJzdCBvbmUgZW5hYmxlZC4gVGhpcyBpcyBzbyB0aGF0CiAgIHlvdSBjYW4gZGlzYWJsZSBhIGRlZmF1bHQgc2V0dGluZyBhIC5jdXJscmMgZmlsZSBlbmFibGVzIGV0Yy4KClZlcnNpb24gNC45IChPY3QgNywgMTk5OCkKIERhbmllbCBTdGVuYmVyZwogLSBNYXJ0aW4gU3RhYWVsIHN1Z2dlc3RlZCBjdXJsIHdvdWxkIHN1cHBvcnQgY29va2llcy4KICAgSSBhZGRlZCAtYi8tLWNvb2tpZSB0byBlbmFibGUgZnJlZS10ZXh0IGNvb2tpZSBkYXRhIHRvIGJlIHBhc3NlZC4gVGhlcmUncwogICBhbHNvIGEgbGl0dGxlIGJsdXJiIGFib3V0IGdlbmVyYWwgY29va2llIHN0dWZmIGluIHRoZSBSRUFETUUvaGVscCB0ZXh0LgogLSBkbWggPGRtaCBhdCBqZXQuZXM+IHN1Z2dlc3RlZCBIVFRQIHJlc3VtZSBjYXBhYmlsaXRpZXMuIEFsdGhvdWdoIHlvdSBjb3VsZAogICBtYW51YWxseSBnZXQgY3VybCB0byByZXN1bWUgSFRUUCBkb2N1bWVudHMsIEkgbWFkZSB0aGUgLWMgcmVzdW1lIGZsYWcgd29yawogICBmb3IgSFRUUCB0b28gKHVubGVzcyAtciBpcyB1c2VkIHRvbywgd2hpY2ggd291bGQgYmUgdmVyeSBvZGQgYW55d2F5KS4KIC0gQWRkZWQgY2hlY2tsaW5rcy5wbCB0byB0aGUgYXJjaGl2ZS4gSXQgaXMgYSBzdGlsbCBleHBlcmltZW50YWwgcGVybCBzY3JpcHQKICAgdGhhdCBjaGVja3MgYWxsIGxpbmtzIG9mIGEgd2ViIHBhZ2UgYnkgdXNpbmcgY3VybC4KIC0gUmVhcnJhbmdlZCB0aGUgYXJjaGl2ZSBoaWVyYXJjaHkgYSBsaXR0bGUuIEJ1aWxkIHRoZSBleGVjdXRhYmxlIGluIHRoZQogICBzcmMvIGRpciBmcm9tIG5vdyBvbiEKIC0gVmVyc2lvbiA0LjkgYW5kIGhlcmVhZnRlciwgaXMgbm8gbG9uZ2VyIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwgbGljZW5zZS4KICAgSSBoYXZlIG5vdyB1cGRhdGVkIHRoZSBMRUdBTCBmaWxlIGV0YyBhbmQgbm93IHRoaXMgaXMgcmVsZWFzZWQgdXNpbmcgdGhlCiAgIE1vemlsbGEgUHVibGljIExpY2Vuc2UgdG8gYXZvaWQgdGhlIHBsYWd1ZSBrbm93biBhcyAidGhlIEdQTCB2aXJ1cyIuIFlvdQogICBtdXN0IG1ha2UgdGhlIHNvdXJjZSBhdmFpbGFibGUgaWYgeW91IGRlY2lkZSB0byBjaGFuZ2UgYW5kL29yIHJlZGlzdHJpYnV0ZQogICBjdXJsLCBidXQgaWYgeW91IGRlY2lkZSB0byB1c2UgY3VybCB3aXRoaW4gc29tZXRoaW5nIGVsc2UgeW91IGRvIG5vdCBuZWVkCiAgIHRvIG9mZmVyIHRoZSB3b3JsZCB0aGUgc291cmNlIHRvIHRoYXQgdG9vLgogLSBDdXJsIGRpZCBub3QgbGlrZSBIVFRQIHNlcnZlcnMgdGhhdCBzZW50IG5vIGhlYWRlcnMgYXQgYWxsIG9uIGEgR0VUCiAgIHJlcXVlc3QuICBJdCBpcyBhIHZpb2xhdGlvbiBvZiBSRkMyMDY4IGJ1dCBhcHBlYXJhbnRseSBzb21lIHNlcnZlcnMgZG8KICAgdGhhdCBhbnl3YXkuICBUaGFua3MgdG8gR29yZG9uIEJlYXRvbiBmb3IgdGhlIHJlcG9ydCEKIC0gLUwvLS1sb2NhdGlvbiB3YXMgYWRkZWQgYWZ0ZXIgYSBzdWdnZXN0aW9uIGZyb20gTWFydGluIFN0YWFlbC4gVGhpcyBtYWtlcwogICBjdXJsIEFUVEVNUFQgdG8gZm9sbG93IHRoZSBMb2NhdGlvbjogcmVkaXJlY3QgaWYgb25lIGlzIHByZXNlbnQgaW4gdGhlIEhUVFAKICAgaGVhZGVycy4gSWYgLWkgb3IgLUkgaXMgdXNlZCB3aXRoIHRoaXMgZmxhZywgeW91IHdpbGwgc2VlIGhlYWRlcnMgZnJvbSBhbGwKICAgc2l0ZXMgdGhlIExvY2F0aW9uOiBwb2ludHMgdG8uIERvIG5vdGUgdGhhdCB0aGUgZmlyc3Qgc2VydmVyIGNhbiBwb2ludCB0byBhCiAgIHNlY29uZCB0aGF0IHBvaW50cyB0byBhIHRoaXJkIGV0Yy4gSXQgc2VlbXMgdGhlIExvY2F0aW9uOiBwYXJhbWV0ZXIgKHNhaWQKICAgdG8gYmUgYW4gQWJzb2x1dGVVUkkgaW4gUkZDMjA2OCkgaXNuJ3QgYWx3YXlzIGFic29sdXRlLi4gOi0vIEFueXdheSwgSSd2ZQogICBtYWRlIGN1cmwgQVRURU1QVCB0byBkbyB0aGUgYmVzdCBpdCBjYW4gdG8gZGVhbCB3aXRoIHRoZSByZWFsaXR5LgogLSBBZGRlZCBnZXRsaW5rcy5wbCB0byB0aGUgYXJjaGl2ZS4gZ2V0bGlua3MucGwgc2VsZWN0aXZlbHkgZG93bmxvYWRzCiAgIGZpbGVzIHRoYXQgYSB3ZWIgcGFnZSBsaW5rcyB0by4KClZlcnNpb24gNC44LjQKIERhbmllbCBTdGVuYmVyZwogLSBBcyBKdWxpYW4gUm9tZXJvIE5pZXRvIHJlcG9ydGVkLCBjdXJsIHJlcG9ydGVkIHdyb25nIHZlcnNpb24gbnVtYmVyLgogLSBBcyBUZWVtdSBZbGktRWxzaWxhIHBvaW50ZWQgb3V0LCB0aGUgd2luMzIgdmVyc2lvbiBvZiA0LjggKGFuZCBwcm9iYWJseSBhbGwKICAgb3RoZXIgdmVyc2lvbnMgZm9yIHdpbjMyKSBkaWRuJ3Qgd29yayB3aXRoIGJpbmFyeSBmaWxlcyBzaW5jZSBJJ20gdG9vIHVzZWQKICAgdG8gdGhlIFVOSVggc3R5bGUgZm9wZW4oKSB3aGVyZSBiaW5hcnkgYW5kIHRleHQgZG9uJ3QgZGlmZmVyLi4uCiAtIFJhbHBoIEJlY2ttYW5uIGJyb3VnaHQgbWUgc29tZSBjaGFuZ2VzIHRoYXQgbGV0cyBjdXJsIGNvbXBpbGUgZXJyb3IgYW5kCiAgIHdhcm5pbmcgZnJlZSB3aXRoIC1XYWxsIC1wZWRhbnRpYyB3aXRoIGcrKy4gSSBhbHNvIHRvb2sgdGhlIG9wcG9ydHVuaXR5IHRvCiAgIGNsZWFuIG9mZiBzb21lIHVudXNlZCB2YXJpYWJsZXMgYW5kIHNpbWlsYXIuCiAtIFJhbHBoIEJlY2ttYW5uIG1hZGUgbWUgYXdhcmUgb2YgYSByZWFsbHkgb2RkIGJ1ZyBub3cgY29ycmVjdGVkLiBXaGVuIGN1cmwKICAgcmVhZCBhIHNldCBvZiBoZWFkZXJzIGZyb20gYSBIVFRQIHNlcnZlciwgZGl2aWRlZCBpbnRvIG1vcmUgdGhhbiBvbmUgcmVhZAogICBhbmQgdGhlIGZpcnN0IHJlYWQgc2hvd2VkIGEgZnVsbCBsaW5lICpleGFjdGx5KiAoaS5lIGVuZGluZyB3aXRoIGEKICAgbmV3bGluZSksIGN1cmwgZGlkIG5vdCBiZWhhdmUgd2VsbC4KClZlcnNpb24gNC44LjMKIERhbmllbCBTdGVuYmVyZwogLSBJIHdhcyB0b28gcXVpY2sgdG8gcmVsZWFzZSA0LjguMiB3aXRoIHRvbyBsaXR0bGUgdGVzdGluZy4gT25lIG9mIHRoZQogICBjaGFuZ2VzIGlzIG5vdyByZXZlcnRlZCBzbGlnaHRseSB0byB0aGUgNC44LjEgd2F5IHNpbmNlIDQuOC4yIGNvdWxkbid0CiAgIHVwbG9hZCBmaWxlcy4gSSBzdGlsbCB0aGluayBib3RoIHByb2JsZW1zIGNvcnJlY3RlZCBpbiA0LjguMiByZW1haW4KICAgY29ycmVjdGVkLiAgUmVwb3J0ZWQgYnkgSnVsaWFuIFJvbWVybyBOaWV0by4KClZlcnNpb24gNC44LjIKIERhbmllbCBTdGVuYmVyZwogLSBCZXJuaGFyZCBJc2VsYm9ybiByZXBvcnRlZCB0d28gRlRQIHByb3RvY29sIGVycm9ycyBjdXJsIGRpZC4gVGhleSdyZSBub3cKICAgY29ycmVjdGVkLiBCb3RoIGFwcGVhcmVkIHdoZW4gZ2V0dGluZyBmaWxlcyBmcm9tIGEgTVMgRlRQIHNlcnZlciEgOi0pCgpWZXJzaW9uIDQuOC4xCiBEYW5pZWwgU3RlbmJlcmcKIC0gQWRkZWQgYSBsYXN0IHVwZGF0ZSBvZiB0aGUgcHJvZ3Jlc3MgbWV0ZXIgd2hlbiB0aGUgdHJhbnNmZXIgaXMgZG9uZS4gVGhlCiAgIGZpbmFsIG91dHB1dCBvbiB0aGUgc2NyZWVuIGRpZG4ndCBoYXZlIHRvIGJlIHRoZSBmaW5hbCBzaXplIHRyYW5zZmVyZWQKICAgd2hpY2ggbWFkZSBpdCBzb21ldGltZXMgbG9vayBvZGQuCiAtIFRoYW5rcyB0byBEYXZpZCBMb25nIEkgZ290IHJpZCBvZiBhIHNpbGx5IGJ1ZyB0aGF0IGhhcHBlbmVkIGlmIGEgSFRUUC1wYWdlCiAgIGhhZCBub3RoaW5nIGJ1dCBoZWFkZXIuIEFwcGVhcmFudGx5IFNvbGFyaXMgZGVhbHMgd2l0aCBuZWdhdGl2ZSBzaXplcyBpbgogICBmd3JpdGUoKSBjYWxscyBhIGxvdCBiZXR0ZXIgdGhhbiBMaW51eCBkb2VzLi4uID1CLV0KClZlcnNpb24gNC44CiBEYW5pZWwgU3RlbmJlcmcKIC0gQ29udGludWUgRlRQIGZpbGUgdHJhbnNmZXIuIC1jIGlzIHRoZSBzd2l0Y2guIE5vdGUgdGhhdCB5b3UgbmVlZCB0bwogICBzcGVjaWZ5IGEgZmlsZSBuYW1lIGlmIHlvdSB3YW5uYSByZXN1bWUgYSBkb3dubG9hZCAoeW91IGNhbid0IHJlc3VtZSBhCiAgIGRvd25sb2FkIHNlbnQgdG8gc3Rkb3V0KS4gUmVzdW1pbmcgdXBsb2FkIG1heSBiZSBsaW1pdGVkIGJ5IHRoZSBzZXJ2ZXIKICAgc2luY2UgY3VybCBpcyB0aGVuIHVzaW5nIHRoZSBub24tUkZDOTU5IGNvbW1hbmQgU0laRSB0byBnZXQgdGhlIHNpemUgb2YKICAgdGhlIHRhcmdldCBmaWxlIGJlZm9yZSB1cGxvYWQgYmVnaW5zICh0byBmaWd1cmUgb3V0IHdoaWNoIG9mZnNldCB0bwogICB1c2UpLiBVc2UgLUMgdG8gc3BlY2lmeSB0aGUgb2Zmc2V0IHlvdXJzZWxmISAtQyBpcyBoYW5keSBpZiB5b3UncmUgZG9pbmcKICAgdGhlIG91dHB1dCB0byBzb21ldGhpbmcgZWxzZSBidXQgYSBwbGFpbiBmaWxlIG9yIHdoZW4geW91IGp1c3Qgd2FudCB0byBnZXQKICAgdGhlIGVuZCBvZiBhIGZpbGUuCiAtIHJlY3Vyc2l2ZWZ0cGdldC5wbCBub3cgZmVhdHVyZXMgYSBtYXhpbXVtIHJlY3Vyc2l2ZSBsZXZlbCBhcmd1bWVudC4KClZlcnNpb24gNC43CiBEYW5pZWwgU3RlbmJlcmcKIC0gQWRkZWQgc3VwcG9ydCB0byBhYm9ydCBhIGRvd25sb2FkIGlmIHRoZSBzcGVlZCBpcyBiZWxvdyBhIGNlcnRhaW4gYW1vdW50CiAgIChzcGVlZC1saW1pdCkgYnl0ZXMgcGVyIHNlY29uZCBmb3IgYSBjZXJ0YWluIChzcGVlZC10aW1lKSB0aW1lLgogLSBXcm90ZSBhIHBlcmwgc2NyaXB0ICdyZWN1cnNpdmVmdHBnZXQucGwnIHRvIHJlY3Vyc2l2ZWx5IHVzZSBjdXJsIHRvIGdldCBhCiAgIHdob2xlIGZ0cCBkaXJlY3RvcnkgdHJlZS4gSXQgaXMgbWVhbnQgYXMgYW4gZXhhbXBsZSBvZiBob3cgY3VybCBjYW4gYmUKICAgdXNlZC4gIEkgYWdyZWUgaXQgaXNuJ3QgdGhlIHdpc2VzdCB0aGluZyB0byBkbyB0byBtYWtlIGEgc2VwYXJhdGUgbmV3CiAgIGNvbm5lY3Rpb24gZm9yIGVhY2ggZmlsZSBhbmQgZGlyZWN0b3J5IGZvciB0aGlzLgoKVmVyc2lvbiA0LjYKIERhbmllbCBTdGVuYmVyZwogLSBBZGRlZCBhIGZpcnN0IGF0dGVtcHQgdG8gb3B0aW9uYWxseSBwYXJzZSB0aGUgLm5ldHJjIGZpbGUgZm9yIGxvZ2luIHVzZXIKICAgYW5kIHBhc3N3b3JkLiBJZiB1c2VkIHdpdGggaHR0cCwgaXQgZW5hYmxlcyB1c2VyIGF1dGhlbnRpY2F0aW9uLiAtbiBpcwogICB0aGUgbmV3IHN3aXRjaC4KIC0gUmVtb3ZlZCB0aGUgZXh0cmEgbmV3bGluZXMgb24gdGhlIGRlZmF1bHQgdXNlci1hZ2VudCBzdHJpbmcuCiAtIENvcnJlY3RlZCB0aGUgbWlzc2luZyBmdHAgdXBsb2FkIGVycm9yIG1lc3NhZ2VzIHdoZW4gaXQgZmFpbGVkIHdpdGhvdXQgdGhlCiAgIHZlcmJvc2UgZmxhZyBzZXQuIEdhcnkgVy4gU3dlYXJpbmdlbiBmb3VuZCBpdC4KIC0gTm93IHVzaW5nIGFsYXJtKCkgdG8gZW5hYmxlIHNlY29uZC1wcmVjaXNpb24gdGltZW91dCBldmVuIG9uIHRoZSBuYW1lCiAgIHJlc29sdmluZy9jb25uZWN0aW5nIHBoYXNlLiBUaGUgdGltZW91dCBpcyBhbHRob3VnaCByZXNldCBhZnRlciB0aGF0IGZpcnN0CiAgIHNlcXVlbmNlLiAoVGhpcyBzaG91bGQgYmUgY29ycmVjdGVkLikgR2FyeSBXLiBTd2VhcmluZ2VuIHJlcG9ydGVkLgogLSBOb3cgc3BlbGxzICJVbmtub3duIiBwcm9wZXJseSwgYXMgaW4gIlVua25vd24gb3B0aW9uICd6JyIuLi4gOi0pCiAtIEFkZGVkIGJ1ZyByZXBvcnQgZW1haWwgYWRkcmVzcyBpbiB0aGUgUkVBRE1FLgogLSBBZGRlZCBhICJjdXJyZW50IHNwZWVkIiBmaWVsZCB0byB0aGUgcHJvZ3Jlc3MgbWV0ZXIuIEl0IHNob3dzIHRoZSBhdmVyYWdlCiAgIHNwZWVkIHRoZSBsYXN0IDUgc2Vjb25kcy4gVGhlIG90aGVyIHNwZWVkIGZpZWxkIHNob3dzIHRoZSBhdmVyYWdlIHNwZWVkIG9mCiAgIHRoZSBlbnRpcmUgdHJhbnNmZXIgc28gZmFyLgoKVmVyc2lvbiA0LjUuMQogTGluYXMgVmVwc3RhcwogLSBTU0wgdGhyb3VnaCBwcm94eSBmaXgKIC0gQWRkZWQgLUEgdG8gYWxsb3cgVXNlci1BZ2VudDogY2hhbmdlcwoKIERhbmllbCBTdGVuYmVyZyAKIC0gTWFkZSB0aGUgLUEgd29yayB3aGVuIFNTTC10aHJvdWdoLXByb3h5LgoKVmVyc2lvbiA0LjUKIExpbmFzIFZlcHN0YXMKIC0gTW9yZSBTU0wgY29ycmVjdGlvbnMKIC0gSSd2ZSBhZGRlZCBhIHBvcnQgdG8gQUlYLgogLSBydW5uaW5nIFNTTCB0aHJvdWdoIGEgcHJveHkgY2F1c2VzIGEgY2h1bmsgb2YgY29kZSB0byBiZSBleGVjdXRyZWQgdHdpY2UuCiAgIG9uZSBvZiB0aG9zZSBibG9ja3MgbmVlZHMgdG8gYmUgZGVsZXRlZC4KCiBEYW5pZWwgU3RlbmJlcmcKIC0gTWFkZSAtaSBhbmQgLUkgd29yayBhZ2FpbgoKVmVyc2lvbiA0LjQKIExpbmFzIFZlcHN0YXMKIC0gLXggY2FuIG5vdyBhbHNvIHNwZWNpZnkgcHJveHlwb3J0IHdoZW4gdXNlZCBhcyBpbiAncHJveHlob3N0OnByb3h5cG9ydCcKIC0gU1NMIGZpeGVzCgpWZXJzaW9uIDQuMwogRGFuaWVsIFN0ZW5iZXJnCiAtIEFkanVzdGVkIHRvIGNvbXBpbGUgdW5kZXIgd2luMzIgKFZpc3VhbEMrKyA1KS4gVGhlIC1QIHN3aXRjaCBkb2VzIG5vdAogICBzdXBwb3J0IG5ldHdvcmsgaW50ZXJmYWNlIG5hbWVzIGluIHdpbjMyLiBJIGNvdWxkbid0IGZpZ3VyZSBvdXQgaG93IQoKVmVyc2lvbiA0LjIKIExpbmFzIFZlcHN0YXMgLyBTYW1wbyBLZWxsb21ha2kKIC0gQWRkZWQgU1NMIC8gU1NMZWF5IHN1cHBvcnQgKGh0dHBzOi8vKQogLSBBZGRlZCB0aGUgLVQgdXNhZ2UgZm9yIEhUVFAgUE9TVC4KCiBEYW5pZWwgU3RlbmJlcmcKIC0gQnVnZml4ZWQgdGhlIFNTTCBpbXBsZW1lbnRhdGlvbi4KIC0gTWFkZSAtUCBhIGxvdCBiZXR0ZXIgdG8gdXNlIG90aGVyIElQIGFkZHJlc3Nlcy4gSXQgbm93IGFjY2VwdHMgYSBmb2xsb3dpbmcKICAgcGFyYW1ldGVyIHRoYXQgY2FuIGJlIGVpdGhlcgogICAgICAgIGludGVyZmFjZSAtIGkuZSAiZXRoMCIgdG8gc3BlY2lmeSB3aGljaCBpbnRlcmZhY2UncyBJUCBhZGRyZXNzIHlvdQogICAgICAgICAgICAgICAgICAgIHdhbnQgdG8gdXNlCiAgICAgICAgSVAgYWRkcmVzcyAtIGkuZSAiMTkyLjE2OC4xMC4xIiB0byBzcGVjaWZ5IGV4YWN0IElQIG51bWJlcgogICAgICAgIGhvc3QgbmFtZSAtIGkuZSAibXkuaG9zdC5kb21haW4iIHRvIHNwZWNpZnkgbWFjaGluZQogICAgICAgICItIiAgICAgICAtIChhbnkgc2luZ2xlLWxldHRlciBzdHJpbmcpIHRvIG1ha2UgaXQgcGljayB0aGUgbWFjaGluZSdzCiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdAogLSBUaGUgTWFrZWZpbGUgaXMgbm93IHJlYWR5IHRvIGNvbXBpbGUgZm9yIHNvbGFyaXMsIHN1bm9zNCBhbmQgbGludXggcmlnaHQKICAgb3V0IG9mIHRoZSBib3guCiAtIEJldHRlciBnZW5lcmF0ZWQgdmVyc2lvbiBzdHJpbmcgc2VlbiB3aXRoICdjdXJsIC1WJwoKVmVyc2lvbiA0LjEKIERhbmllbCBTdGVuYmVyZwogLSBUaGUgSVAgbnVtYmVyIHJldHVybmVkIGJ5IHRoZSBmdHAgc2VydmVyIGFzIGEgcmVwbHkgdG8gUEFTViBkb2VzIG5vIGxvbmdlcgogICBoYXZlIHRvIEROUyByZXNvbHZlLiBJbiBmYWN0LCBubyBJUC1udW1iZXItb25seSBhZGRyZXNzZXMgaGF2ZSB0byBhbnltb3JlLgogLSBCaW5kcyBiZXR0ZXIgdG8gYXZhaWxhYmxlIHBvcnQgd2hlbiAtUCBpcyB1c2VkLgogLSBOb3cgTElTVHMgLi8gaW5zdGVhZCBvZiAvIHdoZW4gdXNlZCBhcyBpbiBmdHA6Ly9mdHAuZnVuZXQuZmkvLiBUaGUgcmVhc29uCiAgIGZvciB0aGlzIGlzIHRoYXQgZXhhY3RseSB0aGF0IHNpdGUsIGZ0cC5mdW5ldC5maSwgZG9lcyBub3QgYWxsb3cgTElTVCAvCiAgIHdoaWxlIExJU1QgLi8gaXMgZmluZS4gQW55IG9iamVjdGlvbnM/CgpWZXJzaW9uIDQgKDE5OTgtMDMtMjApCiBEYW5pZWwgU3RlbmJlcmcKIC0gSSB0b29rIGFub3RoZXIgaHVnZSBzdGVwIGFuZCBjaGFuZ2VkIGJvdGggdmVyc2lvbiBudW1iZXIgYW5kIHByb2plY3QgbmFtZSEKICAgVGhlIHJlYXNvbiBmb3IgdGhlIG5ldyBuYW1lIGlzIHRoYXQgdGhlcmUgYXJlIGp1c3Qgb25lIHRvbyBtYW55IHByb2dyYW1zCiAgIG5hbWVkIHVybGdldCBhbHJlYWR5IGFuZCB0aGlzIHByb2dyYW0gYWxyZWFkeSBjYW4gYSBsb3QgbW9yZSB0aGFuIG1lcmVseQogICBnZXR0aW5nIFVSTHMsIGFuZCB0aGUgcmVhc29uIGZvciB0aGUgdmVyc2lvbiBudW1iZXIgaXMgdGhhdCBJIGRpZCBhZGQgdGhlCiAgIHByZXR0eSBiaWcgY2hhbmdlIGluIC1QIGFuZCBzaW5jZSBJIGNoYW5nZWQgbmFtZSBJIHdhbnRlZCB0byBzdGFydCB3aXRoCiAgIHNvbWV0aGluZyBmcmVzaCEKIC0gVGhlIC0tc3R5bGUgZmxhZ3MgYXJlIHdvcmtpbmcgYmV0dGVyIG5vdy4KIC0gTGlzdGluZyBkaXJlY3RvcmllcyB3aXRoIEZUUCBvZnRlbiByZXBvcnRlZCB0aGF0IHRoZSBmaWxlIHRyYW5zZmVyIHdhcwogICBpbmNvbXBsZXRlLiBXcm9uZyBhc3N1bXB0aW9ucyB3ZXJlIHRvbyBjb21tb24gZm9yIGRpcmVjdG9yaWVzLCB3aHkgbm8KICAgc2l6ZSB3aWxsIGJlIGF0dGVtcHRlZCB0byBnZXQgY29tcGFyZWQgb24gdGhlbSBmcm9tIG5vdyBvbi4KIC0gSW1wbGVtZW50ZWQgdGhlIC1QIGZsYWcgdGhhdCBsZXQncyB0aGUgZnRwIGNvbnRyb2wgaXNzdWUgYSBQT1JUIGNvbW1hbmQKICAgaW5zdGVhZCBvZiB0aGUgc3RhbmRhcmQgUEFTVi4KIC0gLWEgZm9yIGFwcGVuZGluZyBGVFAgdXBsb2FkcyB3b3Jrcy4KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKVmVyc2lvbiAzLjEyICgxNCBNYXJjaCAxOTk4KQogRGFuaWVsIFN0ZW5iZXJnCiAtIEVuZC1vZi1oZWFkZXIgdHJhY2tpbmcgc3RpbGwgbGFja2VkIHN1cHBvcnQgZm9yIFxyXG4gb3IganVzdCBcbiBhdCB0aGUKICAgZW5kIG9mIHRoZSBsYXN0IGhlYWRlciBsaW5lLgogU2VyZ2lvIEJhcnJlc2kKIC0gQWRkZWQgUFJPWFkgYXV0aGVudGljYXRpb24uCiBSYWZhZWwgU2FndWxhCiAtIEZpeGVkIHNvbWUgbGl0dGxlIGJ1Z3MuCgpWZXJzaW9uIDMuMTEKIERhbmllbCBTdGVuYmVyZwogLSBUaGUgaGVhZGVyIHBhcnNpbmcgd2FzIHN0aWxsIG5vdCBjb3JyZWN0IHNpbmNlIHRoZSAzLjIgbW9kaWZpY2F0aW9uLi4uCgpWZXJzaW9uIDMuMTAKIERhbmllbCBTdGVuYmVyZwogLSAzLjcgYW5kIDMuOSB3ZXJlIHNpbXVsdGFuZW91c2x5IGRldmVsb3BlZCBhbmQgbWVyZ2VkIGludG8gdGhpcyB2ZXJzaW9uLgogLSBGVFAgdXBsb2FkIGRpZCBub3Qgd29yayBjb3JyZWN0bHkgc2luY2UgMy4yLgoKVmVyc2lvbiAzLjkKIFJhZmFlbCBTYWd1bGEKIC0gQWRkZWQgdGhlICItZSA8dXJsPiAvIC0tcmVmZXJlciA8dXJsPiIgb3B0aW9uIHdoZXJlIHdlIGNhbiBzcGVjaWZ5CiAgIHRoZSByZWZlcmVyIHBhZ2UuIE9idmlvdXNseSwgdGhpcyBpcyBuZWNlc3Nhcnkgb25seSB0byBmb29sIHRoZQogICBzZXJ2ZXIsIGJ1dC4uLgoKVmVyc2lvbiAzLjcKIERhbmllbCBTdGVuYmVyZwogLSBOb3cgY2hlY2tzIHRoZSBsYXN0IGVycm9yIGNvZGUgc2VudCBmcm9tIHRoZSBmdHAgc2VydmVyIGFmdGVyIGEgZmlsZSBoYXMKICAgYmVlbiByZWNlaXZlZCBvciB1cGxvYWRlZC4gV2Fzbid0IGRvbmUgcHJldmlvdXNseS4KIC0gV2hlbiAndXJsZ2V0IDxob3N0PicgaXMgdXNlZCB3aXRob3V0IGEgJ3Byb3RvY29sOi8vJyBmaXJzdCBpbiB0aGUgaG9zdCBwYXJ0LAogICBpdCBub3cgY2hlY2tzIGZvciBob3N0IG5hbWVzIHN0YXJ0aW5nIHdpdGggZnRwIG9yIGdvcGhlciBhbmQgaWYgaXQgZG9lcywKICAgaXQgdXNlcyB0aGF0IHByb3RvY29sIGJ5IGRlZmF1bHQgaW5zdGVhZCBvZiBodHRwLgoKVmVyc2lvbiAzLjYKIERhbmllbCBTdGVuYmVyZwogLSBTaWxseSBtaXN0YWtlIG1hZGUgdGhlIFBPU1QgYnVnLiBUaGlzIGhhcyBub3cgYWxzbyBiZWVuIHRlc3RlZCB0byB3b3JrIHdpdGgKICAgcHJveHkuCgpWZXJzaW9uIDMuNQogRGFuaWVsIFN0ZW5iZXJnCiAtIEhpZ2hseSBpbnNwaXJlZCBieSBSYWZhZWwgU2FndWxhJ3MgY2hhbmdlcyB0byB0aGUgMy4xIHRoYXQgYWRkZWQgYW4gYWxtb3N0CiAgIGZ1bmN0aW9uYWwgUE9TVCwgSSBhcHBsaWVkIGhpcyBjaGFuZ2VzIGludG8gdGhpcyB2ZXJzaW9uIGFuZCBtYWRlIHRoZW0gd29yay4KICAgKEl0IHNlZW1zIFBPU1QgcmVxdWlyZXMgdGhlIENvbnRlbnQtVHlwZSBhbmQgQ29udGVudC1MZW5ndGggaGVhZGVycy4pIEl0IGlzCiAgIG5vdyB1c2FibGUgd2l0aCB0aGUgLWQgc3dpdGNoLgoKVmVyc2lvbiAzLjMgLSAzLjQKIFBhc3NlZCB0byBhdm9pZCBjb25mdXNpb25zCgpWZXJzaW9uIDMuMgogRGFuaWVsIFN0ZW5iZXJnCiAtIE1ham9yIHJld3JpdGUgb2YgdHdvIGNydWNpYWwgcGFydHMgb2YgdGhpcyBjb2RlOiB1cGxvYWQgYW5kIGRvd25sb2FkLgogICBUaGV5IGFyZSBib3RoIG5vdyB1c2luZyBhIHNlbGVjdCgpIHN3aXRjaCwgdGhhdCBhbGxvd3MgbXVjaCBiZXR0ZXIKICAgcHJvZ3Jlc3MgbWV0ZXIgYW5kIHRpbWUgY29udHJvbC4gCiAtIGFsYXJtKCkgdXNhZ2UgcmVtb3ZlZCBjb21wbGV0ZWx5CiAtIEZUUCBnZXQgY2FuIG5vdyBsaXN0IGRpcmVjdG9yeSBjb250ZW50cyBpZiB0aGUgcGF0aCBlbmRzIHdpdGggYSBzbGFzaCAnLycuCiAgIFVybGdldCBvbiBhIGZ0cC1wYXRoIHRoYXQgZG9lc24ndCBlbmQgd2l0aCBhIHNsYXNoIG1lYW5zIHVybGdldCB3aWxsCiAgIGF0dGVtcHQgZ2V0dGluZyBpdCBhcyBhIGZpbGUgbmFtZS4KIC0gRlRQIGRpcmVjdG9yeSB2aWV3IHN1cHBvcnRzIC1sIGZvciAibGlzdC1vbmx5IiB3aGljaCBsaXN0cyB0aGUgZmlsZSBuYW1lcwogICBvbmx5LgogLSBBbGwgb3BlcmF0aW9ucyBzdXBwb3J0IC1tIGZvciBtYXggdGltZSB1c2FnZSBpbiBzZWNvbmRzIGFsbG93ZWQuCiAtIEZUUCB1cGxvYWQgbm93IGFsbG93cyB0aGUgc2l6ZSBvZiB0aGUgdXBsb2FkZWQgZmlsZSB0byBiZSBwcm92aWRlZCwgYW5kCiAgIHRodXMgaXQgY2FuIGJldHRlciBjaGVjayBpdCBhY3R1YWxseSB1cGxvYWRlZCB0aGUgd2hvbGUgZmlsZS4gSXQgYWxzbwogICBtYWtlcyB0aGUgcHJvZ3Jlc3MgbWV0ZXIgZm9yIHVwbG9hZHMgbXVjaCBiZXR0ZXIhCiAtIE1hZGUgdGhlIHBhcmFtZXRlciBwYXJzaW5nIGZhaWwgaW4gY2FzZXMgbGlrZSAndXJsZ2V0IC1yIDkwMCcgd2hpY2gKICAgcHJldmlvdXNseSB0cmllZCB0byBjb25uZWN0IHRvIHRoZSBob3N0IG5hbWVkICc5MDAnLgoKVmVyc2lvbiAzLjEKIEtqZWxsIEVyaWNzb24KIC0gUG9pbnRlZCBvdXQgaG93IHRvIGNvcnJlY3QgdGhlIDMgd2FybmluZ3MgaW4gd2luMzItY29tcGlsZXMuCgogRGFuaWVsIFN0ZW5iZXJnCiAtIFJlbW92ZWQgYWxsIGNhbGxzIHRvIGV4aXQoKS4KIC0gTWFkZSB0aGUgc2hvcnQgaGVscCB0ZXh0IGdldCB3cml0dGVuIHRvIHN0ZG91dCBpbnN0ZWFkIG9mIHN0ZGVyci4KIC0gTWFkZSB0aGlzIGZpbGUgaW5zdGVhZCBvZiBrZWVwaW5nIHRoZXNlIGNvbW1lbnRzIGluIHRoZSBzb3VyY2UuCiAtIE1hZGUgdHdvIGNhbGxiYWNrIGhvb2tzLCB0aGF0IGVuYWJsZSBleHRlcm5hbCBwcm9ncmFtcyB0byB1c2UgdXJsZ2V0KCkKICAgZWFzaWVyIGFuZCB0byBncmFiIHRoZSBvdXRwdXQvb2ZmZXIgdGhlIGlucHV0IGVhc2llci4KIC0gSXQgaXMgZXZpZGVudCB0aGF0IFdpbjMyLWNvbXBpbGVzIGFyZSBwYWluZnVsLiBJIHdhdGNoZWQgdGhlIG91dHB1dCBmcm9tCiAgIHRoZSBCb3JsYW5kIEMrKyB2NSBhbmQgaXQgd2FzIGF3ZnVsLiBKdXN0IGlnbm9yZSBhbGwgdGhvc2Ugd2FybmluZ3MuCgpWZXJzaW9uIDMuMAogRGFuaWVsIFN0ZW5iZXJnCiAtIEFkZGVkIEZUUCB1cGxvYWQgY2FwYWJpbGl0aWVzLiBUaGUgbmFtZSB1cmxnZXQgZ2V0cyBhIGJpdCBzaWxseSBub3cKICAgd2hlbiB3ZSBjYW4gcHV0IHRvby4uLiA9KQogLSBSZXN0cnVjdHVyZWQgdGhlIHNvdXJjZSBxdWl0ZSBhIGxvdC4KICAgQ2hhbmdlZCB0aGUgdXJsZ2V0KCkgaW50ZXJmYWNlLiBUaGlzIHdheSwgd2Ugd2lsbCBzdXJ2aXZlIGNoYW5nZXMgbXVjaAogICBiZXR0ZXIuIE5ldyBmZWF0dXJlcyBjYW4gY29tZSBhbmQgb2xkIGNhbiBiZSByZW1vdmVkIHdpdGhvdXQgdXMgbmVlZGluZwogICB0byBjaGFuZ2UgdGhlIGludGVyZmFjZS4gSSd2ZSB3cml0dGVuIGEgc21hbGwgZXhwbGFuYXRpb24gaW4gdXJsZ2V0LmgKICAgdGhhdCBleHBsYWlucyBpdC4KIC0gTmV3IGZsYWdzIGluY2x1ZGUgLXQsIC1ULCAtTyBhbmQgLWguIFRoZSAtaCB0ZXh0IGlzIGdlbmVyYXRlZCBieSB0aGUgbmV3CiAgIG1raGVscCBzY3JpcHQuCgpWZXJzaW9uIDIuOQogUmVtY28gdmFuIEhvb2ZmCiAtIEFkZGVkIGEgZml4IHRvIG1ha2UgaXQgY29tcGlsZSBzbW9vdGhseSBvbiBBbWlnYSB1c2luZyB0aGUgU0FTL0MKICAgY29tcGlsZXIuCiAgCiBEYW5pZWwgU3RlbmJlcmcKIC0gQmVsaWV2ZSBpdCBvciBub3QsIGJ1dCB0aGUgU1RVUElEIE5vdmVsbCB3ZWIgc2VydmVyIHNlZW1zIHRvIHJlcXVpcmUKICAgdGhhdCB0aGUgSG9zdDoga2V5d29yZCBpcyB1c2VkLCBzbyB3ZWxsIEkgdXNlIGl0IGFuZCBJIChyZS1pbnRyb2R1Y2UpIHRoZQogICB1cmxnZXQgVXNlci1BZ2VudDouIEkgc3RpbGwgaGF2ZSB0byBjaGVjayB0aGF0IHRoaXMgSG9zdDogdXNhZ2Ugd29ya3Mgd2l0aAogICBwcm94aWVzLi4uICdIb3N0OicgaXMgcmVxdWlyZWQgZm9yIEhUVFAvMS4xIEdFVCBhY2NvcmRpbmcgdG8gUkZDMjA2OC4KClZlcnNpb24gMi44CiBSYWZhZWwgU2FndWxhCiAtIHNvbWUgbGl0dGxlIG1vZGlmaWNhdGlvbnMKClZlcnNpb24gMi43CiBEYW5pZWwgU3RlbmJlcmcKIC0gUmVtb3ZlZCB0aGUgLWwgb3B0aW9uIGFuZCBpbnRyb2R1Y2VkIHRoZSAtZiBvcHRpb24gaW5zdGVhZC4gTm93IEknbGwKICAgcmV3cml0ZSB0aGUgZm9ybWVyIC1sIGtsdWRnZSBpbiBhbiBleHRlcm5hbCBzY3JpcHQgdGhhdCdsbCB1c2UgdXJsZ2V0IHRvCiAgIGZldGNoIG11bHRpcGFydCBmaWxlcyBsaWtlIHRoYXQuCiAtICctZicgaXMgaW50cm9kdWNlZCwgaXQgbWVhbnMgRmFpbCB3aXRob3V0IG91dHB1dCBpbiBjYXNlIG9mIEhUVFAgc2VydmVyCiAgIGVycm9ycyAocmV0dXJuIGNvZGUgPj0zMDApLgogLSBBZGRlZCBzdXBwb3J0IGZvciAtciwgcmFuZ2VzLiBTcGVjaWZ5IHdoaWNoIHBhcnQgb2YgYSBkb2N1bWVudCB5b3UgCiAgIHdhbnQsIGFuZCBvbmx5IHRoYXQgcGFydCBpcyByZXR1cm5lZC4gT25seSB3aXRoIEhUVFAvMS4xLXNlcnZlcnMuCiAtIFNwbGl0IHVwIHRoZSBzb3VyY2UgaW4gMyBwYXJ0cy4gTm93IGFsbCBwdXJlIFVSTCBmdW5jdGlvbnMgYXJlIGluCiAgIHVybGdldC5jIGFuZCBzdHVmZiB0aGF0IGRlYWxzIHdpdGggdGhlIHN0YW5kLWFsb25lIHByb2dyYW0gaXMgaW4gbWFpbi5jLgogLSBJIHRvb2sgYSBmZXcgbWludXRlcyBhbmQgd3JvdGUgYW4gZW1icnlvIG9mIGEgUkVBRE1FIGZpbGUgdG8gZXhwbGFpbgogICBhIGZldyB0aGluZ3MuCgpWZXJzaW9uIDIuNgogRGFuaWVsIFN0ZW5iZXJnCiAtIE1hZGUgdGhlIC1sIChsb29wKSB0aGluZyB1c2UgdGhlIG5ldyBDT05GX0ZBSUxPTkVSUk9SIHdoaWNoIG1ha2VzCiAgIHVybGdldCgpIHJldHVybiBlcnJvciBjb2RlIGlmIG5vbi1zdWNjZXNzZnVsLiBJdCBhbHNvIHdvbid0IG91dHB1dCBhbnl0aGluZwogICB0aGVuLiBOb3cgZmluYWxseSByZW1vdmVkIHRoZSBIVFRQIDEuMCBhbmQgZXJyb3IgNDA0IGRlcGVuZGVuY2llcy4KIC0gQWRkZWQgLUkgd2hpY2ggdXNlcyB0aGUgSEVBRCByZXF1ZXN0IHRvIGdldCB0aGUgaGVhZGVyIG9ubHkgZnJvbSBhCiAgIGh0dHAtc2VydmVyLgoKVmVyc2lvbiAyLjUKIFJhZmFlbCBTYWd1bGEKIC0gTWFkZSB0aGUgcHJvZ3Jlc3MgbWV0ZXIgdXNlIEhISDpNTTpTUyBpbnN0ZWFkIG9mIG9ubHkgc2Vjb25kcy4KClZlcnNpb24gMi40CiBEYW5pZWwgU3RlbmJlcmcKIC0gQWRkZWQgcHJvZ3Jlc3MgbWV0ZXIuIEl0IGFwcGVhcnMgd2hlbiBkb3dubG9hZGluZyA+IEJVRkZFUiBTSVpFIGFuZAogICBtdXRlIGlzIG5vdCBzZWxlY3RlZC4gSSBmb3VuZCBvdXQgdGhhdCB3aGVuIGRvd25sb2FkaW5nIGxhcmdlIGZpbGVzIGZyb20KICAgcmVhbGx5IHJlYWxseSBzbG93IHNpdGVzLCBpdCBpcyBkZXNpcmFibGUgdG8ga25vdyB0aGUgc3RhdHVzIG9mIHRoZQogICBkb3dubG9hZC4gRG8gbm90ZSB0aGF0IHNvbWUgZG93bmxvYWRzIGFyZSBkb25lIHVuYXdhcmluZyBvZiB0aGUgc2l6ZSwgd2hpY2gKICAgbWFrZXMgdGhlIHByb2dyZXNzIG1ldGVyIGxlc3MgdGhyaWxsaW5nIDspIElmIHRoZSBvdXRwdXQgaXMgc2VudCB0byBhIHR0eSwKICAgdGhlIHByb2dyZXNzIG1ldGVyIGlzIHNodXQgb2ZmLgogLSBJbmNyZWFzZWQgYnVmZmVyIHNpemUgdXNlZCBmb3IgcmVhZGluZy4KIC0gQWRkZWQgbGVuZ3RoIGNoZWNrcyBpbiB0aGUgdXNlcitwYXNzd2QgcGFyc2luZy4KIC0gTWFkZSBpdCBncm9rIHVzZXIrcGFzc3dkIGZvciBIVFRQIGZldGNoZXMuIFRoZSB0cmljayBpcyB0byBiYXNlNjQKICAgZW5jb2RlIHRoZSB1c2VyK3Bhc3N3ZCBhbmQgc2VuZCBhbiBleHRyYSBoZWFkZXIgbGluZS4gUmVhZCBjaGFwdGVyIDExLjEgaW4KICAgUkZDMjA2OCBmb3IgZGV0YWlscy4gSSBhZGRlZCBpdCB0byBiZSB1c2VkIGp1c3QgbGlrZSB0aGUgZnRwIG9uZS4gIFRvIGdldCBhCiAgIGh0dHAgZG9jdW1lbnQgZnJvbSBhIHBsYWNlIHRoYXQgcmVxdWlyZXMgdXNlciBhbmQgcGFzc3dvcmQsIHVzZSBhbiBVUkwKICAgbGlrZToKCiAgICAgICAgaHR0cDovL3VzZXI6cGFzc3dkQHd3dy5zaXRlLnRvLmxlYWNoL2RvYy5odG1sCgogICBJIGFsc28gYWRkZWQgdGhlIC11IGZsYWcsIHNpbmNlIFdIRU4gVVNJTkcgQSBQUk9YWSBZT1UgQ0FOJ1QgU1BFQ0lGWSBUSEUKICAgVVNFUiBBTkQgUEFTU1dPUkQgV0lUSCBIVFRQIExJS0UgVEhBVC4gVGhlIC11IGZsYWcgd29ya3MgZm9yIGZ0cCB0b28sIGJ1dAogICBub3QgaWYgdXNlZCB3aXRoIHByb3h5LiBUbyBkbyB0aGUgc2FtZSBhcyB0aGUgYWJvdmUgb25lLCB5b3UgY2FuIGludm9rZToKCiAgICAgICAgdXJsZ2V0IC11IHVzZXI6cGFzc3dkIGh0dHA6Ly93d3cuc2l0ZS50by5sZWFjaC9kb2MuaHRtbAoKVmVyc2lvbiAyLjMKIFJhZmFlbCBTYWd1bGEKIC0gQWRkZWQgIi1vIiBvcHRpb24gKG91dHB1dCBmaWxlKQogLSBBZGRlZCBVUkdfSFRUUF9OT1RfRk9VTkQgcmV0dXJuIGNvZGUuCiAgIChEYW5pZWwncyBub3RlOikKICAgUGVyaGFwcyB3ZSBzaG91bGQgZGV0ZWN0IGFsbCBraW5kcyBvZiBlcnJvcnMgYW5kIGluc3RlYWQgb2Ygd3JpdGluZyB0aGF0CiAgIGN1c3RvbSBzdHJpbmcgZm9yIHRoZSBwYXJ0aWN1bGFyIDQwNC1lcnJvciwgdXNlIHRoZSBlcnJvciB0ZXh0IHdlIGFjdHVhbGx5CiAgIGdldCBmcm9tIHRoZSBzZXJ2ZXIuIFNlZSBmdXJ0aGVyIGRldGFpbHMgaW4gUkZDMjA2OCAoSFRUUCAxLjEKICAgZGVmaW5pdGlvbikuIFRoZSBjdXJyZW50IHdheSBhbHNvIHJlbGllcyBvbiBhIEhUVFAvMS4wIHJlcGx5LCB3aGljaCBuZXdlcgogICBzZXJ2ZXJzIG1pZ2h0IG5vdCBkby4KIC0gTG9vcGluZyBtb2RlICgiLWwiIG9wdGlvbikuIEl0J3MgZWFzaWVyIHRvIGdldCB2YXJpb3VzIHNwbGl0IGZpbGVzLgogICAoRGFuaWVsJ3Mgbm90ZTopCiAgIFVzZSBpdCBsaWtlICd1cmxnZXQgLWwgMSBodHRwOi8vZnJvbS50aGlzLnNpdGUvZmlsZSVkLmh0bWwnLCB3aGljaCB3aWxsCiAgIG1ha2UgdXJsZ2V0IHRvIGF0dGVtcHQgdG8gZmV0Y2ggYWxsIGZpbGVzIG5hbWVkIGZpbGUxLmh0bWwsIGZpbGUyLmh0bWwgZXRjCiAgIHVudGlsIG5vIG1vcmUgZmlsZXMgYXJlIGZvdW5kLiBUaGlzIGlzIG9ubHkgYSBtb2RpZmljYXRpb24gb2YgdGhlCiAgIFNUQU5EX0FMT05FIHBhcnQsIG5vdGhpbmcgaW4gdGhlIHVybGdldCgpIGZ1bmN0aW9uIHdhcyBtb2RmaWZpZWQgZm9yIHRoaXMuCiBEYW5pZWwgU3RlbmJlcmcKIC0gQ2hhbmdlZCB0aGUgLWggdG8gYmUgLWkgaW5zdGVhZC4gLWggc2hvdWxkIGJlIHByZXNlcnZlZCB0byBoZWxwIHVzZS4KIC0gQmpvcm4gUmVlc2UgaW5kaWNhdGVkIHRoYXQgQm9ybGFuZCBfbWlnaHRfIHVzZSAnX1dJTjMyJyBpbnN0ZWFkIG9mIHRoZQogICBWQysrIFdJTjMyIGRlZmluZSBhbmQgdGhlcmVmb3JlIEkgYWRkZWQgYSBsaXR0bGUgZml4IGZvciB0aGF0LgoKVmVyc2lvbiAyLjIKIEpvaGFuIEFuZGVyc3NvbgogLSBUaGUgdXJsZ2V0IGZ1bmN0aW9uIGRpZG4ndCBzZXQgdGhlIHBhdGggdG8gdXJsIHdoZW4gdXNpbmcgcHJveHkuCiAtIEZpeGVkIGJ1ZyB3aXRoIElNQyBwcm94eS4gTm93IHVzaW5nIChhbG1vc3QpIGNvbXBsZXRlIEdFVCBjb21tYW5kLgogIAogRGFuaWVsIFN0ZW5iZXJnCiAtIE1hZGUgaXQgY29tcGlsZSBvbiBTb2xhcmlzLiBIYWQgdG8gcmVvcmdhbml6ZSB0aGUgaW5jbHVkZXMgYSBiaXQuCiAgIChzbyBXaW4zMiwgTGludXgsIFN1bk9TIDQgYW5kIFNvbGFyaXMgMiBjb21waWxlIGZpbmUuKQogLSBNYWRlIEpvaGFuJ3Mga2VlcGFsaXZlIGtleXdvcmQgb3B0aW9uYWwgd2l0aCB0aGUgLWsgZmxhZyAoc2luY2UgaXQKICAgbWFrZXMgYSBsb3Qgb2YgdXJsZ2V0cyB0YWtlIGEgbG90IGxvbmdlciB0aW1lKS4KIC0gTWFkZSBhICctaCcgc3dpdGNoIGluIGNhc2UgeW91IHdhbnQgdGhlIEhUVFAtaGVhZGVyIGluIHRoZSBvdXRwdXQuCgpWZXJzaW9uIDIuMQogRGFuaWVsIFN0ZW5iZXJnIGFuZCBLamVsbCBFcmljc29uCiAtIFdpbjMyLWNvbXBpbGFibGUKIC0gTm8gbW9yZSBnbG9iYWwgdmFyaWFibGVzCiAtIE11dGUgb3B0aW9uIChubyBvdXRwdXQgYXQgYWxsIHRvIHN0ZGVycikKIC0gRnVsbCByYW5nZSBvZiByZXR1cm4gY29kZXMgZnJvbSB1cmxnZXQoKSwgd2hpY2ggaXMgbm93IHdyaXR0ZW4gdG8gYmUgYQogICBmdW5jdGlvbiBmb3IgZWFzeS10by11c2UgaW4gW290aGVyXSBwcm9ncmFtcy4KIC0gRGVmaW5lIFNUQU5EX0FMT05FIHRvIGNvbXBpbGUgdGhlIHN0YW5kIGFsb25lIHVybGdldCBwcm9ncmFtCiAtIE5vdyBjb21waWxlcyB3aXRoIGdjYyBvcHRpb25zIC1hbnNpIC1XYWxsIC1wZWRhbnRpYyA7KQoKVmVyc2lvbiAyLjAKIC0gSW50cm9kdWNpbmcgZnRwIEdFVCBzdXBwb3J0LiBUaGUgRlRQIFVSTCB0eXBlIGlzIHJlY29nbml6ZWQgYW5kIHVzZWQuCiAtIFJlbmFtZWQgdGhlIHByb2plY3QgdG8gJ3VybGdldCcuCiAtIFN1cHBvcnRzIHRoZSB1c2VyK3Bhc3N3ZCBpbiB0aGUgRlRQIFVSTCAob3RoZXJ3aXNlIGl0IHRyaWVzIGFub255bW91cwogICBsb2dpbiB3aXRoIGEgd2VpcmQgZW1haWwgYWRkcmVzcyBhcyBwYXNzd29yZCkuCgpWZXJzaW9uIDEuNQogRGFuaWVsIFN0ZW5iZXJnCiAtIFRoZSBza2lwX2hlYWRlcigpIGNyYXAgbWVzc2VkIGl0IHVwIGJpZy10aW1lLiBCeSBzaW1wbHkgcmVtb3ZpbmcgdGhhdAogICBvbmUgd2UgY2FuIGFsbCBvZiBhIHN1ZGRlbiBkb3dubG9hZCBhbnl0aGluZyA7KQogLSBObyBsb25nZXIgcmVxdWlyZXMgYSB0cmFpbGluZyBzbGFzaCBvbiB0aGUgVVJMcy4KIC0gSWYgdGhlIGdpdmVuIFVSTCBpc24ndCBwcmVmaXhlZCB3aXRoICdodHRwOi8vJywgSFRUUCBpcyBhc3N1bWVkIGFuZAogICBnaXZlbiBhIHRyeSEKIC0gJ3ZvaWQgbWFpbigpJyBpcyBoaXN0b3J5LgoKVmVyc2lvbiAxLjQKIERhbmllbCBTdGVuYmVyZwogLSBUaGUgZ29waGVyIHNvdXJjZSB1c2VkIHRoZSBwcGF0aCB2YXJpYWJsZSBpbnN0ZWFkIG9mIHBhdGggd2hpY2ggY291bGQKICAgbGVhZCB0byBkaXNhc3Rlci4KClZlcnNpb24gMS4zCiBEYW5pZWwgU3RlbmJlcmcKIC0gV2VsbCwgSSBhZGRlZCBhIGxhbWUgdGV4dCBhYm91dCB0aGUgdGltZSBpdCB0b29rIHRvIGdldCB0aGUgZGF0YS4gSSBhbHNvCiAgIGZvdWdodCBhZ2FpbnN0IEpvaGFuIHRvIHByZXZlbnQgaGlzIC1mIG9wdGlvbiAodG8gc3BlY2lmeSBhIGZpbGUgbmFtZQogICB0aGF0IHNob3VsZCBiZSB3cml0dGVuIGluc3RlYWQgb2Ygc3Rkb3V0KSEgPSkKIC0gTWFkZSBpdCB3cml0ZSAnY29ubmVjdGlvbiByZWZ1c2VkJyBmb3IgdGhhdCBwYXJ0aWN1bGFyIGNvbm5lY3QoKQogICBwcm9ibGVtLgogLSBSZW51bWJlcmVkIHRoZSB2ZXJzaW9uLiBMZXQncyBub3QgbWFrZSBzaWxseSAxLjAuWCB2ZXJzaW9ucywgdGhpcyBpcwogICBhIHBsYWluIDEuMyBpbnN0ZWFkLgoKVmVyc2lvbiAxLjIKIEpvaGFuIEFuZGVyc3NvbgogLSBEaXNjb3ZlcmVkIGFuZCBmaXhlZCB0aGUgcHJvYmxlbSB3aXRoIGdldHRpbmcgYmluYXJ5IGZpbGVzLiBwdXRzKCkgaXMKICAgbm93IHJlcGxhY2VkIHdpdGggZndyaXRlKCkuIChEYW5pZWwncyBub3RlOiB0aGlzIGFsc28gZml4ZWQgdGhlIGJ1ZmZlcgogICBvdmVyd3JpdGUgcHJvYmxlbSBJIGZvdW5kIGluIHRoZSBwcmV2aW91cyB2ZXJzaW9uLikKCiBSYWZhZWwgU2FndWxhCiAtIExldCAiLXAiIGJlZm9yZSAiLXgiLgoKIERhbmllbCBTdGVuYmVyZwogLSBCdWdmaXhlZCB0aGUgcHJveHkgdXNhZ2UuIEl0IHNob3VsZCAqTk9UKiB1c2Ugbm9yIHN0cmlwIHRoZSBwb3J0IG51bWJlcgogICBmcm9tIHRoZSBVUkwgYnV0IHNpbXBseSBwYXNzIHRoYXQgaW5mb3JtYXRpb24gdG8gdGhlIHByb3h5LiBUaGlzIGFsc28KICAgbWFkZSB0aGUgdXNlci9wYXNzd29yZCBmaWVsZHMgcG9zc2libGUgdG8gdXNlIGluIHByb3h5IFtmdHAtXSBVUkxzLgogICAobGlrZSBpbiBmdHA6Ly91c2VyOnBhc3N3b3JkQGZ0cC5teS5zaXRlOjgwMjEvUkVBRE1FKQoKIEpvaGFuIEFuZGVyc3NvbgogLSBJbXBsZW1lbnRlZCBIVFRQIHByb3h5IHN1cHBvcnQuCiAtIFJlY2VpdmUgYnl0ZSBjb3VudGVyIGFkZGVkLgoKIEJqb3JuIFJlZXNlCiAtIEltcGxlbWVudGVkIFVSTHMgKGFuZCBza2lwcGVkIHRoZSBvbGQgc3ludGF4KS4KIC0gT3V0cHV0IGlzIHdyaXR0ZW4gdG8gc3Rkb3V0LCBzbyB0byBhY2hpZXZlIHRoZSBhYm92ZSBleGFtcGxlLCBkbzoKICAgaHR0cGdldCBodHRwOi8vMTQzLjU0LjEwLjYvaW5mb19sb2dvLmdpZiA+IHRlc3QuZ2lmCgpWZXJzaW9uIDEuMQogRGFuaWVsIFN0ZW5iZXJnCiAtIEFkanVzdGVkIGl0IHNsaWdodGx5IHRvIGFjY2VwdCBuYW1lZCBob3N0cyBvbiB0aGUgY29tbWFuZCBsaW5lLiBXZQogICB3b3VsZG4ndCB3YW5uYSB1c2UgSVAgbnVtYmVycyBmb3IgdGhlIHJlc3Qgb2Ygb3VyIGxpZmVzLCB3b3VsZCB3ZT8KClZlcnNpb24gMS4wCiAgUmFmYWVsIFNhZ3VsYQogIC0gV3JvdGUgdGhlIGluaXRpYWwgaHR0cGdldCwgd2hpY2ggc3RhcnRlZCBhbGwgdGhpcyEK