MC40NHRlc3QxIC0gU3VuIEF1ZyAxNiAyMDA0IDE3OjQzOjU0ICswODAwCgotIFRFU1RJTkcgUkVMRUFTRSAtIHRoaXMgaXMgdGhlIGZpcnN0IHB1YmxpYyByZWxlYXNlIG9mIHRoZSBjbGllbnQgY29kZWJhc2UsCiAgc28gdGhlcmUgYXJlIHN1cmUgdG8gYmUgYnVncyB0byBiZSBmb3VuZC4gSW4gYWRkaXRpb24sIGlmIHlvdSdyZSBqdXN0IHVzaW5nCiAgdGhlIHNlcnZlciBwb3J0aW9uLCB0aGUgZmluYWwgYmluYXJ5IHNpemUgcHJvYmFibHkgd2lsbCBpbmNyZWFzZSAtIEknbGwKICBiZSB0cnlpbmcgdG8gZ2V0IGl0IGJhY2sgZG93biBpbiBmdXR1cmUgcmVsZWFzZXMuCgotIERyb3BiZWFyIGNsaWVudCBhZGRlZCAtIGxvdHMgb2YgY2hhbmdlcyB0byB0aGUgc2VydmVyIGNvZGUgYXMgd2VsbCB0byAKICBnZW5lcmFsaXNlIHRoaW5ncwoKLSBJUHY2IHN1cHBvcnQgYWRkZWQgZm9yIGNsaWVudCwgc2VydmVyLCBhbmQgZm9yd2FyZGluZwoKLSBOZXcgbWFrZWZpbGUgd2l0aCBtb3JlIGdlbmVyaWMgc3VwcG9ydCBmb3IgbXVsdGlwbGUtcHJvZ3JhbSBiaW5hcmllcwoKMC40MyAtIEZyaSBKdWwgMTYgMjAwNCAxNzo0NDo1NCArMDgwMAoKLSBTRUNVUklUWTogRG9uJ3QgdHJ5IHRvIGZyZWUoKSB1bmluaXRpYWxpc2VkIHZhcmlhYmxlcyBpbiBEU1MgdmVyaWZpY2F0aW9uCiAgY29kZS4gVGhhbmtzIHRvIEFybmUgQmVybmluIGZvciBwb2ludGluZyBvdXQgdGhpcyBidWcuIFRoaXMgaXMgcG9zc2libHkKICBleHBsb2l0YWJsZSwgYWxsIHVzZXJzIHdpdGggRFNTIGFuZCBwdWJrZXktYXV0aCBjb21waWxlZCBpbiBhcmUgYWR2aXNlZCB0bwogIHVwZ3JhZGUuCgotIENsZWFuIHVwIGFnZW50IGZvcndhcmRpbmcgc29ja2V0IGZpbGVzIGNvcnJlY3RseSwgcGF0Y2ggZnJvbSBHZXJyaXQgUGFwZS4KCi0gRG9uJ3QgZ28gaW50byBhbiBpbmZpbml0ZSBsb29wIHdoZW4gcG9ydGZvcndhcmRpbmcgdG8gc2VydmVycyB3aGljaCBkb24ndAogIHNlbmQgYW55IGluaXRpYWwgZGF0YS9iYW5uZXIuIFBhdGNoIGZyb20gTmlrb2xhIFZsYWRvdgoKLSBGaXggZm9yIG5ldHdvcmsgdnMuIGhvc3QgYnl0ZSBvcmRlciBpbiBsb2dnaW5nIHJlbW90ZSBUQ1AgcG9ydHMsIGFsc28KICBmcm9tIEdlcnJpdCBQYXBlLgoKLSBJbml0aWFsaXNlIG1hbnkgcG9pbnRlcnMgdG8gTlVMTCwgZm9yIGdlbmVyYWwgc2FmZXR5LiBBbHNvIGNoZWNrZWQgY2xlYW51cAogIGNvZGUgZm9yIG1wX2ludHMgKHJlbGF0ZWQgdG8gc2VjdXJpdHkgaXNzdWVzIGFib3ZlKS4KCjAuNDIgLSBXZWQgSnVuIDE2IDIwMDQgMTI6NDQ6NTQgKzA4MDAKCi0gVXBkYXRlZCB0byBHZXJyaXQgUGFwZSdzIG9mZmljaWFsIERlYmlhbiBzdWJkaXJlY3RvcnkKCi0gRml4ZWQgYmFkIGNoZWNrIHdoZW4gb3BlbmluZyAvZGV2L3VyYW5kb20gLSB0aGFua3MgdG8gRGFubnkgU3VuZy4KCi0gQWRkZWQgLWkgaW5ldGQgbW9kZSBmbGFnLCBhbmQgYXNzb2NpYXRlZCBvcHRpb25zIGluIG9wdGlvbnMuaCAuIERyb3BiZWFyCiAgY2FuIGJlIGNvbXBpbGVkIHdpdGggZWl0aGVyIG5vcm1hbCBtb2RlLCBpbmV0ZCwgb3IgYm90aCBtb2Rlcy4gVGhhbmtzCiAgdG8gR2Vycml0IFBhcGUgZm9yIGJhc2ljIHBhdGNoIGFuZCBtb3RpdmF0aW9uLgoKLSBVc2UgPGRpcmVudC5oPiByYXRoZXIgdGhhbiA8c3lzL2Rpci5oPiBmb3IgUE9TSVggY29tcGxpYW5jZS4gVGhhbmtzIHRvIEJpbGwKICBTb21tZXJmaWVsZC4KCi0gRml4ZWQgYSBUQ1AgZm9yd2FyZGluZyAoY2xpZW50LWxvY2FsLCAtTCBzdHlsZSkgYnVnIHdoaWNoIGNhdXNlZCB0aGUgd2hvbGUKICBzZXNzaW9uIHRvIGNsb3NlIGlmIHRoZSBUQ1AgY29ubmVjdGlvbiBmYWlsZWQuIFRoYW5rcyB0byBBbmRyZXcgQnJhdW5kIGZvcgogIHJlcG9ydGluZyBpdCBhbmQgaGVscGluZyB0cmFjayBpdCBkb3duLgoKLSBSZS1lbmFibGUgc2lncGlwZSBmb3IgY2hpbGQgcHJvY2Vzc2VzLiBUaGFua3MgdG8gR2Vycml0IFBhcGUgZm9yIHNvbWUKICBzdWdnZXN0aW9ucywgYW5kIEJTRCBtYW5wYWdlcyBmb3IgYSBjbGVhcmVyIGV4cGxhbmF0aW9uIG9mIHRoZSBiZWhhdmlvdXIuCgotIEFkZGVkIG1hbnBhZ2VzLCB0aGFua3MgdG8gR2Vycml0IFBhcGUuCgotIENoYW5nZWQgbGljZW5zZSB0ZXh0IGZvciBMaWJUb21DcnlwdCBhbmQgTGliVG9tTWF0aC4KCi0gQWRkZWQgc3RyaXAtc3RhdGljIHRhcmdldAoKLSBGaXhlZCBhIGJ1ZyBpbiBhZ2VudC1mb3J3YXJkaW5nIGNsZWFudXAgaGFuZGxlciAtIHdvdWxkIHNlZ2ZhdWx0CiAgKGRlcmVmZXJlbmNpbmcgYSBudWxsIHBvaW50ZXIpIGlmIGFnZW50IGZvcndhcmRpbmcgaGFkIGZhaWxlZC4KCi0gRml4IGJlaGF2aW91ciBvZiBhdXRob3JpemVkX2tleXMgcGFyc2luZywgc28gbGFyZ2VyICg+MTAyNCBiaXQpIERTQSBrZXlzIHdpbGwKICB3b3JrLiBUaGFua3MgdG8gRHIuIE1hcmt1cyBXYWxkZWNrIGZvciB0aGUgcmVwb3J0LiAKCi0gRml4ZWQgbG9jYWwgcG9ydCBmb3J3YXJkaW5nIGNvZGUgc28gdGhhdCB0aGUgIi1qIiBvcHRpb24gd2lsbCBtYWtlIGZvcndhcmRpbmcKICBhdHRlbXB0cyBmYWlsIG1vcmUgZ3JhY2VmdWxseS4KCi0gQWxsb3cgcmVwZWF0ZWQgcmVxdWVzdHMgaW4gYSBzaW5nbGUgc2Vzc2lvbiBpZiBwcmV2aW91cyBvbmVzIGZhaWwgLSB0aGlzIGZpeGVzICBQdVRUWSBhbmQgc29tZSBvdGhlciBTQ1AgY2xpZW50cywgd2hpY2ggdHJ5IFNGVFAsIHRoZW4gZmFsbC1iYWNrIHRvIFNDUCBpZiBpdAogIGlzbid0IGF2YWlsYWJsZS4gVGhhbmtzIHRvIFN0aXJsaW5nIFdlc3RydXAgZm9yIHRoZSByZXBvcnQuCgotIFVwZGF0ZWQgdG8gTGliVG9tQ3J5cHQgMC45NiBhbmQgTGliVG9tTWF0aCAwLjMwLiBUaGUgQUVTIGNvZGUgbm93IHVzZXMKICBzbWFsbGVyIG5vbi1wcmVjb21wdXRlZCB0YWJsZXMgaWYgRFJPUEJFQVJfU01BTExfQ09ERSBpcyBkZWZpbmVkIGluCiAgb3B0aW9ucy5oLCBsZWFkaW5nIHRvIGEgc2lnbmlmaWNhbnQgcmVkdWN0aW9uIGluIHRoZSBiaW5hcnkgc2l6ZS4KCjAuNDEgLSBNb24gSmFuIDE5IDIwMDQgMjI6NDA6MTkgKzA4MDAKCi0gRml4IGluIGNvbmZpZ3VyZSBzbyB0aGF0IGNyb3NzLWNvbXBpbGluZyB3b3JrcywgdGhhbmtzIHRvIG51bWVyb3VzIHBlb3BsZSBmb3IKICByZXBvcnRpbmcgYW5kIHRlc3RpbmcKCi0gVGVybWluYWwgbW9kZSBwYXJzaW5nIG5vdyBoYW5kbGVzIGVtcHR5IHRlcm1pbmFsIG1vZGUgc3RyaW5ncyAoc2VudCBieQogIFdpbmRvd3Mgc3NoLmNvbSBjbGllbnRzKSwgdGhhbmtzIHRvIFJpY2FyZG8gRGVyYmVzIGZvciB0aGUgcmVwb3J0CgotIEhhbmRsaW5nIGlzIGltcHJvdmVkIGZvciB1c2VycyB3aXRoIG5vIHNoZWxsIHNwZWNpZmllZCBpbiAvZXRjL3Bhc3N3ZCwKICB0aGFua3MgYWdhaW4gdG8gUmljYXJkbyBEZXJiZXMKCi0gRml4IGZvciBjb21waWxpbmcgd2l0aCAtLWRpc2FibGUtc3lzbG9nLCB0aGFua3MgdG8gZ29yZG9uZmgKCi0gVmFyaW91cyBtaW5vciBmaXhlcyBhbGxvdyBzY3AgdG8gd29yayB3aXRoIGlyaXgsIHRoYW5rcyB0byBQYXVsIE1hcmluY2V1IGZvcgogIGZpeGluZyBpdCB1cAoKLSBVc2UgPHN0cm9wdHMuaD4gbm90IDxzeXMvc3Ryb3B0cy5oPiwgc2luY2UgdGhlIGZvcm1lciBzZWVtcyBtb3JlIGNvbW1vbgoKMC40MCAtIFR1ZSBKYW4gMTMgMjAwNCAyMTowNToxOSArMDgwMAoKLSBSZW1vdGUgVENQIGZvcndhcmRpbmcgKC1SKSBzdHlsZSBpbXBsZW1lbnRlZAoKLSBMb2NhbCBhbmQgcmVtb3RlIFRDUCBmb3J3YXJkaW5nIGNhbiBlYWNoIGJlIGRpc2FibGVkIGF0IHJ1bnRpbWUgKC1rIGFuZCAtagogIHN3aXRjaGVzKQoKLSBGaXggZm9yIHByb2JsZW1zIGRldGVjdGluZyBvcGVucHR5KCkgd2l0aCB1Q2xpYmMgLSBtYW55IHRoYW5rcyB0byB2YXJpb3VzCiAgcGVvcGxlIGZvciByZXBvcnRpbmcgYW5kIHRlc3RpbmcgZml4ZXMsIGluY2x1ZGluZyAoaW4gcmFuZG9tIG9yZGVyKSBDcmlzdGlhbgogIElvbmVzY3UtSWRib2hybiwgSmFtZXMgRXdpbmcsIFN0ZXZlIERvdmVyLCBUaG9tYXMgTHVuZHF1aXN0IGFuZCBGcmVkZXJpYwogIExhdmVybmhlCgotIEltcHJvdmVkIHBvcnRhYmlsaXR5IGZvciBJUklYLCB0aGFua3MgdG8gUGF1bCBNYXJpbmNldQoKLSBBSVggYW5kIEhQVVggcG9ydGFiaWxpdHkgZml4ZXMsIHRoYW5rcyB0byBEYXJyZW4gVHVja2VyIGZvciBwYXRjaGVzCgotIHBybmdkIHNob3VsZCBub3cgd29yayBjb3JyZWN0bHksIHRoYW5rcyB0byBEYXJyZW4gVHVja2VyIGZvciB0aGUgcGF0Y2gKCi0gc2NwIGNvbXBpbGF0aW9uIG9uIHN5c3RlbXMgd2l0aG91dCBzdHJsY3B5KCkgaXMgZml4ZWQsIHRoYW5rcyB0byBQZXRlcgogIEphbm5lc2VuIGFuZCBEYXZpZCBNdXNlIGZvciByZXBvcnRpbmcgaXQgKGluZGVwZW5kZW50bHkgYW5kIHNpbXVsdGFuZW91c2x5IDopCgotIE1lcmdlZCBpbiBuZXcgTGliVG9tQ3J5cHQgMC45MiBhbmQgTGliVG9tTWF0aCAwLjI4CgowLjM5IC0gVHVlIERlYyAxNiAyMDAzIDE1OjE5OjE5ICswODAwCgotIEJldHRlciBjaGVja2luZyBvZiBrZXkgbGVuZ3RocyBhbmQgcGFyYW1ldGVycyBmb3IgRFNTIGFuZCBSU0EgYXV0aAoKLSBQcmludCBmaW5nZXJwcmludCBvZiBrZXlzIHVzZWQgZm9yIHB1YmtleSBhdXRoCgotIE1vcmUgY29uc2lzdGVudCBsb2dnaW5nIG9mIHVzZXJuYW1lcyBhbmQgSVBzCgotIEFkZGVkIG9wdGlvbiB0byBkaXNhYmxlIHBhc3N3b3JkIGF1dGggKG9yIGp1c3QgZm9yIHJvb3QpIGF0IHJ1bnRpbWUKCi0gQXZvaWQgaW5jbHVkaW5nIGJpZ251bSBmdW5jdGlvbnMgd2hpY2ggZG9uJ3QgZ2l2ZSBtdWNoIHNwZWVkIGJlbmVmaXQgYnV0CiAgdGFrZSB1cCBiaW5hcnkgc2l6ZQoKLSBBZGRlZCBhIHN0cmlwcGVkIGRvd24gdmVyc2lvbiBvZiBPcGVuU1NIJ3Mgc2NwIGJpbmFyeQoKLSBBZGRlZCBhZGRpdGlvbmFsIHN1cHBvcnRpbmcgZnVuY3Rpb25zIGZvciBJcml4LCB0aGFua3MgdG8gUGF1bCBNYXJpbmNldQoKLSBEb24ndCBjaGVjayBmb3IgdW51c2VkIGxpYnJhcmllcyBpbiBjb25maWd1cmUgc2NyaXB0CgotIFJlbW92ZWQgdHJhaWxpbmcgY29tbWEgaW4gYWxnb3JpdGhtIGxpc3RzICh0aGFua3MgdG8gTWlobmVhIFN0b2VuZXNjdSkKCi0gRml4ZWQgdXAgY2hhbm5lbCBjbG9zZSBoYW5kbGluZywgYWx3YXlzIHNlbmQgY2xvc2UgcGFja2V0IGluIHJlc3BvbnNlCiAgKGFsc28gdGhhbmtzIHRvIE1paG5lYSBTdG9lbmVzY3UpCgotIFZhcmlvdXMgbWFrZWZpbGUgaW1wcm92ZW1lbnRzIGZvciBjcm9zcy1jb21waWxpbmcsIHRoYW5rcyB0byBGcmllZHJpY2gKICBMb2JlbnN0b2NrIGFuZCBNaWhuZWEgU3RvZW5lc2N1CgotIFVzZSBkYWVtb24oKSBmdW5jdGlvbiBpZiBhdmFpbGFibGUgKG9yIG91ciBvd24gY29weSkgcmF0aGVyIHRoYW4gc2VwYXJhdGUKICBjb2RlICh0aGFua3MgdG8gRnLpZOlyaWMgTGF2ZXJuaGUgZm9yIHRoZSByZXBvcnQgYW5kIGRlYnVnZ2luZywgYW5kIEJlcm5hcmQKICBCbGFja2hhbSBmb3IgaGlzIHN1Z2dlc3Rpb24gb24gd2hhdCB0byBsb29rIGF0KQoKLSBGaXhlZCB1cCBzdXBwb3J0IGZvciBmaXJzdF9rZXhfcGFja2V0X2ZvbGxvd3MsIHJlcXVpcmVkIHRvIHRhbGsgdG8gc3NoLmNvbQogIGNsaWVudHMuIFRoYW5rcyB0byBNYXJpYW4gU3RhZ2FyZXNjdSBmb3IgdGhlIGJ1ZyByZXBvcnQuCgotIEF2b2lkIHVzaW5nIE1BWFBBVEhMRU4sIHBvaW50ZXIgZnJvbSBJYW4gTW9ycmlzCgotIEltcHJvdmVkIGlucHV0IHNhbml0eSBjaGVja2luZwoKMC4zOCAtIFNhdCBPY3QgMTEgMjAwMyAxNjoyODoxMyArMDgwMAoKLSBEZWZhdWx0IGhvc3RrZXkgcGF0aCBjaGFuZ2VkIHRvIC9ldGMvZHJvcGJlYXIvZHJvcGJlYXJfe3JzYSxkc3N9X2hvc3Rfa2V5CiAgcmF0aGVyIHRoYW4gL2V0Yy9kcm9wYmVhcl97cnNhLGRzc31faG9zdF9rZXkKCi0gQWRkZWQgU01BTEwgYW5kIE1VTFRJIHRleHQgZmlsZXMgd2hpY2ggaGF2ZSBpbmZvIG9uIGNvbXBpbGluZyBmb3IgbXVsdGlwbGUKICBiaW5hcmllcyBvciBzbWFsbCBiaW5hcmllcwoKLSBBbGxvdyBmb3IgY29tbWFuZGxpbmUgZGVmaW5pdGlvbiBvZiBzb21lIG9wdGlvbnMuaCBzZXR0aW5ncwogICh3aXRob3V0IHdhcm5pbmdzKQoKLSBCZSBtb3JlIGNhcmVmdWwgaGFuZGxpbmcgRUlOVFIKCi0gTW9yZSBmaXhlcyBmb3IgY2hhbm5lbCBjbG9zaW5nCgotIEFkZGVkIG11bHRpLWJpbmFyeSBzdXBwb3J0CgotIEltcHJvdmVkIGxvZ2dpbmcgb2YgSVBzLCBub3cgZ2V0IGxvZ2dlZCBpbiBhbGwgY2FzZXMKCi0gRG9uJ3QgY2hldyBjcHUgd2hlbiB3YWl0aW5nIGZvciB2ZXJzaW9uIGlkZW50aWZpY2F0aW9uIHN0cmluZywgYWxzbwogIG1ha2Ugc3VyZSB0aGF0IHdlIGtpY2sgb2ZmIHBlb3BsZSBpZiB0aGV5IGRvbid0IGF1dGggd2l0aGluIDUgbWludXRlcy4KCi0gVmFyaW91cyBzbWFsbCBmaXhlcywgd2FybmluZ3MgZXRjCgotIERpc3BsYXkgTU9URCBpZiByZXF1ZXN0ZWQgLSBzdWdnZXN0ZWQgYnkKICBUcmVudCBMbG95ZCA8bGF0aGlhdCBhdCBzaXhsYWJzLm9yZz4gYW5kCiAgWmFjaCBXaGl0ZSA8endoaXRlIGF0IGRhcmtzdGFyLmZyb3Aub3JnPgoKLSBzZnRwIHN1cHBvcnQgd29ya3MgKHJlbGllcyBvbiBPcGVuU1NIIHNmdHAgYmluYXJ5IG9yIHNpbWlsYXIpCgotIEFkZGVkIC0tZGlzYWJsZS1zaGFkb3cgb3B0aW9uIChyZXF1ZXN0ZWQgYnkgdGhlIGZsb3BweWZ3IGd1eXMpCgowLjM3IC0gV2VkIFNlcHQgMjQgMjAwMyAxOTo0MjoxMiArMDgwMAoKLSBWYXJpb3VzIHBvcnRhYmlsaXR5IGZpeGVzLCBmaXhlcyBmb3IgU29sYXJpcyA5LCBUcnU2NCA1LjEsIE1hYyBPUyBYIDEwLjIsCiAgQUlYLCBCU0RzCgotIFVwZGF0ZWQgTGliVG9tTWF0aCB0byAwLjI3IGFuZCBMaWJUb21DcnlwdCB0byAwLjkwCgotIFJlbmFtZWQgdXRpbC57YyxofSB0byBkYnV0aWwue2MsaH0gdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggc3lzdGVtIHV0aWwuaAoKLSBBZGRlZCBzb21lIHNtYWxsIGNoYW5nZXMgc28gaXQnbGwgd29yayB3aXRoIEFJWCAocGx1cyBMaW51eCBBZmZpbml0eSkuCiAgVGhhbmtzIHRvIFNoaWcgZm9yIHRoZW0uCgotIEltcHJvdmVkIHRoZSBjbG9zaW5nIG1lc3NhZ2VzLCBzbyBhIGNsZWFuIGV4aXQgaXMgIkV4aXRlZCBub3JtYWxseSIKCi0gQWRkZWQgc29tZSBtb3JlIHJvYnVzdCBpbnRlZ2VyL3NpemUgY2hlY2tpbmcgaW4gYnVmZmVyLmMgYXMgYSBiYWNrc3RvcCBmb3IKICBpbnRlZ2VyIG92ZXJmbG93cwoKLSBYMTEgZm9yd2FyZGluZyBmaXhlZCBmb3IgT1NYLCBwYXRoIGZvciB4YXV0aCBjaGFuZ2VkIHRvIC91c3IvWDExUjYvYmluL3hhdXRoCgotIENoYW5uZWwgY29kZSBoYW5kbGVzIGNsb3NpbmcgbW9yZSBuaWNlbHksIGRvZXNuJ3Qgc2l0IHdhaXRpbmcgZm9yIGFuIGV4dHJhCiAga2V5c3Ryb2tlIG9uIEJTRC9PU1ggcGxhdGZvcm1zLCBhbmQgZGF0YSBpcyBmbHVzaGVkIGZ1bGx5IGJlZm9yZSBjbG9zaW5nCiAgY2hpbGQgcHJvY2Vzc2VzICh0aGFua3MgdG8gCiAgQ3Jpc3RpYW4gSW9uZXNjdS1JZGJvaHJuIDxjcmlzdGlhbi5pb25lc2N1LWlkYm9ocm4gYXQgYXhpcy5jb20+IGZvcgogIHBvaW50aW5nIHRoYXQgb3V0KS4KCi0gQ2hhbmdlZCAiRElTQUJMRV9UQ1BGV0QiIHRvICJFTkFCTEVfVENQRldEIiAoYW5kIGZvciB4MTEvYXV0aCkgc28KICAiZGlzYWJsZSBESVNBQkxFX1RDUFdEIiBpc24ndCBzbyBjb25mdXNpbmcuCgotIEZpeCBhdXRob3JpemVkX2tleXMgaGFuZGxpbmcgKGRvbid0IGNyYXNoIG9uIHRvby1sb25nIGtleXMsIGFuZAogIHVzZSBmZ2V0YyBub3QgZ2V0YyB0byBhdm9pZCBzdHJhbmdlIG1hY3JvLXJlbGF0ZWQgaXNzdWVzKSwgdGhhbmtzIHRvCiAgQ3Jpc3RpYW4gSW9uZXNjdS1JZGJvaHJuIDxjcmlzdGlhbi5pb25lc2N1LWlkYm9ocm4gYXQgYXhpcy5jb20+IAogIGFuZCBTdGV2ZSBSb2RnZXJzIDxod3N0YXIgYXQgY294Lm5ldD4gZm9yIHJlcG9ydGluZyBhbmQgdGVzdGluZy4KCi0gRml4ZXMgdG8gdGhlIFJFQURNRSB3aXRoIHJlZ2FyZCB0byB1Q2xpYmMgc3lzdGVtcywgdGhhbmtzIHRvIAogIENyaXN0aWFuIElvbmVzY3UtSWRib2hybiA8Y3Jpc3RpYW4uaW9uZXNjdS1pZGJvaHJuIGF0IGF4aXMuY29tPiwKICBhcyB3ZWxsIGFzIGdlbmVyYWwgaW1wcm92ZW1lbnRzIHRvIGRvY3VtZW50YXRpb24gKHNwbGl0IFJFQURNRS9JTlNUQUxMKQoKLSBGaXhlZCB1cCBzb21lIGNvbXBpbGF0aW9uIHByb2JsZW1zIHdpdGggZHJvcGJlYXJjb252ZXJ0L2Ryb3BiZWFya2V5IGlmCiAgRFNTIG9yIFJTQSB3ZXJlIGRpc2FibGVkLCByZXBvcnRlZCBieSBQYXRyaWsgS2FybHNzb24gPHBhdHJpayBhdCBjcXVyZS5uZXQ+CgotIEZpeCBkb3VibGUtZnJlZSBidWcgZm9yIGhvc3RrZXlzLCByZXBvcnRlZCBieQogIFZpbmNlbnQgU2FuZGVycyA8dmluY2UgYXQga3lsbGlra2kub3JnPgoKLSBGaXggdXAgbWlzc2luZyBcbnMgZnJvbSBkcm9wYmVhcmNvbnZlcnQgaGVscCBtZXNzYWdlLAogIHRoYW5rcyB0byBNb3JkeSBPdml0cyA8bW92aXRzIGF0IGJsb29tYmVyZy5jb20+IGZvciB0aGUgcGF0Y2gKCjAuMzYgLSBUdWUgQXVndXN0IDE5IDIwMDMgMTI6MTY6MjMgKzA4MDAKCi0gRml4IHVuaW5pdGlhbGlzZWQgdGVtcG9yYXJ5IHZhcmlhYmxlIGluIERTUyBzaWduaW5nIGNvZGUKICAodGhhbmtzIHRvIE1hdHRoZXcgRnJhbnogPG1kZnJhbnogYXQgaW8uY29tPiBmb3IgcmVwb3J0aW5nLCBhbmQgdGhlIGF1dGhvcnMKICBvZiBWYWxncmluZCBmb3IgbWFraW5nIGl0IGVhc3kgdG8gdHJhY2sgZG93bikKLSBGaXggcmVtb3RlIHZlcnNpb24tc3RyaW5nIHBhcnNpbmcgZXJyb3IKICAodGhhbmtzIHRvIEJlcm5hcmQgQmxhY2toYW0gPGJlcm5hcmQgYXQgYmxhY2toYW0uY29tLmF1PiBmb3Igbm90aWNpbmcpCi0gSW1wcm92ZWQgaG9zdC1hbGdvcml0aG0tbWF0Y2hpbmcgYWxnb3JpdGhtIGluIGFsZ28uYwotIERlY3JlYXNlZCBNQVhfU1RSSU5HX0xFTiB0byBhIG1vcmUgcmVhbGlzdGljIHZhbHVlCi0gRml4IGluY29ycmVjdCB2ZXJzaW9uICgwLjM0KSBpbiB0aGlzIENIQU5HRVMgZmlsZSBmb3IgdGhlIHByZXZpb3VzIHJlbGVhc2UuCgowLjM1IC0gU3VuIEF1Z3VzdCAxNyAyMDAzIDA1OjM3OjQ3ICswODAwCgotIEZpeCBmb3IgcmVtb3RlbHkgZXhwbG9pdGFibGUgZm9ybWF0IHN0cmluZyBidWZmZXIgb3ZlcmZsb3cuCiAgKHRoYW5rcyB0byBKb2VsIEVyaWtzc29uIDxqZSBhdCBiaXRudXguY29tPikKCjAuMzQgLSBGcmkgQXVndXN0IDE1IDIwMDMgMTU6MTA6MDAgKzA4MDAKCi0gTWFkZSBzeXNsb2cgb3B0aW9uYWwsIGJvdGggYXQgY29tcGlsZSB0aW1lIGFuZCBhcyBhIGNvbXBpbGUgb3B0aW9uCiAgKHN1Z2dlc3RlZCBieSBMYXVyZW50IEJlcmNvdCA8c2thIGF0IHNrYXJuZXQub3JnPikKLSBGaXh1cCBmb3IgYmFkIGJhc2U2NCBwYXJzaW5nIGluIGF1dGhvcml6ZWRfa2V5cwogIChub3RpY2VkIGJ5IERhdnlkIE1hZGVsZXkgPGRhdnlkIGF0IHpkbGNvbXB1dGluZy5jb20+KQotIEFkZGVkIGluaXRpYWwgdGNwIGZvcndhcmRpbmcgY29kZSwgb25seSAtTCAobG9jYWwpIGF0IHRoaXMgc3RhZ2UKLSBJbXByb3ZlZCAibWFrZSBpbnN0YWxsIiB3aXRoIERFU1RESVIgYW5kIGNoYW5naW5nIG93bmVyc2hpcCBzZXBlcmF0ZWx5LAogIGRvbid0IGNoZWNrIGZvciBzZXRwZ3JwIG9uIExpbnV4IGZvciBjcm9zc2NvbXBpbGluZy4KICAoZnJvbSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbiBhdCBjb2RlcG9ldC5vcmc+KQotIE1vcmUgY29tbWVudGluZywgZml4IG1pbm9yIGNvbXBpbGUgd2FybmluZ3MsIG1ha2UgcmV0dXJuIHZhbHVlcyBtb3JlCiAgY29uc2lzdGVudCBldGMKLSBWYXJpb3VzIHNpZ25lZG5lc3MgZml4ZXMKLSBDYW4gbGlzdGVuIG9uIG11bHRpcGxlIHBvcnRzCi0gYWRkZWQgb3B0aW9uIHRvIGRpc2FibGUgb3BlbnB0eSB3aXRoIGNvbmZpZ3VyZSBzY3JpcHQsCiAgKGZyb20gSy4tUC4gS2lyY2hk9nJmZXIgPGthcGVrYSBhdCBlcG9zdC5kZT4pCi0gVmFyaW91cyBjbGVhbnVwcyB0byBiaWdudW0gY29kZQogICh0aGFua3MgdG8gVG9tIFN0IERlbmlzIDx0b21zdGRlbmlzIGF0IGlhaHUuY2E+KQotIEZpeCBjb21waWxlIGVycm9yIHdoZW4gZGlzYWJsaW5nIFJTQQogIChmcm9tIE1hcmMgS2xlaW5lLUJ1ZGRlIDxrbGVpbmUtYnVkZGUgYXQgZ214LmRlPikKLSBPdGhlciBjbGVhbnVwcywgc3BsaXR0aW5nIGxhcmdlIGZ1bmN0aW9ucyBmb3IgcGFja2V0IGFuZCBrZXggaGFuZGxpbmcgZXRjCgowLjMzIC0gU3VuIEp1bmUgMjIgMjAwMyAyMjoyNDoxMiArMDgwMAoKLSBGaXhlZCBzb21lIGludmFsaWQgYXNzZXJ0aW9ucyBpbiB0aGUgY2hhbm5lbCBjb2RlLCBmaXhpbmcgdGhlIHNlcnZlciBkeWluZwogIHdoZW4gZm9yd2FyZGluZyBYMTEgY29ubmVjdGlvbnMuCi0gQWRkIGRyb3BiZWFyY29udmVydCB0byBjb252ZXJ0IHRvL2Zyb20gT3BlblNTSCBob3N0IGtleXMgYW5kIERyb3BiZWFyIGtleXMKLSBSU0Ega2V5cyBub3cga2VlcCBwIGFuZCBxIHBhcmFtZXRlcnMgZm9yIGNvbXBhdGliaWxpdHkgLS0gb2xkIERyb3BiZWFyIGtleXMKICBzdGlsbCB3b3JrLCBidXQgY2FuJ3QgYmUgY29udmVydGVkIHRvIE9wZW5TU0ggZXRjLgotIERlYmlhbiBwYWNrYWdpbmcgZGlyZWN0b3J5IGFkZGVkLCB0aGFua3MgdG8gCiAgR3JhaGFtZSAoZ3JhaGFtZSBhdCBhbmdyeWdvYXRzLm5ldCkKLSAnaW5zdGFsbCcgdGFyZ2V0IGFkZGVkIHRvIHRoZSBtYWtlZmlsZQotIGdlbmVyYWwgdGlkeWluZywgaW1wcm92ZSBjb25zaXN0ZW5jeSBvZiBmdW5jdGlvbnMgZXRjCi0gSWYgUlNBIG9yIERTUyBob3N0a2V5cyBkb24ndCBleGlzdCwgdGhhdCBhbGdvcml0aG0gd29uJ3QgYmUgdXNlZC4KLSBJbXByb3ZlZCBSU0EgYW5kIERTUyBrZXkgZ2VuZXJhdGlvbiwgbW9yZSBlZmZpY2llbnQgYW5kIGZpeGVkIHNvbWUgbWlub3IgYnVncwogICh0aGFua3MgdG8gVG9tIFN0IERlbmlzIGZvciB0aGUgYWR2aWNlKQotIE1lcmdlZCBuZXcgdmVyc2lvbnMgb2YgTGliVG9tQ3J5cHQgKDAuODYpIGFuZCBMaWJUb21NYXRoICgwLjIxKQoKMC4zMiAtIFNhdCBNYXkgMjQgMjAwMyAxMjo0NDoxMSArMDgwMAoKLSBEb24ndCBjb21waWxlIHVudXNlZCBjb2RlIGZyb20gbGlidG9tY3J5cHQgKHRlc3QgdmVjdG9ycyBldGMpCi0gVXBkYXRlZCB0byBsaWJ0b21tYXRoIDAuMTcgYW5kIGxpYnRvbWNyeXB0IDAuODMuIE5ldyBsaWJ0b21tYXRoIHJlc3VsdHMKICBpbiBzbWFsbGVyIGJpbmFyeSBzaXplLCBkdWUgdG8gbm90IGxpbmtpbmcgdW5yZXF1aXJlZCBjb2RlCi0gWDExIGZvcndhcmRpbmcgYWRkZWQKLSBBZ2VudCBmb3J3YXJkaW5nIGFkZGVkIChmb3IgT3BlblNTSC5jb20gc3NoIGNsaWVudC9hZ2VudCkKLSBGaXggaW5jb3JyZWN0IGJ1ZmZlciBmcmVlaW5nIHdoZW4gYmFubmVycyBhcmUgdXNlZAotIEhvc3RuYW1lIHJlc29sdXRpb24gd29ya3MKLSBWYXJpb3VzIG1pbm9yIGJ1Z2ZpeGVzL2NvZGUgc2l6ZSBpbXByb3ZlbWVudHMgZXRjCgowLjMxIC0gRnJpIE1heSA5IDIwMDMgMTc6NTc6MTYgKzA4MDAKCi0gSW1wcm92ZWQgc3lzbG9nIG1lc3NhZ2VzIC0gSVAgbG9nZ2luZyBldGMKLSBTdHJpcCBjb250cm9sIGNoYXJhY3RlcnMgZnJvbSBsb2cgbWVzc2FnZXMgKHNwZWNpZmllZCB1c2VybmFtZSBjdXJyZW50bHkpCi0gTG9naW4gcmVjb3JkaW5nICh1dG1wL3d0bXApIHN1cHBvcnQsIHNvIGxhc3Qvdy93aG8gd29yayAtIHRha2VuIGZyb20gT3BlblNTSAotIFNoZWxsIGlzIHN0YXJ0ZWQgYXMgYSBwcm9wZXIgbG9naW4gc2hlbGwsIHNvIC9ldGMvcHJvZmlsZSBldGMgaXMgc291cmNlZAotIFB0eXMgd29yayBvbiBTb2xhcmlzICgyLjggeDg2IHRlc3RlZCkgbm93Ci0gRml4ZWQgYnVnIGluIHNwZWNpZnlpbmcgdGhlIHJzYSBob3N0a2V5Ci0gRml4ZWQgYnVnIGluIGNvbXByZXNzaW9uIGNvZGUsIGNvdWxkIHRyaWdnZXIgaWYgY29tcHJlc3Npb24gcmVzdWx0ZWQgaW4KICBsYXJnZXIgb3V0cHV0IHRoYW4gaW5wdXQgKHVuY29tbW9uIGJ1dCBwb3NzaWJsZSkuCgowLjMwIC0gVGh1IEFwciAxNyAyMDAzIDE4OjQ2OjE1ICswODAwCgotIFNFQ1VSSVRZOiBidWZmZXIuYyBoYWQgYmFkIGNoZWNraW5nIGZvciBidWZmZXIgaW5jcmVtZW50IGxlbmd0aCAtIGZpeGVkCi0gY2hhbm5lbCBjb2RlIG5vdyBjbG9zZXMgcHJvcGVybHkgb24gRU9GIC0gc2NwIHByb2Nlc3NlcyBkb24ndCBoYW5nIGFyb3VuZAotIHN5c2xvZyBzdXBwb3J0IGFkZGVkIC0gaW1wcm92ZWQgYXV0aC9sb2dpbi9mYWlsdXJlIG1lc3NhZ2VzCi0gZ2VuZXJhbCBjb2RlIHRpZHlpbmcsIG1hZGUgcmV0dXJuIGNvZGVzIG1vcmUgY29uc2lzdGVudAotIE1ha2VmaWxlIGZpeGVkIGZvciBkZXBlbmRlbmNpZXMgYW5kIG1ha2VzIGxpYnRvbWNyeXB0IGFzIHdlbGwKLSBJbXBsZW1lbnRlZCBzZW5kaW5nIFNTSF9NU0dfVU5JTVBMRU1FTlRFRCA6KQoKMC4yOSAtIFdlZCBBcHIgOSAyMDAzCgotIEZpeGVkIGEgc3R1cGlkIGJ1ZyBpbiAwLjI4IHJlbGVhc2UsICduZXdzdHIgPSBzdHJkdXAob2xkc3RyKScsCiAgbm90ICduZXdzdHI9b2xkc3RyJwoKMC4yOCAtIFN1biBBcHIgNiAyMDAzCgotIEluaXRpYWwgcHVibGljIHJlbGVhc2UKCkRldmVsb3BtZW50IHdhcyBzdGFydGVkIGluIE9jdG9iZXIgMjAwMgo=