V2hhdCdzIE5ldyBpbiBQeXRob24gMi4yYTM/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQ29yZQoKKyBBbiBvbGQgdG9rZW5pemVyIGJ1ZyBhbGxvd2VkIGZsb2F0aW5nIHBvaW50IGxpdGVyYWxzIHdpdGggYW4gaW5jb21wbGV0ZQogIGV4cG9uZW50LCBzdWNoIGFzIDFlIGFuZCAzLjFlLS4gIFN1Y2ggbGl0ZXJhbHMgbm93IHJhaXNlIFN5bnRheEVycm9yLgoKTGlicmFyeQoKKyBwaWNrbGUsIGNQaWNrbGUgYW5kIG1hcnNoYWwgb24gMzItYml0IHBsYXRmb3JtcyBjYW4gbm93IGNvcnJlY3RseSByZWFkCiAgZHVtcHMgY29udGFpbmluZyBpbnRzIHdyaXR0ZW4gb24gcGxhdGZvcm1zIHdoZXJlIFB5dGhvbiBpbnRzIGFyZSA4IGJ5dGVzLgogIFdoZW4gcmVhZCBvbiBhIGJveCB3aGVyZSBQeXRob24gaW50cyBhcmUgNCBieXRlcywgc3VjaCB2YWx1ZXMgYXJlCiAgY29udmVydGVkIHRvIFB5dGhvbiBsb25ncy4KClRvb2xzCgpCdWlsZAoKTmV3IHBsYXRmb3JtcwoKVGVzdHMKCldpbmRvd3MKCisgVGhlIHc5eHBvcGVuIGhhY2sgaXMgbm93IHVzZWQgb24gV2luZG93cyBOVCBhbmQgMjAwMCB0b28gd2hlbiBDT01QU1BFQwogIHBvaW50cyB0byBjb21tYW5kLmNvbSAocGF0Y2ggZnJvbSBCcmlhbiBRdWlubGFuKS4KCgpXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjJhMj8KPT09PT09PT09PT09PT09PT09PT09PT09PT09CgpCdWlsZAoKLSBUaW0gUGV0ZXJzIGRldmVsb3BlZCBhIGJyYW5kIG5ldyBXaW5kb3dzIGluc3RhbGxlciB1c2luZyBXaXNlIDguMSwKICBnZW5lcm91c2x5IGRvbmF0ZWQgdG8gdXMgYnkgV2lzZSBTb2x1dGlvbnMuCgotIGNvbmZpZ3VyZSBzdXBwb3J0cyBhIG5ldyBvcHRpb24gLS1lbmFibGUtdW5pY29kZSwgd2l0aCB0aGUgdmFsdWVzCiAgdWNzMiBhbmQgdWNzNCAobmV3IGluIDIuMmExKS4gV2l0aCAtLWRpc2FibGUtdW5pY29kZSwgdGhlIFVuaWNvZGUKICB0eXBlIGFuZCBzdXBwb3J0aW5nIGNvZGUgaXMgY29tcGxldGVseSByZW1vdmVkIGZyb20gdGhlIGludGVycHJldGVyLgoKLSBBIG5ldyBjb25maWd1cmUgb3B0aW9uIC0tZW5hYmxlLWZyYW1ld29yayBidWlsZHMgYSBNYWMgT1MgWCBmcmFtZXdvcmssCiAgd2hpY2ggIm1ha2UgZnJhbWV3b3JraW5zdGFsbCIgd2lsbCBpbnN0YWxsLiBUaGlzIHByb3ZpZGVzIGEgc3RhcnRpbmcKICBwb2ludCBmb3IgbW9yZSBtYWMtbGlrZSBmdW5jdGlvbmFsaXR5LCBqb2luIHB5dGhvbm1hYy1zaWdAcHl0aG9uLm9yZwogIGlmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBoZWxwaW5nLgoKLSBUaGUgTmVYVCBwbGF0Zm9ybSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLgoKLSBUaGUgYG5ldycgbW9kdWxlIGlzIG5vdyBzdGF0aWNhbGx5IGxpbmtlZC4KClRvb2xzCgotIFRoZSBuZXcgVG9vbHMvc2NyaXB0cy9jbGVhbmZ1dHVyZS5weSBjYW4gYmUgdXNlZCB0byBhdXRvbWF0aWNhbGx5CiAgZWRpdCBvdXQgb2Jzb2xldGUgZnV0dXJlIHN0YXRlbWVudHMgZnJvbSBQeXRob24gc291cmNlIGNvZGUuICBTZWUKICB0aGUgbW9kdWxlIGRvY3N0cmluZyBmb3IgZGV0YWlscy4KClRlc3RzCgotIHJlZ3J0ZXN0LnB5IG5vdyBrbm93cyB3aGljaCB0ZXN0cyBhcmUgZXhwZWN0ZWQgdG8gYmUgc2tpcHBlZCBvbiBzb21lCiAgcGxhdGZvcm1zLCBhbGxvd2luZyB0byBnaXZlIGNsZWFyZXIgdGVzdCByZXN1bHQgb3V0cHV0LiAgcmVncnRlc3QKICBhbHNvIGhhcyBvcHRpb25hbCAtLXVzZS8tdSBzd2l0Y2ggdG8gcnVuIG5vcm1hbGx5IGRpc2FibGVkIHRlc3RzCiAgd2hpY2ggcmVxdWlyZSBuZXR3b3JrIGFjY2VzcyBvciBjb25zdW1lIHNpZ25pZmljYW50IGRpc2sgcmVzb3VyY2VzLgoKLSBTZXZlcmFsIG5ldyB0ZXN0cyBpbiB0aGUgc3RhbmRhcmQgdGVzdCBzdWl0ZSwgd2l0aCBzcGVjaWFsIHRoYW5rcyB0bwogIE5pY2sgTWF0aGV3c29uLgoKQ29yZQoKLSBUaGUgZmxvb3IgZGl2aXNpb24gb3BlcmF0b3IgLy8gaGFzIGJlZW4gYWRkZWQgYXMgb3V0bGluZWQgaW4gUEVQCiAgMjM4LiAgVGhlIC8gb3BlcmF0b3Igc3RpbGwgcHJvdmlkZXMgY2xhc3NpYyBkaXZpc2lvbiAoYW5kIHdpbGwgdW50aWwKICBQeXRob24gMy4wKSB1bmxlc3MgImZyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24iIGlzIGluY2x1ZGVkLCBpbgogIHdoaWNoIGNhc2UgdGhlIC8gb3BlcmF0b3Igd2lsbCBwcm92aWRlIHRydWUgZGl2aXNpb24uICBUaGUgb3BlcmF0b3IKICBtb2R1bGUgcHJvdmlkZXMgdHJ1ZWRpdigpIGFuZCBmbG9vcmRpdigpIGZ1bmN0aW9ucy4gIEF1Z21lbnRlZAogIGFzc2lnbm1lbnQgdmFyaWFudHMgYXJlIGluY2x1ZGVkLCBhcyBhcmUgdGhlIGVxdWl2YWxlbnQgb3ZlcmxvYWRhYmxlCiAgbWV0aG9kcyBhbmQgQyBBUEkgbWV0aG9kcy4gIFNlZSB0aGUgUEVQIGZvciBhIGZ1bGwgZGlzY3Vzc2lvbjoKICA8aHR0cDovL3B5dGhvbi5zZi5uZXQvcGVwcy9wZXAtMDIzOC5odG1sPgoKLSBGdXR1cmUgc3RhdGVtZW50cyBhcmUgbm93IGVmZmVjdGl2ZSBpbiBzaW11bGF0ZWQgaW50ZXJhY3RpdmUgc2hlbGxzCiAgKGxpa2UgSURMRSkuICBUaGlzIHNob3VsZCAianVzdCB3b3JrIiBieSBtYWdpYywgYnV0IHJlYWQgTWljaGFlbAogIEh1ZHNvbidzICJGdXR1cmUgc3RhdGVtZW50cyBpbiBzaW11bGF0ZWQgc2hlbGxzIiBQRVAgMjY0IGZvciBmdWxsCiAgZGV0YWlsczogIDxodHRwOi8vcHl0aG9uLnNmLm5ldC9wZXBzL3BlcC0wMjY0Lmh0bWw+LgoKLSBUaGUgdHlwZS9jbGFzcyB1bmlmaWNhdGlvbiAoUEVQIDI1Mi0yNTMpIHdhcyBpbnRlZ3JhdGVkIGludG8gdGhlCiAgdHJ1bmsgYW5kIGlzIG5vdCBzbyB0ZW50YXRpdmUgYW55IG1vcmUgKHRoZSBleGFjdCBzcGVjaWZpY2F0aW9uIG9mCiAgc29tZSBmZWF0dXJlcyBpcyBzdGlsbCB0ZW50YXRpdmUpLiAgQSBsb3Qgb2Ygd29yayBoYXMgZG9uZSBvbiBmaXhpbmcKICBidWdzIGFuZCBhZGRpbmcgcm9idXN0bmVzcyBhbmQgZmVhdHVyZXMgKHBlcmZvcm1hbmNlIHN0aWxsIGhhcyB0bwogIGNvbWUgYSBsb25nIHdheSkuCgotIFdhcm5pbmdzIGFib3V0IGEgbWlzbWF0Y2ggaW4gdGhlIFB5dGhvbiBBUEkgZHVyaW5nIGV4dGVuc2lvbiBpbXBvcnQKICBub3cgdXNlIHRoZSBQeXRob24gd2FybmluZyBmcmFtZXdvcmsgKHdoaWNoIG1ha2VzIGl0IHBvc3NpYmxlIHRvCiAgd3JpdGUgZmlsdGVycyBmb3IgdGhlc2Ugd2FybmluZ3MpLgoKLSBBIGZ1bmN0aW9uJ3MgX19kaWN0X18gKGFrYSBmdW5jX2RpY3QpIHdpbGwgbm93IGFsd2F5cyBiZSBhCiAgZGljdGlvbmFyeS4gIEl0IHVzZWQgdG8gYmUgcG9zc2libGUgdG8gZGVsZXRlIGl0IG9yIHNldCBpdCB0byBOb25lLAogIGJ1dCBub3cgYm90aCBhY3Rpb25zIHJhaXNlIFR5cGVFcnJvcnMuICBJdCBpcyBzdGlsbCBsZWdhbCB0byBzZXQgaXQKICB0byBhIGRpY3Rpb25hcnkgb2JqZWN0LiAgR2V0dGluZyBmdW5jLl9fZGljdF9fIGJlZm9yZSBhbnkgYXR0cmlidXRlcwogIGhhdmUgYmVlbiBhc3NpZ25lZCBub3cgcmV0dXJucyBhbiBlbXB0eSBkaWN0aW9uYXJ5IGluc3RlYWQgb2YgTm9uZS4KCkxpYnJhcnkKCi0gTmV3IGNsYXNzIERpZmZlciBhbmQgbmV3IGZ1bmN0aW9ucyBuZGlmZigpIGFuZCByZXN0b3JlKCkgaW4gZGlmZmxpYi5weS4KICBUaGVzZSBwYWNrYWdlIHRoZSBhbGdvcml0aG1zIHVzZWQgYnkgdGhlIHBvcHVsYXIgVG9vbHMvc2NyaXB0cy9uZGlmZi5weSwKICBmb3IgcHJvZ3JhbW1hdGljIHJldXNlLgoKLSBOZXcgZnVuY3Rpb24geG1sLnNheC5zYXh1dGlscy5xdW90ZWF0dHIoKTogIFF1b3RlIGFuIFhNTCBhdHRyaWJ1dGUKICB2YWx1ZSB1c2luZyB0aGUgbWluaW1hbCBxdW90aW5nIHJlcXVpcmVkIGZvciB0aGUgdmFsdWU7IG1vcmUKICByZWxpYWJsZSB0aGFuIHVzaW5nIHhtbC5zYXguc2F4dXRpbHMuZXNjYXBlKCkgZm9yIGF0dHJpYnV0ZSB2YWx1ZXMuCgotIFJlYWRsaW5lIGNvbXBsZXRpb24gc3VwcG9ydCBmb3IgY21kLkNtZCB3YXMgYWRkZWQuCgotIENhbGxpbmcgb3MudGVtcG5hbSgpIG9yIG9zLnRtcG5hbSgpIGdlbmVyYXRlIFJ1bnRpbWVXYXJuaW5ncy4KCi0gQWRkZWQgZnVuY3Rpb24gdGhyZWFkaW5nLkJvdW5kZWRTZW1hcGhvcmUoKQoKLSBBZGRlZCBLYS1QaW5nIFllZSdzIGNnaXRiLnB5IG1vZHVsZS4KCi0gVGhlIGBuZXcnIG1vZHVsZSBub3cgZXhwb3NlcyB0aGUgQ09feHh4IGZsYWdzLgoKTmV3IHBsYXRmb3JtcwoKQyBBUEkKCi0gVHdvIG5ldyBBUElzIFB5T1Nfc25wcmludGYoKSBhbmQgUHlPU192c25wcmludGYoKSB3ZXJlIGFkZGVkCiAgd2hpY2ggcHJvdmlkZSBhIGNyb3NzLXBsYXRmb3JtIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlCiAgcmVsYXRpdmVseSBuZXcgc25wcmludGYoKS92c25wcmludGYoKSBDIGxpYiBBUElzLiBJbiBjb250cmFzdCB0bwogIHRoZSBzdGFuZGFyZCBzcHJpbnRmKCkgYW5kIHZzcHJpbnRmKCkgQyBsaWIgQVBJcywgdGhlc2UgdmVyc2lvbnMKICBhcHBseSBib3VuZHMgY2hlY2tpbmcgb24gdGhlIHVzZWQgYnVmZmVyIHdoaWNoIGVuaGFuY2VzIHByb3RlY3Rpb24KICBhZ2FpbnN0IGJ1ZmZlciBvdmVycnVucy4KCi0gVW5pY29kZSBBUElzIG5vdyB1c2UgbmFtZSBtYW5nbGluZyB0byBhc3N1cmUgdGhhdCBtaXhpbmcgaW50ZXJwcmV0ZXJzCiAgYW5kIGV4dGVuc2lvbnMgdXNpbmcgZGlmZmVyZW50IFVuaWNvZGUgd2lkdGhzIGlzIHJlbmRlcmVkIG5leHQgdG8KICBpbXBvc3NpYmxlLiBUcnlpbmcgdG8gaW1wb3J0IGFuIGluY29tcGF0aWJsZSBVbmljb2RlLWF3YXJlIGV4dGVuc2lvbgogIHdpbGwgcmVzdWx0IGluIGFuIEltcG9ydEVycm9yLiAgVW5pY29kZSBleHRlbnNpb25zIHdyaXRlcnMgbXVzdCBtYWtlCiAgc3VyZSB0byBjaGVjayB0aGUgVW5pY29kZSB3aWR0aCBjb21wYXRpYmlsaXR5IGluIHRoZWlyIGV4dGVuc2lvbnMgYnkKICB1c2luZyBhdCBsZWFzdCBvbmUgb2YgdGhlIG1hbmdsZWQgVW5pY29kZSBBUElzIGluIHRoZSBleHRlbnNpb24uCgotIFR3byBuZXcgZmxhZ3MgTUVUSF9OT0FSR1MgYW5kIE1FVEhfTyBhcmUgYXZhaWxhYmxlIGluIG1ldGhvZCBkZWZpbml0aW9uCiAgdGFibGVzIHRvIHNpbXBsaWZ5IGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgd2l0aCBubyBhcmd1bWVudHMgYW5kIGEKICBzaW5nbGUgdW50eXBlZCBhcmd1bWVudC4gQ2FsbGluZyBzdWNoIG1ldGhvZHMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbgogIGNhbGxpbmcgY29ycmVzcG9uZGluZyBNRVRIX1ZBUkFSR1MgbWV0aG9kcy4gTUVUSF9PTERBUkdTIGlzIG5vdwogIGRlcHJlY2F0ZWQuCgpXaW5kb3dzCgotICJpbXBvcnQgbW9kdWxlIiBub3cgY29tcGlsZXMgbW9kdWxlLnB5dyBpZiBpdCBleGlzdHMgYW5kIG5vdGhpbmcgZWxzZQogIHJlbGV2YW50IGlzIGZvdW5kLgoKCldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMmExPwo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkNvcmUKCi0gVEVOVEFUSVZFTFksIGEgbGFyZ2UgYW1vdW50IG9mIGNvZGUgaW1wbGVtZW50aW5nIG11Y2ggb2Ygd2hhdCdzCiAgZGVzY3JpYmVkIGluIFBFUCAyNTIgKE1ha2luZyBUeXBlcyBMb29rIE1vcmUgTGlrZSBDbGFzc2VzKSBhbmQgUEVQCiAgMjUzIChTdWJ0eXBpbmcgQnVpbHQtaW4gVHlwZXMpIHdhcyBhZGRlZC4gIFRoaXMgd2lsbCBiZSByZWxlYXNlZAogIHdpdGggUHl0aG9uIDIuMmExLiAgRG9jdW1lbnRhdGlvbiB3aWxsIGJlIHByb3ZpZGVkIHNlcGFyYXRlbHkKICB0aHJvdWdoIGh0dHA6Ly93d3cucHl0aG9uLm9yZy8yLjIvLiAgVGhlIHB1cnBvc2Ugb2YgcmVsZWFzaW5nIHRoaXMKICB3aXRoIFB5dGhvbiAyLjJhMSBpcyB0byB0ZXN0IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAgSXQgaXMKICBwb3NzaWJsZSwgdGhvdWdoIG5vdCBsaWtlbHksIHRoYXQgYSBkZWNpc2lvbiBpcyBtYWRlIG5vdCB0byByZWxlYXNlCiAgdGhpcyBjb2RlIGFzIHBhcnQgb2YgMi4yIGZpbmFsLCBpZiBhbnkgc2VyaW91cyBiYWNrd2FyZHMKICBpbmNvbXBhcGF0aWJpbGl0aWVzIGFyZSBmb3VuZCBkdXJpbmcgYWxwaGEgdGVzdGluZyB0aGF0IGNhbm5vdCBiZQogIHJlcGFpcmVkLgoKLSBHZW5lcmF0b3JzIHdlcmUgYWRkZWQ7IHRoaXMgaXMgYSBuZXcgd2F5IHRvIGNyZWF0ZSBhbiBpdGVyYXRvciAoc2VlCiAgYmVsb3cpIHVzaW5nIHdoYXQgbG9va3MgbGlrZSBhIHNpbXBsZSBmdW5jdGlvbiBjb250YWluaW5nIG9uZSBvcgogIG1vcmUgJ3lpZWxkJyBzdGF0ZW1lbnRzLiAgU2VlIFBFUCAyNTUuICBTaW5jZSB0aGlzIGFkZHMgYSBuZXcKICBrZXl3b3JkIHRvIHRoZSBsYW5ndWFnZSwgdGhpcyBmZWF0dXJlIG11c3QgYmUgZW5hYmxlZCBieSBpbmNsdWRpbmcgYQogIGZ1dHVyZSBzdGF0ZW1lbnQ6ICJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGdlbmVyYXRvcnMiIChzZWUgUEVQIDIzNikuCiAgR2VuZXJhdG9ycyB3aWxsIGJlY29tZSBhIHN0YW5kYXJkIGZlYXR1cmUgaW4gYSBmdXR1cmUgcmVsZWFzZQogIChwcm9iYWJseSAyLjMpLiAgV2l0aG91dCB0aGlzIGZ1dHVyZSBzdGF0ZW1lbnQsICd5aWVsZCcgcmVtYWlucyBhbgogIG9yZGluYXJ5IGlkZW50aWZpZXIsIGJ1dCBhIHdhcm5pbmcgaXMgaXNzdWVkIGVhY2ggdGltZSBpdCBpcyB1c2VkLgogIChUaGVzZSB3YXJuaW5ncyBjdXJyZW50bHkgZG9uJ3QgY29uZm9ybSB0byB0aGUgd2FybmluZ3MgZnJhbWV3b3JrIG9mCiAgUEVQIDIzMDsgd2UgaW50ZW5kIHRvIGZpeCB0aGlzIGluIDIuMmEyLikKCi0gVGhlIFVURi0xNiBjb2RlYyB3YXMgbW9kaWZpZWQgdG8gYmUgbW9yZSBSRkMgY29tcGxpYW50LiBJdCB3aWxsIG5vdwogIG9ubHkgcmVtb3ZlIEJPTSBjaGFyYWN0ZXJzIGF0IHRoZSBzdGFydCBvZiB0aGUgc3RyaW5nIGFuZCB0aGVuCiAgb25seSBpZiBydW5uaW5nIGluIG5hdGl2ZSBtb2RlIChVVEYtMTYtTEUgYW5kIC1CRSB3b24ndCByZW1vdmUgYQogIGxlYWRpbmcgQk1PIGNoYXJhY3RlcikuCgotIFN0cmluZ3Mgbm93IGhhdmUgYSBuZXcgbWV0aG9kIC5kZWNvZGUoKSB0byBjb21wbGVtZW50IHRoZSBhbHJlYWR5CiAgZXhpc3RpbmcgLmVuY29kZSgpIG1ldGhvZC4gVGhlc2UgdHdvIG1ldGhvZHMgcHJvdmlkZSBkaXJlY3QgYWNjZXNzCiAgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGVjb2RlcnMgYW5kIGVuY29kZXJzIG9mIHRoZSByZWdpc3RlcmVkIGNvZGVjcy4KCiAgVG8gZW5oYW5jZSB0aGUgdXNhYmlsaXR5IG9mIHRoZSAuZW5jb2RlKCkgbWV0aG9kLCB0aGUgc3BlY2lhbAogIGNhc2luZyBvZiBVbmljb2RlIG9iamVjdCByZXR1cm4gdmFsdWVzIHdhcyBkcm9wcGVkIChVbmljb2RlIG9iamVjdHMKICB3ZXJlIGF1dG8tbWFnaWNhbGx5IGNvbnZlcnRlZCB0byBzdHJpbmcgdXNpbmcgdGhlIGRlZmF1bHQgZW5jb2RpbmcpLgoKICBCb3RoIG1ldGhvZHMgd2lsbCBub3cgcmV0dXJuIHdoYXRldmVyIHRoZSBjb2RlYyBpbiBjaGFyZ2Ugb2YgdGhlCiAgcmVxdWVzdGVkIGVuY29kaW5nIHJldHVybnMgYXMgb2JqZWN0LCBlLmcuIFVuaWNvZGUgY29kZWNzIHdpbGwKICByZXR1cm4gVW5pY29kZSBvYmplY3RzIHdoZW4gZGVjb2RpbmcgaXMgcmVxdWVzdGVkICgi5Pb8Ii5kZWNvZGUoImxhdGluLTEiKQogIHdpbGwgcmV0dXJuIHUi5Pb8IikuIFRoaXMgZW5hYmxlcyBjb2RlYyB3cml0ZXIgdG8gY3JlYXRlIGNvZGVjcwogIGZvciB2YXJpb3VzIHNpbXBsZSB0byB1c2UgY29udmVyc2lvbnMuCgogIE5ldyBjb2RlY3Mgd2VyZSBhZGRlZCB0byBkZW1vbnN0cmF0ZSB0aGVzZSBuZXcgZmVhdHVyZXMgKHRoZSAuZW5jb2RlKCkKICBhbmQgLmRlY29kZSgpIGNvbHVtbnMgaW5kaWNhdGUgdGhlIHR5cGUgb2YgdGhlIHJldHVybmVkIG9iamVjdHMpOgoKICBOYW1lICAgICB8IC5lbmNvZGUoKSB8IC5kZWNvZGUoKSB8IERlc2NyaXB0aW9uCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIHV1ICAgICAgIHwgc3RyaW5nICAgIHwgc3RyaW5nICAgIHwgVVUgY29kZWMgKGUuZy4gZm9yIGVtYWlsKQogIGJhc2U2NCAgIHwgc3RyaW5nICAgIHwgc3RyaW5nICAgIHwgYmFzZTY0IGNvZGVjCiAgcXVvcHJpICAgfCBzdHJpbmcgICAgfCBzdHJpbmcgICAgfCBxdW90ZWQtcHJpbnRhYmxlIGNvZGVjCiAgemxpYiAgICAgfCBzdHJpbmcgICAgfCBzdHJpbmcgICAgfCB6bGliIGNvbXByZXNzaW9uCiAgaGV4ICAgICAgfCBzdHJpbmcgICAgfCBzdHJpbmcgICAgfCAyLWJ5dGUgaGV4IGNvZGVjCiAgcm90LTEzICAgfCBzdHJpbmcgICAgfCBVbmljb2RlICAgfCBST1QtMTMgVW5pY29kZSBjaGFybWFwIGNvZGVjCgotIFNvbWUgb3BlcmF0aW5nIHN5c3RlbXMgbm93IHN1cHBvcnQgdGhlIGNvbmNlcHQgb2YgYSBkZWZhdWx0IFVuaWNvZGUKICBlbmNvZGluZyBmb3IgZmlsZSBzeXN0ZW0gb3BlcmF0aW9ucy4gIE5vdGFibHksIFdpbmRvd3Mgc3VwcG9ydHMgJ21iY3MnCiAgYXMgdGhlIGRlZmF1bHQuICBUaGUgTWFjaW50b3NoIHdpbGwgYWxzbyBhZG9wdCB0aGlzIGNvbmNlcHQgaW4gdGhlIG1lZGl1bQogIHRlcm0sIGFsdGhvdWdoIHRoZSBkZWZhdWx0IGVuY29kaW5nIGZvciB0aGF0IHBsYXRmb3JtIHdpbGwgYmUgb3RoZXIgdGhhbgogICdtYmNzJy4KCiAgT24gb3BlcmF0aW5nIHN5c3RlbSB0aGF0IHN1cHBvcnQgbm9uLUFTQ0lJIGZpbGVuYW1lcywgaXQgaXMgY29tbW9uIGZvcgogIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBmaWxlbmFtZXMgKHN1Y2ggYXMgb3MubGlzdGRpcigpKSB0byByZXR1cm4gUHl0aG9uCiAgc3RyaW5nIG9iamVjdHMgcHJlLWVuY29kZWQgdXNpbmcgdGhlIGRlZmF1bHQgZmlsZSBzeXN0ZW0gZW5jb2RpbmcgZm9yCiAgdGhlIHBsYXRmb3JtLiAgQXMgdGhpcyBlbmNvZGluZyBpcyBsaWtlbHkgdG8gYmUgZGlmZmVyZW50IGZyb20gUHl0aG9uJ3MKICBkZWZhdWx0IGVuY29kaW5nLCBjb252ZXJ0aW5nIHRoaXMgbmFtZSB0byBhIFVuaWNvZGUgb2JqZWN0IGJlZm9yZSBwYXNzaW5nCiAgaXQgYmFjayB0byB0aGUgT3BlcmF0aW5nIFN5c3RlbSB3b3VsZCByZXN1bHQgaW4gYSBVbmljb2RlIGVycm9yLCBhcyBQeXRob24KICB3b3VsZCBhdHRlbXB0IHRvIHVzZSBpdHMgZGVmYXVsdCBlbmNvZGluZyAoZ2VuZXJhbGx5IEFTQ0lJKSByYXRoZXIgdGhhbgogIHRoZSBkZWZhdWx0IGVuY29kaW5nIGZvciB0aGUgZmlsZSBzeXN0ZW0uCgogIEluIGdlbmVyYWwsIHRoaXMgY2hhbmdlIHNpbXBseSByZW1vdmVzIHN1cnByaXNlcyB3aGVuIHdvcmtpbmcgd2l0aAogIFVuaWNvZGUgYW5kIHRoZSBmaWxlIHN5c3RlbSwgbWFraW5nIHRoZXNlIG9wZXJhdGlvbnMgd29yayBhcyB5b3UgZXhwZWN0LAogIGluY3JlYXNpbmcgdGhlIHRyYW5zcGFyZW5jeSBvZiBVbmljb2RlIG9iamVjdHMgaW4gdGhpcyBjb250ZXh0LgogIFNlZSBbPz8/P10gZm9yIG1vcmUgZGV0YWlscywgaW5jbHVkaW5nIGV4YW1wbGVzLgoKLSBGbG9hdCAoYW5kIGNvbXBsZXgpIGxpdGVyYWxzIGluIHNvdXJjZSBjb2RlIHdlcmUgZXZhbHVhdGVkIHRvIGZ1bGwKICBwcmVjaXNpb24gb25seSB3aGVuIHJ1bm5pbmcgZnJvbSBhIC5weSBmaWxlOyB0aGUgc2FtZSBjb2RlIGxvYWRlZCBmcm9tIGEKICAucHljIChvciAucHlvKSBmaWxlIGNvdWxkIHN1ZmZlciBudW1lcmljIGRpZmZlcmVuY2VzIHN0YXJ0aW5nIGF0IGFib3V0IHRoZQogIDEydGggc2lnbmlmaWNhbnQgZGVjaW1hbCBkaWdpdC4gIEZvciBleGFtcGxlLCBvbiBhIG1hY2hpbmUgd2l0aCBJRUVFLTc1NAogIGZsb2F0aW5nIGFyaXRobWV0aWMsCgogICAgICB4ID0gOTAwNzE5OTI1NDc0MDk5Mi4wCiAgICAgIHByaW50IGxvbmcoeCkKCiAgcHJpbnRlZCA5MDA3MTk5MjU0NzQwOTkyIGlmIHJ1biBkaXJlY3RseSBmcm9tIC5weSwgYnV0IDkwMDcxOTkyNTQ3NDAwMDAKICBpZiBmcm9tIGEgY29tcGlsZWQgKC5weWMgb3IgLnB5bykgZmlsZS4gIFRoaXMgd2FzIGR1ZSB0byBtYXJzaGFsIHVzaW5nCiAgc3RyKGZsb2F0KSBpbnN0ZWFkIG9mIHJlcHIoZmxvYXQpIHdoZW4gYnVpbGRpbmcgY29kZSBvYmplY3RzLiAgbWFyc2hhbAogIG5vdyB1c2VzIHJlcHIoZmxvYXQpIGluc3RlYWQsIHdoaWNoIHNob3VsZCByZXByb2R1Y2UgZmxvYXRzIHRvIGZ1bGwKICBtYWNoaW5lIHByZWNpc2lvbiAoYXNzdW1pbmcgdGhlIHBsYXRmb3JtIEMgZmxvYXQ8LT5zdHJpbmcgSS9PIGNvbnZlcnNpb24KICBmdW5jdGlvbnMgYXJlIG9mIGdvb2QgcXVhbGl0eSkuCgogIFRoaXMgbWF5IGNhdXNlIGZsb2F0aW5nLXBvaW50IHJlc3VsdHMgdG8gY2hhbmdlIGluIHNvbWUgY2FzZXMsIGFuZAogIHVzdWFsbHkgZm9yIHRoZSBiZXR0ZXIsIGJ1dCBtYXkgYWxzbyBjYXVzZSBudW1lcmljYWxseSB1bnN0YWJsZQogIGFsZ29yaXRobXMgdG8gYnJlYWsuCgotIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBkaWN0cyBzdWZmZXJzIGZld2VyIGNvbGxpc2lvbnMsIHdoaWNoIGhhcyBzcGVlZAogIGJlbmVmaXRzLiAgSG93ZXZlciwgdGhlIG9yZGVyIGluIHdoaWNoIGRpY3QgZW50cmllcyBhcHBlYXIgaW4gZGljdC5rZXlzKCksCiAgZGljdC52YWx1ZXMoKSBhbmQgZGljdC5pdGVtcygpIG1heSBkaWZmZXIgZnJvbSBwcmV2aW91cyByZWxlYXNlcyBmb3IgYQogIGdpdmVuIGRpY3QuICBOb3RoaW5nIGlzIGRlZmluZWQgYWJvdXQgdGhpcyBvcmRlciwgc28gbm8gcHJvZ3JhbSBzaG91bGQKICByZWx5IG9uIGl0LiAgTmV2ZXJ0aGVsZXNzLCBpdCdzIGVhc3kgdG8gd3JpdGUgdGVzdCBjYXNlcyB0aGF0IHJlbHkgb24gdGhlCiAgb3JkZXIgYnkgYWNjaWRlbnQsIHR5cGljYWxseSBiZWNhdXNlIG9mIHByaW50aW5nIHRoZSBzdHIoKSBvciByZXByKCkgb2YgYQogIGRpY3QgdG8gYW4gImV4cGVjdGVkIHJlc3VsdHMiIGZpbGUuICBTZWUgTGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5J3MgbmV3CiAgc29ydGRpY3QoZGljdCkgZnVuY3Rpb24gZm9yIGEgc2ltcGxlIHdheSB0byBkaXNwbGF5IGEgZGljdCBpbiBzb3J0ZWQKICBvcmRlci4KCi0gTWFueSBvdGhlciBzbWFsbCBjaGFuZ2VzIHRvIGRpY3RzIHdlcmUgbWFkZSwgcmVzdWx0aW5nIGluIGZhc3RlcgogIG9wZXJhdGlvbiBhbG9uZyB0aGUgbW9zdCBjb21tb24gY29kZSBwYXRocy4KCi0gRGljdGlvbmFyeSBvYmplY3RzIG5vdyBzdXBwb3J0IHRoZSAiaW4iIG9wZXJhdG9yOiAieCBpbiBkaWN0IiBtZWFucwogIHRoZSBzYW1lIGFzIGRpY3QuaGFzX2tleSh4KS4KCi0gVGhlIHVwZGF0ZSgpIG1ldGhvZCBvZiBkaWN0aW9uYXJpZXMgbm93IGFjY2VwdHMgZ2VuZXJpYyBtYXBwaW5nCiAgb2JqZWN0cy4gIFNwZWNpZmljYWxseSB0aGUgYXJndW1lbnQgb2JqZWN0IG11c3Qgc3VwcG9ydCB0aGUgLmtleXMoKQogIGFuZCBfX2dldGl0ZW1fXygpIG1ldGhvZHMuICBUaGlzIGFsbG93cyB5b3UgdG8gc2F5LCBmb3IgZXhhbXBsZSwKICB7fS51cGRhdGUoVXNlckRpY3QoKSkKCi0gSXRlcmF0b3JzIHdlcmUgYWRkZWQ7IHRoaXMgaXMgYSBnZW5lcmFsaXplZCB3YXkgb2YgcHJvdmlkaW5nIHZhbHVlcwogIHRvIGEgZm9yIGxvb3AuICBTZWUgUEVQIDIzNC4gIFRoZXJlJ3MgYSBuZXcgYnVpbHQtaW4gZnVuY3Rpb24gaXRlcigpCiAgdG8gcmV0dXJuIGFuIGl0ZXJhdG9yLiAgVGhlcmUncyBhIG5ldyBwcm90b2NvbCB0byBnZXQgdGhlIG5leHQgdmFsdWUKICBmcm9tIGFuIGl0ZXJhdG9yIHVzaW5nIHRoZSBuZXh0KCkgbWV0aG9kIChpbiBQeXRob24pIG9yIHRoZQogIHRwX2l0ZXJuZXh0IHNsb3QgKGluIEMpLiAgVGhlcmUncyBhIG5ldyBwcm90b2NvbCB0byBnZXQgaXRlcmF0b3JzCiAgdXNpbmcgdGhlIF9faXRlcl9fKCkgbWV0aG9kIChpbiBQeXRob24pIG9yIHRoZSB0cF9pdGVyIHNsb3QgKGluIEMpLgogIEl0ZXJhdGluZyAoaS5lLiBhIGZvciBsb29wKSBvdmVyIGEgZGljdGlvbmFyeSBnZW5lcmF0ZXMgaXRzIGtleXMuCiAgSXRlcmF0aW5nIG92ZXIgYSBmaWxlIGdlbmVyYXRlcyBpdHMgbGluZXMuCgotIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHdlcmUgZ2VuZXJhbGl6ZWQgdG8gd29yayBuaWNlbHkgd2l0aCBpdGVyYXRvcgogIGFyZ3VtZW50czoKICAgIG1hcCgpLCBmaWx0ZXIoKSwgcmVkdWNlKCksIHppcCgpCiAgICBsaXN0KCksIHR1cGxlKCkgKFB5U2VxdWVuY2VfVHVwbGUoKSBhbmQgUHlTZXF1ZW5jZV9GYXN0KCkgaW4gQyBBUEkpCiAgICBtYXgoKSwgbWluKCkKICAgIGpvaW4oKSBtZXRob2Qgb2Ygc3RyaW5ncwogICAgZXh0ZW5kKCkgbWV0aG9kIG9mIGxpc3RzCiAgICAneCBpbiB5JyBhbmQgJ3ggbm90IGluIHknIChQeVNlcXVlbmNlX0NvbnRhaW5zKCkgaW4gQyBBUEkpCiAgICBvcGVyYXRvci5jb3VudE9mKCkgKFB5U2VxdWVuY2VfQ291bnQoKSBpbiBDIEFQSSkKICAgIHJpZ2h0LWhhbmQgc2lkZSBvZiBhc3NpZ25tZW50IHN0YXRlbWVudHMgd2l0aCBtdWx0aXBsZSB0YXJnZXRzLCBzdWNoIGFzCiAgICAgICAgeCwgeSwgeiA9IHNvbWVfaXRlcmFibGVfb2JqZWN0X3JldHVybmluZ19leGFjdGx5XzNfdmFsdWVzCgotIEFjY2Vzc2luZyBtb2R1bGUgYXR0cmlidXRlcyBpcyBzaWduaWZpY2FudGx5IGZhc3RlciAoZm9yIGV4YW1wbGUsCiAgcmFuZG9tLnJhbmRvbSBvciBvcy5wYXRoIG9yIHlvdXJQeXRob25Nb2R1bGUueW91ckF0dHJpYnV0ZSkuCgotIENvbXBhcmluZyBkaWN0aW9uYXJ5IG9iamVjdHMgdmlhID09IGFuZCAhPSBpcyBmYXN0ZXIsIGFuZCBub3cgd29ya3MgZXZlbgogIGlmIHRoZSBrZXlzIGFuZCB2YWx1ZXMgZG9uJ3Qgc3VwcG9ydCBjb21wYXJpc29ucyBvdGhlciB0aGFuID09LgoKLSBDb21wYXJpbmcgZGljdGlvbmFyaWVzIGluIHdheXMgb3RoZXIgdGhhbiA9PSBhbmQgIT0gaXMgc2xvd2VyOiAgdGhlcmUgd2VyZQogIGluc2VjdXJpdGllcyBpbiB0aGUgZGljdCBjb21wYXJpc29uIGltcGxlbWVudGF0aW9uIHRoYXQgY291bGQgY2F1c2UgUHl0aG9uCiAgdG8gY3Jhc2ggaWYgdGhlIGVsZW1lbnQgY29tcGFyaXNvbiByb3V0aW5lcyBmb3IgdGhlIGRpY3Qga2V5cyBhbmQvb3IKICB2YWx1ZXMgbXV0YXRlZCB0aGUgZGljdHMuICBNYWtpbmcgdGhlIGNvZGUgYnVsbGV0cHJvb2Ygc2xvd2VkIGl0IGRvd24uCgotIENvbGxpc2lvbnMgaW4gZGljdHMgYXJlIHJlc29sdmVkIHZpYSBhIG5ldyBhcHByb2FjaCwgd2hpY2ggY2FuIGhlbHAKICBkcmFtYXRpY2FsbHkgaW4gYmFkIGNhc2VzLiAgRm9yIGV4YW1wbGUsIGxvb2tpbmcgdXAgZXZlcnkga2V5IGluIGEgZGljdAogIGQgd2l0aCBkLmtleXMoKSA9PSBbaSA8PCAxNiBmb3IgaSBpbiByYW5nZSgyMDAwMCldIGlzIGFwcHJveGltYXRlbHkgNTAweAogIGZhc3RlciBub3cuICBUaGFua3MgdG8gQ2hyaXN0aWFuIFRpc21lciBmb3IgcG9pbnRpbmcgb3V0IHRoZSBjYXVzZSBhbmQKICB0aGUgbmF0dXJlIG9mIGFuIGVmZmVjdGl2ZSBjdXJlIChsYXN0IERlY2VtYmVyISBiZXR0ZXIgbGF0ZSB0aGFuIG5ldmVyKS4KCi0gcmVwcigpIGlzIG11Y2ggZmFzdGVyIGZvciBsYXJnZSBjb250YWluZXJzIChkaWN0LCBsaXN0LCB0dXBsZSkuCgoKTGlicmFyeQoKLSBUaGUgY29uc3RhbnRzIGFzY2lpX2xldHRlcnMsIGFzY2lpX2xvd2VyY2FzZS4gYW5kIGFzY2lpX3VwcGVyY2FzZQogIHdlcmUgYWRkZWQgdG8gdGhlIHN0cmluZyBtb2R1bGUuICBUaGVzZSBhIGxvY2FsZS1pbmRlbnBlbmRlbnQKICBjb25zdGFudHMsIHVubGlrZSBsZXR0ZXJzLCBsb3dlcmNhc2UsIGFuZCB1cHBlcmNhc2UuICBUaGVzZSBhcmUgbm93CiAgdXNlIGluIGFwcHJvcHJpYXRlIGxvY2F0aW9ucyBpbiB0aGUgc3RhbmRhcmQgbGlicmFyeS4KCi0gVGhlIGZsYWdzIHVzZWQgaW4gZGxvcGVuIGNhbGxzIGNhbiBub3cgYmUgY29uZmlndXJlZCB1c2luZwogIHN5cy5zZXRkbG9wZW5mbGFncyBhbmQgcXVlcmllZCB1c2luZyBzeXMuZ2V0ZGxvcGVuZmxhZ3MuCgotIEZyZWRyaWsgTHVuZGgncyB4bWxycGNsaWIgaXMgbm93IGEgc3RhbmRhcmQgbGlicmFyeSBtb2R1bGUuICBUaGlzCiAgcHJvdmlkZXMgZnVsbCBjbGllbnQtc2lkZSBYTUwtUlBDIHN1cHBvcnQuICBJbiBhZGRpdGlvbiwKICBEZW1vL3htbHJwYy8gY29udGFpbnMgdHdvIHNlcnZlciBmcmFtZXdvcmtzIChvbmUgU29ja2V0U2VydmVyLWJhc2VkLAogIG9uZSBhc3luY29yZS1iYXNlZCkuICBUaGFua3MgdG8gRXJpYyBSYXltb25kIGZvciB0aGUgZG9jdW1lbnRhdGlvbi4KCi0gVGhlIHhyYW5nZSgpIG9iamVjdCBpcyBzaW1wbGlmaWVkOiBpdCBubyBsb25nZXIgc3VwcG9ydHMgc2xpY2luZywKICByZXBldGl0aW9uLCBjb21wYXJpc29ucywgZWZmaWNpZW50ICdpbicgY2hlY2tpbmcsIHRoZSB0b2xpc3QoKQogIG1ldGhvZCwgb3IgdGhlIHN0YXJ0LCBzdG9wIGFuZCBzdGVwIGF0dHJpYnV0ZXMuICBTZWUgUEVQIDI2MC4KCi0gQSBuZXcgZnVuY3Rpb24gZm5tYXRjaC5maWx0ZXIgdG8gZmlsdGVyIGxpc3RzIG9mIGZpbGUgbmFtZXMgd2FzIGFkZGVkLgoKLSBjYWxlbmRhci5weSB1c2VzIG1vbnRoIGFuZCBkYXkgbmFtZXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgbG9jYWxlLgoKLSBzdHJvcCBpcyBub3cgKnJlYWxseSogb2Jzb2xldGUgKHRoaXMgd2FzIGFubm91bmNlZCBiZWZvcmUgd2l0aCAxLjYpLAogIGFuZCBpc3N1ZXMgRGVwcmVjYXRpb25XYXJuaW5nIHdoZW4gdXNlZCAoZXhjZXB0IGZvciB0aGUgZm91ciBpdGVtcwogIHRoYXQgYXJlIHN0aWxsIGltcG9ydGVkIGludG8gc3RyaW5nLnB5KS4KCi0gQ29va2llLnB5IG5vdyBzb3J0cyBrZXkrdmFsdWUgcGFpcnMgYnkga2V5IGluIG91dHB1dCBzdHJpbmdzLgoKLSBwcHJpbnQuaXNyZWN1cnNpdmUob2JqZWN0KSBkaWRuJ3QgY29ycmVjdGx5IGlkZW50aWZ5IHJlY3Vyc2l2ZSBvYmplY3RzLgogIE5vdyBpdCBkb2VzLgoKLSBwcHJpbnQgZnVuY3Rpb25zIG5vdyBtdWNoIGZhc3RlciBmb3IgbGFyZ2UgY29udGFpbmVycyAodHVwbGUsIGxpc3QsIGRpY3QpLgoKLSBOZXcgJ3EnIGFuZCAnUScgZm9ybWF0IGNvZGVzIGluIHRoZSBzdHJ1Y3QgbW9kdWxlLCBjb3JyZXNwb25kaW5nIHRvIEMKICB0eXBlcyAibG9uZyBsb25nIiBhbmQgInVuc2lnbmVkIGxvbmcgbG9uZyIgKG9uIFdpbmRvd3MsIF9faW50NjQpLiAgSW4KICBuYXRpdmUgbW9kZSwgdGhlc2UgY2FuIGJlIHVzZWQgb25seSB3aGVuIHRoZSBwbGF0Zm9ybSBDIGNvbXBpbGVyIHN1cHBvcnRzCiAgdGhlc2UgdHlwZXMgKHdoZW4gSEFWRV9MT05HX0xPTkcgaXMgI2RlZmluZSdkIGJ5IHRoZSBQeXRob24gY29uZmlnCiAgcHJvY2VzcyksIGFuZCB0aGVuIHRoZXkgaW5oZXJpdCB0aGUgc2l6ZXMgYW5kIGFsaWdubWVudHMgb2YgdGhlIEMgdHlwZXMuCiAgSW4gc3RhbmRhcmQgbW9kZSwgJ3EnIGFuZCAnUScgYXJlIHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zLCBhbmQgYXJlCiAgOC1ieXRlIGludGVncmFsIHR5cGVzLgoKLSBUaGUgc2l0ZSBtb2R1bGUgaW5zdGFsbHMgYSBuZXcgYnVpbHQtaW4gZnVuY3Rpb24gJ2hlbHAnIHRoYXQgaW52b2tlcwogIHB5ZG9jLmhlbHAuICBJdCBtdXN0IGJlIGludm9rZWQgYXMgJ2hlbHAoKSc7IHdoZW4gaW52b2tlZCBhcyAnaGVscCcsCiAgaXQgZGlzcGxheXMgYSBtZXNzYWdlIHJlbWluZGluZyB0aGUgdXNlciB0byB1c2UgJ2hlbHAoKScgb3IKICAnaGVscChvYmplY3QpJy4KClRlc3RzCgotIE5ldyB0ZXN0X211dGFudHMucHkgcnVucyBkaWN0IGNvbXBhcmlzb25zIHdoZXJlIHRoZSBrZXkgYW5kIHZhbHVlCiAgY29tcGFyaXNvbiBvcGVyYXRvcnMgbXV0dXRlIHRoZSBkaWN0cyByYW5kb21seSBkdXJpbmcgY29tcGFyaXNvbi4gIFRoaXMKICByYXBpZGx5IGNhdXNlcyBQeXRob24gdG8gY3Jhc2ggdW5kZXIgZWFybGllciByZWxlYXNlcyAobm90IGZvciB0aGUgZmFpbnQKICBvZiBoZWFydDogIGl0IGNhbiBhbHNvIGNhdXNlIFdpbjl4IHRvIGZyZWV6ZSBvciByZWJvb3QhKS4KCi0gTmV3IHRlc3RfcHByaW50LnB5IHZlcmZpZXMgdGhhdCBwcHJpbnQuaXNyZWN1cnNpdmUoKSBhbmQKICBwcHJpbnQuaXNyZWFkYWJsZSgpIHJldHVybiBzZW5zaWJsZSByZXN1bHRzLiAgQWxzbyB2ZXJpZmllcyB0aGF0IHNpbXBsZQogIGNhc2VzIHByb2R1Y2UgY29ycmVjdCBvdXRwdXQuCgpOZXcgcGxhdGZvcm1zCgotIFB5dGhvbiBzaG91bGQgY29tcGlsZSBhbmQgcnVuIG91dCBvZiB0aGUgYm94IHVzaW5nIHRoZSBCb3JsYW5kIEMKICBjb21waWxlciAodW5kZXIgV2luZG93cyksIHRoYW5rcyB0byBTdGVwaGVuIEhhbnNlbi4KCkMgQVBJCgotIFJlbW92ZWQgdGhlIHVudXNlZCBsYXN0X2lzX3N0aWNreSBhcmd1bWVudCBmcm9tIHRoZSBpbnRlcm5hbAogIF9QeVR1cGxlX1Jlc2l6ZSgpLiAgSWYgdGhpcyBhZmZlY3RzIHlvdSwgeW91IHdlcmUgY2hlYXRpbmcuCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKCldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMSAoZmluYWwpPwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCldlIG9ubHkgY2hhbmdlZCBhIGZldyB0aGluZ3Mgc2luY2UgdGhlIGxhc3QgcmVsZWFzZSBjYW5kaWRhdGUsIGFsbCBpbgpQeXRob24gbGlicmFyeSBjb2RlOgoKLSBBIGJ1ZyBpbiB0aGUgbG9jYWxlIG1vZHVsZSB3YXMgZml4ZWQgdGhhdCBhZmZlY3RlZCBsb2NhbGVzIHdoaWNoCiAgZGVmaW5lIG5vIGdyb3VwaW5nIGZvciBudW1lcmljIGZvcm1hdHRpbmcuCgotIEEgZmV3IGJ1Z3MgaW4gdGhlIHdlYWtyZWYgbW9kdWxlJ3MgaW1wbGVtZW50YXRpb25zIG9mIHdlYWsKICBkaWN0aW9uYXJpZXMgKFdlYWtWYWx1ZURpY3Rpb25hcnkgYW5kIFdlYWtLZXlEaWN0aW9uYXJ5KSB3ZXJlIGZpeGVkLAogIGFuZCB0aGUgdGVzdCBzdWl0ZSB3YXMgdXBkYXRlZCB0byBjaGVjayBmb3IgdGhlc2UgYnVncy4KCi0gQW4gb2xkIGJ1ZyBpbiB0aGUgb3MucGF0aC53YWxrKCkgZnVuY3Rpb24gKGludHJvZHVjZWQgaW4gUHl0aG9uCiAgMi4wISkgd2FzIGZpeGVkOiBhIG5vbi1leGlzdGVudCBmaWxlIHdvdWxkIGNhdXNlIGFuIGV4Y2VwdGlvbgogIGluc3RlYWQgb2YgYmVpbmcgaWdub3JlZC4KCi0gRml4ZWQgYSBmZXcgYnVncyBpbiB0aGUgbmV3IHN5bXRhYmxlIG1vZHVsZSBmb3VuZCBieSBOZWlsIE5vcndpdHoncwogIFB5Q2hlY2tlci4KCgpXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjFjMj8KPT09PT09PT09PT09PT09PT09PT09PT09PT09CgpBIGZsdXJyeSBvZiBzbWFsbCBjaGFuZ2VzLCBhbmQgb25lIHNob3dzdG9wcGVyIGZpeGVkIGluIHRoZSBuaWNrIG9mCnRpbWUgbWFkZSBpdCBuZWNlc3NhcnkgdG8gcmVsZWFzZSBhbm90aGVyIHJlbGVhc2UgY2FuZGlkYXRlLiAgVGhlIGxpc3QKaGVyZSBpcyB0aGUgKmNvbXBsZXRlKiBsaXN0IG9mIHBhdGNoZXMgKGV4Y2VwdCB2ZXJzaW9uIHVwZGF0ZXMpOgoKQ29yZQoKLSBUaW0gZGlzY292ZXJlZCBhIG5hc3R5IGJ1ZyBpbiB0aGUgZGljdGlvbmFyeSBjb2RlLCBjYXVzZWQgYnkKICBQeURpY3RfTmV4dCgpIGNhbGxpbmcgZGljdF9yZXNpemUoKSwgYW5kIHRoZSBHQyBjb2RlJ3MgdXNlIG9mCiAgUHlEaWN0X05leHQoKSB2aW9sYXRpbmcgYW4gYXNzdW1wdGlvbiBpbiBkaWN0X2l0ZW1zKCkuICBUaGlzIHdhcwogIGZpeGVkIHdpdGggY29uc2lkZXJhYmxlIGFtb3VudHMgb2YgYmFuZC1haWQsIGJ1dCB0aGUgbmV0IGVmZmVjdCBpcyBhCiAgc2FuZXIgYW5kIG1vcmUgcm9idXN0IGltcGxlbWVudGF0aW9uLgoKLSBNYWRlIGEgYnVuY2ggb2Ygc3ltYm9scyBzdGF0aWMgdGhhdCB3ZXJlIGFjY2lkZW50YWxseSBnbG9iYWwuCgpCdWlsZCBhbmQgUG9ydHMKCi0gVGhlIHNldHVwLnB5IHNjcmlwdCBkaWRuJ3QgY2hlY2sgZm9yIGEgbmV3IGVub3VnaCB2ZXJzaW9uIG9mIHpsaWIKICAoMS4xLjMgaXMgbmVlZGVkKS4gIE5vdyBpdCBkb2VzLgoKLSBDaGFuZ2VkICJtYWtlIGNsZWFuIiB0YXJnZXQgdG8gYWxzbyByZW1vdmUgc2hhcmVkIGxpYnJhcmllcy4KCi0gQWRkZWQgYSBtb3JlIGdlbmVyYWwgd2FybmluZyBhYm91dCB0aGUgU0dJIElyaXggb3B0aW1pemVyIHRvIFJFQURNRS4KCkxpYnJhcnkKCi0gRml4IGEgYnVnIGluIHVybGxpYi5iYXNlam9pbigiaHR0cDovL2hvc3QiLCAiLi4vZmlsZS5odG1sIikgd2hpY2gKICBvbWl0dGVkIHRoZSBzbGFzaCBiZXR3ZWVuIGhvc3QgYW5kIGZpbGUuaHRtbC4KCi0gVGhlIG1haWxib3ggbW9kdWxlJ3MgX01haWxib3ggY2xhc3MgY29udGFpbmVkIGEgY29tcGxldGVseSBicm9rZW4KICBhbmQgdW5kb2N1bWVudGVkIHNlZWsoKSBtZXRob2QuICBSaXBwZWQgaXQgb3V0LgoKLSBGaXhlZCBhIGJ1bmNoIG9mIHR5cG9zIGluIHZhcmlvdXMgbGlicmFyeSBtb2R1bGVzICh1cmxsaWIyLCBzbXRwZCwKICBzZ21sbGliLCBuZXRyYywgY2h1bmspIGZvdW5kIGJ5IE5laWwgTm9yd2l0eidzIFB5Q2hlY2tlci4KCi0gRml4ZWQgYSBmZXcgbGFzdC1taW51dGUgYnVncyBpbiB1bml0dGVzdC4KCkV4dGVuc2lvbnMKCi0gUmV2ZXJ0ZWQgdGhlIHBhdGNoIHRvIHRoZSBPcGVuU1NMIGNvZGUgaW4gc29ja2V0bW9kdWxlLmMgdG8gc3VwcG9ydAogIFJBTkRfc3RhdHVzKCkgYW5kIHRoZSBFR0QsIGFuZCB0aGUgc3Vic2VxdWVudCBwYXRjaCB0aGF0IHRyaWVkIHRvCiAgZml4IGl0IGZvciBwcmUtMC45LjUgdmVyc2lvbnM7IHRoZSBwcm9ibGVtIHdpdGggdGhlIHBhdGNoIGlzIHRoYXQgb24KICBzb21lIHN5c3RlbXMgaXQgaXNzdWVzIGEgd2FybmluZyB3aGVuZXZlciBzb2NrZXQgaXMgaW1wb3J0ZWQsIGFuZAogIHRoYXQncyB1bmFjY2VwdGFibGUuCgpUZXN0cwoKLSBGaXhlZCB0aGUgcGlja2xlIHRlc3RzIHRvIHdvcmsgd2l0aCAiaW1wb3J0IHRlc3QudGVzdF9waWNrbGUiLgoKLSBUd2Vha2VkIHRlc3RfbG9jYWxlLnB5IHRvIGFjdHVhbGx5IHJ1biB0aGUgdGVzdCBXaW5kb3dzLgoKLSBJbiBkaXN0dXRpbHMvYXJjaGl2ZV91dGlsLnB5LCBjYWxsIHppcGZpbGUuWmlwRmlsZSgpIHdpdGggbW9kZSAidyIsCiAgbm90ICJ3YiIgKHdoaWNoIGlzIG5vdCBhIHZhbGlkIG1vZGUgYXQgYWxsKS4KCi0gRml4IHBzdGF0cyBicm93c2VyIGNyYXNoZXMuICBJbXBvcnQgcmVhZGxpbmUgaWYgaXQgZXhpc3RzIHRvIG1ha2UKICB0aGUgdXNlciBpbnRlcmZhY2UgbmljZXIuCgotIEFkZCAiaW1wb3J0IHRocmVhZCIgdG8gdGhlIHRvcCBvZiB0ZXN0IG1vZHVsZXMgdGhhdCBpbXBvcnQgdGhlCiAgdGhyZWFkaW5nIG1vZHVsZSAodGVzdF9hc3luY2hhdCBhbmQgdGVzdF90aHJlYWRlZHRlbXBmaWxlKS4gIFRoaXMKICBwcmV2ZW50cyB0ZXN0IGZhaWx1cmVzIGNhdXNlZCBieSBhIGJyb2tlbiB0aHJlYWRpbmcgbW9kdWxlIHJlc3VsdGluZwogIGZyb20gYSBwcmV2aW91c2x5IGNhdWdodCBmYWlsZWQgaW1wb3J0LgoKLSBDaGFuZ2VkIHRlc3RfYXN5bmNoYXQucHkgdG8gc2V0IHRoZSBTT19SRVVTRUFERFIgb3B0aW9uOyB0aGlzIHdhcwogIG5lZWRlZCBvbiBzb21lIHBsYXRmb3JtcyAoZS5nLiBTb2xhcmlzIDgpIHdoZW4gdGhlIHRlc3RzIGFyZSBydW4KICB0d2ljZSBpbiBzdWNjZXNzaW9uLgoKLSBTa2lwIHJhdGhlciB0aGFuIGZhaWwgdGVzdF9zdW5hdWRpb2RldiBpZiBubyBhdWRpbyBkZXZpY2UgaXMgZm91bmQuCgoKV2hhdCdzIE5ldyBpbiBQeXRob24gMi4xYzE/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhpcyBsaXN0IHdhcyBzaWduaWZpY2FudGx5IHVwZGF0ZWQgd2hlbiAyLjFjMiB3YXMgcmVsZWFzZWQ7IHRoZSAyLjFjMQpyZWxlYXNlIGRpZG4ndCBtZW50aW9uIG1vc3QgY2hhbmdlcyB0aGF0IHdlcmUgYWN0dWFsbHkgcGFydCBvZiAyLjFjMToKCkxlZ2FsCgotIENvcHlyaWdodCB3YXMgYXNzaWduZWQgdG8gdGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uIChQU0YpIGFuZCBhCiAgUFNGIGxpY2Vuc2UgKHZlcnkgc2ltaWxhciB0byB0aGUgQ05SSSBsaWNlbnNlKSB3YXMgYWRkZWQuCgotIFRoZSBDTlJJIGNvcHlyaWdodCBub3RpY2Ugd2FzIHVwZGF0ZWQgdG8gaW5jbHVkZSAyMDAxLgoKQ29yZQoKLSBBZnRlciBhIHB1YmxpYyBvdXRjcnksIGFzc2lnbm1lbnQgdG8gX19kZWJ1Z19fIGlzIG5vIGxvbmdlciBpbGxlZ2FsOwogIGluc3RlYWQsIGEgd2FybmluZyBpcyBpc3N1ZWQuICBJdCB3aWxsIGJlY29tZSBpbGxlZ2FsIGluIDIuMi4KCi0gRml4ZWQgYSBjb3JlIGR1bXAgd2l0aCAiJSN4IiAlIDAsIGFuZCBjaGFuZ2VkIHRoZSBzZW1hbnRpY3Mgc28gdGhhdAogICIlI3giIG5vdyBhbHdheXMgcHJlcGVuZHMgIjB4IiwgZXZlbiBpZiB0aGUgdmFsdWUgaXMgemVyby4KCi0gRml4ZWQgc29tZSBuaXRzIGluIHRoZSBieXRlY29kZSBjb21waWxlci4KCi0gRml4ZWQgY29yZSBkdW1wcyB3aGVuIGNhbGxpbmcgY2VydGFpbiBraW5kcyBvZiBub24tZnVuY3Rpb25zLgoKLSBGaXhlZCB2YXJpb3VzIGNvcmUgZHVtcHMgY2F1c2VkIGJ5IHJlZmVyZW5jZSBjb3VudCBidWdzLgoKQnVpbGQgYW5kIFBvcnRzCgotIFVzZSBJTlNUQUxMX1NDUklQVCB0byBpbnN0YWxsIHNjcmlwdCBmaWxlcy4KCi0gTmV3IHBvcnQ6IFNDTyBVbml4d2FyZSA3LCBieSBCaWxseSBHLiBBbGxpZS4KCi0gVXBkYXRlZCBSSVNDT1MgcG9ydC4KCi0gVXBkYXRlZCBCZU9TIHBvcnQgYW5kIG5vdGVzLgoKLSBWYXJpb3VzIG90aGVyIHBvcnRpbmcgcHJvYmxlbXMgcmVzb2x2ZWQuCgpMaWJyYXJ5CgotIFRoZSBURVJNSU9TIGFuZCBTT0NLRVQgbW9kdWxlcyBhcmUgbm93IHRydWx5IG9ic29sZXRlIGFuZAogIHVubmVjZXNzYXJ5LiAgVGhlaXIgc3ltYm9scyBhcmUgaW5jb3Jwb3JhdGVkIGluIHRoZSB0ZXJtaW9zIGFuZAogIHNvY2tldCBtb2R1bGVzLgoKLSBGaXhlZCBzb21lIDY0LWJpdCBidWdzIGluIHBpY2tsZSwgY1BpY2tsZSwgYW5kIHN0cnVjdCwgYW5kIGFkZGVkCiAgYmV0dGVyIHRlc3RzIGZvciBwaWNrbGluZy4KCi0gdGhyZWFkaW5nOiBtYWtlIENvbmRpdGlvbi53YWl0KCkgcm9idXN0IGFnYWluc3QgS2V5Ym9hcmRJbnRlcnJ1cHQuCgotIHppcGZpbGU6IGFkZCBzdXBwb3J0IHRvIHppcGZpbGUgdG8gc3VwcG9ydCBvcGVuaW5nIGFuIGFyY2hpdmUKICByZXByZXNlbnRlZCBieSBhbiBvcGVuIGZpbGUgcmF0aGVyIHRoYW4gYSBmaWxlIG5hbWUuICBGaXggYnVnIHdoZXJlCiAgdGhlIGFyY2hpdmUgd2FzIG5vdCBwcm9wZXJseSBjbG9zZWQuICBGaXhlZCBhIGJ1ZyBpbiB0aGlzIGJ1Z2ZpeAogIHdoZXJlIGZsdXNoKCkgd2FzIGNhbGxlZCBmb3IgYSByZWFkLW9ubHkgZmlsZS4KCi0gaW1wdXRpbDogYWRkZWQgYW4gdW5pbnN0YWxsKCkgbWV0aG9kIHRvIHRoZSBJbXBvcnRNYW5hZ2VyLgoKLSBDYW52YXM6IGZpeGVkIGJ1Z3MgaW4gbG93ZXIoKSBhbmQgdGtyYWlzZSgpIG1ldGhvZHMuCgotIFNvY2tldFNlcnZlcjogQVBJIGNoYW5nZSAoYWRkZWQgb3ZlcnJpZGFibGUgY2xvc2VfcmVxdWVzdCgpIG1ldGhvZCkKICBzbyB0aGF0IHRoZSBUQ1Agc2VydmVyIGNhbiBleHBsaWNpdGx5IGNsb3NlIHRoZSByZXF1ZXN0LgoKLSBwc3RhdHM6IEVyaWMgUmF5bW9uZCBhZGRlZCBhIHNpbXBsZSBpbnRlcmFjdGl2ZSBzdGF0aXN0aWNzIGJyb3dzZXIsCiAgaW52b2tlZCB3aGVuIHRoZSBtb2R1bGUgaXMgcnVuIGFzIGEgc2NyaXB0LgoKLSBsb2NhbGU6IGZpeGVkIGEgcHJvYmxlbSBpbiBmb3JtYXQoKS4KCi0gd2ViYnJvd3NlcjogbWFkZSBpdCB3b3JrIHdoZW4gdGhlIEJST1dTRVIgZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGEKICB2YWx1ZSBsaWtlICIvdXNyL2Jpbi9uZXRzY2FwZSIuICBNYWRlIGl0IGF1dG8tZGV0ZWN0IEtvbnF1ZXJvciBmb3IKICBLREUgMi4gIEZpeGVkIHNvbWUgb3RoZXIgbml0cy4KCi0gdW5pdHRlc3Q6IGNoYW5nZXMgdG8gYWxsb3cgdXNpbmcgYSBkaWZmZXJlbnQgZXhjZXB0aW9uIHRoYW4KICBBc3NlcnRpb25FcnJvciwgYW5kIGFkZGVkIGEgZmV3IG1vcmUgZnVuY3Rpb24gYWxpYXNlcy4gIFNvbWUgb3RoZXIKICBzbWFsbCBjaGFuZ2VzLgoKLSB1cmxsaWIsIHVybGxpYjI6IGZpeGVkIHJlZGlyZWN0IHByb2JsZW1zIGFuZCBhIGNvdXBsZW9mIG90aGVyIG5pdHMuCgotIGFzeW5jaGF0OiBmaXhlZCBhIGNyaXRpY2FsIGJ1ZyBpbiBhc3luY2hhdCB0aGF0IHNsaXBwZWQgdGhyb3VnaCB0aGUKICAyLjFiMiByZWxlYXNlLiAgRml4ZWQgYW5vdGhlciByYXJlIGJ1Zy4KCi0gRml4IHNvbWUgdW5xdWFsaWZpZWQgZXhjZXB0OiBjbGF1c2VzIChhbHdheXMgYSBiYWQgY29kZSBleGFtcGxlKS4KClhNTAoKLSBweWV4cGF0OiBuZXcgQVBJIGdldF92ZXJzaW9uX3N0cmluZygpLgoKLSBGaXhlZCBzb21lIG1pbmlkb20gYnVncy4KCkV4dGVuc2lvbnMKCi0gRml4ZWQgYSBjb3JlIGR1bXAgaW4gX3dlYWtyZWYuICBSZW1vdmVkIHRoZSB3ZWFrcmVmLm1hcHBpbmcoKQogIGZ1bmN0aW9uIChpdCBhZGRzIG5vdGhpbmcgdG8gdGhlIEFQSSkuCgotIFJhdGlvbmFsaXplZCB0aGUgdXNlIG9mIGhlYWRlciBmaWxlcyBpbiB0aGUgcmVhZGxpbmUgbW9kdWxlLCB0byBtYWtlCiAgaXQgY29tcGlsZSAoYWxiZWl0IHdpdGggc29tZSB3YXJuaW5ncykgd2l0aCB0aGUgdmVyeSByZWNlbnQgcmVhZGxpbmUKICA0LjIsIHdpdGhvdXQgYnJlYWtpbmcgZm9yIGVhcmxpZXIgdmVyc2lvbnMuCgotIEhvcGVmdWxseSBmaXhlZCBhIGJ1ZmZlcmluZyBwcm9ibGVtIGluIGxpbnV4YXVkaW9kZXYuCgotIEF0dGVtcHRlZCBhIGZpeCB0byBtYWtlIHRoZSBPcGVuU1NMIHN1cHBvcnQgaW4gdGhlIHNvY2tldCBtb2R1bGUKICB3b3JrIGFnYWluIHdpdGggcHJlLTAuOS41IHZlcnNpb25zIG9mIE9wZW5TU0wuCgpUZXN0cwoKLSBBZGRlZCBhIHRlc3QgY2FzZSBmb3IgYXN5bmNoYXQgYW5kIGFzeW5jb3JlLgoKLSBSZW1vdmVkIGNvdXBsaW5nIGJldHdlZW4gdGVzdHMgd2hlcmUgb25lIHRlc3QgZmFpbGluZyBjb3VsZCBicmVhawogIGFub3RoZXIuCgpUb29scwoKLSBQaW5nIGFkZGVkIGFuIGludGVyYWN0aXZlIGhlbHAgYnJvd3NlciB0byBweWRvYywgZml4ZWQgc29tZSBuaXRzCiAgaW4gdGhlIHJlc3Qgb2YgdGhlIHB5ZG9jIGNvZGUsIGFuZCBhZGRlZCBzb21lIGZlYXR1cmVzIHRvIGhpcwogIGluc3BlY3QgbW9kdWxlLgoKLSBBbiB1cGRhdGVkIHB5dGhvbi1tb2RlLmVsIHZlcnNpb24gNC4xIHdoaWNoIGludGVncmF0ZXMgS2VuCiAgTWFuaGVpbWVyJ3MgcGRidHJhY2suZWwuICBUaGlzIG1ha2VzIGRlYnVnZ2luZyBQeXRob24gY29kZSB2aWEgcGRiCiAgbXVjaCBuaWNlciBpbiBYRW1hY3MgYW5kIEVtYWNzLiAgV2hlbiBzdGVwcGluZyB0aHJvdWdoIHlvdXIgcHJvZ3JhbQogIHdpdGggcGRiLCBpbiBlaXRoZXIgdGhlIHNoZWxsIHdpbmRvdyBvciB0aGUgKlB5dGhvbiogd2luZG93LCB0aGUKICBzb3VyY2UgZmlsZSBhbmQgbGluZSB3aWxsIGJlIHRyYWNrZWQgYnkgYW4gYXJyb3cuICBWZXJ5IGNvb2whCgotIElETEU6IHN5bnRheCB3YXJuaW5ncyBpbiBpbnRlcmFjdGl2ZSBtb2RlIGFyZSBjaGFuZ2VkIGludG8gZXJyb3JzLgoKLSBTb21lIGltcHJvdmVtZW50cyB0byBUb29scy93ZWJjaGVja2VyIChpZ25vcmUgc29tZSBtb3JlIFVSTCB0eXBlcywKICBmb2xsb3cgc29tZSBtb3JlIGxpbmtzKS4KCi0gQnJvdWdodCB0aGUgVG9vbHMvY29tcGlsZXIgcGFja2FnZSB1cCB0byBkYXRlLgoKCldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMSBiZXRhIDI/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgooVW5saXN0ZWQgYXJlIG1hbnkgZml4ZWQgYnVncywgbW9yZSBkb2N1bWVudGF0aW9uLCBldGMuKQoKQ29yZSBsYW5ndWFnZSwgYnVpbHRpbnMsIGFuZCBpbnRlcnByZXRlcgoKLSBUaGUgbmVzdGVkIHNjb3BlcyB3b3JrIChlbmFibGVkIGJ5ICJmcm9tIF9fZnV0dXJlX18gaW1wb3J0CiAgbmVzdGVkX3Njb3BlcyIpIGlzIGNvbXBsZXRlZDsgaW4gcGFydGljdWxhciwgdGhlIGZ1dHVyZSBub3cgZXh0ZW5kcwogIGludG8gY29kZSBleGVjdXRlZCB0aHJvdWdoIGV4ZWMsIGV2YWwoKSBhbmQgZXhlY2ZpbGUoKSwgYW5kIGludG8gdGhlCiAgaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIuCgotIFdoZW4gY2FsbGluZyBhIGJhc2UgY2xhc3MgbWV0aG9kIChlLmcuIEJhc2VDbGFzcy5fX2luaXRfXyhzZWxmKSksCiAgdGhpcyBpcyBub3cgYWxsb3dlZCBldmVuIGlmIHNlbGYgaXMgbm90IHN0cmljdGx5IHNwb2tlbiBhIGNsYXNzCiAgaW5zdGFuY2UgKGUuZy4gd2hlbiB1c2luZyBtZXRhY2xhc3NlcyBvciB0aGUgRG9uIEJlYXVkcnkgaG9vaykuCgotIFNsaWNlIG9iamVjdHMgYXJlIG5vdyBjb21wYXJhYmxlIGJ1dCBub3QgaGFzaGFibGU7IHRoaXMgcHJldmVudHMKICBkaWN0WzpdIGZyb20gYmVpbmcgYWNjZXB0ZWQgYnV0IG1lYW5pbmdsZXNzLgoKLSBDb21wbGV4IGRpdmlzaW9uIGlzIG5vdyBjYWxjdWxhdGVkIHVzaW5nIGxlc3MgYnJhaW5kZWFkIGFsZ29yaXRobXMuCiAgVGhpcyBkb2Vzbid0IGNoYW5nZSBzZW1hbnRpY3MgZXhjZXB0IGl0J3MgbW9yZSBsaWtlbHkgdG8gZ2l2ZSB1c2VmdWwKICByZXN1bHRzIGluIGV4dHJlbWUgY2FzZXMuICBDb21wbGV4IHJlcHIoKSBub3cgdXNlcyBmdWxsIHByZWNpc2lvbgogIGxpa2UgZmxvYXQgcmVwcigpLgoKLSBzZ21sbGliLnB5IG5vdyBjYWxscyBoYW5kbGVfZGVjbCgpIGZvciBzaW1wbGUgPCEuLi4+IGRlY2xhcmF0aW9ucy4KCi0gSXQgaXMgaWxsZWdhbCB0byBhc3NpZ24gdG8gdGhlIG5hbWUgX19kZWJ1Z19fLCB3aGljaCBpcyBzZXQgd2hlbiB0aGUKICBpbnRlcnByZXRlciBzdGFydHMuICBJdCBpcyBlZmZlY3RpdmVseSBhIGNvbXBpbGUtdGltZSBjb25zdGFudC4KCi0gQSB3YXJuaW5nIHdpbGwgYmUgaXNzdWVkIGlmIGEgZ2xvYmFsIHN0YXRlbWVudCBmb3IgYSB2YXJpYWJsZQogIGZvbGxvd3MgYSB1c2Ugb3IgYXNzaWdubWVudCBvZiB0aGF0IHZhcmlhYmxlLgoKU3RhbmRhcmQgbGlicmFyeQoKLSB1bml0dGVzdC5weSwgYSB1bml0IHRlc3RpbmcgZnJhbWV3b3JrIGJ5IFN0ZXZlIFB1cmNlbGwgKFB5VU5JVCwKICBpbnNwaXJlZCBieSBKVW5pdCksIGlzIG5vdyBwYXJ0IG9mIHRoZSBzdGFuZGFyZCBsaWJyYXJ5LiAgWW91IG5vdwogIGhhdmUgYSBjaG9pY2Ugb2YgdHdvIHRlc3RpbmcgZnJhbWV3b3JrczogdW5pdHRlc3QgcmVxdWlyZXMgeW91IHRvCiAgd3JpdGUgdGVzdGNhc2VzIGFzIHNlcGFyYXRlIGNvZGUsIGRvY3Rlc3QgZ2F0aGVycyB0aGVtIGZyb20KICBkb2NzdHJpbmdzLiAgQm90aCBhcHByb2FjaGVzIGhhdmUgdGhlaXIgYWR2YW50YWdlcyBhbmQKICBkaXNhZHZhbnRhZ2VzLgoKLSBBIG5ldyBtb2R1bGUgVGl4IHdhcyBhZGRlZCwgd2hpY2ggd3JhcHMgdGhlIFRpeCBleHRlbnNpb24gbGlicmFyeQogIGZvciBUay4gIFdpdGggdGhhdCBtb2R1bGUsIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gc3RhdGljYWxseSBsaW5rCiAgVGl4IHdpdGggX3RraW50ZXIsIHNpbmNlIFRpeCB3aWxsIGJlIGxvYWRlZCB3aXRoIFRjbCdzICJwYWNrYWdlCiAgcmVxdWlyZSIgY29tbWFuZC4gIFNlZSBEZW1vL3RpeC8uCgotIHR6cGFyc2UucHkgaXMgbm93IG9ic29sZXRlLgoKLSBJbiBnemlwLnB5LCB0aGUgc2VlaygpIGFuZCB0ZWxsKCkgbWV0aG9kcyBhcmUgcmVtb3ZlZCAtLSB0aGV5IHdlcmUKICBub24tZnVuY3Rpb25hbCBhbnl3YXksIGFuZCBpdCdzIGJldHRlciBpZiBjYWxsZXJzIGNhbiB0ZXN0IGZvciB0aGVpcgogIGV4aXN0ZW5jZSB3aXRoIGhhc2F0dHIoKS4KClB5dGhvbi9DIEFQSQoKLSBQeURpY3RfTmV4dCgpOiBpdCBpcyBub3cgc2FmZSB0byBjYWxsIFB5RGljdF9TZXRJdGVtKCkgd2l0aCBhIGtleQogIHRoYXQncyBhbHJlYWR5IGluIHRoZSBkaWN0aW9uYXJ5IGR1cmluZyBhIFB5RGljdF9OZXh0KCkgaXRlcmF0aW9uLgogIFRoaXMgdXNlZCB0byBmYWlsIG9jY2FzaW9uYWxseSB3aGVuIGEgZGljdGlvbmFyeSByZXNpemUgb3BlcmF0aW9uCiAgY291bGQgYmUgdHJpZ2dlcmVkIHRoYXQgd291bGQgcmVoYXNoIGFsbCB0aGUga2V5cy4gIEFsbCBvdGhlcgogIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGRpY3Rpb25hcnkgYXJlIHN0aWxsIG9mZi1saW1pdHMgZHVyaW5nIGEKICBQeURpY3RfTmV4dCgpIGl0ZXJhdGlvbiEKCi0gTmV3IGV4dGVuZGVkIEFQSXMgcmVsYXRlZCB0byBwYXNzaW5nIGNvbXBpbGVyIHZhcmlhYmxlcyBhcm91bmQuCgotIE5ldyBhYnN0cmFjdCBBUElzIFB5T2JqZWN0X0lzSW5zdGFuY2UoKSwgUHlPYmplY3RfSXNTdWJjbGFzcygpCiAgaW1wbGVtZW50IGlzaW5zdGFuY2UoKSBhbmQgaXNzdWJjbGFzcygpLgoKLSBQeV9CdWlsZFZhbHVlKCkgbm93IGhhcyBhICJEIiBjb252ZXJzaW9uIHRvIGNyZWF0ZSBhIFB5dGhvbiBjb21wbGV4CiAgbnVtYmVyIGZyb20gYSBQeV9jb21wbGV4IEMgdmFsdWUuCgotIEV4dGVuc2lvbnMgdHlwZXMgd2hpY2ggc3VwcG9ydCB3ZWFrIHJlZmVyZW5jZXMgbXVzdCBub3cgc2V0IHRoZQogIGZpZWxkIGFsbG9jYXRlZCBmb3IgdGhlIHdlYWsgcmVmZXJlbmNlIG1hY2hpbmVyeSB0byBOVUxMIHRoZW1zZWx2ZXM7CiAgdGhpcyBpcyBkb25lIHRvIGF2b2lkIHRoZSBjb3N0IG9mIGNoZWNraW5nIGVhY2ggb2JqZWN0IGZvciBoYXZpbmcgYQogIHdlYWtseSByZWZlcmVuY2FibGUgdHlwZSBpbiBQeU9iamVjdF9JTklUKCksIHNpbmNlIG1vc3QgdHlwZXMgYXJlCiAgbm90IHdlYWtseSByZWZlcmVuY2FibGUuCgotIFB5RnJhbWVfRmFzdFRvTG9jYWxzKCkgYW5kIFB5RnJhbWVfTG9jYWxzVG9GYXN0KCkgY29weSBiaW5kaW5ncyBmb3IKICBmcmVlIHZhcmlhYmxlcyBhbmQgY2VsbCB2YXJpYWJsZXMgdG8gYW5kIGZyb20gdGhlIGZyYW1lJ3MgZl9sb2NhbHMuCgotIFZhcmlhbnRzIG9mIHNldmVyYWwgZnVuY3Rpb25zIGRlZmluZWQgaW4gcHl0aG9ucnVuLmggaGF2ZSBiZWVuIGFkZGVkCiAgdG8gc3VwcG9ydCB0aGUgbmVzdGVkX3Njb3BlcyBmdXR1cmUgc3RhdGVtZW50LiAgVGhlIHZhcmlhbnRzIGFsbCBlbmQKICBpbiBGbGFncyBhbmQgdGFrZSBhbiBleHRyYSBhcmd1bWVudCwgYSBQeUNvbXBpbGVyRmxhZ3MgKjsgZXhhbXBsZXM6CiAgUHlSdW5fQW55RmlsZUV4RmxhZ3MoKSwgUHlSdW5fSW50ZXJhY3RpdmVMb29wRmxhZ3MoKS4gIFRoZXNlCiAgdmFyaWFudHMgbWF5IGJlIHJlbW92ZWQgaW4gUHl0aG9uIDIuMiwgd2hlbiBuZXN0ZWQgc2NvcGVzIGFyZQogIG1hbmRhdG9yeS4KCkRpc3R1dGlscwoKLSB0aGUgc2Rpc3QgY29tbWFuZCBub3cgd3JpdGVzIGEgUEtHLUlORk8gZmlsZSwgYXMgZGVzY3JpYmVkIGluIFBFUCAyNDEsCiAgaW50byB0aGUgcmVsZWFzZSB0cmVlLgoKLSBzZXZlcmFsIGVuaGFuY2VtZW50cyB0byB0aGUgYmRpc3Rfd2luaW5zdCBjb21tYW5kIGZyb20gVGhvbWFzIEhlbGxlcgogIChhbiB1bmluc3RhbGxlciwgbW9yZSBjdXN0b21pemF0aW9uIG9mIHRoZSBpbnN0YWxsZXIncyBkaXNwbGF5KQoKLSBmcm9tIEphY2sgSmFuc2VuOiBhZGRlZCBNYWMtc3BlY2lmaWMgY29kZSB0byBnZW5lcmF0ZSBhIGRpYWxvZyBmb3IKICB1c2VycyB0byBzcGVjaWZ5IHRoZSBjb21tYW5kLWxpbmUgKGJlY2F1c2UgcHJvdmlkaW5nIGEgY29tbWFuZC1saW5lIHdpdGgKICBNYWNQeXRob24gaXMgYXdrd2FyZCkuICBKYWNrIGFsc28gbWFkZSB2YXJpb3VzIGZpeGVzIGZvciB0aGUgTWFjCiAgYW5kIHRoZSBNZXRyb3dlcmtzIGNvbXBpbGVyLgoKLSBhZGRlZCAncGxhdGZvcm1zJyBhbmQgJ2tleXdvcmRzJyB0byB0aGUgc2V0IG9mIG1ldGFkYXRhIHRoYXQgY2FuIGJlCiAgc3BlY2lmaWVkIGZvciBhIGRpc3RyaWJ1dGlvbi4KCi0gYXBwbGllZCBwYXRjaGVzIGZyb20gSmFzb24gVGlzaGxlciB0byBtYWtlIHRoZSBjb21waWxlciBjbGFzcyB3b3JrIHdpdGgKICBDeWd3aW4uCgoKV2hhdCdzIE5ldyBpbiBQeXRob24gMi4xIGJldGEgMT8KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkNvcmUgbGFuZ3VhZ2UsIGJ1aWx0aW5zLCBhbmQgaW50ZXJwcmV0ZXIKCi0gRm9sbG93aW5nIGFuIG91dGNyeSBmcm9tIHRoZSBjb21tdW5pdHkgYWJvdXQgdGhlIGFtb3VudCBvZiBjb2RlCiAgYnJva2VuIGJ5IHRoZSBuZXN0ZWQgc2NvcGVzIGZlYXR1cmUgaW50cm9kdWNlZCBpbiAyLjFhMiwgd2UgZGVjaWRlZAogIHRvIG1ha2UgdGhpcyBmZWF0dXJlIG9wdGlvbmFsLCBhbmQgdG8gd2FpdCB1bnRpbCBQeXRob24gMi4yIChvciBhdAogIGxlYXN0IDYgbW9udGhzKSB0byBtYWtlIGl0IHN0YW5kYXJkLiAgVGhlIG9wdGlvbiBjYW4gYmUgZW5hYmxlZCBvbiBhCiAgcGVyLW1vZHVsZSBiYXNpcyBieSBhZGRpbmcgImZyb20gX19mdXR1cmVfXyBpbXBvcnQgbmVzdGVkX3Njb3BlcyIgYXQKICB0aGUgYmVnaW5uaW5nIG9mIGEgbW9kdWxlIChiZWZvcmUgYW55IG90aGVyIHN0YXRlbWVudHMsIGJ1dCBhZnRlcgogIGNvbW1lbnRzIGFuZCBhbiBvcHRpb25hbCBkb2NzdHJpbmcpLiAgU2VlIFBFUCAyMzYgKEJhY2sgdG8gdGhlCiAgX19mdXR1cmVfXykgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIF9fZnV0dXJlX18gc3RhdGVtZW50LiAgUEVQIDIyNwogIChTdGF0aWNhbGx5IE5lc3RlZCBTY29wZXMpIGhhcyBiZWVuIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGlzIGNoYW5nZSwKICBhbmQgdG8gY2xhcmlmeSB0aGUgc2VtYW50aWNzIGluIGEgbnVtYmVyIG9mIGVuZGNhc2VzLgoKLSBUaGUgbmVzdGVkIHNjb3BlcyBjb2RlLCB3aGVuIGVuYWJsZWQsIGhhcyBiZWVuIGhhcmRlbmVkLCBhbmQgbW9zdAogIGJ1Z3MgYW5kIG1lbW9yeSBsZWFrcyBpbiBpdCBoYXZlIGJlZW4gZml4ZWQuCgotIENvbXBpbGUtdGltZSB3YXJuaW5ncyBhcmUgbm93IGdlbmVyYXRlZCBmb3IgYSBudW1iZXIgb2YgY29uZGl0aW9ucwogIHRoYXQgd2lsbCBicmVhayBvciBjaGFuZ2UgaW4gbWVhbmluZyB3aGVuIG5lc3RlZCBzY29wZXMgYXJlIGVuYWJsZWQ6CgogIC0gVXNpbmcgImZyb20uLi5pbXBvcnQgKiIgb3IgImV4ZWMiIHdpdGhvdXQgaW4tY2xhdXNlIGluIGEgZnVuY3Rpb24KICAgIHNjb3BlIHRoYXQgYWxzbyBkZWZpbmVzIGEgbGFtYmRhIG9yIG5lc3RlZCBmdW5jdGlvbiB3aXRoIG9uZSBvcgogICAgbW9yZSBmcmVlIChub24tbG9jYWwpIHZhcmlhYmxlcy4gIFRoZSBwcmVzZW5jZSBvZiB0aGUgaW1wb3J0KiBvcgogICAgYmFyZSBleGVjIG1ha2VzIGl0IGltcG9zc2libGUgZm9yIHRoZSBjb21waWxlciB0byBkZXRlcm1pbmUgdGhlCiAgICBleGFjdCBzZXQgb2YgbG9jYWwgdmFyaWFibGVzIGluIHRoZSBvdXRlciBzY29wZSwgd2hpY2ggbWFrZXMgaXQKICAgIGltcG9zc2libGUgdG8gZGV0ZXJtaW5lIHRoZSBiaW5kaW5ncyBmb3IgZnJlZSB2YXJpYWJsZXMgaW4gdGhlCiAgICBpbm5lciBzY29wZS4gIFRvIGF2b2lkIHRoZSB3YXJuaW5nIGFib3V0IGltcG9ydCAqLCBjaGFuZ2UgaXQgaW50bwogICAgYW4gaW1wb3J0IG9mIGV4cGxpY2l0bHkgbmFtZSBvYmplY3QsIG9yIG1vdmUgdGhlIGltcG9ydCogc3RhdGVtZW50CiAgICB0byB0aGUgZ2xvYmFsIHNjb3BlOyB0byBhdm9pZCB0aGUgd2FybmluZyBhYm91dCBiYXJlIGV4ZWMsIHVzZQogICAgZXhlYy4uLmluLi4uIChhIGdvb2QgaWRlYSBhbnl3YXkgLS0gdGhlcmUncyBhIHBvc3NpYmlsaXR5IHRoYXQKICAgIGJhcmUgZXhlYyB3aWxsIGJlIGRlcHJlY2F0ZWQgaW4gdGhlIGZ1dHVyZSkuCgogIC0gVXNlIG9mIGEgZ2xvYmFsIHZhcmlhYmxlIGluIGEgbmVzdGVkIHNjb3BlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBhCiAgICBsb2NhbCB2YXJpYWJsZSBpbiBhIHN1cnJvdW5kaW5nIHNjb3BlLiAgVGhpcyB3aWxsIGNoYW5nZSBpbgogICAgbWVhbmluZyB3aXRoIG5lc3RlZCBzY29wZXM6IHRoZSBuYW1lIGluIHRoZSBpbm5lciBzY29wZSB3aWxsCiAgICByZWZlcmVuY2UgdGhlIHZhcmlhYmxlIGluIHRoZSBvdXRlciBzY29wZSByYXRoZXIgdGhhbiB0aGUgZ2xvYmFsCiAgICBvZiB0aGUgc2FtZSBuYW1lLiAgVG8gYXZvaWQgdGhlIHdhcm5pbmcsIGVpdGhlciByZW5hbWUgdGhlIG91dGVyCiAgICB2YXJpYWJsZSwgb3IgdXNlIGEgZ2xvYmFsIHN0YXRlbWVudCBpbiB0aGUgaW5uZXIgZnVuY3Rpb24uCgotIEFuIG9wdGlvbmFsIG9iamVjdCBhbGxvY2F0b3IgaGFzIGJlZW4gaW5jbHVkZWQuICBUaGlzIGFsbG9jYXRvciBpcwogIG9wdGltaXplZCBmb3IgUHl0aG9uIG9iamVjdHMgYW5kIHNob3VsZCBiZSBmYXN0ZXIgYW5kIHVzZSBsZXNzIG1lbW9yeQogIHRoYW4gdGhlIHN0YW5kYXJkIHN5c3RlbSBhbGxvY2F0b3IuICBJdCBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0CiAgYmVjYXVzZSBvZiBwb3NzaWJsZSB0aHJlYWQgc2FmZXR5IHByb2JsZW1zLiAgVGhlIGFsbG9jYXRvciBpcyBvbmx5CiAgcHJvdGVjdGVkIGJ5IHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgbG9jayBhbmQgaXQgaXMgcG9zc2libGUgdGhhdCBzb21lCiAgZXh0ZW5zaW9uIG1vZHVsZXMgcmVxdWlyZSBhIHRocmVhZCBzYWZlIGFsbG9jYXRvci4gIFRoZSBvYmplY3QKICBhbGxvY2F0b3IgY2FuIGJlIGVuYWJsZWQgYnkgcHJvdmlkaW5nIHRoZSAiLS13aXRoLXB5bWFsbG9jIiBvcHRpb24gdG8KICBjb25maWd1cmUuCgpTdGFuZGFyZCBsaWJyYXJ5CgotIHB5ZXhwYXQgbm93IGRldGVjdHMgdGhlIGV4cGF0IHZlcnNpb24gaWYgZXhwYXQuaCBkZWZpbmVzIGl0LiBBCiAgbnVtYmVyIG9mIGFkZGl0aW9uYWwgaGFuZGxlcnMgYXJlIHByb3ZpZGVkLCB3aGljaCBhcmUgb25seSBhdmFpbGFibGUKICBzaW5jZSBleHBhdCAxLjk1LiBJbiBhZGRpdGlvbiwgdGhlIG1ldGhvZHMgU2V0UGFyYW1FbnRpdHlQYXJzaW5nIGFuZAogIEdldElucHV0Q29udGV4dCBvZiBQYXJzZXIgb2JqZWN0cyBhcmUgYXZhaWxhYmxlIHdpdGggMS45NS54CiAgb25seS4gUGFyc2VyIG9iamVjdHMgbm93IHByb3ZpZGUgdGhlIG9yZGVyZWRfYXR0cmlidXRlcyBhbmQKICBzcGVjaWZpZWRfYXR0cmlidXRlcyBhdHRyaWJ1dGVzLiBBIG5ldyBtb2R1bGUgZXhwYXQubW9kZWwgd2FzIGFkZGVkLAogIHdoaWNoIG9mZmVycyBhIG51bWJlciBvZiBhZGRpdGlvbmFsIGNvbnN0YW50cyBpZiAxLjk1LnggaXMgdXNlZC4KCi0geG1sLmRvbSBvZmZlcnMgdGhlIG5ldyBmdW5jdGlvbnMgcmVnaXN0ZXJET01JbXBsZW1lbnRhdGlvbiBhbmQKICBnZXRET01JbXBsZW1lbnRhdGlvbi4KCi0geG1sLmRvbS5taW5pZG9tIG9mZmVycyBhIHRvcHJldHR5eG1sIG1ldGhvZC4gQSBudW1iZXIgb2YgRE9NCiAgY29uZm9ybWFuY2UgaXNzdWVzIGhhdmUgYmVlbiByZXNvbHZlZC4gSW4gcGFydGljdWxhciwgRWxlbWVudCBub3cKICBoYXMgYW4gaGFzQXR0cmlidXRlcyBtZXRob2QsIGFuZCB0aGUgaGFuZGxpbmcgb2YgbmFtZXNwYWNlcyB3YXMKICBpbXByb3ZlZC4KCi0gS2EtUGluZyBZZWUgY29udHJpYnV0ZWQgdHdvIG5ldyBtb2R1bGVzOiBpbnNwZWN0LnB5LCBhIG1vZHVsZSBmb3IKICBnZXR0aW5nIGluZm9ybWF0aW9uIGFib3V0IGxpdmUgUHl0aG9uIGNvZGUsIGFuZCBweWRvYy5weSwgYSBtb2R1bGUKICBmb3IgaW50ZXJhY3RpdmVseSBjb252ZXJ0aW5nIGRvY3N0cmluZ3MgdG8gSFRNTCBvciB0ZXh0LgogIFRvb2xzL3NjcmlwdHMvcHlkb2MsIHdoaWNoIGlzIG5vdyBhdXRvbWF0aWNhbGx5IGluc3RhbGxlZCBpbnRvCiAgPHByZWZpeD4vYmluLCB1c2VzIHB5ZG9jLnB5IHRvIGRpc3BsYXkgZG9jdW1lbnRhdGlvbjsgdHJ5IHJ1bm5pbmcKICAicHlkb2MgLWgiIGZvciBpbnN0cnVjdGlvbnMuICAicHlkb2MgLWciIHBvcHMgdXAgYSBzbWFsbCBHVUkgdGhhdAogIGxldHMgeW91IGJyb3dzZSB0aGUgbW9kdWxlIGRvY3N0cmluZ3MgdXNpbmcgYSB3ZWIgYnJvd3Nlci4KCi0gTmV3IGxpYnJhcnkgbW9kdWxlIGRpZmZsaWIucHksIHByaW1hcmlseSBwYWNrYWdpbmcgdGhlIFNlcXVlbmNlTWF0Y2hlcgogIGNsYXNzIGF0IHRoZSBoZWFydCBvZiB0aGUgcG9wdWxhciBuZGlmZi5weSBmaWxlLWNvbXBhcmlzb24gdG9vbC4KCi0gZG9jdGVzdC5weSAoYSBmcmFtZXdvcmsgZm9yIHZlcmlmeWluZyBQeXRob24gY29kZSBleGFtcGxlcyBpbiBkb2NzdHJpbmdzKQogIGlzIG5vdyBwYXJ0IG9mIHRoZSBzdGQgbGlicmFyeS4KCldpbmRvd3MgY2hhbmdlcwoKLSBBIG5ldyBlbnRyeSBpbiB0aGUgU3RhcnQgbWVudSwgIk1vZHVsZSBEb2NzIiwgcnVucyAicHlkb2MgLWciIC0tIGEKICBzbWFsbCBHVUkgdGhhdCBsZXRzIHlvdSBicm93c2UgdGhlIG1vZHVsZSBkb2NzdHJpbmdzIHVzaW5nIHlvdXIKICBkZWZhdWx0IHdlYiBicm93c2VyLgoKLSBJbXBvcnQgaXMgbm93IGNhc2Utc2Vuc2l0aXZlLiAgUEVQIDIzNSAoSW1wb3J0IG9uIENhc2UtSW5zZW5zaXRpdmUKICBQbGF0Zm9ybXMpIGlzIGltcGxlbWVudGVkLiAgU2VlCgogICAgICBodHRwOi8vcHl0aG9uLnNvdXJjZWZvcmdlLm5ldC9wZXBzL3BlcC0wMjM1Lmh0bWwKCiAgZm9yIGZ1bGwgZGV0YWlscywgZXNwZWNpYWxseSB0aGUgIkN1cnJlbnQgTG93ZXItTGVmdCBTZW1hbnRpY3MiIHNlY3Rpb24uCiAgVGhlIG5ldyBXaW5kb3dzIGltcG9ydCBydWxlcyBhcmUgc2ltcGxlciB0aGFuIGJlZm9yZToKCiAgQS4gSWYgdGhlIFBZVEhPTkNBU0VPSyBlbnZpcm9ubWVudCB2YXJpYWJsZSBleGlzdHMsIHNhbWUgYXMKICAgICBiZWZvcmU6ICBzaWxlbnRseSBhY2NlcHQgdGhlIGZpcnN0IGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2ggb2YgYW55CiAgICAga2luZDsgcmFpc2UgSW1wb3J0RXJyb3IgaWYgbm9uZSBmb3VuZC4KCiAgQi4gRWxzZSBzZWFyY2ggc3lzLnBhdGggZm9yIHRoZSBmaXJzdCBjYXNlLXNlbnNpdGl2ZSBtYXRjaDsgcmFpc2UKICAgICBJbXBvcnRFcnJvciBpZiBub25lIGZvdW5kLgoKICBUaGUgc2FtZSBydWxlcyBoYXZlIGJlZW4gaW1wbGVudGVkIG9uIG90aGVyIHBsYXRmb3JtcyB3aXRoIGNhc2UtCiAgaW5zZW5zaXRpdmUgYnV0IGNhc2UtcHJlc2VydmluZyBmaWxlc3lzdGVtcyB0b28gKGluY2x1ZGluZyBDeWd3aW4sIGFuZAogIHNldmVyYWwgZmxhdm9ycyBvZiBNYWNpbnRvc2ggb3BlcmF0aW5nIHN5c3RlbXMpLgoKLSB3aW5zb3VuZCBtb2R1bGU6ICBVbmRlciBXaW45eCwgd2luc291bmQuQmVlcCgpIG5vdyBhdHRlbXB0cyB0byBzaW11bGF0ZQogIHdoYXQgaXQncyBzdXBwb3NlZCB0byBkbyAoYW5kIGRvZXMgZG8gdW5kZXIgTlQgYW5kIDIwMDApIHZpYSBkaXJlY3QKICBwb3J0IG1hbmlwdWxhdGlvbi4gIEl0J3MgdW5rbm93biB3aGV0aGVyIHRoaXMgd2lsbCB3b3JrIG9uIGFsbCBzeXN0ZW1zLAogIGJ1dCBpdCBkb2VzIHdvcmsgb24gbXkgV2luOThTRSBzeXN0ZW1zIG5vdyBhbmQgd2FzIGtub3duIHRvIGJlIHVzZWxlc3Mgb24KICBhbGwgV2luOXggc3lzdGVtcyBiZWZvcmUuCgotIEJ1aWxkOiAgU3VicHJvamVjdCBfdGVzdCAoZWZmZWN0aXZlbHkpIHJlbmFtZWQgdG8gX3Rlc3RjYXBpLgoKTmV3IHBsYXRmb3JtcwoKLSAyLjEgc2hvdWxkIGNvbXBpbGUgYW5kIHJ1biBvdXQgb2YgdGhlIGJveCB1bmRlciBNYWNPUyBYLCBldmVuIHVzaW5nIEhGUysuCiAgVGhhbmtzIHRvIFN0ZXZlbiBNYWpld3NraSEKCi0gMi4xIHNob3VsZCBjb21waWxlIGFuZCBydW4gb3V0IG9mIHRoZSBib3ggb24gQ3lnd2luLiAgVGhhbmtzIHRvIEphc29uCiAgVGlzaGxlciEKCi0gMi4xIGNvbnRhaW5zIG5ldyBmaWxlcyBhbmQgcGF0Y2hlcyBmb3IgUklTQ09TLCB0aGFua3MgdG8gRGlldG1hcgogIFNjaHdlcnRiZXJnZXIhICBTZWUgUklTQ09TL1JFQURNRSBmb3IgbW9yZSBpbmZvcm1hdGlvbiAtLSBpdCBzZWVtcwogIHRoYXQgYmVjYXVzZSBvZiB0aGUgYml6YXJyZSBmaWxlbmFtZSBjb252ZW50aW9ucyBvbiBSSVNDT1MsIG5vIHBvcnQKICB0byB0aGF0IHBsYXRmb3JtIGlzIGVhc3kuICBOb3RlIHRoYXQgdGhlIG5ldyB2YXJpYWJsZSBvcy5lbmRzZXAgaXMKICBzaWxlbnRseSBzdXBwb3J0ZWQgaW4gb3JkZXIgdG8gbWFrZSBsaWZlIGVhc2llciBvbiB0aGlzIHBsYXRmb3JtLAogIGJ1dCB3ZSBkb24ndCBhZHZlcnRpc2UgaXQgYmVjYXVzZSBpdCdzIG5vdCB3b3J0aCBmb3IgbW9zdCBmb2xrcyB0bwogIGNhcmUgYWJvdXQgUklTQ09TIHBvcnRhYmlsaXR5LgoKCldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMSBhbHBoYSAyPwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkNvcmUgbGFuZ3VhZ2UsIGJ1aWx0aW5zLCBhbmQgaW50ZXJwcmV0ZXIKCi0gU2NvcGVzIG5lc3QuICBJZiBhIG5hbWUgaXMgdXNlZCBpbiBhIGZ1bmN0aW9uIG9yIGNsYXNzLCBidXQgaXMgbm90CiAgbG9jYWwsIHRoZSBkZWZpbml0aW9uIGluIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBmdW5jdGlvbiBzY29wZSB3aWxsCiAgYmUgdXNlZC4gIE9uZSBjb25zZXF1ZW5jZSBvZiB0aGlzIGNoYW5nZSBpcyB0aGF0IGxhbWJkYSBzdGF0ZW1lbnRzCiAgY291bGQgcmVmZXJlbmNlIHZhcmlhYmxlcyBpbiB0aGUgbmFtZXNwYWNlcyB3aGVyZSB0aGUgbGFtYmRhIGlzCiAgZGVmaW5lZC4gIEluIHNvbWUgdW51c3VhbCBjYXNlcywgdGhpcyBjaGFuZ2Ugd2lsbCBicmVhayBjb2RlLgoKICBJbiBhbGwgcHJldmlvdXMgdmVyc2lvbiBvZiBQeXRob24sIG5hbWVzIHdlcmUgcmVzb2x2ZWQgaW4gZXhhY3RseQogIHRocmVlIG5hbWVzcGFjZXMgLS0gdGhlIGxvY2FsIG5hbWVzcGFjZSwgdGhlIGdsb2JhbCBuYW1lc3BhY2UsIGFuZAogIHRoZSBidWlsdGluIG5hbWVzcGFjZS4gIEFjY29yZGluZyB0byB0aGlzIG9sZCBkZWZpbml0aW9uLCBpZiBhCiAgZnVuY3Rpb24gQSBpcyBkZWZpbmVkIHdpdGhpbiBhIGZ1bmN0aW9uIEIsIHRoZSBuYW1lcyBib3VuZCBpbiBCIGFyZQogIG5vdCB2aXNpYmxlIGluIEEuICBUaGUgbmV3IHJ1bGVzIG1ha2UgbmFtZXMgYm91bmQgaW4gQiB2aXNpYmxlIGluIEEsCiAgdW5sZXNzIEEgY29udGFpbnMgYSBuYW1lIGJpbmRpbmcgdGhhdCBoaWRlcyB0aGUgYmluZGluZyBpbiBCLgoKICBTZWN0aW9uIDQuMSBvZiB0aGUgcmVmZXJlbmNlIG1hbnVhbCBkZXNjcmliZXMgdGhlIG5ldyBzY29waW5nIHJ1bGVzCiAgaW4gZGV0YWlsLiAgVGhlIHRlc3Qgc2NyaXB0IGluIExpYi90ZXN0L3Rlc3Rfc2NvcGUucHkgZGVtb25zdHJhdGVzCiAgc29tZSBvZiB0aGUgZWZmZWN0cyBvZiB0aGUgY2hhbmdlLgoKICBUaGUgbmV3IHJ1bGVzIHdpbGwgY2F1c2UgZXhpc3RpbmcgY29kZSB0byBicmVhayBpZiBpdCBkZWZpbmVzIG5lc3RlZAogIGZ1bmN0aW9ucyB3aGVyZSBhbiBvdXRlciBmdW5jdGlvbiBoYXMgbG9jYWwgdmFyaWFibGVzIHdpdGggdGhlIHNhbWUKICBuYW1lIGFzIGdsb2JhbHMgb3IgYnVpbHRpbnMgdXNlZCBieSB0aGUgaW5uZXIgZnVuY3Rpb24uICBFeGFtcGxlOgoKICAgIGRlZiBtdW5nZShzdHIpOgogICAgICAgIGRlZiBoZWxwZXIoeCk6CiAgICAgICAgICAgIHJldHVybiBzdHIoeCkKICAgICAgICBpZiB0eXBlKHN0cikgIT0gdHlwZSgnJyk6CiAgICAgICAgICAgIHN0ciA9IGhlbHBlcihzdHIpCiAgICAgICAgcmV0dXJuIHN0ci5zdHJpcCgpCgogIFVuZGVyIHRoZSBvbGQgcnVsZXMsIHRoZSBuYW1lIHN0ciBpbiBoZWxwZXIoKSBpcyBib3VuZCB0byB0aGUKICBidWlsdGluIGZ1bmN0aW9uIHN0cigpLiAgVW5kZXIgdGhlIG5ldyBydWxlcywgaXQgd2lsbCBiZSBib3VuZCB0bwogIHRoZSBhcmd1bWVudCBuYW1lZCBzdHIgYW5kIGFuIGVycm9yIHdpbGwgb2NjdXIgd2hlbiBoZWxwZXIoKSBpcwogIGNhbGxlZC4KCi0gVGhlIGNvbXBpbGVyIHdpbGwgcmVwb3J0IGEgU3ludGF4RXJyb3IgaWYgImZyb20gLi4uIGltcG9ydCAqIiBvY2N1cnMKICBpbiBhIGZ1bmN0aW9uIG9yIGNsYXNzIHNjb3BlLiAgVGhlIGxhbmd1YWdlIHJlZmVyZW5jZSBoYXMgZG9jdW1lbnRlZAogIHRoYXQgdGhpcyBjYXNlIGlzIGlsbGVnYWwsIGJ1dCB0aGUgY29tcGlsZXIgbmV2ZXIgY2hlY2tlZCBmb3IgaXQuCiAgVGhlIHJlY2VudCBpbnRyb2R1Y3Rpb24gb2YgbmVzdGVkIHNjb3BlIG1ha2VzIHRoZSBtZWFuaW5nIG9mIHRoaXMKICBmb3JtIG9mIG5hbWUgYmluZGluZyBhbWJpZ3VvdXMuICBJbiBhIGZ1dHVyZSByZWxlYXNlLCB0aGUgY29tcGlsZXIKICBtYXkgYWxsb3cgdGhpcyBmb3JtIHdoZW4gdGhlcmUgaXMgbm8gcG9zc2liaWxpdHkgb2YgYW1iaWd1aXR5LgoKLSByZXByKHN0cmluZykgaXMgZWFzaWVyIHRvIHJlYWQsIG5vdyB1c2luZyBoZXggZXNjYXBlcyBpbnN0ZWFkIG9mIG9jdGFsLAogIGFuZCB1c2luZyBcdCwgXG4gYW5kIFxyIGluc3RlYWQgb2YgXDAxMSwgXDAxMiBhbmQgXDAxNSAocmVzcGVjdGl2ZWx5KToKCiAgPj4+ICJcdGV4YW1wbGUgXHJcbiIgKyBjaHIoMCkgKyBjaHIoMjU1KQogICdcdGV4YW1wbGUgXHJcblx4MDBceGZmJyAgICAgICAgICMgaW4gMi4xCiAgJ1wwMTFleGFtcGxlIFwwMTVcMDEyXDAwMFwzNzcnICAgIyBpbiAyLjAKCi0gRnVuY3Rpb25zIGFyZSBub3cgY29tcGFyZWQgYW5kIGhhc2hlZCBieSBpZGVudGl0eSwgbm90IGJ5IHZhbHVlLCBzaW5jZQogIHRoZSBmdW5jX2NvZGUgYXR0cmlidXRlIGlzIHdyaXRhYmxlLgoKLSBXZWFrIHJlZmVyZW5jZXMgKFBFUCAyMDUpIGhhdmUgYmVlbiBhZGRlZC4gIFRoaXMgaW52b2x2ZXMgYSBmZXcKICBjaGFuZ2VzIGluIHRoZSBjb3JlLCBhbiBleHRlbnNpb24gbW9kdWxlIChfd2Vha3JlZiksIGFuZCBhIFB5dGhvbgogIG1vZHVsZSAod2Vha3JlZikuICBUaGUgd2Vha3JlZiBtb2R1bGUgaXMgdGhlIHB1YmxpYyBpbnRlcmZhY2UuICBJdAogIGluY2x1ZGVzIHN1cHBvcnQgZm9yICJleHBsaWNpdCIgd2VhayByZWZlcmVuY2VzLCBwcm94eSBvYmplY3RzLCBhbmQKICBtYXBwaW5ncyB3aXRoIHdlYWtseSBoZWxkIHZhbHVlcy4KCi0gQSAnY29udGludWUnIHN0YXRlbWVudCBjYW4gbm93IGFwcGVhciBpbiBhIHRyeSBibG9jayB3aXRoaW4gdGhlIGJvZHkKICBvZiBhIGxvb3AuICBJdCBpcyBzdGlsbCBub3QgcG9zc2libGUgdG8gdXNlIGNvbnRpbnVlIGluIGEgZmluYWxseQogIGNsYXVzZS4KClN0YW5kYXJkIGxpYnJhcnkKCi0gbWFpbGJveC5weSBub3cgaGFzIGEgbmV3IGNsYXNzLCBQb3J0YWJsZVVuaXhNYWlsYm94IHdoaWNoIGlzCiAgaWRlbnRpY2FsIHRvIFVuaXhNYWlsYm94IGJ1dCB1c2VzIGEgbW9yZSBwb3J0YWJsZSBzY2hlbWUgZm9yCiAgZGV0ZXJtaW5pbmcgRnJvbV8gc2VwYXJhdG9ycy4gIEFsc28sIHRoZSBjb25zdHJ1Y3RvcnMgZm9yIGFsbCB0aGUKICBjbGFzc2VzIGluIHRoaXMgbW9kdWxlIGhhdmUgYSBuZXcgb3B0aW9uYWwgYGZhY3RvcnknIGFyZ3VtZW50LCB3aGljaAogIGlzIGEgY2FsbGFibGUgdXNlZCB3aGVuIG5ldyBtZXNzYWdlIGNsYXNzZXMgbXVzdCBiZSBpbnN0YW50aWF0ZWQgYnkKICB0aGUgbmV4dCgpIG1ldGhvZC4KCi0gcmFuZG9tLnB5IGlzIG5vdyBzZWxmLWNvbnRhaW5lZCwgYW5kIG9mZmVycyBhbGwgdGhlIGZ1bmN0aW9uYWxpdHkgb2YKICB0aGUgbm93LWRlcHJlY2F0ZWQgd2hyYW5kb20ucHkuICBTZWUgdGhlIGRvY3MgZm9yIGRldGFpbHMuICByYW5kb20ucHkKICBhbHNvIHN1cHBvcnRzIG5ldyBmdW5jdGlvbnMgZ2V0c3RhdGUoKSBhbmQgc2V0c3RhdGUoKSwgZm9yIHNhdmluZwogIGFuZCByZXN0b3JpbmcgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBnZW5lcmF0b3I7IGFuZCBqdW1wYWhlYWQobiksCiAgZm9yIHF1aWNrbHkgZm9yY2luZyB0aGUgaW50ZXJuYWwgc3RhdGUgdG8gYmUgdGhlIHNhbWUgYXMgaWYgbiBjYWxscyB0bwogIHJhbmRvbSgpIGhhZCBiZWVuIG1hZGUuICBUaGUgbGF0dGVyIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIG11bHRpLQogIHRocmVhZGVkIHByb2dyYW1zLCBjcmVhdGluZyBvbmUgaW5zdGFuY2Ugb2YgdGhlIHJhbmRvbS5SYW5kb20oKSBjbGFzcyBmb3IKICBlYWNoIHRocmVhZCwgdGhlbiB1c2luZyAuanVtcGFoZWFkKCkgdG8gZm9yY2UgZWFjaCBpbnN0YW5jZSB0byB1c2UgYQogIG5vbi1vdmVybGFwcGluZyBzZWdtZW50IG9mIHRoZSBmdWxsIHBlcmlvZC4KCi0gcmFuZG9tLnB5J3Mgc2VlZCgpIGZ1bmN0aW9uIGlzIG5ldy4gIEZvciBiaXQtZm9yLWJpdCBjb21wYXRpYmlsaXR5IHdpdGgKICBwcmlvciByZWxlYXNlcywgdXNlIHRoZSB3aHNlZWQgZnVuY3Rpb24gaW5zdGVhZC4gIFRoZSBuZXcgc2VlZCBmdW5jdGlvbgogIGFkZHJlc3NlcyB0d28gcHJvYmxlbXM6ICAoMSkgVGhlIG9sZCBmdW5jdGlvbiBjb3VsZG4ndCBwcm9kdWNlIG1vcmUgdGhhbgogIGFib3V0IDIqKjI0IGRpc3RpbmN0IGludGVybmFsIHN0YXRlczsgdGhlIG5ldyBvbmUgYWJvdXQgMioqNDUgKHRoZSBiZXN0CiAgdGhhdCBjYW4gYmUgZG9uZSBpbiB0aGUgV2ljaG1hbm4tSGlsbCBnZW5lcmF0b3IpLiAgKDIpIFRoZSBvbGQgZnVuY3Rpb24KICBzb21ldGltZXMgcHJvZHVjZWQgaWRlbnRpY2FsIGludGVybmFsIHN0YXRlcyB3aGVuIHBhc3NlZCBkaXN0aW5jdAogIGludGVnZXJzLCBhbmQgdGhlcmUgd2FzIG5vIHNpbXBsZSB3YXkgdG8gcHJlZGljdCB3aGVuIHRoYXQgd291bGQgaGFwcGVuOwogIHRoZSBuZXcgb25lIGd1YXJhbnRlZXMgdG8gcHJvZHVjZSBkaXN0aW5jdCBpbnRlcm5hbCBzdGF0ZXMgZm9yIGFsbAogIGFyZ3VtZW50cyBpbiBbMCwgMjc4MTQ0MzE0ODY1NzZMKS4KCi0gVGhlIHNvY2tldCBtb2R1bGUgbm93IHN1cHBvcnRzIHJhdyBwYWNrZXRzIG9uIExpbnV4LiAgVGhlIHNvY2tldAogIGZhbWlseSBpcyBBRl9QQUNLRVQuCgotIHRlc3RfY2FwaS5weSBpcyBhIHN0YXJ0IGF0IHJ1bm5pbmcgdGVzdHMgb2YgdGhlIFB5dGhvbiBDIEFQSS4gIFRoZSB0ZXN0cwogIGFyZSBpbXBsZW1lbnRlZCBieSB0aGUgbmV3IE1vZHVsZXMvX3Rlc3Rtb2R1bGUuYy4KCi0gQSBuZXcgZXh0ZW5zaW9uIG1vZHVsZSwgX3N5bXRhYmxlLCBwcm92aWRlcyBwcm92aXNpb25hbCBhY2Nlc3MgdG8gdGhlCiAgaW50ZXJuYWwgc3ltYm9sIHRhYmxlIHVzZWQgYnkgdGhlIFB5dGhvbiBjb21waWxlci4gIEEgaGlnaGVyLWxldmVsCiAgaW50ZXJmYWNlIHdpbGwgYmUgYWRkZWQgb24gdG9wIG9mIF9zeW10YWJsZSBpbiBhIGZ1dHVyZSByZWxlYXNlLgoKLSBSZW1vdmVkIHRoZSBvYnNvbGV0ZSBzb3VuZGV4IG1vZHVsZS4KCi0geG1sLmRvbS5taW5pZG9tIG5vdyB1c2VzIHRoZSBzdGFuZGFyZCBET00gZXhjZXB0aW9ucy4gTm9kZSBzdXBwb3J0cwogIHRoZSBpc1NhbWVOb2RlIG1ldGhvZDsgTmFtZWROb2RlTWFwIHRoZSBnZXQgbWV0aG9kLgoKLSB4bWwuc2F4LmV4cGF0cmVhZGVyIHN1cHBvcnRzIHRoZSBsZXhpY2FsIGhhbmRsZXIgcHJvcGVydHk7IGl0CiAgZ2VuZXJhdGVzIGNvbW1lbnQsIHN0YXJ0Q0RBVEEsIGFuZCBlbmRDREFUQSBldmVudHMuCgpXaW5kb3dzIGNoYW5nZXMKCi0gQnVpbGQgcHJvY2VkdXJlOiAgdGhlIHpsaWIgcHJvamVjdCBpcyBidWlsdCBpbiBhIGRpZmZlcmVudCB3YXkgdGhhdAogIGVuc3VyZXMgdGhlIHpsaWIgaGVhZGVyIGZpbGVzIHVzZWQgY2FuIG5vIGxvbmdlciBnZXQgb3V0IG9mIHN5bmNoIHdpdGgKICB0aGUgemxpYiBiaW5hcnkgdXNlZC4gIFNlZSBQQ2J1aWxkXHJlYWRtZS50eHQgZm9yIGRldGFpbHMuICBZb3VyIG9sZAogIHpsaWItcmVsYXRlZCBkaXJlY3RvcmllcyBjYW4gYmUgZGVsZXRlZDsgeW91J2xsIG5lZWQgdG8gZG93bmxvYWQgZnJlc2gKICBzb3VyY2UgZm9yIHpsaWIgYW5kIHVucGFjayBpdCBpbnRvIGEgbmV3IGRpcmVjdG9yeS4KCi0gQnVpbGQ6ICBOZXcgc3VicHJvamVjdCBfdGVzdCBmb3IgdGhlIGJlbmVmaXQgb2YgdGVzdF9jYXBpLnB5IChzZWUgYWJvdmUpLgoKLSBCdWlsZDogIE5ldyBzdWJwcm9qZWN0IF9zeW10YWJsZSwgZm9yIG5ldyBETEwgX3N5bXRhYmxlLnB5ZCAoYSBuYXNjZW50CiAgaW50ZXJmYWNlIHRvIHNvbWUgUHl0aG9uIGNvbXBpbGVyIGludGVybmFscykuCgotIEJ1aWxkOiAgU3VicHJvamVjdCB1Y25oYXNoIGlzIGdvbmUsIHNpbmNlIHRoZSBjb2RlIHdhcyBmb2xkZWQgaW50byB0aGUKICB1bmljb2RlZGF0YSBzdWJwcm9qZWN0LgoKV2hhdCdzIE5ldyBpbiBQeXRob24gMi4xIGFscGhhIDE/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQ29yZSBsYW5ndWFnZSwgYnVpbHRpbnMsIGFuZCBpbnRlcnByZXRlcgoKLSBUaGVyZSBpcyBhIG5ldyBVbmljb2RlIGNvbXBhbmlvbiB0byB0aGUgUHlPYmplY3RfU3RyKCkgQVBJCiAgY2FsbGVkIFB5T2JqZWN0X1VuaWNvZGUoKS4gSXQgYmVoYXZlcyBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlCiAgZm9ybWVyLCBidXQgYXNzdXJlcyB0aGF0IHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBhbiBVbmljb2RlIG9iamVjdAogIChhcHBseWluZyB0aGUgdXN1YWwgY29lcmNpb24gaWYgbmVjZXNzYXJ5KS4KCi0gVGhlIGNvbXBhcmlzb24gb3BlcmF0b3JzIHN1cHBvcnQgInJpY2ggY29tcGFyaXNvbiBvdmVybG9hZGluZyIgKFBFUAogIDIwNykuICBDIGV4dGVuc2lvbiB0eXBlcyBjYW4gcHJvdmlkZSBhIHJpY2ggY29tcGFyaXNvbiBmdW5jdGlvbiBpbgogIHRoZSBuZXcgdHBfcmljaGNvbXBhcmUgc2xvdCBpbiB0aGUgdHlwZSBvYmplY3QuICBUaGUgY21wKCkgZnVuY3Rpb24KICBhbmQgdGhlIEMgZnVuY3Rpb24gUHlPYmplY3RfQ29tcGFyZSgpIGZpcnN0IHRyeSB0aGUgbmV3IHJpY2gKICBjb21wYXJpc29uIG9wZXJhdG9ycyBiZWZvcmUgdHJ5aW5nIHRoZSBvbGQgMy13YXkgY29tcGFyaXNvbi4gIFRoZXJlCiAgaXMgYWxzbyBhIG5ldyBDIEFQSSBQeU9iamVjdF9SaWNoQ29tcGFyZSgpICh3aGljaCBhbHNvIGZhbGxzIGJhY2sgb24KICB0aGUgb2xkIDMtd2F5IGNvbXBhcmlzb24sIGJ1dCBkb2VzIG5vdCBjb25zdHJhaW4gdGhlIG91dGNvbWUgb2YgdGhlCiAgcmljaCBjb21wYXJpc29uIHRvIGEgQm9vbGVhbiByZXN1bHQpLgoKICBUaGUgcmljaCBjb21wYXJpc29uIGZ1bmN0aW9uIHRha2VzIHR3byBvYmplY3RzIChhdCBsZWFzdCBvbmUgb2YKICB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGhhdmUgdGhlIHR5cGUgdGhhdCBwcm92aWRlZCB0aGUgZnVuY3Rpb24pIGFuZAogIGFuIGludGVnZXIgaW5kaWNhdGluZyB0aGUgb3Bjb2RlLCB3aGljaCBjYW4gYmUgUHlfTFQsIFB5X0xFLCBQeV9FUSwKICBQeV9ORSwgUHlfR1QsIFB5X0dFIChmb3IgPCwgPD0sID09LCAhPSwgPiwgPj0pLCBhbmQgcmV0dXJucyBhIFB5dGhvbgogIG9iamVjdCwgd2hpY2ggbWF5IGJlIE5vdEltcGxlbWVudGVkIChpbiB3aGljaCBjYXNlIHRoZSB0cF9jb21wYXJlCiAgc2xvdCBmdW5jdGlvbiBpcyB1c2VkIGFzIGEgZmFsbGJhY2ssIGlmIGRlZmluZWQpLgoKICBDbGFzc2VzIGNhbiBvdmVybG9hZCBpbmRpdmlkdWFsIGNvbXBhcmlzb24gb3BlcmF0b3JzIGJ5IGRlZmluaW5nIG9uZQogIG9yIG1vcmUgb2YgdGhlIG1ldGhvZHNfX2x0X18sIF9fbGVfXywgX19lcV9fLCBfX25lX18sIF9fZ3RfXywKICBfX2dlX18uICBUaGVyZSBhcmUgbm8gZXhwbGljaXQgInJlZmxlY3RlZCBhcmd1bWVudCIgdmVyc2lvbnMgb2YKICB0aGVzZTsgaW5zdGVhZCwgX19sdF9fIGFuZCBfX2d0X18gYXJlIGVhY2ggb3RoZXIncyByZWZsZWN0aW9uLAogIGxpa2V3aXNlIGZvcl9fbGVfXyBhbmQgX19nZV9fOyBfX2VxX18gYW5kIF9fbmVfXyBhcmUgdGhlaXIgb3duCiAgcmVmbGVjdGlvbiAoc2ltaWxhciBhdCB0aGUgQyBsZXZlbCkuICBObyBvdGhlciBpbXBsaWNhdGlvbnMgYXJlCiAgbWFkZTsgaW4gcGFydGljdWxhciwgUHl0aG9uIGRvZXMgbm90IGFzc3VtZSB0aGF0ID09IGlzIHRoZSBCb29sZWFuCiAgaW52ZXJzZSBvZiAhPSwgb3IgdGhhdCA8IGlzIHRoZSBCb29sZWFuIGludmVyc2Ugb2YgPj0uICBUaGlzIG1ha2VzCiAgaXQgcG9zc2libGUgdG8gZGVmaW5lIHR5cGVzIHdpdGggcGFydGlhbCBvcmRlcmluZ3MuCgogIENsYXNzZXMgb3IgdHlwZXMgdGhhdCB3YW50IHRvIGltcGxlbWVudCAoaW4pZXF1YWxpdHkgdGVzdHMgYnV0IG5vdAogIHRoZSBvcmRlcmluZyBvcGVyYXRvcnMgKGkuZS4gdW5vcmRlcmVkIHR5cGVzKSBzaG91bGQgaW1wbGVtZW50ID09CiAgYW5kICE9LCBhbmQgcmFpc2UgYW4gZXJyb3IgZm9yIHRoZSBvcmRlcmluZyBvcGVyYXRvcnMuCgogIEl0IGlzIHBvc3NpYmxlIHRvIGRlZmluZSB0eXBlcyB3aG9zZSByaWNoIGNvbXBhcmlzb24gcmVzdWx0cyBhcmUgbm90CiAgQm9vbGVhbjsgZS5nLiBhIG1hdHJpeCB0eXBlIG1pZ2h0IHdhbnQgdG8gcmV0dXJuIGEgbWF0cml4IG9mIGJpdHMKICBmb3IgQSA8IEIsIGdpdmluZyBlbGVtZW50d2lzZSBjb21wYXJpc29ucy4gIFN1Y2ggdHlwZXMgc2hvdWxkIGVuc3VyZQogIHRoYXQgYW55IGludGVycHJldGF0aW9uIG9mIHRoZWlyIHZhbHVlIGluIGEgQm9vbGVhbiBjb250ZXh0IHJhaXNlcwogIGFuIGV4Y2VwdGlvbiwgZS5nLiBieSBkZWZpbmluZyBfX25vbnplcm9fXyAob3IgdGhlIHRwX25vbnplcm8gc2xvdAogIGF0IHRoZSBDIGxldmVsKSB0byBhbHdheXMgcmFpc2UgYW4gZXhjZXB0aW9uLgoKLSBDb21wbGV4IG51bWJlcnMgdXNlIHJpY2ggY29tcGFyaXNvbnMgdG8gZGVmaW5lID09IGFuZCAhPSBidXQgcmFpc2UKICBhbiBleGNlcHRpb24gZm9yIDwsIDw9LCA+IGFuZCA+PS4gIFVuZm9ydHVuYXRlbHksIHRoaXMgYWxzbyBtZWFucwogIHRoYXQgY21wKCkgb2YgdHdvIGNvbXBsZXggbnVtYmVycyByYWlzZXMgYW4gZXhjZXB0aW9uIHdoZW4gdGhlIHR3bwogIG51bWJlcnMgZGlmZmVyLiAgU2luY2UgaXQgaXMgbm90IG1hdGhlbWF0aWNhbGx5IG1lYW5pbmdmdWwgdG8gY29tcGFyZQogIGNvbXBsZXggbnVtYmVycyBleGNlcHQgZm9yIGVxdWFsaXR5LCBJIGhvcGUgdGhhdCB0aGlzIGRvZXNuJ3QgYnJlYWsKICB0b28gbXVjaCBjb2RlLgoKLSBUaGUgb3V0Y29tZSBvZiBjb21wYXJpbmcgbm9uLW51bWVyaWMgb2JqZWN0cyBvZiBkaWZmZXJlbnQgdHlwZXMgaXMKICBub3QgZGVmaW5lZCBieSB0aGUgbGFuZ3VhZ2UsIG90aGVyIHRoYW4gdGhhdCBpdCdzIGFyYml0cmFyeSBidXQKICBjb25zaXN0ZW50IChzZWUgdGhlIFJlZmVyZW5jZSBNYW51YWwpLiAgQW4gaW1wbGVtZW50YXRpb24gZGV0YWlsIGNoYW5nZWQKICBpbiAyLjFhMSBzdWNoIHRoYXQgTm9uZSBub3cgY29tcGFyZXMgbGVzcyB0aGFuIGFueSBvdGhlciBvYmplY3QuICBDb2RlCiAgcmVseWluZyBvbiB0aGlzIG5ldyBiZWhhdmlvciAobGlrZSBjb2RlIHRoYXQgcmVsaWVkIG9uIHRoZSBwcmV2aW91cwogIGJlaGF2aW9yKSBkb2VzIHNvIGF0IGl0cyBvd24gcmlzay4KCi0gRnVuY3Rpb25zIGFuZCBtZXRob2RzIG5vdyBzdXBwb3J0IGdldHRpbmcgYW5kIHNldHRpbmcgYXJiaXRyYXJpbHkKICBuYW1lZCBhdHRyaWJ1dGVzIChQRVAgMjMyKS4gIEZ1bmN0aW9ucyBoYXZlIGEgbmV3IF9fZGljdF9fCiAgKGEuay5hLiBmdW5jX2RpY3QpIHdoaWNoIGhvbGQgdGhlIGZ1bmN0aW9uIGF0dHJpYnV0ZXMuICBNZXRob2RzIGdldAogIGFuZCBzZXQgYXR0cmlidXRlcyBvbiB0aGVpciB1bmRlcmx5aW5nIGltX2Z1bmMuICBJdCBpcyBhIFR5cGVFcnJvcgogIHRvIHNldCBhbiBhdHRyaWJ1dGUgb24gYSBib3VuZCBtZXRob2QuCgotIFRoZSB4cmFuZ2UoKSBvYmplY3QgaW1wbGVtZW50YXRpb24gaGFzIGJlZW4gaW1wcm92ZWQgc28gdGhhdAogIHhyYW5nZShzeXMubWF4aW50KSBjYW4gYmUgdXNlZCBvbiA2NC1iaXQgcGxhdGZvcm1zLiAgVGhlcmUncyBzdGlsbCBhCiAgbGltaXRhdGlvbiB0aGF0IGluIHRoaXMgY2FzZSBsZW4oeHJhbmdlKHN5cy5tYXhpbnQpKSBjYW4ndCBiZQogIGNhbGN1bGF0ZWQsIGJ1dCB0aGUgY29tbW9uIGlkaW9tICJmb3IgaSBpbiB4cmFuZ2Uoc3lzLm1heGludCkiIHdpbGwKICB3b3JrIGZpbmUgYXMgbG9uZyBhcyB0aGUgaW5kZXggaSBkb2Vzbid0IGFjdHVhbGx5IHJlYWNoIDIqKjMxLgogIChQeXRob24gdXNlcyByZWd1bGFyIGludHMgZm9yIHNlcXVlbmNlIGFuZCBzdHJpbmcgaW5kaWNlczsgZml4aW5nCiAgdGhhdCBpcyBtdWNoIG1vcmUgd29yay4pCgotIFR3byBjaGFuZ2VzIHRvIGZyb20uLi5pbXBvcnQ6CgogIDEpICJmcm9tIE0gaW1wb3J0IFgiIG5vdyB3b3JrcyBldmVuIGlmIChhZnRlciBsb2FkaW5nIG1vZHVsZSBNKQogICAgIHN5cy5tb2R1bGVzWydNJ10gaXMgbm90IGEgcmVhbCBtb2R1bGU7IGl0J3MgYmFzaWNhbGx5IGEgZ2V0YXR0cigpCiAgICAgb3BlcmF0aW9uIHdpdGggQXR0cmlidXRlRXJyb3IgZXhjZXB0aW9ucyBjaGFuZ2VkIGludG8gSW1wb3J0RXJyb3IuCgogIDIpICJmcm9tIE0gaW1wb3J0ICoiIG5vdyBsb29rcyBmb3IgTS5fX2FsbF9fIHRvIGRlY2lkZSB3aGljaCBuYW1lcyB0bwogICAgIGltcG9ydDsgaWYgTS5fX2FsbF9fIGRvZXNuJ3QgZXhpc3QsIGl0IHVzZXMgTS5fX2RpY3RfXy5rZXlzKCkgYnV0CiAgICAgZmlsdGVycyBvdXQgbmFtZXMgc3RhcnRpbmcgd2l0aCAnXycgYXMgYmVmb3JlLiAgV2hldGhlciBvciBub3QKICAgICBfX2FsbF9fIGV4aXN0cywgdGhlcmUncyBubyByZXN0cmljdGlvbiBvbiB0aGUgdHlwZSBvZiBNLgoKLSBGaWxlIG9iamVjdHMgaGF2ZSBhIG5ldyBtZXRob2QsIHhyZWFkbGluZXMoKS4gIFRoaXMgaXMgdGhlIGZhc3Rlc3QKICB3YXkgdG8gaXRlcmF0ZSBvdmVyIGFsbCBsaW5lcyBpbiBhIGZpbGU6CgogIGZvciBsaW5lIGluIGZpbGUueHJlYWRsaW5lcygpOgogICAgICAuLi5kbyBzb21ldGhpbmcgdG8gbGluZS4uLgoKICBTZWUgdGhlIHhyZWFkbGluZXMgbW9kdWxlIChtZW50aW9uZWQgYmVsb3cpIGZvciBob3cgdG8gZG8gdGhpcyBmb3IKICBvdGhlciBmaWxlLWxpa2Ugb2JqZWN0cy4KCi0gRXZlbiBpZiB5b3UgZG9uJ3QgdXNlIGZpbGUueHJlYWRsaW5lcygpLCB5b3UgbWF5IGV4cGVjdCBhIHNwZWVkdXAgb24KICBsaW5lLWJ5LWxpbmUgaW5wdXQuICBUaGUgZmlsZS5yZWFkbGluZSgpIG1ldGhvZCBoYXMgYmVlbiBvcHRpbWl6ZWQKICBxdWl0ZSBhIGJpdCBpbiBwbGF0Zm9ybS1zcGVjaWZpYyB3YXlzOiAgb24gc3lzdGVtcyAobGlrZSBMaW51eCkgdGhhdAogIHN1cHBvcnQgZmxvY2tmaWxlKCksIGdldGNfdW5sb2NrZWQoKSwgYW5kIGZ1bmxvY2tmaWxlKCksIHRob3NlIGFyZQogIHVzZWQgYnkgZGVmYXVsdC4gIE9uIHN5c3RlbXMgKGxpa2UgV2luZG93cykgd2l0aG91dCBnZXRjX3VubG9ja2VkKCksCiAgYSBjb21wbGljYXRlZCAoYnV0IHN0aWxsIHRocmVhZC1zYWZlKSBtZXRob2QgdXNpbmcgZmdldHMoKSBpcyB1c2VkIGJ5CiAgZGVmYXVsdC4KCiAgWW91IGNhbiBmb3JjZSB1c2Ugb2YgdGhlIGZnZXRzKCkgbWV0aG9kIGJ5ICNkZWZpbmUnaW5nCiAgVVNFX0ZHRVRTX0lOX0dFVExJTkUgYXQgYnVpbGQgdGltZSAoaXQgbWF5IGJlIGZhc3RlciB0aGFuCiAgZ2V0Y191bmxvY2tlZCgpKS4KCiAgWW91IGNhbiBmb3JjZSBmZ2V0cygpIG5vdCB0byBiZSB1c2VkIGJ5ICNkZWZpbmUnaW5nCiAgRE9OVF9VU0VfRkdFVFNfSU5fR0VUTElORSAodGhpcyBpcyB0aGUgZmlyc3QgdGhpbmcgdG8gdHJ5IGlmIHN0ZCB0ZXN0CiAgdGVzdF9idWZpby5weSBmYWlscyAtLSBhbmQgbGV0IHVzIGtub3cgaWYgaXQgZG9lcyEpLgoKLSBJbiBhZGRpdGlvbiwgdGhlIGZpbGVpbnB1dCBtb2R1bGUsIHdoaWxlIHN0aWxsIHNsb3dlciB0aGFuIHRoZSBvdGhlcgogIG1ldGhvZHMgb24gbW9zdCBwbGF0Zm9ybXMsIGhhcyBiZWVuIHNwZWQgdXAgdG9vLCBieSB1c2luZwogIGZpbGUucmVhZGxpbmVzKHNpemVoaW50KS4KCi0gU3VwcG9ydCBmb3IgcnVuLXRpbWUgd2FybmluZ3MgaGFzIGJlZW4gYWRkZWQsIGluY2x1ZGluZyBhIG5ldwogIGNvbW1hbmQgbGluZSBvcHRpb24gKC1XKSB0byBzcGVjaWZ5IHRoZSBkaXNwb3NpdGlvbiBvZiB3YXJuaW5ncy4KICBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB3YXJuaW5ncyBtb2R1bGUgYmVsb3cuCgotIEV4dGVuc2l2ZSBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHRoZSBjb2VyY2lvbiBjb2RlLiAgVGhpcyBtb3N0bHkKICBhZmZlY3RzIGV4dGVuc2lvbiBtb2R1bGVzICh3aGljaCBjYW4gbm93IGltcGxlbWVudCBtaXhlZC10eXBlCiAgbnVtZXJpY2FsIG9wZXJhdG9ycyB3aXRob3V0IGhhdmluZyB0byB1c2UgY29lcmNpb24pLCBidXQKICBvY2Nhc2lvbmFsbHksIGluIGJvdW5kYXJ5IGNhc2VzIHRoZSBjb2VyY2lvbiBzZW1hbnRpY3MgaGF2ZSBjaGFuZ2VkCiAgc3VidGx5LiAgU2luY2UgdGhpcyB3YXMgYSB0ZXJyaWJsZSBncmF5IGFyZWEgb2YgdGhlIGxhbmd1YWdlLCB0aGlzCiAgaXMgY29uc2lkZXJlZCBhbiBpbXByb3ZlbWVudC4gIEFsc28gbm90ZSB0aGF0IF9fcmNtcF9fIGlzIG5vIGxvbmdlcgogIHN1cHBvcnRlZCAtLSBpbnN0ZWFkIG9mIGNhbGxpbmcgX19yY21wX18sIF9fY21wX18gaXMgY2FsbGVkIHdpdGgKICByZWZsZWN0ZWQgYXJndW1lbnRzLgoKLSBJbiBjb25uZWN0aW9uIHdpdGggdGhlIGNvZXJjaW9uIGNoYW5nZXMsIGEgbmV3IGJ1aWx0LWluIHNpbmdsZXRvbgogIG9iamVjdCwgTm90SW1wbGVtZW50ZWQgaXMgZGVmaW5lZC4gIFRoaXMgY2FuIGJlIHJldHVybmVkIGZvcgogIG9wZXJhdGlvbnMgdGhhdCB3aXNoIHRvIGluZGljYXRlIHRoZXkgYXJlIG5vdCBpbXBsZW1lbnRlZCBmb3IgYQogIHBhcnRpY3VsYXIgY29tYmluYXRpb24gb2YgYXJndW1lbnRzLiAgRnJvbSBDLCB0aGlzIGlzCiAgUHlfTm90SW1wbGVtZW50ZWQuCgotIFRoZSBpbnRlcnByZXRlciBhY2NlcHRzIG5vdyBieXRlY29kZSBmaWxlcyBvbiB0aGUgY29tbWFuZCBsaW5lIGV2ZW4KICBpZiB0aGV5IGRvIG5vdCBoYXZlIGEgLnB5YyBvciAucHlvIGV4dGVuc2lvbi4gT24gTGludXgsIGFmdGVyIGV4ZWN1dGluZwoKaW1wb3J0IGltcCxzeXMsc3RyaW5nCm1hZ2ljID0gc3RyaW5nLmpvaW4oWyJcXHglLjJ4IiAlIG9yZChjKSBmb3IgYyBpbiBpbXAuZ2V0X21hZ2ljKCldLCIiKQpyZWcgPSAnOnB5YzpNOjolczo6JXM6JyAlIChtYWdpYywgc3lzLmV4ZWN1dGFibGUpCm9wZW4oIi9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYy9yZWdpc3RlciIsIndiIikud3JpdGUocmVnKQoKICBhbnkgYnl0ZSBjb2RlIGZpbGUgY2FuIGJlIHVzZWQgYXMgYW4gZXhlY3V0YWJsZSAoaS5lLiBhcyBhbiBhcmd1bWVudAogIHRvIGV4ZWN2ZSgyKSkuCgotICVbeFhvXSBmb3JtYXRzIG9mIG5lZ2F0aXZlIFB5dGhvbiBsb25ncyBub3cgcHJvZHVjZSBhIHNpZ24KICBjaGFyYWN0ZXIuICBJbiAxLjYgYW5kIGVhcmxpZXIsIHRoZXkgbmV2ZXIgcHJvZHVjZWQgYSBzaWduLAogIGFuZCByYWlzZWQgYW4gZXJyb3IgaWYgdGhlIHZhbHVlIG9mIHRoZSBsb25nIHdhcyB0b28gbGFyZ2UKICB0byBmaXQgaW4gYSBQeXRob24gaW50LiAgSW4gMi4wLCB0aGV5IHByb2R1Y2VkIGEgc2lnbiBpZiBhbmQKICBvbmx5IGlmIHRvbyBsYXJnZSB0byBmaXQgaW4gYW4gaW50LiAgVGhpcyB3YXMgaW5jb25zaXN0ZW50CiAgYWNyb3NzIHBsYXRmb3JtcyAoYmVjYXVzZSB0aGUgc2l6ZSBvZiBhbiBpbnQgdmFyaWVzIGFjcm9zcwogIHBsYXRmb3JtcyksIGFuZCBpbmNvbnNpc3RlbnQgd2l0aCBoZXgoKSBhbmQgb2N0KCkuICBFeGFtcGxlOgoKICA+Pj4gIiV4IiAlIC0weDQyTAogICctNDInICAgICAgIyBpbiAyLjEKICAnZmZmZmZmYmUnICMgaW4gMi4wIGFuZCBiZWZvcmUsIG9uIDMyLWJpdCBtYWNoaW5lcwogID4+PiBoZXgoLTB4NDJMKQogICctMHg0MkwnICAgIyBpbiBhbGwgdmVyc2lvbnMgb2YgUHl0aG9uCgogIFRoZSBiZWhhdmlvciBvZiAlZCBmb3JtYXRzIGZvciBuZWdhdGl2ZSBQeXRob24gbG9uZ3MgcmVtYWlucwogIHRoZSBzYW1lIGFzIGluIDIuMCAoYWx0aG91Z2ggaW4gMS42IGFuZCBiZWZvcmUsIHRoZXkgcmFpc2VkCiAgYW4gZXJyb3IgaWYgdGhlIGxvbmcgZGlkbid0IGZpdCBpbiBhIFB5dGhvbiBpbnQpLgoKICAldSBmb3JtYXRzIGRvbid0IG1ha2Ugc2Vuc2UgZm9yIFB5dGhvbiBsb25ncywgYnV0IGFyZSBhbGxvd2VkCiAgYW5kIHRyZWF0ZWQgdGhlIHNhbWUgYXMgJWQgaW4gMi4xLiAgSW4gMi4wLCBhIG5lZ2F0aXZlIGxvbmcKICBmb3JtYXR0ZWQgdmlhICV1IHByb2R1Y2VkIGEgc2lnbiBpZiBhbmQgb25seSBpZiB0b28gbGFyZ2UgdG8KICBmaXQgaW4gYW4gaW50LiAgSW4gMS42IGFuZCBlYXJsaWVyLCBhIG5lZ2F0aXZlIGxvbmcgZm9ybWF0dGVkCiAgdmlhICV1IHJhaXNlZCBhbiBlcnJvciBpZiBpdCB3YXMgdG9vIGJpZyB0byBmaXQgaW4gYW4gaW50LgoKLSBEaWN0aW9uYXJ5IG9iamVjdHMgaGF2ZSBhbiBvZGQgbmV3IG1ldGhvZCwgcG9waXRlbSgpLiAgVGhpcyByZW1vdmVzCiAgYW4gYXJiaXRyYXJ5IGl0ZW0gZnJvbSB0aGUgZGljdGlvbmFyeSBhbmQgcmV0dXJucyBpdCAoaW4gdGhlIGZvcm0gb2YKICBhIChrZXksIHZhbHVlKSBwYWlyKS4gIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgYWxnb3JpdGhtcyB0aGF0IHVzZSBhCiAgZGljdGlvbmFyeSBhcyBhIGJhZyBvZiAidG8gZG8iIGl0ZW1zIGFuZCByZXBlYXRlZGx5IG5lZWQgdG8gcGljayBvbmUKICBpdGVtLiAgU3VjaCBhbGdvcml0aG1zIG5vcm1hbGx5IGVuZCB1cCBydW5uaW5nIGluIHF1YWRyYXRpYyB0aW1lOwogIHVzaW5nIHBvcGl0ZW0oKSB0aGV5IGNhbiB1c3VhbGx5IGJlIG1hZGUgdG8gcnVuIGluIGxpbmVhciB0aW1lLgoKU3RhbmRhcmQgbGlicmFyeQoKLSBJbiB0aGUgdGltZSBtb2R1bGUsIHRoZSB0aW1lIGFyZ3VtZW50IHRvIHRoZSBmdW5jdGlvbnMgc3RyZnRpbWUsCiAgbG9jYWx0aW1lLCBnbXRpbWUsIGFzY3RpbWUgYW5kIGN0aW1lIGlzIG5vdyBvcHRpb25hbCwgZGVmYXVsdGluZyB0bwogIHRoZSBjdXJyZW50IHRpbWUgKGluIHRoZSBsb2NhbCB0aW1lem9uZSkuCgotIFRoZSBmdHBsaWIgbW9kdWxlIG5vdyBkZWZhdWx0cyB0byBwYXNzaXZlIG1vZGUsIHdoaWNoIGlzIGRlZW1lZCBhCiAgbW9yZSB1c2VmdWwgZGVmYXVsdCBnaXZlbiB0aGF0IGNsaWVudHMgYXJlIG9mdGVuIGluc2lkZSBmaXJld2FsbHMKICB0aGVzZSBkYXlzLiAgTm90ZSB0aGF0IHRoaXMgY291bGQgYnJlYWsgaWYgZnRwbGliIGlzIHVzZWQgdG8gY29ubmVjdAogIHRvIGEgKnNlcnZlciogdGhhdCBpcyBpbnNpZGUgYSBmaXJld2FsbCwgZnJvbSBvdXRzaWRlOyB0aGlzIGlzCiAgZXhwZWN0ZWQgdG8gYmUgYSB2ZXJ5IHJhcmUgc2l0dWF0aW9uLiAgVG8gZml4IHRoYXQsIHlvdSBjYW4gY2FsbAogIGZ0cC5zZXRfcGFzdigwKS4KCi0gVGhlIG1vZHVsZSBzaXRlIG5vdyB0cmVhdHMgLnB0aCBmaWxlcyBub3Qgb25seSBmb3IgcGF0aCBjb25maWd1cmF0aW9uLAogIGJ1dCBhbHNvIHN1cHBvcnRzIGV4dGVuc2lvbnMgdG8gdGhlIGluaXRpYWxpemF0aW9uIGNvZGU6IExpbmVzIHN0YXJ0aW5nCiAgd2l0aCBpbXBvcnQgYXJlIGV4ZWN1dGVkLgoKLSBUaGVyZSdzIGEgbmV3IG1vZHVsZSwgd2FybmluZ3MsIHdoaWNoIGltcGxlbWVudHMgYSBtZWNoYW5pc20gZm9yCiAgaXNzdWluZyBhbmQgZmlsdGVyaW5nIHdhcm5pbmdzLiAgVGhlcmUgYXJlIHNvbWUgbmV3IGJ1aWx0LWluCiAgZXhjZXB0aW9ucyB0aGF0IHNlcnZlIGFzIHdhcm5pbmcgY2F0ZWdvcmllcywgYW5kIGEgbmV3IGNvbW1hbmQgbGluZQogIG9wdGlvbiwgLVcsIHRvIGNvbnRyb2wgd2FybmluZ3MgKGUuZy4gLVdpIGlnbm9yZXMgYWxsIHdhcm5pbmdzLCAtV2UKICB0dXJucyB3YXJuaW5ncyBpbnRvIGVycm9ycykuICB3YXJuaW5ncy53YXJuKG1lc3NhZ2VbLCBjYXRlZ29yeV0pCiAgaXNzdWVzIGEgd2FybmluZyBtZXNzYWdlOyB0aGlzIGNhbiBhbHNvIGJlIGNhbGxlZCBmcm9tIEMgYXMKICBQeUVycl9XYXJuKGNhdGVnb3J5LCBtZXNzYWdlKS4KCi0gQSBuZXcgbW9kdWxlIHhyZWFkbGluZXMgd2FzIGFkZGVkLiAgVGhpcyBleHBvcnRzIGEgc2luZ2xlIGZhY3RvcnkKICBmdW5jdGlvbiwgeHJlYWRsaW5lcygpLiAgVGhlIGludGVudGlvbiBpcyB0aGF0IHRoaXMgY29kZSBpcyB0aGUKICBhYnNvbHV0ZWx5IGZhc3Rlc3Qgd2F5IHRvIGl0ZXJhdGUgb3ZlciBhbGwgbGluZXMgaW4gYW4gb3BlbgogIGZpbGUoLWxpa2UpIG9iamVjdDoKCiAgaW1wb3J0IHhyZWFkbGluZXMKICBmb3IgbGluZSBpbiB4cmVhZGxpbmVzLnhyZWFkbGluZXMoZmlsZSk6CiAgICAgIC4uLmRvIHNvbWV0aGluZyB0byBsaW5lLi4uCgogIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgcHJldmlvdXMgdGhlIHNwZWVkIHJlY29yZCBob2xkZXIgdXNpbmcKICBmaWxlLnJlYWRsaW5lcyhzaXplaGludCkuICBOb3RlIHRoYXQgaWYgZmlsZSBpcyBhIHJlYWwgZmlsZSBvYmplY3QKICAoYXMgb3Bwb3NlZCB0byBhIGZpbGUtbGlrZSBvYmplY3QpLCB0aGlzIGlzIGVxdWl2YWxlbnQ6CgogIGZvciBsaW5lIGluIGZpbGUueHJlYWRsaW5lcygpOgogICAgICAuLi5kbyBzb21ldGhpbmcgdG8gbGluZS4uLgoKLSBUaGUgYmlzZWN0IG1vZHVsZSBoYXMgbmV3IGZ1bmN0aW9ucyBiaXNlY3RfbGVmdCwgaW5zb3J0X2xlZnQsCiAgYmlzZWN0X3JpZ2h0IGFuZCBpbnNvcnRfcmlnaHQuICBUaGUgb2xkIG5hbWVzIGJpc2VjdCBhbmQgaW5zb3J0CiAgYXJlIG5vdyBhbGlhc2VzIGZvciBiaXNlY3RfcmlnaHQgYW5kIGluc29ydF9yaWdodC4gIFhYWF9yaWdodAogIGFuZCBYWFhfbGVmdCBtZXRob2RzIGRpZmZlciBpbiB3aGF0IGhhcHBlbnMgd2hlbiB0aGUgbmV3IGVsZW1lbnQKICBjb21wYXJlcyBlcXVhbCB0byBvbmUgb3IgbW9yZSBlbGVtZW50cyBhbHJlYWR5IGluIHRoZSBsaXN0OiAgdGhlCiAgWFhYX2xlZnQgbWV0aG9kcyBpbnNlcnQgdG8gdGhlIGxlZnQsIHRoZSBYWFhfcmlnaHQgbWV0aG9kcyB0byB0aGUKICByaWdodC4gIENvZGUgdGhhdCBkb2Vzbid0IGNhcmUgd2hlcmUgZXF1YWwgZWxlbWVudHMgZW5kIHVwIHNob3VsZAogIGNvbnRpbnVlIHRvIHVzZSB0aGUgb2xkLCBzaG9ydCBuYW1lcyAoImJpc2VjdCIgYW5kICJpbnNvcnQiKS4KCi0gVGhlIG5ldyBjdXJzZXMucGFuZWwgbW9kdWxlIHdyYXBzIHRoZSBwYW5lbCBsaWJyYXJ5IHRoYXQgZm9ybXMgcGFydAogIG9mIFNZU1YgY3Vyc2VzIGFuZCBuY3Vyc2VzLiAgQ29udHJpYnV0ZWQgYnkgVGhvbWFzIEdlbGxla3VtLgoKLSBUaGUgU29ja2V0U2VydmVyIG1vZHVsZSBub3cgc2V0cyB0aGUgYWxsb3dfcmV1c2VfYWRkcmVzcyBmbGFnIGJ5CiAgZGVmYXVsdCBpbiB0aGUgVENQU2VydmVyIGNsYXNzLgoKLSBBIG5ldyBmdW5jdGlvbiwgc3lzLl9nZXRmcmFtZSgpLCByZXR1cm5zIHRoZSBzdGFjayBmcmFtZSBwb2ludGVyIG9mCiAgdGhlIGNhbGxlci4gIFRoaXMgaXMgaW50ZW5kZWQgb25seSBhcyBhIGJ1aWxkaW5nIGJsb2NrIGZvcgogIGhpZ2hlci1sZXZlbCBtZWNoYW5pc21zIHN1Y2ggYXMgc3RyaW5nIGludGVycG9sYXRpb24uCgotIFRoZSBweWV4cGF0IG1vZHVsZSBzdXBwb3J0cyBhIG51bWJlciBvZiBuZXcgaGFuZGxlcnMsIHdoaWNoIGFyZQogIGF2YWlsYWJsZSBvbmx5IGluIGV4cGF0IDEuMi4gSWYgaW52b2NhdGlvbiBvZiBhIGNhbGxiYWNrIGZhaWxzLCBpdAogIHdpbGwgcmVwb3J0IGFuIGFkZGl0aW9uYWwgZnJhbWUgaW4gdGhlIHRyYWNlYmFjay4gUGFyc2VyIG9iamVjdHMKICBwYXJ0aWNpcGF0ZSBub3cgaW4gZ2FyYmFnZSBjb2xsZWN0aW9uLiBJZiBleHBhdCByZXBvcnRzIGFuIHVua25vd24KICBlbmNvZGluZywgcHlleHBhdCB3aWxsIHRyeSB0byB1c2UgYSBQeXRob24gY29kZWM7IHRoYXQgd29ya3Mgb25seQogIGZvciBzaW5nbGUtYnl0ZSBjaGFyc2V0cy4gVGhlIHBhcnNlciB0eXBlIG9iamVjdHMgaXMgZXhwb3NlZCBhcwogIFhNTFBhcnNlck9iamVjdC4KCi0geG1sLmRvbSBub3cgb2ZmZXJzIHN0YW5kYXJkIGRlZmluaXRpb25zIGZvciBzeW1ib2xpYyBub2RlIHR5cGUgYW5kCiAgZXhjZXB0aW9uIGNvZGUgY29uc3RhbnRzLCBhbmQgYSBoaWVyYXJjaHkgb2YgRE9NIGV4Y2VwdGlvbnMuIG1pbmlkb20KICB3YXMgYWRqdXN0ZWQgdG8gdXNlIHRoZW0uCgotIFRoZSBjb25mb3JtYW5jZSBvZiB4bWwuZG9tLm1pbmlkb20gdG8gdGhlIERPTSBzcGVjaWZpY2F0aW9uIHdhcwogIGltcHJvdmVkLiBJdCBkZXRlY3RzIGEgbnVtYmVyIG9mIGFkZGl0aW9uYWwgZXJyb3IgY2FzZXM7IHRoZQogIHByZXZpb3VzL25leHQgcmVsYXRpb25zaGlwIHdvcmtzIGV2ZW4gd2hlbiB0aGUgdHJlZSBpcyBtb2RpZmllZDsKICBOb2RlIHN1cHBvcnRzIHRoZSBub3JtYWxpemUoKSBtZXRob2Q7IE5hbWVkTm9kZU1hcCwgRG9jdW1lbnRUeXBlIGFuZAogIERPTUltcGxlbWVudGF0aW9uIGNsYXNzZXMgd2VyZSBhZGRlZDsgRWxlbWVudCBzdXBwb3J0cyB0aGUKICBoYXNBdHRyaWJ1dGUgYW5kIGhhc0F0dHJpYnV0ZU5TIG1ldGhvZHM7IGFuZCBUZXh0IHN1cHBvcnRzIHRoZSBzcGxpdFRleHQKICBtZXRob2QuCgpCdWlsZCBpc3N1ZXMKCi0gRm9yIFVuaXggKGFuZCBVbml4LWNvbXBhdGlibGUpIGJ1aWxkcywgY29uZmlndXJhdGlvbiBhbmQgYnVpbGRpbmcgb2YKICBleHRlbnNpb24gbW9kdWxlcyBpcyBub3cgZ3JlYXRseSBhdXRvbWF0ZWQuICBSYXRoZXIgdGhhbiBoYXZpbmcgdG8KICBlZGl0IHRoZSBNb2R1bGVzL1NldHVwIGZpbGUgdG8gaW5kaWNhdGUgd2hpY2ggbW9kdWxlcyBzaG91bGQgYmUKICBidWlsdCBhbmQgd2hlcmUgdGhlaXIgaW5jbHVkZSBmaWxlcyBhbmQgbGlicmFyaWVzIGFyZSwgYQogIGRpc3R1dGlscy1iYXNlZCBzZXR1cC5weSBzY3JpcHQgbm93IHRha2VzIGNhcmUgb2YgYnVpbGRpbmcgbW9zdAogIGV4dGVuc2lvbiBtb2R1bGVzLiAgQWxsIGV4dGVuc2lvbiBtb2R1bGVzIGJ1aWx0IHRoaXMgd2F5IGFyZSBidWlsdAogIGFzIHNoYXJlZCBsaWJyYXJpZXMuICBPbmx5IGEgZmV3IG1vZHVsZXMgdGhhdCBtdXN0IGJlIGxpbmtlZAogIHN0YXRpY2FsbHkgYXJlIHN0aWxsIGxpc3RlZCBpbiB0aGUgU2V0dXAgZmlsZTsgeW91IHdvbid0IG5lZWQgdG8KICBlZGl0IHRoZWlyIGNvbmZpZ3VyYXRpb24uCgotIFB5dGhvbiBzaG91bGQgbm93IGJ1aWxkIG91dCBvZiB0aGUgYm94IG9uIEN5Z3dpbi4gIElmIGl0IGRvZXNuJ3QsCiAgbWFpbCB0byBKYXNvbiBUaXNobGVyIChqbHQ2MyBhdCB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQpLgoKLSBQeXRob24gbm93IGFsd2F5cyB1c2VzIGl0cyBvd24gKHJlbmFtZWQpIGltcGxlbWVudGF0aW9uIG9mIGdldG9wdCgpCiAgLS0gdGhlcmUncyB0b28gbXVjaCB2YXJpYXRpb24gYW1vbmcgQyBsaWJyYXJ5IGdldG9wdCgpCiAgaW1wbGVtZW50YXRpb25zLgoKLSBDKysgY29tcGlsZXJzIGFyZSBiZXR0ZXIgc3VwcG9ydGVkOyB0aGUgQ1hYIG1hY3JvIGlzIGFsd2F5cyBzZXQgdG8gYQogIEMrKyBjb21waWxlciBpZiBvbmUgaXMgZm91bmQuCgpXaW5kb3dzIGNoYW5nZXMKCi0gc2VsZWN0IG1vZHVsZTogIEJ5IGRlZmF1bHQgdW5kZXIgV2luZG93cywgYSBzZWxlY3QoKSBjYWxsCiAgY2FuIHNwZWNpZnkgbm8gbW9yZSB0aGFuIDY0IHNvY2tldHMuICBQeXRob24gbm93IGJvb3N0cwogIHRoaXMgTWljcm9zb2Z0IGRlZmF1bHQgdG8gNTEyLiAgSWYgeW91IG5lZWQgZXZlbiBtb3JlIHRoYW4KICB0aGF0LCBzZWUgdGhlIE1TIGRvY3MgKHlvdSdsbCBuZWVkIHRvICNkZWZpbmUgRkRfU0VUU0laRQogIGFuZCByZWNvbXBpbGUgUHl0aG9uIGZyb20gc291cmNlKS4KCi0gU3VwcG9ydCBmb3IgV2luZG93cyAzLjEsIERPUyBhbmQgT1MvMiBpcyBnb25lLiAgVGhlIExpYi9kb3MtOHgzCiAgc3ViZGlyZWN0b3J5IGlzIG5vIG1vcmUhCgoKV2hhdCdzIE5ldyBpbiBQeXRob24gMi4wPwo9PT09PT09PT09PT09PT09PT09PT09PT09CgpCZWxvdyBpcyBhIGxpc3Qgb2YgYWxsIHJlbGV2YW50IGNoYW5nZXMgc2luY2UgcmVsZWFzZSAxLjYuICBPbGRlcgpjaGFuZ2VzIGFyZSBpbiB0aGUgZmlsZSBISVNUT1JZLiAgSWYgeW91IGFyZSBtYWtpbmcgdGhlIGp1bXAgZGlyZWN0bHkKZnJvbSBQeXRob24gMS41LjIgdG8gMi4wLCBtYWtlIHN1cmUgdG8gcmVhZCB0aGUgc2VjdGlvbiBmb3IgMS42IGluIHRoZQpISVNUT1JZIGZpbGUhICBNYW55IGltcG9ydGFudCBjaGFuZ2VzIGxpc3RlZCB0aGVyZS4KCkFsdGVybmF0aXZlbHksIGEgZ29vZCBvdmVydmlldyBvZiB0aGUgY2hhbmdlcyBiZXR3ZWVuIDEuNS4yIGFuZCAyLjAgaXMKdGhlIGRvY3VtZW50ICJXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjAiIGJ5IEt1Y2hsaW5nIGFuZCBNb3NoZSBaYWRrYToKaHR0cDovL3N0YXJzaGlwLnB5dGhvbi5uZXQvY3Jldy9hbWsvcHl0aG9uL3dyaXRpbmcvbmV3LXB5dGhvbi8uCgotLUd1aWRvIHZhbiBSb3NzdW0gKGhvbWUgcGFnZTogaHR0cDovL3d3dy5weXRob25sYWJzLmNvbS9+Z3VpZG8vKQoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKV2hhdCdzIG5ldyBpbiAyLjAgKHNpbmNlIHJlbGVhc2UgY2FuZGlkYXRlIDEpPwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpTdGFuZGFyZCBsaWJyYXJ5CgotIFRoZSBjb3B5X3JlZyBtb2R1bGUgd2FzIG1vZGlmaWVkIHRvIGNsYXJpZnkgaXRzIGludGVuZGVkIHVzZTogdG8KICByZWdpc3RlciBwaWNrbGUgc3VwcG9ydCBmb3IgZXh0ZW5zaW9uIHR5cGVzLCBub3QgZm9yIGNsYXNzZXMuCiAgcGlja2xlKCkgd2lsbCByYWlzZSBhIFR5cGVFcnJvciBpZiBpdCBpcyBwYXNzZWQgYSBjbGFzcy4KCi0gRml4ZWQgYSBidWcgaW4gZ2V0dGV4dCdzICJub3JtYWxpemUgYW5kIGV4cGFuZCIgY29kZSB0aGF0IHByZXZlbnRlZAogIGl0IGZyb20gZmluZGluZyBhbiBleGlzdGluZyAubW8gZmlsZS4KCi0gUmVzdG9yZWQgc3VwcG9ydCBmb3IgSFRUUC8wLjkgc2VydmVycyBpbiBodHRwbGliLgoKLSBUaGUgbWF0aCBtb2R1bGUgd2FzIGNoYW5nZWQgdG8gc3RvcCByYWlzaW5nIE92ZXJmbG93RXJyb3IgaW4gY2FzZSBvZgogIHVuZGVyZmxvdywgYW5kIHJldHVybiAwIGluc3RlYWQgaW4gdW5kZXJmbG93IGNhc2VzLiAgV2hldGhlciBQeXRob24KICB1c2VkIHRvIHJhaXNlIE92ZXJmbG93RXJyb3IgaW4gY2FzZSBvZiB1bmRlcmZsb3cgd2FzIHBsYXRmb3JtLQogIGRlcGVuZGVudCAoaXQgZGlkIHdoZW4gdGhlIHBsYXRmb3JtIG1hdGggbGlicmFyeSBzZXQgZXJybm8gdG8gRVJBTkdFCiAgb24gdW5kZXJmbG93KS4KCi0gRml4ZWQgYSBidWcgaW4gU3RyaW5nSU8gdGhhdCBvY2N1cnJlZCB3aGVuIHRoZSBmaWxlIHBvc2l0aW9uIHdhcyBub3QKICBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCB3cml0ZSgpIHdhcyBjYWxsZWQgd2l0aCBlbm91Z2ggZGF0YSB0bwogIGV4dGVuZCBwYXN0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCgotIEZpeGVkIGEgYnVnIHRoYXQgY2F1c2VkIFRraW50ZXIgZXJyb3IgbWVzc2FnZXMgdG8gZ2V0IGxvc3Qgb24KICBXaW5kb3dzLiAgVGhlIGJ1ZyB3YXMgZml4ZWQgYnkgcmVwbGFjaW5nIGRpcmVjdCB1c2Ugb2YKICBpbnRlcnAtPnJlc3VsdCB3aXRoIFRjbF9HZXRTdHJpbmdSZXN1bHQoaW50ZXJwKS4KCi0gRml4ZWQgYnVnIGluIHVybGxpYjIgdGhhdCBjYXVzZWQgaXQgdG8gZmFpbCB3aGVuIGl0IHJlY2VpdmVkIGFuIEhUVFAKICByZWRpcmVjdCByZXNwb25zZS4KCi0gU2V2ZXJhbCBjaGFuZ2VzIHdlcmUgbWFkZSB0byBkaXN0dXRpbHM6IFNvbWUgZGVidWdnaW5nIGNvZGUgd2FzCiAgcmVtb3ZlZCBmcm9tIHV0aWwuICBGaXhlZCB0aGUgaW5zdGFsbGVyIHVzZWQgd2hlbiBhbiBleHRlcm5hbCB6aXAKICBwcm9ncmFtIChsaWtlIFdpblppcCkgaXMgbm90IGZvdW5kOyB0aGUgc291cmNlIGNvZGUgZm9yIHRoaXMKICBpbnN0YWxsZXIgaXMgaW4gTWlzYy9kaXN0dXRpbHMuICBjaGVja19saWIoKSB3YXMgbW9kaWZpZWQgdG8gYmVoYXZlCiAgbW9yZSBsaWtlIEFDX0NIRUNLX0xJQiBieSBhZGQgb3RoZXJfbGlicmFyaWVzKCkgYXMgYSBwYXJhbWV0ZXIuICBUaGUKICB0ZXN0IGZvciB3aGV0aGVyIGluc3RhbGxlZCBtb2R1bGVzIGFyZSBvbiBzeXMucGF0aCB3YXMgY2hhbmdlZCB0bwogIHVzZSBib3RoIG5vcm1jYXNlKCkgYW5kIG5vcm1wYXRoKCkuCgotIFNldmVyYWwgbWlub3IgYnVncyB3ZXJlIGZpeGVkIGluIHRoZSB4bWwgcGFja2FnZSAodGhlIG1pbmlkb20sCiAgcHVsbGRvbSwgZXhwYXRyZWFkZXIsIGFuZCBzYXh1dGlscyBtb2R1bGVzKS4KCi0gVGhlIHJlZ3Jlc3Npb24gdGVzdCBkcml2ZXIgKHJlZ3J0ZXN0LnB5KSBiZWhhdmlvciB3aGVuIGludm9rZWQgd2l0aAogIC1sIGNoYW5nZWQ6IEl0IG5vdyByZXBvcnRzIGEgY291bnQgb2Ygb2JqZWN0cyB0aGF0IGFyZSByZWNvZ25pemVkIGFzCiAgZ2FyYmFnZSBidXQgbm90IGZyZWVkIGJ5IHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4KCi0gVGhlIHJlZ3Jlc3Npb24gdGVzdCBmb3IgdGhlIG1hdGggbW9kdWxlIHdhcyBjaGFuZ2VkIHRvIHRlc3QKICBleGNlcHRpb25hbCBiZWhhdmlvciB3aGVuIHRoZSB0ZXN0IGlzIHJ1biBpbiB2ZXJib3NlIG1vZGUuICBQeXRob24KICBjYW5ub3QgeWV0IGd1YXJhbnRlZSBjb25zaXN0ZW50IGV4Y2VwdGlvbiBiZWhhdmlvciBhY3Jvc3MgcGxhdGZvcm1zLAogIHNvIHRoZSBleGNlcHRpb24gcGFydCBvZiB0ZXN0X21hdGggaXMgcnVuIG9ubHkgaW4gdmVyYm9zZSBtb2RlLCBhbmQKICBtYXkgZmFpbCBvbiB5b3VyIHBsYXRmb3JtLgoKSW50ZXJuYWxzCgotIFB5T1NfQ2hlY2tTdGFjaygpIGhhcyBiZWVuIGRpc2FibGVkIG9uIFdpbjY0LCB3aGVyZSBpdCBjYXVzZWQKICB0ZXN0X3NyZSB0byBmYWlsLgoKQnVpbGQgaXNzdWVzCgotIENoYW5nZWQgY29tcGlsZXIgZmxhZ3MsIHNvIHRoYXQgZ2NjIGlzIGFsd2F5cyBpbnZva2VkIHdpdGggLVdhbGwgYW5kCiAgLVdzdHJpY3QtcHJvdG90eXBlcy4gIFVzZXJzIGNvbXBpbGluZyBQeXRob24gd2l0aCBHQ0Mgc2hvdWxkIHNlZQogIGV4YWN0bHkgb25lIHdhcm5pbmcsIGV4Y2VwdCBpZiB0aGV5IGhhdmUgcGFzc2VkIGNvbmZpZ3VyZSB0aGUKICAtLXdpdGgtcHlkZWJ1ZyBmbGFnLiAgVGhlIGV4cGVjdGVkIHdhcm5pbmcgaXMgZm9yIGdldG9wdCgpIGluCiAgTW9kdWxlcy9tYWluLmMuICBUaGlzIHdhcm5pbmcgd2lsbCBiZSBmaXhlZCBmb3IgUHl0aG9uIDIuMS4KCi0gRml4ZWQgY29uZmlndXJlIHRvIGFkZCAtdGhyZWFkcyBhcmd1bWVudCBkdXJpbmcgbGlua2luZyBvbiBPU0YxLgoKVG9vbHMgYW5kIG90aGVyIG1pc2NlbGxhbnkKCi0gVGhlIGNvbXBpbGVyIGluIFRvb2xzL2NvbXBpbGVyIHdhcyB1cGRhdGVkIHRvIHN1cHBvcnQgdGhlIG5ldwogIGxhbmd1YWdlIGZlYXR1cmVzIGludHJvZHVjZWQgaW4gMi4wOiBleHRlbmRlZCBwcmludCBzdGF0ZW1lbnQsIGxpc3QKICBjb21wcmVoZW5zaW9ucywgYW5kIGF1Z21lbnRlZCBhc3NpZ25tZW50cy4gIFRoZSBuZXcgY29tcGlsZXIgc2hvdWxkCiAgYWxzbyBiZSBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAxLjUuMjsgdGhlIGNvbXBpbGVyIHdpbGwKICBhbHdheXMgZ2VuZXJhdGUgY29kZSBmb3IgdGhlIHZlcnNpb24gb2YgdGhlIGludGVycHJldGVyIGl0IHJ1bnMKICB1bmRlci4KCldoYXQncyBuZXcgaW4gMi4wIHJlbGVhc2UgY2FuZGlkYXRlIDEgKHNpbmNlIGJldGEgMik/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpXaGF0IGlzIHJlbGVhc2UgY2FuZGlkYXRlIDE/CgpXZSBiZWxpZXZlIHRoYXQgcmVsZWFzZSBjYW5kaWRhdGUgMSB3aWxsIGZpeCBhbGwga25vd24gYnVncyB0aGF0IHdlCmludGVuZCB0byBmaXggZm9yIHRoZSAyLjAgZmluYWwgcmVsZWFzZS4gIFRoaXMgcmVsZWFzZSBzaG91bGQgYmUgYSBiaXQKbW9yZSBzdGFibGUgdGhhbiB0aGUgcHJldmlvdXMgYmV0YXMuICBXZSB3b3VsZCBsaWtlIHRvIHNlZSBldmVuIG1vcmUKd2lkZXNwcmVhZCB0ZXN0aW5nIGJlZm9yZSB0aGUgZmluYWwgcmVsZWFzZSwgc28gd2UgYXJlIHByb2R1Y2luZyB0aGlzCnJlbGVhc2UgY2FuZGlkYXRlLiAgVGhlIGZpbmFsIHJlbGVhc2Ugd2lsbCBiZSBleGFjdGx5IHRoZSBzYW1lIHVubGVzcwphbnkgc2hvdy1zdG9wcGluZyAob3IgYnJvd24gYmFnKSBidWdzIGFyZSBmb3VuZCBieSB0ZXN0ZXJzIG9mIHRoZQpyZWxlYXNlIGNhbmRpZGF0ZS4KCkFsbCB0aGUgY2hhbmdlcyBzaW5jZSB0aGUgbGFzdCBiZXRhIHJlbGVhc2UgYXJlIGJ1ZyBmaXhlcyBvciBjaGFuZ2VzCnRvIHN1cHBvcnQgYnVpbGRpbmcgUHl0aG9uIGZvciBzcGVjaWZpYyBwbGF0Zm9ybXMuCgpDb3JlIGxhbmd1YWdlLCBidWlsdGlucywgYW5kIGludGVycHJldGVyCgotIEEgYnVnIHRoYXQgY2F1c2VkIGNyYXNoZXMgd2hlbiBfX2NvZXJjZV9fIHdhcyB1c2VkIHdpdGggYXVnbWVudGVkCiAgYXNzaWdubWVudCwgZS5nLiArPSwgd2FzIGZpeGVkLgoKLSBSYWlzZSBaZXJvRGl2aXNpb25FcnJvciB3aGVuIHJhaXNpbmcgemVybyB0byBhIG5lZ2F0aXZlIG51bWJlciwKICBlLmcuIDAuMCAqKiAtMi4wLiAgTm90ZSB0aGF0IG1hdGgucG93IGlzIHVucmVsYXRlZCB0byB0aGUgYnVpbHRpbgogIHBvd2VyIG9wZXJhdG9yIGFuZCB0aGUgcmVzdWx0IG9mIG1hdGgucG93KDAuMCwgLTIuMCkgd2lsbCB2YXJ5IGJ5CiAgcGxhdGZvcm0uICBPbiBMaW51eCwgaXQgcmFpc2VzIGEgVmFsdWVFcnJvci4KCi0gQSBidWcgaW4gVW5pY29kZSBzdHJpbmcgaW50ZXJwb2xhdGlvbiB3YXMgZml4ZWQgdGhhdCBvY2Nhc2lvbmFsbHkKICBjYXVzZWQgZXJyb3JzIHdpdGggZm9ybWF0cyBpbmNsdWRpbmcgIiUlIi4gIEZvciBleGFtcGxlLCB0aGUKICBmb2xsb3dpbmcgZXhwcmVzc2lvbiAiJSUgJXMiICUgdSJhYmMiIG5vIGxvbmdlciByYWlzZXMgYSBUeXBlRXJyb3IuCgotIENvbXBpbGF0aW9uIG9mIGRlZXBseSBuZXN0ZWQgZXhwcmVzc2lvbnMgcmFpc2VzIE1lbW9yeUVycm9yIGluc3RlYWQKICBvZiBTeW50YXhFcnJvciwgZS5nLiBldmFsKCJbIiAqIDUwICsgIl0iICogNTApLgoKLSBJbiAyLjBiMiBvbiBXaW5kb3dzLCB0aGUgaW50ZXJwcmV0ZXIgd3JvdGUgLnB5YyBmaWxlcyBpbiB0ZXh0IG1vZGUsCiAgcmVuZGVyaW5nIHRoZW0gdXNlbGVzcy4gIFRoZXkgYXJlIG5vdyB3cml0dGVuIGluIGJpbmFyeSBtb2RlIGFnYWluLgoKU3RhbmRhcmQgbGlicmFyeQoKLSBLZXl3b3JkIGFyZ3VtZW50cyBhcmUgbm93IGFjY2VwdGVkIGZvciBtb3N0IHBhdHRlcm4gYW5kIG1hdGNoIG9iamVjdAogIG1ldGhvZHMgaW4gU1JFLCB0aGUgc3RhbmRhcmQgcmVndWxhciBleHByZXNzaW9uIGVuZ2luZS4KCi0gSW4gU1JFLCBmaXhlZCBlcnJvciB3aXRoIG5lZ2F0aXZlIGxvb2thaGVhZCBhbmQgbG9va2JlaGluZCB0aGF0CiAgbWFuaWZlc3RlZCBpdHNlbGYgYXMgYSBydW50aW1lIGVycm9yIGluIHBhdHRlcm5zIGxpa2UgIig/PCFhYmMpKGRlZikiLgoKLSBTZXZlcmFsIGJ1Z3MgaW4gdGhlIFVuaWNvZGUgaGFuZGxpbmcgYW5kIGVycm9yIGhhbmRsaW5nIGluIF90a2ludGVyCiAgd2VyZSBmaXhlZC4KCi0gRml4IG1lbW9yeSBtYW5hZ2VtZW50IGVycm9ycyBpbiBNZXJnZSgpIGFuZCBUa2FwcF9DYWxsKCkgcm91dGluZXMuCgotIFNldmVyYWwgY2hhbmdlcyB3ZXJlIG1hZGUgdG8gY1N0cmluZ0lPIHRvIG1ha2UgaXQgY29tcGF0aWJsZSB3aXRoCiAgdGhlIGZpbGUtbGlrZSBvYmplY3QgaW50ZXJmYWNlIGFuZCB3aXRoIFN0cmluZ0lPLiAgSWYgb3BlcmF0aW9ucyBhcmUKICBwZXJmb3JtZWQgb24gYSBjbG9zZWQgb2JqZWN0LCBhbiBleGNlcHRpb24gaXMgcmFpc2VkLiAgVGhlIHRydW5jYXRlCiAgbWV0aG9kIG5vdyBhY2NlcHRzIGEgcG9zaXRpb24gYXJndW1lbnQgYW5kIHJlYWRsaW5lIGFjY2VwdHMgYSBzaXplCiAgYXJndW1lbnQuCgotIFRoZXJlIHdlcmUgbWFueSBjaGFuZ2VzIG1hZGUgdG8gdGhlIGxpbnV4YXVkaW9kZXYgbW9kdWxlIGFuZCBpdHMKICB0ZXN0IHN1aXRlOyBhcyBhIHJlc3VsdCwgYSBzaG9ydCwgdW5leHBlY3RlZCBhdWRpbyBzYW1wbGUgc2hvdWxkIG5vdwogIHBsYXkgd2hlbiB0aGUgcmVncmVzc2lvbiB0ZXN0IGlzIHJ1bi4KCiAgTm90ZSB0aGF0IHRoaXMgbW9kdWxlIGlzIG5hbWVkIHBvb3JseSwgYmVjYXVzZSBpdCBzaG91bGQgd29yawogIGNvcnJlY3RseSBvbiBhbnkgcGxhdGZvcm0gdGhhdCBzdXBwb3J0cyB0aGUgT3BlbiBTb3VuZCBTeXN0ZW0KICAoT1NTKS4KCiAgVGhlIG1vZHVsZSBub3cgcmFpc2VzIGV4Y2VwdGlvbnMgd2hlbiBlcnJvcnMgb2NjdXIgaW5zdGVhZCBvZgogIGNyYXNoaW5nLiAgSXQgYWxzbyBkZWZpbmVzIHRoZSBBRk1UX0FfTEFXIGZvcm1hdCAobG9nYXJpdGhtaWMgQS1sYXcKICBhdWRpbykgYW5kIGRlZmluZXMgYSBnZXRwdHIoKSBtZXRob2QgdGhhdCBjYWxscyB0aGUKICBTTkRDVExfRFNQX0dFVHhQVFIgaW9jdGwgZGVmaW5lZCBpbiB0aGUgT1NTIFByb2dyYW1tZXIncyBHdWlkZS4KCi0gVGhlIGxpYnJhcnlfdmVyc2lvbiBhdHRyaWJ1dGUsIGludHJvZHVjZWQgaW4gYW4gZWFybGllciBiZXRhLCB3YXMKICByZW1vdmVkIGJlY2F1c2UgaXQgY2FuIG5vdCBiZSBzdXBwb3J0ZWQgd2l0aCBlYXJseSB2ZXJzaW9ucyBvZiB0aGUgQwogIHJlYWRsaW5lIGxpYnJhcnksIHdoaWNoIHByb3ZpZGVzIG5vIHdheSB0byBkZXRlcm1pbmUgdGhlIHZlcnNpb24gYXQKICBjb21waWxlLXRpbWUuCgotIFRoZSBiaW5hc2NpaSBtb2R1bGUgaXMgbm93IGVuYWJsZWQgb24gV2luNjQuCgotIHRva2VuaXplLnB5IG5vIGxvbmdlciBzdWZmZXJzICJyZWN1cnNpb24gZGVwdGgiIGVycm9ycyB3aGVuIHBhcnNpbmcKICBwcm9ncmFtcyB3aXRoIHZlcnkgbG9uZyBzdHJpbmcgbGl0ZXJhbHMuCgpJbnRlcm5hbHMKCi0gRml4ZWQgc2V2ZXJhbCBidWZmZXIgb3ZlcmZsb3cgdnVsbmVyYWJpbGl0aWVzIGluIGNhbGN1bGF0ZV9wYXRoKCksCiAgd2hpY2ggaXMgY2FsbGVkIHdoZW4gdGhlIGludGVycHJldGVyIHN0YXJ0cyB1cCB0byBkZXRlcm1pbmUgd2hlcmUKICB0aGUgc3RhbmRhcmQgbGlicmFyeSBpcyBpbnN0YWxsZWQuICBUaGVzZSB2dWxuZXJhYmlsaXRpZXMgYWZmZWN0IGFsbAogIHByZXZpb3VzIHZlcnNpb25zIG9mIFB5dGhvbiBhbmQgY2FuIGJlIGV4cGxvaXRlZCBieSBzZXR0aW5nIHZlcnkKICBsb25nIHZhbHVlcyBmb3IgUFlUSE9OSE9NRSBvciBhcmd2WzBdLiAgVGhlIHJpc2sgaXMgZ3JlYXRlc3QgZm9yIGEKICBzZXR1aWQgUHl0aG9uIHNjcmlwdCwgYWx0aG91Z2ggdXNlIG9mIHRoZSB3cmFwcGVyIGluCiAgTWlzYy9zZXR1aWQtcHJvZy5jIHdpbGwgZWxpbWluYXRlIHRoZSB2dWxuZXJhYmlsaXR5LgoKLSBGaXhlZCBnYXJiYWdlIGNvbGxlY3Rpb24gYnVncyBpbiBpbnN0YW5jZSBjcmVhdGlvbiB0aGF0IHdlcmUKICB0cmlnZ2VyZWQgd2hlbiBlcnJvcnMgb2NjdXJyZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiAgVGhlIHNvbHV0aW9uLAogIGFwcGxpZWQgaW4gY1BpY2tsZSBhbmQgaW4gUHlJbnN0YW5jZV9OZXcoKSwgaXMgdG8gY2FsbAogIFB5T2JqZWN0X0dDX0luaXQoKSBhZnRlciB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIG9iamVjdCdzCiAgY29udGFpbmVyIGF0dHJpYnV0ZXMgaXMgY29tcGxldGUuCgotIHB5ZXhwYXQgYWRkcyBkZWZpbml0aW9ucyBvZiBQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudCBhbmQKICBQeU1vZHVsZV9BZGRPYmplY3QgaWYgdGhlIFB5dGhvbiB2ZXJzaW9uIGlzIGxlc3MgdGhhbiAyLjAsIHdoaWNoCiAgcHJvdmlkZXMgY29tcGF0aWJpbGl0eSB3aXRoIFB5WE1MIG9uIFB5dGhvbiAxLjUuMi4KCi0gSWYgdGhlIHBsYXRmb3JtIGhhcyBhIGJvZ3VzIGRlZmluaXRpb24gZm9yIExPTkdfQklUICh0aGUgbnVtYmVyIG9mCiAgYml0cyBpbiBhIGxvbmcpLCBhbiBlcnJvciB3aWxsIGJlIHJlcG9ydGVkIGF0IGNvbXBpbGUgdGltZS4KCi0gRml4IGJ1Z3MgaW4gX1B5VHVwbGVfUmVzaXplKCkgd2hpY2ggY2F1c2VkIGhhcmQtdG8taW50ZXJwcmV0IGdhcmJhZ2UKICBjb2xsZWN0aW9uIGNyYXNoZXMgYW5kIHBvc3NpYmx5IG90aGVyLCB1bnJlcG9ydGVkIGNyYXNoZXMuCgotIEZpeGVkIGEgbWVtb3J5IGxlYWsgaW4gX1B5VW5pY29kZV9GaW5pKCkuCgpCdWlsZCBpc3N1ZXMKCi0gY29uZmlndXJlIG5vdyBhY2NlcHRzIGEgLS13aXRoLXN1ZmZpeCBvcHRpb24gdGhhdCBzcGVjaWZpZXMgdGhlCiAgZXhlY3V0YWJsZSBzdWZmaXguICBUaGlzIGlzIHVzZWZ1bCBmb3IgYnVpbGRzIG9uIEN5Z3dpbiBhbmQgTWFjIE9TCiAgWCwgZm9yIGV4YW1wbGUuCgotIFRoZSBtbWFwLlBBR0VTSVpFIGNvbnN0YW50IGlzIG5vdyBpbml0aWFsaXplZCB1c2luZyBzeXNjb25mIHdoZW4KICBwb3NzaWJsZSwgd2hpY2ggZWxpbWluYXRlcyBhIGRlcGVuZGVuY3kgb24gLWx1Y2IgZm9yIFJlbGlhbnQgVU5JWC4KCi0gVGhlIG1kNSBmaWxlIHNob3VsZCBub3cgY29tcGlsZSBvbiBhbGwgcGxhdGZvcm1zLgoKLSBUaGUgc2VsZWN0IG1vZHVsZSBub3cgY29tcGlsZXMgb24gcGxhdGZvcm1zIHRoYXQgZG8gbm90IGRlZmluZQogIFBPTExSRE5PUk0gYW5kIHJlbGF0ZWQgY29uc3RhbnRzLgoKLSBEYXJ3aW4gKE1hYyBPUyBYKTogIEluaXRpYWwgc3VwcG9ydCBmb3Igc3RhdGljIGJ1aWxkcyBvbiB0aGlzCiAgcGxhdGZvcm0uCgotIEJlT1M6IEEgbnVtYmVyIG9mIGNoYW5nZXMgd2VyZSBtYWRlIHRvIHRoZSBidWlsZCBhbmQgaW5zdGFsbGF0aW9uCiAgcHJvY2Vzcy4gIGFyLWZha2Ugbm93IG9wZXJhdGVzIG9uIGEgZGlyZWN0b3J5IG9mIG9iamVjdCBmaWxlcy4KICBkbF9leHBvcnQuaCBpcyBnb25lLCBhbmQgaXRzIG1hY3JvcyBub3cgYXBwZWFyIG9uIHRoZSBtd2NjIGNvbW1hbmQKICBsaW5lIGR1cmluZyBidWlsZCBvbiBQUEMgQmVPUy4KCi0gUGxhdGZvcm0gZGlyZWN0b3J5IGluIGxpYi9weXRob24yLjAgaXMgInBsYXQtYmVvczUiIChvcgogICJwbGF0LWJlb3M0IiwgaWYgYnVpbGRpbmcgb24gQmVPUyA0LjUpLCByYXRoZXIgdGhhbiAicGxhdC1iZW9zIi4KCi0gQ3lnd2luOiBTdXBwb3J0IGZvciBzaGFyZWQgbGlicmFyaWVzLCBUa2ludGVyLCBhbmQgc29ja2V0cy4KCi0gU3VuT1MgNC4xLjRfSkw6IEZpeCB0ZXN0IGZvciBkaXJlY3RvcnkgZXhpc3RlbmNlIGluIGNvbmZpZ3VyZS4KClRvb2xzIGFuZCBvdGhlciBtaXNjZWxsYW55CgotIFJlbW92ZWQgZGVidWdnaW5nIHByaW50cyBmcm9tIG1haW4gdXNlZCB3aXRoIGZyZWV6ZS4KCi0gSURMRSBhdXRvLWluZGVudCBubyBsb25nZXIgY3Jhc2hlcyB3aGVuIGl0IGVuY291bnRlcnMgVW5pY29kZQogIGNoYXJhY3RlcnMuCgpXaGF0J3MgbmV3IGluIDIuMCBiZXRhIDIgKHNpbmNlIGJldGEgMSk/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkNvcmUgbGFuZ3VhZ2UsIGJ1aWx0aW5zLCBhbmQgaW50ZXJwcmV0ZXIKCi0gQWRkIHN1cHBvcnQgZm9yIHVuYm91bmRlZCBpbnRzIGluICVkLGksdSx4LFgsbyBmb3JtYXRzOyBmb3IgZXhhbXBsZQogICIlZCIgJSAyTCoqNjQgPT0gIjE4NDQ2NzQ0MDczNzA5NTUxNjE2Ii4KCi0gQWRkIC1oIGFuZCAtViBjb21tYW5kIGxpbmUgb3B0aW9ucyB0byBwcmludCB0aGUgdXNhZ2UgbWVzc2FnZSBhbmQKICBQeXRob24gdmVyc2lvbiBudW1iZXIgYW5kIGV4aXQgaW1tZWRpYXRlbHkuCgotIGV2YWwoKSBhbmQgZXhlYyBhY2NlcHQgVW5pY29kZSBvYmplY3RzIGFzIGNvZGUgcGFyYW1ldGVycy4KCi0gZ2V0YXR0cigpIGFuZCBzZXRhdHRyKCkgbm93IGFsc28gYWNjZXB0IFVuaWNvZGUgb2JqZWN0cyBmb3IgdGhlCiAgYXR0cmlidXRlIG5hbWUsIHdoaWNoIGFyZSBjb252ZXJ0ZWQgdG8gc3RyaW5ncyB1c2luZyB0aGUgZGVmYXVsdAogIGVuY29kaW5nIGJlZm9yZSBsb29rdXAuCgotIE11bHRpcGxpY2F0aW9uIG9uIHN0cmluZyBhbmQgVW5pY29kZSBub3cgZG9lcyBwcm9wZXIgYm91bmRzCiAgY2hlY2tpbmc7IGUuZy4gJ2EnICogNjU1MzYgKiA2NTUzNiB3aWxsIHJhaXNlIFZhbHVlRXJyb3IsICJyZXBlYXRlZAogIHN0cmluZyBpcyB0b28gbG9uZy4iCgotIEJldHRlciBlcnJvciBtZXNzYWdlIHdoZW4gY29udGludWUgaXMgZm91bmQgaW4gdHJ5IHN0YXRlbWVudCBpbiBhCiAgbG9vcC4KCgpTdGFuZGFyZCBsaWJyYXJ5IGFuZCBleHRlbnNpb25zCgotIHNvY2tldCBtb2R1bGU6IHRoZSBPcGVuU1NMIGNvZGUgbm93IGFkZHMgc3VwcG9ydCBmb3IgUkFORF9zdGF0dXMoKQogIGFuZCBFR0QgKEVudHJvcHkgR2F0aGVyaW5nIERldmljZSkuCgotIGFycmF5OiByZXZlcnNlKCkgbWV0aG9kIG9mIGFycmF5IG5vdyB3b3Jrcy4gIGJ1ZmZlcl9pbmZvKCkgbm93IGRvZXMKICBhcmd1bWVudCBjaGVja2luZzsgaXQgc3RpbGwgdGFrZXMgbm8gYXJndW1lbnRzLgoKLSBhc3luY29yZS9hc3luY2hhdDogSW5jbHVkZWQgbW9zdCByZWNlbnQgdmVyc2lvbiBmcm9tIFNhbSBSdXNoaW5nLgoKLSBjZ2k6IEFjY2VwdCAnJicgb3IgJzsnIGFzIHNlcGFyYXRvciBjaGFyYWN0ZXJzIHdoZW4gcGFyc2luZyBmb3JtIGRhdGEuCgotIENHSUhUVFBTZXJ2ZXI6IE5vdyB3b3JrcyBvbiBXaW5kb3dzIChhbmQgcGVyaGFwcyBldmVuIE1hYykuCgotIENvbmZpZ1BhcnNlcjogV2hlbiByZWFkaW5nIHRoZSBmaWxlLCBvcHRpb25zIHNwZWxsZWQgaW4gdXBwZXIgY2FzZQogIGxldHRlcnMgYXJlIG5vdyBjb3JyZWN0bHkgY29udmVydGVkIHRvIGxvd2VyY2FzZS4KCi0gY29weTogQ29weSBVbmljb2RlIG9iamVjdHMgYXRvbWljYWxseS4KCi0gY1BpY2tsZTogRmFpbCBncmFjZWZ1bGx5IHdoZW4gY29weV9yZWcgY2FuJ3QgYmUgaW1wb3J0ZWQuCgotIGNTdHJpbmdJTzogSW1wbGVtZW50ZWQgcmVhZGxpbmVzKCkgbWV0aG9kLgoKLSBkYm06IEFkZCBnZXQoKSBhbmQgc2V0ZGVmYXVsdCgpIG1ldGhvZHMgdG8gZGJtIG9iamVjdC4gIEFkZCBjb25zdGFudAogIGBsaWJyYXJ5JyB0byBtb2R1bGUgdGhhdCBuYW1lcyB0aGUgbGlicmFyeSB1c2VkLiAgQWRkZWQgZG9jIHN0cmluZ3MKICBhbmQgbWV0aG9kIG5hbWVzIHRvIGVycm9yIG1lc3NhZ2VzLiAgVXNlcyBjb25maWd1cmUgdG8gZGV0ZXJtaW5lCiAgd2hpY2ggbmRibS5oIGZpbGUgdG8gaW5jbHVkZTsgQmVya2VsZXkgREIncyBuYmRtIGFuZCBHREJNJ3MgbmRibSBpcwogIG5vdyBhdmFpbGFibGUgb3B0aW9ucy4KCi0gZGlzdHV0aWxzOiBVcGRhdGUgdG8gdmVyc2lvbiAwLjkuMy4KCi0gZGw6IEFkZCBzZXZlcmFsIGRsLlJUTERfIGNvbnN0YW50cy4KCi0gZnBlY3RsOiBOb3cgc3VwcG9ydGVkIG9uIEZyZWVCU0QuCgotIGdjOiBBZGQgREVCVUdfU0FWRUFMTCBvcHRpb24uICBXaGVuIGVuYWJsZWQgYWxsIGdhcmJhZ2Ugb2JqZWN0cwogIGZvdW5kIGJ5IHRoZSBjb2xsZWN0b3Igd2lsbCBiZSBzYXZlZCBpbiBnYy5nYXJiYWdlLiAgVGhpcyBpcyB1c2VmdWwKICBmb3IgZGVidWdnaW5nIGEgcHJvZ3JhbSB0aGF0IGNyZWF0ZXMgcmVmZXJlbmNlIGN5Y2xlcy4KCi0gaHR0cGxpYjogVGhyZWUgY2hhbmdlczogUmVzdG9yZSBzdXBwb3J0IGZvciBzZXRfZGVidWdsZXZlbCBmZWF0dXJlCiAgb2YgSFRUUCBjbGFzcy4gIERvIG5vdCBjbG9zZSBzb2NrZXQgb24gemVyby1sZW5ndGggcmVzcG9uc2UuICBEbyBub3QKICBjcmFzaCB3aGVuIHNlcnZlciBzZW5kcyBpbnZhbGlkIGNvbnRlbnQtbGVuZ3RoIGhlYWRlci4KCi0gbWFpbGJveDogTWFpbGJveCBjbGFzcyBjb25mb3JtcyBiZXR0ZXIgdG8gcW1haWwgc3BlY2lmaWNhdGlvbnMuCgotIG1hcnNoYWw6IFdoZW4gcmVhZGluZyBhIHNob3J0LCBzaWduLWV4dGVuZCBvbiBwbGF0Zm9ybXMgd2hlcmUgc2hvcnRzCiAgYXJlIGJpZ2dlciB0aGFuIDE2IGJpdHMuICBXaGVuIHJlYWRpbmcgYSBsb25nLCByZXBhaXIgdGhlIHVucG9ydGFibGUKICBzaWduIGV4dGVuc2lvbiB0aGF0IHdhcyBiZWluZyBkb25lIGZvciA2NC1iaXQgbWFjaGluZXMuICAoSXQgYXNzdW1lZAogIHRoYXQgc2lnbmVkIHJpZ2h0IHNoaWZ0IHNpZ24tZXh0ZW5kcy4pCgotIG9wZXJhdG9yOiBBZGQgY29udGFpbnMoKSwgaW52ZXJ0KCksIF9faW52ZXJ0X18oKSBhcyBhbGlhc2VzIGZvcgogIF9fY29udGFpbnNfXygpLCBpbnYoKSwgYW5kIF9faW52X18oKSByZXNwZWN0aXZlbHkuCgotIG9zOiBBZGQgc3VwcG9ydCBmb3IgcG9wZW4yKCkgYW5kIHBvcGVuMygpIG9uIGFsbCBwbGF0Zm9ybXMgd2hlcmUKICBmb3JrKCkgZXhpc3RzLiAgKHBvcGVuNCgpIGlzIHN0aWxsIGluIHRoZSB3b3Jrcy4pCgotIG9zOiAoV2luZG93cyBvbmx5OikgQWRkIHN0YXJ0ZmlsZSgpIGZ1bmN0aW9uIHRoYXQgYWN0cyBsaWtlIGRvdWJsZS0KICBjbGlja2luZyBvbiBhIGZpbGUgaW4gRXhwbG9yZXIgKG9yIHBhc3NpbmcgdGhlIGZpbGUgbmFtZSB0byB0aGUKICBET1MgInN0YXJ0IiBjb21tYW5kKS4KCi0gb3MucGF0aDogKFdpbmRvd3MsIERPUzopIFRyZWF0IHRyYWlsaW5nIGNvbG9uIGNvcnJlY3RseSBpbgogIG9zLnBhdGguam9pbi4gIG9zLnBhdGguam9pbigiYToiLCAiYiIpIHlpZWxkcyAiYTpiIi4KCi0gcGlja2xlOiBOb3cgcmFpc2VzIFZhbHVlRXJyb3Igd2hlbiBhbiBpbnZhbGlkIHBpY2tsZSB0aGF0IGNvbnRhaW5zCiAgYSBub24tc3RyaW5nIHJlcHIgd2hlcmUgYSBzdHJpbmcgcmVwciB3YXMgZXhwZWN0ZWQuICBUaGlzIGJlaGF2aW9yCiAgbWF0Y2hlcyBjUGlja2xlLgoKLSBwb3NpeGZpbGU6IFJlbW92ZSBicm9rZW4gX19kZWxfXygpIG1ldGhvZC4KCi0gcHlfY29tcGlsZTogc3VwcG9ydCBDUitMRiBsaW5lIHRlcm1pbmF0b3JzIGluIHNvdXJjZSBmaWxlLgoKLSByZWFkbGluZTogRG9lcyBub3QgaW1tZWRpYXRlbHkgZXhpdCB3aGVuIF5DIGlzIGhpdCB3aGVuIHJlYWRsaW5lIGFuZAogIHRocmVhZHMgYXJlIGNvbmZpZ3VyZWQuICBBZGRzIGRlZmluaXRpb24gb2YgcmxfbGlicmFyeV92ZXJzaW9uLiAgKFRoZQogIGxhdHRlciBhZGRpdGlvbiByZXF1aXJlcyBHTlUgcmVhZGxpbmUgMi4yIG9yIGxhdGVyLikKCi0gcmZjODIyOiBEb21haW4gbGl0ZXJhbHMgcmV0dXJuZWQgYnkgQWRkcmxpc3RDbGFzcyBtZXRob2QKICBnZXRkb21haW5saXRlcmFsKCkgYXJlIG5vdyBwcm9wZXJseSB3cmFwcGVkIGluIGJyYWNrZXRzLgoKLSBzaXRlOiBzeXMuc2V0ZGVmYXVsdGVuY29kaW5nKCkgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGluIGNhc2UgdGhlCiAgc3RhbmRhcmQgZGVmYXVsdCBlbmNvZGluZyAoImFzY2lpIikgaXMgY2hhbmdlZC4gVGhpcyBzYXZlcyBxdWl0ZSBhCiAgZmV3IGN5Y2xlcyBkdXJpbmcgc3RhcnR1cCBzaW5jZSB0aGUgZmlyc3QgY2FsbCB0bwogIHNldGRlZmF1bHRlbmNvZGluZygpIHdpbGwgaW5pdGlhbGl6ZSB0aGUgY29kZWMgcmVnaXN0cnkgYW5kIHRoZQogIGVuY29kaW5ncyBwYWNrYWdlLgoKLSBzb2NrZXQ6IFN1cHBvcnQgZm9yIHNpemUgaGludCBpbiByZWFkbGluZXMoKSBtZXRob2Qgb2Ygb2JqZWN0IHJldHVybmVkCiAgYnkgbWFrZWZpbGUoKS4KCi0gc3JlOiBBZGRlZCBleHBlcmltZW50YWwgZXhwYW5kKCkgbWV0aG9kIHRvIG1hdGNoIG9iamVjdHMuICBEb2VzIG5vdAogIHVzZSBidWZmZXIgaW50ZXJmYWNlIG9uIFVuaWNvZGUgc3RyaW5ncy4gIERvZXMgbm90IGhhbmcgaWYgZ3JvdXAgaWQKICBpcyBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlLgoKLSBTdHJpbmdJTzogU2l6ZSBoaW50IGluIHJlYWRsaW5lcygpIGlzIG5vdyBzdXBwb3J0ZWQgYXMgZG9jdW1lbnRlZC4KCi0gc3RydWN0OiBDaGVjayByYW5nZXMgZm9yIGJ5dGVzIGFuZCBzaG9ydHMuCgotIHVybGxpYjogSW1wcm92ZWQgaGFuZGxpbmcgb2Ygd2luMzIgcHJveHkgc2V0dGluZ3MuIEZpeGVkIHF1b3RlIGFuZAogIHF1b3RlX3BsdXMgZnVuY3Rpb25zIHNvIHRoYXQgdGhlIGFsd2F5cyBlbmNvZGUgYSBjb21tYS4KCi0gVGtpbnRlcjogSW1hZ2Ugb2JqZWN0cyBhcmUgbm93IGd1YXJhbnRlZWQgdG8gaGF2ZSB1bmlxdWUgaWRzLiAgU2V0CiAgZXZlbnQuZGVsdGEgdG8gemVybyBpZiBUayB2ZXJzaW9uIGRvZXNuJ3Qgc3VwcG9ydCBtb3VzZXdoZWVsLgogIFJlbW92ZWQgc29tZSBkZWJ1Z2dpbmcgcHJpbnRzLgoKLSBVc2VyTGlzdDogbm93IGltcGxlbWVudHMgX19jb250YWluc19fKCkuCgotIHdlYmJyb3dzZXI6IE9uIFdpbmRvd3MsIHVzZSBvcy5zdGFydGZpbGUoKSBpbnN0ZWFkIG9mIG9zLnBvcGVuKCksCiAgd2hpY2ggd29ya3MgYXJvdW5kIGEgYnVnIGluIE5vcnRvbiBBbnRpVmlydXMgMjAwMCB0aGF0IGxlYWRzIGRpcmVjdGx5CiAgdG8gYSBCbHVlIFNjcmVlbiBmcmVlemUuCgotIHhtbDogTmV3IHZlcnNpb24gZGV0ZWN0aW9uIGNvZGUgYWxsb3dzIFB5WE1MIHRvIG92ZXJyaWRlIHN0YW5kYXJkCiAgWE1MIHBhY2thZ2UgaWYgUHlYTUwgdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gMC42LjEuCgotIHhtbC5kb206IERPTSBsZXZlbCAxIHN1cHBvcnQgZm9yIGJhc2ljIFhNTC4gIEluY2x1ZGVzIHhtbC5kb20ubWluaWRvbQogIChjb252ZW50aW9uYWwgRE9NKSwgYW5kIHhtbC5kb20ucHVsbGRvbSwgd2hpY2ggYWxsb3dzIGJ1aWxkaW5nIHRoZSBET00KICB0cmVlIG9ubHkgZm9yIG5vZGVzIHdoaWNoIGFyZSBzdWZmaWNpZW50bHkgaW50ZXJlc3RpbmcgdG8gYSBzcGVjaWZpYwogIGFwcGxpY2F0aW9uLiAgRG9lcyBub3QgcHJvdmlkZSB0aGUgSFRNTC1zcGVjaWZpYyBleHRlbnNpb25zLiAgU3RpbGwKICB1bmRvY3VtZW50ZWQuCgotIHhtbC5zYXg6IFNBWCAyIHN1cHBvcnQgZm9yIFB5dGhvbiwgaW5jbHVkaW5nIGFsbCB0aGUgaGFuZGxlcgogIGludGVyZmFjZXMgbmVlZGVkIHRvIHByb2Nlc3MgWE1MIDEuMCBjb21wbGlhbnQgWE1MLiAgU29tZQogIGRvY3VtZW50YXRpb24gaXMgYWxyZWFkeSBhdmFpbGFibGUuCgotIHB5ZXhwYXQ6IFJlbmFtZWQgdG8geG1sLnBhcnNlcnMuZXhwYXQgc2luY2UgdGhpcyBpcyBwYXJ0IG9mIHRoZSBuZXcsCiAgcGFja2FnaXplZCBYTUwgc3VwcG9ydC4KCgpDIEFQSQoKLSBBZGQgdGhyZWUgbmV3IGNvbnZlbmllbmNlIGZ1bmN0aW9ucyBmb3IgbW9kdWxlIGluaXRpYWxpemF0aW9uIC0tCiAgUHlNb2R1bGVfQWRkT2JqZWN0KCksIFB5TW9kdWxlX0FkZEludENvbnN0YW50KCksIGFuZAogIFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KCkuCgotIENsZWFuZWQgdXAgZGVmaW5pdGlvbiBvZiBOVUxMIGluIEMgc291cmNlIGNvZGU7IGFsbCBkZWZpbml0aW9ucyB3ZXJlCiAgcmVtb3ZlZCBhbmQgYWRkICNlcnJvciB0byBQeXRob24uaCBpZiBOVUxMIGlzbid0IGRlZmluZWQgYWZ0ZXIKICAjaW5jbHVkZSBvZiBzdGRpby5oLgoKLSBQeV9QUk9UTygpIG1hY3JvcyB0aGF0IHdlcmUgcmVtb3ZlZCBpbiAyLjBiMSBoYXZlIGJlZW4gcmVzdG9yZWQgZm9yCiAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKGF0IHRoZSBzb3VyY2UgbGV2ZWwpIHdpdGggb2xkIGV4dGVuc2lvbnMuCgotIEEgd3JhcHBlciBBUEkgd2FzIGFkZGVkIGZvciBzaWduYWwoKSBhbmQgc2lnYWN0aW9uKCkuICBJbnN0ZWFkIG9mCiAgZWl0aGVyIGZ1bmN0aW9uLCBhbHdheXMgdXNlIFB5T1NfZ2V0c2lnKCkgdG8gZ2V0IGEgc2lnbmFsIGhhbmRsZXIKICBhbmQgUHlPU19zZXRzaWcoKSB0byBzZXQgb25lLiAgQSBuZXcgY29udmVuaWVuY2UgdHlwZWRlZgogIFB5T1Nfc2lnaGFuZGxlcl90IGlzIGRlZmluZWQgZm9yIHRoZSB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycy4KCi0gQWRkIFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZSgpIGZ1bmN0aW9uIHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZQogIGludGVybmFsIGRhdGEgYnVmZmVyIGFuZCBzaXplIG9mIGEgc3RyaW5nIG9iamVjdCAtLSBvciB0aGUgZGVmYXVsdAogIGVuY29kZWQgdmVyc2lvbiBvZiBhIFVuaWNvZGUgb2JqZWN0LgoKLSBQeVN0cmluZ19TaXplKCkgYW5kIFB5U3RyaW5nX0FzU3RyaW5nKCkgYWNjZXB0IFVuaWNvZGUgb2JqZWN0cy4KCi0gVGhlIHN0YW5kYXJkIGhlYWRlciA8bGltaXRzLmg+IGlzIG5vdyBpbmNsdWRlZCBieSBQeXRob24uaCAoaWYgaXQKICBleGlzdHMpLiAgSU5UX01BWCBhbmQgTE9OR19NQVggd2lsbCBhbHdheXMgYmUgZGVmaW5lZCwgZXZlbiBpZgogIDxsaW1pdHMuaD4gaXMgbm90IGF2YWlsYWJsZS4KCi0gUHlGbG9hdF9Gcm9tU3RyaW5nIHRha2VzIGEgc2Vjb25kIGFyZ3VtZW50LCBwZW5kLCB0aGF0IHdhcwogIGVmZmVjdGl2ZWx5IHVzZWxlc3MuICBJdCBpcyBub3cgb2ZmaWNpYWxseSB1c2VsZXNzIGJ1dCBwcmVzZXJ2ZWQgZm9yCiAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuICBJZiB0aGUgcGVuZCBhcmd1bWVudCBpcyBub3QgTlVMTCwgKnBlbmQgaXMKICBzZXQgdG8gTlVMTC4KCi0gUHlPYmplY3RfR2V0QXR0cigpIGFuZCBQeU9iamVjdF9TZXRBdHRyKCkgbm93IGFjY2VwdCBVbmljb2RlIG9iamVjdHMKICBmb3IgdGhlIGF0dHJpYnV0ZSBuYW1lLiAgU2VlIG5vdGUgb24gZ2V0YXR0cigpIGFib3ZlLgoKLSBBIGZldyBidWcgZml4ZXMgdG8gYXJndW1lbnQgcHJvY2Vzc2luZyBmb3IgVW5pY29kZS4KICBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoKSBub3cgYWNjZXB0cyAiZXMjIiBhbmQgImVzIi4KICBQeUFyZ19QYXJzZSgpIHNwZWNpYWwgY2FzZXMgInMjIiBmb3IgVW5pY29kZSBvYmplY3RzOyBpdCByZXR1cm5zIGEKICBwb2ludGVyIHRvIHRoZSBkZWZhdWx0IGVuY29kZWQgc3RyaW5nIGRhdGEgaW5zdGVhZCBvZiB0byB0aGUgcmF3CiAgVVRGLTE2LgoKLSBQeV9CdWlsZFZhbHVlIGFjY2VwdHMgQiBmb3JtYXQgKGZvciBiZ2VuLWdlbmVyYXRlZCBjb2RlKS4KCgpJbnRlcm5hbHMKCi0gT24gVW5peCwgZml4IGNvZGUgZm9yIGZpbmRpbmcgUHl0aG9uIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgc28gdGhhdAogIGl0IHdvcmtzIHdoZW4gYXJndlswXSBpcyBhIHJlbGF0aXZlIHBhdGguCgotIEFkZGVkIGEgdHJ1ZSB1bmljb2RlX2ludGVybmFsX2VuY29kZSgpIGZ1bmN0aW9uIGFuZCBmaXhlZCB0aGUKICB1bmljb2RlX2ludGVybmFsX2RlY29kZSBmdW5jdGlvbigpIHRvIHN1cHBvcnQgVW5pY29kZSBvYmplY3RzIGRpcmVjdGx5CiAgcmF0aGVyIHRoYW4gYnkgZ2VuZXJhdGluZyBhIGNvcHkgb2YgdGhlIG9iamVjdC4KCi0gU2V2ZXJhbCBvZiB0aGUgaW50ZXJuYWwgVW5pY29kZSB0YWJsZXMgYXJlIG11Y2ggc21hbGxlciBub3csIGFuZAogIHRoZSBzb3VyY2UgY29kZSBzaG91bGQgYmUgbXVjaCBmcmllbmRsaWVyIHRvIHdlYWtlciBjb21waWxlcnMuCgotIEluIHRoZSBnYXJiYWdlIGNvbGxlY3RvcjogRml4ZWQgYnVnIGluIGNvbGxlY3Rpb24gb2YgdHVwbGVzLiAgRml4ZWQKICBidWcgdGhhdCBjYXVzZWQgc29tZSBpbnN0YW5jZXMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBjb250YWluZXIgc2V0CiAgd2hpbGUgdGhleSB3ZXJlIHN0aWxsIGxpdmUuICBGaXhlZCBwYXJzaW5nIGluIGdjLnNldF9kZWJ1ZygpIGZvcgogIHBsYXRmb3JtcyB3aGVyZSBzaXplb2YobG9uZykgPiBzaXplb2YoaW50KS4KCi0gRml4ZWQgcmVmY291bnQgcHJvYmxlbSBpbiBpbnN0YW5jZSBkZWFsbG9jYXRpb24gdGhhdCBvbmx5IG9jY3VycmVkCiAgd2hlbiBQeV9SRUZfREVCVUcgd2FzIGRlZmluZWQgYW5kIFB5X1RSQUNFX1JFRlMgd2FzIG5vdC4KCi0gT24gV2luZG93cywgZ2V0cHl0aG9ucmVncGF0aCBpcyBub3cgcHJvdGVjdGVkIGFnYWluc3QgbnVsbCBkYXRhIGluCiAgcmVnaXN0cnkga2V5LgoKLSBPbiBVbml4LCBjcmVhdGUgLnB5Yy8ucHlvIGZpbGVzIHdpdGggT19FWENMIGZsYWcgdG8gYXZvaWQgYSByYWNlCiAgY29uZGl0aW9uLgoKCkJ1aWxkIGFuZCBwbGF0Zm9ybS1zcGVjaWZpYyBpc3N1ZXMKCi0gQmV0dGVyIHN1cHBvcnQgb2YgR05VIFB0aCB2aWEgLS13aXRoLXB0aCBjb25maWd1cmUgb3B0aW9uLgoKLSBQeXRob24vQyBBUEkgbm93IHByb3Blcmx5IGV4cG9zZWQgdG8gZHluYW1pY2FsbHktbG9hZGVkIGV4dGVuc2lvbgogIG1vZHVsZXMgb24gUmVsaWFudCBVTklYLgoKLSBDaGFuZ2VzIGZvciB0aGUgYmVuZWZpdCBvZiBTdW5PUyA0LjEuNCAocmVhbGx5ISkuICBtbWFwbW9kdWxlLmM6CiAgRG9uJ3QgZGVmaW5lIE1TX1NZTkMgdG8gYmUgemVybyB3aGVuIGl0IGlzIHVuZGVmaW5lZC4gIEFkZGVkIG1pc3NpbmcKICBwcm90b3R5cGVzIGluIHBvc2l4bW9kdWxlLmMuCgotIEltcHJvdmVkIHN1cHBvcnQgZm9yIEhQLVVYIGJ1aWxkLiAgVGhyZWFkcyBzaG91bGQgbm93IGJlIGNvcnJlY3RseQogIGNvbmZpZ3VyZWQgKG9uIEhQLVVYIDEwLjIwIGFuZCAxMS4wMCkuCgotIEZpeCBsYXJnZWZpbGUgc3VwcG9ydCBvbiBvbGRlciBOZXRCU0Qgc3lzdGVtcyBhbmQgT3BlbkJTRCBieSBhZGRpbmcKICBkZWZpbmUgZm9yIFRFTEw2NC4KCgpUb29scyBhbmQgb3RoZXIgbWlzY2VsbGFueQoKLSBmdHBtaXJyb3I6IENhbGwgdG8gbWFpbigpIGlzIHdyYXBwZWQgaW4gaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIi4KCi0gZnJlZXplOiBUaGUgbW9kdWxlZmluZGVyIG5vdyB3b3JrcyB3aXRoIDIuMCBvcGNvZGVzLgoKLSBJRExFOgogIE1vdmUgaGFja2VyeSBvZiBzeXMuYXJndiB1bnRpbCBhZnRlciB0aGUgVGsgaW5zdGFuY2UgaGFzIGJlZW4KICBjcmVhdGVkLCB3aGljaCBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uLXNwZWNpZmljIFRraW50ZXIKICBpbml0aWFsaXphdGlvbiB0byBiZSBleGVjdXRlZCBpZiBwcmVzZW50OyBhbHNvIHBhc3MgYW4gZXhwbGljaXQKICBjbGFzc05hbWUgcGFyYW1ldGVyIHRvIHRoZSBUaygpIGNvbnN0cnVjdG9yLgoKCldoYXQncyBuZXcgaW4gMi4wIGJldGEgMT8KPT09PT09PT09PT09PT09PT09PT09PT09PQoKU291cmNlIEluY29tcGF0aWJpbGl0aWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKTm9uZS4gIE5vdGUgdGhhdCAxLjYgaW50cm9kdWNlZCBzZXZlcmFsIGluY29tcGF0aWJpbGl0aWVzIHdpdGggMS41LjIsCnN1Y2ggYXMgc2luZ2xlLWFyZ3VtZW50IGFwcGVuZCgpLCBjb25uZWN0KCkgYW5kIGJpbmQoKSwgYW5kIGNoYW5nZXMgdG8Kc3RyKGxvbmcpIGFuZCByZXByKGZsb2F0KS4KCgpCaW5hcnkgSW5jb21wYXRpYmlsaXRpZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgotIFRoaXJkIHBhcnR5IGV4dGVuc2lvbnMgYnVpbHQgZm9yIFB5dGhvbiAxLjUueCBvciAxLjYgY2Fubm90IGJlIHVzZWQKd2l0aCBQeXRob24gMi4wOyB0aGVzZSBleHRlbnNpb25zIHdpbGwgaGF2ZSB0byBiZSByZWJ1aWx0IGZvciBQeXRob24KMi4wLgoKLSBPbiBXaW5kb3dzLCBhdHRlbXB0aW5nIHRvIGltcG9ydCBhIHRoaXJkIHBhcnR5IGV4dGVuc2lvbiBidWlsdCBmb3IKUHl0aG9uIDEuNS54IG9yIDEuNiByZXN1bHRzIGluIGFuIGltbWVkaWF0ZSBjcmFzaDsgdGhlcmUncyBub3QgbXVjaCB3ZQpjYW4gZG8gYWJvdXQgdGhpcy4gIENoZWNrIHlvdXIgUFlUSE9OUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSEKCi0gUHl0aG9uIGJ5dGVjb2RlIGZpbGVzICgqLnB5YyBhbmQgKi5weW8pIGFyZSBub3QgY29tcGF0aWJsZSBiZXR3ZWVuCnJlbGVhc2VzLgoKCk92ZXJ2aWV3IG9mIENoYW5nZXMgU2luY2UgMS42Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpUaGVyZSBhcmUgbWFueSBuZXcgbW9kdWxlcyAoaW5jbHVkaW5nIGJyYW5kIG5ldyBYTUwgc3VwcG9ydCB0aHJvdWdoCnRoZSB4bWwgcGFja2FnZSwgYW5kIGkxOG4gc3VwcG9ydCB0aHJvdWdoIHRoZSBnZXR0ZXh0IG1vZHVsZSk7IGEgbGlzdApvZiBhbGwgbmV3IG1vZHVsZXMgaXMgaW5jbHVkZWQgYmVsb3cuICBMb3RzIG9mIGJ1Z3MgaGF2ZSBiZWVuIGZpeGVkLgoKVGhlIHByb2Nlc3MgZm9yIG1ha2luZyBtYWpvciBuZXcgY2hhbmdlcyB0byB0aGUgbGFuZ3VhZ2UgaGFzIGNoYW5nZWQKc2luY2UgUHl0aG9uIDEuNi4gIEVuaGFuY2VtZW50cyBtdXN0IG5vdyBiZSBkb2N1bWVudGVkIGJ5IGEgUHl0aG9uCkVuaGFuY2VtZW50IFByb3Bvc2FsIChQRVApIGJlZm9yZSB0aGV5IGNhbiBiZSBhY2NlcHRlZC4KClRoZXJlIGFyZSBzZXZlcmFsIGltcG9ydGFudCBzeW50YXggZW5oYW5jZW1lbnRzLCBkZXNjcmliZWQgaW4gbW9yZQpkZXRhaWwgYmVsb3c6CgogIC0gQXVnbWVudGVkIGFzc2lnbm1lbnQsIGUuZy4geCArPSAxCgogIC0gTGlzdCBjb21wcmVoZW5zaW9ucywgZS5nLiBbeCoqMiBmb3IgeCBpbiByYW5nZSgxMCldCgogIC0gRXh0ZW5kZWQgaW1wb3J0IHN0YXRlbWVudCwgZS5nLiBpbXBvcnQgTW9kdWxlIGFzIE5hbWUKCiAgLSBFeHRlbmRlZCBwcmludCBzdGF0ZW1lbnQsIGUuZy4gcHJpbnQgPj4gZmlsZSwgIkhlbGxvIgoKT3RoZXIgaW1wb3J0YW50IGNoYW5nZXM6CgogIC0gT3B0aW9uYWwgY29sbGVjdGlvbiBvZiBjeWNsaWNhbCBnYXJiYWdlCgpQeXRob24gRW5oYW5jZW1lbnQgUHJvcG9zYWwgKFBFUCkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpQRVAgc3RhbmRzIGZvciBQeXRob24gRW5oYW5jZW1lbnQgUHJvcG9zYWwuICBBIFBFUCBpcyBhIGRlc2lnbgpkb2N1bWVudCBwcm92aWRpbmcgaW5mb3JtYXRpb24gdG8gdGhlIFB5dGhvbiBjb21tdW5pdHksIG9yIGRlc2NyaWJpbmcKYSBuZXcgZmVhdHVyZSBmb3IgUHl0aG9uLiAgVGhlIFBFUCBzaG91bGQgcHJvdmlkZSBhIGNvbmNpc2UgdGVjaG5pY2FsCnNwZWNpZmljYXRpb24gb2YgdGhlIGZlYXR1cmUgYW5kIGEgcmF0aW9uYWxlIGZvciB0aGUgZmVhdHVyZS4KCldlIGludGVuZCBQRVBzIHRvIGJlIHRoZSBwcmltYXJ5IG1lY2hhbmlzbXMgZm9yIHByb3Bvc2luZyBuZXcKZmVhdHVyZXMsIGZvciBjb2xsZWN0aW5nIGNvbW11bml0eSBpbnB1dCBvbiBhbiBpc3N1ZSwgYW5kIGZvcgpkb2N1bWVudGluZyB0aGUgZGVzaWduIGRlY2lzaW9ucyB0aGF0IGhhdmUgZ29uZSBpbnRvIFB5dGhvbi4gIFRoZSBQRVAKYXV0aG9yIGlzIHJlc3BvbnNpYmxlIGZvciBidWlsZGluZyBjb25zZW5zdXMgd2l0aGluIHRoZSBjb21tdW5pdHkgYW5kCmRvY3VtZW50aW5nIGRpc3NlbnRpbmcgb3BpbmlvbnMuCgpUaGUgUEVQcyBhcmUgYXZhaWxhYmxlIGF0IGh0dHA6Ly9weXRob24uc291cmNlZm9yZ2UubmV0L3BlcHMvLgoKQXVnbWVudGVkIEFzc2lnbm1lbnQKLS0tLS0tLS0tLS0tLS0tLS0tLS0KClRoaXMgbXVzdCBoYXZlIGJlZW4gdGhlIG1vc3QtcmVxdWVzdGVkIGZlYXR1cmUgb2YgdGhlIHBhc3QgeWVhcnMhCkVsZXZlbiBuZXcgYXNzaWdubWVudCBvcGVyYXRvcnMgd2VyZSBhZGRlZDoKCiAgICArPSAtPSAqPSAvPSAlPSAqKj0gPDw9ID4+PSAmPSBePSB8PQoKRm9yIGV4YW1wbGUsCgogICAgQSArPSBCCgppcyBzaW1pbGFyIHRvCgogICAgQSA9IEEgKyBCCgpleGNlcHQgdGhhdCBBIGlzIGV2YWx1YXRlZCBvbmx5IG9uY2UgKHJlbGV2YW50IHdoZW4gQSBpcyBzb21ldGhpbmcKbGlrZSBkaWN0W2luZGV4XS5hdHRyKS4KCkhvd2V2ZXIsIGlmIEEgaXMgYSBtdXRhYmxlIG9iamVjdCwgQSBtYXkgYmUgbW9kaWZpZWQgaW4gcGxhY2UuICBUaHVzLAppZiBBIGlzIGEgbnVtYmVyIG9yIGEgc3RyaW5nLCBBICs9IEIgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBBID0gQStCCihleGNlcHQgQSBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlKTsgYnV0IGlmIGEgaXMgYSBsaXN0LCBBICs9IEIgaGFzIHRoZQpzYW1lIGVmZmVjdCBhcyBBLmV4dGVuZChCKSEKCkNsYXNzZXMgYW5kIGJ1aWx0LWluIG9iamVjdCB0eXBlcyBjYW4gb3ZlcnJpZGUgdGhlIG5ldyBvcGVyYXRvcnMgaW4Kb3JkZXIgdG8gaW1wbGVtZW50IHRoZSBpbi1wbGFjZSBiZWhhdmlvcjsgdGhlIG5vdC1pbi1wbGFjZSBiZWhhdmlvciBpcwp1c2VkIGF1dG9tYXRpY2FsbHkgYXMgYSBmYWxsYmFjayB3aGVuIGFuIG9iamVjdCBkb2Vzbid0IGltcGxlbWVudCB0aGUKaW4tcGxhY2UgYmVoYXZpb3IuICBGb3IgY2xhc3NlcywgdGhlIG1ldGhvZCBuYW1lIGlzIGRlcml2ZWQgZnJvbSB0aGUKbWV0aG9kIG5hbWUgZm9yIHRoZSBjb3JyZXNwb25kaW5nIG5vdC1pbi1wbGFjZSBvcGVyYXRvciBieSBpbnNlcnRpbmcKYW4gJ2knIGluIGZyb250IG9mIHRoZSBuYW1lLCBlLmcuIF9faWFkZF9fIGltcGxlbWVudHMgaW4tcGxhY2UKX19hZGRfXy4KCkF1Z21lbnRlZCBhc3NpZ25tZW50IHdhcyBpbXBsZW1lbnRlZCBieSBUaG9tYXMgV291dGVycy4KCgpMaXN0IENvbXByZWhlbnNpb25zCi0tLS0tLS0tLS0tLS0tLS0tLS0KClRoaXMgaXMgYSBmbGV4aWJsZSBuZXcgbm90YXRpb24gZm9yIGxpc3RzIHdob3NlIGVsZW1lbnRzIGFyZSBjb21wdXRlZApmcm9tIGFub3RoZXIgbGlzdCAob3IgbGlzdHMpLiAgVGhlIHNpbXBsZXN0IGZvcm0gaXM6CgogICAgWzxleHByZXNzaW9uPiBmb3IgPHZhcmlhYmxlPiBpbiA8c2VxdWVuY2U+XQoKRm9yIGV4YW1wbGUsIFtpKioyIGZvciBpIGluIHJhbmdlKDQpXSB5aWVsZHMgdGhlIGxpc3QgWzAsIDEsIDQsIDldLgpUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gYSBmb3IgbG9vcCB3aXRoIGEgbGlzdC5hcHBlbmQoKSBjYWxsLgoKWW91IGNhbiBhbHNvIGFkZCBhIGNvbmRpdGlvbjoKCiAgICBbPGV4cHJlc3Npb24+IGZvciA8dmFyaWFibGU+IGluIDxzZXF1ZW5jZT4gaWYgPGNvbmRpdGlvbj5dCgpGb3IgZXhhbXBsZSwgW3cgZm9yIHcgaW4gd29yZHMgaWYgdyA9PSB3Lmxvd2VyKCldIHdvdWxkIHlpZWxkIHRoZSBsaXN0Cm9mIHdvcmRzIHRoYXQgY29udGFpbiBubyB1cHBlcmNhc2UgY2hhcmFjdGVycy4gIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQKdGhhbiBhIGZvciBsb29wIHdpdGggYW4gaWYgc3RhdGVtZW50IGFuZCBhIGxpc3QuYXBwZW5kKCkgY2FsbC4KCllvdSBjYW4gYWxzbyBoYXZlIG5lc3RlZCBmb3IgbG9vcHMgYW5kIG1vcmUgdGhhbiBvbmUgJ2lmJyBjbGF1c2UuICBGb3IKZXhhbXBsZSwgaGVyZSdzIGEgZnVuY3Rpb24gdGhhdCBmbGF0dGVucyBhIHNlcXVlbmNlIG9mIHNlcXVlbmNlczo6CgogICAgZGVmIGZsYXR0ZW4oc2VxKToKICAgICAgICByZXR1cm4gW3ggZm9yIHN1YnNlcSBpbiBzZXEgZm9yIHggaW4gc3Vic2VxXQoKICAgIGZsYXR0ZW4oW1swXSwgWzEsMiwzXSwgWzQsNV0sIFs2LDcsOCw5XSwgW11dKQoKVGhpcyBwcmludHMKCiAgICBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOV0KCkxpc3QgY29tcHJlaGVuc2lvbnMgb3JpZ2luYXRlZCBhcyBhIHBhdGNoIHNldCBmcm9tIEdyZWcgRXdpbmc7IFNraXAKTW9udGFuYXJvIGFuZCBUaG9tYXMgV291dGVycyBhbHNvIGNvbnRyaWJ1dGVkLiAgRGVzY3JpYmVkIGJ5IFBFUCAyMDIuCgoKRXh0ZW5kZWQgSW1wb3J0IFN0YXRlbWVudAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpNYW55IHBlb3BsZSBoYXZlIGFza2VkIGZvciBhIHdheSB0byBpbXBvcnQgYSBtb2R1bGUgdW5kZXIgYSBkaWZmZXJlbnQKbmFtZS4gIFRoaXMgY2FuIGJlIGFjY29tcGxpc2hlZCBsaWtlIHRoaXM6CgogICAgaW1wb3J0IGZvbwogICAgYmFyID0gZm9vCiAgICBkZWwgZm9vCgpidXQgdGhpcyBjb21tb24gaWRpb20gZ2V0cyBvbGQgcXVpY2tseS4gIEEgc2ltcGxlIGV4dGVuc2lvbiBvZiB0aGUKaW1wb3J0IHN0YXRlbWVudCBub3cgYWxsb3dzIHRoaXMgdG8gYmUgd3JpdHRlbiBhcyBmb2xsb3dzOgoKICAgIGltcG9ydCBmb28gYXMgYmFyCgpUaGVyZSdzIGFsc28gYSB2YXJpYW50IGZvciAnZnJvbSAuLi4gaW1wb3J0JzoKCiAgICBmcm9tIGZvbyBpbXBvcnQgYmFyIGFzIHNwYW0KClRoaXMgYWxzbyB3b3JrcyB3aXRoIHBhY2thZ2VzOyBlLmcuIHlvdSBjYW4gd3JpdGUgdGhpczoKCiAgICBpbXBvcnQgdGVzdC5yZWdydGVzdCBhcyByZWdydGVzdAoKTm90ZSB0aGF0ICdhcycgaXMgbm90IGEgbmV3IGtleXdvcmQgLS0gaXQgaXMgcmVjb2duaXplZCBvbmx5IGluIHRoaXMKY29udGV4dCAodGhpcyBpcyBvbmx5IHBvc3NpYmxlIGJlY2F1c2UgdGhlIHN5bnRheCBmb3IgdGhlIGltcG9ydApzdGF0ZW1lbnQgZG9lc24ndCBpbnZvbHZlIGV4cHJlc3Npb25zKS4KCkltcGxlbWVudGVkIGJ5IFRob21hcyBXb3V0ZXJzLiAgRGVzY3JpYmVkIGJ5IFBFUCAyMjEuCgoKRXh0ZW5kZWQgUHJpbnQgU3RhdGVtZW50Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKRWFzaWx5IHRoZSBtb3N0IGNvbnRyb3ZlcnNpYWwgbmV3IGZlYXR1cmUsIHRoaXMgZXh0ZW5zaW9uIHRvIHRoZSBwcmludApzdGF0ZW1lbnQgYWRkcyBhbiBvcHRpb24gdG8gbWFrZSB0aGUgb3V0cHV0IGdvIHRvIGEgZGlmZmVyZW50IGZpbGUKdGhhbiB0aGUgZGVmYXVsdCBzeXMuc3Rkb3V0LgoKRm9yIGV4YW1wbGUsIHRvIHdyaXRlIGFuIGVycm9yIG1lc3NhZ2UgdG8gc3lzLnN0ZGVyciwgeW91IGNhbiBub3cKd3JpdGU6CgogICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIkVycm9yOiBiYWQgZG9nISIKCkFzIGEgc3BlY2lhbCBmZWF0dXJlLCBpZiB0aGUgZXhwcmVzc2lvbiB1c2VkIHRvIGluZGljYXRlIHRoZSBmaWxlCmV2YWx1YXRlcyB0byBOb25lLCB0aGUgY3VycmVudCB2YWx1ZSBvZiBzeXMuc3Rkb3V0IGlzIHVzZWQuICBUaHVzOgoKICAgIHByaW50ID4+IE5vbmUsICJIZWxsbyB3b3JsZCIKCmlzIGVxdWl2YWxlbnQgdG8KCiAgICBwcmludCAiSGVsbG8gd29ybGQiCgpEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5IEJhcnJ5IFdhcnNhdy4gIERlc2NyaWJlZCBieSBQRVAgMjE0LgoKCk9wdGlvbmFsIENvbGxlY3Rpb24gb2YgQ3ljbGljYWwgR2FyYmFnZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClB5dGhvbiBpcyBub3cgZXF1aXBwZWQgd2l0aCBhIGdhcmJhZ2UgY29sbGVjdG9yIHRoYXQgY2FuIGh1bnQgZG93bgpjeWNsaWNhbCByZWZlcmVuY2VzIGJldHdlZW4gUHl0aG9uIG9iamVjdHMuICBJdCdzIG5vIHJlcGxhY2VtZW50IGZvcgpyZWZlcmVuY2UgY291bnRpbmc7IGluIGZhY3QsIGl0IGRlcGVuZHMgb24gdGhlIHJlZmVyZW5jZSBjb3VudHMgYmVpbmcKY29ycmVjdCwgYW5kIGRlY2lkZXMgdGhhdCBhIHNldCBvZiBvYmplY3RzIGJlbG9uZyB0byBhIGN5Y2xlIGlmIGFsbAp0aGVpciByZWZlcmVuY2UgY291bnRzIGNhbiBiZSBhY2NvdW50ZWQgZm9yIGZyb20gdGhlaXIgcmVmZXJlbmNlcyB0bwplYWNoIG90aGVyLiAgVGhpcyBkZXZpb3VzIHNjaGVtZSB3YXMgZmlyc3QgcHJvcG9zZWQgYnkgRXJpYyBUaWVkZW1hbm4sCmFuZCBicm91Z2h0IHRvIGltcGxlbWVudGF0aW9uIGJ5IE5laWwgU2NoZW1lbmF1ZXIuCgpUaGVyZSdzIGEgbW9kdWxlICJnYyIgdGhhdCBsZXRzIHlvdSBjb250cm9sIHNvbWUgcGFyYW1ldGVycyBvZiB0aGUKZ2FyYmFnZSBjb2xsZWN0aW9uLiAgVGhlcmUncyBhbHNvIGFuIG9wdGlvbiB0byB0aGUgY29uZmlndXJlIHNjcmlwdAp0aGF0IGxldHMgeW91IGVuYWJsZSBvciBkaXNhYmxlIHRoZSBnYXJiYWdlIGNvbGxlY3Rpb24uICBJbiAyLjBiMSwKaXQncyBvbiBieSBkZWZhdWx0LCBzbyB0aGF0IHdlIChob3BlZnVsbHkpIGNhbiBjb2xsZWN0IGRlY2VudCB1c2VyCmV4cGVyaWVuY2Ugd2l0aCB0aGlzIG5ldyBmZWF0dXJlLiAgVGhlcmUgYXJlIHNvbWUgcXVlc3Rpb25zIGFib3V0IGl0cwpwZXJmb3JtYW5jZS4gIElmIGl0IHByb3ZlcyB0byBiZSB0b28gbXVjaCBvZiBhIHByb2JsZW0sIHdlJ2xsIHR1cm4gaXQKb2ZmIGJ5IGRlZmF1bHQgaW4gdGhlIGZpbmFsIDIuMCByZWxlYXNlLgoKClNtYWxsZXIgQ2hhbmdlcwotLS0tLS0tLS0tLS0tLS0KCkEgbmV3IGZ1bmN0aW9uIHppcCgpIHdhcyBhZGRlZC4gIHppcChzZXExLCBzZXEyLCAuLi4pIGlzIGVxdWl2YWxlbnQgdG8KbWFwKE5vbmUsIHNlcTEsIHNlcTIsIC4uLikgd2hlbiB0aGUgc2VxdWVuY2VzIGhhdmUgdGhlIHNhbWUgbGVuZ3RoOwppLmUuIHppcChbMSwyLDNdLCBbMTAsMjAsMzBdKSByZXR1cm5zIFsoMSwxMCksICgyLDIwKSwgKDMsMzApXS4gIFdoZW4KdGhlIGxpc3RzIGFyZSBub3QgYWxsIHRoZSBzYW1lIGxlbmd0aCwgdGhlIHNob3J0ZXN0IGxpc3Qgd2luczoKemlwKFsxLDIsM10sIFsxMCwyMF0pIHJldHVybnMgWygxLDEwKSwgKDIsMjApXS4gIFNlZSBQRVAgMjAxLgoKc3lzLnZlcnNpb25faW5mbyBpcyBhIHR1cGxlIChtYWpvciwgbWlub3IsIG1pY3JvLCBsZXZlbCwgc2VyaWFsKS4KCkRpY3Rpb25hcmllcyBoYXZlIGFuIG9kZCBuZXcgbWV0aG9kLCBzZXRkZWZhdWx0KGtleSwgZGVmYXVsdCkuCmRpY3Quc2V0ZGVmYXVsdChrZXksIGRlZmF1bHQpIHJldHVybnMgZGljdFtrZXldIGlmIGl0IGV4aXN0czsgaWYgbm90LAppdCBzZXRzIGRpY3Rba2V5XSB0byBkZWZhdWx0IGFuZCByZXR1cm5zIHRoYXQgdmFsdWUuICBUaHVzOgoKICAgIGRpY3Quc2V0ZGVmYXVsdChrZXksIFtdKS5hcHBlbmQoaXRlbSkKCmRvZXMgdGhlIHNhbWUgd29yayBhcyB0aGlzIGNvbW1vbiBpZGlvbToKCiAgICBpZiBub3QgZGljdC5oYXNfa2V5KGtleSk6CiAgICAgICAgZGljdFtrZXldID0gW10KICAgIGRpY3Rba2V5XS5hcHBlbmQoaXRlbSkKClRoZXJlIGFyZSB0d28gbmV3IHZhcmlhbnRzIG9mIFN5bnRheEVycm9yIHRoYXQgYXJlIHJhaXNlZCBmb3IKaW5kZW50YXRpb24tcmVsYXRlZCBlcnJvcnM6IEluZGVudGF0aW9uRXJyb3IgYW5kIFRhYkVycm9yLgoKQ2hhbmdlZCBceCB0byBjb25zdW1lIGV4YWN0bHkgdHdvIGhleCBkaWdpdHM7IHNlZSBQRVAgMjIzLiAgQWRkZWQgXFUKZXNjYXBlIHRoYXQgY29uc3VtZXMgZXhhY3RseSBlaWdodCBoZXggZGlnaXRzLgoKVGhlIGxpbWl0cyBvbiB0aGUgc2l6ZSBvZiBleHByZXNzaW9ucyBhbmQgZmlsZSBpbiBQeXRob24gc291cmNlIGNvZGUKaGF2ZSBiZWVuIHJhaXNlZCBmcm9tIDIqKjE2IHRvIDIqKjMyLiAgUHJldmlvdXMgdmVyc2lvbnMgb2YgUHl0aG9uCndlcmUgbGltaXRlZCBiZWNhdXNlIHRoZSBtYXhpbXVtIGFyZ3VtZW50IHNpemUgdGhlIFB5dGhvbiBWTSBhY2NlcHRlZAp3YXMgMioqMTYuICBUaGlzIGxpbWl0ZWQgdGhlIHNpemUgb2Ygb2JqZWN0IGNvbnN0cnVjdG9yIGV4cHJlc3Npb25zLAplLmcuIFsxLDIsM10gb3IgeydhJzoxLCAnYic6Mn0sIGFuZCB0aGUgc2l6ZSBvZiBzb3VyY2UgZmlsZXMuICBUaGlzCmxpbWl0IHdhcyByYWlzZWQgdGhhbmtzIHRvIGEgcGF0Y2ggYnkgQ2hhcmxlcyBXYWxkbWFuIHRoYXQgZWZmZWN0aXZlbHkKZml4ZXMgdGhlIHByb2JsZW0uICBJdCBpcyBub3cgbXVjaCBtb3JlIGxpa2VseSB0aGF0IHlvdSB3aWxsIGJlCmxpbWl0ZWQgYnkgYXZhaWxhYmxlIG1lbW9yeSB0aGFuIGJ5IGFuIGFyYml0cmFyeSBsaW1pdCBpbiBQeXRob24uCgpUaGUgaW50ZXJwcmV0ZXIncyBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aCBjYW4gYmUgbW9kaWZpZWQgYnkgUHl0aG9uCnByb2dyYW1zIHVzaW5nIHN5cy5nZXRyZWN1cnNpb25saW1pdCBhbmQgc3lzLnNldHJlY3Vyc2lvbmxpbWl0LiAgVGhpcwpsaW1pdCBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmVjdXJzaXZlIGNhbGxzIHRoYXQgY2FuIGJlIG1hZGUgYnkKUHl0aG9uIGNvZGUuICBUaGUgbGltaXQgZXhpc3RzIHRvIHByZXZlbnQgaW5maW5pdGUgcmVjdXJzaW9uIGZyb20Kb3ZlcmZsb3dpbmcgdGhlIEMgc3RhY2sgYW5kIGNhdXNpbmcgYSBjb3JlIGR1bXAuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcwoxMDAwLiAgVGhlIG1heGltdW0gc2FmZSB2YWx1ZSBmb3IgYSBwYXJ0aWN1bGFyIHBsYXRmb3JtIGNhbiBiZSBmb3VuZApieSBydW5uaW5nIE1pc2MvZmluZF9yZWN1cnNpb25saW1pdC5weS4KCk5ldyBNb2R1bGVzIGFuZCBQYWNrYWdlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmF0ZXhpdCAtIGZvciByZWdpc3RlcmluZyBmdW5jdGlvbnMgdG8gYmUgY2FsbGVkIHdoZW4gUHl0aG9uIGV4aXRzLgoKaW1wdXRpbCAtIEdyZWcgU3RlaW4ncyBhbHRlcm5hdGl2ZSBBUEkgZm9yIHdyaXRpbmcgY3VzdG9tIGltcG9ydApob29rcy4KCnB5ZXhwYXQgLSBhbiBpbnRlcmZhY2UgdG8gdGhlIEV4cGF0IFhNTCBwYXJzZXIsIGNvbnRyaWJ1dGVkIGJ5IFBhdWwKUHJlc2NvZC4KCnhtbCAtIGEgbmV3IHBhY2thZ2Ugd2l0aCBYTUwgc3VwcG9ydCBjb2RlIG9yZ2FuaXplZCAoc28gZmFyKSBpbiB0aHJlZQpzdWJwYWNrYWdlczogeG1sLmRvbSwgeG1sLnNheCwgYW5kIHhtbC5wYXJzZXJzLiAgRGVzY3JpYmluZyB0aGVzZQp3b3VsZCBmaWxsIGEgdm9sdW1lLiAgVGhlcmUncyBhIHNwZWNpYWwgZmVhdHVyZSB3aGVyZWJ5IGEKdXNlci1pbnN0YWxsZWQgcGFja2FnZSBuYW1lZCBfeG1scGx1cyBvdmVycmlkZXMgdGhlIHN0YW5kYXJkCnhtbHBhY2thZ2U7IHRoaXMgaXMgaW50ZW5kZWQgdG8gZ2l2ZSB0aGUgWE1MIFNJRyBhIGhvb2sgdG8gZGlzdHJpYnV0ZQpiYWNrd2FyZHMtY29tcGF0aWJsZSB1cGRhdGVzIHRvIHRoZSBzdGFuZGFyZCB4bWwgcGFja2FnZS4KCndlYmJyb3dzZXIgLSBhIHBsYXRmb3JtLWluZGVwZW5kZW50IEFQSSB0byBsYXVuY2ggYSB3ZWIgYnJvd3Nlci4KCgpDaGFuZ2VkIE1vZHVsZXMKLS0tLS0tLS0tLS0tLS0tCgphcnJheSAtLSBuZXcgbWV0aG9kcyBmb3IgYXJyYXkgb2JqZWN0czogY291bnQsIGV4dGVuZCwgaW5kZXgsIHBvcCwgYW5kCnJlbW92ZQoKYmluYXNjaWkgLS0gbmV3IGZ1bmN0aW9ucyBiMmFfaGV4IGFuZCBhMmJfaGV4IHRoYXQgY29udmVydCBiZXR3ZWVuCmJpbmFyeSBkYXRhIGFuZCBpdHMgaGV4IHJlcHJlc2VudGF0aW9uCgpjYWxlbmRhciAtLSBNYW55IG5ldyBmdW5jdGlvbnMgdGhhdCBzdXBwb3J0IGZlYXR1cmVzIGluY2x1ZGluZyBjb250cm9sCm92ZXIgd2hpY2ggZGF5IG9mIHRoZSB3ZWVrIGlzIHRoZSBmaXJzdCBkYXksIHJldHVybmluZyBzdHJpbmdzIGluc3RlYWQKb2YgcHJpbnRpbmcgdGhlbS4gIEFsc28gbmV3IHN5bWJvbGljIGNvbnN0YW50cyBmb3IgZGF5cyBvZiB3ZWVrLAplLmcuIE1PTkRBWSwgLi4uLCBTVU5EQVkuCgpjZ2kgLS0gRmllbGRTdG9yYWdlIG9iamVjdHMgaGF2ZSBhIGdldHZhbHVlIG1ldGhvZCB0aGF0IHdvcmtzIGxpa2UgYQpkaWN0aW9uYXJ5J3MgZ2V0IG1ldGhvZCBhbmQgcmV0dXJucyB0aGUgdmFsdWUgYXR0cmlidXRlIG9mIHRoZSBvYmplY3QuCgpDb25maWdQYXJzZXIgLS0gVGhlIHBhcnNlciBvYmplY3QgaGFzIG5ldyBtZXRob2RzIGhhc19vcHRpb24sCnJlbW92ZV9zZWN0aW9uLCByZW1vdmVfb3B0aW9uLCBzZXQsIGFuZCB3cml0ZS4gIFRoZXkgYWxsb3cgdGhlIG1vZHVsZQp0byBiZSB1c2VkIGZvciB3cml0aW5nIGNvbmZpZyBmaWxlcyBhcyB3ZWxsIGFzIHJlYWRpbmcgdGhlbS4KCmZ0cGxpYiAtLSBudHJhbnNmZXJjbWQoKSwgdHJhbnNmZXJjbWQoKSwgYW5kIHJldHJiaW5hcnkoKSBhbGwgbm93Cm9wdGlvbmFsbHkgc3VwcG9ydCB0aGUgUkZDIDk1OSBSRVNUIGNvbW1hbmQuCgpnemlwIC0tIHJlYWRsaW5lIGFuZCByZWFkbGluZXMgbm93IGFjY2VwdCBvcHRpb25hbCBzaXplIGFyZ3VtZW50cwoKaHR0cGxpYiAtLSBOZXcgaW50ZXJmYWNlcyBhbmQgc3VwcG9ydCBmb3IgSFRUUC8xLjEgYnkgR3JlZyBTdGVpbi4gIFNlZQp0aGUgbW9kdWxlIGRvYyBzdHJpbmdzIGZvciBkZXRhaWxzLgoKbG9jYWxlIC0tIGltcGxlbWVudCBnZXRkZWZhdWx0bG9jYWxlIGZvciBXaW4zMiBhbmQgTWFjaW50b3NoCgptYXJzaGFsIC0tIG5vIGxvbmdlciBkdW1wcyBjb3JlIHdoZW4gbWFyc2hhbGluZyBkZWVwbHkgbmVzdGVkIG9yCnJlY3Vyc2l2ZSBkYXRhIHN0cnVjdHVyZXMKCm9zIC0tIG5ldyBmdW5jdGlvbnMgaXNhdHR5LCBzZXRldWlkLCBzZXRlZ2lkLCBzZXRyZXVpZCwgc2V0cmVnaWQKCm9zL3BvcGVuMiAtLSBwb3BlbjIvcG9wZW4zL3BvcGVuNCBzdXBwb3J0IHVuZGVyIFdpbmRvd3MuICBwb3BlbjIvcG9wZW4zCnN1cHBvcnQgdW5kZXIgVW5peC4KCm9zL3B0eSAtLSBzdXBwb3J0IGZvciBvcGVucHR5IGFuZCBmb3JrcHR5Cgpvcy5wYXRoIC0tIGZpeCBzZW1hbnRpY3Mgb2Ygb3MucGF0aC5jb21tb25wcmVmaXgKCnNtdHBsaWIgLS0gc3VwcG9ydCBmb3Igc2VuZGluZyB2ZXJ5IGxvbmcgbWVzc2FnZXMKCnNvY2tldCAtLSBuZXcgZnVuY3Rpb24gZ2V0ZnFkbigpCgpyZWFkbGluZSAtLSBuZXcgZnVuY3Rpb25zIHRvIHJlYWQsIHdyaXRlIGFuZCB0cnVuY2F0ZSBoaXN0b3J5IGZpbGVzLgpUaGUgcmVhZGxpbmUgc2VjdGlvbiBvZiB0aGUgbGlicmFyeSByZWZlcmVuY2UgbWFudWFsIGNvbnRhaW5zIGFuCmV4YW1wbGUuCgpzZWxlY3QgLS0gYWRkIGludGVyZmFjZSB0byBwb2xsIHN5c3RlbSBjYWxsCgpzaHV0aWwgLS0gbmV3IGNvcHlmaWxlb2JqIGZ1bmN0aW9uCgpTaW1wbGVIVFRQU2VydmVyLCBDR0lIVFRQU2VydmVyIC0tIEZpeCBwcm9ibGVtcyB3aXRoIGJ1ZmZlcmluZyBpbiB0aGUKSFRUUCBzZXJ2ZXIuCgpUa2ludGVyIC0tIG9wdGltaXphdGlvbiBvZiBmdW5jdGlvbiBmbGF0dGVuCgp1cmxsaWIgLS0gc2NhbnMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBwcm94eSBjb25maWd1cmF0aW9uLAplLmcuIGh0dHBfcHJveHkuCgp3aGljaGRiIC0tIHJlY29nbml6ZXMgZHVtYmRibSBmb3JtYXQKCgpPYnNvbGV0ZSBNb2R1bGVzCi0tLS0tLS0tLS0tLS0tLS0KCk5vbmUuICBIb3dldmVyIG5vdGUgdGhhdCAxLjYgbWFkZSBhIHdob2xlIHNsZXcgb2YgbW9kdWxlcyBvYnNvbGV0ZToKc3Rkd2luLCBzb3VuZGV4LCBjbWwsIGNtcGNhY2hlLCBkaXJjYWNoZSwgZHVtcCwgZmluZCwgZ3JlcCwgcGFja21haWwsCnBvbHksIHptb2QsIHN0cm9wLCB1dGlsLCB3aGF0c291bmQuCgoKQ2hhbmdlZCwgTmV3LCBPYnNvbGV0ZSBUb29scwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpOb25lLgoKCkMtbGV2ZWwgQ2hhbmdlcwotLS0tLS0tLS0tLS0tLS0KClNldmVyYWwgY2xlYW51cCBqb2JzIHdlcmUgY2FycmllZCBvdXQgdGhyb3VnaG91dCB0aGUgc291cmNlIGNvZGUuCgpBbGwgQyBjb2RlIHdhcyBjb252ZXJ0ZWQgdG8gQU5TSSBDOyB3ZSBnb3QgcmlkIG9mIGFsbCB1c2VzIG9mIHRoZQpQeV9QUk9UTygpIG1hY3JvLCB3aGljaCBtYWtlcyB0aGUgaGVhZGVyIGZpbGVzIGEgbG90IG1vcmUgcmVhZGFibGUuCgpNb3N0IG9mIHRoZSBwb3J0YWJpbGl0eSBoYWNrcyB3ZXJlIG1vdmVkIHRvIGEgbmV3IGhlYWRlciBmaWxlLApweXBvcnQuaDsgc2V2ZXJhbCBvdGhlciBuZXcgaGVhZGVyIGZpbGVzIHdlcmUgYWRkZWQgYW5kIHNvbWUgb2xkCmhlYWRlciBmaWxlcyB3ZXJlIHJlbW92ZWQsIGluIGFuIGF0dGVtcHQgdG8gY3JlYXRlIGEgbW9yZSByYXRpb25hbCBzZXQKb2YgaGVhZGVyIGZpbGVzLiAgKEZldyBvZiB0aGVzZSBldmVyIG5lZWQgdG8gYmUgaW5jbHVkZWQgZXhwbGljaXRseTsKdGhleSBhcmUgYWxsIGluY2x1ZGVkIGJ5IFB5dGhvbi5oLikKClRyZW50IE1pY2sgZW5zdXJlZCBwb3J0YWJpbGl0eSB0byA2NC1iaXQgcGxhdGZvcm1zLCB1bmRlciBib3RoIExpbnV4CmFuZCBXaW42NCwgZXNwZWNpYWxseSBmb3IgdGhlIG5ldyBJbnRlbCBJdGFuaXVtIHByb2Nlc3Nvci4gIE1pY2sgYWxzbwphZGRlZCBsYXJnZSBmaWxlIHN1cHBvcnQgZm9yIExpbnV4NjQgYW5kIFdpbjY0LgoKVGhlIEMgQVBJcyB0byByZXR1cm4gYW4gb2JqZWN0J3Mgc2l6ZSBoYXZlIGJlZW4gdXBkYXRlIHRvIGNvbnNpc3RlbnRseQp1c2UgdGhlIGZvcm0gUHlYWFhfU2l6ZSwgZS5nLiBQeVNlcXVlbmNlX1NpemUgYW5kIFB5RGljdF9TaXplLiAgSW4KcHJldmlvdXMgdmVyc2lvbnMsIHRoZSBhYnN0cmFjdCBpbnRlcmZhY2VzIHVzZWQgUHlYWFhfTGVuZ3RoIGFuZCB0aGUKY29uY3JldGUgaW50ZXJmYWNlcyB1c2VkIFB5WFhYX1NpemUuICBUaGUgb2xkIG5hbWVzLAplLmcuIFB5T2JqZWN0X0xlbmd0aCwgYXJlIHN0aWxsIGF2YWlsYWJsZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKYXQgdGhlIEFQSSBsZXZlbCwgYnV0IGFyZSBkZXByZWNhdGVkLgoKVGhlIFB5T1NfQ2hlY2tTdGFjayBmdW5jdGlvbiBoYXMgYmVlbiBpbXBsZW1lbnRlZCBvbiBXaW5kb3dzIGJ5CkZyZWRyaWsgTHVuZGguICBJdCBwcmV2ZW50cyBQeXRob24gZnJvbSBmYWlsaW5nIHdpdGggYSBzdGFjayBvdmVyZmxvdwpvbiBXaW5kb3dzLgoKVGhlIEdDIGNoYW5nZXMgcmVzdWx0ZWQgaW4gY3JlYXRpb24gb2YgdHdvIG5ldyBzbG90cyBvbiBvYmplY3QsCnRwX3RyYXZlcnNlIGFuZCB0cF9jbGVhci4gIFRoZSBhdWdtZW50ZWQgYXNzaWdubWVudCBjaGFuZ2VzIHJlc3VsdCBpbgp0aGUgY3JlYXRpb24gb2YgYSBuZXcgc2xvdCBmb3IgZWFjaCBpbi1wbGFjZSBvcGVyYXRvci4KClRoZSBHQyBBUEkgY3JlYXRlcyBuZXcgcmVxdWlyZW1lbnRzIGZvciBjb250YWluZXIgdHlwZXMgaW1wbGVtZW50ZWQgaW4KQyBleHRlbnNpb24gbW9kdWxlcy4gIFNlZSBJbmNsdWRlL29iamltcGwuaCBmb3IgZGV0YWlscy4KClB5RXJyX0Zvcm1hdCBoYXMgYmVlbiB1cGRhdGVkIHRvIGF1dG9tYXRpY2FsbHkgY2FsY3VsYXRlIHRoZSBzaXplIG9mCnRoZSBidWZmZXIgbmVlZGVkIHRvIGhvbGQgdGhlIGZvcm1hdHRlZCByZXN1bHQgc3RyaW5nLiAgVGhpcyBjaGFuZ2UKcHJldmVudHMgY3Jhc2hlcyBjYXVzZWQgYnkgcHJvZ3JhbW1lciBlcnJvci4KCk5ldyBDIEFQSSBjYWxsczogUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvciwgUHlFcnJfV3JpdGVVbnJhaXNhYmxlLgoKUHlSdW5fQW55RmlsZUV4LCBQeVJ1bl9TaW1wbGVGaWxlRXgsIFB5UnVuX0ZpbGVFeCAtLSBOZXcgZnVuY3Rpb25zCnRoYXQgYXJlIHRoZSBzYW1lIGFzIHRoZWlyIG5vbi1FeCBjb3VudGVycGFydHMgZXhjZXB0IHRoZXkgdGFrZSBhbgpleHRyYSBmbGFnIGFyZ3VtZW50IHRoYXQgdGVsbHMgdGhlbSB0byBjbG9zZSB0aGUgZmlsZSB3aGVuIGRvbmUuCgpYWFggVGhlcmUgd2VyZSBvdGhlciBBUEkgY2hhbmdlcyB0aGF0IHNob3VsZCBiZSBmbGVzaGVkIG91dCBoZXJlLgoKCldpbmRvd3MgQ2hhbmdlcwotLS0tLS0tLS0tLS0tLS0KCk5ldyBwb3BlbjIvcG9wZW4zL3Blb3BlbjQgaW4gb3MgbW9kdWxlIChzZWUgQ2hhbmdlZCBNb2R1bGVzIGFib3ZlKS4KCm9zLnBvcGVuIGlzIG11Y2ggbW9yZSB1c2FibGUgb24gV2luZG93cyA5NSBhbmQgOTguICBTZWUgTWljcm9zb2Z0Cktub3dsZWRnZSBCYXNlIGFydGljbGUgUTE1MDk1Ni4gIFRoZSBXaW45eCB3b3JrYXJvdW5kIGRlc2NyaWJlZCB0aGVyZQppcyBpbXBsZW1lbnRlZCBieSB0aGUgbmV3IHc5eHBvcGVuLmV4ZSBoZWxwZXIgaW4gdGhlIHJvb3Qgb2YgeW91cgpQeXRob24gaW5zdGFsbGF0aW9uLiAgTm90ZSB0aGF0IFB5dGhvbiB1c2VzIHRoaXMgaW50ZXJuYWxseTsgaXQgaXMgbm90CmEgc3RhbmRhbG9uZSBwcm9ncmFtLgoKQWRtaW5pc3RyYXRvciBwcml2aWxlZ2VzIGFyZSBubyBsb25nZXIgcmVxdWlyZWQgdG8gaW5zdGFsbCBQeXRob24Kb24gV2luZG93cyBOVCBvciBXaW5kb3dzIDIwMDAuICBJZiB5b3UgaGF2ZSBhZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMsClB5dGhvbidzIHJlZ2lzdHJ5IGluZm8gd2lsbCBiZSB3cml0dGVuIHVuZGVyIEhLRVlfTE9DQUxfTUFDSElORS4KT3RoZXJ3aXNlIHRoZSBpbnN0YWxsZXIgYmFja3Mgb2ZmIHRvIHdyaXRpbmcgUHl0aG9uJ3MgcmVnaXN0cnkgaW5mbwp1bmRlciBIS0VZX0NVUlJFTlRfVVNFUi4gIFRoZSBsYXR0ZXIgaXMgc3VmZmljaWVudCBmb3IgYWxsICJub3JtYWwiCnVzZXMgb2YgUHl0aG9uLCBidXQgd2lsbCBwcmV2ZW50IHNvbWUgYWR2YW5jZWQgdXNlcyBmcm9tIHdvcmtpbmcKKGZvciBleGFtcGxlLCBydW5uaW5nIGEgUHl0aG9uIHNjcmlwdCBhcyBhbiBOVCBzZXJ2aWNlLCBvciBwb3NzaWJseQpmcm9tIENHSSkuCgpbVGhpcyB3YXMgbmV3IGluIDEuNl0gVGhlIGluc3RhbGxlciBubyBsb25nZXIgcnVucyBhIHNlcGFyYXRlIFRjbC9UawppbnN0YWxsZXI7IGluc3RlYWQsIGl0IGluc3RhbGxzIHRoZSBuZWVkZWQgVGNsL1RrIGZpbGVzIGRpcmVjdGx5IGluIHRoZQpQeXRob24gZGlyZWN0b3J5LiAgSWYgeW91IGFscmVhZHkgaGF2ZSBhIFRjbC9UayBpbnN0YWxsYXRpb24sIHRoaXMKd2FzdGVzIHNvbWUgZGlzayBzcGFjZSAoYWJvdXQgNCBNZWdzKSBidXQgYXZvaWRzIHByb2JsZW1zIHdpdGgKY29uZmxpY3RpbmcgVGNsL1RrIGluc3RhbGxhdGlvbnMsIGFuZCBtYWtlcyBpdCBtdWNoIGVhc2llciBmb3IgUHl0aG9uCnRvIGVuc3VyZSB0aGF0IFRjbC9UayBjYW4gZmluZCBhbGwgaXRzIGZpbGVzLgoKW1RoaXMgd2FzIG5ldyBpbiAxLjZdIFRoZSBXaW5kb3dzIGluc3RhbGxlciBub3cgaW5zdGFsbHMgYnkgZGVmYXVsdCBpbgpcUHl0aG9uMjBcIG9uIHRoZSBkZWZhdWx0IHZvbHVtZSwgaW5zdGVhZCBvZiBcUHJvZ3JhbSBGaWxlc1xQeXRob24tMi4wXC4KCgpVcGRhdGVzIHRvIHRoZSBjaGFuZ2VzIGJldHdlZW4gMS41LjIgYW5kIDEuNgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhlIDEuNiBORVdTIGZpbGUgY2FuJ3QgYmUgY2hhbmdlZCBhZnRlciB0aGUgcmVsZWFzZSBpcyBkb25lLCBzbyBoZXJlCmlzIHNvbWUgbGF0ZS1icmVha2luZyBuZXdzOgoKTmV3IEFQSXMgaW4gbG9jYWxlLnB5OiBub3JtYWxpemUoKSwgZ2V0ZGVmYXVsdGxvY2FsZSgpLCByZXNldGxvY2FsZSgpLAphbmQgY2hhbmdlcyB0byBnZXRsb2NhbGUoKSBhbmQgc2V0bG9jYWxlKCkuCgpUaGUgbmV3IG1vZHVsZSBpcyBub3cgZW5hYmxlZCBwZXIgZGVmYXVsdC4KCkl0IGlzIG5vdCB0cnVlIHRoYXQgdGhlIGVuY29kaW5ncyBjb2RlY3MgY2Fubm90IGJlIHVzZWQgZm9yIG5vcm1hbApzdHJpbmdzOiB0aGUgc3RyaW5nLmVuY29kZSgpICh3aGljaCBpcyBhbHNvIHByZXNlbnQgb24gOC1iaXQgc3RyaW5ncwohKSBhbGxvd3MgdXNpbmcgdGhlbSBmb3IgOC1iaXQgc3RyaW5ncyB0b28sIGUuZy4gdG8gY29udmVydCBmaWxlcyBmcm9tCmNwMTI1MiAoV2luZG93cykgdG8gbGF0aW4tMSBvciB2aWNlLXZlcnNhLgoKSmFwYW5lc2UgY29kZWNzIGFyZSBhdmFpbGFibGUgZnJvbSBUYW1pdG8gS0FKSVlBTUE6Cmh0dHA6Ly9wc2V1ZG8uZ3JhZC5zY2NzLmNodWt5by11LmFjLmpwL35rYWppeWFtYS9weXRob24vCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo=