R05VIG1ha2UgTkVXUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotaW5kZW50ZWQtdGV4dC0qLQogIEhpc3Rvcnkgb2YgdXNlci12aXNpYmxlIGNoYW5nZXMuCiAgMjAgSmFudWFyeSAyMDIwCgpTZWUgdGhlIGVuZCBvZiB0aGlzIGZpbGUgZm9yIGNvcHlyaWdodHMgYW5kIGNvbmRpdGlvbnMuCgpBbGwgdXNlci12aXNpYmxlIGNoYW5nZXMgYXJlIG1vcmUgZnVsbHkgZGVzY3JpYmVkIGluIHRoZSBHTlUgbWFrZSBtYW51YWwsCndoaWNoIGlzIGNvbnRhaW5lZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBhcyB0aGUgZmlsZSBkb2MvbWFrZS50ZXhpLgpTZWUgdGhlIFJFQURNRSBmaWxlIGFuZCB0aGUgR05VIG1ha2UgbWFudWFsIGZvciBpbnN0cnVjdGlvbnMgZm9yCnJlcG9ydGluZyBidWdzLgoMClZlcnNpb24gNC4zLjkwICgyMCBKYW4gMjAyMCkKCkEgY29tcGxldGUgbGlzdCBvZiBidWdzIGZpeGVkIGluIHRoaXMgdmVyc2lvbiBpcyBhdmFpbGFibGUgaGVyZToKCmh0dHBzOi8vc3YuZ251Lm9yZy9idWdzL2luZGV4LnBocD9ncm91cD1tYWtlJnJlcG9ydF9pZD0xMTEmZml4X3JlbGVhc2VfaWQ9MTA5JnNldD1jdXN0b20KCgwKVmVyc2lvbiA0LjMgKDE5IEphbiAyMDIwKQoKQSBjb21wbGV0ZSBsaXN0IG9mIGJ1Z3MgZml4ZWQgaW4gdGhpcyB2ZXJzaW9uIGlzIGF2YWlsYWJsZSBoZXJlOgoKaHR0cHM6Ly9zdi5nbnUub3JnL2J1Z3MvaW5kZXgucGhwP2dyb3VwPW1ha2UmcmVwb3J0X2lkPTExMSZmaXhfcmVsZWFzZV9pZD0xMDgmc2V0PWN1c3RvbQoKKiBXQVJOSU5HOiBCYWNrd2FyZC1pbmNvbXBhdGliaWxpdHkhCiAgTnVtYmVyIHNpZ25zICgjKSBhcHBlYXJpbmcgaW5zaWRlIGEgbWFjcm8gcmVmZXJlbmNlIG9yIGZ1bmN0aW9uIGludm9jYXRpb24KICBubyBsb25nZXIgaW50cm9kdWNlIGNvbW1lbnRzIGFuZCBzaG91bGQgbm90IGJlIGVzY2FwZWQgd2l0aCBiYWNrc2xhc2hlczoKICB0aHVzIGEgY2FsbCBzdWNoIGFzOgogICAgZm9vIDo9ICQoc2hlbGwgZWNobyAnIycpCiAgaXMgbGVnYWwuICBQcmV2aW91c2x5IHRoZSBudW1iZXIgc2lnbiBuZWVkZWQgdG8gYmUgZXNjYXBlZCwgZm9yIGV4YW1wbGU6CiAgICBmb28gOj0gJChzaGVsbCBlY2hvICdcIycpCiAgTm93IHRoaXMgbGF0dGVyIHdpbGwgcmVzb2x2ZSB0byAiXCMiLiAgSWYgeW91IHdhbnQgdG8gd3JpdGUgbWFrZWZpbGVzCiAgcG9ydGFibGUgdG8gYm90aCB2ZXJzaW9ucywgYXNzaWduIHRoZSBudW1iZXIgc2lnbiB0byBhIHZhcmlhYmxlOgogICAgSCA6PSBcIwogICAgZm9vIDo9ICQoc2hlbGwgZWNobyAnJEgnKQogIFRoaXMgd2FzIGNsYWltZWQgdG8gYmUgZml4ZWQgaW4gMy44MSwgYnV0IHdhc24ndCwgZm9yIHNvbWUgcmVhc29uLgogIFRvIGRldGVjdCB0aGlzIGNoYW5nZSBzZWFyY2ggZm9yICdub2NvbW1lbnQnIGluIHRoZSAuRkVBVFVSRVMgdmFyaWFibGUuCgoqIFdBUk5JTkc6IEJhY2t3YXJkLWluY29tcGF0aWJpbGl0eSEKICBQcmV2aW91c2x5IGFwcGVuZGluZyB1c2luZyAnKz0nIHRvIGFuIGVtcHR5IHZhcmlhYmxlIHdvdWxkIHJlc3VsdCBpbiBhIHZhbHVlCiAgc3RhcnRpbmcgd2l0aCBhIHNwYWNlLiAgTm93IHRoZSBpbml0aWFsIHNwYWNlIGlzIG9ubHkgYWRkZWQgaWYgdGhlIHZhcmlhYmxlCiAgYWxyZWFkeSBjb250YWlucyBzb21lIHZhbHVlLiAgU2ltaWxhcmx5LCBhcHBlbmRpbmcgYW4gZW1wdHkgc3RyaW5nIGRvZXMgbm90CiAgYWRkIGEgdHJhaWxpbmcgc3BhY2UuCgoqIE5PVEU6IERlcHJlY2F0ZWQgYmVoYXZpb3IuCiAgQ29udHJhcnkgdG8gdGhlIGRvY3VtZW50YXRpb24sIHN1ZmZpeCBydWxlcyB3aXRoIHByZXJlcXVpc2l0ZXMgYXJlIGJlaW5nCiAgdHJlYXRlZCBCT1RIIGFzIHNpbXBsZSB0YXJnZXRzIEFORCBhcyBwYXR0ZXJuIHJ1bGVzLiAgRnVydGhlciwgdGhlCiAgcHJlcmVxdWlzaXRlcyBhcmUgaWdub3JlZCBieSB0aGUgcGF0dGVybiBydWxlcy4gIFBPU0lYIHNwZWNpZmllcyB0aGF0IGluCiAgb3JkZXIgdG8gYmUgYSBzdWZmaXggcnVsZSB0aGVyZSBjYW4gYmUgbm8gcHJlcmVxdWlzaXRlcyBkZWZpbmVkLiAgSW4gdGhpcwogIHJlbGVhc2UgaWYgUE9TSVggbW9kZSBpcyBlbmFibGVkIHRoZW4gcnVsZXMgd2l0aCBwcmVyZXF1aXNpdGVzIGNhbm5vdCBiZQogIHN1ZmZpeCBydWxlcy4gIElmIFBPU0lYIG1vZGUgaXMgbm90IGVuYWJsZWQgdGhlbiB0aGUgcHJldmlvdXMgYmVoYXZpb3IgaXMKICBwcmVzZXJ2ZWQgKGEgcGF0dGVybiBydWxlIHdpdGggbm8gZXh0cmEgcHJlcmVxdWlzaXRlcyBpcyBjcmVhdGVkKSBBTkQgYQogIHdhcm5pbmcgYWJvdXQgdGhpcyBiZWhhdmlvciBpcyBnZW5lcmF0ZWQ6CiAgICB3YXJuaW5nOiBpZ25vcmluZyBwcmVyZXF1aXNpdGVzIG9uIHN1ZmZpeCBydWxlIGRlZmluaXRpb24KICBUaGUgUE9TSVggYmVoYXZpb3Igd2lsbCBiZSBhZG9wdGVkIGFzIHRoZSBvbmx5IGJlaGF2aW9yIGluIGEgZnV0dXJlIHJlbGVhc2UKICBvZiBHTlUgbWFrZSBzbyBwbGVhc2UgcmVzb2x2ZSBhbnkgd2FybmluZ3MuCgoqIE5ldyBmZWF0dXJlOiBHcm91cGVkIGV4cGxpY2l0IHRhcmdldHMKICBQYXR0ZXJuIHJ1bGVzIGhhdmUgYWx3YXlzIGhhZCB0aGUgYWJpbGl0eSB0byBnZW5lcmF0ZSBtdWx0aXBsZSB0YXJnZXRzIHdpdGgKICBhIHNpbmdsZSBpbnZvY2F0aW9uIG9mIHRoZSByZWNpcGUuICBJdCdzIG5vdyBwb3NzaWJsZSB0byBkZWNsYXJlIHRoYXQgYW4KICBleHBsaWNpdCBydWxlIGdlbmVyYXRlcyBtdWx0aXBsZSB0YXJnZXRzIHdpdGggYSBzaW5nbGUgaW52b2NhdGlvbi4gIFRvIHVzZQogIHRoaXMsIHJlcGxhY2UgdGhlICI6IiB0b2tlbiB3aXRoICImOiIgaW4gdGhlIHJ1bGUuICBUbyBkZXRlY3QgdGhpcyBmZWF0dXJlCiAgc2VhcmNoIGZvciAnZ3JvdXBlZC10YXJnZXQnIGluIHRoZSAuRkVBVFVSRVMgc3BlY2lhbCB2YXJpYWJsZS4KICBJbXBsZW1lbnRhdGlvbiBjb250cmlidXRlZCBieSBLYXogS3lsaGVrdSA8a2F6QGt5bGhla3UuY29tPgoKKiBOZXcgZmVhdHVyZTogLkVYVFJBX1BSRVJFUVMgdmFyaWFibGUKICBXb3JkcyBpbiB0aGlzIHZhcmlhYmxlIGFyZSBjb25zaWRlcmVkIHByZXJlcXVpc2l0ZXMgb2YgdGFyZ2V0cyBidXQgdGhleSBhcmUKICBub3QgYWRkZWQgdG8gYW55IG9mIHRoZSBhdXRvbWF0aWMgdmFyaWFibGUgdmFsdWVzIHdoZW4gZXhwYW5kaW5nIHRoZQogIHJlY2lwZS4gIFRoaXMgdmFyaWFibGUgY2FuIGVpdGhlciBiZSBnbG9iYWwgKGFwcGxpZXMgdG8gYWxsIHRhcmdldHMpIG9yCiAgYSB0YXJnZXQtc3BlY2lmaWMgdmFyaWFibGUuICBUbyBkZXRlY3QgdGhpcyBmZWF0dXJlIHNlYXJjaCBmb3IgJ2V4dHJhLXByZXJlcXMnCiAgaW4gdGhlIC5GRUFUVVJFUyBzcGVjaWFsIHZhcmlhYmxlLgogIEltcGxlbWVudGF0aW9uIGNvbnRyaWJ1dGVkIGJ5IENocmlzdG9mIFdhcmxpY2ggPGN3YXJsaWNoQGdteC5kZT4KCiogTWFrZWZpbGVzIGNhbiBub3cgc3BlY2lmeSB0aGUgJy1qJyBvcHRpb24gaW4gdGhlaXIgTUFLRUZMQUdTIHZhcmlhYmxlIGFuZAogIHRoaXMgd2lsbCBjYXVzZSBtYWtlIHRvIGVuYWJsZSB0aGF0IHBhcmFsbGVsaXNtIG1vZGUuCgoqIEdOVSBtYWtlIHdpbGwgbm93IHVzZSBwb3NpeF9zcGF3bigpIG9uIHN5c3RlbXMgd2hlcmUgaXQgaXMgYXZhaWxhYmxlLgogIElmIHlvdSBwcmVmZXIgdG8gdXNlIGZvcmsvZXhlYyBldmVuIG9uIHN5c3RlbXMgd2hlcmUgcG9zaXhfc3Bhd24oKSBpcwogIHByZXNlbnQsIHlvdSBjYW4gdXNlIHRoZSAtLWRpc2FibGUtcG9zaXgtc3Bhd24gb3B0aW9uIHRvIGNvbmZpZ3VyZS4KICBJbXBsZW1lbnRhdGlvbiBjb250cmlidXRlZCBieSBBcm9uIEJhcmF0aCA8YmFyYXRoYXJvbkBjYWVzYXIuZWx0ZS5odT4KCiogRXJyb3IgbWVzc2FnZXMgcHJpbnRlZCB3aGVuIGludm9raW5nIG5vbi1leGlzdGVudCBjb21tYW5kcyBoYXZlIGJlZW4gY2xlYW5lZAogIHVwIGFuZCBtYWRlIGNvbnNpc3RlbnQuCgoqIFRoZSBwcmV2aW91cyBsaW1pdCBvZiA2MyBqb2JzIHVuZGVyIC1qTiBvbiBNUy1XaW5kb3dzIGlzIG5vdwogIGluY3JlYXNlZCB0byA0MDk1LiAgVGhhdCBsaW1pdCBpbmNsdWRlcyB0aGUgc3VicHJvY2VzcyBzdGFydGVkIGJ5CiAgdGhlICQoc2hlbGwpIGZ1bmN0aW9uLgoKKiBBIG5ldyBvcHRpb24gLS1uby1zaWxlbnQgaGFzIGJlZW4gYWRkZWQsIHRoYXQgY2FuY2VscyB0aGUgZWZmZWN0IG9mIHRoZQogIC1zLy0tc2lsZW50Ly0tcXVpZXQgZmxhZy4KCiogQSBuZXcgb3B0aW9uIC1FIGhhcyBiZWVuIGFkZGVkIGFzIGEgc2hvcnQgYWxpYXMgZm9yIC0tZXZhbC4KCiogQWxsIHdpbGRjYXJkIGV4cGFuc2lvbiB3aXRoaW4gR05VIG1ha2UsIGluY2x1ZGluZyAkKHdpbGRjYXJkIC4uLiksIHdpbGwgc29ydAogIHRoZSByZXN1bHRzLiAgU2VlIGh0dHBzOi8vc2F2YW5uYWguZ251Lm9yZy9idWdzL2luZGV4LnBocD81MjA3NgoKKiBJbnRlcm9wZXJhdGUgd2l0aCBuZXdlciBHTlUgbGliYyBhbmQgbXVzbCBDIHJ1bnRpbWUgbGlicmFyaWVzLgoKKiBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgcHJvdmlkZWQgYnkgUGFvbG8gQm9uemluaSA8cGJvbnppbmlAcmVkaGF0LmNvbT4KCkdOVSBtYWtlIERldmVsb3BlciBOZXdzCgoqIEltcG9ydCB0aGUgR05VIHN0YW5kYXJkIGJvb3RzdHJhcCBzY3JpcHQgdG8gcmVwbGFjZSB0aGUgaGFuZC1yb2xsZWQKICAibWFrZSB1cGRhdGUiIG1ldGhvZCBmb3IgYnVpbGRpbmcgY29kZSBmcm9tIGEgR05VIG1ha2UgR2l0IHJlcG9zaXRvcnkuCgoqIFJld29yayB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbiB0byBtb3ZlIHNvdXJjZSBmaWxlcyBpbnRvIHRoZSBzcmMvKgogIHN1YmRpcmVjdG9yeS4gIFRoaXMgYWxpZ25zIHdpdGggbW9kZXJuIGJlc3QgcHJhY3RpY2VzIGluIEdOVS4KCiogUmVwbGFjZSBsb2NhbCBwb3J0YWJpbGl0eSBjb2RlIHdpdGggR251bGliIGNvbnRlbnQuICBVbmZvcnR1bmF0ZWx5IGR1ZSB0byBhCiAgcHJvYmxlbSB3aXRoIEdudWxpYiBzdXBwb3J0IGZvciBnZXRsb2FkYXZnLCB0aGlzIGZvcmNlcyBhIHJlcXVpcmVtZW50IG9uCiAgQXV0b21ha2UgMS4xNiBvciBhYm92ZSBpbiBvcmRlciB0byBidWlsZCBmcm9tIEdpdC4gIFNlZSBSRUFETUUuZ2l0LgoKDApWZXJzaW9uIDQuMi4xICgxMCBKdW4gMjAxNikKCkEgY29tcGxldGUgbGlzdCBvZiBidWdzIGZpeGVkIGluIHRoaXMgdmVyc2lvbiBpcyBhdmFpbGFibGUgaGVyZToKCmh0dHBzOi8vc3YuZ251Lm9yZy9idWdzL2luZGV4LnBocD9ncm91cD1tYWtlJnJlcG9ydF9pZD0xMTEmZml4X3JlbGVhc2VfaWQ9MTA3JnNldD1jdXN0b20KClRoaXMgcmVsZWFzZSBpcyBhIGJ1Zy1maXggcmVsZWFzZS4KCgwKVmVyc2lvbiA0LjIgKDIyIE1heSAyMDE2KQoKQSBjb21wbGV0ZSBsaXN0IG9mIGJ1Z3MgZml4ZWQgaW4gdGhpcyB2ZXJzaW9uIGlzIGF2YWlsYWJsZSBoZXJlOgoKaHR0cHM6Ly9zdi5nbnUub3JnL2J1Z3MvaW5kZXgucGhwP2dyb3VwPW1ha2UmcmVwb3J0X2lkPTExMSZmaXhfcmVsZWFzZV9pZD0xMDYmc2V0PWN1c3RvbQoKKiBOZXcgdmFyaWFibGU6ICQoLlNIRUxMU1RBVFVTKSBpcyBzZXQgdG8gdGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBsYXN0ICE9IG9yCiAgJChzaGVsbCAuLi4pIGZ1bmN0aW9uIGludm9rZWQgaW4gdGhpcyBpbnN0YW5jZSBvZiBtYWtlLiAgVGhpcyB3aWxsIGJlICIwIiBpZgogIHN1Y2Nlc3NmdWwgb3Igbm90ICIwIiBpZiBub3Qgc3VjY2Vzc2Z1bC4gIFRoZSB2YXJpYWJsZSB2YWx1ZSBpcyB1bnNldCBpZiBubwogICE9IG9yICQoc2hlbGwgLi4uKSBmdW5jdGlvbiBoYXMgYmVlbiBpbnZva2VkLgoKKiBUaGUgJChmaWxlIC4uLikgZnVuY3Rpb24gY2FuIG5vdyByZWFkIGZyb20gYSBmaWxlIHdpdGggJChmaWxlIDxGSUxFKS4KICBUaGUgZnVuY3Rpb24gaXMgZXhwYW5kZWQgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlLiAgVGhlIGNvbnRlbnRzIGFyZQogIGV4cGFuZGVkIHZlcmJhdGltIGV4Y2VwdCB0aGF0IHRoZSBmaW5hbCBuZXdsaW5lLCBpZiBhbnksIGlzIHN0cmlwcGVkLgoKKiBUaGUgbWFrZWZpbGUgbGluZSBudW1iZXJzIHNob3duIGJ5IEdOVSBtYWtlIG5vdyBwb2ludCBkaXJlY3RseSB0byB0aGUKICBzcGVjaWZpYyBsaW5lIGluIHRoZSByZWNpcGUgd2hlcmUgdGhlIGZhaWx1cmUgb3Igd2FybmluZyBvY2N1cnJlZC4KICBTYW1wbGUgY2hhbmdlcyBzdWdnZXN0ZWQgYnkgQnJpYW4gVmFuZGVuYmVyZyA8cGhhbnRhbGxAZ21haWwuY29tPgoKKiBUaGUgaW50ZXJmYWNlIHRvIEdOVSBtYWtlJ3MgImpvYnNlcnZlciIgaXMgc3RhYmxlIGFzIGRvY3VtZW50ZWQgaW4gdGhlCiAgbWFudWFsLCBmb3IgdG9vbHMgd2hpY2ggbWF5IHdhbnQgdG8gYWNjZXNzIGl0LgoKICBXQVJOSU5HOiBCYWNrd2FyZC1pbmNvbXBhdGliaWxpdHkhIFRoZSBpbnRlcm5hbC1vbmx5IGNvbW1hbmQgbGluZSBvcHRpb24KICAtLWpvYnNlcnZlci1mZHMgaGFzIGJlZW4gcmVuYW1lZCBmb3IgcHVibGlzaGluZywgdG8gLS1qb2JzZXJ2ZXItYXV0aC4KCiogVGhlIGFtb3VudCBvZiBwYXJhbGxlbGlzbSBjYW4gYmUgZGV0ZXJtaW5lZCBieSBxdWVyeWluZyBNQUtFRkxBR1MsIGV2ZW4gd2hlbgogIHRoZSBqb2Igc2VydmVyIGlzIGVuYWJsZWQgKHByZXZpb3VzbHkgTUFLRUZMQUdTIHdvdWxkIGFsd2F5cyBjb250YWluIG9ubHkKICAiLWoiLCB3aXRoIG5vIG51bWJlciwgd2hlbiBqb2Igc2VydmVyIHdhcyBlbmFibGVkKS4KCiogVk1TLXNwZWNpZmljIGNoYW5nZXM6CgogICogUGVybCB0ZXN0IGhhcm5lc3Mgbm93IHdvcmtzLgoKICAqIEZ1bGwgc3VwcG9ydCBmb3IgY29udmVydGluZyBVbml4IGV4aXQgc3RhdHVzIGNvZGVzIHRvIFZNUyBleGl0IHN0YXR1cwogICAgY29kZXMuICBCQUNLV0FSRCBJTkNPTVBBVElCSUxJVFkgTm90aWNlOiBPbiBhIGNoaWxkIGZhaWx1cmUgdGhlIFZNUyBleGl0CiAgICBjb2RlIGlzIG5vdyB0aGUgZW5jb2RlZCBVbml4IGV4aXQgc3RhdHVzIHRoYXQgTWFrZSB1c3VhbGx5IGdlbmVyYXRlcywgbm90CiAgICB0aGUgVk1TIGV4aXQgc3RhdHVzIG9mIHRoZSBjaGlsZC4KCgwKVmVyc2lvbiA0LjEgKDA1IE9jdCAyMDE0KQoKQSBjb21wbGV0ZSBsaXN0IG9mIGJ1Z3MgZml4ZWQgaW4gdGhpcyB2ZXJzaW9uIGlzIGF2YWlsYWJsZSBoZXJlOgoKaHR0cHM6Ly9zdi5nbnUub3JnL2J1Z3MvaW5kZXgucGhwP2dyb3VwPW1ha2UmcmVwb3J0X2lkPTExMSZmaXhfcmVsZWFzZV9pZD0xMDUmc2V0PWN1c3RvbQoKKiBOZXcgdmFyaWFibGVzOiAkKE1BS0VfVEVSTU9VVCkgYW5kICQoTUFLRV9URVJNRVJSKSBhcmUgc2V0IHRvIG5vbi1lbXB0eQogIHZhbHVlcyBpZiBzdGRvdXQgb3Igc3RkZXJyLCByZXNwZWN0aXZlbHksIGFyZSBiZWxpZXZlZCB0byBiZSB3cml0aW5nIHRvIGEKICB0ZXJtaW5hbC4gIFRoZXNlIHZhcmlhYmxlcyBhcmUgZXhwb3J0ZWQgYnkgZGVmYXVsdC4KCiogQWxsb3cgYSBuby10ZXh0LWFyZ3VtZW50IGZvcm0gb2YgdGhlICQoZmlsZSAuLi4pIGZ1bmN0aW9uLiAgV2l0aG91dCBhIHRleHQKICBhcmd1bWVudCBub3RoaW5nIGlzIHdyaXR0ZW4gdG8gdGhlIGZpbGU6IGl0IGlzIHNpbXBseSBvcGVuZWQgaW4gdGhlCiAgcmVxdWVzdGVkIG1vZGUsIHRoZW4gY2xvc2VkIGFnYWluLgoKKiBDaGFuZ2UgdGhlIGZhdGFsIGVycm9yIGZvciBtaXhlZCBleHBsaWNpdCBhbmQgaW1wbGljaXQgcnVsZXMsIHRoYXQgd2FzCiAgaW50cm9kdWNlZCBpbiBHTlUgbWFrZSAzLjgyLCB0byBhIG5vbi1mYXRhbCBlcnJvci4gIEhvd2V2ZXIsIHRoaXMgc3ludGF4IGlzCiAgc3RpbGwgZGVwcmVjYXRlZCBhbmQgbWF5IHJldHVybiB0byBiZWluZyBpbGxlZ2FsIGluIGEgZnV0dXJlIHZlcnNpb24gb2YgR05VCiAgbWFrZS4gIE1ha2VmaWxlcyB0aGF0IHJlbHkgb24gdGhpcyBzeW50YXggc2hvdWxkIGJlIGZpeGVkLgogIFNlZSBodHRwczovL3NhdmFubmFoLmdudS5vcmcvYnVncy8/MzMwMzQKCiogVk1TLXNwZWNpZmljIGNoYW5nZXM6CgogICogU3VwcG9ydCBmb3IgbGlicmFyeSBmaWxlcyBhZGRlZCwgaW5jbHVkaW5nIHN1cHBvcnQgZm9yIHVzaW5nIHRoZSBHTlYgYXIKICAgIHV0aWxpdHkuCgogICogUGFydGlhbCBzdXBwb3J0IGZvciBwcm9wZXJseSBlbmNvZGluZyBVbml4IGV4aXQgc3RhdHVzIGNvZGVzIGludG8gVk1TIGV4aXQKICAgIHN0YXR1cyBjb2Rlcy4KCiAgICBXQVJOSU5HOiBCYWNrd2FyZC1pbmNvbXBhdGliaWxpdHkhIFRoZXNlIGFyZSBkaWZmZXJlbnQgZXhpdCBzdGF0dXMgY29kZXMKICAgIHRoYW4gTWFrZSBleGl0ZWQgd2l0aCBpbiB0aGUgcGFzdC4KCiAgKiBNYWNyb3MgdG8gaG9sZCB0aGUgY3VycmVudCBtYWtlIGNvbW1hbmQgYXJlIHNldCB1cCB0byB0cmFuc2xhdGUgdGhlCiAgICBhcmd2WzBdIHN0cmluZyB0byBhIFZNUyBmb3JtYXQgcGF0aCBuYW1lIGFuZCBwcmVmaXggaXQgd2l0aCAiTUNSICIgc28gdGhhdAogICAgdGhlIG1hY3JvIGhhcyBhIHNwYWNlIGluIGl0LgoKICAgIFdBUk5JTkc6IEJhY2t3YXJkLWluY29tcGF0aWJpbGl0eSEgIFRoaXMgbWF5IGJyZWFrIGNvbXBsZXggbWFrZWZpbGVzIHRoYXQKICAgIGRvIHByb2Nlc3Npbmcgb24gdGhvc2UgbWFjcm9zLiAgVGhpcyBpcyB1bmxpa2VseSBiZWNhdXNlIHNvIG11Y2ggaW4gdGhhdAogICAgYXJlYSB3YXMgbm90IGFuZCBpcyBzdGlsbCBub3QgY3VycmVudGx5IHdvcmtpbmcgb24gVk1TLCBpdCBpcyB1bmxpa2VseSB0bwogICAgZmluZCBzdWNoIGEgY29tcGxleCBtYWtlZmlsZSwgc28gdGhpcyBpcyBtb3JlIGxpa2VseSB0byBpbXBhY3QKICAgIGNvbnN0cnVjdGlvbiBvZiBhIGZ1dHVyZSBtYWtlZmlsZS4KCiAgKiBBIGNvbW1hbmQgZmlsZSBpcyBhbHdheXMgdXNlZCB0byBydW4gdGhlIGNvbW1hbmRzIGZvciBhIHJlY2lwZS4KCiAgICBXQVJOSU5HOiBCYWNrd2FyZC1pbmNvbXBhdGliaWxpdHkhICBSdW5uaW5nIHRoZSBtYWtlIHNlbGYgdGVzdHMgaGFzCiAgICBleHBvc2VkIHRoYXQgdGhlcmUgYXJlIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGluIGJlaGF2aW9yIHdoZW4gcnVubmluZwogICAgd2l0aCB0aGUgY29tbWFuZCBmaWxlIG1vZGUuICBJdCBpcyB1bmtub3duIGlmIHRoaXMgd2lsbCBiZSBub3RpY2VkIGJ5IG1vc3QKICAgIGV4aXN0aW5nIFZNUyBtYWtlZmlsZXMuCgwKVmVyc2lvbiA0LjAgKDA5IE9jdCAyMDEzKQoKQSBjb21wbGV0ZSBsaXN0IG9mIGJ1Z3MgZml4ZWQgaW4gdGhpcyB2ZXJzaW9uIGlzIGF2YWlsYWJsZSBoZXJlOgoKaHR0cHM6Ly9zdi5nbnUub3JnL2J1Z3MvaW5kZXgucGhwP2dyb3VwPW1ha2UmcmVwb3J0X2lkPTExMSZmaXhfcmVsZWFzZV9pZD0xMDEmc2V0PWN1c3RvbQoKKiBXQVJOSU5HOiBCYWNrd2FyZC1pbmNvbXBhdGliaWxpdHkhCiAgSWYgLlBPU0lYIGlzIHNwZWNpZmllZCwgdGhlbiBtYWtlIGFkaGVyZXMgdG8gdGhlIFBPU0lYIGJhY2tzbGFzaC9uZXdsaW5lCiAgaGFuZGxpbmcgcmVxdWlyZW1lbnRzLCB3aGljaCBpbnRyb2R1Y2VzIHRoZSBmb2xsb3dpbmcgY2hhbmdlcyB0byB0aGUKICBzdGFuZGFyZCBiYWNrc2xhc2gvbmV3bGluZSBoYW5kbGluZyBpbiBub24tcmVjaXBlIGxpbmVzOgogICogQW55IHRyYWlsaW5nIHNwYWNlIGJlZm9yZSB0aGUgYmFja3NsYXNoIGlzIHByZXNlcnZlZAogICogRWFjaCBiYWNrc2xhc2gvbmV3bGluZSAocGx1cyBzdWJzZXF1ZW50IHdoaXRlc3BhY2UpIGlzIGNvbnZlcnRlZCB0byBhCiAgICBzaW5nbGUgc3BhY2UKCiogTmV3IGZlYXR1cmU6IEdOVSBHdWlsZSBpbnRlZ3JhdGlvbgogIFRoaXMgdmVyc2lvbiBvZiBHTlUgbWFrZSBjYW4gYmUgY29tcGlsZWQgd2l0aCBHTlUgR3VpbGUgaW50ZWdyYXRpb24uCiAgR05VIEd1aWxlIHNlcnZlcyBhcyBhbiBlbWJlZGRlZCBleHRlbnNpb24gbGFuZ3VhZ2UgZm9yIG1ha2UuCiAgU2VlIHRoZSAiR3VpbGUgRnVuY3Rpb24iIHNlY3Rpb24gaW4gdGhlIEdOVSBNYWtlIG1hbnVhbCBmb3IgZGV0YWlscy4KICBDdXJyZW50bHkgR05VIEd1aWxlIDEuOCBhbmQgMi4wKyBhcmUgc3VwcG9ydGVkLiAgSW4gR3VpbGUgMS44IHRoZXJlIGlzIG5vCiAgc3VwcG9ydCBmb3IgaW50ZXJuYXRpb25hbGl6ZWQgY2hhcmFjdGVyIHNldHMuICBJbiBHdWlsZSAyLjArLCBzY3JpcHRzIGNhbiBiZQogIGVuY29kZWQgaW4gVVRGLTguCgoqIE5ldyBjb21tYW5kIGxpbmUgb3B0aW9uOiAtLW91dHB1dC1zeW5jICgtTykgZW5hYmxlcyBncm91cGluZyBvZiBvdXRwdXQgYnkKICB0YXJnZXQgb3IgYnkgcmVjdXJzaXZlIG1ha2UuICBUaGlzIGlzIHVzZWZ1bCBkdXJpbmcgcGFyYWxsZWwgYnVpbGRzIHRvIGF2b2lkCiAgbWl4aW5nIG91dHB1dCBmcm9tIGRpZmZlcmVudCBqb2JzIHRvZ2V0aGVyIGdpdmluZyBoYXJkLXRvLXVuZGVyc3RhbmQKICByZXN1bHRzLiAgT3JpZ2luYWwgaW1wbGVtZW50YXRpb24gYnkgRGF2aWQgQm95Y2UgPGRzYkBib3lza2kuY29tPi4KICBSZXdvcmtlZCBhbmQgZW5oYW5jZWQgYnkgRnJhbmsgSGVja2VuYmFjaCA8Zi5oZWNrZW5iYWNoQGZoLXNvZnQuZGU+LgogIFdpbmRvd3Mgc3VwcG9ydCBieSBFbGkgWmFyZXRza2lpIDxlbGl6QGdudS5vcmc+LgoKKiBOZXcgY29tbWFuZCBsaW5lIG9wdGlvbjogLS10cmFjZSBlbmFibGVzIHRyYWNpbmcgb2YgdGFyZ2V0cy4gIFdoZW4gZW5hYmxlZAogIHRoZSByZWNpcGUgdG8gYmUgaW52b2tlZCBpcyBwcmludGVkIGV2ZW4gaWYgaXQgd291bGQgb3RoZXJ3aXNlIGJlIHN1cHByZXNzZWQKICBieSAuU0lMRU5UIG9yIGEgIkAiIHByZWZpeCBjaGFyYWN0ZXIuICBBbHNvIGJlZm9yZSBlYWNoIHJlY2lwZSBpcyBydW4gdGhlCiAgbWFrZWZpbGUgbmFtZSBhbmQgbGluZW51bWJlciB3aGVyZSBpdCB3YXMgZGVmaW5lZCBhcmUgc2hvd24gYXMgd2VsbCBhcyB0aGUKICBwcmVyZXF1aXNpdGVzIHRoYXQgY2F1c2VkIHRoZSB0YXJnZXQgdG8gYmUgY29uc2lkZXJlZCBvdXQgb2YgZGF0ZS4KCiogTmV3IGNvbW1hbmQgbGluZSBvcHRpb24gYXJndW1lbnQ6IC0tZGVidWcgbm93IGFjY2VwdHMgYSAibiIgKG5vbmUpIGZsYWcKICB3aGljaCBkaXNhYmxlcyBhbGwgZGVidWdnaW5nIHNldHRpbmdzIHRoYXQgYXJlIGN1cnJlbnRseSBlbmFibGVkLgoKKiBOZXcgZmVhdHVyZTogVGhlICJqb2Igc2VydmVyIiBjYXBhYmlsaXR5IGlzIG5vdyBzdXBwb3J0ZWQgb24gV2luZG93cy4KICBJbXBsZW1lbnRhdGlvbiBjb250cmlidXRlZCBieSBUcm95IFJ1bmtlbCA8VHJveS5SdW5rZWxAbWF0aHdvcmtzLmNvbT4KCiogTmV3IGZlYXR1cmU6IFRoZSAuT05FU0hFTEwgY2FwYWJpbGl0eSBpcyBub3cgc3VwcG9ydGVkIG9uIFdpbmRvd3MuICBTdXBwb3J0CiAgYWRkZWQgYnkgRWxpIFphcmV0c2tpaSA8ZWxpekBnbnUub3JnPi4KCiogTmV3IGZlYXR1cmU6ICIhPSIgc2hlbGwgYXNzaWdubWVudCBvcGVyYXRvciBhcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUKICAkKHNoZWxsIC4uLikgZnVuY3Rpb24uICBJbXBsZW1lbnRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIEJTRCBtYWtlZmlsZXMuCiAgTm90ZSB0aGVyZSBhcmUgc3VidGxlIGRpZmZlcmVuY2VzIGJldHdlZW4gIiE9IiBhbmQgJChzaGVsbCAuLi4pLiAgU2VlIHRoZQogIGRlc2NyaXB0aW9uIGluIHRoZSBHTlUgbWFrZSBtYW51YWwuCiAgV0FSTklORzogQmFja3dhcmQtaW5jb21wYXRpYmlsaXR5IQogIFZhcmlhYmxlcyBlbmRpbmcgaW4gIiEiIHByZXZpb3VzbHkgZGVmaW5lZCBhcyAidmFyaWFibGUhPSB2YWx1ZSIgd2lsbCBub3cgYmUKICBpbnRlcnByZXRlZCBhcyBzaGVsbCBhc3NpZ25tZW50LiAgQ2hhbmdlIHlvdXIgYXNzaWdubWVudCB0byBhZGQgd2hpdGVzcGFjZQogIGJldHdlZW4gdGhlICIhIiBhbmQgIj0iOiAidmFyaWFibGUhID0gdmFsdWUiCgoqIE5ldyBmZWF0dXJlOiAiOjo9IiBzaW1wbGUgYXNzaWdubWVudCBvcGVyYXRvciBhcyBkZWZpbmVkIGJ5IFBPU0lYIGluIDIwMTIuCiAgVGhpcyBvcGVyYXRvciBoYXMgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgdG8gIjo9IiBpbiBHTlUgbWFrZSwgYnV0IHdpbGwgYmUKICBwb3J0YWJsZSB0byBhbnkgaW1wbGVtZW50YXRpb24gb2YgbWFrZSBjb25mb3JtaW5nIHRvIGEgc3VmZmljaWVudGx5IG5ldwogIHZlcnNpb24gb2YgUE9TSVggKHNlZSBodHRwOi8vYXVzdGluZ3JvdXBidWdzLm5ldC92aWV3LnBocD9pZD0zMzApLiAgSXQgaXMKICBub3QgbmVjZXNzYXJ5IHRvIGRlZmluZSB0aGUgLlBPU0lYIHRhcmdldCB0byBhY2Nlc3MgdGhpcyBvcGVyYXRvci4KCiogTmV3IGZlYXR1cmU6IExvYWRhYmxlIG9iamVjdHMKICBUaGlzIHZlcnNpb24gb2YgR05VIG1ha2UgY29udGFpbnMgYSAidGVjaG5vbG9neSBwcmV2aWV3IjogdGhlIGFiaWxpdHkgdG8KICBsb2FkIGR5bmFtaWMgb2JqZWN0cyBpbnRvIHRoZSBtYWtlIHJ1bnRpbWUuICBUaGVzZSBvYmplY3RzIGNhbiBiZSBjcmVhdGVkIGJ5CiAgdGhlIHVzZXIgYW5kIGNhbiBhZGQgZXh0ZW5kZWQgZnVuY3Rpb25hbGl0eSwgdXNhYmxlIGJ5IG1ha2VmaWxlcy4KCiogTmV3IGZ1bmN0aW9uOiAkKGZpbGUgLi4uKSB3cml0ZXMgdG8gYSBmaWxlLgoKKiBOZXcgdmFyaWFibGU6ICQoR05VTUFLRUZMQUdTKSB3aWxsIGJlIHBhcnNlZCBmb3IgbWFrZSBmbGFncywganVzdCBsaWtlCiAgTUFLRUZMQUdTIGlzLiAgSXQgY2FuIGJlIHNldCBpbiB0aGUgZW52aXJvbm1lbnQgb3IgdGhlIG1ha2VmaWxlLCBjb250YWluaW5nCiAgR05VIG1ha2Utc3BlY2lmaWMgZmxhZ3MgdG8gYWxsb3cgeW91ciBtYWtlZmlsZSB0byBiZSBwb3J0YWJsZSB0byBvdGhlcgogIHZlcnNpb25zIG9mIG1ha2UuICBPbmNlIHRoaXMgdmFyaWFibGUgaXMgcGFyc2VkLCBHTlUgbWFrZSB3aWxsIHNldCBpdCB0byB0aGUKICBlbXB0eSBzdHJpbmcgc28gdGhhdCBmbGFncyB3aWxsIG5vdCBiZSBkdXBsaWNhdGVkIG9uIHJlY3Vyc2lvbi4KCiogTmV3IHZhcmlhYmxlOiBgTUFLRV9IT1NUJyBnaXZlcyB0aGUgbmFtZSBvZiB0aGUgaG9zdCBhcmNoaXRlY3R1cmUKICBtYWtlIHdhcyBjb21waWxlZCBmb3IuICBUaGlzIGlzIHRoZSBzYW1lIHZhbHVlIHlvdSBzZWUgYWZ0ZXIgJ0J1aWx0IGZvcicKICB3aGVuIHJ1bm5pbmcgJ21ha2UgLS12ZXJzaW9uJy4KCiogQmVoYXZpb3Igb2YgTUFLRUZMQUdTIGFuZCBNRkxBR1MgaXMgbW9yZSByaWdvcm91c2x5IGRlZmluZWQuICBBbGwgc2ltcGxlCiAgZmxhZ3MgYXJlIGdyb3VwZWQgdG9nZXRoZXIgaW4gdGhlIGZpcnN0IHdvcmQgb2YgTUFLRUZMQUdTLiAgTm8gb3B0aW9ucyB0aGF0CiAgYWNjZXB0IGFyZ3VtZW50cyBhcHBlYXIgaW4gdGhlIGZpcnN0IHdvcmQuICBJZiBubyBzaW1wbGUgZmxhZ3MgYXJlIHByZXNlbnQKICBNQUtFRkxBR1MgYmVnaW5zIHdpdGggYSBzcGFjZS4gIEZsYWdzIHdpdGggYm90aCBzaG9ydCBhbmQgbG9uZyB2ZXJzaW9ucwogIGFsd2F5cyB1c2UgdGhlIHNob3J0IHZlcnNpb25zIGluIE1BS0VGTEFHUy4gIEZsYWdzIGFyZSBsaXN0ZWQgaW4KICBhbHBoYWJldGljYWwgb3JkZXIgdXNpbmcgQVNDSUkgb3JkZXJpbmcuICBNRkxBR1MgbmV2ZXIgYmVnaW5zIHdpdGggIi0gIi4KCiogU2V0dGluZyB0aGUgLXIgYW5kIC1SIG9wdGlvbnMgaW4gTUFLRUZMQUdTIGluc2lkZSBhIG1ha2VmaWxlIG5vdyB3b3JrcyBhcwogIGV4cGVjdGVkLCByZW1vdmluZyBhbGwgYnVpbHQtaW4gcnVsZXMgYW5kIHZhcmlhYmxlcywgcmVzcGVjdGl2ZWx5LgoKKiBJZiBhIHJlY2lwZSBmYWlscywgdGhlIG1ha2VmaWxlIG5hbWUgYW5kIGxpbmVudW1iZXIgb2YgdGhlIHJlY2lwZSBhcmUgc2hvd24uCgoqIEEgLlJFQ0lQRVBSRUZJWCBzZXR0aW5nIGlzIHJlbWVtYmVyZWQgcGVyLXJlY2lwZSBhbmQgdmFyaWFibGVzIGV4cGFuZGVkCiAgaW4gdGhhdCByZWNpcGUgYWxzbyB1c2UgdGhhdCByZWNpcGUgcHJlZml4IHNldHRpbmcuCgoqIEluIC1wIG91dHB1dCwgLlJFQ0lQRVBSRUZJWCBzZXR0aW5ncyBhcmUgc2hvd24gYW5kIGFsbCB0YXJnZXQtc3BlY2lmaWMKICB2YXJpYWJsZXMgYXJlIG91dHB1dCBhcyBpZiBpbiBhIG1ha2VmaWxlLCBpbnN0ZWFkIG9mIGFzIGNvbW1lbnRzLgoKKiBPbiBNUy1XaW5kb3dzLCByZWNpcGVzIHRoYXQgdXNlICIuLiIgcXVvdGluZyB3aWxsIG5vIGxvbmdlciBmb3JjZQogIGludm9jYXRpb24gb2YgY29tbWFuZHMgdmlhIHRlbXBvcmFyeSBiYXRjaCBmaWxlcyBhbmQgc3RvY2sgV2luZG93cwogIHNoZWxscywgdGhleSB3aWxsIGJlIHNob3J0LWNpcmN1aXRlZCBhbmQgaW52b2tlZCBkaXJlY3RseS4gIChJbgogIG90aGVyIHdvcmRzLCAiIGlzIG5vIGxvbmdlciBhIHNwZWNpYWwgY2hhcmFjdGVyIGZvciBzdG9jayBXaW5kb3dzCiAgc2hlbGxzLikgIFRoaXMgYXZvaWRzIGhpdHRpbmcgc2hlbGwgbGltaXRzIGZvciBjb21tYW5kIGxlbmd0aCB3aGVuCiAgcXVvdGVzIGFyZSB1c2VkLCBidXQgbm90aGluZyBlbHNlIGluIHRoZSBjb21tYW5kIHJlcXVpcmVzIHRoZSBzaGVsbC4KICBUaGlzIGNoYW5nZSBjb3VsZCBwb3RlbnRpYWxseSBtZWFuIHNvbWUgbWlub3IgaW5jb21wYXRpYmlsaXRpZXMgaW4KICBiZWhhdmlvciB3aGVuIHRoZSByZWNpcGUgdXNlcyBxdW90ZWQgc3RyaW5nIG9uIHNoZWxsIGNvbW1hbmQgbGluZXMuCgoMClZlcnNpb24gMy44MiAoMjggSnVsIDIwMTApCgpBIGNvbXBsZXRlIGxpc3Qgb2YgYnVncyBmaXhlZCBpbiB0aGlzIHZlcnNpb24gaXMgYXZhaWxhYmxlIGhlcmU6CgpodHRwczovL3N2LmdudS5vcmcvYnVncy9pbmRleC5waHA/Z3JvdXA9bWFrZSZyZXBvcnRfaWQ9MTExJmZpeF9yZWxlYXNlX2lkPTEwNCZzZXQ9Y3VzdG9tCgoqIENvbXBpbGluZyBHTlUgbWFrZSBub3cgcmVxdWlyZXMgYSBjb25mb3JtaW5nIElTTyBDIDE5ODkgY29tcGlsZXIgYW5kCiAgc3RhbmRhcmQgcnVudGltZSBsaWJyYXJ5LgoKKiBXQVJOSU5HOiBCYWNrd2FyZC1pbmNvbXBhdGliaWxpdHkhCiAgVGhlIFBPU0lYIHN0YW5kYXJkIGZvciBtYWtlIHdhcyBjaGFuZ2VkIGluIHRoZSAyMDA4IHZlcnNpb24gaW4gYQogIGZ1bmRhbWVudGFsbHkgaW5jb21wYXRpYmxlIHdheTogbWFrZSBpcyByZXF1aXJlZCB0byBpbnZva2UgdGhlIHNoZWxsIGFzIGlmCiAgdGhlICctZScgZmxhZyB3ZXJlIHByb3ZpZGVkLiAgQmVjYXVzZSB0aGlzIHdvdWxkIGJyZWFrIG1hbnkgbWFrZWZpbGVzIHRoYXQKICBoYXZlIGJlZW4gd3JpdHRlbiB0byBjb25mb3JtIHRvIHRoZSBvcmlnaW5hbCB0ZXh0IG9mIHRoZSBzdGFuZGFyZCwgdGhlCiAgZGVmYXVsdCBiZWhhdmlvciBvZiBHTlUgbWFrZSByZW1haW5zIHRvIGludm9rZSB0aGUgc2hlbGwgd2l0aCBzaW1wbHkgJy1jJy4KICBIb3dldmVyLCBhbnkgbWFrZWZpbGUgc3BlY2lmeWluZyB0aGUgLlBPU0lYIHNwZWNpYWwgdGFyZ2V0IHdpbGwgZm9sbG93IHRoZQogIG5ldyBQT1NJWCBzdGFuZGFyZCBhbmQgcGFzcyAnLWUnIHRvIHRoZSBzaGVsbC4gIFNlZSBhbHNvIC5TSEVMTEZMQUdTCiAgYmVsb3cuCgoqIFdBUk5JTkc6IEJhY2t3YXJkLWluY29tcGF0aWJpbGl0eSEKICBUaGUgJyQ/JyB2YXJpYWJsZSBub3cgY29udGFpbnMgYWxsIHByZXJlcXVpc2l0ZXMgdGhhdCBjYXVzZWQgdGhlIHRhcmdldCB0bwogIGJlIGNvbnNpZGVyZWQgb3V0IG9mIGRhdGUsIGV2ZW4gaWYgdGhleSBkbyBub3QgZXhpc3QgKHByZXZpb3VzbHkgb25seQogIGV4aXN0aW5nIHRhcmdldHMgd2VyZSBwcm92aWRlZCBpbiAkPykuCgoqIFdBUk5JTkc6IEJhY2t3YXJkLWluY29tcGF0aWJpbGl0eSEKICBXaWxkY2FyZHMgd2VyZSBub3QgZG9jdW1lbnRlZCBhcyByZXR1cm5pbmcgc29ydGVkIHZhbHVlcywgYnV0IHRoZSByZXN1bHRzCiAgaGF2ZSBiZWVuIHNvcnRlZCB1cCB1bnRpbCB0aGlzIHJlbGVhc2UuLiAgSWYgeW91ciBtYWtlZmlsZXMgcmVxdWlyZSBzb3J0ZWQKICByZXN1bHRzIGZyb20gd2lsZGNhcmQgZXhwYW5zaW9ucywgdXNlIHRoZSAkKHNvcnQgLi4uKSAgZnVuY3Rpb24gdG8gcmVxdWVzdAogIGl0IGV4cGxpY2l0bHkuCgoqIFdBUk5JTkc6IEJhY2t3YXJkLWluY29tcGF0aWJpbGl0eSEKICBBcyBhIHJlc3VsdCBvZiBwYXJzZXIgZW5oYW5jZW1lbnRzLCB0aHJlZSBiYWNrd2FyZC1jb21wYXRpYmlsaXR5IGlzc3VlcwogIGV4aXN0OiBmaXJzdCwgYSBwcmVyZXF1aXNpdGUgY29udGFpbmluZyBhbiAiPSIgY2Fubm90IGJlIGVzY2FwZWQgd2l0aCBhCiAgYmFja3NsYXNoIGFueSBsb25nZXIuICBZb3UgbXVzdCBjcmVhdGUgYSB2YXJpYWJsZSBjb250YWluaW5nIGFuICI9IiBhbmQKICB1c2UgdGhhdCB2YXJpYWJsZSBpbiB0aGUgcHJlcmVxdWlzaXRlLiAgU2Vjb25kLCB2YXJpYWJsZSBuYW1lcyBjYW4gbm8KICBsb25nZXIgY29udGFpbiB3aGl0ZXNwYWNlLCB1bmxlc3MgeW91IHB1dCB0aGUgd2hpdGVzcGFjZSBpbiBhIHZhcmlhYmxlIGFuZAogIHVzZSB0aGUgdmFyaWFibGUuICBUaGlyZCwgaW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgbWFrZSBpdCB3YXMgc29tZXRpbWVzCiAgbm90IGZsYWdnZWQgYXMgYW4gZXJyb3IgZm9yIGV4cGxpY2l0IGFuZCBwYXR0ZXJuIHRhcmdldHMgdG8gYXBwZWFyIGluIHRoZQogIHNhbWUgcnVsZS4gIE5vdyB0aGlzIGlzIGFsd2F5cyByZXBvcnRlZCBhcyBhbiBlcnJvci4KCiogV0FSTklORzogQmFja3dhcmQtaW5jb21wYXRpYmlsaXR5IQogIFRoZSBwYXR0ZXJuLXNwZWNpZmljIHZhcmlhYmxlcyBhbmQgcGF0dGVybiBydWxlcyBhcmUgbm93IGFwcGxpZWQgaW4gdGhlCiAgc2hvcnRlc3Qgc3RlbSBmaXJzdCBvcmRlciBpbnN0ZWFkIG9mIHRoZSBkZWZpbml0aW9uIG9yZGVyICh2YXJpYWJsZXMKICBhbmQgcnVsZXMgd2l0aCB0aGUgc2FtZSBzdGVtIGxlbmd0aCBhcmUgc3RpbGwgYXBwbGllZCBpbiB0aGUgZGVmaW5pdGlvbgogIG9yZGVyKS4gVGhpcyBwcm9kdWNlcyB0aGUgdXN1YWxseS1kZXNpcmVkIGJlaGF2aW9yIHdoZXJlIG1vcmUgc3BlY2lmaWMKICBwYXR0ZXJucyBhcmUgcHJlZmVycmVkLiBUbyBkZXRlY3QgdGhpcyBmZWF0dXJlIHNlYXJjaCBmb3IgJ3Nob3J0ZXN0LXN0ZW0nCiAgaW4gdGhlIC5GRUFUVVJFUyBzcGVjaWFsIHZhcmlhYmxlLgoKKiBXQVJOSU5HOiBCYWNrd2FyZC1pbmNvbXBhdGliaWxpdHkhCiAgVGhlIGxpYnJhcnkgc2VhcmNoIGJlaGF2aW9yIGhhcyBjaGFuZ2VkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgc3RhbmRhcmQKICBsaW5rZXIgYmVoYXZpb3IuIFByaW9yIHRvIHRoaXMgdmVyc2lvbiBmb3IgcHJlcmVxdWlzaXRlcyBzcGVjaWZpZWQgdXNpbmcKICB0aGUgLWxmb28gc3ludGF4IG1ha2UgZmlyc3Qgc2VhcmNoZWQgZm9yIGxpYmZvby5zbyBpbiB0aGUgY3VycmVudAogIGRpcmVjdG9yeSwgdnBhdGggZGlyZWN0b3JpZXMsIGFuZCBzeXN0ZW0gZGlyZWN0b3JpZXMuIElmIHRoYXQgZGlkbid0IHlpZWxkCiAgYSBtYXRjaCwgbWFrZSB0aGVuIHNlYXJjaGVkIGZvciBsaWJmb28uYSBpbiB0aGVzZSBkaXJlY3Rvcmllcy4gU3RhcnRpbmcKICB3aXRoIHRoaXMgdmVyc2lvbiBtYWtlIHNlYXJjaGVzIGZpcnN0IGZvciBsaWJmb28uc28gYW5kIHRoZW4gZm9yIGxpYmZvby5hCiAgaW4gZWFjaCBvZiB0aGVzZSBkaXJlY3RvcmllcyBpbiBvcmRlci4KCiogTmV3IGNvbW1hbmQgbGluZSBvcHRpb246IC0tZXZhbD1TVFJJTkcgY2F1c2VzIFNUUklORyB0byBiZSBldmFsdWF0ZWQgYXMKICBtYWtlZmlsZSBzeW50YXggKGFraW4gdG8gdXNpbmcgdGhlICQoZXZhbCAuLi4pIGZ1bmN0aW9uKS4gIFRoZSBldmFsdWF0aW9uCiAgaXMgcGVyZm9ybWVkIGFmdGVyIGFsbCBkZWZhdWx0IHJ1bGVzIGFuZCB2YXJpYWJsZXMgYXJlIGRlZmluZWQsIGJ1dCBiZWZvcmUKICBhbnkgbWFrZWZpbGVzIGFyZSByZWFkLgoKKiBOZXcgc3BlY2lhbCB2YXJpYWJsZTogLlJFQ0lQRVBSRUZJWCBhbGxvd3MgeW91IHRvIHJlc2V0IHRoZSByZWNpcGUKICBpbnRyb2R1Y3Rpb24gY2hhcmFjdGVyIGZyb20gdGhlIGRlZmF1bHQgKFRBQikgdG8gc29tZXRoaW5nIGVsc2UuICBUaGUKICBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhpcyB2YXJpYWJsZSB2YWx1ZSBpcyB0aGUgbmV3IHJlY2lwZSBpbnRyb2R1Y3Rpb24KICBjaGFyYWN0ZXIuICBJZiB0aGUgdmFyaWFibGUgaXMgc2V0IHRvIHRoZSBlbXB0eSBzdHJpbmcsIFRBQiBpcyB1c2VkIGFnYWluLgogIEl0IGNhbiBiZSBzZXQgYW5kIHJlc2V0IGF0IHdpbGw7IHJlY2lwZXMgd2lsbCB1c2UgdGhlIHZhbHVlIGFjdGl2ZSB3aGVuCiAgdGhleSB3ZXJlIGZpcnN0IHBhcnNlZC4gIFRvIGRldGVjdCB0aGlzIGZlYXR1cmUgY2hlY2sgdGhlIHZhbHVlIG9mCiAgJCguUkVDSVBFUFJFRklYKS4KCiogTmV3IHNwZWNpYWwgdmFyaWFibGU6IC5TSEVMTEZMQUdTIGFsbG93cyB5b3UgdG8gY2hhbmdlIHRoZSBvcHRpb25zIHBhc3NlZAogIHRvIHRoZSBzaGVsbCB3aGVuIGl0IGludm9rZXMgcmVjaXBlcy4gIEJ5IGRlZmF1bHQgdGhlIHZhbHVlIHdpbGwgYmUgIi1jIgogIChvciAiLWVjIiBpZiAuUE9TSVggaXMgc2V0KS4KCiogTmV3IHNwZWNpYWwgdGFyZ2V0OiAuT05FU0hFTEwgaW5zdHJ1Y3RzIG1ha2UgdG8gaW52b2tlIGEgc2luZ2xlIGluc3RhbmNlCiAgb2YgdGhlIHNoZWxsIGFuZCBwcm92aWRlIGl0IHdpdGggdGhlIGVudGlyZSByZWNpcGUsIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkKICBsaW5lcyBpdCBjb250YWlucy4gIEFzIGEgc3BlY2lhbCBmZWF0dXJlIHRvIGFsbG93IG1vcmUgc3RyYWlnaHRmb3J3YXJkCiAgY29udmVyc2lvbiBvZiBtYWtlZmlsZXMgdG8gdXNlIC5PTkVTSEVMTCwgYW55IHJlY2lwZSBsaW5lIGNvbnRyb2wKICBjaGFyYWN0ZXJzICgnQCcsICcrJywgb3IgJy0nKSB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgc2Vjb25kIGFuZAogIHN1YnNlcXVlbnQgcmVjaXBlIGxpbmVzLiAgVGhpcyBoYXBwZW5zIF9vbmx5XyBpZiB0aGUgU0hFTEwgdmFsdWUgaXMgZGVlbWVkCiAgdG8gYmUgYSBzdGFuZGFyZCBQT1NJWC1zdHlsZSBzaGVsbC4gIElmIG5vdCwgdGhlbiBubyBpbnRlcmlvciBsaW5lIGNvbnRyb2wKICBjaGFyYWN0ZXJzIGFyZSByZW1vdmVkIChhcyB0aGV5IG1heSBiZSBwYXJ0IG9mIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgdXNlZAogIHdpdGggdGhlIGFsdGVybmF0ZSBTSEVMTCkuCgoqIE5ldyB2YXJpYWJsZSBtb2RpZmllciAncHJpdmF0ZSc6IHByZWZpeGluZyBhIHZhcmlhYmxlIGFzc2lnbm1lbnQgd2l0aCB0aGUKICBtb2RpZmllciAncHJpdmF0ZScgc3VwcHJlc3NlcyBpbmhlcml0YW5jZSBvZiB0aGF0IHZhcmlhYmxlIGJ5CiAgcHJlcmVxdWlzaXRlcy4gIFRoaXMgaXMgbW9zdCB1c2VmdWwgZm9yIHRhcmdldC0gYW5kIHBhdHRlcm4tc3BlY2lmaWMKICB2YXJpYWJsZXMuCgoqIE5ldyBtYWtlIGRpcmVjdGl2ZTogJ3VuZGVmaW5lJyBhbGxvd3MgeW91IHRvIHVuZGVmaW5lIGEgdmFyaWFibGUgc28gdGhhdAogIGl0IGFwcGVhcnMgYXMgaWYgaXQgd2FzIG5ldmVyIHNldC4gQm90aCAkKGZsYXZvcikgYW5kICQob3JpZ2luKSBmdW5jdGlvbnMKICB3aWxsIHJldHVybiAndW5kZWZpbmVkJyBmb3Igc3VjaCBhIHZhcmlhYmxlLiBUbyBkZXRlY3QgdGhpcyBmZWF0dXJlIHNlYXJjaAogIGZvciAndW5kZWZpbmUnIGluIHRoZSAuRkVBVFVSRVMgc3BlY2lhbCB2YXJpYWJsZS4KCiogVGhlIHBhcnNlciBmb3IgdmFyaWFibGUgYXNzaWdubWVudHMgaGFzIGJlZW4gZW5oYW5jZWQgdG8gYWxsb3cgbXVsdGlwbGUKICBtb2RpZmllcnMgKCdleHBvcnQnLCAnb3ZlcnJpZGUnLCAncHJpdmF0ZScpIG9uIHRoZSBzYW1lIGxpbmUgYXMgdmFyaWFibGVzLAogIGluY2x1ZGluZyBkZWZpbmUvZW5kZWYgdmFyaWFibGVzLCBhbmQgaW4gYW55IG9yZGVyLiAgQWxzbywgaXQgaXMgcG9zc2libGUKICB0byBjcmVhdGUgdmFyaWFibGVzIGFuZCB0YXJnZXRzIG5hbWVkIGFzIHRoZXNlIG1vZGlmaWVycy4KCiogVGhlICdkZWZpbmUnIG1ha2UgZGlyZWN0aXZlIG5vdyBhbGxvd3MgYSB2YXJpYWJsZSBhc3NpZ25tZW50IG9wZXJhdG9yCiAgYWZ0ZXIgdGhlIHZhcmlhYmxlIG5hbWUsIHRvIGFsbG93IGZvciBzaW1wbGUsIGNvbmRpdGlvbmFsLCBvciBhcHBlbmRpbmcKICBtdWx0aS1saW5lIHZhcmlhYmxlIGFzc2lnbm1lbnQuCgoqIFZNUy1zcGVjaWZpYyBjaGFuZ2VzOgoKICAqIE1pY2hhZWwgR2VocmUgKGF0IFZJU1RFQy1TRU1JIGRvdCBDT00pIHN1cHBsaWVkIGEgZml4IGZvciBhIHByb2JsZW0gd2l0aAogICAgdGltZXN0YW1wcyBvZiBvYmplY3QgbW9kdWxlcyBpbiBPTEJzLiBUaGUgdGltZXN0YW1wcyB3ZXJlIG5vdCBjb3JyZWN0bHkKICAgIGFkanVzdGVkIHRvIEdNVCBiYXNlZCB0aW1lLCBpZiB0aGUgbG9jYWwgVk1TIHRpbWUgd2FzIHVzaW5nIGEgZGF5bGlnaHQKICAgIHNhdmluZyBhbGdvcml0aG0gYW5kIGlmIGRheWxpZ2h0IHNhdmluZyB3YXMgc3dpdGNoZWQgb2ZmLgoKICAqIEpvaG4gRWlzZW5icmF1biAoYXQgSFAgZG90IENPTSkgc3VwcGxpZWQgZml4ZXMgYW5kIGFuZCBhbiBlbmhhbmNlbWVudCB0bwogICAgYXBwZW5kIG91dHB1dCByZWRpcmVjdGlvbiBpbiBhY3Rpb24gbGluZXMuCgogICogUmV3b3JrIG9mIGN0cmwrYyBhbmQgY3RybCt5IGhhbmRsaW5nLgoKICAqIEZpeCBhIHByb2JsZW0gd2l0aCBjYWNoZWQgc3RyaW5ncywgd2hpY2ggc2hvd2VkIG9uIGNhc2UtaW5zZW5zaXRpdmUgZmlsZQogICAgc3lzdGVtcy4KCiAgKiBCdWlsZCBmaXhlcyBmb3IgY29uc3QtaWZpZWQgY29kZSBpbiBWTVMgc3BlY2lmaWMgc291cmNlcy4KCiAgKiBBIG5vdGUgb24gYXBwZW5kaW5nIHRoZSByZWRpcmVjdGVkIG91dHB1dC4gV2l0aCB0aGlzIGNoYW5nZSwgYSBzaW1wbGUKICAgIG1lY2hhbmlzbSBpcyBpbXBsZW1lbnRlZCB0byBtYWtlICI+PiIgd29yayBpbiBhY3Rpb24gbGluZXMuIEluIFZNUwogICAgdGhlcmUgaXMgbm8gc2ltcGxlIGZlYXR1cmUgbGlrZSAiPj4iIHRvIGhhdmUgRENMIGNvbW1hbmQgb3IgcHJvZ3JhbQogICAgb3V0cHV0IHJlZGlyZWN0ZWQgYW5kIGFwcGVuZGVkIHRvIGEgZmlsZS4gR05VIG1ha2UgZm9yIFZNUyBhbHJlYWR5CiAgICBpbXBsZW1lbnRzIHRoZSByZWRpcmVjdGlvbiBvZiBvdXRwdXQuIElmIHN1Y2ggYSByZWRpcmVjdGlvbiBpcyBkZXRlY3RlZCwKICAgIGFuICI+IiBvbiB0aGUgYWN0aW9uIGxpbmUsIEdOVSBtYWtlIGNyZWF0ZXMgYSBEQ0wgY29tbWFuZCBwcm9jZWR1cmUgdG8KICAgIGV4ZWN1dGUgdGhlIGFjdGlvbiBhbmQgdG8gcmVkaXJlY3QgaXRzIG91dHB1dC4gQmFzZWQgb24gdGhhdCwgbm93ICI+PiIKICAgIGlzIGFsc28gcmVjb2duaXplZCBhbmQgYSBzaW1pbGFyIGJ1dCBkaWZmZXJlbnQgY29tbWFuZCBwcm9jZWR1cmUgaXMKICAgIGNyZWF0ZWQgdG8gaW1wbGVtZW50IHRoZSBhcHBlbmQuIFRoZSBtYWluIGlkZWEgaGVyZSBpcyB0byBjcmVhdGUgYQogICAgdGVtcG9yYXJ5IGZpbGUgd2hpY2ggY29sbGVjdHMgdGhlIG91dHB1dCBhbmQgd2hpY2ggaXMgYXBwZW5kZWQgdG8gdGhlCiAgICB3YW50ZWQgb3V0cHV0IGZpbGUuIFRoZW4gdGhlIHRlbXBvcmFyeSBmaWxlIGlzIGRlbGV0ZWQuIFRoaXMgaXMgYWxsIGRvbmUKICAgIGluIHRoZSBjb21tYW5kIHByb2NlZHVyZSB0byBrZWVwIGNoYW5nZXMgaW4gbWFrZSBzbWFsbCBhbmQgc2ltcGxlLiBUaGlzCiAgICBvYnZpb3VzbHkgaGFzIHNvbWUgbGltaXRhdGlvbnMgYnV0IGl0IHNlZW1zIGdvb2QgZW5vdWdoIGNvbXBhcmVkIHdpdGgKICAgIHRoZSBjdXJyZW50ICI+IiBpbXBsZW1lbnRhdGlvbi4gKEFuZCBpbiBteSBvcGluaW9uLCByZWRpcmVjdGlvbiBpcyBub3QKICAgIHJlYWxseSB3aGF0IEdOVSBtYWtlIGhhcyB0byBkby4pIFdpdGggdGhpcyBhcHByb2FjaCwgaXQgbWF5IGhhcHBlbiB0aGF0CiAgICB0aGUgdGVtcG9yYXJ5IGZpbGUgaXMgbm90IHlldCBhcHBlbmRlZCBhbmQgaXMgbGVmdCBpbiBTWVMkU0NSQVRDSC4KICAgIFRoZSB0ZW1wb3JhcnkgZmlsZSBuYW1lcyBsb29rIGxpa2UgIkNNRHh4eHh4LiIuIEFueSB0aW1lIHRoZSBjcmVhdGVkCiAgICBjb21tYW5kIHByb2NlZHVyZSBjYW4gbm90IGNvbXBsZXRlLCB0aGlzIGhhcHBlbnMuIFByZXNzaW5nIEN0cmwrWSB0bwogICAgYWJvcnQgbWFrZSBpcyBvbmUgY2FzZS4gSW4gY2FzZSBvZiBDdHJsK1kgdGhlIGFzc29jaWF0ZWQgY29tbWFuZAogICAgcHJvY2VkdXJlIGlzIGxlZnQgaW4gU1lTJFNDUkFUQ0ggYXMgd2VsbC4gSXRzIG5hbWUgaXMgQ01EeHh4eHguQ09NLgoKICAqIENoYW5nZSBpbiB0aGUgQ3RybCtZIGhhbmRsaW5nLiBUaGUgQ3RybFkgaGFuZGxlciBub3cgdXNlcyAkZGVscHJjIHRvCiAgICBkZWxldGUgYWxsIGNoaWxkcmVuLiBUaGlzIHdheSBhbHNvIGFjdGlvbnMgd2l0aCBEQ0wgY29tbWFuZHMgd2lsbCBiZQogICAgc3RvcHBlZC4gQXMgYmVmb3JlIHRoZSBDdHJsWSBoYW5kbGVyIHRoZW4gc2VuZHMgU0lHUVVJVCB0byBpdHNlbGYsCiAgICB3aGljaCBpcyBoYW5kbGVkIGluIGNvbW1vbiBjb2RlLgoKICAqIENoYW5nZSBpbiBkZWxldGVpbmcgdGVtcG9yYXJ5IGNvbW1hbmQgZmlsZXMuIFRlbXBvcmFyeSBjb21tYW5kIGZpbGVzCiAgICBhcmUgbm93IGRlbGV0ZWQgaW4gdGhlIHZtcyBjaGlsZCB0ZXJtaW5hdGlvbiBoYW5kbGVyLiBUaGF0IGRlbGV0ZXMKICAgIHRoZW0gZXZlbiBpZiBhIEN0cmwrQyB3YXMgcHJlc3NlZC4KCiAgKiBUaGUgYmVoYXZpb3Igb2YgcHJlc3NpbmcgQ3RybCtDIGlzIG5vdCBjaGFuZ2VkLiBJdCBzdGlsbCBoYXMgb25seSBhbgogICAgZWZmZWN0LCBhZnRlciB0aGUgY3VycmVudCBhY3Rpb24gaXMgdGVybWluYXRlZC4gSWYgdGhhdCBkb2Vzbid0IGhhcHBlbgogICAgb3IgdGFrZXMgdG9vIGxvbmcsIEN0cmwrWSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgoKDApWZXJzaW9uIDMuODEgKDAxIEFwciAyMDA2KQoKKiBHTlUgbWFrZSBpcyBwb3J0ZWQgdG8gT1MvMi4KCiogR05VIG1ha2UgaXMgcG9ydGVkIHRvIE1pbkdXLiAgVGhlIE1pbkdXIGJ1aWxkIGlzIG9ubHkgc3VwcG9ydGVkIGJ5CiAgdGhlIGJ1aWxkX3czMi5iYXQgYmF0Y2ggZmlsZTsgc2VlIHRoZSBmaWxlIFJFQURNRS5XMzIgZm9yIG1vcmUKICBkZXRhaWxzLgoKKiBXQVJOSU5HOiBGdXR1cmUgYmFja3dhcmQtaW5jb21wYXRpYmlsaXR5IQogIFVwIHRvIGFuZCBpbmNsdWRpbmcgdGhpcyByZWxlYXNlLCB0aGUgJyQ/JyB2YXJpYWJsZSBkb2VzIG5vdCBjb250YWluCiAgYW55IHByZXJlcXVpc2l0ZSB0aGF0IGRvZXMgbm90IGV4aXN0LCBldmVuIHRob3VnaCB0aGF0IHByZXJlcXVpc2l0ZQogIG1pZ2h0IGhhdmUgY2F1c2VkIHRoZSB0YXJnZXQgdG8gcmVidWlsZC4gIFN0YXJ0aW5nIHdpdGggdGhlIF9uZXh0XwogIHJlbGVhc2Ugb2YgR05VIG1ha2UsICckPycgd2lsbCBjb250YWluIGFsbCBwcmVyZXF1aXNpdGVzIHRoYXQgY2F1c2VkCiAgdGhlIHRhcmdldCB0byBiZSBjb25zaWRlcmVkIG91dCBvZiBkYXRlLgogIFNlZSBodHRwczovL3NhdmFubmFoLmdudS5vcmcvYnVncy8/MTYwNTEKCiogV0FSTklORzogQmFja3dhcmQtaW5jb21wYXRpYmlsaXR5IQogIEdOVSBtYWtlIG5vdyBpbXBsZW1lbnRzIGEgZ2VuZXJpYyAic2Vjb25kIGV4cGFuc2lvbiIgZmVhdHVyZSBvbiB0aGUKICBwcmVyZXF1aXNpdGVzIG9mIGJvdGggZXhwbGljaXQgYW5kIGltcGxpY2l0IChwYXR0ZXJuKSBydWxlcy4gIEluIG9yZGVyCiAgdG8gZW5hYmxlIHRoaXMgZmVhdHVyZSwgdGhlIHNwZWNpYWwgdGFyZ2V0ICcuU0VDT05ERVhQQU5TSU9OJyBtdXN0IGJlCiAgZGVmaW5lZCBiZWZvcmUgdGhlIGZpcnN0IHRhcmdldCB3aGljaCB0YWtlcyBhZHZhbnRhZ2Ugb2YgaXQuICBJZiB0aGlzCiAgZmVhdHVyZSBpcyBlbmFibGVkIHRoZW4gYWZ0ZXIgYWxsIHJ1bGVzIGhhdmUgYmVlbiBwYXJzZWQgdGhlCiAgcHJlcmVxdWlzaXRlcyBhcmUgZXhwYW5kZWQgYWdhaW4sIHRoaXMgdGltZSB3aXRoIGFsbCB0aGUgYXV0b21hdGljCiAgdmFyaWFibGVzIGluIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IGluIGFkZGl0aW9uIHRvIHVzaW5nIHN0YW5kYXJkCiAgU3lzViAkJEAgaW4gcHJlcmVxdWlzaXRlcyBsaXN0cywgeW91IGNhbiBhbHNvIHVzZSBjb21wbGV4IGZ1bmN0aW9ucwogIHN1Y2ggYXMgJCQobm90ZGlyICQkQCkgZXRjLiAgVGhpcyBiZWhhdmlvciBhcHBsaWVzIHRvIGltcGxpY2l0IHJ1bGVzLAogIGFzIHdlbGwsIHdoZXJlIHRoZSBzZWNvbmQgZXhwYW5zaW9uIG9jY3VycyB3aGVuIHRoZSBydWxlIGlzIG1hdGNoZWQuCiAgSG93ZXZlciwgdGhpcyBtZWFucyB0aGF0IHdoZW4gJy5TRUNPTkRFWFBBTlNJT04nIGlzIGVuYWJsZWQgeW91IG11c3QKICBkb3VibGUtcXVvdGUgYW55ICIkIiBpbiB5b3VyIGZpbGVuYW1lczsgaW5zdGVhZCBvZiAiZm9vOiBib28kJGJhciIgeW91CiAgbm93IG11c3Qgd3JpdGUgImZvbzogZm9vJCQkJGJhciIuICBOb3RlIHRoYXQgdGhlIFN5c1YgJCRAIGV0Yy4gZmVhdHVyZSwKICB3aGljaCB1c2VkIHRvIGJlIGF2YWlsYWJsZSBieSBkZWZhdWx0LCBpcyBub3cgT05MWSBhdmFpbGFibGUgd2hlbiB0aGUKICAuU0VDT05ERVhQQU5TSU9OIHRhcmdldCBpcyBkZWZpbmVkLiAgSWYgeW91ciBtYWtlZmlsZXMgdGFrZSBhZHZhbnRhZ2UKICBvZiB0aGlzIFN5c1YgZmVhdHVyZSB5b3Ugd2lsbCBuZWVkIHRvIHVwZGF0ZSB0aGVtLgoKKiBXQVJOSU5HOiBCYWNrd2FyZC1pbmNvbXBhdGliaWxpdHkhCiAgSW4gb3JkZXIgdG8gY29tcGx5IHdpdGggUE9TSVgsIHRoZSB3YXkgaW4gd2hpY2ggR05VIG1ha2UgcHJvY2Vzc2VzCiAgYmFja3NsYXNoLW5ld2xpbmUgc2VxdWVuY2VzIGluIHJlY2lwZXMgaGFzIGNoYW5nZWQuICBJZiB5b3VyIG1ha2VmaWxlcwogIHVzZSBiYWNrc2xhc2gtbmV3bGluZSBzZXF1ZW5jZXMgaW5zaWRlIG9mIHNpbmdsZS1xdW90ZWQgc3RyaW5ncyBpbgogIHJlY2lwZXMgeW91IHdpbGwgYmUgaW1wYWN0ZWQgYnkgdGhpcyBjaGFuZ2UuICBTZWUgdGhlIEdOVSBtYWtlIG1hbnVhbAogIHN1YnNlY3Rpb24gIlNwbGl0dGluZyBSZWNpcGUgTGluZXMiIChub2RlICJTcGxpdHRpbmcgTGluZXMiKSwgaW4KICBzZWN0aW9uICJSZWNpcGUgU3ludGF4IiwgY2hhcHRlciAiV3JpdGluZyBSZWNpcGUgaW4gUnVsZXMiLCBmb3IKICBkZXRhaWxzLgoKKiBXQVJOSU5HOiBCYWNrd2FyZC1pbmNvbXBhdGliaWxpdHkhCiAgU29tZSBwcmV2aW91cyB2ZXJzaW9ucyBvZiBHTlUgbWFrZSBoYWQgYSBidWcgd2hlcmUgIiMiIGluIGEgZnVuY3Rpb24KICBpbnZvY2F0aW9uIHN1Y2ggYXMgJChzaGVsbCAuLi4pIHdhcyB0cmVhdGVkIGFzIGEgbWFrZSBjb21tZW50LiAgQQogIHdvcmthcm91bmQgd2FzIHRvIGVzY2FwZSB0aGVzZSB3aXRoIGJhY2tzbGFzaGVzLiAgVGhpcyBidWcgaGFzIGJlZW4KICBmaXhlZDogaWYgeW91ciBtYWtlZmlsZSB1c2VzICJcIyIgaW4gYSBmdW5jdGlvbiBpbnZvY2F0aW9uIHRoZQogIGJhY2tzbGFzaCBpcyBub3cgcHJlc2VydmVkLCBzbyB5b3UnbGwgbmVlZCB0byByZW1vdmUgaXQuCgoqIE5ldyBjb21tYW5kIGxpbmUgb3B0aW9uOiAtTCAoLS1jaGVjay1zeW1saW5rLXRpbWVzKS4gIE9uIHN5c3RlbXMgdGhhdAogIHN1cHBvcnQgc3ltYm9saWMgbGlua3MsIGlmIHRoaXMgb3B0aW9uIGlzIGdpdmVuIHRoZW4gR05VIG1ha2Ugd2lsbAogIHVzZSB0aGUgbW9zdCByZWNlbnQgbW9kaWZpY2F0aW9uIHRpbWUgb2YgYW55IHN5bWJvbGljIGxpbmtzIHRoYXQgYXJlCiAgdXNlZCB0byByZXNvbHZlIHRhcmdldCBmaWxlcy4gIFRoZSBkZWZhdWx0IGJlaGF2aW9yIHJlbWFpbnMgYXMgaXQKICBhbHdheXMgaGFzOiB1c2UgdGhlIG1vZGlmaWNhdGlvbiB0aW1lIG9mIHRoZSBhY3R1YWwgdGFyZ2V0IGZpbGUgb25seS4KCiogVGhlICJlbHNlIiBjb25kaXRpb25hbCBsaW5lIGNhbiBub3cgYmUgZm9sbG93ZWQgYnkgYW55IG90aGVyIHZhbGlkCiAgY29uZGl0aW9uYWwgb24gdGhlIHNhbWUgbGluZTogdGhpcyBkb2VzIG5vdCBpbmNyZWFzZSB0aGUgZGVwdGggb2YgdGhlCiAgY29uZGl0aW9uYWwgbmVzdGluZywgc28gb25seSBvbmUgImVuZGlmIiBpcyByZXF1aXJlZCB0byBjbG9zZSB0aGUKICBjb25kaXRpb25hbC4KCiogQWxsIHBhdHRlcm4tc3BlY2lmaWMgdmFyaWFibGVzIHRoYXQgbWF0Y2ggYSBnaXZlbiB0YXJnZXQgYXJlIG5vdyB1c2VkCiAgKHByZXZpb3VzbHkgb25seSB0aGUgZmlyc3QgbWF0Y2ggd2FzIHVzZWQpLgoKKiBUYXJnZXQtc3BlY2lmaWMgdmFyaWFibGVzIGNhbiBiZSBtYXJrZWQgYXMgZXhwb3J0YWJsZSB1c2luZyB0aGUKICAiZXhwb3J0IiBrZXl3b3JkLgoKKiBJbiBhIHJlY3Vyc2l2ZSAkKGNhbGwgLi4uKSBjb250ZXh0LCBhbnkgZXh0cmEgYXJndW1lbnRzIGZyb20gdGhlIG91dGVyCiAgY2FsbCBhcmUgbm93IG1hc2tlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgaW5uZXIgY2FsbC4KCiogSW1wbGVtZW50ZWQgYSBzb2x1dGlvbiBmb3IgdGhlICJ0aHVuZGVyaW5nIGhlcmQiIHByb2JsZW0gd2l0aCAiLWogLWwiLgogIFRoaXMgdmVyc2lvbiBvZiBHTlUgbWFrZSB1c2VzIGFuIGFsZ29yaXRobSBzdWdnZXN0ZWQgYnkgVGhvbWFzIFJpZWRsCiAgPHRob21hcy5yaWVkbEBzaWVtZW5zLmNvbT4gdG8gdHJhY2sgdGhlIG51bWJlciBvZiBqb2JzIHN0YXJ0ZWQgaW4gdGhlCiAgbGFzdCBzZWNvbmQgYW5kIGFydGlmaWNpYWxseSBhZGp1c3QgR05VIG1ha2UncyB2aWV3IG9mIHRoZSBzeXN0ZW0ncwogIGxvYWQgYXZlcmFnZSBhY2NvcmRpbmdseS4KCiogTmV3IHNwZWNpYWwgdmFyaWFibGVzIGF2YWlsYWJsZSBpbiB0aGlzIHJlbGVhc2U6CiAgIC0gLklOQ0xVREVfRElSUzogRXhwYW5kcyB0byBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdGhhdCBtYWtlIHNlYXJjaGVzCiAgICAgZm9yIGluY2x1ZGVkIG1ha2VmaWxlcy4KICAgLSAuRkVBVFVSRVM6IENvbnRhaW5zIGEgbGlzdCBvZiBzcGVjaWFsIGZlYXR1cmVzIGF2YWlsYWJsZSBpbiB0aGlzCiAgICAgdmVyc2lvbiBvZiBHTlUgbWFrZS4KICAgLSAuREVGQVVMVF9HT0FMOiBTZXQgdGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgZ29hbCBtYWtlIHdpbGwKICAgICB1c2UgaWYgbm8gZ29hbHMgYXJlIHByb3ZpZGVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCiAgIC0gTUFLRV9SRVNUQVJUUzogSWYgc2V0LCB0aGVuIHRoaXMgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGlzCiAgICAgaW5zdGFuY2Ugb2YgbWFrZSBoYXMgYmVlbiByZXN0YXJ0ZWQgKHNlZSAiSG93IE1ha2VmaWxlcyBBcmUgUmVtYWRlIgogICAgIGluIHRoZSBtYW51YWwpLgogICAtIE5ldyBhdXRvbWF0aWMgdmFyaWFibGU6ICR8IChhZGRlZCBpbiAzLjgwLCBhY3R1YWxseSk6IGNvbnRhaW5zIGFsbAogICAgIHRoZSBvcmRlci1vbmx5IHByZXJlcXVpc2l0ZXMgZGVmaW5lZCBmb3IgdGhlIHRhcmdldC4KCiogTmV3IGZ1bmN0aW9ucyBhdmFpbGFibGUgaW4gdGhpcyByZWxlYXNlOgogICAtICQobGFzdHdvcmQgLi4uKSByZXR1cm5zIHRoZSBsYXN0IHdvcmQgaW4gdGhlIGxpc3QuICBUaGlzIGdpdmVzCiAgICAgaWRlbnRpY2FsIHJlc3VsdHMgYXMgJCh3b3JkICQod29yZHMgLi4uKSAuLi4pLCBidXQgaXMgbXVjaCBmYXN0ZXIuCiAgIC0gJChhYnNwYXRoIC4uLikgcmV0dXJucyB0aGUgYWJzb2x1dGUgcGF0aCAoYWxsICIuIiBhbmQgIi4uIgogICAgIGRpcmVjdG9yaWVzIHJlc29sdmVkLCBhbmQgYW55IGR1cGxpY2F0ZSAiLyIgY2hhcmFjdGVycyByZW1vdmVkKSBmb3IKICAgICBlYWNoIHBhdGggcHJvdmlkZWQuCiAgIC0gJChyZWFscGF0aCAuLi4pIHJldHVybnMgdGhlIGNhbm9uaWNhbCBwYXRobmFtZSBmb3IgZWFjaCBwYXRoCiAgICAgcHJvdmlkZWQuICBUaGUgY2Fub25pY2FsIHBhdGhuYW1lIGlzIHRoZSBhYnNvbHV0ZSBwYXRobmFtZSwgd2l0aAogICAgIGFsbCBzeW1ib2xpYyBsaW5rcyByZXNvbHZlZCBhcyB3ZWxsLgogICAtICQoaW5mbyAuLi4pIHByaW50cyBpdHMgYXJndW1lbnRzIHRvIHN0ZG91dC4gIE5vIG1ha2VmaWxlIG5hbWUgb3IKICAgICBsaW5lIG51bWJlciBpbmZvLCBldGMuIGlzIHByaW50ZWQuCiAgIC0gJChmbGF2b3IgLi4uKSByZXR1cm5zIHRoZSBmbGF2b3Igb2YgYSB2YXJpYWJsZS4KICAgLSAkKG9yIC4uLikgcHJvdmlkZXMgYSBzaG9ydC1jaXJjdWl0aW5nIE9SIGNvbmRpdGlvbmFsOiBlYWNoIGFyZ3VtZW50CiAgICAgaXMgZXhwYW5kZWQuICBUaGUgZmlyc3QgdHJ1ZSAobm9uLWVtcHR5KSBhcmd1bWVudCBpcyByZXR1cm5lZDsgbm8KICAgICBmdXJ0aGVyIGFyZ3VtZW50cyBhcmUgZXhwYW5kZWQuICBFeHBhbmRzIHRvIGVtcHR5IGlmIHRoZXJlIGFyZSBubwogICAgIHRydWUgYXJndW1lbnRzLgogICAtICQoYW5kIC4uLikgcHJvdmlkZXMgYSBzaG9ydC1jaXJjdWl0aW5nIEFORCBjb25kaXRpb25hbDogZWFjaAogICAgIGFyZ3VtZW50IGlzIGV4cGFuZGVkLiAgVGhlIGZpcnN0IGZhbHNlIChlbXB0eSkgYXJndW1lbnQgaXMKICAgICByZXR1cm5lZDsgbm8gZnVydGhlciBhcmd1bWVudHMgYXJlIGV4cGFuZGVkLiAgRXhwYW5kcyB0byB0aGUgbGFzdAogICAgIGFyZ3VtZW50IGlmIGFsbCBhcmd1bWVudHMgYXJlIHRydWUuCgoqIENoYW5nZXMgbWFkZSBmb3IgUE9TSVggY29tcGF0aWJpbGl0eToKICAgLSBPbmx5IHRvdWNoIHRhcmdldHMgKHVuZGVyIC10KSBpZiB0aGV5IGhhdmUgYSByZWNpcGUuCiAgIC0gU2V0dGluZyB0aGUgU0hFTEwgbWFrZSB2YXJpYWJsZSBkb2VzIE5PVCBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZQogICAgIFNIRUxMIGVudmlyb25tZW50IHZhcmlhYmxlIGdpdmVuIHRvIHByb2dyYW1zIGludm9rZWQgYnkgbWFrZS4gIEFzCiAgICAgYW4gZW5oYW5jZW1lbnQgdG8gUE9TSVgsIGlmIHlvdSBleHBvcnQgdGhlIG1ha2UgdmFyaWFibGUgU0hFTEwgdGhlbgogICAgIGl0IHdpbGwgYmUgc2V0IGluIHRoZSBlbnZpcm9ubWVudCwganVzdCBhcyBiZWZvcmUuCgoqIE9uIE1TIFdpbmRvd3Mgc3lzdGVtcywgZXhwbGljaXRseSBzZXR0aW5nIFNIRUxMIHRvIGEgcGF0aG5hbWUgZW5kaW5nCiAgaW4gImNtZCIgb3IgImNtZC5leGUiIChjYXNlLWluc2Vuc2l0aXZlKSB3aWxsIGZvcmNlIEdOVSBtYWtlIHRvIHVzZQogIHRoZSBET1MgY29tbWFuZCBpbnRlcnByZXRlciBpbiBiYXRjaCBtb2RlIGV2ZW4gaWYgYSBVTklYLWxpa2Ugc2hlbGwKICBjb3VsZCBiZSBmb3VuZCBvbiB0aGUgc3lzdGVtLgoKKiBPbiBWTVMgdGhlcmUgaXMgbm93IHN1cHBvcnQgZm9yIGNhc2Utc2Vuc2l0aXZlIGZpbGVzeXN0ZW1zIHN1Y2ggYXMgT0RTNS4KICBTZWUgdGhlIFJFQURNRS5WTVMgZmlsZSBmb3IgaW5mb3JtYXRpb24uCgoqIFBhcmFsbGVsIGJ1aWxkcyAoLWpOKSBubyBsb25nZXIgcmVxdWlyZSBhIHdvcmtpbmcgQm91cm5lIHNoZWxsIG9uCiAgV2luZG93cyBwbGF0Zm9ybXMuICBUaGV5IHdvcmsgZXZlbiB3aXRoIHRoZSBzdG9jayBXaW5kb3dzIHNoZWxscywgc3VjaAogIGFzIGNtZC5leGUgYW5kIGNvbW1hbmQuY29tLgoKKiBVcGRhdGVkIHRvIGF1dG9jb25mIDIuNTksIGF1dG9tYWtlIDEuOS41LCBhbmQgZ2V0dGV4dCAwLjE0LjEuICBVc2VycwogIHNob3VsZCBub3QgYmUgaW1wYWN0ZWQuCgoqIE5ldyB0cmFuc2xhdGlvbnMgZm9yIFN3ZWRpc2gsIENoaW5lc2UgKHNpbXBsaWZpZWQpLCBVa3JhaW5pYW4sCiAgQmVsYXJ1c2lhbiwgRmlubmlzaCwgS2lueWFyd2FuZGFuLCBhbmQgSXJpc2guICBNYW55IHVwZGF0ZWQKICB0cmFuc2xhdGlvbnMuCgpBIGNvbXBsZXRlIGxpc3Qgb2YgYnVncyBmaXhlZCBpbiB0aGlzIHZlcnNpb24gaXMgYXZhaWxhYmxlIGhlcmU6CgogIGh0dHBzOi8vc2F2YW5uYWguZ251Lm9yZy9idWdzL2luZGV4LnBocD9ncm91cD1tYWtlJnJlcG9ydF9pZD0xMTEmZml4X3JlbGVhc2VfaWQ9MTAzCgoMClZlcnNpb24gMy44MCAoMDMgT2N0IDIwMDIpCgoqIEEgbmV3IGZlYXR1cmUgZXhpc3RzOiBvcmRlci1vbmx5IHByZXJlcXVpc2l0ZXMuICBUaGVzZSBwcmVyZXF1aXNpdGVzCiAgYWZmZWN0IHRoZSBvcmRlciBpbiB3aGljaCB0YXJnZXRzIGFyZSBidWlsdCwgYnV0IHRoZXkgZG8gbm90IGltcGFjdAogIHRoZSByZWJ1aWxkL25vLXJlYnVpbGQgZGVjaXNpb24gb2YgdGhlaXIgZGVwZW5kZW50cy4gIFRoYXQgaXMgdG8gc2F5LAogIHRoZXkgYWxsb3cgeW91IHRvIHJlcXVpcmUgdGFyZ2V0IEIgYmUgYnVpbHQgYmVmb3JlIHRhcmdldCBBLCB3aXRob3V0CiAgcmVxdWlyaW5nIHRoYXQgdGFyZ2V0IEEgd2lsbCBhbHdheXMgYmUgcmVidWlsdCBpZiB0YXJnZXQgQiBpcyB1cGRhdGVkLgogIFBhdGNoIGZvciB0aGlzIGZlYXR1cmUgcHJvdmlkZWQgYnkgR3JlZyBNY0dhcnkgPGdyZWdAbWNnYXJ5Lm9yZz4uCgoqIEZvciBjb21wYXRpYmlsaXR5IHdpdGggU3lzViBtYWtlLCBHTlUgbWFrZSBub3cgc3VwcG9ydHMgdGhlIHBlY3VsaWFyCiAgc3ludGF4ICQkQCwgJCQoQEQpLCBhbmQgJCQoQEYpIGluIHRoZSBwcmVyZXF1aXNpdGVzIGxpc3Qgb2YgYSBydWxlLgogIFRoaXMgc3ludGF4IGlzIG9ubHkgdmFsaWQgd2l0aGluIGV4cGxpY2l0IGFuZCBzdGF0aWMgcGF0dGVybiBydWxlczogaXQKICBjYW5ub3QgYmUgdXNlZCBpbiBpbXBsaWNpdCAoc3VmZml4IG9yIHBhdHRlcm4pIHJ1bGVzLiAgRWRvdWFyZCBHLiBQYXJtZWxhbgogIDxlZ3BAZnJlZS5mcj4gcHJvdmlkZWQgYSBwYXRjaCBpbXBsZW1lbnRpbmcgdGhpcyBmZWF0dXJlOyBob3dldmVyLCBJCiAgZGVjaWRlZCB0byBpbXBsZW1lbnQgaXQgaW4gYSBkaWZmZXJlbnQgd2F5LgoKKiBUaGUgYXJndW1lbnQgdG8gdGhlICJpZmRlZiIgY29uZGl0aW9uYWwgaXMgbm93IGV4cGFuZGVkIGJlZm9yZSBpdCdzCiAgdGVzdGVkLCBzbyBpdCBjYW4gYmUgYSBjb25zdHJ1Y3RlZCB2YXJpYWJsZSBuYW1lLgoKICBTaW1pbGFybHksIHRoZSBhcmd1bWVudHMgdG8gImV4cG9ydCIgKHdoZW4gbm90IHVzZWQgaW4gYSB2YXJpYWJsZQogIGRlZmluaXRpb24gY29udGV4dCkgYW5kICJ1bmV4cG9ydCIgYXJlIGFsc28gbm93IGV4cGFuZGVkLgoKKiBBIG5ldyBmdW5jdGlvbiBpcyBkZWZpbmVkOiAkKHZhbHVlIC4uLikuICBUaGUgYXJndW1lbnQgdG8gdGhpcwogIGZ1bmN0aW9uIGlzIHRoZSBfbmFtZV8gb2YgYSB2YXJpYWJsZS4gIFRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGlzCiAgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSwgd2l0aG91dCBoYXZpbmcgYmVlbiBleHBhbmRlZC4KCiogQSBuZXcgZnVuY3Rpb24gaXMgZGVmaW5lZDogJChldmFsIC4uLikuICBUaGUgYXJndW1lbnRzIHRvIHRoaXMKICBmdW5jdGlvbiBzaG91bGQgZXhwYW5kIHRvIG1ha2VmaWxlIGNvbW1hbmRzLCB3aGljaCB3aWxsIHRoZW4gYmUKICBldmFsdWF0ZWQgYXMgaWYgdGhleSBoYWQgYXBwZWFyZWQgaW4gdGhlIG1ha2VmaWxlLiAgSW4gY29tYmluYXRpb24KICB3aXRoIGRlZmluZS9lbmRlZiBtdWx0aWxpbmUgdmFyaWFibGUgZGVmaW5pdGlvbnMgdGhpcyBpcyBhbiBleHRyZW1lbHkKICBwb3dlcmZ1bCBjYXBhYmlsaXR5LiAgVGhlICQodmFsdWUgLi4uKSBmdW5jdGlvbiBpcyBhbHNvIHNvbWV0aW1lcwogIHVzZWZ1bCBoZXJlLgoKKiBBIG5ldyBidWlsdC1pbiB2YXJpYWJsZSBpcyBkZWZpbmVkLCAkKE1BS0VGSUxFX0xJU1QpLiAgSXQgY29udGFpbnMgYQogIGxpc3Qgb2YgZWFjaCBtYWtlZmlsZSBHTlUgbWFrZSBoYXMgcmVhZCwgb3Igc3RhcnRlZCB0byByZWFkLCBpbiB0aGUKICBvcmRlciBpbiB3aGljaCB0aGV5IHdlcmUgZW5jb3VudGVyZWQuICBTbywgdGhlIGxhc3QgZmlsZW5hbWUgaW4gdGhlCiAgbGlzdCB3aGVuIGEgbWFrZWZpbGUgaXMganVzdCBiZWluZyByZWFkIChiZWZvcmUgYW55IGluY2x1ZGVzKSBpcyB0aGUKICBuYW1lIG9mIHRoZSBjdXJyZW50IG1ha2VmaWxlLgoKKiBBIG5ldyBidWlsdC1pbiB2YXJpYWJsZSBpcyBkZWZpbmVkOiAkKC5WQVJJQUJMRVMpLiAgV2hlbiBpdCBpcwogIGV4cGFuZGVkIGl0IHJldHVybnMgYSBjb21wbGV0ZSBsaXN0IG9mIHZhcmlhYmxlIG5hbWVzIGRlZmluZWQgYnkgYWxsCiAgbWFrZWZpbGVzIGF0IHRoYXQgbW9tZW50LgoKKiBBIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uIGlzIGRlZmluZWQsIC1CIG9yIC0tYWx3YXlzLW1ha2UuICBJZgogIHNwZWNpZmllZCBHTlUgbWFrZSB3aWxsIGNvbnNpZGVyIGFsbCB0YXJnZXRzIG91dC1vZi1kYXRlIGV2ZW4gaWYgdGhleQogIHdvdWxkIG90aGVyd2lzZSBub3QgYmUuCgoqIFRoZSBhcmd1bWVudHMgdG8gJChjYWxsIC4uLikgZnVuY3Rpb25zIHdlcmUgYmVpbmcgc3RvcmVkIGluICQxLCAkMiwKICBldGMuIGFzIHJlY3Vyc2l2ZSB2YXJpYWJsZXMsIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIGZ1bGx5IGV4cGFuZGVkCiAgYmVmb3JlIGFzc2lnbm1lbnQuICBUaGlzIG1lYW5zIHRoYXQgZXNjYXBlZCBkb2xsYXIgc2lnbnMgKCQkIGV0Yy4pCiAgd2VyZSBub3QgYmVoYXZpbmcgcHJvcGVybHkuICBOb3cgdGhlIGFyZ3VtZW50cyBhcmUgc3RvcmVkIGFzIHNpbXBsZQogIHZhcmlhYmxlcy4gIFRoaXMgbWF5IG1lYW4gdGhhdCBpZiB5b3UgYWRkZWQgZXh0cmEgZXNjYXBpbmcgdG8geW91cgogICQoY2FsbCAuLi4pIGZ1bmN0aW9uIGFyZ3VtZW50cyB5b3Ugd2lsbCBuZWVkIHRvIHVuZG8gaXQgbm93LgoKKiBUaGUgdmFyaWFibGUgaW52b2tlZCBieSAkKGNhbGwgLi4uKSBjYW4gbm93IGJlIHJlY3Vyc2l2ZTogdW5saWtlIG90aGVyCiAgdmFyaWFibGVzIGl0IGNhbiByZWZlcmVuY2UgaXRzZWxmIGFuZCB0aGlzIHdpbGwgbm90IHByb2R1Y2UgYW4gZXJyb3IKICB3aGVuIGl0IGlzIHVzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvICQoY2FsbCAuLi4pIChidXQgb25seSB0aGVuKS4KCiogTmV3IHBzZXVkby10YXJnZXQgLkxPV19SRVNPTFVUSU9OX1RJTUUsIHN1cGVyc2VkaW5nIHRoZSBjb25maWd1cmUKICBvcHRpb24gLS1kaXNhYmxlLW5zZWMtdGltZXN0YW1wcy4gIFlvdSBtaWdodCBuZWVkIHRoaXMgaWYgeW91ciBidWlsZAogIHByb2Nlc3MgZGVwZW5kcyBvbiB0b29scyBsaWtlICJjcCAtcCIgcHJlc2VydmluZyB0aW1lIHN0YW1wcywgc2luY2UKICAiY3AgLXAiIChyaWdodCBub3cpIGRvZXNuJ3QgcHJlc2VydmUgdGhlIHN1YnNlY29uZCBwb3J0aW9uIG9mIGEgdGltZQogIHN0YW1wLgoKKiBVcGRhdGVkIHRyYW5zbGF0aW9ucyBmb3IgRnJlbmNoLCBHYWxpY2lhbiwgR2VybWFuLCBKYXBhbmVzZSwgS29yZWFuLAogIGFuZCBSdXNzaWFuLiAgTmV3IHRyYW5zbGF0aW9ucyBmb3IgQ3JvYXRpYW4sIERhbmlzaCwgSGVicmV3LCBhbmQKICBUdXJraXNoLgoKKiBVcGRhdGVkIGludGVybmF0aW9uYWxpemF0aW9uIHN1cHBvcnQgdG8gR2V0dGV4dCAwLjExLjUuCiAgR05VIG1ha2Ugbm93IHVzZXMgR2V0dGV4dCdzICJleHRlcm5hbCIgZmVhdHVyZSwgYW5kIGRvZXMgbm90IGluY2x1ZGUKICBhbnkgaW50ZXJuYXRpb25hbGl6YXRpb24gY29kZSBpdHNlbGYuICBDb25maWd1cmUgd2lsbCBzZWFyY2ggeW91cgogIHN5c3RlbSBmb3IgYW4gZXhpc3RpbmcgaW1wbGVtZW50YXRpb24gb2YgR05VIEdldHRleHQgKG9ubHkgR05VIEdldHRleHQKICBpcyBhY2NlcHRhYmxlKSBhbmQgdXNlIGl0IGlmIGl0IGV4aXN0cy4gIElmIG5vdCwgTkxTIHdpbGwgYmUgZGlzYWJsZWQuCiAgU2VlIEFCT1VULU5MUyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KCiogVXBkYXRlZCB0byBhdXRvY29uZiAyLjU0IGFuZCBhdXRvbWFrZSAxLjcuICBVc2VycyBzaG91bGQgbm90IGJlIGltcGFjdGVkLgoKKiBWTVMtc3BlY2lmaWMgY2hhbmdlczoKCiAgKiBJbiBkZWZhdWx0LmMgZGVmaW5lIHZhcmlhYmxlIEFSQ0ggYXMgSUE2NCBmb3IgVk1TIG9uIEl0YW5pdW0gc3lzdGVtcy4KCiAgKiBJbiBtYWtlZmlsZS52bXMgYXZvaWQgbmFtZSBjb2xsaXNpb24gZm9yIGdsb2IgYW5kIGdsb2JmcmVlLgoKICAqIFRoaXMgaXMgdGhlIFZNUyBwb3J0IG9mIEdOVSBNYWtlIGRvbmUgYnkgSGFydG11dC5CZWNrZXJAY29tcGFxLmNvbS4KCiAgICBJdCBpcyBiYXNlZCBvbiB0aGUgc3BlY2lmaWMgdmVyc2lvbiAzLjc3ayBhbmQgb24gMy43OC4xLiAzLjc3ayB3YXMgZG9uZQogICAgYnkgS2xhdXMgS+RtcGYgPGtrYWVtcGZAcm1pLmRlPiwgdGhlIGNvZGUgd2FzIGJhc2VkIG9uIHRoZSBWTVMgcG9ydCBvZgogICAgR05VIE1ha2UgMy42MCBieSBNaWtlIE1vcmV0dGkuCgogICAgSXQgd2FzIHBvcnRlZCBvbiBPcGVuVk1TL0FscGhhIFY3LjEsIERFQ0MgVjUuNy0wMDYuIEl0IHdhcyByZS1idWlsZCBhbmQKICAgIHRlc3RlZCBvbiBPcGVuVk1TL0FscGhhIFY3LjIsIE9wZW5WTVMvVkFYIDcuMSBhbmQgNS41LTIuIERpZmZlcmVudAogICAgdmVyc2lvbnMgb2YgREVDQyB3ZXJlIHVzZWQuIFZBWEMgd2FzIHRyaWVkOiBpdCBmYWlsczsgYnV0IGl0IGRvZXNuJ3QKICAgIHNlZW0gd29ydGggdG8gZ2V0IGl0IHdvcmtpbmcuIFRoZXJlIGFyZSBzdGlsbCBzb21lIFBUUk1JU01BVENIIHdhcm5pbmdzCiAgICBkdXJpbmcgdGhlIGNvbXBpbGUuIEFsdGhvdWdoIHBlcmwgaXMgd29ya2luZyBvbiBWTVMgdGhlIHRlc3Qgc2NyaXB0cwogICAgZG9uJ3Qgd29yay4gVGhlIGZ1bmN0aW9uICRzaGVsbCBpcyBzdGlsbCBtaXNzaW5nLgoKICAgIFRoZXJlIGlzIGEga25vd24gYnVnIGluIHNvbWUgb2YgdGhlIFZNUyBDUlRMcy4gSXQgaXMgaW4gdGhlIHNoaXBwZWQKICAgIHZlcnNpb25zIG9mIFZNUyBWNy4yIGFuZCBWNy4yLTEgYW5kIGluIHRoZSBjdXJyZW50bHkgKE9jdG9iZXIgMTk5OSkKICAgIGF2YWlsYWJsZSBFQ09zIGZvciBWTVMgVjcuMSBhbmQgbmV3ZXIgdmVyc2lvbnMuIEl0IGlzIGZpeGVkIGluIHZlcnNpb25zCiAgICBzaGlwcGVkIHdpdGggbmV3ZXIgVk1TIHZlcnNpb25zIGFuZCBhbGwgRUNPIGtpdHMgYWZ0ZXIgT2N0b2JlciAxOTk5LiBJdAogICAgb25seSBzaG93cyB1cCBkdXJpbmcgdGhlIGRheWxpZ2h0IHNhdmluZyB0aW1lIHBlcmlvZCAoRFNUKTogc3RhdCgpCiAgICByZXR1cm5zIGEgbW9kaWZpY2F0aW9uIHRpbWUgMSBob3VyIGFoZWFkLiBUaGlzIHJlc3VsdHMgaW4gR05VIG1ha2UKICAgIHdhcm5pbmcgbWVzc2FnZXMuIEZvciBhIGp1c3QgY3JlYXRlZCBzb3VyY2UgeW91IHdpbGwgc2VlOgoKICAgICAkIGdtYWtlIHguZXhlCiAgICAgZ21ha2UuZXhlOzE6ICoqKiBXYXJuaW5nOiBGaWxlICd4LmMnIGhhcyBtb2RpZmljYXRpb24gdGltZSBpbiB0aGUgZnV0dXJlCiAgICAgKDk0MDU4Mjg2MyA+IDk0MDU3OTI2OSkKICAgICBjYyAgICAvb2JqPXgub2JqIHguYwogICAgIGxpbmsgIHgub2JqICAgIC9leGU9eC5leGUKICAgICBnbWFrZS5leGU7MTogKioqIFdhcm5pbmc6ICBDbG9jayBza2V3IGRldGVjdGVkLiAgWW91ciBidWlsZCBtYXkgYmUKICAgICBpbmNvbXBsZXRlLgoKCkEgY29tcGxldGUgbGlzdCBvZiBidWdzIGZpeGVkIGluIHRoaXMgdmVyc2lvbiBpcyBhdmFpbGFibGUgaGVyZToKCiAgaHR0cHM6Ly9zYXZhbm5haC5nbnUub3JnL2J1Z3MvaW5kZXgucGhwP2dyb3VwPW1ha2UmcmVwb3J0X2lkPTExMSZmaXhfcmVsZWFzZV9pZD0xMDIKCgwKVmVyc2lvbiAzLjc5LjEgKDIzIEp1biAyMDAwKQoKKiAuU0VDT05EQVJZIHdpdGggbm8gcHJlcmVxdWlzaXRlcyBub3cgcHJldmVudHMgYW55IHRhcmdldCBmcm9tIGJlaW5nCiAgcmVtb3ZlZCBiZWNhdXNlIG1ha2UgdGhpbmtzIGl0J3MgYW4gaW50ZXJtZWRpYXRlIGZpbGUsIG5vdCBqdXN0IHRob3NlCiAgbGlzdGVkIGluIHRoZSBtYWtlZmlsZS4KCiogTmV3IGNvbmZpZ3VyZSBvcHRpb24gLS1kaXNhYmxlLW5zZWMtdGltZXN0YW1wcywgYnV0IHRoaXMgd2FzCiAgc3VwZXJzZWRlZCBpbiBsYXRlciB2ZXJzaW9ucyBieSB0aGUgLkxPV19SRVNPTFVUSU9OX1RJTUUgcHNldWRvLXRhcmdldC4KDApWZXJzaW9uIDMuNzkgKDA0IEFwciAyMDAwKQoKKiBHTlUgbWFrZSBvcHRpb25hbGx5IHN1cHBvcnRzIGludGVybmF0aW9uYWxpemF0aW9uIGFuZCBsb2NhbGVzIHZpYSB0aGUKICBHTlUgZ2V0dGV4dCAob3IgbG9jYWwgZ2V0dGV4dCBpZiBzdWl0YWJsZSkgcGFja2FnZS4gIFNlZSB0aGUgQUJPVVQtTkxTCiAgZmlsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBjb25maWd1cmluZyBHTlUgbWFrZSBmb3IgTkxTLgoKKiBQcmV2aW91c2x5LCBHTlUgbWFrZSBxdW90ZWQgdmFyaWFibGVzIHN1Y2ggYXMgTUFLRUZMQUdTIGFuZAogIE1BS0VPVkVSUklERVMgZm9yIHByb3BlciBwYXJzaW5nIGJ5IHRoZSBzaGVsbC4gIFRoaXMgYWxsb3dlZCB0aGVtIHRvCiAgYmUgdXNlZCB3aXRoaW4gbWFrZSBidWlsZCBzY3JpcHRzLiAgSG93ZXZlciwgdXNpbmcgdGhlbSB0aGVyZSBpcyBub3QKICBwcm9wZXIgYmVoYXZpb3I6IHRoZXkgYXJlIG1lYW50IHRvIGJlIHBhc3NlZCB0byBzdWJzaGVsbHMgdmlhIHRoZQogIGVudmlyb25tZW50LiAgVW5mb3J0dW5hdGVseSB0aGUgdmFsdWVzIHdlcmUgbm90IHF1b3RlZCBwcm9wZXJseSB0byBiZQogIHBhc3NlZCB0aHJvdWdoIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgbWVhbnQgdGhhdCBtYWtlIGRpZG4ndCBwcm9wZXJseQogIHBhc3Mgc29tZSB0eXBlcyBvZiBjb21tYW5kIGxpbmUgdmFsdWVzIHRvIHN1Ym1ha2VzLgoKICBXaXRoIHRoaXMgdmVyc2lvbiB3ZSBjaGFuZ2UgdGhhdCBiZWhhdmlvcjogbm93IHRoZXNlIHZhcmlhYmxlcyBhcmUKICBxdW90ZWQgcHJvcGVybHkgZm9yIHBhc3NpbmcgdGhyb3VnaCB0aGUgZW52aXJvbm1lbnQsIHdoaWNoIGlzIHRoZQogIGNvcnJlY3Qgd2F5IHRvIGRvIGl0LiAgSWYgeW91IHByZXZpb3VzbHkgdXNlZCB0aGVzZSB2YXJpYWJsZXMKICBleHBsaWNpdGx5IHdpdGhpbiBhIG1ha2UgcnVsZSB5b3UgbWF5IG5lZWQgdG8gcmUtZXhhbWluZSB5b3VyIHVzZSBmb3IKICBjb3JyZWN0bmVzcyBnaXZlbiB0aGlzIGNoYW5nZS4KCiogQSBuZXcgcHNldWRvLXRhcmdldCAuTk9UUEFSQUxMRUwgaXMgYXZhaWxhYmxlLiAgSWYgZGVmaW5lZCwgdGhlCiAgY3VycmVudCBtYWtlZmlsZSBpcyBydW4gc2VyaWFsbHkgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgLWouCiAgSG93ZXZlciwgc3VibWFrZXMgYXJlIHN0aWxsIGVsaWdpYmxlIGZvciBwYXJhbGxlbCBleGVjdXRpb24uCgoqIFRoZSAtLWRlYnVnIG9wdGlvbiBoYXMgY2hhbmdlZDogaXQgbm93IGFsbG93cyBvcHRpb25hbCBmbGFncwogIGNvbnRyb2xsaW5nIHRoZSBhbW91bnQgYW5kIHR5cGUgb2YgZGVidWdnaW5nIG91dHB1dC4gIEJ5IGRlZmF1bHQgb25seQogIGEgbWluaW1hbCBhbW91bnQgaW5mb3JtYXRpb24gaXMgZ2VuZXJhdGVkLCBkaXNwbGF5aW5nIHRoZSBuYW1lcyBvZgogICJub3JtYWwiIHRhcmdldHMgKG5vdCBtYWtlZmlsZXMpIHRoYXQgd2VyZSBkZWVtZWQgb3V0IG9mIGRhdGUgYW5kIGluCiAgbmVlZCBvZiBiZWluZyByZWJ1aWx0LgoKICBOb3RlIHRoYXQgdGhlIC1kIG9wdGlvbiBiZWhhdmVzIGFzIGJlZm9yZTogaXQgdGFrZXMgbm8gYXJndW1lbnRzIGFuZAogIGFsbCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXMgZ2VuZXJhdGVkLgoKKiBUaGUgYC1wJyAocHJpbnQgZGF0YWJhc2UpIG91dHB1dCBub3cgaW5jbHVkZXMgZmlsZW5hbWUgYW5kIGxpbmVudW1iZXIKICBpbmZvcm1hdGlvbiBmb3IgdmFyaWFibGUgZGVmaW5pdGlvbnMsIHRvIGFpZCBkZWJ1Z2dpbmcuCgoqIFRoZSB3b3JkbGlzdCBmdW5jdGlvbiBubyBsb25nZXIgcmV2ZXJzZXMgaXRzIGFyZ3VtZW50cyBpZiB0aGUgInN0YXJ0IgogIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgImVuZCIgdmFsdWUuICBJZiB0aGF0J3MgdHJ1ZSwgbm90aGluZyBpcwogIHJldHVybmVkLgoKKiBIYXJ0bXV0IEJlY2tlciBwcm92aWRlZCBtYW55IHVwZGF0ZXMgZm9yIHRoZSBWTVMgcG9ydCBvZiBHTlUgbWFrZS4KICBTZWUgdGhlIFJFQURNRS5WTVMgZmlsZSBmb3IgbW9yZSBkZXRhaWxzLgoKKiBWTVMtc3BlY2lmaWMgY2hhbmdlczoKCiAgKiBGaXggYSBwcm9ibGVtIHdpdGggYXV0b21hdGljYWxseSByZW1ha2luZyBtYWtlZmlsZXMuIEdOVSBtYWtlIHVzZXMgYW4KICAgIGV4ZWN2ZSB0byByZXN0YXJ0IGl0c2VsZiBhZnRlciBhIHN1Y2Nlc3NmdWwgcmVtYWtlIG9mIHRoZSBtYWtlZmlsZS4gT24KICAgIFVOSVggc3lzdGVtcyBleGVjdmUgcmVwbGFjZXMgdGhlIHJ1bm5pbmcgcHJvZ3JhbSB3aXRoIGEgbmV3IG9uZSBhbmQKICAgIHJlc2V0cyBhbGwgc2lnbmFsIGhhbmRsaW5nIHRvIHRoZSBkZWZhdWx0LiBPbiBWTVMgZXhlY3ZlIGNyZWF0ZXMgYSBjaGlsZAogICAgcHJvY2Vzcywgc2lnbmFsIGFuZCBleGl0IGhhbmRsZXJzIG9mIHRoZSBwYXJlbnQgYXJlIHN0aWxsIGFjdGl2ZSwgYW5kLAogICAgdW5mb3J0dW5hdGVseSwgY29ycnVwdCB0aGUgZXhpdCBjb2RlIGZyb20gdGhlIGNoaWxkLiBGaXggaW4gam9iLmM6CiAgICBpZ25vcmUgU0lHQ0hMRC4KCiAgKiBBZGRlZCBzb21lIHN3aXRjaGVzIHRvIHJlZmxlY3QgbGF0ZXN0IGZlYXR1cmVzIG9mIERFQ0MuIE1vZGlmaWNhdGlvbnMgaW4KICAgIG1ha2VmaWxlLnZtcy4KCiAgKiBTZXQgc29tZSBkZWZpbml0aW9ucyB0byByZWZsZWN0IGxhdGVzdCBmZWF0dXJlcyBvZiBERUNDLiBNb2RpZmljYXRpb25zIGluCiAgICBjb25maWcuaC12bXMgKHdoaWNoIGlzIGNvcGllZCB0byBjb25maWcuaCkuCgogICogQWRkZWQgZXh0ZXJuIHN0cmNtcGkgZGVjbGFyYXRpb24gdG8gYXZvaWQgJ2ltcGxpY2l0bHkgZGVjbGFyZWQnIG1lc3NhZ2VzLgogICAgTW9kaWZpY2F0aW9uIGluIG1ha2UuaC4KCiAgKiBEZWZhdWx0IHJ1bGUgZm9yIEMrKywgY29uZGl0aW9uYWxzIGZvciBnY2MgKEdDQ19JU19OQVRJVkUpIG9yIERFQy9EaWdpdGFsLwogICAgQ29tcGFxIGMvYysrIGNvbXBpbGVycy4gTW9kaWZpY2F0aW9ucyBpbiBkZWZhdWx0LmMuCgogICogVXNhZ2Ugb2Ygb3BlbmRpcigpIGFuZCBmcmllbmRzLCBzdXBwcmVzcyBmaWxlIHZlcnNpb24uIE1vZGlmaWNhdGlvbnMgaW4KICAgIGRpci5jLgoKICAqIEFkZGVkIFZNUyBzcGVjaWZpYyBjb2RlIHRvIGhhbmRsZSBjdHJsK2MgYW5kIGN0cmwreSB0byBhYm9ydCBtYWtlLgogICAgTW9kaWZpY2F0aW9ucyBpbiBqb2IuYy4KCiAgKiBBZGRlZCBzdXBwb3J0IHRvIGhhdmUgY2FzZSBzZW5zaXRpdmUgdGFyZ2V0cyBhbmQgZGVwZW5kZW5jaWVzIGJ1dCB0bwogICAgc3RpbGwgdXNlIGNhc2UgYmxpbmQgZmlsZSBuYW1lcy4gVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBmb3IgSmF2YQogICAgbWFrZWZpbGVzIG9uIFZNUzoKCiAgICAgICAgLlNVRkZJWEVTIDoKICAgICAgICAuU1VGRklYRVMgOiAuY2xhc3MgLmphdmEKICAgICAgICAuamF2YS5jbGFzcyA6CiAgICAgICAgICAgICAgICBqYXZhYyAiJDwKICAgICAgICBIZWxsb1dvcmxkLmNsYXNzIDogICAgICBIZWxsb1dvcmxkLmphdmEKCiAgKiBBIG5ldyBtYWNybyBXQU5UX0NBU0VfU0VOU0lUSVZFX1RBUkdFVFMgaW4gY29uZmlnLmgtdm1zIHdhcyBpbnRyb2R1Y2VkLgogICAgSXQgbmVlZHMgdG8gYmUgZW5hYmxlZCB0byBnZXQgdGhpcyBmZWF0dXJlOyBkZWZhdWx0IGlzIGRpc2FibGVkLiAgVGhlCiAgICBtYWNybyBIQVZFX0NBU0VfSU5TRU5TSVRJVkVfRlMgbXVzdCBub3QgYmUgdG91Y2hlZDogaXQgaXMgc3RpbGwgZW5hYmxlZC4KICAgIE1vZGlmaWNhdGlvbnMgaW4gZmlsZS5jIGFuZCBjb25maWcuaC12bXMuCgogICogQm9vdHN0cmFwIG1ha2UgdG8gc3RhcnQgYnVpbGRpbmcgbWFrZSBpcyBzdGlsbCBtYWtlZmlsZS5jb20sIGJ1dCBtYWtlCiAgICBuZWVkcyB0byBiZSByZS1tYWRlIHdpdGggYSBtYWtlIHRvIG1ha2UgYSBjb3JyZWN0IHZlcnNpb246IGlnbm9yZSBhbGwKICAgIHBvc3NpYmxlIHdhcm5pbmdzLCBkZWxldGUgYWxsIG9iamVjdHMsIHJlbmFtZSBtYWtlLmV4ZSB0byBhIGRpZmZlcmVudAogICAgbmFtZSBhbmQgcnVuIGl0LgoKICAqIE1hZGUgc29tZSBtaW5vciBtb2RpZmljYXRpb25zIHRvIHRoZSBib290c3RyYXAgYnVpbGQgbWFrZWZpbGUuY29tLgoMClZlcnNpb24gMy43OCAoMjIgU2VwIDE5OTkpCgoqIFR3byBuZXcgZnVuY3Rpb25zLCAkKGVycm9yIC4uLikgYW5kICQod2FybmluZyAuLi4pIGFyZSBhdmFpbGFibGUuICBUaGUKICBmb3JtZXIgd2lsbCBjYXVzZSBtYWtlIHRvIGZhaWwgYW5kIGV4aXQgaW1tZWRpYXRlbHkgdXBvbiBleHBhbnNpb24gb2YKICB0aGUgZnVuY3Rpb24sIHdpdGggdGhlIHRleHQgcHJvdmlkZWQgYXMgdGhlIGVycm9yIG1lc3NhZ2UuICBUaGUgbGF0dGVyCiAgY2F1c2VzIHRoZSB0ZXh0IHByb3ZpZGVkIHRvIGJlIHByaW50ZWQgYXMgYSB3YXJuaW5nIG1lc3NhZ2UsIGJ1dCBtYWtlCiAgcHJvY2VlZHMgbm9ybWFsbHkuCgoqIEEgbmV3IGZ1bmN0aW9uICQoY2FsbCAuLi4pIGlzIGF2YWlsYWJsZS4gIFRoaXMgYWxsb3dzIHVzZXJzIHRvIGNyZWF0ZQogIHRoZWlyIG93biBwYXJhbWV0ZXJpemVkIG1hY3JvcyBhbmQgaW52b2tlIHRoZW0gbGF0ZXIuICBPcmlnaW5hbAogIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gd2FzIHByb3ZpZGVkIGJ5IEhhbi1XZW4gTmllbmh1eXMKICA8aGFud2VuQGNzLnV1Lm5sPi4KCiogQSBuZXcgZnVuY3Rpb24gJChpZiAuLi4pIGlzIGF2YWlsYWJsZS4gIEl0IHByb3ZpZGVzIGlmLXRoZW4tZWxzZQogIGNhcGFiaWxpdGllcyBpbiBhIGJ1aWx0aW4gZnVuY3Rpb24uICBPcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCiAgZnVuY3Rpb24gd2FzIHByb3ZpZGVkIGJ5IEhhbi1XZW4gTmllbmh1eXMgPGhhbndlbkBjcy51dS5ubD4uCgoqIE1ha2UgZGVmaW5lcyBhIG5ldyB2YXJpYWJsZSwgLkxJQlBBVFRFUk5TLiAgVGhpcyB2YXJpYWJsZSBjb250cm9scyBob3cKICBsaWJyYXJ5IGRlcGVuZGVuY3kgZXhwYW5zaW9uIChkZXBlbmRlbmNpZXMgbGlrZSBgYC1sZm9vJycpIGlzIHBlcmZvcm1lZC4KCiogTWFrZSBhY2NlcHRzIENSTEYgc2VxdWVuY2VzIGFzIHdlbGwgYXMgdHJhZGl0aW9uYWwgTEYsIGZvcgogIGNvbXBhdGliaWxpdHkgd2l0aCBtYWtlZmlsZXMgY3JlYXRlZCBvbiBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcy4KCiogTWFrZSBhY2NlcHRzIGEgbmV3IG9wdGlvbjogLVIsIG9yIC0tbm8tYnVpbHRpbi12YXJpYWJsZXMuICBUaGlzIG9wdGlvbgogIGRpc2FibGVzIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBydWxlLXNwZWNpZmljIGJ1aWx0aW4gdmFyaWFibGVzIChDQywKICBMRCwgQVIsIGV0Yy4pLiAgU3BlY2lmeWluZyB0aGlzIG9wdGlvbiBmb3JjZXMgLXIgKC0tbm8tYnVpbHRpbi1ydWxlcykKICBhcyB3ZWxsLgoKKiBBICJqb2Igc2VydmVyIiBmZWF0dXJlLCBzdWdnZXN0ZWQgYnkgSG93YXJkIENodSA8aHljQGhpZ2hsYW5kc3VuLmNvbT4uCgogIE9uIHN5c3RlbXMgdGhhdCBzdXBwb3J0IFBPU0lYIHBpcGUoMikgc2VtYW50aWNzLCBHTlUgbWFrZSBjYW4gbm93IHBhc3MKICAtak4gb3B0aW9ucyB0byBzdWJtYWtlcyByYXRoZXIgdGhhbiBmb3JjaW5nIHRoZW0gYWxsIHRvIHVzZSAtajEuICBUaGUKICB0b3AgbWFrZSBhbmQgYWxsIGl0cyBzdWItbWFrZSBwcm9jZXNzZXMgdXNlIGEgcGlwZSB0byBjb21tdW5pY2F0ZSB3aXRoCiAgZWFjaCBvdGhlciB0byBlbnN1cmUgdGhhdCBubyBtb3JlIHRoYW4gTiBqb2JzIGFyZSBzdGFydGVkIGFjcm9zcyBhbGwKICBtYWtlcy4gIFRvIGdldCB0aGUgb2xkIGJlaGF2aW9yIG9mIC1qIGJhY2ssIHlvdSBjYW4gY29uZmlndXJlIG1ha2UKICB3aXRoIHRoZSAtLWRpc2FibGUtam9iLXNlcnZlciBvcHRpb24uCgoqIFRoZSBjb25mdXNpbmcgdGVybSAiZGVwZW5kZW5jeSIgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlIG1vcmUgYWNjdXJhdGUKICBhbmQgc3RhbmRhcmQgdGVybSAicHJlcmVxdWlzaXRlIiwgYm90aCBpbiB0aGUgbWFudWFsIGFuZCBpbiBhbGwgR05VIG1ha2UKICBvdXRwdXQuCgoqIEdOVSBtYWtlIHN1cHBvcnRzIHRoZSAiYmlnIGFyY2hpdmUiIGxpYnJhcnkgZm9ybWF0IGludHJvZHVjZWQgaW4gQUlYIDQuMy4KCiogR05VIG1ha2Ugc3VwcG9ydHMgbGFyZ2UgZmlsZXMgb24gQUlYLCBIUC1VWCwgYW5kIElSSVguICBUaGVzZSBjaGFuZ2VzCiAgd2VyZSBwcm92aWRlZCBieSBQYXVsIEVnZ2VydCA8ZWdnZXJ0QHR3aW5zdW4uY29tPi4gIChMYXJnZSBmaWxlCiAgc3VwcG9ydCBmb3IgU29sYXJpcyBhbmQgTGludXggd2FzIGludHJvZHVjZWQgaW4gMy43NywgYnV0IHRoZQogIGNvbmZpZ3VyYXRpb24gaGFkIGlzc3VlczogdGhlc2UgaGF2ZSBhbHNvIGJlZW4gcmVzb2x2ZWQpLgoKKiBUaGUgV2luZG93cyA5NS85OC9OVCAoVzMyKSB2ZXJzaW9uIG9mIEdOVSBtYWtlIG5vdyBoYXMgbmF0aXZlIHN1cHBvcnQKICBmb3IgdGhlIEN5Z251cyBDeWd3aW4gcmVsZWFzZSBCMjAuMSBzaGVsbCAoYmFzaCkuCgoqIFRoZSBHTlUgbWFrZSByZWdyZXNzaW9uIHRlc3Qgc3VpdGUsIGxvbmcgYXZhaWxhYmxlIHNlcGFyYXRlbHkgInVuZGVyCiAgdGhlIHRhYmxlIiwgaGFzIGJlZW4gaW50ZWdyYXRlZCBpbnRvIHRoZSByZWxlYXNlLiAgWW91IGNhbiBpbnZva2UgaXQKICBieSBydW5uaW5nICJtYWtlIGNoZWNrIiBpbiB0aGUgZGlzdHJpYnV0aW9uLiAgTm90ZSB0aGF0IGl0IHJlcXVpcmVzCiAgUGVybCAoZWl0aGVyIFBlcmwgNCBvciBQZXJsIDUpIHRvIHJ1bi4KDApWZXJzaW9uIDMuNzcgKDI4IEp1bCAxOTk4KQoKKiBJbXBsZW1lbnQgQlNEIG1ha2UncyAiPz0iIHZhcmlhYmxlIGFzc2lnbm1lbnQgb3BlcmF0b3IuICBUaGUgdmFyaWFibGUKICBpcyBhc3NpZ25lZCB0aGUgc3BlY2lmaWVkIHZhbHVlIG9ubHkgaWYgdGhhdCB2YXJpYWJsZSBpcyBub3QgYWxyZWFkeQogIGRlZmluZWQuCgoqIE1ha2UgZGVmaW5lcyBhIG5ldyB2YXJpYWJsZSwgIkNVUkRJUiIsIHRvIGNvbnRhaW4gdGhlIGN1cnJlbnQgd29ya2luZwogIGRpcmVjdG9yeSAoYWZ0ZXIgdGhlIC1DIG9wdGlvbiwgaWYgYW55LCBoYXMgYmVlbiBwcm9jZXNzZWQpLgogIE1vZGlmeWluZyB0aGlzIHZhcmlhYmxlIGhhcyBubyBlZmZlY3Qgb24gdGhlIG9wZXJhdGlvbiBvZiBtYWtlLgoKKiBNYWtlIGRlZmluZXMgYSBuZXcgZGVmYXVsdCBSQ1MgcnVsZSwgZm9yIG5ldy1zdHlsZSBtYXN0ZXIgZmlsZQogIHN0b3JhZ2U6IGBgJSA6OiBSQ1MvJScnIChub3RlIG5vIGBgLHYnJyBzdWZmaXgpLgoKICBNYWtlIGRlZmluZXMgbmV3IGRlZmF1bHQgcnVsZXMgZm9yIERPUy1zdHlsZSBDKysgZmlsZSBuYW1pbmcKICBjb252ZW50aW9ucywgd2l0aCBgYC5jcHAnJyBzdWZmaXhlcy4gIEFsbCB0aGUgc2FtZSBydWxlcyBhcyBmb3IKICBgYC5jYycnIGFuZCBgYC5DJycgc3VmZml4ZXMgYXJlIHByb3ZpZGVkLCBhbG9uZyB3aXRoIExJTksuY3BwIGFuZAogIENPTVBJTEUuY3BwIG1hY3JvcyAod2hpY2ggZGVmYXVsdCB0byB0aGUgc2FtZSB2YWx1ZSBhcyBMSU5LLmNjIGFuZAogIENPTVBJTEUuY2MpLiAgTm90ZSBDUFBGTEFHUyBpcyBzdGlsbCBDIHByZXByb2Nlc3NvciBmbGFncyEgIFlvdSBzaG91bGQKICB1c2UgQ1hYRkxBR1MgdG8gY2hhbmdlIEMrKyBjb21waWxlciBmbGFncy4KCiogQSBuZXcgZmVhdHVyZSwgInRhcmdldC1zcGVjaWZpYyB2YXJpYWJsZSB2YWx1ZXMiLCBoYXMgYmVlbiBhZGRlZC4KICBUaGlzIGlzIGEgbGFyZ2UgY2hhbmdlIHNvIHBsZWFzZSBzZWUgdGhlIGFwcHJvcHJpYXRlIHNlY3Rpb25zIG9mIHRoZQogIG1hbnVhbCBmb3IgZnVsbCBkZXRhaWxzLiAgQnJpZWZseSwgc3ludGF4IGxpa2UgdGhpczoKCiAgICBUQVJHRVQ6IFZBUklBQkxFID0gVkFMVUUKCiAgZGVmaW5lcyBWQVJJQUJMRSBhcyBWQUxVRSB3aXRoaW4gdGhlIGNvbnRleHQgb2YgVEFSR0VULiAgVGhpcyBpcwogIHNpbWlsYXIgdG8gU3VuT1MgbWFrZSdzICJUQVJHRVQgOj0gVkFSSUFCTEUgPSBWQUxVRSIgZmVhdHVyZS4gIE5vdGUKICB0aGF0IHRoZSBhc3NpZ25tZW50IG1heSBiZSBvZiBhbnkgdHlwZSwgbm90IGp1c3QgcmVjdXJzaXZlLCBhbmQgdGhhdAogIHRoZSBvdmVycmlkZSBrZXl3b3JkIGlzIGF2YWlsYWJsZS4KCiAgQ09NUEFUSUJJTElUWTogVGhpcyBuZXcgc3ludGF4IG1lYW5zIHRoYXQgaWYgeW91IGhhdmUgYW55IHJ1bGVzIHdoZXJlCiAgdGhlIGZpcnN0IG9yIHNlY29uZCBkZXBlbmRlbmN5IGhhcyBhbiBlcXVhbCBzaWduICg9KSBpbiBpdHMgbmFtZSwKICB5b3UnbGwgaGF2ZSB0byBlc2NhcGUgdGhlbSB3aXRoIGEgYmFja3NsYXNoOiAiZm9vIDogYmFyXD1iYXoiLgogIEZ1cnRoZXIsIGlmIHlvdSBoYXZlIGFueSBkZXBlbmRlbmNpZXMgd2hpY2ggYWxyZWFkeSBjb250YWluICJcPSIsCiAgeW91J2xsIGhhdmUgdG8gZXNjYXBlIGJvdGggb2YgdGhlbTogImZvbyA6IGJhclxcXD1iYXoiLgoKKiBBIG5ldyBhcHBlbmRpeCBsaXN0aW5nIHRoZSBtb3N0IGNvbW1vbiBlcnJvciBhbmQgd2FybmluZyBtZXNzYWdlcwogIGdlbmVyYXRlZCBieSBHTlUgbWFrZSwgd2l0aCBzb21lIGV4cGxhbmF0aW9uLCBoYXMgYmVlbiBhZGRlZCB0byB0aGUKICBHTlUgbWFrZSBVc2VyJ3MgTWFudWFsLgoKKiBVcGRhdGVzIHRvIHRoZSBHTlUgbWFrZSBDdXN0b21zIGxpYnJhcnkgc3VwcG9ydCAoc2VlIFJFQURNRS5jdXN0b21zKS4KCiogVXBkYXRlcyB0byB0aGUgV2luZG93cyA5NS9OVCBwb3J0IGZyb20gUm9iIFR1bGxvaCAoc2VlIFJFQURNRS5XMzIpLAogIGFuZCB0byB0aGUgRE9TIHBvcnQgZnJvbSBFbGkgWmFyZXRza2kgKHNlZSBSRUFETUUuRE9TKS4KCiogVk1TLXNwZWNpZmljIGNoYW5nZXM6CgogICogVGhpcyBpcyB0aGUgVk1TIHBvcnQgb2YgR05VIE1ha2UuCiAgICBJdCBpcyBiYXNlZCBvbiB0aGUgVk1TIHBvcnQgb2YgR05VIE1ha2UgMy42MCBieSBNaWtlIE1vcmV0dGkuCiAgICBUaGlzIHBvcnQgd2FzIGRvbmUgYnkgS2xhdXMgS+RtcGYgPGtrYWVtcGZAcm1pLmRlPgoKICAqIFRoZXJlIGlzIGZpcnN0LWxldmVsIHN1cHBvcnQgYXZhaWxhYmxlIGZyb20gcHJvR0lTIFNvZnR3YXJlLCBHZXJtYW55LgogICAgVmlzaXQgdGhlaXIgd2ViLXNpdGUgYXQgaHR0cDovL3d3dy5wcm9naXMuZGUgdG8gZ2V0IGluZm9ybWF0aW9uCiAgICBhYm91dCBvdGhlciB2bXMgc29mdHdhcmUgYW5kIGZvcnRoY29taW5nIHVwZGF0ZXMgdG8gZ251IG1ha2UuCgogICogL2Jpbi9zaCBzdHlsZSBJL08gcmVkaXJlY3Rpb24gaXMgc3VwcG9ydGVkLiBZb3UgY2FuIG5vdyB3cml0ZSBsaW5lcyBsaWtlCiAgICAgICAgbWNyIHN5cyRkaXNrOltdcHJvZ3JhbS5leGUgPCBpbnB1dC50eHQgPiBvdXRwdXQudHh0ICY+IGVycm9yLnR4dAoKICAqIE1ha2VmaWxlIHZhcmlhYmxlcyBhcmUgbG9va2VkIHVwIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50LiBZb3UgY2FuIHNldAogICAgc3ltYm9scyBvciBsb2dpY2FscyBpbiBEQ0wgYW5kIGV2YWx1YXRlIHRoZW0gaW4gdGhlIE1ha2VmaWxlIHZpYQogICAgJCg8bmFtZS1vZi1zeW1ib2wtb3ItbG9naWNhbD4pLiAgVmFyaWFibGVzIGRlZmluZWQgaW4gdGhlIE1ha2VmaWxlCiAgICBvdmVycmlkZSBWTVMgc3ltYm9scy9sb2dpY2FscyAhCgogICogRnVuY3Rpb25zIGZvciBmaWxlIG5hbWVzIGFyZSB3b3JraW5nIG5vdy4gU2VlIHRoZSBHTlUgTWFrZSBtYW51YWwgZm9yCiAgICAkKGRpciAuLi4pICBhbmQgJCh3aWxkY2FyZCAuLi4pLiAgVW5peC1zdHlsZSBhbmQgVk1TLXN0eWxlIG5hbWVzIGFyZQogICAgc3VwcG9ydGVkIGFzIGFyZ3VtZW50cy4KCiAgKiBUaGUgZGVmYXVsdCBydWxlcyBhcmUgc2V0IHVwIGZvciBHTlUgQy4gQnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmcm9tIGEKICAgIHNpbmdsZSBzb3VyY2UgZmlsZSBpcyBhcyBlYXN5IGFzICdtYWtlIGZpbGUuZXhlJy4KCiAgKiBUaGUgdmFyaWFibGUgJChBUkNIKSBpcyBwcmVkZWZpbmVkIGFzIEFMUEhBIG9yIFZBWCByZXNwLiBNYWtlZmlsZXMgZm9yCiAgICBkaWZmZXJlbnQgVk1TIHN5c3RlbXMgY2FuIG5vdyBiZSB3cml0dGVuIGJ5IGNoZWNraW5nICQoQVJDSCkgYXMgaW4KICAgICAgaWZlcSAoJChBUkNIKSxBTFBIQSkKICAgICAgICAkKEVDSE8pICJPbiB0aGUgQWxwaGEiCiAgICAgIGVsc2UKICAgICAgICAkKEVDSE8pICJPbiB0aGUgVkFYIgogICAgICBlbmRpZgoKICAqIENvbW1hbmQgbGluZXMgb2YgZXhjZXNzaXZlIGxlbmd0aCBhcmUgY29ycmVjdGx5IGJyb2tlbiBhbmQgd3JpdHRlbiB0byBhCiAgICBiYXRjaCBmaWxlIGluIHN5cyRzY3JhdGNoIGZvciBsYXRlciBleGVjdXRpb24uIFRoZXJlJ3Mgbm8gbGltaXQgdG8gdGhlCiAgICBsZW5ndGhzIG9mIGNvbW1hbmRzIChhbmQgbm8gbmVlZCBmb3IgLm9wdCBmaWxlcyA6LSkgYW55IG1vcmUuCgogICogRW1wdHkgY29tbWFuZHMgYXJlIGhhbmRsZWQgY29ycmVjdGx5IGFuZCBkb24ndCBlbmQgaW4gYSBuZXcgRENMIHByb2Nlc3MuCgwKVmVyc2lvbiAzLjc2LjEgKDE5IFNlcCAxOTk3KQoKKiBTbWFsbCAoYnV0IHNlcmlvdXMpIGJ1ZyBmaXguICBRdWljayByb2xsb3V0IHRvIGdldCBpbnRvIHRoZSBHTlUgc291cmNlIENELgoMClZlcnNpb24gMy43NiAoMTYgU2VwIDE5OTcpCgoqIEdOVSBtYWtlIG5vdyB1c2VzIGF1dG9tYWtlIHRvIGNvbnRyb2wgTWFrZWZpbGUuaW4gZ2VuZXJhdGlvbi4gIFRoaXMKICBzaG91bGQgbWFrZSBpdCBtb3JlIGNvbnNpc3RlbnQgd2l0aCB0aGUgR05VIHN0YW5kYXJkcy4KCiogVlBBVEggZnVuY3Rpb25hbGl0eSBoYXMgYmVlbiBjaGFuZ2VkIHRvIGluY29ycG9yYXRlIHRoZSBWUEFUSCsgcGF0Y2gsCiAgcHJldmlvdXNseSBtYWludGFpbmVkIGJ5IFBhdWwgU21pdGggPHBzbWl0aEBiYXluZXR3b3Jrcy5jb20+LiAgU2VlIHRoZQogIG1hbnVhbC4KCiogTWFrZSBkZWZpbmVzIGEgbmV3IHZhcmlhYmxlLCBgTUFLRUNNREdPQUxTJywgdG8gY29udGFpbiB0aGUgZ29hbHMgdGhhdAogIHdlcmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIGlmIGFueS4gIE1vZGlmeWluZyB0aGlzIHZhcmlhYmxlCiAgaGFzIG5vIGVmZmVjdCBvbiB0aGUgb3BlcmF0aW9uIG9mIG1ha2UuCgoqIEEgbmV3IGZ1bmN0aW9uLCBgJCh3b3JkbGlzdCBTLEUsVEVYVCknLCBpcyBhdmFpbGFibGU6IGl0IHJldHVybnMgYQogIGxpc3Qgb2Ygd29yZHMgZnJvbSBudW1iZXIgUyB0byBudW1iZXIgRSAoaW5jbHVzaXZlKSBvZiBURVhULgoKKiBJbnN0ZWFkIG9mIGFuIGVycm9yLCBkZXRlY3Rpb24gb2YgZnV0dXJlIG1vZGlmaWNhdGlvbiB0aW1lcyBnaXZlcyBhCiAgd2FybmluZyBhbmQgY29udGludWVzLiAgVGhlIHdhcm5pbmcgaXMgcmVwZWF0ZWQganVzdCBiZWZvcmUgR05VIG1ha2UKICBleGl0cywgc28gaXQgaXMgbGVzcyBsaWtlbHkgdG8gYmUgbG9zdC4KCiogRml4IHRoZSAkKGJhc2VuYW1lKSBhbmQgJChzdWZmaXgpIGZ1bmN0aW9ucyBzbyB0aGV5IG9ubHkgb3BlcmF0ZSBvbgogIHRoZSBsYXN0IGZpbGVuYW1lLCBub3QgdGhlIGVudGlyZSBzdHJpbmc6CgogICAgICBDb21tYW5kICAgICAgICAgICAgICBPbGQgUmVzdWx0ICAgICAgICAgICAgIE5ldyBSZXN1bHQKICAgICAgLS0tLS0tLSAgICAgICAgICAgICAgLS0tLS0tLS0tLSAgICAgICAgICAgICAtLS0tLS0tLS0tCiAgICAkKGJhc2VuYW1lIGEuYikgICAgICAgIGEgICAgICAgICAgICAgICAgICAgICAgYQogICAgJChiYXNlbmFtZSBhLmIvYykgICAgICBhICAgICAgICAgICAgICAgICAgICAgIGEuYi9jCiAgICAkKHN1ZmZpeCBhLmIpICAgICAgICAgIGIgICAgICAgICAgICAgICAgICAgICAgYgogICAgJChzdWZmaXggYS5iL2MpICAgICAgICBiL2MgICAgICAgICAgICAgICAgICAgIDxlbXB0eT4KCiogVGhlICQoc3RyaXApIGZ1bmN0aW9uIG5vdyByZW1vdmVzIG5ld2xpbmVzIGFzIHdlbGwgYXMgVEFCcyBhbmQgc3BhY2VzLgoKKiBUaGUgJChzaGVsbCkgZnVuY3Rpb24gbm93IGNoYW5nZXMgQ1JMRiAoXHJcbikgcGFpcnMgdG8gYSBzcGFjZSBhcyB3ZWxsCiAgYXMgbmV3bGluZXMgKFxuKS4KCiogVXBkYXRlcyB0byB0aGUgV2luZG93cyA5NS9OVCBwb3J0IGZyb20gUm9iIFR1bGxvaCAoc2VlIFJFQURNRS5XMzIpLgoKKiBFbGkgWmFyZXRza2lpIGhhcyB1cGRhdGVkIHRoZSBwb3J0IHRvIDMyLWJpdCBwcm90ZWN0ZWQgbW9kZSBvbiBNU0RPUwogIGFuZCBNUy1XaW5kb3dzLCBidWlsZGluZyB3aXRoIHRoZSBESkdQUCB2MiBwb3J0IG9mIEdOVSBDL0MrKyBjb21waWxlcgogIGFuZCB1dGlsaXRpZXMuICBTZWUgUkVBRE1FLkRPUyBmb3IgZGV0YWlscywgYW5kIGRpcmVjdCBhbGwgcXVlc3Rpb25zCiAgY29uY2VybmluZyB0aGlzIHBvcnQgdG8gRWxpIFphcmV0c2tpaSA8ZWxpekBpcy5lbHRhLmNvLmlsPiBvciBESgogIERlbG9yaWUgPGRqQGRlbG9yaWUuY29tPi4KCiogVk1TLXNwZWNpZmljIGNoYW5nZXM6CgogICogSm9obiBXLiBFYXRvbiBoYXMgdXBkYXRlZCB0aGUgVk1TIHBvcnQgdG8gc3VwcG9ydCBsaWJyYXJpZXMgYW5kIFZQQVRILgoKICAqIFRoZSBjZCBjb21tYW5kIGlzIHN1cHBvcnRlZCBpZiBpdCdzIGNhbGxlZCBhcyAkKENEKS4gVGhpcyBpbnZva2VzCiAgICB0aGUgJ2J1aWx0aW5fY2QnIGNvbW1hbmQgd2hpY2ggY2hhbmdlcyB0aGUgZGlyZWN0b3J5LgogICAgQ2FsbGluZyAnc2V0IGRlZicgZG9lc24ndCBkbyB0aGUgdHJpY2ssIHNpbmNlIGEgc3ViLXNoZWxsIGlzCiAgICBzcGF3bmVkIGZvciB0aGlzIGNvbW1hbmQsIHRoZSBkaXJlY3RvcnkgaXMgY2hhbmdlZCAqaW4gdGhpcyBzdWItc2hlbGwqCiAgICBhbmQgdGhlIHN1Yi1zaGVsbCBlbmRzLgoKICAqIExpYnJhcmllcyBhcmUgbm90IHN1cHBvcnRlZC4gVGhleSB3ZXJlIGluIEdOVSBNYWtlIDMuNjAgYnV0IHNvbWVob3cgSQogICAgZGlkbid0IGNhcmUgcG9ydGluZyB0aGUgY29kZS4gSWYgdGhlcmUgaXMgZW5vdWdoIGludGVyZXN0LCBJJ2xsIGRvIGl0IGF0CiAgICBzb21lIGxhdGVyIHRpbWUuCgogICogVGhlIHZhcmlhYmxlICReIHNlcGFyYXRlcyBmaWxlcyB3aXRoIGNvbW1hcyBpbnN0ZWFkIG9mIHNwYWNlcyAoSXQncyB0aGUKICAgIG5hdHVyYWwgdGhpbmcgdG8gZG8gZm9yIFZNUykuCgogICogU2VlIGRlZmF1bHRzLmMgZm9yIFZNUyBkZWZhdWx0IHN1ZmZpeGVzIGFuZCBteSBkZWZpbml0aW9ucyBmb3IgZGVmYXVsdAogICAgcnVsZXMgYW5kIHZhcmlhYmxlcy4KCiAgKiBUaGUgc2hlbGwgZnVuY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIHlldC4KCiAgKiBMb2FkIGF2ZXJhZ2Ugcm91dGluZXMgaGF2ZW4ndCBiZWVuIGltcGxlbWVudGVkIGZvciBWTVMgeWV0LgoKICAqIFRoZSBkZWZhdWx0IGluY2x1ZGUgZGlyZWN0b3J5IGZvciBpbmNsdWRpbmcgb3RoZXIgbWFrZWZpbGVzIGlzCiAgICBTWVMkU1lTUk9PVDpbU1lTTElCXSAoSSBkb24ndCByZW1lbWJlciB3aHkgSSBkaWRuJ3QganVzdCB1c2UKICAgIFNZUyRMSUJSQVJZOiBpbnN0ZWFkOyBtYXliZSBpdCB3b3VsZG4ndCB3b3JrIHRoYXQgd2F5KS4KCiAgKiBUaGUgZGVmYXVsdCBtYWtlZmlsZXMgbWFrZSBsb29rcyBmb3IgYXJlOiBtYWtlZmlsZS52bXMsIGdudW1ha2VmaWxlLAogICAgbWFrZWZpbGUuLCBhbmQgZ251bWFrZWZpbGUuIC4KCiAgKiBUaGUgc3RhdCgpIGZ1bmN0aW9uIGFuZCBoYW5kbGluZyBvZiB0aW1lIHN0YW1wcyBpbiBWTVMgaXMgYnJva2VuLCBzbyBJCiAgICByZXBsYWNlZCBpdCB3aXRoIGEgaGFjayBpbiB2bXNmdW5jdGlvbnMuYy4gSSB3aWxsIHByb3ZpZGUgYSBmdWxsIHJld3JpdGUKICAgIHNvbWV3aGVyZSBpbiB0aGUgZnV0dXJlLiBCZSB3YXJuZWQsIHRoZSB0aW1lIHJlc29sdXRpb24gaW5zaWRlIG1ha2UgaXMKICAgIGxlc3MgdGhhbiB3aGF0IHZtcyBwcm92aWRlcy4gVGhpcyBtaWdodCBiZSBhIHByb2JsZW0gb24gdGhlIGZhc3RlciBBbHBoYXMuCgogICogWW91IGNhbiB1c2UgYSA6IGluIGEgZmlsZW5hbWUgb25seSBpZiB5b3UgcHJlY2VkZSBpdCB3aXRoIGEgYmFja3NsYXNoICgnXCcpLgogICAgRS5nLi0gaG9iYmVzXDpbYm9nYXMuZmlsZXNdCgogICogTWFrZSBpZ25vcmVzIHN1Y2Nlc3MsIGluZm9ybWF0aW9uYWwsIG9yIHdhcm5pbmcgZXJyb3JzICgtUy0sIC1JLSwgb3IgLVctKS4KICAgIEJ1dCBpdCB3aWxsIHN0b3Agb24gLUUtIGFuZCAtRi0gZXJyb3JzLiAodW5sZXNzIHlvdSBkbyBzb21ldGhpbmcKICAgIHRvIG92ZXJyaWRlIHRoaXMgaW4geW91ciBtYWtlZmlsZSwgb3Igd2hhdGV2ZXIpLgoKICAqIFJlbW90ZSBzdHVmZiBpc24ndCBpbXBsZW1lbnRlZCB5ZXQuCgogICogTXVsdGlwbGUgbGluZSBEQ0wgY29tbWFuZHMsIHN1Y2ggYXMgImlmIiBzdGF0ZW1lbnRzLCBtdXN0IGJlIHB1dCBpbnNpZGUKICAgIGNvbW1hbmQgZmlsZXMuICBZb3UgY2FuIHJ1biBhIGNvbW1hbmQgZmlsZSBieSB1c2luZyBcQC4KClZlcnNpb24gMy43NSAoMjcgQXVnIDE5OTYpCgoqIFRoZSBkaXJlY3RvcnkgbWVzc2FnZXMgcHJpbnRlZCBieSBgLXcnIGFuZCBpbXBsaWNpdGx5IGluIHN1Yi1tYWtlcywKICBhcmUgbm93IG9taXR0ZWQgaWYgTWFrZSBydW5zIG5vIGNvbW1hbmRzIGFuZCBoYXMgbm8gb3RoZXIgbWVzc2FnZXMgdG8gcHJpbnQuCgoqIE1ha2Ugbm93IGRldGVjdHMgZmlsZXMgdGhhdCBmb3Igd2hhdGV2ZXIgcmVhc29uIGhhdmUgbW9kaWZpY2F0aW9uIHRpbWVzCiAgaW4gdGhlIGZ1dHVyZSBhbmQgZ2l2ZXMgYW4gZXJyb3IuICBGaWxlcyB3aXRoIHN1Y2ggaW1wb3NzaWJsZSB0aW1lc3RhbXBzCiAgY2FuIHJlc3VsdCBmcm9tIHVuc3luY2hyb25pemVkIGNsb2Nrcywgb3IgYXJjaGl2ZWQgZGlzdHJpYnV0aW9ucwogIGNvbnRhaW5pbmcgYm9ndXMgdGltZXN0YW1wczsgdGhleSBjb25mdXNlIE1ha2UncyBkZXBlbmRlbmN5IGVuZ2luZQogIHRob3JvdWdobHkuCgoqIFRoZSBuZXcgZGlyZWN0aXZlIGBzaW5jbHVkZScgaXMgbm93IHJlY29nbml6ZWQgYXMgYW5vdGhlciBuYW1lIGZvcgogIGAtaW5jbHVkZScsIGZvciBjb21wYXRpYmlsaXR5IHdpdGggc29tZSBvdGhlciBNYWtlcy4KCiogQWFyb24gRGlndWxsYSBoYXMgY29udHJpYnV0ZWQgYSBwb3J0IHRvIEFtaWdhRE9TLiAgU2VlIFJFQURNRS5BbWlnYSBmb3IKICBkZXRhaWxzLCBhbmQgZGlyZWN0IGFsbCBBbWlnYS1yZWxhdGVkIHF1ZXN0aW9ucyB0byA8ZGlndWxsYUBmaC1rb25zdGFuei5kZT4uCgoqIFJvYiBUdWxsb2ggb2YgVGl2b2xpIFN5c3RlbXMgaGFzIGNvbnRyaWJ1dGVkIGEgcG9ydCB0byBXaW5kb3dzIE5UIG9yIDk1LgogIFNlZSBSRUFETUUuVzMyIGZvciBkZXRhaWxzLCBhbmQgZGlyZWN0IGFsbCBXaW5kb3dzLXJlbGF0ZWQgcXVlc3Rpb25zIHRvCiAgPHJvYl90dWxsb2hAdGl2b2xpLmNvbT4uCgoqIFZNUy1zcGVjaWZpYyBjaGFuZ2VzOgoKICAqIExvdHMgb2YgZGVmYXVsdCBzZXR0aW5ncyBhcmUgYWRhcHRlZCBmb3IgVk1TLiBTZWUgZGVmYXVsdC5jLgoKICAqIExvbmcgY29tbWFuZCBsaW5lcyBhcmUgbm93IGNvbnZlcnRlZCB0byBjb21tYW5kIGZpbGVzLgoKICAqIENvbW1hICgnLCcpIGFzIGEgc2VwYXJhdG9yIGlzIG5vdyBhbGxvd2VkLiBTZWUgbWFrZWZpbGUudm1zIGZvciBhbiBleGFtcGxlLgoMClZlcnNpb24gMy43MyAoMDUgQXByIDE5OTUpCgoqIENvbnZlcnRlZCB0byB1c2UgQXV0b2NvbmYgdmVyc2lvbiAyLCBzbyBgY29uZmlndXJlJyBoYXMgc29tZSBuZXcgb3B0aW9ucy4KICBTZWUgSU5TVEFMTCBmb3IgZGV0YWlscy4KCiogWW91IGNhbiBub3cgc2VuZCBhIFNJR1VTUjEgc2lnbmFsIHRvIE1ha2UgdG8gdG9nZ2xlIHByaW50aW5nIG9mIGRlYnVnZ2luZwogIG91dHB1dCBlbmFibGVkIGJ5IC1kLCBhdCBhbnkgdGltZSBkdXJpbmcgdGhlIHJ1bi4KDApWZXJzaW9uIDMuNzIgKDA0IE5vdiAxOTk0KQoKKiBESiBEZWxvcmllIGhhcyBwb3J0ZWQgTWFrZSB0byBNUy1ET1MgdXNpbmcgdGhlIEdPMzIgZXh0ZW5kZXIuCiAgSGUgaXMgbWFpbnRhaW5pbmcgdGhlIERPUyBwb3J0LCBub3QgdGhlIEdOVSBNYWtlIG1haW50YWluZXI7CiAgcGxlYXNlIGRpcmVjdCBidWdzIGFuZCBxdWVzdGlvbnMgZm9yIERPUyB0byA8ZGpncHBAc3VuLnNvZS5jbGFya3Nvbi5lZHU+LgogIE1TLURPUyBiaW5hcmllcyBhcmUgYXZhaWxhYmxlIGZvciBGVFAgZnJvbSBmdHAuc2ltdGVsLm5ldCBpbgogIC9wdWIvc2ltdGVsbmV0L2dudS9kamdwcC8uCgoqIFRoZSBgTUFLRUZMQUdTJyB2YXJpYWJsZSAoaW4gdGhlIGVudmlyb25tZW50IG9yIGluIGEgbWFrZWZpbGUpIGNhbiBub3cKICBjb250YWluIHZhcmlhYmxlIGRlZmluaXRpb25zIGl0c2VsZjsgdGhlc2UgYXJlIHRyZWF0ZWQganVzdCBsaWtlCiAgY29tbWFuZCBsaW5lIHZhcmlhYmxlIGRlZmluaXRpb25zLiAgTWFrZSB3aWxsIGF1dG9tYXRpY2FsbHkgaW5zZXJ0IGFueQogIHZhcmlhYmxlIGRlZmluaXRpb25zIGZyb20gdGhlIGVudmlyb25tZW50IHZhbHVlIG9mIGBNQUtFRkxBR1MnIG9yIGZyb20KICB0aGUgY29tbWFuZCBsaW5lLCBpbnRvIHRoZSBgTUFLRUZMQUdTJyB2YWx1ZSBleHBvcnRlZCB0byBjaGlsZHJlbi4gIFRoZQogIGBNQUtFT1ZFUlJJREVTJyB2YXJpYWJsZSBwcmV2aW91c2x5IGluY2x1ZGVkIGluIHRoZSB2YWx1ZSBvZiBgJChNQUtFKScKICBmb3Igc3ViLW1ha2VzIGlzIG5vdyBpbmNsdWRlZCBpbiBgTUFLRUZMQUdTJyBpbnN0ZWFkLiAgQXMgYmVmb3JlLCB5b3UgY2FuCiAgcmVzZXQgYE1BS0VPVkVSUklERVMnIGluIHlvdXIgbWFrZWZpbGUgdG8gYXZvaWQgcHV0dGluZyBhbGwgdGhlIHZhcmlhYmxlcwogIGluIHRoZSBlbnZpcm9ubWVudCB3aGVuIGl0cyBzaXplIGlzIGxpbWl0ZWQuCgoqIElmIGAuREVMRVRFX09OX0VSUk9SJyBhcHBlYXJzIGFzIGEgdGFyZ2V0LCBNYWtlIHdpbGwgZGVsZXRlIHRoZSB0YXJnZXQgb2YKICBhIHJ1bGUgaWYgaXQgaGFzIGNoYW5nZWQgd2hlbiBpdHMgcmVjaXBlIGV4aXRzIHdpdGggYSBub256ZXJvIHN0YXR1cywKICBqdXN0IGFzIHdoZW4gdGhlIHJlY2lwZSBnZXRzIGEgc2lnbmFsLgoKKiBUaGUgYXV0b21hdGljIHZhcmlhYmxlIGAkKycgaXMgbmV3LiAgSXQgbGlzdHMgYWxsIHRoZSBkZXBlbmRlbmNpZXMgbGlrZQogIGAkXicsIGJ1dCBwcmVzZXJ2ZXMgZHVwbGljYXRlcyBsaXN0ZWQgaW4gdGhlIG1ha2VmaWxlLiAgVGhpcyBpcyB1c2VmdWwKICBmb3IgbGlua2luZyBydWxlcywgd2hlcmUgbGlicmFyeSBmaWxlcyBzb21ldGltZXMgbmVlZCB0byBiZSBsaXN0ZWQgdHdpY2UKICBpbiB0aGUgbGluayBvcmRlci4KCiogWW91IGNhbiBub3cgc3BlY2lmeSB0aGUgYC5JR05PUkUnIGFuZCBgLlNJTEVOVCcgc3BlY2lhbCB0YXJnZXRzIHdpdGgKICBkZXBlbmRlbmNpZXMgdG8gbGltaXQgdGhlaXIgZWZmZWN0cyB0byB0aG9zZSBmaWxlcy4gIElmIGEgZmlsZSBhcHBlYXJzIGFzCiAgYSBkZXBlbmRlbmN5IG9mIGAuSUdOT1JFJywgdGhlbiBlcnJvcnMgd2lsbCBiZSBpZ25vcmVkIHdoaWxlIHJ1bm5pbmcgdGhlCiAgcmVjaXBlIHRvIHVwZGF0ZSB0aGF0IGZpbGUuICBMaWtld2lzZSBpZiBhIGZpbGUgYXBwZWFycyBhcyBhIGRlcGVuZGVuY3kKICBvZiBgLlNJTEVOVCcsIHRoZW4gdGhlIHJlY2lwZSB0byB1cGRhdGUgdGhhdCBmaWxlIHdpbGwgbm90IGJlIHByaW50ZWQKICBiZWZvcmUgaXQgaXMgcnVuLiAgKFRoaXMgY2hhbmdlIHdhcyBtYWRlIHRvIGNvbmZvcm0gdG8gUE9TSVguMi4pCgwKVmVyc2lvbiAzLjcxICgyMSBNYXkgMTk5NCkKCiogVGhlIGF1dG9tYXRpYyB2YXJpYWJsZXMgYCQoQEQpJywgYCQoJUQpJywgYCQoKkQpJywgYCQoPEQpJywgYCQoP0QpJywgYW5kCiAgYCQoXkQpJyBub3cgb21pdCB0aGUgdHJhaWxpbmcgc2xhc2ggZnJvbSB0aGUgZGlyZWN0b3J5IG5hbWUuICAoVGhpcyBjaGFuZ2UKICB3YXMgbWFkZSB0byBjb21wbHkgd2l0aCBQT1NJWC4yLikKCiogVGhlIHNvdXJjZSBkaXN0cmlidXRpb24gbm93IGluY2x1ZGVzIHRoZSBJbmZvIGZpbGVzIGZvciB0aGUgTWFrZSBtYW51YWwuCiAgVGhlcmUgaXMgbm8gbG9uZ2VyIGEgc2VwYXJhdGUgZGlzdHJpYnV0aW9uIGNvbnRhaW5pbmcgSW5mbyBhbmQgRFZJIGZpbGVzLgoKKiBZb3UgY2FuIG5vdyBzZXQgdGhlIHZhcmlhYmxlcyBgYmlucHJlZml4JyBhbmQvb3IgYG1hbnByZWZpeCcgaW4KICBNYWtlZmlsZS5pbiAob3Igb24gdGhlIGNvbW1hbmQgbGluZSB3aGVuIGluc3RhbGxpbmcpIHRvIGluc3RhbGwgR05VIG1ha2UKICB1bmRlciBhIG5hbWUgb3RoZXIgdGhhbiBgbWFrZScgKGkuZS4sIGBgbWFrZSBiaW5wcmVmaXg9ZyBpbnN0YWxsJycKICBpbnN0YWxscyBHTlUgbWFrZSBhcyBgZ21ha2UnKS4KCiogVGhlIGJ1aWx0LWluIFRleGluZm8gcnVsZXMgdXNlIHRoZSBuZXcgdmFyaWFibGVzIGBURVhJMkRWSV9GTEFHUycgZm9yCiAgZmxhZ3MgdG8gdGhlIGB0ZXhpMmR2aScgc2NyaXB0LCBhbmQgYE1BS0VJTkZPX0ZMQUdTJyBmb3IgZmxhZ3MgdG8gdGhlCiAgTWFrZWluZm8gcHJvZ3JhbS4KCiogVGhlIGV4aXQgc3RhdHVzIG9mIE1ha2Ugd2hlbiBpdCBydW5zIGludG8gZXJyb3JzIGlzIG5vdyAyIGluc3RlYWQgb2YgMS4KICBUaGUgZXhpdCBzdGF0dXMgaXMgMSBvbmx5IHdoZW4gdXNpbmcgLXEgYW5kIHNvbWUgdGFyZ2V0IGlzIG5vdCB1cCB0byBkYXRlLgogIChUaGlzIGNoYW5nZSB3YXMgbWFkZSB0byBjb21wbHkgd2l0aCBQT1NJWC4yLikKDApWZXJzaW9uIDMuNzAgKDAzIEphbiAxOTk0KQoKKiBJdCBpcyBubyBsb25nZXIgYSBmYXRhbCBlcnJvciB0byBoYXZlIGEgTlVMIGNoYXJhY3RlciBpbiBhIG1ha2VmaWxlLgogIFlvdSBzaG91bGQgbmV2ZXIgcHV0IGEgTlVMIGluIGEgbWFrZWZpbGUgYmVjYXVzZSBpdCBjYW4gaGF2ZSBzdHJhbmdlCiAgcmVzdWx0cywgYnV0IG90aGVyd2lzZSBlbXB0eSBsaW5lcyBmdWxsIG9mIE5VTHMgKHN1Y2ggYXMgcHJvZHVjZWQgYnkKICB0aGUgYHhta21mJyBwcm9ncmFtKSB3aWxsIGFsd2F5cyB3b3JrIGZpbmUuCgoqIFRoZSBlcnJvciBtZXNzYWdlcyBmb3Igbm9uZXhpc3RlbnQgaW5jbHVkZWQgbWFrZWZpbGVzIG5vdyByZWZlciB0byB0aGUKICBtYWtlZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciB3aGVyZSB0aGUgYGluY2x1ZGUnIGFwcGVhcmVkLCBzbyBFbWFjcydzCiAgQy14IGAgY29tbWFuZCB0YWtlcyB5b3UgdGhlcmUgKGluIGNhc2UgaXQncyBhIHR5cG8geW91IG5lZWQgdG8gZml4KS4KDApWZXJzaW9uIDMuNjkgKDA3IE5vdiAxOTkzKQoKKiBJbXBsaWNpdCBydWxlIHNlYXJjaCBmb3IgYXJjaGl2ZSBtZW1iZXIgcmVmZXJlbmNlcyBpcyBub3cgZG9uZSBpbiB0aGUKICBvcHBvc2l0ZSBvcmRlciBmcm9tIHByZXZpb3VzIHZlcnNpb25zOiB0aGUgd2hvbGUgdGFyZ2V0IG5hbWUgYExJQihNRU0pJwogIGZpcnN0LCBhbmQganVzdCB0aGUgbWVtYmVyIG5hbWUgYW5kIHBhcmVudGhlc2VzIGAoTUVNKScgc2Vjb25kLgoKKiBNYWtlIG5vdyBnaXZlcyBhbiBlcnJvciBmb3IgYW4gdW50ZXJtaW5hdGVkIHZhcmlhYmxlIG9yIGZ1bmN0aW9uIHJlZmVyZW5jZS4KICBGb3IgZXhhbXBsZSwgYCQoZm9vJyB3aXRoIG5vIG1hdGNoaW5nIGApJyBvciBgJHtiYXInIHdpdGggbm8gbWF0Y2hpbmcgYH0nLgoKKiBUaGUgbmV3IGRlZmF1bHQgdmFyaWFibGUgYE1BS0VfVkVSU0lPTicgZ2l2ZXMgdGhlIHZlcnNpb24gbnVtYmVyIG9mCiAgTWFrZSwgYW5kIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHJlbW90ZSBqb2Igc3VwcG9ydCBjb21waWxlZCBpbiAoaWYgYW55KS4KICBUaHVzIHRoZSB2YWx1ZSAoaW4gdGhpcyByZWxlYXNlKSBpcyBzb21ldGhpbmcgbGlrZSBgMy42OScgb3IgYDMuNjktQ3VzdG9tcycuCgoqIENvbW1hbmRzIGluIGFuIGludm9jYXRpb24gb2YgdGhlIGBzaGVsbCcgZnVuY3Rpb24gYXJlIG5vIGxvbmdlciBydW4KICB3aXRoIGEgbW9kaWZpZWQgZW52aXJvbm1lbnQgbGlrZSByZWNpcGVzIGFyZS4gIEFzIGluIHZlcnNpb25zIGJlZm9yZQogIDMuNjgsIHRoZXkgbm93IHJ1biB3aXRoIHRoZSBlbnZpcm9ubWVudCB0aGF0IGBtYWtlJyBzdGFydGVkIHdpdGguICBXZQogIGhhdmUgcmV2ZXJzZWQgdGhlIGNoYW5nZSBtYWRlIGluIHZlcnNpb24gMy42OCBiZWNhdXNlIGl0IHR1cm5lZCBvdXQgdG8KICBjYXVzZSBhIHBhcmFkb3hpY2FsIHNpdHVhdGlvbiBpbiBjYXNlcyBsaWtlOgoKICAgICAgICBleHBvcnQgdmFyaWFibGUgPSAkKHNoZWxsIGVjaG8gdmFsdWUpCgogIFdoZW4gTWFrZSBhdHRlbXB0ZWQgdG8gcHV0IHRoaXMgdmFyaWFibGUgaW4gdGhlIGVudmlyb25tZW50IGZvciBhCiAgcmVjaXBlLCBpdCB3b3VsZCB0cnkgZXhwYW5kIHRoZSB2YWx1ZSBieSBydW5uaW5nIHRoZSBzaGVsbCBjb21tYW5kCiAgYGVjaG8gdmFsdWUnLiAgSW4gdmVyc2lvbiAzLjY4LCBiZWNhdXNlIGl0IGNvbnN0cnVjdGVkIGFuIGVudmlyb25tZW50CiAgZm9yIHRoYXQgc2hlbGwgY29tbWFuZCBpbiB0aGUgc2FtZSB3YXksIE1ha2Ugd291bGQgYmVnaW4gdG8gZ28gaW50byBhbgogIGluZmluaXRlIGxvb3AgYW5kIHRoZW4gZ2V0IGEgZmF0YWwgZXJyb3Igd2hlbiBpdCBkZXRlY3RlZCB0aGUgbG9vcC4KCiogVGhlIHJlY2lwZSBnaXZlbiBmb3IgYC5ERUZBVUxUJyBpcyBub3cgdXNlZCBmb3IgcGhvbnkgdGFyZ2V0cyB3aXRoIG5vCiAgcmVjaXBlLgoMClZlcnNpb24gMy42OCAoMjggSnVsIDE5OTMpCgoqIFlvdSBjYW4gbGlzdCBzZXZlcmFsIGFyY2hpdmUgbWVtYmVyIG5hbWVzIGluc2lkZSBwYXJlbnRoZXNpczoKICBgbGliKG1lbTEgbWVtMiBtZW0zKScgaXMgZXF1aXZhbGVudCB0byBgbGliKG1lbTEpIGxpYihtZW0yKSBsaWIobWVtMyknLgoKKiBZb3UgY2FuIHVzZSB3aWxkY2FyZHMgaW5zaWRlIGFyY2hpdmUgbWVtYmVyIHJlZmVyZW5jZXMuICBGb3IgZXhhbXBsZSwKICBgbGliKCoubyknIGV4cGFuZHMgdG8gYWxsIGV4aXN0aW5nIG1lbWJlcnMgb2YgYGxpYicgd2hvc2UgbmFtZXMgZW5kIGluCiAgYC5vJyAoZS5nLiBgbGliKGEubykgbGliKGIubyknKTsgYCouYSgqLm8pJyBleHBhbmRzIHRvIGFsbCBzdWNoIG1lbWJlcnMKICBvZiBhbGwgZXhpc3RpbmcgZmlsZXMgd2hvc2UgbmFtZXMgZW5kIGluIGAuYScgKGUuZy4gYGZvby5hKGEubykKICBmb28uYShiLm8pIGJhci5hKGMubykgYmFyLmEoZC5vKScuCgoqIEEgc3VmZml4IHJ1bGUgYC5YLmEnIG5vdyBwcm9kdWNlcyB0d28gcGF0dGVybiBydWxlczoKICAgICAgICAoJS5vKTogJS5YCSMgUHJldmlvdXMgdmVyc2lvbnMgcHJvZHVjZWQgb25seSB0aGlzLgogICAgICAgICUuYTogJS5YCSMgTm93IHByb2R1Y2VzIHRoaXMgYXMgd2VsbCwganVzdCBsaWtlIG90aGVyIHN1ZmZpeGVzLgoKKiBUaGUgbmV3IGZsYWcgYC0td2Fybi11bmRlZmluZWQtdmFyaWFibGVzJyBzYXlzIHRvIGlzc3VlIGEgd2FybmluZyBtZXNzYWdlCiAgd2hlbmV2ZXIgTWFrZSBleHBhbmRzIGEgcmVmZXJlbmNlIHRvIGFuIHVuZGVmaW5lZCB2YXJpYWJsZS4KCiogVGhlIG5ldyBgLWluY2x1ZGUnIGRpcmVjdGl2ZSBpcyBqdXN0IGxpa2UgYGluY2x1ZGUnIGV4Y2VwdCB0aGF0IHRoZXJlIGlzCiAgbm8gZXJyb3IgKG5vdCBldmVuIGEgd2FybmluZykgZm9yIGEgbm9uZXhpc3RlbnQgbWFrZWZpbGUuCgoqIENvbW1hbmRzIGluIGFuIGludm9jYXRpb24gb2YgdGhlIGBzaGVsbCcgZnVuY3Rpb24gYXJlIG5vdyBydW4gd2l0aCBhCiAgbW9kaWZpZWQgZW52aXJvbm1lbnQgbGlrZSByZWNpcGVzIGFyZSwgc28geW91IGNhbiB1c2UgYGV4cG9ydCcgZXQgYWwKICB0byBzZXQgdXAgdmFyaWFibGVzIGZvciB0aGVtLiAgVGhleSB1c2VkIHRvIHJ1biB3aXRoIHRoZSBlbnZpcm9ubWVudAogIHRoYXQgYG1ha2UnIHN0YXJ0ZWQgd2l0aC4KDApWZXJzaW9uIDMuNjYgKDIxIE1heSAxOTkzKQoKKiBgbWFrZSAtLXZlcnNpb24nIChvciBgbWFrZSAtdicpIG5vdyBleGl0cyBpbW1lZGlhdGVseSBhZnRlciBwcmludGluZwogIHRoZSB2ZXJzaW9uIG51bWJlci4KDApWZXJzaW9uIDMuNjUgKDA5IE1heSAxOTkzKQoKKiBNYWtlIG5vdyBzdXBwb3J0cyBsb25nLW5hbWVkIG1lbWJlcnMgaW4gYGFyJyBhcmNoaXZlIGZpbGVzLgoMClZlcnNpb24gMy42NCAoMjEgQXByIDE5OTMpCgoqIE1ha2Ugbm93IHN1cHBvcnRzIHRoZSBgKz0nIHN5bnRheCBmb3IgYSB2YXJpYWJsZSBkZWZpbml0aW9uIHdoaWNoIGFwcGVuZHMKICB0byB0aGUgdmFyaWFibGUncyBwcmV2aW91cyB2YWx1ZS4gIFNlZSB0aGUgc2VjdGlvbiBgQXBwZW5kaW5nIE1vcmUgVGV4dAogIHRvIFZhcmlhYmxlcycgaW4gdGhlIG1hbnVhbCBmb3IgZnVsbCBkZXRhaWxzLgoKKiBUaGUgbmV3IG9wdGlvbiBgLS1uby1wcmludC1kaXJlY3RvcnknIGluaGliaXRzIHRoZSBgLXcnIG9yCiAgYC0tcHJpbnQtZGlyZWN0b3J5JyBmZWF0dXJlLiAgTWFrZSB0dXJucyBvbiBgLS1wcmludC1kaXJlY3RvcnknCiAgYXV0b21hdGljYWxseSBpZiB5b3UgdXNlIGAtQycgb3IgYC0tZGlyZWN0b3J5JywgYW5kIGluIHN1Yi1tYWtlczsgc29tZQogIHVzZXJzIGhhdmUgZm91bmQgdGhpcyBiZWhhdmlvciB1bmRlc2lyYWJsZS4KCiogVGhlIGJ1aWx0LWluIGltcGxpY2l0IHJ1bGVzIG5vdyBzdXBwb3J0IHRoZSBhbHRlcm5hdGl2ZSBleHRlbnNpb24KICBgLnR4aW5mbycgZm9yIFRleGluZm8gZmlsZXMsIGp1c3QgbGlrZSBgLnRleGluZm8nIGFuZCBgLnRleGknLgoMClZlcnNpb24gMy42MyAoMjIgSmFuIDE5OTMpCgoqIE1ha2Ugbm93IHVzZXMgYSBzdGFuZGFyZCBHTlUgYGNvbmZpZ3VyZScgc2NyaXB0LiAgU2VlIHRoZSBuZXcgZmlsZQogIElOU1RBTEwgZm9yIHRoZSBuZXcgKGFuZCBtdWNoIHNpbXBsZXIpIGluc3RhbGxhdGlvbiBwcm9jZWR1cmUuCgoqIFRoZXJlIGlzIG5vdyBhIHNoZWxsIHNjcmlwdCB0byBidWlsZCBNYWtlIHRoZSBmaXJzdCB0aW1lLCBpZiB5b3UgaGF2ZSBubwogIG90aGVyIGBtYWtlJyBwcm9ncmFtLiAgYGJ1aWxkLnNoJyBpcyBjcmVhdGVkIGJ5IGBjb25maWd1cmUnOyBzZWUgUkVBRE1FLgoKKiBHTlUgTWFrZSBub3cgY29tcGxldGVseSBjb25mb3JtcyB0byB0aGUgUE9TSVguMiBzcGVjaWZpY2F0aW9uIGZvciBgbWFrZScuCgoqIEVsZW1lbnRzIG9mIHRoZSBgJF4nIGFuZCBgJD8nIGF1dG9tYXRpYyB2YXJpYWJsZXMgdGhhdCBhcmUgYXJjaGl2ZQogIG1lbWJlciByZWZlcmVuY2VzIG5vdyBsaXN0IG9ubHkgdGhlIG1lbWJlciBuYW1lLCBhcyBpbiBVbml4IGFuZCBQT1NJWC4yLgoKKiBZb3Ugc2hvdWxkIG5vIGxvbmdlciBldmVyIG5lZWQgdG8gc3BlY2lmeSB0aGUgYC13JyBzd2l0Y2gsIHdoaWNoIHByaW50cwogIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBiZWZvcmUgYW5kIGFmdGVyIE1ha2UgcnVucy4gIFRoZSBgLUMnIHN3aXRjaCB0bwogIGNoYW5nZSBkaXJlY3RvcnksIGFuZCByZWN1cnNpdmUgdXNlIG9mIE1ha2UsIG5vdyBzZXQgYC13JyBhdXRvbWF0aWNhbGx5LgoKKiBNdWx0aXBsZSBkb3VibGUtY29sb24gcnVsZXMgZm9yIHRoZSBzYW1lIHRhcmdldCB3aWxsIG5vIGxvbmdlciBoYXZlIHRoZWlyCiAgcmVjaXBlcyBydW4gc2ltdWx0YW5lb3VzbHkgdW5kZXIgLWosIGFzIHRoaXMgY291bGQgcmVzdWx0IGluIHRoZSB0d28KICByZWNpcGVzIHRyeWluZyB0byBjaGFuZ2UgdGhlIGZpbGUgYXQgdGhlIHNhbWUgdGltZSBhbmQgaW50ZXJmZXJpbmcgd2l0aAogIG9uZSBhbm90aGVyLgoKKiBUaGUgYFNIRUxMJyB2YXJpYWJsZSBpcyBub3cgbmV2ZXIgdGFrZW4gZnJvbSB0aGUgZW52aXJvbm1lbnQuCiAgRWFjaCBtYWtlZmlsZSB0aGF0IHdhbnRzIGEgc2hlbGwgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCAoL2Jpbi9zaCkgbXVzdAogIHNldCBTSEVMTCBpdHNlbGYuICBTSEVMTCBpcyBhbHdheXMgZXhwb3J0ZWQgdG8gY2hpbGQgcHJvY2Vzc2VzLgogIFRoaXMgY2hhbmdlIHdhcyBtYWRlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggUE9TSVguMi4KCiogTWFrZSBub3cgYWNjZXB0cyBsb25nIG9wdGlvbnMuICBUaGVyZSBpcyBub3cgYW4gaW5mb3JtYXRpdmUgdXNhZ2UgbWVzc2FnZQogIHRoYXQgdGVsbHMgeW91IHdoYXQgYWxsIHRoZSBvcHRpb25zIGFyZSBhbmQgd2hhdCB0aGV5IGRvLiAgVHJ5IGBtYWtlIC0taGVscCcuCgoqIFRoZXJlIGFyZSB0d28gbmV3IGRpcmVjdGl2ZXM6IGBleHBvcnQnIGFuZCBgdW5leHBvcnQnLiAgQWxsIHZhcmlhYmxlcyBhcmUKICBubyBsb25nZXIgYXV0b21hdGljYWxseSBwdXQgaW50byB0aGUgZW52aXJvbm1lbnRzIG9mIHRoZSByZWNpcGUgbGluZXMgdGhhdAogIE1ha2UgcnVucy4gIEluc3RlYWQsIG9ubHkgdmFyaWFibGVzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIG9yIGluCiAgdGhlIGVudmlyb25tZW50IGFyZSBleHBvcnRlZCBieSBkZWZhdWx0LiAgVG8gZXhwb3J0IG90aGVycywgdXNlOgogICAgICAgIGV4cG9ydCBWQVJJQUJMRQogIG9yIHlvdSBjYW4gZGVmaW5lIHZhcmlhYmxlcyB3aXRoOgogICAgICAgIGV4cG9ydCBWQVJJQUJMRSA9IFZBTFVFCiAgb3I6CiAgICAgICAgZXhwb3J0IFZBUklBQkxFIDo9IFZBTFVFCiAgWW91IGNhbiB1c2UganVzdDoKICAgICAgICBleHBvcnQKICBvcjoKICAgICAgICAuRVhQT1JUX0FMTF9WQVJJQUJMRVM6CiAgdG8gZ2V0IHRoZSBvbGQgYmVoYXZpb3IuICBTZWUgdGhlIG5vZGUgYFZhcmlhYmxlcy9SZWN1cnNpb24nIGluIHRoZSBtYW51YWwKICBmb3IgYSBmdWxsIGRlc2NyaXB0aW9uLgoKKiBUaGUgcmVjaXBlIGZyb20gdGhlIGAuREVGQVVMVCcgc3BlY2lhbCB0YXJnZXQgaXMgb25seSBhcHBsaWVkIHRvCiAgdGFyZ2V0cyB3aGljaCBoYXZlIG5vIHJ1bGVzIGF0IGFsbCwgbm90IGFsbCB0YXJnZXRzIHdpdGggbm8gcmVjaXBlLgogIFRoaXMgY2hhbmdlIHdhcyBtYWRlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggVW5peCBtYWtlLgoKKiBBbGwgZmF0YWwgZXJyb3IgbWVzc2FnZXMgbm93IGNvbnRhaW4gYCoqKicsIHNvIHRoZXkgYXJlIGVhc3kgdG8gZmluZCBpbgogIGNvbXBpbGF0aW9uIGxvZ3MuCgoqIERlcGVuZGVuY3kgZmlsZSBuYW1lcyBsaWtlIGAtbE5BTUUnIGFyZSBub3cgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsIGZpbGUKICBuYW1lIGZvdW5kLCBhcyB3aXRoIGZpbGVzIGZvdW5kIGJ5IG5vcm1hbCBkaXJlY3Rvcnkgc2VhcmNoIChWUEFUSCkuCiAgVGhlIGxpYnJhcnkgZmlsZSBgbGliTkFNRS5hJyBtYXkgbm93IGJlIGZvdW5kIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwKICB3aGljaCBpcyBjaGVja2VkIGJlZm9yZSBWUEFUSDsgdGhlIHN0YW5kYXJkIHNldCBvZiBkaXJlY3RvcmllcyAoL2xpYiwKICAvdXNyL2xpYiwgL3Vzci9sb2NhbC9saWIpIGlzIG5vdyBjaGVja2VkIGxhc3QuCiAgU2VlIHRoZSBub2RlIGBMaWJyYXJpZXMvU2VhcmNoJyBpbiB0aGUgbWFudWFsIGZvciBmdWxsIGRldGFpbHMuCgoqIEEgc2luZ2xlIGBpbmNsdWRlJyBkaXJlY3RpdmUgY2FuIG5vdyBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgbWFrZWZpbGUgdG8KICBpbmNsdWRlLCBsaWtlIHRoaXM6CiAgICAgICAgaW5jbHVkZSBmaWxlMSBmaWxlMgogIFlvdSBjYW4gYWxzbyB1c2Ugc2hlbGwgZmlsZSBuYW1lIHBhdHRlcm5zIGluIGFuIGBpbmNsdWRlJyBkaXJlY3RpdmU6CiAgICAgICAgaW5jbHVkZSAqLm1rCgoqIFRoZSBkZWZhdWx0IGRpcmVjdG9yaWVzIHRvIHNlYXJjaCBmb3IgaW5jbHVkZWQgbWFrZWZpbGVzLCBhbmQgZm9yCiAgbGlicmFyaWVzIHNwZWNpZmllZCB3aXRoIGAtbE5BTUUnLCBhcmUgbm93IHNldCBieSBjb25maWd1cmF0aW9uLgoKKiBZb3UgY2FuIG5vdyB1c2UgYmxhbmtzIGFzIHdlbGwgYXMgY29sb25zIHRvIHNlcGFyYXRlIHRoZSBkaXJlY3RvcmllcyBpbiBhCiAgc2VhcmNoIHBhdGggZm9yIHRoZSBgdnBhdGgnIGRpcmVjdGl2ZSBvciB0aGUgYFZQQVRIJyB2YXJpYWJsZS4KCiogWW91IGNhbiBub3cgdXNlIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIGluIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiBhCiAgdmFyaWFibGUgYXNzaWdubWVudCwgYXMgaW4gIiQoZm9vKWJhciA9IHZhbHVlIi4KCiogVGhlIGBNQUtFJyB2YXJpYWJsZSBpcyBhbHdheXMgZGVmaW5lZCBhcyBgJChNQUtFX0NPTU1BTkQpICQoTUFLRU9WRVJSSURFUyknLgogIFRoZSBgTUFLRV9DT01NQU5EJyB2YXJpYWJsZSBpcyBub3cgZGVmaW5lZCB0byB0aGUgbmFtZSB3aXRoIHdoaWNoIG1ha2UKICB3YXMgaW52b2tlZC4KCiogVGhlIGJ1aWx0LWluIHJ1bGVzIGZvciBDKysgY29tcGlsYXRpb24gbm93IHVzZSB0aGUgdmFyaWFibGVzIGAkKENYWCknIGFuZAogIGAkKENYWEZMQUdTKScgaW5zdGVhZCBvZiBgJChDKyspJyBhbmQgYCQoQysrRkxBR1MpJy4gIFRoZSBvbGQgbmFtZXMgaGFkCiAgcHJvYmxlbXMgd2l0aCBzaGVsbHMgdGhhdCBjYW5ub3QgaGF2ZSBgKycgaW4gZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZXMuCgoqIFRoZSB2YWx1ZSBvZiBhIHJlY3Vyc2l2ZWx5IGV4cGFuZGVkIHZhcmlhYmxlIGlzIG5vdyBleHBhbmRlZCB3aGVuIHB1dHRpbmcKICBpdCBpbnRvIHRoZSBlbnZpcm9ubWVudCBmb3IgY2hpbGQgcHJvY2Vzc2VzLiAgVGhpcyBjaGFuZ2Ugd2FzIG1hZGUgZm9yCiAgY29tcGF0aWJpbGl0eSB3aXRoIFVuaXggbWFrZS4KCiogQSBydWxlIHdpdGggbm8gdGFyZ2V0cyBiZWZvcmUgdGhlIGA6JyBpcyBub3cgYWNjZXB0ZWQgYW5kIGlnbm9yZWQuCiAgVGhpcyBjaGFuZ2Ugd2FzIG1hZGUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBTdW5PUyA0IG1ha2UuCiAgV2UgZG8gbm90IHJlY29tbWVuZCB0aGF0IHlvdSB3cml0ZSB5b3VyIG1ha2VmaWxlcyB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGlzLgoKKiBUaGUgYC1JJyBzd2l0Y2ggY2FuIG5vdyBiZSB1c2VkIGluIE1BS0VGTEFHUywgYW5kIGFyZSBwdXQgdGhlcmUKICBhdXRvbWF0aWNhbGx5IGp1c3QgbGlrZSBvdGhlciBzd2l0Y2hlcy4KDApWZXJzaW9uIDMuNjEKCiogQnVpbHQtaW4gcnVsZXMgZm9yIEMrKyBzb3VyY2UgZmlsZXMgd2l0aCB0aGUgYC5DJyBzdWZmaXguCiAgV2Ugc3RpbGwgcmVjb21tZW5kIHRoYXQgeW91IHVzZSBgLmNjJyBpbnN0ZWFkLgoKKiBJZiBhIHJlY2lwZSBpcyBnaXZlbiB0b28gbWFueSB0aW1lcyBmb3IgYSBzaW5nbGUgdGFyZ2V0LCB0aGUgbGFzdCBvbmUKICBnaXZlbiBpcyB1c2VkLCBhbmQgYSB3YXJuaW5nIG1lc3NhZ2UgaXMgcHJpbnRlZC4KCiogRXJyb3IgbWVzc2FnZXMgYWJvdXQgbWFrZWZpbGVzIGFyZSBpbiBzdGFuZGFyZCBHTlUgZXJyb3IgZm9ybWF0LAogIHNvIEMteCBgIGluIEVtYWNzIHdvcmtzIG9uIHRoZW0uCgoqIERlcGVuZGVuY2llcyBvZiBwYXR0ZXJuIHJ1bGVzIHdoaWNoIGNvbnRhaW4gbm8gJSBuZWVkIG5vdCBhY3R1YWxseSBleGlzdAogIGlmIHRoZXkgY2FuIGJlIGNyZWF0ZWQgKGp1c3QgbGlrZSBkZXBlbmRlbmNpZXMgd2hpY2ggZG8gaGF2ZSBhICUpLgoMClZlcnNpb24gMy42MAoKKiBBIG1lc3NhZ2UgaXMgYWx3YXlzIHByaW50ZWQgd2hlbiBNYWtlIGRlY2lkZXMgdGhlcmUgaXMgbm90aGluZyB0byBiZSBkb25lLgogIEl0IHVzZWQgdG8gYmUgdGhhdCBubyBtZXNzYWdlIHdhcyBwcmludGVkIGZvciB0b3AtbGV2ZWwgcGhvbnkgdGFyZ2V0cwogIChiZWNhdXNlICJgcGhvbnknIGlzIHVwIHRvIGRhdGUiIGlzbid0IHF1aXRlIHJpZ2h0KS4gIE5vdyBhIGRpZmZlcmVudAogIG1lc3NhZ2UgIk5vdGhpbmcgdG8gYmUgZG9uZSBmb3IgYHBob255JyIgaXMgcHJpbnRlZCBpbiB0aGF0IGNhc2UuCgoqIEFyY2hpdmVzIG9uIEFJWCBub3cgc3VwcG9zZWRseSB3b3JrLgoKKiBXaGVuIHRoZSByZWNpcGVzIHNwZWNpZmllZCBmb3IgLkRFRkFVTFQgYXJlIHVzZWQgdG8gdXBkYXRlIGEgdGFyZ2V0LAogIHRoZSAkPCBhdXRvbWF0aWMgdmFyaWFibGUgaXMgZ2l2ZW4gdGhlIHNhbWUgdmFsdWUgYXMgJEAgZm9yIHRoYXQgdGFyZ2V0LgogIFRoaXMgaXMgaG93IFVuaXggbWFrZSBiZWhhdmVzLCBhbmQgdGhpcyBiZWhhdmlvciBpcyBtYW5kYXRlZCBieSBQT1NJWC4yLgoMClZlcnNpb24gMy41OQoKKiBUaGUgLW4sIC1xLCBhbmQgLXQgb3B0aW9ucyBhcmUgbm90IHB1dCBpbiB0aGUgYE1BS0VGTEFHUycgYW5kIGBNRkxBRycKICB2YXJpYWJsZXMgd2hpbGUgcmVtYWtpbmcgbWFrZWZpbGVzLCBzbyByZWN1cnNpdmUgbWFrZXMgZG9uZSB3aGlsZSByZW1ha2luZwogIG1ha2VmaWxlcyB3aWxsIGJlaGF2ZSBwcm9wZXJseS4KCiogSWYgdGhlIHNwZWNpYWwgdGFyZ2V0IGAuTk9FWFBPUlQnIGlzIHNwZWNpZmllZCBpbiBhIG1ha2VmaWxlLAogIG9ubHkgdmFyaWFibGVzIHRoYXQgY2FtZSBmcm9tIHRoZSBlbnZpcm9ubWVudCBhbmQgdmFyaWFibGVzCiAgZGVmaW5lZCBvbiB0aGUgY29tbWFuZCBsaW5lIGFyZSBleHBvcnRlZC4KDApWZXJzaW9uIDMuNTgKCiogU3VmZml4IHJ1bGVzIG1heSBoYXZlIGRlcGVuZGVuY2llcyAod2hpY2ggYXJlIGlnbm9yZWQpLgoMClZlcnNpb24gMy41NwoKKiBEZXBlbmRlbmNpZXMgb2YgdGhlIGZvcm0gYC1sTElCJyBhcmUgc2VhcmNoZWQgZm9yIGFzIC91c3IvbG9jYWwvbGliL2xpYkxJQi5hCiAgYXMgd2VsbCBhcyBsaWJMSUIuYSBpbiAvdXNyL2xpYiwgL2xpYiwgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBhbmQgVlBBVEguCgwKVmVyc2lvbiAzLjU1CgoqIFRoZXJlIGlzIG5vdyBhIFVuaXggbWFuIHBhZ2UgZm9yIEdOVSBNYWtlLiAgSXQgaXMgY2VydGFpbmx5IG5vdCBhCiAgcmVwbGFjZW1lbnQgZm9yIHRoZSBUZXhpbmZvIG1hbnVhbCwgYnV0IGl0IGRvY3VtZW50cyB0aGUgYmFzaWMKICBmdW5jdGlvbmFsaXR5IGFuZCB0aGUgc3dpdGNoZXMuICBGb3IgZnVsbCBkb2N1bWVudGF0aW9uLCB5b3Ugc2hvdWxkCiAgc3RpbGwgcmVhZCB0aGUgVGV4aW5mbyBtYW51YWwuICBUaGFua3MgdG8gRGVubmlzIE1vcnNlIG9mIFN0YW5mb3JkCiAgVW5pdmVyc2l0eSBmb3IgY29udHJpYnV0aW5nIHRoZSBpbml0aWFsIHZlcnNpb24gb2YgdGhpcy4KCiogVmFyaWFibGVzIHdoaWNoIGFyZSBkZWZpbmVkIGJ5IGRlZmF1bHQgKGUuZy4sIGBDQycpIHdpbGwgbm8gbG9uZ2VyIGJlCiAgcHV0IGludG8gdGhlIGVudmlyb25tZW50IGZvciBjaGlsZCBwcm9jZXNzZXMuICAoSWYgdGhlc2UgdmFyaWFibGVzIGFyZQogIHJlc2V0IGJ5IHRoZSBlbnZpcm9ubWVudCwgbWFrZWZpbGVzLCBvciB0aGUgY29tbWFuZCBsaW5lLCB0aGV5IHdpbGwKICBzdGlsbCBnbyBpbnRvIHRoZSBlbnZpcm9ubWVudC4pCgoqIE1ha2VmaWxlcyB3aGljaCBoYXZlIHJlY2lwZXMgYnV0IG5vIGRlcGVuZGVuY2llcyAoYW5kIHRodXMgYXJlIGFsd2F5cwogIGNvbnNpZGVyZWQgb3V0IG9mIGRhdGUgYW5kIGluIG5lZWQgb2YgcmVtYWtpbmcpLCB3aWxsIG5vdCBiZSByZW1hZGUgKGlmIHRoZXkKICB3ZXJlIGJlaW5nIHJlbWFkZSBvbmx5IGJlY2F1c2UgdGhleSB3ZXJlIG1ha2VmaWxlcykuICBUaGlzIG1lYW5zIHRoYXQgR05VCiAgTWFrZSB3aWxsIG5vIGxvbmdlciBnbyBpbnRvIGFuIGluZmluaXRlIGxvb3Agd2hlbiBmZWQgdGhlIG1ha2VmaWxlcyB0aGF0CiAgYGltYWtlJyAobmVjZXNzYXJ5IHRvIGJ1aWxkIFggV2luZG93cykgcHJvZHVjZXMuCgoqIFRoZXJlIGlzIG5vIGxvbmdlciBhIHdhcm5pbmcgZm9yIHVzaW5nIHRoZSBgdnBhdGgnIGRpcmVjdGl2ZSB3aXRoIGFuIGV4cGxpY2l0CnBhdGhuYW1lIChpbnN0ZWFkIG9mIGEgYCUnIHBhdHRlcm4pLgoMClZlcnNpb24gMy41MQoKKiBXaGVuIHJlbW92aW5nIGludGVybWVkaWF0ZSBmaWxlcywgb25seSBvbmUgYHJtJyBjb21tYW5kIGxpbmUgaXMgcHJpbnRlZCwKICBsaXN0aW5nIGFsbCBmaWxlIG5hbWVzLgoKKiBUaGVyZSBhcmUgbm93IGF1dG9tYXRpYyB2YXJpYWJsZXMgYCQoXkQpJywgYCQoXkYpJywgYCQoP0QpJywgYW5kIGAkKD9GKScuCiAgVGhlc2UgYXJlIHRoZSBkaXJlY3Rvcnktb25seSBhbmQgZmlsZS1vbmx5IHZlcnNpb25zIG9mIGAkXicgYW5kIGAkPycuCgoqIExpYnJhcnkgZGVwZW5kZW5jaWVzIGdpdmVuIGFzIGAtbE5BTUUnIHdpbGwgdXNlICJsaWJOQU1FLmEiIGluIHRoZSBjdXJyZW50CiAgZGlyZWN0b3J5IGlmIGl0IGV4aXN0cy4KCiogVGhlIGF1dG9tYXRpYyB2YXJpYWJsZSBgJCgkLyknIGlzIG5vIGxvbmdlciBkZWZpbmVkLgoKKiBMZWFkaW5nIGArJyBjaGFyYWN0ZXJzIG9uIGEgcmVjaXBlIGxpbmUgbWFrZSB0aGF0IGxpbmUgYmUgZXhlY3V0ZWQgZXZlbgogIHVuZGVyIC1uLCAtdCwgb3IgLXEgKGFzIGlmIHRoZSBsaW5lIGNvbnRhaW5lZCBgJChNQUtFKScpLgoKKiBGb3IgcmVjaXBlIGxpbmVzIGNvbnRhaW5pbmcgYCQoTUFLRSknLCBgJHtNQUtFfScsIG9yIGxlYWRpbmcgYCsnIGNoYXJhY3RlcnMsCiAgb25seSB0aG9zZSBsaW5lcyBhcmUgZXhlY3V0ZWQsIG5vdCB0aGUgZW50aXJlIHJlY2lwZS4KICAoVGhpcyBpcyBob3cgVW5peCBtYWtlIGJlaGF2ZXMgZm9yIGxpbmVzIGNvbnRhaW5pbmcgYCQoTUFLRSknIG9yIGAke01BS0V9Jy4pCgwKVmVyc2lvbiAzLjUwCgoqIEZpbGVuYW1lcyBpbiBydWxlcyB3aWxsIG5vdyBoYXZlIH4gYW5kIH5VU0VSIGV4cGFuZGVkLgoKKiBUaGUgYC1wJyBvdXRwdXQgaGFzIGJlZW4gY2hhbmdlZCBzbyBpdCBjYW4gYmUgdXNlZCBhcyBhIG1ha2VmaWxlLgogIChBbGwgaW5mb3JtYXRpb24gdGhhdCBpc24ndCBzcGVjaWZpZWQgYnkgbWFrZWZpbGVzIGlzIHByZWZhY2VkIHdpdGggY29tbWVudAogIGNoYXJhY3RlcnMuKQoMClZlcnNpb24gMy40OQoKKiBUaGUgJSBjaGFyYWN0ZXIgY2FuIGJlIHF1b3RlZCB3aXRoIGJhY2tzbGFzaCBpbiBpbXBsaWNpdCBwYXR0ZXJuIHJ1bGVzLAogIHN0YXRpYyBwYXR0ZXJuIHJ1bGVzLCBgdnBhdGgnIGRpcmVjdGl2ZXMsIGFuZCBgcGF0c3Vic3QnLCBgZmlsdGVyJywgYW5kCiAgYGZpbHRlci1vdXQnIGZ1bmN0aW9ucy4gIEEgd2FybmluZyBpcyBpc3N1ZWQgaWYgYSBgdnBhdGgnIGRpcmVjdGl2ZSdzCiAgcGF0dGVybiBjb250YWlucyBubyAlLgoKKiBUaGUgYHdpbGRjYXJkJyB2YXJpYWJsZSBleHBhbnNpb24gZnVuY3Rpb24gbm93IGV4cGFuZHMgfiBhbmQgflVTRVIuCgoqIE1lc3NhZ2VzIGluZGljYXRpbmcgZmFpbGVkIHJlY2lwZSBsaW5lcyBub3cgY29udGFpbiB0aGUgdGFyZ2V0IG5hbWU6CiAgICAgICAgbWFrZTogKioqIFt0YXJnZXRdIEVycm9yIDEKCiogVGhlIGAtcCcgb3V0cHV0IGZvcm1hdCBoYXMgYmVlbiBjaGFuZ2VkIHNvbWV3aGF0IHRvIGxvb2sgbW9yZSBsaWtlCiAgbWFrZWZpbGUgcnVsZXMgYW5kIHRvIGdpdmUgYWxsIGluZm9ybWF0aW9uIHRoYXQgTWFrZSBoYXMgYWJvdXQgZmlsZXMuCgwKVmVyc2lvbiAzLjQ4CgwKVmVyc2lvbiAzLjQ3CgoqIFRoZSBgLWwnIHN3aXRjaCB3aXRoIG5vIGFyZ3VtZW50IHJlbW92ZXMgYW55IHByZXZpb3VzIGxvYWQtYXZlcmFnZSBsaW1pdC4KCiogV2hlbiB0aGUgYC13JyBzd2l0Y2ggaXMgaW4gZWZmZWN0LCBhbmQgTWFrZSBoYXMgdXBkYXRlZCBtYWtlZmlsZXMsCiAgaXQgd2lsbCB3cml0ZSBhIGBMZWF2aW5nIGRpcmVjdG9yeScgbWVzc2FnZSBiZWZvcmUgcmUtZXhlY3V0aW5nIGl0c2VsZi4KICBUaGlzIG1ha2VzIHRoZSBgZGlyZWN0b3J5IGNoYW5nZSB0cmFja2luZycgY2hhbmdlcyB0byBFbWFjcydzIGNvbXBpbGF0aW9uCiAgY29tbWFuZHMgd29yayBwcm9wZXJseS4KDApWZXJzaW9uIDMuNDYKCiogVGhlIGF1dG9tYXRpYyB2YXJpYWJsZSBgJConIGlzIG5vdyBkZWZpbmVkIGZvciBleHBsaWNpdCBydWxlcywKICBhcyBpdCBpcyBpbiBVbml4IG1ha2UuCgwKVmVyc2lvbiAzLjQ1CgoqIFRoZSBgLWonIHN3aXRjaCBpcyBub3cgcHV0IGluIHRoZSBNQUtFRkxBR1MgYW5kIE1GTEFHUyB2YXJpYWJsZXMgd2hlbgogIHNwZWNpZmllZCB3aXRob3V0IGFuIGFyZ3VtZW50IChpbmRpY2F0aW5nIGluZmluaXRlIGpvYnMpLgogIFRoZSBgLWwnIHN3aXRjaCBpcyBub3QgYWx3YXlzIHB1dCBpbiB0aGUgTUFLRUZMQUdTIGFuZCBNRkxBR1MgdmFyaWFibGVzLgoKKiBNYWtlIG5vIGxvbmdlciBjaGVja3MgaGFzaGVkIGRpcmVjdG9yaWVzIGFmdGVyIHJ1bm5pbmcgcmVjaXBlcy4KICBUaGUgYmVoYXZpb3IgaW1wbGVtZW50ZWQgaW4gMy40MSBjYXVzZWQgdG9vIG11Y2ggc2xvd2Rvd24uCgwKVmVyc2lvbiAzLjQ0CgoqIEEgZGVwZW5kZW5jeSBpcyBOT1QgY29uc2lkZXJlZCBuZXdlciB0aGFuIGl0cyBkZXBlbmRlbnQgaWYKICB0aGV5IGhhdmUgdGhlIHNhbWUgbW9kaWZpY2F0aW9uIHRpbWUuICBUaGUgYmVoYXZpb3IgaW1wbGVtZW50ZWQKICBpbiAzLjQzIGNvbmZsaWN0cyB3aXRoIFJDUy4KDApWZXJzaW9uIDMuNDMKCiogRGVwZW5kZW5jeSBsb29wcyBhcmUgbm8gbG9uZ2VyIGZhdGFsIGVycm9ycy4KCiogQSBkZXBlbmRlbmN5IGlzIGNvbnNpZGVyZWQgbmV3ZXIgdGhhbiBpdHMgZGVwZW5kZW50IGlmCiAgdGhleSBoYXZlIHRoZSBzYW1lIG1vZGlmaWNhdGlvbiB0aW1lLgoMClZlcnNpb24gMy40MgoKKiBUaGUgdmFyaWFibGVzIEY3NyBhbmQgRjc3RkxBR1MgYXJlIG5vdyBzZXQgYnkgZGVmYXVsdCB0byAkKEZDKSBhbmQKICAkKEZGTEFHUykuICBNYWtlZmlsZXMgZGVzaWduZWQgZm9yIFN5c3RlbSBWIG1ha2UgbWF5IHVzZSB0aGVzZSB2YXJpYWJsZXMgaW4KICBleHBsaWNpdCBydWxlcyBhbmQgZXhwZWN0IHRoZW0gdG8gYmUgc2V0LiAgVW5mb3J0dW5hdGVseSwgdGhlcmUgaXMgbm8gd2F5IHRvCiAgbWFrZSBzZXR0aW5nIHRoZXNlIGFmZmVjdCB0aGUgRm9ydHJhbiBpbXBsaWNpdCBydWxlcyB1bmxlc3MgRkMgYW5kIEZGTEFHUwogIGFyZSBub3QgdXNlZCAoYW5kIHRoZXNlIGFyZSB1c2VkIGJ5IEJTRCBtYWtlKS4KDApWZXJzaW9uIDMuNDEKCiogTWFrZSBub3cgY2hlY2tzIHRvIHNlZSBpZiBpdHMgaGFzaGVkIGRpcmVjdG9yaWVzIGFyZSBjaGFuZ2VkIGJ5IHJlY2lwZXMuCiAgT3RoZXIgbWFrZXMgdGhhdCBoYXNoIGRpcmVjdG9yaWVzIChTdW4sIDQuMyBCU0QpIGRvbid0IGRvIHRoaXMuCgwKVmVyc2lvbiAzLjM5CgoqIFRoZSBgc2hlbGwnIGZ1bmN0aW9uIG5vIGxvbmdlciBjYXB0dXJlcyBzdGFuZGFyZCBlcnJvciBvdXRwdXQuCgwKVmVyc2lvbiAzLjMyCgoqIEEgZmlsZSBiZWdpbm5pbmcgd2l0aCBhIGRvdCBjYW4gYmUgdGhlIGRlZmF1bHQgdGFyZ2V0IGlmIGl0IGFsc28gY29udGFpbnMKICBhIHNsYXNoIChlLmcuLCBgLi4vYmluL2ZvbycpLiAgKFVuaXggbWFrZSBhbGxvd3MgdGhpcyBhcyB3ZWxsLikKDApWZXJzaW9uIDMuMzEKCiogQXJjaGl2ZSBtZW1iZXIgbmFtZXMgYXJlIHRydW5jYXRlZCB0byAxNSBjaGFyYWN0ZXJzLgoKKiBZZXQgbW9yZSBVU0cgc3R1ZmYuCgoqIE1pbmltYWwgc3VwcG9ydCBmb3IgTWljcm9wb3J0IFN5c3RlbSBWIChhIDE2LWJpdCBtYWNoaW5lIGFuZCBhCiAgYnJhaW4tZGFtYWdlZCBjb21waWxlcikuICBUaGlzIGhhcyBldmVuIGxvd2VyIHByaW9yaXR5IHRoYW4gb3RoZXIgVVNHCiAgc3VwcG9ydCwgc28gaWYgaXQgZ2V0cyBiZXlvbmQgdHJpdmlhbCwgSSB3aWxsIHRha2UgaXQgb3V0IGNvbXBsZXRlbHkuCgoqIFJldmFtcGVkIGRlZmF1bHQgaW1wbGljaXQgcnVsZXMgKG5vdCBtdWNoIHZpc2libGUgY2hhbmdlKS4KCiogVGhlIC1kIGFuZCAtcCBvcHRpb25zIGNhbiBjb21lIGZyb20gdGhlIGVudmlyb25tZW50LgoMClZlcnNpb24gMy4zMAoKKiBJbXByb3ZlZCBzdXBwb3J0IGZvciBVU0cgYW5kIEhQVVggKGhvcGVmdWxseSkuCgoqIEEgdmFyaWFibGUgcmVmZXJlbmNlIGxpa2UgYCQoZm9vOmE9YiknLCBpZiBgYScgY29udGFpbnMgYSBgJScsIGlzCiAgZXF1aXZhbGVudCB0byBgJChwYXRzdWJzdCBhLGIsJChmb28pKScuCgoqIERlZmluaW5nIC5ERUZBVUxUIHdpdGggbm8gZGVwcyBvciByZWNpcGUgY2xlYXJzIGl0cyByZWNpcGUuCgoqIE5ldyBkZWZhdWx0IGltcGxpY2l0IHJ1bGVzIGZvciAuUyAoY3BwLCB0aGVuIGFzKSwgYW5kIC5zaCAoY29weSBhbmQKICBtYWtlIGV4ZWN1dGFibGUpLiAgQWxsIGRlZmF1bHQgaW1wbGljaXQgcnVsZXMgdGhhdCB1c2UgY3BwIChldmVuCiAgaW5kaXJlY3RseSksIHVzZSAkKENQUEZMQUdTKS4KDApWZXJzaW9uIDMuMjkKCiogR2l2aW5nIHRoZSAtaiBvcHRpb24gd2l0aCBubyBhcmd1bWVudHMgZ2l2ZXMgeW91IGluZmluaXRlIGpvYnMuCgwKVmVyc2lvbiAzLjI4CgoqIE5ldyBvcHRpb246ICItbCBMT0FEIiBzYXlzIG5vdCB0byBzdGFydCBhbnkgbmV3IGpvYnMgd2hpbGUgb3RoZXJzIGFyZQogIHJ1bm5pbmcgaWYgdGhlIGxvYWQgYXZlcmFnZSBpcyBub3QgYmVsb3cgTE9BRCAoYSBmbG9hdGluZy1wb2ludCBudW1iZXIpLgoKKiBUaGVyZSBpcyBzdXBwb3J0IGluIHBsYWNlIGZvciBpbXBsZW1lbnRhdGlvbnMgb2YgcmVtb3RlIGNvbW1hbmQgZXhlY3V0aW9uCiAgaW4gTWFrZS4gIFNlZSB0aGUgZmlsZSByZW1vdGUuYy4KDApWZXJzaW9uIDMuMjYKCiogTm8gbW9yZSB0aGFuIDEwIGRpcmVjdG9yaWVzIHdpbGwgYmUga2VwdCBvcGVuIGF0IG9uY2UuCiAgKFRoaXMgbnVtYmVyIGNhbiBiZSBjaGFuZ2VkIGJ5IHJlZGVmaW5pbmcgTUFYX09QRU5fRElSRUNUT1JJRVMgaW4gZGlyLmMuKQoMClZlcnNpb24gMy4yNQoKKiBBcmNoaXZlIGZpbGVzIHdpbGwgaGF2ZSB0aGVpciBtb2RpZmljYXRpb24gdGltZXMgcmVjb3JkZWQgYmVmb3JlIGRvaW5nCiAgYW55dGhpbmcgdGhhdCBtaWdodCBjaGFuZ2UgdGhlaXIgbW9kaWZpY2F0aW9uIHRpbWVzIGJ5IHVwZGF0aW5nIGFuIGFyY2hpdmUKICBtZW1iZXIuCgwKVmVyc2lvbiAzLjIwCgoqIFRoZSBgTUFLRUxFVkVMJyB2YXJpYWJsZSBpcyBkZWZpbmVkIGZvciB1c2UgYnkgbWFrZWZpbGVzLgoMClZlcnNpb24gMy4xOQoKKiBUaGUgcmVjdXJzaW9uIGxldmVsIGluZGljYXRpb25zIGluIGVycm9yIG1lc3NhZ2VzIGFyZSBtdWNoIHNob3J0ZXIgdGhhbgogIHRoZXkgd2VyZSBpbiB2ZXJzaW9uIDMuMTQuCgwKVmVyc2lvbiAzLjE4CgoqIExlYWRpbmcgc3BhY2VzIGJlZm9yZSBkaXJlY3RpdmVzIGFyZSBpZ25vcmVkIChhcyBkb2N1bWVudGVkKS4KCiogSW5jbHVkZWQgbWFrZWZpbGVzIGNhbiBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgZ29hbCB0YXJnZXQuCiAgKFN5c3RlbSBWIE1ha2UgZG9lcyBpdCB0aGlzIHdheSwgc28gd2UgYXJlIGJlaW5nIGNvbXBhdGlibGUpLgoMClZlcnNpb24gMy4xNC4KCiogVmFyaWFibGVzIHRoYXQgYXJlIGRlZmF1bHRzIGJ1aWx0IGludG8gTWFrZSB3aWxsIG5vdCBiZSBwdXQgaW4gdGhlCiAgZW52aXJvbm1lbnQgZm9yIGNoaWxkcmVuLiAgVGhpcyBqdXN0IHNhdmVzIHNvbWUgZW52aXJvbm1lbnQgc3BhY2UgYW5kLAogIGV4Y2VwdCB1bmRlciAtZSwgd2lsbCBiZSB0cmFuc3BhcmVudCB0byBzdWItbWFrZXMuCgoqIEVycm9yIG1lc3NhZ2VzIGZyb20gc3ViLW1ha2VzIHdpbGwgaW5kaWNhdGUgdGhlIGxldmVsIG9mIHJlY3Vyc2lvbi4KCiogSG9wZWZ1bGx5IHNvbWUgc3BlZWQtdXAgZm9yIGxhcmdlIGRpcmVjdG9yaWVzIGR1ZSB0byBhIGNoYW5nZSBpbiB0aGUKICBkaXJlY3RvcnkgaGFzaGluZyBzY2hlbWUuCgoqIE9uZSBjaGlsZCB3aWxsIGFsd2F5cyBnZXQgYSBzdGFuZGFyZCBpbnB1dCB0aGF0IGlzIHVzYWJsZS4KCiogRGVmYXVsdCBtYWtlZmlsZXMgdGhhdCBkb24ndCBleGlzdCB3aWxsIGJlIHJlbWFkZSBhbmQgcmVhZCBpbi4KDApWZXJzaW9uIDMuMTMuCgoqIENvdW50IHBhcmVudGhlc2VzIGluc2lkZSBleHBhbnNpb24gZnVuY3Rpb24gY2FsbHMgc28geW91IGNhbgogIGhhdmUgbmVzdGVkIGNhbGxzOiBgJChzb3J0ICQoZm9yZWFjaCB4LGEgYiwkKHgpKSknLgoMClZlcnNpb24gMy4xMi4KCiogU2V2ZXJhbCBidWcgZml4ZXMsIGluY2x1ZGluZyBVU0cgYW5kIFN1bjM4Nmkgc3VwcG9ydC4KCiogYHNoZWxsJyBmdW5jdGlvbiB0byBleHBhbmQgc2hlbGwgY29tbWFuZHMgYSBsYSBgCgoqIElmIHRoZSBgLWQnIGZsYWcgaXMgZ2l2ZW4sIHZlcnNpb24gaW5mb3JtYXRpb24gd2lsbCBiZSBwcmludGVkLgoKKiBUaGUgYC1jJyBvcHRpb24gaGFzIGJlZW4gcmVuYW1lZCB0byBgLUMnIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGFyLgoKKiBUaGUgYC1wJyBvcHRpb24gbm8gbG9uZ2VyIGluaGliaXRzIG90aGVyIG5vcm1hbCBvcGVyYXRpb24uCgoqIE1ha2VmaWxlcyB3aWxsIGJlIHVwZGF0ZWQgYW5kIHJlLXJlYWQgaWYgbmVjZXNzYXJ5LgoKKiBDYW4gbm93IHJ1biBzZXZlcmFsIHJlY2lwZXMgYXQgb25jZSAocGFyYWxsZWxpc20pLCAtaiBvcHRpb24uCgoqIEVycm9yIG1lc3NhZ2VzIHdpbGwgY29udGFpbiB0aGUgbGV2ZWwgb2YgTWFrZSByZWN1cnNpb24sIGlmIGFueS4KCiogVGhlIGBNQUtFRkxBR1MnIGFuZCBgTUZMQUdTJyB2YXJpYWJsZXMgd2lsbCBiZSBzY2FubmVkIGZvciBvcHRpb25zIGFmdGVyCiAgbWFrZWZpbGVzIGFyZSByZWFkLgoKKiBBIGRvdWJsZS1jb2xvbiBydWxlIHdpdGggbm8gZGVwZW5kZW5jaWVzIHdpbGwgYWx3YXlzIGhhdmUgaXRzIHJlY2lwZSBydW4uCiAgKFRoaXMgaXMgaG93IGJvdGggdGhlIEJTRCBhbmQgU3lzdGVtIFYgdmVyc2lvbnMgb2YgTWFrZSBkbyBpdC4pCgwKVmVyc2lvbiAzLjA1CgooQ2hhbmdlcyBmcm9tIHZlcnNpb25zIDEgdGhyb3VnaCAzLjA1IHdlcmUgbmV2ZXIgcmVjb3JkZWQuICBTb3JyeS4pCgwKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpDb3B5cmlnaHQgKEMpIDE5ODgtMjAyMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIE1ha2UuCgpHTlUgTWFrZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQp0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCkZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCnZlcnNpb24uCgpHTlUgTWFrZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IKQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCnRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4K