R05VIE1ha2UgTkVXUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotaW5kZW50ZWQtdGV4dC0qLQogIEhpc3Rvcnkgb2YgdXNlci12aXNpYmxlIGNoYW5nZXMuCiAgMTkgRmVicnVhcnkgMjAyMwoKU2VlIHRoZSBlbmQgb2YgdGhpcyBmaWxlIGZvciBjb3B5cmlnaHRzIGFuZCBjb25kaXRpb25zLgoKQWxsIHVzZXItdmlzaWJsZSBjaGFuZ2VzIGFyZSBtb3JlIGZ1bGx5IGRlc2NyaWJlZCBpbiB0aGUgR05VIE1ha2UgbWFudWFsLAp3aGljaCBpcyBjb250YWluZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gYXMgdGhlIGZpbGUgZG9jL21ha2UudGV4aS4KU2VlIHRoZSBSRUFETUUgZmlsZSBhbmQgdGhlIEdOVSBNYWtlIG1hbnVhbCBmb3IgaW5zdHJ1Y3Rpb25zIGZvcgpyZXBvcnRpbmcgYnVncy4KCgwKVmVyc2lvbiA0LjQuMC45MSAoMTkgRmViIDIwMjMpCgpUaGlzIHJlbGVhc2UgaXMgcHJpbWFyaWx5IGEgYnVnLWZpeCByZWxlYXNlLgpBIGNvbXBsZXRlIGxpc3Qgb2YgYnVncyBmaXhlZCBpbiB0aGlzIHZlcnNpb24gaXMgYXZhaWxhYmxlIGhlcmU6CgpodHRwczovL3N2LmdudS5vcmcvYnVncy9pbmRleC5waHA/Z3JvdXA9bWFrZSZyZXBvcnRfaWQ9MTExJmZpeF9yZWxlYXNlX2lkPTExMCZzZXQ9Y3VzdG9tCgoqIFdBUk5JTkc6IEJhY2t3YXJkLWluY29tcGF0aWJpbGl0eSEKICBJbiBwcmV2aW91cyByZWxlYXNlcyBpdCB3YXMgbm90IHdlbGwtZGVmaW5lZCB3aGVuIHVwZGF0ZXMgdG8gTUFLRUZMQUdTIG1hZGUKICBpbnNpZGUgYSBtYWtlZmlsZSB3b3VsZCBiZSB2aXNpYmxlLiAgVGhpcyByZWxlYXNlIGVuc3VyZXMgdGhleSBhcmUgdmlzaWJsZQogIGltbWVkaWF0ZWx5LCBldmVuIHdoZW4gaW52b2tpbmcgJChzaGVsbCAuLi4pIGZ1bmN0aW9ucy4gIEFsc28sIGNvbW1hbmQgbGluZQogIHZhcmlhYmxlIGFzc2lnbm1lbnRzIGFyZSBub3cgYWx3YXlzIHByZXNlbnQgaW4gTUFLRUZMQUdTLCBldmVuIHdoZW4gcGFyc2luZwogIG1ha2VmaWxlcy4KICBJbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSBEbWl0cnkgR29uY2hhcm92IDxkZ29uY2hhcm92QHVzZXJzLnNmLm5ldD4KCiogTmV3IGZlYXR1cmU6IFBhcmFsbGVsIGJ1aWxkcyBvZiBhcmNoaXZlcwogIFByZXZpb3VzbHkgaXQgd2FzIG5vdCBwb3NzaWJsZSB0byB1c2UgcGFyYWxsZWwgYnVpbGRzIHdpdGggYXJjaGl2ZXMuICBJdCBpcwogIHN0aWxsIG5vdCBwb3NzaWJsZSB1c2luZyB0aGUgYnVpbHQtaW4gcnVsZXMsIGhvd2V2ZXIgeW91IGNhbiBub3cgb3ZlcnJpZGUKICB0aGUgYnVpbHQtaW4gcnVsZXMgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBzZXQgb2YgcnVsZXMgYW5kIHVzZSBwYXJhbGxlbAogIGJ1aWxkcyB3aXRoIGFyY2hpdmUgY3JlYXRpb24uICBTZWUgdGhlICJEYW5nZXJzIFdoZW4gVXNpbmcgQXJjaGl2ZXMiIHNlY3Rpb24KICBvZiB0aGUgR05VIE1ha2UgbWFudWFsLCBhbmQgaHR0cHM6Ly9zYXZhbm5haC5nbnUub3JnL2J1Z3MvaW5kZXgucGhwPzE0OTI3CgoqIE5ldyBwbGF0Zm9ybTogR05VIE1ha2UgaXMgc3VwcG9ydGVkIG9uIHovT1MKICBUaGFua3MgdG8gSWdvciBUb2Rvcm92c2tpIDxpdG9kb3JvdkBjYS5pYm0uY29tPiBmb3IgdGhlIHBhdGNoZXMgYW5kIHRlc3RpbmcKICBhc3Npc3RhbmNlLgoKKiBQcmV2aW91c2x5IHRhcmdldC1zcGVjaWZpYyB2YXJpYWJsZXMgd291bGQgaW5oZXJpdCB0aGVpciAiZXhwb3J0IiBjYXBhYmlsaXR5CiAgZnJvbSBwYXJlbnQgdGFyZ2V0LXNwZWNpZmljIHZhcmlhYmxlcyBldmVuIGlmIHRoZXkgd2VyZSBtYXJrZWQgcHJpdmF0ZS4gIE5vdwogIHByaXZhdGUgcGFyZW50IHRhcmdldC1zcGVjaWZpYyB2YXJpYWJsZXMgaGF2ZSBubyBhZmZlY3QuICBGb3IgbW9yZSBkZXRhaWxzCiAgc2VlIGh0dHBzOi8vc2F2YW5uYWguZ251Lm9yZy9idWdzL2luZGV4LnBocD82MTQ2MwoKKiBVcGRhdGVzIHRvIGFsbG93IGJ1aWxkaW5nIG9uIE9TLzIKICBQcm92aWRlZCBieSBLTyBNeXVuZy1IdW4gPGtvbWg3OEBnbWFpbC5jb20+CgoqIERpc2FibGUgRklGTyBqb2JzZXJ2ZXIgb24gR05VL0h1cmQgYW5kIEN5Z3dpbgogIEV4cGVyaW1lbnRhdGlvbiBzaG93cyB0aGF0IHRoZSBuZXcgRklGTy1iYXNlZCBqb2JzZXJ2ZXIgZG9lc24ndCB3b3JrIHdlbGwgb24KICBHTlUvSHVyZCBvciBDeWd3aW46IHJldmVydCB0aGVzZSBzeXN0ZW1zIHRvIHVzZSB0aGUgcGlwZS1iYXNlZCBqb2JzZXJ2ZXIuCgoMClZlcnNpb24gNC40ICgzMSBPY3QgMjAyMikKCkEgY29tcGxldGUgbGlzdCBvZiBidWdzIGZpeGVkIGluIHRoaXMgdmVyc2lvbiBpcyBhdmFpbGFibGUgaGVyZToKCmh0dHBzOi8vc3YuZ251Lm9yZy9idWdzL2luZGV4LnBocD9ncm91cD1tYWtlJnJlcG9ydF9pZD0xMTEmZml4X3JlbGVhc2VfaWQ9MTA5JnNldD1jdXN0b20KCiogV0FSTklORzogRGVwcmVjYXRpb24hCiAgVGhlIGZvbGxvd2luZyBzeXN0ZW1zIGFyZSBkZXByZWNhdGVkIGluIHRoaXMgcmVsZWFzZToKICAgIC0gT1MvMiAoRU1YKQogICAgLSBBbWlnYU9TCiAgICAtIFhlbml4CiAgICAtIENyYXkKICBJbiB0aGUgTkVYVCByZWxlYXNlIG9mIEdOVSBNYWtlLCBzdXBwb3J0IGZvciB0aGVzZSBzeXN0ZW1zIHdpbGwgYmUgcmVtb3ZlZC4KICBJZiB5b3Ugd2FudCB0byBzZWUgdGhlbSBjb250aW51ZSB0byBiZSBzdXBwb3J0ZWQsIGNvbnRhY3QgPGJ1Zy1tYWtlQGdudS5vcmc+LgoKKiBXQVJOSU5HOiBGdXR1cmUgYmFja3dhcmQtaW5jb21wYXRpYmlsaXR5IQogIEluIHRoZSBORVhUIHJlbGVhc2Ugb2YgR05VIE1ha2UsIHBhdHRlcm4gcnVsZXMgd2lsbCBpbXBsZW1lbnQgdGhlIHNhbWUKICBiZWhhdmlvciBjaGFuZ2UgZm9yIG11bHRpcGxlIHRhcmdldHMgYXMgZXhwbGljaXQgZ3JvdXBlZCB0YXJnZXRzLCBiZWxvdzogaWYKICBhbnkgdGFyZ2V0IG9mIHRoZSBydWxlIGlzIG5lZWRlZCBieSB0aGUgYnVpbGQsIHRoZSByZWNpcGUgd2lsbCBiZSBpbnZva2VkIGlmCiAgYW55IHRhcmdldCBvZiB0aGUgcnVsZSBpcyBtaXNzaW5nIG9yIG91dCBvZiBkYXRlLiAgRHVyaW5nIHRlc3Rpbmcgc29tZQogIG1ha2VmaWxlcyB3ZXJlIGZvdW5kIHRvIGNvbnRhaW4gcGF0dGVybiBydWxlcyB0aGF0IGRvIG5vdCBidWlsZCBhbGwgdGFyZ2V0czsKICB0aGlzIGNhbiBjYXVzZSBpc3N1ZXMgc28gd2UgYXJlIGRlbGF5aW5nIHRoaXMgY2hhbmdlIGZvciBvbmUgcmVsZWFzZSBjeWNsZQogIHRvIGFsbG93IHRoZXNlIG1ha2VmaWxlcyB0byBiZSB1cGRhdGVkLiAgR05VIE1ha2Ugc2hvd3MgYSB3YXJuaW5nIGlmIGl0CiAgZGV0ZWN0cyB0aGlzIHNpdHVhdGlvbjogInBhdHRlcm4gcmVjaXBlIGRpZCBub3QgdXBkYXRlIHBlZXIgdGFyZ2V0Ii4KCiogV0FSTklORzogQmFja3dhcmQtaW5jb21wYXRpYmlsaXR5IQogIEdOVSBNYWtlIG5vdyB1c2VzIHRlbXBvcmFyeSBmaWxlcyBpbiBtb3JlIHNpdHVhdGlvbnMgdGhhbiBwcmV2aW91cyByZWxlYXNlcy4KICBJZiB5b3VyIGJ1aWxkIHN5c3RlbSBzZXRzIFRNUERJUiAob3IgVE1QIG9yIFRFTVAgb24gV2luZG93cykgYW5kIGRlbGV0ZXMgdGhlCiAgY29udGVudHMgZHVyaW5nIHRoZSBidWlsZCwgb3IgdXNlcyByZXN0cmljdGl2ZSBwZXJtaXNzaW9ucywgdGhpcyBtYXkgY2F1c2UKICBwcm9ibGVtcy4gIFlvdSBjYW4gY2hvb3NlIGFuIGFsdGVybmF0aXZlIHRlbXBvcmFyeSBkaXJlY3Rvcnkgb25seSBmb3IgdXNlIGJ5CiAgR05VIE1ha2UgYnkgc2V0dGluZyB0aGUgbmV3IE1BS0VfVE1QRElSIGVudmlyb25tZW50IHZhcmlhYmxlIGJlZm9yZSBpbnZva2luZwogIG1ha2UuICBOb3RlIHRoYXQgdGhpcyB2YWx1ZSBDQU5OT1QgYmUgc2V0IGluc2lkZSB0aGUgbWFrZWZpbGUsIHNpbmNlIG1ha2UKICBuZWVkcyB0byBmaW5kIGl0cyB0ZW1wb3JhcnkgZGlyZWN0b3J5IGJlZm9yZSB0aGUgbWFrZWZpbGVzIGFyZSBwYXJzZWQuCgoqIFdBUk5JTkc6IEJhY2t3YXJkLWluY29tcGF0aWJpbGl0eSEKICBQcmV2aW91c2x5IGVhY2ggdGFyZ2V0IGluIGEgZXhwbGljaXQgZ3JvdXBlZCB0YXJnZXQgcnVsZSB3YXMgY29uc2lkZXJlZAogIGluZGl2aWR1YWxseTogaWYgdGhlIHRhcmdldHMgbmVlZGVkIGJ5IHRoZSBidWlsZCB3ZXJlIG5vdCBvdXQgb2YgZGF0ZSB0aGUKICByZWNpcGUgd2FzIG5vdCBydW4gZXZlbiBpZiBvdGhlciB0YXJnZXRzIGluIHRoZSBncm91cCB3ZXJlIG91dCBvZiBkYXRlLiAgTm93CiAgaWYgYW55IG9mIHRoZSBncm91cGVkIHRhcmdldHMgYXJlIG5lZWRlZCBieSB0aGUgYnVpbGQsIHRoZW4gaWYgYW55IG9mIHRoZQogIGdyb3VwZWQgdGFyZ2V0cyBhcmUgb3V0IG9mIGRhdGUgdGhlIHJlY2lwZSBpcyBydW4gYW5kIGFsbCB0YXJnZXRzIGluIHRoZQogIGdyb3VwIGFyZSBjb25zaWRlcmVkIHVwZGF0ZWQuCgoqIFdBUk5JTkc6IEJhY2t3YXJkLWluY29tcGF0aWJpbGl0eSEKICBQcmV2aW91c2x5IGlmIC0tbm8tcHJpbnQtZGlyZWN0b3J5IHdhcyBzZWVuIGFueXdoZXJlIGluIHRoZSBlbnZpcm9ubWVudCBvcgogIGNvbW1hbmQgbGluZSBpdCB3b3VsZCB0YWtlIHByZWNlZGVuY2Ugb3ZlciBhbnkgLS1wcmludC1kaXJlY3RvcnkuICBOb3csIHRoZQogIGxhc3Qgc2V0dGluZyBvZiBkaXJlY3RvcnkgcHJpbnRpbmcgb3B0aW9ucyBzZWVuIHdpbGwgYmUgdXNlZCwgc28gYSBjb21tYW5kCiAgbGluZSBzdWNoIGFzICItLW5vLXByaW50LWRpcmVjdG9yeSAtdyIgX3dpbGxfIHNob3cgZGlyZWN0b3J5IGVudHJ5L2V4aXRzLgoKKiBXQVJOSU5HOiBCYWNrd2FyZC1pbmNvbXBhdGliaWxpdHkhCiAgUHJldmlvdXNseSB0aGUgb3JkZXIgaW4gd2hpY2ggbWFrZWZpbGVzIHdlcmUgcmVtYWRlIHdhcyBub3QgZXhwbGljaXRseQogIHN0YXRlZCwgYnV0IGl0IHdhcyAocm91Z2hseSkgdGhlIGludmVyc2Ugb2YgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZQogIHByb2Nlc3NlZCBieSBtYWtlLiAgSW4gdGhpcyByZWxlYXNlLCB0aGUgb3JkZXIgaW4gd2hpY2ggbWFrZWZpbGVzIGFyZQogIHJlYnVpbHQgaXMgdGhlIHNhbWUgb3JkZXIgaW4gd2hpY2ggbWFrZSBwcm9jZXNzZWQgdGhlbSwgYW5kIHRoaXMgaXMgZGVmaW5lZAogIHRvIGJlIHRydWUgaW4gdGhlIEdOVSBNYWtlIG1hbnVhbC4KCiogV0FSTklORzogQmFja3dhcmQtaW5jb21wYXRpYmlsaXR5IQogIFByZXZpb3VzbHkgb25seSBzaW1wbGUgKG9uZS1sZXR0ZXIpIG9wdGlvbnMgd2VyZSBhZGRlZCB0byB0aGUgTUFLRUZMQUdTCiAgdmFyaWFibGUgdGhhdCB3YXMgdmlzaWJsZSB3aGlsZSBwYXJzaW5nIG1ha2VmaWxlcy4gIE5vdywgYWxsIG9wdGlvbnMgYXJlCiAgYXZhaWxhYmxlIGluIE1BS0VGTEFHUy4gIElmIHlvdSB3YW50IHRvIGNoZWNrIE1BS0VGTEFHUyBmb3IgYSBvbmUtbGV0dGVyCiAgb3B0aW9uLCBleHBhbmRpbmcgIiQoZmlyc3R3b3JkIC0kKE1BS0VGTEFHUykpIiBpcyBhIHJlbGlhYmxlIHdheSB0byByZXR1cm4KICB0aGUgc2V0IG9mIG9uZS1sZXR0ZXIgb3B0aW9ucyB3aGljaCBjYW4gYmUgZXhhbWluZWQgdmlhIGZpbmRzdHJpbmcsIGV0Yy4KCiogV0FSTklORzogQmFja3dhcmQtaW5jb21wYXRpYmlsaXR5IQogIFByZXZpb3VzbHkgbWFrZWZpbGUgdmFyaWFibGVzIG1hcmtlZCBhcyBleHBvcnQgd2VyZSBub3QgZXhwb3J0ZWQgdG8gY29tbWFuZHMKICBzdGFydGVkIGJ5IHRoZSAkKHNoZWxsIC4uLikgZnVuY3Rpb24uICBOb3csIGFsbCBleHBvcnRlZCB2YXJpYWJsZXMgYXJlCiAgZXhwb3J0ZWQgdG8gJChzaGVsbCAuLi4pLiAgSWYgdGhpcyBsZWFkcyB0byByZWN1cnNpb24gZHVyaW5nIGV4cGFuc2lvbiwgdGhlbgogIGZvciBiYWNrd2FyZC1jb21wYXRpYmlsaXR5IHRoZSB2YWx1ZSBmcm9tIHRoZSBvcmlnaW5hbCBlbnZpcm9ubWVudCBpcyB1c2VkLgogIFRvIGRldGVjdCB0aGlzIGNoYW5nZSBzZWFyY2ggZm9yICdzaGVsbC1leHBvcnQnIGluIHRoZSAuRkVBVFVSRVMgdmFyaWFibGUuCgoqIFdBUk5JTkc6IE5ldyBidWlsZCByZXF1aXJlbWVudAogIEdOVSBNYWtlIHV0aWxpemVzIGZhY2lsaXRpZXMgZnJvbSBHTlUgR251bGliOiBHbnVsaWIgcmVxdWlyZXMgY2VydGFpbiBDOTkKICBmZWF0dXJlcyBpbiB0aGUgQyBjb21waWxlciBhbmQgc28gdGhlc2UgZmVhdHVyZXMgYXJlIHJlcXVpcmVkIGJ5IEdOVSBNYWtlOgogIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ251bGliL21hbnVhbC9odG1sX25vZGUvQzk5LWZlYXR1cmVzLWFzc3VtZWQuaHRtbAogIFRoZSBjb25maWd1cmUgc2NyaXB0IHNob3VsZCB2ZXJpZnkgdGhlIGNvbXBpbGVyIGhhcyB0aGVzZSBmZWF0dXJlcy4KCiogTmV3IGZlYXR1cmU6IFRoZSAuV0FJVCBzcGVjaWFsIHRhcmdldAogIElmIHRoZSAuV0FJVCB0YXJnZXQgYXBwZWFycyBiZXR3ZWVuIHR3byBwcmVyZXF1aXNpdGVzIG9mIGEgdGFyZ2V0LCB0aGVuCiAgR05VIE1ha2Ugd2lsbCB3YWl0IGZvciBhbGwgb2YgdGhlIHRhcmdldHMgdG8gdGhlIGxlZnQgb2YgLldBSVQgaW4gdGhlIGxpc3QKICB0byBjb21wbGV0ZSBiZWZvcmUgc3RhcnRpbmcgYW55IG9mIHRoZSB0YXJnZXRzIHRvIHRoZSByaWdodCBvZiAuV0FJVC4KICBUaGlzIGZlYXR1cmUgaXMgYXZhaWxhYmxlIGluIHNvbWUgb3RoZXIgdmVyc2lvbnMgb2YgbWFrZSwgYW5kIGl0IHdpbGwgYmUKICByZXF1aXJlZCBieSBhbiB1cGNvbWluZyB2ZXJzaW9uIG9mIHRoZSBQT1NJWCBzdGFuZGFyZCBmb3IgbWFrZS4KICBEaWZmZXJlbnQgcGF0Y2hlcyB3ZXJlIG1hZGUgYnkgQWxleGV5IE5leW1hbiA8YWxleC5uZXltYW5AYXVyaWdhLnJ1PiAoMjAwNSkKICBhbmQgU3RlZmZlbiBOdXJwbWVzbyA8c3RlZmZlbkBzZGFvZGVuLmV1PiAoMjAyMCkgdGhhdCB3ZXJlIHVzZWZ1bCBidXQgdGhlCiAgcmVzdWx0IGlzIGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIChjbG9zZXIgdG8gQWxleGV5J3MgaWRlYSkuCgoqIE5ldyBmZWF0dXJlOiAuTk9UUEFSQUxMRUwgYWNjZXB0cyBwcmVyZXF1aXNpdGVzCiAgSWYgdGhlIC5OT1RQQVJBTExFTCBzcGVjaWFsIHRhcmdldCBoYXMgcHJlcmVxdWlzaXRlcyB0aGVuIGFsbCBwcmVyZXF1aXNpdGVzCiAgb2YgdGhvc2UgdGFyZ2V0cyB3aWxsIGJlIHJ1biBzZXJpYWxseSAoYXMgaWYgLldBSVQgd2FzIHNwZWNpZmllZCBiZXR3ZWVuCiAgZWFjaCBwcmVyZXF1aXNpdGUpLgoKKiBOZXcgZmVhdHVyZTogVGhlIC5OT1RJTlRFUk1FRElBVEUgc3BlY2lhbCB0YXJnZXQKICAuTk9USU5URVJNRURJQVRFIGRpc2FibGVzIGludGVybWVkaWF0ZSBiZWhhdmlvciBmb3Igc3BlY2lmaWMgZmlsZXMsIGZvciBhbGwKICBmaWxlcyBidWlsdCB1c2luZyBhIHBhdHRlcm4sIG9yIGZvciB0aGUgZW50aXJlIG1ha2VmaWxlLgogIEltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IERtaXRyeSBHb25jaGFyb3YgPGRnb25jaGFyb3ZAdXNlcnMuc2YubmV0PgoKKiBOZXcgZmVhdHVyZTogVGhlICQobGV0IC4uLikgZnVuY3Rpb24KICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB1c2VyLWRlZmluZWQgZnVuY3Rpb25zIHRvIGRlZmluZSBhIHNldCBvZiBsb2NhbAogIHZhcmlhYmxlczogdmFsdWVzIGNhbiBiZSBhc3NpZ25lZCB0byB0aGVzZSB2YXJpYWJsZXMgZnJvbSB3aXRoaW4gdGhlCiAgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIGFuZCB0aGV5IHdpbGwgbm90IGltcGFjdCBnbG9iYWwgdmFyaWFibGUgYXNzaWdubWVudHMuCiAgSW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgSm91a2UgV2l0dGV2ZWVuIDxqLndpdHRldmVlbkBnbWFpbC5jb20+CgoqIE5ldyBmZWF0dXJlOiBUaGUgJChpbnRjbXAgLi4uKSBmdW5jdGlvbgogIFRoaXMgZnVuY3Rpb24gYWxsb3dzIGNvbmRpdGlvbmFsIGV2YWx1YXRpb24gY29udHJvbGxlZCBieSBhIG51bWVyaWNhbAogIGNvbXBhcmlzb24uCiAgSW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgSm91a2UgV2l0dGV2ZWVuIDxqLndpdHRldmVlbkBnbWFpbC5jb20+CgoqIE5ldyBmZWF0dXJlOiBJbXByb3ZlZCBzdXBwb3J0IGZvciAtbCAvIC0tbG9hZC1hdmVyYWdlCiAgT24gc3lzdGVtcyB0aGF0IHByb3ZpZGUgL3Byb2MvbG9hZGF2ZyAoTGludXgpLCBHTlUgTWFrZSB3aWxsIHVzZSBpdCB0bwogIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIHJ1bm5hYmxlIGpvYnMgYW5kIHVzZSB0aGlzIGFzIHRoZSBjdXJyZW50IGxvYWQsCiAgYXZvaWRpbmcgdGhlIG5lZWQgZm9yIGhldXJpc3RpY3MuCiAgSW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgU3ZlbiBDLiBEYWNrIDxzZGFja0BnbXguY29tPgoKKiBOZXcgZmVhdHVyZTogVGhlIC0tc2h1ZmZsZSBjb21tYW5kIGxpbmUgb3B0aW9uCiAgVGhpcyBvcHRpb24gcmVvcmRlcnMgZ29hbHMgYW5kIHByZXJlcXVpc2l0ZXMgdG8gc2ltdWxhdGUgbm9uLWRldGVybWluaXNtCiAgdGhhdCBtYXkgYmUgc2VlbiB1c2luZyBwYXJhbGxlbCBidWlsZC4gIFNodWZmbGUgbW9kZSBhbGxvd3MgYSBmb3JtIG9mICJmdXp6CiAgdGVzdGluZyIgb2YgcGFyYWxsZWwgYnVpbGRzIHRvIHZlcmlmeSB0aGF0IGFsbCBwcmVyZXF1aXNpdGVzIGFyZSBjb3JyZWN0bHkKICBkZXNjcmliZWQgaW4gdGhlIG1ha2VmaWxlLgogIEltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IFNlcmdlaSBUcm9maW1vdmljaCA8c2lhcmhlaXRAZ29vZ2xlLmNvbT4KCiogTmV3IGZlYXR1cmU6IFRoZSAtLWpvYnNlcnZlci1zdHlsZSBjb21tYW5kIGxpbmUgb3B0aW9uIGFuZCBuYW1lZCBwaXBlcwogIEEgbmV3IGpvYnNlcnZlciBtZXRob2QgaXMgdXNlZCBvbiBzeXN0ZW1zIHdoZXJlIG1rZmlmbygzKSBpcyBzdXBwb3J0ZWQuCiAgVGhpcyBzb2x2ZXMgYSBudW1iZXIgb2Ygb2JzY3VyZSBpc3N1ZXMgcmVsYXRlZCB0byB1c2luZyB0aGUgam9ic2VydmVyCiAgYW5kIHJlY3Vyc2l2ZSBpbnZvY2F0aW9ucyBvZiBHTlUgTWFrZS4gIFRoaXMgY2hhbmdlIG1lYW5zIHRoYXQgc3ViLW1ha2VzCiAgd2lsbCBjb25uZWN0IHRvIHRoZSBqb2JzZXJ2ZXIgZXZlbiBpZiB0aGV5IGFyZSBub3QgbWFya2VkIGFzIHJlY3Vyc2l2ZS4KICBJdCBhbHNvIG1lYW5zIHRoYXQgb3RoZXIgdG9vbHMgdGhhdCB3YW50IHRvIHBhcnRpY2lwYXRlIGluIHRoZSBqb2JzZXJ2ZXIKICB3aWxsIG5lZWQgdG8gYmUgZW5oYW5jZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBHTlUgTWFrZSBtYW51YWwuCiAgWW91IGNhbiBmb3JjZSBHTlUgTWFrZSB0byB1c2UgdGhlIHNpbXBsZSBwaXBlLWJhc2VkIGpvYnNlcnZlciAocGVyaGFwcyBpZgogIHlvdSBhcmUgaW50ZWdyYXRpbmcgd2l0aCBvdGhlciB0b29scyBvciBvbGRlciB2ZXJzaW9ucyBvZiBHTlUgTWFrZSkgYnkKICBhZGRpbmcgdGhlICctLWpvYnNlcnZlci1zdHlsZT1waXBlJyBvcHRpb24gdG8gdGhlIGNvbW1hbmQgbGluZSBvZiB0aGUKICB0b3AtbGV2ZWwgaW52b2NhdGlvbiBvZiBHTlUgTWFrZSwgb3IgdmlhIE1BS0VGTEFHUyBvciBHTlVNQUtFRkxBR1MuCiAgVG8gZGV0ZWN0IHRoaXMgY2hhbmdlIHNlYXJjaCBmb3IgJ2pvYnNlcnZlci1maWZvJyBpbiB0aGUgLkZFQVRVUkVTIHZhcmlhYmxlLgoKKiBTb21lIFBPU0lYIHN5c3RlbXMgKCpCU0QpIGRvIG5vdCBhbGxvdyBsb2NrcyB0byBiZSB0YWtlbiBvbiBwaXBlcywgd2hpY2gKICBjYXVzZWQgdGhlIG91dHB1dCBzeW5jIGZlYXR1cmUgdG8gbm90IHdvcmsgcHJvcGVybHkgdGhlcmUuICBBbHNvIG11bHRpcGxlCiAgaW52b2NhdGlvbnMgb2YgbWFrZSByZWRpcmVjdGluZyB0byB0aGUgc2FtZSBvdXRwdXQgZmlsZSAoZS5nLiwgL2Rldi9udWxsKQogIHdvdWxkIGNhdXNlIGhhbmdzLiAgSW5zdGVhZCBvZiBsb2NraW5nIHN0ZG91dCAod2hpY2ggZG9lcyBoYXZlIHNvbWUgdXNlZnVsCiAgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzLCBidXQgaXMgbm90IHBvcnRhYmxlKSBjcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZQogIGFuZCBsb2NrIHRoYXQuICBXaW5kb3dzIGNvbnRpbnVlcyB0byB1c2UgYSBtdXRleCBhcyBiZWZvcmUuCgoqIEdOVSBNYWtlIGhhcyBzb21ldGltZXMgY2hvc2VuIHVuZXhwZWN0ZWQsIGFuZCBzdWItb3B0aW1hbCwgY2hhaW5zIG9mCiAgaW1wbGljaXQgcnVsZXMgZHVlIHRvIHRoZSBkZWZpbml0aW9uIG9mICJvdWdodCB0byBleGlzdCIgaW4gdGhlIGltcGxpY2l0CiAgcnVsZSBzZWFyY2ggYWxnb3JpdGhtLCB3aGljaCBjb25zaWRlcmVkIGFueSBwcmVyZXF1aXNpdGUgbWVudGlvbmVkIGluIHRoZQogIG1ha2VmaWxlIGFzICJvdWdodCB0byBleGlzdCIuICBUaGlzIGFsZ29yaXRobSBoYXMgYmVlbiBtb2RpZmllZCB0byBwcmVmZXIKICBwcmVyZXF1aXNpdGVzIG1lbnRpb25lZCBleHBsaWNpdGx5IGluIHRoZSB0YXJnZXQgYmVpbmcgYnVpbHQgYW5kIG9ubHkgaWYKICB0aGF0IHJlc3VsdHMgaW4gbm8gbWF0Y2hpbmcgcnVsZSwgd2lsbCBHTlUgTWFrZSBjb25zaWRlciBwcmVyZXF1aXNpdGVzCiAgbWVudGlvbmVkIGluIG90aGVyIHRhcmdldHMgYXMgIm91Z2h0IHRvIGV4aXN0Ii4KICBJbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSBEbWl0cnkgR29uY2hhcm92IDxkZ29uY2hhcm92QHVzZXJzLnNmLm5ldD4KCiogR05VIE1ha2Ugd2FzIHBlcmZvcm1pbmcgc2Vjb25kYXJ5IGV4cGFuc2lvbiBvZiBhbGwgdGFyZ2V0cywgZXZlbiB0YXJnZXRzCiAgd2hpY2ggZGlkbid0IG5lZWQgdG8gYmUgY29uc2lkZXJlZCBkdXJpbmcgdGhlIGJ1aWxkLiAgSW4gdGhpcyByZWxlYXNlCiAgb25seSB0YXJnZXRzIHdoaWNoIGFyZSBjb25zaWRlcmVkIHdpbGwgYmUgc2Vjb25kYXJpbHkgZXhwYW5kZWQuCiAgSW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgRG1pdHJ5IEdvbmNoYXJvdiA8ZGdvbmNoYXJvdkB1c2Vycy5zZi5uZXQ+CgoqIElmIHRoZSBNQUtFRkxBR1MgdmFyaWFibGUgaXMgbW9kaWZpZWQgaW4gYSBtYWtlZmlsZSwgaXQgd2lsbCBiZSByZS1wYXJzZWQKICBpbW1lZGlhdGVseSByYXRoZXIgdGhhbiBhZnRlciBhbGwgbWFrZWZpbGVzIGhhdmUgYmVlbiByZWFkLiAgTm90ZSB0aGF0CiAgYWx0aG91Z2ggYWxsIG9wdGlvbnMgYXJlIHBhcnNlZCBpbW1lZGlhdGVseSwgc29tZSBzcGVjaWFsIGVmZmVjdHMgd29uJ3QKICBhcHBlYXIgdW50aWwgYWZ0ZXIgYWxsIG1ha2VmaWxlcyBhcmUgcmVhZC4KCiogVGhlIC1JIG9wdGlvbiBhY2NlcHRzIGFuIGFyZ3VtZW50ICItIiAoZS5nLiwgIi1JLSIpIHdoaWNoIG1lYW5zICJyZXNldCB0aGUKICBsaXN0IG9mIHNlYXJjaCBkaXJlY3RvcmllcyB0byBlbXB0eSIuICBBbW9uZyBvdGhlciB0aGluZ3MgdGhpcyBjYW4gYmUgdXNlZAogIHRvIHByZXZlbnQgR05VIE1ha2UgZnJvbSBzZWFyY2hpbmcgaW4gaXRzIGRlZmF1bHQgbGlzdCBvZiBkaXJlY3Rvcmllcy4KCiogTmV3IGRlYnVnIG9wdGlvbiAicHJpbnQiIHdpbGwgc2hvdyB0aGUgcmVjaXBlIHRvIGJlIHJ1biwgZXZlbiB3aGVuIHNpbGVudAogIG1vZGUgaXMgc2V0LCBhbmQgbmV3IGRlYnVnIG9wdGlvbiAid2h5IiB3aWxsIHNob3cgd2h5IGEgdGFyZ2V0IGlzIHJlYnVpbHQKICAod2hpY2ggcHJlcmVxdWlzaXRlcyBjYXVzZWQgdGhlIHRhcmdldCB0byBiZSBjb25zaWRlcmVkIG91dCBvZiBkYXRlKS4KICBJbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSBEYXZpZCBCb3ljZSA8RGF2aWQuUy5Cb3ljZUBnbWFpbC5jb20+CgoqIFRoZSBleGlzdGluZyAtLXRyYWNlIG9wdGlvbiBpcyBtYWRlIGVxdWl2YWxlbnQgdG8gLS1kZWJ1Zz1wcmludCx3aHkKCiogVGFyZ2V0LXNwZWNpZmljIHZhcmlhYmxlcyBjYW4gbm93IGJlIG1hcmtlZCAidW5leHBvcnQiLgoKKiBFeHBvcnRpbmcgLyB1bmV4cG9ydGluZyB0YXJnZXQtc3BlY2lmaWMgdmFyaWFibGVzIGlzIGhhbmRsZWQgY29ycmVjdGx5LCBzbwogIHRoYXQgdGhlIGF0dHJpYnV0ZSBvZiB0aGUgbW9zdCBzcGVjaWZpYyB2YXJpYWJsZSBzZXR0aW5nIGlzIHVzZWQuCgoqIFNwZWNpYWwgdGFyZ2V0cyBsaWtlIC5QT1NJWCBhcmUgZGV0ZWN0ZWQgdXBvbiBkZWZpbml0aW9uLCBlbnN1cmluZyB0aGF0IGFueQogIGNoYW5nZSBpbiBiZWhhdmlvciB0YWtlcyBlZmZlY3QgaW1tZWRpYXRlbHksIGJlZm9yZSB0aGUgbmV4dCBsaW5lIGlzIHBhcnNlZC4KCiogV2hlbiB0aGUgcGlwZS1iYXNlZCBqb2JzZXJ2ZXIgaXMgZW5hYmxlZCBhbmQgR05VIE1ha2UgZGVjaWRlcyBpdCBpcyBpbnZva2luZwogIGEgbm9uLW1ha2Ugc3ViLXByb2Nlc3MgYW5kIGNsb3NlcyB0aGUgam9ic2VydmVyIHBpcGVzLCBpdCB3aWxsIG5vdyBhZGQgYSBuZXcKICBvcHRpb24gdG8gdGhlIE1BS0VGTEFHUyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0aGF0IGRpc2FibGVzIHRoZSBqb2JzZXJ2ZXIuCiAgVGhpcyBwcmV2ZW50cyBzdWItcHJvY2Vzc2VzIHRoYXQgaW52b2tlIG1ha2UgZnJvbSBhY2NpZGVudGFsbHkgdXNpbmcgb3RoZXIKICBvcGVuIGZpbGUgZGVzY3JpcHRvcnMgYXMgam9ic2VydmVyIHBpcGVzLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlCiAgaHR0cHM6Ly9zYXZhbm5haC5nbnUub3JnL2J1Z3MvPzU3MjQyIGFuZCBodHRwczovL3NhdmFubmFoLmdudS5vcmcvYnVncy8/NjIzOTcKCiogQSBsb25nLXN0YW5kaW5nIGlzc3VlIHdpdGggdGhlIGRpcmVjdG9yeSBjYWNoZSBoYXMgYmVlbiByZXNvbHZlZDogY2hhbmdlcwogIG1hZGUgYXMgYSBzaWRlLWVmZmVjdCBvZiBzb21lIG90aGVyIHRhcmdldCdzIHJlY2lwZSBhcmUgbm93IG5vdGljZWQgYXMKICBleHBlY3RlZC4KCiogR05VIE1ha2UgY2FuIG5vdyBiZSBidWlsdCBmb3IgTVMtV2luZG93cyB1c2luZyB0aGUgVGlueSBDIHRjYyBjb21waWxlci4KICBQb3J0IHByb3ZpZGVkIGJ5IENocmlzdGlhbiBKdWxsaWVuIDxlbGlnaXNAb3JhbmdlLmZyPgoKDApWZXJzaW9uIDQuMyAoMTkgSmFuIDIwMjApCgpBIGNvbXBsZXRlIGxpc3Qgb2YgYnVncyBmaXhlZCBpbiB0aGlzIHZlcnNpb24gaXMgYXZhaWxhYmxlIGhlcmU6CgpodHRwczovL3N2LmdudS5vcmcvYnVncy9pbmRleC5waHA/Z3JvdXA9bWFrZSZyZXBvcnRfaWQ9MTExJmZpeF9yZWxlYXNlX2lkPTEwOCZzZXQ9Y3VzdG9tCgoqIFdBUk5JTkc6IEJhY2t3YXJkLWluY29tcGF0aWJpbGl0eSEKICBOdW1iZXIgc2lnbnMgKCMpIGFwcGVhcmluZyBpbnNpZGUgYSBtYWNybyByZWZlcmVuY2Ugb3IgZnVuY3Rpb24gaW52b2NhdGlvbgogIG5vIGxvbmdlciBpbnRyb2R1Y2UgY29tbWVudHMgYW5kIHNob3VsZCBub3QgYmUgZXNjYXBlZCB3aXRoIGJhY2tzbGFzaGVzOgogIHRodXMgYSBjYWxsIHN1Y2ggYXM6CiAgICBmb28gOj0gJChzaGVsbCBlY2hvICcjJykKICBpcyBsZWdhbC4gIFByZXZpb3VzbHkgdGhlIG51bWJlciBzaWduIG5lZWRlZCB0byBiZSBlc2NhcGVkLCBmb3IgZXhhbXBsZToKICAgIGZvbyA6PSAkKHNoZWxsIGVjaG8gJ1wjJykKICBOb3cgdGhpcyBsYXR0ZXIgd2lsbCByZXNvbHZlIHRvICJcIyIuICBJZiB5b3Ugd2FudCB0byB3cml0ZSBtYWtlZmlsZXMKICBwb3J0YWJsZSB0byBib3RoIHZlcnNpb25zLCBhc3NpZ24gdGhlIG51bWJlciBzaWduIHRvIGEgdmFyaWFibGU6CiAgICBIIDo9IFwjCiAgICBmb28gOj0gJChzaGVsbCBlY2hvICckSCcpCiAgVGhpcyB3YXMgY2xhaW1lZCB0byBiZSBmaXhlZCBpbiAzLjgxLCBidXQgd2Fzbid0LCBmb3Igc29tZSByZWFzb24uCiAgVG8gZGV0ZWN0IHRoaXMgY2hhbmdlIHNlYXJjaCBmb3IgJ25vY29tbWVudCcgaW4gdGhlIC5GRUFUVVJFUyB2YXJpYWJsZS4KCiogV0FSTklORzogQmFja3dhcmQtaW5jb21wYXRpYmlsaXR5IQogIFByZXZpb3VzbHkgYXBwZW5kaW5nIHVzaW5nICcrPScgdG8gYW4gZW1wdHkgdmFyaWFibGUgd291bGQgcmVzdWx0IGluIGEgdmFsdWUKICBzdGFydGluZyB3aXRoIGEgc3BhY2UuICBOb3cgdGhlIGluaXRpYWwgc3BhY2UgaXMgb25seSBhZGRlZCBpZiB0aGUgdmFyaWFibGUKICBhbHJlYWR5IGNvbnRhaW5zIHNvbWUgdmFsdWUuICBTaW1pbGFybHksIGFwcGVuZGluZyBhbiBlbXB0eSBzdHJpbmcgZG9lcyBub3QKICBhZGQgYSB0cmFpbGluZyBzcGFjZS4KCiogV0FSTklORzogQmFja3dhcmQtaW5jb21wYXRpYmlsaXR5IQogIFByZXZpb3VzbHkgdXNpbmcgdGhlIC5TSUxFTlQgcHNldWRvLXRhcmdldCBpbiBhIG1ha2VmaWxlIHdvdWxkIGZvcmNlIGFsbAogIHN1Yi1tYWtlcyB0byBiZSBpbnZva2VkIHdpdGggdGhlICctcycgb3B0aW9uLCBlZmZlY3RpdmVseSBtYWtpbmcgYWxsCiAgc3ViLW1ha2VzIHNpbGVudCBhcyB3ZWxsLiAgSW4gdGhpcyByZWxlYXNlIC5TSUxFTlQgb25seSBhZmZlY3RzIHRoZSBjdXJyZW50CiAgaW52b2NhdGlvbiBvZiBtYWtlLiAgQSBzaWRlLWVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgLlNJTEVOVCB3aWxsIG5vIGxvbmdlcgogIGVuYWJsZSB0aGUgLS1uby1wcmludC1kaXJlY3Rvcnkgb3B0aW9uLCB3aGljaCB1c2luZyAtcyB3aWxsIGRvLgoKKiBOT1RFOiBEZXByZWNhdGVkIGJlaGF2aW9yLgogIENvbnRyYXJ5IHRvIHRoZSBkb2N1bWVudGF0aW9uLCBzdWZmaXggcnVsZXMgd2l0aCBwcmVyZXF1aXNpdGVzIGFyZSBiZWluZwogIHRyZWF0ZWQgQk9USCBhcyBzaW1wbGUgdGFyZ2V0cyBBTkQgYXMgcGF0dGVybiBydWxlcy4gIEZ1cnRoZXIsIHRoZQogIHByZXJlcXVpc2l0ZXMgYXJlIGlnbm9yZWQgYnkgdGhlIHBhdHRlcm4gcnVsZXMuICBQT1NJWCBzcGVjaWZpZXMgdGhhdCBpbgogIG9yZGVyIHRvIGJlIGEgc3VmZml4IHJ1bGUgdGhlcmUgY2FuIGJlIG5vIHByZXJlcXVpc2l0ZXMgZGVmaW5lZC4gIEluIHRoaXMKICByZWxlYXNlIGlmIFBPU0lYIG1vZGUgaXMgZW5hYmxlZCB0aGVuIHJ1bGVzIHdpdGggcHJlcmVxdWlzaXRlcyBjYW5ub3QgYmUKICBzdWZmaXggcnVsZXMuICBJZiBQT1NJWCBtb2RlIGlzIG5vdCBlbmFibGVkIHRoZW4gdGhlIHByZXZpb3VzIGJlaGF2aW9yIGlzCiAgcHJlc2VydmVkIChhIHBhdHRlcm4gcnVsZSB3aXRoIG5vIGV4dHJhIHByZXJlcXVpc2l0ZXMgaXMgY3JlYXRlZCkgQU5EIGEKICB3YXJuaW5nIGFib3V0IHRoaXMgYmVoYXZpb3IgaXMgZ2VuZXJhdGVkOgogICAgd2FybmluZzogaWdub3JpbmcgcHJlcmVxdWlzaXRlcyBvbiBzdWZmaXggcnVsZSBkZWZpbml0aW9uCiAgVGhlIFBPU0lYIGJlaGF2aW9yIHdpbGwgYmUgYWRvcHRlZCBhcyB0aGUgb25seSBiZWhhdmlvciBpbiBhIGZ1dHVyZSByZWxlYXNlCiAgb2YgR05VIE1ha2Ugc28gcGxlYXNlIHJlc29sdmUgYW55IHdhcm5pbmdzLgoKKiBOZXcgZmVhdHVyZTogR3JvdXBlZCBleHBsaWNpdCB0YXJnZXRzCiAgUGF0dGVybiBydWxlcyBoYXZlIGFsd2F5cyBoYWQgdGhlIGFiaWxpdHkgdG8gZ2VuZXJhdGUgbXVsdGlwbGUgdGFyZ2V0cyB3aXRoCiAgYSBzaW5nbGUgaW52b2NhdGlvbiBvZiB0aGUgcmVjaXBlLiAgSXQncyBub3cgcG9zc2libGUgdG8gZGVjbGFyZSB0aGF0IGFuCiAgZXhwbGljaXQgcnVsZSBnZW5lcmF0ZXMgbXVsdGlwbGUgdGFyZ2V0cyB3aXRoIGEgc2luZ2xlIGludm9jYXRpb24uICBUbyB1c2UKICB0aGlzLCByZXBsYWNlIHRoZSAiOiIgdG9rZW4gd2l0aCAiJjoiIGluIHRoZSBydWxlLiAgVG8gZGV0ZWN0IHRoaXMgZmVhdHVyZQogIHNlYXJjaCBmb3IgJ2dyb3VwZWQtdGFyZ2V0JyBpbiB0aGUgLkZFQVRVUkVTIHNwZWNpYWwgdmFyaWFibGUuCiAgSW1wbGVtZW50YXRpb24gY29udHJpYnV0ZWQgYnkgS2F6IEt5bGhla3UgPGthekBreWxoZWt1LmNvbT4KCiogTmV3IGZlYXR1cmU6IC5FWFRSQV9QUkVSRVFTIHZhcmlhYmxlCiAgV29yZHMgaW4gdGhpcyB2YXJpYWJsZSBhcmUgY29uc2lkZXJlZCBwcmVyZXF1aXNpdGVzIG9mIHRhcmdldHMgYnV0IHRoZXkgYXJlCiAgbm90IGFkZGVkIHRvIGFueSBvZiB0aGUgYXV0b21hdGljIHZhcmlhYmxlIHZhbHVlcyB3aGVuIGV4cGFuZGluZyB0aGUKICByZWNpcGUuICBUaGlzIHZhcmlhYmxlIGNhbiBlaXRoZXIgYmUgZ2xvYmFsIChhcHBsaWVzIHRvIGFsbCB0YXJnZXRzKSBvcgogIGEgdGFyZ2V0LXNwZWNpZmljIHZhcmlhYmxlLiAgVG8gZGV0ZWN0IHRoaXMgZmVhdHVyZSBzZWFyY2ggZm9yICdleHRyYS1wcmVyZXFzJwogIGluIHRoZSAuRkVBVFVSRVMgc3BlY2lhbCB2YXJpYWJsZS4KICBJbXBsZW1lbnRhdGlvbiBjb250cmlidXRlZCBieSBDaHJpc3RvZiBXYXJsaWNoIDxjd2FybGljaEBnbXguZGU+CgoqIE1ha2VmaWxlcyBjYW4gbm93IHNwZWNpZnkgdGhlICctaicgb3B0aW9uIGluIHRoZWlyIE1BS0VGTEFHUyB2YXJpYWJsZSBhbmQKICB0aGlzIHdpbGwgY2F1c2UgbWFrZSB0byBlbmFibGUgdGhhdCBwYXJhbGxlbGlzbSBtb2RlLgoKKiBHTlUgTWFrZSB3aWxsIG5vdyB1c2UgcG9zaXhfc3Bhd24oKSBvbiBzeXN0ZW1zIHdoZXJlIGl0IGlzIGF2YWlsYWJsZS4KICBJZiB5b3UgcHJlZmVyIHRvIHVzZSBmb3JrL2V4ZWMgZXZlbiBvbiBzeXN0ZW1zIHdoZXJlIHBvc2l4X3NwYXduKCkgaXMKICBwcmVzZW50LCB5b3UgY2FuIHVzZSB0aGUgLS1kaXNhYmxlLXBvc2l4LXNwYXduIG9wdGlvbiB0byBjb25maWd1cmUuCiAgSW1wbGVtZW50YXRpb24gY29udHJpYnV0ZWQgYnkgQXJvbiBCYXJhdGggPGJhcmF0aGFyb25AY2Flc2FyLmVsdGUuaHU+CgoqIEVycm9yIG1lc3NhZ2VzIHByaW50ZWQgd2hlbiBpbnZva2luZyBub24tZXhpc3RlbnQgY29tbWFuZHMgaGF2ZSBiZWVuIGNsZWFuZWQKICB1cCBhbmQgbWFkZSBjb25zaXN0ZW50LgoKKiBUaGUgcHJldmlvdXMgbGltaXQgb2YgNjMgam9icyB1bmRlciAtak4gb24gTVMtV2luZG93cyBpcyBub3cKICBpbmNyZWFzZWQgdG8gNDA5NS4gIFRoYXQgbGltaXQgaW5jbHVkZXMgdGhlIHN1YnByb2Nlc3Mgc3RhcnRlZCBieQogIHRoZSAkKHNoZWxsKSBmdW5jdGlvbi4KCiogQSBuZXcgb3B0aW9uIC0tbm8tc2lsZW50IGhhcyBiZWVuIGFkZGVkLCB0aGF0IGNhbmNlbHMgdGhlIGVmZmVjdCBvZiB0aGUKICAtcy8tLXNpbGVudC8tLXF1aWV0IGZsYWcuCgoqIEEgbmV3IG9wdGlvbiAtRSBoYXMgYmVlbiBhZGRlZCBhcyBhIHNob3J0IGFsaWFzIGZvciAtLWV2YWwuCgoqIEFsbCB3aWxkY2FyZCBleHBhbnNpb24gd2l0aGluIEdOVSBNYWtlLCBpbmNsdWRpbmcgJCh3aWxkY2FyZCAuLi4pLCB3aWxsIHNvcnQKICB0aGUgcmVzdWx0cy4gIFNlZSBodHRwczovL3NhdmFubmFoLmdudS5vcmcvYnVncy9pbmRleC5waHA/NTIwNzYKCiogSW50ZXJvcGVyYXRlIHdpdGggbmV3ZXIgR05VIGxpYmMgYW5kIG11c2wgQyBydW50aW1lIGxpYnJhcmllcy4KCiogUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIHByb3ZpZGVkIGJ5IFBhb2xvIEJvbnppbmkgPHBib256aW5pQHJlZGhhdC5jb20+CgpHTlUgTWFrZSBEZXZlbG9wZXIgTmV3cwoKKiBJbXBvcnQgdGhlIEdOVSBzdGFuZGFyZCBib290c3RyYXAgc2NyaXB0IHRvIHJlcGxhY2UgdGhlIGhhbmQtcm9sbGVkCiAgIm1ha2UgdXBkYXRlIiBtZXRob2QgZm9yIGJ1aWxkaW5nIGNvZGUgZnJvbSBhIEdOVSBNYWtlIEdpdCByZXBvc2l0b3J5LgoKKiBSZXdvcmsgdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gdG8gbW92ZSBzb3VyY2UgZmlsZXMgaW50byB0aGUgc3JjLyoKICBzdWJkaXJlY3RvcnkuICBUaGlzIGFsaWducyB3aXRoIG1vZGVybiBiZXN0IHByYWN0aWNlcyBpbiBHTlUuCgoqIFJlcGxhY2UgbG9jYWwgcG9ydGFiaWxpdHkgY29kZSB3aXRoIEdudWxpYiBjb250ZW50LiAgVW5mb3J0dW5hdGVseSBkdWUgdG8gYQogIHByb2JsZW0gd2l0aCBHbnVsaWIgc3VwcG9ydCBmb3IgZ2V0bG9hZGF2ZywgdGhpcyBmb3JjZXMgYSByZXF1aXJlbWVudCBvbgogIEF1dG9tYWtlIDEuMTYgb3IgYWJvdmUgaW4gb3JkZXIgdG8gYnVpbGQgZnJvbSBHaXQuICBTZWUgUkVBRE1FLmdpdC4KCgwKVmVyc2lvbiA0LjIuMSAoMTAgSnVuIDIwMTYpCgpBIGNvbXBsZXRlIGxpc3Qgb2YgYnVncyBmaXhlZCBpbiB0aGlzIHZlcnNpb24gaXMgYXZhaWxhYmxlIGhlcmU6CgpodHRwczovL3N2LmdudS5vcmcvYnVncy9pbmRleC5waHA/Z3JvdXA9bWFrZSZyZXBvcnRfaWQ9MTExJmZpeF9yZWxlYXNlX2lkPTEwNyZzZXQ9Y3VzdG9tCgpUaGlzIHJlbGVhc2UgaXMgYSBidWctZml4IHJlbGVhc2UuCgoMClZlcnNpb24gNC4yICgyMiBNYXkgMjAxNikKCkEgY29tcGxldGUgbGlzdCBvZiBidWdzIGZpeGVkIGluIHRoaXMgdmVyc2lvbiBpcyBhdmFpbGFibGUgaGVyZToKCmh0dHBzOi8vc3YuZ251Lm9yZy9idWdzL2luZGV4LnBocD9ncm91cD1tYWtlJnJlcG9ydF9pZD0xMTEmZml4X3JlbGVhc2VfaWQ9MTA2JnNldD1jdXN0b20KCiogTmV3IHZhcmlhYmxlOiAkKC5TSEVMTFNUQVRVUykgaXMgc2V0IHRvIHRoZSBleGl0IHN0YXR1cyBvZiB0aGUgbGFzdCAhPSBvcgogICQoc2hlbGwgLi4uKSBmdW5jdGlvbiBpbnZva2VkIGluIHRoaXMgaW5zdGFuY2Ugb2YgbWFrZS4gIFRoaXMgd2lsbCBiZSAiMCIgaWYKICBzdWNjZXNzZnVsIG9yIG5vdCAiMCIgaWYgbm90IHN1Y2Nlc3NmdWwuICBUaGUgdmFyaWFibGUgdmFsdWUgaXMgdW5zZXQgaWYgbm8KICAhPSBvciAkKHNoZWxsIC4uLikgZnVuY3Rpb24gaGFzIGJlZW4gaW52b2tlZC4KCiogVGhlICQoZmlsZSAuLi4pIGZ1bmN0aW9uIGNhbiBub3cgcmVhZCBmcm9tIGEgZmlsZSB3aXRoICQoZmlsZSA8RklMRSkuCiAgVGhlIGZ1bmN0aW9uIGlzIGV4cGFuZGVkIHRvIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZS4gIFRoZSBjb250ZW50cyBhcmUKICBleHBhbmRlZCB2ZXJiYXRpbSBleGNlcHQgdGhhdCB0aGUgZmluYWwgbmV3bGluZSwgaWYgYW55LCBpcyBzdHJpcHBlZC4KCiogVGhlIG1ha2VmaWxlIGxpbmUgbnVtYmVycyBzaG93biBieSBHTlUgTWFrZSBub3cgcG9pbnQgZGlyZWN0bHkgdG8gdGhlCiAgc3BlY2lmaWMgbGluZSBpbiB0aGUgcmVjaXBlIHdoZXJlIHRoZSBmYWlsdXJlIG9yIHdhcm5pbmcgb2NjdXJyZWQuCiAgU2FtcGxlIGNoYW5nZXMgc3VnZ2VzdGVkIGJ5IEJyaWFuIFZhbmRlbmJlcmcgPHBoYW50YWxsQGdtYWlsLmNvbT4KCiogVGhlIGludGVyZmFjZSB0byBHTlUgTWFrZSdzICJqb2JzZXJ2ZXIiIGlzIHN0YWJsZSBhcyBkb2N1bWVudGVkIGluIHRoZQogIG1hbnVhbCwgZm9yIHRvb2xzIHdoaWNoIG1heSB3YW50IHRvIGFjY2VzcyBpdC4KCiAgV0FSTklORzogQmFja3dhcmQtaW5jb21wYXRpYmlsaXR5ISBUaGUgaW50ZXJuYWwtb25seSBjb21tYW5kIGxpbmUgb3B0aW9uCiAgLS1qb2JzZXJ2ZXItZmRzIGhhcyBiZWVuIHJlbmFtZWQgZm9yIHB1Ymxpc2hpbmcsIHRvIC0tam9ic2VydmVyLWF1dGguCgoqIFRoZSBhbW91bnQgb2YgcGFyYWxsZWxpc20gY2FuIGJlIGRldGVybWluZWQgYnkgcXVlcnlpbmcgTUFLRUZMQUdTLCBldmVuIHdoZW4KICB0aGUgam9iIHNlcnZlciBpcyBlbmFibGVkIChwcmV2aW91c2x5IE1BS0VGTEFHUyB3b3VsZCBhbHdheXMgY29udGFpbiBvbmx5CiAgIi1qIiwgd2l0aCBubyBudW1iZXIsIHdoZW4gam9iIHNlcnZlciB3YXMgZW5hYmxlZCkuCgoqIFZNUy1zcGVjaWZpYyBjaGFuZ2VzOgoKICAqIFBlcmwgdGVzdCBoYXJuZXNzIG5vdyB3b3Jrcy4KCiAgKiBGdWxsIHN1cHBvcnQgZm9yIGNvbnZlcnRpbmcgVW5peCBleGl0IHN0YXR1cyBjb2RlcyB0byBWTVMgZXhpdCBzdGF0dXMKICAgIGNvZGVzLiAgQkFDS1dBUkQgSU5DT01QQVRJQklMSVRZIE5vdGljZTogT24gYSBjaGlsZCBmYWlsdXJlIHRoZSBWTVMgZXhpdAogICAgY29kZSBpcyBub3cgdGhlIGVuY29kZWQgVW5peCBleGl0IHN0YXR1cyB0aGF0IE1ha2UgdXN1YWxseSBnZW5lcmF0ZXMsIG5vdAogICAgdGhlIFZNUyBleGl0IHN0YXR1cyBvZiB0aGUgY2hpbGQuCgoMClZlcnNpb24gNC4xICgwNSBPY3QgMjAxNCkKCkEgY29tcGxldGUgbGlzdCBvZiBidWdzIGZpeGVkIGluIHRoaXMgdmVyc2lvbiBpcyBhdmFpbGFibGUgaGVyZToKCmh0dHBzOi8vc3YuZ251Lm9yZy9idWdzL2luZGV4LnBocD9ncm91cD1tYWtlJnJlcG9ydF9pZD0xMTEmZml4X3JlbGVhc2VfaWQ9MTA1JnNldD1jdXN0b20KCiogTmV3IHZhcmlhYmxlczogJChNQUtFX1RFUk1PVVQpIGFuZCAkKE1BS0VfVEVSTUVSUikgYXJlIHNldCB0byBub24tZW1wdHkKICB2YWx1ZXMgaWYgc3Rkb3V0IG9yIHN0ZGVyciwgcmVzcGVjdGl2ZWx5LCBhcmUgYmVsaWV2ZWQgdG8gYmUgd3JpdGluZyB0byBhCiAgdGVybWluYWwuICBUaGVzZSB2YXJpYWJsZXMgYXJlIGV4cG9ydGVkIGJ5IGRlZmF1bHQuCgoqIEFsbG93IGEgbm8tdGV4dC1hcmd1bWVudCBmb3JtIG9mIHRoZSAkKGZpbGUgLi4uKSBmdW5jdGlvbi4gIFdpdGhvdXQgYSB0ZXh0CiAgYXJndW1lbnQgbm90aGluZyBpcyB3cml0dGVuIHRvIHRoZSBmaWxlOiBpdCBpcyBzaW1wbHkgb3BlbmVkIGluIHRoZQogIHJlcXVlc3RlZCBtb2RlLCB0aGVuIGNsb3NlZCBhZ2Fpbi4KCiogQ2hhbmdlIHRoZSBmYXRhbCBlcnJvciBmb3IgbWl4ZWQgZXhwbGljaXQgYW5kIGltcGxpY2l0IHJ1bGVzLCB0aGF0IHdhcwogIGludHJvZHVjZWQgaW4gR05VIE1ha2UgMy44MiwgdG8gYSBub24tZmF0YWwgZXJyb3IuICBIb3dldmVyLCB0aGlzIHN5bnRheCBpcwogIHN0aWxsIGRlcHJlY2F0ZWQgYW5kIG1heSByZXR1cm4gdG8gYmVpbmcgaWxsZWdhbCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIEdOVQogIG1ha2UuICBNYWtlZmlsZXMgdGhhdCByZWx5IG9uIHRoaXMgc3ludGF4IHNob3VsZCBiZSBmaXhlZC4KICBTZWUgaHR0cHM6Ly9zYXZhbm5haC5nbnUub3JnL2J1Z3MvPzMzMDM0CgoqIFZNUy1zcGVjaWZpYyBjaGFuZ2VzOgoKICAqIFN1cHBvcnQgZm9yIGxpYnJhcnkgZmlsZXMgYWRkZWQsIGluY2x1ZGluZyBzdXBwb3J0IGZvciB1c2luZyB0aGUgR05WIGFyCiAgICB1dGlsaXR5LgoKICAqIFBhcnRpYWwgc3VwcG9ydCBmb3IgcHJvcGVybHkgZW5jb2RpbmcgVW5peCBleGl0IHN0YXR1cyBjb2RlcyBpbnRvIFZNUyBleGl0CiAgICBzdGF0dXMgY29kZXMuCgogICAgV0FSTklORzogQmFja3dhcmQtaW5jb21wYXRpYmlsaXR5ISBUaGVzZSBhcmUgZGlmZmVyZW50IGV4aXQgc3RhdHVzIGNvZGVzCiAgICB0aGFuIE1ha2UgZXhpdGVkIHdpdGggaW4gdGhlIHBhc3QuCgogICogTWFjcm9zIHRvIGhvbGQgdGhlIGN1cnJlbnQgbWFrZSBjb21tYW5kIGFyZSBzZXQgdXAgdG8gdHJhbnNsYXRlIHRoZQogICAgYXJndlswXSBzdHJpbmcgdG8gYSBWTVMgZm9ybWF0IHBhdGggbmFtZSBhbmQgcHJlZml4IGl0IHdpdGggIk1DUiAiIHNvIHRoYXQKICAgIHRoZSBtYWNybyBoYXMgYSBzcGFjZSBpbiBpdC4KCiAgICBXQVJOSU5HOiBCYWNrd2FyZC1pbmNvbXBhdGliaWxpdHkhICBUaGlzIG1heSBicmVhayBjb21wbGV4IG1ha2VmaWxlcyB0aGF0CiAgICBkbyBwcm9jZXNzaW5nIG9uIHRob3NlIG1hY3Jvcy4gIFRoaXMgaXMgdW5saWtlbHkgYmVjYXVzZSBzbyBtdWNoIGluIHRoYXQKICAgIGFyZWEgd2FzIG5vdCBhbmQgaXMgc3RpbGwgbm90IGN1cnJlbnRseSB3b3JraW5nIG9uIFZNUywgaXQgaXMgdW5saWtlbHkgdG8KICAgIGZpbmQgc3VjaCBhIGNvbXBsZXggbWFrZWZpbGUsIHNvIHRoaXMgaXMgbW9yZSBsaWtlbHkgdG8gaW1wYWN0CiAgICBjb25zdHJ1Y3Rpb24gb2YgYSBmdXR1cmUgbWFrZWZpbGUuCgogICogQSBjb21tYW5kIGZpbGUgaXMgYWx3YXlzIHVzZWQgdG8gcnVuIHRoZSBjb21tYW5kcyBmb3IgYSByZWNpcGUuCgogICAgV0FSTklORzogQmFja3dhcmQtaW5jb21wYXRpYmlsaXR5ISAgUnVubmluZyB0aGUgbWFrZSBzZWxmIHRlc3RzIGhhcwogICAgZXhwb3NlZCB0aGF0IHRoZXJlIGFyZSBzaWduaWZpY2FudCBkaWZmZXJlbmNlcyBpbiBiZWhhdmlvciB3aGVuIHJ1bm5pbmcKICAgIHdpdGggdGhlIGNvbW1hbmQgZmlsZSBtb2RlLiAgSXQgaXMgdW5rbm93biBpZiB0aGlzIHdpbGwgYmUgbm90aWNlZCBieSBtb3N0CiAgICBleGlzdGluZyBWTVMgbWFrZWZpbGVzLgoMClZlcnNpb24gNC4wICgwOSBPY3QgMjAxMykKCkEgY29tcGxldGUgbGlzdCBvZiBidWdzIGZpeGVkIGluIHRoaXMgdmVyc2lvbiBpcyBhdmFpbGFibGUgaGVyZToKCmh0dHBzOi8vc3YuZ251Lm9yZy9idWdzL2luZGV4LnBocD9ncm91cD1tYWtlJnJlcG9ydF9pZD0xMTEmZml4X3JlbGVhc2VfaWQ9MTAxJnNldD1jdXN0b20KCiogV0FSTklORzogQmFja3dhcmQtaW5jb21wYXRpYmlsaXR5IQogIElmIC5QT1NJWCBpcyBzcGVjaWZpZWQsIHRoZW4gbWFrZSBhZGhlcmVzIHRvIHRoZSBQT1NJWCBiYWNrc2xhc2gvbmV3bGluZQogIGhhbmRsaW5nIHJlcXVpcmVtZW50cywgd2hpY2ggaW50cm9kdWNlcyB0aGUgZm9sbG93aW5nIGNoYW5nZXMgdG8gdGhlCiAgc3RhbmRhcmQgYmFja3NsYXNoL25ld2xpbmUgaGFuZGxpbmcgaW4gbm9uLXJlY2lwZSBsaW5lczoKICAqIEFueSB0cmFpbGluZyBzcGFjZSBiZWZvcmUgdGhlIGJhY2tzbGFzaCBpcyBwcmVzZXJ2ZWQKICAqIEVhY2ggYmFja3NsYXNoL25ld2xpbmUgKHBsdXMgc3Vic2VxdWVudCB3aGl0ZXNwYWNlKSBpcyBjb252ZXJ0ZWQgdG8gYQogICAgc2luZ2xlIHNwYWNlCgoqIE5ldyBmZWF0dXJlOiBHTlUgR3VpbGUgaW50ZWdyYXRpb24KICBUaGlzIHZlcnNpb24gb2YgR05VIE1ha2UgY2FuIGJlIGNvbXBpbGVkIHdpdGggR05VIEd1aWxlIGludGVncmF0aW9uLgogIEdOVSBHdWlsZSBzZXJ2ZXMgYXMgYW4gZW1iZWRkZWQgZXh0ZW5zaW9uIGxhbmd1YWdlIGZvciBtYWtlLgogIFNlZSB0aGUgIkd1aWxlIEZ1bmN0aW9uIiBzZWN0aW9uIGluIHRoZSBHTlUgTWFrZSBtYW51YWwgZm9yIGRldGFpbHMuCiAgQ3VycmVudGx5IEdOVSBHdWlsZSAxLjggYW5kIDIuMCsgYXJlIHN1cHBvcnRlZC4gIEluIEd1aWxlIDEuOCB0aGVyZSBpcyBubwogIHN1cHBvcnQgZm9yIGludGVybmF0aW9uYWxpemVkIGNoYXJhY3RlciBzZXRzLiAgSW4gR3VpbGUgMi4wKywgc2NyaXB0cyBjYW4gYmUKICBlbmNvZGVkIGluIFVURi04LgoKKiBOZXcgY29tbWFuZCBsaW5lIG9wdGlvbjogLS1vdXRwdXQtc3luYyAoLU8pIGVuYWJsZXMgZ3JvdXBpbmcgb2Ygb3V0cHV0IGJ5CiAgdGFyZ2V0IG9yIGJ5IHJlY3Vyc2l2ZSBtYWtlLiAgVGhpcyBpcyB1c2VmdWwgZHVyaW5nIHBhcmFsbGVsIGJ1aWxkcyB0byBhdm9pZAogIG1peGluZyBvdXRwdXQgZnJvbSBkaWZmZXJlbnQgam9icyB0b2dldGhlciBnaXZpbmcgaGFyZC10by11bmRlcnN0YW5kCiAgcmVzdWx0cy4gIE9yaWdpbmFsIGltcGxlbWVudGF0aW9uIGJ5IERhdmlkIEJveWNlIDxkc2JAYm95c2tpLmNvbT4uCiAgUmV3b3JrZWQgYW5kIGVuaGFuY2VkIGJ5IEZyYW5rIEhlY2tlbmJhY2ggPGYuaGVja2VuYmFjaEBmaC1zb2Z0LmRlPi4KICBXaW5kb3dzIHN1cHBvcnQgYnkgRWxpIFphcmV0c2tpaSA8ZWxpekBnbnUub3JnPi4KCiogTmV3IGNvbW1hbmQgbGluZSBvcHRpb246IC0tdHJhY2UgZW5hYmxlcyB0cmFjaW5nIG9mIHRhcmdldHMuICBXaGVuIGVuYWJsZWQKICB0aGUgcmVjaXBlIHRvIGJlIGludm9rZWQgaXMgcHJpbnRlZCBldmVuIGlmIGl0IHdvdWxkIG90aGVyd2lzZSBiZSBzdXBwcmVzc2VkCiAgYnkgLlNJTEVOVCBvciBhICJAIiBwcmVmaXggY2hhcmFjdGVyLiAgQWxzbyBiZWZvcmUgZWFjaCByZWNpcGUgaXMgcnVuIHRoZQogIG1ha2VmaWxlIG5hbWUgYW5kIGxpbmVudW1iZXIgd2hlcmUgaXQgd2FzIGRlZmluZWQgYXJlIHNob3duIGFzIHdlbGwgYXMgdGhlCiAgcHJlcmVxdWlzaXRlcyB0aGF0IGNhdXNlZCB0aGUgdGFyZ2V0IHRvIGJlIGNvbnNpZGVyZWQgb3V0IG9mIGRhdGUuCgoqIE5ldyBjb21tYW5kIGxpbmUgb3B0aW9uIGFyZ3VtZW50OiAtLWRlYnVnIG5vdyBhY2NlcHRzIGEgIm4iIChub25lKSBmbGFnCiAgd2hpY2ggZGlzYWJsZXMgYWxsIGRlYnVnZ2luZyBzZXR0aW5ncyB0aGF0IGFyZSBjdXJyZW50bHkgZW5hYmxlZC4KCiogTmV3IGZlYXR1cmU6IFRoZSAiam9iIHNlcnZlciIgY2FwYWJpbGl0eSBpcyBub3cgc3VwcG9ydGVkIG9uIFdpbmRvd3MuCiAgSW1wbGVtZW50YXRpb24gY29udHJpYnV0ZWQgYnkgVHJveSBSdW5rZWwgPFRyb3kuUnVua2VsQG1hdGh3b3Jrcy5jb20+CgoqIE5ldyBmZWF0dXJlOiBUaGUgLk9ORVNIRUxMIGNhcGFiaWxpdHkgaXMgbm93IHN1cHBvcnRlZCBvbiBXaW5kb3dzLiAgU3VwcG9ydAogIGFkZGVkIGJ5IEVsaSBaYXJldHNraWkgPGVsaXpAZ251Lm9yZz4uCgoqIE5ldyBmZWF0dXJlOiAiIT0iIHNoZWxsIGFzc2lnbm1lbnQgb3BlcmF0b3IgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlCiAgJChzaGVsbCAuLi4pIGZ1bmN0aW9uLiAgSW1wbGVtZW50ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBCU0QgbWFrZWZpbGVzLgogIE5vdGUgdGhlcmUgYXJlIHN1YnRsZSBkaWZmZXJlbmNlcyBiZXR3ZWVuICIhPSIgYW5kICQoc2hlbGwgLi4uKS4gIFNlZSB0aGUKICBkZXNjcmlwdGlvbiBpbiB0aGUgR05VIE1ha2UgbWFudWFsLgogIFdBUk5JTkc6IEJhY2t3YXJkLWluY29tcGF0aWJpbGl0eSEKICBWYXJpYWJsZXMgZW5kaW5nIGluICIhIiBwcmV2aW91c2x5IGRlZmluZWQgYXMgInZhcmlhYmxlIT0gdmFsdWUiIHdpbGwgbm93IGJlCiAgaW50ZXJwcmV0ZWQgYXMgc2hlbGwgYXNzaWdubWVudC4gIENoYW5nZSB5b3VyIGFzc2lnbm1lbnQgdG8gYWRkIHdoaXRlc3BhY2UKICBiZXR3ZWVuIHRoZSAiISIgYW5kICI9IjogInZhcmlhYmxlISA9IHZhbHVlIgoKKiBOZXcgZmVhdHVyZTogIjo6PSIgc2ltcGxlIGFzc2lnbm1lbnQgb3BlcmF0b3IgYXMgZGVmaW5lZCBieSBQT1NJWCBpbiAyMDEyLgogIFRoaXMgb3BlcmF0b3IgaGFzIGlkZW50aWNhbCBmdW5jdGlvbmFsaXR5IHRvICI6PSIgaW4gR05VIE1ha2UsIGJ1dCB3aWxsIGJlCiAgcG9ydGFibGUgdG8gYW55IGltcGxlbWVudGF0aW9uIG9mIG1ha2UgY29uZm9ybWluZyB0byBhIHN1ZmZpY2llbnRseSBuZXcKICB2ZXJzaW9uIG9mIFBPU0lYIChzZWUgaHR0cHM6Ly9hdXN0aW5ncm91cGJ1Z3MubmV0L3ZpZXcucGhwP2lkPTMzMCkuICBJdCBpcwogIG5vdCBuZWNlc3NhcnkgdG8gZGVmaW5lIHRoZSAuUE9TSVggdGFyZ2V0IHRvIGFjY2VzcyB0aGlzIG9wZXJhdG9yLgoKKiBOZXcgZmVhdHVyZTogTG9hZGFibGUgb2JqZWN0cwogIFRoaXMgdmVyc2lvbiBvZiBHTlUgTWFrZSBjb250YWlucyBhICJ0ZWNobm9sb2d5IHByZXZpZXciOiB0aGUgYWJpbGl0eSB0bwogIGxvYWQgZHluYW1pYyBvYmplY3RzIGludG8gdGhlIG1ha2UgcnVudGltZS4gIFRoZXNlIG9iamVjdHMgY2FuIGJlIGNyZWF0ZWQgYnkKICB0aGUgdXNlciBhbmQgY2FuIGFkZCBleHRlbmRlZCBmdW5jdGlvbmFsaXR5LCB1c2FibGUgYnkgbWFrZWZpbGVzLgoKKiBOZXcgZnVuY3Rpb246ICQoZmlsZSAuLi4pIHdyaXRlcyB0byBhIGZpbGUuCgoqIE5ldyB2YXJpYWJsZTogJChHTlVNQUtFRkxBR1MpIHdpbGwgYmUgcGFyc2VkIGZvciBtYWtlIGZsYWdzLCBqdXN0IGxpa2UKICBNQUtFRkxBR1MgaXMuICBJdCBjYW4gYmUgc2V0IGluIHRoZSBlbnZpcm9ubWVudCBvciB0aGUgbWFrZWZpbGUsIGNvbnRhaW5pbmcKICBHTlUgTWFrZS1zcGVjaWZpYyBmbGFncyB0byBhbGxvdyB5b3VyIG1ha2VmaWxlIHRvIGJlIHBvcnRhYmxlIHRvIG90aGVyCiAgdmVyc2lvbnMgb2YgbWFrZS4gIE9uY2UgdGhpcyB2YXJpYWJsZSBpcyBwYXJzZWQsIEdOVSBNYWtlIHdpbGwgc2V0IGl0IHRvIHRoZQogIGVtcHR5IHN0cmluZyBzbyB0aGF0IGZsYWdzIHdpbGwgbm90IGJlIGR1cGxpY2F0ZWQgb24gcmVjdXJzaW9uLgoKKiBOZXcgdmFyaWFibGU6IGBNQUtFX0hPU1QnIGdpdmVzIHRoZSBuYW1lIG9mIHRoZSBob3N0IGFyY2hpdGVjdHVyZQogIG1ha2Ugd2FzIGNvbXBpbGVkIGZvci4gIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgeW91IHNlZSBhZnRlciAnQnVpbHQgZm9yJwogIHdoZW4gcnVubmluZyAnbWFrZSAtLXZlcnNpb24nLgoKKiBCZWhhdmlvciBvZiBNQUtFRkxBR1MgYW5kIE1GTEFHUyBpcyBtb3JlIHJpZ29yb3VzbHkgZGVmaW5lZC4gIEFsbCBzaW1wbGUKICBmbGFncyBhcmUgZ3JvdXBlZCB0b2dldGhlciBpbiB0aGUgZmlyc3Qgd29yZCBvZiBNQUtFRkxBR1MuICBObyBvcHRpb25zIHRoYXQKICBhY2NlcHQgYXJndW1lbnRzIGFwcGVhciBpbiB0aGUgZmlyc3Qgd29yZC4gIElmIG5vIHNpbXBsZSBmbGFncyBhcmUgcHJlc2VudAogIE1BS0VGTEFHUyBiZWdpbnMgd2l0aCBhIHNwYWNlLiAgRmxhZ3Mgd2l0aCBib3RoIHNob3J0IGFuZCBsb25nIHZlcnNpb25zCiAgYWx3YXlzIHVzZSB0aGUgc2hvcnQgdmVyc2lvbnMgaW4gTUFLRUZMQUdTLiAgRmxhZ3MgYXJlIGxpc3RlZCBpbgogIGFscGhhYmV0aWNhbCBvcmRlciB1c2luZyBBU0NJSSBvcmRlcmluZy4gIE1GTEFHUyBuZXZlciBiZWdpbnMgd2l0aCAiLSAiLgoKKiBTZXR0aW5nIHRoZSAtciBhbmQgLVIgb3B0aW9ucyBpbiBNQUtFRkxBR1MgaW5zaWRlIGEgbWFrZWZpbGUgbm93IHdvcmtzIGFzCiAgZXhwZWN0ZWQsIHJlbW92aW5nIGFsbCBidWlsdC1pbiBydWxlcyBhbmQgdmFyaWFibGVzLCByZXNwZWN0aXZlbHkuCgoqIElmIGEgcmVjaXBlIGZhaWxzLCB0aGUgbWFrZWZpbGUgbmFtZSBhbmQgbGluZW51bWJlciBvZiB0aGUgcmVjaXBlIGFyZSBzaG93bi4KCiogQSAuUkVDSVBFUFJFRklYIHNldHRpbmcgaXMgcmVtZW1iZXJlZCBwZXItcmVjaXBlIGFuZCB2YXJpYWJsZXMgZXhwYW5kZWQKICBpbiB0aGF0IHJlY2lwZSBhbHNvIHVzZSB0aGF0IHJlY2lwZSBwcmVmaXggc2V0dGluZy4KCiogSW4gLXAgb3V0cHV0LCAuUkVDSVBFUFJFRklYIHNldHRpbmdzIGFyZSBzaG93biBhbmQgYWxsIHRhcmdldC1zcGVjaWZpYwogIHZhcmlhYmxlcyBhcmUgb3V0cHV0IGFzIGlmIGluIGEgbWFrZWZpbGUsIGluc3RlYWQgb2YgYXMgY29tbWVudHMuCgoqIE9uIE1TLVdpbmRvd3MsIHJlY2lwZXMgdGhhdCB1c2UgIi4uIiBxdW90aW5nIHdpbGwgbm8gbG9uZ2VyIGZvcmNlCiAgaW52b2NhdGlvbiBvZiBjb21tYW5kcyB2aWEgdGVtcG9yYXJ5IGJhdGNoIGZpbGVzIGFuZCBzdG9jayBXaW5kb3dzCiAgc2hlbGxzLCB0aGV5IHdpbGwgYmUgc2hvcnQtY2lyY3VpdGVkIGFuZCBpbnZva2VkIGRpcmVjdGx5LiAgKEluCiAgb3RoZXIgd29yZHMsICIgaXMgbm8gbG9uZ2VyIGEgc3BlY2lhbCBjaGFyYWN0ZXIgZm9yIHN0b2NrIFdpbmRvd3MKICBzaGVsbHMuKSAgVGhpcyBhdm9pZHMgaGl0dGluZyBzaGVsbCBsaW1pdHMgZm9yIGNvbW1hbmQgbGVuZ3RoIHdoZW4KICBxdW90ZXMgYXJlIHVzZWQsIGJ1dCBub3RoaW5nIGVsc2UgaW4gdGhlIGNvbW1hbmQgcmVxdWlyZXMgdGhlIHNoZWxsLgogIFRoaXMgY2hhbmdlIGNvdWxkIHBvdGVudGlhbGx5IG1lYW4gc29tZSBtaW5vciBpbmNvbXBhdGliaWxpdGllcyBpbgogIGJlaGF2aW9yIHdoZW4gdGhlIHJlY2lwZSB1c2VzIHF1b3RlZCBzdHJpbmcgb24gc2hlbGwgY29tbWFuZCBsaW5lcy4KCgwKVmVyc2lvbiAzLjgyICgyOCBKdWwgMjAxMCkKCkEgY29tcGxldGUgbGlzdCBvZiBidWdzIGZpeGVkIGluIHRoaXMgdmVyc2lvbiBpcyBhdmFpbGFibGUgaGVyZToKCmh0dHBzOi8vc3YuZ251Lm9yZy9idWdzL2luZGV4LnBocD9ncm91cD1tYWtlJnJlcG9ydF9pZD0xMTEmZml4X3JlbGVhc2VfaWQ9MTA0JnNldD1jdXN0b20KCiogQ29tcGlsaW5nIEdOVSBNYWtlIG5vdyByZXF1aXJlcyBhIGNvbmZvcm1pbmcgSVNPIEMgMTk4OSBjb21waWxlciBhbmQKICBzdGFuZGFyZCBydW50aW1lIGxpYnJhcnkuCgoqIFdBUk5JTkc6IEJhY2t3YXJkLWluY29tcGF0aWJpbGl0eSEKICBUaGUgUE9TSVggc3RhbmRhcmQgZm9yIG1ha2Ugd2FzIGNoYW5nZWQgaW4gdGhlIDIwMDggdmVyc2lvbiBpbiBhCiAgZnVuZGFtZW50YWxseSBpbmNvbXBhdGlibGUgd2F5OiBtYWtlIGlzIHJlcXVpcmVkIHRvIGludm9rZSB0aGUgc2hlbGwgYXMgaWYKICB0aGUgJy1lJyBmbGFnIHdlcmUgcHJvdmlkZWQuICBCZWNhdXNlIHRoaXMgd291bGQgYnJlYWsgbWFueSBtYWtlZmlsZXMgdGhhdAogIGhhdmUgYmVlbiB3cml0dGVuIHRvIGNvbmZvcm0gdG8gdGhlIG9yaWdpbmFsIHRleHQgb2YgdGhlIHN0YW5kYXJkLCB0aGUKICBkZWZhdWx0IGJlaGF2aW9yIG9mIEdOVSBNYWtlIHJlbWFpbnMgdG8gaW52b2tlIHRoZSBzaGVsbCB3aXRoIHNpbXBseSAnLWMnLgogIEhvd2V2ZXIsIGFueSBtYWtlZmlsZSBzcGVjaWZ5aW5nIHRoZSAuUE9TSVggc3BlY2lhbCB0YXJnZXQgd2lsbCBmb2xsb3cgdGhlCiAgbmV3IFBPU0lYIHN0YW5kYXJkIGFuZCBwYXNzICctZScgdG8gdGhlIHNoZWxsLiAgU2VlIGFsc28gLlNIRUxMRkxBR1MKICBiZWxvdy4KCiogV0FSTklORzogQmFja3dhcmQtaW5jb21wYXRpYmlsaXR5IQogIFRoZSAnJD8nIHZhcmlhYmxlIG5vdyBjb250YWlucyBhbGwgcHJlcmVxdWlzaXRlcyB0aGF0IGNhdXNlZCB0aGUgdGFyZ2V0IHRvCiAgYmUgY29uc2lkZXJlZCBvdXQgb2YgZGF0ZSwgZXZlbiBpZiB0aGV5IGRvIG5vdCBleGlzdCAocHJldmlvdXNseSBvbmx5CiAgZXhpc3RpbmcgdGFyZ2V0cyB3ZXJlIHByb3ZpZGVkIGluICQ/KS4KCiogV0FSTklORzogQmFja3dhcmQtaW5jb21wYXRpYmlsaXR5IQogIFdpbGRjYXJkcyB3ZXJlIG5vdCBkb2N1bWVudGVkIGFzIHJldHVybmluZyBzb3J0ZWQgdmFsdWVzLCBidXQgdGhlIHJlc3VsdHMKICBoYXZlIGJlZW4gc29ydGVkIHVwIHVudGlsIHRoaXMgcmVsZWFzZS4uICBJZiB5b3VyIG1ha2VmaWxlcyByZXF1aXJlIHNvcnRlZAogIHJlc3VsdHMgZnJvbSB3aWxkY2FyZCBleHBhbnNpb25zLCB1c2UgdGhlICQoc29ydCAuLi4pICBmdW5jdGlvbiB0byByZXF1ZXN0CiAgaXQgZXhwbGljaXRseS4KCiogV0FSTklORzogQmFja3dhcmQtaW5jb21wYXRpYmlsaXR5IQogIEFzIGEgcmVzdWx0IG9mIHBhcnNlciBlbmhhbmNlbWVudHMsIHRocmVlIGJhY2t3YXJkLWNvbXBhdGliaWxpdHkgaXNzdWVzCiAgZXhpc3Q6IGZpcnN0LCBhIHByZXJlcXVpc2l0ZSBjb250YWluaW5nIGFuICI9IiBjYW5ub3QgYmUgZXNjYXBlZCB3aXRoIGEKICBiYWNrc2xhc2ggYW55IGxvbmdlci4gIFlvdSBtdXN0IGNyZWF0ZSBhIHZhcmlhYmxlIGNvbnRhaW5pbmcgYW4gIj0iIGFuZAogIHVzZSB0aGF0IHZhcmlhYmxlIGluIHRoZSBwcmVyZXF1aXNpdGUuICBTZWNvbmQsIHZhcmlhYmxlIG5hbWVzIGNhbiBubwogIGxvbmdlciBjb250YWluIHdoaXRlc3BhY2UsIHVubGVzcyB5b3UgcHV0IHRoZSB3aGl0ZXNwYWNlIGluIGEgdmFyaWFibGUgYW5kCiAgdXNlIHRoZSB2YXJpYWJsZS4gIFRoaXJkLCBpbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBtYWtlIGl0IHdhcyBzb21ldGltZXMKICBub3QgZmxhZ2dlZCBhcyBhbiBlcnJvciBmb3IgZXhwbGljaXQgYW5kIHBhdHRlcm4gdGFyZ2V0cyB0byBhcHBlYXIgaW4gdGhlCiAgc2FtZSBydWxlLiAgTm93IHRoaXMgaXMgYWx3YXlzIHJlcG9ydGVkIGFzIGFuIGVycm9yLgoKKiBXQVJOSU5HOiBCYWNrd2FyZC1pbmNvbXBhdGliaWxpdHkhCiAgVGhlIHBhdHRlcm4tc3BlY2lmaWMgdmFyaWFibGVzIGFuZCBwYXR0ZXJuIHJ1bGVzIGFyZSBub3cgYXBwbGllZCBpbiB0aGUKICBzaG9ydGVzdCBzdGVtIGZpcnN0IG9yZGVyIGluc3RlYWQgb2YgdGhlIGRlZmluaXRpb24gb3JkZXIgKHZhcmlhYmxlcwogIGFuZCBydWxlcyB3aXRoIHRoZSBzYW1lIHN0ZW0gbGVuZ3RoIGFyZSBzdGlsbCBhcHBsaWVkIGluIHRoZSBkZWZpbml0aW9uCiAgb3JkZXIpLiBUaGlzIHByb2R1Y2VzIHRoZSB1c3VhbGx5LWRlc2lyZWQgYmVoYXZpb3Igd2hlcmUgbW9yZSBzcGVjaWZpYwogIHBhdHRlcm5zIGFyZSBwcmVmZXJyZWQuIFRvIGRldGVjdCB0aGlzIGZlYXR1cmUgc2VhcmNoIGZvciAnc2hvcnRlc3Qtc3RlbScKICBpbiB0aGUgLkZFQVRVUkVTIHNwZWNpYWwgdmFyaWFibGUuCgoqIFdBUk5JTkc6IEJhY2t3YXJkLWluY29tcGF0aWJpbGl0eSEKICBUaGUgbGlicmFyeSBzZWFyY2ggYmVoYXZpb3IgaGFzIGNoYW5nZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBzdGFuZGFyZAogIGxpbmtlciBiZWhhdmlvci4gUHJpb3IgdG8gdGhpcyB2ZXJzaW9uIGZvciBwcmVyZXF1aXNpdGVzIHNwZWNpZmllZCB1c2luZwogIHRoZSAtbGZvbyBzeW50YXggbWFrZSBmaXJzdCBzZWFyY2hlZCBmb3IgbGliZm9vLnNvIGluIHRoZSBjdXJyZW50CiAgZGlyZWN0b3J5LCB2cGF0aCBkaXJlY3RvcmllcywgYW5kIHN5c3RlbSBkaXJlY3Rvcmllcy4gSWYgdGhhdCBkaWRuJ3QgeWllbGQKICBhIG1hdGNoLCBtYWtlIHRoZW4gc2VhcmNoZWQgZm9yIGxpYmZvby5hIGluIHRoZXNlIGRpcmVjdG9yaWVzLiBTdGFydGluZwogIHdpdGggdGhpcyB2ZXJzaW9uIG1ha2Ugc2VhcmNoZXMgZmlyc3QgZm9yIGxpYmZvby5zbyBhbmQgdGhlbiBmb3IgbGliZm9vLmEKICBpbiBlYWNoIG9mIHRoZXNlIGRpcmVjdG9yaWVzIGluIG9yZGVyLgoKKiBOZXcgY29tbWFuZCBsaW5lIG9wdGlvbjogLS1ldmFsPVNUUklORyBjYXVzZXMgU1RSSU5HIHRvIGJlIGV2YWx1YXRlZCBhcwogIG1ha2VmaWxlIHN5bnRheCAoYWtpbiB0byB1c2luZyB0aGUgJChldmFsIC4uLikgZnVuY3Rpb24pLiAgVGhlIGV2YWx1YXRpb24KICBpcyBwZXJmb3JtZWQgYWZ0ZXIgYWxsIGRlZmF1bHQgcnVsZXMgYW5kIHZhcmlhYmxlcyBhcmUgZGVmaW5lZCwgYnV0IGJlZm9yZQogIGFueSBtYWtlZmlsZXMgYXJlIHJlYWQuCgoqIE5ldyBzcGVjaWFsIHZhcmlhYmxlOiAuUkVDSVBFUFJFRklYIGFsbG93cyB5b3UgdG8gcmVzZXQgdGhlIHJlY2lwZQogIGludHJvZHVjdGlvbiBjaGFyYWN0ZXIgZnJvbSB0aGUgZGVmYXVsdCAoVEFCKSB0byBzb21ldGhpbmcgZWxzZS4gIFRoZQogIGZpcnN0IGNoYXJhY3RlciBvZiB0aGlzIHZhcmlhYmxlIHZhbHVlIGlzIHRoZSBuZXcgcmVjaXBlIGludHJvZHVjdGlvbgogIGNoYXJhY3Rlci4gIElmIHRoZSB2YXJpYWJsZSBpcyBzZXQgdG8gdGhlIGVtcHR5IHN0cmluZywgVEFCIGlzIHVzZWQgYWdhaW4uCiAgSXQgY2FuIGJlIHNldCBhbmQgcmVzZXQgYXQgd2lsbDsgcmVjaXBlcyB3aWxsIHVzZSB0aGUgdmFsdWUgYWN0aXZlIHdoZW4KICB0aGV5IHdlcmUgZmlyc3QgcGFyc2VkLiAgVG8gZGV0ZWN0IHRoaXMgZmVhdHVyZSBjaGVjayB0aGUgdmFsdWUgb2YKICAkKC5SRUNJUEVQUkVGSVgpLgoKKiBOZXcgc3BlY2lhbCB2YXJpYWJsZTogLlNIRUxMRkxBR1MgYWxsb3dzIHlvdSB0byBjaGFuZ2UgdGhlIG9wdGlvbnMgcGFzc2VkCiAgdG8gdGhlIHNoZWxsIHdoZW4gaXQgaW52b2tlcyByZWNpcGVzLiAgQnkgZGVmYXVsdCB0aGUgdmFsdWUgd2lsbCBiZSAiLWMiCiAgKG9yICItZWMiIGlmIC5QT1NJWCBpcyBzZXQpLgoKKiBOZXcgc3BlY2lhbCB0YXJnZXQ6IC5PTkVTSEVMTCBpbnN0cnVjdHMgbWFrZSB0byBpbnZva2UgYSBzaW5nbGUgaW5zdGFuY2UKICBvZiB0aGUgc2hlbGwgYW5kIHByb3ZpZGUgaXQgd2l0aCB0aGUgZW50aXJlIHJlY2lwZSwgcmVnYXJkbGVzcyBvZiBob3cgbWFueQogIGxpbmVzIGl0IGNvbnRhaW5zLiAgQXMgYSBzcGVjaWFsIGZlYXR1cmUgdG8gYWxsb3cgbW9yZSBzdHJhaWdodGZvcndhcmQKICBjb252ZXJzaW9uIG9mIG1ha2VmaWxlcyB0byB1c2UgLk9ORVNIRUxMLCBhbnkgcmVjaXBlIGxpbmUgY29udHJvbAogIGNoYXJhY3RlcnMgKCdAJywgJysnLCBvciAnLScpIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBzZWNvbmQgYW5kCiAgc3Vic2VxdWVudCByZWNpcGUgbGluZXMuICBUaGlzIGhhcHBlbnMgX29ubHlfIGlmIHRoZSBTSEVMTCB2YWx1ZSBpcyBkZWVtZWQKICB0byBiZSBhIHN0YW5kYXJkIFBPU0lYLXN0eWxlIHNoZWxsLiAgSWYgbm90LCB0aGVuIG5vIGludGVyaW9yIGxpbmUgY29udHJvbAogIGNoYXJhY3RlcnMgYXJlIHJlbW92ZWQgKGFzIHRoZXkgbWF5IGJlIHBhcnQgb2YgdGhlIHNjcmlwdGluZyBsYW5ndWFnZSB1c2VkCiAgd2l0aCB0aGUgYWx0ZXJuYXRlIFNIRUxMKS4KCiogTmV3IHZhcmlhYmxlIG1vZGlmaWVyICdwcml2YXRlJzogcHJlZml4aW5nIGEgdmFyaWFibGUgYXNzaWdubWVudCB3aXRoIHRoZQogIG1vZGlmaWVyICdwcml2YXRlJyBzdXBwcmVzc2VzIGluaGVyaXRhbmNlIG9mIHRoYXQgdmFyaWFibGUgYnkKICBwcmVyZXF1aXNpdGVzLiAgVGhpcyBpcyBtb3N0IHVzZWZ1bCBmb3IgdGFyZ2V0LSBhbmQgcGF0dGVybi1zcGVjaWZpYwogIHZhcmlhYmxlcy4KCiogTmV3IG1ha2UgZGlyZWN0aXZlOiAndW5kZWZpbmUnIGFsbG93cyB5b3UgdG8gdW5kZWZpbmUgYSB2YXJpYWJsZSBzbyB0aGF0CiAgaXQgYXBwZWFycyBhcyBpZiBpdCB3YXMgbmV2ZXIgc2V0LiBCb3RoICQoZmxhdm9yKSBhbmQgJChvcmlnaW4pIGZ1bmN0aW9ucwogIHdpbGwgcmV0dXJuICd1bmRlZmluZWQnIGZvciBzdWNoIGEgdmFyaWFibGUuIFRvIGRldGVjdCB0aGlzIGZlYXR1cmUgc2VhcmNoCiAgZm9yICd1bmRlZmluZScgaW4gdGhlIC5GRUFUVVJFUyBzcGVjaWFsIHZhcmlhYmxlLgoKKiBUaGUgcGFyc2VyIGZvciB2YXJpYWJsZSBhc3NpZ25tZW50cyBoYXMgYmVlbiBlbmhhbmNlZCB0byBhbGxvdyBtdWx0aXBsZQogIG1vZGlmaWVycyAoJ2V4cG9ydCcsICdvdmVycmlkZScsICdwcml2YXRlJykgb24gdGhlIHNhbWUgbGluZSBhcyB2YXJpYWJsZXMsCiAgaW5jbHVkaW5nIGRlZmluZS9lbmRlZiB2YXJpYWJsZXMsIGFuZCBpbiBhbnkgb3JkZXIuICBBbHNvLCBpdCBpcyBwb3NzaWJsZQogIHRvIGNyZWF0ZSB2YXJpYWJsZXMgYW5kIHRhcmdldHMgbmFtZWQgYXMgdGhlc2UgbW9kaWZpZXJzLgoKKiBUaGUgJ2RlZmluZScgbWFrZSBkaXJlY3RpdmUgbm93IGFsbG93cyBhIHZhcmlhYmxlIGFzc2lnbm1lbnQgb3BlcmF0b3IKICBhZnRlciB0aGUgdmFyaWFibGUgbmFtZSwgdG8gYWxsb3cgZm9yIHNpbXBsZSwgY29uZGl0aW9uYWwsIG9yIGFwcGVuZGluZwogIG11bHRpLWxpbmUgdmFyaWFibGUgYXNzaWdubWVudC4KCiogVk1TLXNwZWNpZmljIGNoYW5nZXM6CgogICogTWljaGFlbCBHZWhyZSAoYXQgVklTVEVDLVNFTUkgZG90IENPTSkgc3VwcGxpZWQgYSBmaXggZm9yIGEgcHJvYmxlbSB3aXRoCiAgICB0aW1lc3RhbXBzIG9mIG9iamVjdCBtb2R1bGVzIGluIE9MQnMuIFRoZSB0aW1lc3RhbXBzIHdlcmUgbm90IGNvcnJlY3RseQogICAgYWRqdXN0ZWQgdG8gR01UIGJhc2VkIHRpbWUsIGlmIHRoZSBsb2NhbCBWTVMgdGltZSB3YXMgdXNpbmcgYSBkYXlsaWdodAogICAgc2F2aW5nIGFsZ29yaXRobSBhbmQgaWYgZGF5bGlnaHQgc2F2aW5nIHdhcyBzd2l0Y2hlZCBvZmYuCgogICogSm9obiBFaXNlbmJyYXVuIChhdCBIUCBkb3QgQ09NKSBzdXBwbGllZCBmaXhlcyBhbmQgYW5kIGFuIGVuaGFuY2VtZW50IHRvCiAgICBhcHBlbmQgb3V0cHV0IHJlZGlyZWN0aW9uIGluIGFjdGlvbiBsaW5lcy4KCiAgKiBSZXdvcmsgb2YgY3RybCtjIGFuZCBjdHJsK3kgaGFuZGxpbmcuCgogICogRml4IGEgcHJvYmxlbSB3aXRoIGNhY2hlZCBzdHJpbmdzLCB3aGljaCBzaG93ZWQgb24gY2FzZS1pbnNlbnNpdGl2ZSBmaWxlCiAgICBzeXN0ZW1zLgoKICAqIEJ1aWxkIGZpeGVzIGZvciBjb25zdC1pZmllZCBjb2RlIGluIFZNUyBzcGVjaWZpYyBzb3VyY2VzLgoKICAqIEEgbm90ZSBvbiBhcHBlbmRpbmcgdGhlIHJlZGlyZWN0ZWQgb3V0cHV0LiBXaXRoIHRoaXMgY2hhbmdlLCBhIHNpbXBsZQogICAgbWVjaGFuaXNtIGlzIGltcGxlbWVudGVkIHRvIG1ha2UgIj4+IiB3b3JrIGluIGFjdGlvbiBsaW5lcy4gSW4gVk1TCiAgICB0aGVyZSBpcyBubyBzaW1wbGUgZmVhdHVyZSBsaWtlICI+PiIgdG8gaGF2ZSBEQ0wgY29tbWFuZCBvciBwcm9ncmFtCiAgICBvdXRwdXQgcmVkaXJlY3RlZCBhbmQgYXBwZW5kZWQgdG8gYSBmaWxlLiBHTlUgTWFrZSBmb3IgVk1TIGFscmVhZHkKICAgIGltcGxlbWVudHMgdGhlIHJlZGlyZWN0aW9uIG9mIG91dHB1dC4gSWYgc3VjaCBhIHJlZGlyZWN0aW9uIGlzIGRldGVjdGVkLAogICAgYW4gIj4iIG9uIHRoZSBhY3Rpb24gbGluZSwgR05VIE1ha2UgY3JlYXRlcyBhIERDTCBjb21tYW5kIHByb2NlZHVyZSB0bwogICAgZXhlY3V0ZSB0aGUgYWN0aW9uIGFuZCB0byByZWRpcmVjdCBpdHMgb3V0cHV0LiBCYXNlZCBvbiB0aGF0LCBub3cgIj4+IgogICAgaXMgYWxzbyByZWNvZ25pemVkIGFuZCBhIHNpbWlsYXIgYnV0IGRpZmZlcmVudCBjb21tYW5kIHByb2NlZHVyZSBpcwogICAgY3JlYXRlZCB0byBpbXBsZW1lbnQgdGhlIGFwcGVuZC4gVGhlIG1haW4gaWRlYSBoZXJlIGlzIHRvIGNyZWF0ZSBhCiAgICB0ZW1wb3JhcnkgZmlsZSB3aGljaCBjb2xsZWN0cyB0aGUgb3V0cHV0IGFuZCB3aGljaCBpcyBhcHBlbmRlZCB0byB0aGUKICAgIHdhbnRlZCBvdXRwdXQgZmlsZS4gVGhlbiB0aGUgdGVtcG9yYXJ5IGZpbGUgaXMgZGVsZXRlZC4gVGhpcyBpcyBhbGwgZG9uZQogICAgaW4gdGhlIGNvbW1hbmQgcHJvY2VkdXJlIHRvIGtlZXAgY2hhbmdlcyBpbiBtYWtlIHNtYWxsIGFuZCBzaW1wbGUuIFRoaXMKICAgIG9idmlvdXNseSBoYXMgc29tZSBsaW1pdGF0aW9ucyBidXQgaXQgc2VlbXMgZ29vZCBlbm91Z2ggY29tcGFyZWQgd2l0aAogICAgdGhlIGN1cnJlbnQgIj4iIGltcGxlbWVudGF0aW9uLiAoQW5kIGluIG15IG9waW5pb24sIHJlZGlyZWN0aW9uIGlzIG5vdAogICAgcmVhbGx5IHdoYXQgR05VIE1ha2UgaGFzIHRvIGRvLikgV2l0aCB0aGlzIGFwcHJvYWNoLCBpdCBtYXkgaGFwcGVuIHRoYXQKICAgIHRoZSB0ZW1wb3JhcnkgZmlsZSBpcyBub3QgeWV0IGFwcGVuZGVkIGFuZCBpcyBsZWZ0IGluIFNZUyRTQ1JBVENILgogICAgVGhlIHRlbXBvcmFyeSBmaWxlIG5hbWVzIGxvb2sgbGlrZSAiQ01EeHh4eHguIi4gQW55IHRpbWUgdGhlIGNyZWF0ZWQKICAgIGNvbW1hbmQgcHJvY2VkdXJlIGNhbiBub3QgY29tcGxldGUsIHRoaXMgaGFwcGVucy4gUHJlc3NpbmcgQ3RybCtZIHRvCiAgICBhYm9ydCBtYWtlIGlzIG9uZSBjYXNlLiBJbiBjYXNlIG9mIEN0cmwrWSB0aGUgYXNzb2NpYXRlZCBjb21tYW5kCiAgICBwcm9jZWR1cmUgaXMgbGVmdCBpbiBTWVMkU0NSQVRDSCBhcyB3ZWxsLiBJdHMgbmFtZSBpcyBDTUR4eHh4eC5DT00uCgogICogQ2hhbmdlIGluIHRoZSBDdHJsK1kgaGFuZGxpbmcuIFRoZSBDdHJsWSBoYW5kbGVyIG5vdyB1c2VzICRkZWxwcmMgdG8KICAgIGRlbGV0ZSBhbGwgY2hpbGRyZW4uIFRoaXMgd2F5IGFsc28gYWN0aW9ucyB3aXRoIERDTCBjb21tYW5kcyB3aWxsIGJlCiAgICBzdG9wcGVkLiBBcyBiZWZvcmUgdGhlIEN0cmxZIGhhbmRsZXIgdGhlbiBzZW5kcyBTSUdRVUlUIHRvIGl0c2VsZiwKICAgIHdoaWNoIGlzIGhhbmRsZWQgaW4gY29tbW9uIGNvZGUuCgogICogQ2hhbmdlIGluIGRlbGV0ZWluZyB0ZW1wb3JhcnkgY29tbWFuZCBmaWxlcy4gVGVtcG9yYXJ5IGNvbW1hbmQgZmlsZXMKICAgIGFyZSBub3cgZGVsZXRlZCBpbiB0aGUgdm1zIGNoaWxkIHRlcm1pbmF0aW9uIGhhbmRsZXIuIFRoYXQgZGVsZXRlcwogICAgdGhlbSBldmVuIGlmIGEgQ3RybCtDIHdhcyBwcmVzc2VkLgoKICAqIFRoZSBiZWhhdmlvciBvZiBwcmVzc2luZyBDdHJsK0MgaXMgbm90IGNoYW5nZWQuIEl0IHN0aWxsIGhhcyBvbmx5IGFuCiAgICBlZmZlY3QsIGFmdGVyIHRoZSBjdXJyZW50IGFjdGlvbiBpcyB0ZXJtaW5hdGVkLiBJZiB0aGF0IGRvZXNuJ3QgaGFwcGVuCiAgICBvciB0YWtlcyB0b28gbG9uZywgQ3RybCtZIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCgoMClZlcnNpb24gMy44MSAoMDEgQXByIDIwMDYpCgoqIEdOVSBNYWtlIGlzIHBvcnRlZCB0byBPUy8yLgoKKiBHTlUgTWFrZSBpcyBwb3J0ZWQgdG8gTWluR1cuICBUaGUgTWluR1cgYnVpbGQgaXMgb25seSBzdXBwb3J0ZWQgYnkKICB0aGUgYnVpbGRfdzMyLmJhdCBiYXRjaCBmaWxlOyBzZWUgdGhlIGZpbGUgUkVBRE1FLlczMiBmb3IgbW9yZQogIGRldGFpbHMuCgoqIFdBUk5JTkc6IEZ1dHVyZSBiYWNrd2FyZC1pbmNvbXBhdGliaWxpdHkhCiAgVXAgdG8gYW5kIGluY2x1ZGluZyB0aGlzIHJlbGVhc2UsIHRoZSAnJD8nIHZhcmlhYmxlIGRvZXMgbm90IGNvbnRhaW4KICBhbnkgcHJlcmVxdWlzaXRlIHRoYXQgZG9lcyBub3QgZXhpc3QsIGV2ZW4gdGhvdWdoIHRoYXQgcHJlcmVxdWlzaXRlCiAgbWlnaHQgaGF2ZSBjYXVzZWQgdGhlIHRhcmdldCB0byByZWJ1aWxkLiAgU3RhcnRpbmcgd2l0aCB0aGUgX25leHRfCiAgcmVsZWFzZSBvZiBHTlUgTWFrZSwgJyQ/JyB3aWxsIGNvbnRhaW4gYWxsIHByZXJlcXVpc2l0ZXMgdGhhdCBjYXVzZWQKICB0aGUgdGFyZ2V0IHRvIGJlIGNvbnNpZGVyZWQgb3V0IG9mIGRhdGUuCiAgU2VlIGh0dHBzOi8vc2F2YW5uYWguZ251Lm9yZy9idWdzLz8xNjA1MQoKKiBXQVJOSU5HOiBCYWNrd2FyZC1pbmNvbXBhdGliaWxpdHkhCiAgR05VIE1ha2Ugbm93IGltcGxlbWVudHMgYSBnZW5lcmljICJzZWNvbmQgZXhwYW5zaW9uIiBmZWF0dXJlIG9uIHRoZQogIHByZXJlcXVpc2l0ZXMgb2YgYm90aCBleHBsaWNpdCBhbmQgaW1wbGljaXQgKHBhdHRlcm4pIHJ1bGVzLiAgSW4gb3JkZXIKICB0byBlbmFibGUgdGhpcyBmZWF0dXJlLCB0aGUgc3BlY2lhbCB0YXJnZXQgJy5TRUNPTkRFWFBBTlNJT04nIG11c3QgYmUKICBkZWZpbmVkIGJlZm9yZSB0aGUgZmlyc3QgdGFyZ2V0IHdoaWNoIHRha2VzIGFkdmFudGFnZSBvZiBpdC4gIElmIHRoaXMKICBmZWF0dXJlIGlzIGVuYWJsZWQgdGhlbiBhZnRlciBhbGwgcnVsZXMgaGF2ZSBiZWVuIHBhcnNlZCB0aGUKICBwcmVyZXF1aXNpdGVzIGFyZSBleHBhbmRlZCBhZ2FpbiwgdGhpcyB0aW1lIHdpdGggYWxsIHRoZSBhdXRvbWF0aWMKICB2YXJpYWJsZXMgaW4gc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgaW4gYWRkaXRpb24gdG8gdXNpbmcgc3RhbmRhcmQKICBTeXNWICQkQCBpbiBwcmVyZXF1aXNpdGVzIGxpc3RzLCB5b3UgY2FuIGFsc28gdXNlIGNvbXBsZXggZnVuY3Rpb25zCiAgc3VjaCBhcyAkJChub3RkaXIgJCRAKSBldGMuICBUaGlzIGJlaGF2aW9yIGFwcGxpZXMgdG8gaW1wbGljaXQgcnVsZXMsCiAgYXMgd2VsbCwgd2hlcmUgdGhlIHNlY29uZCBleHBhbnNpb24gb2NjdXJzIHdoZW4gdGhlIHJ1bGUgaXMgbWF0Y2hlZC4KICBIb3dldmVyLCB0aGlzIG1lYW5zIHRoYXQgd2hlbiAnLlNFQ09OREVYUEFOU0lPTicgaXMgZW5hYmxlZCB5b3UgbXVzdAogIGRvdWJsZS1xdW90ZSBhbnkgIiQiIGluIHlvdXIgZmlsZW5hbWVzOyBpbnN0ZWFkIG9mICJmb286IGJvbyQkYmFyIiB5b3UKICBub3cgbXVzdCB3cml0ZSAiZm9vOiBmb28kJCQkYmFyIi4gIE5vdGUgdGhhdCB0aGUgU3lzViAkJEAgZXRjLiBmZWF0dXJlLAogIHdoaWNoIHVzZWQgdG8gYmUgYXZhaWxhYmxlIGJ5IGRlZmF1bHQsIGlzIG5vdyBPTkxZIGF2YWlsYWJsZSB3aGVuIHRoZQogIC5TRUNPTkRFWFBBTlNJT04gdGFyZ2V0IGlzIGRlZmluZWQuICBJZiB5b3VyIG1ha2VmaWxlcyB0YWtlIGFkdmFudGFnZQogIG9mIHRoaXMgU3lzViBmZWF0dXJlIHlvdSB3aWxsIG5lZWQgdG8gdXBkYXRlIHRoZW0uCgoqIFdBUk5JTkc6IEJhY2t3YXJkLWluY29tcGF0aWJpbGl0eSEKICBJbiBvcmRlciB0byBjb21wbHkgd2l0aCBQT1NJWCwgdGhlIHdheSBpbiB3aGljaCBHTlUgTWFrZSBwcm9jZXNzZXMKICBiYWNrc2xhc2gtbmV3bGluZSBzZXF1ZW5jZXMgaW4gcmVjaXBlcyBoYXMgY2hhbmdlZC4gIElmIHlvdXIgbWFrZWZpbGVzCiAgdXNlIGJhY2tzbGFzaC1uZXdsaW5lIHNlcXVlbmNlcyBpbnNpZGUgb2Ygc2luZ2xlLXF1b3RlZCBzdHJpbmdzIGluCiAgcmVjaXBlcyB5b3Ugd2lsbCBiZSBpbXBhY3RlZCBieSB0aGlzIGNoYW5nZS4gIFNlZSB0aGUgR05VIE1ha2UgbWFudWFsCiAgc3Vic2VjdGlvbiAiU3BsaXR0aW5nIFJlY2lwZSBMaW5lcyIgKG5vZGUgIlNwbGl0dGluZyBMaW5lcyIpLCBpbgogIHNlY3Rpb24gIlJlY2lwZSBTeW50YXgiLCBjaGFwdGVyICJXcml0aW5nIFJlY2lwZSBpbiBSdWxlcyIsIGZvcgogIGRldGFpbHMuCgoqIFdBUk5JTkc6IEJhY2t3YXJkLWluY29tcGF0aWJpbGl0eSEKICBTb21lIHByZXZpb3VzIHZlcnNpb25zIG9mIEdOVSBNYWtlIGhhZCBhIGJ1ZyB3aGVyZSAiIyIgaW4gYSBmdW5jdGlvbgogIGludm9jYXRpb24gc3VjaCBhcyAkKHNoZWxsIC4uLikgd2FzIHRyZWF0ZWQgYXMgYSBtYWtlIGNvbW1lbnQuICBBCiAgd29ya2Fyb3VuZCB3YXMgdG8gZXNjYXBlIHRoZXNlIHdpdGggYmFja3NsYXNoZXMuICBUaGlzIGJ1ZyBoYXMgYmVlbgogIGZpeGVkOiBpZiB5b3VyIG1ha2VmaWxlIHVzZXMgIlwjIiBpbiBhIGZ1bmN0aW9uIGludm9jYXRpb24gdGhlCiAgYmFja3NsYXNoIGlzIG5vdyBwcmVzZXJ2ZWQsIHNvIHlvdSdsbCBuZWVkIHRvIHJlbW92ZSBpdC4KCiogTmV3IGNvbW1hbmQgbGluZSBvcHRpb246IC1MICgtLWNoZWNrLXN5bWxpbmstdGltZXMpLiAgT24gc3lzdGVtcyB0aGF0CiAgc3VwcG9ydCBzeW1ib2xpYyBsaW5rcywgaWYgdGhpcyBvcHRpb24gaXMgZ2l2ZW4gdGhlbiBHTlUgTWFrZSB3aWxsCiAgdXNlIHRoZSBtb3N0IHJlY2VudCBtb2RpZmljYXRpb24gdGltZSBvZiBhbnkgc3ltYm9saWMgbGlua3MgdGhhdCBhcmUKICB1c2VkIHRvIHJlc29sdmUgdGFyZ2V0IGZpbGVzLiAgVGhlIGRlZmF1bHQgYmVoYXZpb3IgcmVtYWlucyBhcyBpdAogIGFsd2F5cyBoYXM6IHVzZSB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhlIGFjdHVhbCB0YXJnZXQgZmlsZSBvbmx5LgoKKiBUaGUgImVsc2UiIGNvbmRpdGlvbmFsIGxpbmUgY2FuIG5vdyBiZSBmb2xsb3dlZCBieSBhbnkgb3RoZXIgdmFsaWQKICBjb25kaXRpb25hbCBvbiB0aGUgc2FtZSBsaW5lOiB0aGlzIGRvZXMgbm90IGluY3JlYXNlIHRoZSBkZXB0aCBvZiB0aGUKICBjb25kaXRpb25hbCBuZXN0aW5nLCBzbyBvbmx5IG9uZSAiZW5kaWYiIGlzIHJlcXVpcmVkIHRvIGNsb3NlIHRoZQogIGNvbmRpdGlvbmFsLgoKKiBBbGwgcGF0dGVybi1zcGVjaWZpYyB2YXJpYWJsZXMgdGhhdCBtYXRjaCBhIGdpdmVuIHRhcmdldCBhcmUgbm93IHVzZWQKICAocHJldmlvdXNseSBvbmx5IHRoZSBmaXJzdCBtYXRjaCB3YXMgdXNlZCkuCgoqIFRhcmdldC1zcGVjaWZpYyB2YXJpYWJsZXMgY2FuIGJlIG1hcmtlZCBhcyBleHBvcnRhYmxlIHVzaW5nIHRoZQogICJleHBvcnQiIGtleXdvcmQuCgoqIEluIGEgcmVjdXJzaXZlICQoY2FsbCAuLi4pIGNvbnRleHQsIGFueSBleHRyYSBhcmd1bWVudHMgZnJvbSB0aGUgb3V0ZXIKICBjYWxsIGFyZSBub3cgbWFza2VkIGluIHRoZSBjb250ZXh0IG9mIHRoZSBpbm5lciBjYWxsLgoKKiBJbXBsZW1lbnRlZCBhIHNvbHV0aW9uIGZvciB0aGUgInRodW5kZXJpbmcgaGVyZCIgcHJvYmxlbSB3aXRoICItaiAtbCIuCiAgVGhpcyB2ZXJzaW9uIG9mIEdOVSBNYWtlIHVzZXMgYW4gYWxnb3JpdGhtIHN1Z2dlc3RlZCBieSBUaG9tYXMgUmllZGwKICA8dGhvbWFzLnJpZWRsQHNpZW1lbnMuY29tPiB0byB0cmFjayB0aGUgbnVtYmVyIG9mIGpvYnMgc3RhcnRlZCBpbiB0aGUKICBsYXN0IHNlY29uZCBhbmQgYXJ0aWZpY2lhbGx5IGFkanVzdCBHTlUgTWFrZSdzIHZpZXcgb2YgdGhlIHN5c3RlbSdzCiAgbG9hZCBhdmVyYWdlIGFjY29yZGluZ2x5LgoKKiBOZXcgc3BlY2lhbCB2YXJpYWJsZXMgYXZhaWxhYmxlIGluIHRoaXMgcmVsZWFzZToKICAgLSAuSU5DTFVERV9ESVJTOiBFeHBhbmRzIHRvIGEgbGlzdCBvZiBkaXJlY3RvcmllcyB0aGF0IG1ha2Ugc2VhcmNoZXMKICAgICBmb3IgaW5jbHVkZWQgbWFrZWZpbGVzLgogICAtIC5GRUFUVVJFUzogQ29udGFpbnMgYSBsaXN0IG9mIHNwZWNpYWwgZmVhdHVyZXMgYXZhaWxhYmxlIGluIHRoaXMKICAgICB2ZXJzaW9uIG9mIEdOVSBNYWtlLgogICAtIC5ERUZBVUxUX0dPQUw6IFNldCB0aGUgbmFtZSBvZiB0aGUgZGVmYXVsdCBnb2FsIG1ha2Ugd2lsbAogICAgIHVzZSBpZiBubyBnb2FscyBhcmUgcHJvdmlkZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KICAgLSBNQUtFX1JFU1RBUlRTOiBJZiBzZXQsIHRoZW4gdGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMKICAgICBpbnN0YW5jZSBvZiBtYWtlIGhhcyBiZWVuIHJlc3RhcnRlZCAoc2VlICJIb3cgTWFrZWZpbGVzIEFyZSBSZW1hZGUiCiAgICAgaW4gdGhlIG1hbnVhbCkuCiAgIC0gTmV3IGF1dG9tYXRpYyB2YXJpYWJsZTogJHwgKGFkZGVkIGluIDMuODAsIGFjdHVhbGx5KTogY29udGFpbnMgYWxsCiAgICAgdGhlIG9yZGVyLW9ubHkgcHJlcmVxdWlzaXRlcyBkZWZpbmVkIGZvciB0aGUgdGFyZ2V0LgoKKiBOZXcgZnVuY3Rpb25zIGF2YWlsYWJsZSBpbiB0aGlzIHJlbGVhc2U6CiAgIC0gJChsYXN0d29yZCAuLi4pIHJldHVybnMgdGhlIGxhc3Qgd29yZCBpbiB0aGUgbGlzdC4gIFRoaXMgZ2l2ZXMKICAgICBpZGVudGljYWwgcmVzdWx0cyBhcyAkKHdvcmQgJCh3b3JkcyAuLi4pIC4uLiksIGJ1dCBpcyBtdWNoIGZhc3Rlci4KICAgLSAkKGFic3BhdGggLi4uKSByZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIChhbGwgIi4iIGFuZCAiLi4iCiAgICAgZGlyZWN0b3JpZXMgcmVzb2x2ZWQsIGFuZCBhbnkgZHVwbGljYXRlICIvIiBjaGFyYWN0ZXJzIHJlbW92ZWQpIGZvcgogICAgIGVhY2ggcGF0aCBwcm92aWRlZC4KICAgLSAkKHJlYWxwYXRoIC4uLikgcmV0dXJucyB0aGUgY2Fub25pY2FsIHBhdGhuYW1lIGZvciBlYWNoIHBhdGgKICAgICBwcm92aWRlZC4gIFRoZSBjYW5vbmljYWwgcGF0aG5hbWUgaXMgdGhlIGFic29sdXRlIHBhdGhuYW1lLCB3aXRoCiAgICAgYWxsIHN5bWJvbGljIGxpbmtzIHJlc29sdmVkIGFzIHdlbGwuCiAgIC0gJChpbmZvIC4uLikgcHJpbnRzIGl0cyBhcmd1bWVudHMgdG8gc3Rkb3V0LiAgTm8gbWFrZWZpbGUgbmFtZSBvcgogICAgIGxpbmUgbnVtYmVyIGluZm8sIGV0Yy4gaXMgcHJpbnRlZC4KICAgLSAkKGZsYXZvciAuLi4pIHJldHVybnMgdGhlIGZsYXZvciBvZiBhIHZhcmlhYmxlLgogICAtICQob3IgLi4uKSBwcm92aWRlcyBhIHNob3J0LWNpcmN1aXRpbmcgT1IgY29uZGl0aW9uYWw6IGVhY2ggYXJndW1lbnQKICAgICBpcyBleHBhbmRlZC4gIFRoZSBmaXJzdCB0cnVlIChub24tZW1wdHkpIGFyZ3VtZW50IGlzIHJldHVybmVkOyBubwogICAgIGZ1cnRoZXIgYXJndW1lbnRzIGFyZSBleHBhbmRlZC4gIEV4cGFuZHMgdG8gZW1wdHkgaWYgdGhlcmUgYXJlIG5vCiAgICAgdHJ1ZSBhcmd1bWVudHMuCiAgIC0gJChhbmQgLi4uKSBwcm92aWRlcyBhIHNob3J0LWNpcmN1aXRpbmcgQU5EIGNvbmRpdGlvbmFsOiBlYWNoCiAgICAgYXJndW1lbnQgaXMgZXhwYW5kZWQuICBUaGUgZmlyc3QgZmFsc2UgKGVtcHR5KSBhcmd1bWVudCBpcwogICAgIHJldHVybmVkOyBubyBmdXJ0aGVyIGFyZ3VtZW50cyBhcmUgZXhwYW5kZWQuICBFeHBhbmRzIHRvIHRoZSBsYXN0CiAgICAgYXJndW1lbnQgaWYgYWxsIGFyZ3VtZW50cyBhcmUgdHJ1ZS4KCiogQ2hhbmdlcyBtYWRlIGZvciBQT1NJWCBjb21wYXRpYmlsaXR5OgogICAtIE9ubHkgdG91Y2ggdGFyZ2V0cyAodW5kZXIgLXQpIGlmIHRoZXkgaGF2ZSBhIHJlY2lwZS4KICAgLSBTZXR0aW5nIHRoZSBTSEVMTCBtYWtlIHZhcmlhYmxlIGRvZXMgTk9UIGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlCiAgICAgU0hFTEwgZW52aXJvbm1lbnQgdmFyaWFibGUgZ2l2ZW4gdG8gcHJvZ3JhbXMgaW52b2tlZCBieSBtYWtlLiAgQXMKICAgICBhbiBlbmhhbmNlbWVudCB0byBQT1NJWCwgaWYgeW91IGV4cG9ydCB0aGUgbWFrZSB2YXJpYWJsZSBTSEVMTCB0aGVuCiAgICAgaXQgd2lsbCBiZSBzZXQgaW4gdGhlIGVudmlyb25tZW50LCBqdXN0IGFzIGJlZm9yZS4KCiogT24gTVMgV2luZG93cyBzeXN0ZW1zLCBleHBsaWNpdGx5IHNldHRpbmcgU0hFTEwgdG8gYSBwYXRobmFtZSBlbmRpbmcKICBpbiAiY21kIiBvciAiY21kLmV4ZSIgKGNhc2UtaW5zZW5zaXRpdmUpIHdpbGwgZm9yY2UgR05VIE1ha2UgdG8gdXNlCiAgdGhlIERPUyBjb21tYW5kIGludGVycHJldGVyIGluIGJhdGNoIG1vZGUgZXZlbiBpZiBhIFVOSVgtbGlrZSBzaGVsbAogIGNvdWxkIGJlIGZvdW5kIG9uIHRoZSBzeXN0ZW0uCgoqIE9uIFZNUyB0aGVyZSBpcyBub3cgc3VwcG9ydCBmb3IgY2FzZS1zZW5zaXRpdmUgZmlsZXN5c3RlbXMgc3VjaCBhcyBPRFM1LgogIFNlZSB0aGUgUkVBRE1FLlZNUyBmaWxlIGZvciBpbmZvcm1hdGlvbi4KCiogUGFyYWxsZWwgYnVpbGRzICgtak4pIG5vIGxvbmdlciByZXF1aXJlIGEgd29ya2luZyBCb3VybmUgc2hlbGwgb24KICBXaW5kb3dzIHBsYXRmb3Jtcy4gIFRoZXkgd29yayBldmVuIHdpdGggdGhlIHN0b2NrIFdpbmRvd3Mgc2hlbGxzLCBzdWNoCiAgYXMgY21kLmV4ZSBhbmQgY29tbWFuZC5jb20uCgoqIFVwZGF0ZWQgdG8gYXV0b2NvbmYgMi41OSwgYXV0b21ha2UgMS45LjUsIGFuZCBnZXR0ZXh0IDAuMTQuMS4gIFVzZXJzCiAgc2hvdWxkIG5vdCBiZSBpbXBhY3RlZC4KCiogTmV3IHRyYW5zbGF0aW9ucyBmb3IgU3dlZGlzaCwgQ2hpbmVzZSAoc2ltcGxpZmllZCksIFVrcmFpbmlhbiwKICBCZWxhcnVzaWFuLCBGaW5uaXNoLCBLaW55YXJ3YW5kYW4sIGFuZCBJcmlzaC4gIE1hbnkgdXBkYXRlZAogIHRyYW5zbGF0aW9ucy4KCkEgY29tcGxldGUgbGlzdCBvZiBidWdzIGZpeGVkIGluIHRoaXMgdmVyc2lvbiBpcyBhdmFpbGFibGUgaGVyZToKCiAgaHR0cHM6Ly9zYXZhbm5haC5nbnUub3JnL2J1Z3MvaW5kZXgucGhwP2dyb3VwPW1ha2UmcmVwb3J0X2lkPTExMSZmaXhfcmVsZWFzZV9pZD0xMDMKCgwKVmVyc2lvbiAzLjgwICgwMyBPY3QgMjAwMikKCiogQSBuZXcgZmVhdHVyZSBleGlzdHM6IG9yZGVyLW9ubHkgcHJlcmVxdWlzaXRlcy4gIFRoZXNlIHByZXJlcXVpc2l0ZXMKICBhZmZlY3QgdGhlIG9yZGVyIGluIHdoaWNoIHRhcmdldHMgYXJlIGJ1aWx0LCBidXQgdGhleSBkbyBub3QgaW1wYWN0CiAgdGhlIHJlYnVpbGQvbm8tcmVidWlsZCBkZWNpc2lvbiBvZiB0aGVpciBkZXBlbmRlbnRzLiAgVGhhdCBpcyB0byBzYXksCiAgdGhleSBhbGxvdyB5b3UgdG8gcmVxdWlyZSB0YXJnZXQgQiBiZSBidWlsdCBiZWZvcmUgdGFyZ2V0IEEsIHdpdGhvdXQKICByZXF1aXJpbmcgdGhhdCB0YXJnZXQgQSB3aWxsIGFsd2F5cyBiZSByZWJ1aWx0IGlmIHRhcmdldCBCIGlzIHVwZGF0ZWQuCiAgUGF0Y2ggZm9yIHRoaXMgZmVhdHVyZSBwcm92aWRlZCBieSBHcmVnIE1jR2FyeSA8Z3JlZ0BtY2dhcnkub3JnPi4KCiogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBTeXNWIG1ha2UsIEdOVSBNYWtlIG5vdyBzdXBwb3J0cyB0aGUgcGVjdWxpYXIKICBzeW50YXggJCRALCAkJChARCksIGFuZCAkJChARikgaW4gdGhlIHByZXJlcXVpc2l0ZXMgbGlzdCBvZiBhIHJ1bGUuCiAgVGhpcyBzeW50YXggaXMgb25seSB2YWxpZCB3aXRoaW4gZXhwbGljaXQgYW5kIHN0YXRpYyBwYXR0ZXJuIHJ1bGVzOiBpdAogIGNhbm5vdCBiZSB1c2VkIGluIGltcGxpY2l0IChzdWZmaXggb3IgcGF0dGVybikgcnVsZXMuICBFZG91YXJkIEcuIFBhcm1lbGFuCiAgPGVncEBmcmVlLmZyPiBwcm92aWRlZCBhIHBhdGNoIGltcGxlbWVudGluZyB0aGlzIGZlYXR1cmU7IGhvd2V2ZXIsIEkKICBkZWNpZGVkIHRvIGltcGxlbWVudCBpdCBpbiBhIGRpZmZlcmVudCB3YXkuCgoqIFRoZSBhcmd1bWVudCB0byB0aGUgImlmZGVmIiBjb25kaXRpb25hbCBpcyBub3cgZXhwYW5kZWQgYmVmb3JlIGl0J3MKICB0ZXN0ZWQsIHNvIGl0IGNhbiBiZSBhIGNvbnN0cnVjdGVkIHZhcmlhYmxlIG5hbWUuCgogIFNpbWlsYXJseSwgdGhlIGFyZ3VtZW50cyB0byAiZXhwb3J0IiAod2hlbiBub3QgdXNlZCBpbiBhIHZhcmlhYmxlCiAgZGVmaW5pdGlvbiBjb250ZXh0KSBhbmQgInVuZXhwb3J0IiBhcmUgYWxzbyBub3cgZXhwYW5kZWQuCgoqIEEgbmV3IGZ1bmN0aW9uIGlzIGRlZmluZWQ6ICQodmFsdWUgLi4uKS4gIFRoZSBhcmd1bWVudCB0byB0aGlzCiAgZnVuY3Rpb24gaXMgdGhlIF9uYW1lXyBvZiBhIHZhcmlhYmxlLiAgVGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gaXMKICB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlLCB3aXRob3V0IGhhdmluZyBiZWVuIGV4cGFuZGVkLgoKKiBBIG5ldyBmdW5jdGlvbiBpcyBkZWZpbmVkOiAkKGV2YWwgLi4uKS4gIFRoZSBhcmd1bWVudHMgdG8gdGhpcwogIGZ1bmN0aW9uIHNob3VsZCBleHBhbmQgdG8gbWFrZWZpbGUgY29tbWFuZHMsIHdoaWNoIHdpbGwgdGhlbiBiZQogIGV2YWx1YXRlZCBhcyBpZiB0aGV5IGhhZCBhcHBlYXJlZCBpbiB0aGUgbWFrZWZpbGUuICBJbiBjb21iaW5hdGlvbgogIHdpdGggZGVmaW5lL2VuZGVmIG11bHRpbGluZSB2YXJpYWJsZSBkZWZpbml0aW9ucyB0aGlzIGlzIGFuIGV4dHJlbWVseQogIHBvd2VyZnVsIGNhcGFiaWxpdHkuICBUaGUgJCh2YWx1ZSAuLi4pIGZ1bmN0aW9uIGlzIGFsc28gc29tZXRpbWVzCiAgdXNlZnVsIGhlcmUuCgoqIEEgbmV3IGJ1aWx0LWluIHZhcmlhYmxlIGlzIGRlZmluZWQsICQoTUFLRUZJTEVfTElTVCkuICBJdCBjb250YWlucyBhCiAgbGlzdCBvZiBlYWNoIG1ha2VmaWxlIEdOVSBNYWtlIGhhcyByZWFkLCBvciBzdGFydGVkIHRvIHJlYWQsIGluIHRoZQogIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZSBlbmNvdW50ZXJlZC4gIFNvLCB0aGUgbGFzdCBmaWxlbmFtZSBpbiB0aGUKICBsaXN0IHdoZW4gYSBtYWtlZmlsZSBpcyBqdXN0IGJlaW5nIHJlYWQgKGJlZm9yZSBhbnkgaW5jbHVkZXMpIGlzIHRoZQogIG5hbWUgb2YgdGhlIGN1cnJlbnQgbWFrZWZpbGUuCgoqIEEgbmV3IGJ1aWx0LWluIHZhcmlhYmxlIGlzIGRlZmluZWQ6ICQoLlZBUklBQkxFUykuICBXaGVuIGl0IGlzCiAgZXhwYW5kZWQgaXQgcmV0dXJucyBhIGNvbXBsZXRlIGxpc3Qgb2YgdmFyaWFibGUgbmFtZXMgZGVmaW5lZCBieSBhbGwKICBtYWtlZmlsZXMgYXQgdGhhdCBtb21lbnQuCgoqIEEgbmV3IGNvbW1hbmQgbGluZSBvcHRpb24gaXMgZGVmaW5lZCwgLUIgb3IgLS1hbHdheXMtbWFrZS4gIElmCiAgc3BlY2lmaWVkIEdOVSBNYWtlIHdpbGwgY29uc2lkZXIgYWxsIHRhcmdldHMgb3V0LW9mLWRhdGUgZXZlbiBpZiB0aGV5CiAgd291bGQgb3RoZXJ3aXNlIG5vdCBiZS4KCiogVGhlIGFyZ3VtZW50cyB0byAkKGNhbGwgLi4uKSBmdW5jdGlvbnMgd2VyZSBiZWluZyBzdG9yZWQgaW4gJDEsICQyLAogIGV0Yy4gYXMgcmVjdXJzaXZlIHZhcmlhYmxlcywgZXZlbiB0aG91Z2ggdGhleSBhcmUgZnVsbHkgZXhwYW5kZWQKICBiZWZvcmUgYXNzaWdubWVudC4gIFRoaXMgbWVhbnMgdGhhdCBlc2NhcGVkIGRvbGxhciBzaWducyAoJCQgZXRjLikKICB3ZXJlIG5vdCBiZWhhdmluZyBwcm9wZXJseS4gIE5vdyB0aGUgYXJndW1lbnRzIGFyZSBzdG9yZWQgYXMgc2ltcGxlCiAgdmFyaWFibGVzLiAgVGhpcyBtYXkgbWVhbiB0aGF0IGlmIHlvdSBhZGRlZCBleHRyYSBlc2NhcGluZyB0byB5b3VyCiAgJChjYWxsIC4uLikgZnVuY3Rpb24gYXJndW1lbnRzIHlvdSB3aWxsIG5lZWQgdG8gdW5kbyBpdCBub3cuCgoqIFRoZSB2YXJpYWJsZSBpbnZva2VkIGJ5ICQoY2FsbCAuLi4pIGNhbiBub3cgYmUgcmVjdXJzaXZlOiB1bmxpa2Ugb3RoZXIKICB2YXJpYWJsZXMgaXQgY2FuIHJlZmVyZW5jZSBpdHNlbGYgYW5kIHRoaXMgd2lsbCBub3QgcHJvZHVjZSBhbiBlcnJvcgogIHdoZW4gaXQgaXMgdXNlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gJChjYWxsIC4uLikgKGJ1dCBvbmx5IHRoZW4pLgoKKiBOZXcgcHNldWRvLXRhcmdldCAuTE9XX1JFU09MVVRJT05fVElNRSwgc3VwZXJzZWRpbmcgdGhlIGNvbmZpZ3VyZQogIG9wdGlvbiAtLWRpc2FibGUtbnNlYy10aW1lc3RhbXBzLiAgWW91IG1pZ2h0IG5lZWQgdGhpcyBpZiB5b3VyIGJ1aWxkCiAgcHJvY2VzcyBkZXBlbmRzIG9uIHRvb2xzIGxpa2UgImNwIC1wIiBwcmVzZXJ2aW5nIHRpbWUgc3RhbXBzLCBzaW5jZQogICJjcCAtcCIgKHJpZ2h0IG5vdykgZG9lc24ndCBwcmVzZXJ2ZSB0aGUgc3Vic2Vjb25kIHBvcnRpb24gb2YgYSB0aW1lCiAgc3RhbXAuCgoqIFVwZGF0ZWQgdHJhbnNsYXRpb25zIGZvciBGcmVuY2gsIEdhbGljaWFuLCBHZXJtYW4sIEphcGFuZXNlLCBLb3JlYW4sCiAgYW5kIFJ1c3NpYW4uICBOZXcgdHJhbnNsYXRpb25zIGZvciBDcm9hdGlhbiwgRGFuaXNoLCBIZWJyZXcsIGFuZAogIFR1cmtpc2guCgoqIFVwZGF0ZWQgaW50ZXJuYXRpb25hbGl6YXRpb24gc3VwcG9ydCB0byBHZXR0ZXh0IDAuMTEuNS4KICBHTlUgTWFrZSBub3cgdXNlcyBHZXR0ZXh0J3MgImV4dGVybmFsIiBmZWF0dXJlLCBhbmQgZG9lcyBub3QgaW5jbHVkZQogIGFueSBpbnRlcm5hdGlvbmFsaXphdGlvbiBjb2RlIGl0c2VsZi4gIENvbmZpZ3VyZSB3aWxsIHNlYXJjaCB5b3VyCiAgc3lzdGVtIGZvciBhbiBleGlzdGluZyBpbXBsZW1lbnRhdGlvbiBvZiBHTlUgR2V0dGV4dCAob25seSBHTlUgR2V0dGV4dAogIGlzIGFjY2VwdGFibGUpIGFuZCB1c2UgaXQgaWYgaXQgZXhpc3RzLiAgSWYgbm90LCBOTFMgd2lsbCBiZSBkaXNhYmxlZC4KICBTZWUgQUJPVVQtTkxTIGZvciBtb3JlIGluZm9ybWF0aW9uLgoKKiBVcGRhdGVkIHRvIGF1dG9jb25mIDIuNTQgYW5kIGF1dG9tYWtlIDEuNy4gIFVzZXJzIHNob3VsZCBub3QgYmUgaW1wYWN0ZWQuCgoqIFZNUy1zcGVjaWZpYyBjaGFuZ2VzOgoKICAqIEluIGRlZmF1bHQuYyBkZWZpbmUgdmFyaWFibGUgQVJDSCBhcyBJQTY0IGZvciBWTVMgb24gSXRhbml1bSBzeXN0ZW1zLgoKICAqIEluIG1ha2VmaWxlLnZtcyBhdm9pZCBuYW1lIGNvbGxpc2lvbiBmb3IgZ2xvYiBhbmQgZ2xvYmZyZWUuCgogICogVGhpcyBpcyB0aGUgVk1TIHBvcnQgb2YgR05VIE1ha2UgZG9uZSBieSBIYXJ0bXV0LkJlY2tlckBjb21wYXEuY29tLgoKICAgIEl0IGlzIGJhc2VkIG9uIHRoZSBzcGVjaWZpYyB2ZXJzaW9uIDMuNzdrIGFuZCBvbiAzLjc4LjEuIDMuNzdrIHdhcyBkb25lCiAgICBieSBLbGF1cyBL5G1wZiA8a2thZW1wZkBybWkuZGU+LCB0aGUgY29kZSB3YXMgYmFzZWQgb24gdGhlIFZNUyBwb3J0IG9mCiAgICBHTlUgTWFrZSAzLjYwIGJ5IE1pa2UgTW9yZXR0aS4KCiAgICBJdCB3YXMgcG9ydGVkIG9uIE9wZW5WTVMvQWxwaGEgVjcuMSwgREVDQyBWNS43LTAwNi4gSXQgd2FzIHJlLWJ1aWxkIGFuZAogICAgdGVzdGVkIG9uIE9wZW5WTVMvQWxwaGEgVjcuMiwgT3BlblZNUy9WQVggNy4xIGFuZCA1LjUtMi4gRGlmZmVyZW50CiAgICB2ZXJzaW9ucyBvZiBERUNDIHdlcmUgdXNlZC4gVkFYQyB3YXMgdHJpZWQ6IGl0IGZhaWxzOyBidXQgaXQgZG9lc24ndAogICAgc2VlbSB3b3J0aCB0byBnZXQgaXQgd29ya2luZy4gVGhlcmUgYXJlIHN0aWxsIHNvbWUgUFRSTUlTTUFUQ0ggd2FybmluZ3MKICAgIGR1cmluZyB0aGUgY29tcGlsZS4gQWx0aG91Z2ggcGVybCBpcyB3b3JraW5nIG9uIFZNUyB0aGUgdGVzdCBzY3JpcHRzCiAgICBkb24ndCB3b3JrLiBUaGUgZnVuY3Rpb24gJHNoZWxsIGlzIHN0aWxsIG1pc3NpbmcuCgogICAgVGhlcmUgaXMgYSBrbm93biBidWcgaW4gc29tZSBvZiB0aGUgVk1TIENSVExzLiBJdCBpcyBpbiB0aGUgc2hpcHBlZAogICAgdmVyc2lvbnMgb2YgVk1TIFY3LjIgYW5kIFY3LjItMSBhbmQgaW4gdGhlIGN1cnJlbnRseSAoT2N0b2JlciAxOTk5KQogICAgYXZhaWxhYmxlIEVDT3MgZm9yIFZNUyBWNy4xIGFuZCBuZXdlciB2ZXJzaW9ucy4gSXQgaXMgZml4ZWQgaW4gdmVyc2lvbnMKICAgIHNoaXBwZWQgd2l0aCBuZXdlciBWTVMgdmVyc2lvbnMgYW5kIGFsbCBFQ08ga2l0cyBhZnRlciBPY3RvYmVyIDE5OTkuIEl0CiAgICBvbmx5IHNob3dzIHVwIGR1cmluZyB0aGUgZGF5bGlnaHQgc2F2aW5nIHRpbWUgcGVyaW9kIChEU1QpOiBzdGF0KCkKICAgIHJldHVybnMgYSBtb2RpZmljYXRpb24gdGltZSAxIGhvdXIgYWhlYWQuIFRoaXMgcmVzdWx0cyBpbiBHTlUgTWFrZQogICAgd2FybmluZyBtZXNzYWdlcy4gRm9yIGEganVzdCBjcmVhdGVkIHNvdXJjZSB5b3Ugd2lsbCBzZWU6CgogICAgICQgZ21ha2UgeC5leGUKICAgICBnbWFrZS5leGU7MTogKioqIFdhcm5pbmc6IEZpbGUgJ3guYycgaGFzIG1vZGlmaWNhdGlvbiB0aW1lIGluIHRoZSBmdXR1cmUKICAgICAoOTQwNTgyODYzID4gOTQwNTc5MjY5KQogICAgIGNjICAgIC9vYmo9eC5vYmogeC5jCiAgICAgbGluayAgeC5vYmogICAgL2V4ZT14LmV4ZQogICAgIGdtYWtlLmV4ZTsxOiAqKiogV2FybmluZzogIENsb2NrIHNrZXcgZGV0ZWN0ZWQuICBZb3VyIGJ1aWxkIG1heSBiZQogICAgIGluY29tcGxldGUuCgoKQSBjb21wbGV0ZSBsaXN0IG9mIGJ1Z3MgZml4ZWQgaW4gdGhpcyB2ZXJzaW9uIGlzIGF2YWlsYWJsZSBoZXJlOgoKICBodHRwczovL3NhdmFubmFoLmdudS5vcmcvYnVncy9pbmRleC5waHA/Z3JvdXA9bWFrZSZyZXBvcnRfaWQ9MTExJmZpeF9yZWxlYXNlX2lkPTEwMgoKDApWZXJzaW9uIDMuNzkuMSAoMjMgSnVuIDIwMDApCgoqIC5TRUNPTkRBUlkgd2l0aCBubyBwcmVyZXF1aXNpdGVzIG5vdyBwcmV2ZW50cyBhbnkgdGFyZ2V0IGZyb20gYmVpbmcKICByZW1vdmVkIGJlY2F1c2UgbWFrZSB0aGlua3MgaXQncyBhbiBpbnRlcm1lZGlhdGUgZmlsZSwgbm90IGp1c3QgdGhvc2UKICBsaXN0ZWQgaW4gdGhlIG1ha2VmaWxlLgoKKiBOZXcgY29uZmlndXJlIG9wdGlvbiAtLWRpc2FibGUtbnNlYy10aW1lc3RhbXBzLCBidXQgdGhpcyB3YXMKICBzdXBlcnNlZGVkIGluIGxhdGVyIHZlcnNpb25zIGJ5IHRoZSAuTE9XX1JFU09MVVRJT05fVElNRSBwc2V1ZG8tdGFyZ2V0LgoMClZlcnNpb24gMy43OSAoMDQgQXByIDIwMDApCgoqIEdOVSBNYWtlIG9wdGlvbmFsbHkgc3VwcG9ydHMgaW50ZXJuYXRpb25hbGl6YXRpb24gYW5kIGxvY2FsZXMgdmlhIHRoZQogIEdOVSBnZXR0ZXh0IChvciBsb2NhbCBnZXR0ZXh0IGlmIHN1aXRhYmxlKSBwYWNrYWdlLiAgU2VlIHRoZSBBQk9VVC1OTFMKICBmaWxlIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGNvbmZpZ3VyaW5nIEdOVSBNYWtlIGZvciBOTFMuCgoqIFByZXZpb3VzbHksIEdOVSBNYWtlIHF1b3RlZCB2YXJpYWJsZXMgc3VjaCBhcyBNQUtFRkxBR1MgYW5kCiAgTUFLRU9WRVJSSURFUyBmb3IgcHJvcGVyIHBhcnNpbmcgYnkgdGhlIHNoZWxsLiAgVGhpcyBhbGxvd2VkIHRoZW0gdG8KICBiZSB1c2VkIHdpdGhpbiBtYWtlIGJ1aWxkIHNjcmlwdHMuICBIb3dldmVyLCB1c2luZyB0aGVtIHRoZXJlIGlzIG5vdAogIHByb3BlciBiZWhhdmlvcjogdGhleSBhcmUgbWVhbnQgdG8gYmUgcGFzc2VkIHRvIHN1YnNoZWxscyB2aWEgdGhlCiAgZW52aXJvbm1lbnQuICBVbmZvcnR1bmF0ZWx5IHRoZSB2YWx1ZXMgd2VyZSBub3QgcXVvdGVkIHByb3Blcmx5IHRvIGJlCiAgcGFzc2VkIHRocm91Z2ggdGhlIGVudmlyb25tZW50LiAgVGhpcyBtZWFudCB0aGF0IG1ha2UgZGlkbid0IHByb3Blcmx5CiAgcGFzcyBzb21lIHR5cGVzIG9mIGNvbW1hbmQgbGluZSB2YWx1ZXMgdG8gc3VibWFrZXMuCgogIFdpdGggdGhpcyB2ZXJzaW9uIHdlIGNoYW5nZSB0aGF0IGJlaGF2aW9yOiBub3cgdGhlc2UgdmFyaWFibGVzIGFyZQogIHF1b3RlZCBwcm9wZXJseSBmb3IgcGFzc2luZyB0aHJvdWdoIHRoZSBlbnZpcm9ubWVudCwgd2hpY2ggaXMgdGhlCiAgY29ycmVjdCB3YXkgdG8gZG8gaXQuICBJZiB5b3UgcHJldmlvdXNseSB1c2VkIHRoZXNlIHZhcmlhYmxlcwogIGV4cGxpY2l0bHkgd2l0aGluIGEgbWFrZSBydWxlIHlvdSBtYXkgbmVlZCB0byByZS1leGFtaW5lIHlvdXIgdXNlIGZvcgogIGNvcnJlY3RuZXNzIGdpdmVuIHRoaXMgY2hhbmdlLgoKKiBBIG5ldyBwc2V1ZG8tdGFyZ2V0IC5OT1RQQVJBTExFTCBpcyBhdmFpbGFibGUuICBJZiBkZWZpbmVkLCB0aGUKICBjdXJyZW50IG1ha2VmaWxlIGlzIHJ1biBzZXJpYWxseSByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZiAtai4KICBIb3dldmVyLCBzdWJtYWtlcyBhcmUgc3RpbGwgZWxpZ2libGUgZm9yIHBhcmFsbGVsIGV4ZWN1dGlvbi4KCiogVGhlIC0tZGVidWcgb3B0aW9uIGhhcyBjaGFuZ2VkOiBpdCBub3cgYWxsb3dzIG9wdGlvbmFsIGZsYWdzCiAgY29udHJvbGxpbmcgdGhlIGFtb3VudCBhbmQgdHlwZSBvZiBkZWJ1Z2dpbmcgb3V0cHV0LiAgQnkgZGVmYXVsdCBvbmx5CiAgYSBtaW5pbWFsIGFtb3VudCBpbmZvcm1hdGlvbiBpcyBnZW5lcmF0ZWQsIGRpc3BsYXlpbmcgdGhlIG5hbWVzIG9mCiAgIm5vcm1hbCIgdGFyZ2V0cyAobm90IG1ha2VmaWxlcykgdGhhdCB3ZXJlIGRlZW1lZCBvdXQgb2YgZGF0ZSBhbmQgaW4KICBuZWVkIG9mIGJlaW5nIHJlYnVpbHQuCgogIE5vdGUgdGhhdCB0aGUgLWQgb3B0aW9uIGJlaGF2ZXMgYXMgYmVmb3JlOiBpdCB0YWtlcyBubyBhcmd1bWVudHMgYW5kCiAgYWxsIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpcyBnZW5lcmF0ZWQuCgoqIFRoZSBgLXAnIChwcmludCBkYXRhYmFzZSkgb3V0cHV0IG5vdyBpbmNsdWRlcyBmaWxlbmFtZSBhbmQgbGluZW51bWJlcgogIGluZm9ybWF0aW9uIGZvciB2YXJpYWJsZSBkZWZpbml0aW9ucywgdG8gYWlkIGRlYnVnZ2luZy4KCiogVGhlIHdvcmRsaXN0IGZ1bmN0aW9uIG5vIGxvbmdlciByZXZlcnNlcyBpdHMgYXJndW1lbnRzIGlmIHRoZSAic3RhcnQiCiAgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSAiZW5kIiB2YWx1ZS4gIElmIHRoYXQncyB0cnVlLCBub3RoaW5nIGlzCiAgcmV0dXJuZWQuCgoqIEhhcnRtdXQgQmVja2VyIHByb3ZpZGVkIG1hbnkgdXBkYXRlcyBmb3IgdGhlIFZNUyBwb3J0IG9mIEdOVSBNYWtlLgogIFNlZSB0aGUgUkVBRE1FLlZNUyBmaWxlIGZvciBtb3JlIGRldGFpbHMuCgoqIFZNUy1zcGVjaWZpYyBjaGFuZ2VzOgoKICAqIEZpeCBhIHByb2JsZW0gd2l0aCBhdXRvbWF0aWNhbGx5IHJlbWFraW5nIG1ha2VmaWxlcy4gR05VIE1ha2UgdXNlcyBhbgogICAgZXhlY3ZlIHRvIHJlc3RhcnQgaXRzZWxmIGFmdGVyIGEgc3VjY2Vzc2Z1bCByZW1ha2Ugb2YgdGhlIG1ha2VmaWxlLiBPbgogICAgVU5JWCBzeXN0ZW1zIGV4ZWN2ZSByZXBsYWNlcyB0aGUgcnVubmluZyBwcm9ncmFtIHdpdGggYSBuZXcgb25lIGFuZAogICAgcmVzZXRzIGFsbCBzaWduYWwgaGFuZGxpbmcgdG8gdGhlIGRlZmF1bHQuIE9uIFZNUyBleGVjdmUgY3JlYXRlcyBhIGNoaWxkCiAgICBwcm9jZXNzLCBzaWduYWwgYW5kIGV4aXQgaGFuZGxlcnMgb2YgdGhlIHBhcmVudCBhcmUgc3RpbGwgYWN0aXZlLCBhbmQsCiAgICB1bmZvcnR1bmF0ZWx5LCBjb3JydXB0IHRoZSBleGl0IGNvZGUgZnJvbSB0aGUgY2hpbGQuIEZpeCBpbiBqb2IuYzoKICAgIGlnbm9yZSBTSUdDSExELgoKICAqIEFkZGVkIHNvbWUgc3dpdGNoZXMgdG8gcmVmbGVjdCBsYXRlc3QgZmVhdHVyZXMgb2YgREVDQy4gTW9kaWZpY2F0aW9ucyBpbgogICAgbWFrZWZpbGUudm1zLgoKICAqIFNldCBzb21lIGRlZmluaXRpb25zIHRvIHJlZmxlY3QgbGF0ZXN0IGZlYXR1cmVzIG9mIERFQ0MuIE1vZGlmaWNhdGlvbnMgaW4KICAgIGNvbmZpZy5oLXZtcyAod2hpY2ggaXMgY29waWVkIHRvIGNvbmZpZy5oKS4KCiAgKiBBZGRlZCBleHRlcm4gc3RyY21waSBkZWNsYXJhdGlvbiB0byBhdm9pZCAnaW1wbGljaXRseSBkZWNsYXJlZCcgbWVzc2FnZXMuCiAgICBNb2RpZmljYXRpb24gaW4gbWFrZS5oLgoKICAqIERlZmF1bHQgcnVsZSBmb3IgQysrLCBjb25kaXRpb25hbHMgZm9yIGdjYyAoR0NDX0lTX05BVElWRSkgb3IgREVDL0RpZ2l0YWwvCiAgICBDb21wYXEgYy9jKysgY29tcGlsZXJzLiBNb2RpZmljYXRpb25zIGluIGRlZmF1bHQuYy4KCiAgKiBVc2FnZSBvZiBvcGVuZGlyKCkgYW5kIGZyaWVuZHMsIHN1cHByZXNzIGZpbGUgdmVyc2lvbi4gTW9kaWZpY2F0aW9ucyBpbgogICAgZGlyLmMuCgogICogQWRkZWQgVk1TIHNwZWNpZmljIGNvZGUgdG8gaGFuZGxlIGN0cmwrYyBhbmQgY3RybCt5IHRvIGFib3J0IG1ha2UuCiAgICBNb2RpZmljYXRpb25zIGluIGpvYi5jLgoKICAqIEFkZGVkIHN1cHBvcnQgdG8gaGF2ZSBjYXNlIHNlbnNpdGl2ZSB0YXJnZXRzIGFuZCBkZXBlbmRlbmNpZXMgYnV0IHRvCiAgICBzdGlsbCB1c2UgY2FzZSBibGluZCBmaWxlIG5hbWVzLiBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGZvciBKYXZhCiAgICBtYWtlZmlsZXMgb24gVk1TOgoKICAgICAgICAuU1VGRklYRVMgOgogICAgICAgIC5TVUZGSVhFUyA6IC5jbGFzcyAuamF2YQogICAgICAgIC5qYXZhLmNsYXNzIDoKICAgICAgICAgICAgICAgIGphdmFjICIkPAogICAgICAgIEhlbGxvV29ybGQuY2xhc3MgOiAgICAgIEhlbGxvV29ybGQuamF2YQoKICAqIEEgbmV3IG1hY3JvIFdBTlRfQ0FTRV9TRU5TSVRJVkVfVEFSR0VUUyBpbiBjb25maWcuaC12bXMgd2FzIGludHJvZHVjZWQuCiAgICBJdCBuZWVkcyB0byBiZSBlbmFibGVkIHRvIGdldCB0aGlzIGZlYXR1cmU7IGRlZmF1bHQgaXMgZGlzYWJsZWQuICBUaGUKICAgIG1hY3JvIEhBVkVfQ0FTRV9JTlNFTlNJVElWRV9GUyBtdXN0IG5vdCBiZSB0b3VjaGVkOiBpdCBpcyBzdGlsbCBlbmFibGVkLgogICAgTW9kaWZpY2F0aW9ucyBpbiBmaWxlLmMgYW5kIGNvbmZpZy5oLXZtcy4KCiAgKiBCb290c3RyYXAgbWFrZSB0byBzdGFydCBidWlsZGluZyBtYWtlIGlzIHN0aWxsIG1ha2VmaWxlLmNvbSwgYnV0IG1ha2UKICAgIG5lZWRzIHRvIGJlIHJlLW1hZGUgd2l0aCBhIG1ha2UgdG8gbWFrZSBhIGNvcnJlY3QgdmVyc2lvbjogaWdub3JlIGFsbAogICAgcG9zc2libGUgd2FybmluZ3MsIGRlbGV0ZSBhbGwgb2JqZWN0cywgcmVuYW1lIG1ha2UuZXhlIHRvIGEgZGlmZmVyZW50CiAgICBuYW1lIGFuZCBydW4gaXQuCgogICogTWFkZSBzb21lIG1pbm9yIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGJvb3RzdHJhcCBidWlsZCBtYWtlZmlsZS5jb20uCgwKVmVyc2lvbiAzLjc4ICgyMiBTZXAgMTk5OSkKCiogVHdvIG5ldyBmdW5jdGlvbnMsICQoZXJyb3IgLi4uKSBhbmQgJCh3YXJuaW5nIC4uLikgYXJlIGF2YWlsYWJsZS4gIFRoZQogIGZvcm1lciB3aWxsIGNhdXNlIG1ha2UgdG8gZmFpbCBhbmQgZXhpdCBpbW1lZGlhdGVseSB1cG9uIGV4cGFuc2lvbiBvZgogIHRoZSBmdW5jdGlvbiwgd2l0aCB0aGUgdGV4dCBwcm92aWRlZCBhcyB0aGUgZXJyb3IgbWVzc2FnZS4gIFRoZSBsYXR0ZXIKICBjYXVzZXMgdGhlIHRleHQgcHJvdmlkZWQgdG8gYmUgcHJpbnRlZCBhcyBhIHdhcm5pbmcgbWVzc2FnZSwgYnV0IG1ha2UKICBwcm9jZWVkcyBub3JtYWxseS4KCiogQSBuZXcgZnVuY3Rpb24gJChjYWxsIC4uLikgaXMgYXZhaWxhYmxlLiAgVGhpcyBhbGxvd3MgdXNlcnMgdG8gY3JlYXRlCiAgdGhlaXIgb3duIHBhcmFtZXRlcml6ZWQgbWFjcm9zIGFuZCBpbnZva2UgdGhlbSBsYXRlci4gIE9yaWdpbmFsCiAgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmdW5jdGlvbiB3YXMgcHJvdmlkZWQgYnkgSGFuLVdlbiBOaWVuaHV5cwogIDxoYW53ZW5AY3MudXUubmw+LgoKKiBBIG5ldyBmdW5jdGlvbiAkKGlmIC4uLikgaXMgYXZhaWxhYmxlLiAgSXQgcHJvdmlkZXMgaWYtdGhlbi1lbHNlCiAgY2FwYWJpbGl0aWVzIGluIGEgYnVpbHRpbiBmdW5jdGlvbi4gIE9yaWdpbmFsIGltcGxlbWVudGF0aW9uIG9mIHRoaXMKICBmdW5jdGlvbiB3YXMgcHJvdmlkZWQgYnkgSGFuLVdlbiBOaWVuaHV5cyA8aGFud2VuQGNzLnV1Lm5sPi4KCiogTWFrZSBkZWZpbmVzIGEgbmV3IHZhcmlhYmxlLCAuTElCUEFUVEVSTlMuICBUaGlzIHZhcmlhYmxlIGNvbnRyb2xzIGhvdwogIGxpYnJhcnkgZGVwZW5kZW5jeSBleHBhbnNpb24gKGRlcGVuZGVuY2llcyBsaWtlIGBgLWxmb28nJykgaXMgcGVyZm9ybWVkLgoKKiBNYWtlIGFjY2VwdHMgQ1JMRiBzZXF1ZW5jZXMgYXMgd2VsbCBhcyB0cmFkaXRpb25hbCBMRiwgZm9yCiAgY29tcGF0aWJpbGl0eSB3aXRoIG1ha2VmaWxlcyBjcmVhdGVkIG9uIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zLgoKKiBNYWtlIGFjY2VwdHMgYSBuZXcgb3B0aW9uOiAtUiwgb3IgLS1uby1idWlsdGluLXZhcmlhYmxlcy4gIFRoaXMgb3B0aW9uCiAgZGlzYWJsZXMgdGhlIGRlZmluaXRpb24gb2YgdGhlIHJ1bGUtc3BlY2lmaWMgYnVpbHRpbiB2YXJpYWJsZXMgKENDLAogIExELCBBUiwgZXRjLikuICBTcGVjaWZ5aW5nIHRoaXMgb3B0aW9uIGZvcmNlcyAtciAoLS1uby1idWlsdGluLXJ1bGVzKQogIGFzIHdlbGwuCgoqIEEgImpvYiBzZXJ2ZXIiIGZlYXR1cmUsIHN1Z2dlc3RlZCBieSBIb3dhcmQgQ2h1IDxoeWNAaGlnaGxhbmRzdW4uY29tPi4KCiAgT24gc3lzdGVtcyB0aGF0IHN1cHBvcnQgUE9TSVggcGlwZSgyKSBzZW1hbnRpY3MsIEdOVSBNYWtlIGNhbiBub3cgcGFzcwogIC1qTiBvcHRpb25zIHRvIHN1Ym1ha2VzIHJhdGhlciB0aGFuIGZvcmNpbmcgdGhlbSBhbGwgdG8gdXNlIC1qMS4gIFRoZQogIHRvcCBtYWtlIGFuZCBhbGwgaXRzIHN1Yi1tYWtlIHByb2Nlc3NlcyB1c2UgYSBwaXBlIHRvIGNvbW11bmljYXRlIHdpdGgKICBlYWNoIG90aGVyIHRvIGVuc3VyZSB0aGF0IG5vIG1vcmUgdGhhbiBOIGpvYnMgYXJlIHN0YXJ0ZWQgYWNyb3NzIGFsbAogIG1ha2VzLiAgVG8gZ2V0IHRoZSBvbGQgYmVoYXZpb3Igb2YgLWogYmFjaywgeW91IGNhbiBjb25maWd1cmUgbWFrZQogIHdpdGggdGhlIC0tZGlzYWJsZS1qb2Itc2VydmVyIG9wdGlvbi4KCiogVGhlIGNvbmZ1c2luZyB0ZXJtICJkZXBlbmRlbmN5IiBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgbW9yZSBhY2N1cmF0ZQogIGFuZCBzdGFuZGFyZCB0ZXJtICJwcmVyZXF1aXNpdGUiLCBib3RoIGluIHRoZSBtYW51YWwgYW5kIGluIGFsbCBHTlUgTWFrZQogIG91dHB1dC4KCiogR05VIE1ha2Ugc3VwcG9ydHMgdGhlICJiaWcgYXJjaGl2ZSIgbGlicmFyeSBmb3JtYXQgaW50cm9kdWNlZCBpbiBBSVggNC4zLgoKKiBHTlUgTWFrZSBzdXBwb3J0cyBsYXJnZSBmaWxlcyBvbiBBSVgsIEhQLVVYLCBhbmQgSVJJWC4gIFRoZXNlIGNoYW5nZXMKICB3ZXJlIHByb3ZpZGVkIGJ5IFBhdWwgRWdnZXJ0IDxlZ2dlcnRAdHdpbnN1bi5jb20+LiAgKExhcmdlIGZpbGUKICBzdXBwb3J0IGZvciBTb2xhcmlzIGFuZCBMaW51eCB3YXMgaW50cm9kdWNlZCBpbiAzLjc3LCBidXQgdGhlCiAgY29uZmlndXJhdGlvbiBoYWQgaXNzdWVzOiB0aGVzZSBoYXZlIGFsc28gYmVlbiByZXNvbHZlZCkuCgoqIFRoZSBXaW5kb3dzIDk1Lzk4L05UIChXMzIpIHZlcnNpb24gb2YgR05VIE1ha2Ugbm93IGhhcyBuYXRpdmUgc3VwcG9ydAogIGZvciB0aGUgQ3lnbnVzIEN5Z3dpbiByZWxlYXNlIEIyMC4xIHNoZWxsIChiYXNoKS4KCiogVGhlIEdOVSBNYWtlIHJlZ3Jlc3Npb24gdGVzdCBzdWl0ZSwgbG9uZyBhdmFpbGFibGUgc2VwYXJhdGVseSAidW5kZXIKICB0aGUgdGFibGUiLCBoYXMgYmVlbiBpbnRlZ3JhdGVkIGludG8gdGhlIHJlbGVhc2UuICBZb3UgY2FuIGludm9rZSBpdAogIGJ5IHJ1bm5pbmcgIm1ha2UgY2hlY2siIGluIHRoZSBkaXN0cmlidXRpb24uICBOb3RlIHRoYXQgaXQgcmVxdWlyZXMKICBQZXJsIChlaXRoZXIgUGVybCA0IG9yIFBlcmwgNSkgdG8gcnVuLgoMClZlcnNpb24gMy43NyAoMjggSnVsIDE5OTgpCgoqIEltcGxlbWVudCBCU0QgbWFrZSdzICI/PSIgdmFyaWFibGUgYXNzaWdubWVudCBvcGVyYXRvci4gIFRoZSB2YXJpYWJsZQogIGlzIGFzc2lnbmVkIHRoZSBzcGVjaWZpZWQgdmFsdWUgb25seSBpZiB0aGF0IHZhcmlhYmxlIGlzIG5vdCBhbHJlYWR5CiAgZGVmaW5lZC4KCiogTWFrZSBkZWZpbmVzIGEgbmV3IHZhcmlhYmxlLCAiQ1VSRElSIiwgdG8gY29udGFpbiB0aGUgY3VycmVudCB3b3JraW5nCiAgZGlyZWN0b3J5IChhZnRlciB0aGUgLUMgb3B0aW9uLCBpZiBhbnksIGhhcyBiZWVuIHByb2Nlc3NlZCkuCiAgTW9kaWZ5aW5nIHRoaXMgdmFyaWFibGUgaGFzIG5vIGVmZmVjdCBvbiB0aGUgb3BlcmF0aW9uIG9mIG1ha2UuCgoqIE1ha2UgZGVmaW5lcyBhIG5ldyBkZWZhdWx0IFJDUyBydWxlLCBmb3IgbmV3LXN0eWxlIG1hc3RlciBmaWxlCiAgc3RvcmFnZTogYGAlIDo6IFJDUy8lJycgKG5vdGUgbm8gYGAsdicnIHN1ZmZpeCkuCgogIE1ha2UgZGVmaW5lcyBuZXcgZGVmYXVsdCBydWxlcyBmb3IgRE9TLXN0eWxlIEMrKyBmaWxlIG5hbWluZwogIGNvbnZlbnRpb25zLCB3aXRoIGBgLmNwcCcnIHN1ZmZpeGVzLiAgQWxsIHRoZSBzYW1lIHJ1bGVzIGFzIGZvcgogIGBgLmNjJycgYW5kIGBgLkMnJyBzdWZmaXhlcyBhcmUgcHJvdmlkZWQsIGFsb25nIHdpdGggTElOSy5jcHAgYW5kCiAgQ09NUElMRS5jcHAgbWFjcm9zICh3aGljaCBkZWZhdWx0IHRvIHRoZSBzYW1lIHZhbHVlIGFzIExJTksuY2MgYW5kCiAgQ09NUElMRS5jYykuICBOb3RlIENQUEZMQUdTIGlzIHN0aWxsIEMgcHJlcHJvY2Vzc29yIGZsYWdzISAgWW91IHNob3VsZAogIHVzZSBDWFhGTEFHUyB0byBjaGFuZ2UgQysrIGNvbXBpbGVyIGZsYWdzLgoKKiBBIG5ldyBmZWF0dXJlLCAidGFyZ2V0LXNwZWNpZmljIHZhcmlhYmxlIHZhbHVlcyIsIGhhcyBiZWVuIGFkZGVkLgogIFRoaXMgaXMgYSBsYXJnZSBjaGFuZ2Ugc28gcGxlYXNlIHNlZSB0aGUgYXBwcm9wcmlhdGUgc2VjdGlvbnMgb2YgdGhlCiAgbWFudWFsIGZvciBmdWxsIGRldGFpbHMuICBCcmllZmx5LCBzeW50YXggbGlrZSB0aGlzOgoKICAgIFRBUkdFVDogVkFSSUFCTEUgPSBWQUxVRQoKICBkZWZpbmVzIFZBUklBQkxFIGFzIFZBTFVFIHdpdGhpbiB0aGUgY29udGV4dCBvZiBUQVJHRVQuICBUaGlzIGlzCiAgc2ltaWxhciB0byBTdW5PUyBtYWtlJ3MgIlRBUkdFVCA6PSBWQVJJQUJMRSA9IFZBTFVFIiBmZWF0dXJlLiAgTm90ZQogIHRoYXQgdGhlIGFzc2lnbm1lbnQgbWF5IGJlIG9mIGFueSB0eXBlLCBub3QganVzdCByZWN1cnNpdmUsIGFuZCB0aGF0CiAgdGhlIG92ZXJyaWRlIGtleXdvcmQgaXMgYXZhaWxhYmxlLgoKICBDT01QQVRJQklMSVRZOiBUaGlzIG5ldyBzeW50YXggbWVhbnMgdGhhdCBpZiB5b3UgaGF2ZSBhbnkgcnVsZXMgd2hlcmUKICB0aGUgZmlyc3Qgb3Igc2Vjb25kIGRlcGVuZGVuY3kgaGFzIGFuIGVxdWFsIHNpZ24gKD0pIGluIGl0cyBuYW1lLAogIHlvdSdsbCBoYXZlIHRvIGVzY2FwZSB0aGVtIHdpdGggYSBiYWNrc2xhc2g6ICJmb28gOiBiYXJcPWJheiIuCiAgRnVydGhlciwgaWYgeW91IGhhdmUgYW55IGRlcGVuZGVuY2llcyB3aGljaCBhbHJlYWR5IGNvbnRhaW4gIlw9IiwKICB5b3UnbGwgaGF2ZSB0byBlc2NhcGUgYm90aCBvZiB0aGVtOiAiZm9vIDogYmFyXFxcPWJheiIuCgoqIEEgbmV3IGFwcGVuZGl4IGxpc3RpbmcgdGhlIG1vc3QgY29tbW9uIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2VzCiAgZ2VuZXJhdGVkIGJ5IEdOVSBNYWtlLCB3aXRoIHNvbWUgZXhwbGFuYXRpb24sIGhhcyBiZWVuIGFkZGVkIHRvIHRoZQogIEdOVSBNYWtlIFVzZXIncyBNYW51YWwuCgoqIFVwZGF0ZXMgdG8gdGhlIEdOVSBNYWtlIEN1c3RvbXMgbGlicmFyeSBzdXBwb3J0IChzZWUgUkVBRE1FLmN1c3RvbXMpLgoKKiBVcGRhdGVzIHRvIHRoZSBXaW5kb3dzIDk1L05UIHBvcnQgZnJvbSBSb2IgVHVsbG9oIChzZWUgUkVBRE1FLlczMiksCiAgYW5kIHRvIHRoZSBET1MgcG9ydCBmcm9tIEVsaSBaYXJldHNraSAoc2VlIFJFQURNRS5ET1MpLgoKKiBWTVMtc3BlY2lmaWMgY2hhbmdlczoKCiAgKiBUaGlzIGlzIHRoZSBWTVMgcG9ydCBvZiBHTlUgTWFrZS4KICAgIEl0IGlzIGJhc2VkIG9uIHRoZSBWTVMgcG9ydCBvZiBHTlUgTWFrZSAzLjYwIGJ5IE1pa2UgTW9yZXR0aS4KICAgIFRoaXMgcG9ydCB3YXMgZG9uZSBieSBLbGF1cyBL5G1wZiA8a2thZW1wZkBybWkuZGU+CgogICogVGhlcmUgaXMgZmlyc3QtbGV2ZWwgc3VwcG9ydCBhdmFpbGFibGUgZnJvbSBwcm9HSVMgU29mdHdhcmUsIEdlcm1hbnkuCiAgICBWaXNpdCB0aGVpciB3ZWItc2l0ZSBhdCBodHRwczovL3d3dy5wcm9naXMuZGUgdG8gZ2V0IGluZm9ybWF0aW9uCiAgICBhYm91dCBvdGhlciB2bXMgc29mdHdhcmUgYW5kIGZvcnRoY29taW5nIHVwZGF0ZXMgdG8gZ251IG1ha2UuCgogICogL2Jpbi9zaCBzdHlsZSBJL08gcmVkaXJlY3Rpb24gaXMgc3VwcG9ydGVkLiBZb3UgY2FuIG5vdyB3cml0ZSBsaW5lcyBsaWtlCiAgICAgICAgbWNyIHN5cyRkaXNrOltdcHJvZ3JhbS5leGUgPCBpbnB1dC50eHQgPiBvdXRwdXQudHh0ICY+IGVycm9yLnR4dAoKICAqIE1ha2VmaWxlIHZhcmlhYmxlcyBhcmUgbG9va2VkIHVwIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50LiBZb3UgY2FuIHNldAogICAgc3ltYm9scyBvciBsb2dpY2FscyBpbiBEQ0wgYW5kIGV2YWx1YXRlIHRoZW0gaW4gdGhlIE1ha2VmaWxlIHZpYQogICAgJCg8bmFtZS1vZi1zeW1ib2wtb3ItbG9naWNhbD4pLiAgVmFyaWFibGVzIGRlZmluZWQgaW4gdGhlIE1ha2VmaWxlCiAgICBvdmVycmlkZSBWTVMgc3ltYm9scy9sb2dpY2FscyAhCgogICogRnVuY3Rpb25zIGZvciBmaWxlIG5hbWVzIGFyZSB3b3JraW5nIG5vdy4gU2VlIHRoZSBHTlUgTWFrZSBtYW51YWwgZm9yCiAgICAkKGRpciAuLi4pICBhbmQgJCh3aWxkY2FyZCAuLi4pLiAgVW5peC1zdHlsZSBhbmQgVk1TLXN0eWxlIG5hbWVzIGFyZQogICAgc3VwcG9ydGVkIGFzIGFyZ3VtZW50cy4KCiAgKiBUaGUgZGVmYXVsdCBydWxlcyBhcmUgc2V0IHVwIGZvciBHTlUgQy4gQnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmcm9tIGEKICAgIHNpbmdsZSBzb3VyY2UgZmlsZSBpcyBhcyBlYXN5IGFzICdtYWtlIGZpbGUuZXhlJy4KCiAgKiBUaGUgdmFyaWFibGUgJChBUkNIKSBpcyBwcmVkZWZpbmVkIGFzIEFMUEhBIG9yIFZBWCByZXNwLiBNYWtlZmlsZXMgZm9yCiAgICBkaWZmZXJlbnQgVk1TIHN5c3RlbXMgY2FuIG5vdyBiZSB3cml0dGVuIGJ5IGNoZWNraW5nICQoQVJDSCkgYXMgaW4KICAgICAgaWZlcSAoJChBUkNIKSxBTFBIQSkKICAgICAgICAkKEVDSE8pICJPbiB0aGUgQWxwaGEiCiAgICAgIGVsc2UKICAgICAgICAkKEVDSE8pICJPbiB0aGUgVkFYIgogICAgICBlbmRpZgoKICAqIENvbW1hbmQgbGluZXMgb2YgZXhjZXNzaXZlIGxlbmd0aCBhcmUgY29ycmVjdGx5IGJyb2tlbiBhbmQgd3JpdHRlbiB0byBhCiAgICBiYXRjaCBmaWxlIGluIHN5cyRzY3JhdGNoIGZvciBsYXRlciBleGVjdXRpb24uIFRoZXJlJ3Mgbm8gbGltaXQgdG8gdGhlCiAgICBsZW5ndGhzIG9mIGNvbW1hbmRzIChhbmQgbm8gbmVlZCBmb3IgLm9wdCBmaWxlcyA6LSkgYW55IG1vcmUuCgogICogRW1wdHkgY29tbWFuZHMgYXJlIGhhbmRsZWQgY29ycmVjdGx5IGFuZCBkb24ndCBlbmQgaW4gYSBuZXcgRENMIHByb2Nlc3MuCgwKVmVyc2lvbiAzLjc2LjEgKDE5IFNlcCAxOTk3KQoKKiBTbWFsbCAoYnV0IHNlcmlvdXMpIGJ1ZyBmaXguICBRdWljayByb2xsb3V0IHRvIGdldCBpbnRvIHRoZSBHTlUgc291cmNlIENELgoMClZlcnNpb24gMy43NiAoMTYgU2VwIDE5OTcpCgoqIEdOVSBNYWtlIG5vdyB1c2VzIGF1dG9tYWtlIHRvIGNvbnRyb2wgTWFrZWZpbGUuaW4gZ2VuZXJhdGlvbi4gIFRoaXMKICBzaG91bGQgbWFrZSBpdCBtb3JlIGNvbnNpc3RlbnQgd2l0aCB0aGUgR05VIHN0YW5kYXJkcy4KCiogVlBBVEggZnVuY3Rpb25hbGl0eSBoYXMgYmVlbiBjaGFuZ2VkIHRvIGluY29ycG9yYXRlIHRoZSBWUEFUSCsgcGF0Y2gsCiAgcHJldmlvdXNseSBtYWludGFpbmVkIGJ5IFBhdWwgU21pdGggPHBzbWl0aEBiYXluZXR3b3Jrcy5jb20+LiAgU2VlIHRoZQogIG1hbnVhbC4KCiogTWFrZSBkZWZpbmVzIGEgbmV3IHZhcmlhYmxlLCBgTUFLRUNNREdPQUxTJywgdG8gY29udGFpbiB0aGUgZ29hbHMgdGhhdAogIHdlcmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIGlmIGFueS4gIE1vZGlmeWluZyB0aGlzIHZhcmlhYmxlCiAgaGFzIG5vIGVmZmVjdCBvbiB0aGUgb3BlcmF0aW9uIG9mIG1ha2UuCgoqIEEgbmV3IGZ1bmN0aW9uLCBgJCh3b3JkbGlzdCBTLEUsVEVYVCknLCBpcyBhdmFpbGFibGU6IGl0IHJldHVybnMgYQogIGxpc3Qgb2Ygd29yZHMgZnJvbSBudW1iZXIgUyB0byBudW1iZXIgRSAoaW5jbHVzaXZlKSBvZiBURVhULgoKKiBJbnN0ZWFkIG9mIGFuIGVycm9yLCBkZXRlY3Rpb24gb2YgZnV0dXJlIG1vZGlmaWNhdGlvbiB0aW1lcyBnaXZlcyBhCiAgd2FybmluZyBhbmQgY29udGludWVzLiAgVGhlIHdhcm5pbmcgaXMgcmVwZWF0ZWQganVzdCBiZWZvcmUgR05VIE1ha2UKICBleGl0cywgc28gaXQgaXMgbGVzcyBsaWtlbHkgdG8gYmUgbG9zdC4KCiogRml4IHRoZSAkKGJhc2VuYW1lKSBhbmQgJChzdWZmaXgpIGZ1bmN0aW9ucyBzbyB0aGV5IG9ubHkgb3BlcmF0ZSBvbgogIHRoZSBsYXN0IGZpbGVuYW1lLCBub3QgdGhlIGVudGlyZSBzdHJpbmc6CgogICAgICBDb21tYW5kICAgICAgICAgICAgICBPbGQgUmVzdWx0ICAgICAgICAgICAgIE5ldyBSZXN1bHQKICAgICAgLS0tLS0tLSAgICAgICAgICAgICAgLS0tLS0tLS0tLSAgICAgICAgICAgICAtLS0tLS0tLS0tCiAgICAkKGJhc2VuYW1lIGEuYikgICAgICAgIGEgICAgICAgICAgICAgICAgICAgICAgYQogICAgJChiYXNlbmFtZSBhLmIvYykgICAgICBhICAgICAgICAgICAgICAgICAgICAgIGEuYi9jCiAgICAkKHN1ZmZpeCBhLmIpICAgICAgICAgIGIgICAgICAgICAgICAgICAgICAgICAgYgogICAgJChzdWZmaXggYS5iL2MpICAgICAgICBiL2MgICAgICAgICAgICAgICAgICAgIDxlbXB0eT4KCiogVGhlICQoc3RyaXApIGZ1bmN0aW9uIG5vdyByZW1vdmVzIG5ld2xpbmVzIGFzIHdlbGwgYXMgVEFCcyBhbmQgc3BhY2VzLgoKKiBUaGUgJChzaGVsbCkgZnVuY3Rpb24gbm93IGNoYW5nZXMgQ1JMRiAoXHJcbikgcGFpcnMgdG8gYSBzcGFjZSBhcyB3ZWxsCiAgYXMgbmV3bGluZXMgKFxuKS4KCiogVXBkYXRlcyB0byB0aGUgV2luZG93cyA5NS9OVCBwb3J0IGZyb20gUm9iIFR1bGxvaCAoc2VlIFJFQURNRS5XMzIpLgoKKiBFbGkgWmFyZXRza2lpIGhhcyB1cGRhdGVkIHRoZSBwb3J0IHRvIDMyLWJpdCBwcm90ZWN0ZWQgbW9kZSBvbiBNU0RPUwogIGFuZCBNUy1XaW5kb3dzLCBidWlsZGluZyB3aXRoIHRoZSBESkdQUCB2MiBwb3J0IG9mIEdOVSBDL0MrKyBjb21waWxlcgogIGFuZCB1dGlsaXRpZXMuICBTZWUgUkVBRE1FLkRPUyBmb3IgZGV0YWlscywgYW5kIGRpcmVjdCBhbGwgcXVlc3Rpb25zCiAgY29uY2VybmluZyB0aGlzIHBvcnQgdG8gRWxpIFphcmV0c2tpaSA8ZWxpekBpcy5lbHRhLmNvLmlsPiBvciBESgogIERlbG9yaWUgPGRqQGRlbG9yaWUuY29tPi4KCiogVk1TLXNwZWNpZmljIGNoYW5nZXM6CgogICogSm9obiBXLiBFYXRvbiBoYXMgdXBkYXRlZCB0aGUgVk1TIHBvcnQgdG8gc3VwcG9ydCBsaWJyYXJpZXMgYW5kIFZQQVRILgoKICAqIFRoZSBjZCBjb21tYW5kIGlzIHN1cHBvcnRlZCBpZiBpdCdzIGNhbGxlZCBhcyAkKENEKS4gVGhpcyBpbnZva2VzCiAgICB0aGUgJ2J1aWx0aW5fY2QnIGNvbW1hbmQgd2hpY2ggY2hhbmdlcyB0aGUgZGlyZWN0b3J5LgogICAgQ2FsbGluZyAnc2V0IGRlZicgZG9lc24ndCBkbyB0aGUgdHJpY2ssIHNpbmNlIGEgc3ViLXNoZWxsIGlzCiAgICBzcGF3bmVkIGZvciB0aGlzIGNvbW1hbmQsIHRoZSBkaXJlY3RvcnkgaXMgY2hhbmdlZCAqaW4gdGhpcyBzdWItc2hlbGwqCiAgICBhbmQgdGhlIHN1Yi1zaGVsbCBlbmRzLgoKICAqIExpYnJhcmllcyBhcmUgbm90IHN1cHBvcnRlZC4gVGhleSB3ZXJlIGluIEdOVSBNYWtlIDMuNjAgYnV0IHNvbWVob3cgSQogICAgZGlkbid0IGNhcmUgcG9ydGluZyB0aGUgY29kZS4gSWYgdGhlcmUgaXMgZW5vdWdoIGludGVyZXN0LCBJJ2xsIGRvIGl0IGF0CiAgICBzb21lIGxhdGVyIHRpbWUuCgogICogVGhlIHZhcmlhYmxlICReIHNlcGFyYXRlcyBmaWxlcyB3aXRoIGNvbW1hcyBpbnN0ZWFkIG9mIHNwYWNlcyAoSXQncyB0aGUKICAgIG5hdHVyYWwgdGhpbmcgdG8gZG8gZm9yIFZNUykuCgogICogU2VlIGRlZmF1bHRzLmMgZm9yIFZNUyBkZWZhdWx0IHN1ZmZpeGVzIGFuZCBteSBkZWZpbml0aW9ucyBmb3IgZGVmYXVsdAogICAgcnVsZXMgYW5kIHZhcmlhYmxlcy4KCiAgKiBUaGUgc2hlbGwgZnVuY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIHlldC4KCiAgKiBMb2FkIGF2ZXJhZ2Ugcm91dGluZXMgaGF2ZW4ndCBiZWVuIGltcGxlbWVudGVkIGZvciBWTVMgeWV0LgoKICAqIFRoZSBkZWZhdWx0IGluY2x1ZGUgZGlyZWN0b3J5IGZvciBpbmNsdWRpbmcgb3RoZXIgbWFrZWZpbGVzIGlzCiAgICBTWVMkU1lTUk9PVDpbU1lTTElCXSAoSSBkb24ndCByZW1lbWJlciB3aHkgSSBkaWRuJ3QganVzdCB1c2UKICAgIFNZUyRMSUJSQVJZOiBpbnN0ZWFkOyBtYXliZSBpdCB3b3VsZG4ndCB3b3JrIHRoYXQgd2F5KS4KCiAgKiBUaGUgZGVmYXVsdCBtYWtlZmlsZXMgbWFrZSBsb29rcyBmb3IgYXJlOiBtYWtlZmlsZS52bXMsIGdudW1ha2VmaWxlLAogICAgbWFrZWZpbGUuLCBhbmQgZ251bWFrZWZpbGUuIC4KCiAgKiBUaGUgc3RhdCgpIGZ1bmN0aW9uIGFuZCBoYW5kbGluZyBvZiB0aW1lIHN0YW1wcyBpbiBWTVMgaXMgYnJva2VuLCBzbyBJCiAgICByZXBsYWNlZCBpdCB3aXRoIGEgaGFjayBpbiB2bXNmdW5jdGlvbnMuYy4gSSB3aWxsIHByb3ZpZGUgYSBmdWxsIHJld3JpdGUKICAgIHNvbWV3aGVyZSBpbiB0aGUgZnV0dXJlLiBCZSB3YXJuZWQsIHRoZSB0aW1lIHJlc29sdXRpb24gaW5zaWRlIG1ha2UgaXMKICAgIGxlc3MgdGhhbiB3aGF0IHZtcyBwcm92aWRlcy4gVGhpcyBtaWdodCBiZSBhIHByb2JsZW0gb24gdGhlIGZhc3RlciBBbHBoYXMuCgogICogWW91IGNhbiB1c2UgYSA6IGluIGEgZmlsZW5hbWUgb25seSBpZiB5b3UgcHJlY2VkZSBpdCB3aXRoIGEgYmFja3NsYXNoICgnXCcpLgogICAgRS5nLi0gaG9iYmVzXDpbYm9nYXMuZmlsZXNdCgogICogTWFrZSBpZ25vcmVzIHN1Y2Nlc3MsIGluZm9ybWF0aW9uYWwsIG9yIHdhcm5pbmcgZXJyb3JzICgtUy0sIC1JLSwgb3IgLVctKS4KICAgIEJ1dCBpdCB3aWxsIHN0b3Agb24gLUUtIGFuZCAtRi0gZXJyb3JzLiAodW5sZXNzIHlvdSBkbyBzb21ldGhpbmcKICAgIHRvIG92ZXJyaWRlIHRoaXMgaW4geW91ciBtYWtlZmlsZSwgb3Igd2hhdGV2ZXIpLgoKICAqIFJlbW90ZSBzdHVmZiBpc24ndCBpbXBsZW1lbnRlZCB5ZXQuCgogICogTXVsdGlwbGUgbGluZSBEQ0wgY29tbWFuZHMsIHN1Y2ggYXMgImlmIiBzdGF0ZW1lbnRzLCBtdXN0IGJlIHB1dCBpbnNpZGUKICAgIGNvbW1hbmQgZmlsZXMuICBZb3UgY2FuIHJ1biBhIGNvbW1hbmQgZmlsZSBieSB1c2luZyBcQC4KClZlcnNpb24gMy43NSAoMjcgQXVnIDE5OTYpCgoqIFRoZSBkaXJlY3RvcnkgbWVzc2FnZXMgcHJpbnRlZCBieSBgLXcnIGFuZCBpbXBsaWNpdGx5IGluIHN1Yi1tYWtlcywKICBhcmUgbm93IG9taXR0ZWQgaWYgTWFrZSBydW5zIG5vIGNvbW1hbmRzIGFuZCBoYXMgbm8gb3RoZXIgbWVzc2FnZXMgdG8gcHJpbnQuCgoqIE1ha2Ugbm93IGRldGVjdHMgZmlsZXMgdGhhdCBmb3Igd2hhdGV2ZXIgcmVhc29uIGhhdmUgbW9kaWZpY2F0aW9uIHRpbWVzCiAgaW4gdGhlIGZ1dHVyZSBhbmQgZ2l2ZXMgYW4gZXJyb3IuICBGaWxlcyB3aXRoIHN1Y2ggaW1wb3NzaWJsZSB0aW1lc3RhbXBzCiAgY2FuIHJlc3VsdCBmcm9tIHVuc3luY2hyb25pemVkIGNsb2Nrcywgb3IgYXJjaGl2ZWQgZGlzdHJpYnV0aW9ucwogIGNvbnRhaW5pbmcgYm9ndXMgdGltZXN0YW1wczsgdGhleSBjb25mdXNlIE1ha2UncyBkZXBlbmRlbmN5IGVuZ2luZQogIHRob3JvdWdobHkuCgoqIFRoZSBuZXcgZGlyZWN0aXZlIGBzaW5jbHVkZScgaXMgbm93IHJlY29nbml6ZWQgYXMgYW5vdGhlciBuYW1lIGZvcgogIGAtaW5jbHVkZScsIGZvciBjb21wYXRpYmlsaXR5IHdpdGggc29tZSBvdGhlciBNYWtlcy4KCiogQWFyb24gRGlndWxsYSBoYXMgY29udHJpYnV0ZWQgYSBwb3J0IHRvIEFtaWdhRE9TLiAgU2VlIFJFQURNRS5BbWlnYSBmb3IKICBkZXRhaWxzLCBhbmQgZGlyZWN0IGFsbCBBbWlnYS1yZWxhdGVkIHF1ZXN0aW9ucyB0byA8ZGlndWxsYUBmaC1rb25zdGFuei5kZT4uCgoqIFJvYiBUdWxsb2ggb2YgVGl2b2xpIFN5c3RlbXMgaGFzIGNvbnRyaWJ1dGVkIGEgcG9ydCB0byBXaW5kb3dzIE5UIG9yIDk1LgogIFNlZSBSRUFETUUuVzMyIGZvciBkZXRhaWxzLCBhbmQgZGlyZWN0IGFsbCBXaW5kb3dzLXJlbGF0ZWQgcXVlc3Rpb25zIHRvCiAgPHJvYl90dWxsb2hAdGl2b2xpLmNvbT4uCgoqIFZNUy1zcGVjaWZpYyBjaGFuZ2VzOgoKICAqIExvdHMgb2YgZGVmYXVsdCBzZXR0aW5ncyBhcmUgYWRhcHRlZCBmb3IgVk1TLiBTZWUgZGVmYXVsdC5jLgoKICAqIExvbmcgY29tbWFuZCBsaW5lcyBhcmUgbm93IGNvbnZlcnRlZCB0byBjb21tYW5kIGZpbGVzLgoKICAqIENvbW1hICgnLCcpIGFzIGEgc2VwYXJhdG9yIGlzIG5vdyBhbGxvd2VkLiBTZWUgbWFrZWZpbGUudm1zIGZvciBhbiBleGFtcGxlLgoMClZlcnNpb24gMy43MyAoMDUgQXByIDE5OTUpCgoqIENvbnZlcnRlZCB0byB1c2UgQXV0b2NvbmYgdmVyc2lvbiAyLCBzbyBgY29uZmlndXJlJyBoYXMgc29tZSBuZXcgb3B0aW9ucy4KICBTZWUgSU5TVEFMTCBmb3IgZGV0YWlscy4KCiogWW91IGNhbiBub3cgc2VuZCBhIFNJR1VTUjEgc2lnbmFsIHRvIE1ha2UgdG8gdG9nZ2xlIHByaW50aW5nIG9mIGRlYnVnZ2luZwogIG91dHB1dCBlbmFibGVkIGJ5IC1kLCBhdCBhbnkgdGltZSBkdXJpbmcgdGhlIHJ1bi4KDApWZXJzaW9uIDMuNzIgKDA0IE5vdiAxOTk0KQoKKiBESiBEZWxvcmllIGhhcyBwb3J0ZWQgTWFrZSB0byBNUy1ET1MgdXNpbmcgdGhlIEdPMzIgZXh0ZW5kZXIuCiAgSGUgaXMgbWFpbnRhaW5pbmcgdGhlIERPUyBwb3J0LCBub3QgdGhlIEdOVSBNYWtlIG1haW50YWluZXI7CiAgcGxlYXNlIGRpcmVjdCBidWdzIGFuZCBxdWVzdGlvbnMgZm9yIERPUyB0byA8ZGpncHBAc3VuLnNvZS5jbGFya3Nvbi5lZHU+LgogIE1TLURPUyBiaW5hcmllcyBhcmUgYXZhaWxhYmxlIGZvciBGVFAgZnJvbSBmdHAuc2ltdGVsLm5ldCBpbgogIC9wdWIvc2ltdGVsbmV0L2dudS9kamdwcC8uCgoqIFRoZSBgTUFLRUZMQUdTJyB2YXJpYWJsZSAoaW4gdGhlIGVudmlyb25tZW50IG9yIGluIGEgbWFrZWZpbGUpIGNhbiBub3cKICBjb250YWluIHZhcmlhYmxlIGRlZmluaXRpb25zIGl0c2VsZjsgdGhlc2UgYXJlIHRyZWF0ZWQganVzdCBsaWtlCiAgY29tbWFuZCBsaW5lIHZhcmlhYmxlIGRlZmluaXRpb25zLiAgTWFrZSB3aWxsIGF1dG9tYXRpY2FsbHkgaW5zZXJ0IGFueQogIHZhcmlhYmxlIGRlZmluaXRpb25zIGZyb20gdGhlIGVudmlyb25tZW50IHZhbHVlIG9mIGBNQUtFRkxBR1MnIG9yIGZyb20KICB0aGUgY29tbWFuZCBsaW5lLCBpbnRvIHRoZSBgTUFLRUZMQUdTJyB2YWx1ZSBleHBvcnRlZCB0byBjaGlsZHJlbi4gIFRoZQogIGBNQUtFT1ZFUlJJREVTJyB2YXJpYWJsZSBwcmV2aW91c2x5IGluY2x1ZGVkIGluIHRoZSB2YWx1ZSBvZiBgJChNQUtFKScKICBmb3Igc3ViLW1ha2VzIGlzIG5vdyBpbmNsdWRlZCBpbiBgTUFLRUZMQUdTJyBpbnN0ZWFkLiAgQXMgYmVmb3JlLCB5b3UgY2FuCiAgcmVzZXQgYE1BS0VPVkVSUklERVMnIGluIHlvdXIgbWFrZWZpbGUgdG8gYXZvaWQgcHV0dGluZyBhbGwgdGhlIHZhcmlhYmxlcwogIGluIHRoZSBlbnZpcm9ubWVudCB3aGVuIGl0cyBzaXplIGlzIGxpbWl0ZWQuCgoqIElmIGAuREVMRVRFX09OX0VSUk9SJyBhcHBlYXJzIGFzIGEgdGFyZ2V0LCBNYWtlIHdpbGwgZGVsZXRlIHRoZSB0YXJnZXQgb2YKICBhIHJ1bGUgaWYgaXQgaGFzIGNoYW5nZWQgd2hlbiBpdHMgcmVjaXBlIGV4aXRzIHdpdGggYSBub256ZXJvIHN0YXR1cywKICBqdXN0IGFzIHdoZW4gdGhlIHJlY2lwZSBnZXRzIGEgc2lnbmFsLgoKKiBUaGUgYXV0b21hdGljIHZhcmlhYmxlIGAkKycgaXMgbmV3LiAgSXQgbGlzdHMgYWxsIHRoZSBkZXBlbmRlbmNpZXMgbGlrZQogIGAkXicsIGJ1dCBwcmVzZXJ2ZXMgZHVwbGljYXRlcyBsaXN0ZWQgaW4gdGhlIG1ha2VmaWxlLiAgVGhpcyBpcyB1c2VmdWwKICBmb3IgbGlua2luZyBydWxlcywgd2hlcmUgbGlicmFyeSBmaWxlcyBzb21ldGltZXMgbmVlZCB0byBiZSBsaXN0ZWQgdHdpY2UKICBpbiB0aGUgbGluayBvcmRlci4KCiogWW91IGNhbiBub3cgc3BlY2lmeSB0aGUgYC5JR05PUkUnIGFuZCBgLlNJTEVOVCcgc3BlY2lhbCB0YXJnZXRzIHdpdGgKICBkZXBlbmRlbmNpZXMgdG8gbGltaXQgdGhlaXIgZWZmZWN0cyB0byB0aG9zZSBmaWxlcy4gIElmIGEgZmlsZSBhcHBlYXJzIGFzCiAgYSBkZXBlbmRlbmN5IG9mIGAuSUdOT1JFJywgdGhlbiBlcnJvcnMgd2lsbCBiZSBpZ25vcmVkIHdoaWxlIHJ1bm5pbmcgdGhlCiAgcmVjaXBlIHRvIHVwZGF0ZSB0aGF0IGZpbGUuICBMaWtld2lzZSBpZiBhIGZpbGUgYXBwZWFycyBhcyBhIGRlcGVuZGVuY3kKICBvZiBgLlNJTEVOVCcsIHRoZW4gdGhlIHJlY2lwZSB0byB1cGRhdGUgdGhhdCBmaWxlIHdpbGwgbm90IGJlIHByaW50ZWQKICBiZWZvcmUgaXQgaXMgcnVuLiAgKFRoaXMgY2hhbmdlIHdhcyBtYWRlIHRvIGNvbmZvcm0gdG8gUE9TSVguMi4pCgwKVmVyc2lvbiAzLjcxICgyMSBNYXkgMTk5NCkKCiogVGhlIGF1dG9tYXRpYyB2YXJpYWJsZXMgYCQoQEQpJywgYCQoJUQpJywgYCQoKkQpJywgYCQoPEQpJywgYCQoP0QpJywgYW5kCiAgYCQoXkQpJyBub3cgb21pdCB0aGUgdHJhaWxpbmcgc2xhc2ggZnJvbSB0aGUgZGlyZWN0b3J5IG5hbWUuICAoVGhpcyBjaGFuZ2UKICB3YXMgbWFkZSB0byBjb21wbHkgd2l0aCBQT1NJWC4yLikKCiogVGhlIHNvdXJjZSBkaXN0cmlidXRpb24gbm93IGluY2x1ZGVzIHRoZSBJbmZvIGZpbGVzIGZvciB0aGUgTWFrZSBtYW51YWwuCiAgVGhlcmUgaXMgbm8gbG9uZ2VyIGEgc2VwYXJhdGUgZGlzdHJpYnV0aW9uIGNvbnRhaW5pbmcgSW5mbyBhbmQgRFZJIGZpbGVzLgoKKiBZb3UgY2FuIG5vdyBzZXQgdGhlIHZhcmlhYmxlcyBgYmlucHJlZml4JyBhbmQvb3IgYG1hbnByZWZpeCcgaW4KICBNYWtlZmlsZS5pbiAob3Igb24gdGhlIGNvbW1hbmQgbGluZSB3aGVuIGluc3RhbGxpbmcpIHRvIGluc3RhbGwgR05VIE1ha2UKICB1bmRlciBhIG5hbWUgb3RoZXIgdGhhbiBgbWFrZScgKGkuZS4sIGBgbWFrZSBiaW5wcmVmaXg9ZyBpbnN0YWxsJycKICBpbnN0YWxscyBHTlUgTWFrZSBhcyBgZ21ha2UnKS4KCiogVGhlIGJ1aWx0LWluIFRleGluZm8gcnVsZXMgdXNlIHRoZSBuZXcgdmFyaWFibGVzIGBURVhJMkRWSV9GTEFHUycgZm9yCiAgZmxhZ3MgdG8gdGhlIGB0ZXhpMmR2aScgc2NyaXB0LCBhbmQgYE1BS0VJTkZPX0ZMQUdTJyBmb3IgZmxhZ3MgdG8gdGhlCiAgTWFrZWluZm8gcHJvZ3JhbS4KCiogVGhlIGV4aXQgc3RhdHVzIG9mIE1ha2Ugd2hlbiBpdCBydW5zIGludG8gZXJyb3JzIGlzIG5vdyAyIGluc3RlYWQgb2YgMS4KICBUaGUgZXhpdCBzdGF0dXMgaXMgMSBvbmx5IHdoZW4gdXNpbmcgLXEgYW5kIHNvbWUgdGFyZ2V0IGlzIG5vdCB1cCB0byBkYXRlLgogIChUaGlzIGNoYW5nZSB3YXMgbWFkZSB0byBjb21wbHkgd2l0aCBQT1NJWC4yLikKDApWZXJzaW9uIDMuNzAgKDAzIEphbiAxOTk0KQoKKiBJdCBpcyBubyBsb25nZXIgYSBmYXRhbCBlcnJvciB0byBoYXZlIGEgTlVMIGNoYXJhY3RlciBpbiBhIG1ha2VmaWxlLgogIFlvdSBzaG91bGQgbmV2ZXIgcHV0IGEgTlVMIGluIGEgbWFrZWZpbGUgYmVjYXVzZSBpdCBjYW4gaGF2ZSBzdHJhbmdlCiAgcmVzdWx0cywgYnV0IG90aGVyd2lzZSBlbXB0eSBsaW5lcyBmdWxsIG9mIE5VTHMgKHN1Y2ggYXMgcHJvZHVjZWQgYnkKICB0aGUgYHhta21mJyBwcm9ncmFtKSB3aWxsIGFsd2F5cyB3b3JrIGZpbmUuCgoqIFRoZSBlcnJvciBtZXNzYWdlcyBmb3Igbm9uZXhpc3RlbnQgaW5jbHVkZWQgbWFrZWZpbGVzIG5vdyByZWZlciB0byB0aGUKICBtYWtlZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciB3aGVyZSB0aGUgYGluY2x1ZGUnIGFwcGVhcmVkLCBzbyBFbWFjcydzCiAgQy14IGAgY29tbWFuZCB0YWtlcyB5b3UgdGhlcmUgKGluIGNhc2UgaXQncyBhIHR5cG8geW91IG5lZWQgdG8gZml4KS4KDApWZXJzaW9uIDMuNjkgKDA3IE5vdiAxOTkzKQoKKiBJbXBsaWNpdCBydWxlIHNlYXJjaCBmb3IgYXJjaGl2ZSBtZW1iZXIgcmVmZXJlbmNlcyBpcyBub3cgZG9uZSBpbiB0aGUKICBvcHBvc2l0ZSBvcmRlciBmcm9tIHByZXZpb3VzIHZlcnNpb25zOiB0aGUgd2hvbGUgdGFyZ2V0IG5hbWUgYExJQihNRU0pJwogIGZpcnN0LCBhbmQganVzdCB0aGUgbWVtYmVyIG5hbWUgYW5kIHBhcmVudGhlc2VzIGAoTUVNKScgc2Vjb25kLgoKKiBNYWtlIG5vdyBnaXZlcyBhbiBlcnJvciBmb3IgYW4gdW50ZXJtaW5hdGVkIHZhcmlhYmxlIG9yIGZ1bmN0aW9uIHJlZmVyZW5jZS4KICBGb3IgZXhhbXBsZSwgYCQoZm9vJyB3aXRoIG5vIG1hdGNoaW5nIGApJyBvciBgJHtiYXInIHdpdGggbm8gbWF0Y2hpbmcgYH0nLgoKKiBUaGUgbmV3IGRlZmF1bHQgdmFyaWFibGUgYE1BS0VfVkVSU0lPTicgZ2l2ZXMgdGhlIHZlcnNpb24gbnVtYmVyIG9mCiAgTWFrZSwgYW5kIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHJlbW90ZSBqb2Igc3VwcG9ydCBjb21waWxlZCBpbiAoaWYgYW55KS4KICBUaHVzIHRoZSB2YWx1ZSAoaW4gdGhpcyByZWxlYXNlKSBpcyBzb21ldGhpbmcgbGlrZSBgMy42OScgb3IgYDMuNjktQ3VzdG9tcycuCgoqIENvbW1hbmRzIGluIGFuIGludm9jYXRpb24gb2YgdGhlIGBzaGVsbCcgZnVuY3Rpb24gYXJlIG5vIGxvbmdlciBydW4KICB3aXRoIGEgbW9kaWZpZWQgZW52aXJvbm1lbnQgbGlrZSByZWNpcGVzIGFyZS4gIEFzIGluIHZlcnNpb25zIGJlZm9yZQogIDMuNjgsIHRoZXkgbm93IHJ1biB3aXRoIHRoZSBlbnZpcm9ubWVudCB0aGF0IGBtYWtlJyBzdGFydGVkIHdpdGguICBXZQogIGhhdmUgcmV2ZXJzZWQgdGhlIGNoYW5nZSBtYWRlIGluIHZlcnNpb24gMy42OCBiZWNhdXNlIGl0IHR1cm5lZCBvdXQgdG8KICBjYXVzZSBhIHBhcmFkb3hpY2FsIHNpdHVhdGlvbiBpbiBjYXNlcyBsaWtlOgoKICAgICAgICBleHBvcnQgdmFyaWFibGUgPSAkKHNoZWxsIGVjaG8gdmFsdWUpCgogIFdoZW4gTWFrZSBhdHRlbXB0ZWQgdG8gcHV0IHRoaXMgdmFyaWFibGUgaW4gdGhlIGVudmlyb25tZW50IGZvciBhCiAgcmVjaXBlLCBpdCB3b3VsZCB0cnkgZXhwYW5kIHRoZSB2YWx1ZSBieSBydW5uaW5nIHRoZSBzaGVsbCBjb21tYW5kCiAgYGVjaG8gdmFsdWUnLiAgSW4gdmVyc2lvbiAzLjY4LCBiZWNhdXNlIGl0IGNvbnN0cnVjdGVkIGFuIGVudmlyb25tZW50CiAgZm9yIHRoYXQgc2hlbGwgY29tbWFuZCBpbiB0aGUgc2FtZSB3YXksIE1ha2Ugd291bGQgYmVnaW4gdG8gZ28gaW50byBhbgogIGluZmluaXRlIGxvb3AgYW5kIHRoZW4gZ2V0IGEgZmF0YWwgZXJyb3Igd2hlbiBpdCBkZXRlY3RlZCB0aGUgbG9vcC4KCiogVGhlIHJlY2lwZSBnaXZlbiBmb3IgYC5ERUZBVUxUJyBpcyBub3cgdXNlZCBmb3IgcGhvbnkgdGFyZ2V0cyB3aXRoIG5vCiAgcmVjaXBlLgoMClZlcnNpb24gMy42OCAoMjggSnVsIDE5OTMpCgoqIFlvdSBjYW4gbGlzdCBzZXZlcmFsIGFyY2hpdmUgbWVtYmVyIG5hbWVzIGluc2lkZSBwYXJlbnRoZXNpczoKICBgbGliKG1lbTEgbWVtMiBtZW0zKScgaXMgZXF1aXZhbGVudCB0byBgbGliKG1lbTEpIGxpYihtZW0yKSBsaWIobWVtMyknLgoKKiBZb3UgY2FuIHVzZSB3aWxkY2FyZHMgaW5zaWRlIGFyY2hpdmUgbWVtYmVyIHJlZmVyZW5jZXMuICBGb3IgZXhhbXBsZSwKICBgbGliKCoubyknIGV4cGFuZHMgdG8gYWxsIGV4aXN0aW5nIG1lbWJlcnMgb2YgYGxpYicgd2hvc2UgbmFtZXMgZW5kIGluCiAgYC5vJyAoZS5nLiBgbGliKGEubykgbGliKGIubyknKTsgYCouYSgqLm8pJyBleHBhbmRzIHRvIGFsbCBzdWNoIG1lbWJlcnMKICBvZiBhbGwgZXhpc3RpbmcgZmlsZXMgd2hvc2UgbmFtZXMgZW5kIGluIGAuYScgKGUuZy4gYGZvby5hKGEubykKICBmb28uYShiLm8pIGJhci5hKGMubykgYmFyLmEoZC5vKScuCgoqIEEgc3VmZml4IHJ1bGUgYC5YLmEnIG5vdyBwcm9kdWNlcyB0d28gcGF0dGVybiBydWxlczoKICAgICAgICAoJS5vKTogJS5YCSMgUHJldmlvdXMgdmVyc2lvbnMgcHJvZHVjZWQgb25seSB0aGlzLgogICAgICAgICUuYTogJS5YCSMgTm93IHByb2R1Y2VzIHRoaXMgYXMgd2VsbCwganVzdCBsaWtlIG90aGVyIHN1ZmZpeGVzLgoKKiBUaGUgbmV3IGZsYWcgYC0td2Fybi11bmRlZmluZWQtdmFyaWFibGVzJyBzYXlzIHRvIGlzc3VlIGEgd2FybmluZyBtZXNzYWdlCiAgd2hlbmV2ZXIgTWFrZSBleHBhbmRzIGEgcmVmZXJlbmNlIHRvIGFuIHVuZGVmaW5lZCB2YXJpYWJsZS4KCiogVGhlIG5ldyBgLWluY2x1ZGUnIGRpcmVjdGl2ZSBpcyBqdXN0IGxpa2UgYGluY2x1ZGUnIGV4Y2VwdCB0aGF0IHRoZXJlIGlzCiAgbm8gZXJyb3IgKG5vdCBldmVuIGEgd2FybmluZykgZm9yIGEgbm9uZXhpc3RlbnQgbWFrZWZpbGUuCgoqIENvbW1hbmRzIGluIGFuIGludm9jYXRpb24gb2YgdGhlIGBzaGVsbCcgZnVuY3Rpb24gYXJlIG5vdyBydW4gd2l0aCBhCiAgbW9kaWZpZWQgZW52aXJvbm1lbnQgbGlrZSByZWNpcGVzIGFyZSwgc28geW91IGNhbiB1c2UgYGV4cG9ydCcgZXQgYWwKICB0byBzZXQgdXAgdmFyaWFibGVzIGZvciB0aGVtLiAgVGhleSB1c2VkIHRvIHJ1biB3aXRoIHRoZSBlbnZpcm9ubWVudAogIHRoYXQgYG1ha2UnIHN0YXJ0ZWQgd2l0aC4KDApWZXJzaW9uIDMuNjYgKDIxIE1heSAxOTkzKQoKKiBgbWFrZSAtLXZlcnNpb24nIChvciBgbWFrZSAtdicpIG5vdyBleGl0cyBpbW1lZGlhdGVseSBhZnRlciBwcmludGluZwogIHRoZSB2ZXJzaW9uIG51bWJlci4KDApWZXJzaW9uIDMuNjUgKDA5IE1heSAxOTkzKQoKKiBNYWtlIG5vdyBzdXBwb3J0cyBsb25nLW5hbWVkIG1lbWJlcnMgaW4gYGFyJyBhcmNoaXZlIGZpbGVzLgoMClZlcnNpb24gMy42NCAoMjEgQXByIDE5OTMpCgoqIE1ha2Ugbm93IHN1cHBvcnRzIHRoZSBgKz0nIHN5bnRheCBmb3IgYSB2YXJpYWJsZSBkZWZpbml0aW9uIHdoaWNoIGFwcGVuZHMKICB0byB0aGUgdmFyaWFibGUncyBwcmV2aW91cyB2YWx1ZS4gIFNlZSB0aGUgc2VjdGlvbiBgQXBwZW5kaW5nIE1vcmUgVGV4dAogIHRvIFZhcmlhYmxlcycgaW4gdGhlIG1hbnVhbCBmb3IgZnVsbCBkZXRhaWxzLgoKKiBUaGUgbmV3IG9wdGlvbiBgLS1uby1wcmludC1kaXJlY3RvcnknIGluaGliaXRzIHRoZSBgLXcnIG9yCiAgYC0tcHJpbnQtZGlyZWN0b3J5JyBmZWF0dXJlLiAgTWFrZSB0dXJucyBvbiBgLS1wcmludC1kaXJlY3RvcnknCiAgYXV0b21hdGljYWxseSBpZiB5b3UgdXNlIGAtQycgb3IgYC0tZGlyZWN0b3J5JywgYW5kIGluIHN1Yi1tYWtlczsgc29tZQogIHVzZXJzIGhhdmUgZm91bmQgdGhpcyBiZWhhdmlvciB1bmRlc2lyYWJsZS4KCiogVGhlIGJ1aWx0LWluIGltcGxpY2l0IHJ1bGVzIG5vdyBzdXBwb3J0IHRoZSBhbHRlcm5hdGl2ZSBleHRlbnNpb24KICBgLnR4aW5mbycgZm9yIFRleGluZm8gZmlsZXMsIGp1c3QgbGlrZSBgLnRleGluZm8nIGFuZCBgLnRleGknLgoMClZlcnNpb24gMy42MyAoMjIgSmFuIDE5OTMpCgoqIE1ha2Ugbm93IHVzZXMgYSBzdGFuZGFyZCBHTlUgYGNvbmZpZ3VyZScgc2NyaXB0LiAgU2VlIHRoZSBuZXcgZmlsZQogIElOU1RBTEwgZm9yIHRoZSBuZXcgKGFuZCBtdWNoIHNpbXBsZXIpIGluc3RhbGxhdGlvbiBwcm9jZWR1cmUuCgoqIFRoZXJlIGlzIG5vdyBhIHNoZWxsIHNjcmlwdCB0byBidWlsZCBNYWtlIHRoZSBmaXJzdCB0aW1lLCBpZiB5b3UgaGF2ZSBubwogIG90aGVyIGBtYWtlJyBwcm9ncmFtLiAgYGJ1aWxkLnNoJyBpcyBjcmVhdGVkIGJ5IGBjb25maWd1cmUnOyBzZWUgUkVBRE1FLgoKKiBHTlUgTWFrZSBub3cgY29tcGxldGVseSBjb25mb3JtcyB0byB0aGUgUE9TSVguMiBzcGVjaWZpY2F0aW9uIGZvciBgbWFrZScuCgoqIEVsZW1lbnRzIG9mIHRoZSBgJF4nIGFuZCBgJD8nIGF1dG9tYXRpYyB2YXJpYWJsZXMgdGhhdCBhcmUgYXJjaGl2ZQogIG1lbWJlciByZWZlcmVuY2VzIG5vdyBsaXN0IG9ubHkgdGhlIG1lbWJlciBuYW1lLCBhcyBpbiBVbml4IGFuZCBQT1NJWC4yLgoKKiBZb3Ugc2hvdWxkIG5vIGxvbmdlciBldmVyIG5lZWQgdG8gc3BlY2lmeSB0aGUgYC13JyBzd2l0Y2gsIHdoaWNoIHByaW50cwogIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBiZWZvcmUgYW5kIGFmdGVyIE1ha2UgcnVucy4gIFRoZSBgLUMnIHN3aXRjaCB0bwogIGNoYW5nZSBkaXJlY3RvcnksIGFuZCByZWN1cnNpdmUgdXNlIG9mIE1ha2UsIG5vdyBzZXQgYC13JyBhdXRvbWF0aWNhbGx5LgoKKiBNdWx0aXBsZSBkb3VibGUtY29sb24gcnVsZXMgZm9yIHRoZSBzYW1lIHRhcmdldCB3aWxsIG5vIGxvbmdlciBoYXZlIHRoZWlyCiAgcmVjaXBlcyBydW4gc2ltdWx0YW5lb3VzbHkgdW5kZXIgLWosIGFzIHRoaXMgY291bGQgcmVzdWx0IGluIHRoZSB0d28KICByZWNpcGVzIHRyeWluZyB0byBjaGFuZ2UgdGhlIGZpbGUgYXQgdGhlIHNhbWUgdGltZSBhbmQgaW50ZXJmZXJpbmcgd2l0aAogIG9uZSBhbm90aGVyLgoKKiBUaGUgYFNIRUxMJyB2YXJpYWJsZSBpcyBub3cgbmV2ZXIgdGFrZW4gZnJvbSB0aGUgZW52aXJvbm1lbnQuCiAgRWFjaCBtYWtlZmlsZSB0aGF0IHdhbnRzIGEgc2hlbGwgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCAoL2Jpbi9zaCkgbXVzdAogIHNldCBTSEVMTCBpdHNlbGYuICBTSEVMTCBpcyBhbHdheXMgZXhwb3J0ZWQgdG8gY2hpbGQgcHJvY2Vzc2VzLgogIFRoaXMgY2hhbmdlIHdhcyBtYWRlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggUE9TSVguMi4KCiogTWFrZSBub3cgYWNjZXB0cyBsb25nIG9wdGlvbnMuICBUaGVyZSBpcyBub3cgYW4gaW5mb3JtYXRpdmUgdXNhZ2UgbWVzc2FnZQogIHRoYXQgdGVsbHMgeW91IHdoYXQgYWxsIHRoZSBvcHRpb25zIGFyZSBhbmQgd2hhdCB0aGV5IGRvLiAgVHJ5IGBtYWtlIC0taGVscCcuCgoqIFRoZXJlIGFyZSB0d28gbmV3IGRpcmVjdGl2ZXM6IGBleHBvcnQnIGFuZCBgdW5leHBvcnQnLiAgQWxsIHZhcmlhYmxlcyBhcmUKICBubyBsb25nZXIgYXV0b21hdGljYWxseSBwdXQgaW50byB0aGUgZW52aXJvbm1lbnRzIG9mIHRoZSByZWNpcGUgbGluZXMgdGhhdAogIE1ha2UgcnVucy4gIEluc3RlYWQsIG9ubHkgdmFyaWFibGVzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIG9yIGluCiAgdGhlIGVudmlyb25tZW50IGFyZSBleHBvcnRlZCBieSBkZWZhdWx0LiAgVG8gZXhwb3J0IG90aGVycywgdXNlOgogICAgICAgIGV4cG9ydCBWQVJJQUJMRQogIG9yIHlvdSBjYW4gZGVmaW5lIHZhcmlhYmxlcyB3aXRoOgogICAgICAgIGV4cG9ydCBWQVJJQUJMRSA9IFZBTFVFCiAgb3I6CiAgICAgICAgZXhwb3J0IFZBUklBQkxFIDo9IFZBTFVFCiAgWW91IGNhbiB1c2UganVzdDoKICAgICAgICBleHBvcnQKICBvcjoKICAgICAgICAuRVhQT1JUX0FMTF9WQVJJQUJMRVM6CiAgdG8gZ2V0IHRoZSBvbGQgYmVoYXZpb3IuICBTZWUgdGhlIG5vZGUgYFZhcmlhYmxlcy9SZWN1cnNpb24nIGluIHRoZSBtYW51YWwKICBmb3IgYSBmdWxsIGRlc2NyaXB0aW9uLgoKKiBUaGUgcmVjaXBlIGZyb20gdGhlIGAuREVGQVVMVCcgc3BlY2lhbCB0YXJnZXQgaXMgb25seSBhcHBsaWVkIHRvCiAgdGFyZ2V0cyB3aGljaCBoYXZlIG5vIHJ1bGVzIGF0IGFsbCwgbm90IGFsbCB0YXJnZXRzIHdpdGggbm8gcmVjaXBlLgogIFRoaXMgY2hhbmdlIHdhcyBtYWRlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggVW5peCBtYWtlLgoKKiBBbGwgZmF0YWwgZXJyb3IgbWVzc2FnZXMgbm93IGNvbnRhaW4gYCoqKicsIHNvIHRoZXkgYXJlIGVhc3kgdG8gZmluZCBpbgogIGNvbXBpbGF0aW9uIGxvZ3MuCgoqIERlcGVuZGVuY3kgZmlsZSBuYW1lcyBsaWtlIGAtbE5BTUUnIGFyZSBub3cgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsIGZpbGUKICBuYW1lIGZvdW5kLCBhcyB3aXRoIGZpbGVzIGZvdW5kIGJ5IG5vcm1hbCBkaXJlY3Rvcnkgc2VhcmNoIChWUEFUSCkuCiAgVGhlIGxpYnJhcnkgZmlsZSBgbGliTkFNRS5hJyBtYXkgbm93IGJlIGZvdW5kIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwKICB3aGljaCBpcyBjaGVja2VkIGJlZm9yZSBWUEFUSDsgdGhlIHN0YW5kYXJkIHNldCBvZiBkaXJlY3RvcmllcyAoL2xpYiwKICAvdXNyL2xpYiwgL3Vzci9sb2NhbC9saWIpIGlzIG5vdyBjaGVja2VkIGxhc3QuCiAgU2VlIHRoZSBub2RlIGBMaWJyYXJpZXMvU2VhcmNoJyBpbiB0aGUgbWFudWFsIGZvciBmdWxsIGRldGFpbHMuCgoqIEEgc2luZ2xlIGBpbmNsdWRlJyBkaXJlY3RpdmUgY2FuIG5vdyBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgbWFrZWZpbGUgdG8KICBpbmNsdWRlLCBsaWtlIHRoaXM6CiAgICAgICAgaW5jbHVkZSBmaWxlMSBmaWxlMgogIFlvdSBjYW4gYWxzbyB1c2Ugc2hlbGwgZmlsZSBuYW1lIHBhdHRlcm5zIGluIGFuIGBpbmNsdWRlJyBkaXJlY3RpdmU6CiAgICAgICAgaW5jbHVkZSAqLm1rCgoqIFRoZSBkZWZhdWx0IGRpcmVjdG9yaWVzIHRvIHNlYXJjaCBmb3IgaW5jbHVkZWQgbWFrZWZpbGVzLCBhbmQgZm9yCiAgbGlicmFyaWVzIHNwZWNpZmllZCB3aXRoIGAtbE5BTUUnLCBhcmUgbm93IHNldCBieSBjb25maWd1cmF0aW9uLgoKKiBZb3UgY2FuIG5vdyB1c2UgYmxhbmtzIGFzIHdlbGwgYXMgY29sb25zIHRvIHNlcGFyYXRlIHRoZSBkaXJlY3RvcmllcyBpbiBhCiAgc2VhcmNoIHBhdGggZm9yIHRoZSBgdnBhdGgnIGRpcmVjdGl2ZSBvciB0aGUgYFZQQVRIJyB2YXJpYWJsZS4KCiogWW91IGNhbiBub3cgdXNlIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIGluIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiBhCiAgdmFyaWFibGUgYXNzaWdubWVudCwgYXMgaW4gIiQoZm9vKWJhciA9IHZhbHVlIi4KCiogVGhlIGBNQUtFJyB2YXJpYWJsZSBpcyBhbHdheXMgZGVmaW5lZCBhcyBgJChNQUtFX0NPTU1BTkQpICQoTUFLRU9WRVJSSURFUyknLgogIFRoZSBgTUFLRV9DT01NQU5EJyB2YXJpYWJsZSBpcyBub3cgZGVmaW5lZCB0byB0aGUgbmFtZSB3aXRoIHdoaWNoIG1ha2UKICB3YXMgaW52b2tlZC4KCiogVGhlIGJ1aWx0LWluIHJ1bGVzIGZvciBDKysgY29tcGlsYXRpb24gbm93IHVzZSB0aGUgdmFyaWFibGVzIGAkKENYWCknIGFuZAogIGAkKENYWEZMQUdTKScgaW5zdGVhZCBvZiBgJChDKyspJyBhbmQgYCQoQysrRkxBR1MpJy4gIFRoZSBvbGQgbmFtZXMgaGFkCiAgcHJvYmxlbXMgd2l0aCBzaGVsbHMgdGhhdCBjYW5ub3QgaGF2ZSBgKycgaW4gZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZXMuCgoqIFRoZSB2YWx1ZSBvZiBhIHJlY3Vyc2l2ZWx5IGV4cGFuZGVkIHZhcmlhYmxlIGlzIG5vdyBleHBhbmRlZCB3aGVuIHB1dHRpbmcKICBpdCBpbnRvIHRoZSBlbnZpcm9ubWVudCBmb3IgY2hpbGQgcHJvY2Vzc2VzLiAgVGhpcyBjaGFuZ2Ugd2FzIG1hZGUgZm9yCiAgY29tcGF0aWJpbGl0eSB3aXRoIFVuaXggbWFrZS4KCiogQSBydWxlIHdpdGggbm8gdGFyZ2V0cyBiZWZvcmUgdGhlIGA6JyBpcyBub3cgYWNjZXB0ZWQgYW5kIGlnbm9yZWQuCiAgVGhpcyBjaGFuZ2Ugd2FzIG1hZGUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBTdW5PUyA0IG1ha2UuCiAgV2UgZG8gbm90IHJlY29tbWVuZCB0aGF0IHlvdSB3cml0ZSB5b3VyIG1ha2VmaWxlcyB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGlzLgoKKiBUaGUgYC1JJyBzd2l0Y2ggY2FuIG5vdyBiZSB1c2VkIGluIE1BS0VGTEFHUywgYW5kIGFyZSBwdXQgdGhlcmUKICBhdXRvbWF0aWNhbGx5IGp1c3QgbGlrZSBvdGhlciBzd2l0Y2hlcy4KDApWZXJzaW9uIDMuNjEKCiogQnVpbHQtaW4gcnVsZXMgZm9yIEMrKyBzb3VyY2UgZmlsZXMgd2l0aCB0aGUgYC5DJyBzdWZmaXguCiAgV2Ugc3RpbGwgcmVjb21tZW5kIHRoYXQgeW91IHVzZSBgLmNjJyBpbnN0ZWFkLgoKKiBJZiBhIHJlY2lwZSBpcyBnaXZlbiB0b28gbWFueSB0aW1lcyBmb3IgYSBzaW5nbGUgdGFyZ2V0LCB0aGUgbGFzdCBvbmUKICBnaXZlbiBpcyB1c2VkLCBhbmQgYSB3YXJuaW5nIG1lc3NhZ2UgaXMgcHJpbnRlZC4KCiogRXJyb3IgbWVzc2FnZXMgYWJvdXQgbWFrZWZpbGVzIGFyZSBpbiBzdGFuZGFyZCBHTlUgZXJyb3IgZm9ybWF0LAogIHNvIEMteCBgIGluIEVtYWNzIHdvcmtzIG9uIHRoZW0uCgoqIERlcGVuZGVuY2llcyBvZiBwYXR0ZXJuIHJ1bGVzIHdoaWNoIGNvbnRhaW4gbm8gJSBuZWVkIG5vdCBhY3R1YWxseSBleGlzdAogIGlmIHRoZXkgY2FuIGJlIGNyZWF0ZWQgKGp1c3QgbGlrZSBkZXBlbmRlbmNpZXMgd2hpY2ggZG8gaGF2ZSBhICUpLgoMClZlcnNpb24gMy42MAoKKiBBIG1lc3NhZ2UgaXMgYWx3YXlzIHByaW50ZWQgd2hlbiBNYWtlIGRlY2lkZXMgdGhlcmUgaXMgbm90aGluZyB0byBiZSBkb25lLgogIEl0IHVzZWQgdG8gYmUgdGhhdCBubyBtZXNzYWdlIHdhcyBwcmludGVkIGZvciB0b3AtbGV2ZWwgcGhvbnkgdGFyZ2V0cwogIChiZWNhdXNlICJgcGhvbnknIGlzIHVwIHRvIGRhdGUiIGlzbid0IHF1aXRlIHJpZ2h0KS4gIE5vdyBhIGRpZmZlcmVudAogIG1lc3NhZ2UgIk5vdGhpbmcgdG8gYmUgZG9uZSBmb3IgYHBob255JyIgaXMgcHJpbnRlZCBpbiB0aGF0IGNhc2UuCgoqIEFyY2hpdmVzIG9uIEFJWCBub3cgc3VwcG9zZWRseSB3b3JrLgoKKiBXaGVuIHRoZSByZWNpcGVzIHNwZWNpZmllZCBmb3IgLkRFRkFVTFQgYXJlIHVzZWQgdG8gdXBkYXRlIGEgdGFyZ2V0LAogIHRoZSAkPCBhdXRvbWF0aWMgdmFyaWFibGUgaXMgZ2l2ZW4gdGhlIHNhbWUgdmFsdWUgYXMgJEAgZm9yIHRoYXQgdGFyZ2V0LgogIFRoaXMgaXMgaG93IFVuaXggbWFrZSBiZWhhdmVzLCBhbmQgdGhpcyBiZWhhdmlvciBpcyBtYW5kYXRlZCBieSBQT1NJWC4yLgoMClZlcnNpb24gMy41OQoKKiBUaGUgLW4sIC1xLCBhbmQgLXQgb3B0aW9ucyBhcmUgbm90IHB1dCBpbiB0aGUgYE1BS0VGTEFHUycgYW5kIGBNRkxBRycKICB2YXJpYWJsZXMgd2hpbGUgcmVtYWtpbmcgbWFrZWZpbGVzLCBzbyByZWN1cnNpdmUgbWFrZXMgZG9uZSB3aGlsZSByZW1ha2luZwogIG1ha2VmaWxlcyB3aWxsIGJlaGF2ZSBwcm9wZXJseS4KCiogSWYgdGhlIHNwZWNpYWwgdGFyZ2V0IGAuTk9FWFBPUlQnIGlzIHNwZWNpZmllZCBpbiBhIG1ha2VmaWxlLAogIG9ubHkgdmFyaWFibGVzIHRoYXQgY2FtZSBmcm9tIHRoZSBlbnZpcm9ubWVudCBhbmQgdmFyaWFibGVzCiAgZGVmaW5lZCBvbiB0aGUgY29tbWFuZCBsaW5lIGFyZSBleHBvcnRlZC4KDApWZXJzaW9uIDMuNTgKCiogU3VmZml4IHJ1bGVzIG1heSBoYXZlIGRlcGVuZGVuY2llcyAod2hpY2ggYXJlIGlnbm9yZWQpLgoMClZlcnNpb24gMy41NwoKKiBEZXBlbmRlbmNpZXMgb2YgdGhlIGZvcm0gYC1sTElCJyBhcmUgc2VhcmNoZWQgZm9yIGFzIC91c3IvbG9jYWwvbGliL2xpYkxJQi5hCiAgYXMgd2VsbCBhcyBsaWJMSUIuYSBpbiAvdXNyL2xpYiwgL2xpYiwgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBhbmQgVlBBVEguCgwKVmVyc2lvbiAzLjU1CgoqIFRoZXJlIGlzIG5vdyBhIFVuaXggbWFuIHBhZ2UgZm9yIEdOVSBNYWtlLiAgSXQgaXMgY2VydGFpbmx5IG5vdCBhCiAgcmVwbGFjZW1lbnQgZm9yIHRoZSBUZXhpbmZvIG1hbnVhbCwgYnV0IGl0IGRvY3VtZW50cyB0aGUgYmFzaWMKICBmdW5jdGlvbmFsaXR5IGFuZCB0aGUgc3dpdGNoZXMuICBGb3IgZnVsbCBkb2N1bWVudGF0aW9uLCB5b3Ugc2hvdWxkCiAgc3RpbGwgcmVhZCB0aGUgVGV4aW5mbyBtYW51YWwuICBUaGFua3MgdG8gRGVubmlzIE1vcnNlIG9mIFN0YW5mb3JkCiAgVW5pdmVyc2l0eSBmb3IgY29udHJpYnV0aW5nIHRoZSBpbml0aWFsIHZlcnNpb24gb2YgdGhpcy4KCiogVmFyaWFibGVzIHdoaWNoIGFyZSBkZWZpbmVkIGJ5IGRlZmF1bHQgKGUuZy4sIGBDQycpIHdpbGwgbm8gbG9uZ2VyIGJlCiAgcHV0IGludG8gdGhlIGVudmlyb25tZW50IGZvciBjaGlsZCBwcm9jZXNzZXMuICAoSWYgdGhlc2UgdmFyaWFibGVzIGFyZQogIHJlc2V0IGJ5IHRoZSBlbnZpcm9ubWVudCwgbWFrZWZpbGVzLCBvciB0aGUgY29tbWFuZCBsaW5lLCB0aGV5IHdpbGwKICBzdGlsbCBnbyBpbnRvIHRoZSBlbnZpcm9ubWVudC4pCgoqIE1ha2VmaWxlcyB3aGljaCBoYXZlIHJlY2lwZXMgYnV0IG5vIGRlcGVuZGVuY2llcyAoYW5kIHRodXMgYXJlIGFsd2F5cwogIGNvbnNpZGVyZWQgb3V0IG9mIGRhdGUgYW5kIGluIG5lZWQgb2YgcmVtYWtpbmcpLCB3aWxsIG5vdCBiZSByZW1hZGUgKGlmIHRoZXkKICB3ZXJlIGJlaW5nIHJlbWFkZSBvbmx5IGJlY2F1c2UgdGhleSB3ZXJlIG1ha2VmaWxlcykuICBUaGlzIG1lYW5zIHRoYXQgR05VCiAgTWFrZSB3aWxsIG5vIGxvbmdlciBnbyBpbnRvIGFuIGluZmluaXRlIGxvb3Agd2hlbiBmZWQgdGhlIG1ha2VmaWxlcyB0aGF0CiAgYGltYWtlJyAobmVjZXNzYXJ5IHRvIGJ1aWxkIFggV2luZG93cykgcHJvZHVjZXMuCgoqIFRoZXJlIGlzIG5vIGxvbmdlciBhIHdhcm5pbmcgZm9yIHVzaW5nIHRoZSBgdnBhdGgnIGRpcmVjdGl2ZSB3aXRoIGFuIGV4cGxpY2l0CnBhdGhuYW1lIChpbnN0ZWFkIG9mIGEgYCUnIHBhdHRlcm4pLgoMClZlcnNpb24gMy41MQoKKiBXaGVuIHJlbW92aW5nIGludGVybWVkaWF0ZSBmaWxlcywgb25seSBvbmUgYHJtJyBjb21tYW5kIGxpbmUgaXMgcHJpbnRlZCwKICBsaXN0aW5nIGFsbCBmaWxlIG5hbWVzLgoKKiBUaGVyZSBhcmUgbm93IGF1dG9tYXRpYyB2YXJpYWJsZXMgYCQoXkQpJywgYCQoXkYpJywgYCQoP0QpJywgYW5kIGAkKD9GKScuCiAgVGhlc2UgYXJlIHRoZSBkaXJlY3Rvcnktb25seSBhbmQgZmlsZS1vbmx5IHZlcnNpb25zIG9mIGAkXicgYW5kIGAkPycuCgoqIExpYnJhcnkgZGVwZW5kZW5jaWVzIGdpdmVuIGFzIGAtbE5BTUUnIHdpbGwgdXNlICJsaWJOQU1FLmEiIGluIHRoZSBjdXJyZW50CiAgZGlyZWN0b3J5IGlmIGl0IGV4aXN0cy4KCiogVGhlIGF1dG9tYXRpYyB2YXJpYWJsZSBgJCgkLyknIGlzIG5vIGxvbmdlciBkZWZpbmVkLgoKKiBMZWFkaW5nIGArJyBjaGFyYWN0ZXJzIG9uIGEgcmVjaXBlIGxpbmUgbWFrZSB0aGF0IGxpbmUgYmUgZXhlY3V0ZWQgZXZlbgogIHVuZGVyIC1uLCAtdCwgb3IgLXEgKGFzIGlmIHRoZSBsaW5lIGNvbnRhaW5lZCBgJChNQUtFKScpLgoKKiBGb3IgcmVjaXBlIGxpbmVzIGNvbnRhaW5pbmcgYCQoTUFLRSknLCBgJHtNQUtFfScsIG9yIGxlYWRpbmcgYCsnIGNoYXJhY3RlcnMsCiAgb25seSB0aG9zZSBsaW5lcyBhcmUgZXhlY3V0ZWQsIG5vdCB0aGUgZW50aXJlIHJlY2lwZS4KICAoVGhpcyBpcyBob3cgVW5peCBtYWtlIGJlaGF2ZXMgZm9yIGxpbmVzIGNvbnRhaW5pbmcgYCQoTUFLRSknIG9yIGAke01BS0V9Jy4pCgwKVmVyc2lvbiAzLjUwCgoqIEZpbGVuYW1lcyBpbiBydWxlcyB3aWxsIG5vdyBoYXZlIH4gYW5kIH5VU0VSIGV4cGFuZGVkLgoKKiBUaGUgYC1wJyBvdXRwdXQgaGFzIGJlZW4gY2hhbmdlZCBzbyBpdCBjYW4gYmUgdXNlZCBhcyBhIG1ha2VmaWxlLgogIChBbGwgaW5mb3JtYXRpb24gdGhhdCBpc24ndCBzcGVjaWZpZWQgYnkgbWFrZWZpbGVzIGlzIHByZWZhY2VkIHdpdGggY29tbWVudAogIGNoYXJhY3RlcnMuKQoMClZlcnNpb24gMy40OQoKKiBUaGUgJSBjaGFyYWN0ZXIgY2FuIGJlIHF1b3RlZCB3aXRoIGJhY2tzbGFzaCBpbiBpbXBsaWNpdCBwYXR0ZXJuIHJ1bGVzLAogIHN0YXRpYyBwYXR0ZXJuIHJ1bGVzLCBgdnBhdGgnIGRpcmVjdGl2ZXMsIGFuZCBgcGF0c3Vic3QnLCBgZmlsdGVyJywgYW5kCiAgYGZpbHRlci1vdXQnIGZ1bmN0aW9ucy4gIEEgd2FybmluZyBpcyBpc3N1ZWQgaWYgYSBgdnBhdGgnIGRpcmVjdGl2ZSdzCiAgcGF0dGVybiBjb250YWlucyBubyAlLgoKKiBUaGUgYHdpbGRjYXJkJyB2YXJpYWJsZSBleHBhbnNpb24gZnVuY3Rpb24gbm93IGV4cGFuZHMgfiBhbmQgflVTRVIuCgoqIE1lc3NhZ2VzIGluZGljYXRpbmcgZmFpbGVkIHJlY2lwZSBsaW5lcyBub3cgY29udGFpbiB0aGUgdGFyZ2V0IG5hbWU6CiAgICAgICAgbWFrZTogKioqIFt0YXJnZXRdIEVycm9yIDEKCiogVGhlIGAtcCcgb3V0cHV0IGZvcm1hdCBoYXMgYmVlbiBjaGFuZ2VkIHNvbWV3aGF0IHRvIGxvb2sgbW9yZSBsaWtlCiAgbWFrZWZpbGUgcnVsZXMgYW5kIHRvIGdpdmUgYWxsIGluZm9ybWF0aW9uIHRoYXQgTWFrZSBoYXMgYWJvdXQgZmlsZXMuCgwKVmVyc2lvbiAzLjQ4CgwKVmVyc2lvbiAzLjQ3CgoqIFRoZSBgLWwnIHN3aXRjaCB3aXRoIG5vIGFyZ3VtZW50IHJlbW92ZXMgYW55IHByZXZpb3VzIGxvYWQtYXZlcmFnZSBsaW1pdC4KCiogV2hlbiB0aGUgYC13JyBzd2l0Y2ggaXMgaW4gZWZmZWN0LCBhbmQgTWFrZSBoYXMgdXBkYXRlZCBtYWtlZmlsZXMsCiAgaXQgd2lsbCB3cml0ZSBhIGBMZWF2aW5nIGRpcmVjdG9yeScgbWVzc2FnZSBiZWZvcmUgcmUtZXhlY3V0aW5nIGl0c2VsZi4KICBUaGlzIG1ha2VzIHRoZSBgZGlyZWN0b3J5IGNoYW5nZSB0cmFja2luZycgY2hhbmdlcyB0byBFbWFjcydzIGNvbXBpbGF0aW9uCiAgY29tbWFuZHMgd29yayBwcm9wZXJseS4KDApWZXJzaW9uIDMuNDYKCiogVGhlIGF1dG9tYXRpYyB2YXJpYWJsZSBgJConIGlzIG5vdyBkZWZpbmVkIGZvciBleHBsaWNpdCBydWxlcywKICBhcyBpdCBpcyBpbiBVbml4IG1ha2UuCgwKVmVyc2lvbiAzLjQ1CgoqIFRoZSBgLWonIHN3aXRjaCBpcyBub3cgcHV0IGluIHRoZSBNQUtFRkxBR1MgYW5kIE1GTEFHUyB2YXJpYWJsZXMgd2hlbgogIHNwZWNpZmllZCB3aXRob3V0IGFuIGFyZ3VtZW50IChpbmRpY2F0aW5nIGluZmluaXRlIGpvYnMpLgogIFRoZSBgLWwnIHN3aXRjaCBpcyBub3QgYWx3YXlzIHB1dCBpbiB0aGUgTUFLRUZMQUdTIGFuZCBNRkxBR1MgdmFyaWFibGVzLgoKKiBNYWtlIG5vIGxvbmdlciBjaGVja3MgaGFzaGVkIGRpcmVjdG9yaWVzIGFmdGVyIHJ1bm5pbmcgcmVjaXBlcy4KICBUaGUgYmVoYXZpb3IgaW1wbGVtZW50ZWQgaW4gMy40MSBjYXVzZWQgdG9vIG11Y2ggc2xvd2Rvd24uCgwKVmVyc2lvbiAzLjQ0CgoqIEEgZGVwZW5kZW5jeSBpcyBOT1QgY29uc2lkZXJlZCBuZXdlciB0aGFuIGl0cyBkZXBlbmRlbnQgaWYKICB0aGV5IGhhdmUgdGhlIHNhbWUgbW9kaWZpY2F0aW9uIHRpbWUuICBUaGUgYmVoYXZpb3IgaW1wbGVtZW50ZWQKICBpbiAzLjQzIGNvbmZsaWN0cyB3aXRoIFJDUy4KDApWZXJzaW9uIDMuNDMKCiogRGVwZW5kZW5jeSBsb29wcyBhcmUgbm8gbG9uZ2VyIGZhdGFsIGVycm9ycy4KCiogQSBkZXBlbmRlbmN5IGlzIGNvbnNpZGVyZWQgbmV3ZXIgdGhhbiBpdHMgZGVwZW5kZW50IGlmCiAgdGhleSBoYXZlIHRoZSBzYW1lIG1vZGlmaWNhdGlvbiB0aW1lLgoMClZlcnNpb24gMy40MgoKKiBUaGUgdmFyaWFibGVzIEY3NyBhbmQgRjc3RkxBR1MgYXJlIG5vdyBzZXQgYnkgZGVmYXVsdCB0byAkKEZDKSBhbmQKICAkKEZGTEFHUykuICBNYWtlZmlsZXMgZGVzaWduZWQgZm9yIFN5c3RlbSBWIG1ha2UgbWF5IHVzZSB0aGVzZSB2YXJpYWJsZXMgaW4KICBleHBsaWNpdCBydWxlcyBhbmQgZXhwZWN0IHRoZW0gdG8gYmUgc2V0LiAgVW5mb3J0dW5hdGVseSwgdGhlcmUgaXMgbm8gd2F5IHRvCiAgbWFrZSBzZXR0aW5nIHRoZXNlIGFmZmVjdCB0aGUgRm9ydHJhbiBpbXBsaWNpdCBydWxlcyB1bmxlc3MgRkMgYW5kIEZGTEFHUwogIGFyZSBub3QgdXNlZCAoYW5kIHRoZXNlIGFyZSB1c2VkIGJ5IEJTRCBtYWtlKS4KDApWZXJzaW9uIDMuNDEKCiogTWFrZSBub3cgY2hlY2tzIHRvIHNlZSBpZiBpdHMgaGFzaGVkIGRpcmVjdG9yaWVzIGFyZSBjaGFuZ2VkIGJ5IHJlY2lwZXMuCiAgT3RoZXIgbWFrZXMgdGhhdCBoYXNoIGRpcmVjdG9yaWVzIChTdW4sIDQuMyBCU0QpIGRvbid0IGRvIHRoaXMuCgwKVmVyc2lvbiAzLjM5CgoqIFRoZSBgc2hlbGwnIGZ1bmN0aW9uIG5vIGxvbmdlciBjYXB0dXJlcyBzdGFuZGFyZCBlcnJvciBvdXRwdXQuCgwKVmVyc2lvbiAzLjMyCgoqIEEgZmlsZSBiZWdpbm5pbmcgd2l0aCBhIGRvdCBjYW4gYmUgdGhlIGRlZmF1bHQgdGFyZ2V0IGlmIGl0IGFsc28gY29udGFpbnMKICBhIHNsYXNoIChlLmcuLCBgLi4vYmluL2ZvbycpLiAgKFVuaXggbWFrZSBhbGxvd3MgdGhpcyBhcyB3ZWxsLikKDApWZXJzaW9uIDMuMzEKCiogQXJjaGl2ZSBtZW1iZXIgbmFtZXMgYXJlIHRydW5jYXRlZCB0byAxNSBjaGFyYWN0ZXJzLgoKKiBZZXQgbW9yZSBVU0cgc3R1ZmYuCgoqIE1pbmltYWwgc3VwcG9ydCBmb3IgTWljcm9wb3J0IFN5c3RlbSBWIChhIDE2LWJpdCBtYWNoaW5lIGFuZCBhCiAgYnJhaW4tZGFtYWdlZCBjb21waWxlcikuICBUaGlzIGhhcyBldmVuIGxvd2VyIHByaW9yaXR5IHRoYW4gb3RoZXIgVVNHCiAgc3VwcG9ydCwgc28gaWYgaXQgZ2V0cyBiZXlvbmQgdHJpdmlhbCwgSSB3aWxsIHRha2UgaXQgb3V0IGNvbXBsZXRlbHkuCgoqIFJldmFtcGVkIGRlZmF1bHQgaW1wbGljaXQgcnVsZXMgKG5vdCBtdWNoIHZpc2libGUgY2hhbmdlKS4KCiogVGhlIC1kIGFuZCAtcCBvcHRpb25zIGNhbiBjb21lIGZyb20gdGhlIGVudmlyb25tZW50LgoMClZlcnNpb24gMy4zMAoKKiBJbXByb3ZlZCBzdXBwb3J0IGZvciBVU0cgYW5kIEhQVVggKGhvcGVmdWxseSkuCgoqIEEgdmFyaWFibGUgcmVmZXJlbmNlIGxpa2UgYCQoZm9vOmE9YiknLCBpZiBgYScgY29udGFpbnMgYSBgJScsIGlzCiAgZXF1aXZhbGVudCB0byBgJChwYXRzdWJzdCBhLGIsJChmb28pKScuCgoqIERlZmluaW5nIC5ERUZBVUxUIHdpdGggbm8gZGVwcyBvciByZWNpcGUgY2xlYXJzIGl0cyByZWNpcGUuCgoqIE5ldyBkZWZhdWx0IGltcGxpY2l0IHJ1bGVzIGZvciAuUyAoY3BwLCB0aGVuIGFzKSwgYW5kIC5zaCAoY29weSBhbmQKICBtYWtlIGV4ZWN1dGFibGUpLiAgQWxsIGRlZmF1bHQgaW1wbGljaXQgcnVsZXMgdGhhdCB1c2UgY3BwIChldmVuCiAgaW5kaXJlY3RseSksIHVzZSAkKENQUEZMQUdTKS4KDApWZXJzaW9uIDMuMjkKCiogR2l2aW5nIHRoZSAtaiBvcHRpb24gd2l0aCBubyBhcmd1bWVudHMgZ2l2ZXMgeW91IGluZmluaXRlIGpvYnMuCgwKVmVyc2lvbiAzLjI4CgoqIE5ldyBvcHRpb246ICItbCBMT0FEIiBzYXlzIG5vdCB0byBzdGFydCBhbnkgbmV3IGpvYnMgd2hpbGUgb3RoZXJzIGFyZQogIHJ1bm5pbmcgaWYgdGhlIGxvYWQgYXZlcmFnZSBpcyBub3QgYmVsb3cgTE9BRCAoYSBmbG9hdGluZy1wb2ludCBudW1iZXIpLgoKKiBUaGVyZSBpcyBzdXBwb3J0IGluIHBsYWNlIGZvciBpbXBsZW1lbnRhdGlvbnMgb2YgcmVtb3RlIGNvbW1hbmQgZXhlY3V0aW9uCiAgaW4gTWFrZS4gIFNlZSB0aGUgZmlsZSByZW1vdGUuYy4KDApWZXJzaW9uIDMuMjYKCiogTm8gbW9yZSB0aGFuIDEwIGRpcmVjdG9yaWVzIHdpbGwgYmUga2VwdCBvcGVuIGF0IG9uY2UuCiAgKFRoaXMgbnVtYmVyIGNhbiBiZSBjaGFuZ2VkIGJ5IHJlZGVmaW5pbmcgTUFYX09QRU5fRElSRUNUT1JJRVMgaW4gZGlyLmMuKQoMClZlcnNpb24gMy4yNQoKKiBBcmNoaXZlIGZpbGVzIHdpbGwgaGF2ZSB0aGVpciBtb2RpZmljYXRpb24gdGltZXMgcmVjb3JkZWQgYmVmb3JlIGRvaW5nCiAgYW55dGhpbmcgdGhhdCBtaWdodCBjaGFuZ2UgdGhlaXIgbW9kaWZpY2F0aW9uIHRpbWVzIGJ5IHVwZGF0aW5nIGFuIGFyY2hpdmUKICBtZW1iZXIuCgwKVmVyc2lvbiAzLjIwCgoqIFRoZSBgTUFLRUxFVkVMJyB2YXJpYWJsZSBpcyBkZWZpbmVkIGZvciB1c2UgYnkgbWFrZWZpbGVzLgoMClZlcnNpb24gMy4xOQoKKiBUaGUgcmVjdXJzaW9uIGxldmVsIGluZGljYXRpb25zIGluIGVycm9yIG1lc3NhZ2VzIGFyZSBtdWNoIHNob3J0ZXIgdGhhbgogIHRoZXkgd2VyZSBpbiB2ZXJzaW9uIDMuMTQuCgwKVmVyc2lvbiAzLjE4CgoqIExlYWRpbmcgc3BhY2VzIGJlZm9yZSBkaXJlY3RpdmVzIGFyZSBpZ25vcmVkIChhcyBkb2N1bWVudGVkKS4KCiogSW5jbHVkZWQgbWFrZWZpbGVzIGNhbiBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgZ29hbCB0YXJnZXQuCiAgKFN5c3RlbSBWIE1ha2UgZG9lcyBpdCB0aGlzIHdheSwgc28gd2UgYXJlIGJlaW5nIGNvbXBhdGlibGUpLgoMClZlcnNpb24gMy4xNC4KCiogVmFyaWFibGVzIHRoYXQgYXJlIGRlZmF1bHRzIGJ1aWx0IGludG8gTWFrZSB3aWxsIG5vdCBiZSBwdXQgaW4gdGhlCiAgZW52aXJvbm1lbnQgZm9yIGNoaWxkcmVuLiAgVGhpcyBqdXN0IHNhdmVzIHNvbWUgZW52aXJvbm1lbnQgc3BhY2UgYW5kLAogIGV4Y2VwdCB1bmRlciAtZSwgd2lsbCBiZSB0cmFuc3BhcmVudCB0byBzdWItbWFrZXMuCgoqIEVycm9yIG1lc3NhZ2VzIGZyb20gc3ViLW1ha2VzIHdpbGwgaW5kaWNhdGUgdGhlIGxldmVsIG9mIHJlY3Vyc2lvbi4KCiogSG9wZWZ1bGx5IHNvbWUgc3BlZWQtdXAgZm9yIGxhcmdlIGRpcmVjdG9yaWVzIGR1ZSB0byBhIGNoYW5nZSBpbiB0aGUKICBkaXJlY3RvcnkgaGFzaGluZyBzY2hlbWUuCgoqIE9uZSBjaGlsZCB3aWxsIGFsd2F5cyBnZXQgYSBzdGFuZGFyZCBpbnB1dCB0aGF0IGlzIHVzYWJsZS4KCiogRGVmYXVsdCBtYWtlZmlsZXMgdGhhdCBkb24ndCBleGlzdCB3aWxsIGJlIHJlbWFkZSBhbmQgcmVhZCBpbi4KDApWZXJzaW9uIDMuMTMuCgoqIENvdW50IHBhcmVudGhlc2VzIGluc2lkZSBleHBhbnNpb24gZnVuY3Rpb24gY2FsbHMgc28geW91IGNhbgogIGhhdmUgbmVzdGVkIGNhbGxzOiBgJChzb3J0ICQoZm9yZWFjaCB4LGEgYiwkKHgpKSknLgoMClZlcnNpb24gMy4xMi4KCiogU2V2ZXJhbCBidWcgZml4ZXMsIGluY2x1ZGluZyBVU0cgYW5kIFN1bjM4Nmkgc3VwcG9ydC4KCiogYHNoZWxsJyBmdW5jdGlvbiB0byBleHBhbmQgc2hlbGwgY29tbWFuZHMgYSBsYSBgCgoqIElmIHRoZSBgLWQnIGZsYWcgaXMgZ2l2ZW4sIHZlcnNpb24gaW5mb3JtYXRpb24gd2lsbCBiZSBwcmludGVkLgoKKiBUaGUgYC1jJyBvcHRpb24gaGFzIGJlZW4gcmVuYW1lZCB0byBgLUMnIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGFyLgoKKiBUaGUgYC1wJyBvcHRpb24gbm8gbG9uZ2VyIGluaGliaXRzIG90aGVyIG5vcm1hbCBvcGVyYXRpb24uCgoqIE1ha2VmaWxlcyB3aWxsIGJlIHVwZGF0ZWQgYW5kIHJlLXJlYWQgaWYgbmVjZXNzYXJ5LgoKKiBDYW4gbm93IHJ1biBzZXZlcmFsIHJlY2lwZXMgYXQgb25jZSAocGFyYWxsZWxpc20pLCAtaiBvcHRpb24uCgoqIEVycm9yIG1lc3NhZ2VzIHdpbGwgY29udGFpbiB0aGUgbGV2ZWwgb2YgTWFrZSByZWN1cnNpb24sIGlmIGFueS4KCiogVGhlIGBNQUtFRkxBR1MnIGFuZCBgTUZMQUdTJyB2YXJpYWJsZXMgd2lsbCBiZSBzY2FubmVkIGZvciBvcHRpb25zIGFmdGVyCiAgbWFrZWZpbGVzIGFyZSByZWFkLgoKKiBBIGRvdWJsZS1jb2xvbiBydWxlIHdpdGggbm8gZGVwZW5kZW5jaWVzIHdpbGwgYWx3YXlzIGhhdmUgaXRzIHJlY2lwZSBydW4uCiAgKFRoaXMgaXMgaG93IGJvdGggdGhlIEJTRCBhbmQgU3lzdGVtIFYgdmVyc2lvbnMgb2YgTWFrZSBkbyBpdC4pCgwKVmVyc2lvbiAzLjA1CgooQ2hhbmdlcyBmcm9tIHZlcnNpb25zIDEgdGhyb3VnaCAzLjA1IHdlcmUgbmV2ZXIgcmVjb3JkZWQuICBTb3JyeS4pCgwKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpDb3B5cmlnaHQgKEMpIDE5ODgtMjAyMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIE1ha2UuCgpHTlUgTWFrZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQp0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCkZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCnZlcnNpb24uCgpHTlUgTWFrZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IKQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCnRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCg==