MjAxMi0xMi0xMiAgSGFycnkgTWV0c2tlIDxtZXRza2VtQGFwYWNoZS5vcmc+CgogICAgICAgKiAyLjguNS1zdm4tMTQKICAgICAgICAKICAgICAgICAqIGZpeGVkIEpTUFdJS0ktNzQyIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIFByaW9yaXR5TGlzdCAocmVwb3J0ZWQgYnkgUmFrZXNoIEsuIENoZXJ1a3VyaSkKCjIwMTItMDQtMTggIEhhcnJ5IE1ldHNrZSA8bWV0c2tlbUBhcGFjaGUub3JnPgoKICAgICAgICogMi44LjUtc3ZuLTEzCiAgICAgICAgCiAgICAgICAgKiBmaXhlZCBKU1BXSUtJLTcyNiBkcm9wIHRoZSAyIGNhc2Utc2Vuc2l0aXZlIHRlc3RzIGluIFdpa2lFbmdpbmVUZXN0LnRlc3RTcGFjZWROYW1lczEKICAgICAgICAKMjAxMi0wNC0xNCAgSGFycnkgTWV0c2tlIDxtZXRza2VtQGFwYWNoZS5vcmc+CiAgICAgICAgCiAgICAgICAgKiAyLjguNS1zdm4tMTIKICAgICAgICAKICAgICAgICAqIGZpeGVkIEpTUFdJS0ktNzI1IFJldHVybiB0byBvcmlnaW5hbCBwYWdlIGF0dGFjaG1lbnRzIGxpc3QgYWZ0ZXIgZGVsZXRpbmcgb25lIGF0dGFjaG1lbnQKCjIwMTItMDMtMjUgIEp1YW4gUGFibG8gU2FudG9zIChqdWFucGFibG8gQVQgYXBhY2hlIERPVCBvcmcpCiAgICAgICAgCiAgICAgICAgKiAyLjguNS1zdm4tMTEKICAgICAgICAKICAgICAgICAqIGZpeGVkIEpTUFdJS0ktNzIyIEJ1aWxkIGJyb2tlbiB1bmRlciBqZGsgMS43CgoyMDEyLTAyLTIyICBIYXJyeSBNZXRza2UgPG1ldHNrZW1AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjguNS1zdm4tMTAKICAgICAgICAKICAgICAgICAqIGZpeGVkIEpTUFdJS0ktNzIxIExvZyBGaWxlTm90Rm91bmRFeGNlcHRpb24gb24gbWlzc2luZyBhdHRhY2htZW50CgoyMDEyLTAxLTE0ICBKdWFuIFBhYmxvIFNhbnRvcyAoanVhbnBhYmxvIEFUIGFwYWNoZSBET1Qgb3JnKQoKICAgICAgICAqIG5vIHZlcnNpb24gYnVtcAogICAgICAgICogY29ycmVjdGVkIGZhaWxpbmcgdW5pdCB0ZXN0czogMTcgb2YgdGhlbSB3ZXJlIGxvY2FsZSBkZXBlbmRhbnQgKHRlc3QgYXNzZXJ0aW9ucyBhc3N1bWVkIAogICAgICAgICAgZW5nbGlzaCBsb2NhbGUpLCBzbyBUZXN0RW5naW5lIGVuZm9yY2VzIGl0IHdoZW4gYnVpbGRpbmcgbW9jayByZXF1ZXN0cwogICAgICAgICogUkNTRmlsZVByb3ZpZGVyIHRlc3RzIGFyZSBleGVjdXRlZCBvbmx5IGlmIFJDUyBpcyBkZXRlY3RlZCBpbiBwYXRoLgoKMjAxMS0wOS0yMCAgRmxvcmlhbiBIb2xlY3playA8ZmxvcmlhbmhAYXBhY2hlLm9yZz4KCiAgICAgICAgKiBubyB2ZXJzaW9uIGJ1bXAKICAgICAgICAqIG1vZGlmaWVkIGpzcHdpa2ktY2hlY2tzdHlsZS54bWwgdG8gYmUgY29tcGF0aWJsZSB3aXRoIENoZWNrU3R5bGUgNS54CiAgICAgICAgKiBjb3JyZWN0ZWQgYSBmZXcgdGhpbmdzIENoZWNrU3R5bGUgd2FzIG5hZ2dpbmcgYWJvdXQKCjIwMTEtMDktMjAgIEhhcnJ5IE1ldHNrZSA8bWV0c2tlbUBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuOC41LXN2bi05CiAgICAgICAgCiAgICAgICAgKiBtb3ZlZCBzZWN1cml0eSBtYW5hZ2VyIGNoZWNrIGZvciBKU1BXSUtJLTcwNSBmcm9tIFNlc3Npb25Nb25pdG9yIHRvIFdpa2lTZXJ2bGV0RmlsdGVyLCBhbmQgCiAgICAgICAgICAgbWFrZSBpdCBhIGxvZyBtZXNzYWdlIGluc3RlYWQgb2YgYW4gZXhjZXB0aW9uLgoKMjAxMS0wOS0xOCAgSGFycnkgTWV0c2tlIDxtZXRza2VtQGFwYWNoZS5vcmc+CgogICAgICAgICogMi44LjUtc3ZuLTgKICAgICAgICAKICAgICAgICAqIGZpeGVkIEpTUFdJS0ktNzA1IChMb2cgYSBjbGVhciBoaW50IHRvIGEgcnVubmluZyBzZWN1cml0eSBtYW5hZ2VyKS4KCjIwMTEtMDgtMDcgIEhhcnJ5IE1ldHNrZSA8bWV0c2tlbUBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuOC41LXN2bi03CiAgICAgICAgCiAgICAgICAgKiBmaXhlZCBKU1BXSUtJLTY5OSAoSkJvc3MgY29tcGxhaW5pbmcgYWJvdXQganNwd2lraS50bGQgYW5kIG9zY2FjaGUudGxkKS4KICAgICAgICAKMjAxMS0wNC0wMyAgSGFycnkgTWV0c2tlIDxtZXRza2VtQGFwYWNoZS5vcmc+CgogICAgICAgICogMi44LjUtc3ZuLTYKICAgICAgICAKICAgICAgICAqIGZpeGVkIEpTUFdJS0ktNjg4IChQb29yIHBlcmZvcm1hbmNlIG9mIENyZW9sZVRvSlNQV2lraVRyYW5zbGF0b3IpLCB0aGFua3MgdG8gSmVsbWVyIEt1cGVydXMuCiAgICAgICAgCjIwMTEtMDEtMjQgIEhhcnJ5IE1ldHNrZSA8bWV0c2tlbUBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuOC41LXN2bi01CiAgICAgICAgCiAgICAgICAgKiBFeHRlbmRlZCB0aGUgbGlzdCBvZiBsdWNlbmUgc2VhcmNoYWJsZSBmaWxlIHN1ZmZpeGVzLCB3ZSBub3cgZG8gCiAgICAgICAgICAgIi50eHQiLCAiLmluaSIsICIueG1sIiwgIi5odG1sIiwgImh0bSIsICIubW0iLCAiLmh0bSIsICIueGh0bWwiLCAiLmphdmEiLCAiLmMiLCAiLmNwcCIsCiAgICAgICAgICAgICIucGhwIiwgIi5hc20iLCAiLnNoIiwgICIucHJvcGVydGllcyIsICIua21sIiwgIi5ncHgiLCAiLmxvYyIKCjIwMTAtMTItMTIgIEhhcnJ5IE1ldHNrZSA8bWV0c2tlbUBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuOC41LXN2bi00CiAgICAgICAgCiAgICAgICAgKiBKU1BXSUtJLTY3MTogV2lraVBhZ2VSZW5hbWVFdmVudCBub3QgZmlyZWQgZHVyaW5nIHBhZ2UgcmVuYW1lLgoKMjAxMC0xMi0wNSBEaXJrIEZyZWRlcmlja3ggPGJydXNoZWRAYXBhY2hlLm9yZz4KCiAgICAgICAgKiB2Mi44LjUtc3ZuLTMKCiAgICAgICAgKiBKU1BXSUtJLTY2NzogRml4ZWQgU2NvcmViYXIgaXNzdWUgaW4gR29vZ2xlIENocm9tZS4gKHdvcmthcm91bmQganMgZXJyb3IpCiAgICAgICAgCiAgICAgICAgKiBKU1BXSUtJLTY3NTogRml4ZWQgVW5pY29kZSBzdXBwb3J0IGluIHF1aWNrRWRpdCAoamF2YXNjcmlwdCByZWdleHApCgogICAgICAgICogSlNQV0lLSS02NzQ6IEZpeGVkIHN1cHBvcnQgZm9yIG5lc3RlZCB0YWJiZWQgc2VjdGlvbnMKCjIwMTAtMDktMzAgIEhhcnJ5IE1ldHNrZSA8bWV0c2tlbUBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuOC41LXN2bi0yCiAgICAgICAgCiAgICAgICAgKiBKU1BXSUtJLTY2NCBTcGVjaWFsUGFnZSByZW5hbWVkLCBidXQgd2lraXBhZ2VzIG5vdCBjaGFuZ2VkLgogICAgICAgIENoYW5nZWQgYWxsIHJlZmVyZW5jZXMgdG8gIkZpbmRQYWdlIiBpbnRvICJTZWFyY2giIC4KCjIwMTAtMDgtMjkgIEhhcnJ5IE1ldHNrZSA8bWV0c2tlbUBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuOC41LXN2bi0xCiAgICAgICAgCiAgICAgICAgKiBKU1BXSUtJLTY2MCBTdXBwb3J0IGV4dGVybmFsIHByb3BlcnRpZXMgaW4gV2lraUVuZ2luZSAoaWRlYSBmcm9tIEpvaG4gTWNLaW5uZXkpCiAgICAgICAgICBZb3UgY2FuIG5vdyBvdmVycmlkZSBpbmRpdmlkdWFsIHByb3BlcnRpZXMgaW4ganNwd2lraS5wcm9wZXJ0aWVzIHVzaW5nIHN0YW5kYXJkCiAgICAgICAgICBKYXZhIFN5c3RlbSBwcm9wZXJ0aWVzLgogICAgICAgICAgCiAgICAgICAqIGZpeGVkIHRoZSBqc3B3aWtpLnBvbGljeSBmaWxlIG5hbWUgbG9va3VwIGluIEF1dGhlbnRpY2F0aW9uTWFuYWdlcgogICAgICAgIAoyMDEwLTA1LTA4ICBIYXJyeSBNZXRza2UgPG1ldHNrZW1AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjguNC1zdm4tMTIKICAgICAgICAKICAgICAgICAqIEpTUFdJS0ktMzkyIGFuZCBKU1BXSUtJLTQ0MiBpbnZhbGlkIGFzc2VydGVkIHVzZXJuYW1lcwogICAgICAgIAogICAgICAgICogSlNQV0lLSS02NDkgQ2FjaGluZ1Byb3ZpZGVyLmRlbGV0ZVZlcnNpb24gbGVhdmVzIGEgc3RhbGUgbV9oaXN0b3J5Q2FjaGUKICAgICAgICAKMjAxMC0wNC0yMyAgRGlyayBGcmVkZXJpY2t4IDxicnVzaGVkQGFwYWNoZS5vcmc+CgogICAgICAgICogMi44LjQtc3ZuLTExCiAgICAgICAgCiAgICAgICAgKiBKU1BXSUtJLTYyNzogTG9naW4gYW5kIE15UHJlZnMgYnV0dG9ucyBub3QgcHJvcGVybHkgYWxpZ25lZAogICAgICAgIGluIENocm9tZSBhbmQgU2FmYXJpLgoKMjAxMC0wNC0wOCAgSGFycnkgTWV0c2tlIDxtZXRza2VtQGFwYWNoZS5vcmc+CgogICAgICAgICogMi44LjQtc3ZuLTEwCiAgICAgICAgCiAgICAgICAgKiBKU1BXSUtJLTY0NDogTlBFIGFmdGVyIHBhZ2UgZXh0ZXJuYWxseSBtb2RpZmllZCwgcmVwb3J0ZWQgYnkgRmFiaWFuIEhhdXB0LgoKMjAxMC0wMi0yMSAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGFwYWNoZS5vcmc+CgogICAgICAgICogMi44LjQtc3ZuLTkKCiAgICAgICAgKiBKU1BXSUtJLTYzNzogRml4IGZvciB6aF9DTiB0cmFuc2xhdGlvbiwgdGhhbmtzIHRvIERhdmlkIEdhby4KCjIwMTAtMDEtMzEgIEhhcnJ5IE1ldHNrZSA8bWV0c2tlbUBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuOC40LXN2bi04CiAgICAgICAgCiAgICAgICAgKiBKU1BXSUtJLTYzMzogVGV4dFV0aWwucmVwbGFjZUVudGl0aWVzIGRvbmUgbXVsdGlwbGUgdGltZXMsIHJlcG9ydGVkIGJ5IFN0ZWZhbiBCb2huLgogICAgICAgIAoyMDEwLTAxLTIwICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjguNC1zdm4tNwogICAgICAgIAogICAgICAgICogSW1wcm92ZWQgZXhwb3J0ZXIgdG8gYWxzbyBleHBvcnQgZnJvbSBhIEZpbGVTeXN0ZW1Qcm92aWRlciByZXBvIHdpdGhvdXQgYWN0dWFsbHkKICAgICAgICBsb2FkaW5nIHRoZSBXaWtpRW5naW5lLgogICAgICAgIAoyMDA5LTEyLTIzIEhhcnJ5IE1ldHNrZSA8bWV0c2tlbUBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuOC40LXN2bi02CiAgICAgICAgCiAgICAgICAgICogSlNQV0lLSS02MjE6IGNoZWNrIGxhc3QgZmlsZXNlcGFyYXRvciBvbiBjb25maWcgcGFnZSwgZHVwbGljYXRlIG9mIEpTUFdJS0ktNDI0LAogICAgICAgICAgICByZXBvcnRlZCBieSBSb2xmIFNjaHVtYWNoZXIuIAoKMjAwOS0xMi0xNSBIYXJyeSBNZXRza2UgPG1ldHNrZW1AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjguNC1zdm4tNQogICAgICAgIAogICAgICAgICAqIEpTUFdJS0ktNjE5OiBJbmNsdWRlIGdlcm9uaW1vLXdlYi54bWwgaW4gSlNQV2lraS53YXIgKHJlcG9ydGVkIGJ5IEp1cmdlbiBXZWJlcikgCiAgICAgICAgICogSlNQV0lLSS02MTg6IEFsbG93IEFkbWluaXN0cmF0b3JzIHRvIG92ZXJyaWRlIGF0dGFjaG1lbnQubWF4c2l6ZSAgKHJlcG9ydGVkIGJ5IEp1cmdlbiBXZWJlcikgCgoyMDA5LTEyLTA2IEhhcnJ5IE1ldHNrZSA8bWV0c2tlbUBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuOC40LXN2bi00CiAgICAgICAgCiAgICAgICAgICogSlNQV0lLSS02MTc6IEF0dGFjaG1lbnRzIHVuc2VhcmNoYWJsZSBhZnRlciByZW5hbWluZyBhIHBhZ2UgCgoyMDA5LTExLTI0ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjguNC1zdm4tMwogICAgICAgIAogICAgICAgICogRml4ZWQgZXhwb3J0IHRvIGRlYWwgYmV0dGVyIHdpdGggYnJva2VuIHJlcG9zaXRvcmllczogYXV0b21hdGljIHJlbmFtaW5nCiAgICAgICAgb2YgY2FzZS1jb25mbGljdHMgKG9uIHN5c3RlbXMgd2hlcmUgdGhleSBhcmUgcG9zc2libGUpLgogICAgICAgIAogICAgICAgICogRXhwb3J0IG5vdyBwcm9wZXJseSBleHBvcnRzIGluIGxvd2VyLWNhc2UuCiAgICAgICAgCjIwMDktMTEtMjMgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuOC40LXN2bi0yCiAgICAgICAgCiAgICAgICAgKiBBZGRlZCBleHBvcnQgc2NyaXB0IChleHBvcnQuc2gpOyBkaXNhYmxlZCBhdHRhY2htZW50IGV4cG9ydCBmb3Igbm93IHRvIHRlc3QKICAgICAgICBwcm9wZXIgZXhwb3J0aW5nLgogICAgICAgIAoyMDA5LTExLTIxIEhhcnJ5IE1ldHNrZSA8bWV0c2tlbUBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuOC40LXN2bi0xCiAgICAgICAgCiAgICAgICAgICogSlNQV0lLSS02MTI6IGZpeCBVc2VyTWFuYWdlbWVudC5qc3AgJ3Mgb3B0aW9uIGluIHVzZXIgc2VsZWN0IGJveCAKICAgICAgICAgKEkgbGlrZSB0byBhZGQgdGhlIG5hbWUgb2YgdGhlIHBlcnNvbiB3aG8gZGlzY292ZXJlZCB0aGlzIGJ1ZywgYnV0CiAgICAgICAgIHRoZSBjb2RlcGFnZSBJU084ODU5LTEgZG9lc24ndCBhbGxvdyB0aGF0KQogICAgICAgCjIwMDktMDktMjYgRGlyayBGcmVkZXJpY2t4IDxicnVzaGVkQGFwYWNoZS5vcmc+CgogICAgICAgICogMi44LjMtc3ZuLTE5CiAgICAgICAgCiAgICAgICAgICogSlNQV0lLSS01OTE6ICMgc2lnbiBiZWhpbmQgaGVhZGxpbmVzIGlzIG5vdyBoaWRkZW4gb24gdGhlIHByaW50ZWQgd2lraSBwYWdlCiAgICAgICAKICAgICAgICAKMjAwOS0wOS0wNiBIYXJyeSBNZXRza2UgPG1ldHNrZW1AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjguMy1zdm4tMTgKICAgICAgICAKICAgICAgICAqIEpTUFdJS0ktNTk3OiBVcGdyYWRlIHl1aWNvbXByZXNzb3IgZnJvbSAyLjMuMyB0byAyLjQuMiB0byBzb2x2ZSAKICAgICAgICBSdW50aW1lRXhjZXB0aW9ucyB3aGVuIHVzaW5nIE9wZW5KREsuCiAgICAgICAgCiAgICAgICAgICAgICAgICAKMjAwOS0wOC0zMCBIYXJyeSBNZXRza2UgPG1ldHNrZW1AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjguMy1zdm4tMTcKICAgICAgICAgICAgICAgIAogICAgICAgICogSW50cm9kdWNlZCB0aGUgbmV3IFBhZ2VWaWV3UGx1Z2luIHdyaXR0ZW4gYnkgQW5kcmUgdmFuIERhbGVuLgogICAgICAgIFRoaXMgcGx1Z2luIGNvdW50cyBwYWdlIHZpZXdzIGFuZCBwcmVzZW50cyB0aGUgc3RhdGlzdGljcyBvbiBwYWdlIHZpZXdzCiAgICAgICAgU2VlIGh0dHA6Ly93d3cuanNwd2lraS5vcmcvd2lraS9QYWdlVmlld1BsdWdpbiBmb3IgdGhlIGNvbXBsZXRlCiAgICAgICAgZG9jdW1lbnRhdGlvbi4KICAgICAgICAKICAgICAgICAqIE1pbm9yIGphdmFkb2MgZXJyb3IgaW4gV2lraVNlY3VyaXR5RXhjZXB0aW9uCiAgICAgICAgCiAgICAgICAgKiBDb21tZW50ZWQgb3V0IGxvZzRqIGxvZ2dlciBzdG10IGluIGpzcHdpa2kucHJvcGVydGllcy50bXBsIGNhdXNpbmcgZHVwbGljYXRlCiAgICAgICAgbG9nIGVudHJpZXMgZHVyaW5nIHRlc3RzCiAgICAgICAgCjIwMDktMDgtMzAgRGlyayBGcmVkZXJpY2t4IDxicnVzaGVkQGFwYWNoZS5vcmc+CgogICAgICAgICogMi44LjMtc3ZuLTE2CiAgICAgICAgICAgICAgICAKICAgICAgICAqIEpTUFdJS0ktNTc3OiB0YWJiZWQgc2VjdGlvbnMgd2l0aCBtYW55IHRhYnMgd2l0aCBsb25nIG5hbWVzIHdpbGwgZmxvYXQgdGhlIAogICAgICAgIHRhYnMgdG8gYSBuZXh0IGxpbmUuIEZpeGVkIHRoZSAnanVtcGluZycgYmVoYXZpb3Igb2YgY2xpY2tpbmcgdGhpcyB3aWRlIHRhYnMsCiAgICAgICAgd2hpY2ggd2FzIGNhdXNlZCBieSBhIHN1cGVyZmx1b3VzIGJvdHRvbS1ib3JkZXIgY3NzIHN0eWxlLgoKICAgICAgICAqIE9wZW4vQ2xvc2Ugb2YgY29sbGFwc2libGUgYm94ZXMgaXMgbm93IG9ubHkgcG9zc2libGUgYnkgY2xpY2tpbmcgdGhlICsvLSBpY29uLgogICAgICAgIEFueSBjbGlja3Mgb24gdGhlIGhlYWRlci1iYXIgd2lsbCBub3QgY2hhbmdlIHRoZSBzdGF0dXMgb2YgdGhlIAogICAgICAgIGNvbGxhcHNpYmxlIGJveCBhbnltb3JlLiBFLkcuIGluIHRoZSBJbmZvIHRhYiwgd2hlbiBsb29raW5nIGF0IHBhZ2UgCiAgICAgICAgZGlmZmVyZW5jZXMgYmV0d2VlbiAyIHZlcnNpb25zLCB5b3UgY2FuIG5vdyBjbGljayB0aGUgdmVyc2lvbiBkcm9wLWRvd25zCiAgICAgICAgd2l0aG91dCBjaGFuZ2luZyB0aGUgc3RhdHVzIG9mIHRoZSBjb2xsYXBzaWJsZSBib3guCgogICAgICAgICogSW1wbGVtZW50ZWQgdGhlIHN0YW5kYXJkIGNzcyBvdmVyZmxvdyB0cmVhdG1lbnQgb2YgdGhlICdkaWZmJyBib2R5LiBIb3Jpem9udGFsIAogICAgICAgIHNjcm9sbC1iYXJzIHdpbGwgb25seSBiZSBzaG93biB3aGVuIGxvb2tpbmcgYXQgd2lkZSBjb250ZW50LgogICAgICAgIFRoaXMgaXMgdGhlIHNhbWUgb3ZlcmZsb3cgdHJlYXRtZW50IGFzIHRoZSBwYWdlIGNvbnRlbnQuCgogICAgICAgIAoyMDA5LTA4LTI1IERpcmsgRnJlZGVyaWNreCA8YnJ1c2hlZEBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuOC4zLXN2bi0xNQogICAgICAgIAogICAgICAgICogSlNQV0lLSS01ODA6IEZpeGluZyB0aGUgcXVpcmt5IGhhbmRsaW5nIG9mIHRoZSB0ZXh0YXJlYSBzZWxlY3Rpb24gcmFuZ2UKICAgICAgICBpbiBJRXggYnJvd3NlcnMuCgoyMDA5LTA4LTIzIERpcmsgRnJlZGVyaWNreCA8YnJ1c2hlZEBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuOC4zLXN2bi0xNAoKICAgICAgICAqIEpTUFdJS0ktNDgwLiBTbWFsbCBpbXByb3ZlbWVudCBvbiBBdHRhY2htZW50IHNvcnRpbmcuCiAgICAgICAgTm90IHVzaW5nIHRoZSBhdHRyaWJ1dGUgJ2pzcHdpa2k6c29ydHZhbHVlJyB0byBhbGxvdyBzb3J0aW5nIG9mIAogICAgICAgIGRhdGUgdmFsdWVzLCBib3RoIGluIGF0dGFjaG1lbnQgYW5kIGluZm8gdGFicy4KCiAgICAgICAgKiBKU1BXSUtJLTU3NC4gUmVkaXJlY3QgZnJvbSBVc2VyUHJlZmVyZW5jZXMuanNwIGhhbmdzIHdoZW4gbnVsbC4KICAgICAgICAod2hpY2ggaXMgdGhlIGNhc2UgZWcgYWZ0ZXIgc3Vic2VxdWVudCBsb2cgaW4pIAoKICAgICAgICAqIEpTUFdJS0ktNTkwLiBVc2UgcmVsYXRpdmUgcGF0aHMgdG8gbGluayB0aGUgamF2YXNjcmlwdCByb3V0aW5lcy4KICAgICAgICBBdm9pZCB0aGUgdXNlIG9mIGdldENvbnRleHRQYXRoKCksIGFzIHRoZSBVUkwgbWF5IGhhdmUgYmVlbiByZXdyaXR0ZW4KICAgICAgICBleHRlcm5hbCB0byBqc3B3aWtpLiAocmVwb3J0ZWQgYnkgRmxvcmlhbikgCiAgICAgICAgVGhpcyBmaXggb25seSByZXNvbHZlcyB0aGUgcmVmZXJlbmNlcyB0byBqYXZhc2NyaXB0IHJvdXRpbmVzLgogICAgICAgIAoKMjAwOS0wOC0xOSBIYXJyeSBNZXRza2UgPG1ldHNrZW1AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjguMy1zdm4tMTMKCiAgICAgICAgKiBDaGFuZ2VkIEV4cG9ydGVyJ3MgZGF0ZWZvcm1hdCB0byBKU1ItMTcwJ3MgcmVxdWlyZWQgSVNPIDg2MDEgZm9ybWF0IAoKMjAwOS0wOC0xOSBEaXJrIEZyZWRlcmlja3ggPGJydXNoZWRAYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjguMy1zdm4tMTIKCiAgICAgICAgKiBKU1BXSUtJLTU3Ni4gU3R5bGVzIG9mIHNlY3Rpb24gW0VkaXRdIGxpbmtzIGZpeGVkIGZvciBJRS4KCiAgICAgICAgKiBKU1BXSUtJLTU4NTogU2Nyb2xsYmFycyBvbiB3aWRlLXBhZ2VzIGZpeGVkIGZvciBGRiBhbmQgU2FmYXJpIChvdmVyZmxvdy15OmhpZGRlbikgYW5kIElFLgogICAgICAgIAogICAgICAgICogSlNQV0lLSS0zODMsIEpTUFdJS0ktNDgxOiBTdXBwb3J0IHJlZGlyZWN0aW5nIGJhY2sgdG8gc3BlY2lhbCBwYWdlcyBzdWNoIGFzIAogICAgICAgIHRoZSBTZWFyY2ggcGFnZSwgV29ya2Zsb3cgcGFnZS4KICAgICAgICAgICAgICAgIAogICAgICAgIAoyMDA5LTA4LTAzIERpcmsgRnJlZGVyaWNreCA8YnJ1c2hlZEBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuOC4zLXN2bi0xMQoKICAgICAgICAqIEpTUFdJS0ktNTgxICAgRml4aW5nICUlc29ydGFibGUsIHdpdGggc3RyYW5nZSBzaWRlLWVmZmVjdHMgd2hlbiBzb3J0aW5nIHRhYmxlIGNvbHVtbnMKICAgICAgICB3aXRoIHN0cmluZ3MuIChkZXRlY3RlZCBieSBTdGVmYW4gQm9obikKICAgICAgICAKCjIwMDktMDYtMDcgSGFycnkgTWV0c2tlIDxtZXRza2VtQGFwYWNoZS5vcmc+CgogICAgICAgICogMi44LjMtc3ZuLTEwCgogICAgICAgICogSlNQV0lLSS01NjggIGpzcHdpa2kucHJvcGVydHlmaWxlIGNhbm5vdCBiZSBkZWZpbmVkIGFzIHN5c3RlbSBwcm9wZXJ0eQogICAgICAgIFlvdSBjYW4gbm93IHNwZWNpZnkgYSBKYXZhIFN5c3RlbSBQcm9wZXJ0eSBqc3B3aWtpLnByb3BlcnR5ZmlsZSB0byBzcGVjaWZ5CiAgICAgICAgdGhlIGxvY2F0aW9uIG9mIGpzcHdpa2kucHJvcGVydGllcyAodGhhbmtzIHRvIFBpb3RyIFRhcm5vd3NraSkgCgoyMDA5LTA2LTAzIEhhcnJ5IE1ldHNrZSA8bWV0c2tlbUBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuOC4zLXN2bi05CgogICAgICAgICogSlNQV0lLSS01NjkgIGFkZGVkIEJyYXppbGlhbiBQb3J0dWd1ZXNlIHRyYW5zbGF0aW9uLCB0aGFua3MgdG8gUGF1bG8gQW1hcmFsIAoKMjAwOS0wNS0yOSBIYXJyeSBNZXRza2UgPG1ldHNrZW1AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjguMy1zdm4tOAoKICAgICAgICAqIEpTUFdJS0ktNTY0ICBDb21tZW50IEVkaXRvciBwb3B1bGF0ZWQgYnkgUHJldmlldyBmcm9tIGFub3RoZXIgd2lraXBhZ2UsCiAgICAgICAgcmVwb3J0ZWQgYnkgSmVmZiBBbGxlbi4KICAgICAgICBUaGUgQ29tbWVudC5qc3Agbm93IGFsd2F5cyBjbGVhcnMgdGhlIEVESVRFRF9URVhUIGZyb20gdGhlIHNlc3Npb24uCgoyMDA5LTA1LTEyIEhhcnJ5IE1ldHNrZSA8bWV0c2tlbUBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuOC4zLXN2bi03CgogICAgICAgICogSlNQV0lLSS01MjYgQWxsb3cgYWRtaW5pc3RyYXRvcnMgdG8gc2VsZWN0IHRoZSBDb21wYXJhdG9yIAogICAgICAgICAgIHVzZWQgZm9yIHNvcnRpbmcgcGFnZSBsaXN0cyBieSBuYW1lLCB0aGFua3MgdG8gR3JlZyBLYWJsZQogICAgICAgIAoyMDA5LTA1LTExIERpcmsgRnJlZGVyaWNreCA8ZGlyay5mcmVkZXJpY2t4QGFwYWNoZS5vcmc+CgogICAgICAgICogMi44LjMtc3ZuLTYKCiAgICAgICAgKiBKU1BXSUtJLTUzMiAlJWNvbHVtbnMgZGlkbid0IHdvcmsgcHJvcGVybHkgd2hlbiB0aGUgZmlyc3QgY2hpbGQgZWxlbWVudCB3YXMKICAgICAgICBhIERPTSB0ZXh0IGVsZW1lbnQuCiAgICAgICAgCgoyMDA5LTA0LTIzIEhhcnJ5IE1ldHNrZSA8bWV0c2tlbUBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuOC4zLXN2bi01CgogICAgICAgICogSlNQV0lLSS01MjMgQ2hhbmdlIFRhYmxlT2ZDb250ZW50c1BsdWdpbiBzbyBpdCBnZW5lcmF0ZXMgKG1vcmUpIHJlbGF0aXZlIGxpbmtzCiAgICAgICAgc28gaXQgcHJvcGVybHkgZGlzcGxheXMgd2hlbiB1c2VkIGluIEVkaXRIZWxwUGFnZSAocmVwb3J0ZWQgYnkgU3RlZmFuIEJvaG4uCiAgICAgICAgCiAgICAgICAgKiBBZGRlZCB0d28gKGR1bW15KSBtZXRob2RzIHRvIFRlc3RKREJDRGF0YVNvdXJjZSBzbyBpdCBhbHNvIGNvbXBpbGVzIHdpdGggSkRLIDYKCjIwMDgtMDQtMDQgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuOC4zLXN2bi00CiAgICAgICAgCiAgICAgICAgKiBJbXByb3ZlZCBXYXRjaERvZyB0aHJlYWQgZHVtcCBjb2RlIHNvIHRoYXQgaXQgZG9lcyBub3QgZ2VuZXJhdGUgdHdvIAogICAgICAgIGxvZyBldmVudHMgZm9yIGV2ZXJ5IGh1bmcgdGhyZWFkLiAgSW5zdGVhZCwgYWxsIGh1bmcgdGhyZWFkIGV2ZW50cyBhcmUgbm93CiAgICAgICAgZ2VuZXJhdGVkIGFzIGEgc2luZ2xlIGxvZyBldmVudC4gIEFsc28sIHRocmVhZCBkdW1wcyBhcmUgbm93IHNlbnQKICAgICAgICBhdCBERUJVRyBsZXZlbCwgc2luY2UgdGhleSBhcmUgbm90IGVycm9ycyBwZXIgc2UuCiAgICAgICAgCjIwMDktMDQtMDcgQW5kcmV3IEphcXVpdGggPGFqYXF1aXRoIEFUIGFwYWNoZSBET1Qgb3JnPgoKICAgICAgICAqIDIuOC4zLXN2bi0zCiAgICAgICAgCiAgICAgICAgKiBBZGRlZCBhIChTdHJpbmcsVGhyb3dhYmxlKSBjb25zdHJ1Y3RvciB0byBXaWtpRXhjZXB0aW9uIGFuZCBXaWtpU2VjdXJpdHlFeGNlcHRpb24sCiAgICAgICAgYW5kIHJlZmFjdG9yZWQgdGhlIGNvZGUgc28gdGhhdCBpdCBpcyB1c2VkIGluIHByZWZlcmVuY2UgdG8gdGhlIChTdHJpbmcpIGNvbnN0cnVjdG9yCiAgICAgICAgd2hlcmUgYXBwcm9wcmlhdGUuIFRoaXMgYWxsb3dzIG1vcmUgdmVyYm9zZSBlcnJvcnMgKGFuZCBiZXR0ZXIgdHJvdWJsZXNob290aW5nKQogICAgICAgIGJlY2F1c2UgdGhlIHVuZGVybHlpbmcgY2F1c2Ugb2Ygd3JhcHBlZCBFeGNlcHRpb25zIGNhbiBub3cgYmUgc2Vlbi4gQWRkZWQKICAgICAgICBzb21lIGFkZGl0aW9uYWwgc3RhY2sgZHVtcHMgdG8gdGhlIFdpa2lFbmdpbmUgaW5pdGlhbGl6YXRpb24gY29kZSBzbyB0aGF0IG9kZAogICAgICAgIGZhdGFsIGVycm9ycyB3aWxsIGJlIHByaW50ZWQgaW4gc2VydmVyIGxvZ3MuIFRoaXMgY2hhbmdlIGhhcyBiZWVuIGZvcndhcmQtcG9ydGVkCiAgICAgICAgdG8gdGhlICgzLjApIHRydW5rLgogICAgICAgIAogICAgICAgICogQWRkZWQgc3VwcG9ydCBpbiBXaWtpQ2FsbGJhY2tIYW5kbGVyIGZvciBIdHRwUmVxdWVzdENhbGxiYWNrIGFuZAogICAgICAgIFdpa2lFbmdpbmVDYWxsYmFjay4gVGhpcyBtZWFucyBMb2dpbk1vZHVsZXMgdXNlZCBmb3IgSlNQV2lraSBpbnRlZ3JhdGVkCiAgICAgICAgKGN1c3RvbSkgYXV0aGVudGljYXRpb24gY2FuIG5vdyBhY2Nlc3MgdGhlIFdpa2lFbmdpbmUgYW5kIHRoZSBIVFRQIHJlcXVlc3QuCiAgICAgICAgVGhhbmtzIHRvIExvdSBQZXRlcnMgYW5kIG1hbnksIG1hbnkgb3RoZXJzIGZvciBicmluZ2luZyB0aGlzIGlzc3VlIHRvIG15CiAgICAgICAgYXR0ZW50aW9uLiBQbGVhc2UgdGVzdCB0aGlzIGZ1bmN0aW9uISBUaGlzIGNoYW5nZSBoYXMgYmVlbiBmb3J3YXJkLXBvcnRlZCB0bwogICAgICAgIHRoZSAoMy4wKSB0cnVuay4gCiAgICAgICAgCiAgICAgICAgKiBBcyBhIHJlc3VsdCBvZiB0aGUgYWRkaXRpb25hbCBjYWxsYmFjayBzdXBwb3J0IGZvciBMb2dpbk1vZHVsZXMgdXNlZCB3aXRoCiAgICAgICAgaW50ZWdyYXRlZCBhdXRoZW50aWNhdGlvbiwgQXV0aGVudGljYXRpb25NYW5hZ2VyIGdhaW5zIGEgbmV3IG1ldGhvZCwKICAgICAgICBsb2dpbihXaWtpU2Vzc2lvbixIdHRwU2VydmxldFJlcXVlc3QsU3RyaW5nLFN0cmluZykuIFBsZWFzZSB1c2UgdGhpcyBpbnN0ZWFkCiAgICAgICAgb2YgbG9naW4oV2lraVNlc3Npb24sU3RyaW5nLFN0cmluZyksIHdoaWNoIGlzIG5vdyBkZXByZWNhdGVkLiBUaGlzIGNoYW5nZQogICAgICAgIGhhcyBiZWVuIGZvcndhcmQtcG9ydGVkIHRvIHRoZSAoMy4wKSB0cnVuay4KICAgICAgICAKMjAwOS0wNC0wNSBIYXJyeSBNZXRza2UgPG1ldHNrZW1AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjguMy1zdm4tMgoKICAgICAgICAqIGFkZGVkIHNvbWUgY29kZSB0byBXYXRjaGRvZyBzbyB0aGF0IHRoZSBzdGFja3RyYWNlIGlzIGR1bXBlZCBpbiBjYXNlIG9mIAogICAgICAgICAgIGEgdGltZW91dCwgd2UgZHVtcCBzdGFja3RyYWNlcyBvZiBhbGwgdGhyZWFkcyBpZiB0aGUgZGVidWdsZXZlbCBpcwogICAgICAgICAgIElORk8gb3IgaGlnaGVyCiAgICAgICAgCjIwMDgtMDQtMDQgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuOC4zLXN2bi0xCiAgICAgICAgCiAgICAgICAgKiBKU1BXSUtJLTM5MTogRkNLIGVkaXRvciBydWlucyB0aGUgYW5jaG9ycyBpbnNpZGUgdGhlIHBhZ2UKICAgICAgICAKICAgICAgICAqIEpTUFdJS0ktNDkzOiBGQ0sgZWRpdG9yIGFkZHMgbmV3bGluZXMgYmVmb3JlIGFuZCBhZnRlciB0ZXh0IAogICAgICAgIGZvcm1hdHRlZCBhcyAiY29kZSIKCjIwMDktMDMtMjAgSGFycnkgTWV0c2tlIDxtZXRza2VtQGFwYWNoZS5vcmc+CgogICAgICAgICogMi44LjItc3ZuLTE1CgogICAgICAgICogSlNQV0lLSS00ODcgZG9uJ3Qgc2hvdyBkZWxldGVkIGFuZCByZW5hbWVkIHBhZ2VzIGluIHRoZSBicmVhZGNydW1icwogICAgICAgICAgIHJlcG9ydGVkIGJ5IEJydW5vIFBlZXRlcnMKICAgICAgICAKMjAwOS0wMy0xOSAgQW5kcmV3IEphcXVpdGggPGFqYXF1aXRoIEFUIGFwYWNoZSBET1Qgb3JnPgoKICAgICAgICAqIDIuOC4yLXN2bi0xNAoKICAgICAgICAqIEZpeGVkIGJ1ZyBpbiBYTUxVc2VyRGF0YWJhc2UgdGhhdCB3YXMgcHJldmVudGluZyBVSURzIGZyb20gYmVpbmcKICAgICAgICBzYXZlZCwgd2hpY2ggZ2VuZXJhdGVkIHRvbnMgb2YgTlBFcyBhZnRlcndhcmRzLiBBZGRlZCB1bml0IHRlc3RzCiAgICAgICAgdG8gY2hlY2sgZm9yIGNvcnJlY3Qgc2F2aW5nIG9mIFVJRHMuIFRpZ2h0ZW5lZCBpbnB1dCBmaWx0ZXJpbmcgb24KICAgICAgICB1c2VyIHByb2ZpbGUgZmllbGRzIHRvIHByb2hpYml0IG1vcmUgY2hhcmFjdGVycy4KICAgICAgICAKMjAwOC0wMi0xNSAgSGFycnkgTWV0c2tlIDxtZXRza2VtQGFwYWNoZS5vcmc+CgogICAgICAgICogMi44LjItc3ZuLTEzCiAgICAgICAgCiAgICAgICAgKiBKU1BXSUtJLTUwMyAtIEluc2VydFBhZ2UgcGx1Z2luIGNhcnJpZXMgZGFzaGVzIGZyb20gc2VjdGlvbgogICAgICAgICBicmVha3MgaW50byBvdXRwdXQsIHRoYW5rcyB0byBKb25hdGhhbiBTb2JlbAogICAgICAgICBBbHNvIGFkZGVkIGFuIGV4dHJhIEpVbml0IHRlc3QgZm9yIHRoaXMuCiAgICAgICAgCjIwMDgtMDItMTQgIEhhcnJ5IE1ldHNrZSA8bWV0c2tlbUBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuOC4yLXN2bi0xMgogICAgICAgIAogICAgICAgICogSlNQV0lLSS00NjYgLSBGaWxlU3lzdGVtUHJvdmlkZXJUZXN0IHL8Y2tzaWNodHNsb3MgZW1wdGllcyBqYXZhLmlvLnRtcGRpcgogICAgICAgIAoyMDA4LTAyLTEyICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjguMi1zdm4tMTEKICAgICAgICAKICAgICAgICAqIEpTUFdJS0ktNTAwOiBTcGFtIGNvbnRhaW5pbmcgb25seSBkZWxldGlvbnMgaXMgbm8gbG9uZ2VyIHNlbnQKICAgICAgICB0byBBa2lzbWV0LgoKMjAwOS0wMi0wOSAgSGFycnkgTWV0c2tlIDxtZXRza2VtQGFwYWNoZS5vcmc+CgogICAgICAgICogMi44LjItc3ZuLTEwCiAgICAgICAgCiAgICAgICAgKiBKU1BXSUtJLTQ5NiBSZWNlbnRDaGFuZ2VzUGx1Z2luIHNob3VsZCBmaWx0ZXIgcGFnZXMKCjIwMDktMDItMDYgIEhhcnJ5IE1ldHNrZSA8bWV0c2tlbUBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuOC4yLXN2bi05CiAgICAgICAgCiAgICAgICAgKiBKU1BXSUtJLTQ3NyBSZW5hbWVkIHBhZ2VzIGFyZSBubyBsb25nZXIgaW4gdGhlIEx1Y2VuZSBpbmRleAoKMjAwOS0wMi0wMyAgRGlyayBGcmVkZXJpY2t4IDxkaXJrLmZyZWRlcmlja3hAZ21haWwub3JnPgoKICAgICAgICAqIDIuOC4yLXN2bi04CiAgICAgICAgCiAgICAgICAgKiBKU1BXSUtJLTQ4MCwgc29ydGluZyBvbiB0aW1lc3RhbXBzIChtb2RpZmllZCBkYXRlKSBpbgogICAgICAgIHRoZSBBdHRhY2hlbWVudCB0YWIgYW5kIHRoZSBJbmZvIHRhYiB3YXMgbm90IGFsd2F5cyB3b3JraW5nLAogICAgICAgIGFzIHRpbWVmb3JtYXRzIGFyZSBkZXBlbmRpbmcgb24gdGhlIHVzZXItcHJlZmVyZW5jZXMuCiAgICAgICAgQW4gaW52aXNpYmxlIGphdmFzY3JpcHQgcGFyc2FibGUgdGltZWZvcm1hdCBhdHRyaWJ1dGUgaXMgbm93IAogICAgICAgIGFkZGVkIHRvIHRoZSB0YWJsZXMsIGluZGVwZW5kZW50IG9mIHRoZSB1c2VyLXByZWZlcnJlZCB0aW1lZm9ybWF0LgogICAgICAgIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgYnkgdGhlIGpzIHNvcnRpbmcgcm91dGluZXMuCgoKMjAwOS0wMi0wMiAgRGlyayBGcmVkZXJpY2t4IDxkaXJrLmZyZWRlcmlja3hAZ21haWwub3JnPgoKICAgICAgICAqIDIuOC4yLXN2bi03CiAgICAgICAgCiAgICAgICAgKiBKU1BXSUtJLTQ5MSwgSWNvbnMgaW4gbGlzdCBvZiBhdHRhY2hlbWVudHMgd2VyZSBvbmx5IHNob3duIHdoZW4gdGhlCiAgICAgICAgYXR0YWNobWVudCB0eXBlIHdhcyBsb3dlci1jYXNlCgoJCSogSlNQV0lLSS00ODYgQWx3YXlzIHNob3cgdGhlIGluZm9ybWF0aW9uIHRhYmxlLCBhbHNvIGluIGNhc2UgdGhlcmUgaXMgCgkJb25seSBvbmUgdmVyc2lvbiBvZiB0aGUgcGFnZS4KCQkKIAoyMDA5LTAxLTIzICBIYXJyeSBNZXRza2UgPG1ldHNrZW1AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjguMi1zdm4tNgogICAgICAgIAogICAgICAgICogSlNQV0lLSS00NzIsIHVzZXJkYXRhYmFzZS54bWwgY29ycnVwdGVkIG9uIEVCQ0RJQyBwbGF0Zm9ybXMgYnkgQ3J5cHRvVXRpbAogCjIwMDktMDEtMjEgIEFuZHJldyBKYXF1aXRoIDxhamFxdWl0aCBBVCBhcGFjaGUgRE9UIG9yZz4KCiAgICAgICAgKiAyLjguMi1zdm4tNQoKICAgICAgICAqIFtKU1BXSUtJLTQ3M10gRml4ZWQgYnVnIHRoYXQgd2FzIGNhdXNpbmcgcm9sZSBjaGVja3MgdXNpbmcgY3VzdG9tCiAgICAgICAgQXV0aG9yaXplcnMgdG8gZmFpbC4gQXV0aGVudGljYXRpb25NYW5hZ2VyIHdhcyBub3QgY2FsbGluZwogICAgICAgIEF1dGhvcml6ZXIuaXNJblJvbGUoV2lraVNlc3Npb24sIFByaW5jaXBhbCksIGFzIGl0IHNob3VsZCBoYXZlLgogICAgICAgIEluIGFkZGl0aW9uIHRvIGZpeGluZyB0aGUgYnVnLCB3ZSBhbHNvIG5vdyBpbmNsdWRlIGEgc3BlY2lhbCB0ZXN0IGNhc2UKICAgICAgICB0byB2ZXJpZnkgdGhhdCBjdXN0b20gQXV0aG9yaXplcnMgd29yayBwcm9wZXJseS4gVGhhbmtzIHRvIFN0ZXZlCiAgICAgICAgRGFobCBmb3IgcmVwb3J0aW5nIHRoaXMgaXNzdWUuCgoyMDA4LTEyLTE5IEhhcnJ5IE1ldHNrZSA8bWV0c2tlbUBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuOC4yLXN2bi00CiAgICAgICAgCiAgICAgICAgKiBKU1BXSUtJLTQ1MSBSdXNzaWFuIHRyYW5zbGF0aW9uLCB0aGFua3MgdG8gQW5kcmV3IFJpa2hsaXZza3kKCjIwMDgtMTItMDMgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuOC4yLXN2bi0zCgogICAgICAgICogW0pTUFdJS0ktNDU0XSBBZGRlZCB0aGUgZmlyc3QgdmVyc2lvbiBvZiAKICAgICAgICBjb20uZWN5cmQuanNwd2lraS5jb250ZW50LkV4cG9ydGVyCgoyMDA4LTEyLTAzICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjguMi1zdm4tMgogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktNDQ0XSBXeXNpd3lnIGVkaXRvcnMgKHN1Y2ggYXMgRkNLKSBubyBsb25nZXIgZHVwbGljYXRlCiAgICAgICAgdGhlIHBlcm1hbGluayBhbmNob3JzLgoKMjAwOC0xMS0yOSAgRGlyayBGcmVkZXJpY2t4IDxkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tPgoKICAgICAgICAqIDIuOC4yLXN2bi0xCiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0yODhdIENTUyBmaXggZm9yIHRoZSByZW5kZXJpbmcgb2YgaGFzaC1saW5rcy4KIAoyMDA4LTExLTIxICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjguMSwgZmlyc3QgcmVsZWFzZSBjYW5kaWRhdGUgYnVpbGQuCgoyMDA4LTExLTIxIEhhcnJ5IE1ldHNrZSA8bWV0c2tlbUBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuOC4xLXN2bi0xNgogICAgICAgIAogICAgICAgICogSlNQV0lLSS00MDc6IGFwcGxpZWQgemhfQ04gcGF0Y2ggZnJvbSBIdWJlcnQgQ2hhbmcKCjIwMDgtMTEtMTggIEhhcnJ5IE1ldHNrZSA8bWV0c2tlbUBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuOC4xLXN2bi0xNQogICAgICAgICAKICAgICAgICAqIEpTUFdJS0ktNDE1OiBGYXZvcml0ZXMgbm90IGRpc3BsYXllZCBwcm9wZXJseSB3aGVuIGJsYW5rIGluIHVzZXJOYW1lLCByZXBvcnRlZCBieSBUcmV2b3IgSGFycmlzb24KICAgICAgICAgIEJhY2twb3J0IGZyb20gMy4wIHRvIDIuOCBvbiByZXF1ZXN0IG9mIEVyaWsgQnVubi4KICAgICAgICAgIEFkZGVkIDIgSlVuaXQgdGVzdHMgZm9yIEluc2VydFBhZ2UgcGx1Z2luCiAgCjIwMDgtMTEtMTUgIERpcmsgRnJlZGVyaWNreCA8ZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbT4KCiAgICAgICAgKiAyLjguMS1zdm4tMTQKICAgICAgICAgCiAgICAgICAgKiBJbGxlZ2FsIGNoYXJhY3RlcnMgcmVtb3ZlZCBmcm9tIGpzcHdpa2ktY29tbW9uLmpzIGNhdXNpbmcgdGhlIFlVSSAKICAgICAgICBjb21wcmVzc29yIHRvIGZhaWwuCiAgCiAyMDA4LTExLTE1ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjguMS1zdm4tMTMKICAgICAgICAKICAgICAgICAqIFtKU1BXSUtJLTQyOF06IFdlYmxvZ1BsdWdpbiB3YXMgbm90IHByb3Blcmx5IGZpbmRpbmcgdGhlIHBhZ2UgdGl0bGUKICAgICAgICBkdWUgdG8gbWlzc2hhcGVuIHJlZ2V4cC4KICAgICAgICAKICAgICAgICAqIFtKU1BXSUtJLTQwN106IEFkZGVkIEl0YWxpYW4gdHJhbnNsYXRpb24gb2YgY29yZXBhZ2VzLCB0aGFua3MgdG8gTHVjYQogICAgICAgIEdpbGFyZG9uaS4gCgoyMDA4LTExLTEzICBEaXJrIEZyZWRlcmlja3ggPGRpcmsuZnJlZGVyaWNreEBnbWFpbC5jb20+CgogICAgICAgICogMi44LjEtc3ZuLTEyCiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0zODFdIGZpeGVkIGEgYnVnIHdpdGggcGVyaW9kaWNpYWxseSByZWZyZXNoZWQgc25lYWstcHJldmlldwogICAgICAgIHdoaWxlIGluIHNlY3Rpb24tZWRpdCBtb2RlLiBXaGVuIHNlY3Rpb24tZWRpdCB3YXMgYWN0aXZlLAogICAgICAgIGxpbmVmZWVkcyB3ZXJlIGluc2VydGVkIGF0IGV2ZXJ5IHNuZWFrLXByZXYgcmVmcmVzaC4KICAgICAgICAKICAgICAgICAqIFtKU1BXSUtJLTM4NF0gRmlsdGVyIGpzLXNjcmlwdHMgZnJvbSBpbnB1dCBmaWVsZHMgYW5kIGNvb2tpZXMuCiAgICAgICAgKHhzcyB2dWxuZXJhYmlsaXR5KQogICAgICAgIAoKMjAwOC0xMS0wNiAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGFwYWNoZS5vcmc+CgogICAgICAgICogMi44LjEtc3ZuLTExCgogICAgICAgICogQWRkZWQgZG9jL1RyYW5zbGF0aW5nLnR4dCBhcyBhIGd1aWRlIGZvciBwZW9wbGUgd2hvIHdhbnQgdG8gY3JlYXRlCiAgICAgICAgdHJhbnNsYXRpb25zLiAgCiAgICAgICAgCiAgICAgICAgKiBBZGRlZCBhbnQgImkxOG4tY2hlY2siIHRhcmdldCBhcyBhbiBpbnRlcmZhY2UKICAgICAgICB0byBUcmFuc2xhdGlvbnNDaGVjayAobm8gbmVlZCB0byBnZXQgZ2Vla3kgcnVubmluZyBhIEphdmEgY2xhc3MpLgoKMjAwOC0xMS0wNiAgQW5kcmV3IEphcXVpdGggPGFqYXF1aXRoIEFUIGFwYWNoZSBET1Qgb3JnPgoKICAgICAgICAqIDIuOC4xLXN2bi0xMAoKICAgICAgICAqIFtKU1BXSUtJLTM0NV06IFVwZ3JhZGVkIGZyZXNoY29va2llcy1zZWN1cml0eSB0byAwLjYwLCB3aGljaCBmaXhlcyBhbiBpc3N1ZQogICAgICAgIGNhdXNpbmcgZ2VuZXJpYyAobm9uLWNsYXNzLXNwZWNpZmljKSBQcmluY2lwYWwgZW50cmllcyBpbiBzZWN1cml0eSBwb2xpY2llcwogICAgICAgIHRvIGJlIGlnbm9yZWQuCgoyMDA4LTExLTA2ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjguMS1zdm4tOQoKICAgICAgICAqIFtKU1BXSUtJLTQxNl06IEZyZW5jaCB0cmFuc2xhdGlvbiBhbmQgY29yZXBhZ2VzIGZyb20gT2xpdmllciBEZXNjb3V0CgoyMDA4LTExLTA1ICBKdWFuIFBhYmxvIFNhbnRvcyA8anVhbnBhYmxvLnNhbnRvc0BnbWFpbC5jb20+CgogICAgICAgICogW0pTUFdJS0ktNDA3XTogdXBkYXRlZCBlcyB0cmFuc2xhdGlvbjsgZml4ZWQgc29tZSBIVE1MIGVudGl0aWVzIGxlZnQgYmVoaW5kLgogICAgICAgIAoyMDA4LTExLTAzICBIYXJyeSBNZXRza2UgPG1ldHNrZW1AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjguMS1zdm4tOAogICAgICAgIAogICAgICAgICogSlNQV0lLSS00MDc6IGRlIHRyYW5zbGF0aW9uIGJ5IEZsb3JpYW4sIGluY2x1ZGluZyB0aGUgdHdvIHRpbWVzdGFtcHMgaW4gCiAgICAgICAgICAgTGlzdExvY2tzUGx1Z2luLCBmb3VuZCBieSBGbG9yaWFuIGFnYWluLiAKICAgICAgICAgICAJCjIwMDgtMTEtMDQgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuOC4xLXN2bi03CiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS00MTFdIEx1Y2VuZVNlYXJjaFByb3ZpZGVyIG5vIGxvbmdlciBzdG9wcyBwcm9jZXNzaW5nIGF0IHN0YXJ0dXAKICAgICAgICBpZiB0aGUgaW5kZXhpbmcgZGllcyBkdWUgdG8gbm9uLWluZGV4YWJsZSBjb250ZW50LgoKMjAwOC0xMS0wNCAgRGlyayBGcmVkZXJpY2t4IDxkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tPgoKICAgICAgICAqIDIuOC4xLXN2bi02CiAgICAgICAgCiAgICAgICAgKiBKU1BXSUtJLTM4MTogU25lYWstcHJldmlldyBpcyBub3cgcmVmcmVzaGVkIHBlcmlvZGljYWxseSBhcyB3ZWxsIGFzIHRoZQogICAgICAgIHNlY3Rpb24tbGlzdCBhdCB0aGUgbGVmdCBvZiB0aGUgc2NyZWVuLiAKICAgICAgICAKMjAwOC0xMS0wMyAgRGlyayBGcmVkZXJpY2t4IDxkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tPgoKICAgICAgICAqIDIuOC4xLXN2bi01CiAgICAgICAgCiAgICAgICAgKiBKU1BXSUtJLTQwODogSGlkZSB3aWRlLWNvbnRlbnQgb24gbGVmdC1tZW51IGFuZCBsZWZ0bWVudS1mb290ZXIuCiAgICAgICAgCiAgICAgICAgKiBKU1BXSUtJLTQwMzogUGFnaW5hdGlvbiBsaW5rcyBub3cgc2hvdyBhIHBvaW50ZXIgY3Vyc29yIGF0IGhvdmVyLiAgICAgICAgCgoyMDA4LTExLTAzICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AYXBhY2hlLm9yZz4KCiAgICAgICAgKiBGaW5uaXNoIGxvY2FsaXphdGlvbiB1cGRhdGVkIChubyB2ZXJzaW9uIGJ1bXApOgoKMjAwOC0xMS0wMyAgSGFycnkgTWV0c2tlIDxtZXRza2VtQGFwYWNoZS5vcmc+CgogICAgICAgICogMi44LjEtc3ZuLTQKICAgICAgICAKICAgICAgICAqIEpTUFdJS0ktNDA3OiBVbmxvY2FsaXplZCBtZXNzYWdlcyBhbmQgdGltZXMgaW4gdXNlciwgZ3JvdXAgYW5kIGF0dGFjaG1lbnQKICAgICAgICAgICBtYW5hZ2VtZW50LCByZXBvcnRlZCBieSBPbGl2aWVyIERlc2NvdXQgKEZvcmJpZGRlbi5odG1sIG5vdCBmaXhlZCB5ZXQpCQoKICAgICAgICAqIEZpbm5pc2ggbG9jYWxpemF0aW9uIHVwZGF0ZWQuCgoyMDA4LTExLTAyICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjguMS1zdm4tMwogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktMjg4XSBFYWNoIGhlYWRpbmcgbm93IGhhcyBhbiBhbmNob3IgbGluayBhZnRlciBpdC4KICAgICAgICBUaGFua3MgdG8gQ2hyaXN0aWFuIEhlbG1ib2xkIGZvciB0aGUgaWRlYS4KICAgICAgICAKMjAwOC0xMC0zMSAgSGFycnkgTWV0c2tlIDxoYXJyeS5tZXRza2VAZ21haWwuY29tPgoKICAgICAgICAqIDIuOC4xLXN2bi0yCiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS00MDZdIFJlbmFtaW5nIGEgcGFnZSBiYWNrIHRvIHRoZSBvbGQgbmFtZQogICAgICAgICAgIGRlc3Ryb3lzIHRleHQgY2hhbmdlcyBvZiB0aGUgcGFnZSwgdGhhbmtzIHRvIFN0ZWZhbiBCb2huLgogICAgICAgICogY2hhbmdlZCB0d28gYW5ub3lpbmcgbG9nLmVycm9yJ3MgdG8gbG9nLndhcm4ncyAKICAgICAgICAKMjAwOC0xMC0yMSAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGFwYWNoZS5vcmc+CgogICAgICAgICogMi44LjEtc3ZuLTEKICAgICAgICAKICAgICAgICAqIFtKU1BXSUtJLTM0OF0gT0M0SiBjb21wYXRpYmlsaXR5LCB0aGFua3MgdG8gTHV0eiBUaWV0emUuCiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0zODldIFdyb25nIG1peGVkIHF1b3RlcyBpbiBTZWN1cml0eUNvbmZpZy5qc3AgY29ycmVjdGVkLgogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktMTM4XSByc3MuanNwIG5vdyBjYWNoZXMgdGhlIHByb2R1Y2VkIFhNTCBpbiBhIGN1c3RvbQogICAgICAgICAgY2FjaGUsIHJlc3VsdGluZyBpbiAqdmVyeSogZmFzdCBvcGVyYXRpb24uCgoyMDA4LTEwLTE3ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjguMC1yYy0yLgoKICAgICAgICAqIEpTUFdJS0ktNDAwOiBDaGluZXNlIGNvcmUgcGFnZXMgd2VyZSBjb3JydXB0ZWQuCgoyMDA4LTEwLTE0ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjguMC1iZXRhLTIxCiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0zOThdIFBhZ2VzIHdpdGggc3BhY2VzIGluIHRoZW0gY2F1c2VkIGVycmF0aWMgcmVuYW1lCiAgICAgICAgYmVoYXZpb3VyIGJ5IHJlbmFtaW5nIGFsbCB0aGUgbGlua3Mgb24gdGhlIHBhZ2UuCgoyMDA4LTEwLTE0ICBBbmRyZXcgSmFxdWl0aCA8YWphcXVpdGggQVQgYXBhY2hlIERPVCBvcmc+CgogICAgICAgICogMi44LjAtYmV0YS0yMAoKICAgICAgICAqIFtKU1BXSUtJLTMxM10gU2hvcnRVUkxDb25zdHJ1Y3RvciB3YXMgbm90IGNyZWF0aW5nIFVSTHMgZm9yIHRoZSBMT0dJTgogICAgICAgIGNvbnRleHQgY29ycmVjdGx5LiBXZSBub3cgY2hlY2sgZm9yIHRoaXMgY29udGV4dCBzcGVjaWZpY2FsbHkuCgoyMDA4LTEwLTEzICBBbmRyZXcgSmFxdWl0aCA8YWphcXVpdGggQVQgYXBhY2hlIERPVCBvcmc+CgogICAgICAgICogMi44LjAtYmV0YS0xOQoKICAgICAgICAqIFtKU1BXaWtpLTM0Ml0gUmVzb2x2ZWQgaXNzdWUgYnkgcmVtb3Zpbmcgb3V0ZGF0ZWQgZG9jIGZpbGVzLgoKICAgICAgICAqIFtKU1BXSUtJLTM0NV0gQWRkZWQgdW5pdCB0ZXN0cyBmb3IgdGVzdGluZyBzaW5nbGUgdXNlciBwb2xpY2llcy4gQ29uZmlybWVkIGJ1ZwogICAgICAgIGFuZCB3b3JrYXJvdW5kIGJ1dCBkaWQgbm90IGZpeCByb290IGNhdXNlIChmcmVzaGNvb2tpZXMtc2VjdXJpdHkgYnVnKS4KCjIwMDgtMTAtMDYgIERpcmsgRnJlZGVyaWNreCA8ZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbT4KCiAgICAgICAgKiAyLjguMC1iZXRhLTE4CgogICAgICAgICogW0pTUFdJS0ktMzk1XSBPbmUgbW9yZSB4aHRtbCBpc3N1ZSBpbiBwbGFpbi5qc3AuIE5vdCB3aGF0IHlvdSdkIGV4cGVjdGVkIDstKQogCiAgICAgICAgIAoyMDA4LTEwLTA1ICBEaXJrIEZyZWRlcmlja3ggPGRpcmsuZnJlZGVyaWNreEBnbWFpbC5jb20+CgogICAgICAgICogMi44LjAtYmV0YS0xNwoKICAgICAgICAqIFtKU1BXSUtJLTM5NV0gRmV3IGZpeGVzIHRvIGltcHJvdmUgeGh0bWwgY29tcGxpYW5jZS4KICAgICAgICAodHhzIHRvIHRoZSB3b25kZXJmdWwgdG9vbHMgb2YgQW5kcmV3IDstKQogICAgICAgIAoKMjAwOC0xMC0wNSAgSGFycnkgTWV0c2tlIDxoYXJyeS5tZXRza2VAZ21haWwuY29tPgoKICAgICAgICAqIFVwZGF0ZWQgTElDRU5TRSBhbmQgTk9USUNFIGZpbGUgcXVpdGUgYSBjb3VwbGUgb2YgcmVzb3VyY2VzIChtb3N0IG9mIHRoZW0gQXBhY2hlIGxpY2Vuc2VkKQogICAgICAgIAogICAgICAgICogYSBmZXcgbWlub3IgdXBkYXRlcyB0byBDb21waWxpbmcudHh0LCBVUEdSQURJTkcgYW5kIFJlbGVhc2VOb3RlcwoKMjAwOC0xMC0wNSAgRGlyayBGcmVkZXJpY2t4IDxkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tPgoKICAgICAgICAqIFVwZGF0ZWQgTElDRU5TRSBhbmQgTk9USUNFIGZpbGUgZm9yIGphdmFzY3JpcHQgcmVsYXRlZCByZXNvdXJjZXMuIChubyB2ZXJzaW9uIHN0ZXAtdXApCgoyMDA4LTEwLTAxICBBbmRyZXcgSmFxdWl0aCA8YWphcXVpdGggQVQgYXBhY2hlIERPVCBvcmc+CgogICAgICAgICogMi44LjAtYmV0YS0xNgoKICAgICAgICAqIFtKU1BXSUtJLTM4Nl0gQ3VzdG9tIExvZ2luTW9kdWxlcyB3ZXJlIG5vdCBiZWluZyBjb25maWd1cmVkIGNvcnJlY3RseS4KICAgICAgICBUaGFua3MgdG8gUGV0ZXIgSG9ybWFubnMgZm9yIHJlcG9ydGluZyB0aGlzLgoKMjAwOC0xMC0wMSAgRGlyayBGcmVkZXJpY2t4IDxkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tPgoKICAgICAgICAqIDIuOC4wLWJldGEtMTUKICAgICAgICAKICAgICAgICAqIFtKU1BXSUtJLTMyN10gRmV3IG1vcmUgdHdlYWtzIHRvIHN0YWJpbGl6ZSB0aGUgJ2JhY2snIGJ1dHRvbiBoYW5kbGluZyBhZnRlciBhIHNlYXJjaC4KICAgICAgICAKICAgICAgICAKMjAwOC0wOS0zMCAgRGlyayBGcmVkZXJpY2t4IDxkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tPgoKICAgICAgICAqIDIuOC4wLWJldGEtMTQKICAgICAgICAKICAgICAgICAqIFtKU1BXSUtJLTMyN10gR29pbmcgYmFjayB0byB0aGUgc2VhcmNoIHBhZ2Ugbm93IHJlbWVtYmVycyB0aGUgbGFzdCBzZWFyY2ggcXVlcnkuCiAgICAgICAgVGhlIHF1ZXJ5IGFuZCBzZWxlY3RlZCBwYWdpbmF0aW9uLXBhZ2UgaXMgc3RvcmVkIGluIHRoZSAjaGFzaCBvZiB0aGUgdXJsLgogICAgICAgIAogICAgICAgIAoyMDA4LTA5LTMwICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AYXBhY2hlLm9yZz4KCiAgICAgICAgKiBPb3BzLCBEdXRjaCBjb3JlcGFnZXMgaGFkIG92ZXJ3cml0dGVuIHRoZSBFbmdsaXNoIGNvcmVwYWdlcywKICAgICAgICBzbyByZXN0b3JlZCBib3RoIEVuZ2xpc2ggb25lcyBhbmQgY3JlYXRlZCBhIGRpciBmb3IgRHV0Y2guCgoyMDA4LTA5LTI5ICBEaXJrIEZyZWRlcmlja3ggPGRpcmsuZnJlZGVyaWNreEBnbWFpbC5jb20+CgogICAgICAgICogMi44LjAtYmV0YS0xMwogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktMzg1XSBIZWFkZXIgbGluZXMgYXJlIG5vdyBjbGVhcmVkICdsZWZ0JyBzbyB0aGF0IGNvbW1lbnQtYm94ZXMgCiAgICAgICAgY2FuIGFwcGVhciBzaWRlIGJ5IHNpZGUgd2l0aCAhISFoZWFkZXIgbGluZXMuIAogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktMzgwXSBGaXggYmFja3NwYWNlIGhhbmRsaW5nIG9mIHRoZSBwbGFpbiBlZGl0b3IuCgoyMDA4LTA5LTI5ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjguMC1iZXRhLTEyCiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0zODddIEZpeGVkIGEgbnVtYmVyIG9mIHF1b3RlcyBvbiBJbnN0YWxsLmpzcC4KCjIwMDgtMDktMjcgIEhhcnJ5IE1ldHNrZSA8aGFycnkubWV0c2tlQGdtYWlsLmNvbT4KCiAgICAgICAgKiAyLjguMC1iZXRhLTExCiAgICAgICAgCiAgICAgICAgKiBhZGRlZCBEdXRjaCBjb3JlcGFnZXMKCjIwMDgtMDktMjQgIEp1YW4gUGFibG8gU2FudG9zIDxqdWFucGFibG8uc2FudG9zQGFwYWNoZS5vcmc+CgogICAgICAgICogMi44LjAtYmV0YS0xMAogICAgICAgIAogICAgICAgICogYWRkZWQgc3BhbmlzaCBjb3JlcGFnZXMKICAgICAgICAKICAgICAgICAqIFtKU1BXSUtJIDM0M10gR28gdGhyb3VnaCBhbGwgYnVpbHQtaW4gd2lraXBhZ2VzIGFuZCBtYWtlIHN1cmUgYWxsIG9mIHRoZSAKICAgICAgICBkb2N1bWVudGF0aW9uIGluIHRob3NlIGlzIG9rIGZvciAyLjguMC4gQXBwbGllZCBvbmx5IGZvciBlbiBhbmQgZXMgY29yZXBhZ2VzLgogICAgICAgIAoyMDA4LTA5LTI0ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjguMC1iZXRhLTkKICAgICAgICAKICAgICAgICAqIFtKU1BXSUtJLTM2OF0gRml4ZWQgaXNzdWUgd2l0aCBtdWx0aXBsZSBwcmVmZXJlbmNlcyBjb29raWVzCiAgICAgICAgYXBwZWFyaW5nIGlmIHRoZSB3ZWIgYXBwIHdhcyBpbnN0YWxsZWQgdG8gdGhlIHJvb3QuICBUaGFua3MKICAgICAgICB0byBGbG9yaWFuIGZvciBmaW5kaW5nIHRoaXMhCgoyMDA4LTA5LTIxICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjguMC1iZXRhLTgKICAgICAgICAKICAgICAgICAqIFtKU1BXSUtJLTM3M10gRml4ZWQgaXNzdWUgd2l0aCBzaWduIGJ1dHRvbiBnaXZpbmcgYSBmaXhlZCBkYXRlLgogICAgICAgIFVuZm9ydHVuYXRlbHkgdGhlIGZvcm1hdCBpcyBmaXhlZC4gIFRoYW5rcyB0byBTdGVmYW4gQm9obiBmb3IgCiAgICAgICAgYSBmaXguCgoyMDA4LTA5LTIxICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjguMC1iZXRhLTcKICAgICAgICAKICAgICAgICAqIFtKU1BXSUtJLTM3OV0gVHJhbnNsYXRlVGFnIG5vdyBwcm9wZXJseSBkb2VzIGEgZGVlcAogICAgICAgIGNsb25lIG9mIHRoZSBXaWtpQ29udGV4dCwgc28gdGhhdCB5b3Ugbm8gbG9uZ2VyIGNhbiBnZXQKICAgICAgICBBQ0xzIGluc3RhbnRpYXRlZCBqdXN0IGJ5IHByZXZpZXdpbmcgYSBwYWdlLgogICAgICAgIAoyMDA4LTA5LTIwICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjguMC1iZXRhLTYKICAgICAgICAKICAgICAgICAqIFtKU1BXSUtJLTIzMV0gQnJvdWdodCBJdGFsaWFuIGFuZCBDaGluZXNlIHRyYW5zbGF0aW9ucyB1cCB0bwogICAgICAgIHBhci4KICAgICAgICAKICAgICAgICAqIEFkZGVkIENoaW5lc2UgY29yZXBhZ2VzLCB0aGFua3MgdG8gRGF2aWQgR2FvLgoKMjAwOC0wOS0xOCAgSGFycnkgTWV0c2tlIDxoYXJyeS5tZXRza2VAZ21haWwuY29tPgoKICAgICAgICAqIDIuOC4wLWJldGEtNSAgSlNQV0lLSS0yMzE6IHVwZGF0ZSB0aGUgbGF0ZXN0IGRlIGxvY2FsaXNhdGlvbiwgcGF0Y2ggZnJvbSBGbG9yaWFuCgoyMDA4LTA5LTE4ICBIYXJyeSBNZXRza2UgPGhhcnJ5Lm1ldHNrZUBnbWFpbC5jb20+CgogICAgICAgICogMi44LjAtYmV0YS00ICBKU1BXSUtJLTI2MzogRE9DIGNoYW5nZSB0byB0aGUgUkVBRE1FIGZpbGUKICAgICAgICAKMjAwOC0wOS0xOCAgQW5kcmV3IEphcXVpdGggPGFqYXF1aXRoIEFUIGFwYWNoZSBET1Qgb3JnPgoKICAgICAgICAqIDIuOC4wLWJldGEtMwogICAgICAgIAogICAgICAgICogT25lIGxvbmVseSBKYXZhZG9jIHR3ZWFrLgoKMjAwOC0wOS0xOCAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGFwYWNoZS5vcmc+CgogICAgICAgICogMi44LjAtYmV0YS0yCiAgICAgICAgCiAgICAgICAgKiBGaXhlZCB0aGUgZmFpbGluZyB1bml0IHRlc3RzIGZvciBQYWdlUmVuYW1lci4KICAgICAgICAKMjAwOC0wOS0wNSAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGFwYWNoZS5vcmc+CgogICAgICAgICogMi44LjAtYmV0YS0xCgoyMDA4LTA5LTAzIERpcmsgRnJlZGVyaWNreCA8ZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbT4KCiAgICAgICAgKiAyLjcuMC1hbHBoYS0zNwogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktMzY5XSBTbmVha1ByZXZpZXcgd2FzIGJyb2tlbiB3aGVuIG5vIFNlY3Rpb25FZGl0IHdhcyB0dXJuZWQgb2ZmLgoKICAgICAgICAqIFtKU1BXSUtJLTM3MF0gUmVtb3ZlICd2ZXJ0aWNhbC1hbGlnbicgY3NzIHJ1bGUgdG8gcHJldmVudCBwcmludGluZyBlcnJvcnMsCiAgICAgICAgYXMgcmVwb3J0ZWQgYnkgVGVycnkgU3RlaWNoZW4uCiAgICAgICAgCiAgICAgICAgKiBGZXcgc21hbGwgZml4ZXMgb24gdGhlIEFjY29yZGlvbiBzdHlsZS4KIAoyMDA4LTA5LTAyICBKdWFuIFBhYmxvIFNhbnRvcyA8anVhbnBhYmxvLnNhbnRvc0BnbWFpbC5jb20+CgogICAgICAgICogVXBkYXRlZCBzcGFuaXNoIHRyYW5zbGF0aW9uIChDb3JlUmVzb3VyY2VzX2VzICsgZGVmYXVsdF9lcyBwcm9wZXJ0aWVzKQogICAgICAgIAoyMDA4LTA4LTMxICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjcuMC1hbHBoYS0zNgogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktMzY2XTogY2hhbmdlbm90ZSB3YXMgbG9zdCBpbiBjb21tZW50aW5nIHByZXZpZXdzLiBBbHNvLCBGQ0sKICAgICAgICB3YXMgbm90IHNob3dpbmcgdGhlIGNoYW5nZW5vdGUgZmllbGQuCiAgICAgICAgCjIwMDgtMDgtMzEgIEhhcnJ5IE1ldHNrZSA8aGFycnkubWV0c2tlQGdtYWlsLmNvbT4KCiAgICAgICAgKiAyLjcuMC1hbHBoYS0zNQogICAgICAgIAogICAgICAgICogSlNQV0lLSS0zNjQ6ICBJbmZvIHRhYiBwcmVzZW50cyBudWxsIHN0cmluZyB0byB1c2VyIChyZXBvcnRlZCBieSBGbG9yaWFuKQogICAgICAgIAoyMDA4LTA4LTMxICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjcuMC1hbHBoYS0zNAogICAgICAgIAogICAgICAgICogQ29tbWVudGluZyBub3cgdXNlcyB0aGUgY2hhbmdlbm90ZSBmaWVsZCBwcm9wZXJseSAoYW5kIHdlIGdvdCByaWQKICAgICAgICBvZiB0aGUgIkNvbW1lbnQgYnkgWFhYIiAtZnVuY3Rpb25hbGl0eS4gIFRoZXJlZm9yZSwgImNvbW1lbnQuYnkiIGkxOG4gZmllbGQKICAgICAgICBpcyBub3cgdW51c2VkLgogICAgICAgIAogICAgICAgICogUmVuYW1pbmcgbm93IHVzZXMgc3ltYm9scyBpbnN0ZWFkIG9mIEVuZ2xpc2ggdGV4dCB0byBwdXQgaW4gdGhlIGNoYW5nZW5vdGUKICAgICAgICBmaWVsZC4KICAgICAgICAKMjAwOC0wOC0zMCAgSGFycnkgTWV0c2tlIDxoYXJyeS5tZXRza2VAZ21haWwuY29tPgoKICAgICAgICAqIDIuNy4wLWFscGhhLTMzCiAgICAgICAgCiAgICAgICAgKiBKU1BXSUtJLTIzMTogdXBkYXRlIHRoZSBsYXRlc3QgZGUgbG9jYWxpc2F0aW9uIHBhdGNoIGZyb20gRmxvcmlhbgogICAgICAgIGFuZCBxdWl0ZSBhIGZldyBjb3JyZWN0aW9ucyB0byB0aGUgbmwgbG9jYWxpc2F0aW9uCiAgICAgICAgCiAgICAgICAgKiBGb3VuZCBkdXJpbmcgZGVidWdnaW5nIHRoYXQgTHVjZW5lIEluZGV4ZXIgd2FzIHVzaW5nIGEgYml0IAogICAgICAgIGFncmVzc2l2ZSBpbnRlcnZhbCBvZiAxIHNlY29uZCBmb3IgRW1wdHlpbmcgaW5kZXggcXVldWUsIGxvd2VyZWQgdG8gNSBzZWNvbmRzCiAgICAgICAgQ29tYmluZWQgd2l0aCBhIGZldyB0ZXh0dWFsIGNvcnJlY3Rpb25zIGluIFdpa2lCYWNrZ3JvdW5kVGhyZWFkIAoKMjAwOC0wOC0zMCAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGFwYWNoZS5vcmc+CgogICAgICAgICogMi43LjAtYWxwaGEtMzIKICAgICAgICAKICAgICAgICAqIEpTUFdJS0ktMjc6IFJlZmVyZW5jZU1hbmFnZXIgd2FzIG5vdCBzZXJpYWxpemluZyBwcm9wZXJseSB3aGVuIHRoZXJlCiAgICAgICAgd2FzIG5vIHBhZ2UgbWV0YWRhdGEsIHRoZXJlZm9yZSBpbmFkdmVydGVudGx5IGxvYWRpbmcgb2xkIGRhdGEgd2hlbmV2ZXIKICAgICAgICB0aGUgd2lraSB3YXMgcmVzdGFydGVkLiAKICAgICAgICAKICAgICAgICAqIEpTUFdJS0ktMzMzOiBUaGFua3MgdG8gRmxvcmlhbidzIHBhdGNoLCB0aGlzIGFubm95aW5nIGxhbmd1YWdlIHNlbGVjdGlvbgogICAgICAgIHRoaW5nIHNob3VsZCBub3cgYmUgZml4ZWQuCiAgICAgICAgCiAgICAgICAgKiBGaXhlZCBGaW5uaXNoIGxvY2FsaXphdGlvbi4KICAgICAgICAKICAgICAgICAqIFRoZSBzdWdnZXN0aW9uIGJveCBubyBsb25nZXIga2VlcHMgc3VnZ2VzdGluZyB3aWtpcGFnZXMgaWYgeW91IHN0YXJ0CiAgICAgICAgaW5zZXJ0aW5nIGEgcGx1Z2luIG9yIGEgdmFyaWFibGUuCiAgICAgICAgCiAgICAgICAgKiBKU1BXSUtJLTM1NDogRml4ZWQgaXNzdWUgd2l0aCBmYWxsYmFjayB0byBkZWZhdWx0IHRlbXBsYXRlIG5vdCB3b3JraW5nLgogICAgICAgIAoyMDA4LTA4LTMwIERpcmsgRnJlZGVyaWNreCA8ZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbT4KCiAgICAgICAgKiAyLjcuMC1hbHBoYS0zMQogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktMzQ2XSBSZW5hbWUgZXJyb3JzIGFyZSBub3cgZGlzcGxheWVkIGluc2lkZSBhIHBhZ2UtaW5mbyBpbiBzY3JlZW4sCiAgICAgICAgYWJvdmUgdGhlIHJlbmFtZSBzZWN0aW9uLiAgU29tZSBsb2NhbGl6YXRpb24gdXBkYXRlcyBhcmUgbmVlZGVkLgoKICAgICAgICBOZXcgcmVzb3VyY2U6CiAgICAgICAgICAgIHByZWZzLmVycm9ycHJlZml4LnJlbmFtZT1Db3VsZCBub3QgcmVuYW1lIHRoZSBwYWdlOiZuYnNwOwoKICAgICAgICBBbmQgdGhlIENvcmVSZXNvdXJjZXMgcmVuYW1lLiogaXRlbXMgYXJlIHVwZGF0ZWQgdG8gcmVtb3ZlIHRoZSB0ZXh0CiAgICAgICAgIkNsaWNrICJiYWNrIiBvbiB5b3VyIGJyb3dzZXIgYW5kIGNoYW5nZSB0aGUgbmV3IG5hbWUuIi4KICAgICAgICAoZG9uZSBmb3IgZGVmYXVsdCBhbmQgLm5sIHByb3BlcnRpZXMpCgogICAgICAgICogW0pTUFdJS0ktMjg5XSBUaGUgZWRpdCBTdWdnZXN0aW9uTWVudSAocGxhaW4gZWRpdG9yIG9ubHkpIG5vdyBhbHNvIGFsbG93cyAKICAgICAgICB0byBlbnRlciBhICcvJyB0byBnZXQgYSBsaXN0IG9mIGF0dGFjaG1lbnQgbGlua3MuIE1vcmVvdmVyLCB3aGVuIHlvdSBvcGVuIGEgbmV3IGxpbmsgd2l0aCAKICAgICAgICBhICdbJywgYnkgZGVmYXVsdCBqc3B3aWtpIGRpc3BsYXlzIHRoZSBsaXN0IG9mIGF0dGFjaG1lbnRzIG9mIHRoZSBjdXJyZW50IHBhZ2UuCiAKCjIwMDgtMDgtMjUgRGlyayBGcmVkZXJpY2t4IDxkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tPgoKICAgICAgICAqIDIuNy4wLWFscGhhLTMwIAoKICAgICAgICAqIFtKU1BXSUtJLTMyOV0gUGFnaW5hdGlvbiBsaW5rIGZvciBBbGwtZW50cmllcyBmaXhlZC4gQWRkZWQgY29tbWVudHMgdG8KICAgICAgICBJbmZvQ29udGVudC5qc3AgdG8gY2xlYXItb3V0IG9ic2N1cmUgcGFnaW5hdGlvbiBjb3VudGluZyBsb2dpYy4KIAogICAgICAgICogW0pTUFdJS0ktMzU3XSwgW0pTUFdJS0ktMzU4XSBXcm9uZyBzZWN0aW9uIGNvdW50aW5nIHdoZW4gYSBwYWdlIGNvbnRhaW5zIGEgVE9DLgoKICAgICAgICAqIFtKU1BXSUtJLTM1OV0gUG9wdXAgd2hlbiBlZGl0aW5nIHBhZ2UgZnJvbSBRdWljayBOYXZpZ2F0aW9uIEZpZWxkIHNob3VsZCBvbmx5CiAgICAgICAgYXBwZWFyIHdoZW4gbm8gcGFnZW5hbWUgd2FzIGVudGVyZWQgaW4gaW5wdXQgZmllbGQuCiAgICAgICAgCgoyMDA4LTA4LTI0ICBBbmRyZXcgSmFxdWl0aCA8YWphcXVpdGggQVQgYXBhY2hlIERPVCBvcmc+CgogICAgICAgICogMi43LjAtYWxwaGEtMjkKCiAgICAgICAgKiBDaGFuZ2VkIG1ldGhvZCBzaWduYXR1cmUgZm9yIFVzZXJQcm9maWxlLmdldC9zZXRVaWQoKSB0byB1c2UgU3RyaW5ncyByYXRoZXIKICAgICAgICB0aGFuIGxvbmcgaW50ZWdlcnMuIFRlc3QgYW5kIFhNTC9KREJDIFVzZXJEYXRhYmFzZSBpbXBsZW1lbnRhdGlvbnMgY2hhbmdlZAogICAgICAgIGFsc28uIFRoaXMgY2hhbmdlIHdhcyBtYWRlIGZvciBmb3J3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBKQ1Igc3RvcmFnZSBpbiAgMy4wLiAKCjIwMDgtMDgtMjQgRGlyayBGcmVkZXJpY2t4IDxkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tPgoKICAgICAgICAqIDIuNy4wLWFscGhhLTI4IAoKICAgICAgICAqIFtKU1BXSUtJLTM1NV0gRml4aW5nIHNlY3Rpb24tZWRpdGluZyBidWcgcmVwb3J0ZWQgYnkgSGFycnkuCiAgICAgICAgCiAgICAgICAgKiBTYXZpbmcgdXNlci1wcmVmZXJlbmNlcyB3YXMgYnJva2VuIGluIFByZWZlcmVuY2VzVGFiLmpzcAogICAgICAgIAoKMjAwOC0wOC0yNCAgSGFycnkgTWV0c2tlIDxoYXJyeS5tZXRza2VAZ21haWwuY29tPgoKICAgICAgICAqIDIuNy4wLWFscGhhLTI3CiAgICAgICAgCiAgICAgICAgKiBhZGRlZCBteSBHUEcga2V5IHRvIEtFWVMKICAgICAgICAKICAgICAgICAqIG1pbm9yIGNvcnJlY3Rpb25zL2FkZGl0aW9ucyB0byBVUEdSQURJTkcKICAgICAgICAKICAgICAgICAqIG1pbm9yIGNvcnJlY3Rpb25zL2FkZGl0aW9ucyB0byB0aGUgc2VsZW5pdW0gcmVhZG1lLnR4dAogICAgICAgIAogICAgICAgICogYWRkZWQgJHtqYXZhLmhvbWV9Ly4uL2xpYi90b29scy5qYXIgdG8gcGF0aC50ZXN0cywgc2V0IGpzcHdpa2kubG9naW4udGhyb3R0bGluZz1mYWxzZSBhbmQgc29tZSBvdGhlciBjb21tZW50cyBpbiBidWlsZC54bWwKICAgICAgICAKICAgICAgICAqIGFkZGVkIGZpcmVmb3gtMiBicm93c2VyIG9wdGlvbiAoYXMgZXh0cmEgY29tbWVudCkgdG8gYnVpbGQucHJvcGVydGllcwogICAgICAgIAogICAgICAgICogYWRkZWQgbmV3IHNpbXBsZSBWaWV3UGFnZVNvdXJjZSBzZWxlbml1bSB0ZXN0CiAgICAgICAgCiAgICAgICAgKiBnZXQgcmlkIG9mIGNvbXBpbGUgd2FybmluZyBpbiBXaWtpUGFnZSBhbmQgV3lzaXd5Z0VkaXRpbmdSZW5kZXJlciBhbmQgR3JvdXBNYW5hZ2VyCiAgICAgICAgCiAgICAgICAgKiBjb21waWxlIGVycm9yIGluIElucHV0VmFsaWRhdG9yVGVzdAogICAgICAgIAoKMjAwOC0wOC0yMyBEaXJrIEZyZWRlcmlja3ggPGRpcmsuZnJlZGVyaWNreEBnbWFpbC5jb20+CgogICAgICAgICogMi43LjAtYWxwaGEtMjYgCgogICAgICAgICogW0pTUFdJS0ktMzMzXSBGaXhlZCBzaWRlLWltcGFjdCBpbiBHcm91cE1hbmFnZXIgZHVlIHRvIG5ldyAKICAgICAgICBJbnB1dFZhbGlkYXRvciBjb25zdHJ1Y3Rvci4gIAogICAgICAgIAoKMjAwOC0wOC0yMyBEaXJrIEZyZWRlcmlja3ggPGRpcmsuZnJlZGVyaWNreEBnbWFpbC5jb20+CgogICAgICAgICogMi43LjAtYWxwaGEtMjUgIFRlbXBsYXRlIGZpeGVzIChtYWlubHkgc2VjdGlvbiBlZGl0aW5nKQoKICAgICAgICAqIFRoZSBTZWN0aW9uLUVkaXRpbmcgdXNlciBwcmVmZXJlbmNlIGNhbiBub3cgYWxzbyBiZSBzZXQgdmlhIHRoZQogICAgICAgIGRlZmF1bHRfanNwd2lraS5wcm9wZXJ0aWVzLiBCeSBkZWZhdWx0IHRoZSBwcmVmZXJlbmNlIGlzIHR1cm5lZCBvZmYuCiAgICAgICAgCiAgICAgICAgICAgICAgICBqc3B3aWtpLmRlZmF1bHRwcmVmcy50ZW1wbGF0ZS5zZWN0aW9uZWRpdGluZyA9b24KICAgICAgICAKICAgICAgICAqIFNtYWxsIGZpeCB0byBhdm9pZCBzZWN0aW9uLWVkaXRpbmcgW2VkaXRdIGxpbmsgb24gdGFibGUgb2YgY29udGVudHMgdGl0bGVzLgogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktMzUwXSBTZWN0aW9uLUVkaXRpbmcgbmVlZHMgdG8gYmUgc3VwcHJlc3NlZCBpbiBhIGNvbW1lbnQgY29udGV4dC4KICAgICAgICAKICAgICAgICAqIFRoZSBjaGFuZ2Utbm90ZSBpbnB1dCBmaWVsZCBpcyBzdXBwcmVzc2VkIGluIGEgY29tbWVudCBjb250ZXh0IGFzIEpTUFdpa2kKICAgICAgICBhdXRvLWdlbmVyYXRlcyB0aGUgY2hhbmdlLW5vdGUgZm9yIGNvbW1lbnRzLiBBbHNvIGFkZGVkIGxvY2FsaXphdGlvbiBpbiBDb21tZW50LmpzcAogICAgICAgIEFkZGVkIG5ldyByZXNvdXJjZSB0byBDb3JlUmVzb3VyY2VzLnByb3BlcnRpZXMuCiAgICAgICAgCiAgICAgICAgICAgICAgICBjb21tZW50LmJ5PUNvbW1lbnQgYnkgezB9CiAgICAgICAgICAgICAgICAKICAgICAgICAqIFtKU1BXSUtJLTMyOV0gUGFnaW5hdGlvbiBsaW5rcyBvbiB0aGUgdmVyc2lvbiBoaXN0b3J5IHdlcmUgc3RpbGwgbm90IGNvcnJlY3QKICAgICAgICB3aGVuIG51bWJlciBvZiB2ZXJzaW9uIGVxdWFscyBhIG11bHRpcGxlIG9mIDIwLiBPb3BzLgogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktMzA5XSBWYXJpb3VzIHVwZGF0ZXMgb2YgdGhlIE9yZGVyZWRMaXN0IHNraW4sIGluY2x1ZGluZyBzZWN0aW9uIGVkaXRpbmcuCiAgICAgIAoKMjAwOC0wOC0yMyBEaXJrIEZyZWRlcmlja3ggPGRpcmsuZnJlZGVyaWNreEBnbWFpbC5jb20+CgogICAgICAgICogMi43LjAtYWxwaGEtMjQKCiAgICAgICAgKiBbSlNQV0lLSS0zMzNdIExhbmd1YWdlIHNlbGVjdGlvbi9kZXNlbGVjdGlvbiB3YXMgbm90IHdvcmtpbmcgY29ycmVjdGx5CiAgICAgICAgZm9yIHNvbWUgZXJyb3IgbWVzc2FnZXMuIFJlZmFjdG9yZWQgdGhlIGlucHV0LXZhbGlkYXRvciB0byB1c2UgY29ycmVjdCBsb2NhbGUuCgoKMjAwOC0wOC0yMCAgQW5kcmV3IEphcXVpdGggPGFqYXF1aXRoIEFUIGFwYWNoZSBET1Qgb3JnPgoKICAgICAgICAqIDIuNy4wLWFscGhhLTIzCgogICAgICAgICogQ2hhbmdlZCBTdHJpcGVzIHRlc3QgamFyIHRvIHRoZSByZWxlYXNlZCAxLjUgdmVyc2lvbiAoY29uZ3JhdHMgdG8gVGltCiAgICAgICAgYW5kIHRoZSB0ZWFtKS4KCjIwMDgtMDgtMjAgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuNy4wLWFscGhhLTIyCiAgICAgICAgCiAgICAgICAgKiBKU1BXSUtJLTI3OiBNYW5hZ2VkIHRvIGR1cGxpY2F0ZSB0aGlzIHBlc2t5IGJ1ZyBmcm9tIHdheSBvbGQgdGltZXMuCiAgICAgICAgTG9va3MgbGlrZSB0aGlzIHdhcyBjYXVzZWQgYnkgYSBtaXNyZWFkIG9mIHRoZSBPU0NhY2hlIGphdmFkb2NzIC0KICAgICAgICBidXQgSSBhbSBub3Qgc3VyZSBpZiB0aGUgZml4IGNhdXNlcyBuZXcgcHJvYmxlbXMuCiAgICAgICAgCiAgICAgICAgKiBKU1BXSUtJLTM1MzogRml4ZWQgd3JvbmcgaTE4biBrZXkgaW4gUGx1Z2luTWFuYWdlciB3aGljaCBzaG93ZWQKICAgICAgICB1cCBpZiB0aGUgcGx1Z2luIHRocmV3IGFuIGV4Y2VwdGlvbi4KICAgICAgICAKICAgICAgICAqIEpTUFdJS0ktMzUyOiBGaXhlZCBhIGxvbmctc3RhbmRpbmcgYnVnIHdpdGggQUNMcyBiZWluZyBsZWFrZWQKICAgICAgICBmcm9tIG9uZSBwYWdlIHRvIGFub3RoZXIgaWYgdGhlIEluc2VydFBhZ2VUYWcgd2FzIHVzZWQuCiAgICAgICAgCiAgICAgICAgKiBBZGRlZCBhIEtFWVMgZmlsZSB0byB0aGUgdG9wLWxldmVsIGRpci4gIEl0IHdvdWxkIGJlIGEgZ29vZCBpZGVhCiAgICAgICAgaWYgYWxsIGNvbW1pdHRlcnMgYWRkZWQgdGhlaXIgY3VycmVudCBHUEcga2V5cyB0byBpdC4KICAgICAgICAKMjAwOC0wOC0xOCAgSGFycnkgTWV0c2tlIDxoYXJyeS5tZXRza2VAZ21haWwuY29tPgoKICAgICAgICAqIDIuNy4wLWFscGhhLTIxCiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0zNDldIHVwZGF0ZWQgKEdlcm1hbikgY29yZXBhZ2VzLCBjcmVkaXRzIHRvIEZsb3JpYW4gYWdhaW4KICAgICAgICAKMjAwOC0wOC0xNyAgSGFycnkgTWV0c2tlIDxoYXJyeS5tZXRza2VAZ21haWwuY29tPgoKICAgICAgICAqIDIuNy4wLWFscGhhLTIwCiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0zNDBdIHVwZGF0ZWQgKGVuZ2xpc2gpIGNvcmVwYWdlcyBhbmQgUkVBRE1FLCBtb3N0bHkgZWRpdG9yaWFsIGNoYW5nZXMsIAogICAgICAgICAgIGEgYnJpZWYgc3VtbWFyeSA6CiAgICAgICAgLSBKYXZhIDUuMCBpcyBub3cgYSByZXF1aXJlbWVudCBmb3IgY29tcGlsaW5nIChpbnN0ZWFkIDEuNC4yKQogICAgICAgIC0gU2VydmxldCBBUEkgMi4yIGlzIG1lbnRpb25lZCwgaXMgdGhpcyBzdGlsbCBlbm91Z2ggPyAoSSBoYXZlbid0IGNoZWNrZWQpCiAgICAgICAgLSBSZW1vdmVkIGRlYWQgbGluayB0byB0andvcmxkLm5ldC9oZWxwL2tiLzAwMDFfaWlzNi1Ub21jYXQ1LUpLMi5odG1sI2NvbkNvbm5lY3RvcgogICAgICAgIC0gUmVtb3ZlZCBsaW5rcyB0byBKU1BXaWtpIDIuMiAsICAyLjMgYW5kIDIuNCBkb2N1bWVudGF0aW9uCgoyMDA4LTA4LTE2ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjcuMC1hbHBoYS0xOQogICAgICAgIAogICAgICAgICogSlNQV0lLSS0zMTU6IEZpeGVkIGlzc3VlcyB3aXRoIHVwcGVyL2xvd2VyY2FzZSBmaWx0ZXJpbmcgaW4gCiAgICAgICAgQXR0YWNobWVudE1hbmFnZXIKICAgICAgICAKICAgICAgICAqIEpTUFdJS0ktMzI1OiBQYXRjaCBmcm9tIEhhcnJ5IHRvIHNvcnQgb3V0IHBsdWdpbiBwYXJhbWV0ZXJzIGFuZCB0aGVpciAKICAgICAgICBqYXZhZG9jcy4KICAgICAgICAKICAgICAgICAqIEpTUFdJS0ktMzA3OiBQYWdlcyB3aXRoICYgaW4gdGhlaXIgbmFtZXMgd2VyZSBub3QgYmVpbmcgcGFyc2VkIHByb3Blcmx5IAogICAgICAgIGluIGxpbmtzLgoKMjAwOC0wOC0xNSAgSGFycnkgTWV0c2tlIDxoYXJyeS5tZXRza2VAZ21haWwuY29tPgoKICAgICAgICAqIDIuNy4wLWFscGhhLTE4CiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0zMzldIGFkZGVkIEdlcm1hbiBjb3JlIHBhZ2VzLCBtYW55IHRoYW5rcyB0byBGbG9yaWFuIGFnYWluICEKCjIwMDgtMDgtMTQgIEhhcnJ5IE1ldHNrZSA8aGFycnkubWV0c2tlQGdtYWlsLmNvbT4KCiAgICAgICAgKiAyLjcuMC1hbHBoYS0xNwogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktMjM4XSBQYWdlUmVuYW1lciBub3cgY29ycmVjdGx5IGhhbmRsZXMgbGlua3MgY29udGFpbmluZyBibGFua3MKICAgICAgICAgIEFkZGVkIGFuIGFkZGl0aW9uYWwgSlVuaXQgdGVzdCBmb3IgdGhpcywgdGhlcmUgaXMgc3RpbCBvbmUgZmFpbGluZyBKVW5pdCB0ZXN0IGhvd2V2ZXIgKGF0dGFjaG1lbnQgaGFuZGxpbmcpLgogICAgICAgICAgUGFnZVJlbmFtZXIgc3RpbGwgbmVlZHMgaW1wcm92ZW1lbnQuCiAgICAgICAgCjIwMDgtMDgtMTQgIEFuZHJldyBKYXF1aXRoIDxhamFxdWl0aCBBVCBhcGFjaGUgRE9UIG9yZz4KCiAgICAgICAgKiAyLjcuMC1hbHBoYS0xNgoKICAgICAgICAqIEZpeGVkIGludmFsaWRhdGVTZXNzaW9uKCkgbWV0aG9kIGluIFdpa2lTZXNzaW9uLCB3aGljaCB3YXMgbm90IHF1aXRlCiAgICAgICAgZnVsbHkgaW52YWxpZGF0aW5nIHNlc3Npb25zLgoKMjAwOC0wOC0xMiBEaXJrIEZyZWRlcmlja3ggPGRpcmsuZnJlZGVyaWNreEBnbWFpbC5jb20+CgogICAgICAgICogMi43LjAtYWxwaGEtMTUKCiAgICAgICAgKiBbSlNQV0lLSS0zMzRdIElFNi9JRTcgamF2YXNjcmlwdCBidWcgY2F1c2VzIHNlY3Rpb24gZWRpdG9yIHRvIGNyYXNoLgogICAgICAgIEpTIGlzIG5vdyBydW5uaW5nIGZpbmUsIGJ1dCB0aGUgU2VjdGlvbiBPdmVydmlldyBib3ggc3RpbGwgbmVlZHMgc29tZSBDU1MKICAgICAgICBmaXhlcy4gT25nb2luZy4KICAgICAgICBOb3RlOiBTZWN0aW9uIEVkaXRpbmcgb25seSB3b3JrcyB3aXRoIHRoZSBwbGFpbiBlZGl0b3IuCiAgICAgICAgCiAKICAgICAgICAqIFtKU1BXSUtJLTMzN10gTWlzc2luZyBsb2NhbGl6YXRpb24gaW4gV29ya2Zsb3dDb250ZW50LmpzcC4KCjIwMDgtMDgtMTIgIEhhcnJ5IE1ldHNrZSA8aGFycnkubWV0c2tlQGdtYWlsLmNvbT4KCiAgICAgICAgKiAyLjcuMC1hbHBoYS0xNAogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktMjMxXSB1cGRhdGVkIGRlIHRyYW5zbGF0aW9uLCB0aGFua3MgdG8gRmxvcmlhbgogICAgICAgIAogICAgICAgICogZml4IGZvciAgW0pTUFdJS0ktMzAwXSByZXF1aXJlZCBzb21lIGV4dHJhIGNoYW5nZXMgdG8gdGhlIEpVbml0IHRlc3QgZm9yIHRoZSBUYWJsZU9mQ29udGVudHMgUGx1Z2luCgoyMDA4LTA4LTEyIERpcmsgRnJlZGVyaWNreCA8ZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbT4KCiAgICAgICAgKiAyLjcuMC1hbHBoYS0xMwoKICAgICAgICAqIFtKU1BXSUtJLTMyOV0gUGFnaW5hdGlvbiBsaW5rIHdhcyBzdGlsbCBub3QgY29ycmVjdCBmb3IgdGhlIGJsb2NrIDIxLTQwLgogICAgICAgIEFtYXppbmcgY2F0Y2ggZnJvbSBIYXJyeSBhbmQgRmxvcmlhbiAtIHR4cyAhCiAKIAoyMDA4LTA4LTEyICBBbmRyZXcgSmFxdWl0aCA8YWphcXVpdGggQVQgYXBhY2hlIERPVCBvcmc+CgogICAgICAgICogMi43LjAtYWxwaGEtMTIKCiAgICAgICAgKiBSZWZhY3RvcmVkIFRlc3RFbmdpbmUgc28gdGhhdCBNb2NrUm91bnRyaXBzIGFuZCBvdGhlciBoZWF2aWVyIHNlc3Npb25zIGFyZQogICAgICAgIGxhemlseSBpbml0aWFsaXplZC4gQWxzbyBhZGRlZCBhIHByb3BlcnR5IHRvIEF1dGhlbnRpY2F0aW9uTWFuYWdlciB0aGF0IGFsbG93cwogICAgICAgIGxvZ2luIHRocm90dGxpbmcgdG8gYmUgc3dpdGNoZWQgb2ZmIChmb3IgZXhhbXBsZSwgZHVyaW5nIHVuaXQgdGVzdHMpLiBUaGUKICAgICAgICBlZmZlY3Qgb2YgdGhlc2UgdHdvIGNoYW5nZXMgY3V0cyB1bml0IHRlc3QgdGltZXMgW29uIG15IG1hY2hpbmVdIGZyb20gMjUgbWludXRlcwogICAgICAgIGRvd24gdG8gYWJvdXQgNC41LgoKICAgICAgICAqIFJlbW92ZWQgcmVmZXJlbmNlIHRvIFN0cmlwZXMgTW9ja1NlcnZsZXRDb250ZXh0IGluIFdlYkNvbnRhaW5lckF1dGhvcml6ZXIuCiAgICAgICAgSXQgc2hvdWxkIG5vdCBoYXZlIGJlZW4gdGhlcmUuCgoyMDA4LTA4LTExIERpcmsgRnJlZGVyaWNreCA8ZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbT4KCiAgICAgICAgKiAyLjcuMC1hbHBoYS0xMSAtIHZhcmlvdXMgc21hbGxlciBmaXhlcyBpbiB0aGUgZGVmYXVsdCB0ZW1wbGF0ZQoKICAgICAgICAqIFtKU1BXSUtJLTMwMl0gQWRkZWQgdGhlIGNsb25lIGZ1bmN0aW9uIHRvIEZDSy5qc3AuIAogICAgICAgIEFsc28gYWRkZWQgcGVybWlzc2lvbiBjaGVja2luZyBvbiB0aGUgaW5jbHVzaW9uIG9mIHRoZSBjbG9uZWQtcGFnZS4KCiAgICAgICAgKiBbSlNQV0lLSS0zMDddIFJlZGlyZWN0aW9uIGZyb20gVXNlclByZWZlcmVuY2VzLmpzcCBkb2Vzbid0IHdvcmsgaWYgIiYiIGlzIGluY2x1ZGVkIAogICAgICAgIGluIHRoZSBvcmlnaW5hbCBwYWdlIG5hbWUuIAoKICAgICAgICAqIFtKU1BXSUtJLTMwMF0gWW91IGNhbiBub3cgYWxzbyBhZGQgYSBUYWJsZU9mQ29udGVudHMgdG8geW91ciB0aGUgTGVmdE1lbnUgKG9yIEZvb3RlciBvciAuLi4pIAogICAgICAgIEFsdGhvdWdoIGEgdGFibGUgb2YgY29udGVudHMgaXMgb25seSByZW5kZXJlZCBvbmNlIG9uIGEgcGFnZTsgbXVsdGlwbGUgaW52b2NhdGlvbnMgb2YgCiAgICAgICAgdGhlIHBsdWdpbiB3aWxsIG5vdyByZW5kZXIgYW4gaW4tcGFnZSBsaW5rICgjc2VjdGlvbi1UT0MpIGluc3RlYWQgb2YgYSBwbGFpbiB1c2VsZXNzIHRleHQuCgogICAgICAgICogW0pTUFdJS0ktMzA2XSBSZW5kZXJpbmcgb2Ygcm91bmRlZCBjb3JuZXJzIGhhcyBiZWVuIGZpeGVkLiAKICAgICAgICBIb3dldmVyLCB0aGUgc2tpbiAiUGxhaW5WYW5pbGxhIDEwMjR4NzY4IiBoYXMgYmVlbiB1cGRhdGVkIG5vdCB0byB1c2UgdGhlIHJvdW5kZXItY29ybmVycyBzdHlsZSBhbnltb3JlLgogICAgICAgIFRoaXMgc3R5bGUgaXMgbm90IGNvbnNpZGVyZWQgcGFydCBvZiBjb3JlIGpzcHdpa2kuICh3aWxsIHByb2JhYmx5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZSkgCiAgICAgICAgWW91IGNhbiBzdGlsbCB1c2UgaXQgZm9yIG5vdyAob3IgcmVhY3RpdmF0ZSBpdCBpbiB0aGUgc2tpbi5qcyBmaWxlIG9mIHRoZSBza2luKQoKICAgICAgICAqIEZpeGVkIHRoZSBMZWZ0L1JpZ2h0IG9yaWVudGF0aW9uIG9mIEZhdm9yaXRlcyBibG9jayAod2l0aCBMZWZ0IE1lbnUpIAogICAgICAgIGZvciB0aGUgRWRpdCBhbmQgQXR0YWNobWVudCBVcGxvYWQgc2NyZWVucy4KCiAgICAgICAgKiBNYWRlIHNvbWUgZmluYWwgZml4ZXMgYW5kIGltcHJvdmVtZW50cyB0byB0aGUgU0VDVElPTiBlZGl0aW5nIGZlYXR1cmUuIAogICAgICAgIEl0IGhhcyBub3cgYmVjb21lIGEgdXNlci1wcmVmZXJlbmNlLCB3aGljaCBpcyBieSBkZWZhdWx0IG9mZi4gKHRoaXMgcHJlZmVyZW5jZSBpcyBvbmx5IAogICAgICAgIGNvbXBhdGlibGUgd2l0aCB0aGUgcGxhaW4gZWRpdG9yKSBXaXRoIHNlY3Rpb24tZWRpdGluZyBvbiwgeW91IHdpbGwgZ2V0IFtlZGl0XSBsaW5rcyAKICAgICAgICBhdCBlYWNoIGhlYWRlciB3aGljaCBhbGxvd3MgeW91IHRvIGRpcmVjdGx5IGVkaXQgYSBwYXJ0aWN1bGFyIHNlY3Rpb24gb2YgYSBwYWdlLiAKICAgICAgICBJbiBlZHRpbmcgbW9kZSwgYSBzZWN0aW9uIG92ZXJ2aWV3IGJveCBpcyBzaG93biBpbiB0aGUgbGVmdC1tZW51IGFsbG93aW5nIHRvIHN3aXRjaCAKICAgICAgICBiZXR3ZWVuIHZhcmlvdXMgcGFnZSBzZWN0aW9uIG9yIGxvb2sgYXQgdGhlIHdob2xlIHBhZ2UuCiAgICAgICAgCiAgICAgICAgTmV3IGxvY2FsaXNhdGlvbiByZXNvdXJjZXM6CiAgICAgICAgICBqYXZhc2NyaXB0LnNlY3Rpb25lZGl0aW5nLmxhYmVsPVNlY3Rpb24gT3ZlcnZpZXcKICAgICAgICAgIHByZWZzLnVzZXIuc2VjdGlvbmVkaXRpbmc9U2VjdGlvbiBFZGl0aW5nCiAgICAgICAgICBwcmVmcy51c2VyLnNlY3Rpb25lZGl0aW5nLnRleHQ9RW5hYmxlIHNlY3Rpb24gZWRpdGluZyB2aWEgLi4uCgogICAgICAgICogU29tZSBtaW5vciBpbXByb3ZlbWVudHMgb24gdGhlIEFjY29yZGlvbiBzdHlsZSB0byBpbXByb3ZlIGNvbnNpc3RlbnQgbG9vayAmIGZlZWwuIAogICAgICAgIE5vdyBhbHNvIHRoZSBhY2NvcmRpb24gdG9nZ2xlcyBzaG93IGEgYmx1ZSArLy0gaWNvbiB0byBpbmRpY2F0ZSBjbGlja2FibGUgcmVnaW9ucy4gCiAgICAgICAgQWxzbyBhZGRlZCBhICUlbGVmdEFjY29yZGlvbiBhbmQgJSVyaWdodEFjY29yZGlvbiBzdHlsZSwgc2ltaWxhciB0byBib29rLXRhYnMuCgogICAgICAgICogW0pTUFdJS0ktMzI5XSB0aGUgY29uc2lzdGVuY3kgYW5kIGNvcnJlY3RuZXNzIG9mIHRoZSBwYWdpbmF0aW9uIGxpbmtzIGhhcyBiZWVuIGltcHJvdmVkCiAgICAgICAgaW4gdGhlIFBhZ2UgSW5mbyBzY3JlZW5zLiBOb3cgZXZlcnkgYmxvY2sgKGFsc28gdGhlIGZpcnN0IDEuLjIwKSBzaG93IDIwIGl0ZW1zOyAKICAgICAgICB0aGUgbGluayB0aXRsZXMgYWxzbyBtYXRjaCB3aXRoIHRoZSBwcmVzZW50ZWQgYmxvY2suIAogICAgICAgIFRoZSBwYWdlIHNpemUgYXJlIG5vdyByZXByZXNlbnRlZCBpbiBrQiwgc2ltaWxhciBhcyBhdHRhY2htZW50IHNpemVzLgogICAgICAgIAoKMjAwOC0wOC0xMSBEaXJrIEZyZWRlcmlja3ggPGRpcmsuZnJlZGVyaWNreEBnbWFpbC5jb20+CgogICAgICAgICogMi43LjAtYWxwaGEtMTAKCiAgICAgICAgKiBbSlNQV0lLSS0zMzNdIExhbmd1YWdlIGNvb2tpZSBpcyBub3cgc2V0IHRvIGRlZmF1bHQgYnJvd3NlciBzZXR0aW5nIAogICAgICAgIHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBQcmVmZXJlbmNlcy4gUHJldmlvdXNseSB0aGlzIHdhcyBub3QgcmVxdWlyZWQgYXMgbG9uZyBhcyB0aGUgIAogICAgICAgIHVzZXIgcHJlZmVyZW5jZXMgd2VyZSBub3QgbW9kaWZpZWQgYnkgdGhlIHVzZXIuIERvbid0IGtub3cgd2h5IHRoaXMgc3RvcHBlZCB3b3JraW5nLgogICAgICAgIAoKMjAwOC0wOC0xMSAgSGFycnkgTWV0c2tlIDxoYXJyeS5tZXRza2VAZ21haWwuY29tPgoKCQkqIG5vIHZlcnNpb24gYnVtcAogICAgICAgIAogICAgICAgICogSlNQV0lLSS0zMTk6IGFkZGVkIGV4dHJhIGNoZWNraW5nIG9uIEF0dGNobWVudCBDaGFuZ2UgTm90ZXMKCjIwMDgtMDgtMTAgIEhhcnJ5IE1ldHNrZSA8aGFycnkubWV0c2tlQGdtYWlsLmNvbT4KCiAgICAgICAgKiAyLjcuMC1hbHBoYS05CiAgICAgICAgCiAgICAgICAgKiBKU1BXSUtJLTMyMDogcmVtb3ZlZCBhbGwgaHR0cFJlcXVlc3Quc2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSBjYWxscyAoZXhjZXB0IGluIFdpa2lTZXJ2bGV0RmlsdGVyKQogICAgICAgIGJlY2F1c2UgdGhleSB3ZXJlIGNhbGxlZCB0b28gbGF0ZSwgcmVwb3J0ZWQgYnkgQ2xheSBBdGtpbnMKICAgICAgICAKMjAwOC0wOC0wNiAgQW5kcmV3IEphcXVpdGggPGFqYXF1aXRoIEFUIGFwYWNoZSBET1Qgb3JnPgoKICAgICAgICAqIDIuNy4wLWFscGhhLTgKICAgICAgICAKICAgICAgICAqIEpTUFdJS0ktMzE2OiBmaXhlZCBTZWN1cml0eUNvbmZpZy5qc3Agc28gdGhhdCBpdCBjb21waWxlcywgYW5kIGFkZGVkCiAgICAgICAgc29tZSBzZW5zaWJsZSBjaGVja3MgZm9yIHRoZSBuZXcgSkFBUyBzY2hlbWUuCgogICAgICAgICogRml4ZWQgTlBFIGluIFJTU0ltYWdlTGlua1RhZywgd2hpY2ggZXJyb25lb3VzbHkgYXNzdW1lcyB0aGF0IFJTU0dlbmVyYXRvcgogICAgICAgIGlzIGFsd2F5cyBhdmFpbGFibGUuIEhvd2V2ZXIsIGl0IG1pZ2h0IG5vdCBiZSBpZiBSU1MgZmVlZHMgYXJlIGRpc2FibGVkLgogICAgICAgIAogICAgICAgICogRml4ZWQgYnJva2VuIEFudCAnd2FyLXRvbWNhdCcgdGFyZ2V0LgoKMjAwOC0wOC0wMyAgSGFycnkgTWV0c2tlIDxoYXJyeS5tZXRza2VAZ21haWwuY29tPgoKICAgICAgICAqIDIuNy4wLWFscGhhLTcKCgkJKiBKU1BXaWtpLTIzMTogYWRkZWQgSXRhbGlhbiBsb2NhbGlzYXRpb24sIHRoYW5rcyB0byBMdWNhIEdpbGFyZG9uaQoJCQoJCSogY2hhbmdlZCB0aGUgc2NoZW1hTG9jYXRpb24gaW4gd2ViLnhtbCwgcmVwb3J0ZWQgYnkgVGhvbWFzIHZhbiBkZXIgUG9sCiAgICAgICAgCjIwMDgtMDgtMDEgIEhhcnJ5IE1ldHNrZSA8aGFycnkubWV0c2tlQGdtYWlsLmNvbT4KCgkJKiBubyB2ZXJzaW9uIGJ1bXAKICAgICAgICAKICAgICAgICAqIEpTUFdJS0ktMzIxOiByZW1vdmUgdW5tYXBwYWJsZSBjaGFycyBmcm9tIDQgc291cmNlcyAoY2F1c2luZyB3YXJuaW5ncyBkdXJpbmcgYnVpbGQpCgogICAgICAgICogSlNQV0lLSS0zMTI6IHNtYWxsIHBhdGNoIHRvIGJ1aWxkLnhtbCwgcXVvdGVzIGFyb3VuZCBhcmd1bWVudHMgb2YgY29tcHJlc3NqcywKICAgICAgICAgIHJlcG9ydGVkIGJ5IEZsb3JpYW4gSG9sZWN6ZWsuCgoyMDA4LTA3LTMxICBIYXJyeSBNZXRza2UgPGhhcnJ5Lm1ldHNrZUBnbWFpbC5jb20+CgoJCSogbm8gdmVyc2lvbiBidW1wCiAgICAgICAgCiAgICAgICAgKiBKU1BXSUtJLTMxNzogRml4ZWQgSW52YWxpZERpZmYgaW4gRXh0ZXJuYWxEaWZmUHJvdmlkZXIsIHRoYW5rcyB0byBKYW4gU3BpdGFsbmlrLgoKMjAwOC0wNy0zMSAgQW5kcmV3IEphcXVpdGggPGFqYXF1aXRoIEFUIGFwYWNoZSBET1Qgb3JnPgoKICAgICAgICAqIDIuNy4wLWFscGhhLTYKCiAgICAgICAgKiBKU1BXSUtJLTMyNjogRml4ZWQgTlBFIGluIFByb2Zhbml0eUZpbHRlci4KCjIwMDgtMDctMTYgIEFuZHJldyBKYXF1aXRoIDxhamFxdWl0aCBBVCBhcGFjaGUgRE9UIG9yZz4KCiAgICAgICAgKiAyLjcuMC1hbHBoYS01CiAgICAgICAgCiAgICAgICAgKiBKU1BXSUtJLTMxNTogYWRkZWQgZXh0cmEgY2hlY2tzIHRvIEF0dGFjaG1lbnRTZXJ2bGV0LgogICAgICAgIAoyMDA4LTA3LTEwICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjcuMC1hbHBoYS00CiAgICAgICAgCiAgICAgICAgKiBGaXhlZCBhIG51bWJlciBvZiBmYWlsaW5nIHVuaXQgdGVzdHMsIGFuZCBhbHNvIGluY2x1ZGVkCiAgICAgICAgQ3Jlb2xlIHRlc3RzLgoKMjAwOC0wNy0wMyAgQW5kcmV3IEphcXVpdGggPGFqYXF1aXRoIEFUIGFwYWNoZSBET1Qgb3JnPgoKICAgICAgICAqIDIuNy4wLWFscGhhLTMKCiAgICAgICAgKiBBZGRlZCB0b3AtbGV2ZWwgdGV4dCBkb2N1bWVudCBVUEdSQURJTkcgd2hpY2ggc3VtbWFyaXplcwogICAgICAgIGNvbnNpZGVyYXRpb25zIGZvciB1cGdyYWRpbmcgZnJvbSAyLjQgYW5kIDIuNi4gVGhpcyBuZWVkcyBtb3JlCiAgICAgICAgd29yaywgZXNwZWNpYWxseSBmcm9tIHRoZSB3ZWItdGllciBjcmV3IChEaXJrIGV0IGFsKS4KICAgICAgICAKICAgICAgICAqIE1hZGUgbW9zdCBvZiB0aGUgd29ya2Zsb3cgcGFja2FnZSwgZXhjZXB0IGZvciB0aGUKICAgICAgICBzZXQvZ2V0QXR0cmlidXRlcyBtZXRob2RzIGluIHRoZSBXb3JrZmxvdyBjbGFzcywgc2VyaWFsaXphYmxlLiBJbiB0aGUgMy4wCiAgICAgICAgdGltZWZyYW1lLCB0aGUgcmVzdCBvZiB0aGUgcGFja2FnZSB3aWxsIGJlIG1hZGUgc2VyaWFsaXphYmxlLCB0b28uCiAgICAgICAgCiAgICAgICAgKiBBZGRlZCBBbnQgdGFyZ2V0ICdhcGktZGlmZicgd2hpY2ggYWxsb3dzIGFyYml0cmFyeSBkaWZmaW5nIGFnYWluc3QKICAgICAgICBwcmV2aW91cyBKU1BXaWtpLmphciBhcnRpZmFjdHMuIEl0IHByaW50cyBhIG5pY2VseSBmb3JtYXR0ZWQgSFRNTCBwYWdlCiAgICAgICAgZGVzY3JpYmluZyBwdWJsaWMgQVBJIGRpZmZlcmVuY2VzLiBUaGUgcmVwb3J0IGZpbGUgaXMKICAgICAgICB0ZXN0cy9yZXBvcnRzL0FQSS1jaGFuZ2VzLmh0bWwuCiAgICAgICAgCiAgICAgICAgKiBVcGdyYWRlZCBTdHJpcGVzIGphciAodXNlZCBpbiB0ZXN0IGNhc2VzKSB0byAxLjUtUkMxLgoKMjAwOC0wNy0wMiAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGFwYWNoZS5vcmc+CgogICAgICAgICogMi43LjAtYWxwaGEtMi4gIFllcywgdGhlIGxhc3QgdmVyc2lvbiBudW1iZXIgd2FzIGFuIAogICAgICAgIGFueGlvdXMgbWlzdGFrZS4gIEl0J3MgcmVhbGx5IDIuNyBhbHBoYSwgbm90IDIuOCBhbHBoYS4KICAgICAgICAKICAgICAgICAqIEpTUFdJS0ktNjE6IEFkZGVkIHBhdGNoIGZyb20gRGF2aWQgQXUgdG8gYWRkIEZDSyAyLjYuMQogICAgICAgIHN1cHBvcnQuICBQbGVhc2Ugc2VlIHRoZSBmb2xsb3dpbmcgcGFnZSB0byBlbmFibGUgaXQ6CiAgICAgICAgCiAgICAgICAgaHR0cDovL3d3dy5qc3B3aWtpLm9yZy93aWtpL0hvd1RvTWFudWFsbHlJbnRlZ3JhdGVGQ0tFZGl0b3IKCjIwMDgtMDYtMzAgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuOC4wLWFscGhhLTEKCiAgICAgICAgKiAyLjcuMC1zdm4tNTIKICAgICAgICAKICAgICAgICAqIEpTUFdJS0ktMjk5OiBEZWxldGluZyBhbiBhdHRhY2htZW50IGZyb20gYSBwYWdlIHdoaWNoCiAgICAgICAgaGFkIGJlZW4gcmVjZW50bHkgcmVuYW1lZCBjYXVzZWQgYW4gTlBFLiAgUmVwb3J0ZWQgYnkgSGFycnkKICAgICAgICBNZXRza2UuCgoyMDA4LTA2LTI5ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AYXBhY2hlLm9yZz4KCiAgICAgICAgKiBNb3ZlZCBhbGwgcGFnZXMgZnJvbSB3aWtpcGFnZXMgdW5kZXIgd2lraXBhZ2VzL2VuLCBhbmQKICAgICAgICB0d2Vha2VkIHRoZSBidWlsZCBwcm9jZXNzIGFjY29yZGluZ2x5LiAgQWxzbyBjcmVhdGVkIGEgYmFzaWMKICAgICAgICBGaW5uaXNoIHRyYW5zbGF0aW9uIG9mIHRoZSBDb3JlUGFnZXMuICBUaGUgYnVpbGQgcHJvY2VzcwogICAgICAgIG5vdyBjcmVhdGVzIGpzcHdpa2lfY29yZXBhZ2VzX2VuLnppcCBhbmQgX2ZpLnppcC4KCjIwMDgtMDYtMTkgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuNy4wLXN2bi01MQogICAgICAgIAogICAgICAgICogSlNQV0lLSS0yMzE6IFVwZGF0ZWQgZGUgaTE4bi4KICAgICAgICAKMjAwOC0wNi0yNSBEaXJrIEZyZWRlcmlja3ggPGRpcmsuZnJlZGVyaWNreEBnbWFpbC5jb20+CgogICAgICAgICogMi43LjAtc3ZuLTUwCgogICAgICAgICogW0pTUFdJS0ktMjk1XSBTdWIgdGFicyBvbiB0aGUgQWRtaW4uanNwIGRpZG4ndCB3b3JrIGJlY2F1c2UgdGhlCiAgICAgICAgY29ycmVzcG9uZGluZyB0YWcgSUQncyB3ZXJlIGNvbnRhaW5pbmcgZG90J3MuCiAgICAgICAgCjIwMDgtMDYtMjIgRGlyayBGcmVkZXJpY2t4IDxkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tPgoKICAgICAgICAqIDIuNy4wLXN2bi00OQoKICAgICAgICAqIFtKU1BXSUtJLTE0MV0gSTE4IHByb3BlcnRpZXMgYWxzbyBmaXhlZCBpbiBFZGl0R3JvdXBDb250ZW50LmpzcAogICAgICAgIAogICAgICAgICogSW5jbHVkZWQgbGF0ZXN0IGZhdmljb24uaWNvIG9mIEZsb3JpYW4gYW5kIEhhcnJ5CgoyMDA4LTA2LTE5ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjcuMC1zdm4tNDgKICAgICAgICAKICAgICAgICAqIFdpa2lXaXphcmQgcmVtb3ZlZCBkdWUgdG8gaXQgYmVpbmcgTEdQTC4gIFRoZSBmb2xsb3dpbmcgZmlsZXMKICAgICAgICB3ZXJlIHJlbW92ZWQKICAgICAgICAgICAqIHdlYmRvY3MvYXBwbGV0cy93aWtpd2l6YXJkLmphcgogICAgICAgICAgICogd2ViZG9jcy9hcHBsZXRzL1dpV2ktSU5GLwogICAgICAgICAgICogd2ViZG9jcy9zY3JpcHRzL2pzcHdpa2ktd2lraXdpemFyZC5qcwogICAgICAgICAgICogc3JjL2NvbS9lY3lyZC9qc3B3aWtpL3VpL2FkbWluL2JlYW5zL1dpa2lXaXphcmRBZG1pbkJlYW4gIAogICAgICAgICAgIAogICAgICAgICogW0pTUFdJS0ktMjMxXTogVXBkYXRlZCBkZSwgemhfQ04gYW5kIG5sLiAgVGhhbmtzIHRvIEZsb3JpYW4KICAgICAgICBIb2xlY3playwgSGFycnkgTWV0c2tlIGFuZCBEYXZpZCBHYW8hCiAgICAgICAgCjIwMDgtMDYtMTkgRGlyayBGcmVkZXJpY2t4IDxkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tPgoKICAgICAgICAqIE5vIHZlcnNpb24gYnVtcAoKICAgICAgICAqIFtKU1BXSUtJLTI5NV0gRml4ZWQgVGFicyBpbiBBZG1pbi5qc3AKCjIwMDgtMDYtMTkgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuNy4wLXN2bi00NwogICAgICAgIAogICAgICAgICogQWRkZWQgc3VwcG9ydCBmb3IgdGhlIFVuaXZlcnNhbCBFZGl0IEJ1dHRvbiAtIAogICAgICAgIHVuaXZlcnNhbGVkaXRidXR0b24ub3JnLiAgQWJvdXQgMyBtaW5zIGJlZm9yZSBsYXVuY2gsIGV2ZW4uLi4KCjIwMDgtMDYtMTcgRGlyayBGcmVkZXJpY2t4IDxkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tPgoKICAgICAgICAqIDIuNy4wLXN2bi00NiAKCiAgICAgICAgKiBbSlNQV0lLSS0yOTNdIGFkZGVkIGVkaXRvci5wbGFpbi5zbmVha3ByZXZpZXcudGl0bGUgcmVzb3VyY2UKCiAgICAgICAgKiBbSlNQV0lLSS0yOTRdIEZhdWx0eSBpMThuIGluIGVkaXRvciB0b29sYmFyCiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0yODBdIFNjcm9sbCBiYXIgcHJvYmxlbSBpbiBJRTcKICAgICAgICAKMjAwOC0wNi0xNSAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGFwYWNoZS5vcmc+CgogICAgICAgICogMi43LjAtc3ZuLTQ1CiAgICAgICAgCiAgICAgICAgKiBKU1BXSUtJLTIwODogUlNTIGltYWdlcyBhcmUgbm93IGhpZGRlbiBpZiBSU1MgaXMgZGlzYWJsZWQuCiAgICAgICAgCiAgICAgICAgKiBNb3ZlZCAiaW5mby5yc3NwYWdlZmVlZC50aXRsZSIga2V5IGZyb20gZGVmYXVsdC5wcm9wZXJ0aWVzCiAgICAgICAgdG8gQ29yZVJlc291cmNlcyBhbmQgcmVuYW1lZCB0byAicnNzLnRpdGxlIi4KCiAgICAgICAgKiBVcGRhdGVkIEZpbm5pc2ggdHJhbnNsYXRpb24uCiAgICAgICAgCiAgICAgICAgKiBKU1BXSUtJLTIzMTogVXBkYXRlZCBEdXRjaCBhbmQgR2VybWFuIHRyYW5zbGF0aW9ucy4KCjIwMDgtMDYtMTUgRGlyayBGcmVkZXJpY2t4IDxkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tPgoKICAgICAgICAqIDIuNy4wLXN2bi00NCAKICAgICAgICAKICAgICAgICAqIFNtYWxsIGZpeGVzIHRvIHBsYWluLmpzcCB0byBpbmNyZWFzZSBpZTYgY29tcGF0aWJpbHR5LgogICAgICAgIEhpZGUgdGhlICd0YWItY29tcGxldGlvbicgYW5kICdzbWFydCB0eXBpbmcgcGFpcnMnIGZyb20gSUUgYnJvd3NlcnMuCgogICAgICAgIEFkZGVkIHRoZSBpMThuIHJlc291cmNlIAogICAgICAgICAgIGVkaXRvci5wbGFpbi50b29iYXI9VG9vbGJhcgoKICAgICAgICAqIFNldmVyYWwgSUU3IGZpeGVzIG9mIHRoZSBjYXRlZ29yeSBhbmQgc3VnZ2VzdGlvbiBwb3B1cCBjc3MuCgogICAgICAgICogQ2hhbmdlIHRoZSBhdHRhY2hlbWVudCBpY29uIHRvIC5naWYgKGlzbyBwbmcpLCBzbyBpdCBnZXRzIHByb3Blcmx5IHJlbmRlcmVkIG9uIGllNi4KICAgICAgICBBZGRlZCBhIHRyYW5zcGFyZW50IC5pY28gZmlsZS4gKHRoYW5rcyBIYXJyeSkKCjIwMDgtMDYtMTQgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuNy4wLXN2bi00MwogICAgICAgIAogICAgICAgICogSlNQV0lLSS0xNDU6IGpzcHdpa2kuYXBwbGljYXRpb25OYW1lIGlzIG5vdyBjbGVhbmVkIHRvIGJlIGEKICAgICAgICBwcm9wZXIgV2lraU5hbWUuICBUaGlzIGlzIHByb2JhYmx5IGEgZ29vZCBpZGVhLi4uCiAgICAgICAgCjIwMDgtMDYtMTQgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuNy4wLXN2bi00MgogICAgICAgIAogICAgICAgICogSlNQV0lLSS0xODU6IFRoZXJlIHNob3VsZCBiZSBubyBtb3JlIE5QRXMgdXBvbiBzdGFydHVwLiAgSW1wcm92ZWQKICAgICAgICBsb2dnaW5nIGFzIHdlbGwgYXMgYWRkZWQgYSBmZXcgbnVsbCBjaGVja3MuCiAgICAgICAgCiAgICAgICAgKiBGaXg6IEl0IHdhcyBpbXBvc3NpYmxlIHRvIGFkZCBuZXcgdXNlcnMgZHVlIHRvIGFuIG92ZXJ6ZWFsb3VzIG51bGwgY2hlY2sKICAgICAgICBpbiBYTUxVc2VyRGF0YWJhc2UuCiAgICAgICAgCiAgICAgICAgKiBJbXByb3ZlZCBvdXIgbm90aWZpY2F0aW9uIGluIGNhc2UgeW91IGhhdmUgbm90IHlldCBpbnN0YWxsZWQgSlNQV2lraS4gIEluY2lkZW50YWxseSwKICAgICAgICB3ZSdyZSB1c2luZyBiYXNlVVJMIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGluc3RhbGwgcHJvY2VzcyBpcyBkb25lLCBhbmQgYmVjYXVzZSBvZiB0aGlzLAogICAgICAgIHNldHRpbmcgYmFzZVVSTCBiZWNvbWVzIG1hbmRhdG9yeS4KICAgICAgICAKICAgICAgICAqIEpTUFdJS0ktMjQ2OiBBbGwgbmV3IChhbmQgZmFzdGVyKSBJbmRleFBsdWdpbiBhcyB0aGUgb2xkIG9uZSBjb3VsZG4ndCBiZQogICAgICAgIGNvbnZlcnRlZCB0byBBcGFjaGUuCiAgICAgICAgCiAgICAgICAgKiBVcGRhdGVkIEZpbm5pc2ggdHJhbnNsYXRpb24uCiAgICAgICAgCiAgICAgICAgKiBBZGRlZCBldGMvaW5pL2RlZmF1bHRfanNwd2lraS5wcm9wZXJ0aWVzIHRvIGhvbGQgYWxsIHNvcnRzIG9mIHN0dWZmIHRoYXQKICAgICAgICB5b3Ugbm9ybWFsbHkgd2FudCB0byBlbmFibGUgaW4ganNwd2lraS5wcm9wZXJ0aWVzLCBidXQgbW9zdCBwZW9wbGUgZG9uJ3QKICAgICAgICByZWFsbHkgd2FudCB0byB0b3VjaC4KICAgICAgICAKICAgICAgICAqIEpTUFdJS0ktNTc6IFNob3VsZCByZXNvbHZlIE5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbnMgd2hlbiBjb250YWluZXIKICAgICAgICBnb2VzIHVwIG9yIGRvd24uCiAgICAgICAgCiAgICAgICAgKiBKU1BXSUtJLTI5MjogQ29tbWVudC5qc3AgZGlkbid0IGNvbXBpbGUuICBPb3BzISAgVGhhbmtzIHRvIEhhcnJ5IE1ldHNrZQogICAgICAgIGZvciB0aGUgcGF0Y2guCiAgICAgICAgCjIwMDgtMDYtMTQgRGlyayBGcmVkZXJpY2t4IDxkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tPgoKICAgICAgICAqIDIuNy4wLXN2bi00MSAgTWFueSB0ZW1wbGF0ZSBmaXhlcywgYWRkZWQgYWpheGVkIGVkaXQgcHJldmlldywgaW1wcm92ZWQgSUU2L0lFNyBjb21wYXQuCiAgICAgICAgCiAgICAgICAgKiBGaXhlZCBbSlNQV0lLSS0yNzVdIEluY29taW5nIGFuZCBPdXRnb2luZyBsaW5rIGJveCBkb2Vzbid0IHdvcmsgcHJvcGVybHkgYW55bW9yZS4gCiAgICAgICAgCiAgICAgICAgKiBTZXZlcmFsIGZpeGVzIG9mIHNlY3Rpb24gZWRpdDogW0pTUFdJS0ktMjM1XSwgW0pTUFdJS0ktMjA5XQoKICAgICAgICAqIFtKU1BXSUtJLTI3OF0gaGlnaGxpZ2h0IHNlYXJjaCBxdWVyaWVzIHdhcyBoYW5kbGVkIGJhZGx5IHdoZW4gUFJFIHNlY3Rpb25zIAogICAgICAgIGNvbnRhaW5lZCBIVE1MIGVsZW1lbnRzLgoKICAgICAgICAqIFtKU1BXSUtJLTI4MF0gSUU3IGhhZCB0aGUgc2FtZSBzY3JvbGwgYmFyIHByb2JsZW0gYXMgcHJldmlvdXNseSB3aXRoIElFNi4gIAogICAgICAgIEFkZGVkIElFNyBzcGVjaWZpYyBDU1Mgc2VsZWN0b3IgdG8gc3VwcG9ydCBJRTcuIAoKICAgICAgICAqIEZpeGVkIFtKU1BXSUtJLTI1OV0gSUUgcmVuZGVyaW5nIGJ1ZyBmb3IgbmVzdGVkIGNvbGxhcHNhYmxlIGJveGVzIGluIElFNwogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktMjY5XSBJbXByb3ZlZCBoYW5kbGluZyBvZiBjb2xsYXBzaWJsZSBsaXN0cywgZXZlbiB3aGVuIGEgdGVtcGxhdGUgCiAgICAgICAgd291bGQgbm90IHVzZSBUYWJiZWRTZWN0aW9ucy4gVGhlIGhhbmRsaW5nIG9mIGR5bmFtaWMgc3R5bGVzIHdhcyByZWZhY3RvcmVkIAogICAgICAgIHRvIG1ha2UgdGhlbSBsZXNzIGludHJ1c2l2ZS4KCiAgICAgICAgKiBGaXhlZCBbSlNQV0lLaS0yODVdICBHcm91cHMuanNwIGhhcyB1bnRlcm1pbmF0ZWQgc3RyaW5nIGNvbnN0YW50LgogICAgICAgIERlbGV0ZSByZXNvdXJjZSAobm90IHVzZWQgYW55bW9yZSk6CiAgICAgICAgI2dyb3VwLmFyZXlvdXN1cmU9Li4uLgoKCiAgICAgICAgKiBBbiBBSkFYIGRyaXZlbiBzbmVhay1wcmV2aWV3IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBwbGFpbiBlZGl0b3IuIChieSBkZWZhdWx0IG9mZikKICAgICAgICBUaGUgdXNlciBjYW4gaGF2ZSBpbW1lZGlhdGUgZmVlZGJhY2sgb2YgaG93IHRoZSB3aWtpLW1hcmt1cCBpcyByZW5kZXJlZCBieSBtZWFucyBvZiAKICAgICAgICBhIHByZXZpZXcgYm94IGp1c3QgYmVsb3cgdGhlIGVkaXRvciB0ZXh0YXJlYS4gVGhlIHByZXZpZXcgc2VjdGlvbiBpcyByZWZyZXNoZWQgd2hlbmV2ZXIgCiAgICAgICAgdGhlIHVzZXIgY2xpY2tzIG91dHNpZGUgdGhlIHRleHRhcmVhLgogICAgICAgIAogICAgICAgICogVGhlIGhhbmRsaW5nIG9mIHRoZSBwbGFpbiBlZGl0b3Igc3VnZ2VzdGlvbiBwb3B1cCBpcyBub3cgYWxzbyB3b3JraW5nIG9uIElFLiAKICAgICAgICBQdXQgdGhlIG1vdXNlIGluc2lkZSBhIFt3aWtpLWxpbmtdIHRvIHNlZSB0aGUgYXV0b21hdGljIGV4cGFuc2lvbjsgCiAgICAgICAgc2VsZWN0IGEgaXRlbSBvZiB0aGUgc3VnZ2VzdGlvbiBsaXN0IGFuZCBjbGljayB0byBpbnNlcnQgdGhlIGxpbmsgaW4gdGhlIGVkaXRvciB0ZXh0YXJlYS4KICAgICAgICBUaGlzIGFsc28gd29ya3MgZm9yIGF0dGFjaGVtZW50IGxpbmtzLiBTZWUgW0pTUFdJS0ktMjg5XSAKCiAgICAgICAgVXBkYXRlIGkxOG4gcmVzb3VyY2VzOgogICAgICAgICNlZGl0b3IucGxhaW4uZWRpdGFzc2lzdD1FZGl0IEFzc2lzdAogICAgICAgICNlZGl0b3IucGxhaW4uZWRpdGFzc2lzdC50aXRsZT1Ub2dnbGUgRWRpdCBBc3Npc3QgYnV0dG9ucwogICAgICAgIGVkaXRvci5wbGFpbi5zbmVha3ByZXZpZXc9U25lYWsgUHJldmlldwoKICAgICAgICAqIFRoZSByZW5kZXJpbmcgb2YgcG9wdXAgYm94ZXMgZm9yIGUuZy4gbGluay1zdWdnZXN0aW9uLWJveCwgJSV0aXBzLCAlJWNhdGVnb3J5LiBoYXMgYmVlbiBpbXByb3ZlZC4KCiAgICAgICAgKiBGcmVxdWVudGx5IHVzZWQgaWNvbnMgbWVyZ2VkIGluIHNpbmdsZSAnc3RyaXAnIGdpZnMgdG8gaW1wcm92ZSBkb3dubG9hZCBzcGVlZC4KCiAgICAgICAgKiBSZWZhY3RvcmVkICdqc3B3aWtpLWNvbW1vbi5qcycsIHdoaWNoIG5vdyBvbmx5IGNvbnRhaW5zIHRoZSBjb3JlIGphdmFzY3JpcHQuICg4SyBjb21wcmVzc2VkKQogICAgICAgIFRoZSBhZGRpdGlvbmFsIGR5bmFtaWMgc3R5bGVzIGhhdmUgYmVlbiBtb3ZlZCB0byAnanNwd2lraS1jb21tb25zdHlsZXMuanMnLiAoMTJLIGNvbXByZXNzZWQpIAoKICAgICAgICAqIENsZWFuIHVwIG9mIE9yZGVyTGlzdCBhbmQgU21hcnQgc2tpbi4gICAKICAgICAgICAKICAgICAgICAqIEFkZGVkIGEgZmV3IGRlZmF1bHQubmwucHJvcGVydGllcyB1cGRhdGVzIChlZyBbSlNQV0lLSS0yMDZdKQoKCjIwMDgtMDYtMTMgIEFuZHJldyBKYXF1aXRoIDxhamFxdWl0aCBBVCBhcGFjaGUgRE9UIG9yZz4KCiAgICAgICAgKiAyLjcuMC1zdm4tNDAKICAgICAgICAKICAgICAgICAqIFJlbW92ZWQgVGVzdEh0dHBTZXJ2bGV0UmVxdWVzdCwgVGVzdEh0dHBTZXJ2bGV0UmVzcG9uc2UsCiAgICAgICAgVGVzdEh0dHBTZXNzaW9uLCBUZXN0RmlsdGVyQ2hhaW4sIFRlc3RGaWx0ZXJDb25maWcsCiAgICAgICAgVGVzdFNlcnZsZXRDb250ZXh0IGluIGZhdm9yIG9mIHRoZSBtdWNoLXN1cGVyaW9yIFN0cmlwZXMKICAgICAgICBtb2NrIG9iamVjdHMuIFRlc3RFbmdpbmUgd2FzIHJldHJvZml0dGVkIHdpdGggdGhlIFN0cmlwZXMKICAgICAgICBtb2NrcyBhbmQgYWxsIHVuaXQgdGVzdHMgd2VyZSBhbHNvIGNoYW5nZWQuIEluIHBhcnRpY3VsYXIsCiAgICAgICAgdGFrZSBub3RlIG9mIHRoZSBUZXN0RW5naW5lLm5ld0h0dHBSZXF1ZXN0KCkgZmFjdG9yeSBtZXRob2QsCiAgICAgICAgd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIHRlc3QgcmVxdWVzdCBvYmplY3RzLgogICAgICAgIAogICAgICAgICogVHJpbW1lZCBzb21lIHVubmNlc3Nhcnkgd2ViIHVuaXQgdGVzdCBjbGFzc2VzIHRoYXQgd2VyZQogICAgICAgIGxlZnQgYmVoaW5kIGFzIGNydXRjaGVzIGluIGNhc2UgU2VsZW5pdW0gZGlkbid0IHdvcmsgb3V0LiAKICAgICAgICAKICAgICAgICAqIFVwZ3JhZGVkIFNlbGVuaXVtLVJDIGphcnMgdG8gMS4wLWJldGExLiBTZWxlbml1bSBzdGlsbAogICAgICAgIGRvZXMgbm90IHdvcmsgd2l0aCBGaXJlRm94IDMsIHVuZm9ydHVuYXRlbHkuIDooCiAgICAgICAgCjIwMDgtMDYtMTIgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuNy4wLXN2bi0zOQogICAgICAgIAogICAgICAgICogSlNQV0lLSS0xOTE6IEZhdm9yaXRlcy5qc3Agbm8gbG9uZ2VyIGxlYWtzIExlZnRNZW51IGNvbnRlbnRzCiAgICAgICAgdG8gdW5hdXRob3JpemVkIHZpZXdlcnMgaW4gVXNlclByZWZlcmVuY2VzLmpzcC4gIFRoYW5rcyB0bwogICAgICAgIFNlcmdpbyBHZWxhdG8uCiAgICAgICAgCiAgICAgICAgKiBKU1BXSUtJLTI1MzogVm90ZVBsdWdpbiBhbmQgVm90ZS5qc3AgYXJlIG5vdyBnb25lLCBhcyB0aGV5CiAgICAgICAgd2VyZSBwcmV0dHkgbXVjaCB1c2VsZXNzLgogICAgICAgIAogICAgICAgICogSlNQV0lLSS0yMDY6IEEgbm8tcmVzdWx0cyBzZWFyY2ggY291bGQgYWxzbyBmYWlsIGR1ZSB0byAKICAgICAgICBtaXNzaW5nIHBlcm1pc3Npb25zLiAgVXBkYXRlZCBkZWZhdWx0LnByb3BlcnRpZXMgLyBmaW5kLm5vcmVzdWx0CiAgICAgICAgaTE4biBrZXkgdG8gZXhwbGFpbiBiZXR0ZXIuICBGaW5uaXNoIGFuZCBFbmdsaXNoIHVwZGF0ZWQuCiAgICAgICAgCjIwMDgtMDYtMTEgIEFuZHJldyBKYXF1aXRoIDxhamFxdWl0aCBBVCBhcGFjaGUgRE9UIG9yZz4KCiAgICAgICAgKiAyLjcuMC1zdm4tMzgKICAgICAgICAKICAgICAgICAqIFdlYiB1bml0IHRlc3RzIHJlZmFjdG9yZWQgKHlldCBhZ2FpbikgdG8gdXNlIGFuIGVtYmVkZGVkCiAgICAgICAgSmV0dHkgc2VydmVyLiBUaGlzIHJlcGxhY2VzIHRoZSBuZWVkIHRvIHVzZSBhIHNlcGFyYXRlIFRvbWNhdAogICAgICAgIHNlcnZlciwgYW5kICpzaG91bGQqIGFsd2F5cyB3b3JrIHdpdGhvdXQgYW55IGNvbmZpZ3VyYXRpb24gb2YKICAgICAgICBhbnkga2luZC4gUGxlYXNlIHRlc3RzIHRoaXMgdmlhIHRoZSBBbnQgJ3dlYnRlc3RzJyB0YXJnZXQhCiAgICAgICAgTm90ZSB0aGF0IHRoaXMgY2hlY2tpbiBpbnRyb2R1Y2VzIHRoZSBUZXN0Q29udGFpbmVyIGNsYXNzLCB3aGljaAogICAgICAgIHdpdGggYSBsaXR0bGUgbW9kaWZpY2F0aW9uIChsYXRlciwgcGxlYXNlISkgY291bGQgZWFzaWx5IGJlCiAgICAgICAgdXNlZCBhcyBhIHN0YW5kLWFsb25lIHNlcnZlci4gUmVmYWN0b3JpbmdzIGFyZSB3ZWxjb21lOyBpbgogICAgICAgIHRoZSBtZWFudGltZSwgVGVzdENvbnRhaW5lciBzaG91bGQgYmUgY29uc2lkZXJlZCB2b2xhdGlsZS4KICAgICAgICBOb3RlIGFsc28gdGhhdCB0aGUgUmVuYW1lIFByb2ZpbGUgd2ViIHVuaXQgdGVzdHMgZm9yIHRoZQogICAgICAgIGNvbnRhaW5lciBzY2VuYXJpb3MgY3VycmVudGx5IGZhaWxzOyBhbGwgb3RoZXJzIHJ1biBzdWNjZXNzZnVsbHkuCiAgICAgICAgCiAgICAgICAgKiBNaW5vciB0aWdodGVuaW5nIG9mIE1hcCBBUEkgZm9yIFNlcmlhbGl6ZXIgbWV0aG9kczsgdGhlCiAgICAgICAga2V5cyBhcmUgbm93IFN0cmluZ3MgcmF0aGVyIHRoYW4gU2VyaWFsaXphYmxlLiBUaGlzIGlzIGEKICAgICAgICBkZXYgYnJhbmNoLCByZW1lbWJlciEKICAgICAgICAKICAgICAgICAqIEFkZGVkIFN0cmlwZXMgamFyIGluIHByZXBhcmF0aW9uIGZvciByZXBsYWNlbWVudCBvZgogICAgICAgIFRlc3RSZXF1ZXN0L1Jlc3BvbnNlIG1vY2sgb2JqZWN0cy4KCjIwMDgtMDYtMDkgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuNy4wLXN2bi0zNwogICAgICAgIAogICAgICAgICogSlNQV0lLSS0yOTA6IFJlZmVyZW5jZU1hbmFnZXIgd2FzIG5vdCB1cGRhdGluZyB0aGUgcGFnZQogICAgICAgIHJlZmVyZW5jZXMgY29ycmVjdGx5IGFmdGVyIGEgcmVuYW1lLiAgRml4IGJ5IEhhcnJ5IE1ldHNrZS4KICAgICAgICAKICAgICAgICAqIEZpeGVkIGFsc28gYSBudW1iZXIgb2YgbWlzY2FsbGFuZW91cyBGaW5kQnVncyBpc3N1ZXMuCgoyMDA4LTA2LTA5ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjcuMC1zdm4tMzYKICAgICAgICAKICAgICAgICAqIEpTUFdJS0ktMTQ6IGNoZWNrUGVybWlzc2lvbnMgY29kZSBpbiBNZXRhV2VibG9nSGFuZGxlciBpcyBub3cKICAgICAgICBmdW5jdGlvbmFsLgogICAgICAgIAogICAgICAgICogSlNQV0lLSS0yMjg6IEFkZGVkIHBhdGNoIGZyb20gQWxleGFuZGVyIENob3cgdG8gZml4IGEgcHJvYmxlbQogICAgICAgIHdoZXJlIG11bHRpcGxlIGhlYWRpbmdzIHdpdGggdGhlIHNhbWUgdGV4dCB3ZXJlIHByb2R1Y2luZyBpbGxlZ2FsCiAgICAgICAgWE1MIHRocm91Z2ggZHVwbGljYXRlZCBJRCBhdHRyaWJ1dGVzLgogICAgICAgIAogICAgICAgICogSlNQV0lLSS0yNzQ6IFdhcyBmaXhlZCBhbHJlYWR5IGluIHN2bi0zMS4KICAgICAgICAKICAgICAgICAqIEpTUFdJS0ktMjg2OiBGaXhlZCBhIGNvdXBsZSBvZiB0eXBvcyBpbiBGaW5uaXNoIGxvY2FsaXphdGlvbi4KICAgICAgICAKICAgICAgICAqIEpTUFdJS0ktMjg1OiBHcm91cC5qc3AgaGFkIGEgd3JvbmcgcXVvdGUgY2hhciBpbiBFbmdsaXNoLAogICAgICAgIER1dGNoIGFuZCBHZXJtYW4gdHJhbnNsYXRpb25zLgoKMjAwOC0wNi0wOCAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGFwYWNoZS5vcmc+CgogICAgICAgICogMi43LjAtc3ZuLTM1CiAgICAgICAgCiAgICAgICAgKiBKU1BXSUtJLTI4MzogT29vcHMuICBDb3B5ICE9IEN1dC4KICAgICAgICAKMjAwOC0wNi0wNyAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGFwYWNoZS5vcmc+CgogICAgICAgICogMi43LjAtc3ZuLTM0CiAgICAgICAgCiAgICAgICAgKiBKU1BXSUtJLTI2NTogQWxsIHJlZmVycmVyIGNoYW5nZXMgKGFjY29yZGluZyB0byB1bml0IHRlc3RzIGFueXdheSkKICAgICAgICB3b3JrIG5vdy4KICAgICAgICAKICAgICAgICAqIEpTUFdJS0ktMzAgc2hvdWxkIG5vdyBhbHNvIGJlIHJlc29sdmVkLgogICAgICAgIAogICAgICAgICogSlNQV0lLSS0yNzogSSBoYXZlIGEgc3VzcGljaW9uIHRoYXQgaW1wbGVtZW50aW5nIFdpa2lQYWdlLmVxdWFscygpCiAgICAgICAgaGFzIGNhdXNlZCBzb21lIGludGVyZXN0aW5nIGlzc3VlcyB3aXRoIGF0dHJpYnV0ZXMgYmVpbmcgbGVha2VkIGZyb20KICAgICAgICBvbGQgdmVyc2lvbnMuICBSZW1vdmVkIGVxdWFscygpIGZvciBub3cuCiAgICAgICAgCiAgICAgICAgKiBTb21lIEpTUFdpa2lNYXJrdXBQYXJzZXIgc3BlZWQgb3B0aW1pemF0aW9ucyBieSBjaGFuZ2luZyBhbGwKICAgICAgICBTdHJpbmdCdWZmZXJzIHRvIFN0cmluZ0J1aWxkZXJzLgoKMjAwOC0wNi0wNyBEaXJrIEZyZWRlcmlja3ggPGRpcmsuZnJlZGVyaWNreEBnbWFpbC5jb20+CgogICAgICAgICogMi43LjAtc3ZuLTMzCiAgICAgICAgCiAgICAgICAgKiBBZGRlZCBmYXZpY29uLmljbywgYW5kIHVwZGF0ZWQgdGhlIGpzcHdpa2kucHJvcGVydGllcyB0byBzdXBwb3J0ICouaWNvCgoyMDA4LTA2LTAxICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjcuMC1zdm4tMzIKCiAgICAgICAgKiBQYXNzd29yZCBoYXNoZXMgd2VyZSBnZW5lcmF0ZWQgaW4gcGxhdGZvcm0gbmF0aXZlIGVuY29kaW5nCiAgICAgICAgaW5zdGVhZCBvZiBVVEYtOC4gIE9vcHMuCiAgICAgICAgCiAgICAgICAgKiBJbiBnZW5lcmFsLCB0aGVyZSBoYXZlIGJlZW4gbWFzc2l2ZSB1cGdyYWRlcyBvZiBKYXZhZG9jcy4KCjIwMDgtMDUtMzEgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuNy4wLXN2bi0zMQogICAgICAgIAogICAgICAgICogT29wcywgd3JvbmcgcmVnZXhwOiBBdHRhY2htZW50U2VydmxldCBub3cgKnJlYWxseSogY2xlYW5zIHVwCiAgICAgICAgdGhlIGZpbGVuYW1lLgogICAgICAgIAogICAgICAgICogQWRkZWQgc29tZSBzYW5pdHkgY2hlY2tzIHRvIGhvcGVmdWxseSBhZGRyZXNzIGFuIGlzc3VlIHRoYXQKICAgICAgICBKaW0gV2lsbGVrZSB3YXMgaGF2aW5nIHdpdGggdGhlIHBhcnNlciBjcmFzaGluZyBhdCBvZGQgcGxhY2VzLiAKCjIwMDgtMDUtMjkgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuNy4wLXN2bi0zMAogICAgICAgIAogICAgICAgICogQXR0YWNobWVudFNlcnZsZXQgbm93IGNsZWFucyB0aGUgdXBsb2FkZWQgZmlsZSBuYW1lLCBzaW5jZSBzb21lCiAgICAgICAgYnJvd3NlcnMgc2VuZCB0aGUgZnVsbCBwYXRoIGFzIHdlbGwuCiAgICAgICAgCjIwMDgtMDUtMjIgIEFuZHJldyBKYXF1aXRoIDxhamFxdWl0aCBBVCBhcGFjaGUgRE9UIG9yZz4KCiAgICAgICAgKiAyLjcuMC1zdm4tMjkKICAgICAgICAKICAgICAgICAqIENoZWNrZWQgaW4gdGhyZWUgbmV3IGZlYXR1cmVzIGZvciBVc2VyUHJvZmlsZSBhbmQgdGhlIFVzZXJEYXRhYmFzZQogICAgICAgIGNsYXNzZXMuIEZpcnN0LCBwcm9maWxlcyBjYW4gbm93IHN0b3JlIGFyYml0cmFyeSBTZXJpYWxpemFibGUgb2JqZWN0cwogICAgICAgIHZpYSBhIG5ldyBtZXRob2QgaW4gVXNlclByb2ZpbGUsIGdldEF0dHJpYnV0ZXMsIHRoYXQgcmV0dXJucyBhCiAgICAgICAgTWFwPFNlcmlhbGl6YWJsZSxTZXJpYWxpemFibGU+IHRoYXQgY2FuIGJlIGRpcmVjdGx5IG1hbmlwdWxhdGVkLgogICAgICAgIEFyYml0cmFyeSBhdHRyaWJ1dGVzIHN1Y2ggYXMgdXNlciBwcmVmZXJlbmNlcyBjYW4gYmUgYWRkZWQgdG8gdGhlCiAgICAgICAgcHJvZmlsZSBhbmQgYmUgZ3VhcmFudGVlZCB0byBiZSBwZXJzaXN0ZWQgb24gc2F2ZS4gU2Vjb25kLCB0aGUKICAgICAgICBVc2VyUHJvZmlsZSBub3cgaGFzIHR3byBtZXRob2RzIHNldExvY2tFeHBpcnkoRGF0ZSkvZ2V0TG9ja0V4cGlyeQogICAgICAgIHRoYXQgYWxsb3cgY2FsbGVycyB0byBkaXNhYmxlIHVzZXIgcHJvZmlsZXMuIFRoZXNlIGFyZSBOT1QgZW5mb3JjZWQKICAgICAgICBpbiBBdXRoZW50aWNhdGlvbk1hbmFnZXIgeWV0LiBUaGlyZCwgdXNlciBwcm9maWxlIG5vdyBoYXZlIGEgJ3VpZCcKICAgICAgICBmaWVsZCB0aGF0IHN0b3JlcyBhIGxvbmcgdmFsdWUgZm9yIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIHVzZXJzLgogICAgICAgIEV4aXN0aW5nIHByb2ZpbGVzIHdpdGhvdXQgVUlEcyBhcmUgYXV0b21hdGljYWxseSB1cGdyYWRlZCB3aGVuCiAgICAgICAgdGhleSBhcmUgbG9hZGVkIGJ5IGEgZmluZEJ5X19fKCkgbWV0aG9kLiBUaGUgZGVmYXVsdCBYTUwvSkRCQwogICAgICAgIFVzZXJEYXRhYmFzZSBpbXBsZW1lbnRhdGlvbnMgaGF2ZSBiZWVuIGVuaGFuY2VkIHRvIHN1cHBvcnQgYWxsCiAgICAgICAgb2YgdGhlc2UgbmV3IGZlYXR1cmVzLiBJZiB5b3UgaGF2ZSBjdXN0b20gVXNlckRhdGFiYXNlCiAgICAgICAgaW1wbGVtZW50YXRpb25zLCB5b3Ugc2hvdWxkIHRha2UgYSBsb29rIGF0IHRoZSBuZXcgY29kZS4KICAgICAgICAKICAgICAgICAqIE1pc2NlbGxhbmVvdXMgYW5kIHZhcmllZCBKYXZhIDUgZW5oYW5jZW1lbnRzIChzdWNoIGFzIGZvci1sb29wcykuCgoyMDA4LTA1LTIyIEp1YW4gUGFibG8gU2FudG9zIDxqdWFucGFibG8uc2FudG9zQGdtYWlsLmNvbT4KCiAgICAgICAgKiAyLjcuMC1zdm4tMjgKICAgICAgICAKICAgICAgICAqIFtKU1BXSUtJLTI1XS4gIENyZWF0aW5nIGVtcHR5IHBhZ2VzIHNob3VsZCBub3QgYmUgcG9zc2libGUgKGRlZmF1bHQKICAgICAgICBiZWhhdmlvdXIpLiBDYW4gYmUgY2hhbmdlZCBieSBzZXR0aW5nIGpzcHdpa2kuYWxsb3dDcmVhdGlvbk9mRW1wdHlQYWdlcwogICAgICAgIHRvIHRydWUgaW4ganNwd2lraS5wcm9wZXJ0aWVzLgogICAgICAgIAogICAgICAgICogPGkxOG4tY3JlYXRlLXRlbXBsYXRlPiB0YXJnZXQgaW4gYnVpbGQueG1sIHdhcyBjcmVhdGluZyBhIHdyb25nIGkxOG4gCiAgICAgICAgZGlyZWN0b3J5IHN0cnVjdHVyZS4KCjIwMDgtMDUtMTEgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuNy4wLXN2bi0yNwogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktNDRdLiAgQXV0aGVudGljYXRpb25NYW5hZ2VyIG5vdyByZW1lbWJlcnMgdGhlIGxhc3QgbG9naW5zCiAgICAgICAgYW5kIHNsb3dzIGRvd24gcmVwZWF0ZWQgYWNjZXNzIGF0dGVtcHRzLCB0byBhIG1heGltdW0gb2YgMjAgc2Vjb25kcy4KCjIwMDgtMDUtMTEgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuNy4wLXN2bi0yNgoKICAgICAgICAqIFtKU1BXSUtJLTIzNl06IEZpeGVkIGxvY2FsaXphdGlvbiBmb3IgdGhlIGRpZmZlcmVudCBsb2dpbi9lZGl0CiAgICAgICAgaGVscCBwYWdlcyBtaXNzaW5nLiAgICAKICAgICAgICAKICAgICAgICAqIFtKU1BXSUtJLTE3MF06IEZpeGVkIGEgZmV3IHBsYWNlcyB3aGVyZSB0aGUgYXV0aG9yIHdhcyBhcHBlYXJpbmcKICAgICAgICBhcyAidW5rbm93biIuCiAgICAgICAgCiAgICAgICAgQWRkZWQgbmV3IGkxOG4ga2V5IGluIENvcmVSZXNvdXJjZXMsIHVwZGF0ZWQgRW5nbGlzaCBhbmQgRmlubmlzaDoKICAgICAgICAKICAgICAgICAgICAqIGNvbW1vbi51bmtub3duYXV0aG9yCiAgICAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0xNTFdOiBJZiBzZW5kaW5nIGEgcGFzc3dvcmQgc3VjY2VlZHMsIGl0IGlzIG5vIGxvbmdlciByZXBvcnRlZAogICAgICAgIGFzIGFuIGVycm9yLgogICAgICAgIAoyMDA4LTA1LTE4ICBEaXJrIEZyZWRlcmlja3ggPGRpcmsuZnJlZGVyaWNreEBnbWFpbC5jb20+CgogICAgICAgICogMi43LjAtc3ZuLTI1CiAgICAgICAgCiAgICAgICAgKiBUZW1wb3JhcnkgcmVtb3ZlIGhpZGVhYmxlIGZhdm9yaXRlcyBtZW51IGFzIGl0IGlzIGluY29tcGF0aWJsZSB3aXRoIEZDSy4KICAgICAgICBGaW5hbCBmaXggdG8gY29tbWl0IGxhdGVyLiAgVGhlIEZDSy1FZGl0b3IgaXMgbm93IGFnYWluIGZ1bGx5IHdvcmtpbmcuCiAgICAgICAgKFJlcG9ydGVkIGJ5IEZsb3JpYW4gSG9sZWN6ZWspICBKU1BXSUtJLTIwOQogICAgICAgIAogICAgICAgICogRml4aW5nIHZhcmlvdXMgSUU3IGluY29tcGF0aWJpbGl0aWVzIChqc3B3aWtpLmNzcykKICAgICAgICBSZXBvcnRlZCBieSBHYXZpbiBHb2xkc21pdGguIAogICAgICAgIAoKMjAwOC0wNS0xNCAgQW5kcmV3IEphcXVpdGggPGFqYXF1aXRoIEFUIGFwYWNoZSBET1Qgb3JnPgoKICAgICAgICAqIDIuNy4wLXN2bi0yNAoKICAgICAgICAqIFtKU1BXSUtJLTIwXSBQYXNzd29yZHMgYXJlIG5vdyBzYWx0ZWQgYW5kIGhhc2hlZCBwZXIgUkZDIDIzMDcuCiAgICAgICAgRXZlcnkgcGFzc3dvcmQgaXMgc2FsdGVkIHdpdGggYSA4LWJ5dGUgcmFuZG9tIHNhbHQuCgogICAgICAgICogVGhlIHNvcnQtb2Ytc2VjcmV0ICJzaGFyZSBjb250YWluZXIgdXNlciBhY2NvdW50cyB3aXRoCiAgICAgICAgSkRCQ1VzZXJEYXRhYmFzZSIgb3B0aW9uIGhhcyBiZWVuIHBlcm1hbmVudGx5IHJlbW92ZWQsIGFuZAogICAgICAgIHdpbGwgbm90IGJlIHJlcGxhY2VkLiBUaGlzIHdhcyBwcmV2aW91c2x5IGFkZGVkIHRvIG1ha2UgaXQgZWFzaWVyCiAgICAgICAgZm9yIHVzZXJzIHRvIGFkZCB0aGVtc2VsdmVzIHRvIEpEQkMtYmFzZWQgY29udGFpbmVyIHJlYWxtcy4KICAgICAgICBIb3dldmVyLCB0aGUgc3dpdGNoIHRvIHNhbHRlZCBwYXNzd29yZHMgcHJlY2x1ZGVzIHRoZSBjb250aW51ZWQKICAgICAgICB1c2Ugb2YgdGhpcyBvcHRpb24uIFNvIGl0J3MgZ29uZSBhbmQgd29uJ3QgY29tZSBiYWNrLgoKICAgICAgICAqIEFkZGVkIGEgbmV3IGNsYXNzIENyeXB0b1V0aWwgdGhhdCBhbGxvd3MgYWRtaW5zIHRvIGdlbmVyYXRlCiAgICAgICAgU1NIQSBwYXNzd29yZCBoYXNoZXMgKGFuZCB2ZXJpZnkgYW4gZXhpc3RpbmcgcGFzc3dvcmQgZ2l2ZW4KICAgICAgICBhIHN1cHBsaWVkIGhhc2gpIGF0IHRoZSBjb21tYW5kIGxpbmUuIFNlZSB0aGUgSmF2YWRvYwogICAgICAgIGZvciBjb20uZWN5cmQuanNwd2lraS51dGlsLkNyeXB0b1V0aWwgZm9yIGRldGFpbHMuCgoyMDA4LTA1LTExICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjcuMC1zdm4tMjMKICAgICAgICAKICAgICAgICAqIFtKU1BXSUtJLTI2NV0gUmVmZXJyZXJzIGFyZSBub3cgY2hhbmdlZCwgdGhvdWdoIHRoZQogICAgICAgIGZ1bmN0aW9uYWxpdHkgaXMgc3RpbGwgYSBiaXQgYnJva2VuIGluIHBsYWNlcy4KICAgICAgICAKMjAwOC0wNS0xMSAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGFwYWNoZS5vcmc+CgogICAgICAgICogMi43LjAtc3ZuLTIyCiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0yNjBdIFJlZmVycmluZ1BhZ2VzUGx1Z2luIG5vdyBjcmVhdGVzIHRoZSAibW9yZSIKICAgICAgICBsaW5rIFVSTCBwcm9wZXJseS4gIFRoaXMgYWxzbyBpbXBhY3RzIHRoZSBsb2NhbGl6YXRpb24gb2YKICAgICAgICB0aGUgInJlZmVycmluZ3BhZ2VzcGx1Z2luLm1vcmUiIGluIFBsdWdpblJlc291cmNlcy4KICAgICAgICAKICAgICAgICAqIE1vdmVkIHBsdWdpbiByZXNvdXJjZXMgZnJvbSBldGMvaTE4bi9jb20vZWN5cmQvanNwd2lraS9wbHVnaW4gCiAgICAgICAgdG8gZXRjL2kxOG4vcGx1Z2luLiAgQ2FuJ3QgcmVtZW1iZXIgd2hvIHN1Z2dlc3RlZCB0aGlzLiAgQWxzbwogICAgICAgIGNsZWFuZWQgYnVpbGQueG1sIHRvIG1ha2Ugc3VyZSB0aGUgcGx1Z2luIGZpbGVzIGFyZSBjcmVhdGVkCiAgICAgICAgcHJvcGVybHkuICBDYW4ndCByZW1lbWJlciB3aG8gc3VnZ2VzdGVkIHRoaXMsIG5laXRoZXIgY2FuCiAgICAgICAgSSBzZWVtIHRvIGZpbmQgdGhlIEpJUkEgaXNzdWUuLi4KICAgICAgICAKICAgICAgICAqIFtKU1BXSUtJLTIyNF0gVHJhbnNsYXRvclJlYWRlciBub3cgaXMganVzdCBhIHByb3h5IHRvIHRoZQogICAgICAgIEpTUFdpa2lNYXJrdXBQYXJzZXIuICBJdCB3aWxsIGJlIGZpbmFsbHkgZ29uZSBpbiAzLjAuCiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0xODNdIFBhZ2VSZW5hbWVyIG5vIGxvbmdlciBjaG9rZXMgaWYgYXR0YWNobWVudHMKICAgICAgICBhcmUgdHVybmVkIG9mZi4gIFJlcG9ydGVkIGJ5IEx1Y2EgR2lsYXJkb25pLgogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktMjM0XSBBZGRlZCBJU084NjAxIHRpbWUgZm9ybWF0cyB0byBkZWZhdWx0IHBhdHRlcm5zLgogICAgICAgIAoyMDA4LTA1LTEwICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjcuMC1zdm4tMjEKICAgICAgICAKICAgICAgICAqIExvZ2luY29va2llcyBhcmUgbm93IHdyaXR0ZW4gd2l0aCBVVEYtOCBpbnN0ZWFkIG9mIHBsYXRmb3JtCiAgICAgICAgZGVmYXVsdCBlbmNvZGluZy4gIFRoaXMgc2hvdWxkIGZpeCBpc3N1ZXMgd2l0aCB1c2VycyB3aXRoIG5vbi1BU0NJSQogICAgICAgIGNoYXJzIHNvbWV0aW1lcyBoYXZpbmcgdGhlIHdyb25nIFVJRCB3aGVuIHRoZWlyIHNlc3Npb24gZXhwaXJlcy4KCjIwMDgtMDUtMDkgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuNy4wLXN2bi0yMAogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktMjUxXTogUmVtb3ZlZCB0aGUgb2xkIGNvbS5lY3lyZC5qc3B3aWtpLlBhZ2VSZW5hbWVyCiAgICAgICAgYW5kIHJlcGxhY2VkIGl0IHdpdGggY29tLmVjeXJkLmpzcHdpa2kuY29udGVudC5QYWdlUmVuYW1lciwgd2hpY2gKICAgICAgICBpcyBmdWxseSBBcGFjaGUtbGljZW5zZWQuCiAgICAgICAgCiAgICAgICAgVW5mb3J0dW5hdGVseSwgdGhlIG5ldyBQYWdlUmVuYW1lciBkb2VzIG5vdCBzdXBwb3J0IGNoYW5naW5nCiAgICAgICAgcmVmZXJyaW5nIHBhZ2VzIHlldCwgZXJyb3IgbWVzc2FnZXMgYXJlIG5vdCBsb2NhbGl6ZWQgcHJvcGVybHksCiAgICAgICAgZXRjLiAgU28gdGhpcyBpcyBhIGNvbnNpZGVyYWJsZSBmdW5jdGlvbmFsaXR5IGRvd25ncmFkZSB1bnRpbAogICAgICAgIHdlIGNhbiBnZXQgYSBiZXR0ZXIgdmVyc2lvbiBtYWRlLiAgUGF0Y2hlcyBnbGFkbHkgYWNjZXB0ZWQhCgoyMDA4LTA1LTA2ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjcuMC1zdm4tMTkKICAgICAgICAKICAgICAgICAqIFtKU1BXSUtJLTUwXSBJbXByb3ZlZCBwZXJmb3JtYW5jZSBvZiBSZWNlbnRDaGFuZ2VzUGx1Z2luIGJ5IAogICAgICAgIGFkZGluZyBiZXR0ZXIgY2FjaGluZyB0byB0aGUgQ2FjaGluZ0F0dGFjaG1lbnRQcm92aWRlci4gIFRoYW5rcwogICAgICAgIHRvIEhhcnJ5IE1ldHNrZSEKCjIwMDgtMDUtMDUgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuNy4wLXN2bi0xOAoKICAgICAgICAqIFtKU1BXSUtJLTIzOV0ganNwd2lraS5jb29raWVBdXRob3JpemF0aW9uLmV4cGlyeSBpcyBub3cgY2FsbGVkCiAgICAgICAganNwd2lraS5jb29raWVBdXRoZW50aWNhdGlvbi5leHBpcnksIGJlY2F1c2UgdGhhdCBpcyBjb3JyZWN0LiAgVGhhbmtzCiAgICAgICAgdG8gRmxvcmlhbiEKCiAgICAgICAgKiAyLjcuMC1zdm4tMTcKICAgICAgICAKICAgICAgICAqIFJlbW92ZWQgSlVHIFVVSUQgZ2VuZXJhdGlvbiBsaWJyYXJpZXMgdG8gZmF2b3VyIHRoZSBKYXZhCiAgICAgICAgYnVpbHQtaW4gb25lcy4KICAgICAgICAKMjAwOC0wNC0yMCAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGFwYWNoZS5vcmc+CgogICAgICAgICogMi43LjAtc3ZuLTE2CiAgICAgICAgCiAgICAgICAgKiBNb3ZlZCB0aGUgcmVzdCBvZiB0aGUgUGx1Z2luUmVzb3VyY2VzIGNsYXNzIGludG8gZXRjL2kxOG4sIGFzCiAgICAgICAgdGhlaXIgb2xkIHBsYWNlIHdhcyBjb25mdXNpbmcgcGVvcGxlLgogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktMjQzXSwgW0pTUFdJS0ktMjQ0XSwgW0pTUFdJS0ktMjQyXSwgW0pTUFdJS0ktMjQxXSBGaXhlZAogICAgICAgIGEgbnVtYmVyIG9mIGlzc3VlcyB3aXRoIHBsdWdpbnMgbm90IHVzaW5nIHRoZSBwcm9wZXIgZGF0ZS90aW1lIGZyb20KICAgICAgICB0aGUgbG9jYWxlL3ByZWZlcmVuY2VzLgogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktMjQ1XSBSZW1vdmVkIFBsdWdpblJlc291cmNlcyAvIGNvbW1vbi5kYXRlZm9ybWF0LCBhbmQKICAgICAgICBjcmVhdGVkIHRocmVlIG5ldyB0aW1lL2RhdGUgZm9ybWF0IHJlc291cmNlcyBpbiBDb3JlUmVzb3VyY2VzOgogICAgICAgICAgICogY29tbW9uLmRhdGVmb3JtYXQKICAgICAgICAgICAqIGNvbW1vbi50aW1lZm9ybWF0CiAgICAgICAgICAgKiBjb21tb24uZGF0ZXRpbWVmb3JtYXQKCiAgICAgICAgKiAyLjcuMC1zdm4tMTUKICAgICAgICAKICAgICAgICAqIFtKU1BXSUtJLTVdIEZpbGVTeXN0ZW1Qcm92aWRlciBub3cgcHJvcGVybHkgbWFuZ2xlcyBuYW1lcyBvZiBwYWdlcyB3aGljaAogICAgICAgIHN0YXJ0IHdpdGggYSBkb3QuICBUaGlzIGlzIGRvbmUgaW4gYSBmdWxseSBiYWNrd2FyZHMgY29tcGF0aWJsZSBtYW5uZXIsCiAgICAgICAgc28gbm8gY2hhbmdlcyB0byB0aGUgcmVwbyBpcyBuZWVkZWQuCiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0xMDBdIEFkZGVkIHR3byBuZXcgcGFyYW1ldGVycyB0byBSZWZlcnJpbmdQYWdlc1BsdWdpbiwKICAgICAgICBVbnVzZWRQYWdlc1BsdWdpbiwgUmVmZXJyZWRQYWdlc1BsdWdpbiwgYW5kIFVuZGVmaW5lZFBhZ2VzUGx1Z2luOgogICAgICAgIHNob3cgYW5kIHNob3dMYXN0TW9kaWZpZWQuICBUaGFua3MgdG8gSGFycnkgTWV0c2tlIGZvciB0aGUgcGF0Y2ghCgogICAgICAgICogMi43LjAtc3ZuLTE0CiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0xNjVdIFBhdGNoIGZyb20gVG9tYXN6IFN6eW1rbyB0byBoZWxwIGluIG5lc3RlZCBidWxsZXQgbGlzdHMuCiAgICAgICAgCiAgICAgICAgKiBBbHNvIHVwZGF0ZWQgc2V2ZXJhbCBmaWxlcyB0byB0aGUgQXBhY2hlIGxpY2Vuc2UuCgoyMDA4LTA0LTE1IEp1YW4gUGFibG8gU2FudG9zIDxqdWFucGFibG8uc2FudG9zQGdtYWlsLmNvbT4KCiAgICAgICAgKiAyLjcuMC1zdm4tMTMKICAgICAgICAKICAgICAgICAqIFtKU1BXSUtJLTE3OF0gUGF0Y2ggZnJvbSBKb3JnZSBGZXJyZXIgdG8ga2VlcCB0aGUgb3JkZXIgb2Ygc2VhcmNoIChXRUItSU5GCiAgICAgICAgdGhlbiBjbGFzc3BhdGggdGhlbiBmaWxlIHN5c3RlbSkgb2YgZmlsdGVycy54bWwuCiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0yMzFdIFVwZGF0ZWQgZXMgdHJhbnNsYXRpb24gYW5kIGFwcGxpZWQgcGF0Y2hlcyBmcm9tIEZsb3JpYW4gCiAgICAgICAgSG9sZWN6ZWsgKGRlIHRyYW5zbGF0aW9uKSBhbmQgSGFycnkgTWV0c2tlIChubCB0cmFuc2xhdGlvbikuCiAgICAgICAgCiAgICAgICAgKiBQcm9mYW5pdHlGaWx0ZXIgbWlub3IgaW1wcm92ZW1lbnQ6IHByb2Zhbml0aWVzIGFyZSByZWFkIGZyb20gYSBmaWxlIAogICAgICAgIGluc3RlYWQgb2YgYmVpbmcgaGFyZC1jb2RlZCBzdHJpbmdzLgoKMjAwOC0wNC0xMyAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGFwYWNoZS5vcmc+CgogICAgICAgICogMi43LjAtc3ZuLTEyCiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0xMF0gUGF0Y2ggZnJvbSBIYXJyeSBNZXRza2UgdG8gbWFrZSBzdXJlIAogICAgICAgIFZlcnNpb25pbmdGaWxlUHJvdmlkZXIgYW5kIEFic3RyYWN0RmlsZVByb3ZpZGVyIGNoZWNrIGZvcgogICAgICAgIHByb3BlciBwZXJtaXNzaW9ucy4KCjIwMDgtMDQtMTIgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuNy4wLXN2bi0xMQogICAgICAgIAogICAgICAgICogSW1wcm92ZWQgcmVzdGFydCB0aW1lIGF0IHRoZSBleHBlbnNlIG9mIG1vcmUgZGlzayBiZWluZwogICAgICAgIHVzZWQgYW5kIHRoZSBmaXJzdCBzdGFydHVwIHRha2luZyBhIGJpdCBsb25nZXIuCiAgICAgICAgCiAgICAgICAgKiBBY2wgaW1wbGVtZW50YXRpb24sIHBlcm1pc3Npb25zIGFuZCBvdXIgUHJpbmNpcGFscyBub3cKICAgICAgICBpbXBsZW1lbnQgU2VyaWFsaXphYmxlLiAgSXQgY291bGQgYmUgdXNlZCB0byBpbXByb3ZlIHN0YXJ0dXAKICAgICAgICB0aW1lIGV2ZW4gZnVydGhlciwgYnV0IGl0IHdpbGwgYmUgdXNlZnVsIGZvciB0aGUgZnV0dXJlLgogICAgICAgIAoyMDA4LTA0LTEwICBEaXJrIEZyZWRlcmlja3ggPGRpcmsuZnJlZGVyaWNreEBnbWFpbC5jb20+CgogICAgICAgICogMi43LjAtc3ZuLTEwIC0gSmF2YXNjcmlwdCBmaXhlcyBmb3IgSUUKICAgICAgICAKICAgICAgICAqIFtKU1BXSUtJLTIzNV0gQnVnZml4ZXMgZm9yIFNlY3Rpb24gZWRpdCBoYW5kbGluZyBpbiBJRQogICAgICAgIAogICAgICAgICogQnVnZml4ZXMgZm9yIGhpZGUvc2hvdyBGYXZvcml0ZXMgbWVudSBvbiBtb3VzZS1jbGljay9ob3Zlci4KICAgICAgICAKCjIwMDgtMDQtMDkgIERpcmsgRnJlZGVyaWNreCA8ZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbT4KCiAgICAgICAgKiAyLjcuMC1zdm4tOQogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktMjMzXSBCdWdmaXggUHJlZmVyZW5jZXNUYWIuanNwCgogICAgICAgICogW0pTUFdJS0ktMjMyXSBMb2NhbGl6YXRpb24gb2YgKEFsbCkgaW4gdGhlIEVkaXQgU2VjdGlvbiBkcm9wZG93bi4KICAgICAgICBBbHNvIGFkZGVkIGxvY2FsaXphdGlvbiB0byB0aGUgbGFuZ3VhZ2UgZHJvcGRvd24KCiAgICAgICAgKiBbSlNQV0lLSS0yMzRdIEFkZGVkIElTODYwMSBkYXRlL3RpbWUgcGF0dGVybiB0byBkZWZhdWx0IHByZWZzIGluIEpTUFdpa2kucHJvcGVydGllcwoKICAgICAgICAqIEJ1Z2ZpeCBJRSBqYXZhc2NyaXB0IGNyYXNoIG9uIG1vdXNlLW92ZXIgaGFuZGxlcgoKMjAwOC0wNC0wOSAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGFwYWNoZS5vcmc+CgogICAgICAgICogMi43LjAtc3ZuLTgKICAgICAgICAKICAgICAgICAqIFtKU1BXSUtJLTExNV06IFJlZmFjdG9yZWQgVmFyaWFibGVNYW5hZ2VyIHRvIHVzZSBSZWZsZWN0aW9uLgogICAgICAgIFRoYW5rcyB0byBTdGVwaGVuIFNvbGthLgogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktMjE5XTogQnVpbGRpbmcgbm93IHdvcmtzIGlmIHlvdXIgdXNlcm5hbWUgaGFzIGEgc3BhY2UuCiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0yMjJdOiBHb25lIGFyZSB0aGUgZXZpbCBmaWxlcyB3aGljaCBsdXJrZWQgaW50byBvdXIKICAgICAgICBkaXN0cm8gZmlsZS4uLiAgCiAgICAgICAgCiAgICAgICAgKiBIYWNraW5nIGF0dGVtcHRzIGF0IG1hbmlwdWxhdGluZyB0aGUgdmVyc2lvbiBwYXJhbWV0ZXIgbm8gbG9uZ2VyIAogICAgICAgIGNhdXNlIGEgc2xldyBvZiBlbWFpbCB0byB0aGUgYWRtaW4uLi4KCjIwMDgtMDQtMDggIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuNy4wLXN2bi03CiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS01Nl0gUmVwbGFjZWQgTXVsdGlQYXJ0TGlicmFyeSB3aXRoIEFwYWNoZSBDb21tb25zCiAgICAgICAgRmlsZVVwbG9hZCBsaWJyYXJ5LCBhcyBNdWx0aVBhcnRMaWJyYXJ5IHdhcyBMR1BMLgoKMjAwOC0wNC0wNSAgRGlyayBGcmVkZXJpY2t4IDxkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tPgoKICAgICAgICAqIDIuNy4wLXN2bi02CiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0yMzNdIEJ1Z2ZpeCBQcmVmZXJlbmNlc1RhYi5qc3AKICAgICAgICAKMjAwOC0wNC0wNSAgRGlyayBGcmVkZXJpY2t4IDxkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tPgoKICAgICAgICAqIDIuNy4wLXN2bi01CiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0yMzBdIE1ha2UgVGltZVpvbmUgY29uZmlndXJhdGlvbiBtb3JlIHVzZXItZnJpZW5kbHkuIEFkanVzdGVkIGFsbCBqc3AgdGltZS1mb3JtYXR0aW5nCiAgICAgICAgdG8gdGFrZSB0aW1lem9uZSBzZXR0aW5nIGludG8gYWNjb3VudC4gCiAgICAgICAgCjIwMDgtMDQtMDUgIERpcmsgRnJlZGVyaWNreCA8ZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbT4KCiAgICAgICAgKiBDb21taXQgcmVsYXRlZCBKSVJBIGlkJ3MKICAgICAgICAKMjAwOC0wNC0wNSAgRGlyayBGcmVkZXJpY2t4IDxkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tPgoKICAgICAgICAqIDIuNy4wLXN2bi00CiAgICAgICAgCiAgICAgICAgKiBSZWZhY3RvcmVkIEpTIHRvIHN1cHBvcnQgdGhlIEVkaXQgU3VnZ2VzdGlvbiBib3gsIHNvIGl0J3Mgbm93IGZ1bGx5IGJhc2VkIG9uIG1vb3Rvb2xzLgogICAgICAgIFRoZSBlbnRyaWVzIGluIHRoZSBzdWdnZXN0aW9uIGJveCBhcmUgbm93IGNsaWNrYWJsZTogdGhlIHBhZ2Ugb3IgYXR0YWNobWVudCBsaW5rIHdpbGwgYmUKICAgICAgICBpbnNlcnRlZCBpbiB0aGUgdGV4dGFyZWEuIEFsc28gdGhlIGhhbmRsaW5nIG9mIHRoZSB8IGJhciBpbnNpZGUgYSBsaW5rIGhhcyBiZWVuIGltcHJvdmVkLgoKICAgICAgICAqIFtKU1BXaWtpLTIwMF0gVGhlIGxlbmd0aCBvZiB0aGUgZW50cmllcyBpbiB0aGUgRWRpdCBTdWdnZXN0aW9uIGFyZSB0cnVuY2F0ZWQgdG8gYXZvaWQKICAgICAgICBvdmVybGFwIHdpdGggdGhlIG1haW4gYm9keSBvZiB0aGUgZWRpdCBhcmVhLgoKICAgICAgICAqIFRoZSBidWlsZCBzY3JpcHQgaGFzIGJlZW4gdXBkYXRlZCB0byB1c2UgdGhlIFlVSSBjb21wcmVzc29yLiBJdCBub3cgY29tcHJlc3NlcyBib3RoIAogICAgICAgIGphdmFzY3JpcHQgYW5kIGNzcyBmaWxlcy4gKHRoaXMgcmVwbGFjZXMgdGhlIERvam8gY29tcHJlc3Nvciwgd2hpY2ggb25seSBoYW5kbGVkIGpzKQogCiAgICAgICAgKiBJbiB0aGUgVXNlclByZWZlcmVuY2VzIHlvdSBjYW4gbm93IHNlbGVjdCB0aGUgcHJlZmVycmVkIGxhbmd1YWdlLiAKICAgICAgICBUaGUgZGVmYXVsdCBsYW5ndWFnZSBpcyBiYXNlZCBvbiB0aGUgdXNlcidzIGJyb3dzZXJzIHNldHRpbmcsIGJ1dCBhIGRyb3Bkb3duIGFsbG93cyB5b3UgdG8gCiAgICAgICAgc2VsZWN0IGFueSBvZiB0aGUgaW5zdGFsbGVkIGxhbmd1YWdlcy4KICAgICAgICBUaGUgUHJlZmVyZW5jZXNUYWIuanNwIGhhcyBiZWVuIHJlZmFjdG9yZWQsIHdpdGggaGVscCBvZiBKdWFuIFBhYmxvIFNhbnRvcyBSb2RyaWd1ZXouCiAgICAgICAgQWxsIGphdmEgaGFuZGxpbmcgaGFzIGJlZW4gbW92ZWQgdG8gVGVtcGxhdGVNYW5hZ2VyLmphdmEgYW5kIFByZWZlcmVuY2VzLmphdmEuCiAgICAgICAgCiAgICAgICAgTmV3IGkxOG4gcmVzb3VyY2VzIChhbHJlYWR5IGFkZGVkIGZvciAuZW4gYW5kIC5ubCkgCiAgICAgICAgICAgIHByZWZzLnVzZXIubGFuZ3VhZ2U9U2VsZWN0IExhbmd1YWdlCiAgICAgICAgICAgIHByZWZzLnVzZXIudGltZXpvbmUuc2VydmVyPVtTRVJWRVJdCiAgICAgICAgICAgIHByZWZzLnVzZXIubGFuZ3VhZ2UuZGVmYXVsdD1bREVGQVVMVF0KCiAgICAgICAgKiBBZGRlZCBhbiBhcmUteW91LXN1cmUgcHJvbXB0IHRvIHRoZSBVc2VyUHJlZmVyZW5jZXMuanNwIHdoZW4gbGVhdmluZyB0aGUgcGFnZSB3aXRob3V0IHNhdmluZy4KCiAgICAgICAgICAgIGphdmFzY3JpcHQucHJlZnMuYXJleW91c3VyZT1XaXRob3V0IGNsaWNraW5nIHRoZSBTYXZlIFVzZXIgUHJlZmVyZW5jZXMgYnV0dG9uLCBcCiAgICAgICAgICAgICAgICAgeW91ciBjaGFuZ2VzIHdpbGwgYmUgbG9zdC4gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGV4aXQgdGhpcyBwYWdlPwoKICAgICAgICAqIFtKU1BXSUtJLTIyNl0gIlZpZXcgUGFnZSBTb3VyY2UiIG5vdyBhbHNvIGRpc3BsYXlzICdub24tbGF0ZXN0JyBwYWdlIHZlcnNpb25zCgogICAgICAgICogU3VwcHJlc3MgdGhlICdWaWV3UGFnZVNvdXJjZScgaW4gdGhlIG1vcmUgbWVudSB3aGVuIHRoZSBwYWdlIGRvZXNuJ3QgZXhpc3QgeWV0LgoKICAgICAgICBBZGRlZCBtaXNzaW5nIGkxOG4gcmVzb3VyY2UKICAgICAgICAgICAgYWN0aW9ucy5yYXdwYWdlLnRpdGxlPVZpZXcgUGFnZSBTb3VyY2UKCiAgICAgICAgKiBJbXByb3ZlZCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlICdtb3JlIG1lbnUnIHRvIHJlc29sdmUgdGhlIGludGVybWVkaWF0ZSBzY3JlZW4gZ2xpdGNoLiAKICAgICAgICBXaGVuIGphdmFzY3JpcHQgaXMgb2ZmLCB0aGUgbW9yZSBtZW51IHdpbGwgbm93IGJlIGRpc3BsYXllZCBhdCB0aGUgdG9wIG9mIHRoZSBGYXZvcml0ZXMgYmxvY2ssCiAgICAgICAgd2hlbiBqYXZhc2NyaXB0IGlzIG9uLCB0aGUgbW9yZSBtZW51IGJlY29tZXMgYSBtb3VzZS1ob3ZlcmVkIGRyb3AtZG93bi4KICAgICAgICAKCiAgICAgICAgKiBJbiB0aGUgdXNlci1wcmVmZXJlbmNlcywgeW91IGNhbiBwb3NpdGlvbiB0aGUgZmF2b3JpdGVzIG1lbnUgTGVmdCBvciBSaWdodC4KICAgICAgICBOb3cgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBtYWtlIHRoZSBGYXZvcml0ZXMgbWVudSBoaWRkZW4sIGFsbG93aW5nIHRoZSBib2R5IG9mIHRoZSBwYWdlCiAgICAgICAgdG8gZml0aCB0aGUgZnVsbCB3aXRoIG9mIHRoZSBzY3JlZW4uIFRoaXMgc2hvdWxkIGJlbmVmaXQgbmFycm93IChtb2JpbGUpIGRldmljZXMuCiAgICAgICAgVGhlIGZhdm9yaXRlcyBtZW51IGlzIHN0aWxsIHJlYWNoYWJsZSB2aWEgYSBtb3VzZS1ob3ZlcmVkIG1lbnUuCgogICAgICAgIEFkZGVkIGkxOG4gcmVzb3VyY2VzOgogICAgICAgICAgICAgamF2YXNjcmlwdC5mYXZzLnNob3c9IkNsaWNrIHRvIHNob3cgRmF2b3JpdGVzIgogICAgICAgICAgICAgamF2YXNjcmlwdC5mYXZzLmhpZGU9IkNsaWNrIHRvIGhpZGUgRmF2b3JpdGVzIgoKICAgICAgICAqIFRoZSBqYXZhc2NyaXB0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gWEhUTUwgTUVUQSB0YWJzIAogICAgICAgIHRvIHJlZHVjZSB4c3MgdnVsbmVyYWJpbGl0eS4gKGNvbW1vbmhlYWRlci5qc3ApCiAgICAgICAgTm93IHVzZXJuYW1lJ3Mgd2l0aCBlbWJlZGRlZCBzaW5nbGUgcXVvdGVzIGRvIG5vdCBjcmFzaCB0aGUganMgYW55bW9yZS4KCiAgICAgICAgKiBbSlNQV0lLSS0yMDldIFNlY3Rpb24gZWRpdGluZyBoYXMgYmVlbiBhZGRlZC4gKGZlYXR1cmUgb3JpZ2luYWwgaW4gdGhlIEJydXNoZWRUZW1wbGF0ZSkKICAgICAgICBXaGVuIGEgcGFnZSBpcyBlZGl0YWJsZSwgZWFjaCBzZWN0aW9uIGhlYWRlciBnZXRzIGFuIGFkZGl0aW9uYWwgW2VkaXRdIGxhYmVsLgogICAgICAgIEluIGVkaXQgbW9kZSwgYSBzZWN0aW9uIGRyb3AtZG93biBoYXMgYmVlbiBhZGRlZCB3aGljaCBhbGxvd3MgdG8gZmlsdGVyIHRoZSB0ZXh0LWFyZWEgdG8gdGhlCiAgICAgICAgc2VjdGlvbiBvZiBpbnRlcmVzdC4KCiAgICAgICAgQWRkZWQgaTE4biByZXNvdXJjZXM6CiAgICAgICAgICAgICAgamF2YXNjcmlwdC5xdWljay5lZGl0PVtFZGl0XQogICAgICAgICAgICAgIGphdmFzY3JpcHQucXVpY2suZWRpdC50aXRsZT1FZGl0IHNlY3Rpb246IHswfQogICAgICAgICAgICAgIGVkaXQuc2VjdGlvbnM9U2VjdGlvbnMKCiAgICAgICAgKiBbSlNQV0lLSS0xOTNdIEZsYXdlZCBsb2dpbi5sb2dpbmhlbHBtaXNzaW5nIHRleHQgaW4gZW4sIGRlLCBubCBsb2NhbGVzLiAKICAgICAgICBGaXhlZCBmb3IgLmVuLCAubmwsIC5kZSB3YXMgYWxyZWFkeSBmaXhlZC4gCgoKMjAwOC0wMy0zMCAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGFwYWNoZS5vcmc+CgogICAgICAgICogMi43LjAtc3ZuLTMKICAgICAgICAKICAgICAgICAqIFtKU1BXSUtJLTIyNV0gQWRkZWQgcGF0Y2ggZnJvbSBIYXJyeSBNZXRza2UgdG8gZml4IGEgcHJvYmxlbQogICAgICAgIHdpdGggcGFzc3dvcmQgbm90IGJlaW5nIHNob3duIGR1cmluZyBpbnN0YWxsYXRpb24uCiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0yMjddIEFkZGVkIHBhdGNoIGZyb20gSGFycnkgTWV0c2tlIHRvIGZpeCBwcm9ibGVtCiAgICAgICAgd2l0aCBpbnN0YWxsYXRpb24gdHJhbnNsYXRpb24gaW4gRW5nbGlzaCBhbmQgRHV0Y2guCiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0yMDNdIENvdW50ZXIgcGx1Z2luIG5vdyBzdXBwb3J0cyBib3RoIGhpZGluZyByZXN1bHRzCiAgICAgICAgYXMgd2VsbCBhcyAic3RhcnQiIGFuZCAiaW5jcmVtZW50IiBvcHRpb25zLiAgUGF0Y2ggbW9zdGx5IGZyb20KICAgICAgICBIYXJyeSBNZXRza2UuCiAgICAgICAgCjIwMDgtMDMtMzEgIEFuZHJldyBKYXF1aXRoIDxhamFxdWl0aCBBVCBhcGFjaGUgRE9UIG9yZz4KCiAgICAgICAgKiAyLjcuMC1zdm4tMgoKICAgICAgICAqIENoYW5nZWQgQW50IGJ1aWxkIHNjcmlwdCB0byB1c2UgMS41IHNvdXJjZXMgYW5kIHRhcmdldHMuCgogICAgICAgICogUmUtZmFjdG9yZWQgdGhlIGF1dGhlbnRpY2F0aW9uIHN1YnN5c3RlbSB0byByZW1vdmUgdGhlIG5lZWQKICAgICAgICBmb3IgSkFBUyBjb25maWd1cmF0aW9uIGZpbGVzLiBXRUItSU5GL2pzcHdpa2kuamFhcyBnb2VzIGF3YXksCiAgICAgICAgYXMgZG9lcyB0aGUgbmVlZCBmb3IgUG9saWN5TG9hZGVyLiBBbHNvLCByZXNwb25zaWJpbGl0aWVzIGZvciB3ZWIKICAgICAgICBhdXRoZW50aWNhdGlvbiBtb3ZlIHRvIFdpa2lTZXJ2bGV0RmlsdGVyLiBBdXRoZW50aWNhdGlvbiBpcyBub3cKICAgICAgICBjb25maWd1cmVkIHZpYSBqc3B3aWtpLnByb3BlcnRpZXMgLS0gc2VlIHRoYXQgZmlsZSBmb3IgZGV0YWlscy4KICAgICAgICBXaWtpU2Vzc2lvbiBBUEkgY2hhbmdlOiBnZXRMb2dpbkNvbnRleHQoKSB2YW5pc2hlcy4KCiAgICAgICAgKiBUaGUgYXV0aC5sb2dpbi4qTG9naW5Nb2R1bGUgY2xhc3NlcyBhcmUgbWlsZGx5IHJlLWZhY3RvcmVkIHRvCiAgICAgICAgcmVtb3ZlIGFueSBuZWVkIHRvIGhhdmUga25vd2xlZGdlIG9mIGhvdyB0byAob3Igd2h5KSB0byBpbmplY3QKICAgICAgICBKU1BXaWtpIFJvbGUgcHJpbmNpcGFscy4gUmVzcG9uc2liaWxpdHkgZm9yIGluamVjdGluZyBSb2xlcyBtb3ZlcwogICAgICAgIHRvIFdpa2lTZXNzaW9uLiBKU1BXaWtpIGNhbiB1c2UgQU5ZIExvZ2luTW9kdWxlIGZvciBjdXN0b20KICAgICAgICBhdXRoZW50aWNhdGlvbiBub3cuCgogICAgICAgICogVG8gc3VwcG9ydCB0aGUgYXV0aCByZWZhY3RvcmluZywgd2UgaW50cm9kdWNlIHNldmVyYWwgKnRlbXBvcmFyeSoKICAgICAgICBuZXcgc2VydmxldCBtb2NrIG9iamVjdHMgZm9yIHVuaXQgdGVzdGluZzogVGVzdEZpbHRlckNoYWluLCBUZXN0RmlsdGVyQ29uZmlnLAogICAgICAgIFRlc3RIdHRwU2VydmxldFJlc3BvbnNlLCBhbmQgVGVzdFNlcnZsZXRDb250ZXh0LiBUaGVzZSBhcmUgInRlbXBvcmFyeSIgCiAgICAgICAgYmVjYXVzZSB0aGV5IHdpbGwgYmUgcmVwbGFjZWQgYnkgU3RyaXBlcyBtb2NrIG9iamVjdHMgbGF0ZXIgaW4gdGhlCiAgICAgICAgMi43IHJlbGVhc2UgY3ljbGUuCgoyMDA4LTAzLTMwICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjcuMC1zdm4tMQogICAgICAgIAogICAgICAgICogUmVtb3ZlZCBKREsgMS40IGRlcGVuZGVuY3kgaW4gQWRtaW5CZWFuTWFuYWdlci4KICAgICAgICAKICAgICAgICAqIFN3aXRjaGVkIGNvcHlyaWdodCBpbiBSZWxlYXNlLmphdmEgdG8gQVNGLiAgUGxlYXNlIHVzZQogICAgICAgIHRoaXMgZmlsZSBhcyB5b3VyIHJlZmVyZW5jZSB3aGVuIGNoYW5naW5nIHRoZSBib2lsZXJwbGF0ZS4KCjIwMDgtMDMtMjkgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuNi4yCgoyMDA4LTAzLTE5ICBBbmRyZXcgSmFxdWl0aCA8YWphcXVpdGggQVQgYXBhY2hlIERPVCBvcmc+CgogICAgICAgICogMi42LjItcmMtNAoKICAgICAgICAqIEZpeGVkIGZhaWxpbmcgU2VsZW5pdW0gd2ViIHVuaXQgdGVzdHMgc28gdGhhdCB0aGV5IHJ1biBjb3JyZWN0bHksCiAgICAgICAgd2l0aCB0d28gZXhjZXB0aW9ucy4gU2VlIHRlc3RzL2V0Yy9zZWxlbml1bS9yZWFkbWUudHh0OyB0aGlzIGZpbGUKICAgICAgICBpbmNsdWRlcyBhIGZldyBub3RlcyBvbiBob3cgdG8gd3JpdGUgU2VsZW5pdW0gdGVzdHMgc28gdGhhdCB0aGV5CiAgICAgICAgd2lsbCBydW4gYXV0b21hdGljYWxseSB2aWEgdGhlIEFudCAid2VidGVzdHMiIHRhcmdldC4KCjIwMDgtMDMtMTggIEp1YW4gUGFibG8gU2FudG9zIDxqdWFucGFibG8uc2FudG9zQGdtYWlsLmNvbT4KCiAgICAgICAgKiAyLjYuMi1yYy0zCiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0yMTRdLiAgVGFibGUgd2l0aCBpZCBhc2lycmFfS25vYnNUYWJsZSBoYWQgdHdvIHVubG9jYWxpemVkIAogICAgICAgIHN0cmluZ3MsIGFkZGVkIHRvIENvcmVSZXNvdXJjZXMucHJvcGVydGllcy4gRGV0ZWN0ZWQgYnkgRmxvcmlhbiBIb2xlY3play4gCiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0yMTVdLiAgQWRkZWQgcGF0Y2hlcyB0byBlbiwgbmwsIGZpIGFuZCBlcyB0cmFuc2xhdGlvbnMgdG8gZml4CiAgICAgICAgYSBjYXNlIHdoZXJlIEhUTUwgbWFya3VwIHdhcyBiZWluZyBzaG93bi4gICBEZXRlY3RlZCBieSBGbG9yaWFuIEhvbGVjemVrLgogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktMjEwXS4gIFVwZGF0ZWQgR2VybWFuIGxvY2FsaXphdGlvbiAoc3RpbGwgdGhhbmtzIHRvIEZsb3JpYW4hKQogICAgICAgIAoyMDA4LTAzLTE2ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AYXBhY2hlLm9yZz4KCiAgICAgICAgKiAyLjYuMi1yYy0yCiAgICAgICAgCiAgICAgICAgKiBVcGRhdGVkIER1dGNoIGxvY2FsaXphdGlvbiwgY291cnRlc3kgb2YgSGFycnkgTWV0c2tlLgogICAgICAgIAogICAgICAgICogMi42LjItcmMtMQogICAgICAgIAogICAgICAgICogVXBkYXRlZCBGaW5uaXNoIGxvY2FsaXphdGlvbi4KCjIwMDgtMDMtMTQgIEp1YW4gUGFibG8gU2FudG9zIDxqdWFucGFibG8uc2FudG9zQGdtYWlsLmNvbT4KCiAgICAgICAgKiAyLjYuMi1zdm4tNwogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktOTNdIGFuZCBbSlNQV0lLSS0xNjBdLiBDbGVhbmVkIHVwIGNvcmVwYWdlcy4gICAKICAgICAgICAKICAgICAgICAqIGkxOG4gb2YgQ2FwdGNoYS5qc3AgJiBJbnN0YWxsLmpzcCwgYWRkZWQgNTAgbmV3IGl0ZW1zIHRvIAogICAgICAgIENvcmVSZXNvdXJjZXMucHJvcGVydGllcy4gCiAgICAgICAgCjIwMDgtMDMtMTMgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBhcGFjaGUub3JnPgoKICAgICAgICAqIDIuNi4yLXN2bi02CiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0xNjJdLiAgQXR0YWNobWVudHMgY2FuIG5vIGxvbmdlciBjcmVhdGVkIGlmIHRoZSBwYXJlbnQKICAgICAgICBwYWdlIGRvZXMgbm90IGV4aXN0LgogICAgICAgIAogICAgICAgICogRml4ZXMgaXNzdWUgd2l0aCByZW5hbWluZyBhIG5vbi1leGlzdGFudCBwYWdlIHdvdWxkIGRlc3Ryb3kgdGhlIE1haW4KICAgICAgICBwYWdlLgogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktMTg4XS4gIEFkZGVkIHBhdGNoIGZyb20gRmxvcmlhbiBIb2xlY3playB0byBpbXByb3ZlCiAgICAgICAgbG9nZ2luZyBvZiBNYWlsVXRpbC4KICAgICAgICAKICAgICAgICAqIFtKU1BXSUtJLTE4OV0uICBBZGRlZCBhIHBhdGNoIGZyb20gRmxvcmlhbiB0byBpbXByb3ZlIGNvbmZpZ3VyYWJpbGl0eQogICAgICAgIG9mIE1haWxVdGlsLgoKMjAwOC0wMy0wOCAgQW5kcmV3IEphcXVpdGggPGFqYXF1aXRoIEFUIGFwYWNoZSBET1Qgb3JnPgoKICAgICAgICAqIDIuNi4yLXN2bi01CiAgICAgICAgCiAgICAgICAgKiBUd2Vha3MgdG8gSmF2YWRvYyBzbyB0aGF0IHRoZXkgYnVpbGQgY2xlYW5seS4gTm8gZnVuY3Rpb25hbGl0eSBjaGFuZ2VzLgoKMjAwOC0wMy0wOCAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGFwYWNoZS5vcmc+CgogICAgICAgICogMi42LjItc3ZuLTQKICAgICAgICAKICAgICAgICAqIFtKU1BXSUtJLTE1NF0uICBSZW1vdmVkIGRvdWJsZSBlbnRyaWVzIGZyb20gQ29yZVJlc291cmNlcyBhbmQgbWFkZQogICAgICAgIHN1cmUgZXZlcnlvbmUgdXNlcyBpdC4KICAgICAgICAKICAgICAgICAqIFtKU1BXSUtJLTIwMV0uICBBZGRlZCBzaW1wbGlmaWVkIENoaW5lc2UgZnJvbSBEYXZpZCBHYW8uICBUaGFua3MhCiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0xNjFdLiAgQWRkZWQgVHJhbnNsYXRpb25DaGVjayBmcm9tIEZsb3JpYW4gSG9sZWN6ZWsuICBSZW1vdmVkCiAgICAgICAgdGhlIE1pc3NpbmdUcmFuc2xhdGlvbnMgdG9vbCwgYXMgVHJhbnNsYXRpb25DaGVjayBkb2VzIGFsbCBpdCBkaWQuCgoyMDA4LTMtMDEgIERpcmsgRnJlZGVyaWNreCA8ZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbT4KCiAgICAgICAgKiBNaW5vciBzdHlsZXNoZWV0IHVwZGF0ZXMgKG5vIHZlcnNpb24gYnVtcCkKICAgICAgICAKICAgICAgICAqIExlYWRpbmcgZGlnaXRzIGZvciBvcmRlcmVkIGxpc3RzIHdlcmUgY3V0IG9mZiBiZWNhdXNlIHBhZGRpbmcgdmFsdWUgd2FzIHRvbyBzbWFsbC4KICAgICAgICAoZGV0ZWN0ZWQgYnkgRmxvcmlhbiBIb2xlY3playkKIAogICAgICAgICogTG9uZyBoZWFkaW5ncyB3aGljaCBicmVhayBpbnRvIHR3byBvciBtb3JlIGxpbmVzIGhhZCBpbnN1ZmZpY2llbnQgbGluZS1oZWlnaHQsIHNvCiAgICAgICAgdGhleSB3ZXJlICJzcXVlZXplZCBpbnRvIG9uZSBhbm90aGVyIiAgKGRldGVjdGVkIGJ5IEZsb3JpYW4gSG9sZWN6ZWspCiAgICAgICAgICAgICAgIAoKMjAwOC0yLTI0ICBBbmRyZXcgSmFxdWl0aCA8YWphcXVpdGggQVQgYXBhY2hlIERPVCBvcmc+CgogICAgICAgICogMi42LjItc3ZuLTMKICAgICAgICAKICAgICAgICAqIFJldmVydGVkIHRoZSBKU1AgY2hhbmdlcyBmcm9tIG15IGxhc3QgY29tbWl0IHNvIHRoYXQgZXhpc3RpbmcgMi42IGRlcGxveW1lbnRzCiAgICAgICAgZG9uJ3QgbmVlZCB0byByZWNvbmZpZ3VyZSB3ZWIueG1sLiBUaGF0IGNvbW1pdCByZW1vdmVkIHRoZSBmbXQ6c2V0QnVuZGxlIHRhZwogICAgICAgIGJlY2F1c2Ugb2YgdGhlIGFkZGl0aW9uIG9mIGEgc2VydmxldCBjb25maWcgcGFyYW1ldGVyIGluIHdlYi54bWwuIFRoZSB3ZWIueG1sCiAgICAgICAgbW9kaWZpY2F0aW9ucyByZW1haW4sIGhvd2V2ZXIsIHNvIHRoYXQgYW55IG5ldyBKU1BzIHdvbid0IG5lZWQgdG8gdXNlIHNldEJ1bmRsZS4KICAgICAgICBGb3IgMi44LCB3ZSB3aWxsIHJlbW92ZSB0aGUgc2V0QnVuZGxlIHRhZ3MgZW50aXJlbHkuCgoyMDA4LTItMjQgIEFuZHJldyBKYXF1aXRoIDxhamFxdWl0aCBBVCBhcGFjaGUgRE9UIG9yZz4KCiAgICAgICAgKiAyLjYuMi1zdm4tMgoKICAgICAgICAqIFtKU1BXSUtJLTE5NV06IFN1cGVyZmx1b3VzIFdFQi1JTkYvaTE4biBkaXJlY3RvcnkgY3JlYXRlZCBkdXJpbmcgd2FyIGJ1aWxkLgogICAgICAgIEFsc28sIHNldmVyYWwgdW5uZWVkZWQgSkFScyB3ZXJlIGFsc28gYmVpbmcgaW5jbHVkZWQuCgogICAgICAgICogRWxpbWluYXRlZCB0aGUgbmVlZCB0byBoYXJkLWNvZGUgPGZtcjpzZXRCdW5kbGU+IHRhZ3MgaW4gSlNQcyBieSBzZXR0aW5nCiAgICAgICAgdGhlIHdlYi54bWwgPGNvbXRleHQtcGFyYW0+IGphdmF4LnNlcnZsZXQuanNwLmpzdGwuZm10LmxvY2FsaXphdGlvbkNvbnRleHQKICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0ZW1wbGF0ZXMuZGVmYXVsdC4gUmVtb3ZlZCB0aGUgc2V0QnVuZGxlIHRhZ3MgZnJvbQogICAgICAgIGFsbCBKU1BzLgoKMjAwOC0wMi0xMCAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGFwYWNoZS5vcmc+CgogICAgICAgICogMi42LjItc3ZuLTEKICAgICAgICAKICAgICAgICAqIFtKU1BXSUtJLTE3MV06IFBhdGNoIGZvciBGQ0sgZWRpdG9yIGFuZCBjb21tZW50IHByb2JsZW0gZnJvbQogICAgICAgIERhdmlkIEF1LgogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktMTY5XTogRml4IHRvIGFsbG93IG1haWwgc2VuZGVyIGZyb20gSk5ESSBpbiBhZGRpdGlvbgogICAgICAgIHRvIHByb3BlcnR5IGZpbGUuICBUaGFua3MgdG8gRGF2ZSBXb2xmLgogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktMTc3XTogQ29tcGxldGVseSBvdmVyaGF1bGVkIEdlcm1hbiB0cmFuc2xhdGlvbiwgdGhhbmtzCiAgICAgICAgdG8gRmxvcmlhbiBIb2xlY3play4KCjIwMDgtMDItMTAgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi42LjEgcmVsZWFzZS4KCjIwMDgtMDItMDMgRGlyayBGcmVkZXJpY2t4IChkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tKQoKICAgICAgICAqIDIuNi4xLXJjLTQKCiAgICAgICAgKiBEb3plbnMgb2YgbG9jYWxpemF0aW9uIGZpeGVzIGZvciBubCBbSlNQV2lraS0xNzZdIEV4Y2VsbGVudCByZXZpZXcgYnkgSGFycnkgTWV0c2tlLiAKICAgICAgICBNYW55IFRoYW5rcyEKICAgICAgICAKMjAwOC0wMi0wMyBEaXJrIEZyZWRlcmlja3ggKGRpcmsuZnJlZGVyaWNreEBnbWFpbC5jb20pCgogICAgICAgICogU21hbGwgZml4ZXMgb24gRHV0Y2ggbG9jYWxpemF0aW9uIChubCkgIE5vIHZlcnNpb24gdXBkYXRlCiAgICAgICAgCiAgICAgICAgCjIwMDgtMDItMDIgRGlyayBGcmVkZXJpY2t4IChkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tKQoKICAgICAgICAqIEFkZGVkIERVVENIIGxvY2FsaXphdGlvbiAobmwpCiAgICAgICAgCgoyMDA4LTAyLTAyICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNi4xLXJjLTMKICAgICAgICAKICAgICAgICAqIFtKU1BXSUtJLTEyM106IEFkZGVkIEdlcm1hbiBkYXRlIGZvcm1hdHMgdG8ganNwd2lraS5wcm9wZXJ0aWVzLCB0aGFua3MKICAgICAgICB0byBGbG9yaWFuIEhvbGVjemVrCiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0xNzNdOiBPb3BzLCB3ZSBoYWQgYSBkZXRlY3Rpb24gcm91dGluZSBmb3IgaWxsZWdhbCBYTUwgY2hhcnMsCiAgICAgICAgYnV0IHVuZm9ydHVuYXRlbHkgaXQgd2FzIG91dHB1dHRpbmcgdGhlIHNhbWUgaWxsZWdhbCBjaGFycyB0byB0aGUgYXMgYW4KICAgICAgICBlcnJvci4uLgoKMjAwNy0xMi0xMCAgQW5kcmV3IEphcXVpdGggPGFqYXF1aXRoIEFUIGFwYWNoZSBET1Qgb3JnPgoKICAgICAgICAqIDIuNi4xLXJjLTIKCiAgICAgICAgKiBDaGFuZ2VkIGRlZmF1bHQgdGVzdHMvZXRjL2dyb3VwZGF0YWJhc2UueG1sIGFuZCB0ZXN0cy9ldGMvdXNlcmRhdGFiYXNlLnhtbAogICAgICAgIHNvIHRoYXQgdGhleSB1c2UgdGhlIHBsYXRmb3JtLWluZGVwZW5kZW50IGRhdGUgZm9ybWF0cyBmb3IgY3JlYXRpb24vbW9kaWZpY2F0aW9uCiAgICAgICAgZGF0ZXN0YW1wcy4gQWxzbywgZml4ZWQgYSBidWcgaW4gWE1MVXNlckRhdGFiYXNlIHRoYXQgY2F1c2VkICJvbGQiIGRhdGUgZm9ybWF0cwogICAgICAgIHRvIG5vdCBiZSBjb252ZXJ0ZWQgb24gc3RhcnR1cC4gVGhhbmtzIHRvIEhhcnJ5IE1ldHNrZSBmb3IgcmVwb3J0aW5nIHRoaXMgaXNzdWUuCgogICAgICAgICogVGlueSB0d2VhayB0byBFY2xpcHNlIGNsYXNzcGF0aCBzbyB0aGF0IGNsYXNzIGZpbGVzIGFyZSBwdXQgaW4gYnVpbGQvIGFuZCB0ZXN0cy9idWlsZC4gCgoyMDA4LTAxLTI3ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNi4xLXJjLTEKICAgICAgICAKICAgICAgICAqIFtKU1BXSUtJLTE2Nl06IEFkZGVkIGEgZGVmYXVsdCBtYWlsIHNlbmRlciB0byB3YXJkIG9mZiBhbiBldmlsIE5QRS4gIAogICAgICAgIEkgaGF2ZSBhIHN1c3BpY2lvbiB0aGF0IHRoaW5ncyBzdGlsbCBkb24ndCB3b3JrIGFzIGRvY3VtZW50ZWQsIGJ1dCAKICAgICAgICBhdCBsZWFzdCB0aGVyZSBpcyBubyBOUEUgYW55bW9yZS4KCjIwMDgtMDEtMjcgRGlyayBGcmVkZXJpY2t4IChkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tKQoKICAgICAgICAqIDIuNi4xLWN2cy0xMQoKICAgICAgICAqIFtKU1BXaWtpLTEzN10gOiBUb2dnbGUgd29ya2Zsb3cgZGV0YWlscyBub3cgYWxzbyB3b3JrcyBvbiBGRgogICAgICAgIAogICAgICAgICogW0pTUFdpa2ktMTIzXSA6IFRoZSBzZXQgb2YgdXNlci1wcmVmZXJlbmNlIHRpbWVmb3JtYXRzIGFkZGVkIHRvIAogICAgICAgIGpzcHdpa2kucHJvcGVydGllcy50bXBsIGlzbyBqc3B3aWtpLnByb3BlcnRpZXMuCgogICAgICAgIAoyMDA4LTAxLTI2IERpcmsgRnJlZGVyaWNreCAoZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbSkKCiAgICAgICAgKiBbSlNQV2lraS0xNDddIDogU2xpbWJveCBsYWJlbHMgd2VyZSBmb3Jnb3R0ZW4uIChjcmVkaXQgVG9tYXN6IFN6eW1rbykKICAgICAgICBBZGRlZCBhIG5ldyBpdGVtIHRvIGRlZmF1bHQucHJvcGVydGllczoKCiAgICAgICAgICAgIGphdmFzY3JpcHQuc2xpbWJveC5jbG9zZT1DbG9zZSAmIzIxNTsKICAgICAgICAgICAgamF2YXNjcmlwdC5zbGltYm94LmNsb3NlLnRpdGxlPUNsb3NlIFtFc2NdCgoKMjAwOC0wMS0yNiAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiBbSlNQV0lLSS0xNDZdOiBXZSBub3cgcHJvcGVybHkgY2F0Y2ggdGhlIGV4Y2VwdGlvbnMgZ2VuZXJhdGVkIGR1cmluZwogICAgICAgIGRvd25sb2FkIHRvIGF2b2lkIGR1bWIgZXJyb3IgbWVzc2FnZXMuCiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0xMDJdOiBBZGRlZCBwYXRjaCBmcm9tIEhhcnJ5IE1ldHNrZSB0byBmaXggSk5ESSBtYWlsIHNlbmRpbmcuCiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0xNTNdOiBHZXJtYW4gdHJhbnNsYXRpb24gd2FzIHN0aWxsIHRhbGtpbmcgYWJvdXQgdXNlcm5hbWVzCiAgICAgICAgdXBvbiBwYXNzd29yZCByZWNvdmVyeS4KICAgICAgICAKICAgICAgICAqIFtKU1BXSUtJLTE1N106IENvcmVSZXNvdXJjZXMgaGFkIHN0cmluZ3Mgd2hpY2ggd2VyZSBub3Qgc2hvd2luZwogICAgICAgIHVwIHByb3Blcmx5LCBidXQgaGFkIEhUTUwgZW50aXRpZXMuICBGaXhlZCBlbiwgZmksIGRlIGFuZCBlcy4KICAgICAgICAKICAgICAgICAqIFVwZGF0ZWQgRmlubmlzaCBsb2NhbGl6YXRpb24uCgoyMDA4LTAxLTI2IERpcmsgRnJlZGVyaWNreCAoZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbSkKCiAgICAgICAgKiAyLjYuMS1jdnMtMTAgIC0tIHZhcmlvdXMgc21hbGwgaTE4biBpc3N1ZXMgCgogICAgICAgICogW0pTUFdpa2ktMTIzXSA6IFRoZSBzZXQgb2YgdXNlci1wcmVmZXJlbmNlIHRpbWVmb3JtYXRzIG1vdmVkIHRvIHRoZSAKICAgICAgICBqc3B3aWtpLnByb3BlcnRpZXMsIHN1Y2ggdGhhdCB0aGUgYWRtaW5pc3RyYXRvciBjYW4gZWFzaWx5IGNob29zZSB0aW1lZm9ybWF0cywKICAgICAgICBpZiBuZWVkZWQgZXZlbiBsb2NhbGl6ZSB0aGVtLgoKICAgICAgICAqIFtKU1BXaWtpLTEzN10gVG9nZ2xlIGRldGFpbHMgYnV0dG9uIGlzIG5vdyB3b3JraW5nIGFuZCBpMThuJ2l6ZWQgaW4gV29ya2Zsb3cgcGFnZQogICAgICAgIEFkZGVkIGEgbmV3IGl0ZW0gdG8gZGVmYXVsdC5wcm9wZXJ0aWVzOgoKICAgICAgICAgICAgd29ya2Zsb3cuY3JlYXRVc2VyUHJvZmlsZT1OZXcgdXNlciBwcm9maWxlIDxzdHJvbmc+ezJ9PC9zdHJvbmc+CgogICAgICAgICogW0pTUFdpa2ktMTQ0XSA6IExvZ2luSGVscCBsaW5rcyB0byBMb2dpblBhZ2VIZWxwIGluIGwxMG4gdmFyaWFibGUKICAgICAgICBBZGRlZCBMb2dpblBhZ2VIZWxwIHRvIENvcmUgd2lraSBwYWdlcyAoY29waWVkIGZyb20ganNwd2lraS5vcmcpCgogICAgICAgICogW0pTUFdpa2ktMTQ3XSA6IENhdGVnb3J5IHRpdGxlIGxhYmVsIHdhcyBub3QgaTE4TgogICAgICAgIEFkZGVkIGEgbmV3IGl0ZW0gdG8gZGVmYXVsdC5wcm9wZXJ0aWVzOgoKICAgICAgICAgICAgamF2YXNjcmlwdC5jYXRlZ29yeS50aXRsZT1DbGljayB0byBzaG93IGNhdGVnb3J5IFt7MH1dIC4uLgoKICAgICAgICAqIFtKU1BXaWtpLTE0OV0gOiBFZGl0IEdyb3VwIGFuZCBEZWxldGUgR3JvdXAgZGlkIG5vdCBmaXQgd2VsbCBpbiB0aGUgZ3VpLgogICAgICAgIFJlZmFjdG9yZWQgdGhlIEVkaXRHcm91cGNvbnRlbnQuanNwIGFuZCBHcm91cENvbnRlbnQuanNwIHRvIG1ha2UgdGhlIGd1aSBtb3JlIGNvbnNpc3RlbnQuCiAgCiAgICAgICAgKiBbSlNQV0lLSS0xNjNdIEVycm9yIG1lc3NhZ2Ugd2hlbiBjcmVhdGluZyBhIG5ldyBncm91cCB0byBiZSBJMThOCiAgICAgICAgQWRkZWQgYSBuZXcgaXRlbSB0byBDb3JlUmVzb3VyY2VzLnByb3BlcnRpZXM6CgogICAgICAgICAgICBuZXdncm91cC5leGlzdHM9R3JvdXAgezB9IGFscmVhZHkgZXhpc3RzLiBUcnkgYW5vdGhlciBuYW1lLgoKCjIwMDgtMDEtMjQgIEp1YW4gUGFibG8gU2FudG9zIChqdWFucGFibG8uc2FudG9zQGdtYWlsLmNvbSkKICAgICAgICAKICAgICAgICAqIFVwZGF0ZWQgc3BhbmlzaCB0cmFuc2xhdGlvbiB3aXRoIG1pc3NpbmcgZW50cnkga2V5cy4gU3dpdGNoZWQgSFRNTAogICAgICAgIGVudGl0aWVzIHRvIExhdGluMSBlcXVpdmFsZW50LgoKMjAwOC0wMS0yMCAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjYuMS1jdnMtOQogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktMTQyXTogVHlwbyBpbiBkZWZhdWx0LnByb3BlcnRpZXMuICBUaGFua3MgdG8gRmxvcmlhbiEgKEFuZAogICAgICAgIHByb2JhYmx5IHRoZSBmYXN0ZXN0IGJ1ZyBmaXggaW4gSlNQV2lraSBoaXN0b3J5Li4uKQogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktNTldOiBSZWZlcnJpbmdQYWdlc1BsdWdpbiB3b3VsZCBjcmVhdGUgdGhlIHdyb25nICJtb3JlLi4uIgogICAgICAgIGxpbmsgaW4gZmkgYW5kIGRlIGxvY2FsaXphdGlvbnMuICBGaXhlZCBhbmQgdXBncmFkZWQgZW4gYW5kIGVzIGxvY2FsaXphdGlvbnMuCgoyMDA4LTAxLTE5ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNi4xLWN2cy04CgogICAgICAgICogT29wcywgdGhlcmUgd2FzIGEgSkRLIDEuNSBkZXBlbmRlbmN5IGluIEF0dGFjaG1lbnRTZXJ2bGV0LiAgRml4ZWQsCiAgICAgICAgc2hvdWxkIGFnYWluIHdvcmsgb24gMS40LgogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktMTM2XTogV29ya2Zsb3dDb250ZW50LmpzcCBoYWQgYSBjb3VwbGUgb2YgdW50cmFuc2xhdGVkIHN0cmluZ3M7CiAgICAgICAgdXBkYXRlZCBFbmdsaXNoIGFuZCBGaW5uaXNoIHRyYW5zbGF0aW9ucy4gIFJlcG9ydGVkIGJ5IFRvbWFzeiBTenlta28uCiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0xMzVdOiBDb25mbGljdENvbnRlbnQgaGFkIGFuIHVudHJhbnNsYXRlZCBzdHJpbmcuICBSZXBvcnRlZCBieQogICAgICAgIFRvbWFzeiBTenlta28gKHdob3NlIG5hbWUgSSBhbSAqc28qIGdvaW5nIHRvIG1pc3NwZWxsIG9uZSBkYXkpLgogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktMTMzXTogR3JvdXBDb250ZW50LmpzcCBoYWQgYW4gdW50cmFuc2xhdGVkIHN0cmluZy4gIFJlcG9ydGVkIGJ5CiAgICAgICAgVG9tYXN6IFN6eW1rby4KICAgICAgICAKICAgICAgICAqIFtKU1BXSUtJLTEzNF06IEVkaXRHcm91cENvbnRlbnQuanNwIGhhZCBhIGNvdXBsZSBvZiB1bnRyYW5zbGF0ZWQgc3RyaW5ncy4KICAgICAgICBSZXBvcnRlZCBieSBUb21hc3ogU3p5bWtvLgogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktMTMyXTogRmluZENvbnRlbnQgaGFkIGFuIHVudHJhbnNsYXRlZCBzdHJpbmcuICBSZXBvcnRlZCBieQogICAgICAgIFRvbWFzeiBTenlta28uCiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0xMzFdOiBDaGFuZ2VkICJhdXRoZW50aWNhdGVkIiB0byAiYXV0aG9yaXplZCIgaW4gYWxsIGJ1aWx0LWluCiAgICAgICAgbG9jYWxpemF0aW9ucy4gIFRoYW5rcyB0byBGYWJpYW4gSGF1cHQgZm9yIGVuLCBkZSBhbmQgZXMuCiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0xMTRdOiBGaXhlZCBpc3N1ZSB3aXRoIFZhcmlhYmxlTWFuYWdlciBub3QgY2hlY2tpbmcgdGhlIHBhcmVudAogICAgICAgIHBhZ2UgZm9yIHZhcmlhYmxlcyBpbiBjYXNlIHRoZSBJbnNlcnRQYWdlIHBsdWdpbiB3YXMgdXNlZC4gIFRoYW5rcyB0bwogICAgICAgIFN0ZXBoZW4gU29sa2EhCiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0xMThdOiBGaXhlZCBpc3N1ZSB3aXRoIEZDSyBlZGl0b3Igbm90IHNhdmluZyBhbGwgbWV0YWRhdGEuICBUaGFua3MKICAgICAgICB0byBEYXZpZCBBdSBmb3IgdGhlIGZpeCEKICAgICAgICAKICAgICAgICBOZXcgaTE4biBrZXlzIGluIGkxOG4vdGVtcGxhdGVzL2RlZmF1bHQucHJvcGVydGllczoKICAgICAgICAgICAqIHdvcmtmbG93LmRldGFpbHMKICAgICAgICAgICAqIHdvcmtmbG93LmRldGFpbHMudGl0bGUKICAgICAgICAgICAqIGNvbmZsaWN0Lm9vcHMudGl0bGUKICAgICAgICAgICAqIGZpbmQudGFiLmhlbHAKICAgICAgICAgICAKCjIwMDgtMDEtMTIgRGlyayBGcmVkZXJpY2t4IChkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tKQoKICAgICAgICAqIDIuNi4xLWN2cy03CiAgICAgICAgCiAgICAgICAgKiBbSlNQV0lLSS0xMjhdIGZpeGVkIHZhcmlvdXMgaXNzdWVzIGluIHRoZSAgcHJpbnRpbmcgc3R5bGUgc2hlZXQuCiAgICAgICAgVmFsaWRhdGlvbiBvZiBJRSBpcyBwZW5kaW5nLgoKICAgICAgICAKMjAwOC0wMS0wNyAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjYuMS1jdnMtNgogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktOTVdOiBMaW5rcyB0byBhbmNob3JzIHdpdGggYmxhbmtzIHdvcmsgbm93LiAgVGhpcyBpbnRyb2R1Y2VzCiAgICAgICAgYSB0aW55LCB2ZXJ5IHRpbnkgY29tcGF0aWJpbGl0eSBpc3N1ZSB3aXRoIGxpbmtzIHRvIGhlYWRpbmdzIGNoYW5naW5nCiAgICAgICAgY2FzZSBpbiBzb21lIGNhc2VzLiAgUmVwb3J0ZWQgYnkgSsO8Z2VuIFdlYmVyLgogICAgICAgIAogICAgICAgICogW0pTUFdJS0ktMTI1XTogRmlsdGVyTWFuYWdlciBub3cgY2hlY2tzIGZvciB2ZXJzaW9uIGNvbXBhdGliaWxpdHkgCiAgICAgICAgb2YgUGFnZUZpbHRlcnMgYnkgbG9va2luZyBpbnRvIHRoZSBpbmkvanNwd2lraV9tb2R1bGUueG1sLiAgVGhpcyB3YXMgYSAKICAgICAgICBzdXJwcmlzaW5nbHkgYmlnIGNoYW5nZS4gIEkgd291bGQgdmVyeSBtdWNoIGxpa2UgdG8gbW92ZSB0byBhbm5vdGF0aW9ucwogICAgICAgIGluIDMuMC4uLiBSZXBvcnRlZCBieSBGbG9yaWFuIEhvbGVjemVrLgoKICAgICAgICAqIFtKU1BXSUtJLTEyNF06IFR1cm5zIG91dCB0aGF0IHVzaW5nIGRlX0RFIGFzIHRoZSBsYW5ndWFnZSBuYW1lCiAgICAgICAgaXMgbm90IGEgZ29vZCBpZGVhLCBhcyBpdCByZWFsbHkgd29ya3Mgb25seSB3aGVuIHlvdSBkZWZpbmUgRGV1dHNjaCAoRGV1dHNjaGxhbmQpCiAgICAgICAgYXMgeW91ciBsYW5ndWFnZSAtIGFsbCBvdGhlciBHZXJtYW4tc3BlYWtpbmcgZm9sa3Mgd291bGQgc2VlIEVuZ2xpc2NoLi4uCiAgICAgICAgUmVwb3J0ZWQgYnkgR29yYW4gS2FybGljLgoKICAgICAgICAqIGFkZGVkIHN0cmVzcy9NYXNzaXZlUmVwb3NpdG9yeVRlc3QuCgoyMDA4LTAxLTA2ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIEZpeGVkIGEgbnVtYmVyIG9mIEVjbGlwc2Ugd2FybmluZ3MuICBObyB2ZXJzaW9uIGJ1bXAsIG5vCiAgICAgICAgZnVuY3Rpb25hbGl0eSBjaGFuZ2UuCgoyMDA4LTAxLTA1IERpcmsgRnJlZGVyaWNreCAoZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbSkKCiAgICAgICAgKiBObyB2ZXJzaW9uIGJ1bXAgLSBzbWFsbCBmaXggb2YgZXhjZXB0aW9uIGluIEZvb3Rlci5qc3AKCjIwMDgtMDEtMDUgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi42LjEtY3ZzLTUKCiAgICAgICAgKiBbSlNQV0lLSS0xMDhdOiBGaXhlZCBFZGl0UGFnZUhlbHAudHh0IHdoaWNoIGhhZCBhbiBleHRyYSBwaXBlIGNoYXIuCgogICAgICAgICogW0pTUFdJS0ktMTA2XTogUGFzc3dvcmQgcmVjb3ZlcnkgZW1haWxzIGFyZSBub3cgc2VudCB3aXRoIFVURi04IGVuY29kaW5nLgoKICAgICAgICAqIFtKU1BXSUtJLTExM106IFBhdGNoIGZyb20gSGFycnkgTWV0c2tlIHRvIG1ha2Ugc3VyZSB0aGUgSk5ESSBmYWN0b3J5IGlzCiAgICAgICAgb25seSBjaGVja2VkIG9uY2Ugd2hlbiBzZW5kaW5nIGVtYWlsLgoKICAgICAgICAqIFtKU1BXSUtJLTExOV06IFVSSSBkZXRlY3RvciBub3cgZGV0ZWN0cyBwcm9wZXJseSB+IGFuZCAlIGNoYXJhY3RlcnMuCgoyMDA4LTAxLTAzIERpcmsgRnJlZGVyaWNreCAoZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbSkKCiAgICAgICAgKiAyLjYuMS1jdnMtNAoKICAgICAgICAqIEltcHJvdmluZyByb2J1c3RuZXNzIG9mIFdpa2kuZ2V0UGFnZU5hbWUodXJsKSB3aGljaCB3YXMgZHlpbmcgb24gdW5leHBlY3RlZCB1cmwgZm9ybWF0cy4KCgoyMDA4LTAxLTAyICBEaXJrIEZyZWRlcmlja3ggKGRpcmsuZnJlZGVyaWNreEBnbWFpbC5jb20pCgogICAgICAgICogMi42LjEtY3ZzLTMKCiAgICAgICAgKiBbSlNQV0lLSS00OV0gRml4ZWQgaGFuZGxpbmcgb2YgdGhlIEVkaXRvciBjaG9pY2UgYXMgcGFydCBvZiB0aGUgdXNlciBwcmVmZXJlbmNlcy4KICAgICAgICBXaGVuIHJlc3RhcnRpbmcgdGhlIGJyb3dzZXIsIGFsc28gdGhlIHByZWZlcnJlZCBlZGl0b3Igc2V0dGluZyBpcyByZWNvdmVyZWQuCiAgICAgICAgU3RpbGwgMiBwcm9wZXJ0aWVzIGV4aXN0IHRvIHNldCB0aGUgZGVmYXVsdCBFZGl0b3IgY2hvaWNlIChib3RoIGFyZSBrZXB0IGZvciBidyBjb21wYXQpCiAgICAgICAgWW91IGNhbiBjaG9vc2UgZWl0aGVyIG9uZS4KICAgICAgICAgIGpzcHdpa2kuZWRpdG9yPXBsYWluCiAgICAgICAgICBqc3B3aWtpLmRlZmF1bHRwcmVmcy50ZW1wbGF0ZS5lZGl0b3IgPXBsYWluICAgICg9PiBwcmVmZXJyZWQpCgogICAgICAgICogQWxsIFdFQlRFU1RzIGFyZSBub3cgY29udmVydGVkIHRvIFNlbGVuaXVtLiBUaGV5IHJ1biBtYW51YWxseSAtLSBzdGlsbCBuZWVkIHRvIHZlcmlmeQogICAgICAgIHRoZSBhdXRvbWF0aWMgcnVuIHZpYSBhbnQuCgogICAgICAgICogVGhlIE1PUkUgZHJvcGRvd24gaXMgbm93IGFsc28gYXZhaWxhYmxlIGR1cmluZyBMb2dpbiwgVXNlclByZWZlcmVuY2VzIGFuZCBGaW5kIHNjcmVlbnMuCiAgICAgICAgVGhpcyBtYWtlcyBhbGwgY29tbW9uIGxpbmtzIChzdG9yZWQgaW4gTW9yZU1lbnUpIG1vcmUgZWFzaWx5IGFjY2Vzc2libGUuCgogICAgICAgICogTWlub3IgSlMgcmVmYWN0b3JpbmdzIG9uIGhhbmRsaW5nIGNvbG9yIGZvciBHcmFwaEJhcnMgYW5kIFplYnJhVGFibGVzLgoKICAgICAgICAqIE1pbm9yIEpTIHJlZmFjdG9yaW5ncyB0byBiZXR0ZXIgc3VwcG9ydCBDYXRlZ29yeSBzdHlsZXMgZm9yIElFLgoKICAgICAgICAqIEJvdGggSlNQV2lraSBsb2dvJ3MgKHNoYWRlZCBhbmQgbm90LXNoYWRlZCBpbWFnZSkgaGF2ZSBiZWVuIG1lcmdlZCBpbiBhIHNpbmdsZSAucG5nCiAgICAgICAgdG8gcmVzb2x2ZSBpbWFnZSBmbGlja2VyIGF0IG1vdXNlLWhvdmVyLiAoZXNwZWNpYWxseSBvbiBpZSkKCgoyMDA3LTEyLTEwICBBbmRyZXcgSmFxdWl0aCA8YWphcXVpdGggQVQgYXBhY2hlIERPVCBvcmc+CgogICAgICAgICogMi42LjEtY3ZzLTIKCiAgICAgICAgKiBbSlNQV0lLSS0xMTZdIFVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcywgY2FsbHMgdG8KICAgICAgICBVc2VyTWFuYWdlci5nZXRVc2VyRGF0YWJhc2UoKSBhcmUgbWFkZSBiZWZvcmUgdGhlIHVzZXIgZGF0YWJhc2UgaXMKICAgICAgICBhY3R1YWxseSBpbml0aWFsaXplZCwgcmVzdWx0aW5nIGluIE5QRXMuIFRvIHJlc29sdmUsIHdlIHNpbXBseSByZXBsYWNlZAogICAgICAgIGludGVybmFsIHJlZmVyZW5jZXMgdG8gbV91c2VyRGF0YWJhc2Ugd2l0aCBnZXRVc2VyRGF0YWJhc2UoKSwKICAgICAgICB3aGljaCBsYXppbHkgaW5pdGlhbGl6ZXMgdGhlIGRhdGFiYXNlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBoYXBwZW5lZC4KCjIwMDctMTItMjUgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi42LjEtY3ZzLTEKCiAgICAgICAgKiBBZGRlZCBTcGFtRmlsdGVyLmlzVmFsaWRVc2VyUHJvZmlsZSgpIGFuZCBjb3JyZXNwb25kaW5nIGNoZWNrcwogICAgICAgIHRvIGFsbG93IGFsc28gdXNlciByZWdpc3RyYXRpb25zIHRvIGJlIHNwYW0tY2hlY2tlZC4KCjIwMDctMTItMjIgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi42LjAhICBXb290IQoKICAgICAgICAqIFJlbW92ZWQgSlNQV2lraVRvQ3Jlb2xlVHJhbnNsYXRvciAodGhlIGNsYXNzIHdhcyBlbXB0eSBhbmQgdW51c2VkKQogICAgICAgIGluIGFuIGVmZm9ydCB0byBjbGVhbiB0aGUgY29kZSBiYXNlIGEgYml0IGZvciByZWxlYXNlLgoKICAgICAgICAqIEFkZGVkIHNvbWUgd2FybmluZ3MgdG8gQ3Jlb2xlRmlsdGVyICYgQ3Jlb2xlVG9KU1BXaWtpVHJhbnNsYXRvcgogICAgICAgIHRvIG1ha2Ugc3VyZSBwZW9wbGUgdW5kZXJzdGFuZCB0aGV5IGFyZSBleHBlcmltZW50YWwgZmVhdHVyZXMuICBBbHNvCiAgICAgICAgcmVtb3ZlZCBXaWtpQ3Jlb2xlIGZyb20gIm5ldyBmZWF0dXJlcyIgbGlzdC4KCiAgICAgICAgKiBGaXhlZCBhIG51bWJlciBvZiBmYWlsaW5nIHVuaXQgdGVzdHMgZm9yIENyZW9sZSBieSByZW1vdmluZyBhIGxvdCBvZgogICAgICAgIGxpbmUgc2VwYXJhdG9yIG1hbmFnZW1lbnQgY29kZS4gIEFzIGZhciBhcyBJIGNhbiB0ZWxsLCBpdCB3YXMgYWxsCiAgICAgICAgdW5uZWNlc3NhcnkgYW5kIGJ5IGFjY2lkZW50IGRpZG4ndCBmYWlsIG9ubHkgb24gV2luZG93cy4KCiAgICAgICAgKiBJbXByb3ZlZCBqYXZhZG9jcywgcmVtb3ZpbmcgYSBudW1iZXIgb2YgQ2hlY2tzdHlsZSBlcnJvcnMuCgoyMDA3LTEyLTEwICBBbmRyZXcgSmFxdWl0aCA8YWphcXVpdGggQVQgYXBhY2hlIERPVCBvcmc+CgogICAgICAgICogMi42LjAgUkM1CgogICAgICAgICogQ2hlY2tlZCBhIG5ldyB2ZXJzaW9uIG9mIHdlYi54bWwgdGhhdCBJIGluYWR2ZXJ0ZW50bHkgbWlzc2VkCiAgICAgICAgaW4gUkMzLiBUaGlzIHJlc29sdmVzIFtKU1BXSUtJLTkyXSwgZm9yIHJlYWwgdGhpcyB0aW1lLiBTb3JyeSEKCiAgICAgICAgKiBSZXNvbHZlZCBbSlNQV0lLSS0zM10gYnkgcmVtb3ZpbmcgYWxsIGV4dGVybmFsIGNsYXNzIGRlcGVuZGVuY2llcwogICAgICAgIGluIFdpa2lCYWNrZ3JvdW5kVGhyZWFkIChvdGhlciB0aGFuIEpTUFdpa2kuamFyIGNsYXNzZXMpLiBBbHNvCiAgICAgICAgY2hhbmdlZCB0aGUgZGVmYXVsdCB3ZWJ0ZXN0cy10ZWFyZG93biB0YXNrIGluIEFudCBzbyB0aGF0IHdlYiB1bml0CiAgICAgICAgdGVzdHMgYXJlIHRha2VuIGRvd24gdW5sZXNzIHRoZSAnd2VidGVzdHMua2VlcHVwJyBwcm9wZXJ0eSBpcyBzZXQuCgogICAgICAgICogUmVwbGFjZWQganVnLWxncGwgd2l0aCB0aGUgQXBhY2hlLWxpY2Vuc2VkIHZlcnNpb24gW0pTUFdJS0ktNDFdLgoKICAgICAgICAqIFRoZSBBbnQgd2FyL3Rlc3Qgd2FyIHRhc2tzIHdlcmUgbm90IGFsd2F5cyBwcm9wZXJseSBleGNsdWRpbmcKICAgICAgICB0ZXN0LXJlbGF0ZWQgamFycywgc3VjaCBhcyBTZWxlbml1bS4gVGhpcyB3YXMgY2F1c2luZyB3ZWJhcHBzIHRvCiAgICAgICAgZmFpbCB0byBsb2FkIGluIHNvbWUgY2FzZXMuIFRoZXNlIGphcnMgaGF2ZSBub3cgYmVlbiBtb3ZlZCB0byB0ZXN0cy9saWIuCgogICAgICAgICogQWRqdXN0ZWQgdGhlIFJFQURNRSBmaWxlIGluIGxpYiB0byByZWZsZWN0IHJlYWxpdHkuCgoyMDA3LTEyLTEwICBDaHJpc3RvcGggU2F1ZXIgPHNhdWVyQGhzLWhlaWxicm9ubi5kZT4KCiAgICAgICAgKiAyLjYuMSBSQzQKCiAgICAgICAgKiAoSSBhbSByZWFsbHkgbm90IHN1cmUgaWYgSSBhbSBudW1iZXJpbmcgcmlnaHQgaGVyZSwgc2luY2UKICAgICAgICAgICBJIGZpeGVkIGEgYnVnLCBzaG91bGQgdGhlIHJldmlzaW9uIG51bWJlciBub3QgYmUgaW5jcmVtZW50ZWQKICAgICAgICAgICBhcyB3ZWxsLCBhY2NvcmRpbmcgdG8gW0pTUFdJS0k6VmVyc2lvbmluZ1Byb3Bvc2FsXT8pCgogICAgICAgICogRml4ZWQgQnVnIGluIENyZW9sZUZpbHRlcjogV2hlbiB5b3UgdXNlZCB0aGUgc2lnbmF0dXJlCiAgICAgICAgICBtYXJrdXAgZnJvbSBjcmVvbGUgKC0tfn5+fiksIHBsdWdpbiBzeW50YXggZGlkIG5vdCBnZXQgcHJvcGVybHkKICAgICAgICAgIHRyYW5zbGF0ZWQgYmFjayBpbnRvIGNyZW9sZSBtYXJrdXAsIHNvIGV2ZW4gaWYgeW91CiAgICAgICAgICB0eXBlZCBpbiA8PFBsdWdpbj4+LCBpdCB3YXMgbGF0ZXIgZGlzcGxheWVkIGluIHRoZSBzb3VyY2UKICAgICAgICAgIGFzIFt7UGx1Z2lufV0KCiAgICAgICAgKiBBZGRlZCBzb21lIG1pc3NpbmcgbGluZWJyZWFrcyBpbiB0cmFuc2xhdGlvbgoKMjAwNy0xMi0xMCAgQW5kcmV3IEphcXVpdGggPGFqYXF1aXRoIEFUIGFwYWNoZSBET1Qgb3JnPgoKICAgICAgICAqIDIuNi4xIFJDMwoKICAgICAgICAqIEZpeGVkIEFudCBzY3JpcHQgY29tcGF0aWJpbGl0eSBpc3N1ZSByZXBvcnRlZCBpbiBbSlNQV0lLSS0xMDldLgogICAgICAgIEpTUFdpa2kncyAnd2FyLXRvbWNhdCcgIGFuZCAnd2VidGVzdHMnIHRhc2tzIG5vdyB3b3JrIGNvcnJlY3RseQogICAgICAgIHdoZW4gcnVubmluZyB1bmRlciBUb21jYXQgNS41ICphbmQqIDYuMC4KCiAgICAgICAgKiBGaXhlZCBhIGNvbXBhdGliaWxpdHkgYnVnIHRoYXQgd2FzIHByZXZlbnRpbmcgSlNQV2lraSBmcm9tCiAgICAgICAgc3RhcnRpbmcgaW4gYW4gb2xkZXIgdmVyc2lvbiBvZiBSZXNpbiBbIEpTUFdJS0ktOTJdLiBUaGlzIGlzc3VlIHN1cmZhY2VkCiAgICAgICAgdGhyZWUgYnVnczogd2ViLnhtbCdzIDxkZXNjcmlwdGlvbj4gYW5kIDxkaXNwbGF5LW5hbWU+IGVsZW1lbnRzCiAgICAgICAgd2VyZSBpbiB0aGUgd3Jvbmcgb3JkZXI7IGFuIHVubmVlZGVkIFNBWCBwYXJzZXIgZmVhdHVyZSB3YXMgYmVpbmcKICAgICAgICBzZXQgaW4gV2ViQ29udGFpbmVyQXV0aG9yaXplcjsgYW5kIChtb3N0IGVncmVnaW91c2x5KSBUYWJUYWcKICAgICAgICBvdmVycm9kZSBhIHN1cGVyY2xhc3MgbWV0aG9kLCBzZXRJZCgpLCB3aGVuIGl0IHNob3VsZCBub3QgaGF2ZS4KICAgICAgICBUYWJUYWcncyBpbXBsZW1lbnRhdGlvbiBoYXMgYmVlbiAicHVsbGVkIHVwIiB0byBXaWtpVGFnQmFzZSwgYW5kIGl0CiAgICAgICAgbm93IGRlbGVnYXRlcyBwcm9wZXJseSB0byB0aGUgc3VwZXJjbGFzcy4gSW4gYWRkaXRpb24sIGFzIGEgYm9udXMsCiAgICAgICAgYWxsICJpZCIgYXR0cmlidXRlcyBmb3IgY3VzdG9tIEpTUFdpa2kgdGFncyBhcmUgbm93IGltbXVuaXplZCBmcm9tCiAgICAgICAgY3Jvc3Mtc2l0ZSBzY3JpcHRpbmcgaW5qZWN0aW9uLgoKMjAwNy0xMi0wNSAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjYuMCBSQzIKCiAgICAgICAgKiBDaGFuZ2VkIHZlcnNpb25pbmcgc2NoZW1lCgoyMDA3LTEyLTE2ICBDaHJpc3RvcGggU2F1ZXIgPHNhdWVyQGhzLWhlaWxicm9ubi5kZT4KCiAgICAgICAgKiAyLjYuMiBSQzEKCiAgICAgICAgKiBbSlNQV0lLSS0xMDFdOiBGaXhlZCwgVE9DIHBsdWdpbiBkaWQgbm90IGNhbGwgZmlsdGVyCgogICAgICAgICogSW1wcm92ZWQgTWlzc2luZ1RyYW5zbGF0aW9ucyB1dGlsaXR5LCBub3cgb3V0cHV0cyBzb3J0ZWQgbGlzdAogICAgICAgICAgb2YgZGlmZiBwcm9wZXJ0aWVzLgoKICAgICAgICAqIEFkZGVkIG1pc3NpbmcgZ2VybWFuIHRyYW5zbGF0aW9ucwoKMjAwNy0xMi0xMCAgQW5kcmV3IEphcXVpdGggPGFqYXF1aXRoIEFUIGFwYWNoZSBET1Qgb3JnPgoKICAgICAgICAqIDIuNi4xIFJDMQoKICAgICAgICAqIFJpcHBlZC1hbmQtcmVwbGFjZWQgd2ViIHVuaXQgdGVzdHMgYW5kIHJlcGxhY2VkIHdpdGggU2VsZW5pdW0uCiAgICAgICAgU2VsZW5pdW0gdGVzdCBkaXJlY3Rvcnkgc3RydWN0dXJlIHJlcGxhY2VkIHdpdGggYSBwYXRjaGVkCiAgICAgICAgc2VsZW5pdW0tc2VydmVyLTAuOS4yLmphci4gV2ViIHRlc3RzIGFyZSB5ZXQgbm90IGF0IHBhcml0eQogICAgICAgIHdpdGggb2xkIChmYWlsaW5nKSBKV2ViVW5pdCB0ZXN0cywgdGhleSBhcmUgcHJldHR5IGdvb2QgZm9yCiAgICAgICAgYSBzdGFydC4gTWFueSB0aGFua3MgdG8gRGlyayB0byBmaWd1cmluZyBvdXQgdGhlIG1pbm9yIHBhdGNoZXMKICAgICAgICB3ZSBuZWVkZWQgdG8gZ2V0IFNlbGVuaXVtIHRvIHdvcmsgbmljZWx5IHdpdGggTW9vdG9vbHMuCgogICAgICAgICogUmVtb3ZlZCBhbGwgdHJhY2VzIG9mIEpNZXRlciwgSHR0cFVuaXQgYW5kIEpXZWJVbml0CiAgICAgICAgKGFzIG11Y2ggYXMgSSBjb3VsZCBmaW5kLCBhbnl3YXkpLgoKICAgICAgICAqIFJlLWJhc2VkIFNlbGVuaXVtIHRlc3RzIHRvIHRlc3RzL2V0Yy9zZWxlbml1bS90ZXN0cy4KCiAgICAgICAgKiBJZiB5b3Ugd2FudCB0byB0cnkgZGV2ZWxvcGluZyB5b3VyIG93biB3ZWIgdGVzdHMsIGNoZWNrIG91dAogICAgICAgIFNlbGVuaXVtIElERSwgYSBGaXJlRm94IHBsdWdpbiB0aGF0IHJlY29yZHMgdXNlciBhY3Rpb25zCiAgICAgICAgYW5kIGdlbmVyYXRlcyB0ZXN0cyBzY3JpcHRzLgoKMjAwNy0xMi0wNSAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjYuMCBSQzEKCiAgICAgICAgKiBbSlNQV0lLSS01NV06IEFkZGVkIHBhdGNoIGZyb20gRGF2aWQgQXUgdG8gZml4IHBhZ2VzCiAgICAgICAgd2l0aCBzcGFjZXMuCgogICAgICAgICogW0pTUFdJS0ktNjJdOiBBZGRlZCBwYXRjaCBmcm9tIERhdmlkIEF1IHRvIGZpeCBTaG9ydFVSTENvbnN0cnVjdG9yCiAgICAgICAgYW5kIHBsYWluLmpzcC4KCjIwMDctMTItMTAgIERpcmsgRnJlZGVyaWNreCAoZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbSkKCiAgICAgICAgKiBBZGRlZCBzZWxlbml1bS1jb3JlIChzZWxlbml1bS5jb3JlLnZlcnNpb249MC44LjMsIHNlbGVuaXVtLmNvcmUucmV2aXNpb249MTg3OSkKICAgICAgICB3aXRoIGZldyBwYXRjaGVzIGZvciBtb290b29scyBjb21wYXRpYmlsaXR5LgogICAgICAgIChzZWUgaHR0cDovL2ZvcnVtLm1vb3Rvb2xzLm5ldC92aWV3dG9waWMucGhwP2lkPTE2MzkpCgogICAgICAgICogQWRkZWQgZmlyc3Qgc2V0IG9mIHdlYiB1bml0IHRlc3RzIGJhc2VkIG9uIFNlbGVuaXVtLgogICAgICAgIFJlYWQgdGhlIHRlc3RzL3NlbGVuaXVtLXRlc3RzL3JlYWRtZS50eHQgZm9yIG1vcmUgaW5zdHJ1Y3Rpb25zIGhvdyB0bwogICAgICAgIHJ1biB0aGVtIG1hbnVhbGx5LiBBdXRvbWF0ZWQgdGVzdHJ1bnMgZnJvbSBhbnQgc3RpbGwgbmVlZCB0byBiZSBzZXR1cC4KCjIwMDctMTItMDUgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi41LjE2NgoKICAgICAgICAqIFtKU1BXSUtJLTc4XTogSXQncyBubyBsb25nZXIgcG9zc2libGUgdG8gcmVjb3ZlciBwYXNzd29yZAogICAgICAgIGJhc2VkIG9uIHVzZXIgYWNjb3VudCBuYW1lIC0geW91IG5lZWQgdGhlIGVtYWlsIGFkZHJlc3MuICBQcm9wcwogICAgICAgIHRvIE91bmNlIExhYnMuCgogICAgICAgICogQ29udGVudHMgb2YgbG9naW4ubG9zdHB3LmhlbHAsIGxvZ2luLmxvc3Rwdy5uYW1lIGhhdmUgY2hhbmdlZC4gVXBkYXRlZAogICAgICAgIEVuZ2xpc2ggYW5kIEZpbm5pc2ggdHJhbnNsYXRpb25zIGFjY29yZGluZ2x5LgoKICAgICAgICAqIFtKU1BXSUtJLTY1XTogSW5zZXJ0VGFnIG5vdyBwcm90ZWN0cyBhZ2FpbnN0IGEgcHJvYmxlbWF0aWMgWFNTIGluamVjdGlvbi4KICAgICAgICBUaGFua3MgdG8gT3VuY2UgTGFicy4KCjIwMDctMTItMDQgIERpcmsgRnJlZGVyaWNreCAoZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbSkKCiAgICAgICAgKiAyLjUuMTY1CgogICAgICAgICogW0pTUFdpa2ktODhdIEZpeGVkIGpzIGJ1ZyB0byB0YWIgdG8gZ3JvdXAgb3IgcHJvZmlsZSBpbiBJRTYKCgoyMDA3LTEyLTAxICBEaXJrIEZyZWRlcmlja3ggKGRpcmsuZnJlZGVyaWNreEBnbWFpbC5jb20pCgogICAgICAgICogMi41LjE2NCAgOiB2YXJpb3VzIHhzcyB2dWxuZXJhYmxpbGl0aWVzCgogICAgICAgICogV3JvbmcgUGFzc3dvcmQgRXJyb3IgTWVzc2FnZSBNYXkgaW5jcmVhc2UgQ3JlZGVudGlhbCBHdWVzcyBbSlNQV0lLSS04NV0KCiAgICAgICAgKiBHUk9VUCBwYXJhbWV0ZXIgdmFsaWRhdGlvbiBbSlNQV0lLSS02OV0KCiAgICAgICAgKiBJbnB1dCBWYWxpZGF0aW9uIG9mIGVkaXRvcnMgcGFyYXJtZXRlciBbSlNQV2tpLTY3XQoKICAgICAgICAqIFJlc29sdmUgY29tbW9uaGVhZGVyLmpzcCB4c3MgdnVsbmVyYWJpbGl0aWVzIHdydCBza2lucyBbSlNQV0lLSS0gNjZdCgogICAgICAgICogVmFyaW91cyB3aWtpIHRhZ3MgaW1wcm92ZW1lbnRzIFtKU1BXaWtpLTYzXQoKICAgICAgICAqIEF1dGhvciBUYWcgYW5kIEFzc2VydGVkIFVzZXJuYW1lIFtKU1BXaWtpLTYwXQoKMjAwNy0xMS0yNSAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjUuMTYzCgogICAgICAgICogUm9sbGVkIGJhY2sgZml4IHRvIEpTUFdJS0ktNzQsIHNpbmNlIGEpIGl0J3Mgbm90IG5lY2Vzc2FyeSwKICAgICAgICBhbmQgYikgaXQga2lsbHMgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBzYXZlIHByb2Nlc3MuCgogICAgICAgICogW0pTUFdJS0ktODRdOiBBZGRlZCBub3RlIHRvIHRoZSBqc3B3aWtpLnByb3BlcnRpZXMuCgoyMDA3LTExLT8/ICBBbmRyZXcgSmFxdWl0aCA8YWphcXVpdGggQVQgYXBhY2hlIERPVCBvcmc+CgogICAgICAgICogMi41LjE2MgoKICAgICAgICAqIEZpeGVkIFtKU1BXSUtJLTgyXS4gV2Ugd2VyZSBmYWlsaW5nIHRvIHByb3Blcmx5IGNsb3NlIEpEQkMgY29ubmVjdGlvbnMKICAgICAgICBpbiBKREJDVXNlck1hbmFnZXIgYW5kIEpEQkNHcm91cE1hbmFnZXIuIENyZWRpdDogT3VuY2UgTGFicy4KCiAgICAgICAgKiBGaXhlZCBbSlNQV0lLSS03NF0uIFNwYW1GaWx0ZXIgbm93IHVzZXMgU2VjdXJlUmFuZG9tLgogICAgICAgIENyZWRpdDogT3VuY2UgTGFicy4KCjIwMDctMTEtMjUgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogU2FtZSB2ZXJzaW9uLCBkb24ndCB3YW50IHRvIGJ1bXAgdG9vIG1hbnkgdGltZXMgaW4gb25lIGRheSA6KQoKICAgICAgICAqIFtKU1BXSUtJLTQ2XTogaXQncyBubyBsb25nZXIgcG9zc2libGUgdG8gZG8gcmVkaXJlY3Rpb24gb24KICAgICAgICBuZXh0UGFnZSB3aGVuIHVwbG9hZGluZy4gIFRoYW5rcyB0byBPdW5jZSBmb3IgbGV0dGluZyB1cyBrbm93LgoKICAgICAgICAqIFtKU1BXSUtJLTUzXTogQWRkZWQgcGF0Y2ggZnJvbSBEYXZlIFdvbGYgdG8gdHVybiBhIG1pc3NpbmcKICAgICAgICBwb2xpY3kgZmlsZSAtTlBFIHRvIGEgcHJvcGVyIGV4Y2VwdGlvbiAod2l0aCBleHBsYW5hdGlvbnMpLgoKMjAwNy0xMS0yNSAgRGlyayBGcmVkZXJpY2t4IChkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tKQoKICAgICAgICAqIDIuNS4xNjEKCiAgICAgICAgKiBJRSB3aWRlIGltYWdlcyBhbHNvIGZpeGVkIG9uIFBSRVZJRVcgbW9kZTsKCiAgICAgICAgKiBTdGFjayBvdmVyZmxvdyBvbiBJRSBmb3IgbG9naW4gcGFnZSBmaXhlZCBbSlNQV2lraS01MV0KCiAgICAgICAgKiAlJWNvbGxhcHNlIHJlbmRlcmluZyB3YXMgaW5jb3JyZWN0IHdpdGggbGFyZ2VyIGRlZmF1bHQgZm9udC1zaXplcy4KICAgICAgICBBZGFwdGVkIHRvIGhlaWdodCBvZiB0aGUgY29sbGxhcHNlIGJ1bGxldHMuIFtKU1BXaWtpLTM0XQoKICAgICAgICAqIE1pbm9yIGFkanVzdG1lbnQgb2YgdGhlIHNtYXJ0IHNraW46IGFsaWdubWVudCBvZiBzZWFyY2gtYm94IGFuZAogICAgICAgIGhlYWRlci9mb290ZXIgd2lkdGhzLgoKMjAwNy0xMS0yNSAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjUuMTYwCgogICAgICAgICogQXBwbGllZCBwYXRjaCBmcm9tIEhhcnJ5IE1ldHNrZSB0byBzbGlnaHRseSBzcGVlZCB1cCBQYWdlVGltZUNvbXBhcmF0b3IuCgogICAgICAgICogW0pTUFdJS0ktNDddOiBTZWN1cml0eUNvbmZpZy5qc3Agbm93IHNoaXBzIG9mZiBieSBkZWZhdWx0LCBidXQgY2FuCiAgICAgICAgYmUgZW5hYmxlZCBieSBzZXR0aW5nIGpzcHdpa2kteC5zZWN1cml0eWNvbmZpZy5lbmFibGU9dHJ1ZS4gIFRoZSBwYWdlCiAgICAgICAgYWxzbyBoYXMgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBhY2NvbXBsaXNoIHRoYXQsIHdoZW4geW91IHRyeSB0byBhY2Nlc3MKICAgICAgICBpdC4KCjIwMDctMTEtMjIgIERpcmsgRnJlZGVyaWNreCAoZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbSkKCiAgICAgICAgKiAyLjUuMTU5CgogICAgICAgICogSUUgZml4ZXMgZm9yIGZsdWlkIHRlbXBsYXRlIHdpdGggdmVyeSB3aWRlIGltYWdlcy4gKGNvbnQnZCkKICAgICAgICBBbHNvIGZpeGVzIGEgYnVnIGludHJvZHVjZWQgaW4gdjIuNS4xNTUgd3J0IGltYWdlIGZvcm1hdHRpbmcuCiAgICAgICAgW0pTUFdpa2ktMTUsIEpTUFdpa2ktNTJdCgoyMDA3LTExLTIyICBBbmRyZXcgSmFxdWl0aCA8YW5kcmV3IEFUIGZyZXNoY29va2llcyBET1Qgb3JnPgoKICAgICAgICAqIDIuNS4xNTgKCiAgICAgICAgKiBBbnQgYnVpbGQgc2NyaXB0IGZvciB3ZWJ0ZXN0cyBpcyBub3cgbXVjaCBzbWFydGVyLiBXZWIgdGVzdHMgbm93IHBlcmZvcm0gYQogICAgICAgICJwcmUtZmxpZ2h0IiBjaGVjayB0byBtYWtlIHN1cmUgcHJlY29uZGl0aW9ucyBhcmUgc2F0aXNmaWVkIGJlZm9yZSBsYXVuY2hpbmcuCiAgICAgICAgIElmIHlvdSd2ZSB3YW50ZWQgdG8gcnVuIHdlYiB0ZXN0cyBiZWZvcmUgYnV0ICJjb3VsZG4ndCBnZXQgdGhlbSB3b3JraW5nLiIKICAgICAgICAgdGhlIG5ldyBzY3JpcHQgc2hvdWxkIHNldCB0aGluZ3MgcmlnaHQuCgoyMDA3LTExLTE4ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNS4xNTcKCiAgICAgICAgKiBbSlNQV0lLSS0yMV06IFBhc3N3b3JkIGhhc2ggbm93IHVzZXMgVVRGLTggaW5zdGVhZCBvZiBwbGF0Zm9ybSBkZWZhdWx0LgoKICAgICAgICAqIENsZWFuZWQgSlNQV2lraVRvQ3Jlb2xlVHJhbnNsYXRvciB0byBjb25mb3JtIHRvIGNvZGluZyBydWxlcwoKICAgICAgICAqIENvbW1lbnRlZFByb3BlcnRpZXMgd2FzIGFsc28gc3RvcmluZyB3aXRoIHBsYXRmb3JtIGRlZmF1bHQgZW5jb2RpbmcuICBJbgogICAgICAgIG1vc3QgY2FzZXMgdGhpcyB3b3VsZCB3b3JrLCBidXQgaXQgd291bGQgY3JlYXRlIGFuIHVud2VsY29tZSBpbmNvbXBhdGliaWxpdHkKICAgICAgICBiZXR3ZWVuIHJlZ3VsYXIgcHJvcGVydHkgZmlsZXMgYW5kIHRoZXNlIHByb3BlcnR5IGZpbGVzLiAgSXQgbm93IGV4cGxpY2l0bHkKICAgICAgICB1c2VzIElTTy04ODU5LTEgZW5jb2RpbmcuCgogICAgICAgICogRml4ZWQgYSBjb3VwbGUgb2Ygd3JvbmcgZW50aXRpZXMgaW4gU3BhbmlzaCBhbmQgRmlubmlzaCB0cmFuc2xhdGlvbnMuCgogICAgICAgICogW0pTUFdJS0ktMjldOiBQZXItcGFnZSBSU1MgbGlua3Mgc2hvdWxkIG5vdyBiZSBjb3JyZWN0IGFnYWluLgoKMjAwNy0xMS0xNyAgRGlyayBGcmVkZXJpY2t4IChkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tKQoKICAgICAgICAqIDIuNS4xNTYKCiAgICAgICAgKiBSZW1vdmVkIHRoZSBlcnJvciBwcmVmaXggZnJvbSB0aGUgc3VjY2Vzc2Z1bGwgTG9zc1Bhc3N3b3JkIGluZm9ybWF0aW9uIG1lc3NhZ2UuICBbSlNQV0lLSS0yNl0KCiAgICAgICAgKiBTbWFsbCBzZWFyY2hib3ggaW1wcm92ZW1lbnRzOiBzZWFyY2ggaWNvbiBub3cgYXBwZWFycyBpbnNpZGUgdGhlIHNlYXJjaCBib3g7CiAgICAgICAgYW4gZW1wdHkgc2VhcmNoIGlzIHJlYWxseSBlbXB0eSBhbmQgZG9lcyBub3Qgc2VhcmNoIGZvciB0aGUgc3RyaW5nICdRdWljayBOYXZpZ2F0aW9uJyBhbnltb3JlLgoKICAgICAgICAqIEZpeGVkIHRoZSBzZWFyY2ggSGlnaGxpZ2h0IHRvIGNvb3BlcmF0ZSB3ZWxsIHdpdGggQUpBWCBiYXNlZCBzZWFyY2hlcy4KCjIwMDctMTEtMTYgIERpcmsgRnJlZGVyaWNreCAoZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbSkKCiAgICAgICAgKiAyLjUuMTU1IC0gSUU2IHdpZGUgaW1hZ2VzCgogICAgICAgICogRml4IGZ1bm55IGluZGVudGluZyBvZiBjb2xsYXBzYWJsZSBsaXN0IHdoZW4gJSVjb2xsYXBzZSBhcmUgbmVzdGVkIFtKU1BXaWtpLTM0XQoKICAgICAgICAqIChmaW5hbGx5KSBGaXhpbmcgd2lkZSBpbWFnZSBzdXBwb3J0IGZvciBpZTYgaW4gZmx1aWQgdGVtcGxhdGVzLiBbSlNQV2lraS0xNV0KICAgICAgICBGb3IgSUU2IGJyb3dzZXJzLCBhIDxkaXYgY2xhc3M9ImllaW1hZ2UiPiB3aWxsIGJlIGluc2VydGVkIGFyb3VuZCBlYWNoIGltYWdlLiBUaGlzIDxkaXY+CiAgICAgICAgZ2V0cyBhIHNwZWNpZmljIG92ZXJmbG93LXg6YXV0byBzdHlsZSwgYWN0aXZhdGluZyBwcm9wZXIgc2Nyb2xsaW5nIGZvciB0aGlzIGZhbW91cyBicm93c2VyLgoKICAgICAgICAqIEFkZGVkIGEgY29ycmVjdGlvbiB0byB0aGUgZml4ZWQgd2lkdGggdGVtcGxhdGUgVmFuaWxsYS0xMDI0eDc2OCwgdG8gc3VwcG9ydCB3aWRlIGltYWdlcwogICAgICAgIG9uIGllNiBoZXJlIGFzIHdlbGwuIFtyZXBvcnRlZCBieSBIYXJyeSBNZXRza2VdCgoKMjAwNy0xMS0xMiAgSnVhbiBQYWJsbyBTYW50b3MgKGp1YW5wYWJsby5zYW50b3NAZ21haWwuY29tKQoKICAgICAgICAqIDIuNS4xNTQKCiAgICAgICAgKiBBZGRlZCBzdXBwb3J0IGZvciBKTWV0ZXIgKHYuIDIuMykgdGVzdHMgaW4gYnVpbGQueG1sICYgd2VidGVzdHMueG1sLAogICAgICAgIHR3byBuZXcgcHJvcGVydGllcyBtdXN0IGJlIHNldCB1cCBhdCB5b3VyIGJ1aWxkLnByb3BlcnRpZXM6IHRvbWNhdC5wcm90b2NvbAogICAgICAgIGFuZCBAam1ldGVyLmhvbWVALgoKICAgICAgICAqIEFkZGVkIGptZXRlci10ZXN0cy5qbXggd2l0aCBzaW1wbGUgbG9naW4gYW5kIGxvZ291dCB3ZWIgdGVzdHMgYW5kCiAgICAgICAgam1ldGVyLWluaXQtd29ya2JlbmNoLmpteCwgd2hpY2ggY29udGFpbnMgaW5pdGlhbCBub2RlcyB0byBzdGFydCByZWNvcmRpbmcKICAgICAgICBuZXcgdGVzdHMuCgogICAgICAgICogSldlYlVuaXQgdGVzdHMgYXJlIG5vIGxvbmdlciBydW5uaW5nIHdoZW4gZXhlY3V0aW5nIHRoZSA8d2VidGVzdHM+IHRhcmdldC4KICAgICAgICBZb3UgY2FuIGtlZXAgcnVubmluZyB0aGVtIGluc2lkZSB5b3VyIElERSBhcyBub3JtYWwgSlVuaXQgdGVzdCBvciB1bmNvbW1lbnQKICAgICAgICB0aGUgYXBwcm9waWF0ZSBzZWN0aW9uIGluIHRoZSA8d2VidGVzdHM+IHRhcmdldC4KCjIwMDctMTEtMTAgIERpcmsgRnJlZGVyaWNreCAoZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbSkKCiAgICAgICAgKiAyLjUuMTUzCgogICAgICAgICogRm9ybSBlbGVtZW50IGZvY3VzIHdhcyBmYWlsaW5nIG9uIHByZWZlcmVuY2VzIHBhZ2VzIGluIElFIFtKU1BXaWtpLTI0XQoKICAgICAgICAqIEFkZGVkIFRpdGxlQm94IHRvIHRoZSB0ZW1wbGF0ZS4gV2hlbiBjcmVhdGluZyBhIHBhZ2UgJ1RpdGxlQm94JywgaXQncyBjb250ZW50cwogICAgICAgIHdpbGwgYmUgaW5jbHVkZWQgYXQgdGhlIHRvcCBvZiB0aGUgaGVhZGVyIG9mIHRoZSB3aWtpIHNpdGUuCiAgICAgICAgVGhpcyBhbGxvd3MgeW91IHRvIHB1dCBhIHRpdGxlIG1lc3NhZ2Ugb3Igc3BlY2lmaWMgYW5ub3VuY2VtZW50cyBvciBuZXdzZmxhc2hlcwogICAgICAgIG9uIHlvdXIgc2l0ZS4gW1N1Z2dlc3RlZCBieSBNdXJyYXkgJiBKYW5uZV0KCiAgICAgICAgKiBBZGRlZCBhIG5ldyBza2luIFBsYWluVmFuaWxsYSAxMDI0eDc2OCwgd2hpY2ggaGFzIGEgZml4ZWQgd2lkdGggbGF5b3V0IGlzbwogICAgICAgIHRoZSBmbHVpZCBsYXlvdXRzIHVzZWQgaW4gdGhlIGRlZmF1bHQgUGxhaW5WYW5pbGxhIHNraW4uCiAgICAgICAgVGhpcyBuZXcgc2tpbiBhbGxvd3MgdG8gYmV0dGVyIHN1cHBvcnQgSUUgYnJvd3NlcnMgd2hlbiBzaG93aW5nIHdpZGUgaW1hZ2VzLgogICAgICAgIChJRSBoYXMgdGVycmlibGUgZmxvYXQgc3VwcG9ydCkKCgoyMDA3LTExLTA5ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNS4xNTIKCiAgICAgICAgKiBbSlNQV0lLSS0xOV06IEZpeGVkIGxvY2FsaXphdGlvbiB3aGljaCB3YXMgZW5jb2RpbmcgSFRNTCBlbnRpdGllcwogICAgICAgIGV2ZW4gdGhvdWdoIHRoZXJlIHdhcyBubyBuZWVkLgoKICAgICAgICAqIFtKU1BXSUtJLTEyXTogRml4ZWQgbG9jYWxpemF0aW9uLgoKICAgICAgICAqIEFkZGVkIE11cnJheSdzIHBhdGNoIGZvciBXaWtpUGFnZVJlbmFtZUV2ZW50LgoKICAgICAgICAqIFtKU1BXSUtJLTI4XTogTGlua1BhcnNlciB3YXMgZmFpbGluZyBkaXNtYWxseSB3aXRoIGludGVyd2lraSBsaW5rcy4KICAgICAgICBBZGRlZCBhIG5ldyB1bml0IHRlc3QgdG8gY2F0Y2ggdGhlc2UsIGFuZCByZXdyb3RlIExpbmtQYXJzZXIgaW50ZXJ3aWtpCiAgICAgICAgbGluayBwYXJzaW5nLgoKICAgICAgICAqIEx1Y2VuZVNlYXJjaFByb3ZpZGVyLmdldEF0dGFjaG1lbnRDb250ZW50KCkgaXMgbm93IHByb3RlY3RlZCBmb3IKICAgICAgICBzdWJjbGFzc2Vycy4KCiAgICAgICAgKiBDbGFzc1V0aWwgaXMgbm93IGEgYml0IG1vcmUgdmVyYm9zZS4KCjIwMDctMTEtMDcgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi41LjE1MQoKICAgICAgICAqIFtKU1BXSUtJLTExXTogSXQncyBub3cgcG9zc2libGUgdG8gc2V0IG1haWwuc210cC5zdGFydHRscy5lbmFibGUKICAgICAgICBhbHNvIGZyb20gdGhlIHByb3BlcnR5IGZpbGUuICBQcmV2aW91c2x5IGl0IHdvdWxkIGFsd2F5cyBkZWZhdWx0CiAgICAgICAgdG8gdHJ1ZSwgbWFraW5nIGl0IGZhaWwgd2hlbiB0aGVyZSB3YXMgYSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZQogICAgICAgIGF0IHRoZSBvdGhlciBlbmQuCgogICAgICAgICogQWRkZWQgYW4gVVRGLTggY2hlY2sgdG8gU3BhbUZpbHRlciB0byBjYXRjaCBib3RzIHdoaWNoIG11bmdlCiAgICAgICAgVVRGLTggYW5kIGNhdXNlIG1ham9yIGJyZWFrYWdlLi4uCgogICAgICAgICogRml4ZWQgc29tZSBpc3N1ZXMgd2l0aCB0aGUgcGFzc3dvcmQgcmVjb3ZlcnkgZW1haWwgbG9jYWxpemF0aW9ucy4KCjIwMDctMTEtMyAgRGlyayBGcmVkZXJpY2t4IChkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tKQoKICAgICAgICAqIDIuNS4xNTAgLSBzbWFsbCB0ZW1wbGF0ZSBmaXhlcwoKICAgICAgICAqIElFNiBzdHVmZjogZml4ZWQgdGhlIGhlaWdodCBvZiBhY3Rpb25zVG9wCgogICAgICAgICogU21hcnQgc2tpbjogc2VhcmNoYm94IGRpZG4ndCBzaG93IHVwLCBzZXZlcmFsIHN0eWxlIGFsaWdubWVudHMgd2l0aCB2YW5pbGxhIHRlbXBsYXRlCgogICAgICAgICogRmluaXNoLCBTcGFuaXNoLCBHZXJtYW4gSTE4biA6IHJlbW92ZWQgc29tZSBvYnNvbGV0ZSA8YnIgLz4gdGFncyBbSlNQV2lraS0xN10KCjIwMDctMTEtMSAgRGlyayBGcmVkZXJpY2t4IChkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tKQoKICAgICAgICAqIDIuNS4xNDkgLSB2YXJpb3VzIGllNiBmaXhlcyBpbiBjc3MgYW5kIGphdmFzY3JpcHQKCiAgICAgICAgKiBUaGUgQWNjb3JkaW9uIHN0eWxlIG5vdyBzdXBwb3J0IGR5bmFtaWMgY29udGVudC4gSW93LCBhY2NvcmRpb24gc2VjdGlvbnMKICAgICAgICB3aWxsIGR5bmFtaWNhbGx5IGdyb3cvc2hyaW5rIHdpdGggZHluYW1pYyBjb250ZW50IHN1Y2ggYXMgY29sbGFwc2libGUgbGlzdHMgb3IgYm94ZXMuCgogICAgICAgICogVGhlIGJvZHkgb2YgYSBwYWdlIGFuZCB0aGUgSW5mbyB0YWIgaGF2ZSBnb3R0ZW4gYSBjc3Mgb3ZlcmZsb3c6YXV0byBzdHlsZS4gdG8gc3VwcG9ydCB3aWRlIHBhZ2VzLgogICAgICAgIFdoZW4gY29udGVudHMgYmVjb21lcyB0b28gd2lkZSAoZWcgd2lkZSB0YWJsZXMpIHRoZSBwYWdlY29udGVudCB3aWxsIG92ZXJmbG93IGhvcml6b250YWxseQogICAgICAgIHdpdGggc2Nyb2xsYmFycyBhdCB0aGUgYm90dG9tIG9mIHRoZSBwYWdlLgogICAgICAgIEFkZCBzbWFsbCBpZTYgZml4IGZvciB3aWRlIHByZWZvcm1hdHRlZCB7e3tibG9ja3N9fX0KICAgICAgICBGb3IgaWU2LCBzcGVjaWZpYyBwcm9wcmlldGFyeSBvdmVyZmxvdy14IHN0eWxlIGlzIHVzZWQuCgogICAgICAgICogTG9uZyB2YWx1ZXMgaW4gdGFibGUgZmlsdGVyIGRyb3Bkb3ducyBhcmUgdHJpbW1lZCB0byBtYXhpbXVtIDMyY2hhcnMuIFRoaXMgd2lsbCByZWR1Y2UKICAgICAgICB0aGUgb2NjdXJhbmNlIG9mIHdpZGUgdGFibGVzIGluIGVnIFBhZ2UgSW5mbyB0YWIuCgogICAgICAgICogQWRkZWQgc2xpbWJveCBpY29uIGdpZnMgZm9yIGllIG9ubHkuCgogICAgICAgICogSUU2IENvbGxhcHNpYmxlIExpc3QgaXMgd29ya2luZyBhZ2Fpbi4gKGZpbmFsbHkpCgogICAgICAgICogSUU2IExheW91dCBvZiB0aGUgRWRpdCBhbmQgTW9yZSB0YWJzIGlzIG5vdyBwcm9wZXJseSBhbGlnbmVkIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHBhZ2UgYm9yZGVyCgogICAgICAgICogRml4ZWQgdGhlIG1vdXNlLXNlbGVjdGlvbiBidWcgb24gdGhlIGVkaXQgdGV4dGFyZWEsIGZvciBpZTYuCgogICAgICAgICogSW1wcm92ZWQgZWRpdG9yIHRvb2xiYXIgaGFuZGxpbmcgZm9yIGllNiwgd2l0aCBiZXR0ZXIgaGFuZGxpbmcgb2Ygc2VsZWN0ZWQgdGV4dCBpbiB0aGUgdGV4dGFyZWEuCiAgICAgICAgW0JVR1pJTExBIEJVRyAxMThdCgoKMjAwNy0xMC0zMCAgRGlyayBGcmVkZXJpY2t4IChkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tKQoKICAgICAgICAqIDIuNS4xNDggLSBpZTYgZml4ZXMgY29udCdkCgogICAgICAgICogUmVwbGFjaW5nIHNldmVyYWwgLnBuZyBpY29ucyBieSAuZ2lmIHZhcmlhbnRzLCB3aGljaCBhcmUgYmV0dGVyIHN1cHBvcnRlZAogICAgICAgIGFjcm9zcyBicm93c2Vycy4gVGhlIHdhcm5pbmcgYW5kIGVycm9yIGljb25zIHdlcmUgc3dhcHBlZC4gKHJlcG9ydGVkIGJ5IE11cnJheSkKCiAgICAgICAgKiBBZGRlZCBhIHNtYWxsIGZpeCBvbiB3aWRlIHBhZ2VzIHdpdGgge3t7YmxvY2tzfX19CgoyMDA3LTEwLTI5ICBEaXJrIEZyZWRlcmlja3ggKGRpcmsuZnJlZGVyaWNreEBnbWFpbC5jb20pCgogICAgICAgICogMi41LjE0NyAtIG1vcmUgSUU2IGZpeGVzCgogICAgICAgICAqIFBhZ2VzIHdpdGggd2lkZSBwcmVmb3JtYXR0ZWQge3t7dGV4dCBibG9ja3N9fX0gd2hlcmUgbm90IG92ZXJmbG93aW5nIGNvcnJlY3RseSBvbiBpZTYuCiAgICAgICAgIFtKU1BXaWtpLTJdCgogICAgICAgICAqIE1vcmUgdXBkYXRlcyBvbiBjb2xsYXBzaWJsZSBsaXN0cyBmb3IgaWU2LiBNb3JlIHRlc3RpbmcgcmVxdWlyZWQuCgogICAgICAgICAqIEZpeGVkIHRoZSBTZWFyY2hCb3hNZW51IHRvIGVuc3VyZSBwcm9wZXIgd2lkdGggb24gaWU2CgoKIDIwMDctMTAtMjcgIERpcmsgRnJlZGVyaWNreCAoZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbSkKCiAgICAgICAgKiAyLjUuMTQ2IC0gbW9yZSBJRTYgZml4ZXMgYW5kIHNtYWxsIGd1aSB1cGRhdGVzCgogICAgICAgICAqIFJlZmFjdG9yZWQgY29sbGFwc2libGUgbGlzdHMgaW4gdmlldyBvZiBpZSBjb21wYXRpYmlsaXR5LgogICAgICAgICAqIEltcHJvdmVkIGxheW91dCBjb25zaXN0ZW50Y3kgb2YgdGhlIHF1aWNrIG5hdmlnYXRpb24gYWN0aW9uIGJ1dHRvbnMKICAgICAgICAgKiBSZXNvbHZlZCBkb3VibGUgbG9hZGluZyBvZiBwcmludC5jc3MuIChjb21tb25oZWFkZXIuanNwKQoKCjIwMDctMTAtMjYgIERpcmsgRnJlZGVyaWNreCAoZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbSkKCiAgICAgICAgKiAyLjUuMTQ1IC0gbWFueSBJRTYgZml4ZXMgYW5kIHNtYWxsIGd1aSB1cGRhdGVzCgogICAgICAgICogSGVhZGluZyByZW5kZXJlZCB3cm9uZyBpbiBJRTYsIGJlY2F1c2UgSUUgZG9lc24ndCBsaWtlIGZsb2F0cyB3aXRoIG1hcmdpbnMuCiAgICAgICAgW0pTUFdJS0ktNF0KICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBtb3JlLW1lbnUgaXMgaGlkZGVuIGJ5IGRlZmF1bHQsIHRvIGF2b2lkIGJ1bXB5IHNjcmVlbiByZW5kZXJpbmcKICAgICAgICBmb3Igc2xvd2VyIHBhZ2UgbG9hZHMuIFtKU1BXaWtpLTldCiAgICAgICAgKiBUYWJiZWRTZWN0aW9ucyBpbiBJRTYgaGFkIGFubm95aW5nIGFkZGl0aW9uYWwgc3BhY2luZyBiZXR3ZWVuIHRhYiBhbmQgYm9keQoKICAgICAgICAqIEJVR1pJTExBIDExNTogVVJMIENvbnN0cnVjdG9yIGNvbXBhdGliaWxpdHkgaXMgZml4ZWQgZm9yIEFqYXggZW5hYmxlZCBzZWFyY2hlcy4KCiAgICAgICAgKiBBbGlnbiBsb29rIG4gZmVlbCBvZiBjb2xsYXBzaWJsZSBsaXN0cywgYm94ZXMgYW5kIGFjY29yZGlvbnMuCiAgICAgICAgQWxsIGhvdmVyZWQgYWN0aW9ucyBub3cgZ2V0IGEgY29uc2lzdGVudCwgbmV1dHJhbCBjb2xvciwgaW5zdGVhZCBvZiB0aGUgcHJldmlvdXMgb3JhbmdlIHRpbnQuCiAgICAgICAgKHJlcG9ydGVkIGJ5IE11cnJheSBBbHRoZWltKQoKICAgICAgICAqIENvbGxhcHNpYmxlQm94IHVwZGF0ZTogeW91IGNhbiBub3cgY2xpY2sgYW55d2hlcmUgb24gdGhlIHRpdGxlIG9mIGEgY29sbGFic2libGUgYm94CiAgICAgICAgdG8gb3BlbiBvciBjbG9zZSBpdC4gUHJldmlvdXNseSwgeW91IGhhZCB0byBoaXQgdGhlICsvLSBjb2xsYXBzZSBidXR0b24uCgogICAgICAgICogVGhlICUlY2F0ZWdvcnkgbm93IHN1cHBvcnRzIGFueSB1cmwgY29uc3RydWN0b3IgdHlwZS4gKHdhcyBmYWlsaW5nIG9uIGpzcHdpa2kub3JnKQogICAgICAgIFRoZSBsb29rICduIGZlZWwgb2YgdGhlIGNhdGVnb3J5IHBvcHVwIGhhcyBiZWVuIGFsaWduZWQgd2l0aCBUaXAtU3R5bGUuCiAgICAgICAgKG5vIG1vcmUgb3JhbmdlLCBidXQgdHJhbnNwYXJlbnQgZGFyayBncmV5KQoKICAgICAgICAqIFRoZSBSZWRvL1VuZG8gYnV0dG9ucyBhcmUgbW92ZWQgdG8gdGhlIHRvcCBvZiB0aGUgRWRpdC5qc3AgZm9ybSwgYmVjYXVzZSB0aGV5IGZ1bmN0aW9uCiAgICAgICAgaXJyZXNwZWN0aXZlIG9mIHRoZSBzZWFyY2ggZnVuY3Rpb25zLgoKICAgICAgICAqIFRPQyBoYXMgYmVjb21lIGEgZmxvYXRpbmcgZWxlbWVudCwgc3VjaCB0aGF0IGNvbW1lbnRib3hlcyBhbmQgdG9jJ3MgY2FuIG5pY2VseQogICAgICAgIGZsb2F0IG5leHQgdG8gZWFjaC1vdGhlci4gRG93bnNpZGUgaXMgdGhhdCwgd2hlbiBlbnRlcmluZyB0ZXh0IHJpZ2h0IGFmdGVyIGEgVE9DLCB0aGUgdGV4dCB3aWxsCiAgICAgICAgZmxvYXQgbmV4dCB0byB0aGUgdG9jLiBUbyBwcmV2ZW50IHRoaXMsIHlvdSBjYW4gYWx3YXlzIGVudGVyIGEgXFwgKHdpa2kgbGluZWJyZWFrKSB3aGljaAogICAgICAgIHdpbGwgbmljZWx5IHB1c2ggdGhlIGNvbnRlbnRzIHVuZGVyIGFueSBmbG9hdC4gKGNsZWFyOmJvdGgpICBbSlNQV2lraS0xXQoKICAgICAgICAqIGFkZGVkIDIgbmV3IGkxOG4gcmVzb3VyY2VzCiAgICAgICAgamF2YXNjcmlwdC5zbGltYm94LnByZXZpb3VzPSZsYXF1bztQcmV2aW91cwogICAgICAgIGphdmFzY3JpcHQuc2xpbWJveC5uZXh0PU5leHQmcmFxdW87CgoyMDA3LTEwLTI0ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNS4xNDQKCiAgICAgICAgKiBTcGFtRmlsdGVyIG5vdyBoYXMgdGhlIGFiaWxpdHkgdG8gY2hlY2sgYWdhaW5zdCBhbGwgdGhlCiAgICAgICAgdGVzdHMgYnkgc2V0dGluZyA8c3RyYXRlZ3k+c2NvcmU8L3N0cmF0ZWd5Pi4KCjIwMDctMTAtMTMgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi41LjE0MwoKICAgICAgICAqIFNvbWUgYWRkaXRpb25hbCBpbXByb3ZlbWVudHMgdG8gU3BhbUZpbHRlciwgd2hpY2ggbm93CiAgICAgICAga2VlcHMgdHJhY2sgb2YgdXNlciBzZXNzaW9ucyBhbmQgc3RvcmVzIHNvbWUgZGF0YSBpbiBpdAogICAgICAgICh5ZXMsIEknbSBiZWluZyBhIGJpdCB2YWd1ZSBoZXJlIG9uIHB1cnBvc2UpLgoKICAgICAgICAqIDIuNS4xNDIKCiAgICAgICAgKiBDb21iaW5lZCBlZGl0dGltZSBhbmQgYWRkciBmaWVsZHMgaW50byBvbmUgaGFzaCB2YWx1ZS4KCiAgICAgICAgKiBBbHNvIGltcHJvdmVkIGVkaXQgcHJvY2VzcyBzbGlnaHRseSB0byBjYXRjaCBib3RzLgoKICAgICAgICAqIFNwYW1GaWx0ZXIgbm93IGFsc28gbWF0Y2hlcyBhZ2FpbnN0IHRoZSBJUCBhZGRyZXNzLgoKMjAwNy0wOS0yNSAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjUuMTQxCgogICAgICAgICogQWRkZWQgTXVycmF5J3MgcGF0Y2ggdG8gYWxsb3cgYmV0dGVyIGV4dGVuc2liaWxpdHkgZm9yCiAgICAgICAgTHVjZW5lU2VhcmNoUHJvdmlkZXIuCgoyMDA3LTA5LTIzICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNS4xNDAKCiAgICAgICAgKiBGaXhlZCBpc3N1ZSB3aXRoIGRlcGxveS9yZWRlcGxveSAtIHJlbW92ZWQgYSB0aHJvd24gZXhjZXB0aW9uCiAgICAgICAgaW4gV2F0Y2hEb2csIGFuZCBtYWRlIHRoZSBBZG1pbkJlYW5zIHByb3Blcmx5IHVucmVnaXN0ZXIgdXBvbgogICAgICAgIHNodXRkb3duLgoKMjAwNy0wOS0xOSAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiBVcGRhdGVkIEZpbm5pc2ggbG9jYWxpemF0aW9uCgoyMDA3LTA5LTE4ICBKdWFuIFBhYmxvIFNhbnRvcyAoanVhbnBhYmxvLnNhbnRvc0BnbWFpbC5jb20pCgogICAgICAgICogRml4ZWQgYSBwYWlyIG9mIHR5cG9zOiB1c2Ugb2YgdG9tY2F0Lmhvc3QgJiBwb3J0IGluc3RlYWQgb2YgbG9jYWxob3N0OjgwODAgaW4KICAgICAgICBidWlsZC54bWwgKyBjdnMucm9vdCBwcm9wZXJ0eSBwb2ludGluZyB0byBjdnMuanNwd2lraS5vcmcgaW5zdGVhZCBvZgogICAgICAgIGdyZXkuZWN5cmQuY29tIGFuZCBvbmUgbW9yZSBsb2NhbGl6ZWQgc3RyaW5nIGF0IENvcmVSZXNvdXJjZXMucHJvcGVydGllcywKCQkgICAgLSBtYXJrdXBwYXJzZXIubGluay5jcmVhdGUgPSBDcmVhdGUgJiMzOTt7MH0mIzM5OwoKMjAwNy0wOS0xNiAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjUuMTM5CgogICAgICAgICogW0JVRyAxMzZdOiBGaXhlZCBzZXZlcmFsIFhTUyB2dWxuZXJhYmlsaXRpZXMgaW4gcGxhaW4uanNwLAogICAgICAgIGNvbW1vbmhlYWRlci5qc3AsIEdyb3VwQ29udGVudC5qc3AsIEVkaXRHcm91cENvbnRlbnQuanNwLAogICAgICAgIEluZm9Db250ZW50LmpzcCwgTmV3R3JvdXBDb250ZW50LmpzcCwgVmFyaWFibGVUYWcsIFVzZXJQcm9maWxlVGFnCiAgICAgICAgYW5kIE1lc3NhZ2VzVGFnLiAgUmVwb3J0ZWQgYnkgSmFzb24gS3JhdHplci4KCiAgICAgICAgKiBGaXhlcyBhIGxvY2FsIHBhdGggZGlzY2xvc3VyZSB2dWxuZXJhYmlsaXR5IGluCiAgICAgICAgQmFzaWNBdHRhY2htZW50UHJvdmlkZXIuICBSZXBvcnRlZCBieSBKYXNvbiBLcmF0emVyLgoKICAgICAgICAqIFVwZGF0ZWQgRmlubmlzaCBsb2NhbGl6YXRpb24KCiAgICAgICAgKiBBbHNvIGZpeGVkIGEgbnVtYmVyIG9mIGluc3RhbmNlcyBvZiBhcG9zdHJvcGhlICgnKSB1c2UgaW4KICAgICAgICBsb2NhbGl6YXRpb24gZmlsZXMgLSBiZXR0ZXIgdG8gdXNlICYjMzk7IHRvIGF2b2lkIGxvYWRzIG9mIG5hc3RpbmVzcwogICAgICAgIHdpdGggY2VydGFpbiBjb25zdHJ1Y3Rpb25zLgoKMjAwNy0wOS0xNCAgSnVhbiBQYWJsbyBTYW50b3MgKGp1YW5wYWJsby5zYW50b3NAZ21haWwuY29tKQoKICAgICAgICAqIDIuNS4xMzgKCiAgICAgICAgKiBMb2NhbGl6ZWQgUmVmZXJyaW5nIFBhZ2VzIGFuZCBDdXJyZW50IFRpbWUgcGx1Z2lucyAoYWdhaW4sIHN0cmFuZ2VseSBlbm91Z2gsCiAgICAgICAgdGhlIHBsdWdpbnMnIHRleHRzIHdlcmUgYWxyZWFkeSBpbiB0aGUgcmVzb3VyY2UgZmlsZS4pLiBVcGRhdGVkCiAgICAgICAgcmVmZXJyaW5ncGFnZXNwbHVnaW4ubW9yZSBsb2NhbGl6ZWQgdGV4dCwgaXQgd2FzIGxvb2tpbmcgZm9yIHR3byBwYXJhbWV0ZXJzIGFuZAogICAgICAgIHRoZSBwbHVnaW4gdXNlcyBvbmx5IG9uZS4KCiAgICAgICAgKiBMb2NhbGl6ZWQgYWxzbyBGb3JtcyBQbHVnaW5zLCBKU1BXaWtpTWFya3VwUGFyc2VyLCBQbHVnaW5Db250ZW50LAogICAgICAgIFRyYW5zbGF0b3JSZWFkZXIgYW5kIFBsdWdpbk1hbmFnZXIuIE5ldyBsb2NhbGl6ZWQgc3RyaW5nczoKICAgICAgICArIENvcmVSZXNvdXJjZXMucHJvcGVydGllcwoJCSAgICAjIEpTUFdpa2lNYXJrdXBQYXJzZXIKCQkgICAgLSBtYXJrdXBwYXJzZXIuZXJyb3IuaW52YWxpZHNldCA9IEludmFsaWQgU0VUIGZvdW5kOiB7MH0KCQkgICAgLSBtYXJrdXBwYXJzZXIuZXJyb3Iubm9pbnRlcndpa2lyZWYgPSBObyBJbnRlcldpa2kgcmVmZXJlbmNlIGRlZmluZWQgaW4KCQkgICAgCQlwcm9wZXJ0aWVzIGZvciBXaWtpIGNhbGxlZCAnezB9JyEKCQkgICAgLSBtYXJrdXBwYXJzZXIuZXJyb3IucGFyc2VyZmFpbHVyZSA9IFBhcnNlciBmYWlsZWQ6IHswfQoJCSAgICAtIG1hcmt1cHBhcnNlci5lcnJvci5qYXZhc2NyaXB0YXR0ZW1wdCA9IEF0dGVtcHQgdG8gb3V0cHV0IGphdmFzY3JpcHQhCgkJKyBQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcwoJCQkjIEZvcm1zIFBsdWdpbnMKCQkgICAgLSBmb3JtY2xvc2Uubm9uZWVkdG9zaG93ID0gKG5vIG5lZWQgdG8gc2hvdyBjbG9zZSBub3cpCgkJICAgIC0gZm9ybWlucHV0Lm5hbWVtaXNzaW5nID0gSW5wdXQgZWxlbWVudCBpcyBtaXNzaW5nIHBhcmFtZXRlciAnbmFtZScuCgkJICAgIC0gZm9ybWlucHV0Lm5vbmVlZHRvc2hvdyA9IChubyBuZWVkIHRvIHNob3cgaW5wdXQgZmllbGQgbm93KQoJCSAgICAtIGZvcm1vcGVuLm1pc3NpbmdwYXJhbSA9IFRoZSBGb3JtT3BlbiBlbGVtZW50IGlzIG1pc3NpbmcgdGhlICd7MH0nCgkJICAgIAkJcGFyYW1ldGVyLgoJCSAgICAtIGZvcm1vcGVuLnBvc3RvcmdldG9ubHkgPSBNZXRob2QgbXVzdCBiZSBlaXRoZXIgJ3Bvc3QnIG9yICdnZXQnCgkJICAgIC0gZm9ybW9wZW4ubm9uZWVkdG9zaG93ID0gKG5vIG5lZWQgdG8gc2hvdyBmb3JtIG9wZW4gbm93KQoJCSAgICAtIGZvcm1vdXRwdXQubWlzc2luZ2FyZ3VtZW50ID0gQXJndW1lbnQgJ3swfScgcmVxdWlyZWQgZm9yIEZvcm0gcGx1Z2luCgkJICAgIC0gZm9ybXNlbGVjdC5uYW1lbWlzc2luZyA9IFNlbGVjdCBlbGVtZW50IGlzIG1pc3NpbmcgcGFyYW1ldGVyICduYW1lJy4KCQkgICAgLSBmb3JtdGV4dGFyZWEubm9uZWVkdG9zaG93ID0gKG5vIG5lZWQgdG8gc2hvdyB0ZXh0YXJlYSBmaWVsZCBub3cpCgkJICAgIC0gZm9ybXRleHRhcmVhLm5hbWVtaXNzaW5nID0gVGV4dGFyZWEgZWxlbWVudCBpcyBtaXNzaW5nIHBhcmFtZXRlciAnbmFtZScuCgogICAgICAgICogV2ViIHRlc3RzIG5vIGxvbmdlciByZXF1aXJlIHRoZSBzZXJ2bGV0IGNvbnRhaW5lciB0byBiZSBydW5uaW5nIGF0CiAgICAgICAgaHR0cDovL2xvY2FsaG9zdDo4MDgwLy4gTm93IHlvdSBjYW4gc2V0IGhvc3QgJiBwb3J0IGF0IHRoZSBidWlsZC5wcm9wZXJ0aWVzCiAgICAgICAgZmlsZSBpbmRpY2F0ZWQgaW4gYnVpbGQueG1sCgoyMDA3LTA5LTA5ICBEaXJrIEZyZWRlcmlja3ggKGRpcmsuZnJlZGVyaWNreEBnbWFpbC5jb20pCgogICAgICAgICogMi41LjEzNwoKICAgICAgICAqIEZldyBqYXZhc2NyaXB0IGZpeGVzIGZvciBpbXByb3ZlZCBVUkwgY29uc3RydWN0b3IgY29tcGF0aWJpbGl0eSBbIEJVRyAxMTUgXQogICAgICAgIFRoZSBnZW5lcmF0ZWQgbGlua3MgaW4gdGhlIGFqYXggc2VhcmNoIGRyb3Bkb3duIGFyZSBub3cgY29tcGF0aWJsZSB3aXRoCiAgICAgICAgdGhlIHNlbGVjdGVkIFVSTCBjb25zdHJ1Y3Rvci4KCiAgICAgICAgKiBNb3JlIElFIGZpeGVzIHRvIGltcHJvdmUgcmVuZGVyaW5nIG9mIGZsb2F0cy4gKCByZWYuIElFNiBwZWVrYWJvbyBidWcgKQoKCjIwMDctMDktMDggIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi41LjEzNgoKICAgICAgICAqIEQnb2gsIGR1ZSB0byBzb21lIGRlYnVnIGNvZGUgbGVmdCBpbiBDb29raWVBdXRoZW50aWNhdGlvbkxvZ2luTW9kdWxlLAogICAgICAgIGl0IHdhcyBleHBpcmluZyBzZXNzaW9ucyBpbiAzMCBzZWNvbmRzLgoKICAgICAgICAqIEFkbWluVUkgbm93IHNob3dzIGFsbCBrbm93biBwbHVnaW5zIGFuZCB3aGV0aGVyIHRoZXkgYXJlIGNvbXBhdGlibGUKICAgICAgICB3aXRoIHRoaXMgdmVyc2lvbiBvZiBKU1BXaWtpLiAgV2lraVdpemFyZCBhbHNvIGdhaW5zIGFuIEFkbWluQmVhbgogICAgICAgICh0aG91Z2ggaXQgZG9lc24ndCBkbyBhbnl0aGluZykuCgoyMDA3LTA5LTA0ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNS4xMzUKCiAgICAgICAgKiBbQnVnIDEzNV06IFR1cm5lZCBvdXQgdG8gYmUgYSBmYXVsdHkgcXVvdGUgaW4gRmlubmlzaCB0cmFuc2xhdGlvbi4KCiAgICAgICAgKiBbQnVnIDEzNF06IERpdHRvLgoKMjAwNy0wOS0wMyAgRGlyayBGcmVkZXJpY2t4IChkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tKQoKICAgICAgICAqIDIuNS4xMzQKCiAgICAgICAgKiBGaXhlZCB0aGUgSlNPTi1SUEMgdXJsLCB0byBiZSBpbmRlcGVuZGVudCBvbiB0aGUgdXJsIGNvbnN0cnVjdG9yCgoyMDA3LTA5LTAyICBKdWFuIFBhYmxvIFNhbnRvcyAoanVhbnBhYmxvLnNhbnRvc0BnbWFpbC5jb20pCgogICAgICAgICogMi41LjEzMwoKICAgICAgICAqIFtCdWcgMTMzXTogUmVsZWFzZS5pc09sZGVyT3JFcXVhbCgpIHdhcyBub3QgY29tcGFyaW5nIHJldmlzaW9ucwogICAgICAgIHByb3Blcmx5IGFuZCwgaW4gdGhlIGVuZCwgRWRpdG9ycyB3ZXJlIG5vdCByZWdpc3RlcmluZy4gU29tZXRoaW5nCiAgICAgICAgc2ltaWxhciB3YXMgaGFwcGVuaW5nIHdpdGggUmVsZWFzZS5pc05ld2VyT3JFcXVhbCgpLCBmaXhlZCBhcyB3ZWxsLgoKICAgICAgICAqIFtCdWcgMTIyXTogUGFydGx5IGZpeGVkLiBQcmVmZXJlbmNlcyBmb3IgZGVmYXVsdCB0ZW1wbGF0ZSBhcmUgbm93IHJlYWRlZAogICAgICAgIGZyb20ganNwd2lraS5wcm9wZXJ0aWVzIGluc3RlYWQgb2YgYmVpbmcgaGFyZGNvZGVkIGluCiAgICAgICAgY29tLmVjeXJkLmpzcHdpa2kucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXMuIENmci4gd2l0aCBqc3B3aWtpLnByb3BlcnRpZXMudG1wbAogICAgICAgIGxpbmVzIDI1OCAtIDI2MS4KCiAgICAgICAgKiBVcGRhdGVkIGVzX0VTIGxvY2FsZXMKCjIwMDctMDktMDIgIERpcmsgRnJlZGVyaWNreCAoZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbSkKCiAgICAgICAgKiAyLjUuMTMyCgogICAgICAgICogRml4ZWQgc2VhcmNoIG1lbnUgZm9yIFNtYXJ0IHNraW4uIChpbXByb3ZlIGNvbXBhdC4gd2l0aCBJRSkKCgoyMDA3LTA5LTAxICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNS4xMzEKCiAgICAgICAgKiBbQnVnIDEzMV06IEFkZGVkIEhhcnJ5IE1ldHNrZSdzIHBhdGNoIHRvIGFsbG93ICJleGNsdWRlYXR0YWNobWVudHMiCiAgICAgICAgb24gVW51c2VkUGFnZXNQbHVnaW4gZm9yIHRob3NlIHdobyBuZWVkIGl0LgoKICAgICAgICAqIFVwZGF0ZWQgRmlubmlzaCBsb2NhbGl6YXRpb24uCgoyMDA3LTA5LTAxICBEaXJrIEZyZWRlcmlja3ggKGRpcmsuZnJlZGVyaWNreEBnbWFpbC5jb20pCgogICAgICAgICogMi41LjEzMAoKICAgICAgICAqIEZpeGVkIG1pc3NpbmcgaHRtbCBhdHRyaWIgaW4gTG9zdFBhc3N3b3JkIHRhYgoKICAgICAgICAqIFRoZSBFZGl0IGZpbmRTdWdnZXN0aW9uTWVudSBoYXMgYmVlbiBtb3ZlZCBpbnRvIHRoZSBGYXZvcml0ZXMsCiAgICAgICAgc28gaXQgbmljZWx5IGFjY29tb2RhdGVzIHdpdGggTGVmdCBvciBSaWdodCBwb3NpdGlvbiBvZiB0aGUgZmF2b3JpdGVzIGJsb2NrLgoKICAgICAgICAqIFsgQlVHIDEzMiBdIENvbGxhcHNhYmxlIGxpc3RzIGFuZCBib3hlcyBub3cgYWxzbyBhcmUgcmVuZGVyZWQgaW4gcHJldmlldyBtb2RlCgogICAgICAgICogWyBCVUcgMTIzIF0gQWRkZWQgYSBjb25maXJtIGJveCBpbiBjYXNlIHlvdSBjbGljayBhd2F5cyBmcm9tIHRoZSBwYWdlIHdpdGhvdXQgc2F2aW5nLgogICAgICAgIFdoZW4geW91IGxlYXZlIHRoZSBlZGl0IHNlc3Npb24gd2l0aG91dCBmaXJzdCBzYXZpbmcgeW91ciBjaGFuZ2VlcyAoZWcgY2xpY2tpbmcgdGhlCiAgICAgICAgSW5mbyB0YWIsIGNsaWNraW5nIGFueSBwYWdlIGxpbmssIGV0Yy4pIGEgcG9wdXAgd2luZG93IGFza3MgeW91IHRvIGNvbmZpcm0uCgogICAgICAgIGphdmFzY3JpcHQuZWRpdC5hcmV5b3VzdXJlPVdpdGhvdXQgY2xpY2tpbmcgdGhlIFNhdmUgYnV0dG9uLCB5b3VyIGNoYW5nZXMgd2lsbCBiZSBsb3N0LiBcCiAgICAgICAgICAgIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBleGl0IHRoaXMgcGFnZT8KCiAgICAgICAgKiBbIEJVRyAxMjYgXSBSZW1vdmUgJ3NwdXJpb3VzJyBjc3MgZXJyb3JzLgoKMjAwNy0wOC0yOCAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjUuMTI5CgogICAgICAgICogRml4ZWQgYSBudW1iZXIgb2YgYnVncyBpbiB0aGUgU3BhbUZpbHRlciwgYW5kIGFkZGVkIGF1dG9tYXRpYwogICAgICAgIGJvdCBkZXRlY3Rpb24gYWNjb3JkaW5nIHRvIGlkZWEgZnJvbQogICAgICAgIGh0dHA6Ly93d3cubW9kZXJuYmx1ZWRlc2lnbi5jb20vd2ViLWRlc2lnbi1ibG9nL2ZpZ2h0aW5nLXNwYW0td2l0aC1jc3MvCgogICAgICAgICogU3BhbUZpbHRlciBjYXB0Y2hhIGlzIG5vdyB1c2VyLXNldHRhYmxlLiAgUG9zc2libGUgb3B0aW9ucwogICAgICAgIGFyZSAibm9uZSIgYW5kICJhc2lycmEiLgoKICAgICAgICAqIDIuNS4xMjgKCiAgICAgICAgKiBBZGRlZCBTZWFyY2hNYW5hZ2VyQmVhbiB0byB0aGUgYWRtaW4gVUkuICBJdCdzIG5vdyBwb3NzaWJsZQogICAgICAgIHRvIGZvcmNlIGEgcmVpbmRleCBvZiBhbGwgcGFnZXMsIGVpdGhlciBmcm9tIHlvdXIgTUJlYW4gbWFuYWdlcgogICAgICAgIG9yIHRoZSBBZG1pbiBVSS4KCjIwMDctMDgtMjcgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi41LjEyNwoKICAgICAgICAqIExvZ2luIHJlZGlyZWN0aW9ucyB3ZXJlIGZhaWxpbmc7IGZpeGVkIHdpdGggc29tZSBidWJibGUgZ3VtLgoKMjAwNy0wOC0yNiAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjUuMTI2CgogICAgICAgICogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uczogUGFnZVBlcm1pc3Npb24gY29uc3RydWN0b3IKICAgICAgICBubyBsb25nZXIgdXNlcyBTdHJpbmcuc3BsaXQoKSBidXQgU3RyaW5nVXRpbHMuc3BsaXQoKS4KICAgICAgICBTdHJpbmcuc3BsaXQoKSBpcyBhIHJlZ2V4cCBmdW5jdGlvbiwgYW5kIHRoZXkncmUgYWx3YXlzCiAgICAgICAgZXhwZW5zaXZlLgoKMjAwNy0wOC0yNiAgRGlyayBGcmVkZXJpY2t4IChkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tKQoKICAgICAgICAqIDIuNS4xMjUKCiAgICAgICAgKiBBZGQgVXNlckJveC5qc3AKCiAgICAgICAgKiBTcGFjZXMgc2hvdWxkIG5vdCBicmVhayBhY3Rpb24gYnV0dG9ucyBzdWNoIGFzICdMb2cgSW4nIG9yICdNeSBQcmVmcycuCiAgICAgICAgKHJlcG9ydGVkIGJ5IE11cnJheSBBbHRoZWltKQoKICAgICAgICAqIFtCdWcgMTIwXSA6IEZpeCB1bmJhbGFuY2VkIEpTUCBzaW5nbGUgb3IgZG91YmxlIHF1b3RlJ3MuIChlZyBvbiBXZWJzcGhlcmUgb3IgQkVBKQoKMjAwNy0wOC0yNSAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjUuMTI0CgogICAgICAgICogW0J1ZyA4OV06IFJlbW92ZWQgVGVzdCBwbHVnaW4gKG5vdyB0aGF0IElmUGx1Z2luIGNhbiBkbyBhbGwgdGhlCiAgICAgICAgc2FtZSB0aGluZ3MpLgoKICAgICAgICAqIFtCdWcgMzJdOiBMdWNlbmVTZWFyY2hQcm92aWRlciBub3cgYWxzbyBpbmRleGVzIHRoZSBwYWdlCiAgICAgICAgd2l0aCBhbGwgdGhlIG5vbi1sZXR0ZXJzIHJlbW92ZWQuCgogICAgICAgICogW0J1ZyAxMjFdOiBSU1MucmRmIGlzIG5vdyBvbmx5IGdlbmVyYXRlZCBvZiBwYWdlcyB0byB3aGljaAogICAgICAgIHRoZSBBbm9ueW1vdXMgdXNlciBoYXMgYWNjZXNzIHRvLgoKMjAwNy0wOC0yNCAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjUuMTIzCgogICAgICAgICogQWRkZWQgTXVycmF5J3MgcGF0Y2ggdG8gYWxsb3cgc3RhdGljIGNhbGxpbmcgb2YgSWZQbHVnaW4uCgoyMDA3LTA4LTIyICBEaXJrIEZyZWRlcmlja3ggKGRpcmsuZnJlZGVyaWNreEBnbWFpbC5jb20pCgogICAgICAgICogMi41LjEyMgoKICAgICAgICAqIFtCdWcgMTEzXTogRXJyb3Igd2l0aCAnam9pbiB3aWtpIG5vdyEnIGxpbmsgY3JlYXRpbmcgbmV3IGFjY291bnRzCgoyMDA3LTA4LTIyICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNS4xMjEKCiAgICAgICAgKiBbQnVnIDEwXTogRml4ZWQuCgogICAgICAgICogTWFkZSBmaW5kU3VnZ2VzdGlvbk1lbnUgdHJhbnNwYXJlbnQgc2luY2UgaXQgc29tZXRpbWVzIGJsb2NrcwogICAgICAgIHRoZSB2aWV3LiAgQWxzbyByZWR1Y2VkIGZvbnRzaXplIGEgYml0LgoKMjAwNy0wOC0yMSAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjUuMTIwCgogICAgICAgICogW0J1ZyA4OV06IEFkZGVkIHN1cHBvcnQgYWxzbyBmb3IgW3tJZiB2YXI9J3h5c3N5JyBleGlzdHM9J3RydWUnfV0sCiAgICAgICAgcmVxdWVzdGVkIGJ5IERpcmsuCgogICAgICAgICogTG9jYWxpemVkIFdlYmxvZ0VudHJ5UGx1Z2luIChzdHJhbmdlbHkgZW5vdWdoLCB0aGUgcGx1Z2luIHRleHQKICAgICAgICB3YXMgYWxyZWFkeSBpbiB0aGUgcmVzb3VyY2UgZmlsZS4pCgogICAgICAgICogW0J1ZyAzOV06IEZpeGVkIHRoZSBsb2dpbiBpc3N1ZSwgYnV0IG1hbnkgdGhpbmdzIHN0aWxsIHJlbWFpbi4KCiAgICAgICAgKiBGaXhlZCBpc3N1ZSB3aXRoIGxvZ2luIGVtYWlsIHNlbmRpbmcgd2hpY2ggd2FzIHVzaW5nIGEgaGFyZC1jb2RlZAogICAgICAgIFVSTC4KCjIwMDctMDgtMTkgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi41LjExOQoKICAgICAgICAqIFtCdWcgODldOiBBZGRlZCAiZXhpc3RzIiBwYXJhbWV0ZXIgdG8gSWZQbHVnaW4uCgoyMDA3LTA4LTE5ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNS4xMTgKCiAgICAgICAgKiBbQnVnIDExMF06IFdpa2lDb250ZXh0LmNoZWNrQWNjZXNzKCkgd2FzIGRvaW5nIGRvdWJsZSBlbmNvZGluZywKICAgICAgICBhbmQgdGhlcmVmb3JlIHBhZ2VzIHdpdGggc3BhY2VzIHdvdWxkIGJlIHJldHVybmluZyB3cm9uZyBsb2dpbgogICAgICAgIFVSTHMuICBSZXBvcnRlZCBieSBBbGV4IFNhbWFkLgoKICAgICAgICAqIEZpeGVkIGEgYnVuY2ggb2YgZmFpbGluZyB1bml0IHRlc3RzIC0gdGhlIGNoYW5nZSBvZiAiZWRpdHBhZ2UiCiAgICAgICAgdG8gImNyZWF0ZXBhZ2UiIGhhZCBmb3Igc29tZSByZWFzb24gc2xpcHBlZCBldmVyeW9uZSdzIGF0dGVudGlvbi4KCjIwMDctMDgtMTcgIEp1YW4gUGFibG8gU2FudG9zIDxqdWFucGFibG8uc2FudG9zQGdtYWlsLmNvbT4KCiAgICAgICAgKiAyLjUuMTE3IC0gUGFnZSByZW5hbWluZyBjYXVzZWQgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiB1bmRlciBzb21lIGNpcmN1bXN0YW5jZXMsCiAgICAgICAgZmlsZWQgYXMgQnVnIDg1LiBGaXhlZCwgc2VlbWVkIHRvIGJlIGNhdXNlZCB3aGVuIHJlbmFtaW5nIGEgbm9uLWV4aXN0aW5nIHBhZ2UKICAgICAgICAoY2ZyLiB3aXRoIGh0dHA6Ly9idWdzLmpzcHdpa2kub3JnL3Nob3dfYnVnLmNnaT9pZD04NSkuIEFkZGVkIHNvbWUgSlVuaXQgdGVzdHMgdG8KICAgICAgICBjaGVjayB0aGlzLgoKMjAwNy0wOC0xNSAgRGlyayBGcmVkZXJpY2t4IChkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tKQoKICAgICAgICAqIDIuNS4xMTYgLSBNb3JlIGZpeGVzIGZvciBJRQoKICAgICAgICAqIE1vcmUgZml4ZXMgZm9yIGNvbGxhcHNhYmxlIGxpc3RzIGFuZCB0aGUgR3JlZXRpbmcgYm94LgoKICAgICAgICAqIFBvc2l0aW9uaW5nIG9mIHBvcHVwIG1lbnUncyBub3cgYWxzbyBjb3JyZWN0IG9uIElFLgoKICAgICAgICAqIENTUy1jbGFzc2VzIHdlcmUgYWRkZWQgcmVmbGVjdCBhbm9ueW1vdXMsIGFzc2VydGVkLCBhdXRoZW50aWNlZCBzdGF0dXMuCiAgICAgICAgVGhlIFNNQVJUIHNraW4gaGFzIHVzZXIgaWNvbnMgcmVmbGVjdGluZyB0aGUgbG9naW4gc3RhdHVzLgogICAgICAgIChzdWdnZXN0ZWQgYnkgTXVycmF5IEFsdGhlaW0pCgoKMjAwNy0wOC0xMiAgRGlyayBGcmVkZXJpY2t4IChkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tKQoKICAgICAgICAqIDIuNS4xMTUgLSBNb3JlIElFIGZpeGVzIChtb3JlIHRvIGNvbWUpCgogICAgICAgICogQ29sbGFwc2FibGUgbGlzdHMgd2VyZSBub3Qgd29ya2luZyBpbiB0aGUgY3VycmVudCBTVFJJQ1QgRFREIG1vZGUsCiAgICAgICAgZHVlIHRvIGEgcmVtYXJrYWJsZSBJRSBidWcgKHJlZi4gaHR0cDovL210LW9seW1wdXMuY29tL2VtbWV0dC9idWdfb3ZlcmZsb3dfcG9zaXRpb25yZWxhdGl2ZS5waHAgKQoKICAgICAgICAqIFRoZSBVU0VSIGdyZWV0aW5nIGJveCBuZWVkZWQgYW4gZml4LCBmb3IgSUUuCgogICAgICAgICogRml4ZWQgdGhlIHZpc2liaWxpdHkgb2YgdGhlIEF0dGFjaG1lbnQgVGFiIGZvciBJRQoKICAgICAgICAqIFRoZSBoYW5kbGluZyBvZiB0aGUgdXNlciBwcm9maWxlIENyZWF0aW9uICh1bmRlciBsb2dpbiBjb250ZXh0KSBhbmQKICAgICAgICB1c2VyIHByb2ZpbGUgbW9kaWZpY2F0aW9ucyAodW5kZXIgUHJlZiBjb250ZXh0KSBoYXMgYmVlbiBmaXhlZC4KICAgICAgICBFcnJvcnMgZHVyaW5nIGNyZWF0aW9uIG9yIHVwZGF0ZSBhcmUgbm93IHJvdXRlZCBiYWNrIHRvIHRoZSBjb3JyZWN0IGNvbnRleHRzLgoKCjIwMDctMDgtMDYgIERpcmsgRnJlZGVyaWNreCAoZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbSkKCiAgICAgICAgKiAyLjUuMTE0IC0gRmV3IElFIGZpeGVzCgogICAgICAgICogU29tZSBhbm5veWluZyBJRSBsYXlvdXQgaXNzdWVzIGZpeGVkOgogICAgICAgIFRBQiBsYXlvdXRzIGFuZCBwb3NpdGlvbmluZyBvZiBVc2VyIGdyZWV0aW5nICYgbG9naW4gJiBwcmVmcy4KICAgICAgICBUaGVyZSBpcyBzdGlsbCBhIG1ham9yIGJ1ZyBvbiB0aGUgcG9zaXRpb25pbmcgb2YgdGhlIHBvcHVwIG1lbnUncwogICAgICAgIGluIElFICB3aGljaCBtYWtlcyB0aGUgTW9yZSBtZW51IGFuZCBOYXZpZ2F0aW9uIG1lbnUncyBub3QgdXNhYmxlLgogICAgICAgIE9uZ29pbmcuCgogICAgICAgICogQ2hlY2tib3hlcyBmb3IgVGFiLWNvbXBsZXRpb24gYW5kIFNtYXJ0LXR5cGluZy1wYWlycyBhcmUgbm90CiAgICAgICAgZnVuY3Rpb25hbCBpbiBJRSwgc28gbm93IHRoZXkgYXJlIGhpZGRlbiBpbiB0aGF0IGJyb3dzZXIuIChCVUcgMTAzKQoKICAgICAgICAqIEFkZGVkIHRoZSBMb2dpbkhlbHAgcGFnZS4KCiAgICAgICAgKiBFbnN1cmUgeGh0bWwgY29tcGxpYW5jZSB3aGVuIHN1cHByZXNzaW5nIHRoZSBQYWdlQWN0aW9uc1RvcAogICAgICAgIGluICdsb2dpbicgYW5kICdwcmVmcycgY29udGV4dAoKMjAwNy0wOC0wNCAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjUuMTEzCgogICAgICAgICogQWRkZWQgImxvY2FsaGVhZGVyLmpzcCIsIHdoaWNoIGlzIGluY2x1ZGVkIGZyb20gY29tbW9uaGVhZGVyLmpzcC4KICAgICAgICBUaGUgaWRlYSBpcyB0aGF0IGl0IGlzIGFuICJlbXB0eSIgaGVhZGVyIGZpbGUgd2hpY2ggY2FuIGJlIHNhZmVseQogICAgICAgIG92ZXJyaWRkZW4gaW4geW91ciBsb2NhbCB0ZW1wbGF0ZSB3aXRob3V0IGhhdmluZyB0byBjaGFuZ2UKICAgICAgICBjb21tb25oZWFkZXIuanNwCgogICAgICAgICogVXBkYXRlZCBGaW5uaXNoIGxvY2FsaXphdGlvbi4KCjIwMDctMDgtMDUgIERpcmsgRnJlZGVyaWNreCAoZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbSkKCiAgICAgICAgKiAyLjUuMTEyIC0gTG9naW4vTG9zdFBhc3N3b3JkL1JlZ2lzdGVyIHVzZXIgZml4ZXMKCiAgICAgICAgKiBGaXhlZCAnc2hvdy1hbGwnIHNlYXJjaCByZXN1bHRzIGluIEZpbmQuIE9ubHkgZGlzcGxheSBvZiBibG9ja3Mgb2YgMjAgd2FzIHdvcmtpbmcuCgogICAgICAgICogUmVuYW1lZCB0aGUgY3NzIGNsYXNzICdlZGl0cGFnZScgdG8gJ2NyZWF0ZXBhZ2UnCiAgICAgICAgYmVjYXVzZSB0aGF0J3MgYWN0dWFsbHkgd2hhdCBpdCBpcy4gKEJVRyA1NSkKCiAgICAgICAgKiBMb2dpbi9Mb3N0UGFzc3dvcmQvUmVnaXN0ZXIganNwJ3MgY2xlYW4gdXAgYW5kIGJ1Z2ZpeGVzOgoKICAgICAgICBIYW5kbGluZyBvZiBMb3N0L1Jlc2V0IFBhc3N3b3JkIGlzIG5vdyBwcm9wZXJseSBjb3ZlcmVkIGJ5IHRlbXBsYXRlIGpzcHMuIChCVUcgMzgpCgogICAgICAgIFN0aWxsIHRvZG86IHRoZSBoYW5kbGluZyBvZiBDcmVhdGUvTW9kaWZ5IFVzZXIgUHJvZmlsZSAocGFydCBvZiBVc2VyUHJlZmVyZW5jZSBhbmQgTG9naW4gZmxvdykKICAgICAgICBuZWVkIHRvIGJlIHJlZmFjdG9yZWQuIFdoZW4gY3JlYXRpbmcgYSBuZXcgdXNlciBwcm9maWxlIGluIHRoZSBMb2dpbiBzY3JlZW5zLCB0aGUgZXJyb3IgaGFuZGxpbmcKICAgICAgICBnZXQncyBwcm9jZXNzZWQgYnkgVXNlclByZWZzLiBDb25mdXNpbmcuCgogICAgICAgIFNvbWUgaTE4biByZXNvdXJjZXMgd2hlcmUgc2hpZnRlZCB0byB0aGUgcmlnaHQgQ29yZVJlc291cmNlcyBvciB0ZW1wbGF0ZXMuZGVmYXVsdCBidW5kbGUuCiAgICAgICAgKHRoaXMgc3RpbGwgbmVlZHMgdG8gYmUgZG9uZSBmb3IgYWxsIGxhbmd1YWdlIHNwZWNpZmljIHJlc291cmNlIGZpbGVzICEhKQoKICAgICAgICAjIExvZ2luLmpzcCAgKG1vdmVkIGZyb20gdGVtcGxhdGUuZGVmYXVsdCB0byBDb3JlUmVzb3VyY2VzKQogICAgICAgIGxvZ2luLmVycm9yLmNhcHNsb2NrPUludmFsaWQgbG9naW4gKHBsZWFzZSBjaGVjayB5b3VyIENhcHMgTG9jayBrZXkpCiAgICAgICAgbG9naW4uZXJyb3IucGFzc3dvcmQ9Tm90IGEgdmFsaWQgbG9naW4uCiAgICAgICAgbG9naW4uZXJyb3Iubm9hY2Nlc3M9SXQgc2VlbXMgeW91IGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoYXQuIFNvcnJ5LgoKICAgICAgICAjIG1vdmVkIGZyb20gQ29yZVJlc291cmNlcyB0byB0ZW1wbGF0ZS5kZWZhdWx0ICAoTk9URTogbG9zdHB3ZCBjaGFuZ2VkIHRvIGxvc3RwdyAhKQogICAgICAgIGxvZ2luLmxvc3Rwdy5yZXNldC5jbGlja2hlcmU9Q2xpY2sgaGVyZQogICAgICAgIGxvZ2luLmxvc3Rwdy5yZXNldC5sb2dpbj17MH0gdG8gbG9nIGluIG9uY2UgeW91IHJldHJpZXZlIHlvdXIgbmV3IHBhc3N3b3JkLgoKICAgICAgICAqIFBhZ2VBY3Rpb25zVG9wLmpzcCB3YXMgdXBkYXRlZCB0byBoaWRlIHRoZSBNb3JlIG1lbnUgZnJvbSAnbm9uLXBhZ2UnIHJlbGF0ZWQgY29udGV4dHMuCiAgICAgICAgVGhlIE1vcmUgbWVudSB3aWxsIG9ubHkgYmUgc2hvd24gaW4gdmlldywgZWRpdCwgY29tbWVudCwgZGlmZiwgaW5mbywgcHJldmlldywgdXBsb2FkICYgZmluZAoKICAgICAgICAqIFRoZSBTZWFyY2hQYWdlSGVscCB3YXMgZXh0ZW5kZWQgd2l0aCBzb21lIEx1Y2VuZSBoaW50cy4KCjIwMDctMDgtMDQgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogVXBkYXRlZCBGaW5uaXNoIGxvY2FsaXphdGlvbi4KCjIwMDctMDgtMDUgIEp1YW4gUGFibG8gU2FudG9zIDxqdWFucGFibG8uc2FudG9zQGdtYWlsLmNvbT4KCiAgICAgICAgKiBpMThuaXplZCBzb21lIEpTUHMgd2l0aCBoYXJkLWNvZGVkIHRleHQuIE5ldyBsb2NhbGl6YWJsZSBzdHJpbmdzOgoKCQkJLSBHcm91cFRhYi5qc3AgKGRlZmF1bHQucHJvcGVydGllcykKCQkJZ3JwLmNyZWF0ZWRvbgoJCQlncnAubGFzdG1vZGlmaWVkCgkJCWdycC5ncm91cG5hbWVzLnRpdGxlCgkJCWdycC5uZXdncm91cG5hbWUKCQkJZ3JwLnNhdmVncm91cAoJCQlncnAuc2F2ZW5ld2dyb3VwCgkJCWdycC5jYW5jZWwKCQkJZ3JwLmRlbGV0ZWdyb3VwCgkJCWdycC5kZWxldGVncm91cC5jb25maXJtCgkJCWdycC5mb3JtaGVscAoJCQlncnAuYWxsZ3JvdXBzCgkJCShncnAuYnkgcmVtb3ZlZCBkdWUgdG8gcHJvcGVyIHVzZSBvZiBNZXNzYWdlRm9ybWF0KQoKCQkJLSBOZXdHcm91cENvbnRlbnQuanNwIChkZWZhdWx0LnByb3BlcnRpZXMpCgkJCW5ld2dyb3VwLmNyZWF0ZWdyb3VwCgoJCQktIFByZWZlcmVuY2VzQ29udGVudC5qc3AgKFByb2ZpbGVUYWIuanNwLCBkZWZhdWx0LnByb3BlcnRpZXMpCgkJCXByZWZzLnJvbGVzCgkJCXByZWZzLmdyb3VwcwoJCQlwcmVmcy5jcmVhdGlvbmRhdGUKCQkJcHJlZnMucHJvZmlsZS5sYXN0bW9kaWZpZWQKCgkJCS0gVXNlclByb2ZpbGVUYWcgKGNvcmVyZXNvdXJjZXMucHJvcGVydGllcykKCQkJdXNlcnByb2ZpbGUubm9ncm91cHMKCQkJdXNlcnByb2ZpbGUubm9yb2xlcwoKICAgICAgICAqIFVwZGF0ZWQgc3BhbmlzaCAoZXNfRVMpIHRyYW5zbGF0aW9uLgoKMjAwNy0wOC0wNCAgRGlyayBGcmVkZXJpY2t4IChkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tKQoKICAgICAgICAqIDIuNS4xMTEKCiAgICAgICAgKiBDbG9zaW5nIGZpbmFsIGZpbmFsIFhIVE1MIGNvbXBsaWFuY3kgaXNzdWVzIChDbG9zaW5nIEJVRyA5KQoKICAgICAgICAqIE1vcmUgbWVudSBpcyBub3cgZXh0ZW5kYWJsZSAoQlVHIDIwKQogICAgICAgIEEgbmV3IHBhZ2UgY2FsbGVkICdNb3JlTWVudScgY2FuIG5vdyBiZSB1c2VkIHRvIGV4dGVuZCB0aGUgTW9yZSBtZW51CiAgICAgICAgd2l0aCBleHRyYSBzdHVmZiwgc3VjaCBhIGxpbmtzIHRvIFJlY2VudCBDaGFuZ2VzLCBQYWdlIEluZGV4LAogICAgICAgIFN5c3RlbSBJbmZvLCBBYm91dCwgU2l0ZSBNYXAsIGV0Yy4gVGhlIGJlaGF2aW91ciBpcyBzaW1pbGFyIGFzIGZvciB0aGUgTGVmdE1lbnUuCiAgICAgICAgSXQgaXMgb25seSBmdW5jdGlvbmFsIHdoZW4gSlMgaXMgdHVybmVkIG9uIGluIHlvdXIgYnJvd3Nlci4KICAgICAgICBPdGhlcndpc2UgdGhlIG1vcmUgbWVudSBpcyBhbiBvcmRpbmFyeSBkcm9wZG93bi4KCiAgICAgICAgKiBGaXhlZCBGYXZvcml0ZXMgcG9zaXRpb24gKGxlZnQvcmlnaHQpIGluIEVkaXQgYW5kIFVwbG9hZCB2aWV3CgogICAgICAgICogUmVtb3ZlZCBmb250IHJlc2l6aW5nIHN0dWZmLiBObyByZWFsIGFkZCB2YWx1ZS4gKGFuZCBub3Qgd29ya2luZyBpbiBJRSBhbnl3YXkpCgoyMDA3LTA4LTA0ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqICJhbnQgd2FyIiBub3cgY29tcHJlc3NlcyBqc3B3aWtpLWVkaXQuanMsIGpzcHdpa2ktY29tbW9uLmpzCiAgICAgICAgYW5kIGpzcHdpa2ktcHJlZnMuanMgdXNpbmcgdGhlIFJoaW5vIGxpYnJhcnkuICBUaGlzIHNob3VsZCBicmluZwogICAgICAgIGluIGNvbnNpZGVyYWJsZSBzYXZpbmdzIHRvIGJhbmR3aWR0aCBhbmQgcmVzcG9uc2UuCgoyMDA3LTA4LTAzICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNS4xMTAKCiAgICAgICAgKiBBZGRlZCBwYXRjaCBmcm9tIE11cnJheSB0byBwcm92aWRlIHByb3BlcnR5IGNhc2NhZGluZyBmcm9tCiAgICAgICAgc3lzdGVtIHByb3BlcnRpZXMuCgogICAgICAgICogQWRkZWQgcGF0Y2ggZnJvbSBNdXJyYXkgdG8gcHJvdmlkZSBzZXR0aW5nIG9mIEFjbE1hbmFnZXIKICAgICAgICAodXNlIGpzcHdpa2kuYWNsTWFuYWdlcj08Y2xhc3M+KS4KCjIwMDctMDctMzAgIERpcmsgRnJlZGVyaWNreCAoZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbSkKCiAgICAgICAgKiAyLjUuMTA5IC0gaW50ZXJuYWwgY2xlYW51cCBvZiBKU1AncywgZmV3IGJ1Z2ZpeGVzIChvbmUgZm9yIElFKQoKICAgICAgICAqIEFkZGVkIG5ldyA8d2lraTpTZXRQYWdpbmF0aW9uPiBUYWcgdG8gZ2V0IHJpZCBvZiBqYXZhIGhhY2tpbmcKICAgICAgICBpbiBJbmZvQ29udGVudC5qc3AgYW5kIEFKQVhTZWFyY2guanNwLiBGaXhlZCBhIGZldyBidWdzIG9uIHBhZ2luYXRpb24KICAgICAgICBhcyB3ZWxsLiBOb3cgcGFnaW5hdGlvbiBkb2VzIHNob3cgdXAgcHJvcGVybHkgYXQgdmVyc2lvbj0yMC4KICAgICAgICAocmVwb3J0ZWQgYnkgTWlsdCBUYXlsb3IpCgogICAgICAgICogTmV3IG1hcmtlciBkZWZpbmVkICdqc2xvY2FsaXplZHN0cmluZ3MnIHRvIGNsZWFudXAgY29tbW9uaGVhZGVyLmpzcC4KICAgICAgICBTb21lIHJlZmluZW1lbnQgaXMgc3RpbGwgbmVlZGVkLCBidXQgaXQgd29ya3MgZm9yIG5vdy4KCiAgICAgICAgKiBGaXhlZCBJRSBjcmFzaCBpbiBqc3B3aWtpLWVkaXQuanMgY2F1c2luZyBlZGl0IHRvb2xiYXJzIG5vdCB0byBiZQogICAgICAgIHJlbmRlcmVkLiAoYXMgcmVwb3J0ZWQgYnkgTWlsdCBUYXlsb3IpCgogICAgICAgICogQnVnZml4OiBBdHRhY2htZW50IHVwbG9hZCB3YXMgbm90IHdvcmtpbmcgYW55bW9yZSAoaW50cm9kdWNlZCBpbiAyLjUuMTA3KQoKCjIwMDctMDctMzAgIERpcmsgRnJlZGVyaWNreCAoZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbSkKCiAgICAgICAgKiAyLjUuMTA4IC0gdGVtcGxhdGUgY2hhbmdlcyAmIHVzYWJpbGl0eQoKICAgICAgICAqIFRoZSAnRWRpdCcgYnV0dG9uIGlzIG5vdyBiYWNrIGluIGl0cyBwcmV2aW91cyBwb3NpdGlvbi4gKGFmdGVyIHJlY2VudCBwb3B1bGFyaXR5IHBvbGwgOy0pCiAgICAgICAgVGhlICdNb3JlJyBidXR0b24gbm93IGhhcyBhIGxpdHRsZSBkb3duLWljb24gYXMgdmlzdWFsIGNsdWUgdGhhdCBpdCdzIGFjdHVhbGx5IGEgZHJvcGRvd24uCiAgICAgICAgVGhlIEdvVG8tQm90dG9tIHRyaWFuZ2xlIGhhcyBiZWVuIHJlbW92ZWQgKHJlZHVjZSBzY3JlZW4gY2x1dHRlciwgbm90IHVzZWQgbXVjaCBhbnl3YXkpCiAgICAgICAgVGhlIEdvVG8tVG9wIGJ1dHRvbiBpcyBzdGlsbCB0aGVyZS4KICAgICAgICBUaGUgJ0xvZ2luJywgJ0xvZ291dCcgYW5kICdNeSBwcmVmcycgYXJlIHB1dCBiZWxvdyBHcmVldGluZywgd2hpY2ggaXMgbW9yZSBuYXR1cmFsLgogICAgICAgICh3aXRoIHN0aWxsIDIgZGlmZmVyZW50IGFwcHJvYWNocyBpbiB0aGUgZGVmYXVsdCBhbmQgU21hcnQgc2tpbikKCiAgICAgICAgKiBOZXcgcHJlZmVyZW5jZSBhZGRlZCB0byBzZWxlY3QgTGVmdC9SaWd0aCBwb3NpdGlvbiB0aGUgRmF2b3Jpc3RlcyBtZW51LgogICAgICAgIFRoZSBwb3NpdGlvbiBvZiB0aGUgJ01vcmUnIG1lbnUgYW5kICdGaW5kL1JlY2VudGNoYW5nZXMnIGRyb3Bkb3ducyBpcyBub3cgY2FsY3VsYXRlZCBvbiB0aGUgZmx5LgoKICAgICAgICBwcmVmcy51c2VyLm9yaWVudGF0aW9uPUZhdm9yaXRlcyBzdHlsZQogICAgICAgIHByZWZzLnVzZXIub3JpZW50YXRpb24ubGVmdD1MZWZ0CiAgICAgICAgcHJlZnMudXNlci5vcmllbnRhdGlvbi5yaWdodD1MZWZ0CgogICAgICAgICogU21hcnQgYW5kIE9yZGVyZWRMaXN0IHNraW5zIGFyZSBub3cgYWxpZ25lZCB3aXRoIGxhdGVzdCBHVUkgY2hhbmdlcwoKICAgICAgICAqICBBZnRlciBzZXR0aW5nIG5ldyBVc2VyUHJlZmVyZW5jZXMsIHlvdSBnZXQgbm93IHJlZGlyZWN0ZWQgYmFjayB0byB0aGUgcGFnZSB5b3UgY2FtZSBmcm9tLgogICAgICAgIChzaW1pbGFyIHRvIGxvZ2luKQoKICAgICAgICAqIFhIVE1MIGNvbXBsaWFuY2UgaW1wcm92ZW1lbnRzLgogICAgICAgIEJvcmRlciBzZXR0aW5ncyBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIGltZyBlbGVtZW50cy4gKFJlY2VudENoYW5nZXNQbHVnaW4sCiAgICAgICAgUlNTQ29mZmVlQ3VwTGlua1RhZywgVHJhbnNsYXRvclJlYWRlcikKICAgICAgICBSZXBsYWNlIGFsbCA8dT4gaW4gZGVmYXVsdC5wcm9wZXJ0aWVzIGJ5IDxzcGFuIGNsYXNzPSJhY2Nlc3NrZXkiPgoKICAgICAgICBlZGl0b3IucGxhaW4ubmFtZT1Zb3VyIDxzcGFuIGNsYXNzPSdhY2Nlc3NrZXknPm48L3NwYW4+YW1lCiAgICAgICAgZWRpdG9yLnBsYWluLmVtYWlsPUhvbWVwYWdlIG9yIGU8c3BhbiBjbGFzcz0nYWNjZXNza2V5Jz5tPC9zcGFuPmFpbAogICAgICAgIGFjdGlvbnMuZWRpdD08c3BhbiBjbGFzcz0nYWNjZXNrZXknPkU8L3NwYW4+ZGl0CiAgICAgICAgYWN0aW9ucy5lZGl0cGFyZW50PTxzcGFuIGNsYXNzPSdhY2Nlc2tleSc+RTwvc3Bhbj5kaXQgcGFyZW50IHBhZ2UKICAgICAgICBhY3Rpb25zLnByZWZzPU15IDxzcGFuIGNsYXNzPSdhY2Nlc2tleSc+UDwvc3Bhbj5yZWZzCiAgICAgICAgYWN0aW9ucy5wcmVmcy50aXRsZT1NYW5hZ2UgdXNlciBwcmVmZXJlbmNlcyBbIHAgXQoKICAgICAgICAqIFRoZSBhdHRhY2htZW50IGltZyB2aWV3ZXJzIG5vdyBhbG9zIHN1cHBvcnRzIGNhcGl0YWxpc2VkIGV4dGVuc2lvbnMKICAgICAgICAoZWcgYm90aCBqcGcgYW5kIEpQRyBjYW4gYmUgcmV2aWV3ZWQpCgogICAgICAgICogU21hbGwgcmVmYWN0b3JpbmdzIG9uIHRoZSBUYWJiZWQgU2VjdGlvbnMuIChzaW1wbGlmaWVkIFRhYlRhZyBodG1sKQogICAgICAgIEFsbCBjb250ZW50IGluc2lkZSBhIHRhYiwgYWxzbyB0aGUgZmxvYXRlZCBjb250ZW50LCB3aWxsIG5pY2VseSBmaXQgaW5zaWRlIHRoZSB0YWIuCiAgICAgICAgKHJlZiBidWcgMTAxKQoKMjAwNy0wNy0yNCAgSnVhbiBQYWJsbyBTYW50b3MgPGp1YW5wYWJsby5zYW50b3NAZ21haWwuY29tPgoKICAgICAgICAqIFVwZGF0ZWQgc3BhbmlzaCAoZXNfRVMpIHRyYW5zbGF0aW9uLgoKMjAwNy0wNy0yNCAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiBKdXN0IHVwZGF0ZWQgRmlubmlzaCB0cmFuc2xhdGlvbiBhbmQgZml4ZWQgc29tZSBlbnRpdHkgbmFtZXMKICAgICAgICBpbiBFbmdsaXNoIHRyYW5zbGF0aW9uLgoKMjAwNy0wNy0yMyAgRGlyayBGcmVkZXJpY2t4IChkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tKQoKICAgICAgICAqIDIuNS4xMDcKCiAgICAgICAgKiBNYW55ICd1c2FiaWxpdHknIGltcHJvdmVtZW50cyBiYXNlZCBvbiBtYW55IG1hbnkgaW5wdXRzIGZyb20KICAgICAgICBDbGF1ZGlhLCBNdXJyYXksIEFsZXggYW5kIEphbm5lLiBIb3BlIHlvdSBsaWtlIHRoZW0gOi0pCgogICAgICAgIEFsbCBzY3JlZW5zIG5vdyBjb25zaXN0ZW50eSBzaG93IDMgVEFCUyAodmlldywgYXR0YWNoIGFuZCBpbmZvKQogICAgICAgIFRoZSBFZGl0IGFjdGlvbiBoYXMgYmVjb21lIGEgJ3BzZXVkbycgVEFCIHBvc2l0aW9uZWQgcmlnaHQgbmV4dAogICAgICAgIHRvIHRoZSBzdGFuZGFyZCBzZXQgb2YgdGFicywgYnV0IHZpc3VhbGx5IGRpZmZlcmVudC4KICAgICAgICBGb3IgdGhlIHRpbWUgYmVpbmcsIEFkZC1Db21tZW50IHJlbWFpbnMgaGlkZGVuIGluIHRoZSBNb3JlIGRyb3Bkb3duCiAgICAgICAgYXMgaXQgaXMgbGVzcyBmcmVxdWVudGx5IHVzZWQuCiAgICAgICAgVGhlIE1vcmUgYWN0aW9uIGhhcyBiZWVuIHZpc3VhbGx5IGFkanVzdGVkIGFzIGEga2luZCBvZiAnYnV0dG9uJy4KCiAgICAgICAgVGhlIExpbmsgdGFiIGFuZCBEaWZmIHRhYnMgYXJlIGluY29ycG9yYXRlZCBpbiB0aGUgSW5mbyBzY3JlZW4gYXMKICAgICAgICBjb2xsYXBzYWJsZSBib3hlcywgYW5kIGFyZSBvbmx5IHNob3duIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dC4KICAgICAgICBUaGlzIGJyaW5ncyBiYWNrIGFsbCBwYWdlIGluZm8gKGxpbmtzLCB2ZXJzaW9uIGhpc3RvcnkpIGJhY2sgdW5kZXIgb25lCiAgICAgICAgc2luZ2xlIHBsYWNlLgoKICAgICAgICBBIG5ldyAtLVVTRVItLSBiYXIgaXMgYWRkZWQgd2l0aCBVc2VyTmFtZSwgTG9naW4vUmVnaXN0ZXIsIFByZWZzIGFuZCBMb2dvdXQKICAgICAgICBhY3Rpb25zLiBUaGVzZSBhY3Rpb25zIGFyZSBub3QgYW55bG9uZ2VyIGluIHRoZSB0b3AgcGFnZWFjdGlvbnMgc2VjdGlvbnMuCiAgICAgICAgVGhpcyBVU0VSIGJhciBpcyBwb3NpdGlvbmVkIGF0IHRoZSB0b3Agb2YgdGhlIHNjcmVlbiAoUGxhaW5WYW5pbGxhIHNraW4pCiAgICAgICAgb3IgaW4gdGhlIEZhdm9yaXRlcyBzZWN0aW9ucyAoU01BUlQgc2tpbikKCiAgICAgICAgVGhlIGJvdHRvbSBwYWdlIGFjdGlvbnMgaGF2ZSBiZWVuIHNpbXBsaWZpZWQgdG8gdGhlIG1heC4KICAgICAgICBXaGVuIGNsaWNraW5nIHRoZSAnZ290byBUT1AnIHRyaWFuZ2xlLCB5b3UgYXJlIGp1c3Qgb25lIGNsaWNrIGF3YXkKICAgICAgICBmcm9tIGFsbCByZW1haW5pbmcgYWN0aW9ucyBhbmQgYnV0dG9ucy4gKHRoaXMgd2FzIHRoZSBtb3N0IGVhc2llc3QgZm9yIG5vdyA7LSkKCiAgICAgICAgUGVuZGluZyBzdHVmZjogYWxsb3cgY29uZmlndXJhYmxlICdxdWljay1saW5rcycgdG8gYmUgYWRkZWQgbmV4dCB0byBhbmQKICAgICAgICBpbnNpZGUgdGhlIE1vcmUuLi4gbWVudS4gU2tpbnMgbWF5IG5vdCB5ZXQgYmUgdXAgdG8gZGF0ZSB3aXRoIGFsbCBjaGFuZ2VzCiAgICAgICAgLSBleHBlY3Qgc29tZSBnbGl0Y2hlcyBoZXJlIGFuZCB0aGVyZS4KCiAgICAgICAgKiBBZGRlZCBsaW5rIHRvICdWaWV3IHNvdXJjZSBwYWdlJyB0byB0aGUgTW9yZSBtZW51LiBOZXcgaTE4biBwcm9wZXJ0eTpgCiAgICAgICAgYWN0aW9ucy5yYXdwYWdlPVZpZXcgUGFnZSBTb3VyY2UKCiAgICAgICAgKiBGaXhlZCB0aGUgRGlmZiBkcm9wZG93biBzZWxlY3RvcnMgd2hlbiBubyBwYXJhbWV0ZXJzIChyMSBhbmQgcjIpIGFyZSBwcm92aWRlZC4KCiAgICAgICAgKiBFZGl0b3IvUG9zdGVkaXRvciBpbXByb3ZlbWVudHM6CiAgICAgICAgQ2hlY2tib3hlcyB3ZXJlIGFkZGVkIHRvIHR1cm4gb24vb2ZmIHRoZSBUYWIgQ29tcGxldGlvbiBhbmQKICAgICAgICBTbWFydCBUeXBpbmdQYWlycy4gWW91ciBzZXR0aW5ncyBhcmUgY29va2llLWZpZWQuCiAgICAgICAgU29tZSBuZXcgaTE4biBrZXl3b3JkcyBhZGRlZDoKCiAgICAgICAgZWRpdG9yLnBsYWluLnNtYXJ0cGFpcnM9IFNtYXJ0IFR5cGluZyBQYWlycwogICAgICAgIGVkaXRvci5wbGFpbi5zbWFydHBhaXJzLnRpdGxlPSBBdXRvIHBhaXJpbmcgb2YgKCkgW10ge30gIiIgJycKICAgICAgICBlZGl0b3IucGxhaW4udGFiY29tcGxldGlvbj1UYWIgQ29tcGxldGlvbiAoa2V5d29yZCtUYWIpCiAgICAgICAgZWRpdG9yLnBsYWluLnRhYmNvbXBsZXRpb24udGl0bGU9QXV0byBleHBhbnNpb24gb2Yga2V5d29yZCB0byBXaWtpIE1hcmt1cAoKICAgICAgICBBbGwgcG9zdGVkaXRvciBmdW5jdGlvbnMgYXJlIG5vdyBhbHNvIHVuZG8tYWJsZS4KCiAgICAgICAgVGhlIFBvc3RlZGl0b3Igbm93IGNvcnJlY3RseSBoYW5kbGVzIFNoaWZ0K3JpZ2h0LWFycm93IGluIEZpcmVmb3guIChCdWcgOTEpCgogICAgICAgICogRml4ZWQgQnVnIDg2IENvbW1lbnRib3ggYW5kIFRhYmJlZHNlY3Rpb24gbm90IHBsYXlpbmcgd2VsbCAocmVwb3J0ZWQgYnkgQWxleCBTYW1hZCkKCgoyMDA3LTA3LTIwICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNS4xMDYKCiAgICAgICAgKiBGaXhlcyBhbiBYU1MgdnVsbmVyYWJpbGl0eSB3aXRoIGV2aWxseSBmb3JtZWQgbGlua3MuCiAgICAgICAgUmVwb3J0ZWQgYnkgSWdvciBNaW5hci4KCjIwMDctMDctMTggIEphbm5lIEphbGthbmVuIDxKYW5uZS5KYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi41LjEwNQoKICAgICAgICAqIEFkbWluVUkgaGFzIG5vdyBydWRpbWVudGFyeSB1c2VyIG1hbmFnZW1lbnQgLSBpdCdzIG5vdwogICAgICAgIHBvc3NpYmxlIHRvIGFkZCwgY2hhbmdlIGFuZCByZW1vdmUgdXNlciBhY2NvdW50cyB1c2luZyB0aGUgYWRtaW5VSS4KICAgICAgICBBZG1pblVJIGlzIHJlYWNoYWJsZSB0aHJvdWdoIGFkbWluL0FkbWluLmpzcC4KCjIwMDctMDctMTggIERpcmsgRnJlZGVyaWNreCAoZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbSkKCiAgICAgICAgKiAyLjUuMTA0CgogICAgICAgICogVGhlICJIb21lIiBsaW5rIG5vdyBnZXQncyB0aGUgYWN0dWFsIG5hbWUgb2YgdGhlIGhvbWUvZnJvbnQgcGFnZQogICAgICAgIChzdWdnZXN0ZWQgYnkgQ2xhdWR1YSBGcmVycykKICAgICAgICBSZW1vdmUgdGhlIGtleT0nYWN0aW9ucy5ob21lJyAgZnJvbSBpMThuIHByb3BlcnRpZXMKCiAgICAgICAgKiBGaXhlZCBmbG9hdGluZyBpc3N1ZSBiZXR3ZWVuIFRhYmJlZFNlY3Rpb25zIGFuZCBDb21tZW50Qm94ZXMgaW5zaWRlIHBhZ2VzLgogICAgICAgIChyZXBvcnRlZCBieSBBbGV4IFNhbWFkKQoKICAgICAgICAqIE1vcmUgeGh0bWwgZml4ZXMgb24gUHJlZmVybmNlc1RhYiBhbmQgZGVmYXVsdC5wcm9wZXJ0aWVzLgoKMjAwNy0wNy0xOCAgSmFubmUgSmFsa2FuZW4gPEphbm5lLkphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjUuMTAzCgogICAgICAgICogW0J1ZyAyMV06IFR1cm5lZCBvdXQgdG8gYmUgYSBwcm9ibGVtIG9mIHNlbGYtcmVmZXJlbmNpbmcKICAgICAgICBwYWdlcy4KCiAgICAgICAgKiBbQnVnIDg1XTogQWRkZWQgYW4gZXh0cmEgY2hlY2sgZm9yIHRoaXMgY2FzZS4gIEl0IHN0aWxsIHRocm93cwogICAgICAgIGFuIGV4Y2VwdGlvbiwgYnV0IGF0IGxlYXN0IGl0J3MgYSBsb3QgbW9yZSB1c2VmdWwgdG8gZGVidWcuCgogICAgICAgICogW0J1ZyAyNV06IFdhcyByZWxhdGVkIHRvIEJ1ZyAyMS4gIEFkZGVkIHRlc3QgY2FzZXMgYW5kIGZpeGVkLgoKICAgICAgICAqIEFkZGVkIElmUGx1Z2luOyB0aGFua3MgdG8gU2NvdHQgQS4gQnliZWUgd2hvIGV4cGxhaW5lZCB0byBtZQogICAgICAgIGhvdyB1c2VmdWwgY29uZGl0aW9uYWwgd2lraXRleHQgY2FuIGJlLgoKICAgICAgICAqIFtCdWcgODddOiBMb2dpbiBwcm9jZXNzIG5vdyByZXR1cm5zIHlvdSB0byB0aGUgc2FtZSBwYWdlCiAgICAgICAgd2hlcmUgeW91IGNob3NlIHRvIGxvZ2luLgoKMjAwNy0wNy0xNyAgSmFubmUgSmFsa2FuZW4gPEphbm5lLkphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiBVcGRhdGVkIEZpbm5pc2ggbG9jYWxpemF0aW9uLgoKMjAwNy0wNy0xNyAgRGlyayBGcmVkZXJpY2t4IChkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tKQoKICAgICAgICAqIE5vIHZlcnNpb24gYnVtcCAtLSBzb21lIHNtYWxsIGZpeGVzIG9ubHkuCgogICAgICAgICogRmV3IHNtYWxsIElFNiB0d2Vha3M6IHBvc2l0aW9uIG9mIGFjdGlvbm1lbnUgcG9wdXAsCiAgICAgICAgcG9zaXRpb24gb2YgdHJpYW5nbGUgaWNvbnMgZm9yIHRvcCBhbmQgYm90dG9tIGxpbmsKCiAgICAgICAgKiBSZW1haW5pbmcgeGh0bWwgaXNzdWVzIChlbXB0eSA8dGQvPiBhcmUgbm90IGFsbG93ZWQpIChCVUcgOSkKICAgICAgICBBbGwgcGFnZXMgb2YgeGh0bWwgY29tcGxpYW50LCBleGNwZXQgVXNlclByZWZlcmVuY2VzLgoKMjAwNy0wNy0xNyBDaHJpc3RvcGggU2F1ZXIgKHNhdWVyQGhzLWhlaWxicm9ubi5kZSkKCiAgICAgICAgKiAyLjUuMTAyCgogICAgICAgICogQnVnIDEzIGZpeGVkLiBDaHVjayBmb3VuZCB0aGF0IGJ5IHVzaW5nIFdpa2lXaXphcmQgMS4xLjEgaW5zdGVhZCBvZiAxLjEsCiAgICAgICAgICBpdCB3b3VsZCBsb2FkIHByb3Blcmx5LiBIb3dldmVyLCBpdCB3b3VsZCBub3QgaW1wb3J0IHRoZSB0ZXh0IHdpdGggSmF2YVNjcmlwdAogICAgICAgICAgZHVlIHRvIGEgbmV3IHNlY3VyaXR5IG1lY2hhbmlzbSBidWlsdCBpbnRvIE1hYyBPUyBYLiBUbyByZW1lZHkgdGhpcyBwcm9ibGVtLAogICAgICAgICAgd2UgYWRkZWQgc2NyaXB0YWJsZT0idHJ1ZSIgdG8gdGhlIGFwcGxldCB0YWcgYW5kIGl0IHNob3VsZCB3b3JrIG5vdy4KCiAgICAgICAqICBBZGRlZCBtaXNzaW5nIGdlcm1hbiBsb2NhbGlzYXRpb25zLiBBZGRlZCBhIGNsYXNzIGNhbGxlZCBNaXNzaW5nVHJhbnNsYXRpb25zCiAgICAgICAgICB0aGF0IGhlbHBzIGRpZmYgdGhlIHJlc3NvdXJjZSBwcm9wZXJ0eSBmaWxlcy4gQWRhcHQgaXQgdG8geW91ciBsb2NhbGlzYXRpb24KICAgICAgICAgIGFuZCBydW4gaXQgZGlyZWN0bHkgaW4geW91ciBJREUuCgoyMDA3LTA3LTE0ICBEaXJrIEZyZWRlcmlja3ggKGRpcmsuZnJlZGVyaWNreEBnbWFpbC5jb20pCgogICAgICAgICogMi41LjEwMQoKICAgICAgICAqIEZldyBtb3JlIHhodG1sIGlzc3VlcyByZXNvbHZlZC4KCiAgICAgICAgKiBEZWZhdWx0IFRlbXBsYXRlIGlzIG5vdyBmaXhlZCBmb3IgSUU2LgoKICAgICAgICAqIEVkaXQgQXNzaXN0IHRvb2xiYXIgdGlwcyBsb2NhbGl6ZWQuCiAgICAgICAgICBOZXcgbG9jYWxpc2FibGUgaXRlbXMsIHNpbmNlIHYyLjUuMTAwCgogICAgICAgICAgICBlZGl0b3IucGxhaW4ucG9zdGVkaXRvcj1FbnRlciBLZXl3b3JkK1RhYjoKICAgICAgICAgICAgZWRpdG9yLnBsYWluLnBvc3RlZGl0b3IudGl0bGU9c2hpZnQrZW50ZXIgZm9yIG5leHQgbmV4dCBmaWVsZAogICAgICAgICAgICBlZGl0b3IucGxhaW4uZWRpdGFzc2lzdD1FZGl0IEFzc2lzdAogICAgICAgICAgICBlZGl0b3IucGxhaW4uZWRpdGFzc2lzdC50aXRsZT1Ub2dnbGUgRWRpdCBBc3Npc3QgYnV0dG9ucwogICAgICAgICAgICBlZGl0b3IucGxhaW4udGJMaW5rLnRpdGxlPWxpbmsgLSBJbnNlcnQgd2lraSBsaW5rCiAgICAgICAgICAgIGVkaXRvci5wbGFpbi50YkgxLnRpdGxlPWgxIC0gSW5zZXJ0IGhlYWRpbmcxCiAgICAgICAgICAgIGVkaXRvci5wbGFpbi50YkgyLnRpdGxlPWgyIC0gSW5zZXJ0IGhlYWRpbmcyCiAgICAgICAgICAgIGVkaXRvci5wbGFpbi50YkgzLnRpdGxlPWgzIC0gSW5zZXJ0IGhlYWRpbmczCiAgICAgICAgICAgIGVkaXRvci5wbGFpbi50YkhSLnRpdGxlPWhyIC0gSW5zZXJ0IGhvcml6b250YWwgcnVsZXIKICAgICAgICAgICAgZWRpdG9yLnBsYWluLnRiQlIudGl0bGU9YnIgLSBJbnNlcnQgbGluZSBicmVhawogICAgICAgICAgICBlZGl0b3IucGxhaW4udGJQUkUudGl0bGU9cHJlIC0gSW5zZXJ0IHByZWZvcm1hdHRlZCBibG9jawogICAgICAgICAgICBlZGl0b3IucGxhaW4udGJETC50aXRsZT1kbCAtIEluc2VydCBkZWZpbml0aW9uIGxpc3QKICAgICAgICAgICAgZWRpdG9yLnBsYWluLnRiQi50aXRsZT1ib2xkCiAgICAgICAgICAgIGVkaXRvci5wbGFpbi50YkkudGl0bGU9aXRhbGljZWRpdG9yLnBsYWluLnRiTU9OTy50aXRsZT1tb25vIC0gbW9ub3NwYWNlCiAgICAgICAgICAgIGVkaXRvci5wbGFpbi50YlNVUC50aXRsZT1zdXAgLSBzdXBlcnNjcmlwdAogICAgICAgICAgICBlZGl0b3IucGxhaW4udGJTVUIudGl0bGU9c3ViIC0gc3Vic2NyaXB0CiAgICAgICAgICAgIGVkaXRvci5wbGFpbi50YlNUUklLRS50aXRsZT1zdHJpa2UgLSBzdHJpa2V0aHJvdWdoCiAgICAgICAgICAgIGVkaXRvci5wbGFpbi50YlRPQy50aXRsZT10b2MgLSBJbnNlcnQgdGFibGUgb2YgY29udGVudHMKICAgICAgICAgICAgZWRpdG9yLnBsYWluLnRiVEFCLnRpdGxlPXRhYiAtIEluc2VydCB0YWJiZWQgc2VjdGlvbgogICAgICAgICAgICBlZGl0b3IucGxhaW4udGJUQUJMRS50aXRsZT10YWJsZSAtIEluc2VydCB0YWJsZQogICAgICAgICAgICBlZGl0b3IucGxhaW4udGJJTUcudGl0bGU9aW1nIC0gSW5zZXJ0IGltYWdlCiAgICAgICAgICAgIGVkaXRvci5wbGFpbi50YkNPREUudGl0bGU9Y29kZSAtIEluc2VydCBjb2RlIGJsb2NrCiAgICAgICAgICAgIGVkaXRvci5wbGFpbi50YlFVT1RFLnRpdGxlPXF1b3RlIC0gSW5zZXJ0IHF1b3RlZCBibG9jawogICAgICAgICAgICBlZGl0b3IucGxhaW4udGJTSUdOLnRpdGxlPXNpZ24gLSBJbnNlcnQgeW91ciBzaWduYXR1cmUKCjIwMDctMDctMTQgIERpcmsgRnJlZGVyaWNreCAoZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbSkKCiAgICAgICAgKiAyLjUuMTAwCgogICAgICAgICogRmluYWxpc2luZyB4aHRtbCBmaXhlcy4gSSBob3BlIHRvIGNsb3NlIChCVUcgOSkgcmVhbGx5IHNvb24gbm93LgoKICAgICAgICAqIFRoZSBGcm9udHBhZ2UgdmFyaWFibGUgY2FuIG5vdCBiZSB1c2UgY2F1c2UgaXQgaXMgbm90IGFsd2F5cyBzZXQuCiAgICAgICAgRmFsbGluZyBiYWNrIHRvIGVuZ2luZS5nZXRGcm9udFBhZ2UoKSAoQlVHIDgyKQoKICAgICAgICAqIFRoZSBFZGl0IEFzc2lzdCBhbmQgdGhlIHJlc2l6ZSBiYXIgYXJlIG5vdyBhbHNvIGF2YWlsYmxlIGluIHRoZSBBZGQgQ29tbWVudCBwYWdlCgogICAgICAgICogVGhlIEVkaXQgQXNzaXN0IGJ1dHRvbnMgaGF2ZSBiZWVuIGltcHJvdmVkLiBQcmVzc2luZyBhIGJ1dHRvbiB3aWxsIHJlcGxhY2UgdGhlIHNlbGVjdGVkCiAgICAgICAgdGV4dCBwcm9wZXJseSwgaW5zdGVhZCBvZiBqdXN0IG92ZXJ3cml0aW5nIGl0LiAoRUcsIHNlbGVjdCBhIHdvcmQgYW5kIHByZXNzIHRoZSBCT0xEIGJ1dHRvbgogICAgICAgIHRvIHJlcGxhY2UgdGhld29yZCBieSBfX3dvcmRfXykgQWxzbyB0aGUgaGFuZGxpbmcgb2YgbmV3bGluZSBoYXMgYmVlbiBpbXByb3ZlZCBhcwogICAgICAgIHNvbWUgbWFya3VwIHNob3VsZCBhbHdheXMgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiBhIG5ldyBsaW5lLiAoRUcsIGhlYWRlcnMsIHRhYmxlcywgLi4uKQogICAgICAgIChyZWYgYWxzbyBCVUcgODMpCgogICAgICAgICogRXhwZXJpbWVudGFsLCBidXQgbG9va3MgcHJvbWlzaW5nIDstKSAgV2hlbiBKU1BXaWtpIHJlbmRlcmVkIG9uIGEgbmFycm93IHNjcmVlbiwgKGVnIDIwMHgzMjBweCkKICAgICAgICBwYWdlLXRhYnMgd2VyZSBvdmVybGFwcGluZyB3aXRoIHBhZ2UtYWN0aW9ucywgYW5kIG5vdCB1c2FibGUgYW55bW9yZS4KICAgICAgICBOb3csIHRoZSB0YWJzIG5pY2VseSBzaGlmdCBiZWxvdyB0aGUgcGFnZS1hY3Rpb25zIHdoZW4gdGhlIHNjcmVlbiBpcyB2ZXJ5IHNtYWxsLgogICAgICAgIFRoaXMgd2lsbCBoZWxwIEpTUFdpa2kgdG8gYmUgdXNhYmxlIG9uIG1vYmlsZSBkaXZpY2VzIHN1Y2ggYXMgUzYwIG9yIGlQaG9uZS4gKEJVRyA4MCkKICAgICAgICBBcyBhbHdheXM6OiBwbGVhc2UgdGVzdCB0aGlzIG9uIElFIGJyb3dzZXJzIGFuZCBmZWVkYmFjay4gVGVzdGluZyB3YXMgZG9uZSBGRiwgU2FmYXJpLCBPcGVyYSBhbmQgQ2FtaW5vIG9rLgoKICAgICAgICAqIFRoZSBTbWFydCBhbmQgT3JkZXJMaXN0IHNraW4gaGF2ZSBub3cgYWxpZ25lZCB3aXRoIGxhdGVzdCBwYWdlYWN0aW9ucyBjaGFuZ2VzCgoyMDA3LTA3LTE0ICBKYW5uZSBKYWxrYW5lbiA8SmFubmUuSmFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNS45OQoKICAgICAgICAqIFtCdWcgNzddOiBXZSB3ZXJlIHN0YXJ0aW5nIHR3byBGaWx0ZXJNYW5hZ2VycyAtIGFwcHMgd2VyZQogICAgICAgIHJlZ2lzdGVyaW5nIHRvIHRoZSBvdGhlciBvbmUsIGFuZCBldmVudHMgd2VyZSBmaXJlZCB3aXRoIHRoZQogICAgICAgIG90aGVyIG9uZS4uLiBIZWguCgogICAgICAgICogU3RhcnR1cCBub3cgb3V0cHV0cyBhIGxvdCBtb3JlIHVzZWZ1bCBpbmZvIGFib3V0IHRoZSBlbnZpcm9ubWVudAogICAgICAgIChlbmFibGVkIGJ5IHNldHRpbmcgV2lraUVuZ2luZSB0byBERUJVRykuCgogICAgICAgICogV2ViU3BoZXJlIENvbW11bml0eSBFZGl0aW9uIChXU0NFIDEuMCkgd2FzIGNyYXNoaW5nIGF0IHN0YXJ0dXAsCiAgICAgICAgZHVlIHRvIEF1dGhlbnRpY2F0aW9uTWFuYWdlci5oYXNDb29raWVBdXRoZW50aWNhdGlvbigpIGFzc3VtaW5nCiAgICAgICAgbm9uLW51bGwgSkFBUyBsaXN0cy4KCiAgICAgICAgKiBUZXN0SHR0cFNlcnZsZXRSZXF1ZXN0IG5vdyByZXR1cm5zIGEgc2FuZSBsb2NhbGUgKHNvIHRoYXQgbm8KICAgICAgICBOUEUncyBvY2N1ciBhbnltb3JlIGluIHRlc3RzKS4KCiAgICAgICAgKiBVcGRhdGVkIEZpbm5pc2ggbG9jYWxpemF0aW9uIHVwLXRvLWRhdGUuCgoyMDA3LTA3LTE0ICBKdWFuIFBhYmxvIFNhbnRvcyA8anVhbnBhYmxvLnNhbnRvc0BnbWFpbC5jb20+CgogICAgICAgICogQ2hlY2tlZCBpbiBzcGFuaXNoIChlc19FUykgdHJhbnNsYXRpb24uCgogICAgICAgICogQWRkZWQgbG9jYWxpemF0aW9uIGZvciB2YWxpZGF0ZU5vdE51bGwgYXQgSW5wdXRWYWxpZGF0b3IsIG9uZSBuZXcKICAgICAgICBsb2NhbGl6YWJsZSBzdHJpbmcgaW4gQ29yZVJlc291cmNlczoKCiAgICAgICAgICAgLSB2YWxpZGF0ZS5jYW50YmVudWxsCgoyMDA3LTA3LTEzICBDaHJpc3RvcGggU2F1ZXIgPHNhdWVyQGhzLWhlaWxicm9ubi5kZT4KCiAgICAgICAgKiBjaGVja2VkIGluIG1pc3NpbmcgL2NvbS9lY3lyZC9qc3B3aWtpL3BsdWdpbi9QbHVnaW5SZXNvdXJjZXMKICAgICAgICAgIGdlcm1hbiB0cmFuc2xhdGlvbi4gW0J1ZyA3NF0gY2xvc2VkLgoKMjAwNy0wNy0xMiAgQ2hyaXN0b3BoIFNhdWVyIDxzYXVlckBocy1oZWlsYnJvbm4uZGU+CgogICAgICAgICogMi41Ljk4CgogICAgICAgICogQWRkZWQganNwd2lraS5iYXNpY0F0dGFjaG1lbnRQcm92aWRlci5kaXNhYmxlQ2FjaGUgcHJvcGVydHkuIEl0IHRha2VzCiAgICAgICAgICBhIHJlZ2V4IHRoYXQgbGV0IHlvdSBkZWZpbmUgZm9yIHdoaWNoIGZpbGVuYW1lIHBhdHRlcm5zIHRvIGRpc2FibGUgdGhlCiAgICAgICAgICBicm93c2VyIGNhY2hlLiBTZWUgbW9yZSBvbiB0aGlzIGluIHRoZSBqc3B3aWtpLnByb3BlcnRpZXMudG1wbCBjb21tZW50CgogICAgICAgICogRml4ZWQgQnVnIGluIENyZW9sZVBhZ2VGaWx0ZXI6IFR3byB0YWJsZXMgc2VwZXJhdGVkIGJ5IGEgYmxhbmsgbGluZQogICAgICAgICAgd2hlcmUgcmVuZGVyZWQgYXMgb25lIHRhYmxlCgogICAgICAgICogQ2hlY2tlZCBpbiBHZXJtYW4gbG9jYWxpc2F0aW9uIGZvciBDb3JlUmVzb3VyY2VzCgoyMDA3LTA3LTEyICBKYW5uZSBKYWxrYW5lbiA8SmFubmUuSmFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNS45NwoKICAgICAgICAqIENoYW5nZWQgInZhbGlkYXRlLnVuc2FmZWNoYXJzIiBpMThuIHBhdHRlcm4gdG8gZml4IGEgZmF0YWwKICAgICAgICBidWcgd2l0aCBpdC4gIEFsc28gZGVsZXRlZCAidmFsaWRhdGUuaW52YWxpZGlkIiwgc2luY2UgaXQncyBubwogICAgICAgIGxvbmdlciBuZWVkZWQuCgogICAgICAgICogVXBkYXRlZCBGaW5uaXNoIGxvY2FsaXphdGlvbiAoZmkpLgoKMjAwNy0wNy0xMSAgSmFubmUgSmFsa2FuZW4gPEphbm5lLkphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjUuOTYKCiAgICAgICAgKiBBZGRlZCBhIGJ1bmNoIG9mIG1pc3NpbmcgbG9jYWxpemF0aW9ucywgcmVwb3J0ZWQgYnkgWW91aGVuZyBIdS4KICAgICAgICBOZXcgbG9jYWxpemFibGUgc3RyaW5ncyBpbiBDb3JlUmVzb3VyY2VzIGFyZToKCiAgICAgICAgICAgLSBzZWN1cml0eS5lcnJvci5jcmVhdGVwcm9maWxlYmVmb3JlbG9naW4KICAgICAgICAgICAtIHNlY3VyaXR5LmVycm9yLmJsYW5rcGFzc3dvcmQKICAgICAgICAgICAtIHNlY3VyaXR5LmVycm9yLnBhc3N3b3Jkbm9tYXRjaAogICAgICAgICAgIC0gc2VjdXJpdHkuZXJyb3IuaWxsZWdhbGZ1bGxuYW1lCiAgICAgICAgICAgLSBzZWN1cml0eS5lcnJvci5pbGxlZ2FsbG9naW5uYW1lCiAgICAgICAgICAgLSBzZWN1cml0eS51c2VyLmxvZ2lubmFtZQogICAgICAgICAgIC0gc2VjdXJpdHkudXNlci5mdWxsbmFtZQogICAgICAgICAgIC0gc2VjdXJpdHkudXNlci5lbWFpbAogICAgICAgICAgIC0gdmFsaWRhdGUudW5zYWZlY2hhcnMKICAgICAgICAgICAtIHZhbGlkYXRlLmludmFsaWRlbWFpbAogICAgICAgICAgIC0gdmFsaWRhdGUuaW52YWxpZGlkCgogICAgICAgICogV2lraVNlc3Npb24gZ2FpbnMgZ2V0TG9jYWxlKCkgbWV0aG9kLCB3aGljaCBwcm92aWRlcyBhIGNhY2hlZAogICAgICAgIGxvY2FsZSBvYmplY3QuCgoyMDA3LTA3LTEwICBKYW5uZSBKYWxrYW5lbiA8SmFubmUuSmFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIFtCVUcgODFdIEFkZGVkIHRoZSBfZW4gcmVzb3VyY2UgYnVuZGxlcyB0byB0aGUgSkFSIGJ1aWxkIGJ5IGNvcHlpbmcKICAgICAgICB0aGUgZGVmYXVsdCBidW5kbGVzIGluIGJ1aWxkLnhtbC4gIE5vIGJ1bXAsIG5vIGZ1bmN0aW9uYWxpdHkgY2hhbmdlLgoKMjAwNy0wNy0wOSAgRGlyayBGcmVkZXJpY2t4IChkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tKQoKICAgICAgICAqIDIuNS45NQoKICAgICAgICAqIFN0YWJpbGlzaW5nIDIuNS45NC4KCiAgICAgICAgKiBSZW1vdmUgZWRpdG9yIHR5cGUgc2VsZWN0b3IgZnJvbSBDb21tZW50Q29udGVudC5qc3AKCiAgICAgICAgKiBCdWdmaXggb24gdGFiIHN3aXRjaGluZyBpbiB0aGUgTG9naW4gYW5kIFVzZXJQcmVmZXJlbmNlcyBwYWdlcwoKICAgICAgICAqIEJ1Z2ZpeDogdGhlIFNJR04gc2hvcnRjdXQgd2FzIG5vdCB3b3JraW5nIGluIEVkaXQgQXNzaXN0CgogICAgICAgICogQnVnZml4OiB0eXBvIGluIGNvbW1vbmhlYWRlci5qc3AgY2F1c2VkIGpzcHdpa2ktZWRpdC5qcyB0byBiZSBsb2FkZWQgdHdpY2UKCiAgICAgICAgKiBCdWdmaXg6IHotaW5kZXggYWRqdXN0ZWQgZm9yIE1vcmUuLiBtZW51IHRvIHNhdGlzZnkgSUUgZWRpdG9ycy4KCiAgICAgICAgKiBGaXhlZCByZW1haW5pbmcgeGh0bWwgaXNzdWVzLiAoQlVHICA5KQoKCjIwMDctMDctMDggIERpcmsgRnJlZGVyaWNreCAoZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbSkKCiAgICAgICAgKiAyLjUuOTQKCiAgICAgICAgKiBDb29raWUgaGFuZGxpbmcgaGFzIGJlZW4gcmVmYWN0b3JlZC4gSlNQV2lraVVzZXJQcmVmcyBpcyBub3cgSlNPTiBiYXNlZC4KICAgICAgICBBbHNvIHRoZSBoZWlnaHQgb2YgdGhlIGVkaXQgdGV4dGFyZWEgaXMgJ2Nvb2tpZWZpZWQnLCBzbyBqc3B3aWtpIHJlbWVtYmVycwogICAgICAgIHlvdXIgcHJlZmVyZWQgaGVpZ2h0IG9mIHRoZSBlZGl0b3IgYXJlYS4gKEJVRyA2NykKICAgICAgICBUaGUgUmVjZW50U2VhcmNoZXMgbWVtb3J5IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBKU1BXaWtpVXNlclByZWZzIGFuZCBkb2Vzbid0IHJlcXVpcmUKICAgICAgICBhbiBhZGRpdGlvbmFsIGNvb2tpZS4gKGxlc3MgY29va2llIGRpcnQpCgogICAgICAgICogUmVwbGFjZSBhbGwgaGFyZGNvZGVkIHJlZmVyZW5jZXMgdG8gJ01haW4nIGJ5ICd3aWtpLmZyb250UGFnZScgIChCVUcgNDIpCgogICAgICAgICogSW1wcm92ZWQgdGhlIGxvYWRpbmcgb2YgYWRkaXRpb25hbCBKYXZhc2NyaXB0IGNodW5rcy4ganNwd2lraS1lZGl0LmpzIGlzIG5vdwogICAgICAgIG9ubHkgbG9hZGVkIHdpdGggcGxhaW4uanNwLCBzbyBubyBtb3JlIGludGVyZmVyZW5jZSB3aXRoIFdpa2lXaXphcmQgKEJVRyA3OCkKCiAgICAgICAgKiBNYWpvciByZWZhY3RvcmluZyBvZiB0aGUgJ01vcmUuLi4nIGRyb3Bkb3duIG1lbnUuIEl0IG5vdyBwZXJmZWN0bHkgcnVucyBvbiBGaXJlZm94LAogICAgICAgIE9wZXJhLCBDYW1pbmEsIFNhZmFyaSBhbmQgKGkgaG9wZSA7LSkgb24gSUUuIFBsc2UgdGVzdCB0ZXN0IHRlc3Qgb24gSUU2IGFuZCBJRTcgYW5kIHJlcG9ydAogICAgICAgIGJ1Z3MuIFRoZSBuZXcgbWVudSBpcyBhbHNvIFhIVE1MIGNvbXBsaWFudC4KICAgICAgICBNYW55IGltcHJvdmVtZW50cyBoYXZlIGJlZW4gZG9uZSBvbiB0aGUgcmVtYWluaW5nIFhIVE1MIGNvbXBsaWFuY3kgaXNzdWVzLgoKICAgICAgICAqIFRoZSBFZGl0b3IgdHlwZSBzZWxlY3RvciBpcyBub3cgbW92ZWQgdG8gdGhlIFVzZXJQcmVmZXJlbmNlcyBwYWdlLCBpbnN0ZWFkIG9mIHRoZQogICAgICAgIEVkaXQuanNwLiBDaGFuZ2luZyB0aGUgZWRpdG9yIHR5cGUgZHVyaW5nIGFuIGVkaXQgc2Vzc2lvbiB3YXMgZGFuZ2Vyb3VzLAogICAgICAgIGFzIGNoYW5nZXMgdG8gdGhlIHBhZ2UgYXJlIG5vdCBzYXZlZC4gTm93IHlvdSBjYW4gc2V0IHlvdXIgcHJlZmVycmVkIGVkaXRvciBpbiBNeVByZWZzLgoKICAgICAgICAqIFRoZSBlZGl0b3IgdGV4dGFyZWEgaGFzIGJlZW4gYm9vc3RlZCB3aXRoIFBvc3RlZGl0b3IKICAgICAgICAoc2VlIGh0dHA6Ly9pY2ViZWF0LmJpdGFjb3Jhcy5jb20vbW9vdG9vbHMvcG9zdGVkaXRvci8gZm9yIGEgZGVtbykKICAgICAgICBUaGUgdGV4dGFyZWEgbm93IHN1cHBvcnRzIHRoZSBUQUIga2V5LCBzbWFydCAndHlwaW5nIHBhaXJzJyAoc3VjaHMgYXMgKCkgW10ge30gKQogICAgICAgIGFuZCBoYXMgc29tZSBmYW5jeSB0YWItY29tcGxldGlvbiBvZiBjb21tb25seSB1c2VkIGNvbW1hbmRzLgogICAgICAgIFRyeSBlbnRlcmluZyB0b2MrVEFCIHRvIHNlZSB0aGUgZWZmZWN0LgogICAgICAgIFRoZSBQb3N0RWRpdG9yIGlzIG9ubHkgZnVuY3Rpb25hbCBvbiBub24tSUUgYnJvd3NlcnMsIGFuZCBpZiBKYXZhc2NyaXB0IGlzIG9uLgoKICAgICAgICAqIFRoZSBFZGl0b3IgYXNzaXN0IHRvb2xiYXIgcHJvdmlkZXMgYSBzZXQgb2YgYnV0dG9ucyB0byBhc3Npc3QgbmV3YmllcyBpbiBlbnRlcmluZwogICAgICAgIHdpa2kgbWFya3VwLiBTdXBwb3J0cyBib3RoIG5vbi1JRSBhcyBJRSwgb25seSBpZiBKYXZhc2NyaXB0IGlzIG9uLgoKCjIwMDctMDctMDYgIEphbm5lIEphbGthbmVuIDxKYW5uZS5KYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi41LjkzCgogICAgICAgICogUkVTT1VSQ0VfSFRUUEhFQURFUiBkaWRuJ3Qgd29yayBpZiBhZGRpbmcgZGF0ZXMuCgogICAgICAgICogQWRtaW5CZWFuTWFuYWdlciBpcyBub3cgYSBiaXQgbW9yZSByb2J1c3QgaWYgYSBiZWFuIGlzIGFscmVhZHkKICAgICAgICByZWdpc3RlcmVkLiAgVGhhbmtzIHRvIEFsZXggU2FtYWQgZm9yIHRoZSBwYXRjaC4KCjIwMDctMDctMDQgIEphbm5lIEphbGthbmVuIDxKYW5uZS5KYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi41LjkyCgogICAgICAgICogRGlmZlByb3ZpZGVycyBhcmUgbm93IGxvY2FsaXplZC4gIFVuZm9ydHVuYXRlbHksIHRoaXMgbWVhbnQgYW4gQVBJCiAgICAgICAgY2hhbmdlLCBzbyBXaWtpRW5naW5lLm1ha2VEaWZmKCkgbm93IHRha2VzIGEgV2lraUNvbnRleHQgYXMgYSBwYXJhbWV0ZXIuCiAgICAgICAgSSBkb24ndCB0aGluayBtYW55IHBlb3BsZSB3ZXJlIHVzaW5nIGl0LCB0aG91Z2gsIHNvIGl0J3Mgbm90IGEgbWFqb3IKICAgICAgICBpc3N1ZS4KCiAgICAgICAgKiBOZXcgbG9jYWxpemF0aW9ucyBpbiBDb3JlUmVzb3VyY2VzLWJ1bmRsZToKCiAgICAgICAgICAgIC0gZGlmZi50cmFkaXRpb25hbC5hZGRlZAogICAgICAgICAgICAtIGRpZmYudHJhZGl0aW9uYWwuY2hhbmdlZAogICAgICAgICAgICAtIGRpZmYudHJhZGl0aW9uYWwucmVtb3ZlZAogICAgICAgICAgICAtIGRpZmYudHJhZGl0aW9uYWwub25lbGluZQogICAgICAgICAgICAtIGRpZmYudHJhZGl0aW9uYWwubGluZXMKCjIwMDctMDctMDMgIEphbm5lIEphbGthbmVuIDxKYW5uZS5KYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi41LjkxCgogICAgICAgICogVGhlcmUgaGF2ZSBiZWVuIGxvYWRzIGFuZCBsb2FkcyBvZiBmaXhlcyB0byBDaGVja3N0eWxlIHdhcm5pbmdzLgoKICAgICAgICAqIEFkZGVkIFJFU09VUkVfSFRUUEhFQURFUiBmcm9tIEFsZXggU2FtYWQuICBUaGFua3MhCgoyMDA3LTA2LTMwICBKYW5uZSBKYWxrYW5lbiA8SmFubmUuSmFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNS45MAoKICAgICAgICAqIFtCdWcgNzFdOiBMb2dpbi5qc3AgaXMgbm93IGxvY2FsaXplZC4gIEFsbCBsb2NhbGl6ZXJzLCBwbGVhc2UKICAgICAgICBub3RlIHRoYXQgdGhlcmUgYXJlIHRocmVlIG5ldyBzdHJpbmdzIHRvIGxvY2FsaXplIGluCiAgICAgICAgInRlbXBsYXRlcy5kZWZhdWx0IiAtYnVuZGxlOgoKICAgICAgICAgICAgLSBsb2dpbi5lcnJvci5jYXBzbG9jawogICAgICAgICAgICAtIGxvZ2luLmVycm9yLnBhc3N3b3JkCiAgICAgICAgICAgIC0gbG9naW4uZXJyb3Iubm9hY2Nlc3MKCiAgICAgICAgKiBJbiBhZGRpdGlvbiwgdGhlcmUgYXJlIGZ1cnRoZXIgbG9jYWxpemF0aW9uIGRvbmUgaW4gdG9wLWxldmVsCiAgICAgICAgSlNQcy4gIE5ldyBzdHJpbmdzIGluIENvcmVSZXNvdXJjZXMgYXJlOgoKICAgICAgICAgICAgLSBzZWN1cml0eS5lcnJvci5ub2FjY2Vzcy5sb2dnZWQKICAgICAgICAgICAgLSBzZWN1cml0eS5lcnJvci5ub2FjY2VzcwogICAgICAgICAgICAtIHNlY3VyaXR5LmVycm9yLndyb25naXAKICAgICAgICAgICAgLSByZW5hbWUuZW1wdHkKICAgICAgICAgICAgLSByZW5hbWUuZXJyb3IudGl0bGUKICAgICAgICAgICAgLSByZW5hbWUuZXJyb3IucmVhc29uCiAgICAgICAgICAgIC0gcmVuYW1lLmlkZW50aWNhbAogICAgICAgICAgICAtIHJlbmFtZS5leGlzdHMKICAgICAgICAgICAgLSByZW5hbWUudW5rbm93bmVycm9yCiAgICAgICAgICAgIC0gbG9zdHB3ZC5uZXdwYXNzd29yZC5lbWFpbAogICAgICAgICAgICAtIGxvc3Rwd2QubmV3cGFzc3dvcmQuc3ViamVjdAogICAgICAgICAgICAtIGxvc3Rwd2Qubm91c2VyCiAgICAgICAgICAgIC0gbG9zdHB3ZC5ub21haWwKICAgICAgICAgICAgLSBsb3N0cHdkLmVtYWlsZWQKICAgICAgICAgICAgLSBsb3N0cHdkLnJlc2V0LnRpdGxlCiAgICAgICAgICAgIC0gbG9zdHB3ZC5yZXNldC5jbGlja2hlcmUKICAgICAgICAgICAgLSBsb3N0cHdkLnJlc2V0LmxvZ2luCiAgICAgICAgICAgIC0gbG9zdHB3ZC5yZXNldC51bmFibGUKICAgICAgICAgICAgLSBsb3N0cHdkLnJlc2V0LmJsdXJiCiAgICAgICAgICAgIC0gbG9zdHB3ZC5yZXNldC5zdWJtaXQKCiAgICAgICAgKiBVcGRhdGVkIEVuZ2xpc2ggYW5kIEZpbm5pc2ggbG9jYWxpemF0aW9ucyAoYW5kIGZpeGVkIGEgY291cGxlIG9mCiAgICAgICAgc2lsbGluZXNzZXMgaW4gdGhlIEZpbm5pc2ggbG9jYWxpemF0aW9uKQoKMjAwNy0wNi0yMyAgRGlyayBGcmVkZXJpY2t4IChkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tKQoKICAgICAgICAqIDIuNS44OQoKICAgICAgICAqIENvb2tpZSBoYW5kbGluZyBoYXMgYmVlbiByZWZhY3RvcmVkLiBKU1BXaWtpVXNlclByZWZzIGlzIG5vdyBKU09OIGJhc2VkLgogICAgICAgIEFsc28gdGhlIGhlaWdodCBvZiB0aGUgZWRpdCB0ZXh0YXJlYSBpcyAnY29va2llZmllZCcsIHNvIGpzcHdpa2kgcmVtZW1iZXJzCiAgICAgICAgeW91ciBwcmVmZXJlZCBoZWlnaHQgb2YgdGhlIGVkaXRvciBhcmVhLiAoQlVHIDY3KQoKICAgICAgICAqIEZpeGVkIGhhbmRsaW5nIG9mIGZvcm0gZm9jdXMoKSBsb2dpYy4gSlNQV2lraSBub3cgY29ycmVjdGx5IHB1dHMgdGhlIGZvY3VzCiAgICAgICAgb24gdGhlIGZpcnN0IHZpc2libGUgZm9ybSBlbGVtZW50LiBUaGlzIGFsc28gcmVzb2x2ZXMgYSBKUyBjcmFzaCBvbiBJRS4KCiAgICAgICAgKiBTb21lIGltcHJvdmVtZW50IG9uIFhIVE1MIGNvbXBsaWFuY2UgKEJVRyA5KSBTdGlsbCBzb21lIHJlZmFjdG9yaW5nCiAgICAgICAgbmVlZGVkIG9uIGRyb3Bkb3duIG1lbnUgdG8gaW1wcm92ZSBjb21wbGlhbmNlLgoKICAgICAgICAqIEFkZGVkIFVURjggc3VwcG9ydCB0byBBSkFYU2VhcmNoLmpzcAoKMjAwNy0wNi0xOCAgSmFubmUgSmFsa2FuZW4gPEphbm5lLkphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjUuODgKCiAgICAgICAgKiBbQnVnIDI0XTogQnVnUmVwb3J0SGFuZGxlciBubyBsb25nZXIgdGFsa3MgYWJvdXQgImJ1ZwogICAgICAgIHJlcG9ydHMiLCBidXQgcGFnZXMuICBSZXBvcnRlZCBieSBHcmVnb3IgSGFnZWRvcm4uCgoyMDA3LTA2LTE2ICBEaXJrIEZyZWRlcmlja3ggKGRpcmsuZnJlZGVyaWNreEBnbWFpbC5jb20pCgogICAgICAgICogMi41Ljg3CgogICAgICAgICogQlVHIDYyIHJlc29sdmVkOiBubyBzZW5zaXR2ZSBpbmZvIGluIExlZnRNZW51IGR1cmluZyBMb2dpbi4KCiAgICAgICAgKiBGaXggc29tZSBTa2luTmFtZSBpc3N1ZSByZWxhdGUgdG8gdGhlIG5ldyBwcmVmZXJlbmNlcyBvYmplY3QuCgogICAgICAgICogQlVHIDUyIHJlc29sdmVkOiBEaWZmLmpzcCBhbmQgUGFnZUluZm8uanNwIHNob3VsZCBub3QgYmUgaW5kZXhlZAoKICAgICAgICAqIFRleHRBcmVhIHJlc2l6ZSBiYXIgaW1hZ2UuCgoyMDA3LTA2LTE2ICBKYW5uZSBKYWxrYW5lbiA8SmFubmUuSmFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNS44NgoKICAgICAgICAqIFtCdWcgMjldLCBzZWFyY2ggcGF0aCBpcyBub3cgdHJpbSgpbWVkIHByb3Blcmx5LiBUaGFua3MKICAgICAgICB0byBEYXZpZCBBdS4KCiAgICAgICAgKiBBIGNvdXBsZSBvZiBmaXhlcyB0byB3YXJuaW5ncyBjb3VydGVzeSBvZiBBbGV4IFNhbWFkLgoKICAgICAgICAqIFtCdWcgMTJdLCBBTS9QTSBhcmUgbm93IGNvcnJlY3QgaW4gcHJlZmVyZW5jZXMuCgogICAgICAgICogQ3JlYXRlZCBuZXcgUHJlZmVyZW5jZXMgb2JqZWN0LCBhbmQgcmVmYWN0b3JlZCBzb21lIG9sZAogICAgICAgIHByZWZlcmVuY2VzIGNvZGUgZnJvbSBjb21tb25oZWFkZXIuanNwIGludG8gaXQuICBUaGlzIGFsc28KICAgICAgICBtZWFucyB0aGF0IGluc3RlYWQgb2YgdXNpbmcgJHtwcmVmVGltZVpvbmV9IHlvdSB3b3VsZCB1c2UKICAgICAgICAke3ByZWZzWyJUaW1lWm9uZSJdfSBpbiB5b3VyIHZhcmlhYmxlcy4gIFRoaXMgaXMgZmFyIG1vcmUKICAgICAgICBleHRlbnNpYmxlIGFuZCBmdXR1cmUtcHJvb2YgdGhhbiBiZWZvcmUuICBUaGUgSHR0cFNlc3Npb24KICAgICAgICBub3cgZ2V0cyBhIFByZWZlcmVuY2VzIG9iamVjdCB1bmRlciB0aGUgbmFtZSAicHJlZnMiLiAgVGhlcmUKICAgICAgICBhcmUgYWxzbyBzb21lIHV0aWxpdHkgbWV0aG9kcyBpbiB0aGUgUHJlZmVyZW5jZXMgY2xhc3Mgd2hpY2gKICAgICAgICBhYnN0cmFjdCB0aGlzIGF3YXkuICAoSXQncyBhbHNvIGEgbG90IGZhc3RlciBiZWNhdXNlIHdlIGRvCiAgICAgICAgbm90IHBhcnNlIHRoZSBjb29raWUgZXZlcnkgc2luZ2xlIHRpbWUuKQoKICAgICAgICAqIFtCdWcgNjNdOiBUaGUgZGVmYXVsdCBlY2xpcHNlIGNvZGluZyBzdHlsZSBmaWxlIG5vdwogICAgICAgIGhhcyAueG1sIHN1ZmZpeC4KCiAgICAgICAgKiBDaGVja3N0eWxlIGNvbmZpZyB1bmRlciBkb2MvZWNsaXBzZSBhbHNvIG5vdyBnYWlucyBhIC54bWwKICAgICAgICBzdWZmaXguCgoyMDA3LTA2LTE0ICBKYW5uZSBKYWxrYW5lbiA8SmFubmUuSmFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNS44NQoKICAgICAgICAqIEJ1ZyBmaXg6IEJ1ZyA1OCwgQnJlYWRjcnVtYnNUYWcuamF2YSBkb2VzIG5vdCBjb21waWxlIHVuZGVyIEpESyA2CgoyMDA3LTA2LTEzICBKYW5uZSBKYWxrYW5lbiA8SmFubmUuSmFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNS44NAoKICAgICAgICAqIEJ1ZyBmaXg6IEJ1ZyA4LCBNdWx0aXBsZSBzcGFjZXMgaW4gcGFnZSBuYW1lcyBhcmUgbm90IGNsZWFuZWQKCjIwMDctMDYtMTEgIEphbm5lIEphbGthbmVuIDxKYW5uZS5KYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogQWRkZWQgRmlubmlzaCBsb2NhbGl6YXRpb24uICBObyB2ZXJzaW9uIGJ1bXAsIGFzIHRoZXJlCiAgICAgICAgaXMgbm8gZnVuY3Rpb25hbGl0eSBjaGFuZ2UuCgoyMDA3LTA2LTExICBEaXJrIEZyZWRlcmlja3ggKGRpcmsuZnJlZGVyaWNreEBnbWFpbC5jb20pCgogICAgICAgICogMi41LjgzCgogICAgICAgICogRml4ZWQgYmxvY2tpbmcgSUUgamF2YXNjcmlwdCBidWcuCgoyMDA3LTA2LTExICBDaHJpc3RvcGggU2F1ZXIgKHNhdWVyQGhzLWhlaWxicm9ubi5kZSkKCiAgICAgICAgKiAyLjUuODIKCiAgICAgICAgKiBBZGRlZCBHZXJtYW4gbG9jYWxpc2F0aW9uLgoKICAgICAgICAqIEFkZGVkIG1pc3NpbmcgaTE4biB0YWdzIGluIFBhZ2VJbmZvIGFuZCBVc2VyUHJlZmVyZW5jZXMKCjIwMDctMDYtMTAgIEphbm5lIEphbGthbmVuIDxKYW5uZS5KYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgKiAyLjUuODEKCiAgICAgICAqIEZpeGVkIGEgY291cGxlIG9mIGxvY2FsaXphdGlvbiBpc3N1ZXMgKGRpZmYgdGFiCiAgICAgICB3YXMgbm90IGxvY2FsaXplZCBwcm9wZXJseSkuCgoyMDA3LTA2LTA5ICBEaXJrIEZyZWRlcmlja3ggKGRpcmsuZnJlZGVyaWNreEBnbWFpbC5jb20pCgogICAgICAgKiBTZXZlcmFsIFhIVE1MIFNUUklDVCBjb21wbGlhbmNlIGlzc3VlcyBmaXhlZC4KCjIwMDctMDYtMDkgIERpcmsgRnJlZGVyaWNreCAoZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbSkKCiAgICAgICAqIDIuNS44MAoKICAgICAgICogUmVmYWN0b3Jpbmcgb2YgU3VibWl0T25jZSBmdW5jdGlvbmFsaXR5LCBzdWNoIHRoYXQgaXMgZG9lc24ndCBoYXJtCiAgICAgICB3aGVuIGphdmFzY3JpcHQgaXMgb2ZmLiBXaWtpLlN1Ym1pdE9uY2UoKSBwcmV2ZW50cyB5b3UgZnJvbSBwcmVzc2luZwogICAgICAgc3VibWl0IGJ1dHRvbnMgbXVsdGlwbGUgdGltZXMuCiAgICAgICBFZGl0aW5nIGlzIG5vdyBwb3NzaWJsZSAoYW5kIGxvZ2luIGV0Yy4pIHdoaWxlIGphdmFzY3JpcHQgaXMgb2ZmLgogICAgICAgKHJlZi4gaHR0cDovL2J1Z3MuanNwd2lraS5vcmcvc2hvd19idWcuY2dpP2lkPTMpCgogICAgICAgKiBBZGRlZCBleHBlcmltZW50YWwgR3JvdXBUYWIuCgogICAgICAgKiBJbmZvIHRhYiBhZGRlZCB0byBVcGxvYWQuanNwCgogICAgICAgKiBNaW5vciBtaXNzaW5nIGkxOG4gZml4ZWQuIFNtYWxsIGNzcyBmaXhlcwoKCjIwMDctMDYtMDkgIEphbm5lIEphbGthbmVuIDxKYW5uZS5KYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgKiAyLjUuNzkKCiAgICAgICAqIEZpeGVkIG1pbm9yIGlzc3VlIHdpdGggZGVmYXVsdCB0ZW1wbGF0ZSBzYXlpbmcgImdvIiBpbnN0ZWFkCiAgICAgICBvZiAiZmluZCIuCgogICAgICAgKiBGaXJzdCBhbHBoYSByZWxlYXNlIG9mIEpTUFdpa2kgMi42LgoKMjAwNy0wNi0wOSAgQW5kcmV3IEphcXVpdGggPGFuZHJldyBBVCBmcmVzaGNvb2tpZXMgRE9UIG9yZz4KCiAgICAgICAqIDIuNS43OAoKICAgICAgICogRXZlbiBtb3JlIGxpdHRsZSBmaXhlcyB0byByZW1vdmUgQ2hlY2tzdHlsZSBpc3N1ZXMuCgoyMDA3LTA2LTA5ICBKYW5uZSBKYWxrYW5lbiA8SmFubmUuSmFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICogMi41Ljc3CgogICAgICAgKiBSZWZhY3RvcmVkIEVkaXRvckl0ZXJhdG9yVGFnOyBBZGRlZCBlZGl0b3IgY2hhbmdlcwogICAgICAgdG8gdGhlIFVzZXJQcmVmZXJlbmNlcy4KCjIwMDctMDYtMDkgIERpcmsgRnJlZGVyaWNreCAoZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbSkKCiAgICAgICAqIEluZm8gdGFiIGlzIGJhY2ssIG5vdyBtYWtpbmcgdXNlIG9mIHRoZSBuZXcgdGFiIHVybCBwYXJhbWV0ZXIuCgogICAgICAgKiBTdHlsZXNoZWV0cyBvZiB0aGUgU21hcnQgYW5kIE9yZGVyZWRMaXN0IHNraW5zIGhhdmUgYmVlbiByZWZhY3RvcmVkLgoKICAgICAgICogU3VibWl0IG9mIHRoZSBxdWljayBOYXZpZ2F0aW9uIG1lbnUgbm93IGRlZmF1bHRzIGJhY2sgdG8gdGhlCiAgICAgICBhZHZhbmNlZCBTZWFyY2ggcGFnZS4gVGhlIHNhbWUgYXBwbGllcyB0byBjbGlja2luZyB0aGUgbG9va2luZy1nbGFzcyBpY29uLgoKICAgICAgICogVXBncmFkZWQgdG8gbW9vdG9vbHMgdjEuMTEKCjIwMDctMDYtMDUgIENocmlzdG9waCBTYXVlciAoc2F1ZXJAaHMtaGVpbGJyb25uLmRlKQoKICAgICAgICogMi41Ljc2CgogICAgICAgKiBKU1BXaWtpIG5vdyBzdXBwb3J0cyBXaWtpQ3Jlb2xlIDEuMDoKICAgICAgIENoZWNrZWQgaW4gQ3Jlb2xlVG9KU1BXaWtpIHJlbmRlcmVyIHBsdXMgQ3Jlb2xlUGFnZUZpbHRlci4KICAgICAgIFRoaXMgd2lsbCBhbGxvdyB1c2VycyB0byBvcGVyYXRlIEpTUFdpa2kgaW4gV2lraUNyZW9sZSBtaXhlZCBtb2RlLgogICAgICAgc2VlIGh0dHA6Ly93d3cud2lraWNyZW9sZS5vcmcgZm9yIG1vcmUgaW5mb3MgYWJvdXQgV2lraUNyZW9sZS4KCjIwMDctMDYtMDMgIERpcmsgRnJlZGVyaWNreCAoZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbSkKCiAgICAgICAqIFNhbWUgdmVyc2lvbgoKICAgICAgICogUHJvZ3Jlc3MgYmFyIGZpeGVkIHRvIHJ1biBvbiBTYWZhcmkgb3IgT3BlcmEgYXMgd2VsbC4KICAgICAgIEl0IHVzZXMgbm93IGNzcyBzdHlsZSB2aXNpYmlsaXR5OmhpZGRlbiBpc28gZGlzcGxheTpub25lLgoKICAgICAgICogTWlub3IgY3NzIGZpeGVzLgoKMjAwNy0wNi0wNCAgSmFubmUgSmFsa2FuZW4gPEphbm5lLkphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAqIDIuNS43NQoKICAgICAgICogSlNPTiBpbnRlcmZhY2Ugbm93IGFjdHVhbGx5IGNoZWNrcyB3aGV0aGVyIHRoZSB1c2VyIGhhcwogICAgICAgcGVybWlzc2lvbiB0byBjYWxsIHRoZSBtZXRob2RzLiAgVGhpcyB3YXMgYSByZWxhdGl2ZWx5IG1ham9yCiAgICAgICBzZWN1cml0eSBob2xlLi4uIDotKQoKICAgICAgICogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHRvIEpTT05TZWFyY2guCgoyMDA3LTA2LTAzICBKYW5uZSBKYWxrYW5lbiA8SmFubmUuSmFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICogMi41Ljc0CgogICAgICAgKiBSZW1haW5pbmcgcGF0Y2hlcyBmcm9tIERhdmlkIHRvIEZDSyBlZGl0b3Igc3VwcG9ydC4KCjIwMDctMDYtMDMgIERpcmsgRnJlZGVyaWNreCAoZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbSkKCiAgICAgICAqIDIuNS43MwoKICAgICAgICogSW4tcGFnZSBVcGxvYWQgUHJvZ3Jlc3MgQmFyIGhhcyBiZWVuIGFkZGVkIGJhc2VkIG9uIGpzb25ycGMgYmFja2VuZC4KICAgICAgIChpJ20gbm90IHlldCAxMDAlIHN1cmUgb24gdGhlIGNyb3NzIGJyb3dzZXIgY29tcGF0aWJpbGl0eSAtIGNhbiBhbnlib2R5CiAgICAgICBjaGVjayB0aGlzIG9uIGllIHdpbiA/KSAgVGhpcyByZXBsYWNlcyB0aGUgUHJvZ3Jlc3MuUG9wdXAganNwLgoKICAgICAgICogQ29va2llIGhhbmRsaW5nIGZpeGVkLiBCdWcgY2F1c2VkIHRleHQtYXJlYSBzaXplIHRvIGJlIG1peGVkIHVwCiAgICAgICB3aXRoIGZvbnQgc2l6ZS4KCiAgICAgICAqIE5ldyBzb3J0LWljb25zIGFkZGVkLiBTb3J0YWJsZSB0YWJsZXMgaGF2ZSBhIGJldHRlciB2aXNpYmlsaXR5IG5vdy4KCjIwMDctMDYtMDIgIEphbm5lIEphbGthbmVuIDxKYW5uZS5KYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgKiAyLjUuNzIKCiAgICAgICAqIEQnb2gsIERhdmlkJ3MgcGF0Y2ggZGlkbid0IG1ha2UgaXQgY29tcGxldGVseSB0byBDVlMuICBOb3cKICAgICAgIGl0IHNob3VsZCBiZSB0aGVyZS4KCjIwMDctMDYtMDEgIEphbm5lIEphbGthbmVuIDxKYW5uZS5KYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgKiAyLjUuNzEKCiAgICAgICAqIEFkZGVkIFVzZXJNYW5hZ2VyLkpTT05Vc2VyTW9kdWxlCgogICAgICAgKiBGaXhlZCBBZG1pbi5qc3Agc3VjaCB0aGF0IGl0IGNhbiBubyBsb25nZXIgYmUgaW52b2tlZAogICAgICAgYWNjaWRlbnRhbGx5IChkb24ndCBleHBlY3QgaXQgdG8gYmUgYXZhaWxhYmxlIGluIGluaXRpYWwgYWxwaGFzKS4KICAgICAgIFR1cm4gb24gImpzcHdpa2kteC5hZG1pbnVpLmVuYWJsZT10cnVlIiB0byBzZWUgaG93IGl0IHdvcmtzLgoKICAgICAgICogQWRkZWQgaW5pdGlhbCwgbm9uLWZ1bmN0aW9uYWwgdXNlciBtYW5hZ2VtZW50IHRhYiBpbiBBZG1pbi5qc3AuCgogICAgICAgKiBBZGRlZCBuZXcgQWpheFdpa2kgb2JqZWN0IHRvIGpzcHdpa2ktY29tbW9uLmpzIHRvIHNpbXBsaWZ5IEFKQVgKICAgICAgIGNhbGxzIChtb290b29scyBpcyBuaWNlLCBidXQgdGhlaXIgQUpBWCBBUEkgaXMgaW5zYW5lbHkgY29tcGxleCkuCgogICAgICAgKiBBZGRlZCBNdXJyYXkncyBwYXRjaCB0byBlbmFibGUgZXZlbnQgbW9uaXRvcmluZy4KCiAgICAgICAqIEFkZGVkIERhdmlkIEF1J3MgcGF0Y2ggdG8gZml4IHJlbWFpbmluZyBpc3N1ZXMgaW4gRkNLIGludGVncmF0aW9uLgoKICAgICAgICogZmNrY29uZmlnLmpzOiBEaXNhYmxlZCAnSW5zZXJ0IEZsYXNoJyBidXR0b24uCgogICAgICAgKiBGQ0suanNwOiBGaXhlZCBpc3N1ZSB3aGVyZSBpbWFnZSBhdHRhY2htZW50cyB3b3VsZCBub3QgYmUgZGlzcGxheWVkCiAgICAgICB3aGVuIGFjY2Vzc2luZyBKU1BXaWtpIHZpYSBodHRwcy4KCiAgICAgICAqIFBsdWdpbkNvbnRlbnQuamF2YTogRml4ZWQgaXNzdWUgd2hlcmUgcGx1Z2luIGVycm9yIG1lc3NhZ2VzIHdlcmUKICAgICAgIGFwcGVhcmluZyBpbiBGQ0sncyBlZGl0b3IgYXJlYS4KCiAgICAgICAqIFd5c2l3eWdFZGl0aW5nUmVuZGVyZXIuamF2YTogRml4ZWQgaXNzdWUgd2hlcmUgcGFnZW5hbWVzIHdlcmUKICAgICAgIGFwcGVhcmluZyBpbiB0aGVpciBVUkwtZW5jb2RlZCBmb3JtYXQgaW4gdGhlIGhyZWYuCgogICAgICAgKiBYSHRtbEVsZW1lbnRUb1dpa2lUcmFuc2xhdG9yLmphdmE6IEJlYXV0aWZ5IHRoZSBnZW5lcmF0ZWQgd2lraSBtYXJrdXAKICAgICAgIGJ5IHByaW50aW5nIGEgbmV3bGluZSBjaGFyYWN0ZXIgYWZ0ZXIgYSBsaW5lYnJlYWsuIEZpeGVkIGlzc3VlIHdoZW4KICAgICAgIGdlbmVyYXRpbmcgd2lraSBsaW5rcyB3aXRoIHNwYWNlcyBpbiB0aGUgcGFnZW5hbWUuICBEb24ndCBwcmludCBhCiAgICAgICBleHRyYW5lb3VzIHNwYWNlIGFmdGVyIGEgbGluayBvciBhbiBpbWFnZSBhbnltb3JlLgoKICAgICAgICogV3lzaXd5Z0VkaXRpbmdSZW5kZXJlclRlc3QuamF2YTogQWRkZWQgdGVzdHMgZm9yIHBhZ2VuYW1lcyB3aXRoCiAgICAgICBzcGFjZXMuCgogICAgICAgKiBIdG1sU3RyaW5nVG9XaWtpVHJhbnNsYXRvclRlc3QuamF2YTogRml4ZWQgc2V2ZXJhbCB1bml0IHRlc3RzIGJyb2tlbgogICAgICAgYnkgdGhpcyBsYXRlc3Qgc2V0IG9mIGNoYW5nZXMuCgoKMjAwNy0wNS0zMCAgQW5kcmV3IEphcXVpdGggPGFuZHJldyBBVCBmcmVzaGNvb2tpZXMgRE9UIG9yZz4KCiAgICAgICAqIDIuNS43MAoKICAgICAgICogTWFueSwgbWFueSBsaXR0bGUgZml4ZXMgdG8gcmVtb3ZlIENoZWNrc3R5bGUgaXNzdWVzLgoKICAgICAgICogUmVtb3ZlZCB0aGUgdHdvLWFyZ3VtZW50IGNvbnN0cnVjdG9yIGZyb20gR3JvdXBQcmluY2lwYWwKICAgICAgIGFuZCBpdHMgYXNzb2NpYXRlZCAid2lraSIgZmllbGQuIFRoaXMgaW50ZXJhY3RlZCBpbiBhCiAgICAgICB2ZXJ5IHN1YnRsZSB3YXkgd2l0aCBMb2NhbFBvbGljeSB0byBwcmV2ZW50IEdyb3VwUHJpbmNpcGFsCiAgICAgICBwcml2aWxlZ2UgZ3JhbnRzIGZyb20gYmVpbmcgcHJvY2Vzc2VkIGNvcnJlY3RseS4gV2UKICAgICAgIGNvbmNsdWRlZCB0aGF0IHRoaXMgImZlYXR1cmUiLCB3aGlsZSBpbnRlbmRlZCB0byBiZSB1c2VkCiAgICAgICB3aXRoIG11bHRpLXdpa2kgZW52aXJvbm1lbnRzLCB3YXMgZmF0YWxseSBicm9rZW4gZnJvbSB0aGUKICAgICAgIHN0YXJ0LiBUaGlzIGNoYW5nZSBpcyBwdXJlbHkgInVuZGVyIHRoZSBjb3ZlcnMiIGFuZCB1c2VycyB3aWxsCiAgICAgICBub3Qgbm90aWNlIHRoZSBkaWZmZXJlbmNlIG9yIG5lZWQgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KCiAgICAgICAqIE1pbm9yIHR3ZWFrcyB0byBTZXNzaW9uTW9uaXRvciBhbmQgQXV0aG9yaXphdGlvbk1hbmFnZXIKICAgICAgIHRoYXQgc2hvdWxkIHNsaWdodGx5IHJlZHVjZSBtZW1vcnkgbGVhayBwb3RlbnRpYWwuCgogICAgICAgKiBJbnRyb2R1Y2VkIGEgbmV3IGV4Y2VwdGlvbiBjYWxsZWQgRGVjaXNpb25SZXF1aXJlZEV4Y2VwdGlvbgogICAgICAgdGhhdCBkZW5vdGVzIHdoZW4gYW4gb3BlcmF0aW9uIGNhbm5vdCBjb21wbGV0ZSBiZWNhdXNlCiAgICAgICBhIHBlcnNvbiBtdXN0IG1ha2UgYSBkZWNpc2lvbi4gSXQgaXMgdGhyb3duIGJ5IFdpa2lFbmdpbmUuc2F2ZVRleHQoKQogICAgICAgYW5kIFVzZXJNYW5hZ2VyLnNldFByb2ZpbGUoKS4KCjIwMDctMDUtMjkgIEphbm5lIEphbGthbmVuIDxKYW5uZS5KYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgKiAyLjUuNjkKCiAgICAgICAqIFJlbmFtZWQgVEVTVCBwbHVnaW4gYXMgVGVzdCB0byBiZSBtb3JlIGluIGxpbmUgd2l0aAogICAgICAgSmF2YSBjbGFzcyBuYW1pbmcgY29udmVudGlvbnMuICBVcGRhdGVkIGpzcHdpa2lfbW9kdWxlLnhtbAogICAgICAgdG8gc3RpbGwgdXNlIFRFU1QgYXMgYW4gYWxpYXMuCgogICAgICAgKiBUaW55IHR3ZWFrcyB0byBzb21lIHRlc3RzLCB3aG8gc2hvdWxkIG5vdyB0ZWxsIHlvdQogICAgICAgd2hhdCB0byBkbyBpZiB0aGV5IGNhbm5vdCBjb25uZWN0IHRvIGEgZGF0YWJhc2UuCgoyMDA3LTA1LTI5ICBBbmRyZXcgSmFxdWl0aCA8YW5kcmV3IEFUIGZyZXNoY29va2llcyBET1Qgb3JnPgoKICAgICAgICogMi41LjY4CgogICAgICAgKiBGaXhlZCBhIGJ1ZyBpbiB0aGUgQW50IHNjcmlwdCB0aGF0IHdlcmUgY2F1c2luZyB0ZXN0cwogICAgICAgdG8gcmVmdXNlIHRvIHJ1biBzb21ldGltZXMgYmVjYXVzZSBvZiBhbiAoZXJyb25lb3VzKQogICAgICAgSHlwZXJzb25pYyBlcnJvci4KCiAgICAgICAqIEFzIG9mIHRoaXMgYnVpbGQsIHdlIGhhdmUgZWxpbWluYXRlZCB0aGUgbmVlZCB0byBzaWduCiAgICAgICBKU1BXaWtpIEpBUnMgZm9yIDk1JSBvZiBtb3N0IHVzZXJzJyBkZXBsb3ltZW50cy4gVGhlIG9ubHkKICAgICAgIGNhc2Ugd2hlcmUgeW91IG5lZWQgdG8gc2lnbiB0aGVtLCBub3csIGlzIHdoZW4geW91IHdpc2gKICAgICAgIHRvIGNyZWF0ZSBhIEpWTS13aWRlLCBjb25zb2xpZGF0ZWQgc2VjdXJpdHkgcG9saWN5LiBXZSBoYXZlCiAgICAgICByZXRhaW5lZCBhbiBBbnQgdGFyZ2V0ICJzaWduamFyIiBmb3IgdGhhdCBwdXJwb3NlLiBJZiB5b3UKICAgICAgIGFyZSB1cGdyYWRpbmcgZnJvbSBhbiBlYXJsaWVyIHZlcnNpb24gb2YgSlNQV2lraSBhbmQgYXJlCiAgICAgICB1c2luZyBhIGN1c3RvbWl6ZWQgcG9saWN5LCBob3dldmVyLCB5b3UgTVVTVCBNVVNUIE1VU1QKICAgICAgIHJlbW92ZSBhbnkgInNpZ25lZEJ5IGpzcHdpa2kiIGFuZCAia2V5c3RvcmUiIHJlZmVyZW5jZXMsCiAgICAgICBvdGhlcndpc2UgSlNQV2lraSBtaWdodCBhY3Qgb2RkLgoKICAgICAgICogVGhlIGNvbnRhaW5lci1zcGVjaWZpYy9KVk0td2lkZSBwYXJ0cyBvZiB0aGUgSmF2YQogICAgICAgc2VjdXJpdHkgcG9saWN5IGhhdmUgYmVlbiBtb3ZlZCB0byBhIG5ldyBmaWxlLAogICAgICAgZXRjL2pzcHdpa2ktY29udGFpbmVyLnBvbGljeS4gVGhpcyBpcyBOT1QgYnVuZGxlZCBpbnRvCiAgICAgICB0aGUgV0FSIGJlY2F1c2UgaXQgaXNuJ3QgbmVlZGVkIHRoZXJlIGluIGFueSBldmVudC4uLgoKMjAwNy0wNS0yOCAgRGlyayBGcmVkZXJpY2t4IChkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tKQoKICAgICAgICogU01BUlQgc2tpbiB1cGRhdGVkLiBGZXcgYnVnZml4ZXMKCjIwMDctMDUtMjcgIEphbm5lIEphbGthbmVuIDxKYW5uZS5KYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgKiAyLjUuNjcKCiAgICAgICAqIFdlYmxvZ1BsdWdpbiBub3cgY29uc2lkZXJzIEFDTHMgLSBpZiB0aGUgdXNlciBkb2VzIG5vdCBoYXZlCiAgICAgICB2aWV3IHBlcm1pc3Npb24gb24gYW4gZW50cnksIGl0J3MgaWdub3JlZCBvbiBkaXNwbGF5LiAgQWxzbwogICAgICAgcmVmYWN0b3JlZCB0aGUgV2VibG9nUGx1Z2luIHNsaWdodGx5IHRvIGJlIG1vcmUgbGVnaWJsZS4KCiAgICAgICAqIDIuNS42NgoKICAgICAgICogQWRkZWQgInVybCIgcGFyYW1ldGVyIHRvIFRhYlRhZyB0byBhbGxvdyBmb3IgSmF2YXNjcmlwdC1sZXNzCiAgICAgICB0YWJzLgoKICAgICAgICogUmVtb3ZlZCBXaWtpRXZlbnRNYW5hZ2VyLldpa2lFdmVudERlbGVnYXRlLm1fY2xpZW50IGZpZWxkLCBhcwogICAgICAgaXQgd2FzIG5vdCB1c2VkIGFueXdoZXJlLgoKICAgICAgICogVXBsb2FkVGVtcGxhdGUuanNwIG5vdyB1c2VzIHRoZSAidXJsIiBwYXJhbWV0ZXIgc28gdGhhdCBpdCdzIG5vdAogICAgICAgcG9zc2libGUgdG8gZ2V0IGJyb2tlbiBVUkxzIGFueW1vcmUgKGkuZS4gaXQgbG9va3MganVzdCBsaWtlIGEgcmVndWxhcgogICAgICAgcGFnZSB2aWV3LCBidXQgdGhlIFVSTCBzYXlzICJVcGxvYWQuanNwIikuICBUaGlzIHdvdWxkIGJlIHByZXR0eQogICAgICAgY29uZnVzaW5nIHRvIGFuIHVzZXIgaWYgeW91IHNlbnQgdGhlIHdyb25nIFVSTCBpbiBlbWFpbCwgYW5kIHRoZQogICAgICAgcmVjaXBpZW50IGRpZG4ndCBlLmcuIGhhdmUgYWNjZXNzIHRvIFVwbG9hZC5qc3AsIGJ1dCBkaWQgdG8gV2lraS5qc3AuLi4KCiAgICAgICAqIEFkZGVkIGRvYy9lY2xpcHNlL2pzcHdpa2ktY2hlY2tzdHlsZSBDaGVja3N0eWxlIEVjbGlwc2UgcHJlZmVyZW5jZXMuCgogICAgICAgKiBBZGRlZCBwYXRjaCBmcm9tIEp1YW4gUGFibG8gU2FudG9zIFJvZHJpcXVlcyB0byBhZGQgaTE4biB0YXJnZXRzCiAgICAgICB0byBidWlsZC54bWwuCgoyMDA3LTA1LTI2ICBBbmRyZXcgSmFxdWl0aCA8YW5kcmV3IEFUIGZyZXNoY29va2llcyBET1Qgb3JnPgoKICAgICAgICogMi41LjY1CgogICAgICAgKiBMb3RzIG9mIGxpdHRsZSBmaXhlcyBmb3IgYnVncyBGaW5kQnVncyBmb3VuZC4KCjIwMDctMDUtMjYgIERpcmsgRnJlZGVyaWNreCAoZGlyay5mcmVkZXJpY2t4QGdtYWlsLmNvbSkKCiAgICAgICAqIDIuNS42NCAtIDR0aCBCcnVzaGVkIFRlbXBsYXRlIGNvbW1pdCAoc3RpbGwgbW9yZSB0byBjb21lKQoKICAgICAgICogRm9udCBzaXplIGZpeGVkLiBWYXJpb3VzIGNzcyBlbmhhbmNlbWVudHMuIFNraW5zIG5vdCB5ZXQgZmluaXNoZWQuCgogICAgICAgKiBFbmhhbmNlZCBGaW5kIHBhZ2UsIGluY2x1ZGluZyBzZWFyY2ggc2NvcGUgKGF1dGhvciwgcGFnZW5hbWUsIGF0dGFjaGVtZW50KSwKICAgICAgIGFuZCBvbi9vZmYgY2hlY2tib3ggZm9yIGZpbmQgZGV0YWlscy4gRmluZCBwYWdlIGlzIG5vdyBhamF4IGRyaXZlbiwgYnV0IGFsc28KICAgICAgIGZ1bmN0aW9ucyBwcm9wZXJseSB3aGVuIGphdmFzY3JpcHQgaXMgb2ZmLgoKICAgICAgICogRWRpdCB0ZXh0YXJlYSBpcyByZXNpemVhYmxlLCB3aXRoIGEgY29vbCBkcmFnIGVmZmVjdC4KCiAgICAgICAqIEdvVG9Cb3R0b20gYW5kIEdvVG9Ub3AgbGlua3MgaGF2ZSBpY29ucyBpbnN0ZWFkIG9mID4+IGFuZCA8PAoKICAgICAgICogUmVmYWN0b3Jpbmcgb2YgQ29sbGFwc2UgYW5kIENvbGxhcHNlQm94LiBOZXcgaWNvbnMgKCsgYW5kIC0pIGFyZSBiZWluZyB1c2VkLgoKICAgICAgICogQnVnZml4ZXMgb24gVGlwcyBKU1BXaWtpIHN0eWxlCgogICAgICAgKiBUZXN0IFBsdWdpbiBhZGRlZCwgdG8gZW5oYW5jZSB1c2Ugb2YgSlNQV2lraSB2YXJpYWJsZXMuCiAgICAgICBFRyB5b3UgY2FuIG5vdyB1c2UgW3tURVNUIG5hbWU9ImNvbnRleHQiIG1hdGNoPSJlZGl0IiAgLi4uc29tZSBib2R5Li4uIH1dCiAgICAgICBmb3Igc3BlY2lmaWMgY29udGVudCBpbiB5b3VyIGxlZnRtZW51LgogICAgICAgTW9yZSBpbmZvIGF0IGh0dHA6Ly93d3cuanNwd2lraS5vcmcvd2lraS9CcnVzaGVkQ29uZGl0aW9uYWxQbHVnaW4KCgoyMDA3LTA1LTI1ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAqIDIuNS42MwoKICAgICAgICogRml4ZWQgYSBjb3VwbGUgb2YgdHlwb3MgaW4gZGVmYXVsdCB0ZW1wbGF0ZSAodGhhbmtzIHRvIEZyYW5rIEZpc2NoZXIpLgoKICAgICAgICogRml4ZWQgYSBjb3VwbGUgb2YgdHlwb3MgaW4gY29kZSAodGhhbmtzIHRvIE11cnJheSBBbHRoZWltKS4KCiAgICAgICAqIEZpeGVkIEhUTUwgZWRpdG9yIGNyYXNoaW5nIHdoZW4gZWRpdGluZyAodGhhbmtzIHRvIERhdmlkIEF1KS4KCjIwMDctMDUtMjIgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICogMi41LjYyCgogICAgICAgKiBBZGRlZCBDb29raWVBdXRoZW50aWNhdGlvbkxvZ2luTW9kdWxlLiAgVGhpcyBtb2R1bGUgc3RvcmVzCiAgICAgICBhbiBVSUQgaW4gdGhlIHVzZXIncyBicm93c2VyLCBhbmQgYXV0b21hdGljYWxseSBsb2dzIHRoZSB1c2VyCiAgICAgICBpbiwgaWYgdGhlIGNvb2tpZSBleGlzdHMuICBUaGlzIGNhbiBiZSBhIHNlY3VyaXR5IGhhemFyZCwgc28KICAgICAgIGl0IGlzIGEgZ29vZCBpZGVhIHRvIGRpc2FibGUgaXQgaW4ganNwd2lraS5qYWFzLCBpZiB5b3UgYXJlCiAgICAgICB3b3JyaWVkIGFib3V0IGxvY2FsIHVzZXJzIGJlaW5nIGFibGUgdG8gc3Bvb2YgaWRlbnRpdGllcy4KICAgICAgIEZvciB0aGlzIHJlYXNvbiwgaXQncyBieSBkZWZhdWx0IGRpc2FibGVkIGluIGpzcHdpa2kuamFhcwoKICAgICAgICogTW9kaWZpZWQgTG9naW5Db250ZW50LmpzcCB0byBjb250YWluICJSZW1lbWJlciBtZT8iIGNoZWNrYm94LgoKMjAwNy0wNS0yMCAgQW5kcmV3IEphcXVpdGggPGFuZHJldyBBVCBmcmVzaGNvb2tpZXMgRE9UIG9yZz4KCiAgICAgICAqIDIuNS42MQoKICAgICAgICogRml4ZWQgdGhlIGxhc3Qgb2YgdGhlIGZhaWxpbmcgSldlYlVuaXQgdGVzdHMuIEFsc28gYWRkZWQgYSBuZXcgb25lCiAgICAgICB0aGF0IHZlcmlmaWVzIHRoYXQgcHJvZmlsZSByZW5hbWluZyBvcGVyYXRpb25zIGNvcnJlY3RseSByZS1zZXQgZ3JvdXAKICAgICAgIG1lbWJlcnNoaXBzIGFuZCBwYWdlIEFDTHMuCgoyMDA3LTA1LTIwICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAqIDIuNS42MAoKICAgICAgICogTmV3LCBpbXByb3ZlZCBTcGFtRmlsdGVyIHdpdGggQ2FwdGNoYSByZWNvZ25pdGlvbiwgaWYgd2UKICAgICAgIHN1c3BlY3QgeW91IHRvIGJlIGEgc3BhbW1lci4gIENhcHRjaGEgc3lzdGVtIGlzIGN1cnJlbnRseSBiYXNlZAogICAgICAgb24gTWljcm9zb2Z0IFJlc2VhcmNoJ3MgQXNpcnJhLCB0aG91Z2ggd2Ugd2lsbCBwcm9iYWJseSB3YW50CiAgICAgICB0byBtYWtlIGl0IHBsdWdnYWJsZS4gIEkgaGF2ZSB0byBhZG1pdCB0aGF0IHRoaXMgcmVxdWlyZWQKICAgICAgIGZhciB0b28gbXVjaCBzdXJnZXJ5IGluIEVkaXQuanNwIHRvIGJlIG5vdGhpbmcgYnV0IGEgaGFjaywKICAgICAgIGJ1dCBJIGhhdmUgdG8gZ2V0IGl0IG9mZiBteSBoYXJkIGRyaXZlLiAgSW4gYWRkaXRpb24sCiAgICAgICBjb21tZW50aW5nIGRvZXMgbm90IHdvcmssIGlmIHNwYW0gaXMgZGV0ZWN0ZWQuCgoyMDA3LTA1LTE5ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAqIDIuNS41OQoKICAgICAgICogQWdhaW4sIGEgbnVtYmVyIG9mIENoZWNrU3R5bGUgaXNzdWVzIGZpeGVkLgoKICAgICAgICogU3dpdGNoZWQgdG8gbmV3IEh0dHBNdWx0aXBhcnRSZXF1ZXN0IGxpYnJhcnkgKDIuMDBiOSkKCiAgICAgICAqIEFkZGVkIHVwbG9hZCBwcm9ncmVzcyBiYXIuICBVbmZvcnR1bmF0ZWx5LCBpdCdzIHN0aWxsIGtpbmRhCiAgICAgICBrbHVkZ3ksIGJ1dCB3ZSdsbCB0cnkgdG8gZml4IGl0LiAgVGhlIGJhY2tlbmQgc3R1ZmYgd29ya3M7IGl0J3MganVzdAogICAgICAgdGhlIFVJIHdoaWNoIGxvb2tzIGxpa2UgYSBicmljayBvZiBsZWdvcyBidWlsdCBieSBhIHR3by15ZWFyIG9sZC4KCiAgICAgICAqIE5ldyBwYWNrYWdlOiBjb20uZWN5cmQuanNwd2lraS51aS5wcm9ncmVzcywgd2hpY2ggbWFuYWdlcyBkaWZmZXJlbnQKICAgICAgIGtpbmRzIG9mIHByb2dyZXNzIHN5c3RlbXMuCgoyMDA3LTA1LTE0ICBEaXJrIEZyZWRlcmlja3ggKGRpcmsuZnJlZGVyaWNreEBnbWFpbC5jb20pCgogICAgICAgKiBpMThuIGRlZmF1bHQucHJvcGVydGllcyBpbmNsdWRlZCwgaW5saW5lIHdpdGggbGFzdCBCcnVzaGVkVGVtcGxhdGUgY29tbWl0CgoyMDA3LTA1LTExICBEaXJrIEZyZWRlcmlja3ggKGRpcmsuZnJlZGVyaWNreEBnbWFpbC5jb20pCgogICAgICAgKiAyLjUuNTggLSAzbmQgQnJ1c2hlZCBUZW1wbGF0ZSBjb21taXQgKHN0aWxsIG1vcmUgdG8gY29tZSkKCiAgICAgICAqIFF1aWNrIE5hdmlnYXRpb24gYm94IGhhcyBiZWVuIHJlZmFjdG9yZWQgYW5kIG5vdyB1c2VzIHRoZSBuZXcgUlBDLUpTT04gaW4gdGhlIGJhY2tlbmQuCiAgICAgICBTZWFyY2ggaWNvbiBhZGRlZC4KCiAgICAgICAqIFVwZGF0ZSBvZiBhbGwgRWRpdG9ycywgaW5jbHVkaW5nIEZDSyBhbmQgV2lraVdpemFyZC4gKGkxOG4gYWxpZ25tZW50KQogICAgICAgeW91IGNhbiBub3cgYWxzbyB1c2Ugd3lzaXd5ZyBlZGl0b3JzIGluIHRoZSBDb21tZW50LmpzcC4gVGhlcmUgaXMgc3RpbGwgYQogICAgICAgd2lkaHQvaGVpZ2ggYnVnIGluIHRoZSBjb21iaW5hdGlvbiBXaWtpV2l6YXJkICYgRmlyZUZveCAodmlzaWJsZSBpbiBDb21tZW50LmpzcCkKCiAgICAgICAqIEZvbnQtc2l6ZSBpcyBiYXNlZCBvbiB0aGUgZGVmYXVsdCBicm93c2VyIHNldHRpbmdzLiBGb3IgRkYgdGhpcyBpcyBwcmV0dHkgbGFyZ2UuCiAgICAgICBZb3UgY2FuIG5vdyBhZGp1c3QgdGhlIGZvbnQtc2l6ZSBpbiB0aGUgVXNlclByZWZlcmVuY2VzLgoKICAgICAgICogTWFueSBidWdmaXhlczogZS5nIGNvb2tpZSBoYW5kbGluZy4KCgoyMDA3LTA1LTEzICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAqIEluc3RhbGxlZCAiRmluZEJ1Z3MiIGFuZCAiQ2hlY2tzdHlsZSIsIGFuZCBmb3VuZCBhYm91dCAxNTAwCiAgICAgICBwcm9ibGVtcy4gIFRoaXMgdXBkYXRlIGZpeGVzIGEgbnVtYmVyIG9mIG1pbm9yIGNvZGUgc3R5bGUgaXNzdWVzLgogICAgICAgTm8gZnVuY3Rpb25hbGl0eSBjaGFuZ2VzLCB0aGVyZWZvcmUgbm8gcmV2aXNpb24gYnVtcC4KCgoyMDA3LTA1LTExICBEaXJrIEZyZWRlcmlja3ggKGRpcmsuZnJlZGVyaWNreEBnbWFpbC5jb20pCgogICAgICAgKiAyLjUuNTcgLSAybmQgQnJ1c2hlZCBUZW1wbGF0ZSBjb21taXQgKG1vcmUgdG8gY29tZSkKCiAgICAgICAqIFJlbW92ZSBJbmZvIHRhYiBmcm9tIGFsbCBzY3JlZW5zLCBhcyBpdCBjYXVzZXMgb3ZlcmxvYWQgb24gdGhlIHdpa2kgc2VydmVyLAogICAgICAgYnV0IGFsc28gdG8gYXZvaWQgY29uZnVzaW9uIHdoZW4gc2ltaWxhciBzY3JlZW5zIGFyZSBzZXJ2ZWQgZnJvbSBkaWZmZXJlbnQgVVJMcy4KICAgICAgIFRoZSBpbmZvIHBhZ2UgaGFzIGJhY2sgaXQgb3duIGV4aXN0ZW5jZSwgd2l0aCBzbWFsbCBvcHRpbWFsaXNhdGlvbnMuCgogICAgICAgKiBNb290b29scyBsaWJyYXJ5IHVwZ3JhZGVkIHRvIHYxLjEsIGp1c3QgcmVsZWFzZWQKCiAgICAgICAqIEFkZGVkIGNvZGUgcHJldHRpZmllciBmcm9tIEdvb2dsZS4gKHVzZSAlJXByZXR0aWZ5IGFyb3VuZCBjb2RlIGJsb2NrcykKCiAgICAgICAqIFNldmVyYWwgc21hbGxlciByZWZhY3RvcmluZ3Mgb24ganNwJ3MgYW5kIGkxOG4gZGVmYXVsdC5wcm9wZXJ0aWVzCiAgICAgICBUaGUgbmV3IG1vcmUtaW5mbyBtZW51IGdldHMgcmVwbGFjZWQgYnkgZHJvcGRvd24gd2hlbiBicm93c2VyIGhhcyBqYXZhc2NyaXB0IG9uLgoKICAgICAgICogQnVnZml4IG9uIG51bWJlcmZvcm1hdCByZXBvcnRlZCBieSBGcmFuayBGaXNoZXIuCiAgICAgICBTZWUgaHR0cDovL3d3dy5qc3B3aWtpLm9yZy93aWtpL0J1Z0F0dGFjaG1lbnRBbmRJbmZvVGFic0FyZUJsYW5rCgoKMjAwNy0wNS0wOCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgKiAyLjUuNTYKCiAgICAgICAqIFRpbnkgcmVmYWN0b3JpbmdzIGFsbCBvdmVyIHRoZSBwbGFjZTsgcmVtb3ZpbmcgdW5uZWNlc3NhcnkKICAgICAgIGltcG9ydHMsIHJlbmFtaW5nIGZpZWxkcywgcmVtb3ZpbmcgY29tcGlsZXIgd2FybmluZ3MsCiAgICAgICB0aGF0IHNvcnQgb2Ygc3R1ZmYuCgogICAgICAgKiBSZW1vdmVkIGpteHJpLmphciBhbmQgam14dG9vbHMuamFyIGZyb20gdGhlIGRpc3RybyAtIHNpbmNlCiAgICAgICB3ZSByZXF1aXJlIDEuNSBhbnl3YXkgdG8gY29tcGlsZSwgdGhlcmUncyBub3QgbXVjaCBwb2ludCBpbgogICAgICAgcHV0dGluZyB0aGVtIGluIGhlcmUuICBNb3N0IEoyRUUgY29udGFpbmVycyBhbHJlYWR5IHNoaXAKICAgICAgIHdpdGggYSBKTVggaW1wbGVtZW50YXRpb24gYW55d2F5LgoKMjAwNy0wNS0wOCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgKiAyLjUuNTUKCiAgICAgICAqIFRpbnkgb3B0aW1pemF0aW9uIGZvciBQYWdlTWFuYWdlciwgaW1wcm92aW5nIHRoZSBwZXJmb3JtYW5jZQogICAgICAgZm9yIHBhZ2VFeGlzdHMoU3RyaW5nLGludCksIGlmIENhY2hpbmdQcm92aWRlciBpcyBpbiB1c2UuCiAgICAgICBUaGlzIHNob3VsZCBoZWxwIGNvbnNpZGVyYWJseSBpbiBsaXN0aW5nIHBhZ2UgaGlzdG9yaWVzLgoKMjAwNy0wNS0wNyAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgKiAyLjUuNTQKCiAgICAgICAqIFNldmVyYWwgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucywgaW5jbHVkaW5nOgoKICAgICAgICogQWRkZWQgUGVybWlzc2lvbkZhY3RvcnksIHdoaWNoIGNhY2hlcyB0aGUgcGVybWlzc2lvbnMgdXNpbmcKICAgICAgIGEgV2Vha0hhc2hNYXAuICBDcmVhdGlvbiBvZiBQYWdlUGVybWlzc2lvbnMgaXMgcmVsYXRpdmVseSBleHBlbnNpdmUKICAgICAgIGR1ZSB0byBwZXJtaXNzaW9ucyBwYXJzaW5nLCBzbyB0aGlzIHNob3VsZCBoZWxwIGEgbG90LiAgQWxsIHJvdXRpbmVzCiAgICAgICBzaG91bGQgYmUgdXNpbmcgdGhlIFBlcm1pc3Npb25GYWN0b3J5LmdldFBhZ2VQZXJtaXNzaW9uKCksIGlmIHBvc3NpYmxlLgoKICAgICAgICogUmVmYWN0b3JlZCBBYnN0cmFjdENvbW1hbmQgY29uc3RydWN0b3Igc28gdGhhdCBpdCBubyBsb25nZXIgdXNlcwogICAgICAgU3RyaW5nLnJlcGxhY2VBbGwoKSwgd2hpY2ggaXMgYSB2ZXJ5IGV4cGVuc2l2ZSBvcGVyYXRpb24gZHVlIHRvCiAgICAgICByZWd1bGFyIGV4cHJlc3Npb25zLiAgSXQncyBzdGlsbCBleHBlbnNpdmUsIGJ1dCB0aGUgYmlnZ2VzdCBwYWluCiAgICAgICBwb2ludCBpcyBub3cgcmVzb2x2ZWQuCgogICAgICAgKiBJbmZvVGFiIGp1c3QgbGlzdHMgUmVmZXJyaW5nUGFnZXMgb25lIGRlZXAgLSB0aHJlZS1sZXZlbCBkZWVwIG5lc3RpbmcKICAgICAgIGVuZGVkIHVwIHVzaW5nIHNvbWV0aGluZyBsaWtlIDMwJSBvZiBhbGwgQ1BVIHBvd2VyIG9uIGEgbW9kZXJhdGVseQogICAgICAgbGluay1oZWF2eSBwYWdlLgoKICAgICAgICogQnVnIGZpeDogaWYgdGhlIHVzZXIgdXBkYXRlZCBoaXMgYWNjb3VudCAoZS5nLiBieSByZXF1ZXN0aW5nIGEgbmV3CiAgICAgICBwYXNzd29yZCkgQU5EIGhpcyBhY2NvdW50IHdhcyBjcmVhdGVkIGluIHRoZSBvbGQgZGF5cyB3aGVuCiAgICAgICBYTUxVc2VyRGF0YWJhc2Ugd2FzIHVzaW5nIHBsYXRmb3JtIGRlZmF1bHQgZm9ybWF0dGluZyBmb3IgZGF0ZXMsCiAgICAgICB0aGUgZGF0ZXMgd2VyZSBpbiBkaWZmZXJlbnQgZm9ybWF0cywgY2F1c2luZyBYTUxVc2VyRGF0YWJhc2UgdG8KICAgICAgIGJlaGF2ZSBpcnJhdGlvbmFsbHkuCgogICAgICAgKiBSZWZlcnJlZFBhZ2VzUGx1Z2luIG5vdyBhbGxvY2F0ZXMgYSBiaWdnZXIgYnVmZmVyIGZvciBjcmVhdGluZwogICAgICAgaHRtbCB0byBhdm9pZCBhbGxvY2F0aW9uIG92ZXJoZWFkLiAgRGl0dG8gZm9yIFRhYmJlZFNlY3Rpb25UYWcuCgoyMDA3LTA1LTA2ICBBbmRyZXcgSmFxdWl0aCA8YW5kcmV3IEFUIGZyZXNoY29va2llcyBET1Qgb3JnPgoKICAgICAgICogMi41LjUzCgogICAgICAgKiBDaGFuZ2VkIHRoZSBiZWhhdmlvciBvZiB0aGUgVXNlckRhdGFiYXNlIGFuZCBHcm91cERhdGFiYXNlIGNsYXNzZXMKICAgICAgIHNvIHRoYXQgdGhlIHNhdmUvZGVsZXRlIG1ldGhvZHMgYXJlIGF0b21pYy4gQ29uc2VxdWVudGx5LCB0aGUKICAgICAgIGNvbW1pdCgpIG1ldGhvZHMgaW4gdGhlc2UgY2xhc3NlcyBhcmUgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCiAgICAgICBpbiBhIGZ1dHVyZSByZWxlYXNlLiBUaGUgcmVhc29uIGZvciB0aGlzIGNoYW5nZSBpcyBzaW1wbGU6IHRoZQogICAgICAgY29tbWl0KCkgbWV0aG9kcyBtYWRlIG5vIHNlbnNlIGFuZCB3ZXJlIG5ldmVyICpub3QqIHVzZWQuIEFsc28sIGFkZGVkCiAgICAgICBhIG5ldyBtZXRob2QsIHJlbmFtZSgpLCB0aGF0IHBlcm1pdHMgcmVuYW1pbmcgb2YgcHJvZmlsZSBsb2dpbiBuYW1lcy4KICAgICAgIFJlZmVyZW5jZXMgdG8gY29tbWl0KCkgd2VyZSByZW1vdmVkIGZyb20gYWxsIGNsYXNzZXMsIGluY2x1ZGluZwogICAgICAgdGVzdCBjbGFzc2VzLgoKICAgICAgICogUmVjZW50bHkgYWRkZWQgc3RhdHVzIGZsYWdzIGZvciBVc2VyQ2hlY2tUYWcgd2VyZSBtb3ZlZCB0bwogICAgICAgVXNlclByb2ZpbGVUYWcgYW5kIHJlbmFtZWQuIFRoZSBuZXcgcHJvcGVydHkgdmFsdWVzIGFyZQogICAgICAgImNhbkNoYW5nZVBhc3N3b3JkIiBhbmQgImNhbkNoYW5nZUxvZ2luTmFtZSIgYW5kIGFyZSB1c2VkIGluCiAgICAgICBQcm9maWxlVGFiLmpzcCB0byBzZWxlY3RpdmVseSBkaXNwbGF5IGlucHV0IGZpZWxkcy4gVGhlc2UKICAgICAgIHByb3BlcnRpZXMgYWxzbyBhbGxvdyBuZWdhdGlvbiB0b28gKGUuZy4sICFjYW5DaGFuZ2VQYXNzd29yZCkuCgogICAgICAgKiBVc2VyTWFuYWdlciByZWNlaXZlcyBmaW5hbCB0d2Vha3MgdG8gYWxsb3cgcHJvZmlsZSByZW5hbWluZy4KICAgICAgIE1vZGlmaWVkIFByb2ZpbGVUYWIuanNwIHNsaWdodGx5IHRvIGFjY29tbW9kYXRlIHRoaXMgbmV3IGZlYXR1cmUuCgogICAgICAgKiBNaW5vciBkZS1zdHJpbmdpZmljYXRpb24gYW5kIGFuYWwtcmV0ZW50aXZlIGkxOG4gdHdlYWtzLgoKICAgICAgICogRml4ZWQgc2V2ZXJhbCBmYWlsaW5nIHdlYiB1bml0IHRlc3RzLiBBIGZldyBzdGlsbCBmYWlsLCB0aG91Z2guCgoyMDA3LTA1LTA1ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAqIDIuNS41MgoKICAgICAgICogRml4ZWQgVGVtcGxhdGVNYW5hZ2VyLmxpc3RTa2lucygpIHNvIHRoYXQgaXQgcmV0dXJucyBvbmx5CiAgICAgICBkaXJlY3Rvcmllcywgbm90IGV2ZXJ5dGhpbmcuCgogICAgICAgKiBBZGRlZCBTZWFyY2hNYW5hZ2VyLkpTT05TZWFyY2guZmluZFBhZ2VzKCksIHRob3VnaCBiZSB3YXJuZWQgdGhhdAogICAgICAgaXQgY2FuIGJlIHJlYWxseSBzbG93LiAgQW4gQVBJIGNoYW5nZSB0byBTZWFyY2hQcm92aWRlciBuZWVkcyB0byBiZQogICAgICAgZG9uZSBiZWZvcmUgdGhpcyBjYW4gYmUgZml4ZWQuCgogICAgICAgKiBSZWZvcm1hdHRlZCBDaGFuZ2VMb2cgdG8gd29yZCB3cmFwIGF0IGNvbHVtbiA4MCB0byBtYWtlIGl0IG1vcmUKICAgICAgIHJlYWRhYmxlLi4uCgogICAgICAgKiBBIG1ham9yIGNvbW1pdCBvZiBuZXcgQWRtaW4uanNwIGFuZCBBZG1pblRlbXBsYXRlLmpzcCBhbmQgYWxsIHRoZQogICAgICAgcmVsYXRlZCBwYXJhcGhlcm5hbGlhLiAgSXQncyBub3QgeWV0IGNvbXBsZXRlLCBidXQgdGhlIGZyYW1ld29yayBpcwogICAgICAgZ2V0dGluZyB0aGVyZS4gIER1ZSB0byB0aGUgdXNlIG9mIEpNWCwgSlNQV2lraSBub3cgcmVxdWlyZXMgSkRLIDEuNQogICAgICAgdG8gY29tcGlsZSAodGhvdWdoIGl0IHNob3VsZCBoYXBwaWx5IGNvbnRpbnVlIHRvIHJ1biB1bmRlciAxLjQgYXMKICAgICAgIHdlbGwpLgoKMjAwNy0wNS0wMyAgRGlyayBGcmVkZXJpY2t4IChkaXJrLmZyZWRlcmlja3hAZ21haWwuY29tKQoKICAgICAgICogMi41LjUxIC0gQnJ1c2hlZCBUZW1wbGF0ZSBpbmNvcnBvcmF0ZWQuCgogICAgICAgKiBCdWxrIGNvbW1pdCBvZiBCcnVzaGVkIFRlbXBsYXRlLiBFeHBlY3QgdGhpbmdzIHRvIGJlIGJyb2tlbiA6LSkKICAgICAgIEpTUFdpa2kgbm93IGhhcyBhIHRhYmJlZC11c2VyIGludGVyZmFjZSwgc2tpbnMsIHNsaW1ib3ggYXR0YWNoLXZpZXdlciwKICAgICAgIGltcHJvdmVkIGpzcHdpa2ktc3R5bGVzIHN1Y2hzIGFzIHRhYmxlLWZpbHRlcnMsIGFjY29yZGlvbnMsIHRpcHMsCiAgICAgICBldGMuIGV0Yy4uLiAgTG9vayAnbiBmZWVsIGlzIHN0aWxsIHZlcnkgaWtlYSBsaWtlLiAgUmVhZCB0aGUKICAgICAgIGpzcHdpa2kuY3NzIHRvIGNoYW5nZSBjb2xvciBzY2hlbWUuICBBZGRpdGlvbmFsIG1lbnUgaXRlbXMgYXJlIG5vdwogICAgICAgdmlzaWJsZSB2aWEgYSAiTW9yZS4uLi4iIGRyb3Bkb3duLgoKICAgICAgICogSmF2YXNjcmlwdCBpcyBiYXNlZCBvbiB0aGUgbW9vdG9vbHMgbGlicmFyeS4KCiAgICAgICAqIE1hbnkgSlNQcyBhcmUgbm93IGRyaXZlbiBieSBKU1RMJ3MgRUwuIE5vdCB5ZXQgMTAwJSBjb21wbGV0ZWQuCgogICAgICAgKiBPbmx5IHBsYWluIGVkaXRvciBoYXMgYmVlbiB1cGRhdGVkLiBObyB3b3JrIGRvbmUgeWV0IG9uIFdpa2lXaXphcmQsCiAgICAgICBGQ0sKCiAgICAgICAqIFRoZSBKU1BXaWtpIHRlbXBsYXRlIGhhcyBiZWVuIHRlc3RlZCBvbiBzYWZhcmkgYW5kIEZGLgogICAgICAgRmVlZGJhY2sgb24gSUUgNi54IGFuZCA3LnguIGlzIGFwcHJlY2lhdGVkLgoKICAgICAgICogUmVjZW50Q2hhbmdlcyBwbHVnaW4gbm93IHNldHMgY29sc3BhbiBjb3JyZWN0bHkuIChmb3JtYXR0aW5nIG9mCiAgICAgICByZWNlbnQgY2hhbmdlcyBwYWdlKQoKICAgICAgICogVHdvIHNraW5zIGFkZGVkOiBTbWFydCBhbmQgT3JkZXJlZExpc3QuIFRoZXNlIHNraW5zIGFyZSBub3QgeWV0CiAgICAgICB0ZXN0ZWQgMTAwJS4KCgoyMDA3LTA1LTAxICBBbmRyZXcgSmFxdWl0aCA8YW5kcmV3IEFUIGZyZXNoY29va2llcyBET1Qgb3JnPgoKICAgICAgICogRW5oYW5jZW1lbnQ6IGNoZWNrZWQgaW4gYmFjay1lbmQgY29kZSB0aGF0IHJlbW92ZXMgdGhlIHJlc3RyaWN0aW9uCiAgICAgICBvbiBjaGFuZ2luZyBsb2dpbiBuYW1lcyBhbmQgdXNlciBuYW1lcyAoImZ1bGwgbmFtZXMiKSBhZnRlcgogICAgICAgcmVnaXN0cmF0aW9uLiBUbyBkbyB0aGlzLCBVc2VyTWFuYWdlciBlbWl0cyBhIG5ldyBXaWtpU2VjdXJpdHlFdmVudAogICAgICAgY2FsbGVkIFBST0ZJTEVfTkFNRV9DSEFOR0VEIHRoYXQgc2lnbmFscyB3aGVuIHRoZSBsb2dpbiBuYW1lIG9yIHVzZXIKICAgICAgIG5hbWUgY2hhbmdlcy4gUGFnZU1hbmFnZXIgYW5kIEdyb3VwTWFuYWdlciBsaXN0ZW4gZm9yIHRoaXMgZXZlbnQsCiAgICAgICBhbmQgd2lsbCBtYWtlIGFsbCBhcHByb3ByaWF0ZSBjaGFuZ2VzIHRvIHBhZ2UgQUNMcyBhbmQgZ3JvdXBzIHRoYXQKICAgICAgIGNvbnRhaW4gdGhlIG9sZCB1c2VyIG5hbWUocykuIFRoZSBmcm9udC1lbmQgY2hhbmdlcyAoSlNQIHR3ZWFrcykKICAgICAgIGFyZSBuZWFybHkgZmluaXNoZWQgYW5kIHdpbGwgYmUgY2hlY2tlZCBpbiBzaG9ydGx5LgoKICAgICAgICogQWRkZWQgYSBuZXcgbWV0aG9kIGZvciBBY2xNYW5hZ2VyLCBzZXRQZXJtaXNzaW9ucygpLCB0aGF0IHBlcnNpc3RzCiAgICAgICBBY2xzLiBUaGUgRGVmYXVsdEFjbE1hbmFnZXIgKHdoaWNoIGV4dHJhY3RzIEFjbHMgZnJvbSB3aWtpIHBhZ2UgbWFya3VwKQogICAgICAgaW1wbGVtZW50cyBzZXRQZXJtaXNzaW9ucygpIGJ5IGluamVjdGluZyB0aGUgW3tBTExPVyAuLi4ufV0gbWFya3VwCiAgICAgICBpbnRvIHRoZSB3aWtpIHBhZ2UuCgogICAgICAgKiBTeW5jaHJvbml6ZWQgdGhyZWFkLXNlbnNpdGl2ZSBtZXRob2RzIGluIHRoZSBBY2xJbXBsL0FjbEVudHJ5SW1wbAogICAgICAgY2xhc3MuCgoyMDA3LTA0LTI4ICBBbmRyZXcgSmFxdWl0aCA8YW5kcmV3IEFUIGZyZXNoY29va2llcyBET1Qgb3JnPgoKICAgICAgICogRW5oYW5jZW1lbnQ6IHVzZXIgcHJvZmlsZSBKU1BzIG5vIGxvbmdlciByZXF1ZXN0IGEgZGlzdGluY3Qgd2lraQogICAgICAgbmFtZSB3aGVuIGEgdXNlciByZWdpc3RlcnMuIFRoZSB3aWtpIG5hbWUgaXMgbm93IGNvbXB1dGVkIGF1dG9tdGljYWxseTsKICAgICAgIGl0IGlzIHRoZSB1c2VyIG5hbWUgd2l0aG91dCBhbnkgd2hpdGVzcGFjZS4gVGhpcyBjaGFuZ2Ugc2hvdWxkIG1ha2UKICAgICAgIHJlZ2lzdHJhdGlvbiBldmVuIGVhc2llci4gIEluIHRoZSB2YXJpb3VzIHVzZXIgbWFuYWdlci9kYXRhYmFzZQogICAgICAgY2xhc3NlcywgVXNlclByb2ZpbGUvRGVmYXVsdFVzZXJQcm9maWxlLnNldFdpa2lOYW1lKCkgaXMgaGVyZWJ5CiAgICAgICBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4gSG93ZXZlciwKICAgICAgIGdldFdpa2lOYW1lKCkgcmVtYWlucywgYXMgZG9lcyB0aGUgVXNlckRhdGFiYXNlIG1ldGhvZCBmaW5kQnlXaWtpTmFtZSgpLgogICAgICAgVGhlIFVzZXJEYXRhYmFzZSBjbGFzc2VzIGRvIG5vdCBjaGFuZ2UgdGhlaXIgcHVibGljIEFQSXMsIGFuZCB0aGV5CiAgICAgICBzdGlsbCBwZXJzaXN0IFdpa2lOYW1lcyBzbyB0aGF0IHRoZXkgY2FuIGJlIHNlYXJjaGVkLiBIb3dldmVyLCB3aGVuCiAgICAgICBVc2VyTWFuYWdlciBsb2FkcyBhIHByb2ZpbGUgZnJvbSB0aGUgVXNlckRhdGFiYXNlLCBpdCBhbHdheXMgcmUtY29tcHV0ZXMKICAgICAgIHRoZSB3aWtpIG5hbWUuCgogICAgICAgKiBUd2Vha2VkIGkxOG4gcmVzb3VyY2UgZmlsZSB0byByZW1vdmUgcmVmZXJlbmNlcyB0byAid2lraSBuYW1lcyIgaW4KICAgICAgIGZhdm9yIG9mIGp1c3QgcGxhaW4gb2xkICJuYW1lcy4iIFR5cG9ncmFwaGljYWxseSBjb3JyZWN0IGN1cmx5IHF1b3RlcwogICAgICAgd2VyZSBzdWJzdGl0dXRlZCB3aGVyZXZlciBuZWVkZWQuCgoyMDA3LTA0LTIzICBDaHJpc3RvcGggU2F1ZXIgPHNhdWVyIEFUIGhzLWhlaWxicm9ubiBET1QgZGU+CgogICAgICAqIDIuNS40OCAtIEJ1Z2ZpeAoKICAgICAgKiBCdWdmaXg6IE51bGxQb2ludGVyIEV4Y2VwdGlvbiBvbiBpbml0UmVmZXJlbmNlTWFuYWdlciwgcmVhc29uCiAgICAgICAgd2FzIHRoYXQgaXQgaW5kaXJlY3RseSB1c2VzIHRoZSBmaWx0ZXJNYW5hZ2VyIC0+IG1fZmlsdGVyTWFuYWdlcgogICAgICAgIGhhcyB0byBiZSBpbml0aWFsaXplZCBiZWZvcmUuCgoKMjAwNy0wNC0yMyAgQW5kcmV3IEphcXVpdGggPGFuZHJldyBBVCBmcmVzaGNvb2tpZXMgRE9UIG9yZz4KCiAgICAgICAqIDIuNS40NyBha2EgdGhlIEphdmFNYWlsIHJlZmFjdG9yaW5nIHJlbGVhc2UKCiAgICAgICAqIEVuaGFuY2VtZW50OiBUbyBpbmNyZWFzZSBzZWN1cml0eSwgTWFpbFV0aWwgZ2FpbnMgdGhlIGFiaWxpdHkgdG8gdXNlCiAgICAgICBjb250YWluZXItbWFuYWdlZCBKTkRJIEphdmFNYWlsIHNlc3Npb24gZmFjdG9yaWVzLCBpbiBhZGRpdGlvbiB0byB0aGUKICAgICAgIHN0YW5kYWxvbmUgZmFjdG9yeSBjb25maWd1cmVkIHZpYSBqc3B3aWtpLnByb3BlcnRpZXMuIEpOREkgaXMgbm93IHRoZQogICAgICAgcHJlZmVycmVkIG1ldGhvZCBvZiBvYnRhaW5pbmcgbWFpbCBzZXNzaW9ucywgYW5kIHdpbGwgYWx3YXlzIGJlIGF0dGVtcHRlZAogICAgICAgZmlyc3QgYmVmb3JlIGZhbGxpbmcgYmFjayB0byB0aGUgc3RhbmQtYWxvbmUgbWV0aG9kLiBTZWUgdGhlIEphdmFEb2NzCiAgICAgICBmb3IgTWFpbFV0aWwuIEFsbCBvZiBNYWlsVXRpbCdzIGludGVybmFsIGNvZGUsIHRlc3QgcHJvcGVydGllcwogICAgICAgYW5kIEphdmFEb2NzIHdlcmUgYWxzbyB0b3RhbGx5IHJlZmFjdG9yZWQuIEEgc2FtcGxlIEpOREkgYmxvY2sgZm9yIEphdmFNYWlsCiAgICAgICB3YXMgYWRkZWQgdG8gd2ViLnhtbDsgaXQgaXMgY29tbWVudGVkIG91dCBieSBkZWZhdWx0LgoKICAgICAgICogRW5oYW5jZW1lbnQgTG9zdFBhc3N3b3JkLmpzcCBub3cgdXNlcyBQT1NUIGZvciBmb3JtIHN1Ym1pc3Npb24uCgogICAgICAgKiBFbmhhbmNlbWVudDogUHJvZmlsZSByZWdpc3RyYXRpb25zIG5vdyBhdXRvbWF0aWNhbGx5IHRyaWdnZXIgYW4KICAgICAgIGUtbWFpbCBjb25maXJtYXRpb24gdG8gdGhlIHVzZXIsIGlmIGFuIGUtbWFpbCBhZGRyZXNzIHdhcyBzdXBwbGllZC4KCiAgICAgICAqIEJ1ZyBmaXg6IHBhZ2Utc2F2ZSB3b3JrZmxvdyBkb2VzIG5vIGxvbmdlciBzZW5kcyByZWplY3Rpb24gU2ltcGxlTm90aWZpY2F0aW9ucwogICAgICAgdG8gdXNlcnMgdW5sZXNzIHRoZXkgaGF2ZSBhbHJlYWR5IGF1dGhlbnRpY2F0ZWQgd2hlbiB0aGV5IHNhdmUgdGhlIHBhZ2UuCiAgICAgICBBbHNvLCB0aGUgc3VibWl0dGVyJ3MgYXV0aGVudGljYXRpb24gc3RhdHVzIGlzIGFkZGVkIGFzIGEgRmFjdCBmb3IgdGhlCiAgICAgICBhcHByb3ZlciB0byBjb25zaWRlci4KCiAgICAgICAqIFdvcmtmbG93QnVpbGRlci5idWlsZEFwcHJvdmFsV29ya2Zsb3cgbm93IGludGVycHJldHMgYSBudWxsIHZhbHVlIGZvcgogICAgICAgdGhlIHJlamVjdGVkTWVzc2FnZUtleSBwYXJhbWV0ZXIgYXMgbWVhbmluZyAiZG9uJ3Qgc2VuZCBhIG5vdGlmaWNhdGlvbiIKICAgICAgIHVwb24gcmVqZWN0aW9uLgoKICAgICAgICogTWFpbFRlc3QgbW92ZWQgdG8gdGhlICoudXRpbCBwYWNrYWdlLCB3aGljaCB3YXMgd2hlcmUgaXQgYmVsb25nZWQuCgoyMDA3LTA0LTIyICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAqIDIuNS40NiAtIG15IGJpcnRoZGF5IHJlbGVhc2UhCgogICAgICAgKiBQZXJtaXNzaW9uVGFnIG5vdyBhbGxvd3MgYSBsaXN0IG9mIHBlcm1pc3Npb25zIGp1c3QgbGlrZQogICAgICAgQ2hlY2tSZXF1ZXN0Q29udGV4dFRhZywgYXMgd2VsbCBhcyBuZWdhdGl2ZSBwZXJtaXNzaW9ucy4gIEJhc2VkCiAgICAgICBvbiBhbiBpZGVhIGJ5IERpcmsgRnJlZGVyaWNreCAod2hvc2UgbGFzdCBuYW1lIEkgd2lsbCBsZWFybiB0bwogICAgICAgc3BlbGwgb25lIG9mIHRoZXNlIGRheXMpLgoKMjAwNy0wNC0xNyAgQW5kcmV3IEphcXVpdGggPGFuZHJldyBBVCBmcmVzaGNvb2tpZXMgRE9UIG9yZz4KCiAgICAgICAqIDIuNS40NQoKICAgICAgICogQ2hlY2tlZCBpbiB3b3JrZmxvdyBzdXBwb3J0IGZvciB1c2VyIHByb2ZpbGUgY3JlYXRpb24uIE5vdywgbmV3IHByb2ZpbGVzCiAgICAgICBjYW4gYmUgcm91dGVkIGZvciBhcHByb3ZhbCBiZWZvcmUgdGhleSBiZWNvbWUgYWN0aXZlLiBUaGUgbmFtZSBvZiB0aGUgdXNlciwKICAgICAgIHJvbGUgb3IgZ3JvdXAgdGhhdCBhcHByb3ZlcyBuZXcgcHJvZmlsZXMgaXMgY29udGFpbmVkIGluIGpzcHdpa2kucHJvcGVydGllcwogICAgICAgdW5kZXIgdGhlIHByb3BlcnR5IGpzcHdpa2kuYXBwcm92ZXIud29ya2Zsb3cuY3JlYXRlVXNlclByb2ZpbGUuIElmIG5vdAogICAgICAgc3VwcGxpZWQgKHRoZSBkZWZhdWx0KSwgdXNlciBwcm9maWxlcyBhcmUgY3JlYXRlZCB3aXRob3V0IHJlcXVpcmluZyBhcHByb3ZhbC4KCiAgICAgICAqIFVzZXJNYW5hZ2VyIHJlY2VpdmVzIGEgcHJvcGVyIHVuaXQgdGVzdCwgYXQgbG9uZyBsYXN0LiBXZSB0ZXN0IHdpdGgKICAgICAgIGFwcHJvdmFsIHdvcmtmbG93cyB0dXJuZWQgb24gYW5kIG9mZi4KCiAgICAgICAqIE1pbm9yIGJ1ZyBmaXhlcyB0byB0aGUgRmFjdCBhbmQgV29ya2Zsb3dCdWlsZGVyIGNsYXNzZXMuCgoyMDA3LTA0LTE1ICBBbmRyZXcgSmFxdWl0aCA8YW5kcmV3IEFUIGZyZXNoY29va2llcyBET1Qgb3JnPgoKICAgICAgICogMi41LjQ0CgogICAgICAgKiBGb3VuZCB0aGUgYioqKioqZC4gVmFyaWFibGVNYW5hZ2VyIG1ha2VzIGFuIHVuc2FmZSBhc3N1bXB0aW9uCiAgICAgICB0aGF0IFdpa2lDb250ZXh0cyB3aWxsIGFsd2F5cyBoYXZlIGFuIGFzc29jaWF0ZWQgcmVxdWVzdCBhbmQgSHR0cFNlc3Npb24uCiAgICAgICBUaGlzIGlzbid0IGFsd2F5cyB0cnVlIHdpdGggYSBXaWtpQ29udGV4dCBwYXNzZWQgYWxvbmcgaW4gYSBXb3JrZmxvdywKICAgICAgIHdoaWNoIHdpbGwgY29tZSBmcm9tIGFuIGVhcmxpZXIgcG9pbnQgaW4sIGFuZCBmcm9tIGEgcG90ZW50aWFsbGx5IGRpZmZlcmVudCwKICAgICAgIEh0dHAgc2Vzc2lvbi4gV2Ugbm93IGNoZWNrIGV4cGxpY3RseSBmb3IgdGhlIHByZXNlbmNlIG9mIHRoZSBIdHRwU2Vzc2lvbgogICAgICAgYmVmb3JlIHF1ZXJ5aW5nIGl0IGZvciB3aWtpIHZhcmlhYmxlcy4KCjIwMDctMDQtMTUgIEFuZHJldyBKYXF1aXRoIDxhbmRyZXcgQVQgZnJlc2hjb29raWVzIERPVCBvcmc+CgogICAgICAgKiAyLjUuNDMKCiAgICAgICAqIE1hbnkgaW5jcmVtZW50YWwgY2hhbmdlcyB0byB0aGUgd29ya2Zsb3cgcGFja2FnZSB0byBpbmNyZWFzZQogICAgICAgZWFzZSBvZiB1c2UuIEEgbmV3IFdvcmtmbG93QnVpbGRlciBjbGFzcyBpbmNsdWRlcyBhIGZhY3RvcnkgbWV0aG9kCiAgICAgICBmb3IgY29tcG9zaW5nIHNpbXBsZSBhcHByb3ZhbCB3b3JrZmxvd3MuIFNhdmVXaWtpUGFnZVdvcmtmbG93IGFuZAogICAgICAgdGhlIHdvcmtmbG93LmltcGwgcGFja2FnZSBnb2VzIGF3YXksIGFuZCBpbnN0ZWFkIHRoZSB3b3JrZmxvdyBjb2RlCiAgICAgICBmb3Igc2F2aW5nIHBhZ2VzIG1vdmVzIHRvIGlubmVyIGNsYXNzZXMgaW4gUGFnZU1hbmFnZXIgKGl0IGlzIG5vdwogICAgICAgbXVjaCBzbWFsbGVyIGJlY2F1c2UgaXQgdXNlcyBXb3JrZmxvd0J1aWxkZXIpLgoKICAgICAgICogVW5pdCB0ZXN0cyBmb3IgdGhlIHBhZ2Utc2F2ZSB3b3JrZmxvdyBub3cgc2ltdWxhdGUgUGFnZUZpbHRlciBmYWlsdXJlcwogICAgICAgc28gdGhhdCBwcm9wZXIgcHJvcGFnYXRpb24gb2YgZXhjZXB0aW9ucyBpcyB2ZXJpZmllZC4gU2hvdWxkIGhlbHAgSmFubmUgYSBsb3QuCgogICAgICAgKiBXb3JrZmxvdy5qc3AgcmVjZWl2ZXMgbWlub3IgVUkgdHdlYWtzLCBub3RhYmx5IHRoZSByZXBsYWNlbWVudCBvZiBzdWJtaXQKICAgICAgIGJ1dHRvbnMgd2l0aCBhIEphdmFTY3JpcHQtZHJpdmVuIGRyb3Bkb3duLiBUaGUgZGVmYXVsdC5wcm9wZXJ0aWVzCiAgICAgICBsb2NhbGl6YXRpb24gZmlsZSByZWNlaXZlcyBwcm9wZXJ0aWVzIGluIHByZXBhcmF0aW9uIGZvciB0aGUgbmV3IHVzZXIgcHJvZmlsZQogICAgICAgd29ya2Zsb3cgKG5vdCBjaGVja2VkIGluIHlldCwgYmVjYXVzZSBpdCBpc24ndCBkZWJ1Z2dlZCkuCgogICAgICAgKiBUaGUgVUkgZm9yIGFwcHJvdmluZyB3b3JrZmxvd3MgY3VycmVudGx5IGNvbnRhaW5zIGEgbmFzdHksIGludGVybWl0dGVudCBOUEUKICAgICAgIHRoYXQgaXMgcmVzaXN0aW5nIG15IGJlc3QgZWZmb3J0cyB0byBkZWJ1Zy4gSXQgdXN1YWxseSBvY2N1cnMgd2hlbiBzZWxlY3RpbmcKICAgICAgIHRoZSAnYXBwcm92ZScgb3B0aW9uLiBJdCByZXN1bHRzIGluIERlY2lzaW9ucyBiZWluZyByZW1vdmVkIGZyb20gdGhlIHdvcmtmbG93CiAgICAgICBpbmJveCwgYW5kIHRoZSBwYWdlIGRvZXMgc2F2ZSBjb3JyZWN0bHkgLS0gc28gaXQgaXMgZXNzZW50aWFsbHkgImNvc21ldGljIi4KICAgICAgIEhvd2V2ZXIsIGl0J3MgdWdseSBhbmQgd2UgbmVlZCB0byBmaXggaXQuIEFzc2lzdGFuY2UgaXMgbW9zdCB3ZWxjb21lLgoKICAgICAgICogSWYgeW91IGFyZSBhIFVTIGNpdGl6ZW4sIGl0IGlzIHRoYXQgdGltZSBvZiB5ZWFyIGFnYWluLiBNYW55IGhhcHB5IHJldHVybnMuCgoyMDA3LTA0LTA5ICBBbmRyZXcgSmFxdWl0aCA8YW5kcmV3IEFUIGZyZXNoY29va2llcyBET1Qgb3JnPgoKICAgICAgICogMi41LjQyCgogICAgICAgKiBNb2RpZmllZCB0aGUgUGFnZVBlcm1pc3Npb24gaW1wbGllcygpIGFsZ29yaXRobSBzbyB0aGF0IHRoZSAicmVuYW1lIgogICAgICAgcGVybWlzc2lvbiBubyBsb25nZXIgaW1wbGllcyAibW9kaWZ5IiAob3IgInVwbG9hZCIpLiBUaGlzIHdpbGwgYWxsb3cKICAgICAgIHNlcGFyYXRpb24gb2YgdXBsb2FkaW5nIGF0dGFjaG1lbnRzIGZyb20gcGFnZSBlZGl0L3JlbmFtZSBhY3Rpb25zLgogICAgICAgVGhhbmtzIHRvIFRpbSBLb29wIGZvciB0aGUgc3VnZ2VzdGlvbi4KCiAgICAgICAqIEFkZGVkIFdpa2lDb250ZXh0Lk1FU1NBR0UgdG8gc3VwcG9ydCB3b3JrZmxvd3MgYW5kIG90aGVyIHByb2Nlc3NlcwogICAgICAgdGhhdCBuZWVkIHRvIHNlbmQgYSBub24tZXhjZXB0aW9uLXJlbGF0ZWQgVUkgbWVzc2FnZSBpbiByZXNwb25zZQogICAgICAgdG8gdXNlciBldmVudHMuIEFsc28gYWRkZWQgYSB0b3AtbGV2ZWwgTWVzc2FnZS5qc3AgYW5kIHRlbXBsYXRlLgogICAgICAgQ2hhbmdlZCBEaXNwbGF5TWVzc2FnZS5qc3Agc2xpZ2h0bHkgdG8gdXNlIHRoZSA8YzpvdXQ+IHRhZywgd2hpY2gKICAgICAgIGdpdmVzIHVzIHByb3RlY3Rpb24gYWdhaW5zdCBjcm9zcy1zaXRlIHNjcmlwdGluZy4KCiAgICAgICAqIEFkZGVkICd0aHJvd3MgV2lraUV4Y2VwdGlvbicgdG8gYWxsIG1ldGhvZHMgbWVhbnQgdG8gYmUKICAgICAgIGltcGxlbWVudGVkIGJ5IHdvcmtmbG93IHN1YmNsYXNlczogbm90YWJseSBTdGVwLnN0YXJ0KCksCiAgICAgICBEZWNpc2lvbi5kZWNpZGUoKSwgV29ya2Zsb3cuc3RhcnQoKS9yZXN0YXJ0KCkuIE5vdywgaWYgdGhlc2UKICAgICAgIG1ldGhvZHMgZW5jb3VudGVyIGV4Y2VwdGlvbnMgdGhleSB3aWxsIGFib3J0IHRoZSB3b3JrZmxvdyBhbmQKICAgICAgIHByb3BhZ2F0ZSB0aGUgZXhjZXB0aW9ucyB0byBjYWxsZXJzLgoKICAgICAgICogTWFueSB0aW55IGxpdHRsZSBKYXZhZG9jIGZpeGVzLgoKICAgICAgICogRml4ZWQgZmFpbGluZyBQYWdlUmVuYW1lclRlc3QuCgoyMDA3LTA0LTEwICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAqIDIuNS40MQoKICAgICAgICogQWRkZWQgRGF2aWQgQXUncyBuZXcgc2V0IG9mIHBhdGNoZXMgZm9yIFdZU0lXWUcgZWRpdGluZy4KCiAgICAgICAqIFdpa2lFbmdpbmUuc2Nhbldpa2lMaW5rcygpIG5vIGxvbmdlciByZW5kZXJzIHRoZSBwYWdlOyBpdCBqdXN0CiAgICAgICBwYXJzZXMgaXQuICBUaGlzIHNob3VsZCBwcm92aWRlIHNvbWUgc3BlZWR1cCBhdCBzdGFydHVwLgoKICAgICAgICogQ2hhbmdlZCB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSByZXNvdXJjZSBidW5kbGUgZnJvbQogICAgICAgd2ViZG9jcy90ZW1wbGF0ZXMvRGVmYXVsdFJlc291cmNlcy5wcm9wZXJ0aWVzIHRvCiAgICAgICBldGMvaTE4bi90ZW1wbGF0ZXMvZGVmYXVsdC5wcm9wZXJ0aWVzIChtb3JlIGxvZ2ljYWwpLgoKICAgICAgICogQWRkZWQgY2xhc3MgcmVtYXBwaW5nIGFiaWxpdHkuICBTZWUgZXRjL2luaS9jbGFzc21hcHBpbmdzLnhtbAogICAgICAgYW5kIENsYXNzVXRpbC5qYXZhIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLiAgVGhpcyBpcyBub3QgeWV0IGEgY29tcGxldGUKICAgICAgIGZlYXR1cmUsIGJ1dCBpdCBicmluZ3Mgc29tZSBzaW1wbGUgQU9QIHRvIEpTUFdpa2kuCgogICAgICAgKiBKYXZhc2NyaXB0IGlzIG5vdyBsb2NhbGl6ZWQuICBUaGUga2V5LXN0cmluZyBtYXBwaW5ncyByZXNpZGUgaW4KICAgICAgIHRlbXBsYXRlcy88dGVtcGxhdGU+LnByb3BlcnRpZXM7IGFuZCB0aGUgY29ycmVjdCBtZXRob2QgdG8gY2FsbCBpcwogICAgICAgIjxrZXk+Ii5sb2NhbGl6ZShhcmdzKS4gIFRoYW5rcyB0byBEaXJrIEZyZWRlcmlja3ggZm9yIHRoZSBoZWxwIQoKMjAwNy0wNC0wOSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgKiBBZGRlZCBhIG51bWJlciBvZiB1bml0IHRlc3RzIHRvIEFsbFRlc3RzIHJ1bnM7IHRoZXkgd2VyZSBub3QgYmVpbmcKICAgICAgIHByb3Blcmx5IGluY2x1ZGVkLCBzbyBhIG51bWJlciBvZiB0aGVtIHdlcmUgbm90IHJ1biBkdXJpbmcgYSByZWd1bGFyCiAgICAgICB1bml0IHRlc3QgcnVuLi4uCgoyMDA3LTA0LTA5ICBBbmRyZXcgSmFxdWl0aCA8YW5kcmV3IEFUIGZyZXNoY29va2llcyBET1Qgb3JnPgoKICAgICAgICogMi41LjQwCgogICAgICAgKiBGaXhlZCBBdXRob3JpemF0aW9uTWFuYWdlciBmYWlsdXJlIHRvIGFkZCBhdHRhY2htZW50CiAgICAgICB3aGVuIGpzcHdpa2kuc2VjdXJpdHk9b2ZmLiBbQnVnQWRkQXR0YWNobWVudEZhaWxzV2l0aENvbnRhaW5lckF1dGhlbnRpY2F0aW9uXQoKICAgICAgICogVXBncmFkZWQgZnJlc2hjb29raWVzLXNlY3VyaXR5IGxpYiB0byAwLjU0LiBUaGlzIG5ldyB2ZXJzaW9uIGFjY2VwdHMKICAgICAgIGEgdXNlci1zdXBwbGllZCBjaGFyc2V0IGZvciBwYXJzaW5nIHNlY3VyaXR5IHBvbGljeSBmaWxlcy4KICAgICAgIFByZXZpb3VzbHksIFBvbGljeVJlYWRlciBkZWZhdWx0ZWQgdG8gdGhlIHBsYXRmb3JtIGRlZmF1bHQgZW5jb2RpbmcuCgogICAgICAgKiBBdXRob3JpemF0aW9uTWFuYWdlciwgd2hlbiBpdCBpbml0aWFsaXplcywgc3VwcGxpZXMgdGhlIGRlZmF1bHQKICAgICAgIEpTUFdpa2kgZW5jb2RpbmcgdG8gdGhlIHVwZGF0ZWQgZnJlc2hjb29raWVzIFBvbGljeVJlYWRlciBjbGFzcy4KICAgICAgIE1hbnkgdGhhbmtzIHRvIEhhcnJ5IE1ldHNrZSBmb3IgaWRlbnRpZnlpbmcgdGhlIG5lZWQgZm9yIHRoaXMsIGJhc2VkIG9uIGhpcwogICAgICAgZXhwZXJpZW5jZXMgdXNpbmcgSlNQV2lraSBvbiBhIHBsYXRmb3JtIHdoZXJlIEVCQ0RJQyBpcyB0aGUgZGVmYXVsdC4KICAgICAgIChXaGljaCBpcyBwcm9iYWJseSBhIG1haW5mcmFtZTsgeWVnYWRzLikKCiAgICAgICAqIEZpeGVkIGJ1ZyB0aGF0IHdhcyBjYXVzaW5nIFdvcmtmbG93cyB0byBiZSBhZGRlZCBtdWx0aXBsZSB0aW1lcwogICAgICAgdG8gdGhlICJoaXN0b3J5IiBxdWV1ZTsgdGhpcyB3YXMgY2F1c2VkIGJ5IHJlY2VudCBjaGFuZ2VzIHRvIHRoZQogICAgICAgV2lraUV2ZW50TWFuYWdlciBjbGFzc2VzLgoKMjAwNy0wNC0wMiAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi41LjM5CgogICAgICAgICogRml4ZWQgYnVnIGluIFNlc3Npb25zUGx1Z2luIHdoaWNoIHRocmV3IGFuIEV4Y2VwdGlvbgogICAgICAgIGF0IHN0YXJ0dXAuICBSZXBvcnRlZCBieSBIYXJyeSBNZXRza2UuCgogICAgICAgICogR3JlYXRseSBpbXByb3ZlZCBTcGFtRmlsdGVyIGxvZ2dpbmcuICBUaGVyZSdzIGEgbmV3IFNwYW1Mb2cKICAgICAgICB3aGljaCBjYW4gYmUgdXNlZCB0byB0cmFjayBhbGwgY2hhbmdlczsgYWNjZXB0cyBhbmQgcmVqZWN0cy4KCiAgICAgICAgKiBTcGFtRmlsdGVyIG5vIGxvbmdlciBhZGRzIEFraXNtZXQtcmVqZWN0aW9ucyB0byB0aGUgdGVtcG9yYXJ5CiAgICAgICAgYmFuIGxpc3QuICBBa2lzbWV0IGlzIG5vbi1kZXRlcm1pbmlzdGljLCBzbyBpdCdzIGtpbmRhIGFubm95aW5nCiAgICAgICAgZm9yIHVzZXJzIHdobyBqdXN0IHF1aXRlIGRvbid0IGtub3cgd2h5IHRoaXMgaXMgaGFwcGVuaW5nLgoKICAgICAgICAqIEZpeGVkIGFsc28gc29tZSBkdW1iIGJ1Z3MgaW4gdGhlIHdheSBTcGFtRmlsdGVyIHdhcwogICAgICAgIGNvbXB1dGluZyB0aGUgZGVsdGEuCgoyMDA3LTA0LTAyICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjUuMzgKCiAgICAgICAgKiBBZGRlZCBOb3RlIHBsdWdpbiBmcm9tIEpvaG4gVm9sa2FyLgoKICAgICAgICAqIEFkZGVkIFBBR0VfUkVRVUVTVEVELCBQQUdFX0RFTElWRVJFRCBldmVudHMgZmlyZWQgYnkKICAgICAgICBXaWtpSlNQRmlsdGVyLiAgVW5mb3J0dW5hdGVseSwgbm8gc3VjaCB0aGluZ3MgYXJlIGZpcmVkIGZvcgogICAgICAgIGF0dGFjaG1lbnRzLiAgTm90ZSB0aGF0IGF0dGFjaGluZyB0byB0aGVzZSBldmVudHMgaXMgdmVyeSBub2lzeS4KICAgICAgICBUaGFua3MgdG8gTXVycmF5IEFsdGhlaW0uCgogICAgICAgICogUmVuYW1lZCBUZXN0SHRtbFN0cmluZ1RvV2lraVRyYW5zbGF0b3IgdG8KICAgICAgICBIdG1sU3RyaW5nVG9XaWtpVHJhbnNsYXRvclRlc3QgdG8gY29uZm9ybSB0byBvdGhlciB0ZXN0cy4KCjIwMDctMDMtMzEgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNS4zNwoKICAgICAgICAqIEZvcndhcmQgcG9ydGVkIGZpeGVzIGZyb20gMi40LjEwMgoKICAgICAgICAqIEZpeGVzIGlzc3VlIHdpdGggYSBudW1iZXIgb2YgcGx1Z2lucyBmYWlsaW5nIGR1ZSB0byB3cm9uZwogICAgICAgIGluaXRpYWxpemF0aW9uIG9yZGVyLgoKICAgICAgICAqIE1vdmVkIGV2ZXJ5dGhpbmcgcHJlLTIuNC4wIHRvIE9sZENoYW5nZUxvZy4gIE9oLCB0aGUgbWVtb3JpZXMuLi4KCjIwMDctMDMtMjkgIENocmlzdG9waCBTYXVlciA8c2F1ZXIgQVQgaHMtaGVpbGJyb25uIERPVCBkZT4KCiAgICAgICAgKiAyLjUuMzYKCiAgICAgICAgKiBNb3ZlZCBGaWx0ZXJNYW5hZ2VyIGluaXRpYWxpc2F0aW9uIGluIHRoZSB3aWtpIGVuZ2luZSB0byB0aGUgYm90dG9tLAogICAgICAgICAgc28gdGhhdCBhbGwgb2JqZWN0IHJlZmVyZW5jZXMgdG8gbW9kdWxlcyBhcmUgYWxyZWFkeSBhdmFpbGFibGUgdG8KICAgICAgICAgIGEgcGFnZSBmaWx0ZXJzIGluaXRpYWxpemUgbWV0aG9kLiBUaGlzIGlzIGltcG9ydGFudCB0byByZWdpc3RlcgogICAgICAgICAgZXZlbnQgbGlzdGVuZXJzIHRoZXJlLgoKICAgICAgICAqIEFkZGVkIGEgZGVzdHJveSBtZXRob2QgdG8gdGhlIFBhZ2VGaWx0ZXIgaW50ZXJmYWNlLiBEZXN0cm95IGlzCiAgICAgICAgICBjYWxsZWQgdXBvbiBlbmdpbmUgc2h1dGRvd24uIFlvdSBjYW4gdXNlIHRoaXMgdG8gY2xvc2UgZ2xvYmFsCiAgICAgICAgICByZXNvdXJjZXMgdGhhdCB5b3Ugb3BlbmVkIGluIHRoZSBQYWdlRmlsdGVycyBpbml0aWFsaXplIG1ldGhvZC4KCjIwMDctMDMtMjYgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNS4zNQoKICAgICAgICAqIFJlZmFjdG9yZWQgdGhlIFhNTC1SUEMgaW1wbGVtZW50YXRpb24gYSBiaXQgdG8gcHJvdmlkZSBwcm9wZXIKICAgICAgICBhdXRoZW50aWNhdGlvbi9hdXRob3JpemF0aW9uLgoKICAgICAgICAqIFVwZ3JhZGVkIHRvIEFwYWNoZSBYTUwtUlBDIDIuMC4xLgoKMjAwNy0wMy0yNCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi41LjM0CgogICAgICAgICogQWRkZWQgTWlra2VsIFRyb2VzdCdzIHBhdGNoIHRvIEF0dGFjaG1lbnRTZXJ2bGV0IHRvIGZpeCBpc3N1ZXMKICAgICAgICB3aXRoIHVwbG9hZGluZyBhbmQgZmlsZSBzaXplLgoKICAgICAgICAqIEFkZGVkIER5bmFtaWNBdHRhY2htZW50cyBhbmQgdGhlaXIgZ2VuZXJhdGlvbi4gIFlvdSBjYW4gbm93IGdvCiAgICAgICAgYW5kIGJ1aWxkIGF0dGFjaG1lbnRzIHdoaWNoIGRvIG5vdCBleGlzdCBpbiB0aGUgcmVwb3NpdG9yeSwgYnV0CiAgICAgICAgYXJlIGdlbmVyYXRlZCBvbi10aGUtZmx5LiAgU2VlIHRoZSBhdHRhY2htZW50cyBwYWNrYWdlIGFuZCByZWxhdGVkCiAgICAgICAgZG9jdW1lbnRhdGlvbi4KCiAgICAgICAgKiBCdWcgZml4OiBbb3BlbiBidWdzXSB3b3VsZCBub3QgYmUgcmVjb2duaXplZCBhcyB3aWtpcGFnZSBPcGVuQnVnLgoKICAgICAgICAqIENoYW5nZWQgRVRhZyBnZW5lcmF0aW9uIHRvIG1ha2UgaXQgdW5pcXVlIHBlciBwYWdlLgoKMjAwNy0wMy0xOSAgQ2hyaXN0b3BoIFNhdWVyIDxzYXVlciBBVCBocy1oZWlsYnJvbm4gRE9UIGRlPgoKICAgICAgICAqIDIuNS4zMwoKICAgICAgICAqIENoYW5nZWQgc2lnbmF0dXJlIG9mIHNlbmRNYWlsIGluIE1haWxVdGlsIGZyb20gdXNpbmcgV2lraUNvbnRleHQKICAgICAgICB0byB1c2UgV2lraUVuZ2luZS4gIFdpa2lDb250ZXh0IHdhcyBub3QgbmVlZGVkLiBUaGlzIGVuYWJsZXMgdXMKICAgICAgICB0byB1c2UgdGhlIG1haWwgdXRpbCwgZXZlbiBpZiBubyBXaWtpIENvbnRleHQgaXMgYXZhaWxhYmxlLgoKMjAwNy0wMy0xOSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi41LjMyCgogICAgICAgICogRml4ZWQgYSBidW5jaCBvZiBFY2xpcHNlIHdhcm5pbmdzOyBob3BlZnVsbHkgbm8gZnVuY3Rpb25hbGl0eQogICAgICAgIGNoYW5nZXMuCgogICAgICAgICogRml4ZWQgQnVnSW5saW5lSW1hZ2VzQ2FzZVNlbnNpdGl2ZSAtIGlubGluZSBpbWFnZSBsaXN0cyBhcmUgbm93CiAgICAgICAgY2FzZSBpbnNlbnNpdGl2ZSAoeWF5ISkuICBUaGFua3MgdG8gSGFycnkgTWV0c2tlLgoKICAgICAgICAqIEZpeGVkIEJ1Z011bHRpV2lraUNyZWF0ZXNSU1NGaWxlSW5Xcm9uZ1BsYWNlLiAgVGhhbmtzIHRvIEhhcnJ5IE1ldHNrZQogICAgICAgIGFnYWluLiAgIE5vdywgaWYgdGhlIHJzc0ZpbGUgcHJvcGVydHkgaXMgc2V0IHRvIGFuIGFic29sdXRlIHBhdGgsIGl0IGlzCiAgICAgICAgdXNlZCBpbnN0ZWFkIG9mIGEgcmVsYXRpdmUgcGF0aCB0byB0aGUgd2lraWVuZ2luZSBob21lLiAgVGhpcyBhbGxvd3MgeW91CiAgICAgICAgdG8gaGF2ZSBzZXBhcmF0ZSBwYXRocyBmb3IgbXVsdGktd2lraXMuCgogICAgICAgICogRml4ZWQgQnVnUmVmZXJyaW5nUGFnZXNQbHVnaW5MaW5rc05vbkV4aXN0aW5nUGFnZXMsIHRoYW5rcyB0bwogICAgICAgIENhbmRpZCBEYXV0aC4KCiAgICAgICAgKiBJbXBsZW1lbnRlZCBJZGVhUmVtb3ZlRHVwbGljYXRlc0Zyb21TZXNzaW9uc1BsdWdpbiBmcm9tIEhhcnJ5IE1ldHNrZS4KCjIwMDctMDMtMTkgIENocmlzdG9waCBTYXVlciA8c2F1ZXIgQVQgaHMtaGVpbGJyb25uIERPVCBkZT4KCiAgICAgICAgKiAyLjUuMzEKCiAgICAgICAgKiBGaXhlZCBCdWcgd2l0aCBMb3N0UGFzc3dvcmQuanNwOiBJZiB5b3Ugc2V0IGFjY2VzcyBwcml2aWxlZGdlcyBmb3IKICAgICAgICAgIGEgd2lraSBjb21wbGV0ZWx5IHByaXZhdGUgKGV2ZW4gdmlldykgdGhlbiB5b3Ugd2hlcmUgbm90IGFibGUgdG8gcmVzdG9yZQogICAgICAgICAgdGhlIHBhc3N3b3JkIHNpbmNlIExvc3RQYXNzd29yZC5qc3AgcmVxdWlyZWQgbG9naW4uCgoyMDA3LTAzLTE4ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjUuMzAKCiAgICAgICAgKiBGaXhlZCBCdWdSZWZlcmVuY2VUb1JlbmFtZWRQYWdlTm90Q2xlYXJlZAoKICAgICAgICAqIEZpeGVkIEJ1Z1RhYmxlSGVhZGVyTm90WEhNVExDb21wbGlhbnQKCiAgICAgICAgKiBGaXhlZCBCdWdJbml0aWFsaXphYmxlUGx1Z2luTm90SW5pdGlhbGl6ZWQKCiAgICAgICAgKiBBUEkgQ2hhbmdlOiBUaGUgc2lnbmF0dXJlIG9mIFBhZ2VGaWx0ZXIuaW5pdGlhbGl6ZSgpIG5vdwogICAgICAgIGFsc28gaW5jbHVkZXMgdGhlIFdpa2lFbmdpbmUuICBUaGlzIHdhcyBuZWNlc3NhcnksIGJlY2F1c2Ugb3RoZXJ3aXNlCiAgICAgICAgdGhlIGluaXRpYWxpemUoKSAtbWV0aG9kIHdhcyBlc3NlbnRpYWxseSB1c2VsZXNzIGZvciBtb3N0IHVzZQogICAgICAgIGNhc2VzLgoKICAgICAgICAqIEFkZGVkIFBhcnNlclN0YWdlUGx1Z2luIGludGVyZmFjZS4gIFRoaXMgYWxsb3dzIGEgcGx1Z2luIHRvIGJlCiAgICAgICAgZXhlY3V0ZWQgZXZlbiBkdXJpbmcgcGFyc2luZyBvZiB0aGUgd2lraSBwYWdlLCBub3QgdW50aWwgdGhlIHJlbmRlcgogICAgICAgIHN0YWdlLgoKICAgICAgICAqIEFkZGVkIERhdmlkIEF1J3MgcGF0Y2hlcyB0byBnZXQgdGhlIEZDSyBzdXBwb3J0IGJhY2sgdXAgdG8gc3BlZWQKICAgICAgICBhZ2Fpbi4KCjIwMDctMDMtMTcgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNS4yOQoKICAgICAgICAqIEZvcndhcmQgcG9ydGVkIGZpeGVzIGZyb20gMi40LjEwMC4KCjIwMDctMDItMjggIENocmlzdG9waCBTYXVlciA8c2F1ZXIgQVQgaHMtaGVpbGJyb25uIERPVCBkZT4KCiAgICAgICAgKiAyLjUuMjgKCiAgICAgICAgKiBJbXByb3ZlZCBNYWlsVXRpbDogQWRkZWQgYXV0aGVudGljYXRpb24gc3VwcG9ydCwgc28KICAgICAgICAgIHRoYXQgeW91IGNhbiB1c2UgbWFpbCBzZXJ2ZXJzIHRoYXQgcmVxdWlyZSBhbiBhY2NvdW50CiAgICAgICAgICAodGhlIE9wZW5SZWxheSBpc3N1ZS4uLikuIFlvdSBub3cgYWxzbyBjYW4gaW5kaWNhdGUKICAgICAgICAgIGEgZGlmZmVyZW50IHNtdHAgcG9ydC4gQ2hhbmdlZCBMb3N0UGFzc3dvcmQuanNwIGFjY29yZGluZ2x5LgoKMjAwNy0wMi0yNSAgQW5kcmV3IEphcXVpdGggPGFuZHJldyBBVCBmcmVzaGNvb2tpZXMgRE9UIG9yZz4KCiAgICAgICAgKiAyLjUuMjcKCiAgICAgICAgKiBVcGdyYWRlZCBidW5kbGVkIGxvZzRqIHRvIDEuMi4xNDsgZnJlc2hjb29raWVzLXNlY3VyaXR5IHRvIDAuNTEuCgogICAgICAgICogRml4ZWQgMiBmYWlsaW5nIFJQQ0hhbmRsZXJUZXN0IHRlc3RzIGJ5IGNvdW50aW5nIGNoYW5nZXMgcmVsYXRpdmUKICAgICAgICB0byBiZWdpbm5pbmcgb2YgdGVzdCwgcmF0aGVyIHRoYW4gYWJzb2x1dGUgY2hhbmdlcy4KCiAgICAgICAgKiBDaGFuZ2VkIGFsbCBKU1AgdGFnbGliIGRlY2xhcmF0aW9ucyB0byB1c2UgSlNQIDIuMC1jb21wYXRpYmxlIHRhZ3MuCiAgICAgICAgQWxzbyB1cGdyYWRlZCBqc3RsLmphciBhbmQgc3RhbmRhcmQuamFyIHRvIEpTVEwgMS4xIHZlcnNpb25zLiBOb3RlOgogICAgICAgIGlmIHlvdSBhcmUgYSB0ZW1wbGF0ZSBkZXZlbG9wZXIsIHlvdSBzaG91bGQgY2hhbmdlIHlvdXIgdGFnbGliCiAgICAgICAgZGVjbGFyYXRpb25zIGFzIGZvbGxvd3M6CgogICAgICAgICBOZXc6CiAgICAgICAgIDwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzcC9qc3RsL2ZtdCIgcHJlZml4PSJmbXQiICU+CiAgICAgICAgIDwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzcC9qc3RsL2NvcmUiIHByZWZpeD0iYyIgJT4KCiAgICAgICAgIE9sZDoKICAgICAgICAgPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanN0bC9mbXQiIHByZWZpeD0iZm10IiAlPgogICAgICAgICA8JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3RsL2NvcmUiIHByZWZpeD0iYyIgJT4KCjIwMDctMDItMjQgIEFuZHJldyBKYXF1aXRoIDxhbmRyZXcgQVQgZnJlc2hjb29raWVzIERPVCBvcmc+CgogICAgICAgICogMi41LjI2CgogICAgICAgICogTWFqb3IgZW5oYW5jZW1lbnQ6IHJlcGxhY2VkIEpTUFdpa2kncyBkZXBlbmRlbmN5IG9uIHRoZSBnbG9iYWwsCiAgICAgICAgSlZNLXdpZGUgc2VjdXJpdHkgcG9saWN5IHdpdGggYSAibG9jYWwgcG9saWN5IiB0aGF0IGlzIGFsd2F5cwogICAgICAgIHJlYWQgZnJvbSBXRUItSU5GL2pzcHdpa2kucG9saWN5LiBJZiB5b3UgaGF2ZSBhIEpWTS13aWRlIHBvbGljeSwKICAgICAgICB0aGUgbG9jYWwgcG9saWN5IHdpbGwgc3VwcGxlbWVudCBpdC4gVGhlIHByYWN0aWNhbCB1cHNob3Qgb2YgdGhpcwogICAgICAgIGNoYW5nZSBpcyB0aGF0IHRoZSBtb3N0IGNvbW1vbiBjb25maWd1cmF0aW9uIGNoYWxsZW5nZSB0aGF0IG1vc3QKICAgICAgICBmaXJzdC10aW1lIGFkbWlucyBmYWNlICh3aHkgd29uJ3QgYW55IHBhZ2VzIGRpc3BsYXk/KSBpcyBnb25lLAogICAgICAgIGFuZCBnb25lIGZvcmV2ZXIuIE5vIG1vcmUgZmlkZGxpbmcgd2l0aCB0aGUgamF2YS5zZWN1cml0eS5wb2xpY3kKICAgICAgICBwcm9wZXJ0eSEgVGhlIHN5bnRheCBmb3IgdGhlIGxvY2FsIHBvbGljeSBpcyBleGFjdGx5IHRoZSBzYW1lCiAgICAgICAgYXMgd2hhdCBpdCdzIGFsd2F5cyBiZWVuOyBidXQgbm93IGl0IEp1c3QgV29ya3MgaW5zdGVhZCBvZgogICAgICAgIE1vc3RseSBXb3Jrcy4KCiAgICAgICAgKiBGaXhlZCBidWcgaW4gV2ViQ29udGFpbmVyQXV0aG9yaXplciBpbnRyb2R1Y2VkIGJ5IGNoYW5nZSB0bwogICAgICAgIEphdmEgU2VydmxldCBBUEkgMi40LiBUaGUgcGFyc2luZyBjbGFzcyBub3cgZXhwbGljdGx5IGluY2x1ZGVzCiAgICAgICAgbmFtZXNwYWNlcyBpbiBYUGF0aCBzZWFyY2hlcy4gVGhpcyB3YXMgbm90IHNvbWV0aGluZyB3ZSBuZWVkZWQKICAgICAgICB0byB3b3JyeSBhYm91dCB3aXRoIDIuMyAod2hpY2ggdXNlZCBhIERURCkuIFRoZSByZXN1bHQgb2YgdGhpcwogICAgICAgIHByb2JsZW0gd2FzIGNhdXNpbmcgY29udGFpbmVyLW1hbmFnZWQgbG9naW5zIHRvIGZhaWwuCgogICAgICAgICogRml4ZWQgZmFpbGluZyB1bml0IHRlc3RzIFdlYkNvbnRhaW5lckF1dGhvcml6ZXI7IHdlYiB0ZXN0cwogICAgICAgIENvbW1vbkN1c3RvbVRlc3RzLCBDb21tb25UZXN0cy4KCiAgICAgICAgKiBNaW5vciBlbmhhbmNlbWVudCB0byBXaWtpU2Vzc2lvbiBub3cgYWxsb3dzIGZ1bGwgdXNlIG9mIG5vbi1KU1BXaWtpCiAgICAgICAgc3VwcGxpZWQgSkFBUyBMb2dpbk1vZHVsZXMgaW4gdGhlIEpTUFdpa2ktY3VzdG9tIGNvbmZpZ3VyYXRpb24uIFByZXZpb3VzbHksCiAgICAgICAgd2UgY29uc2lkZXJlZCBhIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZCBvbmx5IGlmIGEgTG9naW5Nb2R1bGUgaGFkIGFkZGVkCiAgICAgICAgUm9sZS5BVVRIRU5USUNBVEVEIHRvIHRoZSBTdWJqZWN0J3MgcHJpbmNpcGFsIHNldC4gVGhpcyBpcyBjbGVhcmx5CiAgICAgICAgdW5yZWFzb25hYmxlIGZvciBMb2dpbk1vZHVsZXMgdGhhdCBoYXZlIG5vIGtub3dsZWRnZSBvZiBKU1BXaWtpLCBzdWNoCiAgICAgICAgYXMgU3VuJ3Mgc3VwcGxpZWQgbW9kdWxlcyBvciB0aGlyZC1wYXJ0eSBtb2R1bGVzIHVzZWQgZm9yIExEQVAKICAgICAgICBhdXRoZW50aWNhdGlvbi4gTm93LCB3ZSBjb25zaWRlciBhIHVzZXIgYXV0aGVudGljYXRlZCBpZiB0aGV5IGFyZQogICAgICAgIG5vdCBhbm9ueW1vdXMgYW5kIG5vdCBhc3NlcnRlZCwgYW5kIHdlIGxhemlseSBhZGQgUm9sZS5BVVRIRU5USUNBVEVECiAgICAgICAgaW4gdGhlc2UgY2FzZXMsIGFmdGVyIGxvZ2luLgoKICAgICAgICAqIEJ1ZyBmaXg6IFdpa2lFdmVudE1hbmFnZXIgcmVmYWN0b3JpbmcgaW4gMi41LjI0IGNhdXNlZCBkdXBsaWNhdGUKICAgICAgICBsaXN0ZW5lcnMgdG8gYmUgYWRkZWQgaW4gc29tZSBjYXNlcy4gVGhpcyBoYXMgYmVlbiBmaXhlZC4KCiAgICAgICAgKiBUaGUgc2VjdXJpdHkgcG9saWN5IGZpbGUgaGFzIGJlZW4gc2ltcGxpZmllZCB0byByZW1vdmUgcmVkdW5kYW50CiAgICAgICAgZ3JhbnRzIHRoYXQgZG9uJ3QgdmFyeSBhY3Jvc3Mgcm9sZXMuIEl0IHNob3VsZCBiZSBzaW1wbGVyIHRvIHJlYWQKICAgICAgICBhbmQgdW5kZXJzdGFuZC4KCiAgICAgICAgKiBEaWQgSSBtZW50aW9uIHRoYXQgbG9jYWwgc2VjdXJpdHkgcG9saWNpZXMgYXJlIGEgYmlnIGRlYWw/CgoyMDA3LTAyLTIyICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNS4yNQoKICAgICAgICAqIEFkZGVkIFNpc3RlclNpdGVzLmpzcCB0byBzdXBwb3J0IHRoZSBTaXN0ZXJTaXRlcyBzdGFuZGFyZC4KCjIwMDctMDItMjEgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi41LjI0CgogICAgICAgICogRm9yd2FyZCBwb3J0ZWQgZmVhdHVyZXMgZnJvbSAyLjQuOTQsIGluY2x1ZGluZyB0aGUgV2F0Y2hEb2csCiAgICAgICAgYW5kIHRoZSBuZXcsIGZhc3RlciBXaWtpRXZlbnRNYW5hZ2VyLgoKMjAwNy0wMi0xOCAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjUuMjMKCiAgICAgICAgKiBBZGRlZCBEYXZpZCBBdSdzIHBhdGNoZXMgdG8gcmUtZW5hYmxlIEZDSy4gIEFsbCB5b3Ugbm93IG5lZWQKICAgICAgICB0byBkbyBpcyB0byBpbnN0YWxsIEZDSywgYW5kIGVuYWJsZSBpdCBpbiB0aGUgaW5pL2pzcHdpa2lfbW9kdWxlcy54bWwuCiAgICAgICAgVGhpcyBhbHNvIGFkZGVkIGEgbmV3IG1vZGUgZm9yIFJlbmRlcmluZ01hbmFnZXI6IFdZU0lXWUdfRURJVE9SX01PREUsCiAgICAgICAgd2hpY2ggd2lsbCBub3QgcmVuZGVyIHBsdWdpbnMgKGV4Y2VwdCBzb21lKSwgYnV0IGtlZXAgdGhlbSBpbiBwbGFpbgogICAgICAgIHRleHQgZm9ybWF0LgoKICAgICAgICAqIHdlYi54bWwgbm93IGV4cGxpY2l0bHkgZGVjbGFyZXMgSmF2YSBTZXJ2bGV0IEFQSSAyLjQuCgogICAgICAgICogQWRkZWQgQWRtaW5CZWFuSXRlcmF0b3JUYWcKCiAgICAgICAgKiBCdWcgZml4OiBwdXR0aW5nIGEgcGx1Z2luIG9yIGEgdmFyaWFibGUgb24gdGhlIGZpcnN0IGxpbmUgd291bGQKICAgICAgICBjYXVzZSBhIGNyYXNoLCBpZiB0aGVyZSB3ZXJlIG1vcmUgdGhhbiBvbmUgcGFyYWdyYXBoIG9uIHRoZSBwYWdlLgogICAgICAgIFRoYW5rcyB0byBUZXJyeSBTdGVpY2hlbiBmb3IgZGVidWdnaW5nLgoKICAgICAgICAqIFRoZXJlIGlzIG5vdyBhIHJ1ZGltZW50YXJ5IHBsdWdpbi1iYXNlZCBhZG1pbmlzdHJhdGlvbiBpbnRlcmZhY2UKICAgICAgICBpbiBhZG1pbi9BZG1pbi5qc3AgKGFuZCB0aGUgY29ycmVzcG9uZGluZyB0ZW1wbGF0ZSBmaWxlcykuICBJdCBkb2VzIG5vdAogICAgICAgIHF1aXRlIHdvcmsgeWV0LCBhbmQgaXQncyBkZWZpbml0ZWx5IHVuc3RhYmxlLCBidXQgaXQncyBiZWVuIHN1Ym1pdHRlZAogICAgICAgIHRvIGdldCBzb21lIGNvbW1lbnRzLiAgVGhlIGlkZWEgaXMgdGhhdCB5b3UgY2FuIGRlY2xhcmUgaW4geW91cgogICAgICAgIGpzcHdpa2lfbW9kdWxlLnhtbCBhbiAiYWRtaW5CZWFuIiBjbGFzcywgd2hpY2ggdGhlbiBvZmZlcnMgYW4KICAgICAgICBhZG1pbmlzdHJhdGl2ZSBpbnRlcmZhY2UgdG8geW91ciBwbHVnaW4uICBBcyBhbiBleGFtcGxlLCBhCiAgICAgICAgUGxhaW5FZGl0b3JBZG1pbkJlYW4gaXMgaW1wbGVtZW50ZWQgKHBhcnRseSkuCgoyMDA3LTAyLTA1ICBDaHJpc3RvcGggU2F1ZXIgPHNhdWVyIEFUIGhzLWhlaWxicm9ubiBET1QgZGU+CgogICAgICAgICogMi41LjIyCgogICAgICAgICogQWRkZWQgdmFyaWFibGUgbWVjaGFuaXNtIGluIHByb3BlcnR5IGZpbGVzLiBZb3Ugbm93CiAgICAgICAgICBjYW4gZGVjbGFyZSBhIHZhcmlhYmxlIGFzIGEgcmVndWxhciBwcm9wZXJ0eSB3aXRoCiAgICAgICAgICBwcmVmaXggJ3Zhci4nIGFuZCB0aGVuIHVzZSBpdCB3aXRoIHRoZSAnJCcgcHJlZml4CiAgICAgICAgICBpbiBvdGhlciBwcm9wZXJ0eSB2YWx1ZXMgd2l0aGluIHRoZSBwcm9wZXJ0eSBmaWxlcyBjYXNjYWRlLgoKICAgICAgICAqIEZhY3RvcmVkIG91dCBwcm9wZXJ0eSByZWFkaW5nIGZyb20gV2lraUVuZ2luZSBpbnRvIGEgbmV3CiAgICAgICAgICBjbGFzcyBjYWxsZWQgUHJvcGVydHlSZWFkZXIsIHNpbmNlIGl0IG5vdyByZXByZXNlbnRzIGEgZGlzdGluY3QKICAgICAgICAgIGNvbmNlcHQuIEFkZGVkIFVuaXRUZXN0IGZvciBpdC4KCjIwMDctMDItMDUgIENocmlzdG9waCBTYXVlciA8c2F1ZXIgQVQgaHMtaGVpbGJyb25uIERPVCBkZT4KCiAgICAgICAgKiAyLjUuMjEKCiAgICAgICAgKiBBZGRlZCBwb3NzaWJpbGl0eSB0byBzcGVjaWZ5IGNhc2NhZGluZyBwcm9wZXJ0aWVzCiAgICAgICAgaW4gdGhlIGNvbnRleHQtbWFwcGluZyBmb3IgbXVsdGlwbGUgd2lraSBzZXR1cHMuIEFkZGVkCiAgICAgICAgbWV0aG9kIHRvIFdpa2lFbmdpbmUgdGhhdCB3aWxsIGNoZWNrIGZvcgogICAgICAgIGpzcHdpa2kucHJvcGVydHlmaWxlLmNhc2NhZGUueCBjb250ZXh0IHByb3BlcnRpZXMsIHdoZXJlCiAgICAgICAgeCBpcyBhIG51bWJlciBmcm9tIDEgdG8gbi4gUHJvcGVydGllcyBzcGVjaWZpZWQgaW4gdGhvc2UKICAgICAgICBmaWxlcyB3aWxsIG92ZXJ3cml0ZSB2YWx1ZXMgc3BlY2lmaWVkIGluIHRoZSBkZWZhdWx0IGpzcHdpa2kucHJvcGVydGllcwogICAgICAgIGZpbGUgb3IgYSBwcm9wZXJ0aWVzIGZpbGUgb2YgYSBsb3dlciBjYXNjYWRlLgogICAgICAgIFRoaXMgaXMgYmFzZWQgb24gYW4gaWRlYSBieSBPbGFmIEthdXMsIHNlZSBbSlNQV2lraTpNdWx0aXBsZVdpa2lzXQogICAgICAgIGRpc2N1c3Npb24uCgoyMDA3LTAxLTMwICBBbmRyZXcgSmFxdWl0aCA8YW5kcmV3IEFUIGZyZXNoY29va2llcyBET1Qgb3JnPgoKICAgICAgICAqIDIuNS4yMAoKICAgICAgICAqIE1pbm9yIHR3ZWFrIHRvIHRoZSBpMThuIHByb3BlcnRpZXMgZmlsZSB0byBhZGQgaW4gc29tZSB3aGl0ZXNwYWNlCiAgICAgICAgYmV0d2VlbiB3b3JkcyBmb3Igc2V2ZXJhbCBtZXNzYWdlcyAoRGVmYXVsdFJlc291cmNlcy5wcm9wZXJ0aWVzKS4KCiAgICAgICAgKiBDb3JyZWN0ZWQgYSBTZXNzaW9uTW9uaXRvciBmYWlsdXJlIHRvIGNvcnJlY3RseSBzdGFzaCBhIFdlYWtSZWZlcmVuY2UKICAgICAgICBpbiB0aGUgdXNlcidzIEh0dHBTZXNzaW9uLCB3aGljaCB3YXMgY2F1c2luZyBkb3duc3RyZWFtIENsYXNzQ2FzdEV4Y2VwdGlvbnMuCiAgICAgICAgVGhhbmtzIHRvIE1hcmMgUGF0ZWV0IGZvciBpc29sYXRpbmcgdGhlIGlzc3Vlcy4gSSBoYXZlbid0IHRlc3RlZCB0aGlzCiAgICAgICAgZml4IGV4dGVuc2l2ZWx5LCBzbyBwbGVhc2UgbGV0IG1lIGtub3cgaWYgaXQgZml4ZXMgKG9yIGRvZXMgbm90IGZpeCkKICAgICAgICB0aGUgaXNzdWUuCgogICAgICAgICogSSBjb250aW51ZSB0byBiZSBmbGFiYmVyZ2FzdGVkIGF0IHRoZSBzcGVlZCBhdCB3aGljaCBteSBuZXcgZHVhbC1jb3JlCiAgICAgICAgTUJQIHJ1bnMgdGhlIDczNyBKVW5pdCB0ZXN0cyBpbiB0aGUgSlNQV2lraSB0ZXN0IHN1aXRlOiBhYm91dCAybWluIDQ1cywKICAgICAgICBjb21wYXJlZCB0byA3bWluIG9uIG15IG9sZCBtYWNoaW5lLiBUaGlzIGhhcyBubyBwbGFjZSBpbiBhIENoYW5nZUxvZywgSSBrbm93LgogICAgICAgIEJ1dCBzdGlsbC4KCjIwMDctMDEtMjkgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi41LjE5CgogICAgICAgICogU3luY2hyb25pemVkIHdpdGggMi40LjkxCgoyMDA3LTAxLTA4ICBBbmRyZXcgSmFxdWl0aCA8YW5kcmV3IEFUIGZyZXNoY29va2llcyBET1Qgb3JnPgoKICAgICAgICAqIDIuNS4xOAoKICAgICAgICAqIEJ1ZyBmaXg6IGZpeGVkIERlZmF1bHRSZXNvdXJjZXMucHJvcGVydGllcyB0cmFpbGluZyBzcGFjZSBpbiBtdWx0aS1saW5lCiAgICAgICAgcHJvcGVydHkgdGhhdCB3YXMgY2F1c2luZyBSb2xlIGFuZCBHcm91cCBtZW1iZXJzaGlwcyBvbiB0aGUgUHJvZmlsZQogICAgICAgIHRhYiBvZiBVc2VyUHJlZmVyZW5jZXMgdG8gZmFpbCB0byBkaXNwbGF5LiBJZiB5b3Ugd2VyZSB3b25kZXJpbmcgd2h5CiAgICAgICAgVXNlclByZWZzIHdhc24ndCBzaG93aW5nIGdyb3VwIG1lbWJlcnNoaXBzIC0tIHdlbGwsIGl0J3MgZml4ZWQgbm93LgoKICAgICAgICAqIEJ1ZyBmaXg6IFBhZ2VBY3Rpb25zLmpzcCBub3cgbGlua3MgdG8gVXNlclByZWZlcmVuY2VzIGFzIGEgSlNQLCBub3QKICAgICAgICBhcyBhIHdpa2kgcGFnZS4gQWxzbyBnYWlucyBhIFdvcmtmbG93IGxpbmsgZm9yIGF1dGhlbnRpY2F0ZWQgdXNlcnMuCgogICAgICAgICogTWlub3IgZW5oYW5jZW1lbnQ6IFdpa2lFbmdpbmUgZ2FpbnMgYW4gYWNjZXNzb3IgZm9yIHRoZSBEaWZmZXJlbmNlTWFuYWdlcgogICAgICAgIChnZXREaWZmZXJlbmNlTWFuYWdlcikuIFRoaXMgaXMgdXNlZCBieSB0aGUgd29ya2Zsb3cgY2xhc3Nlcy4KCiAgICAgICAgKiBNaW5vciBlbmhhbmNlbWVudDogVG8gc3VwcG9ydCB3b3JrZmxvdywgV2lraUNvbnRleHQgZ2FpbnMgbmV3IGEgY29udGV4dCwKICAgICAgICBXT1JLRkxPVy4gSXQgZG9lcyBub3QgcmVxdWlyZSBzcGVjaWFsIHByaXZpbGVnZXMgdG8gYWNjZXNzLiBXaWtpQ29tbWFuZAogICAgICAgIGdhaW5zIGEgY29ycmVzcG9uZGluZyBXT1JLRkxPVyBjb21tYW5kLgoKICAgICAgICAqIFNlY29uZCBtYWpvciBjaGVja2luIG9mIHRoZSB3b3JrZmxvdyBwYWNrYWdlLiBUaGUgQVBJIGlzIG1vc3RseSBzdGFibGUsCiAgICAgICAgYnV0IGl0IHNob3VsZCBzdGlsbCBiZSByZWdhcmRlZCBhcyB2b2xhdGlsZS4gV29ya2Zsb3cgbm93IGluY2x1ZGVzCiAgICAgICAgYSB3b3JraW5nIHVzZXIgaW50ZXJmYWNlIChXb3JrZmxvdy5qc3ApLiBVSSBoYXMgYSB3b3JrZmxvdyAiaW5ib3giIChmb3IKICAgICAgICBkZWNpc2lvbnMgYSB1c2VyIGhhcyBiZWVuIGFza2VkIHRvIG1ha2UpIGFuZCBhbiAib3V0Ym94IiAoZm9yIHdvcmtmbG93cwogICAgICAgIGEgdXNlciBoYXMgc3RhcnRlZCkuIFVzZXJzIG11c3QgYmUgYXV0aGVudGljYXRlZCB0byBzZWUgdGhlaXIgd29ya2Zsb3dzLgoKICAgICAgICAqICdTYXZlV2lraVBhZ2VXb3JrZmxvdycgaXMgbm93IG9wZXJhdGlvbmFsLiBJdCBwcm92aWRlcyBtb2RlcmF0aW9uIGZvcgogICAgICAgIHNhdmluZyB3aWtpIHBhZ2VzLCBhbmQgaXMgdHVybmVkIG9mZiBieSBkZWZhdWx0LiBTZWUganNwd2lraS5wcm9wZXJ0aWVzCiAgICAgICAgZm9yIGNvbmZpZ3VyYXRpb24gZ3VpZGVsaW5lcy4KCiAgICAgICAgKiBUbyB0ZXN0IHdvcmtmbG93LCBlbmFibGUgU2F2ZVdpa2lQYWdlV29ya2Zsb3cgdmlhIGpzcHdpa2kucHJvcGVydGllcy4KICAgICAgICBOb3RlOiBhIGNvc21ldGljIE51bGxQb2ludGVyRXhjZXB0aW9uIG9jY3VycyBpbiBzb21lIGNhc2VzIGFmdGVyIGFwcHJvdmluZwogICAgICAgIHBhZ2Ugc2F2ZXM7IHRoaXMgZG9lcyBub3QgcHJldmVudCB0aGUgYWN0dWFsIHBhZ2Ugc2F2ZS4gVGhpcyB3aWxsIGJlCiAgICAgICAgZml4ZWQgdmVyeSBzb29uLiBPdGhlciB0aGFuIHRoaXMsIGFwcHJvdmUvZGVueS9hYm9ydCBmZWF0dXJlcyB3b3JrIG5pY2VseS4KCiAgICAgICAgKiBUZXN0RW5naW5lIGdhaW5zIGFjY2Vzc29ycyBmb3IgdGhlICdhZG1pbicgYW5kICdKYW5uZScgc2Vzc2lvbnMuCgoyMDA3LTAxLTAyICBBbmRyZXcgSmFxdWl0aCA8YW5kcmV3IEFUIGZyZXNoY29va2llcyBET1Qgb3JnPgoKICAgICAgICAqIDIuNS4xNwoKICAgICAgICAqIEhhcHB5IE5ldyBZZWFyIGV2ZXJ5b25lIQoKICAgICAgICAqIFRoaXMgcmVsZWFzZSBhZGRzIGEgc2lnbmlmaWNhbnQgbmV3IHBhY2thZ2UgZm9yIG1vZGVsaW5nCiAgICAgICAgd29ya2Zsb3cgb3BlcmF0aW9ucyAoY29tLmVjeXJkLmpzcHdpa2kud29ya2Zsb3cpLiBUaGlzIHBhY2thZ2UgYWxsb3dzCiAgICAgICAgYXJiaXRyYXJ5IGNvbWJpbmF0aW9ucyBvZiAic3RlcHMiIHRvIGJlIG1vZGVsZWQsIHdpdGggc3VwcG9ydCBmb3IKICAgICAgICB1bmxpbWl0ZWQgYnJhbmNoaW5nIGFuZCBzdXBwb3J0IGZvciBodW1hbiBpbnRlcnZlbnRpb24uIFRoZSBjb3JlIGNsYXNzCiAgICAgICAgaXMgdGhlIFdvcmtmbG93IGNsYXNzLiBXb3JrZmxvd3MgYXJlIGNvbXBvc2VkIG9mIFN0ZXBzLCB3aGljaCBjYW4gYmUKICAgICAgICBUYXNrcyAod2hpY2ggcnVuIHVuaW50ZXJydXB0ZWQpIGFuZCBEZWNpc2lvbnMgKHdoaWNoIHJlcXVpcmUgaW5wdXQKICAgICAgICBmcm9tIG5hbWVkIFByaW5jaXBhbHMgLS0gdXNlcnMsIHJvbGVzIG9yIGdyb3VwcykuIFRoaXMgaW5pdGlhbCBjaGVja2luCiAgICAgICAgaXMgd2VsbC10ZXN0ZWQgYW5kIHNvbGlkIGNvZGUsIGJ1dCB0aGUgQVBJIHNob3VsZCBub3QgYmUgY29uc2lkZXJlZAogICAgICAgIHN0YWJsZS4uLiB5ZXQuIFRoZXJlIGFyZSBOTyB1c2VyLWludGVyZmFjZSBjbGFzc2VzIGFzIHlldC4KICAgICAgICBBZGRpdGlvbmFsIGZyb250LWVuZCBKU1BzIHRoYXQgcHJvdmlkZSBhIFVJIHdpbGwgZm9sbG93IGluIHRoZSBjb21pbmcgd2Vla3MuCgogICAgICAgICogVGhlIGluaXRpYWwgc2FtcGxlIFdvcmtmbG93IHN1YmNsYXNzLCBjaGVja2VkIGluIHRvZGF5LCBpbXBsZW1lbnRzIG1vZGVyYXRlZAogICAgICAgIHBhZ2UgY2hhbmdlcyAoU2F2ZVdpa2lQYWdlV29ya2Zsb3cpLiBJdCBoYXMgYW4gdW5kb2N1bWVudGVkIGNvbmZpZ3VyYXRpb24KICAgICAgICBpbnRlcmZhY2UsIHdoaWNoIEkgd2lsbCBkZXRhaWwgbW9yZSBmdWxseSB3aGVuIHRoZSBVSSBpcyBjbG9zZXIgdG8gY29tcGxldGlvbi4KCiAgICAgICAgKiBTZWUgdGhlICh2ZXJ5IGNvbXBsZXRlKSBKYXZhRG9jIGZvciBtb3JlIGRldGFpbHMuIEknbSBWRVJZIHBzeWNoZWQKICAgICAgICBhYm91dCB0aGlzIG5ldyBjYXBhYmlsaXR5LCBhbmQgb25jZSB3ZSBnZXQgZmxlc2ggb3V0IHRoZSBpbnRlcmZhY2UgeW91IGFsbAogICAgICAgIHdpbGwgYmUgdG9vIQoKICAgICAgICAqIEVuaGFuY2VtZW50OiBjaGFuZ2VkIHRocm93cyBjbGF1c2UgaW4gSTE4Tk1hbmFnZXIgbWV0aG9kcy4KCiAgICAgICAgKiBFbmhhbmNlbWVudDogYWRkZWQgbmV3IGRpciAoZXRjL2kxOG4pIGFuZCBhIHJlc291cmNlIGZpbGUgY2FsbGVkCiAgICAgICAgQ29yZVJlc291cmNlcy5wcm9wZXJ0aWVzIGZvciBtZXNzYWdlIHN0cmluZ3MgZm9yIHRoZSBjb3JlIEpTUFdpa2kgcGFja2FnZXMKICAgICAgICAodGhhdCBpcywgbm90IHBsdWdpbnMsIHRhZ3Mgb3IgSlNQcykuCgogICAgICAgICogRW5oYW5jZW1lbnQ6IGFkZGVkIG5ldyBldmVudCBjbGFzcywgV29ya2Zsb3dFdmVudCwgdG8gc3VwcG9ydCB3b3JrZmxvdwogICAgICAgIGNyZWF0ZS9ydW4vcGF1c2UvcmVzdGFydC9oYWx0L2NvbXBsZXRlIGV2ZW50cy4KCjIwMDctMDEtMDEgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi41LjE2CgogICAgICAgICogSWYgdGhlcmUgd2FzIG5vIGRlZmF1bHQgbG9jYWxlIHNldCwgSTE4Tk1hbmFnZXIuZ2V0QnVuZGxlKCkKICAgICAgICB3b3VsZCBmYWlsLgoKICAgICAgICAqIEF0dGFjaG1lbnQgbGlua3Mgd2l0aCBuZXcgY2hhcmFjdGVyIHNldCB3b3JrIG5vdy4KCiAgICAgICAgKiBTZWN0aW9uIHRpdGxlcyBhcmUgbm93IHJldHVybmVkIGJhY2sgdG8gMi41LjE0IGJlaGF2aW91ci4KCiAgICAgICAgKiBTb21lIHRpbnkgaTE4biB3b3JrIG9uIFRhYmxlT2ZDb250ZW50cy4KCjIwMDYtMTItMzEgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi41LjE1CgogICAgICAgICogRW5nbGlzaCByZXNvdXJjZSBmaWxlcyBoYWQgc29tZSAmYXBvczsncyBpbiB0aGVtLiAgUmVwbGFjZWQKICAgICAgICB3aXRoICYjMzk7LiAgVHVybnMgb3V0IHRoYXQgJmFwb3M7IGlzIGFuIGVudGl0eSBpbiBYTUwsIGJ1dAogICAgICAgIG5vdCBpbiBIVE1MIC0gYW5kIHRoZXJlZm9yZSBJRSBkb2VzIG5vdCByZWNvZ25pemUgaXQuICBGdW4sCiAgICAgICAgYnV0IGZvciBvbmNlIElFIGlzIGNvcnJlY3QgaW4gdGhlaXIgc3RhbmRhcmRzIHN1cHBvcnQuICBGb3VuZAogICAgICAgIGJ5IEhhcnJ5IE1ldHNrZS4KCiAgICAgICAgKiBUaGUgTGlua1BhcnNlciB3b3VsZCBub3QgYm9vdCBqc3B3aWtpLm9yZyBjb250ZW50IGR1ZSB0bwogICAgICAgIGJlaW5nIHRvbyBzdHJpY3Q6ICgiW10iKSB3b3VsZCBjYXVzZSBhIFJ1bnRpbWVFeGNlcHRpb24gYmVpbmcKICAgICAgICB0aHJvd24sIHdoaWNoIHdvdWxkIG5vdCBiZSBjYXVnaHQgdW50aWwgYSB2ZXJ5IGhpZ2ggbGV2ZWwuCiAgICAgICAgRml4ZWQgTGlua1BhcnNlciB0byB1c2UgYSBuZXcgZGVjbGFyZWQgZXhjZXB0aW9uICJQYXJzZUV4Y2VwdGlvbiIuCiAgICAgICAgUmVtaW5kZXIgdG8gc2VsZjogUnVudGltZUV4Y2VwdGlvbnMgYXJlIGV2aWwuCgogICAgICAgICogVGhpcyBpcyBhIGJpZ2dpZTogaW5jcmVhc2VkIHRoZSBudW1iZXIgb2YgYWxsb3dlZCBjaGFyYWN0ZXJzCiAgICAgICAgaW4gYSB3aWtpbmFtZS4gIE5vdyB0aGUgbGlzdCByZWFkcyAiICgpJicqKywtPS5fIiwgc28geWVzLAogICAgICAgIHNwYWNlcyBhcmUgYWxsb3dlZCBub3cuICBBZGRlZCBNYXJrdXBQYXJzZXIud2lraWZ5TGluaygpIHRvCiAgICAgICAga2VlcCBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgdmVyc2lvbnMsIGFuZCBhbHNvIGVuaGFuY2VkCiAgICAgICAgQ29tbWFuZFJlc29sdmVyIHRvIGJlIGFibGUgdG8gZmlndXJlIG91dCBvbGQtc3R5bGUgbGlua3MuCiAgICAgICAgUGxlYXNlIGJlIGF3YXJlIHRoYXQgdGhpcyBpcyBub3QgeWV0IGEgZmluYWwgc2V0IG9mIGNoYXJhY3RlcnMsCiAgICAgICAgc28gdXNpbmcgdGhpcyB2ZXJzaW9uIG1heSBjYXVzZSBhIGxlZ2FjeSB5b3UgbWlnaHQgaGF2ZSB0bwogICAgICAgIGRlYWwgd2l0aCBpdCBwYWluZnVsbHkgbGF0ZXIgb24uICBBbHNvLCBub3RlIHRoYXQgdGhlIGNvZGUgaXMKICAgICAgICBsYXJnZWx5IHVudGVzdGVkIHJpZ2h0IG5vdywgYW5kIG1hbnkgdW5pdCB0ZXN0cyBhcmUgZmFpbGluZwogICAgICAgIHJpZ2h0IG5vdywgc28gY29uc2lkZXIgdGhpcyBub3cgImJsZWVkaW5nIGVkZ2UiLiAgUGxlYXNlIGdpdmUKICAgICAgICBmZWVkYmFjayBvbiB3aGF0IHRoZSBwcm9wZXIgc2V0IG9mIGNoYXJhY3RlcnMgc2hvdWxkIGJlLgoKMjAwNi0xMi0yOSAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiB2LjIuNS4xNAoKICAgICAgICAqIEJ1ZyBmaXg6IDIuNS45IHdhcyBicmVha2luZyB1bml0IHRlc3RzIGJhZGx5LCB0aGFua3MKICAgICAgICB0byBhIG1pc3NpbmcgbnVsbCBjaGVjay4KCiAgICAgICAgKiBCdWcgZml4OiBBbnkgbWFya3VwIGluIHRoZSBmaXJzdCBwYXJhZ3JhcGggd291bGQgYnJlYWsKICAgICAgICBwYXJhZ3JhcGggZGV0ZWN0aW9uIGluIEpTUFdpa2lNYXJrdXBQYXJzZXIucGFyc2UoKS4KICAgICAgICBSZXBvcnRlZCBieSBNdXJyYXkgQWx0aGVpbS4KCiAgICAgICAgKiBBZGRlZCBwYXRjaCBmcm9tIE11cnJheSB0byBhZGQgdGhlICJ0YXJnZXQiIGF0dHJpYnV0ZSB0bwogICAgICAgIHRoZSBJbWFnZSBwbHVnaW4uCgogICAgICAgICogQ29tbWVudGVkUHJvcGVydGllc1Rlc3Qgbm8gbG9uZ2VyIHJlcXVpcmVzIEpESyAxLjUuICBUaGFua3MKICAgICAgICB0byBNdXJyYXkgZm9yIHNwb3R0aW5nIHRoaXMhCgoyMDA2LTEyLTI3ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNS4xMwoKICAgICAgICAqIEFkZGVkIExpbmtQYXJzZXIgY2xhc3MgZnJvbSBNdXJyYXkgQWx0aGVpbS4gIFRoYW5rcyEKICAgICAgICBMaW5rcyBub3cgaGF2ZSBhIG5ldywgZXh0ZW5kZWQgc3ludGF4LiAgWW91IG1heSBhZGQgbWV0YWRhdGEKICAgICAgICB0byBhIGxpbmsgYnkgYWRkaW5nIGEgbmV3IGJhcjogW3RleHR8bGlua3xhdHRyaWJ1dGVzXS4gT25seQogICAgICAgIGEgc3Vic2V0IG9mIGF0dHJpYnV0ZXMgaXMgYWxsb3dlZCwgYXMgZGVzY3JpYmVkIGluIExpbmtQYXJzZXIuCiAgICAgICAgVGhpcyBhbGxvd3MgeW91IHRvIGhhdmUgdGhpbmdzIGxpa2UgbGluayB0YXJnZXRzIGFuZCBsaW5rCiAgICAgICAgcmVsYXRpb25zLgoKMjAwNi0xMi0yNiAgQW5kcmV3IEphcXVpdGggPGFuZHJldyBBVCBmcmVzaGNvb2tpZXMgRE9UIG9yZz4KCiAgICAgICAgKiAyLjUuMTIKCiAgICAgICAgKiBGaXhlZCBidWcgd2l0aCBMb2dpbi9Mb2dpbkNvbnRlbnQgdGhhdCB3YXMgcHJldmVudGluZwogICAgICAgIHBhZ2UgcmVkaXJlY3Rpb24gdXBvbiBsb2dpbiBmcm9tIHdvcmtpbmcgcHJvcGVybHkuIFRoZQogICAgICAgIGNvcnJlc3BvbmRpbmcgd2ViIHVuaXQgdGVzdHMgbm93IGFsbCB3b3JrIGFnYWluLCB0b28uCgogICAgICAgICogRml4ZWQgbWlub3IgYnVnIGluIEFudCBIc3FsIGRhdGFiYXNlIHRlYXJkb3duIHRhc2sKICAgICAgICB0aGF0IHdvdWxkIGNhdXNlIHRoZSB0ZXN0IGRiIHRvIGVycm9uZW91c2x5IHRoaW5rIHRoZQogICAgICAgIGRhdGFiYXNlIGRpZG4ndCBuZWVkIHN0YXJ0aW5nLCBldmVuIGlmIGl0IGRpZC4KCjIwMDYtMTItMjMgIEFuZHJldyBKYXF1aXRoIDxhbmRyZXcgQVQgZnJlc2hjb29raWVzIERPVCBvcmc+CgogICAgICAgICogMi41LjExCgogICAgICAgICogRml4ZWQgZmFpbGluZyBhdXRoIHVuaXQgdGVzdHMgYW5kIHdlYiB1bml0IHRlc3RzLgoKICAgICAgICAqIEZpeGVkIGNvbXBpbGF0aW9uIGVycm9ycyBmb3IgKkdyb3VwQ29udGVudCBKU1BzLgoKMjAwNi0xMi0yMCAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjUuMTAKCiAgICAgICAgKiBNYXNzIGNvbW1pdCBvZiBjb2RlIGZyb20gMi40Ljg3CgoyMDA2LTEyLTE4ICBDaHJpc3RvcGggU2F1ZXIgPHNhdWVyQGhzLWhlaWxicm9ubi5kZT4KCiAgICAgICAgKiAyLjUuOQoKICAgICAgICAqIEJ1Z2ZpeCBpbiBGaWx0ZXJNYW5hZ2VyOiBGaWx0ZXIgTWFuYWdlciB1c2VkCiAgICAgICAgZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCAiL2ZpbHRlcnMueG1sIiApIHRvIGxvY2F0ZSBmaWx0ZXJzLnhtbC4KICAgICAgICBUbyBlbnN1cmUgdGhhdCBpdCByZWFkcyBpdCBmcm9tIFdFQi1JTkYgbGlrZSBkZXNjcmliZWQgaW4gdGhlCiAgICAgICAgZG9jdW1lbnRhdGlvbiB3ZSBoYXZlIHRvIHVzZSB0aGUgc2FtZSBhcHJvYWNoIGxpa2Ugd2l0aCBqc3B3aWtpLnByb3BlcnRpZXM6CiAgICAgICAgZW5naW5lLmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSggREVGQVVMVF9YTUxGSUxFICk7CgoyMDA2LTEyLTE2ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNS44CgogICAgICAgICogSlNQV2lraU1hcmt1cFBhcnNlciBub3cgZXhwb3J0cyBwYXJzZVRva2VuKCkgbWV0aG9kLCB3aGljaAogICAgICAgIGNhbiBiZSB1c2VkIGJ5IHN1YmNsYXNzZXMgdG8gbW9kaWZ5IG9yIGNoYW5nZSB0aGUgZGVmYXVsdAogICAgICAgIG1hcmt1cCByZW5kZXJpbmcuICBUaGVyZSBhcmUgYSBjb3VwbGUgb2YgY2F2ZWF0czogZmlyc3QsCiAgICAgICAgZG9uJ3QgZm9yZ2V0IHRvIGNhbGwgc3VwZXIucGFyc2VUb2tlbigpIGlmIHlvdSBkb24ndCBkbwogICAgICAgIGFueXRoaW5nOyBzZWNvbmQsIHlvdSBtaWdodCBjcmVhdGUgYSBjb21wbGV0ZWx5IG5vbi1jb21wYXRpYmxlCiAgICAgICAgdmVyc2lvbiBvZiBKU1BXaWtpIHdpdGggdGhpcyBtZXRob2QuICBTbyBiZSB2ZXJ5LCB2ZXJ5IGNhcmVmdWwuCiAgICAgICAgTm90ZSBhbHNvIHRoYXQgdGhpcyBpcyBhbiBleHBlcmltZW50YWwgd2F5IHlldCwgc28gSSB3b3VsZAogICAgICAgIHZlcnkgbXVjaCBsaWtlIHRvIGhlYXIgZmVlZGJhY2sgYmVmb3JlIHdlIGNlbWVudCBpdCB0byBzdG9uZS4KCiAgICAgICAgKiBDcmVvbGVSZW5kZXJlciBub3cgY29ycmVjdGx5IHJlbmRlcnMgcGx1Z2lucyBhbmQgaW1hZ2VzLgoKMjAwNi0xMi0xMyAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjUuNwoKICAgICAgICAqIEpTUFdpa2lNYXJrdXBQYXJzZXIgd2lsbCBub3cgaWdub3JlIHdoaXRlc3BhY2UgYmV0d2VlbgogICAgICAgIGxpc3QgYnVsbGV0IGFuZCBsaXN0IC0gbWFrZXMgbm8gZGlmZmVyZW5jZSBhbmQgcHJvZHVjZXMgbW9yZQogICAgICAgIHVuYW1iaWd1b3VzIGNvZGUuCgogICAgICAgICogQWRkZWQgQ3Jlb2xlTWFya3VwUmVuZGVyZXIsIHdoaWNoIGN1cnJlbnRseSBzdXBwb3J0cwogICAgICAgIFdpa2lDcmVvbGUgMC4yIHN5bnRheC4gIFRoaXMgaXMgYSBoaWdobHkgZXhwZXJpbWVudGFsIGZlYXR1cmUuCiAgICAgICAgWW91IGNhbid0IGRvIG11Y2ggd2l0aCBpdCB5ZXQsIHNpbmNlIHdlJ3JlIG1pc3NpbmcgYSBiYWNrY29udmVydGVyLgoKICAgICAgICAqIEpTUFdpa2lNYXJrdXBQYXJzZXIgbm93IHByb3Blcmx5IHByb2R1Y2VzIDxwPiB0YWdzIGZvcgogICAgICAgIGFsbCBwYXJhZ3JhcGhzIC0gVU5MRVNTIHRoZXJlIGlzIGp1c3QgYSBzaW5nbGUgcGFyYWdyYXBoLCBpbgogICAgICAgIHdoaWNoIGNhc2Ugb2xkIGJlaGF2aW91ciB3aWxsIGZvbGxvdy4KCiAgICAgICAgKiBCdWcgZml4OiBEZWZhdWx0UmVzb3VyY2VzLnByb3BlcnRpZXMgd2FzIHN0aWxsIHVzaW5nIHNvbWUKICAgICAgICB7MCxkYXRlfSBzdHJpbmdzIGluc3RlYWQgb2YganVzdCBzdHJpbmdzLiAgUmVwb3J0ZWQgYnkgSGFycnkKICAgICAgICBNZXRza2UuCgoyMDA2LTEyLTExICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNS42CgogICAgICAgICogTWVyZ2VkIGluIEpTUFdJS0lfMl80X0JSQU5DSCBjaGFuZ2VzIHVwIHRvIDIuNC44NC4KCjIwMDYtMTEtMjggIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi41LjUKCiAgICAgICAgKiBwbGFpbi5qc3AgZGlkIG5vdCBjb21waWxlIGR1ZSB0byBsYXN0LW1pbnV0ZSBjaGFuZ2VzIGluCiAgICAgICAgcGFja2FnZSBzdHJ1Y3R1cmUuICBSZXBvcnRlZCBieSBKdWFuIFBhYmxvIFNhbnRvcyBSb2RyaWd1ZXouCgogICAgICAgICogSW50ZXJuYXRpb25hbGl6YXRpb25NYW5hZ2VyIHdhcyBub3QgcHJvcGVybHkgaW5pdGlhbGl6ZWQuCiAgICAgICAgUmVwb3J0ZWQgYWxzbyBieSBKdWFuLgoKICAgICAgICAqIFRhYmxlT2ZDb250ZW50cyB3YXMgdXNpbmcgd3JvbmcgcmVzb3VyY2UgYnVuZGxlLiAgUmVwb3J0ZWQKICAgICAgICBieSBKdWFuLgoKICAgICAgICAqIExvZ2luQ29udGVudC5qc3Agd2FzIGZhaWxpbmcsIGlmIHNvbWVvbmUgbG9jYWxpemVkIHRoZSBsb2dpbgogICAgICAgIGJ1dHRvbi4gIFJlcG9ydGVkIGJ5IHNvbWVvbmUgKHJlbWluZCBtZSBhbmQgSSB3aWxsIGZpeCB0aGlzIGVudHJ5KQoKMjAwNi0xMS0yNyAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjUuNAoKICAgICAgICAqIEFkZGVkIHJwYyBwYWNrYWdlLCBKU09OUlBDTWFuYWdlciwgYW5kIGFkZGVkIHByZWxpbWluYXJ5CiAgICAgICAgc3VwcG9ydCB0byBnZXQgc3VnZ2VzdGlvbnMgaW4gcGxhaW4uanNwIG92ZXIgQUpBWC4gIFllcywKICAgICAgICBKU1BXaWtpIGp1c3QgZ2FpbmVkIEFKQVggc3VwcG9ydCB1c2luZyBKU09OLi4uCgogICAgICAgICogTW92ZWQgQXRvbUFQSVNlcnZsZXQgdG8gcnBjL2F0b20gdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdAogICAgICAgIG5vYm9keSB3YXMgdXNpbmcgaXQgYW55d2F5LgoKMjAwNi0xMS0yMSAgQ2hyaXN0b3BoIFNhdWVyIDxzYXVlckBocy1oZWlsYnJvbm4uZGU+CgogICAgICAgICogMi41LjMKCiAgICAgICAgKiBDaGVja2VkIGluIFdpa2lXaXphcmQgMS4xOgoKICAgICAgICAgIE1ham9yIEltcHJvdmVtZW50czoKICAgICAgICAgIC0gTm93IHN1cHBvcnRzIG11bHRpcGxlIGZpbGUgdXBsb2FkcwogICAgICAgICAgLSBTcGVlZCB1cCBsb2FkaW5nIGJ5IHB1dHRpbmcgY29uZmlnIGZpbGUgaW5pdAogICAgICAgICAgICBpbiBleHRyYSB0aHJlYWQKICAgICAgICAgIC0gSGlnaGxpZ2h0aW5nIG9mICUlIHRhZ3MKICAgICAgICAgIC0gIk1hcmsgT2NjdXJlbmNlcyIgZnVuY3Rpb24gc2ltaWxhciB0byBlY2xpcHNlCiAgICAgICAgICAtIERyYWcgJ24gRHJvcCBJbnRlcmZhY2UgZm9yIGV4dGVuc2lvbiBiYXIKCiAgICAgICAgICBmb3IgZGV0YWlscyBwbGVhc2UgdGFrZSBhIGxvb2sKICAgICAgICAgIGF0IC9hcHBsZXRzL1dpV2ktSU5GL0NoYW5nZUxvZy50eHQKCjIwMDYtMTEtMjAgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi41LjIKCiAgICAgICAgKiBTeW5jaHJvbml6ZWQgd2l0aCAyLjQuODEuCgoyMDA2LTExLTEyICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNS4xCgogICAgICAgICogRml4ZWQgTG9naW5Db250ZW50LmpzcCBzbyB0aGF0IGl0IGNvbXBpbGVzLgoKICAgICAgICAqIEZpeGVkIGlzc3VlIHdpdGggUG9saWN5TG9hZGVyIHdoZW4gdGhlIFVSSSBmb3VuZCBoYWQgYSAiZmlsZToiCiAgICAgICAgaW4gaXQuCgogICAgICAgICogRml4ZWQgc29tZSBvdGhlciBpc3N1ZSB3aGljaCBJIGNhbid0IHJlbWVtYmVyIHJpZ2h0IG5vdyBiZWNhdXNlCiAgICAgICAgSSBkcnVuayBzb21lIHZlcnkgbmljZSBUb21pbnRvdWwgMjcgeWVhcnMgb2xkIHNpbmdsZSBtYWx0IHdoaXNrZXkuCgoyMDA2LTExLTA5ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNS4wCgogICAgICAgICogU3BsaXQgb2ZmIDIuNCB0byBpdHMgb3duIEpTUFdJS0lfMl80X0JSQU5DSCBzdGFibGUgZGV2ZWxvcG1lbnQKICAgICAgICBicmFuY2guICBIRUFEIGlzIG5vdyAyLjYgZGV2ZWxvcG1lbnQgYnJhbmNoLgoKICAgICAgICAqIE1hc3MgY29tbWl0IG9mIGkxOG4gY29kZS4gIEFsbW9zdCBldmVyeXRoaW5nIGlzIGxvY2FsaXplZCBub3csCiAgICAgICAgYnV0IHVuZm9ydHVuYXRlbHkgd2Ugb25seSBzdXBwb3J0IEVuZ2xpc2ggcmlnaHQgbm93LgoKMjAwNi0xMS0wNyAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjQuNzgKCiAgICAgICAgKiBBIGJ1bmNoIG9mIG1pbm9yIHJlZmFjdG9yaW5ncyBzdWdnZXN0ZWQgYnkgQXJvbiBHb21iYXMsCiAgICAgICAgaW5jbHVkaW5nOgoKICAgICAgICAqIFZpc2liaWxpdHkgb2YgbWVtYmVyIHZhcmlhYmxlcyBpbiBXaWtpQ29udGV4dCBoYXZlIGJlZW4gY2hlY2tlZCAtCiAgICAgICAgdGhpbmdzIHdlcmUgbWFkZSBtb3JlIHByaXZhdGUsIGV4Y2VwdCBtX3JlcXVlc3QgaXMgbm93IHByb3RlY3RlZCB0bwogICAgICAgIGhlbHAgaW4gc3ViY2xhc3NpbmcuCgogICAgICAgICogSlNQV2lraU1hcmt1cFBhcnNlciBhbHNvIGhhcyB2aXNpYmlsaXR5IGNoZWNrZWQgYSBiaXQgdG8gaGVscAogICAgICAgIGluIHN1YmNsYXNzaW5nIC0gdGhlIGRpZmZlcmVudCBsaW5rIHR5cGVzIGFyZSBub3cgcHJvdGVjdGVkLAogICAgICAgIGFuZCBhIG5ldyBmYWN0b3J5IG1ldGhvZCBjcmVhdGVBbmNob3IoKSB3YXMgYWRkZWQuCgogICAgICAgICogSlNQV2lraU1hcmt1cFBhcnNlciBub3cgY2hlY2tzIFdpa2lDb250ZXh0IGZvciBvdmVycmlkZXMgZm9yCiAgICAgICAgbW9zdCB2YXJpYWJsZXMuCgoyMDA2LTExLTA2ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNC43NwoKICAgICAgICAqIEhvcGVmdWxseSBmaXhlZCBsb2dpbiByZWRpcmVjdGlvbiBpc3N1ZXMgd2hlbiB1c2luZwogICAgICAgIGNvbnRhaW5lciBhdXRoZW50aWNhdGlvbi4gIElmIHRoZSB1c2VyIGRpZCBub3QgaGF2ZSBwZXJtaXNzaW9ucwogICAgICAgIGV2ZW4gYWZ0ZXIgbG9naW4sIHRoaXMgd291bGQgcmVzdWx0IGluIGEgY29uc3RhbnQgc2VyaWVzIG9mCiAgICAgICAgcmVkaXJlY3Rpb25zLgoKICAgICAgICAqIEFkZGVkIHJ1bl93ZWJ0ZXN0cy5zaAoKMjAwNi0xMS0wNiAgQ2hyaXN0b3BoIFNhdWVyIDxzYXVlckBocy1oZWlsYnJvbm4uZGU+CgogICAgICAgICogMi40Ljc2CgogICAgICAgICogYWRkZWQgZml4IGZyb20gQ2h1Y2sgU21pdGggc28gdGhhdCBXaWtpV2l6YXJkLmpzcCBub3cgaXMgdmFsaWQgWEhUTUw6CiAgICAgICAgICBkb2N1bWVudC53cml0ZSgpIGZ1bmN0aW9uIGluIEphdmFTY3JpcHQgaXMgZGVwcmVjYXRlZCwgaW5zdGVhZAogICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGNoYW5nZVdpZHRoLCBudWxsKQogICAgICAgICAgaXMgdXNlZCBub3cgdG8gbW9kaWZ5IHRoZSB0aGUgRE9NIFRyZWUgYWZ0ZXIgaXQgaXMgbG9hZGVkLgoKMjAwNi0xMS0wNCAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjQuNzUKCiAgICAgICAgKiBBZGRlZCBwYXRjaCBmcm9tIFRvbWFzeiBTenlta28gdG8gZml4IHByZXZpZXdzIHdoZW4gYWRkaW5nCiAgICAgICAgY29tbWVudHMuICBUaGFua3MhCgogICAgICAgICogQWRkZWQgcGF0Y2ggZnJvbSBNdXJyYXkgQWx0aGVpbSB0byBwcm92aWRlIHRpbWVzdGFtcHMgaW4KICAgICAgICBXaWtpRXZlbnRzLCBhbmQgYWRkZWQgYSBuZXcgU0VTU0lPTl9FWFBJUkVEIGV2ZW50IGFzIHdlbGwuCgogICAgICAgICogU2Vzc2lvbiBtb25pdG9yIG5vdyBmaXJlcyBTRVNTSU9OX0VYUElSRUQgZXZlbnRzLgoKMjAwNi0xMC0yOSAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjQuNzQKCiAgICAgICAgKiBJbXByb3ZlZCBzdGFydHVwIGEgYml0OyBub3cgdGhlIGxvZyBmaWxlcyBzaG91bGQgYmUgYmV0dGVyIGluCiAgICAgICAgY2FzZSB5b3UgaGF2ZSBhIHByb2JsZW0gaW4geW91ciBqc3B3aWtpLnByb3BlcnRpZXMuICBJdCdzIHN0aWxsCiAgICAgICAgbm90IHBlcmZlY3QsIGJ1dCBpdCdzIGJldHRlci4gIFRoZSB1bmZvcnR1bmF0ZSBzaWRlIGVmZmVjdCBpcwogICAgICAgIHRoYXQgeW91J2xsIHN0YXJ0IGdldHRpbmcgNDA0IGVycm9ycyBpbnN0ZWFkIG9mIGVycm9yIG1lc3NhZ2VzCiAgICAgICAgd2hlbiB5b3UgYXJlIHRyeWluZyB0byBhY2Nlc3MgdGhlIHNpdGUuCgogICAgICAgICogR290IHJpZCBvZiBqc3BJbml0KCkgaW4gYWxsIHRvcC1sZXZlbCBKU1AgZmlsZXMuICBUaGlzIGlzIGEKICAgICAgICBiaXQgbmljZXIgYW5kIHNpbXBsZXIgYWxsIGFyb3VuZC4KCjIwMDYtMTAtMjggIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi40LjczCgogICAgICAgICogUGF0Y2ggZnJvbSBOZWlsIE1pbGxlciB0byBmaXggUGFnZU1hbmFnZXIgd2hpY2ggd2FzIG5vdCB1c2luZwogICAgICAgIHByb3BlciBnZXRQcm9wZXJ0eSgpLgoKICAgICAgICAqIEF0dGFjaG1lbnRNYW5hZ2VyLmxpc3RBdHRhY2htZW50cygpIG5vdyBzb3J0cyB0aGUgYXR0YWNobWVudHMuCiAgICAgICAgU3VnZ2VzdGVkIGJ5IEZhYmlvIEJvbmluLgoKICAgICAgICAqIElmIGpzcHdpa2kudXNlQ2FjaGUgd2FzIHNldCB0byBmYWxzZSwgZmluZGluZyBwYWdlcyB3b3VsZAogICAgICAgIG5vdCB3b3JrIHdpdGggVmVyc2lvbmluZ0ZpbGVQcm92aWRlciwgdGhhbmtzIHRvIHNvbWUgcmVhbGx5IG9sZAogICAgICAgIG9wdGltaXphdGlvbiBjb2RlIHRoYXQgbmV2ZXIgZ290IHVwZGF0ZWQuICBSZW1vdmVkIG9wdGltaXphdGlvbiwKICAgICAgICBoZXkgcHJlc3RvISAgSXQgd29ya3MhCgogICAgICAgICogU3BhbSBmaWx0ZXIgbm93IGluY2x1ZGVzIGNoYW5nZSBub3RlcyBpbiBpdHMgY2hlY2tzIGFzIHdlbGwuCgogICAgICAgICogV2lraUV2ZW50U291cmNlIGlzIG5vdyBnb25lLCBzaW5jZSBpdCB3YXMgbm90IHVzZWQgZm9yIGFueXRoaW5nLgogICAgICAgIFRoYW5rcyB0byBNdXJyYXkgZm9yIHRoZSBoZWFkcy11cCEKCjIwMDYtMTAtMjEgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi40LjcyCgogICAgICAgICogU3BhbUZpbHRlciBpcyBub3cgYSBsb3Qgc21hcnRlci4gIEkgZW5saXN0ZWQgYSBzbWFsbCBndXkKICAgICAgICBjYWxsZWQgSGVyYiwgd2hvIGhhcyBhZ3JlZWQgdG8gc2l0IGluIHRoZSBKQVIgZmlsZSwgYW5kIHdhdGNoCiAgICAgICAgZm9yIGFueSBzcGFtLiAgTG9nIGZpbGVzIGFyZSBhIGJpdCBiZXR0ZXIsIHRvby4KCiAgICAgICAgKiBTcGFtRmlsdGVyIHdpbGwgbm93IHdhdGNoIGF0IGNvbnNlY3V0aXZlIG1vZGlmaWNhdGlvbnMsIGFuZAogICAgICAgIG1hcmsgdGhlbSBhcyBzcGFtLCBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgc2ltaWxhci1sb29raW5nCiAgICAgICAgbW9kaWZpY2F0aW9ucyAobm8gbWF0dGVyIHdoYXQgSVAgdGhleSdyZSBmcm9tKS4KCiAgICAgICAgKiBTcGFtRmlsdGVyIGNhbiBub3cgY29ubmVjdCB0byBBa2lzbWV0ICh3d3cuYWtpc21ldC5jb20pLgogICAgICAgIFlvdSBuZWVkIHRvIGdldCB5b3VyIG93biBBUEkga2V5LCB0aG91Z2gsIGFuZCBwdXQgaXQgaW4gdGhlCiAgICAgICAgZmlsdGVycy54bWwgY29uZmlnIGZpbGUuICBVbmZvcnR1bmF0ZWx5IHdlIGRvbid0IHlldCBoYXZlCiAgICAgICAgdGhlIGFiaWxpdHkgdG8gbWFyayAiaGFtIiBhbmQgInNwYW0iLgoKICAgICAgICAqIFNob3J0VVJMQ29uc3RydWN0b3IgZGlkIG5vdCBoYW5kbGUgQ09ORkxJQ1Qgc2l0dWF0aW9ucwogICAgICAgIGNvcnJlY3RseS4KCjIwMDYtMTAtMTcgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi40LjcxCgogICAgICAgICogU21hbGwgZml4IGZyb20gVG9tYXN6IFN6eW1rbzoganNwd2lraS5jc3MgaGFzIGluZm9ybWF0aW9uCiAgICAgICAgYW5kIGVycm9yIGltYWdlcyByZXZlcnNlZC4KCiAgICAgICAgKiBDb21tZW50LmpzcCBkaWQgbm90IGNvbXBpbGUuICBSZXBvcnRlZCBieSBhIG51bWJlciBvZiBwZW9wbGUuCiAgICAgICAgT29vcHMuLi4KCjIwMDYtMTAtMTMgIEVyaWsgQnVubiAgPGVidUBtZW1lY3J5Lm5ldD4KCiAgICAgICAgKiAyLjQuNzAKCiAgICAgICAgKiBNaW5vciBtb2QgdG8gV2VibG9nRW50cnlQbHVnaW46IG5vdyBhY2NlcHRzIGEgJ3BhZ2UnIHBhcmFtZXRlciwKICAgICAgICBsaWtlIFdlYmxvZ1BsdWdpbi4gQWxsb3dzIHByb3ZpZGluZyBhICduZXcgZW50cnknIGxpbmsgb24gc29tZQogICAgICAgIHBhZ2Ugb3RoZXIgdGhhbiB0aGUgYWN0dWFsIGJsb2cgcGFnZTsgdGhpcyBtYXkgYmUgdXNlZnVsIGUuZy4KICAgICAgICBmb3IgYWx0ZXJuYXRlIHZpZXdzIG9mIGEgYmxvZyBwYWdlLgoKMjAwNi0xMC0xMiAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjQuNjkKCiAgICAgICAgKiBBZGRlZCBhIGNvdXBsZSBvZiBwYXRjaGVzIGZyb20gVG9tYXN6IFN6eW1rbyB0byBmaXggYSBwcm9ibGVtCiAgICAgICAgd2l0aCBtZXNzYWdlcyBmcm9tIHRoZSBBdHRhY2htZW50U2VydmxldCwgYW5kIGEgcHJvYmxlbSB3aXRoCiAgICAgICAgRWRpdExpbmtUYWcuCgogICAgICAgICogQWRkZWQgcGF0Y2ggZnJvbSBNdXJyYXkgQWx0aGVpbSB0byBmaXggYSBwcm9ibGVtIHdpdGgKICAgICAgICBUZXh0VXRpbC5yZXBsYWNlU3RyaW5nKCkgLSBpdCB3b3VsZCBiZSBkeWluZyB1bmRlciBjZXJ0YWluCiAgICAgICAgY2lyY3Vtc3RhbmNlcy4KCiAgICAgICAgKiBBZGRlZCBwYXRjaCBmcm9tIE11cnJheSB0byBhZGQgIl9ib3VuZHMiIHBhcmFtZXRlciB0byB0aGUKICAgICAgICBwbHVnaW4gaW52b2NhdGlvbi4gIF9ib3VuZHMgY29uc2lzdHMgb2YgYW4gaW50ZWdlciBhcnJheSAoaW50W10pLAogICAgICAgIHdoZXJlIGVsZW1lbnQgMCBpcyB0aGUgc3RhcnQgb2YgdGhlIHBsdWdpbiBwb3NpdGlvbiBpbiB0aGUgcGFnZSwKICAgICAgICBhbmQgZWxlbWVudCAxIHRoZSBlbmQuCgogICAgICAgICogU21hbGwgZml4ZXMgdG8gTHVjZW5lU2VhcmNoUHJvdmlkZXIuCgoyMDA2LTEwLTA5ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNC42OAoKICAgICAgICAqIEhvcGVmdWxseSBmaXhlZCB0aGUgIkFDTCBub3QgcmVmcmVzaGVkIGF0IHN0YXJ0dXAiIHByb2JsZW0sCiAgICAgICAgcmVwb3J0ZWQgYnkgbWFueSBwZW9wbGUuCgoyMDA2LTEwLTA4ICBBbmRyZXcgSmFxdWl0aCA8YW5kcmV3IEFUIGZyZXNoY29va2llcyBET1Qgb3JnPgoKICAgICAgICAqIDIuNC42NwoKICAgICAgICAqIEVuaGFuY2VtZW50OiBKREJDVXNlckRhdGFiYXNlIHdpbGwgbm93IHVzZSB0cmFuc2FjdGlvbnMsIGlmIHRoZQogICAgICAgIGJhY2stZW5kIGRhdGFiYXNlIHN1cHBvcnRzIHRoZW0uIEluIGFkZGl0aW9uLCBKREJDVXNlckRhdGFiYXNlIG5vdwogICAgICAgIG5haWxzIHVwIGEgc2luZ2xlLCBsb25nLXJ1bm5pbmcgY29ubmVjdGlvbiBpbnN0ZWFkIG9mIGNvbnRpbnVhbGx5CiAgICAgICAgb3BlbmluZyBhbmQgY2xvc2luZyB0aGVtLiBMb2cgbWVzc2FnZSB2ZXJib3NpdHkgZXhwYW5kZWQgc2xpZ2h0bHkuCgogICAgICAgICogRW5oYW5jZW1lbnQ6IEdyb3VwRGF0YWJhc2Ugbm93IGhhcyBhIHJlbGF0aW9uYWwgZGF0YWJhc2UgaW1wbGVtZW50YXRpb24KICAgICAgICBjYWxsZWQgSkRCQ0dyb3VwRGF0YWJhc2UuIEl0IHN1cHBvcnRzIHRyYW5zYWN0aW9ucyBhbmQgaXMgY29uZmlndXJlZAogICAgICAgIHVzaW5nIGEgY29udGFpbmVyLW1hbmFnZWQgSk5ESSBEYXRhU291cmNlLCBleGFjdGx5IGxpa2UgSkRCQ1VzZXJEYXRhYmFzZS4KICAgICAgICBVbml0IHRlc3RzIGFuZCBEREwgc2V0dXAvdGVhcmRvd24gc2NyaXB0cyB3ZXJlIHVwZ3JhZGVkIGZvciB0aGUKICAgICAgICBuZXcgaW1wbGVtZW50YXRpb24uIFNhbXBsZSBzY3JpcHRzIGFyZSBpbmNsdWRlZCBmb3IgUG9zdGdyZVNRTCBhbmQKICAgICAgICBIeXBlcnNvbmljLgoKMjAwNi0xMC0wNiAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiBGaXhlZCBhIGJ1bmNoIG9mIGphdmFkb2Mgd2FybmluZ3M7IG5vdCBlbm91Z2ggdG8gd2FycmFudCBhCiAgICAgICAgdmVyc2lvbiBidW1wLgoKMjAwNi0xMC0wNSAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjQuNjYKCiAgICAgICAgKiBBZGRlZCBzbWFsbCBwYXRjaCBmcm9tIE5laWwgTWlsbGVyIHRvIGZpeCBXaWtpRW5naW5lLmdldEluc3RhbmNlKCkKICAgICAgICB3aGljaCB3YXMgbm90IHByb3Blcmx5IHBhc3NpbmcgaXRzIGFyZ3VtZW50cy4gIFRoYW5rcyEKCiAgICAgICAgKiBBZGRlZCBwYXRjaCBmcm9tIE11cnJheSBBbHRoZWltIHdoaWNoIG1ha2VzIFJlZmVyZW5jZU1hbmFnZXIgYW5kCiAgICAgICAgU2VhcmNoTWFuYWdlciB0byBiZWhhdmUgYXMgRXZlbnRMaXN0ZW5lcnMgZm9yIHBhZ2UgZGVsZXRpb24uICBOb3RhYmx5LAogICAgICAgIEF0dGFjaG1lbnRNYW5hZ2VyIGFuZCBSZW5kZXJpbmdNYW5hZ2VyIGRvIG5vdCB5ZXQgZmlyZSBvciBsaXN0ZW4gdGhlc2UKICAgICAgICBldmVudHMgKG5lZWRzIGZpeCkuCgogICAgICAgICogQWRkZWQgUEFHRV9ERUxFVEVEIGFuZCBQQUdFX0RFTEVURV9SRVFVRVNURUQgZnJvbSBNdXJyYXkuCgogICAgICAgICogQWRkZWQgcGF0Y2ggdG8gSlNQV2lraU1hcmt1cFBhcnNlciBmcm9tIE11cnJheSB0byBtYWtlIHNvbWUgb2YgdGhlCiAgICAgICAgYXR0cmlidXRlcyBwdWJsaWNhbGx5IGFjY2Vzc2libGUgYW5kIGxlc3MgbWFnaWMuCgogICAgICAgICogRml4ZWQgU2hvcnRVUkxDb25zdHJ1Y3RvciBhZ2FpbiBmb3Igc29tZSBjb250ZXh0cyAoRklORCwgREVMRVRFICYgUFJFRlMpCgoyMDA2LTEwLTAxICBBbmRyZXcgSmFxdWl0aCA8YW5kcmV3IEFUIGZyZXNoY29va2llcyBET1Qgb3JnPgoKICAgICAgICAqIDIuNC42NQoKICAgICAgICAqIEJ1ZyBmaXg6IGZpeGVkIGFuIGlzc3VlIHdpdGggV2lraUNvbnRleHQgdGhhdCBjYXVzZWQgQUNMcyBhbmQgcG9saWN5IHNldHRpbmdzIHRvCiAgICAgICAgYmUgaWdub3JlZCB3aGVuIGFjY2Vzc2luZyB0aGUgZGVmYXVsdCBmcm9udCBwYWdlLiBUaGlzIGJ1ZyB3YXMgaW50cm9kdWNlZCBkdXJpbmcKICAgICAgICB0aGUgQUFBIG1lZ2EtcGF0Y2ggaW4gSnVseSAoMi40LjI1KS4gTm90ZTogd2Ugc3RpbGwgaGF2ZSBhbiB1bnJlbGF0ZWQgYnVnCiAgICAgICAgd2l0aCBBQ0xzIG5vdCBiZWluZyBhcHBsaWVkIHRoZSAqZmlyc3QgdGltZSogcGFnZXMgYXJlIGxvYWRlZC4KCjIwMDYtMTAtMDEgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi40LjY0CgogICAgICAgICogV2lraVBhZ2UuY2xvbmUoKSB3YXMgbm90IGNsb25pbmcgZXZlcnl0aGluZzsgdGhpcyBzaG91bGQgbm93IGJlIGZpeGVkLgoKICAgICAgICAqIEluY2x1ZGVkIHBhdGNoIGZyb20gTmVpbCBNaWxsZXIgdG8gbWFrZSBSZW5kZXJpbmdNYW5hZ2VyIHVzZSB0aGUKICAgICAgICBldmVudGluZyBzeXN0ZW0gaW5zdGVhZCBvZiBQYWdlRmlsdGVycy4gIFRoYW5rcyEKCiAgICAgICAgKiBTaG9ydFVSTENvbnN0cnVjdG9yIG5vdyBzdXBwb3J0cyBncm91cCBmdW5jdGlvbmFsaXR5LgoKICAgICAgICAqIEZpeGVkIGFuIGFubm95aW5nIGJ1ZyB3aGljaCBhcHBlYXJlZCBpZiBzYXZpbmcgZmFpbGVkIGZvciBzb21lIHJlYXNvbgogICAgICAgIChlLmcuIHdoZW4gU3BhbUZpbHRlciB3b3VsZCByZWplY3QgYW4gZWRpdCk6IHRoZSBjYWNoZSB3b3VsZCBzdGlsbAogICAgICAgIGNvbnRhaW4gdGhlIGNoYW5nZWQgcGFnZSBtZXRhZGF0YS4gIFdlIG5vdyBtYWtlIGEgY2xvbmUgb2YgdGhlCiAgICAgICAgV2lraVBhZ2UgYmVmb3JlIHdlIGF0dGVtcHQgYSBzYXZlLgoKMjAwNi0xMC0wMSAgQW5kcmV3IEphcXVpdGggPGFuZHJldyBBVCBmcmVzaGNvb2tpZXMgRE9UIG9yZz4KCiAgICAgICAgKiAyLjQuNjMKCiAgICAgICAgKiBXaWtpU2Vzc2lvbiByZWNlaXZlcyBzZXZlcmFsIHVuZGVyLXRoZS1ob29kIGNoYW5nZXMgdG8gaW1wcm92ZSBzZXNzaW9uCiAgICAgICAgc3RhYmlsaXR5LiBUaGUgdGVjaG5pcXVlIHVzZWQgdG8gZGV0ZWN0IHNlc3Npb24gc3RhdHVzIGNoYW5nZXMgbm93IGluY2x1ZGVzIGFuCiAgICAgICAgZXhwbGljaXQgY2hlY2sgZm9yIHByaW9yIGF1dGhlbnRpY2F0aW9uOyB0aGlzIHNob3VsZCBwcmV2ZW50IHN1ZGRlbiAiZG93bmdyYWRlcyIKICAgICAgICBmcm9tIGF1dGhlbnRpY2F0ZWQgc3RhdHVzIHRvIGFzc2VydGVkIChjb29raWVzKS4gVXNlci9sb2dpbiBQcmluY2lwYWxzIGFuZAogICAgICAgIHRoZSBzdGF0dXMgc3RyaW5ncyAoYW5vbnltb3VzL2Fzc2VydGVkL2F1dGhlbnRpY2F0ZWQpIGFyZSBjYWNoZWQgbm93LCByYXRoZXIKICAgICAgICB0aGFuIGR5bmFtaWNhbGx5IGNhbGN1bGF0ZWQuIFdpa2lTZXNzaW9uIGdhaW5zIGEgbmV3IHB1YmxpYyBtZXRob2QsIGlzQXNzZXJ0ZWQoKQogICAgICAgIHRoYXQgZG9lcyB3aGF0IGl0IHNheXMuIEZpbmFsbHksIFdpa2lTZXNzaW9uIG5vdyB0YWtlcyByZXNwb25zaWJpbGl0eQogICAgICAgIGZvciBwb3B1bGF0aW5nIHRoZSBKQUFTIFN1YmplY3Qgd2l0aCB1c2VyIHByb2ZpbGUgcHJpbmNpcGFscywgcmF0aGVyIHRoYW4KICAgICAgICB0aGUgdmFyaW91cyBsb2dpbiBtb2R1bGVzLgoKICAgICAgICAqIEF1dGhlbnRpY2F0aW9uTWFuYWdlciBub3cgZmlyZXMgYW4gZXZlbnQgY2FsbGVkIExPR0lOX0lOSVRJQVRFRCB3aGVuZXZlcgogICAgICAgIHRoZSBhdXRoZW50aWNhdGlvbiBzdGF0dXMgY2hhbmdlcywgc2lnbmlmeWluZyB0aGF0IHRoZSBKQUFTIGxvZ2luIHN0YWNrCiAgICAgICAgZXhlY3V0ZWQgKGJ1dCB3aXRob3V0IHJlZ2FyZCB0byB3aGV0aGVyIGl0IHN1Y2NlZWRlZCkuIFdpa2lTZXNzaW9uIGxpc3RlbnMKICAgICAgICBmb3IgdGhpcyBldmVudCBhbmQgdXBkYXRlcyBpdHMgY2FjaGVkIHByaW5jaXBhbHMuIEF1dGhlbnRpY2F0aW9uTWFuYWdlcgogICAgICAgIGFsc28gbm93IGZpcmVzIGV4cGxpY2l0IGV2ZW50cyBjYWxsZWQgTE9HSU5fQU5PTllNT1VTIGFuZCBMT0dJTl9BU1NFUlRFRAogICAgICAgIGluIGFkZGl0aW9uIHRvIExPR0lOX0FVVEhFTlRJQ0FURUQuCgogICAgICAgICogSW4gdGhlIG5hbWUgb2YgY29kZSBzaW1wbGlmaWNhdGlvbiwgZXZlbnQgc3VwcG9ydCB3YXMgcmVtb3ZlZCBmcm9tIHRoZQogICAgICAgIEdyb3VwIGNsYXNzLiBJdCB3YXMgcmVkdW5kYW50IGFuZCBtYWRlIHRoaW5ncyBtb3JlIGNvbXBsaWNhdGVkLiBDb25zZXF1ZW50bHksCiAgICAgICAgR3JvdXBNYW5hZ2VyIGxvc2VzIGl0cyBHcm91cExpc3RlbmVyIGlubmVyIGNsYXNzLCBhbmQgV2lraVNlY3VyaXR5RXZlbnQgZ2V0cwogICAgICAgIHJpZCBvZiB0eXBlcyBHUk9VUF9BRERfTUVNQkVSLCBHUk9VUF9SRU1PVkVfTUVNQkVSLCBHUk9VUF9DTEVBUl9NRU1CRVJTLgogICAgICAgIElmIHlvdSByZWFsbHkgcmVhbGx5IG5lZWQgdGhlc2UgbGV0IG1lIGtub3csIGJ1dCBpbiB0aGUgbWVhbnRpbWUgdGhlIGNvYXJzZXItCiAgICAgICAgZ3JhaW5lZCBHUk9VUF9BREQgYW5kIEdST1VQX1JFTU9WRSB3aWxsIGRvIHdoYXQgd2UgbmVlZC4KCiAgICAgICAgKiBVc2VyRGF0YWJhc2VMb2dpbk1vZHVsZSBubyBsb25nZXIgcG9wdWxhdGVzIFdpa2lTZXNzaW9uJ3MgU3ViamVjdCB3aXRoCiAgICAgICAgdXNlciBwcm9maWxlIHByaW5jaXBhbHM7IHRoaXMgd2FzIG1vdmVkIHRvIFdpa2lTZXNzaW9uLiBUaGlzIHNob3VsZCBtYWtlCiAgICAgICAgcHVyZSwgYXV0aGVudGljYXRpb24tb25seSBsb2dpbiBtb2R1bGVzIHBvc3NpYmxlLCBzdWNoIGFzIGZvciBMREFQIGFuZCBLZXJiZXJvcy4KICAgICAgICBCZWNhdXNlIGF1dGhlbnRpY2F0aW9uIGFuZCB1c2VyIHByb2ZpbGUgc3RvcmFnZSBhcmUgYmV0dGVyIHNlcGFyYXRlZCwgaXQgd2lsbAogICAgICAgIHByZXZlbnQgdGhlIG5lZWQgdG8gc3ViY2xhc3MgYW5kIGhhY2sgWE1MVXNlckRhdGFiYXNlLiBXZWJDb250YWluZXJDYWxsYmFja0hhbmRsZXIKICAgICAgICBubyBsb25nZXIgbmVlZHMgYSBVc2VyRGF0YWJhc2VDYWxsYmFjayBhcyBhIHJlc3VsdCwgc28gdGhlIGNhbGxiYWNrIHdhcyByZW1vdmVkLgoKICAgICAgICAqIEJ1ZyBmaXg6IExvZ2luRm9ybSBub3cgaW5qZWN0cyBhIFdpa2lDb250ZXh0LCBidXQgb25seSBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeQogICAgICAgIGV4aXN0IGluIHRoZSBwYWdlIGNvbnRleHQuIFRoaXMgcGx1Z3MgdGhlIGJ1ZyBpbnRyb2R1Y2VkIGluIDIuNC42MC4gUGFnZSByZWRpcmVjdGlvbgogICAgICAgIGFmdGVyIGxvZ2luIHdvcmtzIGZvciBib3RoIGNvbnRhaW5lciBhbmQgY3VzdG9tIGF1dGhlbnRpY2F0aW9uOyB0aGUgd2ViIHVuaXQKICAgICAgICB0ZXN0cyBub3cgdGVzdCBmb3IgdGhpcyBjb25kaXRpb24gZXhwbGljaXRseS4gVGhlIGZpeCBoYXMgYmVlbiB0ZXN0ZWQgd2l0aAogICAgICAgIFRvbWNhdCBhbmQgSkJvc3MgNC4KCiAgICAgICAgKiBGaXhlZCBhIGJ1bmNoIG9mIGZhaWxpbmcgYXV0aCB0ZXN0cy4KCjIwMDYtMDktMjggIEFuZHJldyBKYXF1aXRoIDxhbmRyZXcgQVQgZnJlc2hjb29raWVzIERPVCBvcmc+CgogICAgICAgICogMi40LjYyCgogICAgICAgICogRml4ZWQgdGhlIGZpeCBmb3IgdGhlIGxvZ2luLXJlZGlyZWN0aW9uIGlzc3VlLCBwYXRjaGVkIGluIDIuNC42MC4KICAgICAgICAiUmVndWxhciIgbG9naW5zICh0aG9zZSB3aXRob3V0IGEgc3Vic2VxdWVudCByZWRpcmVjdGlvbikgbm93IHdvcmsgYWdhaW4uCiAgICAgICAgVGhhbmtzIHRvIHRoZSBpbmRlZmF0aWdhYmxlIFRlcnJ5IFN0ZWljaGVuLgoKMjAwNi0wOS0yNyAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjQuNjEKCiAgICAgICAgKiBGaXhlZCBhIGNvdXBsZSBvZiBmYWlsaW5nIHRlc3RzIChyZWNlbnQgY2hhbmdlcyBjYXVzZWQgc2xpZ2h0IGJlaGF2aW91cgogICAgICAgIGNoYW5nZSkKCiAgICAgICAgKiBCdWcgZml4OiB0aGUgV2lraSBFdmVudCBJTklUSUFMSVpJTkcgaXMgbm93IGZpcmVkIGFmdGVyIGxvZzRqIGlzIHJ1bm5pbmcgLQogICAgICAgIHRoaXMgc3RvcHMgYWJvdXQgYSB6aWxsaW9uIG9mIGVycm9ycyBpbiB0aGUgY29udGFpbmVyIGxvZyBmaWxlLgoKICAgICAgICAqIFNsaWdodGx5IGp1Z2dsZWQgd2l0aCB0aGUgYnVpbHQtaW4gc3lzdGVtIGZpbHRlciBwcmlvcml0aWVzIHRvIG1ha2Ugc3VyZQogICAgICAgIHRoYXQgdGhleSBhcmUgZXhlY3V0ZWQgaW4gY29ycmVjdCBvcmRlci4KCiAgICAgICAgKiBBZGRlZCBhIHNtYWxsIGZpeCB0byBzYXZlVGV4dCgpIHRvIGNoZWNrIGlmIGl0IHBvc3NpYmx5IGZpeGVzIHNvbWUgcHJvYmxlbXMKICAgICAgICB3aXRoIGRpc2FwcGVhcmluZyBBQ0wgbGlzdHMgb3Igb3RoZXIgbWV0YWRhdGEuICBPdXIgcHJvdmlkZXIgaW50ZXJmYWNlIGlzCiAgICAgICAgZGVzcGVyYXRlbHkgaW4gdGhlIG5lZWQgb2YgYW4gb3ZlcmhhdWwuLi4KCjIwMDYtMDktMjcgIEFuZHJldyBKYXF1aXRoIDxhbmRyZXcgQVQgZnJlc2hjb29raWVzIERPVCBvcmc+CgogICAgICAgICogMi40LjYwCgogICAgICAgICogRml4ZWQgdHlwbyBpbiBTZWN1cml0eUNvbmZpZy5qc3AgdGhhdCBjYXVzZWQgZ3JvdXAgdmVyaWZpY2F0aW9uIHRvCiAgICAgICAgICByZXBvcnQgdGhlIG51bWJlciBvZiAidXNlcnMiIHJhdGhlciB0aGFuayBncm91cHMuIENyZWRpdDogQ2h1Y2sgRGVhbC4KCiAgICAgICAgKiBGaXhlZCBhIHNlcmllcyBvZiByZWxhdGVkLCBtaW5vciBidWdzIHRoYXQgY2F1c2VkIEpTUFdpa2kgdG8gYWx3YXlzCiAgICAgICAgcmVkaXJlY3QgdG8gdGhlIGZyb250IHBhZ2UgYWZ0ZXIgbG9naW4sIGV2ZW4gd2hlbiBpbnN0cnVjdGVkIHRvIHJlZGlyZWN0CiAgICAgICAgdG8gYW5vdGhlciBwYWdlLiBUaGlzIGZpeCBhbHNvIHJlc3VsdGVkIGluIHRoZSByZW1vdmFsIG9mIGEgcmVkdW5kYW50CiAgICAgICAgV2lraUNvbnRleHQgY3JlYXRpb24gaW4gTG9naW5Gb3JtLiBUaGFua3MgdG8gVGVycnkgU3RlaWNoZW4gZm9yIGZpZ3VyaW5nCiAgICAgICAgb3V0IHdoZXJlIHRvIGxvb2suCgoyMDA2LTA5LTI0ICBBbmRyZXcgSmFxdWl0aCA8YW5kcmV3IEFUIGZyZXNoY29va2llcyBET1Qgb3JnPgoKICAgICAgICAqIDIuNC41OQoKICAgICAgICAqIFhNTEdyb3VwRGF0YWJhc2UgYW5kIFhNTFVzZXJEYXRhYmFzZSBub3cgcmVwcmVzZW50IGRhdGVzIHVzaW5nCiAgICAgICAgICBhIGxvY2FsZS1pbmRlcGVuZGVudCwgbWFjaGluZS1pbmRlcGVuZGVudCBmb3JtYXQuIFRvIHByZXNlcnZlIGJhY2t3YXJkcwogICAgICAgICAgY29tcGF0aWJpbGl0eSwgSlNQV2lraSB3aWxsIGF0dGVtcHQgdG8gcGFyc2UgZGF0ZXMgdXNpbmcgdGhlIHBsYXRmb3JtCiAgICAgICAgICBkZWZhdWx0IGZvcm1hdCBpZiBwYXJzaW5nIHdpdGggdGhlIHN0YW5kYXJkIGZvcm1hdCBmYWlscy4gTmV3IHJlY29yZHMKICAgICAgICAgIHdpbGwgYWx3YXlzIGJlIHNhdmVkIGluIHRoZSBzdGFuZGFyZCBmb3JtYXQuCgoyMDA2LTA5LTI0ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNC41OAoKICAgICAgICAqIFNvbWUgaW50ZXJuYWwgcmVzaHVmZmxpbmcgb2YgTWFuYWdlcnMuCgogICAgICAgICogUGx1Z2luTWFuYWdlciBhbmQgRWRpdG9yTWFuYWdlciBub3cgY2hlY2sgaWYgYSBtb2R1bGUgaXMKICAgICAgICBjb21wYXRpYmxlIHdpdGggSlNQV2lraS4gIFlvdSBjYW4gc3RhdGUgeW91ciBvd24gY29tcGF0aWJpbGl0eQogICAgICAgIGJ5IGRlY2xhcmluZyBpdCBpbiB0aGUganNwd2lraV9tb2R1bGUueG1sIGZpbGUsIGFzCiAgICAgICAgPG1pblZlcnNpb24+Mi40PC9taW5WZXJzaW9uPiwgYW5kL29yCiAgICAgICAgPG1heFZlcnNpb24+Mi42LjMyPC9tYXhWZXJzaW9uPi4KCiAgICAgICAgKiAyLjQuNTcKCiAgICAgICAgKiBBZGRlZCBjaGFuZ2Ugbm90ZXMgYWxzbyB0byBhdHRhY2htZW50cwoKICAgICAgICAqIEF0dGFjaG1lbnQgbmFtZXMgYXJlIG5vdyBhbHNvIGJlYXV0aWZpZWQgKHRob3VnaCBqdXN0IHRoZQogICAgICAgIHBhZ2UgbmFtZSBwYXJ0KS4gIFRoaXMgc2hvdWxkIGhlbHAgdGhlIHByb2JsZW0gd2hlbiBSZWNlbnRDaGFuZ2VzCiAgICAgICAgcGx1Z2luIG92ZXJmbG93cy4KCiAgICAgICAgKiBDbGVhbmVkIGF3YXkgYSBmZXcgY29tcGlsZXIgd2FybmluZ3MKCiAgICAgICAgKiBJbXByb3ZlZCBzb21lIFBsdWdpbk1hbmFnZXIgamF2YWRvY3MKCiAgICAgICAgKiBCYXNpY0F0dGFjaG1lbnRQcm92aWRlciBoYXMgbm93IG1vcmUgc2FuaXR5IGNoZWNrcyBhbmQgc2hvdWxkCiAgICAgICAgbm8gbW9yZSB0aHJvdyB3aWxkIE5QRXMgYXQgc3RhcnR1cC4KCiAgICAgICAgKiBGaXhlZAogICAgICAgIEJ1Z0x1Y2VuZVNlYXJjaFByb3ZpZGVyTm90UmVhZEpzcHdpa2kubHVjZW5lLmFuYWx5emVyRnJvbUNvbmZpZ3VyYXRpb24KICAgICAgICBUaGFua3MgdG8gRWtrYXNpdCBUYWtvdW5nc2FrZGFrdWwgZm9yIHBvaW50aW5nIHRoaXMgb25lIG91dCEKICAgICAgICAoQW5kIEkgYW0gdmVyeSBzb3JyeSBJIGRpZCBub3Qgbm90aWNlIHRoYXQgYnVnIHJlcG9ydCBlYXJsaWVyLikKCjIwMDYtMDktMjEgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi40LjU2CgogICAgICAgICogQWRkZWQgcGF0Y2ggZnJvbSBLYWxsZSBLaXZpbWFhIHRvIGZpcmUgdGhlIGV2ZW50IHdpdGggdGhlCiAgICAgICAgcHJvcGVyIHByaW5jaXBhbCBhdCBsb2dvdXQuICBUaGFua3MhCgoyMDA2LTA5LTE1ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNC41NQoKICAgICAgICAqIEFkZGVkIHBhdGNoIGZyb20gSm9zZXBoIFNjaG1pZ2VsIHRvIHJlY29nbml6ZSBJUAogICAgICAgIGFkZHJlc3NlcyBpbiBzb3J0YWJsZSB0YWJsZXMuICBUaGFua3MhCgogICAgICAgICogQWRkZWQgbmV3IGljb25zIGZyb20gTXVycmF5IEFsdGhlaW0gc28gdGhhdCB3ZSBjb3VsZAogICAgICAgIGdldCByaWQgb2YgYWxsIENyZWF0aXZlIENvbW1vbnMtbGljZW5zZWQgaWNvbnMuICBUaGlzIHdhcwogICAgICAgIGRvbmUgc28gdGhhdCBKU1BXaWtpIDIuNCBjb3VsZCBiZSBpbmNsdWRlZCBvbiBEZWJpYW4uICBUaGFua3MKICAgICAgICBoZWFwcyBmb3IgdGhlIGdvb2Qgd29yayEKCiAgICAgICAgKiBSZXZlcnRlZCB0byBwcmV2aW91cyBiZWhhdmlvdXIgd2l0aCByZXNwZWN0IHRvIFdpa2lXaXphcmQ6CiAgICAgICAgbm8gbG9uZ2VyIGNsb3NlcyBhcHBsZXQgYW5kIGRpdiB3aXRoIGphdmFzY3JpcHQsIHdoaWNoIHNob3VsZCBoZWxwCiAgICAgICAgaW4gSUUuCgoyMDA2LTA5LTEyICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNC41NAoKICAgICAgICAqIEFkZGVkIHBhdGNoIGZyb20gTXVycmF5IEFsdGhlaW0gdG8gZml4IFdpa2lFdmVudE1hbmFnZXIKICAgICAgICBqYXZhZG9jcywgYXMgd2VsbCBhcyBtYWRlIGl0IHJldHVybiBib29sZWFucyBvbiBhIGNvdXBsZQogICAgICAgIG9mIG1ldGhvZHMuICBUaGFua3MgTXVycmF5IQoKMjAwNi0wOS0xMCAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjQuNTMKCiAgICAgICAgKiBSZW1vdmVkIEZDSy5qc3AgZnJvbSB0aGUgZGlzdHJpYnV0aW9uIChzaW5jZSB3ZSBkb24ndCBkaXN0cmlidXRlCiAgICAgICAgRkNLLCBpdCdzIHNvcnQgb2Ygd2VpcmQgdG8gaGF2ZSBpdCB0aGVyZSBicmVha2luZyB0aGluZ3MpLgoKICAgICAgICAqIEJ1ZyBmaXg6IENvbW1lbnQuanNwIG5vdyBjYXRjaGVzIFJlZGlyZWN0RXhjZXB0aW9ucwoKICAgICAgICAqIEJ1ZyBmaXg6IEJ1Z1JlcG9ydEhhbmRsZXIgYWxzbyBjYXRjaGVzIFJlZGlyZWN0RXhjZXB0aW9ucyBhbmQKICAgICAgICBub3cgZ2l2ZXMgYSBwcm9wZXIgZXJyb3IgcmVwb3J0LgoKICAgICAgICAqIExpbWl0ZWQgY2hhbmdlIG5vdGUgbGVuZ3RoIHRvIDgwIGNoYXJhY3RlcnMuCgoyMDA2LTA5LTA5ICBBbmRyZXcgSmFxdWl0aCA8YW5kcmV3IEFUIGZyZXNoY29va2llcyBET1Qgb3JnPgoKICAgICAgICAqIDIuNC41MgoKICAgICAgICAqIFVzZXJNYW5hZ2VyIG5vdyBjaGVja3MgdG8gbWFrZSBzdXJlIHRoYXQgYSB1c2VyIGNhbid0CiAgICAgICAgc3BlY2lmeSBhcyBhIHdpa2kgbmFtZSBzb21lYm9keSBlbHNlcydzIGZ1bGwgbmFtZSBvciBsb2dpbgogICAgICAgIG5hbWUuIFRoaXMgY2hlY2sgaXMgcGVmb3JtZWQgZm9yIGFsbCBvdGhlciBjb21iaW5hdGlvbnMgb2YKICAgICAgICB0aGVzZSB0aHJlZSB1c2VyIHByb2ZpbGUgZmllbGRzIGFsc28uIFRoaXMgaXMgYSBwb3RlbnRpYWxseQogICAgICAgIHNlcmlvdXMgc2VjdXJpdHkgZmxhdywgc28gYWxsIHVzZXJzIHNob3VsZCB1cGdyYWRlLgoKMjAwNi0wOS0wOCAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjQuNTEKCiAgICAgICAgKiBBZGRlZCBwYXRjaCBmcm9tIE1hbHRlIEtpZXNlbCB0byBmaXggYSBwcm9ibGVtIHdoaWNoIGNhdXNlZAogICAgICAgIG92ZXJ3cml0aW5nIG9mIHVzZXIgcHJvZmlsZS4KCiAgICAgICAgKiBGaXhlZCBXaWtpSlNQRmlsdGVyIHdyaXRpbmcgdGhlIHdyb25nIGNvbnRlbnQgbGVuZ3RoIHRvIHRoZQogICAgICAgIHJlc3BvbnNlICh3ZSdyZSBza2lwcGluZyBzZXR0aW5nIHRoZSBsZW5ndGggZm9yIG5vdykuCgoyMDA2LTA5LTA3ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNC41MAoKICAgICAgICAqIFRlc3QgcmVsZWFzZSB0byBjaGVjayB3aGV0aGVyIHdlIGNhbiBzb2x2ZSBzb21lIFdlYkxvZ2ljCiAgICAgICAgaXNzdWVzLgoKICAgICAgICAqIFNwbGl0IFdpa2lTZXJ2bGV0RmlsdGVyIHRvIFdpa2lTZXJ2bGV0RmlsdGVyIGFuZCBXaWtpSlNQRmlsdGVyLgogICAgICAgIFRoZSBsYXR0ZXIgdGFrZXMgY2FyZSBvZiBKU1Agc3R1ZmYsIHRoZSBmb3JtZXIgb2YgYWxsIG90aGVyIHR5cGVzCiAgICAgICAgb2YgZGF0YS4gIFdpa2lKU1BGaWx0ZXIgdXNlcyBnZXRXcml0ZXIoKSBleHRlbnNpdmVseSwgd2hpbGUKICAgICAgICBXaWtpU2VydmxldEZpbHRlciBpcyBmb3IgdGhvc2UgaW5zdGFuY2VzIHRoYXQgdXNlCiAgICAgICAgZ2V0T3V0cHV0U3RyZWFtKCkuICBUaGFua3MgdG8gTWFyYyBQYXR0ZWV0IGZvciB0aGUgaGVscC4KCiAgICAgICAgKiBSZW5hbWluZyBub3cgYWxzbyByZW5hbWVzIGF0dGFjaG1lbnRzIChhc3N1bWluZyB0aGF0IHRoZQogICAgICAgIGF0dGFjaG1lbnRzIGV4aXN0IC0gaWYgdGhleSBkb24ndCwgdGhlbiB0aGVyZSdzIG5vIHdheSB0byBrbm93CiAgICAgICAgd2hpY2ggcGFnZXMgcmVmZXIgdG8gdGhlbSAoYmFyIGdvaW5nIHRocm91Z2ggYWxsIHBhZ2VzKS4KCiAgICAgICAgKiBDaGFuZ2VkIHdlYi54bWwgdG8gcmVmbGVjdCB0aGUgbmV3IGZpbHRlcnMuICBEb24ndCBmb3JnZXQKICAgICAgICB0byB1cGRhdGUhCgogICAgICAgICogQWRkZWQgInByaW50IiBzdHlsZSBmb3IganNwd2lraS5jc3MgaW4gY29tbW9uaGVhZGVyLmpzcC4gIFRoaXMKICAgICAgICBzaG91bGQgZml4IHByb2JsZW1zIHdpdGggcHJpbnRpbmcgbG9va2luZyBkaWZmZXJlbnQgZnJvbSBzY3JlZW4uCiAgICAgICAgUmVwb3J0ZWQgYnkgU3RldmUgTGlobiwgZml4IGZyb20gRGlyayBGcmVkZXJpY2t4CgogICAgICAgICogRml4ZWQgSW5mb0NvbnRlbnQuanNwIGZvciBXZWJMb2dpYy4gIEJ5IE1hcmMgUGF0dGVldC4KCjIwMDYtMDktMDYgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi40LjQ5CgogICAgICAgICogV2l0bmVzcyB0aGUgYXdlc29tZSBwMHczciBvZiB1bml0IHRlc3RpbmcuICBGaXhlZCB0aGUKICAgICAgICB1bml0IHRlc3RzIGFkZGVkIGluIHRoZSBtb3JuaW5nIHNvIHRoYXQgd2Ugbm93IGhvcGVmdWxseQogICAgICAgIGFyZSBmaXhpbmcgQnVnU3RyYW5nZVJlbmFtZUJlaGF2aW91ci4gIFJlcG9ydGVkIGJ5IENhbmRpZAogICAgICAgIERhdXRoLgoKICAgICAgICAqIEJ1ZyBmaXg6IFJlZmVyZW5jZU1hbmFnZXIgd2FzIG5vdCByZW1vdmluZyBhbGwgcmVmZXJlbmNlcwogICAgICAgIHRvIGEgcGFnZSBpZiBpdCB3YXMgcmVuYW1lZCwgcmVzdWx0aW5nIGluICJoYW5naW5nIiBwYWdlcy4KCiAgICAgICAgKiBBZGRlZCBhIGJ1bmNoIG9mIG5ldyB1bml0IHRlc3RzIHRvIGNoZWNrIGZvciBwYWdlCiAgICAgICAgcmVuYW1pbmcgcHJvYmxlbXMuICBBdCB0aGUgbW9tZW50IG1vc3Qgb2YgdGhlbSBmYWlsLCBzdWdnZXN0aW5nCiAgICAgICAgdGhhdCB0aGVyZSBpcyBzb21ldGhpbmcgd3JvbmcgaW4gUGFnZVJlbmFtZXIuLi4KCjIwMDYtMDktMDUgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi40LjQ4CgogICAgICAgICogQnVnIGZpeDogaXQgd2FzIHBvc3NpYmxlIHRvIGdhaW4gdXNlciBwcml2aWxlZ2VzIHNpbXBseQogICAgICAgIGJ5IGZha2luZyB0aGUgY29va2llLiAgVGhpcyBpcyBhIHNlcmlvdXMgcHJvYmxlbSBhbmQgYWxsCiAgICAgICAgcGVvcGxlIHJ1bm5pbmcgMi40LnggYXJlIHN1Z2dlc3RlZCB0byB1cGdyYWRlLiAgVGhhbmtzCiAgICAgICAgdG8gQW5kcmV3IGZvciB0aGUgZml4LgoKICAgICAgICAqIFNlY3VyaXR5VmVyaWZpZXIgbm8gbG9uZ2VyIGdldHMgY29uZnVzZWQsIGlmIHlvdSBzdGF0ZQogICAgICAgIGEgcHJvcGVydHkgdXNpbmcgIj09IiBpbnN0ZWFkIG9mICI9Ii4KCjIwMDYtMDktMDUgIENocmlzdG9waCBTYXVlciA8c2F1ZXJAaHMtaGVpbGJyb25uLmRlPgoKICAgICAgICAqIDIuNC40NwoKICAgICAgICAqIEFkZGVkIHRpdGxlIGFuZCBhY2Nlc3NrZXkgYXR0cmlidXRlIHRvCiAgICAgICAgICBMaW5rVGFnLCBFZGl0TGlua1RhZyBhbmQgUGFnZUluZm9UYWcuIFlvdSBjYW4gbm93IHNldAogICAgICAgICAgYWNjZXNza2V5cyB0byBlZGl0IHBhZ2VzIGluIHRoZSBQYWdlQWN0aW9ucy5qc3AKICAgICAgICAgIFVzZSB0aGUgdGl0bGUgYXR0cmlidXRlIHRvIGFkZCBhIHRvb2x0aXAgdGV4dCB0byBpbmRpY2F0ZQogICAgICAgICAgdGhlIHNwZWVka2V5IHlvdSB1c2VkLgoKMjAwNi0wOS0wNCAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjQuNDYKCiAgICAgICAgKiBCdWcgZml4OiBQYWdlTG9jayB3YXMgdXNpbmcgYWNxdWlzaXRpb24gdGltZSBmb3IgYm90aAogICAgICAgIGV4cGlyeSBhbmQgYWNxdWlzaXRpb24uICBGaXhlcyBCdWdMb2NrTm90V29ya2luZy4gIFJlcG9ydGVkCiAgICAgICAgYnkgVGVycnkgU3RlaWNoZW4uCgogICAgICAgICogQWRkZWQgV2lraUNvbnRleHQuaGFzQWRtaW5QZXJtaXNzaW9uKCkgYXMgYSBjb252ZW5pZW5jZQogICAgICAgIG1ldGhvZC4KCiAgICAgICAgKiBDaGFuZ2VkIFNwYW1GaWx0ZXIgdG8gY2hlY2sgZm9yIEFsbFBlcm1pc3Npb24gaW5zdGVhZCBvZgogICAgICAgIGEgZ3JvdXAgY2FsbGVkIEFkbWluIC0gdGhpcyBpcyBiZXR0ZXIgYmVjYXVzZSBvZiBpMThuLgoKICAgICAgICAqIFNwYW1GaWx0ZXIgbm93IGNoZWNrcyBhbHNvIHRoZSBjaGFuZ2Vub3RlIGJlZm9yZSBzYXZpbmcuCgogICAgICAgICogQWRkZWQgdGhlIHBvc3NpYmlsaXR5IHRvIGVzY2FwZSB9fX0gd2l0aGluIGEgcHJlZm9ybWF0dGVkCiAgICAgICAgc2VjdGlvbiBieSB1c2luZyB+fX19LiAgU3VnZ2VzdGVkIGJ5IHNldmVyYWwgcGVvcGxlIGF0CiAgICAgICAgV2lraUNyZW9sZS5vcmcuLi4KCjIwMDYtMDktMDQgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi40LjQ1CgogICAgICAgICogQnVnIGZpeDogV2hlbiBTcGFtRmlsdGVyIHJlamVjdGVkIHNvbWV0aGluZywgdGhlcmUgd291bGQKICAgICAgICBiZSBubyBtZXNzYWdlIHNob3duIGluIFJlamVjdGVkTWVzc2FnZS4gIFJlcG9ydGVkIGJ5CiAgICAgICAgVGVycnkgU3RlaWNoZW4uCgogICAgICAgICogUmVtb3ZlZCBwbGVudHkgb2YgZG9jdW1lbnRhdGlvbiBmcm9tIHRoZSBkZWZhdWx0IHdpa2lwYWdlcwogICAgICAgIHBhY2thZ2UuICBJdCB3YXMgb3V0IG9mIGRhdGUsIGFuZCBiZXR0ZXIgd3JpdHRlbiB1cCBhdAogICAgICAgIGRvYy5qc3B3aWtpLm9yZyBhbnl3YXkuCgogICAgICAgICogUmVtb3ZlZCBkb2MvVGVtcGxhdGVzLnR4dCwgd2hpY2ggd2FzIG5vIGxvbmdlciBhY2N1cmF0ZS4KCjIwMDYtMDktMDMgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi40LjQ0CgogICAgICAgICogQm90aCBYTUxVc2VyRGF0YWJhc2UgYW5kIFhNTEdyb3VwRGF0YWJhc2Ugd2lsbCBub3cgY2hlY2sKICAgICAgICBpZiB0aGUgZGF0YWJhc2UgaXMgdXAgdG8gZGF0ZS4gIFRoaXMgYWxsb3dzIHByb3BhZ2F0aW9uIG9mCiAgICAgICAgZGF0YWJhc2VzIGFjcm9zcyB3aWtpcyAodGhvdWdoIGl0J3MgcmF0aGVyIGZsYWt5OyB0aGVyZSBhcmUKICAgICAgICBjb25jdXJyZW5jeSBpc3N1ZXMpLgoKMjAwNi0wOS0wMyAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjQuNDMKCiAgICAgICAgKiBCdWcgZml4OiBJZiB0aGUgZnJvbnQgcGFnZSBkaWQgbm90IGV4aXN0LCB3b3VsZCBkaWUgd2l0aAogICAgICAgIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24sIHdoZW4gYWNjZXNzZWQgd2l0aCB0aGUgZGVmYXVsdCBVUkwKICAgICAgICAoZS5nLiAvV2lraS5qc3AsIG9yIC93aWtpLyB3aXRob3V0IHRoZSBwYWdlKS4KICAgICAgICBTaG91bGQgZml4IEJ1Z0JhZERlZmF1bHRDb25maWcuCgoyMDA2LTA5LTAyICBDaHJpc3RvcGggU2F1ZXIgPHNhdWVyQGhzLWhlaWxicm9ubi5kZT4KCiAgICAgICAgKiAyLjQuNDIKCiAgICAgICAgKiBGaXhlZCBCdWcgd2l0aCBXaWtpV2l6YXJkLmpzcCBhbmQgV2VibG9naWMgcmVwb3J0ZWQgYnkgTWFyYyBQYXR0ZWV0CgoyMDA2LTA5LTAyICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNC40MQoKICAgICAgICAqIExpbmtUYWcgc2hvdWxkIG5vIGxvbmdlciBjcmFzaCBpZiBXaWtpQ29udGV4dCBkb2VzIG5vdCBoYXZlCiAgICAgICAgYSBwYWdlIGF0dGFjaGVkLiAgUmVwb3J0ZWQgYnkgRmFiaWFubyBCb25pbi4KCjIwMDYtMDgtMzAgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi40LjQwCgogICAgICAgICogQ2hyaXN0b3BoIFNhdWVyIGpvaW5zIGluIGFzIGEgY29udHJpYnV0b3IgKGlmIG9ubHkgSSBnb3QKICAgICAgICBoaW0gdG8gdXBkYXRlIHRoZSBDaGFuZ2VMb2cuLi4gOykKCiAgICAgICAgKiBXaWtpV2l6YXJkIGlzIG5vdyBpbmNsdWRlZC4gIEhvb3JheSBmb3IgV0lLSVdZRyBlZGl0aW5nIQoKICAgICAgICAqIFNtYWxsIHR3ZWFrcyB0byB0aGUgRWRpdFRlbXBsYXRlLgoKICAgICAgICAqIENoYW5nZWQgImpzcHdpa2kuc2VjdXJpdHk9Y29udGFpbmVyIiB0byAianNwd2lraS5zZWN1cml0eT1vZmYiLgogICAgICAgIFRoaXMgc2hvdWxkIG1ha2UgaXQgbW9yZSBjbGVhciB0byBwZW9wbGUuICBUaGUgb2xkIHNldHRpbmcKICAgICAgICB3aWxsIGNvbnRpbnVlIHRvIHdvcmsuCgogICAgICAgICogQWRkZWQgcGFnZSBpbmZvIGxpbmtzIGJhY2sgdG8gYXR0YWNobWVudHMgaW4gUmVjZW50Q2hhbmdlcy4KICAgICAgICBVbmZvcnR1bmF0ZSBzaWRlIGVmZmVjdCBvZiB0aGUgbmV3IHJlbmRlcmVyLi4uCgoyMDA2LTA4LTMwICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNC4zOSAtIFRoZSAiUGlrbyIgcmVsZWFzZS4gIFJlc3QgaW4gUGVhY2UuCgogICAgICAgICogQWRkZWQgU2VhcmNoTWFuYWdlclRlc3QgdG8gbWFrZSBzdXJlIHRoYXQgb3VyIHNlYXJjaCB3b3Jrcy4KCiAgICAgICAgKiBCdWcgZml4OiBMdWNlbmVTZWFyY2hQcm92aWRlciB3YXMgbm90IGluZGV4aW5nIHRoZSBXaWtpTmFtZQogICAgICAgIG9mIHRoZSBwYWdlLgoKICAgICAgICAqIEJ1ZyBmaXg6IFNlYXJjaE1hbmFnZXIgbm93IGFsd2F5cyBpbmRleGVzIHRoZSBsYXRlc3QgdmVyc2lvbgogICAgICAgIG9mIHRoZSBwYWdlICh0aGFua3MgaGVhcHMgdG8gSm9obiBWb2xrYXIgZm9yIGZpbmRpbmcgdGhpcykuCgogICAgICAgICogRGlzYWJsZWQgQ29udGV4dHVhbERpZmZQcm92aWRlclRlc3QudGVzdEtub3duUHJvYmxlbUNhc2VzKCksCiAgICAgICAgSSBoYXZlIG5vIGlkZWEgaG93IHRvIGZpeCB0aG9zZSwgYW5kIGl0IHdhcyBuZXZlciBydW5uaW5nIGFueXdheS4KCiAgICAgICAgKiBEaXNhYmxlZCBKU1BXaWtpTWFya3VwUGFyc2VyVGVzdC50ZXN0U3BhbkphdmFzY3JpcHQyKCkgLQogICAgICAgIGl0IHdvdWxkIG5lZWQgYSBsb3QgbW9yZSBjYXJlIHRvIG1ha2UgaXQgcmVhbGx5IHJ1bi4KCiAgICAgICAgKiBGaXhlZCBmYWlsaW5nIFhNTFJQQyB0ZXN0cy4KCiAgICAgICAgKiBVcGdyYWRlZCB0byBMdWNlbmUgMi4wLjAuCgoyMDA2LTA4LTI3ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNC4zOAoKICAgICAgICAqIFdpa2lFdmVudHMgYXJlIG5vdyBmaXJlZCBhdCBhbG1vc3QgYW55IG9jY2FzaW9uIHRoYXQgc2VlbXMgc3VpdGFibGUuCiAgICAgICAgVGhhbmtzIHRvIE11cnJheSBBbHRoZWltIGZvciB0aGlzIG1lZ2EtcGF0Y2guICBTb21lIG9mIHRoZSBldmVudAogICAgICAgIGNsYXNzZXMgd2VyZSBhbHNvIHJlb3JnYW5pemVkICh0aGFua3MgdG8gQW5kcmV3IGFuZCBNdXJyYXkpLgoKICAgICAgICAqIFNwYW1GaWx0ZXIgbm8gbG9uZ2VyIGNvdW50cyBhZG1pbnMgYXMgZXZpbCwgaWYgdGhleSBtYWtlIG1hbnkKICAgICAgICBjaGFuZ2VzL21pbnV0ZS4KCiAgICAgICAgKiBXaWtpU2VydmxldEZpbHRlciBmYWlscyBub3cgZ3JhY2VmdWxseSBpZiBXaWtpRW5naW5lIGluc3RhdGlhdGlvbgogICAgICAgIGZhaWxzIC0gc2hvdWxkIG5vIGxvbmdlciBlbWl0IGR1bWIgTnVsbFBvaW50ZXJFeGNlcHRpb25zLgoKICAgICAgICAqIEZpbmRDb250ZW50LmpzcCBub3cgaG9wZWZ1bGx5IGNhbGN1bGF0ZXMgcHJldmlvdXMtIGFuZCBuZXh0CiAgICAgICAgc2VhcmNoIHNpemVzIGNvcnJlY3RseS4KCiAgICAgICAgKiBDaGFuZ2UgTm90ZXMgYXJlIG5vdyB2aXNpYmxlIGluIHBhZ2UgaGlzdG9yeSBhcyB3ZWxsLiAgVW5mb3J0dW5hdGVseSwKICAgICAgICB0aGUgdmlzdWFscyBzdWNrLiAgQW55b25lIHdhbnQgdG8gaGVscCB0byBtYWtlIHRoZW0gbG9vayBiZXR0ZXI/ICBKdXN0CiAgICAgICAgZG9uJ3QgbWFrZSB0aGVtIHRvbyB3aWRlLi4uCgogICAgICAgICogQ2hhbmdlIE5vdGVzIGFyZSBub3cgbGltaXRlZCB0byA2MCBjaGFyYWN0ZXJzICh0b3RhbGx5IGFyYml0cmFyeSkuCgoyMDA2LTA4LTIxICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNC4zNwoKICAgICAgICAqIEZhY2VkIHdpdGggcGh5c2ljYWwgdGhyZWF0cyBhdCBXaWtpU3ltLCBJIGFkZGVkIHRoZSAiY2hhbmdlIG5vdGUiCiAgICAgICAgZmVhdHVyZS4gIEhvcGUgeSdhbGwgYXJlIGhhcHB5IG5vdyA6LUQgIChXZWxsLCBva2F5LCBpdCBkb2VzIG5vdAogICAgICAgIHdvcmsgaW4gdGhlIHBhZ2UgaW5mbyB5ZXQ7IEknbSB0aGlua2luZyB3aGF0IHdvdWxkIGJlIGEgZ29vZAogICAgICAgIHByZXNlbnRhdGlvbiBzbyB0aGF0IHRoZSBwYWdlIGRvZXMgbm90IGdldCBvdmVybHkgd2lkZSkuCgogICAgICAgICogQnVnIGZpeDoganNwd2lraS50bGQgaGFkIHRoZSB3cm9uZyBhdHRyaWJ1dGUgZm9yIFJlcXVlc3RSZXNvdXJjZVRhZy4KICAgICAgICBSZXBvcnRlZCBieSBNYXJjID8uCgoyMDA2LTA4LTE0ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNC4zNgoKICAgICAgICAqIEJ1ZyBmaXg6IFVzZXJQcm9maWxlVGFnIHdhcyBub3QgcHJpbnRpbmcgZ3JvdXBzLiAgUmVwb3J0ZWQgYnkKICAgICAgICBEaXJrIEZyZWRlcmljeC4KCjIwMDYtMDgtMTMgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi40LjM1CgogICAgICAgICogRml4ZWQgQnVnUHJlZm9ybWF0dGVkVGV4dFdpdGhIdG1sRG9lc25UV29ya0lmQWxsb3dIVE1MVHJ1ZS4gVGhhbmtzIHRvCiAgICAgICAgUmVhbEdhZ25vbiBhbmQgYW4gdW5rbm93biBzdWJtaXR0ZXIuCgogICAgICAgICogRml4ZWQgQnVnU3R5bGVEb3VibGVQZXJjZW50UHJvYmxlbS4gIFRoZXJlIGFyZSB0d28gbmV3IHRva2VuczoKICAgICAgICAvJSBjYW4gYWxzbyBiZSB1c2VkIHRvIHN0b3AgYSBzdHlsZSwgYW5kIH48c3BhY2U+IGlzIGEgbm9uLXJlbmRlcmluZwogICAgICAgIHNwYWNlLgoKICAgICAgICAqIEZpeGVkIEJ1Z051bGxQb2ludGVyRXhjZXB0aW9uV2hlbkluc2VydGluZ0ltYWdlc1dpdGhvdXRBbGlnbkF0dHJpYnV0ZS4KICAgICAgICBUaGFua3MgdG8gQ2FuZGlkIERhdXRoIGZvciBwb2ludGluZyBpdCBvdXQuCgogICAgICAgICogQWRkZWQgcGF0Y2ggZnJvbSBMYXVyZW50IENvdXJ0aW4gdG8gZml4CiAgICAgICAgQnVnVGFibGVPZkNvbnRlbnRzRG9lc25UV29ya1dpdGhQYWdlTm90SW5Bc2NpaS4gIFRoYW5rcyEKCjIwMDYtMDgtMTIgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi40LjM0CgogICAgICAgICogSW1wbGVtZW50ZWQgUmVxdWVzdFJlc291cmNlVGFnIChvb3BzLCBpdCBoYWQgYmVlbiBza2lwcGVkIGZvcgogICAgICAgIHNvbWUgcmVhc29uKS4KCjIwMDYtMDgtMDkgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi40LjMzCgogICAgICAgICogUmVjZW50Q2hhbmdlc1BsdWdpbiB3YXMgbWlzc2luZyBhIHF1b3RlIGluIHRoZSBnZW5lcmF0aW9uCiAgICAgICAgb2YgYXV0aG9yIG5hbWVzLgoKMjAwNi0wOC0wOCAgQW5kcmV3IEphcXVpdGggPGFuZHJldyBBVCBmcmVzaGNvb2tpZXMgRE9UIG9yZz4KCiAgICAgICAgKiAyLjQuMzIKCiAgICAgICAgKiBGaXhlZCBhbiBhc3RvdW5kaW5nbHkgYnJhaW4tZGFtYWdlZCBidWcgaW4gV2lraUNvbnRleHQgdGhhdCBjYXVzZWQKICAgICAgICBhbGwgd2lraSBjb250ZXh0cyB0byB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGUgaW4gYWxsIGNhc2VzLCByZWdhcmRsZXNzCiAgICAgICAgb2YgdGhlIHNldHRpbmcgaW4ganNwd2lraS5wcm9wZXJ0aWVzLiBUaGlzIGJ1ZyB3YXMgaW50cm9kdWNlZCBieSB0aGUKICAgICAgICAyLjQuMjUgc2VjdXJpdHkgbWVnYS1wYXRjaC4gVGhlIGZpeCwgb2YgY291cnNlLCB3YXMgdGhyZWUgbGluZXMKICAgICAgICBvZiBjb2RlLiBOb3cgdGhhdCBpdCdzIGluLCBJJ2QgbGlrZSB0byBwdXQgZG93biBteSBjcmFjayBwaXBlCiAgICAgICAgbG9uZyBlbm91Z2ggdG8gdGhhbmsgVGVycnkgU3RlaWNoZW4gZm9yIHNwb3R0aW5nIHRoaXMuCgoyMDA2LTA4LTAxICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNC4zMQoKICAgICAgICAqIEJ1ZyBmaXg6IEJ1Z0FyYml0cmFyeUhUTUxNYXJrdXBJbkhlYWRpbmdJc1JlbmRlcmVkQnlUYWJsZU9mQ29udGVudFBsdWdpbiwKICAgICAgICByZXBvcnRlZCBieSBKZXJvbWUgRHVwcmV6LgoKICAgICAgICAqIEJ1ZyBmaXg6IEJ1Z0NlbnRlcmluZ0ltYWdlc1VzaW5nSW1hZ2VQbHVnaW5Eb2VzTm90V29ya0luRmlyZWZveCwKICAgICAgICBjb250cmlidXRlZCBieSBBbGV4IFJlaWQuCgogICAgICAgICogQnVnIGZpeDogQnVnQ2FuS2VlcFByZXNzaW5nTmV4dDIwUmVzdWx0c09uUmVzdWx0U2VhcmNoUGFnZS4gIFJld3JvdGUKICAgICAgICB0aGUgc2NyaXB0bGV0cyBpbiBGaW5kQ29udGVudC5qc3AgdG8gcHJvdmlkZSBhIGJldHRlciBleHBlcmllbmNlCiAgICAgICAgb3ZlcmFsbC4KCiAgICAgICAgKiBCdWcgZml4OiBCdWdSZWZlcnJpbmdQYWdlc1BsdWdpbkRvbnRXcml0ZU5vYm9ieUFmdGVyRmlsdGVyaW5nLgogICAgICAgIFJlcG9ydGVkIGJ5IEZyYW7Dp29pcyBCdXJ0aW4uCgogICAgICAgICogUmVtb3ZlZCBhIGJ1bmNoIG9mIGNvbXBpbGVyIHdhcm5pbmdzIGZvdW5kIHRoYW5rcyB0byB1cGdyYWRlIHRvCiAgICAgICAgRWNsaXBzZSAzLjIuCgoyMDA2LTA4LTA0ICBBbmRyZXcgSmFxdWl0aCA8YW5kcmV3IEFUIGZyZXNoY29va2llcyBET1Qgb3JnPgoKICAgICAgICAqIDIuNC4zMAoKICAgICAgICAqIEZpeGVkIGNvc21ldGljIGJ1ZyB0aGF0IHdhcyBjYXVzaW5nIGFsbCBzZWFyY2ggcmVzdWx0cyB0bwogICAgICAgICAgYXBwZWFyIHdpdGggdGhlIG5hbWUgIlNlYXJjaCIuCgoyMDA2LTA4LTAxICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNC4yOQoKICAgICAgICAqIENoYXJhY3RlciBlbmNvZGluZyBpcyBub3cgc2V0IGluIHRoZSBzZXJ2bGV0IGZpbHRlciwgbm90CiAgICAgICAgV2lraUVuZ2luZS5jcmVhdGVDb250ZXh0KCkgYW55bW9yZS4gIFRoaXMgc2hvdWxkIHJlbW92ZSBjZXJ0YWluCiAgICAgICAgY2FzZXMgd2hlcmUgY2hhcmFjdGVyIGVuY29kaW5nIGdvdCBsb3N0LgoKICAgICAgICAqIDIuNC4yOAoKICAgICAgICAqIEZpeGVkIGEgSFVHRSBudW1iZXIgb2YgcG90ZW50aWFsIHByb2JsZW1zLCBmb3VuZCB1c2luZyBGaW5kQnVncy4KICAgICAgICBQcm9ibGVtcyBpbmNsdWRlZCBzdWNoIGFzOgoKICAgICAgICAqIE5vdyBtYW55IENvbXBhcmF0b3JzIGFyZSBhbHNvIFNlcmlhbGl6YWJsZQoKICAgICAgICAqIGhhc2hDb2RlKCkgaXMgbm93IGltcGxlbWVudGVkIHByb3Blcmx5IG9uIG9iamVjdHMgdGhhdCBkbwogICAgICAgIGVxdWFscygpCgogICAgICAgICogY2xvbmUoKSBpcyByZXdyaXR0ZW4gdG8gdXNlIHN1cGVyLmNsb25lKCkKCiAgICAgICAgKiBNYW55IGlubmVyIGNsYXNzZXMgd2VyZSBtYWRlIHN0YXRpYyB0byBzYXZlIGV4dHJhIGVmZm9ydAoKICAgICAgICAqIEZvcm1zIHBhY2thZ2UgY2xhc3NlcyBoYWQgcmVhbGx5IGR1YmlvdXMgbnVsbCBjaGVja3Mgd2hpY2gKICAgICAgICB3ZXJlIHJld3JpdHRlbi4KCiAgICAgICAgKiBUcmFuc2xhdG9yUmVhZGVyIGlzIG5vIGxvbmdlciB1c2VkIGluIHRoZSBjb2RlIGFueXdoZXJlLiAgRXZlbgogICAgICAgIHRoZSBUcmFuc2xhdG9yUmVhZGVyVGVzdCBpcyBnb25lLiAgVGhlIGNsYXNzLCBob3dldmVyLCByZW1haW5zLAogICAgICAgIHVudGlsIHdlIGNhbiByZWZhY3RvciBpdCB0byBiZSBhIGZhY2FkZSBmb3IgSlNQV2lraU1hcmt1cFBhcnNlci4KCiAgICAgICAgKiBDb2Rpbmcgc3R5bGUgaXMgbm93IGEgbG9jYWwgc2V0dGluZyBpbnN0ZWFkIG9mIGEgZ2xvYmFsCiAgICAgICAgc2V0dGluZy4uLgoKICAgICAgICAqIEFuZCBhIGxvdCBvZiBzbWFsbCBiaXRzIGFuZCBwaWVjZXMuLi4KCjIwMDYtMDctMzEgIEFuZHJldyBKYXF1aXRoIDxhbmRyZXcgQVQgZnJlc2hjb29raWVzIERPVCBvcmc+CgogICAgICAgICogMi40LjI3CgogICAgICAgICogQnVnIGZpeDogU2VjdXJpdHlDb25maWcgd2FzIGVycm9uZW91c2x5IHJlcG9ydGluZyB0aGF0IGV4dGVybmFsbHkgc2V0CiAgICAgICAgICB2YWx1ZXMgZm9yIGphdmEuc2VjdXJpdHkucG9saWN5IGRpZCBub3QgcmVzb2x2ZSB0byBleGlzdGluZyBmaWxlcywKICAgICAgICAgIGV2ZW4gd2hlbiB0aGV5IGRpZC4KCiAgICAgICAgKiBCdWcgZml4OiBTZWN1cml0eUNvbmZpZyB3YXMgZXJyb25lb3VzbHkgcmVwb3J0aW5nIHRoYXQgd2lraSBncm91cHMKICAgICAgICAgIGNvdWxkIG5vdCBiZSBkZWxldGVkLCBldmVuIHdoZW4gdGhpcyBmdW5jdGlvbiBhY3R1YWxseSB3b3JrZWQKICAgICAgICAgIHByb3Blcmx5LgoKMjAwNi0wNy0zMCAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjQuMjYKCiAgICAgICAgKiBGaXhlZCBlZGl0b3IgdGV4dGFyZWEgd2lkdGgsIHRoYW5rcyB0byBHb3Jkb24gU21pdGguCgoyMDA2LTA3LTI5ICBBbmRyZXcgSmFxdWl0aCA8YW5kcmV3IEFUIGZyZXNoY29va2llcyBET1Qgb3JnPgoKICAgICAgICAqIDIuNC4yNSAtIGEuay5hLiB0aGUgQUFBIG1lZ2EtcGF0Y2gKCiAgICAgICAgKiBUaGlzIHJlbGVhc2UgY29tcGxldGVseSBjaGFuZ2VzIHRoZSB3YXkgSlNQV2lraSBtYW5hZ2VzIHdpa2kgZ3JvdXBzLgogICAgICAgICAgVGhleSBhcmUgbm8gbG9uZ2VyIHN0b3JlZCBpbiBwYWdlczsgaW5zdGVhZCwgR3JvdXBNYW5hZ2VyIGNvbnRyb2xzCiAgICAgICAgICBhY2Nlc3MsIHdoaWxlIGJhY2stZW5kIHN0b3JhZ2UgaXMgcHJvdmlkZWQgYnkgdGhlIEdyb3VwRGF0YWJhc2UgaW50ZXJmYWNlLgogICAgICAgICAgVGhpcyBjaGFuZ2UgaGFzIGNhdXNlZCBtYW55IG90aGVyIGNoYW5nZXMuIE1vcmUgZGV0YWlsczoKCiAgICAgICAgICAqIEdyb3VwTWFuYWdlciBjaGFuZ2VzIGZyb20gYW4gaW50ZXJmYWNlIHRvIGEgY29uY3JldGUsIGZpbmFsIGNsYXNzLiBHcm91cCBzdG9yYWdlCiAgICAgICAgICAgIGlzIG5vdyBoYW5kbGVkIGJ5IGEgc2VwYXJhdGUgR3JvdXBEYXRhYmFzZSBpbnRlcmZhY2UuIFRoZSBkZWZhdWx0IGltcGxtZW50YXRpb24gaXMKICAgICAgICAgICAgWE1MR3JvdXBEYXRhYmFzZS4gSW4gYWRkaXRpb24sIEdyb3VwIGJlY29tZXMgYSBjb25jcmV0ZSBmaW5hbCBjbGFzczsgRGVmYXVsdEdyb3VwCiAgICAgICAgICAgIGFuZCBEZWZhdWx0R3JvdXBNYW5hZ2VyIGRpc2FwcGVhci4gR3JvdXAgZ2V0cyBhIG5ldyBtZXRob2QgZ3JvdXBQcmluY2lwYWwoKSB0aGF0IHJldHVybnMKICAgICAgICAgICAgdGhlIGVxdWl2YWxlbnQgR3JvdXBQcmluY2lwYWwuIE1hbnkgbmV3IHVuaXQgdGVzdHMgY3JlYXRlZCBmb3IgYWxsIG9mIHRoZXNlIGNoYW5nZXMuCgogICAgICAgICAgKiBHcm91cCBjcmVhdGlvbiBoYW5kbGVkIGluIFVJIGJ5IE5ld0dyb3VwLmpzcC4gRWRpdGluZyBpcyB2aWEgRWRpdEdyb3VwLmpzcC4KCiAgICAgICAgICAqIFVzZXJQcm9maWxlVGFnIGdhaW5zIGEgcHJvcGVydHkgImdyb3VwcyIgdGhhdCB3aWxsIHByaW50IHRoZSBsaXN0IG9mIHdpa2kgZ3JvdXBzCiAgICAgICAgICAgIHRoZSBjdXJyZW50IHVzZXIgYmVsb25ncyB0by4gVGhlICJyb2xlcyIgcHJvcGVydHkgbm93IGp1c3QgcHJpbnRzIHRoZSByb2xlcy4KCiAgICAgICAgICAqIERlZmF1bHQgc2VjdXJpdHkgcG9saWN5IChqc3B3aWtpLnBvbGljeSkgZ2FpbnMgZ3JhbnQgZW50cmllcyBmb3IgZ3JvdXAKICAgICAgICAgICAgdmlld2luZywgZWRpdGluZywgZGVsZXRpb24gcGVybWlzc2lvbnMuIEJ5IGRlZmF1bHQsIHVzZXJzIG11c3QgYmUgYXQgbGVhc3QKICAgICAgICAgICAgImFzc2VydGVkIiB0byB2aWV3IGdyb3VwIG1lbWJlcnMsIGFuZCBtdXN0IGJlIGEgbWVtYmVyIG9mIGEgZ3JvdXAgdG8gZWRpdAogICAgICAgICAgICB0aGUgbWVtYmVyc2hpcC4KCiAgICAgICAgICAqIFBlcm1pc3Npb25UYWcgZ2FpbnMgdGhyZWUgbmV3IHBlcm1pc3Npb24gY2hlY2tzOiAidmlld0dyb3VwIiwgImVkaXRHcm91cCIsICJkZWxldGVHcm91cCIuCgogICAgICAgICAgKiBHcm91cCBwcmluY2lwYWwgaW5qZWN0aW9uIHJlc3BvbnNpYmlsaXRpZXMgbW92ZXMgdG8gV2lraVNlc3Npb24gZnJvbSBBdXRoZW50aWNhdGlvbk1hbmFnZXIuCgogICAgICAgICAgKiBUaGUgaGFyZC1jb2RlZCByZXN0cmljdGlvbiBvbiBwYWdlcyBwcmVmaXhlZCAiR3JvdXAiIGhhcyBiZWVuIGxpZnRlZC4KCiAgICAgICAgICAqIFNlY3VyaXR5VmVyaWZpZXIgYWRkcyB0ZXN0cyBmb3IgR3JvdXBQZXJtaXNzaW9uLiBCZXR0ZXIgc3VwcG9ydCBmb3IgZGV0ZWN0aW5nCiAgICAgICAgICAgIGV4Y2VwdGlvbnMuIEFkZHMgdGVzdHMgZm9yIGFkZGluZy9kZWxldGluZyBHcm91cHMuCgogICAgICAgICAgKiBOZXcgR3JvdXBzIHBsdWdpbiBwcmludHMgYSBzb3J0ZWQgbGlzdCBvZiB0aGUgd2lraSBncm91cHMgaW4gdGhlIGdyb3VwIGRhdGFiYXNlOwogICAgICAgICAgICBnZW5lcmF0ZXMgYSBoeXBlcmxpbmsgdG8gZWFjaCBncm91cCBwYWdlLgoKICAgICAgICAqIEpTUFdpa2lJbnN0YWxsZXIgKEluc3RhbGwuanNwKSByZWNlaXZlcyBhIG1ha2VvdmVyIGFuZCBzdWJzdGFudGlhbCBlbmhhbmNlbWVudHMgdG8KICAgICAgICAgIHN1cHBvcnQgdGhlIG5ldyBncm91cCBzY2hlbWUuIFdoZW4gdGhlIHdpa2kgaXMgc2V0IHVwLCB3ZSBub3cgY3JlYXRlIGFuIGFkbWluaXN0cmF0aXZlCiAgICAgICAgICB1c2VyIGFuZCBhbiBBZG1pbiBncm91cC4gSXQgYWxzbyB1c2VzIHRoZSBkZWZhdWx0IENTUy4KCiAgICAgICAgKiBUaGUgbmV3IENvbW1hbmQgY2xhc3MgaXMgbm93IGZ1bGx5IGludGVncmF0ZWQgaW50byBXaWtpRW5naW5lLmNyZWF0ZUNvbnRleHQoKQogICAgICAgICAgYW5kIHRoZSBXaWtpQ29udGV4dCBjb25zdHJ1Y3RvcnMuIFByYWN0aWNhbGx5IHNwZWFraW5nLCB0aGlzIG1lYW5zIHRoYXQgdGhlCiAgICAgICAgICBwYWdlIG5hbWVzIGFuZCByZWRpcmVjdCBlcnJvcnMgc2hvd24gb24gcGFnZXMgd2lsbCBhY3R1YWxseSBzaG93IHNvbWV0aGluZyB1c2VmdWwKICAgICAgICAgIHdoZW4gbm9uLXBhZ2VzIGFyZSBhY2Nlc3NlZCAoZS5nLiwgYWNjZXNzIGRlbmllZCBmb3IgVXNlclByZWZlcmVuY2VzLmpzcCB3b24ndAogICAgICAgICAgcHJpbnQgdGhlIG5vbi1zZW5zaWNhbCAieW91IGRvbid0IGhhdmUgYWNjZXNzIHRvICdNYWluJykuIFdpa2lFbmdpbmUgZGVsZWdhdGVzCiAgICAgICAgICBwYWdlLXJlc29sdXRpb24gcmVzcG9uc2liaWxpdGllcyB0byBDb21tYW5kUmVzb2x2ZXIuIE1pbm9yIGNoYW5nZXMgdG8gbmV3CiAgICAgICAgICBDb21tYW5kL0NvbW1hbmRSZXNvbHZlciBjbGFzc2VzIHRvIG1ha2UgSlNQIHBhZ2UgbmFtZXMgImZyaWVuZGxpZXIiLgoKICAgICAgICAqIFdpa2lTZXNzaW9uLmdldFVzZXJQcmluY2lwYWwgbm93IGRlZmF1bHRzIHRvIHRoZSB3aWtpIHByaW5jaXBhbCwgcmF0aGVyIHRoYW4KICAgICAgICAgIHRoZSBmdWxsIG5hbWUuIFRoaXMgbWVhbnMgdGhhdCBmYXZvcml0ZXMgYXV0by1saW5raW5nIHdvbid0IGJyZWFrLiBJdCBhbHNvIGdhaW5zCiAgICAgICAgICBhIG1ldGhvZCBnZXRSb2xlcygpIHRoYXQgcmV0dXJucyB0aGUgcm9sZXMgYW5kIGdyb3VwcyB0aGUgdXNlciBwb3NzZXNzZXMuCiAgICAgICAgICBUaGUgbWV0aG9kIGRvUHJpdmlsZWdlZChXaWtpU2Vzc2lvbixQcml2aWxlZ2VkQWN0aW9uKSBhbGxvd3MgYWN0aW9ucyB0byBiZQogICAgICAgICAgZXhlY3V0ZWQgdXNpbmcgdGhlIHVzZXIncyBwcml2aWxlZ2VzLiBXaWtpU2Vzc2lvbidzIGdldFN1YmplY3QoKSBtZXRob2QgaGFzIGJlZW4KICAgICAgICAgIHJlbW92ZWQ7IGl0IHdhcyBhIHNlY3VyaXR5IHJpc2suCgogICAgICAgICogU3Vic3RhbnRpYWwgY2hhbmdlcyB0byB0aGUgQUFBIHBhY2thZ2UgdGVzdHMuIFdlYiB1bml0IHRlc3RzIGNoYW5nZWQgdG8gYWNjb21vZGF0ZSBncm91cHMuCgogICAgICAgICogTWlub3IgcmVmYWN0b3Jpbmc6IEFsbFBlcm1pc3Npb24sIFdpa2lQZXJtaXNzaW9uLCBQYWdlUGVybWlzc2lvbi4gQWxsUGVybWlzc2lvbkNvbGxlY3Rpb24uCgogICAgICAgICogQnVnIGZpeDogY2xvc2VkIDxzcGFuPiB0YWcgaW4gSW5zZXJ0UGFnZVBsdWdpbgoKICAgICAgICAqIFdpa2lDb250ZXh0LmdldE5hbWUoKSBwcm92aWRlcyBhICJzYWZlciIgc2hvcnRjdXQgdGhhbiBjYWxsaW5nIFdpa2lDb250ZXh0LmdldFBhZ2UoKS5nZXROYW1lKCkKICAgICAgICAgIGJlY2F1c2Ugbm90IGFsbCB3aWtpIGNvbnRleHRzIGFwcGx5IHRvIHBhZ2VzLiBUaGlzIGNoYW5nZSB3YXMgbWFkZSB0bzogVGFibGVPZkNvbnRlbnRzIHBsdWdpbjsKICAgICAgICAgIG1vc3Qgb2YgdGhlIHRvcC1sZXZlbCBKU1BzOyBUcmFuc2xhdG9yUmVhZGVyOyBQYWdlTmFtZVRhZy4KCiAgICAgICAgKiBDb250YWluZXIgcm9sZSBwcmluY2lwYWxzIGFyZSBub3cgaW5qZWN0ZWQgYXQgbG9naW4gdGltZSBieSBXZWJDb250YWluZXJMb2dpbk1vZHVsZSwKICAgICAgICAgIHJhdGhlciB0aGFuIHRoZSBBdXRoZW50aWNhdGlvbk1hbmFnZXIuCgogICAgICAgICogTW9yZSB1c2Ugb2YgY2hlY2tlZCBleGNlcHRpb25zLiBBdXRob3JpemVyLmluaXRpYWxpemUoKSB0aHJvd3MgV2lraVNlY3VyaXR5RXhjZXB0aW9uCgogICAgICAgICogV2lraVNlY3VyaXR5RXZlbnQgZ2FpbnMgdGhlIGV2ZW50IHR5cGUgUFJPRklMRV9TQVZFRCwgZW1pdHRlZCBieSBVc2VyRGF0YWJhc2UuIE1vc3QKICAgICAgICAgIG9mIHRoZSBzZWN1cml0eSBldmVudHMgYXJlIG5vdyBtYXJrZWQgYXMgImRlYnVnIiBsZXZlbCBldmVudHMsIHdoaWNoIG1lYW5zIHRoZSBsb2dzCiAgICAgICAgICB3aWxsIGJlIG11Y2ggbGVzcyBjaGF0dHkgKHRoaXMgaXMgYSB0ZW1wb3JhcnkgaGFjaykuCgogICAgICAgICogQXV0aG9yaXphdGlvbk1hbmFnZXIgZ2FpbnMgYSBuZXcgcHVibGljIG1ldGhvZDogZ2V0QXV0aG9yaXplcigpCgogICAgICAgICogVGhlIFdpa2lFdmVudFNvdXJjZSAibWFya2VyIGludGVyZmFjZSIgIGFkZGVkIHRvIGNsYXNzIGRlY2xhcmF0aW9ucyBmb3IgQXV0aG9yaXphdGlvbk1hbmFnZXIKICAgICAgICAgIEF1dGhlbnRpY2F0aW9uTWFuYWdlciwgV2lraUVuZ2luZS4gRXZlbnRTb3VyY2VEZWxlZ2F0ZSB1c2VkIGluIHBsYWNlIG9mIGN1dC1hbmQtcGFzdGUgY29kZQogICAgICAgICAgZm9yIHRoZXNlIGNsYXNzZXMgYWxzby4KCiAgICAgICAgKiBUZXh0VXRpbC5wYXNzd29yZCBnZW5lcmF0b3Igbm93IHVzZXMgU2VjdXJlUmFuZG9tIGluc3RlYWQgb2YgUmFuZG9tLgoKMjAwNi0wNy0yNCAgQW5kcmV3IEphcXVpdGggPGFuZHJldyBBVCBmcmVzaGNvb2tpZXMgRE9UIG9yZz4KCiAgICAgICAgKiAyLjQuMjMKCiAgICAgICAgKiBBbmR5IEouIGZpeGVzIHdoYXQgaGUgYnJva2UuLi4gbmFtZWx5IHRoZSBidWlsZC4gVGhhbmtzCiAgICAgICAgICB0byBNYXJrIFJhd2xpbmcgZm9yIHBvaW50aW5nIGl0IG91dC4KCiAgICAgICAgKiBTZXNzaW9uTW9uaXRvciBhY2hpZXZlcyBlc2NhcGUgdmVsb2NpdHkgYW5kIGJlY29tZXMgaXRzIG93biBjbGFzcywKICAgICAgICAgIGJyZWFraW5nIGZyZWUgb2YgV2lraVNlc3Npb24ncyBncmF2aXR5LgoKICAgICAgICAqIFdpa2lTZXNzaW9uLmd1ZXN0U2Vzc2lvbigpIGNoYW5nZXMgdG8gZ3Vlc3RTZXNzaW9uKFdpa2lFbmdpbmUpLgogICAgICAgICAgVGhpcyByZXF1aXJlZCBzbWFsbCB0d2Vha3MgdG8gYSBmZXcgY2xhc3Nlcywgbm90YWJseSB0aGUgUlBDIGhhbmRsZXJzCiAgICAgICAgICBhbmQgcGFydHMgb2YgdGhlIEF1dGggY29kZS4KCiAgICAgICAgKiBWYXJpb3VzIGNsYXNzZXMgcmVjZWl2ZSBzbWFsbCBjb2RlIHR3ZWFrcyBpbiBwcmVwYXJhdGlvbiBmb3IgdXBjb21pbmcKICAgICAgICAgIGJ1aWxkcy4gV2lraUNvbnRleHQgZ2FpbnMgdGhyZWUgbmV3IGdyb3VwLXJlbGF0ZWQgY29udGV4dHM7IFdpa2lFbmdpbmUKICAgICAgICAgIGdhaW5zIGNvZGUgdG8gaW5pdGlhbGl6ZSBDb21tYW5kUmVzb2x2ZXIgYW5kIGEgcmVsYXRlZCBhY2Nlc3NvcjsKCiAgICAgICAgKiBHcm91cFByaW5jaXBhbCBnYWlucyBhIHR3by1hcmd1bWVudCBjb25zdHJ1Y3RvciB0aGF0IGFjY2VwdHMgdGhlCiAgICAgICAgICB3aWtpIG5hbWUgYXMgdGhlIGZpcnN0IHBhcmFtZXRlci4KCiAgICAgICAgKiBXaWtpUGVybWlzc2lvbidzIGFjdGlvbiBzdHJpbmdzIGFyZSBub3cgcHVibGljLiBFYnUncyBiZWVuIHdhaXRpbmcgYSB3aGlsZQogICAgICAgICAgZm9yIHRoaXMuCgogICAgICAgICogQ29tbWVudGVkUHJvcGVydGllc1Rlc3QncyBtaXNzaW5nIHRlc3QucHJvcGVydGllcyBmaWxlIGlzIG5vdyBpbiBDVlMuCgoyMDA2LTA3LTIzICBBbmRyZXcgSmFxdWl0aCA8YW5kcmV3IEFUIGZyZXNoY29va2llcyBET1Qgb3JnPgoKICAgICAgICAqIDIuNC4yMgoKICAgICAgICAqIEFkZGVkIHNldmVyYWwgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcyB0byBzdXBwb3J0IHVwY29taW5nCiAgICAgICAgICBBQUEgcmVmYWN0b3JpbmcuIFRoZXNlIGRvIG5vdCBhZmZlY3QgZnVuY3Rpb25hbGl0eSwgYmVjYXVzZQogICAgICAgICAgdGhleSBhcmUgbm90IHJlZmVyZW5jZWQgYnkgYW55IGV4aXN0aW5nIGNsYXNzZXMuIE5ldyBjbGFzc2VzCiAgICAgICAgICBpbmNsdWRlOiAoMSkgQ29tbWFuZCBpbnRlcmZhY2UgYW5kIHJlbGF0ZWQgQWJzdHJhY3RDb21tYW5kLAogICAgICAgICAgUGFnZUNvbW1hbmQsIEdyb3VwQ29tbWFuZCBhbmQgV2lraUNvbW1hbmQgaW1wbGVtZW50YXRpb25zOwogICAgICAgICAgKDIpIFdpa2lFdmVudFNvdXJjZSBpbnRlcmZhY2UgYW5kIEV2ZW50U291cmNlRGVsZWdhdGUgY2xhc3MsCiAgICAgICAgICBib3RoIGluIGV2ZW50cyBwYWNrYWdlOyAoMykgR3JvdXBEYXRhYmFzZSBpbnRlcmZhY2UgYW5kIHNhbXBsZQogICAgICAgICAgZ3JvdXBkYXRhYmFzZS54bWwgZmlsZXMgYW5kICg0KSBDb21tZW50ZWRQcm9wZXJ0aWVzIGNsYXNzIGZvcgogICAgICAgICAgcmVhZGluZyBhbmQgcmUtc2F2aW5nIHByb3BlcnRpZXMgZmlsZXMgdGhhdCBpbmNsdWRlIGNvbW1lbnRzLgogICAgICAgICAgQWdhaW4sIHRoZXNlIGNsYXNzZXMgYXJlIG5vdCB5ZXQgYWN0aXZlbHkgdXNlZC4KCiAgICAgICAgKiBNaW5vciB0d2VhayB0byBUZXN0SHR0cFNlcnZsZXRSZXF1ZXN0IHRvIHN1cHBvcnQgcGFyYW1ldGVycyBhbmQKICAgICAgICAgIHNlcnZsZXQgcGF0aC4KCiAgICAgICAgKiBSZW1vdmVkIGNydWZ0IGZyb20gSHR0cFV0aWw7IG5vIGZ1bmN0aW9uYWxpdHkgY2hhbmdlcy4KCiAgICAgICAgKiBXaWtpQmFja2dyb3VuZFRocmVhZCBub3cgY29udGFpbnMgYSBnZXRFbmdpbmUoKSBhY2Nlc3Nvci4KCjIwMDYtMDctMTcgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi40LjIxCgogICAgICAgICogUkNTRmlsZVByb3ZpZGVyIGhhZCBhIHJhcmUgY29uY3VycmVuY3kgaXNzdWUgd2l0aCB0aGUKICAgICAgICBTaW1wbGVEYXRlRm9ybWF0LiAgUmVwb3J0ZWQgYnkgQm9zbW9uIG9uIElSQy4KCjIwMDYtMDctMTcgIEVyaWsgQnVubiAgPHJvb3RAZDE4My5maS5iYXNlbi5uZXQ+CgogICAgICAgICogTW9kdWxhcml6ZWQgUmVuZGVyaW5nTWFuYWdlci4gQnkgc2V0dGluZwogICAgICAgIGpzcHdpa2kucmVuZGVyaW5nTWFuYWdlci5yZW5kZXJlciBpbiBqc3B3aWtpLnByb3BlcnRpZXMsIGEgY3VzdG9tCiAgICAgICAgV2lraVJlbmRlcmVyIGNhbiBiZSBzcGVjaWZpZWQuIERlZmF1bHRzIHRvIFhIVE1MUmVuZGVyZXIuCgoyMDA2LTA3LTEzICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNC4yMAoKICAgICAgICAqIEZpeGVkIEJ1Z05vTW9yZVRoYW5PbmVTb3J0YWJsZVRhYmxlUGVyUGFnZS4gIFRoYW5rcyB0bwogICAgICAgIEp1YW4gUGFibG8gU2FudG9zIFJvZHJpZ3VleiEKCjIwMDYtMDctMTMgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi40LjE5CgogICAgICAgICogQWRkZWQgIkludGVybmFsTW9kdWxlIiBpbnRlcmZhY2UuICBUaGlzIGlzIGp1c3QgYW4gZW1wdHkKICAgICAgICBpbnRlcmZhY2Ugd2hpY2ggYSBtb2R1bGUgY2FuIGRlY2xhcmUgYW5kIG5vdCBnZXQgbGlzdGVkCiAgICAgICAgaW4gU3lzdGVtSW5mbywgZm9yIGV4YW1wbGUuICBVc2VkIGludGVybmFsbHkgYnkgSlNQV2lraS4KCiAgICAgICAgKiBGaXhlZCBhIG1ham9yIGlzc3VlIHdpdGggcGFnZSByZW5hbWluZzogdGhhbmtzIHRvIGFuCiAgICAgICAgZXJyb25ldXMgY29udGV4dCBzZW50IGRvd25zdHJlYW0sIHRoZSBwYWdlIHdoaWNoIHdhcyByZW5hbWVkCiAgICAgICAgZnJvbSB3b3VsZCBnZXQgcmFuZG9tIGNvbnRlbnRzLgoKICAgICAgICAqIFBhZ2UgcmVuYW1lIHdvdWxkIG5vdCBjaGFuZ2UgcmVmZXJyZXJzIGlmIHRoZSBicmVha1RpdGxlV2l0aFNwYWNlcwogICAgICAgIG9wdGlvbiB3YXMgc2V0IG9uLgoKMjAwNi0wNy0xMiAgRXJpayBCdW5uICA8RXJpay5CdW5uQGJhc2VuLm5ldD4KCiAgICAgICAgKiBNYWRlIFBhcmFtVGFnIGF0dHJpYnV0ZSAndmFsdWUnIG5vbi1yZXF1aXJlZDsgdGFnIGJvZHkgaXMKICAgICAgICBhY2NlcHRhYmxlIGZvciB2YWx1ZS4gKFRoaXMgc2hvdWxkIG5vdCB3YXJyYW50IGEgdmVyc2lvbiBidW1wLikKCjIwMDYtMDctMDIgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi40LjE4CgogICAgICAgICogQnVnUmVwb3J0SGFuZGxlciB3YXMgZHV0aWZ1bGx5IGFkZGluZyB0aGUgIl9jbWRsaW5lIiB0byB0aGUKICAgICAgICBwYWdlcyBpdCB3YXMgY3JlYXRpbmcuLi4KCiAgICAgICAgKiBGaXhlZCBzb21lIHF1b3RlIGlzc3VlcyBpbiBjb21tb25oZWFkZXIuanNwIGFuZAogICAgICAgIFByZWZlcmVuY2VzQ29udGVudC5qc3Agd2hpY2ggd2VyZSBjYXVzaW5nIGlzc3VlcyB3aXRoCiAgICAgICAgV2ViU3BoZXJlLiAgUmVwb3J0ZWQgYnkgUm9iaW4gVGV3IGFuZCBUaG9yc3RlbiBOb3JkaG9sbSBTP2JpcmsuCgoyMDA2LTA2LTI4ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNC4xNwoKICAgICAgICAqIFdpa2lTZWN1cml0eUV2ZW50LnRvU3RyaW5nKCkgd291bGQgZGllIGlmIHlvdSBoYWQgYSBudWxsIHByaW5jaXBhbC4uLgoKMjAwNi0wNi0xNyAgQW5kcmV3IEphcXVpdGggPGFuZHJldyBBVCBmcmVzaGNvb2tpZXMgRE9UIG9yZz4KCiAgICAgICAgKiAyLjQuMTYKCiAgICAgICAgKiBCdWcgZml4OiBTZXNzaW9uTW9uaXRvci5zZXNzaW9ucygpIG5vdyByZXR1cm5zIHRoZSBzYW1lCiAgICAgICAgbnVtYmVyIG9mIHNlc3Npb25zIGFzIHVzZXJQcmluY2lwYWxzKCkuIENyZWRpdDogVGVycnkgU3RlaWNoZW4uCiAgICAgICAgQWxzbywgdGhlIGFycmF5IG9mIFByaW5jaXBhbHMgcmV0dXJuZWQgYnkgdXNlclByaW5jaXBhbHMoKSBpcyBub3cgc29ydGVkLgoKICAgICAgICAqIFdpa2lTZXNzaW9uIHJlY2VpdmVzIGxvdHMgb2YgSmF2YWRvYyB0d2Vha3MgYW5kIG1pbm9yCiAgICAgICAgY2xlYW51cC1vcmllbnRlZCBmaXhlcyAoZS5nLiwgbWVtYmVyIHZpc2liaWxpdHkgY2hhbmdlcykgdGhhdAogICAgICAgIGRvIG5vdCBjaGFuZ2UgZnVuY3Rpb25hbGl0eS4gVGhlIGNsYXNzLCBhbmQgYWxsIG9mIGl0cyBtZXRob2RzLCBhcmUKICAgICAgICBub3cgbWFya2VkIGZpbmFsLiBUaGUgc2V0U3ViamVjdCgpIG1ldGhvZCwgd2hpY2ggd2FzIG5vdCBjYWxsZWQKICAgICAgICBhbnl3aGVyZSwgd2FzIHJlbW92ZWQ7IGl0IHdhcyBhIHBvdGVudGlhbCBzZWN1cml0eSByaXNrLgoKICAgICAgICAqIEFudCAnamF2YWRvYycgdGFzayBub3cgbGlua3MgdG8gSjJFRSAxLjMgQVBJLgoKICAgICAgICAqIEFkZGVkIHRhYmxlIGVudHJ5IHRvIFN5c3RlbUluZm8gcGFnZSB0byBkaXNwbGF5IGxpc3Qgb2YgYWN0aXZlIHVzZXJzLgogICAgICAgIElmIHlvdSBmZWVsIHRoaXMgaXMgYSBwcml2YWN5IHJpc2ssIHJlbW92ZSB0aGUgbGluZSBmcm9tIFN5c3RlbUluZm8uCgoyMDA2LTA2LTIzICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNC4xNQoKICAgICAgICAqIEZpeGVkIGlzc3VlIHdpdGggYWJzb2x1dGUgVVJMcyBhbmQgU2hvcnRVUkxDb25zdHJ1Y3RvciAod2Ugd2VyZQogICAgICAgIHVzaW5nICVVIHdoZXJlICV1IHNob3VsZCd2ZSBiZWVuIHVzZWQgaW4gRVJST1IgYW5kIE5PTkUgY29udGV4dHMpLgogICAgICAgIFRoYW5rcyB0byBqaW0gZnJvbSBJUkMgZm9yIHBvaW50aW5nIHRoaXMgb3V0LgoKICAgICAgICAqIEFkZGVkIHBhdGNoIGZyb20gQnJhZCBKb2huc29uIHRvIGdpdmUgYmV0dGVyIGVycm9yIG91dHB1dCBpZgogICAgICAgIFJDU0ZpbGVQcm92aWRlciBmYWlscy4KCiAgICAgICAgKiBBZGRlZCBwYXRjaCBmcm9tIE11cnJheSBBbHRoZWltIHRvIHN1cHBvcnQgX2NtZGxpbmUgaW4gUGx1Z2luTWFuYWdlci4KICAgICAgICBUaGlzIGFsbG93cyBhIHBsdWdpbiB0byBkbyBjb21wbGV0ZWx5IGN1c3RvbSBwYXJzaW5nLgoKMjAwNi0wNi0xNyAgQW5kcmV3IEphcXVpdGggPGFuZHJldyBBVCBmcmVzaGNvb2tpZXMgRE9UIG9yZz4KCiAgICAgICAgKiAyLjQuMTQKCiAgICAgICAgKiBFbmhhbmNlbWVudDogYWxsIGJhY2tncm91bmQgdGhyZWFkcyBub3cgc3ViY2xhc3MgYSBuZXcgY2xhc3MgY2FsbGVkCiAgICAgICAgV2lraUJhY2tncm91bmRUaHJlYWQgd2hpY2ggd2lsbCBncmFjZWZ1bGx5IHNodXQgdGhlbXNlbHZlcyBkb3duIHdoZW4KICAgICAgICB0aGV5IGhlYXIgYSAnd2lraSBzaHV0ZG93bicgZXZlbnQuIFRoZXNlIHRocmVhZHMgYXJlLCBhdCBwcmVzZW50OgogICAgICAgIFdpa2lTZXNzaW9uLlNlc3Npb25Nb25pdG9yLCBQYWdlTWFuYWdlci5Mb2NrUmVhcGVyLCBSU1NUaHJlYWQsIGFuZAogICAgICAgIEx1Y2VuZVNlYXJjaFByb3ZpZGVyLkx1Y2VuZVVwZGF0ZXIuIFRoZXNlIHRocmVhZHMgYXJlIE5PIExPTkdFUgogICAgICAgIGRhZW1vbiB0aHJlYWRzLCB3aGljaCBtZWFucyB0aGV5IHdvbid0IHN0YXkgaW4gbWVtb3J5IHdoZW4KICAgICAgICB0aGUgd2lraSB3ZWJhcHAgaXMgcmVtb3ZlZC4KCiAgICAgICAgKiBFbmhhbmNlbWVudDogQWRkZWQgcHJvdGVjdGVkIG1ldGhvZCBzaHV0ZG93bigpIHRvIFdpa2lFbmdpbmUgdGhhdCBpcwogICAgICAgIHRyaWdnZXJlZCBieSBXaWtpU2VydmxldCBjYXRjaGluZyB3ZWJhcHAgZGVzdHJveSgpIGV2ZW50cy4gU2h1dGRvd24oKQogICAgICAgIGZpcmVzIGEgV2lraUVuZ2luZUV2ZW50IGNhbGxlZCAnc2h1dGRvd24nIHRvIGFsbCBsaXN0ZW5lcnMsIHdoaWNoIGF0CiAgICAgICAgcHJlc2VudCBpbmNsdWRlcyBhbGwgV2lraUJhY2tncm91bmRUaHJlYWRzLiBOZXcgY2xhc3MgYWRkZWQ6CiAgICAgICAgV2lraUVuZ2luZUV2ZW50LiBUbyBjYXRjaCBjb250YWluZXIgZXZlbnRzLCBXaWtpU2VydmxldCB3YXMgY2hhbmdlZCBpbgogICAgICAgIHdlYi54bWwgdG8gbG9hZCBhdCBzdGFydHVwLiBUaGlzIGlzIGEgZGlydHkgaGFjaywgYnV0IG5vdCB0b28gZGlydHkuCgogICAgICAgICogRW5oYW5jZW1lbnQ6IE1ham9yIHJlZmFjdG9yaW5nIG9mIFdpa2lTZXNzaW9uIHRvIGluY2x1ZGUgYSBiYWNrZ3JvdW5kCiAgICAgICAgJ21vbml0b3InIHRocmVhZCB0aGF0IHJlbW92ZXMgZXhwaXJlZCB3aWtpIHNlc3Npb25zLiBUaGlzIG1lYW5zIHRoYXQKICAgICAgICBzZXNzaW9uLWNvdW50IGluZm9ybWF0aW9uIHNob3VsZCBiZSBhY2N1cmF0ZSB0byB3aXRoaW4gYSBtaW51dGUKICAgICAgICBvZiB3aGVuIHlvdXIgd2ViIGNvbnRhaW5lciBleHBpcmVzIGl0cyBzZXNzaW9ucy4gVGhlIGJhY2tncm91bmQgdGhyZWFkCiAgICAgICAgaXMgYW4gaW5uZXIgY2xhc3MgY2FsbGVkIFNlc3Npb25Nb25pdG9yIHRoYXQgc3ViY2xhc3NlcyBXaWtpQmFja2dyb3VuZFRocmVhZC4KICAgICAgICBXaWtpU2Vzc2lvbiBhbHNvIGdhaW5zIGEgbWV0aG9kIGNhbGxlZCBnZXRVc2VyUHJpbmNpcGFscyhXaWtpRW5naW5lKQogICAgICAgIHRoYXQgcmV0dXJucyBhbiBhcnJheSBvZiBQcmluY2lwYWxzIHRoYXQgcmVwcmVzZW50cyB0aGUgY3VycmVudAogICAgICAgIHVzZXJzIGN1cnJlbnRseSB1c2luZyB0aGUgd2lraS4KCiAgICAgICAgKiBFbmhhbmNlbWVudDogU2Vzc2lvbnNQbHVnaW4gcmVjZWl2ZXMgcGFyYW1ldGVyICdwcm9wZXJ0eScgdG8gc3BlY2lmeSB3aGF0CiAgICAgICAgc2Vzc2lvbiBpbmZvcm1hdGlvbiBzaG91bGQgYmUgcmV0dXJuZWQuIElmIHNldCB0byAndXNlcnMnLCBwbHVnaW4KICAgICAgICByZXR1cm5zIHRoZSBsaXN0IG9mIGN1cnJlbnQgdXNlcnMuIElmIG9taXR0ZWQsIGl0IHJldHVybnMgdGhlIG51bWJlciBvZgogICAgICAgIGFjdGl2ZSBzZXNzaW9ucy4gVGh1cywgW3tJTlNFUlQgU2Vzc2lvbnNQbHVnaW4gcHJvcGVydHk9dXNlcnN9XQogICAgICAgIHdpbGwgYWN0dWFsbHkgcHJpbnQgdGhlIG5hbWVzIG9mIGN1cnJlbnQgdXNlcnMgLS0gbmVhdCEKCiAgICAgICAgKiBFbmhhbmNlbWVudDogR3JvdXAgaW50ZXJmYWNlIHJlY2VpdmVzIGEgbG9uZy1hd2FpdGVkIG1lbWJlcnMoKQogICAgICAgIG1ldGhvZCB0aGF0IHJldHVybnMgdGhlIHdpa2kgZ3JvdXAncyBjdXJyZW50IG1lbWJlcnMgYXMgYW4gYXJyYXkKICAgICAgICBvZiBQcmluY2lwYWxzLgoKICAgICAgICAqIEVuaGFuY2VtZW50OiB0aHJlYWQgcmVzcG9uc2libGUgZm9yIFJTUyBnZW5lcmF0aW9uIGV4dHJhY3RlZCBvdXQgb2YKICAgICAgICBXaWtFbmdpbmUgYW5kIG1vdmVkIHRvIGl0cyBvd24gUlNTVGhyZWFkIGNsYXNzLgoKICAgICAgICAqIEJ1ZyBmaXg6IHRvIHN1cHBvcnQgbXVsdGktd2lraSB3ZWJhcHBzLCBXaWtpU2Vzc2lvbi5nZXRXaWtpU2Vzc2lvbidzCiAgICAgICAgbWV0aG9kIHNpZ25hdHVyZSBub3cgaW5jbHVkZXMgYSBwYXJhbWV0ZXIgZm9yIHRoZSBjdXJyZW50IFdpa2lFbmdpbmUuCiAgICAgICAgQ2hlY2sgeW91ciBjdXN0b20gSlNQcyB0byBzZWUgaWYgdGhpcyBhZmZlY3RzIHlvdSAoaXQgc2hvdWxkbid0OyBub25lIG9mCiAgICAgICAgdGhlIGRlZmF1bHQgSlNQcyBjdXJyZW50bHkgdXNlIHRoaXMgbWV0aG9kKS4KCiAgICAgICAgKiBCdWcgZml4OiBGaXhlZCBkZXByZWNhdGVkIG1ldGhvZHMgdXNlZCBpbiBMdWNlbmVTZWFyY2hQcm92aWRlci4KCiAgICAgICAgKiBCdWcgZml4OiBhZGRlZCBzZW5zaWJsZSBzZXNzaW9uIHRpbWVvdXQgZGVmYXVsdHMgdG8gVGVzdEh0dHBTZXNzaW9uCiAgICAgICAgdG8gcHJldmVudCBzb21lIHRlc3RzIGZyb20gZmFpbGluZy4KCiAgICAgICAgKiBNaW5vciBzaWduYXR1cmUgY2hhbmdlIHRvIEdyb3VwTWFuYWdlcjogY29tbWl0KCkgbm93IHRocm93cyBXaWtpRXhjZXB0aW9uLgoKICAgICAgICAqIE1pbm9yIHJlZmFjdG9yaW5nIG9mIFdpa2lFdmVudCBjbGFzcyBhbmQgc3ViY2xhc3NlcyB0byBhZGQgZ2V0VHlwZSgpCiAgICAgICAgbWV0aG9kIHRvIHN1cGVyY2xhc3MuCgoyMDA2LTA2LTA1ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNC4xMwoKICAgICAgICAqIEFkZGVkIEVkaXRvck1hbmFnZXIgcGF0Y2ggZnJvbSBDaHVjayBTbWl0aC4gIFRoaXMgbm93IGFsbG93cwogICAgICAgIGZ1bGx5IGR5bmFtaWMgZWRpdG9yIHNlbGVjdGlvbiB1c2luZyBhIGRyb3AtZG93biBtZW51IGluIEVkaXRDb250ZW50LmpzcAoKICAgICAgICAqIEFkZGVkIEVkaXRvckl0ZXJhdG9yIHRhZyBmcm9tIENodWNrLCB0b28uCgogICAgICAgICogRml4ZWQgc29tZSBJRSB0YWIgbGF5b3V0IGlzc3VlcywgdGhhbmtzIHRvIERpcmsgRnJlZGVyaWN4LgoKMjAwNi0wNi0wNSAgQW5kcmV3IEphcXVpdGggPGFuZHJldyBBVCBmcmVzaGNvb2tpZXMgRE9UIG9yZz4KCiAgICAgICAgKiAyLjQuMTIKCiAgICAgICAgKiBBZGRlZCBIeXBlcnNvbmljIGVtYmVkZGVkIGRhdGFiYXNlIGZvciBKREJDIHRlc3RpbmcuIEVuYWJsZWQKICAgICAgICBKREJDIHRlc3RpbmcgaW4gYnVpbGQucHJvcGVydGllcyB0byB1c2UgSHlwZXJzb25pYyBieSBkZWZhdWx0LgogICAgICAgIEFkZGVkIGxpY2Vuc2UgZmlsZTsgY29ycmVjdGVkIGZpbGUgZXh0ZW5zaW9ucyBvZiB0d28gb3RoZXJzLgoKICAgICAgICAqIFJlbW92ZWQgZGF0YWJhc2Ugc2NyaXB0cyBmb3IgTWNrb2kgZW1iZWRkZWQgZGF0YWJhc2UuCgogICAgICAgICogQWRkZWQgQW50IHRhcmdldCBjYWxsZWQgJ3Rlc3RzLWF1dGgnIGZvciBKRFBBIGRlYnVnZ2luZyBvZgogICAgICAgIEF1dGhvcml6YXRpb25NYW5hZ2VyVGVzdC4KCiAgICAgICAgKiBNaW5vciBKYXZhZG9jIGZpeGVzLgoKMjAwNi0wNS0yOCAgQW5kcmV3IEphcXVpdGggPGFuZHJldyBBVCBmcmVzaGNvb2tpZXMgRE9UIG9yZz4KCiAgICAgICAgKiAyLjQuMTEKCiAgICAgICAgKiBXaWtpU2Vzc2lvbiByZWNlaXZlZCBtaW5vciByZWZhY3RvcmluZ3MgdG8gcmVtb3ZlIHRoZSBzZXQvZ2V0TGFzdENvbnRleHQoKQogICAgICAgIG1ldGhvZHMuIFRoZXNlIHdlcmUgdXNlZCBmb3Igb25seSBvbmUgcHVycG9zZSBhbnlob3cgKFdlYkNvbnRhaW5lckF1dGhvcml6ZXIpCiAgICAgICAgYW5kIHRoZSBuZXQgcmVzdWx0IHdhcyB0aGF0IHRoZWlyIGluY2x1c2lvbiB3YXMgcHJldmVudGluZyBnYXJiYWdlIGNvbGxlY3Rpb24KICAgICAgICBvZiBleHBpcmVkIFdpa2lTZXNzaW9ucy4gV2lraVNlc3Npb24gYWxzbyByZWNlaXZlcyBhIHJlbW92ZVdpa2lTZXNzaW9uKCkKICAgICAgICBtZXRob2QsIHdoaWNoIHJlbW92ZXMgd2lraSBzZXNzaW9ucyBmcm9tIGl0cyBpbnRlcm5hbCBjYWNoZSwgYW5kIGlzIGNhbGxlZAogICAgICAgIGR1cmluZyBsb2dvdXQuCgogICAgICAgICogQnVnIGZpeDogV2lraVNlc3Npb24uc2Vzc2lvbnMoKSBhbmQgdGhlIHJlbGF0ZWQgU2Vzc2lvbnNQbHVnaW4gbm93CiAgICAgICAgbW9yZSBhY2N1cmF0ZWx5IHJlZmxlY3QgdGhlIG51bWJlciBvZiBjdXJyZW50IFdpa2lTZXNzaW9ucywgaW5zdGVhZCBvZgogICAgICAgIGNvbnRpbnVvdXNseSBpbmNyZW1lbnRpbmcuIChUZWNobmljYWxseSwgdGhlIGNvdW50ZXIgc2hvd3MgdGhlIG51bWJlciBvZgogICAgICAgIG5vbi1HQ2VkIHNlc3Npb25zLikgSW4gdGhlIGZ1dHVyZSBhICJzZXNzaW9uIHJlYXBlciIgd291bGQgbWFrZSB0aGlzIGV2ZW4KICAgICAgICBiZXR0ZXIuCgogICAgICAgICogQnVnIGZpeDogUmVtb3ZlZCBkaXZpZGUtYnktemVybyBlcnJvciBmcm9tIFNlY3VyaXR5VmVyaWZpZXIuCgogICAgICAgICogQnVnIGZpeDogRGVmYXVsdEdyb3VwIGFuZCBEZWZhdWx0R3JvdXBNYW5hZ2VyIG5vdyBzdG9yZSB0aGVpcgogICAgICAgIFdpa2lFdmVudExpc3RlbmVycyBpbiBXZWFrSGFzaE1hcHMgdG8gcHJldmVudCBsaXN0ZW5lciBvYmplY3RzCiAgICAgICAgKHN1Y2ggYXMgV2lraVNlc3Npb24pIGZyb20gYmVpbmcgcmVjbGFpbWVkIGJ5IEdDLgoKICAgICAgICAqIEJ1ZyBmaXg6IFdpa2lEb2N1bWVudCBub3cgc3RvcmVzIGl0cyByZWZlcmVuY2UgdG8gV2lraUNvbnRleHQKICAgICAgICBhcyBhIFdlYWtSZWZlcmVuY2UsIHNvIHRoYXQgY2FjaGluZyBvcGVyYXRpb25zIHdvbid0IHByZXZlbnQgR0MKICAgICAgICBvZiB0aGUgV2lraUNvbnRleHQuCgogICAgICAgICogQnVnIGZpeDogQ29ycmVjdGVkIHRleHQgb24gdGhlIGRlZmF1bHQgUHJlZmVyZW5jZXNDb250ZW50LmpzcAogICAgICAgIHRvIHJlZmxlY3QgcmVjZW50IGUtbWFpbCByZXNldCBmdW5jdGlvbi4KCiAgICAgICAgKiBCdWcgZml4OiBGaXhlZCBsaXN0ZW5lciBidWcgRGVmYXVsdEdyb3VwTWFuYWdlciB0aGF0IHdhcyBwcmV2ZW50aW5nCiAgICAgICAgV2lraVNlc3Npb25zIGZyb20gcmVjZWl2aW5nIHVwZGF0ZWQgR3JvdXBQcmluY2lwYWxzIHdoZW4gZ3JvdXBzCiAgICAgICAgd2VyZSBjaGFuZ2VkIHRvIGluY2x1ZGUgbmV3IG1lbWJlcnMgaW4gY2VydGFpbiBjYXNlcy4KCiAgICAgICAgKiBCdWcgZml4OiBGaXhlZCAnaW5kZXggb3V0IG9mIHJhbmdlJyBlcnJvciBjYXVzZWQgYnkgemVyby1sZW5ndGggY29va2llcy4KCiAgICAgICAgKiBCdWcgZml4OiBXZWJDb250YWluZXJBdXRob3JpemVyIG5vdyByZWNvZ25pemVzIHJvbGVzIGRlY2xhcmVkIGluCiAgICAgICAgd2ViLnhtbCBmb3IgZWxlbWVudHMgd2ViLWFwcC9zZWN1cml0eS1yb2xlL3JvbGUtbmFtZSwgaW4gYWRkaXRpb24gdG8KICAgICAgICB0aG9zZSBkZWNsYXJlZCBmb3Igd2ViLWFwcC9zZWN1cml0eS1jb25zdHJhaW50L2F1dGgtY29uc3RyYWludC9yb2xlLW5hbWUuCgogICAgICAgICogTW92ZWQgaGFjay1leSBjb2RlIHRoYXQgaW5qZWN0cyB3ZWIgY29udGFpbmVyIFJvbGUgUHJpbmNpcGFscyBmcm9tCiAgICAgICAgQXV0aGVudGljYXRpb25NYW5hZ2VyIHRvIFdlYkNvbnRhaW5lckxvZ2luTW9kdWxlLCB3aGVyZSBpdCBiZWxvbmdzLgoKICAgICAgICAqIEFzIHBhcnQgb2YgdGhlIG1lbW9yeS1sZWFrIGZpeCwgV2ViQ29udGFpbmVyQXV0aG9yaXplciBubyBsb25nZXIKICAgICAgICByZWxpZXMgb24gYSBzbmVha3kgY2FsbCB0byBXaWtpU2Vzc2lvbi5nZXRMYXN0Q29udGV4dCgpLmdldEh0dHBSZXF1ZXN0KCkKICAgICAgICB0byB0ZXN0IHdoZXRoZXIgYSB1c2VyIHBvc3Nlc3NlcyBhIHBhcnRpY3VsYXIgY29udGFpbmVyIHJvbGUuIEluc3RlYWQsCiAgICAgICAgd2UgKG9ubHkpIGluc3BlY3QgdGhlIHVzZXIncyBTdWJqZWN0J3MgUHJpbmNpcGFsIHNldCBmb3IgdGhlIGRlc2lyZWQgcm9sZS4KICAgICAgICBUaGlzIG1lYW5zIHRoYXQgY2hhbmdlcyB0byBjb250YWluZXIncyB1c2VyL3JvbGUgbWFwcGluZ3MgYXJlIE5PVAogICAgICAgIHJlZmxlY3RlZCB1bnRpbCB0aGUgbmV4dCB0aW1lIHRoZSB1c2VyIGxvZ3MgaW4uCgoyMDA2LTA1LTI4ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNC4xMAoKICAgICAgICAqIEF0b20gZmVlZHMgbm93IHZhbGlkYXRlIHByb3Blcmx5CgogICAgICAgICogUlNTIGFuZCBBdG9tIGZlZWRzIGFyZSBub3cgc2VydmVkIHdpdGggcHJvcGVyIG1lZGlhIHR5cGUKCjIwMDYtMDUtMjAgIEFuZHJldyBKYXF1aXRoIDxhbmRyZXcgQVQgZnJlc2hjb29raWVzIERPVCBvcmc+CgogICAgICAgICogMi40LjkKCiAgICAgICAgKiBFbmhhbmNlbWVudDogVXNlckRhdGFiYXNlIGludGVyZmFjZSBpbmNsdWRlcyB0d28gbmV3IG1ldGhvZHM6CiAgICAgICAgZ2V0V2lraU5hbWVzKCkgZm9yIGVudW1lcmF0aW5nIHRoZSB1c2VycyBpbiB0aGUgY3VycmVudCBkYXRhYmFzZSwKICAgICAgICBhbmQgZGVsZXRlQnlMb2dpbk5hbWUoIFN0cmluZyApLCBmb3IgcmVtb3ZpbmcgdXNlcnMuIEkgaGF2ZSBpbXBsZW1lbnRlZAogICAgICAgIHRoZXNlIG1ldGhvZHMgdG8gdGhlIGNvbmNyZXRlIGNsYXNzZXMgSkRCQ1VzZXJEYXRhYmFzZSBhbmQKICAgICAgICBYTUxVc2VyRGF0YWJhc2UuIFRoYW5rcyB0byBGcmFuayBGaXNjaGVyIGZvciBoaXMgcGF0Y2hlczsgdGhleQogICAgICAgIHNlcnZlZCBhcyB0aGUgYmFzaXMgZm9yIHRoZXNlIGNoYW5nZXMuIEkgaGF2ZSAqbm90KiBhZGRlZCBjb252ZW5pZW5jZQogICAgICAgIG1ldGhvZHMgdG8gVXNlck1hbmFnZXIuLi4geWV0LgoKICAgICAgICAqIEVuaGFuY2VtZW50OiBTZWN1cml0eVZlcmlmaWVyIGluY2x1ZGVzIG5ldyBjb2RlIHRoYXQgY2hlY2tzIHRvIG1ha2UKICAgICAgICBzdXJlIHRoZSBVc2VyRGF0YWJhc2UgaXMgaW5pdGlhbGl6ZWQgcHJvcGVybHksIGFuZCB0aGF0IGl0IGNhbiBhZGQKICAgICAgICBhbmQgZGVsZXRlIHVzZXJzIGNvcnJlY3RseS4gQWxzbywgYWRtaW4vU2VjdXJpdHlDb25maWcuanNwIGluY2x1ZGVzCiAgICAgICAgYSBuZXcgc2VjdGlvbiAoJ1VzZXJEYXRhYmFzZScpIHdoZXJlIHJlc3VsdHMgb2YgdGhlIGNoZWNrcyBhcmUgZGlzcGxheWVkLgoKICAgICAgICAqIE1pbm9yIHR3ZWFrcyB0byB0aGUgZGF0YWJhc2Ugc2V0dXAgc2NyaXB0cyB0byBpbmNsdWRlIHVwZGF0ZS9kZWxldGUKICAgICAgICBwcml2aWxlZ2VzIGZvciB0aGUgcm9sZXMgdGFibGUuCgogICAgICAgICogTWlub3IgdHdlYWsgdG8gd2ViIHVuaXQgdGVzdHMgdG8gYWNjb3VudCBmb3IgY2xlYXJlZCBjb29raWVzIGF0IGxvZ291dC4KCjIwMDYtMDUtMjAgIEFuZHJldyBKYXF1aXRoIDxhbmRyZXcgQVQgZnJlc2hjb29raWVzIERPVCBvcmc+CgogICAgICAgICogMi40LjgKCiAgICAgICAgKiBFbmhhbmNlbWVudDogQXV0aGVudGljYXRpb25NYW5hZ2VyIG5vdyBpbmplY3RzIHJvbGUgUHJpbmNpcGFscwogICAgICAgIGF0IGxvZ2luIHRpbWUgZnJvbSB0aGUgZXh0ZXJuYWwgYXV0aG9yaXplciBpbnRvIG91ciBXaWtpU2Vzc2lvbidzCiAgICAgICAgc3ViamVjdC4gVGhpcyB3b3JrcyB3aXRoIGFsbCBBdXRob3JpemVycywgaW5jbHVkaW5nIChvZiBjb3Vyc2UpCiAgICAgICAgV2ViQ29udGFpbmVyQXV0aG9yaXplci4gVGhpcyBlbmFibGVzIGdyYW50cyB0byBQcmluY2lwYWxzIG9mCiAgICAgICAgdHlwZSBjb20uZWN5cmQuanNwd2lraS5hdXRoLmF1dGhvcml6ZS5Sb2xlIHRvIGJlIHNwZWNpZmllZCBpbgogICAgICAgIHRoZSBKYXZhIHNlY3VyaXR5IHBvbGljeS4gSW4gcGFydGljdWxhciwgdGhpcyBtZWFucyB0aGF0IHBvbGljeQogICAgICAgIGZpbGVzIGNhbiBiZSBicm9hZGVuZWQgdG8gaW5jbHVkZSBjb250YWluZXIgcm9sZXMuCiAgICAgICAgV2ViQ29udGFpbmVyQXV0aG9yaXplciByZWNlaXZlZCBhIG5ldyBtZXRob2QgdG8gYWNjb21vZGF0ZSB0aGlzLgoKICAgICAgICAqIEVuaGFuY2VtZW50OiBBZGRlZCBncmFudCBibG9jayBpbiBqc3B3aWtpIGZvciBhZG1pbmlzdHJhdG9yIGdyb3VwcwogICAgICAgIHByaW5jaXBhbCBjb20uZWN5cmQuanNwd2lraS5hdXRoLkdyb3VwUHJpbmNpcGFsICJBZG1pbiIgKHdpa2kgZ3JvdXApCiAgICAgICAgYW5kIHByaW5jaXBhbCBjb20uZWN5cmQuanNwd2lraS5hdXRoLmF1dGhvcml6ZS5Sb2xlICJBZG1pbiIgKGNvbnRhaW5lcgogICAgICAgIHJvbGUpLiBBZGRlZCBuZXcgd2lraSBwYWdlIHRvIGRpc3RyaWJ1dGlvbiwgR3JvdXBBZG1pbi50eHQgd2l0aCBhbgogICAgICAgIGVtcHR5IChkaXNhYmxlZCkgbWVtYmVyc2hpcCwgd2hpY2ggbWFrZXMgdGhlIGFkbWluaXN0cmF0b3IgZ3JvdXAKICAgICAgICBzZWN1cmUgYnkgZGVmYXVsdC4gV2UgZXhwZWN0IHRoYXQgYSBmdXR1cmUgZW5oYW5jZW1lbnQgdG8gSW5zdGFsbC5qc3AKICAgICAgICB3aWxsIG92ZXJ3cml0ZSB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlLCB0aHVzICJlbmFibGluZyIgdGhlIGFkbWluIGdyb3VwLgoKICAgICAgICAqIEJ1ZyBmaXg6IFVwbG9hZGVkIEpESzEuNC1jb21wYXRpYmxlIHZlcnNpb24gb2YgZnJlc2hjb29raWVzLXNlY3VyaXR5Lmphci4KCiAgICAgICAgKiBCdWcgZml4OiBGaXhlZCBlcnJvciBpbiBqc3B3aWtpLnBvbGljeS4KCiAgICAgICAgKiBCdWcgZml4OiBDaGFuZ2VkIFdpa2lFdmVudCBzbyB0aGF0IGl0cyB0b1N0cmluZygpIG1ldGhvZCBkb2VzIG5vdAogICAgICAgIGxlYWsgY3JlZGVudGlhbHMuCgogICAgICAgICogQnVnIGZpeDogTG9nb3V0LmpzcCBub3cgcmVtb3ZlcyAiYXNzZXJ0ZWQiIGlkZW50aXR5IGNvb2tpZXMuCiAgICAgICAgVGhpcyBpcyBhcmd1YWJseSBsZXNzIGNvbmZ1c2luZyB0byB1c2Vycy4KCiAgICAgICAgKiBCdWcgZml4OiBSZW1vdmVkIFNlY3VyaXR5Q29uZmlnLmpzcCBmcm9tIHdlYi54bWwgY29uc3RyYWludCAoZm9yIG5vdykuCgogICAgICAgICogUmVtb3ZlZCBzcHVyaW91cyBpbXBvcnQgaW4gQXV0aG9yaXphdGlvbk1hbmFnZXIuCgogICAgICAgICogTWFzc2l2ZSByZWZhY3RvcmluZyBhbmQgaHVnZSBpbXByb3ZlbWVudHMgdG8gU2VjdXJpdHlWZXJpZmllciBhbmQKICAgICAgICBhZG1pbi9TZWN1cml0eUNvbmZpZy5qc3AuIEphbm5lLCBpdCBzaG91bGQgZXZlbiBmb3IgeW91IG5vdy4gOikKCiAgICAgICAgKiBBbGxQZXJtaXNzaW9uQ29sbGVjdGlvbiBub3cgYWNjZXB0cyBXaWtpUGVybWlzc2lvbiBhbmQgUGFnZVBlcm1pc3Npb24KICAgICAgICB0eXBlcyBpbiBpdHMgYWRkKCkgbWV0aG9kLiBUaGUgbmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKSBtZXRob2QgZm9yCiAgICAgICAgV2lraVBlcm1pc3Npb24gYW5kIFBhZ2VQZXJtaXNzaW9uIHJldHVybnMgYSBuZXcgQWxsUGVybWlzc2lvbkNvbGxlY3Rpb24oKS4KCjIwMDYtMDUtMDkgIERhbiBGcmFua293c2tpCgogICAgICAgICogMi40LjcKCiAgICAgICAgKiBGaXhlZCBTZWFyY2hCb3ggImVkaXQiIGJ1ZyB3aGVuCgkgIGpzcHdpa2kudXJsQ29uc3RydWN0b3I9U2hvcnRVUkxDb25zdHJ1Y3RvcgoKICAgICAgICAqIEFkZCBhIGxpbmsgb24gdGhlIGF0dGFjaG1lbnQgcGFnZSBiYWNrIHRvIHRoZSBvcmlnaW5hbCBwYWdlCgoyMDA2LTA1LTA5ICBKYW5uZSBKYWxrYW5lbiA8amFsa2FuZW5AZWN5cmQuY29tPgoKICAgICAgICAqIDIuNC42CgogICAgICAgICogRml4ZWQgTlBFIGluIFJlZmVyZW5jZU1hbmFnZXIucGFnZVJlbW92ZWQgKHRoYW5rcwogICAgICAgIHRvIEpNYXJxdWFydCkuCgogICAgICAgICogU2hvcnRVUkxDb25zdHJ1Y3RvciBkaWQgbm90IGhhdmUgUFJFVklFVyBjb250ZXh0CiAgICAgICAgYXZhaWxhYmxlOyB0aGFua3MgdG8gTWFsdGUgS2llc2VsIGZvciB0aGUgZml4LgoKICAgICAgICAqIEFkZGVkIHF1aWNrIGZpeCBmcm9tIERhbiBGcmFua293c2tpIHRvIGdlbmVyYXRlCiAgICAgICAgSkRPTSBqYXZhZG9jIGxpbmtzLgoKICAgICAgICAqIFBsYWluIFVSSXMgaW4gdGV4dCBhcmUgbm93IHBhcnNlZCBwcm9wZXJseSBhbmQgbm8gbG9uZ2VyCiAgICAgICAgY3V0IGF0IHRoZSBmaXJzdCAiPSIgc2lnbi4KCiAgICAgICAgKiBOZXdHcm91cC5qc3Agd291bGQgb2NjYXNpb25hbGx5IHRocm93IE5QRXMgaWYgdGhlIGNvbnRleHQKICAgICAgICB3YXMgbnVsbCAtIGZpeGVkIGJ5IElDYW50UmVtZW1iZXJXaG9Bbnltb3JlQmVjYXVzZUlMb3N0VGhlRW1haWwuCiAgICAgICAgVGhhbmtzIGFueXdheSEKCjIwMDYtMDUtMDcgIEFuZHJldyBKYXF1aXRoIDxhbmRyZXcgQVQgZnJlc2hjb29raWVzIERPVCBvcmc+CgogICAgICAgICogMi40LjUKCiAgICAgICAgKiBBZGRlZCBhIG5ldyBKU1AgZm9yIHZlcmlmeWluZyBKU1BXaWtpJ3Mgc2VjdXJpdHkKICAgICAgICBjb25maWd1YXJ0aW9uLCBhZG1pbi9TZWN1cml0eUNvbmZpZy5qc3AuIFRoaXMgSlNQCiAgICAgICAgY29sbGFib3JhdGVzIHdpdGggYSBuZXcgY2xhc3MsIGMuZS5qLmF1dGguU2VjdXJpdHlWZXJpZmllci4KICAgICAgICBTZWN1cml0eUNvbmZpZyB3aWxsIHZlcmlmeSB0aGUgcHJlc2VuY2Ugb3IgYWJzZW5jZSBvZgogICAgICAgIHRoZSBKQUFTIGxvZ2luIGNvbmZpZyBmaWxlLCB0aGUgc2VjdXJpdHkgcG9saWN5IGZpbGUsCiAgICAgICAgYW5kIGNvbnRhaW5lci1tYW5hZ2VkIGF1dGggY29uc3RyYWludHMuIEl0IHdpbGwgYWxzbwogICAgICAgIHZhbGlkYXRlIHRoYXQgdGhlIGNvcnJlY3QgSkFBUyBsb2dpbiBjb25maWdhdGlvbnMgZXhpc3QsCiAgICAgICAgYW5kIHdpbGwgcHJpbnQgYSBzdW1tYXJ5IHRhYmxlIHNob3dpbmcgdGhlIHByaXZpbGVnZXMKICAgICAgICB0aGF0IGFwcGx5IHRvIGVhY2ggcm9sZS4gTXVjaCBuZWVkZWQsIGFuZCBzaG91bGQKICAgICAgICBoZWxwIGZvbGtzIGdldCB0aGVpciBzZWN1cml0eSB3b3JraW5nLgoKICAgICAgICAqIFRvIHN1cHBvcnQgdGhlIHNlY3VyaXR5IHZlcmlmaWVyLCBzbWFsbCAobm9uLXB1YmxpYykKICAgICAgICBjaGFuZ2VzIHdlcmUgbWFkZSB0byBXZWJDb250YWluZXJBdXRob3JpemVyLiBUaGlzIGNsYXNzCiAgICAgICAgYWxzbyBnYWlucyBhIG5ldyBwdWJsaWMgbWV0aG9kIGlzQ29uc3RyYWluZWQoU3RyaW5nLCBQcmluY2lwYWwpLgoKICAgICAgICAqIEJ1ZyBmaXg6IEF1dGhlbnRpY2F0aW9uTWFuYWdlcidzIG1ldGhvZCBvZiBmaW5kaW5nCiAgICAgICAgaXRzIEpBQVMgYW5kIHNlY3VyaXR5IHBvbGljeSBmaWxlcyBjaGFuZ2VkIHNvIHRoYXQKICAgICAgICBmdWxsIChhYnNvbHV0ZSkgcGF0Y2hzIGFyZSBkaXNjb3ZlcmVkLCByYXRoZXIgdGhhbgogICAgICAgIGxvY2FsIChKTkRJKSBwYXRocy4KCiAgICAgICAgKiBCdWcgZml4OiBzbWFsbCBjaGFuZ2UgdG8gZGVmYXVsdCBzZWN1cml0eSBwb2xpY3kgZmlsZQogICAgICAgIGpzcHdpa2kucG9saWN5LiBJdCBub3cgaW5jbHVkZXMgY29tbWFzIGJldHdlZW4gdGhlCiAgICAgICAgY29kZWJhc2UgYW5kIHByaW5jaXBhbCBlbnRyaWVzLCBhcyBpdCBzaG91bGQgaGF2ZS4KCiAgICAgICAgKiBBZGRlZCBhIHNtYWxsIHRoaXJkLXBhcnR5IHV0aWxpdHkgamFyIChteSBvd24pCiAgICAgICAgZm9yIHBhcnNpbmcgc2VjdXJpdHkgcG9saWN5IGZpbGVzLgoKMjAwNi0wNS0wNiAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjQuNAoKICAgICAgICAqIEFkZGVkIGFjdGl2YXRpb24uamFyIGFuZCBtYWlsLmphciB0byB0aGUgZGlzdHJpYnV0aW9uCgogICAgICAgICogQXV0aGVudGljYXRpb25NYW5hZ2VyIG5vdyBjb21wbGFpbnMgaWYgaXQgY2Fubm90CiAgICAgICAgbG9jYXRlIHRoZSBKQUFTIExvZ2luTWFuYWdlciBpbmZvcm1hdGlvbiwgaW5zdGVhZCBvZgogICAgICAgIGZhaWxpbmcgd2l0aCBOUEUuCgogICAgICAgICogUGFnZVBlcm1pc3Npb24uaGFzaENvZGUoKSBubyBsb25nZXIgZmFpbHMgd2l0aCBOUEUKICAgICAgICBpZiB3aWtpIGlzIG5vdCBzZXQgKG5vcm1hbGx5LCB0aG91Z2gsIHlvdSB3b3VsZCBuZXZlcgogICAgICAgIG5lZWQgaXQsIGJ1dCB0aGVyZSBhcmUgY2VydGFpbiBjYXNlcyB3aGVyZSB0aGlzIG1pZ2h0CiAgICAgICAgb2NjdXIpLgoKICAgICAgICAqIEFkZGVkIGEgZ3JlYXQgcGF0Y2ggZnJvbSBEYW4gRnJhbmtvd3NraSB3aGljaCBhbGxvd3MKICAgICAgICByZWNvdmVyeSBvZiBmb3Jnb3R0ZW4gcGFzc3dvcmRzISAgUGxlYXNlIHNlZSB5b3VyCiAgICAgICAganNwd2lraS5wcm9wZXJ0aWVzIGZvciBuZXcgU01UUCBvcHRpb25zLgoKICAgICAgICAqIEFkZGVkIHNlYXJjaCByZXN1bHRzIGZpbHRlcmluZyBiYXNlZCBvbiBwZXJtaXNzaW9ucywKICAgICAgICBpLmUuIHlvdSBubyBsb25nZXIgc2VlIHBhZ2VzIHRvIHdoaWNoIHlvdSBoYXZlIG5vCiAgICAgICAgYWNjZXNzIHRvLiAgUmVxdWVzdGVkIGJ5IG1hbnkgcGVvcGxlLgoKICAgICAgICAqIExvZ2luIGJ1dHRvbiBpcyBub3cgb24gaXRzIG93biBsaW5lIGluc3RlYWQgb2YgYmVpbmcKICAgICAgICBoaWRkZW4gaW4gdGhlIHJpZ2h0IGNvcm5lci4gIEhlbHBzIHRob3NlIHBlb3BsZSB3aG8KICAgICAgICBsaWtlIHRvICJodW50IGFuZCBjbGljayIgb24gdGhlIG1vdXNlLgoKMjAwNi0wNS0wMSAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjQuMwoKICAgICAgICAqIEFkZGVkIGZpeCBmcm9tIFJvbGYgU2NodW1hY2hlcjogbm8gbG9uZ2VyIG91dHB1dHMKICAgICAgICBwYXNzd29yZCB0byB0aGUgbG9nIGZpbGUgaW4gVG9tY2F0LiAgT29wcy4KCiAgICAgICAgKiBGaXhlZCBhIGZhaWxpbmcgdW5pdCB0ZXN0CgogICAgICAgICogYXRvbS5qc3AgaXMgbm93IGdvbmU7IHBsZWFzZSB1c2UgInJzcy5qc3A/dHlwZT1hdG9tIgoKICAgICAgICAqIEZpeGVkIFNlYXJjaEJveC5qc3AgaXNzdWUgcmVwb3J0ZWQgYnkgRGlyayBGcmVkZXJpY3guCgogICAgICAgICogRmVlZERpc2NvdmVyeVRhZyBzaG91bGQgbm93IG9mZmVyIEF0b20gMS4wIGZlZWRzLgoKICAgICAgICAqIFdlYmxvZ1BsdWdpbiBubyBsb25nZXIgY29uc2lkZXJzIGVtcHR5IGNvbW1lbnQgcGFnZXMKICAgICAgICBhcyAiMSBjb21tZW50Ii4KCjIwMDYtMDQtMzAgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi40LjIKCiAgICAgICAgKiBQYWdlIFJlbmFtZXIgZGlkIG5vdCB3cml0ZSB0aGUgYXV0aG9yIG5hbWUgcHJvcGVybHkgdG8KICAgICAgICBhbnkgcGFnZXMgdGhhdCB3ZXJlIGNoYW5nZWQgZHVlIHRvIHJlZmVycmVycyBjaGFuZ2luZy4KCiAgICAgICAgKiBQYWdlIFJlbmFtZXIgd291bGQgYWNjaWRlbnRhbGx5IGRvIGRvdWJsZS1lbmNvZGluZyBvZgogICAgICAgIFhIVE1MIGVudGl0aWVzLi4uICBZZXMsIHRoZXJlJ3MgYSBkaWZmZXJlbmNlIGJldHdlZW4KICAgICAgICBnZXRUZXh0KCkgYW5kIGdldFB1cmVUZXh0KCkuICBUaGFua3MgdG8gc3VvbWlnby5uZXQKICAgICAgICBjb21tdW5pdHkgZm9yIGZpbmRpbmcgdGhpcyBvbmUgb3V0LgoKICAgICAgICAqIFdpa2lFbmdpbmUucmVuYW1lUGFnZSgpIEFQSSBzaWduYXR1cmUgd2FzIGNoYW5nZWQKICAgICAgICBiZWNhdXNlIG9mIHRoaXMuLi4gSXQgbm93IHRha2VzIGEgV2lraUNvbnRleHQgYXMgd2VsbC4KCiAgICAgICAgKiBMb2dpbi5qc3AgZGlkIG5vdCB3cml0ZSBwcm9wZXIgY29udGVudCBlbmNvZGluZy4KCjIwMDYtMDQtMjYgIEphbm5lIEphbGthbmVuIDxqYWxrYW5lbkBlY3lyZC5jb20+CgogICAgICAgICogMi40LjEKCiAgICAgICAgKiBVcGRhdGVkIFJFQURNRS4KCiAgICAgICAgKiBTcGxpdCBvbGQgc3R1ZmYgZnJvbSBDaGFuZ2VMb2cgdG8gT2xkQ2hhbmdlTG9nCgogICAgICAgICogQWRkZWQgbWlzc2luZyBTZWFyY2hQYWdlSGVscAoKICAgICAgICAqIFBhZ2VBY3Rpb25zLmpzcCBub3cgY2hlY2tzIGlmIGxvZ2luIGlzIGFsbG93ZWQKCiAgICAgICAgKiBJbnN0YWxsLmpzcCBub3cgc2V0cyAianNwd2lraS5zZWN1cml0eT1jb250YWluZXIiIHRvIG1ha2UKICAgICAgICBmaXJzdC10aW1lIGluc3RhbGxzIGVhc2llci4KCiAgICAgICAgKiBBdXRob3JpemF0aW9uTWFuYWdlciByZXR1cm5zIG5vdyAiZmFsc2UiLCBpZiBzZWN1cml0eSBpcwogICAgICAgIHNldCB0byBjb250YWluZXIgYW5kIHlvdSBhc2sgZm9yIGxvZ2luIHBlcm1pc3Npb25zLiAgVGhpcwogICAgICAgIGRyb3BzIHRoZSAiTG9naW4iIGJ1dHRvbiBmcm9tIHRoZSBkaXNwbGF5LCBpZiBKU1BXaWtpIGlzCiAgICAgICAgbm90IG1hbmFnaW5nIGF1dGhlbnRpY2F0aW9uLCBmaXhpbmcgYW4gYW5ub3lhbmNlLgoKMjAwNi0wNC0yNSAgSmFubmUgSmFsa2FuZW4gPGphbGthbmVuQGVjeXJkLmNvbT4KCiAgICAgICAgKiAyLjQuMAoKICAgICAgICAqIFNlYXJjaFJlc3VsdHNJdGVyYXRvciBub3cgY2FuIHN0YXJ0IGZyb20gYSBnaXZlbiBwbGFjZQoKICAgICAgICAqIFlvdSBjYW4gbm93IHNlZSBhbGwgb2YgdGhlIHNlYXJjaCByZXN1bHRzIC0ganVzdCBjbGljayBvbgogICAgICAgICJuZXh0IDIwIHJlc3VsdHMiLgoKICAgICAgICAqIEluY2x1ZGVkIHBhdGNoIGZyb20gRGFuIEZyYW5rb3dza2kgdG8gc3VwcG9ydCByZXR1cm5pbmcKICAgICAgICBvZiBzZWFyY2ggZnJhZ21lbnRzLiAgVGhhbmtzIQoKICAgICAgICAqIFVwZ3JhZGVkIHRvIEx1Y2VuZSAxLjkuMQoKICAgICAgICAqIFJlbW92ZWQgc2xhc2ggZnJvbSBhbGxvd2VkIGNoYXJhY3RlcnMgaW4gd2lraXBhZ2UgLSB0aGF0IHdvdWxkCiAgICAgICAgY3JlYXRlIHBhZ2VzIHRoYXQgd2VyZSBpbXBvc3NpYmxlIHRvIGxpbmsgdG8uICBPb3BzISAgSXQgbXVzdCd2ZQogICAgICAgIGJlZW4gc29tZSBkZWJ1ZyBjb2RlIGxlZnQgaW4uLi4KCiAgICAgICAgKiBMaW5rVGFnIG5vdyByZW1vdmVzIGV4dHJhIHdoaXRlc3BhY2UgZnJvbSBsaW5rIHRleHQ7IHRoaXMgYWxsb3dzCiAgICAgICAgeW91IHRvIHVzZSBtdWx0aS1saW5lIDx3aWtpOlBhcmFtPiB0YWdzIHdpdGhvdXQgdGhlIHRleHQgYmVjb21pbmcKICAgICAgICB0b28gdW53aWVsZHkuLi4KCiAgICAgICAgKiBTZWFyY2ggbm93IGFsc28gc3VwcG9ydHMgR29vZ2xlLWxpa2UgImFyZSB5b3UgZmVlbGluZyBsdWNreSIKICAgICAgICAtZnVuY3Rpb25hbGl0eS4gIEp1c3QgY2xpY2sgb24gIkdvISIgaW4gdGhlIHNlYXJjaCBwYWdlLgoKICAgICAgICAqIFNlYXJjaCBoZWxwIGlzIG5vdyBvbiBhIHBhZ2UgY2FsbGVkICJTZWFyY2hQYWdlSGVscCIuCgogICAgICAgICogQWRkZWQgc3VwcG9ydCBmb3IgbGVmdC10by1yaWdodCBhbmQgcmlnaHQtdG8tbGVmdCBtYXJrdXAgd2l0aAogICAgICAgIHRoZSAlJWx0ciBhbmQgJSVydGwgZGVmYXVsdCBzdHlsZXMuICBZb3UgY2FuIGNvcHkgdGhlbSBmcm9tIHRoZQogICAgICAgICJqc3B3aWtpLmNzcyIgZmlsZS4KCiAgICAgICAgKiBNaW5vciBjbGVhbnVwcyB0byBidWlsZC54bWwuCgogICAgICAgICogQ2hlY2tMb2NrVGFnIHdvdWxkIGdldCBjb25mdXNlZCBpZiB0d28gcGVvcGxlIHdlcmUgdHJ5aW5nIHRvCiAgICAgICAgY3JlYXRlIGEgbm9uLWV4aXN0ZW50IHBhZ2UgYXQgdGhlIHNhbWUgdGltZS4gIFJlcG9ydGVkIGJ5CiAgICAgICAgTWFyayBSYXdsaW5ncy4K