R05VIG1ha2UgTkVXUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotaW5kZW50ZWQtdGV4dC0qLQogIEhpc3Rvcnkgb2YgdXNlci12aXNpYmxlIGNoYW5nZXMuCiAgMTAgSnVuZSAyMDE2CgpTZWUgdGhlIGVuZCBvZiB0aGlzIGZpbGUgZm9yIGNvcHlyaWdodHMgYW5kIGNvbmRpdGlvbnMuCgpBbGwgY2hhbmdlcyBtZW50aW9uZWQgaGVyZSBhcmUgbW9yZSBmdWxseSBkZXNjcmliZWQgaW4gdGhlIEdOVSBtYWtlCm1hbnVhbCwgd2hpY2ggaXMgY29udGFpbmVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGFzIHRoZSBmaWxlIGRvYy9tYWtlLnRleGkuClNlZSB0aGUgUkVBRE1FIGZpbGUgYW5kIHRoZSBHTlUgbWFrZSBtYW51YWwgZm9yIGluc3RydWN0aW9ucyBmb3IKcmVwb3J0aW5nIGJ1Z3MuCgwKVmVyc2lvbiA0LjIuOTAgKDI0IEp1biAyMDE2KQoKQSBjb21wbGV0ZSBsaXN0IG9mIGJ1Z3MgZml4ZWQgaW4gdGhpcyB2ZXJzaW9uIGlzIGF2YWlsYWJsZSBoZXJlOgoKaHR0cDovL3N2LmdudS5vcmcvYnVncy9pbmRleC5waHA/Z3JvdXA9bWFrZSZyZXBvcnRfaWQ9MTExJmZpeF9yZWxlYXNlX2lkPTEwOCZzZXQ9Y3VzdG9tCgoqIFRoZSBwcmV2aW91cyBsaW1pdCBvZiA2MyBqb2JzIHVuZGVyIC1qTiBvbiBNUy1XaW5kb3dzIGlzIG5vdwogIGluY3JlYXNlZCB0byA0MDk1LiAgVGhhdCBsaW1pdCBpbmNsdWRlcyB0aGUgc3VicHJvY2VzcyBzdGFydGVkIGJ5CiAgdGhlICQoc2hlbGwpIGZ1bmN0aW9uLgoKDApWZXJzaW9uIDQuMi4xICgxMCBKdW4gMjAxNikKCkEgY29tcGxldGUgbGlzdCBvZiBidWdzIGZpeGVkIGluIHRoaXMgdmVyc2lvbiBpcyBhdmFpbGFibGUgaGVyZToKCmh0dHA6Ly9zdi5nbnUub3JnL2J1Z3MvaW5kZXgucGhwP2dyb3VwPW1ha2UmcmVwb3J0X2lkPTExMSZmaXhfcmVsZWFzZV9pZD0xMDcmc2V0PWN1c3RvbQoKVGhpcyByZWxlYXNlIGlzIGEgYnVnLWZpeCByZWxlYXNlLgoKDApWZXJzaW9uIDQuMiAoMjIgTWF5IDIwMTYpCgpBIGNvbXBsZXRlIGxpc3Qgb2YgYnVncyBmaXhlZCBpbiB0aGlzIHZlcnNpb24gaXMgYXZhaWxhYmxlIGhlcmU6CgpodHRwOi8vc3YuZ251Lm9yZy9idWdzL2luZGV4LnBocD9ncm91cD1tYWtlJnJlcG9ydF9pZD0xMTEmZml4X3JlbGVhc2VfaWQ9MTA2JnNldD1jdXN0b20KCiogTmV3IHZhcmlhYmxlOiAkKC5TSEVMTFNUQVRVUykgaXMgc2V0IHRvIHRoZSBleGl0IHN0YXR1cyBvZiB0aGUgbGFzdCAhPSBvcgogICQoc2hlbGwgLi4uKSBmdW5jdGlvbiBpbnZva2VkIGluIHRoaXMgaW5zdGFuY2Ugb2YgbWFrZS4gIFRoaXMgd2lsbCBiZSAiMCIgaWYKICBzdWNjZXNzZnVsIG9yIG5vdCAiMCIgaWYgbm90IHN1Y2Nlc3NmdWwuICBUaGUgdmFyaWFibGUgdmFsdWUgaXMgdW5zZXQgaWYgbm8KICAhPSBvciAkKHNoZWxsIC4uLikgZnVuY3Rpb24gaGFzIGJlZW4gaW52b2tlZC4KCiogVGhlICQoZmlsZSAuLi4pIGZ1bmN0aW9uIGNhbiBub3cgcmVhZCBmcm9tIGEgZmlsZSB3aXRoICQoZmlsZSA8RklMRSkuCiAgVGhlIGZ1bmN0aW9uIGlzIGV4cGFuZGVkIHRvIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZS4gIFRoZSBjb250ZW50cyBhcmUKICBleHBhbmRlZCB2ZXJiYXRpbSBleGNlcHQgdGhhdCB0aGUgZmluYWwgbmV3bGluZSwgaWYgYW55LCBpcyBzdHJpcHBlZC4KCiogVGhlIG1ha2VmaWxlIGxpbmUgbnVtYmVycyBzaG93biBieSBHTlUgbWFrZSBub3cgcG9pbnQgZGlyZWN0bHkgdG8gdGhlCiAgc3BlY2lmaWMgbGluZSBpbiB0aGUgcmVjaXBlIHdoZXJlIHRoZSBmYWlsdXJlIG9yIHdhcm5pbmcgb2NjdXJyZWQuCiAgU2FtcGxlIGNoYW5nZXMgc3VnZ2VzdGVkIGJ5IEJyaWFuIFZhbmRlbmJlcmcgPHBoYW50YWxsQGdtYWlsLmNvbT4KCiogVGhlIGludGVyZmFjZSB0byBHTlUgbWFrZSdzICJqb2JzZXJ2ZXIiIGlzIHN0YWJsZSBhcyBkb2N1bWVudGVkIGluIHRoZQogIG1hbnVhbCwgZm9yIHRvb2xzIHdoaWNoIG1heSB3YW50IHRvIGFjY2VzcyBpdC4KCiAgV0FSTklORzogQmFja3dhcmQtaW5jb21wYXRpYmlsaXR5ISBUaGUgaW50ZXJuYWwtb25seSBjb21tYW5kIGxpbmUgb3B0aW9uCiAgLS1qb2JzZXJ2ZXItZmRzIGhhcyBiZWVuIHJlbmFtZWQgZm9yIHB1Ymxpc2hpbmcsIHRvIC0tam9ic2VydmVyLWF1dGguCgoqIFRoZSBhbW91bnQgb2YgcGFyYWxsZWxpc20gY2FuIGJlIGRldGVybWluZWQgYnkgcXVlcnlpbmcgTUFLRUZMQUdTLCBldmVuIHdoZW4KICB0aGUgam9iIHNlcnZlciBpcyBlbmFibGVkIChwcmV2aW91c2x5IE1BS0VGTEFHUyB3b3VsZCBhbHdheXMgY29udGFpbiBvbmx5CiAgIi1qIiwgd2l0aCBubyBudW1iZXIsIHdoZW4gam9iIHNlcnZlciB3YXMgZW5hYmxlZCkuCgoqIFZNUy1zcGVjaWZpYyBjaGFuZ2VzOgoKICAqIFBlcmwgdGVzdCBoYXJuZXNzIG5vdyB3b3Jrcy4KCiAgKiBGdWxsIHN1cHBvcnQgZm9yIGNvbnZlcnRpbmcgVW5peCBleGl0IHN0YXR1cyBjb2RlcyB0byBWTVMgZXhpdCBzdGF0dXMKICAgIGNvZGVzLiAgQkFDS1dBUkQgSU5DT01QQVRJQklMSVRZIE5vdGljZTogT24gYSBjaGlsZCBmYWlsdXJlIHRoZSBWTVMgZXhpdAogICAgY29kZSBpcyBub3cgdGhlIGVuY29kZWQgVW5peCBleGl0IHN0YXR1cyB0aGF0IE1ha2UgdXN1YWxseSBnZW5lcmF0ZXMsIG5vdAogICAgdGhlIFZNUyBleGl0IHN0YXR1cyBvZiB0aGUgY2hpbGQuCgoMClZlcnNpb24gNC4xICgwNSBPY3QgMjAxNCkKCkEgY29tcGxldGUgbGlzdCBvZiBidWdzIGZpeGVkIGluIHRoaXMgdmVyc2lvbiBpcyBhdmFpbGFibGUgaGVyZToKCmh0dHA6Ly9zdi5nbnUub3JnL2J1Z3MvaW5kZXgucGhwP2dyb3VwPW1ha2UmcmVwb3J0X2lkPTExMSZmaXhfcmVsZWFzZV9pZD0xMDUmc2V0PWN1c3RvbQoKKiBOZXcgdmFyaWFibGVzOiAkKE1BS0VfVEVSTU9VVCkgYW5kICQoTUFLRV9URVJNRVJSKSBhcmUgc2V0IHRvIG5vbi1lbXB0eQogIHZhbHVlcyBpZiBzdGRvdXQgb3Igc3RkZXJyLCByZXNwZWN0aXZlbHksIGFyZSBiZWxpZXZlZCB0byBiZSB3cml0aW5nIHRvIGEKICB0ZXJtaW5hbC4gIFRoZXNlIHZhcmlhYmxlcyBhcmUgZXhwb3J0ZWQgYnkgZGVmYXVsdC4KCiogQWxsb3cgYSBuby10ZXh0LWFyZ3VtZW50IGZvcm0gb2YgdGhlICQoZmlsZSAuLi4pIGZ1bmN0aW9uLiAgV2l0aG91dCBhIHRleHQKICBhcmd1bWVudCBub3RoaW5nIGlzIHdyaXR0ZW4gdG8gdGhlIGZpbGU6IGl0IGlzIHNpbXBseSBvcGVuZWQgaW4gdGhlCiAgcmVxdWVzdGVkIG1vZGUsIHRoZW4gY2xvc2VkIGFnYWluLgoKKiBDaGFuZ2UgdGhlIGZhdGFsIGVycm9yIGZvciBtaXhlZCBleHBsaWNpdCBhbmQgaW1wbGljaXQgcnVsZXMsIHRoYXQgd2FzCiAgaW50cm9kdWNlZCBpbiBHTlUgbWFrZSAzLjgyLCB0byBhIG5vbi1mYXRhbCBlcnJvci4gIEhvd2V2ZXIsIHRoaXMgc3ludGF4IGlzCiAgc3RpbGwgZGVwcmVjYXRlZCBhbmQgbWF5IHJldHVybiB0byBiZWluZyBpbGxlZ2FsIGluIGEgZnV0dXJlIHZlcnNpb24gb2YgR05VCiAgbWFrZS4gIE1ha2VmaWxlcyB0aGF0IHJlbHkgb24gdGhpcyBzeW50YXggc2hvdWxkIGJlIGZpeGVkLgogIFNlZSBodHRwczovL3NhdmFubmFoLmdudS5vcmcvYnVncy8/MzMwMzQKCiogVk1TLXNwZWNpZmljIGNoYW5nZXM6CgogICogU3VwcG9ydCBmb3IgbGlicmFyeSBmaWxlcyBhZGRlZCwgaW5jbHVkaW5nIHN1cHBvcnQgZm9yIHVzaW5nIHRoZSBHTlYgYXIKICAgIHV0aWxpdHkuCgogICogUGFydGlhbCBzdXBwb3J0IGZvciBwcm9wZXJseSBlbmNvZGluZyBVbml4IGV4aXQgc3RhdHVzIGNvZGVzIGludG8gVk1TIGV4aXQKICAgIHN0YXR1cyBjb2Rlcy4KCiAgICBXQVJOSU5HOiBCYWNrd2FyZC1pbmNvbXBhdGliaWxpdHkhIFRoZXNlIGFyZSBkaWZmZXJlbnQgZXhpdCBzdGF0dXMgY29kZXMKICAgIHRoYW4gTWFrZSBleGl0ZWQgd2l0aCBpbiB0aGUgcGFzdC4KCiAgKiBNYWNyb3MgdG8gaG9sZCB0aGUgY3VycmVudCBtYWtlIGNvbW1hbmQgYXJlIHNldCB1cCB0byB0cmFuc2xhdGUgdGhlCiAgICBhcmd2WzBdIHN0cmluZyB0byBhIFZNUyBmb3JtYXQgcGF0aCBuYW1lIGFuZCBwcmVmaXggaXQgd2l0aCAiTUNSICIgc28gdGhhdAogICAgdGhlIG1hY3JvIGhhcyBhIHNwYWNlIGluIGl0LgoKICAgIFdBUk5JTkc6IEJhY2t3YXJkLWluY29tcGF0aWJpbGl0eSEgIFRoaXMgbWF5IGJyZWFrIGNvbXBsZXggbWFrZWZpbGVzIHRoYXQKICAgIGRvIHByb2Nlc3Npbmcgb24gdGhvc2UgbWFjcm9zLiAgVGhpcyBpcyB1bmxpa2VseSBiZWNhdXNlIHNvIG11Y2ggaW4gdGhhdAogICAgYXJlYSB3YXMgbm90IGFuZCBpcyBzdGlsbCBub3QgY3VycmVudGx5IHdvcmtpbmcgb24gVk1TLCBpdCBpcyB1bmxpa2VseSB0bwogICAgZmluZCBzdWNoIGEgY29tcGxleCBtYWtlZmlsZSwgc28gdGhpcyBpcyBtb3JlIGxpa2VseSB0byBpbXBhY3QKICAgIGNvbnN0cnVjdGlvbiBvZiBhIGZ1dHVyZSBtYWtlZmlsZS4KCiAgKiBBIGNvbW1hbmQgZmlsZSBpcyBhbHdheXMgdXNlZCB0byBydW4gdGhlIGNvbW1hbmRzIGZvciBhIHJlY2lwZS4KCiAgICBXQVJOSU5HOiBCYWNrd2FyZC1pbmNvbXBhdGliaWxpdHkhICBSdW5uaW5nIHRoZSBtYWtlIHNlbGYgdGVzdHMgaGFzCiAgICBleHBvc2VkIHRoYXQgdGhlcmUgYXJlIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGluIGJlaGF2aW9yIHdoZW4gcnVubmluZwogICAgd2l0aCB0aGUgY29tbWFuZCBmaWxlIG1vZGUuICBJdCBpcyB1bmtub3duIGlmIHRoaXMgd2lsbCBiZSBub3RpY2VkIGJ5IG1vc3QKICAgIGV4aXN0aW5nIFZNUyBtYWtlZmlsZXMuCgwKVmVyc2lvbiA0LjAgKDA5IE9jdCAyMDEzKQoKQSBjb21wbGV0ZSBsaXN0IG9mIGJ1Z3MgZml4ZWQgaW4gdGhpcyB2ZXJzaW9uIGlzIGF2YWlsYWJsZSBoZXJlOgoKaHR0cDovL3N2LmdudS5vcmcvYnVncy9pbmRleC5waHA/Z3JvdXA9bWFrZSZyZXBvcnRfaWQ9MTExJmZpeF9yZWxlYXNlX2lkPTEwMSZzZXQ9Y3VzdG9tCgoqIFdBUk5JTkc6IEJhY2t3YXJkLWluY29tcGF0aWJpbGl0eSEKICBJZiAuUE9TSVggaXMgc3BlY2lmaWVkLCB0aGVuIG1ha2UgYWRoZXJlcyB0byB0aGUgUE9TSVggYmFja3NsYXNoL25ld2xpbmUKICBoYW5kbGluZyByZXF1aXJlbWVudHMsIHdoaWNoIGludHJvZHVjZXMgdGhlIGZvbGxvd2luZyBjaGFuZ2VzIHRvIHRoZQogIHN0YW5kYXJkIGJhY2tzbGFzaC9uZXdsaW5lIGhhbmRsaW5nIGluIG5vbi1yZWNpcGUgbGluZXM6CiAgKiBBbnkgdHJhaWxpbmcgc3BhY2UgYmVmb3JlIHRoZSBiYWNrc2xhc2ggaXMgcHJlc2VydmVkCiAgKiBFYWNoIGJhY2tzbGFzaC9uZXdsaW5lIChwbHVzIHN1YnNlcXVlbnQgd2hpdGVzcGFjZSkgaXMgY29udmVydGVkIHRvIGEKICAgIHNpbmdsZSBzcGFjZQoKKiBOZXcgZmVhdHVyZTogR05VIEd1aWxlIGludGVncmF0aW9uCiAgVGhpcyB2ZXJzaW9uIG9mIEdOVSBtYWtlIGNhbiBiZSBjb21waWxlZCB3aXRoIEdOVSBHdWlsZSBpbnRlZ3JhdGlvbi4KICBHTlUgR3VpbGUgc2VydmVzIGFzIGFuIGVtYmVkZGVkIGV4dGVuc2lvbiBsYW5ndWFnZSBmb3IgbWFrZS4KICBTZWUgdGhlICJHdWlsZSBGdW5jdGlvbiIgc2VjdGlvbiBpbiB0aGUgR05VIE1ha2UgbWFudWFsIGZvciBkZXRhaWxzLgogIEN1cnJlbnRseSBHTlUgR3VpbGUgMS44IGFuZCAyLjArIGFyZSBzdXBwb3J0ZWQuICBJbiBHdWlsZSAxLjggdGhlcmUgaXMgbm8KICBzdXBwb3J0IGZvciBpbnRlcm5hdGlvbmFsaXplZCBjaGFyYWN0ZXIgc2V0cy4gIEluIEd1aWxlIDIuMCssIHNjcmlwdHMgY2FuIGJlCiAgZW5jb2RlZCBpbiBVVEYtOC4KCiogTmV3IGNvbW1hbmQgbGluZSBvcHRpb246IC0tb3V0cHV0LXN5bmMgKC1PKSBlbmFibGVzIGdyb3VwaW5nIG9mIG91dHB1dCBieQogIHRhcmdldCBvciBieSByZWN1cnNpdmUgbWFrZS4gIFRoaXMgaXMgdXNlZnVsIGR1cmluZyBwYXJhbGxlbCBidWlsZHMgdG8gYXZvaWQKICBtaXhpbmcgb3V0cHV0IGZyb20gZGlmZmVyZW50IGpvYnMgdG9nZXRoZXIgZ2l2aW5nIGhhcmQtdG8tdW5kZXJzdGFuZAogIHJlc3VsdHMuICBPcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBieSBEYXZpZCBCb3ljZSA8ZHNiQGJveXNraS5jb20+LgogIFJld29ya2VkIGFuZCBlbmhhbmNlZCBieSBGcmFuayBIZWNrZW5iYWNoIDxmLmhlY2tlbmJhY2hAZmgtc29mdC5kZT4uCiAgV2luZG93cyBzdXBwb3J0IGJ5IEVsaSBaYXJldHNraWkgPGVsaXpAZ251Lm9yZz4uCgoqIE5ldyBjb21tYW5kIGxpbmUgb3B0aW9uOiAtLXRyYWNlIGVuYWJsZXMgdHJhY2luZyBvZiB0YXJnZXRzLiAgV2hlbiBlbmFibGVkCiAgdGhlIHJlY2lwZSB0byBiZSBpbnZva2VkIGlzIHByaW50ZWQgZXZlbiBpZiBpdCB3b3VsZCBvdGhlcndpc2UgYmUgc3VwcHJlc3NlZAogIGJ5IC5TSUxFTlQgb3IgYSAiQCIgcHJlZml4IGNoYXJhY3Rlci4gIEFsc28gYmVmb3JlIGVhY2ggcmVjaXBlIGlzIHJ1biB0aGUKICBtYWtlZmlsZSBuYW1lIGFuZCBsaW5lbnVtYmVyIHdoZXJlIGl0IHdhcyBkZWZpbmVkIGFyZSBzaG93biBhcyB3ZWxsIGFzIHRoZQogIHByZXJlcXVpc2l0ZXMgdGhhdCBjYXVzZWQgdGhlIHRhcmdldCB0byBiZSBjb25zaWRlcmVkIG91dCBvZiBkYXRlLgoKKiBOZXcgY29tbWFuZCBsaW5lIG9wdGlvbiBhcmd1bWVudDogLS1kZWJ1ZyBub3cgYWNjZXB0cyBhICJuIiAobm9uZSkgZmxhZwogIHdoaWNoIGRpc2FibGVzIGFsbCBkZWJ1Z2dpbmcgc2V0dGluZ3MgdGhhdCBhcmUgY3VycmVudGx5IGVuYWJsZWQuCgoqIE5ldyBmZWF0dXJlOiBUaGUgImpvYiBzZXJ2ZXIiIGNhcGFiaWxpdHkgaXMgbm93IHN1cHBvcnRlZCBvbiBXaW5kb3dzLgogIEltcGxlbWVudGF0aW9uIGNvbnRyaWJ1dGVkIGJ5IFRyb3kgUnVua2VsIDxUcm95LlJ1bmtlbEBtYXRod29ya3MuY29tPgoKKiBOZXcgZmVhdHVyZTogVGhlIC5PTkVTSEVMTCBjYXBhYmlsaXR5IGlzIG5vdyBzdXBwb3J0ZWQgb24gV2luZG93cy4gIFN1cHBvcnQKICBhZGRlZCBieSBFbGkgWmFyZXRza2lpIDxlbGl6QGdudS5vcmc+LgoKKiBOZXcgZmVhdHVyZTogIiE9IiBzaGVsbCBhc3NpZ25tZW50IG9wZXJhdG9yIGFzIGFuIGFsdGVybmF0aXZlIHRvIHRoZQogICQoc2hlbGwgLi4uKSBmdW5jdGlvbi4gIEltcGxlbWVudGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggQlNEIG1ha2VmaWxlcy4KICBOb3RlIHRoZXJlIGFyZSBzdWJ0bGUgZGlmZmVyZW5jZXMgYmV0d2VlbiAiIT0iIGFuZCAkKHNoZWxsIC4uLikuICBTZWUgdGhlCiAgZGVzY3JpcHRpb24gaW4gdGhlIEdOVSBtYWtlIG1hbnVhbC4KICBXQVJOSU5HOiBCYWNrd2FyZC1pbmNvbXBhdGliaWxpdHkhCiAgVmFyaWFibGVzIGVuZGluZyBpbiAiISIgcHJldmlvdXNseSBkZWZpbmVkIGFzICJ2YXJpYWJsZSE9IHZhbHVlIiB3aWxsIG5vdyBiZQogIGludGVycHJldGVkIGFzIHNoZWxsIGFzc2lnbm1lbnQuICBDaGFuZ2UgeW91ciBhc3NpZ25tZW50IHRvIGFkZCB3aGl0ZXNwYWNlCiAgYmV0d2VlbiB0aGUgIiEiIGFuZCAiPSI6ICJ2YXJpYWJsZSEgPSB2YWx1ZSIKCiogTmV3IGZlYXR1cmU6ICI6Oj0iIHNpbXBsZSBhc3NpZ25tZW50IG9wZXJhdG9yIGFzIGRlZmluZWQgYnkgUE9TSVggaW4gMjAxMi4KICBUaGlzIG9wZXJhdG9yIGhhcyBpZGVudGljYWwgZnVuY3Rpb25hbGl0eSB0byAiOj0iIGluIEdOVSBtYWtlLCBidXQgd2lsbCBiZQogIHBvcnRhYmxlIHRvIGFueSBpbXBsZW1lbnRhdGlvbiBvZiBtYWtlIGNvbmZvcm1pbmcgdG8gYSBzdWZmaWNpZW50bHkgbmV3CiAgdmVyc2lvbiBvZiBQT1NJWCAoc2VlIGh0dHA6Ly9hdXN0aW5ncm91cGJ1Z3MubmV0L3ZpZXcucGhwP2lkPTMzMCkuICBJdCBpcwogIG5vdCBuZWNlc3NhcnkgdG8gZGVmaW5lIHRoZSAuUE9TSVggdGFyZ2V0IHRvIGFjY2VzcyB0aGlzIG9wZXJhdG9yLgoKKiBOZXcgZmVhdHVyZTogTG9hZGFibGUgb2JqZWN0cwogIFRoaXMgdmVyc2lvbiBvZiBHTlUgbWFrZSBjb250YWlucyBhICJ0ZWNobm9sb2d5IHByZXZpZXciOiB0aGUgYWJpbGl0eSB0bwogIGxvYWQgZHluYW1pYyBvYmplY3RzIGludG8gdGhlIG1ha2UgcnVudGltZS4gIFRoZXNlIG9iamVjdHMgY2FuIGJlIGNyZWF0ZWQgYnkKICB0aGUgdXNlciBhbmQgY2FuIGFkZCBleHRlbmRlZCBmdW5jdGlvbmFsaXR5LCB1c2FibGUgYnkgbWFrZWZpbGVzLgoKKiBOZXcgZnVuY3Rpb246ICQoZmlsZSAuLi4pIHdyaXRlcyB0byBhIGZpbGUuCgoqIE5ldyB2YXJpYWJsZTogJChHTlVNQUtFRkxBR1MpIHdpbGwgYmUgcGFyc2VkIGZvciBtYWtlIGZsYWdzLCBqdXN0IGxpa2UKICBNQUtFRkxBR1MgaXMuICBJdCBjYW4gYmUgc2V0IGluIHRoZSBlbnZpcm9ubWVudCBvciB0aGUgbWFrZWZpbGUsIGNvbnRhaW5pbmcKICBHTlUgbWFrZS1zcGVjaWZpYyBmbGFncyB0byBhbGxvdyB5b3VyIG1ha2VmaWxlIHRvIGJlIHBvcnRhYmxlIHRvIG90aGVyCiAgdmVyc2lvbnMgb2YgbWFrZS4gIE9uY2UgdGhpcyB2YXJpYWJsZSBpcyBwYXJzZWQsIEdOVSBtYWtlIHdpbGwgc2V0IGl0IHRvIHRoZQogIGVtcHR5IHN0cmluZyBzbyB0aGF0IGZsYWdzIHdpbGwgbm90IGJlIGR1cGxpY2F0ZWQgb24gcmVjdXJzaW9uLgoKKiBOZXcgdmFyaWFibGU6IGBNQUtFX0hPU1QnIGdpdmVzIHRoZSBuYW1lIG9mIHRoZSBob3N0IGFyY2hpdGVjdHVyZQogIG1ha2Ugd2FzIGNvbXBpbGVkIGZvci4gIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgeW91IHNlZSBhZnRlciAnQnVpbHQgZm9yJwogIHdoZW4gcnVubmluZyAnbWFrZSAtLXZlcnNpb24nLgoKKiBCZWhhdmlvciBvZiBNQUtFRkxBR1MgYW5kIE1GTEFHUyBpcyBtb3JlIHJpZ29yb3VzbHkgZGVmaW5lZC4gIEFsbCBzaW1wbGUKICBmbGFncyBhcmUgZ3JvdXBlZCB0b2dldGhlciBpbiB0aGUgZmlyc3Qgd29yZCBvZiBNQUtFRkxBR1MuICBObyBvcHRpb25zIHRoYXQKICBhY2NlcHQgYXJndW1lbnRzIGFwcGVhciBpbiB0aGUgZmlyc3Qgd29yZC4gIElmIG5vIHNpbXBsZSBmbGFncyBhcmUgcHJlc2VudAogIE1BS0VGTEFHUyBiZWdpbnMgd2l0aCBhIHNwYWNlLiAgRmxhZ3Mgd2l0aCBib3RoIHNob3J0IGFuZCBsb25nIHZlcnNpb25zCiAgYWx3YXlzIHVzZSB0aGUgc2hvcnQgdmVyc2lvbnMgaW4gTUFLRUZMQUdTLiAgRmxhZ3MgYXJlIGxpc3RlZCBpbgogIGFscGhhYmV0aWNhbCBvcmRlciB1c2luZyBBU0NJSSBvcmRlcmluZy4gIE1GTEFHUyBuZXZlciBiZWdpbnMgd2l0aCAiLSAiLgoKKiBTZXR0aW5nIHRoZSAtciBhbmQgLVIgb3B0aW9ucyBpbiBNQUtFRkxBR1MgaW5zaWRlIGEgbWFrZWZpbGUgbm93IHdvcmtzIGFzCiAgZXhwZWN0ZWQsIHJlbW92aW5nIGFsbCBidWlsdC1pbiBydWxlcyBhbmQgdmFyaWFibGVzLCByZXNwZWN0aXZlbHkuCgoqIElmIGEgcmVjaXBlIGZhaWxzLCB0aGUgbWFrZWZpbGUgbmFtZSBhbmQgbGluZW51bWJlciBvZiB0aGUgcmVjaXBlIGFyZSBzaG93bi4KCiogQSAuUkVDSVBFUFJFRklYIHNldHRpbmcgaXMgcmVtZW1iZXJlZCBwZXItcmVjaXBlIGFuZCB2YXJpYWJsZXMgZXhwYW5kZWQKICBpbiB0aGF0IHJlY2lwZSBhbHNvIHVzZSB0aGF0IHJlY2lwZSBwcmVmaXggc2V0dGluZy4KCiogSW4gLXAgb3V0cHV0LCAuUkVDSVBFUFJFRklYIHNldHRpbmdzIGFyZSBzaG93biBhbmQgYWxsIHRhcmdldC1zcGVjaWZpYwogIHZhcmlhYmxlcyBhcmUgb3V0cHV0IGFzIGlmIGluIGEgbWFrZWZpbGUsIGluc3RlYWQgb2YgYXMgY29tbWVudHMuCgoqIE9uIE1TLVdpbmRvd3MsIHJlY2lwZXMgdGhhdCB1c2UgIi4uIiBxdW90aW5nIHdpbGwgbm8gbG9uZ2VyIGZvcmNlCiAgaW52b2NhdGlvbiBvZiBjb21tYW5kcyB2aWEgdGVtcG9yYXJ5IGJhdGNoIGZpbGVzIGFuZCBzdG9jayBXaW5kb3dzCiAgc2hlbGxzLCB0aGV5IHdpbGwgYmUgc2hvcnQtY2lyY3VpdGVkIGFuZCBpbnZva2VkIGRpcmVjdGx5LiAgKEluCiAgb3RoZXIgd29yZHMsICIgaXMgbm8gbG9uZ2VyIGEgc3BlY2lhbCBjaGFyYWN0ZXIgZm9yIHN0b2NrIFdpbmRvd3MKICBzaGVsbHMuKSAgVGhpcyBhdm9pZHMgaGl0dGluZyBzaGVsbCBsaW1pdHMgZm9yIGNvbW1hbmQgbGVuZ3RoIHdoZW4KICBxdW90ZXMgYXJlIHVzZWQsIGJ1dCBub3RoaW5nIGVsc2UgaW4gdGhlIGNvbW1hbmQgcmVxdWlyZXMgdGhlIHNoZWxsLgogIFRoaXMgY2hhbmdlIGNvdWxkIHBvdGVudGlhbGx5IG1lYW4gc29tZSBtaW5vciBpbmNvbXBhdGliaWxpdGllcyBpbgogIGJlaGF2aW9yIHdoZW4gdGhlIHJlY2lwZSB1c2VzIHF1b3RlZCBzdHJpbmcgb24gc2hlbGwgY29tbWFuZCBsaW5lcy4KCgwKVmVyc2lvbiAzLjgyICgyOCBKdWwgMjAxMCkKCkEgY29tcGxldGUgbGlzdCBvZiBidWdzIGZpeGVkIGluIHRoaXMgdmVyc2lvbiBpcyBhdmFpbGFibGUgaGVyZToKCmh0dHA6Ly9zdi5nbnUub3JnL2J1Z3MvaW5kZXgucGhwP2dyb3VwPW1ha2UmcmVwb3J0X2lkPTExMSZmaXhfcmVsZWFzZV9pZD0xMDQmc2V0PWN1c3RvbQoKKiBDb21waWxpbmcgR05VIG1ha2Ugbm93IHJlcXVpcmVzIGEgY29uZm9ybWluZyBJU08gQyAxOTg5IGNvbXBpbGVyIGFuZAogIHN0YW5kYXJkIHJ1bnRpbWUgbGlicmFyeS4KCiogV0FSTklORzogQmFja3dhcmQtaW5jb21wYXRpYmlsaXR5IQogIFRoZSBQT1NJWCBzdGFuZGFyZCBmb3IgbWFrZSB3YXMgY2hhbmdlZCBpbiB0aGUgMjAwOCB2ZXJzaW9uIGluIGEKICBmdW5kYW1lbnRhbGx5IGluY29tcGF0aWJsZSB3YXk6IG1ha2UgaXMgcmVxdWlyZWQgdG8gaW52b2tlIHRoZSBzaGVsbCBhcyBpZgogIHRoZSAnLWUnIGZsYWcgd2VyZSBwcm92aWRlZC4gIEJlY2F1c2UgdGhpcyB3b3VsZCBicmVhayBtYW55IG1ha2VmaWxlcyB0aGF0CiAgaGF2ZSBiZWVuIHdyaXR0ZW4gdG8gY29uZm9ybSB0byB0aGUgb3JpZ2luYWwgdGV4dCBvZiB0aGUgc3RhbmRhcmQsIHRoZQogIGRlZmF1bHQgYmVoYXZpb3Igb2YgR05VIG1ha2UgcmVtYWlucyB0byBpbnZva2UgdGhlIHNoZWxsIHdpdGggc2ltcGx5ICctYycuCiAgSG93ZXZlciwgYW55IG1ha2VmaWxlIHNwZWNpZnlpbmcgdGhlIC5QT1NJWCBzcGVjaWFsIHRhcmdldCB3aWxsIGZvbGxvdyB0aGUKICBuZXcgUE9TSVggc3RhbmRhcmQgYW5kIHBhc3MgJy1lJyB0byB0aGUgc2hlbGwuICBTZWUgYWxzbyAuU0hFTExGTEFHUwogIGJlbG93LgoKKiBXQVJOSU5HOiBCYWNrd2FyZC1pbmNvbXBhdGliaWxpdHkhCiAgVGhlICckPycgdmFyaWFibGUgbm93IGNvbnRhaW5zIGFsbCBwcmVyZXF1aXNpdGVzIHRoYXQgY2F1c2VkIHRoZSB0YXJnZXQgdG8KICBiZSBjb25zaWRlcmVkIG91dCBvZiBkYXRlLCBldmVuIGlmIHRoZXkgZG8gbm90IGV4aXN0IChwcmV2aW91c2x5IG9ubHkKICBleGlzdGluZyB0YXJnZXRzIHdlcmUgcHJvdmlkZWQgaW4gJD8pLgoKKiBXQVJOSU5HOiBCYWNrd2FyZC1pbmNvbXBhdGliaWxpdHkhCiAgV2lsZGNhcmRzIHdlcmUgbm90IGRvY3VtZW50ZWQgYXMgcmV0dXJuaW5nIHNvcnRlZCB2YWx1ZXMsIGJ1dCB0aGUgcmVzdWx0cwogIGhhdmUgYmVlbiBzb3J0ZWQgdXAgdW50aWwgdGhpcyByZWxlYXNlLi4gIElmIHlvdXIgbWFrZWZpbGVzIHJlcXVpcmUgc29ydGVkCiAgcmVzdWx0cyBmcm9tIHdpbGRjYXJkIGV4cGFuc2lvbnMsIHVzZSB0aGUgJChzb3J0IC4uLikgIGZ1bmN0aW9uIHRvIHJlcXVlc3QKICBpdCBleHBsaWNpdGx5LgoKKiBXQVJOSU5HOiBCYWNrd2FyZC1pbmNvbXBhdGliaWxpdHkhCiAgQXMgYSByZXN1bHQgb2YgcGFyc2VyIGVuaGFuY2VtZW50cywgdGhyZWUgYmFja3dhcmQtY29tcGF0aWJpbGl0eSBpc3N1ZXMKICBleGlzdDogZmlyc3QsIGEgcHJlcmVxdWlzaXRlIGNvbnRhaW5pbmcgYW4gIj0iIGNhbm5vdCBiZSBlc2NhcGVkIHdpdGggYQogIGJhY2tzbGFzaCBhbnkgbG9uZ2VyLiAgWW91IG11c3QgY3JlYXRlIGEgdmFyaWFibGUgY29udGFpbmluZyBhbiAiPSIgYW5kCiAgdXNlIHRoYXQgdmFyaWFibGUgaW4gdGhlIHByZXJlcXVpc2l0ZS4gIFNlY29uZCwgdmFyaWFibGUgbmFtZXMgY2FuIG5vCiAgbG9uZ2VyIGNvbnRhaW4gd2hpdGVzcGFjZSwgdW5sZXNzIHlvdSBwdXQgdGhlIHdoaXRlc3BhY2UgaW4gYSB2YXJpYWJsZSBhbmQKICB1c2UgdGhlIHZhcmlhYmxlLiAgVGhpcmQsIGluIHByZXZpb3VzIHZlcnNpb25zIG9mIG1ha2UgaXQgd2FzIHNvbWV0aW1lcwogIG5vdCBmbGFnZ2VkIGFzIGFuIGVycm9yIGZvciBleHBsaWNpdCBhbmQgcGF0dGVybiB0YXJnZXRzIHRvIGFwcGVhciBpbiB0aGUKICBzYW1lIHJ1bGUuICBOb3cgdGhpcyBpcyBhbHdheXMgcmVwb3J0ZWQgYXMgYW4gZXJyb3IuCgoqIFdBUk5JTkc6IEJhY2t3YXJkLWluY29tcGF0aWJpbGl0eSEKICBUaGUgcGF0dGVybi1zcGVjaWZpYyB2YXJpYWJsZXMgYW5kIHBhdHRlcm4gcnVsZXMgYXJlIG5vdyBhcHBsaWVkIGluIHRoZQogIHNob3J0ZXN0IHN0ZW0gZmlyc3Qgb3JkZXIgaW5zdGVhZCBvZiB0aGUgZGVmaW5pdGlvbiBvcmRlciAodmFyaWFibGVzCiAgYW5kIHJ1bGVzIHdpdGggdGhlIHNhbWUgc3RlbSBsZW5ndGggYXJlIHN0aWxsIGFwcGxpZWQgaW4gdGhlIGRlZmluaXRpb24KICBvcmRlcikuIFRoaXMgcHJvZHVjZXMgdGhlIHVzdWFsbHktZGVzaXJlZCBiZWhhdmlvciB3aGVyZSBtb3JlIHNwZWNpZmljCiAgcGF0dGVybnMgYXJlIHByZWZlcnJlZC4gVG8gZGV0ZWN0IHRoaXMgZmVhdHVyZSBzZWFyY2ggZm9yICdzaG9ydGVzdC1zdGVtJwogIGluIHRoZSAuRkVBVFVSRVMgc3BlY2lhbCB2YXJpYWJsZS4KCiogV0FSTklORzogQmFja3dhcmQtaW5jb21wYXRpYmlsaXR5IQogIFRoZSBsaWJyYXJ5IHNlYXJjaCBiZWhhdmlvciBoYXMgY2hhbmdlZCB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlIHN0YW5kYXJkCiAgbGlua2VyIGJlaGF2aW9yLiBQcmlvciB0byB0aGlzIHZlcnNpb24gZm9yIHByZXJlcXVpc2l0ZXMgc3BlY2lmaWVkIHVzaW5nCiAgdGhlIC1sZm9vIHN5bnRheCBtYWtlIGZpcnN0IHNlYXJjaGVkIGZvciBsaWJmb28uc28gaW4gdGhlIGN1cnJlbnQKICBkaXJlY3RvcnksIHZwYXRoIGRpcmVjdG9yaWVzLCBhbmQgc3lzdGVtIGRpcmVjdG9yaWVzLiBJZiB0aGF0IGRpZG4ndCB5aWVsZAogIGEgbWF0Y2gsIG1ha2UgdGhlbiBzZWFyY2hlZCBmb3IgbGliZm9vLmEgaW4gdGhlc2UgZGlyZWN0b3JpZXMuIFN0YXJ0aW5nCiAgd2l0aCB0aGlzIHZlcnNpb24gbWFrZSBzZWFyY2hlcyBmaXJzdCBmb3IgbGliZm9vLnNvIGFuZCB0aGVuIGZvciBsaWJmb28uYQogIGluIGVhY2ggb2YgdGhlc2UgZGlyZWN0b3JpZXMgaW4gb3JkZXIuCgoqIE5ldyBjb21tYW5kIGxpbmUgb3B0aW9uOiAtLWV2YWw9U1RSSU5HIGNhdXNlcyBTVFJJTkcgdG8gYmUgZXZhbHVhdGVkIGFzCiAgbWFrZWZpbGUgc3ludGF4IChha2luIHRvIHVzaW5nIHRoZSAkKGV2YWwgLi4uKSBmdW5jdGlvbikuICBUaGUgZXZhbHVhdGlvbgogIGlzIHBlcmZvcm1lZCBhZnRlciBhbGwgZGVmYXVsdCBydWxlcyBhbmQgdmFyaWFibGVzIGFyZSBkZWZpbmVkLCBidXQgYmVmb3JlCiAgYW55IG1ha2VmaWxlcyBhcmUgcmVhZC4KCiogTmV3IHNwZWNpYWwgdmFyaWFibGU6IC5SRUNJUEVQUkVGSVggYWxsb3dzIHlvdSB0byByZXNldCB0aGUgcmVjaXBlCiAgaW50cm9kdWN0aW9uIGNoYXJhY3RlciBmcm9tIHRoZSBkZWZhdWx0IChUQUIpIHRvIHNvbWV0aGluZyBlbHNlLiAgVGhlCiAgZmlyc3QgY2hhcmFjdGVyIG9mIHRoaXMgdmFyaWFibGUgdmFsdWUgaXMgdGhlIG5ldyByZWNpcGUgaW50cm9kdWN0aW9uCiAgY2hhcmFjdGVyLiAgSWYgdGhlIHZhcmlhYmxlIGlzIHNldCB0byB0aGUgZW1wdHkgc3RyaW5nLCBUQUIgaXMgdXNlZCBhZ2Fpbi4KICBJdCBjYW4gYmUgc2V0IGFuZCByZXNldCBhdCB3aWxsOyByZWNpcGVzIHdpbGwgdXNlIHRoZSB2YWx1ZSBhY3RpdmUgd2hlbgogIHRoZXkgd2VyZSBmaXJzdCBwYXJzZWQuICBUbyBkZXRlY3QgdGhpcyBmZWF0dXJlIGNoZWNrIHRoZSB2YWx1ZSBvZgogICQoLlJFQ0lQRVBSRUZJWCkuCgoqIE5ldyBzcGVjaWFsIHZhcmlhYmxlOiAuU0hFTExGTEFHUyBhbGxvd3MgeW91IHRvIGNoYW5nZSB0aGUgb3B0aW9ucyBwYXNzZWQKICB0byB0aGUgc2hlbGwgd2hlbiBpdCBpbnZva2VzIHJlY2lwZXMuICBCeSBkZWZhdWx0IHRoZSB2YWx1ZSB3aWxsIGJlICItYyIKICAob3IgIi1lYyIgaWYgLlBPU0lYIGlzIHNldCkuCgoqIE5ldyBzcGVjaWFsIHRhcmdldDogLk9ORVNIRUxMIGluc3RydWN0cyBtYWtlIHRvIGludm9rZSBhIHNpbmdsZSBpbnN0YW5jZQogIG9mIHRoZSBzaGVsbCBhbmQgcHJvdmlkZSBpdCB3aXRoIHRoZSBlbnRpcmUgcmVjaXBlLCByZWdhcmRsZXNzIG9mIGhvdyBtYW55CiAgbGluZXMgaXQgY29udGFpbnMuICBBcyBhIHNwZWNpYWwgZmVhdHVyZSB0byBhbGxvdyBtb3JlIHN0cmFpZ2h0Zm9yd2FyZAogIGNvbnZlcnNpb24gb2YgbWFrZWZpbGVzIHRvIHVzZSAuT05FU0hFTEwsIGFueSByZWNpcGUgbGluZSBjb250cm9sCiAgY2hhcmFjdGVycyAoJ0AnLCAnKycsIG9yICctJykgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIHNlY29uZCBhbmQKICBzdWJzZXF1ZW50IHJlY2lwZSBsaW5lcy4gIFRoaXMgaGFwcGVucyBfb25seV8gaWYgdGhlIFNIRUxMIHZhbHVlIGlzIGRlZW1lZAogIHRvIGJlIGEgc3RhbmRhcmQgUE9TSVgtc3R5bGUgc2hlbGwuICBJZiBub3QsIHRoZW4gbm8gaW50ZXJpb3IgbGluZSBjb250cm9sCiAgY2hhcmFjdGVycyBhcmUgcmVtb3ZlZCAoYXMgdGhleSBtYXkgYmUgcGFydCBvZiB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlIHVzZWQKICB3aXRoIHRoZSBhbHRlcm5hdGUgU0hFTEwpLgoKKiBOZXcgdmFyaWFibGUgbW9kaWZpZXIgJ3ByaXZhdGUnOiBwcmVmaXhpbmcgYSB2YXJpYWJsZSBhc3NpZ25tZW50IHdpdGggdGhlCiAgbW9kaWZpZXIgJ3ByaXZhdGUnIHN1cHByZXNzZXMgaW5oZXJpdGFuY2Ugb2YgdGhhdCB2YXJpYWJsZSBieQogIHByZXJlcXVpc2l0ZXMuICBUaGlzIGlzIG1vc3QgdXNlZnVsIGZvciB0YXJnZXQtIGFuZCBwYXR0ZXJuLXNwZWNpZmljCiAgdmFyaWFibGVzLgoKKiBOZXcgbWFrZSBkaXJlY3RpdmU6ICd1bmRlZmluZScgYWxsb3dzIHlvdSB0byB1bmRlZmluZSBhIHZhcmlhYmxlIHNvIHRoYXQKICBpdCBhcHBlYXJzIGFzIGlmIGl0IHdhcyBuZXZlciBzZXQuIEJvdGggJChmbGF2b3IpIGFuZCAkKG9yaWdpbikgZnVuY3Rpb25zCiAgd2lsbCByZXR1cm4gJ3VuZGVmaW5lZCcgZm9yIHN1Y2ggYSB2YXJpYWJsZS4gVG8gZGV0ZWN0IHRoaXMgZmVhdHVyZSBzZWFyY2gKICBmb3IgJ3VuZGVmaW5lJyBpbiB0aGUgLkZFQVRVUkVTIHNwZWNpYWwgdmFyaWFibGUuCgoqIFRoZSBwYXJzZXIgZm9yIHZhcmlhYmxlIGFzc2lnbm1lbnRzIGhhcyBiZWVuIGVuaGFuY2VkIHRvIGFsbG93IG11bHRpcGxlCiAgbW9kaWZpZXJzICgnZXhwb3J0JywgJ292ZXJyaWRlJywgJ3ByaXZhdGUnKSBvbiB0aGUgc2FtZSBsaW5lIGFzIHZhcmlhYmxlcywKICBpbmNsdWRpbmcgZGVmaW5lL2VuZGVmIHZhcmlhYmxlcywgYW5kIGluIGFueSBvcmRlci4gIEFsc28sIGl0IGlzIHBvc3NpYmxlCiAgdG8gY3JlYXRlIHZhcmlhYmxlcyBhbmQgdGFyZ2V0cyBuYW1lZCBhcyB0aGVzZSBtb2RpZmllcnMuCgoqIFRoZSAnZGVmaW5lJyBtYWtlIGRpcmVjdGl2ZSBub3cgYWxsb3dzIGEgdmFyaWFibGUgYXNzaWdubWVudCBvcGVyYXRvcgogIGFmdGVyIHRoZSB2YXJpYWJsZSBuYW1lLCB0byBhbGxvdyBmb3Igc2ltcGxlLCBjb25kaXRpb25hbCwgb3IgYXBwZW5kaW5nCiAgbXVsdGktbGluZSB2YXJpYWJsZSBhc3NpZ25tZW50LgoKKiBWTVMtc3BlY2lmaWMgY2hhbmdlczoKCiAgKiBNaWNoYWVsIEdlaHJlIChhdCBWSVNURUMtU0VNSSBkb3QgQ09NKSBzdXBwbGllZCBhIGZpeCBmb3IgYSBwcm9ibGVtIHdpdGgKICAgIHRpbWVzdGFtcHMgb2Ygb2JqZWN0IG1vZHVsZXMgaW4gT0xCcy4gVGhlIHRpbWVzdGFtcHMgd2VyZSBub3QgY29ycmVjdGx5CiAgICBhZGp1c3RlZCB0byBHTVQgYmFzZWQgdGltZSwgaWYgdGhlIGxvY2FsIFZNUyB0aW1lIHdhcyB1c2luZyBhIGRheWxpZ2h0CiAgICBzYXZpbmcgYWxnb3JpdGhtIGFuZCBpZiBkYXlsaWdodCBzYXZpbmcgd2FzIHN3aXRjaGVkIG9mZi4KCiAgKiBKb2huIEVpc2VuYnJhdW4gKGF0IEhQIGRvdCBDT00pIHN1cHBsaWVkIGZpeGVzIGFuZCBhbmQgYW4gZW5oYW5jZW1lbnQgdG8KICAgIGFwcGVuZCBvdXRwdXQgcmVkaXJlY3Rpb24gaW4gYWN0aW9uIGxpbmVzLgoKICAqIFJld29yayBvZiBjdHJsK2MgYW5kIGN0cmwreSBoYW5kbGluZy4KCiAgKiBGaXggYSBwcm9ibGVtIHdpdGggY2FjaGVkIHN0cmluZ3MsIHdoaWNoIHNob3dlZCBvbiBjYXNlLWluc2Vuc2l0aXZlIGZpbGUKICAgIHN5c3RlbXMuCgogICogQnVpbGQgZml4ZXMgZm9yIGNvbnN0LWlmaWVkIGNvZGUgaW4gVk1TIHNwZWNpZmljIHNvdXJjZXMuCgogICogQSBub3RlIG9uIGFwcGVuZGluZyB0aGUgcmVkaXJlY3RlZCBvdXRwdXQuIFdpdGggdGhpcyBjaGFuZ2UsIGEgc2ltcGxlCiAgICBtZWNoYW5pc20gaXMgaW1wbGVtZW50ZWQgdG8gbWFrZSAiPj4iIHdvcmsgaW4gYWN0aW9uIGxpbmVzLiBJbiBWTVMKICAgIHRoZXJlIGlzIG5vIHNpbXBsZSBmZWF0dXJlIGxpa2UgIj4+IiB0byBoYXZlIERDTCBjb21tYW5kIG9yIHByb2dyYW0KICAgIG91dHB1dCByZWRpcmVjdGVkIGFuZCBhcHBlbmRlZCB0byBhIGZpbGUuIEdOVSBtYWtlIGZvciBWTVMgYWxyZWFkeQogICAgaW1wbGVtZW50cyB0aGUgcmVkaXJlY3Rpb24gb2Ygb3V0cHV0LiBJZiBzdWNoIGEgcmVkaXJlY3Rpb24gaXMgZGV0ZWN0ZWQsCiAgICBhbiAiPiIgb24gdGhlIGFjdGlvbiBsaW5lLCBHTlUgbWFrZSBjcmVhdGVzIGEgRENMIGNvbW1hbmQgcHJvY2VkdXJlIHRvCiAgICBleGVjdXRlIHRoZSBhY3Rpb24gYW5kIHRvIHJlZGlyZWN0IGl0cyBvdXRwdXQuIEJhc2VkIG9uIHRoYXQsIG5vdyAiPj4iCiAgICBpcyBhbHNvIHJlY29nbml6ZWQgYW5kIGEgc2ltaWxhciBidXQgZGlmZmVyZW50IGNvbW1hbmQgcHJvY2VkdXJlIGlzCiAgICBjcmVhdGVkIHRvIGltcGxlbWVudCB0aGUgYXBwZW5kLiBUaGUgbWFpbiBpZGVhIGhlcmUgaXMgdG8gY3JlYXRlIGEKICAgIHRlbXBvcmFyeSBmaWxlIHdoaWNoIGNvbGxlY3RzIHRoZSBvdXRwdXQgYW5kIHdoaWNoIGlzIGFwcGVuZGVkIHRvIHRoZQogICAgd2FudGVkIG91dHB1dCBmaWxlLiBUaGVuIHRoZSB0ZW1wb3JhcnkgZmlsZSBpcyBkZWxldGVkLiBUaGlzIGlzIGFsbCBkb25lCiAgICBpbiB0aGUgY29tbWFuZCBwcm9jZWR1cmUgdG8ga2VlcCBjaGFuZ2VzIGluIG1ha2Ugc21hbGwgYW5kIHNpbXBsZS4gVGhpcwogICAgb2J2aW91c2x5IGhhcyBzb21lIGxpbWl0YXRpb25zIGJ1dCBpdCBzZWVtcyBnb29kIGVub3VnaCBjb21wYXJlZCB3aXRoCiAgICB0aGUgY3VycmVudCAiPiIgaW1wbGVtZW50YXRpb24uIChBbmQgaW4gbXkgb3BpbmlvbiwgcmVkaXJlY3Rpb24gaXMgbm90CiAgICByZWFsbHkgd2hhdCBHTlUgbWFrZSBoYXMgdG8gZG8uKSBXaXRoIHRoaXMgYXBwcm9hY2gsIGl0IG1heSBoYXBwZW4gdGhhdAogICAgdGhlIHRlbXBvcmFyeSBmaWxlIGlzIG5vdCB5ZXQgYXBwZW5kZWQgYW5kIGlzIGxlZnQgaW4gU1lTJFNDUkFUQ0guCiAgICBUaGUgdGVtcG9yYXJ5IGZpbGUgbmFtZXMgbG9vayBsaWtlICJDTUR4eHh4eC4iLiBBbnkgdGltZSB0aGUgY3JlYXRlZAogICAgY29tbWFuZCBwcm9jZWR1cmUgY2FuIG5vdCBjb21wbGV0ZSwgdGhpcyBoYXBwZW5zLiBQcmVzc2luZyBDdHJsK1kgdG8KICAgIGFib3J0IG1ha2UgaXMgb25lIGNhc2UuIEluIGNhc2Ugb2YgQ3RybCtZIHRoZSBhc3NvY2lhdGVkIGNvbW1hbmQKICAgIHByb2NlZHVyZSBpcyBsZWZ0IGluIFNZUyRTQ1JBVENIIGFzIHdlbGwuIEl0cyBuYW1lIGlzIENNRHh4eHh4LkNPTS4KCiAgKiBDaGFuZ2UgaW4gdGhlIEN0cmwrWSBoYW5kbGluZy4gVGhlIEN0cmxZIGhhbmRsZXIgbm93IHVzZXMgJGRlbHByYyB0bwogICAgZGVsZXRlIGFsbCBjaGlsZHJlbi4gVGhpcyB3YXkgYWxzbyBhY3Rpb25zIHdpdGggRENMIGNvbW1hbmRzIHdpbGwgYmUKICAgIHN0b3BwZWQuIEFzIGJlZm9yZSB0aGUgQ3RybFkgaGFuZGxlciB0aGVuIHNlbmRzIFNJR1FVSVQgdG8gaXRzZWxmLAogICAgd2hpY2ggaXMgaGFuZGxlZCBpbiBjb21tb24gY29kZS4KCiAgKiBDaGFuZ2UgaW4gZGVsZXRlaW5nIHRlbXBvcmFyeSBjb21tYW5kIGZpbGVzLiBUZW1wb3JhcnkgY29tbWFuZCBmaWxlcwogICAgYXJlIG5vdyBkZWxldGVkIGluIHRoZSB2bXMgY2hpbGQgdGVybWluYXRpb24gaGFuZGxlci4gVGhhdCBkZWxldGVzCiAgICB0aGVtIGV2ZW4gaWYgYSBDdHJsK0Mgd2FzIHByZXNzZWQuCgogICogVGhlIGJlaGF2aW9yIG9mIHByZXNzaW5nIEN0cmwrQyBpcyBub3QgY2hhbmdlZC4gSXQgc3RpbGwgaGFzIG9ubHkgYW4KICAgIGVmZmVjdCwgYWZ0ZXIgdGhlIGN1cnJlbnQgYWN0aW9uIGlzIHRlcm1pbmF0ZWQuIElmIHRoYXQgZG9lc24ndCBoYXBwZW4KICAgIG9yIHRha2VzIHRvbyBsb25nLCBDdHJsK1kgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KCgwKVmVyc2lvbiAzLjgxICgwMSBBcHIgMjAwNikKCiogR05VIG1ha2UgaXMgcG9ydGVkIHRvIE9TLzIuCgoqIEdOVSBtYWtlIGlzIHBvcnRlZCB0byBNaW5HVy4gIFRoZSBNaW5HVyBidWlsZCBpcyBvbmx5IHN1cHBvcnRlZCBieQogIHRoZSBidWlsZF93MzIuYmF0IGJhdGNoIGZpbGU7IHNlZSB0aGUgZmlsZSBSRUFETUUuVzMyIGZvciBtb3JlCiAgZGV0YWlscy4KCiogV0FSTklORzogRnV0dXJlIGJhY2t3YXJkLWluY29tcGF0aWJpbGl0eSEKICBVcCB0byBhbmQgaW5jbHVkaW5nIHRoaXMgcmVsZWFzZSwgdGhlICckPycgdmFyaWFibGUgZG9lcyBub3QgY29udGFpbgogIGFueSBwcmVyZXF1aXNpdGUgdGhhdCBkb2VzIG5vdCBleGlzdCwgZXZlbiB0aG91Z2ggdGhhdCBwcmVyZXF1aXNpdGUKICBtaWdodCBoYXZlIGNhdXNlZCB0aGUgdGFyZ2V0IHRvIHJlYnVpbGQuICBTdGFydGluZyB3aXRoIHRoZSBfbmV4dF8KICByZWxlYXNlIG9mIEdOVSBtYWtlLCAnJD8nIHdpbGwgY29udGFpbiBhbGwgcHJlcmVxdWlzaXRlcyB0aGF0IGNhdXNlZAogIHRoZSB0YXJnZXQgdG8gYmUgY29uc2lkZXJlZCBvdXQgb2YgZGF0ZS4KICBTZWUgaHR0cDovL3NhdmFubmFoLmdudS5vcmcvYnVncy8/MTYwNTEKCiogV0FSTklORzogQmFja3dhcmQtaW5jb21wYXRpYmlsaXR5IQogIEdOVSBtYWtlIG5vdyBpbXBsZW1lbnRzIGEgZ2VuZXJpYyAic2Vjb25kIGV4cGFuc2lvbiIgZmVhdHVyZSBvbiB0aGUKICBwcmVyZXF1aXNpdGVzIG9mIGJvdGggZXhwbGljaXQgYW5kIGltcGxpY2l0IChwYXR0ZXJuKSBydWxlcy4gIEluIG9yZGVyCiAgdG8gZW5hYmxlIHRoaXMgZmVhdHVyZSwgdGhlIHNwZWNpYWwgdGFyZ2V0ICcuU0VDT05ERVhQQU5TSU9OJyBtdXN0IGJlCiAgZGVmaW5lZCBiZWZvcmUgdGhlIGZpcnN0IHRhcmdldCB3aGljaCB0YWtlcyBhZHZhbnRhZ2Ugb2YgaXQuICBJZiB0aGlzCiAgZmVhdHVyZSBpcyBlbmFibGVkIHRoZW4gYWZ0ZXIgYWxsIHJ1bGVzIGhhdmUgYmVlbiBwYXJzZWQgdGhlCiAgcHJlcmVxdWlzaXRlcyBhcmUgZXhwYW5kZWQgYWdhaW4sIHRoaXMgdGltZSB3aXRoIGFsbCB0aGUgYXV0b21hdGljCiAgdmFyaWFibGVzIGluIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IGluIGFkZGl0aW9uIHRvIHVzaW5nIHN0YW5kYXJkCiAgU3lzViAkJEAgaW4gcHJlcmVxdWlzaXRlcyBsaXN0cywgeW91IGNhbiBhbHNvIHVzZSBjb21wbGV4IGZ1bmN0aW9ucwogIHN1Y2ggYXMgJCQobm90ZGlyICQkQCkgZXRjLiAgVGhpcyBiZWhhdmlvciBhcHBsaWVzIHRvIGltcGxpY2l0IHJ1bGVzLAogIGFzIHdlbGwsIHdoZXJlIHRoZSBzZWNvbmQgZXhwYW5zaW9uIG9jY3VycyB3aGVuIHRoZSBydWxlIGlzIG1hdGNoZWQuCiAgSG93ZXZlciwgdGhpcyBtZWFucyB0aGF0IHdoZW4gJy5TRUNPTkRFWFBBTlNJT04nIGlzIGVuYWJsZWQgeW91IG11c3QKICBkb3VibGUtcXVvdGUgYW55ICIkIiBpbiB5b3VyIGZpbGVuYW1lczsgaW5zdGVhZCBvZiAiZm9vOiBib28kJGJhciIgeW91CiAgbm93IG11c3Qgd3JpdGUgImZvbzogZm9vJCQkJGJhciIuICBOb3RlIHRoYXQgdGhlIFN5c1YgJCRAIGV0Yy4gZmVhdHVyZSwKICB3aGljaCB1c2VkIHRvIGJlIGF2YWlsYWJsZSBieSBkZWZhdWx0LCBpcyBub3cgT05MWSBhdmFpbGFibGUgd2hlbiB0aGUKICAuU0VDT05ERVhQQU5TSU9OIHRhcmdldCBpcyBkZWZpbmVkLiAgSWYgeW91ciBtYWtlZmlsZXMgdGFrZSBhZHZhbnRhZ2UKICBvZiB0aGlzIFN5c1YgZmVhdHVyZSB5b3Ugd2lsbCBuZWVkIHRvIHVwZGF0ZSB0aGVtLgoKKiBXQVJOSU5HOiBCYWNrd2FyZC1pbmNvbXBhdGliaWxpdHkhCiAgSW4gb3JkZXIgdG8gY29tcGx5IHdpdGggUE9TSVgsIHRoZSB3YXkgaW4gd2hpY2ggR05VIG1ha2UgcHJvY2Vzc2VzCiAgYmFja3NsYXNoLW5ld2xpbmUgc2VxdWVuY2VzIGluIHJlY2lwZXMgaGFzIGNoYW5nZWQuICBJZiB5b3VyIG1ha2VmaWxlcwogIHVzZSBiYWNrc2xhc2gtbmV3bGluZSBzZXF1ZW5jZXMgaW5zaWRlIG9mIHNpbmdsZS1xdW90ZWQgc3RyaW5ncyBpbgogIHJlY2lwZXMgeW91IHdpbGwgYmUgaW1wYWN0ZWQgYnkgdGhpcyBjaGFuZ2UuICBTZWUgdGhlIEdOVSBtYWtlIG1hbnVhbAogIHN1YnNlY3Rpb24gIlNwbGl0dGluZyBSZWNpcGUgTGluZXMiIChub2RlICJTcGxpdHRpbmcgTGluZXMiKSwgaW4KICBzZWN0aW9uICJSZWNpcGUgU3ludGF4IiwgY2hhcHRlciAiV3JpdGluZyBSZWNpcGUgaW4gUnVsZXMiLCBmb3IKICBkZXRhaWxzLgoKKiBXQVJOSU5HOiBCYWNrd2FyZC1pbmNvbXBhdGliaWxpdHkhCiAgU29tZSBwcmV2aW91cyB2ZXJzaW9ucyBvZiBHTlUgbWFrZSBoYWQgYSBidWcgd2hlcmUgIiMiIGluIGEgZnVuY3Rpb24KICBpbnZvY2F0aW9uIHN1Y2ggYXMgJChzaGVsbCAuLi4pIHdhcyB0cmVhdGVkIGFzIGEgbWFrZSBjb21tZW50LiAgQQogIHdvcmthcm91bmQgd2FzIHRvIGVzY2FwZSB0aGVzZSB3aXRoIGJhY2tzbGFzaGVzLiAgVGhpcyBidWcgaGFzIGJlZW4KICBmaXhlZDogaWYgeW91ciBtYWtlZmlsZSB1c2VzICJcIyIgaW4gYSBmdW5jdGlvbiBpbnZvY2F0aW9uIHRoZQogIGJhY2tzbGFzaCBpcyBub3cgcHJlc2VydmVkLCBzbyB5b3UnbGwgbmVlZCB0byByZW1vdmUgaXQuCgoqIE5ldyBjb21tYW5kIGxpbmUgb3B0aW9uOiAtTCAoLS1jaGVjay1zeW1saW5rLXRpbWVzKS4gIE9uIHN5c3RlbXMgdGhhdAogIHN1cHBvcnQgc3ltYm9saWMgbGlua3MsIGlmIHRoaXMgb3B0aW9uIGlzIGdpdmVuIHRoZW4gR05VIG1ha2Ugd2lsbAogIHVzZSB0aGUgbW9zdCByZWNlbnQgbW9kaWZpY2F0aW9uIHRpbWUgb2YgYW55IHN5bWJvbGljIGxpbmtzIHRoYXQgYXJlCiAgdXNlZCB0byByZXNvbHZlIHRhcmdldCBmaWxlcy4gIFRoZSBkZWZhdWx0IGJlaGF2aW9yIHJlbWFpbnMgYXMgaXQKICBhbHdheXMgaGFzOiB1c2UgdGhlIG1vZGlmaWNhdGlvbiB0aW1lIG9mIHRoZSBhY3R1YWwgdGFyZ2V0IGZpbGUgb25seS4KCiogVGhlICJlbHNlIiBjb25kaXRpb25hbCBsaW5lIGNhbiBub3cgYmUgZm9sbG93ZWQgYnkgYW55IG90aGVyIHZhbGlkCiAgY29uZGl0aW9uYWwgb24gdGhlIHNhbWUgbGluZTogdGhpcyBkb2VzIG5vdCBpbmNyZWFzZSB0aGUgZGVwdGggb2YgdGhlCiAgY29uZGl0aW9uYWwgbmVzdGluZywgc28gb25seSBvbmUgImVuZGlmIiBpcyByZXF1aXJlZCB0byBjbG9zZSB0aGUKICBjb25kaXRpb25hbC4KCiogQWxsIHBhdHRlcm4tc3BlY2lmaWMgdmFyaWFibGVzIHRoYXQgbWF0Y2ggYSBnaXZlbiB0YXJnZXQgYXJlIG5vdyB1c2VkCiAgKHByZXZpb3VzbHkgb25seSB0aGUgZmlyc3QgbWF0Y2ggd2FzIHVzZWQpLgoKKiBUYXJnZXQtc3BlY2lmaWMgdmFyaWFibGVzIGNhbiBiZSBtYXJrZWQgYXMgZXhwb3J0YWJsZSB1c2luZyB0aGUKICAiZXhwb3J0IiBrZXl3b3JkLgoKKiBJbiBhIHJlY3Vyc2l2ZSAkKGNhbGwgLi4uKSBjb250ZXh0LCBhbnkgZXh0cmEgYXJndW1lbnRzIGZyb20gdGhlIG91dGVyCiAgY2FsbCBhcmUgbm93IG1hc2tlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgaW5uZXIgY2FsbC4KCiogSW1wbGVtZW50ZWQgYSBzb2x1dGlvbiBmb3IgdGhlICJ0aHVuZGVyaW5nIGhlcmQiIHByb2JsZW0gd2l0aCAiLWogLWwiLgogIFRoaXMgdmVyc2lvbiBvZiBHTlUgbWFrZSB1c2VzIGFuIGFsZ29yaXRobSBzdWdnZXN0ZWQgYnkgVGhvbWFzIFJpZWRsCiAgPHRob21hcy5yaWVkbEBzaWVtZW5zLmNvbT4gdG8gdHJhY2sgdGhlIG51bWJlciBvZiBqb2JzIHN0YXJ0ZWQgaW4gdGhlCiAgbGFzdCBzZWNvbmQgYW5kIGFydGlmaWNpYWxseSBhZGp1c3QgR05VIG1ha2UncyB2aWV3IG9mIHRoZSBzeXN0ZW0ncwogIGxvYWQgYXZlcmFnZSBhY2NvcmRpbmdseS4KCiogTmV3IHNwZWNpYWwgdmFyaWFibGVzIGF2YWlsYWJsZSBpbiB0aGlzIHJlbGVhc2U6CiAgIC0gLklOQ0xVREVfRElSUzogRXhwYW5kcyB0byBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdGhhdCBtYWtlIHNlYXJjaGVzCiAgICAgZm9yIGluY2x1ZGVkIG1ha2VmaWxlcy4KICAgLSAuRkVBVFVSRVM6IENvbnRhaW5zIGEgbGlzdCBvZiBzcGVjaWFsIGZlYXR1cmVzIGF2YWlsYWJsZSBpbiB0aGlzCiAgICAgdmVyc2lvbiBvZiBHTlUgbWFrZS4KICAgLSAuREVGQVVMVF9HT0FMOiBTZXQgdGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgZ29hbCBtYWtlIHdpbGwKICAgICB1c2UgaWYgbm8gZ29hbHMgYXJlIHByb3ZpZGVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCiAgIC0gTUFLRV9SRVNUQVJUUzogSWYgc2V0LCB0aGVuIHRoaXMgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGlzCiAgICAgaW5zdGFuY2Ugb2YgbWFrZSBoYXMgYmVlbiByZXN0YXJ0ZWQgKHNlZSAiSG93IE1ha2VmaWxlcyBBcmUgUmVtYWRlIgogICAgIGluIHRoZSBtYW51YWwpLgogICAtIE5ldyBhdXRvbWF0aWMgdmFyaWFibGU6ICR8IChhZGRlZCBpbiAzLjgwLCBhY3R1YWxseSk6IGNvbnRhaW5zIGFsbAogICAgIHRoZSBvcmRlci1vbmx5IHByZXJlcXVpc2l0ZXMgZGVmaW5lZCBmb3IgdGhlIHRhcmdldC4KCiogTmV3IGZ1bmN0aW9ucyBhdmFpbGFibGUgaW4gdGhpcyByZWxlYXNlOgogICAtICQobGFzdHdvcmQgLi4uKSByZXR1cm5zIHRoZSBsYXN0IHdvcmQgaW4gdGhlIGxpc3QuICBUaGlzIGdpdmVzCiAgICAgaWRlbnRpY2FsIHJlc3VsdHMgYXMgJCh3b3JkICQod29yZHMgLi4uKSAuLi4pLCBidXQgaXMgbXVjaCBmYXN0ZXIuCiAgIC0gJChhYnNwYXRoIC4uLikgcmV0dXJucyB0aGUgYWJzb2x1dGUgcGF0aCAoYWxsICIuIiBhbmQgIi4uIgogICAgIGRpcmVjdG9yaWVzIHJlc29sdmVkLCBhbmQgYW55IGR1cGxpY2F0ZSAiLyIgY2hhcmFjdGVycyByZW1vdmVkKSBmb3IKICAgICBlYWNoIHBhdGggcHJvdmlkZWQuCiAgIC0gJChyZWFscGF0aCAuLi4pIHJldHVybnMgdGhlIGNhbm9uaWNhbCBwYXRobmFtZSBmb3IgZWFjaCBwYXRoCiAgICAgcHJvdmlkZWQuICBUaGUgY2Fub25pY2FsIHBhdGhuYW1lIGlzIHRoZSBhYnNvbHV0ZSBwYXRobmFtZSwgd2l0aAogICAgIGFsbCBzeW1ib2xpYyBsaW5rcyByZXNvbHZlZCBhcyB3ZWxsLgogICAtICQoaW5mbyAuLi4pIHByaW50cyBpdHMgYXJndW1lbnRzIHRvIHN0ZG91dC4gIE5vIG1ha2VmaWxlIG5hbWUgb3IKICAgICBsaW5lIG51bWJlciBpbmZvLCBldGMuIGlzIHByaW50ZWQuCiAgIC0gJChmbGF2b3IgLi4uKSByZXR1cm5zIHRoZSBmbGF2b3Igb2YgYSB2YXJpYWJsZS4KICAgLSAkKG9yIC4uLikgcHJvdmlkZXMgYSBzaG9ydC1jaXJjdWl0aW5nIE9SIGNvbmRpdGlvbmFsOiBlYWNoIGFyZ3VtZW50CiAgICAgaXMgZXhwYW5kZWQuICBUaGUgZmlyc3QgdHJ1ZSAobm9uLWVtcHR5KSBhcmd1bWVudCBpcyByZXR1cm5lZDsgbm8KICAgICBmdXJ0aGVyIGFyZ3VtZW50cyBhcmUgZXhwYW5kZWQuICBFeHBhbmRzIHRvIGVtcHR5IGlmIHRoZXJlIGFyZSBubwogICAgIHRydWUgYXJndW1lbnRzLgogICAtICQoYW5kIC4uLikgcHJvdmlkZXMgYSBzaG9ydC1jaXJjdWl0aW5nIEFORCBjb25kaXRpb25hbDogZWFjaAogICAgIGFyZ3VtZW50IGlzIGV4cGFuZGVkLiAgVGhlIGZpcnN0IGZhbHNlIChlbXB0eSkgYXJndW1lbnQgaXMKICAgICByZXR1cm5lZDsgbm8gZnVydGhlciBhcmd1bWVudHMgYXJlIGV4cGFuZGVkLiAgRXhwYW5kcyB0byB0aGUgbGFzdAogICAgIGFyZ3VtZW50IGlmIGFsbCBhcmd1bWVudHMgYXJlIHRydWUuCgoqIENoYW5nZXMgbWFkZSBmb3IgUE9TSVggY29tcGF0aWJpbGl0eToKICAgLSBPbmx5IHRvdWNoIHRhcmdldHMgKHVuZGVyIC10KSBpZiB0aGV5IGhhdmUgYSByZWNpcGUuCiAgIC0gU2V0dGluZyB0aGUgU0hFTEwgbWFrZSB2YXJpYWJsZSBkb2VzIE5PVCBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZQogICAgIFNIRUxMIGVudmlyb25tZW50IHZhcmlhYmxlIGdpdmVuIHRvIHByb2dyYW1zIGludm9rZWQgYnkgbWFrZS4gIEFzCiAgICAgYW4gZW5oYW5jZW1lbnQgdG8gUE9TSVgsIGlmIHlvdSBleHBvcnQgdGhlIG1ha2UgdmFyaWFibGUgU0hFTEwgdGhlbgogICAgIGl0IHdpbGwgYmUgc2V0IGluIHRoZSBlbnZpcm9ubWVudCwganVzdCBhcyBiZWZvcmUuCgoqIE9uIE1TIFdpbmRvd3Mgc3lzdGVtcywgZXhwbGljaXRseSBzZXR0aW5nIFNIRUxMIHRvIGEgcGF0aG5hbWUgZW5kaW5nCiAgaW4gImNtZCIgb3IgImNtZC5leGUiIChjYXNlLWluc2Vuc2l0aXZlKSB3aWxsIGZvcmNlIEdOVSBtYWtlIHRvIHVzZQogIHRoZSBET1MgY29tbWFuZCBpbnRlcnByZXRlciBpbiBiYXRjaCBtb2RlIGV2ZW4gaWYgYSBVTklYLWxpa2Ugc2hlbGwKICBjb3VsZCBiZSBmb3VuZCBvbiB0aGUgc3lzdGVtLgoKKiBPbiBWTVMgdGhlcmUgaXMgbm93IHN1cHBvcnQgZm9yIGNhc2Utc2Vuc2l0aXZlIGZpbGVzeXN0ZW1zIHN1Y2ggYXMgT0RTNS4KICBTZWUgdGhlIFJFQURNRS5WTVMgZmlsZSBmb3IgaW5mb3JtYXRpb24uCgoqIFBhcmFsbGVsIGJ1aWxkcyAoLWpOKSBubyBsb25nZXIgcmVxdWlyZSBhIHdvcmtpbmcgQm91cm5lIHNoZWxsIG9uCiAgV2luZG93cyBwbGF0Zm9ybXMuICBUaGV5IHdvcmsgZXZlbiB3aXRoIHRoZSBzdG9jayBXaW5kb3dzIHNoZWxscywgc3VjaAogIGFzIGNtZC5leGUgYW5kIGNvbW1hbmQuY29tLgoKKiBVcGRhdGVkIHRvIGF1dG9jb25mIDIuNTksIGF1dG9tYWtlIDEuOS41LCBhbmQgZ2V0dGV4dCAwLjE0LjEuICBVc2VycwogIHNob3VsZCBub3QgYmUgaW1wYWN0ZWQuCgoqIE5ldyB0cmFuc2xhdGlvbnMgZm9yIFN3ZWRpc2gsIENoaW5lc2UgKHNpbXBsaWZpZWQpLCBVa3JhaW5pYW4sCiAgQmVsYXJ1c2lhbiwgRmlubmlzaCwgS2lueWFyd2FuZGFuLCBhbmQgSXJpc2guICBNYW55IHVwZGF0ZWQKICB0cmFuc2xhdGlvbnMuCgpBIGNvbXBsZXRlIGxpc3Qgb2YgYnVncyBmaXhlZCBpbiB0aGlzIHZlcnNpb24gaXMgYXZhaWxhYmxlIGhlcmU6CgogIGh0dHA6Ly9zYXZhbm5haC5nbnUub3JnL2J1Z3MvaW5kZXgucGhwP2dyb3VwPW1ha2UmcmVwb3J0X2lkPTExMSZmaXhfcmVsZWFzZV9pZD0xMDMKCgwKVmVyc2lvbiAzLjgwICgwMyBPY3QgMjAwMikKCiogQSBuZXcgZmVhdHVyZSBleGlzdHM6IG9yZGVyLW9ubHkgcHJlcmVxdWlzaXRlcy4gIFRoZXNlIHByZXJlcXVpc2l0ZXMKICBhZmZlY3QgdGhlIG9yZGVyIGluIHdoaWNoIHRhcmdldHMgYXJlIGJ1aWx0LCBidXQgdGhleSBkbyBub3QgaW1wYWN0CiAgdGhlIHJlYnVpbGQvbm8tcmVidWlsZCBkZWNpc2lvbiBvZiB0aGVpciBkZXBlbmRlbnRzLiAgVGhhdCBpcyB0byBzYXksCiAgdGhleSBhbGxvdyB5b3UgdG8gcmVxdWlyZSB0YXJnZXQgQiBiZSBidWlsdCBiZWZvcmUgdGFyZ2V0IEEsIHdpdGhvdXQKICByZXF1aXJpbmcgdGhhdCB0YXJnZXQgQSB3aWxsIGFsd2F5cyBiZSByZWJ1aWx0IGlmIHRhcmdldCBCIGlzIHVwZGF0ZWQuCiAgUGF0Y2ggZm9yIHRoaXMgZmVhdHVyZSBwcm92aWRlZCBieSBHcmVnIE1jR2FyeSA8Z3JlZ0BtY2dhcnkub3JnPi4KCiogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBTeXNWIG1ha2UsIEdOVSBtYWtlIG5vdyBzdXBwb3J0cyB0aGUgcGVjdWxpYXIKICBzeW50YXggJCRALCAkJChARCksIGFuZCAkJChARikgaW4gdGhlIHByZXJlcXVpc2l0ZXMgbGlzdCBvZiBhIHJ1bGUuCiAgVGhpcyBzeW50YXggaXMgb25seSB2YWxpZCB3aXRoaW4gZXhwbGljaXQgYW5kIHN0YXRpYyBwYXR0ZXJuIHJ1bGVzOiBpdAogIGNhbm5vdCBiZSB1c2VkIGluIGltcGxpY2l0IChzdWZmaXggb3IgcGF0dGVybikgcnVsZXMuICBFZG91YXJkIEcuIFBhcm1lbGFuCiAgPGVncEBmcmVlLmZyPiBwcm92aWRlZCBhIHBhdGNoIGltcGxlbWVudGluZyB0aGlzIGZlYXR1cmU7IGhvd2V2ZXIsIEkKICBkZWNpZGVkIHRvIGltcGxlbWVudCBpdCBpbiBhIGRpZmZlcmVudCB3YXkuCgoqIFRoZSBhcmd1bWVudCB0byB0aGUgImlmZGVmIiBjb25kaXRpb25hbCBpcyBub3cgZXhwYW5kZWQgYmVmb3JlIGl0J3MKICB0ZXN0ZWQsIHNvIGl0IGNhbiBiZSBhIGNvbnN0cnVjdGVkIHZhcmlhYmxlIG5hbWUuCgogIFNpbWlsYXJseSwgdGhlIGFyZ3VtZW50cyB0byAiZXhwb3J0IiAod2hlbiBub3QgdXNlZCBpbiBhIHZhcmlhYmxlCiAgZGVmaW5pdGlvbiBjb250ZXh0KSBhbmQgInVuZXhwb3J0IiBhcmUgYWxzbyBub3cgZXhwYW5kZWQuCgoqIEEgbmV3IGZ1bmN0aW9uIGlzIGRlZmluZWQ6ICQodmFsdWUgLi4uKS4gIFRoZSBhcmd1bWVudCB0byB0aGlzCiAgZnVuY3Rpb24gaXMgdGhlIF9uYW1lXyBvZiBhIHZhcmlhYmxlLiAgVGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gaXMKICB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlLCB3aXRob3V0IGhhdmluZyBiZWVuIGV4cGFuZGVkLgoKKiBBIG5ldyBmdW5jdGlvbiBpcyBkZWZpbmVkOiAkKGV2YWwgLi4uKS4gIFRoZSBhcmd1bWVudHMgdG8gdGhpcwogIGZ1bmN0aW9uIHNob3VsZCBleHBhbmQgdG8gbWFrZWZpbGUgY29tbWFuZHMsIHdoaWNoIHdpbGwgdGhlbiBiZQogIGV2YWx1YXRlZCBhcyBpZiB0aGV5IGhhZCBhcHBlYXJlZCBpbiB0aGUgbWFrZWZpbGUuICBJbiBjb21iaW5hdGlvbgogIHdpdGggZGVmaW5lL2VuZGVmIG11bHRpbGluZSB2YXJpYWJsZSBkZWZpbml0aW9ucyB0aGlzIGlzIGFuIGV4dHJlbWVseQogIHBvd2VyZnVsIGNhcGFiaWxpdHkuICBUaGUgJCh2YWx1ZSAuLi4pIGZ1bmN0aW9uIGlzIGFsc28gc29tZXRpbWVzCiAgdXNlZnVsIGhlcmUuCgoqIEEgbmV3IGJ1aWx0LWluIHZhcmlhYmxlIGlzIGRlZmluZWQsICQoTUFLRUZJTEVfTElTVCkuICBJdCBjb250YWlucyBhCiAgbGlzdCBvZiBlYWNoIG1ha2VmaWxlIEdOVSBtYWtlIGhhcyByZWFkLCBvciBzdGFydGVkIHRvIHJlYWQsIGluIHRoZQogIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZSBlbmNvdW50ZXJlZC4gIFNvLCB0aGUgbGFzdCBmaWxlbmFtZSBpbiB0aGUKICBsaXN0IHdoZW4gYSBtYWtlZmlsZSBpcyBqdXN0IGJlaW5nIHJlYWQgKGJlZm9yZSBhbnkgaW5jbHVkZXMpIGlzIHRoZQogIG5hbWUgb2YgdGhlIGN1cnJlbnQgbWFrZWZpbGUuCgoqIEEgbmV3IGJ1aWx0LWluIHZhcmlhYmxlIGlzIGRlZmluZWQ6ICQoLlZBUklBQkxFUykuICBXaGVuIGl0IGlzCiAgZXhwYW5kZWQgaXQgcmV0dXJucyBhIGNvbXBsZXRlIGxpc3Qgb2YgdmFyaWFibGUgbmFtZXMgZGVmaW5lZCBieSBhbGwKICBtYWtlZmlsZXMgYXQgdGhhdCBtb21lbnQuCgoqIEEgbmV3IGNvbW1hbmQgbGluZSBvcHRpb24gaXMgZGVmaW5lZCwgLUIgb3IgLS1hbHdheXMtbWFrZS4gIElmCiAgc3BlY2lmaWVkIEdOVSBtYWtlIHdpbGwgY29uc2lkZXIgYWxsIHRhcmdldHMgb3V0LW9mLWRhdGUgZXZlbiBpZiB0aGV5CiAgd291bGQgb3RoZXJ3aXNlIG5vdCBiZS4KCiogVGhlIGFyZ3VtZW50cyB0byAkKGNhbGwgLi4uKSBmdW5jdGlvbnMgd2VyZSBiZWluZyBzdG9yZWQgaW4gJDEsICQyLAogIGV0Yy4gYXMgcmVjdXJzaXZlIHZhcmlhYmxlcywgZXZlbiB0aG91Z2ggdGhleSBhcmUgZnVsbHkgZXhwYW5kZWQKICBiZWZvcmUgYXNzaWdubWVudC4gIFRoaXMgbWVhbnMgdGhhdCBlc2NhcGVkIGRvbGxhciBzaWducyAoJCQgZXRjLikKICB3ZXJlIG5vdCBiZWhhdmluZyBwcm9wZXJseS4gIE5vdyB0aGUgYXJndW1lbnRzIGFyZSBzdG9yZWQgYXMgc2ltcGxlCiAgdmFyaWFibGVzLiAgVGhpcyBtYXkgbWVhbiB0aGF0IGlmIHlvdSBhZGRlZCBleHRyYSBlc2NhcGluZyB0byB5b3VyCiAgJChjYWxsIC4uLikgZnVuY3Rpb24gYXJndW1lbnRzIHlvdSB3aWxsIG5lZWQgdG8gdW5kbyBpdCBub3cuCgoqIFRoZSB2YXJpYWJsZSBpbnZva2VkIGJ5ICQoY2FsbCAuLi4pIGNhbiBub3cgYmUgcmVjdXJzaXZlOiB1bmxpa2Ugb3RoZXIKICB2YXJpYWJsZXMgaXQgY2FuIHJlZmVyZW5jZSBpdHNlbGYgYW5kIHRoaXMgd2lsbCBub3QgcHJvZHVjZSBhbiBlcnJvcgogIHdoZW4gaXQgaXMgdXNlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gJChjYWxsIC4uLikgKGJ1dCBvbmx5IHRoZW4pLgoKKiBOZXcgcHNldWRvLXRhcmdldCAuTE9XX1JFU09MVVRJT05fVElNRSwgc3VwZXJzZWRpbmcgdGhlIGNvbmZpZ3VyZQogIG9wdGlvbiAtLWRpc2FibGUtbnNlYy10aW1lc3RhbXBzLiAgWW91IG1pZ2h0IG5lZWQgdGhpcyBpZiB5b3VyIGJ1aWxkCiAgcHJvY2VzcyBkZXBlbmRzIG9uIHRvb2xzIGxpa2UgImNwIC1wIiBwcmVzZXJ2aW5nIHRpbWUgc3RhbXBzLCBzaW5jZQogICJjcCAtcCIgKHJpZ2h0IG5vdykgZG9lc24ndCBwcmVzZXJ2ZSB0aGUgc3Vic2Vjb25kIHBvcnRpb24gb2YgYSB0aW1lCiAgc3RhbXAuCgoqIFVwZGF0ZWQgdHJhbnNsYXRpb25zIGZvciBGcmVuY2gsIEdhbGljaWFuLCBHZXJtYW4sIEphcGFuZXNlLCBLb3JlYW4sCiAgYW5kIFJ1c3NpYW4uICBOZXcgdHJhbnNsYXRpb25zIGZvciBDcm9hdGlhbiwgRGFuaXNoLCBIZWJyZXcsIGFuZAogIFR1cmtpc2guCgoqIFVwZGF0ZWQgaW50ZXJuYXRpb25hbGl6YXRpb24gc3VwcG9ydCB0byBHZXR0ZXh0IDAuMTEuNS4KICBHTlUgbWFrZSBub3cgdXNlcyBHZXR0ZXh0J3MgImV4dGVybmFsIiBmZWF0dXJlLCBhbmQgZG9lcyBub3QgaW5jbHVkZQogIGFueSBpbnRlcm5hdGlvbmFsaXphdGlvbiBjb2RlIGl0c2VsZi4gIENvbmZpZ3VyZSB3aWxsIHNlYXJjaCB5b3VyCiAgc3lzdGVtIGZvciBhbiBleGlzdGluZyBpbXBsZW1lbnRhdGlvbiBvZiBHTlUgR2V0dGV4dCAob25seSBHTlUgR2V0dGV4dAogIGlzIGFjY2VwdGFibGUpIGFuZCB1c2UgaXQgaWYgaXQgZXhpc3RzLiAgSWYgbm90LCBOTFMgd2lsbCBiZSBkaXNhYmxlZC4KICBTZWUgQUJPVVQtTkxTIGZvciBtb3JlIGluZm9ybWF0aW9uLgoKKiBVcGRhdGVkIHRvIGF1dG9jb25mIDIuNTQgYW5kIGF1dG9tYWtlIDEuNy4gIFVzZXJzIHNob3VsZCBub3QgYmUgaW1wYWN0ZWQuCgoqIFZNUy1zcGVjaWZpYyBjaGFuZ2VzOgoKICAqIEluIGRlZmF1bHQuYyBkZWZpbmUgdmFyaWFibGUgQVJDSCBhcyBJQTY0IGZvciBWTVMgb24gSXRhbml1bSBzeXN0ZW1zLgoKICAqIEluIG1ha2VmaWxlLnZtcyBhdm9pZCBuYW1lIGNvbGxpc2lvbiBmb3IgZ2xvYiBhbmQgZ2xvYmZyZWUuCgogICogVGhpcyBpcyB0aGUgVk1TIHBvcnQgb2YgR05VIE1ha2UgZG9uZSBieSBIYXJ0bXV0LkJlY2tlckBjb21wYXEuY29tLgoKICAgIEl0IGlzIGJhc2VkIG9uIHRoZSBzcGVjaWZpYyB2ZXJzaW9uIDMuNzdrIGFuZCBvbiAzLjc4LjEuIDMuNzdrIHdhcyBkb25lCiAgICBieSBLbGF1cyBL5G1wZiA8a2thZW1wZkBybWkuZGU+LCB0aGUgY29kZSB3YXMgYmFzZWQgb24gdGhlIFZNUyBwb3J0IG9mCiAgICBHTlUgTWFrZSAzLjYwIGJ5IE1pa2UgTW9yZXR0aS4KCiAgICBJdCB3YXMgcG9ydGVkIG9uIE9wZW5WTVMvQWxwaGEgVjcuMSwgREVDQyBWNS43LTAwNi4gSXQgd2FzIHJlLWJ1aWxkIGFuZAogICAgdGVzdGVkIG9uIE9wZW5WTVMvQWxwaGEgVjcuMiwgT3BlblZNUy9WQVggNy4xIGFuZCA1LjUtMi4gRGlmZmVyZW50CiAgICB2ZXJzaW9ucyBvZiBERUNDIHdlcmUgdXNlZC4gVkFYQyB3YXMgdHJpZWQ6IGl0IGZhaWxzOyBidXQgaXQgZG9lc24ndAogICAgc2VlbSB3b3J0aCB0byBnZXQgaXQgd29ya2luZy4gVGhlcmUgYXJlIHN0aWxsIHNvbWUgUFRSTUlTTUFUQ0ggd2FybmluZ3MKICAgIGR1cmluZyB0aGUgY29tcGlsZS4gQWx0aG91Z2ggcGVybCBpcyB3b3JraW5nIG9uIFZNUyB0aGUgdGVzdCBzY3JpcHRzCiAgICBkb24ndCB3b3JrLiBUaGUgZnVuY3Rpb24gJHNoZWxsIGlzIHN0aWxsIG1pc3NpbmcuCgogICAgVGhlcmUgaXMgYSBrbm93biBidWcgaW4gc29tZSBvZiB0aGUgVk1TIENSVExzLiBJdCBpcyBpbiB0aGUgc2hpcHBlZAogICAgdmVyc2lvbnMgb2YgVk1TIFY3LjIgYW5kIFY3LjItMSBhbmQgaW4gdGhlIGN1cnJlbnRseSAoT2N0b2JlciAxOTk5KQogICAgYXZhaWxhYmxlIEVDT3MgZm9yIFZNUyBWNy4xIGFuZCBuZXdlciB2ZXJzaW9ucy4gSXQgaXMgZml4ZWQgaW4gdmVyc2lvbnMKICAgIHNoaXBwZWQgd2l0aCBuZXdlciBWTVMgdmVyc2lvbnMgYW5kIGFsbCBFQ08ga2l0cyBhZnRlciBPY3RvYmVyIDE5OTkuIEl0CiAgICBvbmx5IHNob3dzIHVwIGR1cmluZyB0aGUgZGF5bGlnaHQgc2F2aW5nIHRpbWUgcGVyaW9kIChEU1QpOiBzdGF0KCkKICAgIHJldHVybnMgYSBtb2RpZmljYXRpb24gdGltZSAxIGhvdXIgYWhlYWQuIFRoaXMgcmVzdWx0cyBpbiBHTlUgbWFrZQogICAgd2FybmluZyBtZXNzYWdlcy4gRm9yIGEganVzdCBjcmVhdGVkIHNvdXJjZSB5b3Ugd2lsbCBzZWU6CgogICAgICQgZ21ha2UgeC5leGUKICAgICBnbWFrZS5leGU7MTogKioqIFdhcm5pbmc6IEZpbGUgJ3guYycgaGFzIG1vZGlmaWNhdGlvbiB0aW1lIGluIHRoZSBmdXR1cmUKICAgICAoOTQwNTgyODYzID4gOTQwNTc5MjY5KQogICAgIGNjICAgIC9vYmo9eC5vYmogeC5jCiAgICAgbGluayAgeC5vYmogICAgL2V4ZT14LmV4ZQogICAgIGdtYWtlLmV4ZTsxOiAqKiogV2FybmluZzogIENsb2NrIHNrZXcgZGV0ZWN0ZWQuICBZb3VyIGJ1aWxkIG1heSBiZQogICAgIGluY29tcGxldGUuCgoKQSBjb21wbGV0ZSBsaXN0IG9mIGJ1Z3MgZml4ZWQgaW4gdGhpcyB2ZXJzaW9uIGlzIGF2YWlsYWJsZSBoZXJlOgoKICBodHRwOi8vc2F2YW5uYWguZ251Lm9yZy9idWdzL2luZGV4LnBocD9ncm91cD1tYWtlJnJlcG9ydF9pZD0xMTEmZml4X3JlbGVhc2VfaWQ9MTAyCgoMClZlcnNpb24gMy43OS4xICgyMyBKdW4gMjAwMCkKCiogLlNFQ09OREFSWSB3aXRoIG5vIHByZXJlcXVpc2l0ZXMgbm93IHByZXZlbnRzIGFueSB0YXJnZXQgZnJvbSBiZWluZwogIHJlbW92ZWQgYmVjYXVzZSBtYWtlIHRoaW5rcyBpdCdzIGFuIGludGVybWVkaWF0ZSBmaWxlLCBub3QganVzdCB0aG9zZQogIGxpc3RlZCBpbiB0aGUgbWFrZWZpbGUuCgoqIE5ldyBjb25maWd1cmUgb3B0aW9uIC0tZGlzYWJsZS1uc2VjLXRpbWVzdGFtcHMsIGJ1dCB0aGlzIHdhcwogIHN1cGVyc2VkZWQgaW4gbGF0ZXIgdmVyc2lvbnMgYnkgdGhlIC5MT1dfUkVTT0xVVElPTl9USU1FIHBzZXVkby10YXJnZXQuCgwKVmVyc2lvbiAzLjc5ICgwNCBBcHIgMjAwMCkKCiogR05VIG1ha2Ugb3B0aW9uYWxseSBzdXBwb3J0cyBpbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgbG9jYWxlcyB2aWEgdGhlCiAgR05VIGdldHRleHQgKG9yIGxvY2FsIGdldHRleHQgaWYgc3VpdGFibGUpIHBhY2thZ2UuICBTZWUgdGhlIEFCT1VULU5MUwogIGZpbGUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gY29uZmlndXJpbmcgR05VIG1ha2UgZm9yIE5MUy4KCiogUHJldmlvdXNseSwgR05VIG1ha2UgcXVvdGVkIHZhcmlhYmxlcyBzdWNoIGFzIE1BS0VGTEFHUyBhbmQKICBNQUtFT1ZFUlJJREVTIGZvciBwcm9wZXIgcGFyc2luZyBieSB0aGUgc2hlbGwuICBUaGlzIGFsbG93ZWQgdGhlbSB0bwogIGJlIHVzZWQgd2l0aGluIG1ha2UgYnVpbGQgc2NyaXB0cy4gIEhvd2V2ZXIsIHVzaW5nIHRoZW0gdGhlcmUgaXMgbm90CiAgcHJvcGVyIGJlaGF2aW9yOiB0aGV5IGFyZSBtZWFudCB0byBiZSBwYXNzZWQgdG8gc3Vic2hlbGxzIHZpYSB0aGUKICBlbnZpcm9ubWVudC4gIFVuZm9ydHVuYXRlbHkgdGhlIHZhbHVlcyB3ZXJlIG5vdCBxdW90ZWQgcHJvcGVybHkgdG8gYmUKICBwYXNzZWQgdGhyb3VnaCB0aGUgZW52aXJvbm1lbnQuICBUaGlzIG1lYW50IHRoYXQgbWFrZSBkaWRuJ3QgcHJvcGVybHkKICBwYXNzIHNvbWUgdHlwZXMgb2YgY29tbWFuZCBsaW5lIHZhbHVlcyB0byBzdWJtYWtlcy4KCiAgV2l0aCB0aGlzIHZlcnNpb24gd2UgY2hhbmdlIHRoYXQgYmVoYXZpb3I6IG5vdyB0aGVzZSB2YXJpYWJsZXMgYXJlCiAgcXVvdGVkIHByb3Blcmx5IGZvciBwYXNzaW5nIHRocm91Z2ggdGhlIGVudmlyb25tZW50LCB3aGljaCBpcyB0aGUKICBjb3JyZWN0IHdheSB0byBkbyBpdC4gIElmIHlvdSBwcmV2aW91c2x5IHVzZWQgdGhlc2UgdmFyaWFibGVzCiAgZXhwbGljaXRseSB3aXRoaW4gYSBtYWtlIHJ1bGUgeW91IG1heSBuZWVkIHRvIHJlLWV4YW1pbmUgeW91ciB1c2UgZm9yCiAgY29ycmVjdG5lc3MgZ2l2ZW4gdGhpcyBjaGFuZ2UuCgoqIEEgbmV3IHBzZXVkby10YXJnZXQgLk5PVFBBUkFMTEVMIGlzIGF2YWlsYWJsZS4gIElmIGRlZmluZWQsIHRoZQogIGN1cnJlbnQgbWFrZWZpbGUgaXMgcnVuIHNlcmlhbGx5IHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIC1qLgogIEhvd2V2ZXIsIHN1Ym1ha2VzIGFyZSBzdGlsbCBlbGlnaWJsZSBmb3IgcGFyYWxsZWwgZXhlY3V0aW9uLgoKKiBUaGUgLS1kZWJ1ZyBvcHRpb24gaGFzIGNoYW5nZWQ6IGl0IG5vdyBhbGxvd3Mgb3B0aW9uYWwgZmxhZ3MKICBjb250cm9sbGluZyB0aGUgYW1vdW50IGFuZCB0eXBlIG9mIGRlYnVnZ2luZyBvdXRwdXQuICBCeSBkZWZhdWx0IG9ubHkKICBhIG1pbmltYWwgYW1vdW50IGluZm9ybWF0aW9uIGlzIGdlbmVyYXRlZCwgZGlzcGxheWluZyB0aGUgbmFtZXMgb2YKICAibm9ybWFsIiB0YXJnZXRzIChub3QgbWFrZWZpbGVzKSB0aGF0IHdlcmUgZGVlbWVkIG91dCBvZiBkYXRlIGFuZCBpbgogIG5lZWQgb2YgYmVpbmcgcmVidWlsdC4KCiAgTm90ZSB0aGF0IHRoZSAtZCBvcHRpb24gYmVoYXZlcyBhcyBiZWZvcmU6IGl0IHRha2VzIG5vIGFyZ3VtZW50cyBhbmQKICBhbGwgZGVidWdnaW5nIGluZm9ybWF0aW9uIGlzIGdlbmVyYXRlZC4KCiogVGhlIGAtcCcgKHByaW50IGRhdGFiYXNlKSBvdXRwdXQgbm93IGluY2x1ZGVzIGZpbGVuYW1lIGFuZCBsaW5lbnVtYmVyCiAgaW5mb3JtYXRpb24gZm9yIHZhcmlhYmxlIGRlZmluaXRpb25zLCB0byBhaWQgZGVidWdnaW5nLgoKKiBUaGUgd29yZGxpc3QgZnVuY3Rpb24gbm8gbG9uZ2VyIHJldmVyc2VzIGl0cyBhcmd1bWVudHMgaWYgdGhlICJzdGFydCIKICB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlICJlbmQiIHZhbHVlLiAgSWYgdGhhdCdzIHRydWUsIG5vdGhpbmcgaXMKICByZXR1cm5lZC4KCiogSGFydG11dCBCZWNrZXIgcHJvdmlkZWQgbWFueSB1cGRhdGVzIGZvciB0aGUgVk1TIHBvcnQgb2YgR05VIG1ha2UuCiAgU2VlIHRoZSBSRUFETUUuVk1TIGZpbGUgZm9yIG1vcmUgZGV0YWlscy4KCiogVk1TLXNwZWNpZmljIGNoYW5nZXM6CgogICogRml4IGEgcHJvYmxlbSB3aXRoIGF1dG9tYXRpY2FsbHkgcmVtYWtpbmcgbWFrZWZpbGVzLiBHTlUgbWFrZSB1c2VzIGFuCiAgICBleGVjdmUgdG8gcmVzdGFydCBpdHNlbGYgYWZ0ZXIgYSBzdWNjZXNzZnVsIHJlbWFrZSBvZiB0aGUgbWFrZWZpbGUuIE9uCiAgICBVTklYIHN5c3RlbXMgZXhlY3ZlIHJlcGxhY2VzIHRoZSBydW5uaW5nIHByb2dyYW0gd2l0aCBhIG5ldyBvbmUgYW5kCiAgICByZXNldHMgYWxsIHNpZ25hbCBoYW5kbGluZyB0byB0aGUgZGVmYXVsdC4gT24gVk1TIGV4ZWN2ZSBjcmVhdGVzIGEgY2hpbGQKICAgIHByb2Nlc3MsIHNpZ25hbCBhbmQgZXhpdCBoYW5kbGVycyBvZiB0aGUgcGFyZW50IGFyZSBzdGlsbCBhY3RpdmUsIGFuZCwKICAgIHVuZm9ydHVuYXRlbHksIGNvcnJ1cHQgdGhlIGV4aXQgY29kZSBmcm9tIHRoZSBjaGlsZC4gRml4IGluIGpvYi5jOgogICAgaWdub3JlIFNJR0NITEQuCgogICogQWRkZWQgc29tZSBzd2l0Y2hlcyB0byByZWZsZWN0IGxhdGVzdCBmZWF0dXJlcyBvZiBERUNDLiBNb2RpZmljYXRpb25zIGluCiAgICBtYWtlZmlsZS52bXMuCgogICogU2V0IHNvbWUgZGVmaW5pdGlvbnMgdG8gcmVmbGVjdCBsYXRlc3QgZmVhdHVyZXMgb2YgREVDQy4gTW9kaWZpY2F0aW9ucyBpbgogICAgY29uZmlnLmgtdm1zICh3aGljaCBpcyBjb3BpZWQgdG8gY29uZmlnLmgpLgoKICAqIEFkZGVkIGV4dGVybiBzdHJjbXBpIGRlY2xhcmF0aW9uIHRvIGF2b2lkICdpbXBsaWNpdGx5IGRlY2xhcmVkJyBtZXNzYWdlcy4KICAgIE1vZGlmaWNhdGlvbiBpbiBtYWtlLmguCgogICogRGVmYXVsdCBydWxlIGZvciBDKyssIGNvbmRpdGlvbmFscyBmb3IgZ2NjIChHQ0NfSVNfTkFUSVZFKSBvciBERUMvRGlnaXRhbC8KICAgIENvbXBhcSBjL2MrKyBjb21waWxlcnMuIE1vZGlmaWNhdGlvbnMgaW4gZGVmYXVsdC5jLgoKICAqIFVzYWdlIG9mIG9wZW5kaXIoKSBhbmQgZnJpZW5kcywgc3VwcHJlc3MgZmlsZSB2ZXJzaW9uLiBNb2RpZmljYXRpb25zIGluCiAgICBkaXIuYy4KCiAgKiBBZGRlZCBWTVMgc3BlY2lmaWMgY29kZSB0byBoYW5kbGUgY3RybCtjIGFuZCBjdHJsK3kgdG8gYWJvcnQgbWFrZS4KICAgIE1vZGlmaWNhdGlvbnMgaW4gam9iLmMuCgogICogQWRkZWQgc3VwcG9ydCB0byBoYXZlIGNhc2Ugc2Vuc2l0aXZlIHRhcmdldHMgYW5kIGRlcGVuZGVuY2llcyBidXQgdG8KICAgIHN0aWxsIHVzZSBjYXNlIGJsaW5kIGZpbGUgbmFtZXMuIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgZm9yIEphdmEKICAgIG1ha2VmaWxlcyBvbiBWTVM6CgogICAgICAgIC5TVUZGSVhFUyA6CiAgICAgICAgLlNVRkZJWEVTIDogLmNsYXNzIC5qYXZhCiAgICAgICAgLmphdmEuY2xhc3MgOgogICAgICAgICAgICAgICAgamF2YWMgIiQ8CiAgICAgICAgSGVsbG9Xb3JsZC5jbGFzcyA6ICAgICAgSGVsbG9Xb3JsZC5qYXZhCgogICogQSBuZXcgbWFjcm8gV0FOVF9DQVNFX1NFTlNJVElWRV9UQVJHRVRTIGluIGNvbmZpZy5oLXZtcyB3YXMgaW50cm9kdWNlZC4KICAgIEl0IG5lZWRzIHRvIGJlIGVuYWJsZWQgdG8gZ2V0IHRoaXMgZmVhdHVyZTsgZGVmYXVsdCBpcyBkaXNhYmxlZC4gIFRoZQogICAgbWFjcm8gSEFWRV9DQVNFX0lOU0VOU0lUSVZFX0ZTIG11c3Qgbm90IGJlIHRvdWNoZWQ6IGl0IGlzIHN0aWxsIGVuYWJsZWQuCiAgICBNb2RpZmljYXRpb25zIGluIGZpbGUuYyBhbmQgY29uZmlnLmgtdm1zLgoKICAqIEJvb3RzdHJhcCBtYWtlIHRvIHN0YXJ0IGJ1aWxkaW5nIG1ha2UgaXMgc3RpbGwgbWFrZWZpbGUuY29tLCBidXQgbWFrZQogICAgbmVlZHMgdG8gYmUgcmUtbWFkZSB3aXRoIGEgbWFrZSB0byBtYWtlIGEgY29ycmVjdCB2ZXJzaW9uOiBpZ25vcmUgYWxsCiAgICBwb3NzaWJsZSB3YXJuaW5ncywgZGVsZXRlIGFsbCBvYmplY3RzLCByZW5hbWUgbWFrZS5leGUgdG8gYSBkaWZmZXJlbnQKICAgIG5hbWUgYW5kIHJ1biBpdC4KCiAgKiBNYWRlIHNvbWUgbWlub3IgbW9kaWZpY2F0aW9ucyB0byB0aGUgYm9vdHN0cmFwIGJ1aWxkIG1ha2VmaWxlLmNvbS4KDApWZXJzaW9uIDMuNzggKDIyIFNlcCAxOTk5KQoKKiBUd28gbmV3IGZ1bmN0aW9ucywgJChlcnJvciAuLi4pIGFuZCAkKHdhcm5pbmcgLi4uKSBhcmUgYXZhaWxhYmxlLiAgVGhlCiAgZm9ybWVyIHdpbGwgY2F1c2UgbWFrZSB0byBmYWlsIGFuZCBleGl0IGltbWVkaWF0ZWx5IHVwb24gZXhwYW5zaW9uIG9mCiAgdGhlIGZ1bmN0aW9uLCB3aXRoIHRoZSB0ZXh0IHByb3ZpZGVkIGFzIHRoZSBlcnJvciBtZXNzYWdlLiAgVGhlIGxhdHRlcgogIGNhdXNlcyB0aGUgdGV4dCBwcm92aWRlZCB0byBiZSBwcmludGVkIGFzIGEgd2FybmluZyBtZXNzYWdlLCBidXQgbWFrZQogIHByb2NlZWRzIG5vcm1hbGx5LgoKKiBBIG5ldyBmdW5jdGlvbiAkKGNhbGwgLi4uKSBpcyBhdmFpbGFibGUuICBUaGlzIGFsbG93cyB1c2VycyB0byBjcmVhdGUKICB0aGVpciBvd24gcGFyYW1ldGVyaXplZCBtYWNyb3MgYW5kIGludm9rZSB0aGVtIGxhdGVyLiAgT3JpZ2luYWwKICBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIHdhcyBwcm92aWRlZCBieSBIYW4tV2VuIE5pZW5odXlzCiAgPGhhbndlbkBjcy51dS5ubD4uCgoqIEEgbmV3IGZ1bmN0aW9uICQoaWYgLi4uKSBpcyBhdmFpbGFibGUuICBJdCBwcm92aWRlcyBpZi10aGVuLWVsc2UKICBjYXBhYmlsaXRpZXMgaW4gYSBidWlsdGluIGZ1bmN0aW9uLiAgT3JpZ2luYWwgaW1wbGVtZW50YXRpb24gb2YgdGhpcwogIGZ1bmN0aW9uIHdhcyBwcm92aWRlZCBieSBIYW4tV2VuIE5pZW5odXlzIDxoYW53ZW5AY3MudXUubmw+LgoKKiBNYWtlIGRlZmluZXMgYSBuZXcgdmFyaWFibGUsIC5MSUJQQVRURVJOUy4gIFRoaXMgdmFyaWFibGUgY29udHJvbHMgaG93CiAgbGlicmFyeSBkZXBlbmRlbmN5IGV4cGFuc2lvbiAoZGVwZW5kZW5jaWVzIGxpa2UgYGAtbGZvbycnKSBpcyBwZXJmb3JtZWQuCgoqIE1ha2UgYWNjZXB0cyBDUkxGIHNlcXVlbmNlcyBhcyB3ZWxsIGFzIHRyYWRpdGlvbmFsIExGLCBmb3IKICBjb21wYXRpYmlsaXR5IHdpdGggbWFrZWZpbGVzIGNyZWF0ZWQgb24gb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMuCgoqIE1ha2UgYWNjZXB0cyBhIG5ldyBvcHRpb246IC1SLCBvciAtLW5vLWJ1aWx0aW4tdmFyaWFibGVzLiAgVGhpcyBvcHRpb24KICBkaXNhYmxlcyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgcnVsZS1zcGVjaWZpYyBidWlsdGluIHZhcmlhYmxlcyAoQ0MsCiAgTEQsIEFSLCBldGMuKS4gIFNwZWNpZnlpbmcgdGhpcyBvcHRpb24gZm9yY2VzIC1yICgtLW5vLWJ1aWx0aW4tcnVsZXMpCiAgYXMgd2VsbC4KCiogQSAiam9iIHNlcnZlciIgZmVhdHVyZSwgc3VnZ2VzdGVkIGJ5IEhvd2FyZCBDaHUgPGh5Y0BoaWdobGFuZHN1bi5jb20+LgoKICBPbiBzeXN0ZW1zIHRoYXQgc3VwcG9ydCBQT1NJWCBwaXBlKDIpIHNlbWFudGljcywgR05VIG1ha2UgY2FuIG5vdyBwYXNzCiAgLWpOIG9wdGlvbnMgdG8gc3VibWFrZXMgcmF0aGVyIHRoYW4gZm9yY2luZyB0aGVtIGFsbCB0byB1c2UgLWoxLiAgVGhlCiAgdG9wIG1ha2UgYW5kIGFsbCBpdHMgc3ViLW1ha2UgcHJvY2Vzc2VzIHVzZSBhIHBpcGUgdG8gY29tbXVuaWNhdGUgd2l0aAogIGVhY2ggb3RoZXIgdG8gZW5zdXJlIHRoYXQgbm8gbW9yZSB0aGFuIE4gam9icyBhcmUgc3RhcnRlZCBhY3Jvc3MgYWxsCiAgbWFrZXMuICBUbyBnZXQgdGhlIG9sZCBiZWhhdmlvciBvZiAtaiBiYWNrLCB5b3UgY2FuIGNvbmZpZ3VyZSBtYWtlCiAgd2l0aCB0aGUgLS1kaXNhYmxlLWpvYi1zZXJ2ZXIgb3B0aW9uLgoKKiBUaGUgY29uZnVzaW5nIHRlcm0gImRlcGVuZGVuY3kiIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IHRoZSBtb3JlIGFjY3VyYXRlCiAgYW5kIHN0YW5kYXJkIHRlcm0gInByZXJlcXVpc2l0ZSIsIGJvdGggaW4gdGhlIG1hbnVhbCBhbmQgaW4gYWxsIEdOVSBtYWtlCiAgb3V0cHV0LgoKKiBHTlUgbWFrZSBzdXBwb3J0cyB0aGUgImJpZyBhcmNoaXZlIiBsaWJyYXJ5IGZvcm1hdCBpbnRyb2R1Y2VkIGluIEFJWCA0LjMuCgoqIEdOVSBtYWtlIHN1cHBvcnRzIGxhcmdlIGZpbGVzIG9uIEFJWCwgSFAtVVgsIGFuZCBJUklYLiAgVGhlc2UgY2hhbmdlcwogIHdlcmUgcHJvdmlkZWQgYnkgUGF1bCBFZ2dlcnQgPGVnZ2VydEB0d2luc3VuLmNvbT4uICAoTGFyZ2UgZmlsZQogIHN1cHBvcnQgZm9yIFNvbGFyaXMgYW5kIExpbnV4IHdhcyBpbnRyb2R1Y2VkIGluIDMuNzcsIGJ1dCB0aGUKICBjb25maWd1cmF0aW9uIGhhZCBpc3N1ZXM6IHRoZXNlIGhhdmUgYWxzbyBiZWVuIHJlc29sdmVkKS4KCiogVGhlIFdpbmRvd3MgOTUvOTgvTlQgKFczMikgdmVyc2lvbiBvZiBHTlUgbWFrZSBub3cgaGFzIG5hdGl2ZSBzdXBwb3J0CiAgZm9yIHRoZSBDeWdudXMgQ3lnd2luIHJlbGVhc2UgQjIwLjEgc2hlbGwgKGJhc2gpLgoKKiBUaGUgR05VIG1ha2UgcmVncmVzc2lvbiB0ZXN0IHN1aXRlLCBsb25nIGF2YWlsYWJsZSBzZXBhcmF0ZWx5ICJ1bmRlcgogIHRoZSB0YWJsZSIsIGhhcyBiZWVuIGludGVncmF0ZWQgaW50byB0aGUgcmVsZWFzZS4gIFlvdSBjYW4gaW52b2tlIGl0CiAgYnkgcnVubmluZyAibWFrZSBjaGVjayIgaW4gdGhlIGRpc3RyaWJ1dGlvbi4gIE5vdGUgdGhhdCBpdCByZXF1aXJlcwogIFBlcmwgKGVpdGhlciBQZXJsIDQgb3IgUGVybCA1KSB0byBydW4uCgwKVmVyc2lvbiAzLjc3ICgyOCBKdWwgMTk5OCkKCiogSW1wbGVtZW50IEJTRCBtYWtlJ3MgIj89IiB2YXJpYWJsZSBhc3NpZ25tZW50IG9wZXJhdG9yLiAgVGhlIHZhcmlhYmxlCiAgaXMgYXNzaWduZWQgdGhlIHNwZWNpZmllZCB2YWx1ZSBvbmx5IGlmIHRoYXQgdmFyaWFibGUgaXMgbm90IGFscmVhZHkKICBkZWZpbmVkLgoKKiBNYWtlIGRlZmluZXMgYSBuZXcgdmFyaWFibGUsICJDVVJESVIiLCB0byBjb250YWluIHRoZSBjdXJyZW50IHdvcmtpbmcKICBkaXJlY3RvcnkgKGFmdGVyIHRoZSAtQyBvcHRpb24sIGlmIGFueSwgaGFzIGJlZW4gcHJvY2Vzc2VkKS4KICBNb2RpZnlpbmcgdGhpcyB2YXJpYWJsZSBoYXMgbm8gZWZmZWN0IG9uIHRoZSBvcGVyYXRpb24gb2YgbWFrZS4KCiogTWFrZSBkZWZpbmVzIGEgbmV3IGRlZmF1bHQgUkNTIHJ1bGUsIGZvciBuZXctc3R5bGUgbWFzdGVyIGZpbGUKICBzdG9yYWdlOiBgYCUgOjogUkNTLyUnJyAobm90ZSBubyBgYCx2Jycgc3VmZml4KS4KCiAgTWFrZSBkZWZpbmVzIG5ldyBkZWZhdWx0IHJ1bGVzIGZvciBET1Mtc3R5bGUgQysrIGZpbGUgbmFtaW5nCiAgY29udmVudGlvbnMsIHdpdGggYGAuY3BwJycgc3VmZml4ZXMuICBBbGwgdGhlIHNhbWUgcnVsZXMgYXMgZm9yCiAgYGAuY2MnJyBhbmQgYGAuQycnIHN1ZmZpeGVzIGFyZSBwcm92aWRlZCwgYWxvbmcgd2l0aCBMSU5LLmNwcCBhbmQKICBDT01QSUxFLmNwcCBtYWNyb3MgKHdoaWNoIGRlZmF1bHQgdG8gdGhlIHNhbWUgdmFsdWUgYXMgTElOSy5jYyBhbmQKICBDT01QSUxFLmNjKS4gIE5vdGUgQ1BQRkxBR1MgaXMgc3RpbGwgQyBwcmVwcm9jZXNzb3IgZmxhZ3MhICBZb3Ugc2hvdWxkCiAgdXNlIENYWEZMQUdTIHRvIGNoYW5nZSBDKysgY29tcGlsZXIgZmxhZ3MuCgoqIEEgbmV3IGZlYXR1cmUsICJ0YXJnZXQtc3BlY2lmaWMgdmFyaWFibGUgdmFsdWVzIiwgaGFzIGJlZW4gYWRkZWQuCiAgVGhpcyBpcyBhIGxhcmdlIGNoYW5nZSBzbyBwbGVhc2Ugc2VlIHRoZSBhcHByb3ByaWF0ZSBzZWN0aW9ucyBvZiB0aGUKICBtYW51YWwgZm9yIGZ1bGwgZGV0YWlscy4gIEJyaWVmbHksIHN5bnRheCBsaWtlIHRoaXM6CgogICAgVEFSR0VUOiBWQVJJQUJMRSA9IFZBTFVFCgogIGRlZmluZXMgVkFSSUFCTEUgYXMgVkFMVUUgd2l0aGluIHRoZSBjb250ZXh0IG9mIFRBUkdFVC4gIFRoaXMgaXMKICBzaW1pbGFyIHRvIFN1bk9TIG1ha2UncyAiVEFSR0VUIDo9IFZBUklBQkxFID0gVkFMVUUiIGZlYXR1cmUuICBOb3RlCiAgdGhhdCB0aGUgYXNzaWdubWVudCBtYXkgYmUgb2YgYW55IHR5cGUsIG5vdCBqdXN0IHJlY3Vyc2l2ZSwgYW5kIHRoYXQKICB0aGUgb3ZlcnJpZGUga2V5d29yZCBpcyBhdmFpbGFibGUuCgogIENPTVBBVElCSUxJVFk6IFRoaXMgbmV3IHN5bnRheCBtZWFucyB0aGF0IGlmIHlvdSBoYXZlIGFueSBydWxlcyB3aGVyZQogIHRoZSBmaXJzdCBvciBzZWNvbmQgZGVwZW5kZW5jeSBoYXMgYW4gZXF1YWwgc2lnbiAoPSkgaW4gaXRzIG5hbWUsCiAgeW91J2xsIGhhdmUgdG8gZXNjYXBlIHRoZW0gd2l0aCBhIGJhY2tzbGFzaDogImZvbyA6IGJhclw9YmF6Ii4KICBGdXJ0aGVyLCBpZiB5b3UgaGF2ZSBhbnkgZGVwZW5kZW5jaWVzIHdoaWNoIGFscmVhZHkgY29udGFpbiAiXD0iLAogIHlvdSdsbCBoYXZlIHRvIGVzY2FwZSBib3RoIG9mIHRoZW06ICJmb28gOiBiYXJcXFw9YmF6Ii4KCiogQSBuZXcgYXBwZW5kaXggbGlzdGluZyB0aGUgbW9zdCBjb21tb24gZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZXMKICBnZW5lcmF0ZWQgYnkgR05VIG1ha2UsIHdpdGggc29tZSBleHBsYW5hdGlvbiwgaGFzIGJlZW4gYWRkZWQgdG8gdGhlCiAgR05VIG1ha2UgVXNlcidzIE1hbnVhbC4KCiogVXBkYXRlcyB0byB0aGUgR05VIG1ha2UgQ3VzdG9tcyBsaWJyYXJ5IHN1cHBvcnQgKHNlZSBSRUFETUUuY3VzdG9tcykuCgoqIFVwZGF0ZXMgdG8gdGhlIFdpbmRvd3MgOTUvTlQgcG9ydCBmcm9tIFJvYiBUdWxsb2ggKHNlZSBSRUFETUUuVzMyKSwKICBhbmQgdG8gdGhlIERPUyBwb3J0IGZyb20gRWxpIFphcmV0c2tpIChzZWUgUkVBRE1FLkRPUykuCgoqIFZNUy1zcGVjaWZpYyBjaGFuZ2VzOgoKICAqIFRoaXMgaXMgdGhlIFZNUyBwb3J0IG9mIEdOVSBNYWtlLgogICAgSXQgaXMgYmFzZWQgb24gdGhlIFZNUyBwb3J0IG9mIEdOVSBNYWtlIDMuNjAgYnkgTWlrZSBNb3JldHRpLgogICAgVGhpcyBwb3J0IHdhcyBkb25lIGJ5IEtsYXVzIEvkbXBmIDxra2FlbXBmQHJtaS5kZT4KCiAgKiBUaGVyZSBpcyBmaXJzdC1sZXZlbCBzdXBwb3J0IGF2YWlsYWJsZSBmcm9tIHByb0dJUyBTb2Z0d2FyZSwgR2VybWFueS4KICAgIFZpc2l0IHRoZWlyIHdlYi1zaXRlIGF0IGh0dHA6Ly93d3cucHJvZ2lzLmRlIHRvIGdldCBpbmZvcm1hdGlvbgogICAgYWJvdXQgb3RoZXIgdm1zIHNvZnR3YXJlIGFuZCBmb3J0aGNvbWluZyB1cGRhdGVzIHRvIGdudSBtYWtlLgoKICAqIC9iaW4vc2ggc3R5bGUgSS9PIHJlZGlyZWN0aW9uIGlzIHN1cHBvcnRlZC4gWW91IGNhbiBub3cgd3JpdGUgbGluZXMgbGlrZQogICAgICAgIG1jciBzeXMkZGlzazpbXXByb2dyYW0uZXhlIDwgaW5wdXQudHh0ID4gb3V0cHV0LnR4dCAmPiBlcnJvci50eHQKCiAgKiBNYWtlZmlsZSB2YXJpYWJsZXMgYXJlIGxvb2tlZCB1cCBpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudC4gWW91IGNhbiBzZXQKICAgIHN5bWJvbHMgb3IgbG9naWNhbHMgaW4gRENMIGFuZCBldmFsdWF0ZSB0aGVtIGluIHRoZSBNYWtlZmlsZSB2aWEKICAgICQoPG5hbWUtb2Ytc3ltYm9sLW9yLWxvZ2ljYWw+KS4gIFZhcmlhYmxlcyBkZWZpbmVkIGluIHRoZSBNYWtlZmlsZQogICAgb3ZlcnJpZGUgVk1TIHN5bWJvbHMvbG9naWNhbHMgIQoKICAqIEZ1bmN0aW9ucyBmb3IgZmlsZSBuYW1lcyBhcmUgd29ya2luZyBub3cuIFNlZSB0aGUgR05VIE1ha2UgbWFudWFsIGZvcgogICAgJChkaXIgLi4uKSAgYW5kICQod2lsZGNhcmQgLi4uKS4gIFVuaXgtc3R5bGUgYW5kIFZNUy1zdHlsZSBuYW1lcyBhcmUKICAgIHN1cHBvcnRlZCBhcyBhcmd1bWVudHMuCgogICogVGhlIGRlZmF1bHQgcnVsZXMgYXJlIHNldCB1cCBmb3IgR05VIEMuIEJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZnJvbSBhCiAgICBzaW5nbGUgc291cmNlIGZpbGUgaXMgYXMgZWFzeSBhcyAnbWFrZSBmaWxlLmV4ZScuCgogICogVGhlIHZhcmlhYmxlICQoQVJDSCkgaXMgcHJlZGVmaW5lZCBhcyBBTFBIQSBvciBWQVggcmVzcC4gTWFrZWZpbGVzIGZvcgogICAgZGlmZmVyZW50IFZNUyBzeXN0ZW1zIGNhbiBub3cgYmUgd3JpdHRlbiBieSBjaGVja2luZyAkKEFSQ0gpIGFzIGluCiAgICAgIGlmZXEgKCQoQVJDSCksQUxQSEEpCiAgICAgICAgJChFQ0hPKSAiT24gdGhlIEFscGhhIgogICAgICBlbHNlCiAgICAgICAgJChFQ0hPKSAiT24gdGhlIFZBWCIKICAgICAgZW5kaWYKCiAgKiBDb21tYW5kIGxpbmVzIG9mIGV4Y2Vzc2l2ZSBsZW5ndGggYXJlIGNvcnJlY3RseSBicm9rZW4gYW5kIHdyaXR0ZW4gdG8gYQogICAgYmF0Y2ggZmlsZSBpbiBzeXMkc2NyYXRjaCBmb3IgbGF0ZXIgZXhlY3V0aW9uLiBUaGVyZSdzIG5vIGxpbWl0IHRvIHRoZQogICAgbGVuZ3RocyBvZiBjb21tYW5kcyAoYW5kIG5vIG5lZWQgZm9yIC5vcHQgZmlsZXMgOi0pIGFueSBtb3JlLgoKICAqIEVtcHR5IGNvbW1hbmRzIGFyZSBoYW5kbGVkIGNvcnJlY3RseSBhbmQgZG9uJ3QgZW5kIGluIGEgbmV3IERDTCBwcm9jZXNzLgoMClZlcnNpb24gMy43Ni4xICgxOSBTZXAgMTk5NykKCiogU21hbGwgKGJ1dCBzZXJpb3VzKSBidWcgZml4LiAgUXVpY2sgcm9sbG91dCB0byBnZXQgaW50byB0aGUgR05VIHNvdXJjZSBDRC4KDApWZXJzaW9uIDMuNzYgKDE2IFNlcCAxOTk3KQoKKiBHTlUgbWFrZSBub3cgdXNlcyBhdXRvbWFrZSB0byBjb250cm9sIE1ha2VmaWxlLmluIGdlbmVyYXRpb24uICBUaGlzCiAgc2hvdWxkIG1ha2UgaXQgbW9yZSBjb25zaXN0ZW50IHdpdGggdGhlIEdOVSBzdGFuZGFyZHMuCgoqIFZQQVRIIGZ1bmN0aW9uYWxpdHkgaGFzIGJlZW4gY2hhbmdlZCB0byBpbmNvcnBvcmF0ZSB0aGUgVlBBVEgrIHBhdGNoLAogIHByZXZpb3VzbHkgbWFpbnRhaW5lZCBieSBQYXVsIFNtaXRoIDxwc21pdGhAYmF5bmV0d29ya3MuY29tPi4gIFNlZSB0aGUKICBtYW51YWwuCgoqIE1ha2UgZGVmaW5lcyBhIG5ldyB2YXJpYWJsZSwgYE1BS0VDTURHT0FMUycsIHRvIGNvbnRhaW4gdGhlIGdvYWxzIHRoYXQKICB3ZXJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBpZiBhbnkuICBNb2RpZnlpbmcgdGhpcyB2YXJpYWJsZQogIGhhcyBubyBlZmZlY3Qgb24gdGhlIG9wZXJhdGlvbiBvZiBtYWtlLgoKKiBBIG5ldyBmdW5jdGlvbiwgYCQod29yZGxpc3QgUyxFLFRFWFQpJywgaXMgYXZhaWxhYmxlOiBpdCByZXR1cm5zIGEKICBsaXN0IG9mIHdvcmRzIGZyb20gbnVtYmVyIFMgdG8gbnVtYmVyIEUgKGluY2x1c2l2ZSkgb2YgVEVYVC4KCiogSW5zdGVhZCBvZiBhbiBlcnJvciwgZGV0ZWN0aW9uIG9mIGZ1dHVyZSBtb2RpZmljYXRpb24gdGltZXMgZ2l2ZXMgYQogIHdhcm5pbmcgYW5kIGNvbnRpbnVlcy4gIFRoZSB3YXJuaW5nIGlzIHJlcGVhdGVkIGp1c3QgYmVmb3JlIEdOVSBtYWtlCiAgZXhpdHMsIHNvIGl0IGlzIGxlc3MgbGlrZWx5IHRvIGJlIGxvc3QuCgoqIEZpeCB0aGUgJChiYXNlbmFtZSkgYW5kICQoc3VmZml4KSBmdW5jdGlvbnMgc28gdGhleSBvbmx5IG9wZXJhdGUgb24KICB0aGUgbGFzdCBmaWxlbmFtZSwgbm90IHRoZSBlbnRpcmUgc3RyaW5nOgoKICAgICAgQ29tbWFuZCAgICAgICAgICAgICAgT2xkIFJlc3VsdCAgICAgICAgICAgICBOZXcgUmVzdWx0CiAgICAgIC0tLS0tLS0gICAgICAgICAgICAgIC0tLS0tLS0tLS0gICAgICAgICAgICAgLS0tLS0tLS0tLQogICAgJChiYXNlbmFtZSBhLmIpICAgICAgICBhICAgICAgICAgICAgICAgICAgICAgIGEKICAgICQoYmFzZW5hbWUgYS5iL2MpICAgICAgYSAgICAgICAgICAgICAgICAgICAgICBhLmIvYwogICAgJChzdWZmaXggYS5iKSAgICAgICAgICBiICAgICAgICAgICAgICAgICAgICAgIGIKICAgICQoc3VmZml4IGEuYi9jKSAgICAgICAgYi9jICAgICAgICAgICAgICAgICAgICA8ZW1wdHk+CgoqIFRoZSAkKHN0cmlwKSBmdW5jdGlvbiBub3cgcmVtb3ZlcyBuZXdsaW5lcyBhcyB3ZWxsIGFzIFRBQnMgYW5kIHNwYWNlcy4KCiogVGhlICQoc2hlbGwpIGZ1bmN0aW9uIG5vdyBjaGFuZ2VzIENSTEYgKFxyXG4pIHBhaXJzIHRvIGEgc3BhY2UgYXMgd2VsbAogIGFzIG5ld2xpbmVzIChcbikuCgoqIFVwZGF0ZXMgdG8gdGhlIFdpbmRvd3MgOTUvTlQgcG9ydCBmcm9tIFJvYiBUdWxsb2ggKHNlZSBSRUFETUUuVzMyKS4KCiogRWxpIFphcmV0c2tpaSBoYXMgdXBkYXRlZCB0aGUgcG9ydCB0byAzMi1iaXQgcHJvdGVjdGVkIG1vZGUgb24gTVNET1MKICBhbmQgTVMtV2luZG93cywgYnVpbGRpbmcgd2l0aCB0aGUgREpHUFAgdjIgcG9ydCBvZiBHTlUgQy9DKysgY29tcGlsZXIKICBhbmQgdXRpbGl0aWVzLiAgU2VlIFJFQURNRS5ET1MgZm9yIGRldGFpbHMsIGFuZCBkaXJlY3QgYWxsIHF1ZXN0aW9ucwogIGNvbmNlcm5pbmcgdGhpcyBwb3J0IHRvIEVsaSBaYXJldHNraWkgPGVsaXpAaXMuZWx0YS5jby5pbD4gb3IgREoKICBEZWxvcmllIDxkakBkZWxvcmllLmNvbT4uCgoqIFZNUy1zcGVjaWZpYyBjaGFuZ2VzOgoKICAqIEpvaG4gVy4gRWF0b24gaGFzIHVwZGF0ZWQgdGhlIFZNUyBwb3J0IHRvIHN1cHBvcnQgbGlicmFyaWVzIGFuZCBWUEFUSC4KCiAgKiBUaGUgY2QgY29tbWFuZCBpcyBzdXBwb3J0ZWQgaWYgaXQncyBjYWxsZWQgYXMgJChDRCkuIFRoaXMgaW52b2tlcwogICAgdGhlICdidWlsdGluX2NkJyBjb21tYW5kIHdoaWNoIGNoYW5nZXMgdGhlIGRpcmVjdG9yeS4KICAgIENhbGxpbmcgJ3NldCBkZWYnIGRvZXNuJ3QgZG8gdGhlIHRyaWNrLCBzaW5jZSBhIHN1Yi1zaGVsbCBpcwogICAgc3Bhd25lZCBmb3IgdGhpcyBjb21tYW5kLCB0aGUgZGlyZWN0b3J5IGlzIGNoYW5nZWQgKmluIHRoaXMgc3ViLXNoZWxsKgogICAgYW5kIHRoZSBzdWItc2hlbGwgZW5kcy4KCiAgKiBMaWJyYXJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIFRoZXkgd2VyZSBpbiBHTlUgTWFrZSAzLjYwIGJ1dCBzb21laG93IEkKICAgIGRpZG4ndCBjYXJlIHBvcnRpbmcgdGhlIGNvZGUuIElmIHRoZXJlIGlzIGVub3VnaCBpbnRlcmVzdCwgSSdsbCBkbyBpdCBhdAogICAgc29tZSBsYXRlciB0aW1lLgoKICAqIFRoZSB2YXJpYWJsZSAkXiBzZXBhcmF0ZXMgZmlsZXMgd2l0aCBjb21tYXMgaW5zdGVhZCBvZiBzcGFjZXMgKEl0J3MgdGhlCiAgICBuYXR1cmFsIHRoaW5nIHRvIGRvIGZvciBWTVMpLgoKICAqIFNlZSBkZWZhdWx0cy5jIGZvciBWTVMgZGVmYXVsdCBzdWZmaXhlcyBhbmQgbXkgZGVmaW5pdGlvbnMgZm9yIGRlZmF1bHQKICAgIHJ1bGVzIGFuZCB2YXJpYWJsZXMuCgogICogVGhlIHNoZWxsIGZ1bmN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuCgogICogTG9hZCBhdmVyYWdlIHJvdXRpbmVzIGhhdmVuJ3QgYmVlbiBpbXBsZW1lbnRlZCBmb3IgVk1TIHlldC4KCiAgKiBUaGUgZGVmYXVsdCBpbmNsdWRlIGRpcmVjdG9yeSBmb3IgaW5jbHVkaW5nIG90aGVyIG1ha2VmaWxlcyBpcwogICAgU1lTJFNZU1JPT1Q6W1NZU0xJQl0gKEkgZG9uJ3QgcmVtZW1iZXIgd2h5IEkgZGlkbid0IGp1c3QgdXNlCiAgICBTWVMkTElCUkFSWTogaW5zdGVhZDsgbWF5YmUgaXQgd291bGRuJ3Qgd29yayB0aGF0IHdheSkuCgogICogVGhlIGRlZmF1bHQgbWFrZWZpbGVzIG1ha2UgbG9va3MgZm9yIGFyZTogbWFrZWZpbGUudm1zLCBnbnVtYWtlZmlsZSwKICAgIG1ha2VmaWxlLiwgYW5kIGdudW1ha2VmaWxlLiAuCgogICogVGhlIHN0YXQoKSBmdW5jdGlvbiBhbmQgaGFuZGxpbmcgb2YgdGltZSBzdGFtcHMgaW4gVk1TIGlzIGJyb2tlbiwgc28gSQogICAgcmVwbGFjZWQgaXQgd2l0aCBhIGhhY2sgaW4gdm1zZnVuY3Rpb25zLmMuIEkgd2lsbCBwcm92aWRlIGEgZnVsbCByZXdyaXRlCiAgICBzb21ld2hlcmUgaW4gdGhlIGZ1dHVyZS4gQmUgd2FybmVkLCB0aGUgdGltZSByZXNvbHV0aW9uIGluc2lkZSBtYWtlIGlzCiAgICBsZXNzIHRoYW4gd2hhdCB2bXMgcHJvdmlkZXMuIFRoaXMgbWlnaHQgYmUgYSBwcm9ibGVtIG9uIHRoZSBmYXN0ZXIgQWxwaGFzLgoKICAqIFlvdSBjYW4gdXNlIGEgOiBpbiBhIGZpbGVuYW1lIG9ubHkgaWYgeW91IHByZWNlZGUgaXQgd2l0aCBhIGJhY2tzbGFzaCAoJ1wnKS4KICAgIEUuZy4tIGhvYmJlc1w6W2JvZ2FzLmZpbGVzXQoKICAqIE1ha2UgaWdub3JlcyBzdWNjZXNzLCBpbmZvcm1hdGlvbmFsLCBvciB3YXJuaW5nIGVycm9ycyAoLVMtLCAtSS0sIG9yIC1XLSkuCiAgICBCdXQgaXQgd2lsbCBzdG9wIG9uIC1FLSBhbmQgLUYtIGVycm9ycy4gKHVubGVzcyB5b3UgZG8gc29tZXRoaW5nCiAgICB0byBvdmVycmlkZSB0aGlzIGluIHlvdXIgbWFrZWZpbGUsIG9yIHdoYXRldmVyKS4KCiAgKiBSZW1vdGUgc3R1ZmYgaXNuJ3QgaW1wbGVtZW50ZWQgeWV0LgoKICAqIE11bHRpcGxlIGxpbmUgRENMIGNvbW1hbmRzLCBzdWNoIGFzICJpZiIgc3RhdGVtZW50cywgbXVzdCBiZSBwdXQgaW5zaWRlCiAgICBjb21tYW5kIGZpbGVzLiAgWW91IGNhbiBydW4gYSBjb21tYW5kIGZpbGUgYnkgdXNpbmcgXEAuCgpWZXJzaW9uIDMuNzUgKDI3IEF1ZyAxOTk2KQoKKiBUaGUgZGlyZWN0b3J5IG1lc3NhZ2VzIHByaW50ZWQgYnkgYC13JyBhbmQgaW1wbGljaXRseSBpbiBzdWItbWFrZXMsCiAgYXJlIG5vdyBvbWl0dGVkIGlmIE1ha2UgcnVucyBubyBjb21tYW5kcyBhbmQgaGFzIG5vIG90aGVyIG1lc3NhZ2VzIHRvIHByaW50LgoKKiBNYWtlIG5vdyBkZXRlY3RzIGZpbGVzIHRoYXQgZm9yIHdoYXRldmVyIHJlYXNvbiBoYXZlIG1vZGlmaWNhdGlvbiB0aW1lcwogIGluIHRoZSBmdXR1cmUgYW5kIGdpdmVzIGFuIGVycm9yLiAgRmlsZXMgd2l0aCBzdWNoIGltcG9zc2libGUgdGltZXN0YW1wcwogIGNhbiByZXN1bHQgZnJvbSB1bnN5bmNocm9uaXplZCBjbG9ja3MsIG9yIGFyY2hpdmVkIGRpc3RyaWJ1dGlvbnMKICBjb250YWluaW5nIGJvZ3VzIHRpbWVzdGFtcHM7IHRoZXkgY29uZnVzZSBNYWtlJ3MgZGVwZW5kZW5jeSBlbmdpbmUKICB0aG9yb3VnaGx5LgoKKiBUaGUgbmV3IGRpcmVjdGl2ZSBgc2luY2x1ZGUnIGlzIG5vdyByZWNvZ25pemVkIGFzIGFub3RoZXIgbmFtZSBmb3IKICBgLWluY2x1ZGUnLCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHNvbWUgb3RoZXIgTWFrZXMuCgoqIEFhcm9uIERpZ3VsbGEgaGFzIGNvbnRyaWJ1dGVkIGEgcG9ydCB0byBBbWlnYURPUy4gIFNlZSBSRUFETUUuQW1pZ2EgZm9yCiAgZGV0YWlscywgYW5kIGRpcmVjdCBhbGwgQW1pZ2EtcmVsYXRlZCBxdWVzdGlvbnMgdG8gPGRpZ3VsbGFAZmgta29uc3RhbnouZGU+LgoKKiBSb2IgVHVsbG9oIG9mIFRpdm9saSBTeXN0ZW1zIGhhcyBjb250cmlidXRlZCBhIHBvcnQgdG8gV2luZG93cyBOVCBvciA5NS4KICBTZWUgUkVBRE1FLlczMiBmb3IgZGV0YWlscywgYW5kIGRpcmVjdCBhbGwgV2luZG93cy1yZWxhdGVkIHF1ZXN0aW9ucyB0bwogIDxyb2JfdHVsbG9oQHRpdm9saS5jb20+LgoKKiBWTVMtc3BlY2lmaWMgY2hhbmdlczoKCiAgKiBMb3RzIG9mIGRlZmF1bHQgc2V0dGluZ3MgYXJlIGFkYXB0ZWQgZm9yIFZNUy4gU2VlIGRlZmF1bHQuYy4KCiAgKiBMb25nIGNvbW1hbmQgbGluZXMgYXJlIG5vdyBjb252ZXJ0ZWQgdG8gY29tbWFuZCBmaWxlcy4KCiAgKiBDb21tYSAoJywnKSBhcyBhIHNlcGFyYXRvciBpcyBub3cgYWxsb3dlZC4gU2VlIG1ha2VmaWxlLnZtcyBmb3IgYW4gZXhhbXBsZS4KDApWZXJzaW9uIDMuNzMgKDA1IEFwciAxOTk1KQoKKiBDb252ZXJ0ZWQgdG8gdXNlIEF1dG9jb25mIHZlcnNpb24gMiwgc28gYGNvbmZpZ3VyZScgaGFzIHNvbWUgbmV3IG9wdGlvbnMuCiAgU2VlIElOU1RBTEwgZm9yIGRldGFpbHMuCgoqIFlvdSBjYW4gbm93IHNlbmQgYSBTSUdVU1IxIHNpZ25hbCB0byBNYWtlIHRvIHRvZ2dsZSBwcmludGluZyBvZiBkZWJ1Z2dpbmcKICBvdXRwdXQgZW5hYmxlZCBieSAtZCwgYXQgYW55IHRpbWUgZHVyaW5nIHRoZSBydW4uCgwKVmVyc2lvbiAzLjcyICgwNCBOb3YgMTk5NCkKCiogREogRGVsb3JpZSBoYXMgcG9ydGVkIE1ha2UgdG8gTVMtRE9TIHVzaW5nIHRoZSBHTzMyIGV4dGVuZGVyLgogIEhlIGlzIG1haW50YWluaW5nIHRoZSBET1MgcG9ydCwgbm90IHRoZSBHTlUgTWFrZSBtYWludGFpbmVyOwogIHBsZWFzZSBkaXJlY3QgYnVncyBhbmQgcXVlc3Rpb25zIGZvciBET1MgdG8gPGRqZ3BwQHN1bi5zb2UuY2xhcmtzb24uZWR1Pi4KICBNUy1ET1MgYmluYXJpZXMgYXJlIGF2YWlsYWJsZSBmb3IgRlRQIGZyb20gZnRwLnNpbXRlbC5uZXQgaW4KICAvcHViL3NpbXRlbG5ldC9nbnUvZGpncHAvLgoKKiBUaGUgYE1BS0VGTEFHUycgdmFyaWFibGUgKGluIHRoZSBlbnZpcm9ubWVudCBvciBpbiBhIG1ha2VmaWxlKSBjYW4gbm93CiAgY29udGFpbiB2YXJpYWJsZSBkZWZpbml0aW9ucyBpdHNlbGY7IHRoZXNlIGFyZSB0cmVhdGVkIGp1c3QgbGlrZQogIGNvbW1hbmQgbGluZSB2YXJpYWJsZSBkZWZpbml0aW9ucy4gIE1ha2Ugd2lsbCBhdXRvbWF0aWNhbGx5IGluc2VydCBhbnkKICB2YXJpYWJsZSBkZWZpbml0aW9ucyBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YWx1ZSBvZiBgTUFLRUZMQUdTJyBvciBmcm9tCiAgdGhlIGNvbW1hbmQgbGluZSwgaW50byB0aGUgYE1BS0VGTEFHUycgdmFsdWUgZXhwb3J0ZWQgdG8gY2hpbGRyZW4uICBUaGUKICBgTUFLRU9WRVJSSURFUycgdmFyaWFibGUgcHJldmlvdXNseSBpbmNsdWRlZCBpbiB0aGUgdmFsdWUgb2YgYCQoTUFLRSknCiAgZm9yIHN1Yi1tYWtlcyBpcyBub3cgaW5jbHVkZWQgaW4gYE1BS0VGTEFHUycgaW5zdGVhZC4gIEFzIGJlZm9yZSwgeW91IGNhbgogIHJlc2V0IGBNQUtFT1ZFUlJJREVTJyBpbiB5b3VyIG1ha2VmaWxlIHRvIGF2b2lkIHB1dHRpbmcgYWxsIHRoZSB2YXJpYWJsZXMKICBpbiB0aGUgZW52aXJvbm1lbnQgd2hlbiBpdHMgc2l6ZSBpcyBsaW1pdGVkLgoKKiBJZiBgLkRFTEVURV9PTl9FUlJPUicgYXBwZWFycyBhcyBhIHRhcmdldCwgTWFrZSB3aWxsIGRlbGV0ZSB0aGUgdGFyZ2V0IG9mCiAgYSBydWxlIGlmIGl0IGhhcyBjaGFuZ2VkIHdoZW4gaXRzIHJlY2lwZSBleGl0cyB3aXRoIGEgbm9uemVybyBzdGF0dXMsCiAganVzdCBhcyB3aGVuIHRoZSByZWNpcGUgZ2V0cyBhIHNpZ25hbC4KCiogVGhlIGF1dG9tYXRpYyB2YXJpYWJsZSBgJCsnIGlzIG5ldy4gIEl0IGxpc3RzIGFsbCB0aGUgZGVwZW5kZW5jaWVzIGxpa2UKICBgJF4nLCBidXQgcHJlc2VydmVzIGR1cGxpY2F0ZXMgbGlzdGVkIGluIHRoZSBtYWtlZmlsZS4gIFRoaXMgaXMgdXNlZnVsCiAgZm9yIGxpbmtpbmcgcnVsZXMsIHdoZXJlIGxpYnJhcnkgZmlsZXMgc29tZXRpbWVzIG5lZWQgdG8gYmUgbGlzdGVkIHR3aWNlCiAgaW4gdGhlIGxpbmsgb3JkZXIuCgoqIFlvdSBjYW4gbm93IHNwZWNpZnkgdGhlIGAuSUdOT1JFJyBhbmQgYC5TSUxFTlQnIHNwZWNpYWwgdGFyZ2V0cyB3aXRoCiAgZGVwZW5kZW5jaWVzIHRvIGxpbWl0IHRoZWlyIGVmZmVjdHMgdG8gdGhvc2UgZmlsZXMuICBJZiBhIGZpbGUgYXBwZWFycyBhcwogIGEgZGVwZW5kZW5jeSBvZiBgLklHTk9SRScsIHRoZW4gZXJyb3JzIHdpbGwgYmUgaWdub3JlZCB3aGlsZSBydW5uaW5nIHRoZQogIHJlY2lwZSB0byB1cGRhdGUgdGhhdCBmaWxlLiAgTGlrZXdpc2UgaWYgYSBmaWxlIGFwcGVhcnMgYXMgYSBkZXBlbmRlbmN5CiAgb2YgYC5TSUxFTlQnLCB0aGVuIHRoZSByZWNpcGUgdG8gdXBkYXRlIHRoYXQgZmlsZSB3aWxsIG5vdCBiZSBwcmludGVkCiAgYmVmb3JlIGl0IGlzIHJ1bi4gIChUaGlzIGNoYW5nZSB3YXMgbWFkZSB0byBjb25mb3JtIHRvIFBPU0lYLjIuKQoMClZlcnNpb24gMy43MSAoMjEgTWF5IDE5OTQpCgoqIFRoZSBhdXRvbWF0aWMgdmFyaWFibGVzIGAkKEBEKScsIGAkKCVEKScsIGAkKCpEKScsIGAkKDxEKScsIGAkKD9EKScsIGFuZAogIGAkKF5EKScgbm93IG9taXQgdGhlIHRyYWlsaW5nIHNsYXNoIGZyb20gdGhlIGRpcmVjdG9yeSBuYW1lLiAgKFRoaXMgY2hhbmdlCiAgd2FzIG1hZGUgdG8gY29tcGx5IHdpdGggUE9TSVguMi4pCgoqIFRoZSBzb3VyY2UgZGlzdHJpYnV0aW9uIG5vdyBpbmNsdWRlcyB0aGUgSW5mbyBmaWxlcyBmb3IgdGhlIE1ha2UgbWFudWFsLgogIFRoZXJlIGlzIG5vIGxvbmdlciBhIHNlcGFyYXRlIGRpc3RyaWJ1dGlvbiBjb250YWluaW5nIEluZm8gYW5kIERWSSBmaWxlcy4KCiogWW91IGNhbiBub3cgc2V0IHRoZSB2YXJpYWJsZXMgYGJpbnByZWZpeCcgYW5kL29yIGBtYW5wcmVmaXgnIGluCiAgTWFrZWZpbGUuaW4gKG9yIG9uIHRoZSBjb21tYW5kIGxpbmUgd2hlbiBpbnN0YWxsaW5nKSB0byBpbnN0YWxsIEdOVSBtYWtlCiAgdW5kZXIgYSBuYW1lIG90aGVyIHRoYW4gYG1ha2UnIChpLmUuLCBgYG1ha2UgYmlucHJlZml4PWcgaW5zdGFsbCcnCiAgaW5zdGFsbHMgR05VIG1ha2UgYXMgYGdtYWtlJykuCgoqIFRoZSBidWlsdC1pbiBUZXhpbmZvIHJ1bGVzIHVzZSB0aGUgbmV3IHZhcmlhYmxlcyBgVEVYSTJEVklfRkxBR1MnIGZvcgogIGZsYWdzIHRvIHRoZSBgdGV4aTJkdmknIHNjcmlwdCwgYW5kIGBNQUtFSU5GT19GTEFHUycgZm9yIGZsYWdzIHRvIHRoZQogIE1ha2VpbmZvIHByb2dyYW0uCgoqIFRoZSBleGl0IHN0YXR1cyBvZiBNYWtlIHdoZW4gaXQgcnVucyBpbnRvIGVycm9ycyBpcyBub3cgMiBpbnN0ZWFkIG9mIDEuCiAgVGhlIGV4aXQgc3RhdHVzIGlzIDEgb25seSB3aGVuIHVzaW5nIC1xIGFuZCBzb21lIHRhcmdldCBpcyBub3QgdXAgdG8gZGF0ZS4KICAoVGhpcyBjaGFuZ2Ugd2FzIG1hZGUgdG8gY29tcGx5IHdpdGggUE9TSVguMi4pCgwKVmVyc2lvbiAzLjcwICgwMyBKYW4gMTk5NCkKCiogSXQgaXMgbm8gbG9uZ2VyIGEgZmF0YWwgZXJyb3IgdG8gaGF2ZSBhIE5VTCBjaGFyYWN0ZXIgaW4gYSBtYWtlZmlsZS4KICBZb3Ugc2hvdWxkIG5ldmVyIHB1dCBhIE5VTCBpbiBhIG1ha2VmaWxlIGJlY2F1c2UgaXQgY2FuIGhhdmUgc3RyYW5nZQogIHJlc3VsdHMsIGJ1dCBvdGhlcndpc2UgZW1wdHkgbGluZXMgZnVsbCBvZiBOVUxzIChzdWNoIGFzIHByb2R1Y2VkIGJ5CiAgdGhlIGB4bWttZicgcHJvZ3JhbSkgd2lsbCBhbHdheXMgd29yayBmaW5lLgoKKiBUaGUgZXJyb3IgbWVzc2FnZXMgZm9yIG5vbmV4aXN0ZW50IGluY2x1ZGVkIG1ha2VmaWxlcyBub3cgcmVmZXIgdG8gdGhlCiAgbWFrZWZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgd2hlcmUgdGhlIGBpbmNsdWRlJyBhcHBlYXJlZCwgc28gRW1hY3MncwogIEMteCBgIGNvbW1hbmQgdGFrZXMgeW91IHRoZXJlIChpbiBjYXNlIGl0J3MgYSB0eXBvIHlvdSBuZWVkIHRvIGZpeCkuCgwKVmVyc2lvbiAzLjY5ICgwNyBOb3YgMTk5MykKCiogSW1wbGljaXQgcnVsZSBzZWFyY2ggZm9yIGFyY2hpdmUgbWVtYmVyIHJlZmVyZW5jZXMgaXMgbm93IGRvbmUgaW4gdGhlCiAgb3Bwb3NpdGUgb3JkZXIgZnJvbSBwcmV2aW91cyB2ZXJzaW9uczogdGhlIHdob2xlIHRhcmdldCBuYW1lIGBMSUIoTUVNKScKICBmaXJzdCwgYW5kIGp1c3QgdGhlIG1lbWJlciBuYW1lIGFuZCBwYXJlbnRoZXNlcyBgKE1FTSknIHNlY29uZC4KCiogTWFrZSBub3cgZ2l2ZXMgYW4gZXJyb3IgZm9yIGFuIHVudGVybWluYXRlZCB2YXJpYWJsZSBvciBmdW5jdGlvbiByZWZlcmVuY2UuCiAgRm9yIGV4YW1wbGUsIGAkKGZvbycgd2l0aCBubyBtYXRjaGluZyBgKScgb3IgYCR7YmFyJyB3aXRoIG5vIG1hdGNoaW5nIGB9Jy4KCiogVGhlIG5ldyBkZWZhdWx0IHZhcmlhYmxlIGBNQUtFX1ZFUlNJT04nIGdpdmVzIHRoZSB2ZXJzaW9uIG51bWJlciBvZgogIE1ha2UsIGFuZCBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSByZW1vdGUgam9iIHN1cHBvcnQgY29tcGlsZWQgaW4gKGlmIGFueSkuCiAgVGh1cyB0aGUgdmFsdWUgKGluIHRoaXMgcmVsZWFzZSkgaXMgc29tZXRoaW5nIGxpa2UgYDMuNjknIG9yIGAzLjY5LUN1c3RvbXMnLgoKKiBDb21tYW5kcyBpbiBhbiBpbnZvY2F0aW9uIG9mIHRoZSBgc2hlbGwnIGZ1bmN0aW9uIGFyZSBubyBsb25nZXIgcnVuCiAgd2l0aCBhIG1vZGlmaWVkIGVudmlyb25tZW50IGxpa2UgcmVjaXBlcyBhcmUuICBBcyBpbiB2ZXJzaW9ucyBiZWZvcmUKICAzLjY4LCB0aGV5IG5vdyBydW4gd2l0aCB0aGUgZW52aXJvbm1lbnQgdGhhdCBgbWFrZScgc3RhcnRlZCB3aXRoLiAgV2UKICBoYXZlIHJldmVyc2VkIHRoZSBjaGFuZ2UgbWFkZSBpbiB2ZXJzaW9uIDMuNjggYmVjYXVzZSBpdCB0dXJuZWQgb3V0IHRvCiAgY2F1c2UgYSBwYXJhZG94aWNhbCBzaXR1YXRpb24gaW4gY2FzZXMgbGlrZToKCiAgICAgICAgZXhwb3J0IHZhcmlhYmxlID0gJChzaGVsbCBlY2hvIHZhbHVlKQoKICBXaGVuIE1ha2UgYXR0ZW1wdGVkIHRvIHB1dCB0aGlzIHZhcmlhYmxlIGluIHRoZSBlbnZpcm9ubWVudCBmb3IgYQogIHJlY2lwZSwgaXQgd291bGQgdHJ5IGV4cGFuZCB0aGUgdmFsdWUgYnkgcnVubmluZyB0aGUgc2hlbGwgY29tbWFuZAogIGBlY2hvIHZhbHVlJy4gIEluIHZlcnNpb24gMy42OCwgYmVjYXVzZSBpdCBjb25zdHJ1Y3RlZCBhbiBlbnZpcm9ubWVudAogIGZvciB0aGF0IHNoZWxsIGNvbW1hbmQgaW4gdGhlIHNhbWUgd2F5LCBNYWtlIHdvdWxkIGJlZ2luIHRvIGdvIGludG8gYW4KICBpbmZpbml0ZSBsb29wIGFuZCB0aGVuIGdldCBhIGZhdGFsIGVycm9yIHdoZW4gaXQgZGV0ZWN0ZWQgdGhlIGxvb3AuCgoqIFRoZSByZWNpcGUgZ2l2ZW4gZm9yIGAuREVGQVVMVCcgaXMgbm93IHVzZWQgZm9yIHBob255IHRhcmdldHMgd2l0aCBubwogIHJlY2lwZS4KDApWZXJzaW9uIDMuNjggKDI4IEp1bCAxOTkzKQoKKiBZb3UgY2FuIGxpc3Qgc2V2ZXJhbCBhcmNoaXZlIG1lbWJlciBuYW1lcyBpbnNpZGUgcGFyZW50aGVzaXM6CiAgYGxpYihtZW0xIG1lbTIgbWVtMyknIGlzIGVxdWl2YWxlbnQgdG8gYGxpYihtZW0xKSBsaWIobWVtMikgbGliKG1lbTMpJy4KCiogWW91IGNhbiB1c2Ugd2lsZGNhcmRzIGluc2lkZSBhcmNoaXZlIG1lbWJlciByZWZlcmVuY2VzLiAgRm9yIGV4YW1wbGUsCiAgYGxpYigqLm8pJyBleHBhbmRzIHRvIGFsbCBleGlzdGluZyBtZW1iZXJzIG9mIGBsaWInIHdob3NlIG5hbWVzIGVuZCBpbgogIGAubycgKGUuZy4gYGxpYihhLm8pIGxpYihiLm8pJyk7IGAqLmEoKi5vKScgZXhwYW5kcyB0byBhbGwgc3VjaCBtZW1iZXJzCiAgb2YgYWxsIGV4aXN0aW5nIGZpbGVzIHdob3NlIG5hbWVzIGVuZCBpbiBgLmEnIChlLmcuIGBmb28uYShhLm8pCiAgZm9vLmEoYi5vKSBiYXIuYShjLm8pIGJhci5hKGQubyknLgoKKiBBIHN1ZmZpeCBydWxlIGAuWC5hJyBub3cgcHJvZHVjZXMgdHdvIHBhdHRlcm4gcnVsZXM6CiAgICAgICAgKCUubyk6ICUuWAkjIFByZXZpb3VzIHZlcnNpb25zIHByb2R1Y2VkIG9ubHkgdGhpcy4KICAgICAgICAlLmE6ICUuWAkjIE5vdyBwcm9kdWNlcyB0aGlzIGFzIHdlbGwsIGp1c3QgbGlrZSBvdGhlciBzdWZmaXhlcy4KCiogVGhlIG5ldyBmbGFnIGAtLXdhcm4tdW5kZWZpbmVkLXZhcmlhYmxlcycgc2F5cyB0byBpc3N1ZSBhIHdhcm5pbmcgbWVzc2FnZQogIHdoZW5ldmVyIE1ha2UgZXhwYW5kcyBhIHJlZmVyZW5jZSB0byBhbiB1bmRlZmluZWQgdmFyaWFibGUuCgoqIFRoZSBuZXcgYC1pbmNsdWRlJyBkaXJlY3RpdmUgaXMganVzdCBsaWtlIGBpbmNsdWRlJyBleGNlcHQgdGhhdCB0aGVyZSBpcwogIG5vIGVycm9yIChub3QgZXZlbiBhIHdhcm5pbmcpIGZvciBhIG5vbmV4aXN0ZW50IG1ha2VmaWxlLgoKKiBDb21tYW5kcyBpbiBhbiBpbnZvY2F0aW9uIG9mIHRoZSBgc2hlbGwnIGZ1bmN0aW9uIGFyZSBub3cgcnVuIHdpdGggYQogIG1vZGlmaWVkIGVudmlyb25tZW50IGxpa2UgcmVjaXBlcyBhcmUsIHNvIHlvdSBjYW4gdXNlIGBleHBvcnQnIGV0IGFsCiAgdG8gc2V0IHVwIHZhcmlhYmxlcyBmb3IgdGhlbS4gIFRoZXkgdXNlZCB0byBydW4gd2l0aCB0aGUgZW52aXJvbm1lbnQKICB0aGF0IGBtYWtlJyBzdGFydGVkIHdpdGguCgwKVmVyc2lvbiAzLjY2ICgyMSBNYXkgMTk5MykKCiogYG1ha2UgLS12ZXJzaW9uJyAob3IgYG1ha2UgLXYnKSBub3cgZXhpdHMgaW1tZWRpYXRlbHkgYWZ0ZXIgcHJpbnRpbmcKICB0aGUgdmVyc2lvbiBudW1iZXIuCgwKVmVyc2lvbiAzLjY1ICgwOSBNYXkgMTk5MykKCiogTWFrZSBub3cgc3VwcG9ydHMgbG9uZy1uYW1lZCBtZW1iZXJzIGluIGBhcicgYXJjaGl2ZSBmaWxlcy4KDApWZXJzaW9uIDMuNjQgKDIxIEFwciAxOTkzKQoKKiBNYWtlIG5vdyBzdXBwb3J0cyB0aGUgYCs9JyBzeW50YXggZm9yIGEgdmFyaWFibGUgZGVmaW5pdGlvbiB3aGljaCBhcHBlbmRzCiAgdG8gdGhlIHZhcmlhYmxlJ3MgcHJldmlvdXMgdmFsdWUuICBTZWUgdGhlIHNlY3Rpb24gYEFwcGVuZGluZyBNb3JlIFRleHQKICB0byBWYXJpYWJsZXMnIGluIHRoZSBtYW51YWwgZm9yIGZ1bGwgZGV0YWlscy4KCiogVGhlIG5ldyBvcHRpb24gYC0tbm8tcHJpbnQtZGlyZWN0b3J5JyBpbmhpYml0cyB0aGUgYC13JyBvcgogIGAtLXByaW50LWRpcmVjdG9yeScgZmVhdHVyZS4gIE1ha2UgdHVybnMgb24gYC0tcHJpbnQtZGlyZWN0b3J5JwogIGF1dG9tYXRpY2FsbHkgaWYgeW91IHVzZSBgLUMnIG9yIGAtLWRpcmVjdG9yeScsIGFuZCBpbiBzdWItbWFrZXM7IHNvbWUKICB1c2VycyBoYXZlIGZvdW5kIHRoaXMgYmVoYXZpb3IgdW5kZXNpcmFibGUuCgoqIFRoZSBidWlsdC1pbiBpbXBsaWNpdCBydWxlcyBub3cgc3VwcG9ydCB0aGUgYWx0ZXJuYXRpdmUgZXh0ZW5zaW9uCiAgYC50eGluZm8nIGZvciBUZXhpbmZvIGZpbGVzLCBqdXN0IGxpa2UgYC50ZXhpbmZvJyBhbmQgYC50ZXhpJy4KDApWZXJzaW9uIDMuNjMgKDIyIEphbiAxOTkzKQoKKiBNYWtlIG5vdyB1c2VzIGEgc3RhbmRhcmQgR05VIGBjb25maWd1cmUnIHNjcmlwdC4gIFNlZSB0aGUgbmV3IGZpbGUKICBJTlNUQUxMIGZvciB0aGUgbmV3IChhbmQgbXVjaCBzaW1wbGVyKSBpbnN0YWxsYXRpb24gcHJvY2VkdXJlLgoKKiBUaGVyZSBpcyBub3cgYSBzaGVsbCBzY3JpcHQgdG8gYnVpbGQgTWFrZSB0aGUgZmlyc3QgdGltZSwgaWYgeW91IGhhdmUgbm8KICBvdGhlciBgbWFrZScgcHJvZ3JhbS4gIGBidWlsZC5zaCcgaXMgY3JlYXRlZCBieSBgY29uZmlndXJlJzsgc2VlIFJFQURNRS4KCiogR05VIE1ha2Ugbm93IGNvbXBsZXRlbHkgY29uZm9ybXMgdG8gdGhlIFBPU0lYLjIgc3BlY2lmaWNhdGlvbiBmb3IgYG1ha2UnLgoKKiBFbGVtZW50cyBvZiB0aGUgYCReJyBhbmQgYCQ/JyBhdXRvbWF0aWMgdmFyaWFibGVzIHRoYXQgYXJlIGFyY2hpdmUKICBtZW1iZXIgcmVmZXJlbmNlcyBub3cgbGlzdCBvbmx5IHRoZSBtZW1iZXIgbmFtZSwgYXMgaW4gVW5peCBhbmQgUE9TSVguMi4KCiogWW91IHNob3VsZCBubyBsb25nZXIgZXZlciBuZWVkIHRvIHNwZWNpZnkgdGhlIGAtdycgc3dpdGNoLCB3aGljaCBwcmludHMKICB0aGUgY3VycmVudCBkaXJlY3RvcnkgYmVmb3JlIGFuZCBhZnRlciBNYWtlIHJ1bnMuICBUaGUgYC1DJyBzd2l0Y2ggdG8KICBjaGFuZ2UgZGlyZWN0b3J5LCBhbmQgcmVjdXJzaXZlIHVzZSBvZiBNYWtlLCBub3cgc2V0IGAtdycgYXV0b21hdGljYWxseS4KCiogTXVsdGlwbGUgZG91YmxlLWNvbG9uIHJ1bGVzIGZvciB0aGUgc2FtZSB0YXJnZXQgd2lsbCBubyBsb25nZXIgaGF2ZSB0aGVpcgogIHJlY2lwZXMgcnVuIHNpbXVsdGFuZW91c2x5IHVuZGVyIC1qLCBhcyB0aGlzIGNvdWxkIHJlc3VsdCBpbiB0aGUgdHdvCiAgcmVjaXBlcyB0cnlpbmcgdG8gY2hhbmdlIHRoZSBmaWxlIGF0IHRoZSBzYW1lIHRpbWUgYW5kIGludGVyZmVyaW5nIHdpdGgKICBvbmUgYW5vdGhlci4KCiogVGhlIGBTSEVMTCcgdmFyaWFibGUgaXMgbm93IG5ldmVyIHRha2VuIGZyb20gdGhlIGVudmlyb25tZW50LgogIEVhY2ggbWFrZWZpbGUgdGhhdCB3YW50cyBhIHNoZWxsIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQgKC9iaW4vc2gpIG11c3QKICBzZXQgU0hFTEwgaXRzZWxmLiAgU0hFTEwgaXMgYWx3YXlzIGV4cG9ydGVkIHRvIGNoaWxkIHByb2Nlc3Nlcy4KICBUaGlzIGNoYW5nZSB3YXMgbWFkZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFBPU0lYLjIuCgoqIE1ha2Ugbm93IGFjY2VwdHMgbG9uZyBvcHRpb25zLiAgVGhlcmUgaXMgbm93IGFuIGluZm9ybWF0aXZlIHVzYWdlIG1lc3NhZ2UKICB0aGF0IHRlbGxzIHlvdSB3aGF0IGFsbCB0aGUgb3B0aW9ucyBhcmUgYW5kIHdoYXQgdGhleSBkby4gIFRyeSBgbWFrZSAtLWhlbHAnLgoKKiBUaGVyZSBhcmUgdHdvIG5ldyBkaXJlY3RpdmVzOiBgZXhwb3J0JyBhbmQgYHVuZXhwb3J0Jy4gIEFsbCB2YXJpYWJsZXMgYXJlCiAgbm8gbG9uZ2VyIGF1dG9tYXRpY2FsbHkgcHV0IGludG8gdGhlIGVudmlyb25tZW50cyBvZiB0aGUgcmVjaXBlIGxpbmVzIHRoYXQKICBNYWtlIHJ1bnMuICBJbnN0ZWFkLCBvbmx5IHZhcmlhYmxlcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSBvciBpbgogIHRoZSBlbnZpcm9ubWVudCBhcmUgZXhwb3J0ZWQgYnkgZGVmYXVsdC4gIFRvIGV4cG9ydCBvdGhlcnMsIHVzZToKICAgICAgICBleHBvcnQgVkFSSUFCTEUKICBvciB5b3UgY2FuIGRlZmluZSB2YXJpYWJsZXMgd2l0aDoKICAgICAgICBleHBvcnQgVkFSSUFCTEUgPSBWQUxVRQogIG9yOgogICAgICAgIGV4cG9ydCBWQVJJQUJMRSA6PSBWQUxVRQogIFlvdSBjYW4gdXNlIGp1c3Q6CiAgICAgICAgZXhwb3J0CiAgb3I6CiAgICAgICAgLkVYUE9SVF9BTExfVkFSSUFCTEVTOgogIHRvIGdldCB0aGUgb2xkIGJlaGF2aW9yLiAgU2VlIHRoZSBub2RlIGBWYXJpYWJsZXMvUmVjdXJzaW9uJyBpbiB0aGUgbWFudWFsCiAgZm9yIGEgZnVsbCBkZXNjcmlwdGlvbi4KCiogVGhlIHJlY2lwZSBmcm9tIHRoZSBgLkRFRkFVTFQnIHNwZWNpYWwgdGFyZ2V0IGlzIG9ubHkgYXBwbGllZCB0bwogIHRhcmdldHMgd2hpY2ggaGF2ZSBubyBydWxlcyBhdCBhbGwsIG5vdCBhbGwgdGFyZ2V0cyB3aXRoIG5vIHJlY2lwZS4KICBUaGlzIGNoYW5nZSB3YXMgbWFkZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFVuaXggbWFrZS4KCiogQWxsIGZhdGFsIGVycm9yIG1lc3NhZ2VzIG5vdyBjb250YWluIGAqKionLCBzbyB0aGV5IGFyZSBlYXN5IHRvIGZpbmQgaW4KICBjb21waWxhdGlvbiBsb2dzLgoKKiBEZXBlbmRlbmN5IGZpbGUgbmFtZXMgbGlrZSBgLWxOQU1FJyBhcmUgbm93IHJlcGxhY2VkIHdpdGggdGhlIGFjdHVhbCBmaWxlCiAgbmFtZSBmb3VuZCwgYXMgd2l0aCBmaWxlcyBmb3VuZCBieSBub3JtYWwgZGlyZWN0b3J5IHNlYXJjaCAoVlBBVEgpLgogIFRoZSBsaWJyYXJ5IGZpbGUgYGxpYk5BTUUuYScgbWF5IG5vdyBiZSBmb3VuZCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksCiAgd2hpY2ggaXMgY2hlY2tlZCBiZWZvcmUgVlBBVEg7IHRoZSBzdGFuZGFyZCBzZXQgb2YgZGlyZWN0b3JpZXMgKC9saWIsCiAgL3Vzci9saWIsIC91c3IvbG9jYWwvbGliKSBpcyBub3cgY2hlY2tlZCBsYXN0LgogIFNlZSB0aGUgbm9kZSBgTGlicmFyaWVzL1NlYXJjaCcgaW4gdGhlIG1hbnVhbCBmb3IgZnVsbCBkZXRhaWxzLgoKKiBBIHNpbmdsZSBgaW5jbHVkZScgZGlyZWN0aXZlIGNhbiBub3cgc3BlY2lmeSBtb3JlIHRoYW4gb25lIG1ha2VmaWxlIHRvCiAgaW5jbHVkZSwgbGlrZSB0aGlzOgogICAgICAgIGluY2x1ZGUgZmlsZTEgZmlsZTIKICBZb3UgY2FuIGFsc28gdXNlIHNoZWxsIGZpbGUgbmFtZSBwYXR0ZXJucyBpbiBhbiBgaW5jbHVkZScgZGlyZWN0aXZlOgogICAgICAgIGluY2x1ZGUgKi5tawoKKiBUaGUgZGVmYXVsdCBkaXJlY3RvcmllcyB0byBzZWFyY2ggZm9yIGluY2x1ZGVkIG1ha2VmaWxlcywgYW5kIGZvcgogIGxpYnJhcmllcyBzcGVjaWZpZWQgd2l0aCBgLWxOQU1FJywgYXJlIG5vdyBzZXQgYnkgY29uZmlndXJhdGlvbi4KCiogWW91IGNhbiBub3cgdXNlIGJsYW5rcyBhcyB3ZWxsIGFzIGNvbG9ucyB0byBzZXBhcmF0ZSB0aGUgZGlyZWN0b3JpZXMgaW4gYQogIHNlYXJjaCBwYXRoIGZvciB0aGUgYHZwYXRoJyBkaXJlY3RpdmUgb3IgdGhlIGBWUEFUSCcgdmFyaWFibGUuCgoqIFlvdSBjYW4gbm93IHVzZSB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBpbiB0aGUgbGVmdCBoYW5kIHNpZGUgb2YgYQogIHZhcmlhYmxlIGFzc2lnbm1lbnQsIGFzIGluICIkKGZvbyliYXIgPSB2YWx1ZSIuCgoqIFRoZSBgTUFLRScgdmFyaWFibGUgaXMgYWx3YXlzIGRlZmluZWQgYXMgYCQoTUFLRV9DT01NQU5EKSAkKE1BS0VPVkVSUklERVMpJy4KICBUaGUgYE1BS0VfQ09NTUFORCcgdmFyaWFibGUgaXMgbm93IGRlZmluZWQgdG8gdGhlIG5hbWUgd2l0aCB3aGljaCBtYWtlCiAgd2FzIGludm9rZWQuCgoqIFRoZSBidWlsdC1pbiBydWxlcyBmb3IgQysrIGNvbXBpbGF0aW9uIG5vdyB1c2UgdGhlIHZhcmlhYmxlcyBgJChDWFgpJyBhbmQKICBgJChDWFhGTEFHUyknIGluc3RlYWQgb2YgYCQoQysrKScgYW5kIGAkKEMrK0ZMQUdTKScuICBUaGUgb2xkIG5hbWVzIGhhZAogIHByb2JsZW1zIHdpdGggc2hlbGxzIHRoYXQgY2Fubm90IGhhdmUgYCsnIGluIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWVzLgoKKiBUaGUgdmFsdWUgb2YgYSByZWN1cnNpdmVseSBleHBhbmRlZCB2YXJpYWJsZSBpcyBub3cgZXhwYW5kZWQgd2hlbiBwdXR0aW5nCiAgaXQgaW50byB0aGUgZW52aXJvbm1lbnQgZm9yIGNoaWxkIHByb2Nlc3Nlcy4gIFRoaXMgY2hhbmdlIHdhcyBtYWRlIGZvcgogIGNvbXBhdGliaWxpdHkgd2l0aCBVbml4IG1ha2UuCgoqIEEgcnVsZSB3aXRoIG5vIHRhcmdldHMgYmVmb3JlIHRoZSBgOicgaXMgbm93IGFjY2VwdGVkIGFuZCBpZ25vcmVkLgogIFRoaXMgY2hhbmdlIHdhcyBtYWRlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggU3VuT1MgNCBtYWtlLgogIFdlIGRvIG5vdCByZWNvbW1lbmQgdGhhdCB5b3Ugd3JpdGUgeW91ciBtYWtlZmlsZXMgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhpcy4KCiogVGhlIGAtSScgc3dpdGNoIGNhbiBub3cgYmUgdXNlZCBpbiBNQUtFRkxBR1MsIGFuZCBhcmUgcHV0IHRoZXJlCiAgYXV0b21hdGljYWxseSBqdXN0IGxpa2Ugb3RoZXIgc3dpdGNoZXMuCgwKVmVyc2lvbiAzLjYxCgoqIEJ1aWx0LWluIHJ1bGVzIGZvciBDKysgc291cmNlIGZpbGVzIHdpdGggdGhlIGAuQycgc3VmZml4LgogIFdlIHN0aWxsIHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgYC5jYycgaW5zdGVhZC4KCiogSWYgYSByZWNpcGUgaXMgZ2l2ZW4gdG9vIG1hbnkgdGltZXMgZm9yIGEgc2luZ2xlIHRhcmdldCwgdGhlIGxhc3Qgb25lCiAgZ2l2ZW4gaXMgdXNlZCwgYW5kIGEgd2FybmluZyBtZXNzYWdlIGlzIHByaW50ZWQuCgoqIEVycm9yIG1lc3NhZ2VzIGFib3V0IG1ha2VmaWxlcyBhcmUgaW4gc3RhbmRhcmQgR05VIGVycm9yIGZvcm1hdCwKICBzbyBDLXggYCBpbiBFbWFjcyB3b3JrcyBvbiB0aGVtLgoKKiBEZXBlbmRlbmNpZXMgb2YgcGF0dGVybiBydWxlcyB3aGljaCBjb250YWluIG5vICUgbmVlZCBub3QgYWN0dWFsbHkgZXhpc3QKICBpZiB0aGV5IGNhbiBiZSBjcmVhdGVkIChqdXN0IGxpa2UgZGVwZW5kZW5jaWVzIHdoaWNoIGRvIGhhdmUgYSAlKS4KDApWZXJzaW9uIDMuNjAKCiogQSBtZXNzYWdlIGlzIGFsd2F5cyBwcmludGVkIHdoZW4gTWFrZSBkZWNpZGVzIHRoZXJlIGlzIG5vdGhpbmcgdG8gYmUgZG9uZS4KICBJdCB1c2VkIHRvIGJlIHRoYXQgbm8gbWVzc2FnZSB3YXMgcHJpbnRlZCBmb3IgdG9wLWxldmVsIHBob255IHRhcmdldHMKICAoYmVjYXVzZSAiYHBob255JyBpcyB1cCB0byBkYXRlIiBpc24ndCBxdWl0ZSByaWdodCkuICBOb3cgYSBkaWZmZXJlbnQKICBtZXNzYWdlICJOb3RoaW5nIHRvIGJlIGRvbmUgZm9yIGBwaG9ueSciIGlzIHByaW50ZWQgaW4gdGhhdCBjYXNlLgoKKiBBcmNoaXZlcyBvbiBBSVggbm93IHN1cHBvc2VkbHkgd29yay4KCiogV2hlbiB0aGUgcmVjaXBlcyBzcGVjaWZpZWQgZm9yIC5ERUZBVUxUIGFyZSB1c2VkIHRvIHVwZGF0ZSBhIHRhcmdldCwKICB0aGUgJDwgYXV0b21hdGljIHZhcmlhYmxlIGlzIGdpdmVuIHRoZSBzYW1lIHZhbHVlIGFzICRAIGZvciB0aGF0IHRhcmdldC4KICBUaGlzIGlzIGhvdyBVbml4IG1ha2UgYmVoYXZlcywgYW5kIHRoaXMgYmVoYXZpb3IgaXMgbWFuZGF0ZWQgYnkgUE9TSVguMi4KDApWZXJzaW9uIDMuNTkKCiogVGhlIC1uLCAtcSwgYW5kIC10IG9wdGlvbnMgYXJlIG5vdCBwdXQgaW4gdGhlIGBNQUtFRkxBR1MnIGFuZCBgTUZMQUcnCiAgdmFyaWFibGVzIHdoaWxlIHJlbWFraW5nIG1ha2VmaWxlcywgc28gcmVjdXJzaXZlIG1ha2VzIGRvbmUgd2hpbGUgcmVtYWtpbmcKICBtYWtlZmlsZXMgd2lsbCBiZWhhdmUgcHJvcGVybHkuCgoqIElmIHRoZSBzcGVjaWFsIHRhcmdldCBgLk5PRVhQT1JUJyBpcyBzcGVjaWZpZWQgaW4gYSBtYWtlZmlsZSwKICBvbmx5IHZhcmlhYmxlcyB0aGF0IGNhbWUgZnJvbSB0aGUgZW52aXJvbm1lbnQgYW5kIHZhcmlhYmxlcwogIGRlZmluZWQgb24gdGhlIGNvbW1hbmQgbGluZSBhcmUgZXhwb3J0ZWQuCgwKVmVyc2lvbiAzLjU4CgoqIFN1ZmZpeCBydWxlcyBtYXkgaGF2ZSBkZXBlbmRlbmNpZXMgKHdoaWNoIGFyZSBpZ25vcmVkKS4KDApWZXJzaW9uIDMuNTcKCiogRGVwZW5kZW5jaWVzIG9mIHRoZSBmb3JtIGAtbExJQicgYXJlIHNlYXJjaGVkIGZvciBhcyAvdXNyL2xvY2FsL2xpYi9saWJMSUIuYQogIGFzIHdlbGwgYXMgbGliTElCLmEgaW4gL3Vzci9saWIsIC9saWIsIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgYW5kIFZQQVRILgoMClZlcnNpb24gMy41NQoKKiBUaGVyZSBpcyBub3cgYSBVbml4IG1hbiBwYWdlIGZvciBHTlUgTWFrZS4gIEl0IGlzIGNlcnRhaW5seSBub3QgYQogIHJlcGxhY2VtZW50IGZvciB0aGUgVGV4aW5mbyBtYW51YWwsIGJ1dCBpdCBkb2N1bWVudHMgdGhlIGJhc2ljCiAgZnVuY3Rpb25hbGl0eSBhbmQgdGhlIHN3aXRjaGVzLiAgRm9yIGZ1bGwgZG9jdW1lbnRhdGlvbiwgeW91IHNob3VsZAogIHN0aWxsIHJlYWQgdGhlIFRleGluZm8gbWFudWFsLiAgVGhhbmtzIHRvIERlbm5pcyBNb3JzZSBvZiBTdGFuZm9yZAogIFVuaXZlcnNpdHkgZm9yIGNvbnRyaWJ1dGluZyB0aGUgaW5pdGlhbCB2ZXJzaW9uIG9mIHRoaXMuCgoqIFZhcmlhYmxlcyB3aGljaCBhcmUgZGVmaW5lZCBieSBkZWZhdWx0IChlLmcuLCBgQ0MnKSB3aWxsIG5vIGxvbmdlciBiZQogIHB1dCBpbnRvIHRoZSBlbnZpcm9ubWVudCBmb3IgY2hpbGQgcHJvY2Vzc2VzLiAgKElmIHRoZXNlIHZhcmlhYmxlcyBhcmUKICByZXNldCBieSB0aGUgZW52aXJvbm1lbnQsIG1ha2VmaWxlcywgb3IgdGhlIGNvbW1hbmQgbGluZSwgdGhleSB3aWxsCiAgc3RpbGwgZ28gaW50byB0aGUgZW52aXJvbm1lbnQuKQoKKiBNYWtlZmlsZXMgd2hpY2ggaGF2ZSByZWNpcGVzIGJ1dCBubyBkZXBlbmRlbmNpZXMgKGFuZCB0aHVzIGFyZSBhbHdheXMKICBjb25zaWRlcmVkIG91dCBvZiBkYXRlIGFuZCBpbiBuZWVkIG9mIHJlbWFraW5nKSwgd2lsbCBub3QgYmUgcmVtYWRlIChpZiB0aGV5CiAgd2VyZSBiZWluZyByZW1hZGUgb25seSBiZWNhdXNlIHRoZXkgd2VyZSBtYWtlZmlsZXMpLiAgVGhpcyBtZWFucyB0aGF0IEdOVQogIE1ha2Ugd2lsbCBubyBsb25nZXIgZ28gaW50byBhbiBpbmZpbml0ZSBsb29wIHdoZW4gZmVkIHRoZSBtYWtlZmlsZXMgdGhhdAogIGBpbWFrZScgKG5lY2Vzc2FyeSB0byBidWlsZCBYIFdpbmRvd3MpIHByb2R1Y2VzLgoKKiBUaGVyZSBpcyBubyBsb25nZXIgYSB3YXJuaW5nIGZvciB1c2luZyB0aGUgYHZwYXRoJyBkaXJlY3RpdmUgd2l0aCBhbiBleHBsaWNpdApwYXRobmFtZSAoaW5zdGVhZCBvZiBhIGAlJyBwYXR0ZXJuKS4KDApWZXJzaW9uIDMuNTEKCiogV2hlbiByZW1vdmluZyBpbnRlcm1lZGlhdGUgZmlsZXMsIG9ubHkgb25lIGBybScgY29tbWFuZCBsaW5lIGlzIHByaW50ZWQsCiAgbGlzdGluZyBhbGwgZmlsZSBuYW1lcy4KCiogVGhlcmUgYXJlIG5vdyBhdXRvbWF0aWMgdmFyaWFibGVzIGAkKF5EKScsIGAkKF5GKScsIGAkKD9EKScsIGFuZCBgJCg/RiknLgogIFRoZXNlIGFyZSB0aGUgZGlyZWN0b3J5LW9ubHkgYW5kIGZpbGUtb25seSB2ZXJzaW9ucyBvZiBgJF4nIGFuZCBgJD8nLgoKKiBMaWJyYXJ5IGRlcGVuZGVuY2llcyBnaXZlbiBhcyBgLWxOQU1FJyB3aWxsIHVzZSAibGliTkFNRS5hIiBpbiB0aGUgY3VycmVudAogIGRpcmVjdG9yeSBpZiBpdCBleGlzdHMuCgoqIFRoZSBhdXRvbWF0aWMgdmFyaWFibGUgYCQoJC8pJyBpcyBubyBsb25nZXIgZGVmaW5lZC4KCiogTGVhZGluZyBgKycgY2hhcmFjdGVycyBvbiBhIHJlY2lwZSBsaW5lIG1ha2UgdGhhdCBsaW5lIGJlIGV4ZWN1dGVkIGV2ZW4KICB1bmRlciAtbiwgLXQsIG9yIC1xIChhcyBpZiB0aGUgbGluZSBjb250YWluZWQgYCQoTUFLRSknKS4KCiogRm9yIHJlY2lwZSBsaW5lcyBjb250YWluaW5nIGAkKE1BS0UpJywgYCR7TUFLRX0nLCBvciBsZWFkaW5nIGArJyBjaGFyYWN0ZXJzLAogIG9ubHkgdGhvc2UgbGluZXMgYXJlIGV4ZWN1dGVkLCBub3QgdGhlIGVudGlyZSByZWNpcGUuCiAgKFRoaXMgaXMgaG93IFVuaXggbWFrZSBiZWhhdmVzIGZvciBsaW5lcyBjb250YWluaW5nIGAkKE1BS0UpJyBvciBgJHtNQUtFfScuKQoMClZlcnNpb24gMy41MAoKKiBGaWxlbmFtZXMgaW4gcnVsZXMgd2lsbCBub3cgaGF2ZSB+IGFuZCB+VVNFUiBleHBhbmRlZC4KCiogVGhlIGAtcCcgb3V0cHV0IGhhcyBiZWVuIGNoYW5nZWQgc28gaXQgY2FuIGJlIHVzZWQgYXMgYSBtYWtlZmlsZS4KICAoQWxsIGluZm9ybWF0aW9uIHRoYXQgaXNuJ3Qgc3BlY2lmaWVkIGJ5IG1ha2VmaWxlcyBpcyBwcmVmYWNlZCB3aXRoIGNvbW1lbnQKICBjaGFyYWN0ZXJzLikKDApWZXJzaW9uIDMuNDkKCiogVGhlICUgY2hhcmFjdGVyIGNhbiBiZSBxdW90ZWQgd2l0aCBiYWNrc2xhc2ggaW4gaW1wbGljaXQgcGF0dGVybiBydWxlcywKICBzdGF0aWMgcGF0dGVybiBydWxlcywgYHZwYXRoJyBkaXJlY3RpdmVzLCBhbmQgYHBhdHN1YnN0JywgYGZpbHRlcicsIGFuZAogIGBmaWx0ZXItb3V0JyBmdW5jdGlvbnMuICBBIHdhcm5pbmcgaXMgaXNzdWVkIGlmIGEgYHZwYXRoJyBkaXJlY3RpdmUncwogIHBhdHRlcm4gY29udGFpbnMgbm8gJS4KCiogVGhlIGB3aWxkY2FyZCcgdmFyaWFibGUgZXhwYW5zaW9uIGZ1bmN0aW9uIG5vdyBleHBhbmRzIH4gYW5kIH5VU0VSLgoKKiBNZXNzYWdlcyBpbmRpY2F0aW5nIGZhaWxlZCByZWNpcGUgbGluZXMgbm93IGNvbnRhaW4gdGhlIHRhcmdldCBuYW1lOgogICAgICAgIG1ha2U6ICoqKiBbdGFyZ2V0XSBFcnJvciAxCgoqIFRoZSBgLXAnIG91dHB1dCBmb3JtYXQgaGFzIGJlZW4gY2hhbmdlZCBzb21ld2hhdCB0byBsb29rIG1vcmUgbGlrZQogIG1ha2VmaWxlIHJ1bGVzIGFuZCB0byBnaXZlIGFsbCBpbmZvcm1hdGlvbiB0aGF0IE1ha2UgaGFzIGFib3V0IGZpbGVzLgoMClZlcnNpb24gMy40OAoMClZlcnNpb24gMy40NwoKKiBUaGUgYC1sJyBzd2l0Y2ggd2l0aCBubyBhcmd1bWVudCByZW1vdmVzIGFueSBwcmV2aW91cyBsb2FkLWF2ZXJhZ2UgbGltaXQuCgoqIFdoZW4gdGhlIGAtdycgc3dpdGNoIGlzIGluIGVmZmVjdCwgYW5kIE1ha2UgaGFzIHVwZGF0ZWQgbWFrZWZpbGVzLAogIGl0IHdpbGwgd3JpdGUgYSBgTGVhdmluZyBkaXJlY3RvcnknIG1lc3NhZ2UgYmVmb3JlIHJlLWV4ZWN1dGluZyBpdHNlbGYuCiAgVGhpcyBtYWtlcyB0aGUgYGRpcmVjdG9yeSBjaGFuZ2UgdHJhY2tpbmcnIGNoYW5nZXMgdG8gRW1hY3MncyBjb21waWxhdGlvbgogIGNvbW1hbmRzIHdvcmsgcHJvcGVybHkuCgwKVmVyc2lvbiAzLjQ2CgoqIFRoZSBhdXRvbWF0aWMgdmFyaWFibGUgYCQqJyBpcyBub3cgZGVmaW5lZCBmb3IgZXhwbGljaXQgcnVsZXMsCiAgYXMgaXQgaXMgaW4gVW5peCBtYWtlLgoMClZlcnNpb24gMy40NQoKKiBUaGUgYC1qJyBzd2l0Y2ggaXMgbm93IHB1dCBpbiB0aGUgTUFLRUZMQUdTIGFuZCBNRkxBR1MgdmFyaWFibGVzIHdoZW4KICBzcGVjaWZpZWQgd2l0aG91dCBhbiBhcmd1bWVudCAoaW5kaWNhdGluZyBpbmZpbml0ZSBqb2JzKS4KICBUaGUgYC1sJyBzd2l0Y2ggaXMgbm90IGFsd2F5cyBwdXQgaW4gdGhlIE1BS0VGTEFHUyBhbmQgTUZMQUdTIHZhcmlhYmxlcy4KCiogTWFrZSBubyBsb25nZXIgY2hlY2tzIGhhc2hlZCBkaXJlY3RvcmllcyBhZnRlciBydW5uaW5nIHJlY2lwZXMuCiAgVGhlIGJlaGF2aW9yIGltcGxlbWVudGVkIGluIDMuNDEgY2F1c2VkIHRvbyBtdWNoIHNsb3dkb3duLgoMClZlcnNpb24gMy40NAoKKiBBIGRlcGVuZGVuY3kgaXMgTk9UIGNvbnNpZGVyZWQgbmV3ZXIgdGhhbiBpdHMgZGVwZW5kZW50IGlmCiAgdGhleSBoYXZlIHRoZSBzYW1lIG1vZGlmaWNhdGlvbiB0aW1lLiAgVGhlIGJlaGF2aW9yIGltcGxlbWVudGVkCiAgaW4gMy40MyBjb25mbGljdHMgd2l0aCBSQ1MuCgwKVmVyc2lvbiAzLjQzCgoqIERlcGVuZGVuY3kgbG9vcHMgYXJlIG5vIGxvbmdlciBmYXRhbCBlcnJvcnMuCgoqIEEgZGVwZW5kZW5jeSBpcyBjb25zaWRlcmVkIG5ld2VyIHRoYW4gaXRzIGRlcGVuZGVudCBpZgogIHRoZXkgaGF2ZSB0aGUgc2FtZSBtb2RpZmljYXRpb24gdGltZS4KDApWZXJzaW9uIDMuNDIKCiogVGhlIHZhcmlhYmxlcyBGNzcgYW5kIEY3N0ZMQUdTIGFyZSBub3cgc2V0IGJ5IGRlZmF1bHQgdG8gJChGQykgYW5kCiAgJChGRkxBR1MpLiAgTWFrZWZpbGVzIGRlc2lnbmVkIGZvciBTeXN0ZW0gViBtYWtlIG1heSB1c2UgdGhlc2UgdmFyaWFibGVzIGluCiAgZXhwbGljaXQgcnVsZXMgYW5kIGV4cGVjdCB0aGVtIHRvIGJlIHNldC4gIFVuZm9ydHVuYXRlbHksIHRoZXJlIGlzIG5vIHdheSB0bwogIG1ha2Ugc2V0dGluZyB0aGVzZSBhZmZlY3QgdGhlIEZvcnRyYW4gaW1wbGljaXQgcnVsZXMgdW5sZXNzIEZDIGFuZCBGRkxBR1MKICBhcmUgbm90IHVzZWQgKGFuZCB0aGVzZSBhcmUgdXNlZCBieSBCU0QgbWFrZSkuCgwKVmVyc2lvbiAzLjQxCgoqIE1ha2Ugbm93IGNoZWNrcyB0byBzZWUgaWYgaXRzIGhhc2hlZCBkaXJlY3RvcmllcyBhcmUgY2hhbmdlZCBieSByZWNpcGVzLgogIE90aGVyIG1ha2VzIHRoYXQgaGFzaCBkaXJlY3RvcmllcyAoU3VuLCA0LjMgQlNEKSBkb24ndCBkbyB0aGlzLgoMClZlcnNpb24gMy4zOQoKKiBUaGUgYHNoZWxsJyBmdW5jdGlvbiBubyBsb25nZXIgY2FwdHVyZXMgc3RhbmRhcmQgZXJyb3Igb3V0cHV0LgoMClZlcnNpb24gMy4zMgoKKiBBIGZpbGUgYmVnaW5uaW5nIHdpdGggYSBkb3QgY2FuIGJlIHRoZSBkZWZhdWx0IHRhcmdldCBpZiBpdCBhbHNvIGNvbnRhaW5zCiAgYSBzbGFzaCAoZS5nLiwgYC4uL2Jpbi9mb28nKS4gIChVbml4IG1ha2UgYWxsb3dzIHRoaXMgYXMgd2VsbC4pCgwKVmVyc2lvbiAzLjMxCgoqIEFyY2hpdmUgbWVtYmVyIG5hbWVzIGFyZSB0cnVuY2F0ZWQgdG8gMTUgY2hhcmFjdGVycy4KCiogWWV0IG1vcmUgVVNHIHN0dWZmLgoKKiBNaW5pbWFsIHN1cHBvcnQgZm9yIE1pY3JvcG9ydCBTeXN0ZW0gViAoYSAxNi1iaXQgbWFjaGluZSBhbmQgYQogIGJyYWluLWRhbWFnZWQgY29tcGlsZXIpLiAgVGhpcyBoYXMgZXZlbiBsb3dlciBwcmlvcml0eSB0aGFuIG90aGVyIFVTRwogIHN1cHBvcnQsIHNvIGlmIGl0IGdldHMgYmV5b25kIHRyaXZpYWwsIEkgd2lsbCB0YWtlIGl0IG91dCBjb21wbGV0ZWx5LgoKKiBSZXZhbXBlZCBkZWZhdWx0IGltcGxpY2l0IHJ1bGVzIChub3QgbXVjaCB2aXNpYmxlIGNoYW5nZSkuCgoqIFRoZSAtZCBhbmQgLXAgb3B0aW9ucyBjYW4gY29tZSBmcm9tIHRoZSBlbnZpcm9ubWVudC4KDApWZXJzaW9uIDMuMzAKCiogSW1wcm92ZWQgc3VwcG9ydCBmb3IgVVNHIGFuZCBIUFVYIChob3BlZnVsbHkpLgoKKiBBIHZhcmlhYmxlIHJlZmVyZW5jZSBsaWtlIGAkKGZvbzphPWIpJywgaWYgYGEnIGNvbnRhaW5zIGEgYCUnLCBpcwogIGVxdWl2YWxlbnQgdG8gYCQocGF0c3Vic3QgYSxiLCQoZm9vKSknLgoKKiBEZWZpbmluZyAuREVGQVVMVCB3aXRoIG5vIGRlcHMgb3IgcmVjaXBlIGNsZWFycyBpdHMgcmVjaXBlLgoKKiBOZXcgZGVmYXVsdCBpbXBsaWNpdCBydWxlcyBmb3IgLlMgKGNwcCwgdGhlbiBhcyksIGFuZCAuc2ggKGNvcHkgYW5kCiAgbWFrZSBleGVjdXRhYmxlKS4gIEFsbCBkZWZhdWx0IGltcGxpY2l0IHJ1bGVzIHRoYXQgdXNlIGNwcCAoZXZlbgogIGluZGlyZWN0bHkpLCB1c2UgJChDUFBGTEFHUykuCgwKVmVyc2lvbiAzLjI5CgoqIEdpdmluZyB0aGUgLWogb3B0aW9uIHdpdGggbm8gYXJndW1lbnRzIGdpdmVzIHlvdSBpbmZpbml0ZSBqb2JzLgoMClZlcnNpb24gMy4yOAoKKiBOZXcgb3B0aW9uOiAiLWwgTE9BRCIgc2F5cyBub3QgdG8gc3RhcnQgYW55IG5ldyBqb2JzIHdoaWxlIG90aGVycyBhcmUKICBydW5uaW5nIGlmIHRoZSBsb2FkIGF2ZXJhZ2UgaXMgbm90IGJlbG93IExPQUQgKGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyKS4KCiogVGhlcmUgaXMgc3VwcG9ydCBpbiBwbGFjZSBmb3IgaW1wbGVtZW50YXRpb25zIG9mIHJlbW90ZSBjb21tYW5kIGV4ZWN1dGlvbgogIGluIE1ha2UuICBTZWUgdGhlIGZpbGUgcmVtb3RlLmMuCgwKVmVyc2lvbiAzLjI2CgoqIE5vIG1vcmUgdGhhbiAxMCBkaXJlY3RvcmllcyB3aWxsIGJlIGtlcHQgb3BlbiBhdCBvbmNlLgogIChUaGlzIG51bWJlciBjYW4gYmUgY2hhbmdlZCBieSByZWRlZmluaW5nIE1BWF9PUEVOX0RJUkVDVE9SSUVTIGluIGRpci5jLikKDApWZXJzaW9uIDMuMjUKCiogQXJjaGl2ZSBmaWxlcyB3aWxsIGhhdmUgdGhlaXIgbW9kaWZpY2F0aW9uIHRpbWVzIHJlY29yZGVkIGJlZm9yZSBkb2luZwogIGFueXRoaW5nIHRoYXQgbWlnaHQgY2hhbmdlIHRoZWlyIG1vZGlmaWNhdGlvbiB0aW1lcyBieSB1cGRhdGluZyBhbiBhcmNoaXZlCiAgbWVtYmVyLgoMClZlcnNpb24gMy4yMAoKKiBUaGUgYE1BS0VMRVZFTCcgdmFyaWFibGUgaXMgZGVmaW5lZCBmb3IgdXNlIGJ5IG1ha2VmaWxlcy4KDApWZXJzaW9uIDMuMTkKCiogVGhlIHJlY3Vyc2lvbiBsZXZlbCBpbmRpY2F0aW9ucyBpbiBlcnJvciBtZXNzYWdlcyBhcmUgbXVjaCBzaG9ydGVyIHRoYW4KICB0aGV5IHdlcmUgaW4gdmVyc2lvbiAzLjE0LgoMClZlcnNpb24gMy4xOAoKKiBMZWFkaW5nIHNwYWNlcyBiZWZvcmUgZGlyZWN0aXZlcyBhcmUgaWdub3JlZCAoYXMgZG9jdW1lbnRlZCkuCgoqIEluY2x1ZGVkIG1ha2VmaWxlcyBjYW4gZGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGdvYWwgdGFyZ2V0LgogIChTeXN0ZW0gViBNYWtlIGRvZXMgaXQgdGhpcyB3YXksIHNvIHdlIGFyZSBiZWluZyBjb21wYXRpYmxlKS4KDApWZXJzaW9uIDMuMTQuCgoqIFZhcmlhYmxlcyB0aGF0IGFyZSBkZWZhdWx0cyBidWlsdCBpbnRvIE1ha2Ugd2lsbCBub3QgYmUgcHV0IGluIHRoZQogIGVudmlyb25tZW50IGZvciBjaGlsZHJlbi4gIFRoaXMganVzdCBzYXZlcyBzb21lIGVudmlyb25tZW50IHNwYWNlIGFuZCwKICBleGNlcHQgdW5kZXIgLWUsIHdpbGwgYmUgdHJhbnNwYXJlbnQgdG8gc3ViLW1ha2VzLgoKKiBFcnJvciBtZXNzYWdlcyBmcm9tIHN1Yi1tYWtlcyB3aWxsIGluZGljYXRlIHRoZSBsZXZlbCBvZiByZWN1cnNpb24uCgoqIEhvcGVmdWxseSBzb21lIHNwZWVkLXVwIGZvciBsYXJnZSBkaXJlY3RvcmllcyBkdWUgdG8gYSBjaGFuZ2UgaW4gdGhlCiAgZGlyZWN0b3J5IGhhc2hpbmcgc2NoZW1lLgoKKiBPbmUgY2hpbGQgd2lsbCBhbHdheXMgZ2V0IGEgc3RhbmRhcmQgaW5wdXQgdGhhdCBpcyB1c2FibGUuCgoqIERlZmF1bHQgbWFrZWZpbGVzIHRoYXQgZG9uJ3QgZXhpc3Qgd2lsbCBiZSByZW1hZGUgYW5kIHJlYWQgaW4uCgwKVmVyc2lvbiAzLjEzLgoKKiBDb3VudCBwYXJlbnRoZXNlcyBpbnNpZGUgZXhwYW5zaW9uIGZ1bmN0aW9uIGNhbGxzIHNvIHlvdSBjYW4KICBoYXZlIG5lc3RlZCBjYWxsczogYCQoc29ydCAkKGZvcmVhY2ggeCxhIGIsJCh4KSkpJy4KDApWZXJzaW9uIDMuMTIuCgoqIFNldmVyYWwgYnVnIGZpeGVzLCBpbmNsdWRpbmcgVVNHIGFuZCBTdW4zODZpIHN1cHBvcnQuCgoqIGBzaGVsbCcgZnVuY3Rpb24gdG8gZXhwYW5kIHNoZWxsIGNvbW1hbmRzIGEgbGEgYAoKKiBJZiB0aGUgYC1kJyBmbGFnIGlzIGdpdmVuLCB2ZXJzaW9uIGluZm9ybWF0aW9uIHdpbGwgYmUgcHJpbnRlZC4KCiogVGhlIGAtYycgb3B0aW9uIGhhcyBiZWVuIHJlbmFtZWQgdG8gYC1DJyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRhci4KCiogVGhlIGAtcCcgb3B0aW9uIG5vIGxvbmdlciBpbmhpYml0cyBvdGhlciBub3JtYWwgb3BlcmF0aW9uLgoKKiBNYWtlZmlsZXMgd2lsbCBiZSB1cGRhdGVkIGFuZCByZS1yZWFkIGlmIG5lY2Vzc2FyeS4KCiogQ2FuIG5vdyBydW4gc2V2ZXJhbCByZWNpcGVzIGF0IG9uY2UgKHBhcmFsbGVsaXNtKSwgLWogb3B0aW9uLgoKKiBFcnJvciBtZXNzYWdlcyB3aWxsIGNvbnRhaW4gdGhlIGxldmVsIG9mIE1ha2UgcmVjdXJzaW9uLCBpZiBhbnkuCgoqIFRoZSBgTUFLRUZMQUdTJyBhbmQgYE1GTEFHUycgdmFyaWFibGVzIHdpbGwgYmUgc2Nhbm5lZCBmb3Igb3B0aW9ucyBhZnRlcgogIG1ha2VmaWxlcyBhcmUgcmVhZC4KCiogQSBkb3VibGUtY29sb24gcnVsZSB3aXRoIG5vIGRlcGVuZGVuY2llcyB3aWxsIGFsd2F5cyBoYXZlIGl0cyByZWNpcGUgcnVuLgogIChUaGlzIGlzIGhvdyBib3RoIHRoZSBCU0QgYW5kIFN5c3RlbSBWIHZlcnNpb25zIG9mIE1ha2UgZG8gaXQuKQoMClZlcnNpb24gMy4wNQoKKENoYW5nZXMgZnJvbSB2ZXJzaW9ucyAxIHRocm91Z2ggMy4wNSB3ZXJlIG5ldmVyIHJlY29yZGVkLiAgU29ycnkuKQoMCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQ29weXJpZ2h0IChDKSAxOTg4LTIwMTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuClRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBNYWtlLgoKR05VIE1ha2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQpGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgp2ZXJzaW9uLgoKR05VIE1ha2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCldBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SCkEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAp0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCg==