MjAwMy0wMS0xMSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYyLjAuMTQuCgogICAgICAgICogU2VhcmNoUmVzdWx0SXRlcmF0b3JUYWcgd291bGQgY3Jhc2ggaWYgeW91IGhpdCAicmVsb2FkIi4gIFRoaXMKICAgICAgICB3YXMgYmVjYXVzZSB0aGUgY291bnRlciB3b3VsZCBuZXZlciBnZXQgcmVzZXQgYmV0d2VlbiB0d28KICAgICAgICBjb25zZWN1dGl2ZSByZWZyZXNoZXMsIGFuZCBUb21jYXQgNCBwb29scyB0YWdzLgoKMjAwMy0wMS0xMCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYyLjAuMTMuCgogICAgICAgICogV2VibG9nUGx1Z2luIGFuZCBDYWxlbmRhclRhZyBlbmhhbmNlZCB0byB3b3JrIGV2ZW4gYmV0dGVyCiAgICAgICAgdG9nZXRoZXI6IFdlYmxvZ1BsdWdpbiBzdXBwb3J0cyBub3cgdGhlICdzdGFydERhdGUnIHBhcmFtZXRlciwKICAgICAgICB3aGVyZWFzIENhbGVuZGFyVGFnIHN1cHBvcnRzIGFuICd1cmxmb3JtYXQnIHBhcmFtZXRlci4KCiAgICAgICAgKiBXaWtpQ29udGV4dCBub3cgc3RvcmVzIHRoZSBpbmNvbWluZyBIVFRQIHJlcXVlc3QgYXMgd2VsbC4gIFRoaXMKICAgICAgICBhbGxvd3MgeW91IHRvIHdyaXRlIHBsdWdpbnMgdGhhdCBjYW4gcmVhZCB0aGUgSFRUUCBwYXJhbWV0ZXJzIGFzCiAgICAgICAgd2VsbCwgZm9yIGV4YW1wbGUuICBQbGVhc2Ugc2VlIHRoZSBub3RlIGluCiAgICAgICAgV2lraUNvbnRleHQuZ2V0SHR0cFBhcmFtZXRlcigpLiAKCjIwMDMtMDEtMDggIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBBZGRlZCBDYWxlbmRhclRhZy4gIEl0J3Mgc3RpbGwgaW4gaXRzIHZlcnkgaW5mYW5jeSwgc28gaXQgbWlnaHQKICAgICAgICBub3QgYmUgdmVyeSB1c2VmdWwgdG8gb3RoZXJzLgoKMjAwMy0wMS0wNSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYyLjAuMTIuCgogICAgICAgICogRGlmZi5qc3AgZGlkIG5vdCB1c2UgdGhlIHRlbXBsYXRlRGlyIHByb3BlcnR5IGNvcnJlY3RseS4gIE9vcHMuCiAgICAgICAgUmVwb3J0ZWQgYnkgU3RldmVuIE5vZWxzLCBJIHRoaW5rLgoKICAgICAgICAqIEFkZGVkIEV4cGlyZXMsIExhc3QtTW9kaWZpZWQsIGFuZCBDYWNoZS1Db250cm9sIGhlYWRlcnMgdG8KICAgICAgICBFZGl0LmpzcCByZXNwb25zZXMgLSB0aGlzIHNob3VsZCBhbGxvdyBjZXJ0YWluIHZlcnNpb25zIG9mCiAgICAgICAgSW50ZXJuZXQgRXhwbG9yZXIgdG8gdXNlIFByZXZpZXcgY29ycmVjdGx5LiAgU3VnZ2VzdGVkIGJ5IFJpY2hhcmQKICAgICAgICBEb25raW4uCgogICAgICAgICogSW1wbGVtZW50ZWQgcGFnZSAibG9ja2luZyIuICBXaGVuIHlvdSBub3cgc3RhcnQgdG8gZWRpdCBhIHBhZ2UsCiAgICAgICAgdGhlIHBhZ2UgaXMgbWFya2VkIGFzIGJlaW5nIHVuZGVyIGVkaXRpbmcsIGFuZCB0aGUgbmV4dCBndXkgd2lsbAogICAgICAgIGdldCBhIHdhcm5pbmcgYWJvdXQgdGhhdC4gIFRvIGZhY2lsaXRhdGUgdGhpcywgRWRpdC5qc3Agd2FzCiAgICAgICAgY2hhbmdlZC4gIEFsc28sIGNoZWNrIG91dCB0aGUgbmV3IHRhZ3MgaW4gIkVkaXRUZW1wbGF0ZS5qc3AiLCBhbmQKICAgICAgICBub3RlIGFsc28gdGhhdCB0aGUgIkNhbmNlbCIgaXMgbm93IGEgYnV0dG9uIGluc3RlYWQgb2YgYSBsaW5rLgogICAgICAgIFN1Z2dlc3RlZCBieSBPbGxpIExvdW5lbGEuCgoyMDAzLTAxLTAzICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogV3JvdGUgc29tZSBuZXcgZG9jdW1lbnRhdGlvbiBpbnRvIHNhbXBsZSB3aWtpcGFnZXMuCgogICAgICAgICogdjIuMC4xMS4KCiAgICAgICAgKiBBbGwgYm9vbGVhbiB0eXBlIHByb3BlcnRpZXMgaW4ganNwd2lraS5wcm9wZXJ0aWVzIHJlY29nbml6ZSBub3cKICAgICAgICAib24iIGFuZCAieWVzIiBhcyAidHJ1ZSIgYXMgd2VsbC4KCiAgICAgICAgKiBJdCBpcyBub3cgcG9zc2libGUgdG8gYWxsb3cgcmF3IEhUTUwgb24gV2lraVBhZ2VzLiAgQmV3YXJlLCB0aGlzCiAgICAgICAgaXMgYSB2ZXJ5IGRhbmdlcm91cyBvcHRpb24sIHNpbmNlIGl0IHdpbGwgYWxsb3cgcGVvcGxlIE9USEVSIFRIQU4KICAgICAgICBUSEUgQURNSU5JU1RSQVRPUiB0byBtYWtlIHdpa2lzIHRoYXQgY2FuIGh1cnQgdXNlcnMuICBSZXF1ZXN0ZWQKICAgICAgICAodmVyeSBsb3VkbHkgYW5kIG1hbnkgdGltZXMgOi0pIGJ5IEFsYWluIFJhdmV0LgoKICAgICAgICAqIHYyLjAuMTAuCgogICAgICAgICogV2VibG9nUGx1Z2luIGNoYW5nZWQgZW50cnkgZm9ybWF0cy4gIEJld2FyZSwgaWYgeW91J3ZlIGJlZW4KICAgICAgICB1c2luZyBpdCBzbyBmYXIuIAoKICAgICAgICAqIFdpa2lQYWdlIG5vdyBpbXBsZW1lbnRzIENsb25lYWJsZS4gIEkgaGF2ZSBubyBpZGVhIHdoeS4KCjIwMDItMTItMjkgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2Mi4wLjkuCgogICAgICAgICogQWRkZWQgcGVybWFsaW5rcyB0byBXZWJsb2dQbHVnaW4uCgogICAgICAgICogSW5kZXhQbHVnaW4gZW5oYW5jZWQgdG8gaGF2ZSBwYXJhbWV0ZXJzICJpbmNsdWRlIiBhbmQgImV4Y2x1ZGUiLAogICAgICAgIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGluY2x1ZGUgb3IgZXhjbHVkZSBwYWdlcyB1c2luZyBzdGFuZGFyZCBnbG9iCiAgICAgICAgd2lsZCBjYXJkIGV4cHJlc3Npb25zICgqLCA/LCBldGMpLgoKMjAwMi0xMi0yOCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYyLjAuOC4KCiAgICAgICAgKiBCdWcgZml4OiBWZXJzaW9uaW5nRmlsZVByb3ZpZGVyIHdvdWxkIG1hbmdsZSBvbGQgdmVyc2lvbnMgb2YgYQogICAgICAgIHBhZ2UgaWYgdGhleSB3ZXJlIGluIFVURi04IGZvcm1hdC4gIFJlcG9ydGVkIGJ5IFRvcnN0ZW4KICAgICAgICBIaWxkZWJyYW5kdC4gCgoyMDAyLTEyLTE4ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjIuMC43LgoKICAgICAgICAqIEFkZGVkIG5ldyB0aXRsZSBiZWF1dGlmaWVyIGNvZGUgZnJvbSBUb3JzdGVuIEhpbGRlYnJhbmR0LiAgSXQncwogICAgICAgIGEgYml0IGRpZmZlcmVudCBmcm9tIHdoYXQgd2UgdXNlZCB0byBoYXZlLCBidXQgaXQgZG9lcyBub3cgbGVzcwogICAgICAgIG1pc3Rha2VzLiAgOi0pLgoKMjAwMi0xMi0xNiAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYyLjAuNiAtIFRoZSBJIFNob3VsZCBSZWFsbHkgQmUgU2xlZXBpbmcgQnV0IExldCdzIFNlZSBJZiBLaWxsZXIKICAgICAgICBDYW4gS2VlcCBVcCBXaXRoIFRoaXMgUGFjZSBXaXRoIEhpcyBEZWJpYW4gUGFja2FnZXMgLXJlbGVhc2UuCgogICAgICAgICogSW5zcGlyYXRpb24gY29udGludWVzLiAgTm93IFJlZmVyZW5jZU1hbmFnZXIgYWxzbyB1bmRlcnN0YW5kcwogICAgICAgIGFib3V0IGF0dGFjaG1lbnRzLCBzbyB0aGV5IGNhbiBub3cgYmUgY3Jvc3MtcmVmZXJlbmNlZCwgYmUgb24KICAgICAgICB1bnVzZWQgb3IgdW5kZWZpbmVkIHBhZ2VzLCBldGMuCgoyMDAyLTEyLTE1ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjIuMC41LgoKICAgICAgICAqIFJlY2VudENoYW5nZXMgbm93IGRpc3BsYXlzIGFsc28gY2hhbmdlZCBhdHRhY2htZW50cy4gIFRoaXMgYWRkZWQKICAgICAgICBzb21lIG5ldyBBUElzIGluIFdpa2lBdHRhY2htZW50UHJvdmlkZXIgYW5kIEF0dGFjaG1lbnRNYW5hZ2VyLgoKICAgICAgICAqIHYyLjAuNC4KCiAgICAgICAgKiBCdWcgZml4OiBSZXN0b3JpbmcgcHJldmlvdXMgdmVyc2lvbnMgZnJvbSBhcmNoaXZlIGRpZCBub3Qgd29yay4KCiAgICAgICAgKiBCdWcgZml4OiBBdHRlbXB0aW5nIHRvIHVwbG9hZCBhIG5vbi1leGlzdGluZyBmaWxlIHdvdWxkIGNhdXNlIGEKICAgICAgICBjcmFzaC4gIFJlcG9ydGVkIGJ5IEFsYWluIFJhdmV0IGFuZCBQYXVsIERvd25lcy4KCjIwMDItMTItMTQgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2Mi4wLjMuCgogICAgICAgICogQnVnIGZpeDogcHJldmlld2luZyBhIG5ldyBwYWdlIHdpdGggYSBmb290bm90ZSB3b3VsZCBjYXVzZSBhCiAgICAgICAgY3Jhc2guIAoKICAgICAgICAqIEFkZGVkIFdpa2lBdHRhY2htZW50cyBwYWdlIHRvIHRoZSBzYW1wbGVwYWdlIGRpc3Ryby4KICAgICAgICAKICAgICAgICAqIFJlZGlyZWN0ZWQgYWxsIHJlZmVyZW5jZXMgdG8gV2lraS5qc3Agb3IgRWRpdC5qc3AgdGhyb3VnaAogICAgICAgIFdpa2lFbmdpbmUgZm9yIGZ1dHVyZSBjb25maWd1cmFiaWxpdHkuICBSZXF1ZXN0ZWQgYnkgQmFydAogICAgICAgIFNlbGRlcnMuCgogICAgICAgICogUnVubmluZyB0ZXN0cyBub3cgcHV0cyB0ZXN0IHBhZ2VzIGludG8gL3RtcC90ZXN0cmVwb3NpdG9yeS4gIFRvbwogICAgICAgIG1hbnkgZmFsc2UgYWxlcnRzIGR1ZSB0byB3cm9uZyBmaWxlcyBpbiAvdG1wLy4uLgoKICAgICAgICAqIHYyLjAuMi4KCiAgICAgICAgKiBCdWcgZml4OiBKU1BXaWtpIG5vIGxvbmdlciBkaWVzIGhvcnJpYmx5IHdpdGggT3V0T2ZNZW1vcnlFcnJvcgogICAgICAgIGlmIHByZWZvcm1hdHRlZCBjb2RlIGJsb2NrcyAoe3t7IH19fSkgYXJlIG5vdCBjbG9zZWQgcHJvcGVybHkuCiAgICAgICAgV2Ugc2ltcGx5IGZvcmdvdCB0byBjaGVjayBmb3IgRU9GIDotKS4gIFJlcG9ydGVkIGJ5IEVyaWsgQnVubi4KCiAgICAgICAgKiBCdWcgZml4OiBDYW1lbENhc2UgaXMgbm8gbG9uZ2VyIHJlY29nbml6ZWQgaW5zaWRlIHt7eyB9fX0KICAgICAgICBibG9ja3MuIFJlcG9ydGVkIGJ5IFRvcnN0ZW4gSGlsZGVicmFuZHQuCgoyMDAyLTEyLTExICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjIuMC4xLgoKICAgICAgICAqIEF0dGFjaG1lbnRzIGFyZSBub3cgc2VudCBiYWNrIHVzaW5nIENvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZQogICAgICAgIGluc3RlYWQgb2YgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudC4gIFRoaXMgbWVhbnMgdGhhdCB0aGV5CiAgICAgICAgc2hvdWxkIG5vdyBiZSBvcGVuZWQgYXV0b21hdGljYWxseSBieSBicm93c2Vycy4gIFN1Z2dlc3RlZCBieQogICAgICAgIFRvcnN0ZW4gSGlsZGVicmFuZHQuCgogICAgICAgICogSW50ZXJ3aWtpIHJlZmVyZW5jZXMgdGhhdCBsZWFkIG91dCBvZiB0aGUgd2lraSBhcmUgbm93IGFsc28KICAgICAgICB0YWdnZWQgd2l0aCB0aGUgb3V0bGluayBpbWFnZS4gIFJlcG9ydGVkIGJ5IEFsYWluIFJhdmV0LgoKICAgICAgICAqIE91dGxpbmsgaW1hZ2VzIGFyZSBub3cgb24gYnkgZGVmYXVsdC4KCjIwMDItMTItMDkgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2Mi4wLjAtYWxwaGEuCgogICAgICAgICogRml4ZWQgV2lraUVuZ2luZS5iZWF1dGlmeVRpdGxlKCkgdG8gd29yayBiZXR0ZXIgd2l0aCBhY3Jvbnltcy4KCiAgICAgICAgKiBNb3ZlZCBHb1JhbmtBZ2dyZWdhdG9yIGFuZCBHb0RpYWdyYW0gcGx1Z2lucyBpbnRvIHRoZWlyIG93biwKICAgICAgICBzZXBhcmF0ZSBwcm9qZWN0LiAKCjIwMDItMTItMDkgIEVyaWsgQnVubiAgPEVyaWsuQnVubkBiYXNlbi5uZXQ+CgogICAgICAgICogdjEuOS41MC4KICAgICAgICAKICAgICAgICAqIEZpeGVkIG51bGwgcmVmZXJlbmNlIGJ1ZyBpbiBBdHRhY2htZW50TWFuYWdlciB3aGVuIG5vCiAgICAgICAgbWFuYWdlciBzcGVjaWZpZWQgaW4ganNwd2lraS5wcm9wZXJ0aWVzLgogICAgICAgIAogICAgICAgICogQWRkZWQgRXJyb3IuanNwLCB3aGljaCBkaXNwbGF5cyB0aGUgbWVzc2FnZSBvZiBhbiAKICAgICAgICBleGNlcHRpb24gdXNpbmcgRGlzcGxheU1lc3NhZ2UuanNwIChpbiB0ZW1wbGF0ZXMpLgogICAgICAgIEFkZGVkIEVycm9yLmpzcCBhcyBlcnJvciBwYWdlIG9mIGFsbCB0b3AgbGV2ZWwganNwJ3MuCgoyMDAyLTEyLTA4ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuOS40OS4KCiAgICAgICAgKiBBbGwgcmVmZXJyYWwgcGx1Z2lucyAoVW51c2VkUGFnZXMsVW5kZWZpbmVkUGFnZXMsIGFuZAogICAgICAgIFJlZmVycmluZ1BhZ2VzUGx1Z2luKSBub3cgc3VwcG9ydCBhIHBhcmFtZXRlciAic2VwYXJhdG9yIiwgd2hpY2gKICAgICAgICBiYXNpY2FsbHkgY29udGFpbnMgdGhlIHdpa2kgbWFya3VwIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gc2VwYXJhdGUKICAgICAgICB0aGUgZW50aXJlcy4gIFN1Z2dlc3RlZCBieSBKZXJlbXkgQ293Z2FyLgoKMjAwMi0xMi0wOCAgRXJpayBCdW5uICA8RXJpay5CdW5uQGJhc2VuLm5ldD4KCiAgICAgICAgKiBNb2RpZmllZCBleGNlcHRpb24gY2xhc3NlcyB0byBpbmhlcml0IFdpa2lFeGNlcHRpb24KICAgICAgICAod2l0aCB0aGUgZXhjZXB0aW9uIG9mIEludGVybmFsV2lraUV4Y2VwdGlvbiA9KS4KICAgICAgICAKICAgICAgICAqIEFkZGVkIFNlY3VyaXR5RXhjZXB0aW9uIGluIHByZXBhcmF0aW9uIGZvciBhdXRoIG1lcmdlLgoKMjAwMi0xMi0wNyAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjkuNDguCgogICAgICAgICogVGlueSBsaXR0bGUgdHdlYWtzIHRvIGF0dGFjaG1lbnRzIGFsbCBhcm91bmQuCgogICAgICAgICogUGFnZUluZm8gaXMgbm93IGF0dGFjaG1lbnQtYXdhcmUsIHNvIHlvdSBjYW4gdmlldyBvbGRlcgogICAgICAgIHZlcnNpb25zLCBldGMuIHVzaW5nIHRoZSBzdGFuZGFyZCBQYWdlSW5mbyBsaW5rLgoKICAgICAgICAqIElmIGFuIGF0dGFjaG1lbnQgaXMgYW4gaW1hZ2UsIHRoZW4gaXQgaXMgYXV0b21hdGljYWxseSBpbmxpbmVkLgoKICAgICAgICAqIEl0IGlzIG5vdyBwb3NzaWJsZSB0byBsaW5rIHRvIGF0dGFjaG1lbnRzIGFzIGlmIHRoZXkgd2VyZSBub3JtYWwKICAgICAgICBXaWtpIHBhZ2VzLiAgRnJvbSB0aGUgcGFnZSBpdHNlbGYsIGp1c3QgdXNlIFthdHRhY2htZW50IG5hbWVdLAogICAgICAgIGZyb20gb3RoZXIgcGFnZXMsIHVzZSBbUGFyZW50UGFnZS9hdHRhY2htZW50IG5hbWVdLgoKICAgICAgICAqIHYxLjkuNDcuCgogICAgICAgICogQ2FtZWxDYXNlIGxpbmtzIG5vdyBmaW5hbGx5IHdvcmsgKG9yIGF0IGxlYXN0IGFsbCB0ZXN0cyBydW4pLgogICAgICAgIFRoYW5rcyB0byBKb29uYXMgSWl2b25lbiBmb3IgaW5zcGlyYXRpb24sIGFuZCBsaXN0ZW5pbmcgbXkKICAgICAgICBpbmNvaGVyZW50IGV4cGxhbmF0aW9uIGFib3V0IHRoZSBwcm9ibGVtLiA6LSkKCiAgICAgICAgKiBMaXN0IGl0ZW1zICgqLCAjKSBhcmUgbm93IGNsb3NlZCBwcm9wZXJseSBhcyBwZXIgWEhUTUwgc3BlYy4KICAgICAgICBXZSBzdGlsbCBoYXZlIHBhcmFncmFwaHMgdG8gZ28sIGJ1dCBvdGhlcndpc2Ugd2UncmUgbmVhcmx5IFhIVE1MCiAgICAgICAgY29tcGxpYW50LiAKCjIwMDItMTItMDYgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS45LjQ2LgoKICAgICAgICAqIE1ham9yIGltcG9ydCBvZiBhbGwgYXR0YWNobWVudHMgY29kZS4gIFRoaXMgdmVyc2lvbiBpcyBhY3R1YWxseQogICAgICAgIGFibGUgdG8gdXBsb2FkL2Rvd25sb2FkIGF0dGFjaG1lbnRzLCBidXQgSSB3b3VsZG4ndCB1c2UgdGhpcyBmb3IKICAgICAgICBhbnkgcmVhbCBwcm9kdWN0aW9uLiAgVGhlIHN0cnVjdHVyZSBtYXkgY2hhbmdlIGFuZCB5b3UgbWF5IGZhY2UgYQogICAgICAgIGRpZmZpY3VsdCBwcm9jZXNzIHRvIG1pZ3JhdGUgeW91ciBvbGQgYXR0YWNobWVudHMgdG8gYSBuZXcKICAgICAgICBzeXN0ZW0uICAKCiAgICAgICAgKiBBZGRlZCBhdHRhY2htZW50X2JpZy5wbmcsIHRoYW5rcyB0byBUZXJvIFRpaXR0YW5lbi4KCiAgICAgICAgKiB2MS45LjQ1LgoKICAgICAgICAqIE1hbnkgY2hhbmdlcyB0byBHb1JhbmtBZ2dyZWdhdG9yLCB3aGljaCB5b3UgcHJvYmFibHkgd29uJ3QgY2FyZQogICAgICAgIGFib3V0LiAKCiAgICAgICAgKiBBZGRlZCBmaXggZm9yIEpCb3NzIGFuZCBwdXJlIFdBUi1maWxlIGRlcGxveW1lbnQgZnJvbSBYeXZpbmQKICAgICAgICBMeGtsaW5nLgoKMjAwMi0xMi0wNSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjkuNDQuCgogICAgICAgICogQ2FtZWxDYXNlIGRldGVjdGlvbiBjaGFuZ2VkIHlldCBhZ2Fpbi4gIEhvd2V2ZXIsIHRoaXMgd2lsbCBzdGlsbAogICAgICAgIGZhaWwgd2hlbiB5b3Ugd3JpdGUgd2lraW1hcmt1cCByaWdodCBuZXh0IHRvIGl0OiBGb3IgZXhhbXBsZQogICAgICAgIF9fQ2FtZWxDYXNlX18gd2lsbCByZXN1bHQgaW50byBzb21ldGhpbmcgdG90YWxseSBzdHJhbmdlLCBtdWNoCiAgICAgICAgbGlrZSAqQ2FtZWxDYXNlIHRvIHN0YXJ0IGEgbGluZS4gIFVzaW5nIHdoaXRlc3BhY2Ugc2hvdWxkIHdvcmssCiAgICAgICAgdGhvdWdoLi4uICBfXyBDYW1lbENhc2UgX18gc2hvdWxkIGJlIHF1aXRlIG9rYXkuCgoyMDAyLTEyLTA0ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuOS40My4KCiAgICAgICAgKiBCdWcgZml4OiBUcmFuc2xhdG9yUmVhZGVyIGRpZCBub3QgcHJvcGVybHkgY2xvc2VkIGRvd24gdGhlIDxpbWc+CiAgICAgICAgLXRhZ3MsIGFzIHBlciBYSFRNTCBzcGVjaWZpY2F0aW9uLiAgTGV0J3Mgc2VlIGhvdyBtYW55IG9sZAogICAgICAgIGJyb3dzZXJzIGJyZWFrIHRoaXMgdGltZS4uLiA6LSkKCiAgICAgICAgKiBCdWcgZml4OiBQcmVmb3JtYXR0ZWQgdGV4dCB3YXMgbm90IHByb3Blcmx5IGNsb3NlZCBkb3duIGlmIHRoZQogICAgICAgIHVzZXIgZm9yZ290IGFsbCBhYm91dCBpdC4gIFJlcG9ydGVkIGJ5IEJvYiBTY2h1bHplLgoKICAgICAgICAqIEJ1ZyBmaXg6IFByZWZvcm1hdHRlZCB0ZXh0ICh7e3spIG5vIGxvbmdlciBhbGxvd3MgeW91IHRvIGlucHV0CiAgICAgICAgSFRNTC4gIFJlcG9ydGVkIGJ5IEJvYiBTY2h1bHplLgoKICAgICAgICAqIE5ldyBvcHRpb246IGpzcHdpa2kudHJhbnNsYXRvclJlYWRlci51c2VPdXRsaW5rSW1hZ2UgYWxsb3dzIHlvdQogICAgICAgIHRvIG1hcmsgYWxsIG91dGdvaW5nIGxpbmtzIHdpdGggYSBzbWFsbCBwaWN0dXJlLiAgVGhhbmtzIHRvIFRlZW11CiAgICAgICAgSGlyc2ltwo7ka2kgZm9yIHByb3ZpZGluZyB3aXRoIHRoZSBpZGVhIGFuZCB0aGUgaW1hZ2UuICBMb29rIGZvcgogICAgICAgIGltYWdlcy9vdXQucG5nLCBpZiB5b3Ugd2FudCB0byBjaGFuZ2UgaXQuCgoyMDAyLTEyLTAxICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogR29SYW5rQWdncmVnYXRvciBub3cgYWxzbyBzdXBwb3J0cyAnZWdmdXJsJyBwYXJhbWV0ZXIsIHdoaWNoCiAgICAgICAgZmV0Y2hlcyBjb3VudHJ5LXNwZWNpZmljIHJhbmtpbmcgZGF0YSBmcm9tIHBlcnNvbnMuICBRdWl0ZQogICAgICAgIGtsdWRnaXNoIGF0IHRoZSBtb21lbnQuCgogICAgICAgICogSG9wZWZ1bGx5IGZpeGVkIEdvUmFua0FnZ3JlZ2F0b3IgdG8gYWxsb3cgbXVsdGlwbGUgcGVyc29ucyBvZgogICAgICAgIHRoZSBzYW1lIHJhbmsuCgoyMDAyLTExLTI5ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogQWRkZWQgR29SYW5rQWdncmVnYXRvci4gIE1vc3Qgb2YgeW91IGRvbid0IHByb2JhYmx5IGNhcmUuICAoSQogICAgICAgIHByb2JhYmx5IHNob3VsZCBtYWtlIHRoZXNlIGEgc2VwYXJhdGUgZGlzdHJpYnV0aW9uIG9yIHNvbWV0aGluZy4pCiAgICAgICAgSSB3b24ndCBldmVuIGJvdGhlciB0byBidW1wIHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgdGhpcyBvbmUuCgoyMDAyLTExLTI2ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuOS40Mi4KCiAgICAgICAgKiBGaXhlZCBhIG5lYXItZmF0YWwgYnVnIGluIFVzZXJQcmVmZXJlbmNlcy5qc3AgLSB3ZSB3cm90ZSB0aGUKICAgICAgICBwYWdlIGNvbnRlbnRzIGludG8gdGhlIHN0cmVhbSBhbmQgdGhlbiBkaWQgYSByZWRpcmVjdC4gIE9vcHMuCgogICAgICAgICogUmFkaWNhbCBjaGFuZ2Ugd2FybmluZzogSWYgeW91IGFyZSBydW5uaW5nIGEgV2lraSB3aXRoIHRoYXQgaGFzCiAgICAgICAgYXV0aGVudGljYXRpb24gdHVybmVkIG9uLCBub3RlIHRoYXQgZnJvbSBub3cgb24gdGhlIHVzZXJuYW1lIHNldAogICAgICAgIGluIFVzZXJQcmVmZXJlbmNlcyBpcyB0aGUgb25lIHRoYXQgZ2V0cyBwdXQgaW4gcGFnZSBjaGFuZ2UKICAgICAgICBoaXN0b3J5LCBub3QgdGhlIG5hbWUgdGhlIHVzZXIgdXNlZCB0byBhdXRoZW50aWNhdGUgaGltc2VsZi4gIFRoaXMKICAgICAgICB3YXMgZG9uZSBzbyB0aGF0IGl0IHdvdWxkIGJlIGVhc2llciB0byBtYWludGFpbiBhIHdpa2kgdGhhdCBoYXMKICAgICAgICBvbmx5IGEgc2luZ2xlIHVzZXJuYW1lL3Bhc3N3b3JkIGNvbWJpbmF0aW9uIGFuZCBzdGlsbCB0cmFjayB0aGUKICAgICAgICB1c2Vycy4gICBJIGJlbGlldmUgdGhpcyBpcyBtb3JlIGluIGxpbmUgd2l0aCBXaWtpTmF0dXJlLgogICAgICAgIAogICAgICAgIFlvdSBjYW4gc3RpbGwgc2VlIHRoZSBuYW1lIHRoZSB1c2VyIHVzZWQgdG8gYXV0aGVudGljYXRlIGluIHRoZQogICAgICAgIGxvZyBmaWxlIHRoYXQgSlNQV2lraSBnZW5lcmF0ZXMuCgogICAgICAgICogdjEuOS40MS4KCiAgICAgICAgKiBGaXhlZCBFZGl0VGVtcGxhdGUuanNwIHRvIHNob3cgdGhlIGxpbmsgdG8gRWRpdFBhZ2VIZWxwIGluIGEKICAgICAgICBtYW5uZXIgY29uc2lzdGVudCB3aXRoIG90aGVyIGVkaXQgbGlua3MuCgogICAgICAgICogRWRpdExpbmtUYWcgd291bGQgY3Jhc2ggaWYgdGhlIHBhZ2UgaXQgd2FzIHJlZmVycmluZyB0byBkaWQgbm90CiAgICAgICAgZXhpc3QuICBSZXBvcnRlZCBieSBUb3JzdGVuIEhpbGRlYnJhbmQuCgogICAgICAgICogRml4ZWQgY2FtZWxjYXNlIHBhdGNoIGZyb20gSmVmZiBQaGlsbGlwcyAtIHRoYW5rcyBKZWZmIQoKMjAwMi0xMS0yNCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjkuNDAuCgogICAgICAgICogSW5zdGVhZCBvZiBkb2luZyBTZXJ2bGV0Q29udGV4dC5nZXRSZWFsUGF0aCgiLyIpIHdlIG5vdyB1c2UgdGhlCiAgICAgICAgU2VydmxldENvbnRleHQgaXRzZWxmIGFzIGFuIHVuaXF1ZSBrZXkgd2hlbiBjcmVhdGluZyBhCiAgICAgICAgV2lraUVuZ2luZS4gIFRoaXMgc2hvdWxkIHJlc29sdmUgcHJvYmxlbXMgd2hlbiBydW5uaW5nIEpTUFdpa2kKICAgICAgICBzdHJhaWdodCBmcm9tIGEgV0FSIGZpbGUuICBSZXBvcnRlZCBieSBPeXZpbmQgTG9la2xpbmcuCgogICAgICAgICogQWRkZWQgcGxlbnR5IG9mIGNvZGUgZm9yIGF0dGFjaG1lbnRzLiAgU3RvcmluZyBhbmQgcmV0cmlldmluZwogICAgICAgIHdvcmtzLCBhcyB3ZWxsIGFzIGxpc3RpbmcuICBIb3dldmVyLCB1cGxvYWRpbmcgc3RpbGwgaGFzIHNvbWUKICAgICAgICBwcm9ibGVtcy4gCgoyMDAyLTExLTIwICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuOS4zOS4KCiAgICAgICAgKiBEaWZmTGluayBub3cgZmFpbHMgZ3JhY2VmdWxseSBpZiBwYWdlIGRvZXMgbm90IGV4aXN0LiAgUmVwb3J0ZWQKICAgICAgICBieSBKZXJlbXkgQy4KICAgICAgICAKICAgICAgICAqIEZpeGVkIH4gLWVzY2FwaW5nIG9mIENhbWVsQ2FzZSBsaW5rcy4KCiAgICAgICAgKiBBZGRlZCBwYXRjaCBmcm9tIEthYmUgUm9iaWNoYXV4IHRvIGZpeCBhIHByb2JsZW0gd2l0aCBvbGRlciBSQ1MKICAgICAgICBwcm9ncmFtcyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZSAteiBmbGFnLgoKICAgICAgICAqIHYxLjkuMzguCgogICAgICAgICogVGhlICImIiB0cmFuc2xhdGlvbiBub3cgb2NjdXJzIF9iZWZvcmVfIG90aGVyIGVudGl0aWVzLCB3aGljaCBubwogICAgICAgIGxvbmdlciBjYXVzZXMgYWxsIHF1b3RlcyB0byBiZSB0cmFuc2Zvcm1lZCBiYWNrIGludG8gIiZxdW90OyIKICAgICAgICB3aGlsZSB5b3UncmUgZWRpdGluZyBhIHBhZ2UuCgogICAgICAgICogSW50ZWdyYXRlZCBjYW1lbGNhc2UgcGF0Y2ggZnJvbSBKZWZmIFBoaWxsaXBzLiAgSXQgaXMgbm93IG5lYXJseQogICAgICAgIHdvcmtpbmcgLSBhIGNvdXBsZSBtb3JlIHRlc3RzIHNob3VsZCBnbyB0aHJvdWdoIGZpcnN0LgoKMjAwMi0xMS0xMSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjkuMzcuCgogICAgICAgICogPEJSLz4gaXMgbm93IDxCUiAvPiwgaW4gb3JkZXIgbm90IHRvIGNvbmZ1c2Ugc29tZSBvbGRlcgogICAgICAgIGJyb3dzZXJzLgoKMjAwMi0xMS0wOSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjkuMzYuCgogICAgICAgICogR29EaWFncmFtIG5vdyB1c2VzIFBORyBpbWFnZXMuICBJdCBhbHNvIG5vdyBob25vcnMgdGhlIGJhc2VVUkwKICAgICAgICBzZXR0aW5nLgoKICAgICAgICAqIFRhYmxlcyBub3cgY2xvc2UgdGhlIDxURD4gdGFnIGNvcnJlY3RseSB3aXRoIDwvVEQ+LCB0aGFua3MgdG8KICAgICAgICB0aGUgbmV3IFRyYW5zbGF0b3JSZWFkZXIgYXJjaGl0ZWN0dXJlLiAgUmVwb3J0ZWQgYnkgQW5kcmVhcwogICAgICAgIFJvemVrLgoKICAgICAgICAqICImIiBpcyBub3cgdHJhbnNsYXRlZCBpbnRvICImYW1wOyIgd2hlbiBlZGl0aW5nLCBzbyB0aGF0IHlvdSBjYW4KICAgICAgICBhY3R1YWxseSBpbnB1dCBIVE1MIGVudGl0aWVzIGFuZCB0aGV5IHN0YXkgbGlrZSB0aGF0IHdoZW4gZ29pbmcKICAgICAgICBpbnRvIHN0b3JhZ2UuICBSZXBvcnRlZCBieSBFcmlrIEJ1bm4gYW5kIG90aGVycy4KCiAgICAgICAgKiBUaWxkZSAofikgbm93IGVzY2FwZXMgYmFycyBpbiB0YWJsZXMuCgogICAgICAgICogdjEuOS4zNS4KCiAgICAgICAgKiBHb0RpYWdyYW0gaXMgbm93IGEgYml0IG1vcmUgdG9sZXJhbnQgdG93YXJkcyB0aGUga2luZCBvZiBtYXJrdXAKICAgICAgICBpdCBhY2NlcHRzLgoKICAgICAgICAqIEJ1ZyBmaXg6IGdvZGlhZ3JhbSB3YXMgb2ZmLWJ5LW9uZSB0b3dhcmRzIHRoZSBzaWRlIG9mIHRoZQogICAgICAgIGJvYXJkLiAgUmVwb3J0ZWQgYnkgUGFhdm8gUGlldGFyaWxhLgoKMjAwMi0xMS0wOCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIFdlIG5vdyBvdXRwdXQgPEJSLz4gaW5zdGVhZCBvZiA8QlI+LiAgU2xvd2x5IHdvcmtpbmcgdG93YXJkcwogICAgICAgIGZ1bGwgWEhUTUwgOi0pLgoKICAgICAgICAqIFNldmVyYWwgc21hbGwgYnVnZml4ZXM6IChbWyBub3Qgd29ya2luZywgc2luZ2xlIHsncyBnZXR0aW5nCiAgICAgICAgZGVzdHJveWVkLCBldGMuKQoKICAgICAgICAqIFJlbW92ZWQgY2xlYXI9YWxsIGZyb20gSFIsIGFkZGVkIFxcXCB0byBkbyBhIDxiciBjbGVhcj1hbGw+LiAgSFIKICAgICAgICBsb29rZWQgcXVpdGUgb2RkLgoKICAgICAgICAqICI6IiBhZnRlciB0aGUgZmlyc3Qgbm8gbG9uZ2VyIGJyZWFrcyBkZXNjcmlwdGlvbiBsaXN0cy4gICAgICAgIAoKICAgICAgICAqIHYxLjkuMzQuCgogICAgICAgICogLS0tLSBha2EgSFIgdGFnIG5vdyBhZGRzICdjbGVhcj1hbGwnIGF0dHJpYnV0ZSB0byBhY2NvbW1vZGF0ZQogICAgICAgIGFsaWduZWQgaW1hZ2VzLCBzdWNoIGFzIHRoZSBvbmVzIHByb2R1Y2VkIGJ5IEdvRGlhZ3JhbS4KCiAgICAgICAgKiBHb0RpYWdyYW0gbm93IHdvcmtzLgoKMjAwMi0xMS0wNyAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjkuMzMuCgogICAgICAgICogTmV3IHBsdWdpbjogR29EaWFncmFtLgoKICAgICAgICAqIEEgY291cGxlIG9mIGJ1Z2ZpeGVzOiBzb21lIEVPTCBpc3N1ZXMgaW4gbXVsdGktbGluZSBwbHVnaW5zLgoKMjAwMi0xMS0wNyAgRXJpayBCdW5uICA8RXJpay5CdW5uQG5vc3BhbS5tZW1lY3J5Lm5ldD4KCiAgICAgICAgKiBBZGRlZCBwbHVnaW4gZXhlY3V0aW9uIGRpc2FibGluZywgYW5kIGRpc2FibGVkIAogICAgICAgIHRoZWlyIGV4ZWN1dGlvbiBkdXJpbmcgdGhlIGluaXRpYWwgcmVmZXJlbmNlIG1hbmFnZXIgc2Nhbi4KICAgICAgICBUaGlzIGlzIG1haW5seSBpbXBvcnRhbnQgaW4gd2lraSdzIHdpdGggbG90cyBvZiBjb21wbGV4IGN1c3RvbQogICAgICAgIHBsdWdpbnMuCiAgICAgICAgCjIwMDItMTEtMDcgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS45LjMyLgoKICAgICAgICAqIFRydWUgbXVsdGlsaW5lIHBsdWdpbnMgdGhhdCBubyBsb25nZXIgY29uZmxpY3Qgd2l0aCBXaWtpTWFya3VwCiAgICAgICAgYXJlIG5vdyBhdmFpbGFibGUhICBZYXkhCgogICAgICAgICogTUFKT1IgYnJlYWtkb3duISAgUmV3cm90ZSBwcmFjdGljYWxseSBldmVyeXRoaW5nIGluCiAgICAgICAgVHJhbnNsYXRvclJlYWRlcjogaXQgaXMgbm93IGZ1bGx5IHN0cmVhbS1iYXNlZCBpbnN0ZWFkIG9mCiAgICAgICAgbGluZS1iYXNlZCwgd2hpY2ggbWFrZXMgbWFueSB0aGluZ3MgcXVpdGUgYSBsb3QgZWFzaWVyLiAgSXQgc2hvdWxkCiAgICAgICAgYWxzbyBiZSBxdWl0ZSBhIGxvdCBmYXN0ZXIgdGhhbiBiZWZvcmUuICAKICAgICAgICAKICAgICAgICBDYW1lbENhc2UgbGlua3MgYXJlIFRPVEFMTFkgYnJva2VuIGluIHRoaXMgcmV2aXNpb24sIHNpbmNlIHRoZQogICAgICAgIHN0cmVhbS1iYXNlZCBzeXN0ZW0gbWFrZXMgaXQgYSBiaXQgZGlmZmljdWx0IHRvIHJ1biB0aGUgcmVnZXhwIG9uCiAgICAgICAgdGhlbS4gIFdlJ2xsIHNlZSBob3cgdG8gZ2V0IHRoZW0gYmFjayBydW5uaW5nIGFnYWluLgogICAgICAgIAogICAgICAgIERvIE5PVCB1c2UgdGhpcyByZXZpc2lvbiBmb3IgYW55IHByb2R1Y3Rpb24gd29yay4uLiBXZSBoYXZlIG1hbnkKICAgICAgICB0ZXN0cyB0aGF0IHN0aWxsIGZhaWwhCgoyMDAyLTExLTA2ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuOS4zMS4KCiAgICAgICAgKiBNb3JlIGF0dGFjaG1lbnQgc3VwcG9ydC4gIFN0aWxsIG5vdCBmdW5jdGlvbmFsLCBidXQgYXQgbGVhc3Qgbm93CiAgICAgICAgeW91IGNhbiBzZWUgd2hlcmUgd2UncmUgZ29pbmcuCgogICAgICAgICogRml4ZWQgc3VwcG9ydCBmb3IgbXVsdGlsaW5lIHBsdWdpbnMuCgoyMDAyLTExLTAxICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuOS4zMC4KCiAgICAgICAgKiBUaGUgSU5TRVJUIGlzIG5vIGxvbmdlciByZXF1aXJlZCB0byBzaWduaWZ5IHBsdWdpbnMuICBJdCBpcwogICAgICAgIHJlY29tbWVuZGVkLCBidXQgbm90IHJlcXVpcmVkLiAgVGhpcyBhdCB0aGUgcmVxdWVzdCBvZiBtYW55IHBlb3BsZQogICAgICAgIHdobyBhcmUgdXNpbmcgYW4gaW5zYW5lIGFtb3VudCBvZiBwbHVnaW5zIDotKS4KCiAgICAgICAgKiBOZXcgcGx1Z2luOiBDb3VudGVyLgoKICAgICAgICAqIEFkZGVkIHN1cHBvcnQgdG8gVmFyaWFibGVNYW5hZ2VyIHRvIGRpc3BsYXkgQ29udGV4dCBWYXJpYWJsZXMuCgogICAgICAgICogQWRkZWQgV2lraSBDb250ZXh0IFZhcmlhYmxlcy4gIFRoZXNlIGV4aXN0IHNvbGVseSBpbiB0aGUKICAgICAgICBXaWtpQ29udGV4dCBjbGFzcywgYW5kIGFsbG93IHlvdSB0byBkZWZpbmUgdHJhbnNpZW50IHZhcmlhYmxlcyBvbgogICAgICAgIGEgcGFnZXZpZXcgYmFzaXMuCgogICAgICAgICogQWRkZWQgYSBwYXRjaCB0byBhbGxvdyBtdWx0aWxpbmUgcGx1Z2lucyBmcm9tIGVidS4KICAgICAgICBVbmZvcnR1bmF0ZWx5LCB0aGlzIGRvZXMgbm90IHdvcmsgZnVsbHkgeWV0IC0gbmV3bGluZXMgaW4gdGhlCiAgICAgICAgbWlkZGxlIG9mIGFyZ3VtZW50cyBicmVhayBzdHVmZi4KCjIwMDItMTAtMjkgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS45LjI5LgoKICAgICAgICAqIEFkZGVkIGEgbmV3IHByb3BlcnR5OiAianNwd2lraS5mcm9udFBhZ2UiLiAgVGhpcyBhbGxvd3MgeW91IHRvCiAgICAgICAgZWFzaWx5IGNoYW5nZSB0aGUgZGVmYXVsdCBwYWdlIG5hbWUgZnJvbSAiTWFpbiIgaW50byBzb21ldGhpbmcKICAgICAgICBlbHNlLiAgVGhpcyBpcyBpbXBvcnRhbnQgaWYgeW91J3JlIGRvaW5nIGxvY2FsaXplZCBpbnN0YWxsYXRpb25zLAogICAgICAgIGZvciBleGFtcGxlLgoKMjAwMi0xMC0yMyAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjkuMjguCgogICAgICAgICogSnVzdCBpbmNvcnBvcmF0ZWQgYSBiaXQgbW9yZSBhdHRhY2htZW50IHN0dWZmLiAgQWxzbyBmaXhlZCB0aGUKICAgICAgICBwcm9ibGVtIG9mIEF0dGFjaG1lbnRNYW5hZ2VyIGNvbXBsYWluaW5nIGF0IHN0YXJ0dXAsIGlmIG5vCiAgICAgICAgYXR0YWNobWVudFByb3ZpZGVyIHdhcyBkZWZpbmVkLgoKMjAwMi0wOS0zMCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjkuMjcuCgogICAgICAgICogQ2FtZWxDYXNlIGxpbmtzIGNhbiBub3cgYmUgc3RvcHBlZCBmcm9tIG9jY3VycmluZyBieSBwcmVwZW5kaW5nCiAgICAgICAgaXQgd2l0aCAnficuICB+Q2FtZWxDYXNlIHJlc3VsdHMgaW4gIkNhbWVsQ2FzZSIsIG5vdCBhIGxpbmsgdG8gYQogICAgICAgIHBhZ2UgY2FsbGVkIENhbWVsQ2FzZS4gICd+JyB3aWxsIGZyb20gbm93IG9uIGJlIGEgZ2VuZXJpYyBuZWdhdG9yCiAgICAgICAgdG9vbCBmb3IgYWxsIHNvcnRzIG9mIHB1cnBvc2VzLgoKMjAwMi0wOS0yOSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjkuMjYuCgogICAgICAgICogQWRkZWQgdGhlIGFiaWxpdHkgdG8gcmVzdG9yZSBvbGRlciB2ZXJzaW9ucyBvZiBwYWdlcyByZWxhdGl2ZWx5CiAgICAgICAgdHJpdmlhbGx5LiAgVGhpcyBpcyBkb25lIGJ5IGdvaW5nIHZpZXdpbmcgdGhlIG9sZCB2ZXJzaW9uIHZpYQogICAgICAgIFBhZ2VJbmZvLCB0aGVuIGNsaWNraW5nIG9uICJSZXN0b3JlIHRoaXMgdmVyc2lvbiIuICBZb3UnbGwgYmUKICAgICAgICBwcmVzZW50ZWQgd2l0aCBhIGVkaXQgdmlldyB0byB0aGUgcGFnZS4KICAgICAgICAKICAgICAgICBOb3RlOiB0aGlzIGZhY2lsaXR5IGhhcyBjaGFuZ2VkIHRoZSBkZWZhdWx0IHRlbXBsYXRlLCB0b28sIHNvIGlmCiAgICAgICAgeW91IGhhdmUgbWFkZSB5b3VyIG93biB0ZW1wbGF0ZXMsIHlvdSBwcm9iYWJseSB3YW50IHRvIG1vZGlmeSB0aGVtCiAgICAgICAgdG9vIHRvIGFsbG93IHRoaXMgZmFjaWxpdHkuCgoyMDAyLTA5LTE3ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuOS4yNS4KCiAgICAgICAgKiBWaWV3aW5nIG9mIG9sZCB2ZXJzaW9ucyB3b3VsZCBub3Qgc2hvdyB0aGUgInRoaXMgaXMgdmVyc2lvbiBYWCIKICAgICAgICAtYmFubmVyIGJlY2F1c2Ugb2YgYW4gdW5jbG9zZWQgSlNQIGNvbW1lbnQuICBPb3BzLgoKICAgICAgICAqIFBhZ2VJbmZvIG5vdyBzaG93cyAibm8gdmVyc2lvbnMiIGlmIHRoZXJlIGlzIG5vIHZlcnNpb24gaGlzdG9yeQogICAgICAgIGF2YWlsYWJsZSBpbnN0ZWFkIG9mIGFuIGVtcHR5IHN0cmluZy4KCiAgICAgICAgKiBIaXN0b3J5SXRlcmF0b3JUYWcgd291bGQgZmFpbCBpZiB0aGVyZSB3YXMgbm8gdmVyc2lvbiBoaXN0b3J5CiAgICAgICAgKGxpa2Ugd2hlbiB5b3Ugd2VyZSBtb3ZpbmcgZnJvbSBGaWxlU3lzdGVtUHJvdmlkZXIgdG8KICAgICAgICBSQ1NGaWxlUHJvdmlkZXIpLiAgTm93IGZpeGVkLgoKICAgICAgICAqIENhY2hpbmdQcm92aWRlciBub3cgY2hlY2tzIGlmIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiBpcyBjYWNoZWQsCiAgICAgICAgYW5kIG5vdCBvbmx5IHdoZW4gdGhlIHZlcnNpb24gaXMgbWFya2VkIGFzIGxhdGVzdC4gIENvbWJpbmVkIHdpdGgKICAgICAgICB0aGUgbmV3IHRlbXBsYXRlIHN5c3RlbSwgdGhpcyBidWcgY2F1c2VkIENhY2hpbmdQcm92aWRlciB0bwogICAgICAgIGVmZmVjdGl2ZWx5IGlnbm9yZSBpdHMgb3duIGNhY2hlLgoKICAgICAgICAqIC0tLS0gYWthIEhSIGlzIG5vdyA8SFIgLz4gYXMgcGVyIFhIVE1MIHNwZWMuCgoyMDAyLTA5LTE1ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuOS4yNC4KCiAgICAgICAgKiBFeGNlcHRpb25zIGZyb20gcGx1Z2lucyBpcyBub3cgY2xlYXJseSBzZXBhcmF0ZWQgZnJvbSBXaWtpRW5naW5lCiAgICAgICAgaW50ZXJuYWxzLiAgU3VnZ2VzdGVkIGJ5IE5paWxvIE5ldXZvLgoKMjAwMi0wOS0wOCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIEpTUFdpa2kgcmVwb3NpdG9yeSBzaG91bGQgbm93IGhhdmUgYW5vbnltb3VzIENWUyBhY2Nlc3MuCiAgICAgICAgRXZlcnl0aGluZyBzaG91bGQgbm93IHdvcmsuCgogICAgICAgICogdjEuOS4yMy4KCiAgICAgICAgKiBCdWcgZml4OiBubyBsb25nZXIgY3Jhc2hlcyBpZiBiYXNlVVJMIGlzIG5vdCBkZWZpbmVkLiAgUmVwb3J0ZWQKICAgICAgICBieSBBbGFpbiBSYXZldC4KCiAgICAgICAgKiBGaXhlZCBhIHByb2JsZW0gd2hlbiB0cnlpbmcgdG8gZXNjYXBlICdbJyBjaGFyYWN0ZXIgdXNpbmcgJ1tbJy4KCjIwMDItMDktMDcgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS45LjIyLgoKICAgICAgICAqIFNlYXJjaFJlc3VsdCB1c2VzIG5vdyAiV2lraVBhZ2UiIGluc3RlYWQgb2YgYSBTdHJpbmcgdG8gdGhlIHBhZ2UKICAgICAgICBuYW1lLiAgSGVlZCB0aGlzLCBpZiB5b3UgaGF2ZSB5b3VyIG93biBpbXBsZW1lbnRhdGlvbiBvZiBhCiAgICAgICAgcHJvdmlkZXIuCgogICAgICAgICogVmFyaWFibGVUYWcgbm93IGhhcyBhICJkZWZhdWx0IiBhdHRyaWJ1dGUgd2hpY2ggZ2V0cyBpbnZva2VkIGlmCiAgICAgICAgdGhlIHZhcmlhYmxlIGluIHF1ZXN0aW9uIGRvZXMgbm90IGV4aXN0LgoKICAgICAgICAqIFRoZSB0b3AgcmlnaHQgc2VhcmNoIGJveCBkaWRuJ3Qgd29yayAtIG5vdyBpdCBkb2VzLgoKICAgICAgICAqIFlvdSBjYW4gbm93IGxpbWl0IHRoZSBudW1iZXIgb2YgaGl0cyBhIHNlYXJjaCByZXR1cm5zIC0gc2VlCiAgICAgICAgRmluZENvbnRlbnQuanNwIGFuZCB0aGUgbWF4SXRlbXMgcGFyYW1ldGVyIG9mIFNlYXJjaFJlc3VsdEl0ZXJhdG9yCiAgICAgICAgdGFnLgoKICAgICAgICAqIFNlYXJjaC5qc3AgYWxzbyB0YWdpZmllZC4KCiAgICAgICAgKiBVc2VyUHJlZmVyZW5jZXMgbm93IGRpcmVjdHMgeW91IGJhY2sgdG8gdGhlIHByZWZzIHBhZ2UgaW5zdGVhZAogICAgICAgIG9mIFdpa2kuanNwLgoKICAgICAgICAqIFVzZXJQcmVmZXJlbmNlcyBub3cgY2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBnaXZlbiB1c2VybmFtZSwKICAgICAgICBhbmQgd2lsbCB0dXJuIGl0IGludG8gYSB2YWxpZCBXaWtpTmFtZS4KCiAgICAgICAgKiBVc2VyUHJlZmVyZW5jZXMuanNwIGlzIG5vdyBhbHNvIHRhZ2lmaWVkICh0byBzb21lIGV4dGVudAogICAgICAgIGFueXdheSkgYW5kIHNob3VsZCBub3cgd29yay4KCjIwMDItMDktMDMgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS45LjIxCgogICAgICAgICogQnVnIGZpeDogVHdvIHBsdWdpbnMgb24gdGhlIHNhbWUgbGluZSB3b3VsZCBub3QgYWx3YXlzIHdvcmsgYXMKICAgICAgICBleHBlY3RlZC4gIEkgaGFkIHRvIHJld3JpdGUgdGhlIGVudGlyZQogICAgICAgIFRyYW5zbGF0b3JSZWFkZXIuaW5zZXJ0SHlwZXJMaW5rcygpIG1ldGhvZC4uLiBBcyBhIG5pY2Ugc2lkZQogICAgICAgIGVmZmVjdCwgaXQncyBub3cgbGlrZSBmaXZlIHRpbWVzIGZhc3RlciB0aGFuIGJlZm9yZS4gOi0pCiAgICAgICAgCiAgICAgICAgKiBBZGRlZCBhIHNpbXBsZSBXZWJsb2dQbHVnaW4gYW5kIGFuIGFjY29tcGFueWluZwogICAgICAgIFdlYmxvZ0VudHJ5UGx1Z2luLgoKICAgICAgICAqIEl0IGlzIG5vdyBwb3NzaWJsZSB0byBhZGQganNwd2lraS5wcm9wZXJ0aWVzIHByb3BlcnRpZXMgYXMKICAgICAgICBXaWtpVmFyaWFibGVzLiAKCiAgICAgICAgKiBEb2N1bWVudGVkIFdpa2lWYXJpYWJsZXMuCgoyMDAyLTA5LTAyICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogQWRkZWQgbmV3IHRhZyAiUGx1Z2luIiwgd2hpY2ggYWxsb3dzIHlvdSB0byBydW4gYW55IEpTUFdpa2kKICAgICAgICBwbHVnaW4gZnJvbSBhIEpTUCBwYWdlIGRpcmVjdGx5LgoKICAgICAgICAqIEZpeGVkIHRoZSBsYXN0IGZhaWxpbmcgUkNTRmlsZVByb3ZpZGVyIHRlc3QgY2FzZS4KCjIwMDItMDktMDEgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS45LjIwLgoKICAgICAgICAqIEFkZGVkIGEgbmV3IHZhcmlhYmxlIHN5c3RlbSwgaW5jbHVkaW5nIGFuIGFsbC1uZXcKICAgICAgICBWYXJpYWJsZU1hbmFnZXIuICBGb3IgZXhhbXBsZSwgImFwcGxpY2F0aW9ubmFtZSIgdGFnIHdhcyByZW1vdmVkCiAgICAgICAgYXMgb2Jzb2xldGUuICBZb3UgbWF5IGFkZCB2YXJpYWJsZXMgdXNpbmcgYSBbeyRmb29iYXJ9XSAtbm90YXRpb24KICAgICAgICBvbiB3aWtpIHBhZ2VzLCBhbmQgd2l0aCB0aGUgd2lraTpWYXJpYWJsZSB0YWcgb24gdGhlIEpTUCBwYWdlcy4KICAgICAgICAKICAgICAgICAqIFBhZ2VNb2RpZmllZC5qc3AgYW5kIFByZXZpZXcuanNwIGFyZSBub3cgaW5jbHVkZWQgaW4gdGhlIG5ldwogICAgICAgIHRlbXBsYXRlIHN5c3RlbS4KICAgICAgICAKICAgICAgICAqIFN5c3RlbUluZm8uanNwIGlzIG5vdyByZW1vdmVkLiAgQSBwYWdlIGNhbGxlZCAiU3lzdGVtSW5mbyIgaXMKICAgICAgICB0YWtpbmcgaXRzIHBsYWNlLgoKICAgICAgICAqIENyZWF0aW5nIG5ldyBwYWdlcyBzaG91bGQgd29yayBub3cgYWdhaW4uCiAgICAgICAgCiAgICAgICAgKiBFZGl0LmpzcCBzaG91bGQgbm8gbG9uZ2VyIGNyYXNoLiAgSXQncyBhbHNvIGJlZW4gZGVsZWdhdGVkCiAgICAgICAgcHJvcGVybHkgaW50byBFZGl0VGVtcGxhdGUuanNwLgoKICAgICAgICAqIEFkZGVkIGpzcHdpa2kudGVtcGxhdGVEaXIgcHJvcGVydHkuCgogICAgICAgICogRml4ZWQgUGFnZUluZm8gZGlzcGxheSAtIGl0IG5vdyBhY3R1YWxseSBnZW5lcmF0ZXMgY29ycmVjdAogICAgICAgIGxpbmtzLiAKCiAgICAgICAgKiBGaXhlZCBEaWZmTGlua1RhZyB0byBhY3R1YWxseSBnZW5lcmF0ZSBjb3JyZWN0IGxpbmtzLgoKMjAwMi0wOC0yOSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjkuMTkuCgogICAgICAgICogUGxlbnR5IG9mIGNoYW5nZXMgdG8gdGhlIEpTUCBwYWdlczogY3JlYXRlZCA4IG5ldyB0YWdzLCBzaHVmZmxlZAogICAgICAgIHRoaW5ncyBhcm91bmQuICBFdmVyeXRoaW5nIGlzIHN0aWxsIGJyb2tlbiwgYnV0IGRvYy9UZW1wbGF0ZXMudHh0CiAgICAgICAgc2hvdWxkIGV4cGxhaW4gd2hhdCB3ZSdyZSBhYm91dCB0byBkby4KCjIwMDItMDgtMTkgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS45LjE4LgoKICAgICAgICAqIE1vdmVkIHN0dWZmIGFyb3VuZCwgYXMgcGx1cmFsIGZvcm1zIG9mIHBhZ2UgbmFtZXMgd2VyZSBub3QKICAgICAgICBjb25zaWRlcmVkIHRvIGV4aXN0IGJ5IG1hbnkgb2YgdGhlIGludGVybmFsIHJvdXRpbmVzLCBjb25mdXNpbmcKICAgICAgICBVbmRlZmluZWRQYWdlcyBmb3IgZXhhbXBsZS4gIEZvdW5kIGJ5IExlaWdoIERvZGRzLgoKMjAwMi0wOC0xOCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjkuMTcuCgogICAgICAgICogQWxsIG9mIHRoZSBwYWdlcyBzaG91bGQgbm93IHdvcmsuCgogICAgICAgICogQWRkZWQgVHJhbnNsYXRlIHRhZyBmb3Igd3JpdGluZyBXaWtpIGNvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUKICAgICAgICBwYWdlLgoKICAgICAgICAqIE5vbi1leGlzdGluZyBwYWdlcyB3b3VsZCBjcmFzaCBib3RoIFdpa2kuanNwIGFuZCBFZGl0LmpzcC4gIE5vdwogICAgICAgIGZpeGVkLiAgUmVwb3J0ZWQgYnkgQWxhaW4gUmF2ZXQuCgogICAgICAgICogdjEuOS4xNi4KCiAgICAgICAgKiBWaWV3VGVtcGxhdGUuanNwIGlzIG5vdyBkb25lIHRvdGFsbHkgaW4gdGFncy4KCiAgICAgICAgKiBEaWZmLmpzcCBpcyBub3cgZG9uZSB0b3RhbGx5IGluIHRhZ3MuCgogICAgICAgICogQWRkZWQgbmV3IHRhZ3M6IENoZWNrVmVyc2lvbiwgSW5zZXJ0RGlmZiwgUGFnZUV4aXN0cywKICAgICAgICBQYWdlVmVyc2lvbiwgUGFnZURhdGUuCgoyMDAyLTA4LTE3ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuOS4xNS4KCiAgICAgICAgKiBBZGRlZCBhIGNvdXBsZSBvZiBuZXcgdGFncy4KCiAgICAgICAgKiBNb3ZlZCBhbGwgQ1NTIGZpbGVzIGFuZCBjc3NpbmNsdWRlLmpzIGludG8gdGhlIHRlbXBsYXRlcy9kZWZhdWx0CiAgICAgICAgZGlyZWN0b3J5LgoKICAgICAgICAqIFNwbGl0IEVkaXQuanNwIGFuZCBQYWdlSW5mby5qc3AgaW50byBhIHNjcmlwdGxldCBwYWdlLCBhbmQgYQogICAgICAgIEhUTUwgdGVtcGxhdGUuICBTb21lIHBhZ2VzIHN0aWxsIGRvIG5vdCB3b3JrIHlldC4KCjIwMDItMDgtMTYgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS45LjE0LgoKICAgICAgICAqIE1vdmVkIHRoZSBjdXJyZW50IHZpZXcgdGVtcGxhdGVzIHRvIHRlbXBsYXRlcy9kZWZhdWx0cy4gIFRoaXMKICAgICAgICBwcm9iYWJseSBicm9rZSBxdWl0ZSBhIGxvdCBvZiBzdHVmZi4uLgoKMjAwMi0wOC0wOSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjkuMTMuCgogICAgICAgICogSlNQV2lraSBub3cgd3JpdGVzIGEgYmV0dGVyIHNlcGFyYXRvciB0byBsb2cgd2hlbiBpdCBzdGFydHMgdG8KICAgICAgICBtYWtlIGl0IGVhc2llciB0byBzZWUgbmV3IGxvZyBlbnRpcmVzLiAgU3VnZ2VzdGVkIGJ5IE1pa2FlbAogICAgICAgIEhvbmthbGEuCgoyMDAyLTA4LTAxICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuOS4xMi4KCiAgICAgICAgKiBBZGRlZCBQYWdlSW5mb0xpbmsgdGFnLgoKMjAwMi0wNy0zMSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjkuMTEuCgogICAgICAgICogRXZlbiBtb3JlIEpTUCB0YWdzIGFkZGVkLCBpbmNsdWRpbmcgYSBuZXcgIlBlcm1pc3Npb24iIHRhZy4KCjIwMDItMDctMjUgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS45LjEwLgogICAgICAgIAogICAgICAgICogRm9yZ290IHRvIGNhbGwgbGluayBtdXRhdG9ycyB3aXRoIENhbWVsQ2FzZSBsaW5rcy4gIFRoaXMgY2F1c2VkCiAgICAgICAgQ2FtZWxDYXNlIGxpbmtzIGRpc2FwcGVhcmluZyBmcm9tIHRoaW5ncyBsaWtlICJSZWZlcmVuY2VkIGJ5IgogICAgICAgIC1saXN0LiAgUmVwb3J0ZWQgYnkgQWxhaW4gUmF2ZXQuCgogICAgICAgICogQWRkZWQgJzt0ZXJtOmRlZicgdG8gVGV4dEZvcm1hdHRpbmdSdWxlcyBmb3IgZGVmaW5pdGlvbiBsaXN0cy4KICAgICAgICBUaGlzIGluY2lkZW50YWxseSBhbHNvIGFsbG93cyB5b3UgdG8gbWFrZSBjb21tZW50cyBpbnRvIHNvbWVvbmUKICAgICAgICBlbHNlJ3MgdGV4dCwgaWYgeW91IHVzZSBhbiBlbXB0eSAndGVybScgKDs6PENvbW1lbnQgaGVyZT4pLgoKMjAwMi0wNy0yNCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgogICAgICAgIAogICAgICAgICogdjEuOS45LgoKICAgICAgICAqIE1vdmVkIExlZnRNZW51LCBMZWZ0TWVudUZvb3RlciwgUGFnZUhlYWRlciBpbnRvIHRlbXBsYXRlcy8uCgogICAgICAgICogQWRkZWQgbmV3IFdpa2lQYWdlczogUGFnZUluZGV4LCBFZGl0UGFnZUhlbHAuCgogICAgICAgICogTW92ZWQgRWRpdC5qc3AgZW1iZWRkZWQgaGVscCBpbnRvIGEgV2lraVBhZ2UgY2FsbGVkCiAgICAgICAgIkVkaXRQYWdlSGVscCIuCgogICAgICAgICogQnVnIGZpeDogSW4gcmFyZSBvY2Nhc2lvbnMgVmVyc2lvbmluZ0ZpbGVQcm92aWRlciB3b3VsZCBub3QKICAgICAgICByZXR1cm4gY29ycmVjdCBwYWdlIGluZm9ybWF0aW9uLgoKICAgICAgICAqIE1vcmUgSlNQIHRhZ3MgaW1wbGVtZW50ZWQuCgogICAgICAgICogQWRkZWQgbmV3IHBsdWdpbiAiSW5kZXhQbHVnaW4iLCBieSBBbGFpbiBSYXZldC4KCjIwMDItMDctMjMgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS45LjguIChUaGUgYWZ0ZXJub29uIHZlcnNpb24uKQoKICAgICAgICAqIENoYW5nZWQgdGhlIGRlZmF1bHQgRWRpdC5qc3AgYmFja2dyb3VuZCB0byBzb21ldGhpbmcgZWxzZSwgc2luY2UKICAgICAgICBzbyBtYW55IHBlb3BsZSBhcmUgcnVubmluZyB3aXRoIHRoZSBkZWZhdWx0LiAgSSB0b2xkIHlvdSBpdCB3YXMKICAgICAgICB1Z2x5IC0gSSBhbSBub3Qgc3VyZSB0aGUgbmV3IHZlcnNpb24gaXMgYW55IGJldHRlciA6LSkuCgogICAgICAgICogTW92ZWQgVmlld1RlbXBsYXRlLmpzcCBpbnRvIHRlbXBsYXRlcy8KCiAgICAgICAgKiBBZGRlZCBBdXRob3JUYWcuCgogICAgICAgICogdjEuOS43LgoKICAgICAgICAqIExpbmtzIHRvIGV4aXN0aW5nIHBhZ2VzIGluc2lkZSBpbWFnZSBsaW5rcyBub3cgZ2VuZXJhdGUgYW4KICAgICAgICBhdXRvbWF0aWMgbGluayB0byB0aGF0IHBhZ2UuICBTdWdnZXN0ZWQgYnkgQWxhaW4gUmF2ZXQuCgoyMDAyLTA3LTIyICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuOS42LgoKICAgICAgICAqIFN0YXJ0ZWQgdGhlIChwYWluZnVsKSBtb3ZlIHRvIEpTUCB0YWdzLiAgU2lnaC4gIEkgY291bGRuJ3QKICAgICAgICByZWFsbHkgZmlndXJlIG91dCBhIGJldHRlciB3YXkgLSB1bmZvcnR1bmF0ZWx5IHdlIG5vdyBoYXZlIHRvCiAgICAgICAgc3RhbmQgd2l0aCB0aGUgcGVyZm9ybWFuY2UgcGVuYWx0eSB0aGF0IEpTUCB0YWdzIGdpdmUgdXMuICBUaGlzCiAgICAgICAgaW5jbHVkZXMgbmV3IFdpa2lUYWdCYXNlIGNsYXNzLCB3aGljaCBjb250YWlucyBzb21lIGhlbHBlcnMuCgogICAgICAgICogU3BsaXQgV2lraS5qc3AgaW50byBXaWtpLmpzcCBhbmQgVmlld1RlbXBsYXRlLmpzcC4gIEFsbCBIVE1MCiAgICAgICAgY29kZSBzaG91bGQgZ28gdG8gdGhlIGxhdHRlciBvbmUuCgogICAgICAgICogSW5jb3Jwb3JhdGVkIGZpeCBmcm9tIDEuOC4yOiBVc2VyUHJvZmlsZXMgbWlnaHQgYmUgYnJva2VuIG9uCiAgICAgICAgc29tZSBjb250YWluZXJzLiAgUmVwb3J0ZWQgYnkgS2FsbGUgS2l2aW1hYS4KCiAgICAgICAgKiBJbmNvcnBvcmF0ZWQgZml4IGZyb20gMS44LjI6IG5ldyBwYWdlIGRpZmZzIGFyZSBub3cgc2hvd24KICAgICAgICBwcm9wZXJseS4gIFJlcG9ydGVkIGJ5IE5paWxvIE5ldXZvLgoKMjAwMi0wNy0xMSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjkuNS4KCiAgICAgICAgKiBGaXhlZCBwcm9ibGVtIHdpdGggUlNTIGdlbmVyYXRpbmcgaWxsZWdhbCBYTUwgaW4gY2VydGFpbiBjYXNlcwogICAgICAgICgmIGFuZCA8IHdlcmUgbm90IHRyYW5zbGF0ZWQgdG8gZW50aXRpZXMgcHJvcGVybHkpLgoKICAgICAgICAqIEZpeGVkIHByb2JsZW0gd2l0aCBwbHVnaW4gb3V0cHV0IGdldHRpbmcgdHJhbnNsYXRlZCBieQogICAgICAgIHJlb3JkZXJpbmcgdGhlIHRyYW5zbGF0b3Igcm91dGluZXMuICBUaGlzIG1heSBicmVhayBtYW55IHRoaW5ncywKICAgICAgICBzbyBwbGVhc2UgYmUgY2FyZWZ1bC4gIFJlcG9ydGVkIGJ5IE5paWxvIE5ldXZvLgoKMjAwMi0wNy0wNyAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjkuNC4KCiAgICAgICAgKiBGaXhlZCBwcm9ibGVtIHdpdGggVmVyc2lvbmluZ0ZpbGVQcm92aWRlciBmYWlsaW5nIGlmIHRoZQogICAgICAgIGNvcnJlc3BvbmRpbmcgaGlzdG9yeSBmaWxlIHdhcyBub3QgbG9jYXRlZC4gIFRoaXMgbWlnaHQgaGF2ZSBiZWVuCiAgICAgICAgYW4gaXNzdWUgd2hpbGUgdXBncmFkaW5nIGZyb20gRmlsZVN5c3RlbVByb3ZpZGVyIHRvCiAgICAgICAgVmVyc2lvbmluZ0ZpbGVQcm92aWRlci4KCiAgICAgICAgKiBNb3ZlZCBzb21lIGhlYXZpZXIgc3R1ZmYgZnJvbSB0ZXN0cyB0byBwYWNrYWdlICJzdHJlc3N0ZXN0cyIgdG8KICAgICAgICBtYWtlIHJ1bm5pbmcgdW5pdCB0ZXN0cyBmYXN0ZXIuIAoKMjAwMi0wNy0wNCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjkuMwoKICAgICAgICAqIEZpeGVkIGEgc2VyaW91cyBwcm9ibGVtIHdpdGggQ2FtZWxDYXNlIGxpbmtzIHNjcmV3aW5nIHVwIGlmIHlvdQogICAgICAgIGhhZCBtb3JlIHRoYW4gdHdvIGxpbmtzIG9uIHRoZSBzYW1lIGxpbmUuCgoyMDAyLTA3LTAxICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuOS4yCgogICAgICAgICogSlNQV2lraSBub3cgc3VwcG9ydHMgdHJhZGl0aW9uYWwsIENhbWVsQ2FzZSAob3IgSW50ZXJDYXBwaW5nKQogICAgICAgIFdpa2lMaW5rcyB3aXRob3V0IHNxdWFyZSBicmFja2V0cy4gIEhvd2V2ZXIsIHRoaXMgZmVhdHVyZSBpcwogICAgICAgIHR1cm5lZCBvZmYgYnkgZGVmYXVsdCwgc28geW91J2xsIGhhdmUgdG8gZWRpdCB0aGUgY29ycmVjdCBwcm9wZXJ0eQogICAgICAgIGluIHRoZSBqc3B3aWtpLnByb3BlcnRpZXMgZmlsZS4KCjIwMDItMDYtMzAgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS45LjEKCiAgICAgICAgKiBDaGFuZ2VkIFdpa2lFbmdpbmUgaW5pdGlhbGl6YXRpb24gc28gdGhhdCBpdCB3b3VsZCBiZXR0ZXIKICAgICAgICBpbnRlZ3JhdGUgd2l0aCBzZXJ2bGV0cyBhbmQvb3Igc3RhbmRhbG9uZSBzeXN0ZW1zLiAgSG93ZXZlciwgdGhpcwogICAgICAgIGRvZXMgbm90IHlldCB3b3JrIGFzLWV4cGVjdGVkLCBpZiB5b3UncmUgdXNpbmcgaXQsIHlvdSdsbCBzZWUgYWxsCiAgICAgICAgc29ydHMgb2YgYW5ub3lpbmcgTnVsbFBvaW50ZXJFeGNlcHRpb25zIGlmIHRoaW5ncyBnbyB3cm9uZy4KCiAgICAgICAgKiBNb3ZlZCBzb21lIG9mIHRoZSBmdW5jdGlvbmFsaXR5IGZyb20gV2lraUVuZ2luZSBpbnRvIGEgbmV3CiAgICAgICAgUGFnZU1hbmFnZXIgY2xhc3MuCgogICAgICAgICogSW50ZWdyYXRlZCBzb21lIGluaXRpYWwgcGFydHMgb2YgdGhlIGF0dGFjaG1lbnQgcGFja2FnZSBmcm9tCiAgICAgICAgZWJ1LiAgRG9lcyBub3Qgd29yayB5ZXQsIHRob3VnaC4KCiAgICAgICAgKiBEaWQgc29tZSBjb2RlIGNsZWFudXA6IFdlIG5vdyBoYXZlIGEgcHJvcGVyIFdpa2lFeGNlcHRpb24gKHdpdGgKICAgICAgICBvdXIgb3duIGV4Y2VwdGlvbnMgZXh0ZW5kaW5nIGZyb20gaXQpLiAgVGhlcmUgaXMgbm93IGFsc28gYSBuZXcKICAgICAgICBXaWtpUHJvdmlkZXIgaW50ZXJmYWNlLCB3aGljaCBXaWtpUGFnZVByb3ZpZGVyIGFuZAogICAgICAgIEF0dGFjaG1lbnRQcm92aWRlciBleHRlbmQgZnJvbS4KCiAgICAgICAgKiBZb3Ugc2hvdWxkIG5vIGxvbmdlciBzZXQgQ2FjaGluZ1Byb3ZpZGVyIGRpcmVjdGx5LCBidXQgdG8gdXNlCiAgICAgICAganNwd2lraS51c2VQYWdlQ2FjaGUgaW5zdGVhZC4gIEkgZGlkIHRoaXMgY2hhbmdlIHNpbmNlIGluIG1hbnkgYnVnCiAgICAgICAgcmVwb3J0cyBpdCB0dXJuZWQgb3V0IHRoYXQgcHJhY3RpY2FsbHkgbm9ib2R5IHdhcyB1c2luZyB0aGUgcGFnZQogICAgICAgIGNhY2hlIC0gcHJlc3VtYWJseSBiZWNhdXNlIG5vYm9keSBrbmV3IGFib3V0IGl0IDotKS4KCjIwMDItMDYtMjUgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBCcmFuY2hlZCBvZmYgMS45LngsIHdoaWNoIGlzIHRvIGJlIDIuMC4gIFRoaXMgbWVhbnMgdGhhdCBpdCdzCiAgICAgICAgcXVpdGUgbGlrZWx5IHRoYXQgYW55dGhpbmcgZnJvbSBDVlMgaXMgbm8gbG9uZ2VyIGZ1bmN0aW9uaW5nID0pLgoKICAgICAgICAqIFlvdSBjYW4gbm93IHNwZWNpZnkgdGhlIHVzZWQgcGFnZSBwcm92aWRlciB3aXRob3V0IHRoZSBwYWNrYWdlCiAgICAgICAgbmFtZSBpbiB0aGUganNwd2lraS5wcm9wZXJ0aWVzIGZpbGUuCgogICAgICAgICogTWFqb3IgY2hhbmdlOiBBbGwgV2lraVBhZ2VQcm92aWRlcnMgbm93IGxpdmUgaW4gdGhlaXIgb3duLCBuZWF0CiAgICAgICAgbGl0dGxlIHBhY2thZ2UuICBUaGlzIG1lYW5zIHRoYXQgYWxsIGpzcHdpa2kgcHJvcGVydHkgZmlsZXMganVzdAogICAgICAgIGJyb2tlLCB1bmZvcnR1bmF0ZWx5LgoKMjAwMi0wNi0yMCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjguMC4KCiAgICAgICAgKiBBIHNlY29uZCBwcm9wZXJ0eToganNwd2lraS5tYXRjaEVuZ2xpc2hQbHVyYWxzIGF1dG9tYXRpY2FsbHkKICAgICAgICBhbGxvd3MgeW91IHRvIGNvbnNpZGVyICJUaGluZyIgYW5kICJUaGluZ3MiIHRoZSBzYW1lIHdvcmQuCiAgICAgICAgVW5mb3J0dW5hdGVseSwgaXQncyBub3QgcGVyZmVjdCAoaXQgY2FuJ3QgdGVsbCB0aGUgZGlmZmVyZW5jZQogICAgICAgIGJldHdlZW4gU2FuZEJveCBhbmQgU2FuZEJveGVzLCBmb3IgZXhhbXBsZSkuCgogICAgICAgICogUGFnZUhlYWRlci5qc3Agbm93IHNwbGl0cyB0aGUgdGl0bGUgaW50byBzZXBhcmF0ZSB3b3JkcywgaWYgdGhlCiAgICAgICAgY29ycmVjdCBwcm9wZXJ0eSBpcyBzZXQgaW4ganNwd2lraS5wcm9wZXJ0aWVzLiAgU3VnZ2VzdGVkIGJ5CiAgICAgICAgU3RldmVuIE93ZW5zLgoKICAgICAgICAqIFBhZ2VNb2RpZmllZC5qc3Agbm93IGRvZXMgd29yZCB3cmFwcGluZy4gIEl0J3Mgc3RpbGwgbm90CiAgICAgICAgYmVhdXRpZnVsLCBidXQgaXQgd29ya3MuCgogICAgICAgICogTGlua3Mgc3RhcnRpbmcgd2l0aCAiZmlsZToiIGFyZSBub3cgcmVjb2duaXplZCBhcyBleHRlcm5hbAogICAgICAgIGxpbmtzLCBub3QgaW50ZXJ3aWtpIGxpbmtzIGFueW1vcmUuCgogICAgICAgICogSW50ZXJXaWtpIGxpbmtzIG5vIGxvbmdlciBnbyB0aHJvdWdoIFVSTEVuY29kZXIsIGJlY2F1c2UgVVJMCiAgICAgICAgZW5jb2RpbmcgcmVtb3ZlcyB0aGluZ3MgbGlrZSBzbGFzaGVzLiAgV2hpY2ggaXMgYW5ub3lpbmcsIGFuZAogICAgICAgIHByb2JhYmx5IG5vdCB5b3Ugd2FudC4gIFlvdSdsbCBqdXN0IG5vdyBoYXZlIHRvIGJlIG1vcmUgY2FyZWZ1bAogICAgICAgIHdoZW4gd3JpdGluZyBJbnRlcldpa2kgbGlua3MuICBSZXBvcnRlZCBieSBHYXJldGhTQi4KCjIwMDItMDYtMDkgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS43LjEwLgoKICAgICAgICAqIEFkZGVkIG5ldyBwcm9wZXJ0eToganNwd2lraS5wbHVnaW4uc2VhcmNoUGF0aCwgd2hpY2ggYWxsb3dzIHlvdQogICAgICAgIHRvIGFkZCBhbnkgcGFja2FnZSBuYW1lIGZvciBzZWFyY2hpbmcgcGx1Z2lucy4gIFN1Z2dlc3RlZCBieSBOaWlsbwogICAgICAgIE5ldXZvLgoKICAgICAgICAqIFJTUyBmZWVkIHdhcyBmaXhlZCAtIHdlIG5vdyBhbHNvIGFkZCB0aGUgPGl0ZW1zPiBsaXN0LiAgQ2hhbmdlZAogICAgICAgIGFsc28gdGhlIGRjOmNvbnRyaWJ1dG9yIGZpZWxkIHRvIHVzZSB0aGUgcmRmOkRlc2NyaXB0aW9uIGVsZW1lbnQKICAgICAgICByYXRoZXIgdGhhbiB0aGUgZGlyZWN0IG5hbWUsIHNpbmNlIGl0IHdvdWxkIG5vdCB3b3JrIHdpdGggYWxsIFJTUwogICAgICAgIGFnZ3JlZ2F0b3JzLgoKICAgICAgICAqIFdpa2kuanNwIG5vdyBkaXNwbGF5cyB0aGUgWE1MIHNpZ24gZm9yIGVhc3kgc3Vic2NyaXB0aW9uIHRvIHRoZQogICAgICAgIFJTUyBmZWVkLiAgV2UgYWxzbyBkaXNwbGF5IHRoZSBSYWRpbyBjb2ZmZWUgbXVnIGZvciBlYXN5CiAgICAgICAgc3Vic2NyaXB0aW9uIGZvciBSYWRpbyBVc2VybGFuZCB1c2VycyAodGhvdWdoIHRoaXMgaXMgdW50ZXN0ZWQsCiAgICAgICAgY291bGQgYW55IFJhZGlvIGZvbGtzIHRlc3QgaXQsIHBsZWFzZT8pCgogICAgICAgICogV2Ugbm93IHN1cHBvcnQgUlNTIGF1dG9kaXNjb3ZlcnksIGFzIHBlciB0aGUgcHJvcG9zZWQgc3RhbmRhcmQKICAgICAgICBhdAogICAgICAgIGh0dHA6Ly9kaXZlaW50b21hcmsub3JnL2FyY2hpdmVzLzIwMDIvMDYvMDIuaHRtbCNpbXBvcnRhbnRfY2hhbmdlX3RvX3RoZV9saW5rX3RhZy4KCjIwMDItMDYtMDMgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBPb3BzLCBjb21waWxpbmcgYnJva2Ugb24gc29tZSBzeXN0ZW1zIGR1ZSB0byB1bmRlY2xhcmVkCiAgICAgICAgZXhjZXB0aW9ucy4KCjIwMDItMDYtMDEgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBGZWF0dXJlOiBXaWtpRW5naW5lIG5vdyByZW1lbWJlcnMgdGhlIFNlcnZsZXRDb250ZXh0IGl0IHdhcwogICAgICAgIGluaXRpYWxpemVkIHdpdGgsIGFuZCB5b3UgY2FuIGdldCBpdCB2aWEKICAgICAgICBXaWtpRW5naW5lLmdldFNlcnZsZXRDb250ZXh0KCkuICBSZXF1ZXN0ZWQgYnkgTmlpbG8gTmV1dm8uCgoyMDAyLTA1LTMxICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogQnVnIGZpeDogaW4gY2FzZSB0aGUgc3BlY2lmaWVkIHBhZ2UgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LAogICAgICAgIEZpbGVTeXN0ZW1Qcm92aWRlciBub3cgdGhyb3dzIGFuIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbi4gIFN1Z2dlc3RlZAogICAgICAgIGJ5IE5paWxvIE5ldXZvLgoKMjAwMi0wNS0yMiAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjcuOS4KCiAgICAgICAgKiBIb29yYXkgLSBKU1BXaWtpIGlzIG5vIGxvbmdlciBkZXBlbmRhbnQgb24gUkNTIGluIGFueSBmb3JtLiAgV2UKICAgICAgICBub3cgaGF2ZSBhbiBpbnRlcm5hbCBkaWZmIHJvdXRpbmUgY291cnRlc3kgb2YgQk1TSS4gIFRoaXMgbWVhbnMKICAgICAgICB0aGF0IG9uIFdpbmRvd3MgeW91IGNhbiBqdXN0IHVzZSB0aGUgVmVyc2lvbmluZ0ZpbGVQcm92aWRlciBhbmQKICAgICAgICB5b3Ugbm8gbG9uZ2VyIG5lZWQgdG8gZG8gYW55dGhpbmcgd2l0aCB0aGUgUkNTLgoKMjAwMi0wNS0xOSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIFVzZXJQcmVmZXJlbmNlcyBub3cgYWxsb3dzIHlvdSB0byBjbGVhciB0aGUgcHJlZmVyZW5jZXMuCiAgICAgICAgU3VnZ2VzdGVkIGJ5IFJvYmVydCBNY0dvdmVybiwgd2hvIGtpbmRseSBzZW50IG1lIGEgcGF0Y2ggZm9yIGl0LgoKMjAwMi0wNS0xMSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjcuOC4KCiAgICAgICAgKiBBZGRlZCBDdXJyZW50VGltZVBsdWdpbiwgd2hpY2ggYWxsb3dzIHlvdSB0byB0ZWxsIHRoZSBzZXJ2ZXIKICAgICAgICB0aW1lLiAgQWRkZWQgZG9jdW1lbnRhdGlvbiB0byBKU1BXaWtpUGx1Z2lucywgYW5kIGFsc28gYSBzYW1wbGUgdG8KICAgICAgICBSZWNlbnRDaGFuZ2VzLgoKICAgICAgICAqIFBsdWdpbk1hbmFnZXIgYWxzbyBub3cgdW5kZXJzdGFuZHMgcXVvdGVkIHBhcmFtZXRlcnMsIGkuZS4gaWYKICAgICAgICB5b3UgZW5jbG9zZSBhIHBhcmFtZXRlciB2YWx1ZSBpbiBzaW5nbGUgcXVvdGVzICgnKSwgeW91IGNhbiB1c2UKICAgICAgICBzcGFjZXMgYW5kIG90aGVyIGFubm95aW5nIGNyZWF0dXJlcyBpbnNpZGUgdGhlIHBhcmFtZXRlcgogICAgICAgIHZhbHVlcy4gVGhpcyBpcyB2ZXJ5IGhhbmR5IGZvciB0aGUgQ3VycmVudFRpbWVQbHVnaW4uCgogICAgICAgICogUGx1Z2luTWFuYWdlciBubyBsb25nZXIgbmVlZHMgdGhlIGZ1bGwgcGFja2FnZSBuYW1lLCBpZiB0aGUKICAgICAgICBwbHVnaW4gaXMgYSBKU1BXaWtpLXN1cHBsaWVkIHBsdWdpbi4gIFdlIGZpcnN0IHRyeSB3aXRoIHRoZSBjbGFzcwogICAgICAgIG5hbWUgYXMgZ2l2ZW4sIHRoZW4gcHJlcGVuZCAiY29tLmVjeXJkLmpzcHdpa2kucGx1Z2luIiBhbmQgdHJ5CiAgICAgICAgYWdhaW4uICBUaGlzIHNob3VsZCBtYWtlIHB1dHRpbmcgcGx1Z2lucyBvbiB5b3VyIG93biBwYWdlIGEgYml0CiAgICAgICAgc2ltcGxlci4KCjIwMDItMDUtMDkgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBBZGRlZCB0ZW1wb3JhcnkgZml4IGZvciBtaXNiZWhhdmluZywgbmVzdGVkICMncyBhbmQgKidzLgogICAgICAgIEhvd2V2ZXIsIHRoaXMgaXMgbm90IGEgcmVhbCBmaXgsIGl0IGp1c3QgcHJldmVudHMgdGhlIHN5c3RlbSBmcm9tCiAgICAgICAgZ29pbmcgYWxsIHdvbmt5LiAgUmVwb3J0ZWQgYnkgTWFobGVuIE1vcnJpcy4KCiAgICAgICAgKiBGaXhlZCBwcm9ibGVtIHdpdGggWE1MLVJQQyBpbnRlcmZhY2UgbWV0aG9kIGxpc3RMaW5rcygpCiAgICAgICAgZ2VuZXJhdGluZyBpbmNvcnJlY3QgSFJFRiBhdHRyaWJ1dGUgZm9yIG5vbmV4aXN0YW50IGxpbmtzLgogICAgICAgIFJlcG9ydGVkIGJ5IE1haGxlbiBNb3JyaXMuCgoyMDAyLTA1LTA3ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuNy43LgoKICAgICAgICAqIEJ1ZyBmaXg6IFVURi04IHZlcnNpb24gb2YgWE1MLVJQQyBjbGllbnQgbWlzc2VkCiAgICAgICAgZ2V0UmVjZW50Q2hhbmdlcygpIHRvdGFsbHkuICBBcHBhcmVudGx5IG5vYm9keSB3YXMgdXNpbmcgaXQgPSkuCgogICAgICAgICogQnVnIGZpeDogUlBDLmdldFJlY2VudENoYW5nZXMoKSB3b3VsZCBhY2NpZGVudGFsbHkgdXNlIGxvY2FsCiAgICAgICAgdGltZSBpbnN0ZWFkIG9mIFVUQy4gIE9vcHMuICBGb3VuZCBieSBNYWhsZW4gTW9ycmlzLgoKMjAwMi0wNC0xOSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjcuNi4KCiAgICAgICAgKiBSU1MgZmVlZCBpcyBub3cgcmljaGVyLiAgSSBhbHNvIGFkZGVkIE1BTlkgc2V0dGluZ3MgdG8KICAgICAgICBqc3B3aWtpLnByb3BlcnRpZXMsIGFsbCBzdGFydGluZyB3aXRoICJqc3B3aWtpLnJzcyIuICBJdCBzaG91bGQKICAgICAgICBhbGxvdyB5b3UgdG8gY29uZmlndXJlIHByZXR0eSBtdWNoIGV2ZXJ5dGhpbmcgcmVsYXRlZCB0byB0aGUgUlNTCiAgICAgICAgZmVlZC4KCjIwMDItMDQtMTggIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBSU1MgZmVlZCBpcyBub3cgZ2VuZXJhdGVkIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5LiAgSWYgeW91J3JlIG5vdAogICAgICAgIHJ1bm5pbmcgV2lraUVuZ2luZSBhcyBhIHNlcnZsZXQsIHRoZW4gdGhlIHZhbHVlIG9mIHRoZSAidXNlci5kaXIiCiAgICAgICAgc3lzdGVtIHByb3BlcnR5ICh0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSkgaXMgdXNlZC4KCiAgICAgICAgKiB2MS43LjUuCgogICAgICAgICogQWRkZWQgYW4gaW5pdGlhbCBzdGFiIGF0IGFuIFJTUyBmZWVkLiAgQ3VycmVudGx5IGl0IGp1c3QgbGlzdHMKICAgICAgICB0aGUgY2hhbmdlZCBwYWdlcywgYnV0IHBlcmhhcHMgaW4gdGhlIG5lYXIgZnV0dXJlIGl0IGNhbiBkbyBtb3JlCiAgICAgICAgY29tcGxleCBzdHVmZi4KCjIwMDItMDQtMTQgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS43LjQuCgogICAgICAgICogVXNlclByZWZlcmVuY2VzIGlzIG5vdyBhIGxvdCBtb3JlIHRvbGVyYW50IHRvd2FyZHMgVVRGLTgKICAgICAgICBjaGFyYWN0ZXJzLgoKICAgICAgICAqIEV2ZXJ5dGhpbmcgcmVidWlsdCB0byBzdXJ2aXZlIGEgbnVsbCBhdXRob3IgaW5mb3JtYXRpb24uCgogICAgICAgICogVGhlIHRleHQgZm9yIGlubGluZSBpbWFnZXMgaXMgbm93IGludGVycHJldGVkIGFzIGEgaHlwZXJsaW5rLCBpZgogICAgICAgIGl0IHN0YXJ0cyB3aXRoIHRoZSB1c3VhbCBodHRwOiwgZnRwOiwgbWFpbHRvOiwgZXRjLiAgU3VnZ2VzdGVkIGJ5CiAgICAgICAgQWxhaW4gUmF2ZXQuCgoyMDAyLTAzLTI3ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuNy4zLgoKICAgICAgICAqIEFkZGVkIGNhcGFiaWxpdHkgdG8gc2V0IHlvdXIgdXNlciBuYW1lIHZpYSBVc2VyUHJlZmVyZW5jZXMKICAgICAgICBwYWdlLiAgVGhpcyBkYXRhIGlzIHN0b3JlZCBhcyBhIGNvb2tpZSBpbiB5b3VyIGJyb3dzZXIuCgoyMDAyLTAzLTI1ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuNy4yLgoKICAgICAgICAqIFdoZW4gYSBwYWdlIGlzIHNhdmVkLCBpdCBnZXRzIG5vdyBhdXRvbWF0aWNhbGx5IG5vcm1hbGl6ZWQuCiAgICAgICAgVGhpcyBub3JtYWxpemluZyBtZWFucyB0aGF0IGFsbCBwYWdlcyB3aWxsIG5vdyBlbmQgd2l0aCBhIG5ld2xpbmUKICAgICAgICAoc29tZSBicm93c2VycyBzZW5kIGEgbmV3bGluZSBhbmQgc29tZSBkb24ndCksIGFuZCBhbHNvIHRoYXQgQUxMCiAgICAgICAgbGluZSBicmVha3MgYXJlIG5vdyBtYXJrZWQgd2l0aCBcclxuIChDUkxGLCBNUy1ET1Mgc3R5bGUpLiAgV2h5CiAgICAgICAgd2l0aCB0aGF0IG9ic29sZXRlIHN0eWxlPyAgV2VsbCwgSFRUUCBzdGFuZGFyZCB1c2VzIENSTEYgYWxsCiAgICAgICAgYXJvdW5kLCBhbmQgbW9zdCBvZiB0aGUgY3VycmVudCBKU1BXaWtpIGluc3RhbGxhdGlvbnMgdXNlIENSTEYgaW4KICAgICAgICBhbGwgb2YgdGhlIGZpbGVzLiAgQWxzbywgbW9zdCBVTklYIHRvb2xzIGFyZSBzbWFydCBlbm91Z2ggdG8KICAgICAgICB1bmRlcnN0YW5kIENSTEYsIHdoZXJlYXMgbm90IGFsbCBXaW5kb3dzIHRvb2xzIHVuZGVyc3RhbmQgcGxhaW4KICAgICAgICBDUiAoTWFjIHN0eWxlKSBvciBwbGFpbiBMRi4gIFVzaW5nIENSTEYgc2hvdWxkIG1ha2UgaW5zdGFsbGluZwogICAgICAgIHRoaXMgdXBncmFkZSB0b3RhbGx5IHZpc2libGUgdG8gbW9zdCB1c2Vycy4KICAgICAgICAKICAgICAgICBIYXZpbmcgc2FpZCB0aGF0LCB0aGlzIGhhcyBub3QgYmVlbiB0ZXN0ZWQgdmVyeSBtYW55IHRpbWVzLAogICAgICAgIG9idmlvdXNseS4gIFVzZSB3aXRoIGNhcmUgOi0pLgoKMjAwMi0wMy0yMiAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjcuMS4KCiAgICAgICAgKiBFZGl0LmpzcCBoYWQgYSBqYXZhc2NyaXB0IGVycm9yLCBwb2ludGluZyBhdCBhIHdyb25nIGZvcm0uICBJdAogICAgICAgIHdhcyBub3QgZmF0YWwsIGl0IGRpZCBub3QgYWZmZWN0IHRoZSB1c2VyIGluIGFueSByZWFsIHdheSwgb3RoZXIKICAgICAgICB0aGFuIGJlaW5nIGFuIGFubm95YW5jZS4KCiAgICAgICAgKiBEaWZmZXJlbmNlRW5naW5lIG5vIGxvbmdlciBjcmFzaGVzIGlmIGl0IGdldHMgZW1wdHkgbGluZXMgZnJvbQogICAgICAgIGRpZmYuIAoKMjAwMi0wMy0yMSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIEFkZGVkIHByZXZpZXcgY2FwYWJpbGl0eSB0byBFZGl0LmpzcC4gIFN1Z2dlc3RlZCBieSBtYW55CiAgICAgICAgcGVvcGxlLgoKICAgICAgICAqIEFkZGVkIFByZXZpZXcuanNwLiAgVGhpcyBpcyBzdGlsbCBhIHZlcnkgc2ltcGxlIHByZXZpZXcsIHdoaWNoCiAgICAgICAgZG9lcyBub3QgYWxsb3cgeW91IHRvIGRvIGEgZGlyZWN0IHB1Ymxpc2guCgoyMDAyLTAzLTE2ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuNy4wLiAgRmluYWxseSA6LSkuCgoyMDAyLTAzLTEwICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogQWRkZWQgVmVyc2lvbmluZ0ZpbGVQcm92aWRlci4gIFRoZSBWZXJzaW9uaW5nRmlsZVByb3ZpZGVyIGlzCiAgICAgICAgU1RSSUNUTFkgQUxQSEEuICBETyBOT1QgVVNFIElUIEZPUiBBTlkgUkVBTCBQUk9KRUNULiAgQnV0IHBsZWFzZSwKICAgICAgICBkbyB0ZXN0IGl0IDotKS4KCiAgICAgICAgKiB2MS42LjEzLWN2cy4KCiAgICAgICAgKiBnZXRSZWNlbnRDaGFuZ2VzKCkgWE1MLVJQQyBtZXRob2Qgbm93IGhvcGVmdWxseSBkb2VzIFVUQwogICAgICAgIGNvbnZlcnNpb24gY29ycmVjdGx5LgoKICAgICAgICAqIFNlYXJjaC5qc3Agbm93IG9mZmVycyB0byBzZWFyY2ggb24gR29vZ2xlIGFzIHdlbGwgYWZ0ZXIgZ2l2aW5nCiAgICAgICAgeW91IHRoZSByZXN1bHRzLgoKICAgICAgICAqIEFkZGVkIHBsZW50eSBvZiBkb2N1bWVudGF0aW9uIGFib3V0IHRoZSBYTUwtUlBDIGludGVyZmFjZSB0byB0aGUKICAgICAgICBkaXN0cmlidXRpb24uCgogICAgICAgICogRm9vdG5vdGVzIGFyZSBub3cgdW5pcXVlIGFjcm9zcyBXaWtpLiAgVGhpcyBpcyBhY2NvbXBsaXNoZWQgYnkKICAgICAgICBhZGRpbmcgdGhlIHBhZ2UgbmFtZSB0byB0aGUgYW5jaG9yIG5hbWUuICBTdWdnZXN0ZWQgYnkgTWFobGVuCiAgICAgICAgTW9ycmlzLgoKMjAwMi0wMy0wNyAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIEVkaXQuanNwIHRleHQgZWRpdG9yIG5vdyBrbm93cyBob3cgdG8gYWRqdXN0IGl0cyBvd24gd2lkdGgKICAgICAgICBhY2NvcmRpbmcgdG8gYnJvd3NlciB3aW5kb3cgd2lkdGgsIGlmIHlvdXIgYnJvd3NlciBrbm93cyBDU1MuCiAgICAgICAgVGhhbmtzIHRvIE1hdHRoZXcgU2ltb25lYXUgZm9yIHRoZSB0aXAuCgogICAgICAgICogSW5jbHVkZWQgYSBuZXcgdmVyc2lvbiBvZiB4bWxycGMuamFyOiB0aGlzIHZlcnNpb24ganVzdCBoYXMgdGhlCiAgICAgICAgZGVmYXVsdCBjaGFyc2V0IHNldCB0byAiVVRGLTgiIGluc3RlYWQgb2YgSVNPLUxhdGluLTEuCgogICAgICAgICogUlBDU2VydmxldCBub3cgdGFrZXMgdHdvIGluaXRQYXJhbXM6ICJoYW5kbGVyIiB0byBwb2ludCBhdCB0aGUKICAgICAgICBjbGFzcyB0aGF0IGlzIHVzZWQgdG8gaGFuZGxlIHRoZSBYTUwtUlBDIGNhbGwsIGFuZCAicHJlZml4IiB0bwogICAgICAgIGRldGVybWluZSB0aGUgWE1MLVJQQyBjb21tYW5kIHByZWZpeC4gIFdlIHVzZSB0aGVzZSB0byBzdGFydCBib3RoCiAgICAgICAgdGhlIFVURi04IGFuZCBzdHJpY3QgWE1MLVJQQyBoYW5kbGVycyBmcm9tIHdlYi54bWwuCgogICAgICAgICogQWRkZWQgQWJzdHJhY3RSUENIYW5kbGVyIGFuZCBSUENIYW5kbGVyVVRGOCBjbGFzc2VzIHNvIHRoYXQgd2UKICAgICAgICBjYW4gbm93IGFsc28gc2VydmUgWE1MLVJQQyB1c2luZyBVVEYtOCA6LSkuCgoyMDAyLTAyLTI1ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogWE1MLVJQQyBsaXN0TGlua3Mgbm93IHJldHVybnMgYSB0aGUgdHlwZSBhcyBhIHN0cmluZy4gIFN1Z2dlc3RlZAogICAgICAgIGJ5IE1haGxlbiBNb3JyaXMuCgogICAgICAgICogWE1MLVJQQyBsaXN0TGlua3Mgbm93IHJldHVybnMgYW4gZXh0cmEgcGFyYW1ldGVyOiBocmVmLiAgVGhpcwogICAgICAgIGNvbnRhaW5zIHRoZSBhY3R1YWwgbGluayB0ZXh0IGZyb20gdGhlIEhUTUwgcGFnZSBpdHNlbGYuCiAgICAgICAgU3VnZ2VzdGVkIGJ5IE1haGxlbiBNb3JyaXMuCgogICAgICAgICogSW50ZXJXaWtpIHJlZmVyZW5jZXMgYXJlIG5vdyBhbHNvIGFkZGVkIHRvIHRoZSBsaW5rIG9mIGV4dGVybmFsCiAgICAgICAgbGlua3MgcmV0dXJuZWQgYnkgbGlzdExpbmtzKCkuICBUaGV5IGFyZSByZXR1cm5lZCBhcyBlbnRpcmUgVVJMcywKICAgICAgICByZXN1bHRpbmcgZnJvbSByZXNvbHZpbmcgdGhlIHJlZmVyZW5jZS4KCjIwMDItMDItMjQgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS42LjEyLWJldGEuCgogICAgICAgICogQWRkZWQgWE1MLVJQQyBjb21tYW5kICJsaXN0TGlua3MiLgoKICAgICAgICAqIERpZCBzb21lIGNvZGUgcmVvcmdhbml6YXRpb246IE5ldyBjbGFzcyBEaWZmZXJlbmNlRW5naW5lIG5vdwogICAgICAgIGhhbmRsZXMgYWxsIGRpZmZzLiAgVGhpcyB3YXMgZG9uZSBpbiBwcmVwYXJhdGlvbiBmb3IgaW50ZXJuYWwgZGlmZgogICAgICAgIGhhbmRsaW5nLiAgQWxzbywgTGlua0NvbGxlY3RvciBpcyBub3cgYSBjbGFzcyBvZiBpdHMgb3duLgoKICAgICAgICAqIFhNTC1SUEMgQ29tbWFuZCBwcmVmaXggaXMgbm93ICJ3aWtpIiBpbnN0ZWFkIG9mICJqc3B3aWtpIi4KCjIwMDItMDItMjMgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBYTUwtUlBDIGludGVyZmFjZSBubyBsb25nZXIgcmVsaWVzIG9uIG92ZXJsb2FkaW5nIG9mIG1ldGhvZAogICAgICAgIG5hbWVzOiBBbGwgdmVyc2lvbmVkIHZlcnNpb25zIGhhdmUgbm93ICJWZXJzaW9uIiBhcHBlbmRlZC4KICAgICAgICBTdWdnZXN0ZWQgYnkgTGVzIE9yY2hhcmQuCgogICAgICAgICogWE1MLVJQQyBpbnRlcmZhY2Ugbm93IHJldHVybnMgYW4gZXJyb3IgY29kZSBvZiAxLCBpZiB0aGUKICAgICAgICByZXF1ZXN0ZWQgcGFnZSBkb2VzIG5vdCBleGlzdC4gIFN1Z2dlc3RlZCBieSBMZXMgT3JjaGFyZC4KCiAgICAgICAgKiBCdWcgZml4OiBOb3cgdGFibGVzIHNob3VsZCBmaW5hbGx5IHdvcmsgd2l0aCBNb3ppbGxhLgoKICAgICAgICAqIEFkZGVkIEdvb2dsZSBzZWFyY2ggYXMgYW4gSW50ZXJ3aWtpIGxpbmsuCgogICAgICAgICogRGlmZi5qc3Agbm93IHNob3dzIGlmIHRoZXJlIGhhcyBiZWVuIG5vIGRpZmZlcmVuY2UuCgogICAgICAgICogQnVnIGZpeDogSW50ZXJ3aWtpIGxpbmtzIHdlcmUgY2xlYW5lZCBhY2NpZGVudGFsbHkuCgoyMDAyLTAyLTIxICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogRWJ1IHJlYXJyYW5nZWQgd2ViLnhtbCB0byB3b3JrIHdpdGggVG9tY2F0IDQuMCwgYnV0IGZvcmdvdCB0bwogICAgICAgIG1lbnRpb24gaXQgaGVyZS4KCiAgICAgICAgKiBBZGRlZCBzb21lIG1vcmUgZGVmYXVsdCBJbnRlcldpa2kgcmVmZXJlbmNlcyAoVFdpa2ksCiAgICAgICAgTWVhdGJhbGxXaWtpLCBXaWtpcGVkaWEpLgoKMjAwMi0wMi0xNSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIFBhZ2VJbmZvIGFuZCBFZGl0IG5vdyBhbHNvIGluY2x1ZGUgUGFnZUhlYWRlci5qc3AuICBTdWdnZXN0ZWQgYnkKICAgICAgICBLaW0gSG9sdmlhbGEuCgogICAgICAgICogdjEuNi4xMS1iZXRhLgoKICAgICAgICAqIFhNTC1SUEMgaW50ZXJmYWNlIG5vdyBzdXBwb3J0cyBhIG5ldyBtZXRob2Q6CiAgICAgICAgZ2V0UlBDVmVyc2lvblN1cHBvcnRlZCgpLCB3aGljaCByZXR1cm5zIHdoaWNoIHZlcnNpb24gb2YgQVBJIHdlCiAgICAgICAgc3VwcG9ydC4gIFRoaXMgaXMgY3VycmVudGx5IDEuCgogICAgICAgICogRml4ZWQgPFRUPiBzdXBwb3J0OiBpdCBpcyBub3cgYWN0dWFsbHkgcG9zc2libGUgdG8gd3JpdGUKICAgICAgICBtdWx0aXBsZSBsaW5lcyB1c2luZyB7eyBhbmQgfX0sIG11Y2ggbGlrZSBpdCBpcyB3aXRoICcnIGFuZCBfXy4KICAgICAgICBTdWdnZXN0ZWQgYnkgU2VzaCBKYWxhZ2FtLgoKICAgICAgICAqIFJld3JvdGUgdGFibGUgc3VwcG9ydC4gIFRoZSBUcmFuc2xhdG9yUmVhZGVyIGVuZ2luZSBpcyBub3cgYSBsb3QKICAgICAgICBzbWFydGVyIGFib3V0IHRoaW5ncyB0aGFuIGl0IHVzZWQgdG8gYmUsIGFuZCBub3cgaXQgZG9lcyBub3QKICAgICAgICBtYXR0ZXIgaG93IHlvdSB1c2UgdGhlIHRhYmxlIG1hcmtlciwgYXMgbG9uZyBhcyBpdCdzIHRoZSBmaXJzdAogICAgICAgIGNoYXJhY3RlciBvbiB0aGUgbGluZS4KCjIwMDItMDItMTQgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBCdWcgZml4OiBSQ1NGaWxlUHJvdmlkZXIgY291bGQgaGFuZyBpbiBjZXJ0YWluIG9wZXJhdGlvbnMsCiAgICAgICAgZXNwZWNpYWxseSB3aXRoIGxvbmcgcmV2aXNpb24gaGlzdG9yaWVzLiAgQSBKVW5pdCB0ZXN0IHdhcyBhZGRlZAogICAgICAgIGZvciB0aGlzLgoKMjAwMi0wMi0xMCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjYuMTAtY3ZzCgogICAgICAgICogWE1MLVJQQyBpbnRlcmZhY2Ugbm93IGhvcGVmdWxseSBnaXZlcyBvdXQgdGhlIG1vZGlmaWNhdGlvbiB0aW1lCiAgICAgICAgaW4gVVRDLCBiZWZvcmUgaXQgdXNlZCB0aGUgbG9jYWwgdGltZXpvbmUuCgoyMDAyLTAyLTA5ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogVW51c2VkIGFuZCB1bmRlZmluZWQgcGFnZXMgYXJlIG5vdyBzb3J0ZWQuICBTdWdnZXN0ZWQgYnkgTWlrYWVsCiAgICAgICAgSG9ua2FsYS4KCiAgICAgICAgKiBVc2luZyB0aGUgdGFibGUgZGlyZWN0aXZlIG5vdyBjYXVzZXMgYW4gZXhwbGljaXQgIkJPUkRFUj0xIiB0bwogICAgICAgIGJlIG91dHB1dCB0byBzdXBwb3J0IG9sZGVyIGJyb3dzZXJzLiAgQWxzbywgcmV3b3JrZWQgc29tZSBvZiB0aGUKICAgICAgICBzdHlsZXNoZWV0cyBzbyB0aGF0IElFIGFuZCBLb25xdWVyb3IgYXQgbGVhc3QgbG9vayB0aGUgc2FtZSBub3cuCiAgICAgICAgTW96aWxsYSBpcyBzdGlsbCBoYXZpbmcgcHJvYmxlbXMgd2l0aCBUSEVBRCBzdHlsZXNoZWV0cy4KCjIwMDItMDItMDYgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS42LjktY3ZzCgogICAgICAgICogQWRkZWQgc3VwcG9ydCBmb3IgdGFibGVzLiAgU2FubmEgVkLCjmRCwo5kdELCjmRpbmVuIGZpbmFsbHkgbWFuYWdlZCB0bwogICAgICAgIGNvbnZpbmNlIG1lIHRvIGFkZCB0aGVtLCBieSBwb2ludGluZyBvdXQgc29tZSByZWFsIGRlZmljaWVuY2VzIGluCiAgICAgICAgdGhlIHByZWZvcm1hdHRlZC10ZXh0IHN0eWxlIHRhYmxlcyA9KS4KCiAgICAgICAgKiBUZXh0VXRpbC5yZXBsYWNlU3RyaW5nKCkgd291bGQgdHJhc2ggcmVwbGFjZW1lbnRzIG9mIGxlbmd0aHMgb2YKICAgICAgICB0d28gb3IgbW9yZS4gIE9vcHMuCgogICAgICAgICogWE1MLVJQQyBpbnRlcmZhY2Ugbm93IGdvZXMgYXJvdW5kIHRoZSBVVEYtOCBwcm9ibGVtIGJ5IGdpdmluZwogICAgICAgIG91dCBCYXNlNjQtZW5jb2RlZCBVVEYtOCBkYXRhIGFzIHBhZ2UgZGF0YSwgYW5kIGV4cGVjdHMgYWxsIHBhZ2UKICAgICAgICBuYW1lcyB0byBiZSBzdHJpbmdzIGVuY29kZWQgdXNpbmcgVVJMIGVuY29kaW5nIHdpdGggVVRGLTggdGV4dC4KICAgICAgICBUaGlzIGlzIHJlZ2FyZGxlc3Mgb2YgdGhlIGFjdHVhbCBlbmNvZGluZyB1c2VkIGJ5IHRoZSBKU1BXaWtpCiAgICAgICAgZW5naW5lLgoKICAgICAgICAqIFJlZmVycmluZ1BhZ2VzUGx1Z2luIG5vdyBoYXMgZXh0cmEgcGFyYW1ldGVyOiAiZXh0cmFzIiwgd2hpY2gKICAgICAgICBjYW4gYmUgdXNlZCB0byBub3RlIGhvdyBtYW55IHBhZ2VzIGFyZSBzdGlsbCBsZWZ0IHdpdGggcmVmZXJlbmNlcwogICAgICAgIHRvIHRoaXMgcGFydGljdWxhciBwYWdlLgoKICAgICAgICAqIEZpeGVkIGEgc2VyaW91cyBidWcgaW4gQ2FjaGluZ1Byb3ZpZGVyLCB3aGljaCBjYXVzZWQgbnVsbCB2YWx1ZXMKICAgICAgICB0byBiZSBhZGRlZCB0byB0aGUgaW50ZXJuYWwgcGFnZSBjb2xsZWN0aW9uLiAgVGhhbmtzIHRvIE1haGxlbgogICAgICAgIE1vcnJpcyBmb3IgcG9pbnRpbmcgaXQgb3V0LgoKICAgICAgICAqIE5ldyBjbGFzczogSW50ZXJuYWxXaWtpRXhjZXB0aW9uIHdoaWNoIGdldHMgdGhyb3duIGluIGNhc2UKICAgICAgICBzb21ldGhpbmcgcmVhbGx5IGZpc2h5IGFuZCBzZXJpb3VzIGlzIGdvaW5nIG9uIGluc2lkZSBXaWtpLgoKMjAwMi0wMi0wMyAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIEZpeGVkIGEgc2xvdyByb3V0aW5lIGluIFRyYW5zbGF0b3JSZWFkZXIsIHNoYXZpbmcgb2ZmIHJvdWdobHkKICAgICAgICAxMCUgb2YgdHJhbnNsYXRpb24gdGltZS4gIENvbnN0cnVjdGlvbiBFeGNlcHRpb25zIGlzIHRydWx5IGhlYXZ5LgoKMjAwMi0wMS0zMCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjYuOC1jdnMKCiAgICAgICAgKiBDYWNoaW5nUHJvdmlkZXIgd2FzIGl0ZXJhdGluZyB0aHJvdWdoIHRoZSB3cm9uZyBjb2xsZWN0aW9uLgogICAgICAgIFRoaXMgbWlnaHQgZml4IHRoZSBOdWxsUG9pbnRlckV4Y2VwdGlvbnMgdGhhdCBoYXZlIGJlZW4gY29taW5nCiAgICAgICAgYXJvdW5kIGxhdGVseS4KCjIwMDItMDEtMjggIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS42LjctY3ZzCgogICAgICAgICogQWRkZWQgbmV3IFJQQyBBUEk6IGdldFBhZ2VJbmZvKCBzdHJpbmcgcGFnZSApLCBhbmQgZ2V0UGFnZUluZm8oCiAgICAgICAgc3RyaW5nIHBhZ2UsIGludCB2ZXJzaW9uICkuICBBbHNvLCB0aGUgc3RydWN0IHJldHVybmVkIGJ5CiAgICAgICAgZ2V0UmVjZW50Q2hhbmdlcygpIGFuZCBnZXRQYWdlSW5mbygpIGdvdCBlbmhhbmNlZC4KCiAgICAgICAgKiBXaWtpLmpzcCBub3cgc2hvd3MgdGhlIGluZm8gb24gb2xkIHZlcnNpb25zIHByb3Blcmx5OiBiZWZvcmUgaXQKICAgICAgICB3b3VsZCBzaG93IGRhdGEgcGVydGFpbmluZyB0byB0aGUgY3VycmVudCB2ZXJzaW9uLCBldmVuIGlmIHZpZXdpbmcKICAgICAgICBhbiBvbGRlciB2ZXJzaW9uLgoKICAgICAgICAqIFdpa2lQYWdlUHJvdmlkZXIgaW50ZXJmYWNlIHJld29ya2VkIHNsaWdodGx5OiBCb3RoIGdldFBhZ2VJbmZvKCkKICAgICAgICBhbmQgZ2V0UGFnZVRleHQoKSBub3cgbmVlZCB0aGUgdmVyc2lvbiBwYXJhbWV0ZXIuICBWZXJzaW9ubGVzcwogICAgICAgIG1ldGhvZHMgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQgKHVzZSBMQVRFU1RfVkVSU0lPTiBhcyBhIHNwZWNpYWwKICAgICAgICB0YWcgZm9yIHZlcnNpb24gdG8gZ2V0IHRoZSBsYXRlc3QuKSAgSSBkaWQgdGhpcyB0byBzaW1wbGlmeSB0aGUKICAgICAgICBBUEkgc28gdGhhdCB0aGVyZSB3b3VsZCBiZSBsZXNzIG1ldGhvZHMgdG8gaW1wbGVtZW50LgoKICAgICAgICAqIFJDU0ZpbGVQcm92aWRlciBjYW4gbm93IGZldGNoIGluZm9ybWF0aW9uIG9uIG9sZCBwYWdlcwogICAgICAgIGNvcnJlY3RseS4gCgoyMDAyLTAxLTI3ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuNi42LWN2cy4KCiAgICAgICAgKiBBZGRlZCBYTUwtUlBDIGNhbGwgc3lzdGVtLiAgU2VlIHRoZSBjb20uZWN5cmQuanNwd2lraS54bWxycGMKICAgICAgICBwYWNrYWdlIGZvciBtb3JlIGluZm9ybWF0aW9uLgoKICAgICAgICAqIEVycm9yIG91dHB1dCBmcm9tIFJDUyBjb21tYW5kcyBpcyBub3cgdmlzaWJsZSBpbiB0aGUgbG9nLgoKICAgICAgICAqIERpZmYuanNwIG5vdyBoYXMgbGlua3MgdG8gdGhlIGFjdHVhbCBwYWdlIGFuZCB0aGUgUGFnZSBJbmZvLgoKICAgICAgICAqIFNvbWUgbW9yZSByZWZhY3RvcmluZyBpbnNpZGUgV2lraUVuZ2luZTogcmVtb3ZlZCByZWR1bmRhbnQKICAgICAgICBjb2RlLgoKICAgICAgICAqIFJlZmFjdG9yZWQgVHJhbnNsYXRvclJlYWRlciB0byBiZSBtb3JlIG1vZHVsYXIuICBQcm92aWRlZCBob29rcwogICAgICAgIGludG8gdGhlIGludGVybmFscywgc28gdGhhdCBsaW5rcyBjYW4gbm93IGJlIHJlYWQgb24tdGhlLWZseS4KCiAgICAgICAgKiBXaWtpRW5naW5lLmdldEluc3RhbmNlKCkgaXMgbm93IHByb3RlY3RlZCBhZ2FpbnN0IG11bHRpcGxlCiAgICAgICAgY29uY3VycmVudCBpbnZvY2F0aW9ucy4gIFRoaXMgc2hvdWxkIGhlbHAgd2l0aCBzdGFydHVwIGlzc3Vlcy4KCjIwMDItMDEtMjUgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBDYWNoaW5nUHJvdmlkZXIgbm93IHByb3ZpZGVzIHNvbWUgcHJvdGVjdGlvbiBhZ2FpbnN0CiAgICAgICAgY29uY3VycmVuY3ksIGJ1dCBpdCBpcyBrbm93biB0byBmYWlsIGF0IG9jY2FzaW9uLgoKICAgICAgICAqIEZpeGVkIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gV2lraS5qc3AsIGlmIHRoZSBwYWdlIGRpZCBub3QKICAgICAgICBleGlzdC4KCiAgICAgICAgKiBDaGFuZ2VkIGJvdHRvbSBsaW5lIG9yZGVyaW5nIGluIFdpa2kuanNwIHNvIHRoYXQgaXQgdGFrZXMgbGVzcwogICAgICAgIHZlcnRpY2FsIHNjcmVlbiBzcGFjZS4KCjIwMDItMDEtMjAgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBTeXN0ZW1JbmZvLmpzcCBwYWdlIGVuaGFuY2VkIHdpdGggbmV3IGZlYXR1cmVzLgoKICAgICAgICAqIHYxLjYuNS1jdnMKCiAgICAgICAgKiBUaGUgV2lraVBhZ2VQcm92aWRlciBpbnRlcmZhY2UgaGFzIGJlZW4gZW5oYW5jZWQgd2l0aCBuZXcKICAgICAgICBtZXRob2RzLgoKICAgICAgICAqIENhY2hpbmdQcm92aWRlciByZXdvcmtlZC4gIFRoZSBnZXRBbGxQYWdlcygpIG5vdyBrZWVwcyBpdHMgb3duCiAgICAgICAgY2FjaGUsIHNvIHRoYXQgaXQgY2FuIHJldHVybiB0aGUgcmVxdWlyZWQgcGFnZXMgd2l0aG91dCBnb2luZwogICAgICAgIHRocm91Z2ggdGhlIGFjdHVhbCBwcm92aWRlci4gIFRoaXMgc2hvdWxkIHNwZWVkIHRoaW5ncyB1cCBhIGxvdC4KICAgICAgICBBIHJlYWwgc29sdXRpb24gaXMsIGhvd2V2ZXIgcmVxdWlyZWQuCgoyMDAyLTAxLTEzICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogQWRkZWQgQ2FjaGluZ1Byb3ZpZGVyLCBpbnNwaXJlZCBieSBDaHJpcyBCcm9va2luZyAodGhvdWdoIGluIGEKICAgICAgICBmYXIgc2ltcGxlciBmb3JtKS4KCiAgICAgICAgKiB2MS42LjQtY3ZzLgoKICAgICAgICAqIFJlY2VudENoYW5nZXMgbGlzdCBub3cgZGlzcGxheXMgYXV0aG9yIGluZm8uCgogICAgICAgICogQWxsIHJlZmVycmFsIHBsdWdpbnMgKFVudXNlZFBhZ2VzLCBVbmRlZmluZWRQYWdlcywKICAgICAgICBSZWZlcnJpbmdQYWdlcykgbm93IHJlY29nbml6ZSBhICJtYXh3aWR0aCIgcGFyYW1ldGVyLCB3aGljaCBjYW4gYmUKICAgICAgICB1c2VkIHRvIGxpbWl0IHRoZSBzaXplIG9mIHRoZSB3cml0dGVuIGxpbmtzLiAgVGhpcyBpcyB2ZXJ5IHVzZWZ1bAogICAgICAgIGluIHRoZSBjb250ZXh0IG9mIHB1dHRpbmcgYW4gYXV0b21hdGljIHJlZmVycmFsIGxpc3QgdG8gdGhlCiAgICAgICAgTGVmdE1lbnUsIHdoaWNoIG1pZ2h0IG90aGVyd2lzZSBncm93IHRvbyB3aWRlLiAgVGhlIGRlZmF1bHQKICAgICAgICBMZWZ0TWVudUZvb3RlciBub3cgcmVmbGVjdHMgdGhpcy4KCiAgICAgICAgKiBBZGRlZCB0aGUgYWJpbGl0eSB0byBtb2RpZnkgdGhlIHdyaXR0ZW4gbGluayB0byB0aGUKICAgICAgICBUcmFuc2xhdG9yUmVhZGVyIGJ5IGhvb2tpbmcgaW4gYSBTdHJpbmdUcmFuc211dGF0b3IgY2FsbGJhY2suCgoyMDAyLTAxLTEwICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogUGFnZU1vZGlmaWVkLmpzcCB3b3VsZG4ndCBjb21waWxlIC0gSSBmb3Jnb3QgdG8gdXBkYXRlIHRoZSBuZXcKICAgICAgICBsb2NhdGlvbiBmb3IgVGV4dFV0aWwucmVwbGFjZVN0cmluZygpLiAgT29wcy4KCjIwMDItMDEtMDkgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBTeXN0ZW1JbmZvLmpzcCBub3cgc2hvd3MgdGhlIHVzZWQgY2hhcmFjdGVyIGVuY29kaW5nIGFzIHdlbGwuCgoyMDAyLTAxLTA3ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuNi4zLWJldGEuCiAgICAgICAgCiAgICAgICAgKiBDaGFuZ2VkIG15IGVtYWlsIGFkZHJlc3MuCgogICAgICAgICogU2xpZ2h0bHkgY2hhbmdlZCBlYnUncyBoYWNrIHRvIGNvbG9yaXplIGRpZmZzIHRvIHdvcmsgb24gYWxsCiAgICAgICAgYnJvd3NlcnMsIGV2ZW4gdGhvc2UgdGhhdCBhcmUgQ1NTLWNoYWxsZW5nZWQuICBJbnN0ZWFkIG9mCiAgICAgICAgRElWLXRhZ3MgYW5kIENTUy1maWxlcywgd2Ugbm93IHJlbHkgb24gdGFibGVzLgoKICAgICAgICAqIFBvc3NpYmx5IGZpeGVkIGEgcHJvYmxlbSB3aXRoIFdpbjJrIGFuZCBSQ1MgYnkgcmV3cml0aW5nIHRoZQogICAgICAgIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIHRvIGZldGNoIHRoZSBhdXRob3IgbmFtZS4gIFRoYW5rcyB0byBTZXNoCiAgICAgICAgSmFsYWdhbSBmb3IgdGhlIHRpcC4KCjIwMDItMDEtMDYgIEVyaWsgQnVubiAgPEVyaWsuQnVubkBub3NwYW0ubWVtZWNyeS5uZXQ+CgogICAgICAgICogRml4ZWQgYnVnIGluIHJlZmVycmFsczsgd2hlbiByZW1vdmluZyBsaW5rcyB0byBub24tZXhpc3RhbnQKICAgICAgICBwYWdlcywgdW51c2VkIHBhZ2VzIG5vIGxvbmdlciBzaG93cyB0aGUgcmVtb3ZlZCBsaW5rLgoKMjAwMS0xMi0xMyAgRXJpayBCdW5uICA8RXJpay5CdW5uQG5vc3BhbS5tZW1lY3J5Lm5ldD4KCiAgICAgICAgKiBJbml0aWFsIGhhY2sgdG8gbWFrZSBkaWZmcyBwcmV0dGllciBpbXBsZW1lbnRlZC4gUmVsaWVzCiAgICAgICAgb24gQ1NTLCB1c2VzIGxvdHMgb2YgRElWIHRhZ3MsIGFuZCB0aGUgbWFjL2llIGNzcydlcyBoYXZlbid0CiAgICAgICAgYmVlbiB0ZXN0ZWQuIAoKMjAwMS0xMi0wNCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIGNzc2luY2x1ZGUuanMgbm93IGFsc28gc2V0cyBzb21lIGJhc2ljIExJTksgZWxlbWVudHM6ICJzdGFydCIKICAgICAgICByZWZlcnMgdG8gYSBwYWdlIGNhbGxlZCAiTWFpbiIsICJoZWxwIiBkaXJlY3RzIHlvdSB0bwogICAgICAgIFRleHRGb3JtYXR0aW5nUnVsZXMsIGFuZCAic2VhcmNoIiB0YWtlcyB5b3UgdG8gU2VhcmNoLmpzcC4gIFRoZQogICAgICAgIGJhZCB0aGluZyBpcyB0aGF0IG5vdyB0aGUgcGFnZSBuYW1lcyBhcmUgcHJldHR5IG11Y2ggZml4ZWQuCgoyMDAxLTEyLTAzICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuNi4yLWN2cy4KCiAgICAgICAgKiBXaWtpLmpzcCBub3cgaGFzIGEgZGlyZWN0IGxpbmsgZnJvbSB0aGUgbGFzdCBjaGFuZ2UgZGF0ZSB0byB0aGUKICAgICAgICBsYXRlc3QgY2hhbmdlLgoKICAgICAgICAqIFBhZ2VJbmZvLmpzcCBjYW4gbm93IGRpc3BsYXkgZGlmZmVyZW5jZXMgYmV0d2VlbiBhIHByZXZpb3VzCiAgICAgICAgdmVyc2lvbiBhbmQgdGhlIGN1cnJlbnQgdmVyc2lvbi4KCiAgICAgICAgKiBEaWZmLmpzcCBub3cgaGFuZGxlcyByZXF1ZXN0cyBmb3IgY3VycmVudCB2ZXJzaW9uIGFzIHdlbGwuCgoyMDAxLTEyLTAxICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuNi4xLWN2cy4KCiAgICAgICAgKiBSZW1vdmVkIGxhc3QgdHJhY2VzIG9mIEpTUCB0YWdzLgoKICAgICAgICAqIENoYW5nZWQgcGx1Z2luIHBhcmFtZXRlciBtYXJrZXIgdG8gV0hFUkUgaW5zdGVhZCBvZiBXSVRILgoKMjAwMS0xMS0yNSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIEFkZGVkIG5ldyBwcm9wZXJ0eToganNwd2lraS5iYXNlVVJMIHRvIGRlZmluZSBwcm90ZWN0aW9uIGFnYWluc3QKICAgICAgICBVUkwgcmV3cml0aW5nIGdhdGV3YXlzLiAgUmVxdWVzdGVkIGJ5IEtpbSBIb2x2aWFsYS4KCiAgICAgICAgKiBBZGRlZCB0aGUgZW50aXJlIHBsdWdpbiBzeXN0ZW0sIG1ha2luZyBtYW55IEpTUCBwYWdlcyBvYnNvbGV0ZS4KICAgICAgICBOZXcgY2xhc3NlcyBpbmNsdWRlIFBsdWdpbk1hbmFnZXIsIHRha2luZyBjYXJlIG9mIHRoZSBwbHVnaW5zLgoKICAgICAgICAqIEFkZGVkIGNvbS5lY3lyZC5qc3B3aWtpLnBsdWdpbiBwYWNrYWdlIHdpdGggbmV3IHBsdWdpbiBjbGFzc2VzOgogICAgICAgIFJlY2VudENoYW5nZXNQbHVnaW4sIFVudXNlZFBhZ2VzUGx1Z2luLCBVbmRlZmluZWRQYWdlc1BsdWdpbiwKICAgICAgICBSZWZlcnJpbmdQYWdlc1BsdWdpbi4KCjIwMDEtMTEtMjMgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBNb3ZlZCBUcmFuc2xhdG9yUmVhZGVyLnJlcGxhY2VTdHJpbmcoKSB0byBUZXh0VXRpbCwgc2luY2UgaXQgaXMKICAgICAgICBhIG1vcmUgbG9naWNhbCBwbGFjZS4KCjIwMDEtMTEtMjMgIEVyaWsgQnVubiAgPEVyaWsuQnVubkBub3NwYW0ubWVtZWNyeS5uZXQ+CgogICAgICAgICogQWRkZWQgUmVmZXJlbmNlTWFuYWdlciBhbmQgdXRpbGl6aW5nIGZlYXR1cmVzLiBKU1BXaWtpIGNhbgogICAgICAgIG5vdyBrZWVwIHRyYWNrIG9mIHVudXNlZCBhbmQgdW5kZWZpbmVkIHBhZ2VzLCBhbmQgb2YgcGFnZXMgCiAgICAgICAgcmVmZXJyaW5nIHRvIGEgZ2l2ZW4gcGFnZS4gSW5pdGlhbCB2ZXJzaW9uLCB2ZXJ5IHVub3B0aW1pemVkLgogICAgICAgIFNlZSBSZWZlcmVuY2VNYW5hZ2VyLmphdmEgYW5kIFVudXNlZFBhZ2VzLmpzcC4KCjIwMDEtMTEtMjAgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBOb3cgcmVwbGFjZXMgSFRNTCBlbnRpdGllcyBjb3JyZWN0bHkgYWxzbyBpbiBnZXRUZXh0KCkuICBUaGFua3MKICAgICAgICB0byBLaW0gSG9sdmlhbGEgZm9yIHBvaW50aW5nIHRoaXMgb25lIG91dC4KCiAgICAgICAgKiBUaGlzIGlzIHJlbGVhc2UgdjEuNi4wLgoKICAgICAgICAqIFF1b3RlcyBpbiBIVE1MIHRleHQgaXMgbm93IGVzY2FwZWQgdXNpbmcgJnF1b3Q7CgoyMDAxLTExLTE4ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuNS44LgoKICAgICAgICAqIEZpeGVkIHByb2JsZW0gd2l0aCBVVEYtOCBkZWNvZGluZyB0cmFzaGluZyBhIHZhcmlhYmxlLiAgVGhhbmtzCiAgICAgICAgdG8gQ2hyaXMgQnJvb2tpbmcuCgogICAgICAgICogU2VhcmNoaW5nIGluIFVURi04IGZpbGVzIG5vdyB3b3Jrcy4KCjIwMDEtMTEtMTQgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBUcmFuc2xhdG9yUmVhZGVyIG5vdyB0YWtlcyBhIFJlYWRlciBpbnN0ZWFkIG9mIEJ1ZmZlcmVkUmVhZGVyLgoKICAgICAgICAqIFJld29ya2VkIHNvbWUgb2YgdGhlIGludGVybmFscyBvZiBXaWtpRW5naW5lIGFuZAogICAgICAgIFRyYW5zbGF0b3JSZWFkZXIsIG1ha2luZyB0aGVtIGVhc2llciB0byByZWFkLgoKICAgICAgICAqIHYxLjUuNy1iZXRhLgoKICAgICAgICAqIEluY29ycG9yYXRlZCBmaXggZnJvbSBDaHJpcyBCcm9va2luZyBmb3IgdGhlIFVSTCBlbmNvZGluZywgYQogICAgICAgIHdvcmthcm91bmQgZm9yIEpESyBidWcgIzQyNTcxMTUuCgoyMDAxLTExLTExICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuNS42CgogICAgICAgICogQWRkZWQgTkRDIGZvciBhbGwgbWFqb3IgSlNQIHBhZ2VzIHRvIG1ha2UgdGhlbSBzaW1wbGVyIHRvCiAgICAgICAgZGVidWcuIAoKICAgICAgICAqIEFsbCBwYWdlcyBub3cgYWxzbyBleHBvcnQgdGhlIE1FVEEgQ29udGVudC1UeXBlIGluZm9ybWF0aW9uIHRvCiAgICAgICAgc3VwcG9ydCBvbGRlciBicm93c2Vycy4KCiAgICAgICAgKiBQb3NzaWJseSBmaXhlZCBhIHByb2JsZW0gd2l0aCByZWFkQ29udGVudHMoKSB0aHJvd2luZyBhbgogICAgICAgIElPRXhjZXB0aW9uOiAiaW52YWxpZCBtYXJrIiBieSBpbmNyZWFzaW5nIGJ1ZmZlciBzaXplLgoKICAgICAgICAqIFJDUyBjb21tYW5kcyBub3cgaW5oZXJpdCB0aGUgcGFyZW50IGVudmlyb25tZW50LiAgVGhpcyBtaWdodAogICAgICAgIGhlbHAgd2l0aCBzb21lIFdpbmRvd3MtcmVsYXRlZCBpc3N1ZXMuCgoyMDAxLTExLTA4ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogUHJldmVudCByb2JvdHMgZnJvbSBjYWNoaW5nIEVkaXQsIERpZmYsIFBhZ2VJbmZvIGFuZAogICAgICAgIFBhZ2VNb2RpZmllZCAtIG5vdCBtdWNoIHBvaW50IGluIGNhY2hpbmcgdGhvc2UsIHJlYWxseS4KCiAgICAgICAgKiB2MS41LjUtYmV0YS4KCiAgICAgICAgKiBCdWcgZml4OiBTdGFydGluZyBhIG5ldyBwYWdlIG5vIGxvbmdlciByZXN1bHRzIGFzICdudWxsJyBhcyB0aGUKICAgICAgICBpbml0aWFsIHRleHQuICBPb3BzLgoKMjAwMS0xMS0wNyAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjUuNAoKICAgICAgICAqIE5vdyBGaWxlU3lzdGVtUHJvdmlkZXIgYW5kIFJDU0ZpbGVQcm92aWRlciBkZWZhdWx0IGJhY2sgdG8KICAgICAgICBJU08tODg1OS0xIGlmIHRoZSBkYXRhIGlzIG9idmlvdXNseSBub3QgVVRGLTguICBUaGlzIG1ha2VzCiAgICAgICAgdXBncmFkaW5nIG11Y2ggZWFzaWVyLgoKICAgICAgICAqIE9vcHMsIGRpZmYgZm9yZ290IHRvIHVzZSB0aGUgY2hvc2VuIGNoYXJhY3RlciBlbmNvZGluZywgYW5kCiAgICAgICAgd291bGQgYXNzdW1lIElTTy04ODU5LTEuCgoyMDAxLTExLTA2ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuNS4zCgogICAgICAgICogQnVnIGZpeDogdGhlIFJDU0ZpbGVQcm92aWRlciB1c2VkIFVUQyBpbnN0ZWFkIG9mIGxvY2FsIHRpbWUuCiAgICAgICAgTm93IGZpeGVkLiAgSWYgeW91J3ZlIGNoYW5nZWQgdGhlIGxvZ2NvbW1hbmRzIGluCiAgICAgICAganNwd2lraS5wcm9wZXJ0aWVzLCBjaGVjayB0aGUgbmV3IGZvcm1hdCwgb3IgeW91J2xsIGJlIGJ1cm5lZC4KCiAgICAgICAgKiBKU1BXaWtpIGNhbiBub3cgaGFuZGxlIGFsc28gbm9uLUlTTy04ODU5LTEgY2hhcnNldHMuICBDaGVjawogICAgICAgIFJFQURNRSBmb3IgbW9yZSBpbmZvLiAgVGhhbmtzIHRvICBDaHJpcyBCcm9va2luZyBmb3IgdGhlIGluaXRpYWwKICAgICAgICBjb2RlLiAgVGhpcyBpcyBhIGhlYXZ5LWR1dHkgY2hhbmdlIC0gbW9zdCBvZiB0aGUgSlNQIHBhZ2VzIHdlcmUKICAgICAgICBhZmZlY3RlZCwgc2luY2UgdGhleSBuZWVkIHRvIGRlY29kZSB0aGUgcGFnZSBuYW1lcyBpbiBhIG5ldyB3YXkuCgogICAgICAgICogdjEuNS4yCgogICAgICAgICogRm9yIGJyb3dzZXJzIHRoYXQgZG8gbm90IHN1cHBvcnQgQ1NTLCBXaWtpLmpzcCBub3cgYWxzbyB1c2VzCiAgICAgICAgZXhwbGljaXQgRk9OVCB3aGVuIGRpc3BsYXlpbmcgdmVyc2lvbiBpbmZvcm1hdGlvbi4KCiAgICAgICAgKiBFbXB0eSBsaXN0IGl0ZW1zIGNvdWxkIGNhdXNlIGNyYXNoZXMgaW4gcGFyc2luZy4gIE5vdyBmaXhlZCwKICAgICAgICB0aGFua3MgdG8gTWlrYWVsIEhvbmthbGEgZm9yIHJlcG9ydGluZyB0aGlzLgoKICAgICAgICAqIE9vcHMsIGl0IHdhcyBwb3NzaWJsZSB0byBwdXQgSmF2YXNjcmlwdCBpbnNpZGUgZXh0ZXJuYWwgb3IgaW1hZ2UKICAgICAgICBsaW5rcy4gIE5vdyBmaXhlZCAtIGFsbCBxdW90ZXMgaW5zaWRlIGxpbmsgbmFtZXMgYXJlIFVSTEVuY29kZWQuCgoyMDAxLTExLTA0ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CiAgICAgICAgCiAgICAgICAgKiB2MS41LjEKICAgICAgICAKICAgICAgICAqIEFkZGVkIFdpa2lFbmdpbmUuc2F2ZVRleHQoIFN0cmluZywgU3RyaW5nLCBIdHRwU2VydmxldFJlcXVlc3QgKQogICAgICAgIHNvIHRoYXQgaXQgY2FuIGdldCB0aGUgYXV0aG9yIGluZm9ybWF0aW9uIGZyb20gdGhlIHJlcXVlc3QuICBUaGUKICAgICAgICBvbGQgQVBJIGlzIHN0aWxsIHN1cHBvcnRlZC4KCiAgICAgICAgKiBXaWtpUGFnZVByb3ZpZGVyIGludGVyZmFjZSBjaGFuZ2VkOiBwdXRQYWdlVGV4dCgpIG5vdyB0YWtlcyBhCiAgICAgICAgV2lraVBhZ2UgYXMgYW4gZXh0cmEgYXJndW1lbnQuCgogICAgICAgICogUkNTRmlsZVByb3ZpZGVyIGNhbiBub3cgc2F2ZSBhbmQgcmV0cmlldmUgYXV0aG9yIGluZm8gYXMgd2VsbC4KCiAgICAgICAgKiBBbmNob3IgdHlwZXMgKGkuZS4gaHlwZXJsaW5rcykgbm93IGhhdmUgY2xhc3NlcyBzbyB0aGF0IHlvdSBjYW4KICAgICAgICByZWRlY29yYXRlIHRoZW0gaW4gdGhlIENTUyBmaWxlcy4gIFNlZSB0aGUgQ1NTIGZpbGVzIGZvciBtb3JlCiAgICAgICAgaW5mby4KCiAgICAgICAgKiBEVEQgY2F1c2VkIE1vemlsbGEgdG8gc2xpcCBpbnRvIHN0YW5kYXJkcy1jb21wbGlhbnQgbW9kZS4gIEZpeGVkCiAgICAgICAgdG9wLW1hcmdpbnMgaW4ganNwd2lraV9pZS5jc3MuCgogICAgICAgICogQWRkZWQgZG9jdW1lbnQgdHlwZSBkZWNsYXJhdGlvbnMgdG8gYWxsIEpTUCBmaWxlcy4KCjIwMDEtMTEtMDIgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBUaGlzIGlzIFIzLCB2MS41LjAKCiAgICAgICAgKiBSZXdyb3RlIFJFQURNRS4KCiAgICAgICAgKiBUaGUgZGlzdHJpYnV0aW9uIGFyY2hpdmUgbm93IGNvbnRhaW5zIGEgc2VwYXJhdGUgYXJjaGl2ZSBmb3IgYWxsCiAgICAgICAgc2FtcGxlIHdpa2kgcGFnZXMgdG8gaGVscCB5b3UgYm9vdHN0cmFwIHlvdXIgb3duIFdpa2kuCgogICAgICAgICogQWRkZWQgSlNQV2lraVRpcHMgcGFnZSB0byB0aGUgc2FtcGxlIHdpa2kgcGFnZXMgY29sbGVjdGlvbi4KCiAgICAgICAgKiBSZW1vdmVkIHRoZSBhdXRoZW50aWNhdGlvbiBzY2hlbWUgZnJvbSB3ZWIueG1sIC0gb3V0LW9mLWJveAogICAgICAgIEpTUFdpa2kgbm93IGFsbG93cyBhY2Nlc3MgdG8gYW55b25lLgoKICAgICAgICAqIERlZmF1bHQsIG91dC1vZi10aGUtYm94IFBhZ2UgUHJvdmlkZXIgaXMgbm93CiAgICAgICAgRmlsZVN5c3RlbVByb3ZpZGVyLiAgVGhpcyBzaG91bGQgbWFrZSBidWlsZGluZyB5b3VyIGZpcnN0IFdpa2kgYQogICAgICAgIGJpdCBzaW1wbGVyLgoKICAgICAgICAqIEFkZGVkIGZpbGUgY29tbWFuZHMgdG8ganNwd2lraS5wcm9wZXJ0aWVzLiAgQWxzbywgcmVtb3ZlZAogICAgICAgIHJlZmVyZW5jZXMgdG8gbXkgb3duIGVtYWlsIGFkZHJlc3MgLSBJIGtlcHQgZ2V0dGluZyBwbGVudHkgb2YKICAgICAgICBhdXRvbWF0aWMgZW1haWwgZnJvbSBwZW9wbGUgdHJ5aW5nIHRvIHNldCB1cCB0aGVpciBvd24gV2lraSA6LSkuCgogICAgICAgICogUmVtb3ZlZCBpbmRleC5odG1sIGFuZCByZXdyb3RlIHdlYi54bWwgdG8gYXV0b21hdGljYWxseSBncmFiIGFsbAogICAgICAgIGRpcmVjdG9yeSBhY2Nlc3NlcyB0byBXaWtpLmpzcC4KCiAgICAgICAgKiBXZSBub3cgdXNlIHBhZ2VDb250ZXh0LmZvcndhcmQoKSB0byBnbyB0byB0aGUgUGFnZU1vZGlmaWVkLmpzcAogICAgICAgIHdoZW4gYSBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBvY2N1cnMsIGluc3RlYWQgb2YgdXNpbmcgcmVkaXJlY3QuCiAgICAgICAgVGhhbmtzIHRvIENocmlzIEJyb29raW5nIGZvciB0aGlzIGhpbnQuCgogICAgICAgICogU2xpZ2h0IGNvc21ldGljYWwgY2hhbmdlcyBpbiBqc3B3aWtpX25zLmNzcwoKICAgICAgICAqIEFkZGVkIGNvbW1lbnRzIGFyb3VuZCBKYXZhc2NyaXB0IGNvZGUgaW4gY3NzaW5jbHVkZS5qcyB0byBiZXR0ZXIKICAgICAgICBsaXZlIHdpdGggb2xkIGJyb3dzZXJzLgoKMjAwMS0xMS0wMSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIEJ1bXBlZCB2ZXJzaW9uIHRvIDEuNC4zLWN2cy4KCiAgICAgICAgKiBUaGVyZSBpcyBub3cgYSBzYW1wbGUgZW50cnkgaW4ganNwd2lraS5wcm9wZXJ0aWVzIGRlbW9uc3RyYXRpbmcKICAgICAgICBob3cgdG8gbWFrZSBhIGRpcmVjdCBsaW5rIHRvIHRoZSBwYWdlIGVkaXRvciBieSB1c2luZyBJbnRlcldpa2kKICAgICAgICBsaW5raW5nLiAgW0VkaXQ6TWFpbl0gcmVkaXJlY3RzIHlvdSB0byB0aGUgcGFnZSB3aGVyZSB5b3UgY2FuIGVkaXQKICAgICAgICB0aGUgTWFpbiBwYWdlLgoKICAgICAgICAqIExlZnRNZW51LmpzcCBub3cgcmVhZHMgaXRzIGNvbnRlbnRzIGR5bmFtaWNhbGx5IGZyb20gYSBXaWtpIHBhZ2UKICAgICAgICBjYWxsZWQgIkxlZnRNZW51Ii4gIFRoYW5rcyB0byBNaWthZWwgSG9ua2FsYSBmb3IgdGhpcyBpZGVhLgoKMjAwMS0xMC0zMCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIEJ1bXBlZCB2ZXJzaW9uIHRvIDEuNC4yLWN2cy4KCiAgICAgICAgKiBXaWtpLmpzcCBjaGFuZ2VkIHdpdGggcmVzcGVjdCB0byBoYW5kbGluZyBvZiBvbGQgcGFnZSB2ZXJzaW9ucy4KICAgICAgICBJdCBubyBsb25nZXIgZGlzcGxheXMgdGhlICJlZGl0IGN1cnJlbnQgdmVyc2lvbiIuCgogICAgICAgICogVGV4dEZvcm1hdHRpbmdSdWxlcyBub3cgaGFzIHBsZW50eSBvZiBtb3JlIGV4cGxhbmF0aW9ucy4KCiAgICAgICAgKiBBZGRlZCBzdXBwb3J0IGZvciBhcmJpdHJhcnkgbGV0dGVycyBpbiBXaWtpTmFtZXMuICBOb3cgaXQncwogICAgICAgIHBvc3NpYmxlIHRvIHVzZSBhbnkgY2hhcmFjdGVyIHNldC4KCiAgICAgICAgKiBBZGRlZCBzdXBwb3J0IGZvciBsaW5rcyB3aXRoaW4gYSBkb2N1bWVudCAoImZvb3Rub3RlcyIpLiAgVXNlCiAgICAgICAgWyMxXSB0byBjcmVhdGUgYSBmb290bm90ZSBhbmQgWzFdIHRvIGxpbmsgdG8gaXQuCgogICAgICAgICogRW1wdHkgbGlua3Mgbm8gbG9uZ2VyIGdlbmVyYXRlIGEgaHlwZXJsaW5rLgoKICAgICAgICAqIEZpbGVTeXN0ZW1Qcm92aWRlciBhbmQgUkNTRmlsZVByb3ZpZGVyIG5vdyBrbm93IGhvdyB0byBoYW5kbGUKICAgICAgICBXaWtpTmFtZXMgdGhhdCBjb250YWluIGlsbGVnYWwgY2hhcmFjdGVycy4gIEF0IHRoZSBtb21lbnQgdGhleSB1c2UKICAgICAgICBzaW1wbHkgdGhlIGphdmEubmV0LlVSTEVuY29kZXIgY2xhc3MgdG8gbWFrZSB0aGUgY29udmVyc2lvbi4KCiAgICAgICAgKiBBZGRlZCB3cmFwPSJ2aXJ0dWFsIiB0byBFZGl0LmpzcCB0ZXh0YXJlYSBlbGVtZW50IHRvIG1ha2UgaXQKICAgICAgICBhbHNvIHdyYXAgb24gTlM0LgoKMjAwMS0xMC0yNSAgRXJpayBCdW5uICA8RXJpay5CdW5uQG5vc3BhbS5tZW1lY3J5Lm5ldD4KCiAgICAgICAgKiBBZGRlZCB0aGUgY2FwYWJpbGl0eSB0byB2aWV3IG9sZGVyIHZlcnNpb25zIG9mIGEgV2lraVBhZ2UuIAogICAgICAgIFRoZSBmdW5jdGlvbmFsaXR5IGlzIGFjY2Vzc2VkIGZyb20gUGFnZUluZm8uanNwLiBXaWtpLmpzcAogICAgICAgIGlzIGFmZmVjdGVkLCBhcyB3ZWxsLCBhbmQgV2lraUVuZ2luZS5qYXZhIGhhcyBuZXcgbWV0aG9kcwogICAgICAgIChidXQgbm8gYWN0dWFsIG5ldyBmdW5jdGlvbmFsaXR5KS4gICAgICAgIAoKMjAwMS0xMC0yMSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIFRoaXMgaXMgUjIgLSB2MS40LjAuCgogICAgICAgICogUmV3cm90ZSB0aGUgaW5jbHVkZWQgc2FtcGxlIHBhZ2VzLgoKMjAwMS0xMC0yMCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIGJ1aWxkLnhtbCBjYW4gbm93IGdlbmVyYXRlIGphdmFkb2NzIHRvIGRvY3MvamF2YWRvYy4KCiAgICAgICAgKiBFZGl0LmpzcCBub3cgaGFzIGV4cGxhaW5zIGhlYWRpbmdzLCB0b28gKHRoYW5rcyBNYXR0aSkuCgogICAgICAgICogQ2hhbmdlZCB0aGUgdmVyc2lvbmluZyBzbyB0aGF0IHdoZW5ldmVyIHlvdSBjaGVjayBvdXQgYSBDVlMKICAgICAgICBjb3B5LCB5b3UgZ2V0IHZYLlkuWi1jdnMgYXMgdGhlIHZlcnNpb24gc3RyaW5nLiAgVGhpcyB3YXMgZG9uZSB0bwogICAgICAgIHNlcGFyYXRlIHRoZSBkZXZlbG9wbWVudCB2ZXJzaW9uIGZyb20gdGhlIGFjdHVhbCByZWxlYXNlIHZlcnNpb24uCgogICAgICAgICogQWRkZWQgdGhlIGxpc3Qgb2YgaW1hZ2UgaW5saW5lIGxpbmsgcGF0dGVybnMgdG8gU3lzdGVtSW5mby5qc3AuCgoyMDAxLTEwLTE4ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuMy4zIC0gbm90IHJlbGVhc2VkLgoKICAgICAgICAqIFlvdSBjYW4gbm93IGhhdmUgbXVsdGlsaW5lIGxpc3QgaXRlbXMgaWYgeW91IHByZXBlbmQgZWFjaAogICAgICAgIGFkZGl0aW9uYWwgbGluZSB3aXRoIGEgc3BhY2UuCgogICAgICAgICogQWRkZWQgdGhlIGFiaWxpdHkgdG8gc3BlY2lmeSBtdWx0aXBsZSBwYXR0ZXJucyBkZXRlcm1pbmluZyB3aGljaAogICAgICAgIGltYWdlcyBhcmUgaW5saW5lZCBhbmQgd2hpY2ggYXJlIG5vdC4gIFNlZSBqc3B3aWtpLnByb3BlcnRpZXMgZm9yCiAgICAgICAgbW9yZSBpbmZvcm1hdGlvbi4KCjIwMDEtMTAtMTYgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBBbGwgZXh0ZXJuYWwgbGlua3MgZW5kaW5nIHdpdGggLnBuZyBhcmUgbm93IGlubGluZWQgYXMgaW1hZ2VzLgogICAgICAgIFRoaXMgaXMgYW4gZXhwZXJpbWVudCB0byBzZWUgaWYgaXQgYWN0dWFsbHkgd29ya3MuICBEb24ndCBleHBlY3QKICAgICAgICBpdCB0byBsYXN0LgoKICAgICAgICAqIFBhZ2UgbmFtZXMgY2FuIG5vdyBjb250YWluIF8gYW5kIC4gYXMgd2VsbC4KCiAgICAgICAgKiBBZGRlZCBzb21lIGNvc21ldGljYWwgY2hhbmdlcyB0byB0aGUgSlNQIHBhZ2VzLgoKMjAwMS0xMC0wNiAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIFJlbGVhc2UgdjEuMy4xIC0gZmlyc3Qgb2ZmaWNpYWwgcmVsZWFzZS4KCiAgICAgICAgKiBDbGFyaWZpZWQgYnVpbGQgc3lzdGVtLgoKICAgICAgICAqIEFsbCBmaWxlcyBzaG91bGQgbm93IGNvbnRhaW4gY29weXJpZ2h0LgoKICAgICAgICAqIEFkZGVkIHBsZW50eSBvZiBqYXZhZG9jIGNvbW1lbnRhcnkuCgoyMDAxLTEwLTAyICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogQm9sZCBhbmQgaXRhbGljIGluZm9ybWF0aW9uIGlzIG5vdyBjYXJyaWVkIGFjcm9zcyBsaW5lIGFuZAogICAgICAgIHBhcmFncmFwaCBicmVha3MuCgoyMDAxLTA5LTMwICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogQWRkZWQgY3NzaW5jbHVkZS5qcyBhbmQgdGhyZWUgYnJvd3Nlci1kZXBlbmRlbnQgc3R5bGVzaGVldAogICAgICAgIGZpbGVzLiAgQWxzbywgYWxsIGpzcCBmaWxlcyBub3cgaW5jbHVkZSB0aGUgY3NzaW5jbHVkZS5qcy4KCjIwMDEtMDgtMjUgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBSZW1vdmVkIGEgZGVidWcgc3RhdGVtZW50LCBzb21lIGNvc21ldGljYWwgY2hhbmdlcy4KCiAgICAgICAgKiB2MS4zLjAKCiAgICAgICAgKiBBZGRlZCBqc3B3aWtpLmFwcGxpY2F0aW9uTmFtZSBwcm9wZXJ0eSwgYW5kIHN1cHBvcnQgaW50bwogICAgICAgIFdpa2lFbmdpbmUuCgogICAgICAgICogQWRkZWQgU3lzdGVtSW5mby5qc3AKCiAgICAgICAgKiBBZGRlZCBpbnRlcldpa2kgZnVuY3Rpb25hbGl0eS4gIE5vdyB5b3UgY2FuIGRlZmluZSBsaW5rcyBpbgogICAgICAgICdqc3B3aWtpLnByb3BlcnRpZXMnIHdoZXJlIGEgbGluayBvZiB0aGUgZm9ybSBbV2lraVhYOlBhZ2VOYW1lXQogICAgICAgIHNob3VsZCBwb2ludCB0by4KCjIwMDEtMDgtMTMgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS4yLjAKCiAgICAgICAgKiBXaWtpRW5naW5lIG5vdyBiZWhhdmVzIG11Y2ggYmV0dGVyIGlmIGEgcHJvdmlkZXIgY2Fubm90IGJlCiAgICAgICAgaW5zdGFudGlhdGVkLgoKICAgICAgICAqIEFkZGVkIHJ1ZGltZW50YXJ5IHN1cHBvcnQgZm9yIHZlcnNpb24gaGlzdG9yeSBpbiBhIG11bHRpdHVkZSBvZgogICAgICAgIHBsYWNlcy4KCjIwMDEtMDgtMTMgIEphbm5lIEphbGthbmVuICA8amFsa2FuZW5Abm9zcGFtLmtvc2guZWN5cmQuY29tPgoKICAgICAgICAqIFdpa2kuanNwIGRpc3BsYXllZCBudWxsIGRhdGUgaWYgcGFnZSBkaWQgbm90IGV4aXN0LgoKMjAwMS0wNy0yMyAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjEuMgoKICAgICAgICAqIFNlYXJjaCBlbmdpbmUgaW50ZXJmYWNlIGlzIG5vdyBjbGVhbmVyLgoKICAgICAgICAqIFNlcGFyYXRlZCBhY3R1YWwgV2lraSBwYWdlIHNlcnZpbmcgZnJvbSB0aGUgV2lraUVuZ2luZSBhbmQgaGlkCiAgICAgICAgaXQgdW5kZXIgdGhlIFdpa2lQYWdlUHJvdmlkZXIgaW50ZXJmYWNlLgoKMjAwMS0wNy0yMCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIFJlYWxtIG5hbWUgaXMgbm93ICJKU1BXaWtpIGVkaXRvciIgaW5zdGVhZCBvZiAiQmFzaWMKICAgICAgICBBdXRoZW50aWNhdGlvbiBBcmVhIiBvciB3aGF0ZXZlciBzdHVwaWQgaXQgd2FzLgoKMjAwMS0wNy0xOSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIENvbnZlcnNpb24gb2Yge3sgaXMgbm93IGZpeGVkIC0gaXQgbm8gbG9uZ2VyIHRyYW5zZm9ybXMge3t7IGludG8KICAgICAgICB7PFRUPiBpbiBjZXJ0YWluIGNhc2VzLiAgQWxzbywgbXVsdGlwbGUge3t7cyBhcmUgbm93IGhhbmRsZWQKICAgICAgICBncmFjZWZ1bGx5LgoKICAgICAgICAqIHYxLjEuMQoKMjAwMS0wNy0xOCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIEFkZGVkIGEgU2VhcmNoIGJveCB0byB0aGUgaGVhZGVyIG9mIGVhY2ggcGFnZS4KCiAgICAgICAgKiBIVE1MIGVudGl0aWVzIGFyZSBub3cgcmVwbGFjZWQgY29ycmVjdGx5IGluIFBhZ2VNb2RpZmllZC5qc3AgdG8KICAgICAgICBwcmV2ZW50IGFyYml0cmFyeSBIVE1MIHRhZ3MuCgogICAgICAgICogQWRkZWQgc3VwcG9ydCBmb3IgPFRUPiB0YWcgd2l0aCB7e3RleHR9fS4KCjIwMDEtMDctMTYgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBDb3VsZG4ndCBlZGl0IG5ldyBwYWdlcywgb29wcy4KCjIwMDEtMDctMTUgICAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5yZWdleC5maT4KCiAgICAgICAgKiBBZGRlZCBydWRpbWVudGFyeSBwYWdlIGxvY2tpbmcuCgoyMDAxLTA3LTE0ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogQXBwZWFyYW5jZSBvZiB0aGUganNwIHBhZ2VzIGlzIG5vdyBzbGlnaHRseSBtb3JlIGNvbnZlcmdlbnQuCgogICAgICAgICogSW1wcm92ZWQgc2VhcmNoIGVuZ2luZSB0byBhY2NlcHQgZXhjbHVzaW9uL2luY2x1c2lvbiBhIGxhCiAgICAgICAgR29vZ2xlLiAgU2NvcmluZyBub3cgd29ya3MsIHRvby4KCiAgICAgICAgKiBBZGRlZCBvcmRlcmVkIGxpc3RzICgjKS4KCiAgICAgICAgKiBIb3Jpem9udGFsIHJ1bGVyIGlzIG5vdyBmb3VyIGRhc2hlcyBpbnN0ZWFkIG9mIHRocmVlIHRvIGNvbXBseQogICAgICAgIHdpdGggdGhlIFdpa2kgc3RhbmRhcmQuCgoyMDAxLTA3LTEzICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogQWRkZWQganNwd2lraS5zcGVjaWFsUGFnZS5YWFggcmVkaXJlY3Rpb24uICBZb3UgY2FuIG5vdyBuYW1lCiAgICAgICAgc3BlY2lhbCBwYWdlcyB0aGF0IGdldCByZWZlcnJlZCB0byB3aGljaGV2ZXIgSlNQIHBhZ2UgeW91IHdhbnQuCiAgICAgICAgRm9yIGV4YW1wbGUsIHlvdSBjYW4gYWx3YXlzIHJlZmVyIHRvIFJlY2VudENoYW5nZXMuanNwIGluIHlvdXIKICAgICAgICBXaWtpIGNvZGUgYnkgdXNpbmcgW1JlY2VudENoYW5nZXNdLCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydHkKICAgICAgICBzZXQ6IAogICAgICAgIAogICAgICAgIGpzcHdpa2kuc3BlY2lhbFBhZ2UuUmVjZW50Q2hhbmdlcyA9IFJlY2VudENoYW5nZXMuanNwCgogICAgICAgICogdjEuMC41CgoyMDAxLTA3LTEwICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogUmVtb3ZlZCBTa2lwSFRNTEl0ZXJhdG9yIGJlY2F1c2UgaXQgd2FzIGEgYmFkIGlkZWEuICBObwogICAgICAgIEludGVyQ2FwcGVkIGh5cGVybGlua3MgYXJlIGF2YWlsYWJsZS4KCiAgICAgICAgKiBGaXhlZCB0ZXN0cyBzbyB0aGF0IHRoZXkgbm93IGFjdHVhbGx5IHJ1bi4gIFRoaXMgcmVxdWlyZWQgYSBuZXcKICAgICAgICBjb25zdHJ1Y3RvciBmb3IgV2lraUVuZ2luZS4KCjIwMDEtMDctMDkgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBUcmFuc2xhdG9yV3JpdGVyLmNsZWFuTGluaygpIG5vdyByZW1vdmVzIGFsbCBub24tbGV0dGVycyBhbmQKICAgICAgICBub24tbnVtYmVycyBmcm9tIHRoZSBsaW5rIG5hbWUgc28gdGhhdCB5b3UgY2FuIHVzZSBhbGwgc29ydHMgb2YKICAgICAgICBwdW5jdHVhdGlvbiBpbnNpZGUgYSBsaW5rIG5hbWUuCgogICAgICAgICogSW1wbGVtZW50ZWQgUmVjZW50Q2hhbmdlcyBsaXN0IGJ5IHdyaXRpbmcgUmVjZW50Q2hhbmdlcy5qc3AuCiAgICAgICAgV2lraS5qc3AgYWxzbyByZWRpcmVjdHMgYWxsIHJlcXVlc3RzIHRvIGEgcGFnZSBjYWxsZWQKICAgICAgICAnUmVjZW50Q2hhbmdlcycgdG8gUmVjZW50Q2hhbmdlcy5qc3AuCgoyMDAxLTA3LTA2ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogQWRkZWQgY29uZmlndXJhdGlvbiBhdCBldGMvanNwd2lraS5wcm9wZXJ0aWVzLgoKICAgICAgICAqIEFkZGVkIHRoaXMgZmlsZS4KCg==