PEP 489: Multi-phase extension module initialization; version 7
Petr Viktorin <[email protected]> Thu, 21 May 2015 13:27:16 +0200
| Newsgroups | gmane.comp.python.import |
|---|---|
| Message-ID | <CA+=+wqD27JizXoDB8zU8RpyXYDBUj=86pnqu+9ze5ACrAR=_Dw@mail.gmail.com> |
SGVsbG8sCkJhc2VkIG9uIHRoZSBsYXN0IHJvdW5kIG9mIGNvbW1lbnRzLCBJJ3ZlIHNlbnQgY2hh bmdlcyB0byBQRVAgZWRpdG9ycy4KClRoZXJlIGlzIG9uZSBmdW5jdGlvbmFsIGNoYW5nZToKLSBE b24ndCBhbGxvdyBleGVjdXRpb24gc2xvdHMgZm9yIG5vbi1tb2R1bGUgc3ViY2xhc3NlcwoKYW5k IHNldmVyYWwgd29yZGluZyBmaXhlcy9jbGFyaWZpY2F0aW9uczoKLSBSZW1vdmUgbWlzbGVhZGlu ZyByZWFzb24gZm9yIFB5TW9kdWxlRGVmX0luaXQKLSBDbGFyaWZ5IHRoYXQgc3lzLm1vZHVsZXMg aXMgbm90IGNoZWNrZWQgYmV0d2VlbiBleGVjdXRpb24gc3RlcHMKLSBBZGQgYSBCYWNrd2FyZHMg Q29tcGF0aWJpbGl0eSBzdW1tYXJ5Ci0gSGVhZGluZyBsZXZlbCBmaXgsIHR5cG8gZml4CgoKVGhl IGZ1bGwgdGV4dCBmb2xsb3dzOgoKUEVQOiA0ODkKVGl0bGU6IE11bHRpLXBoYXNlIGV4dGVuc2lv biBtb2R1bGUgaW5pdGlhbGl6YXRpb24KVmVyc2lvbjogJFJldmlzaW9uJApMYXN0LU1vZGlmaWVk OiAkRGF0ZSQKQXV0aG9yOiBQZXRyIFZpa3RvcmluIDxlbmN1a291QGdtYWlsLmNvbT4sCiAgICAg ICAgU3RlZmFuIEJlaG5lbCA8c3RlZmFuX21sQGJlaG5lbC5kZT4sCiAgICAgICAgTmljayBDb2do bGFuIDxuY29naGxhbkBnbWFpbC5jb20+CkJERkwtRGVsZWdhdGU6IEVyaWMgU25vdyA8ZXJpY3Nu b3djdXJyZW50bHlAZ21haWwuY29tPgpEaXNjdXNzaW9ucy1UbzogaW1wb3J0LXNpZ0BweXRob24u b3JnClN0YXR1czogRHJhZnQKVHlwZTogU3RhbmRhcmRzIFRyYWNrCkNvbnRlbnQtVHlwZTogdGV4 dC94LXJzdApDcmVhdGVkOiAxMS1BdWctMjAxMwpQeXRob24tVmVyc2lvbjogMy41ClBvc3QtSGlz dG9yeTogMjMtQXVnLTIwMTMsIDIwLUZlYi0yMDE1LCAxNi1BcHItMjAxNQpSZXNvbHV0aW9uOgoK CkFic3RyYWN0Cj09PT09PT09CgpUaGlzIFBFUCBwcm9wb3NlcyBhIHJlZGVzaWduIG9mIHRoZSB3 YXkgaW4gd2hpY2ggYnVpbHQtaW4gYW5kIGV4dGVuc2lvbiBtb2R1bGVzCmludGVyYWN0IHdpdGgg dGhlIGltcG9ydCBtYWNoaW5lcnkuIFRoaXMgd2FzIGxhc3QgcmV2aXNlZCBmb3IgUHl0aG9uIDMu MCBpbiBQRVAKMzEyMSwgYnV0IGRpZCBub3Qgc29sdmUgYWxsIHByb2JsZW1zIGF0IHRoZSB0aW1l LiBUaGUgZ29hbCBpcyB0byBzb2x2ZQppbXBvcnQtcmVsYXRlZCBwcm9ibGVtcyBieSBicmluZ2lu ZyBleHRlbnNpb24gbW9kdWxlcyBjbG9zZXIgdG8gdGhlIHdheSBQeXRob24KbW9kdWxlcyBiZWhh dmU7IHNwZWNpZmljYWxseSB0byBob29rIGludG8gdGhlIE1vZHVsZVNwZWMtYmFzZWQgbG9hZGlu ZwptZWNoYW5pc20gaW50cm9kdWNlZCBpbiBQRVAgNDUxLgoKVGhpcyBwcm9wb3NhbCBkcmF3cyBp bnNwaXJhdGlvbiBmcm9tIFB5VHlwZV9TcGVjIG9mIFBFUCAzODQgdG8gYWxsb3cgZXh0ZW5zaW9u CmF1dGhvcnMgdG8gb25seSBkZWZpbmUgZmVhdHVyZXMgdGhleSBuZWVkLCBhbmQgdG8gYWxsb3cg ZnV0dXJlIGFkZGl0aW9ucwp0byBleHRlbnNpb24gbW9kdWxlIGRlY2xhcmF0aW9ucy4KCkV4dGVu c2lvbnMgbW9kdWxlcyBhcmUgY3JlYXRlZCBpbiBhIHR3by1zdGVwIHByb2Nlc3MsIGZpdHRpbmcg YmV0dGVyIGludG8KdGhlIE1vZHVsZVNwZWMgYXJjaGl0ZWN0dXJlLCB3aXRoIHBhcmFsbGVscyB0 byBfX25ld19fIGFuZCBfX2luaXRfXyBvZiBjbGFzc2VzLgoKRXh0ZW5zaW9uIG1vZHVsZXMgY2Fu IHNhZmVseSBzdG9yZSBhcmJpdHJhcnkgQy1sZXZlbCBwZXItbW9kdWxlIHN0YXRlIGluCnRoZSBt b2R1bGUgdGhhdCBpcyBjb3ZlcmVkIGJ5IG5vcm1hbCBnYXJiYWdlIGNvbGxlY3Rpb24gYW5kIHN1 cHBvcnRzCnJlbG9hZGluZyBhbmQgc3ViLWludGVycHJldGVycy4KRXh0ZW5zaW9uIGF1dGhvcnMg YXJlIGVuY291cmFnZWQgdG8gdGFrZSB0aGVzZSBpc3N1ZXMgaW50byBhY2NvdW50CndoZW4gdXNp bmcgdGhlIG5ldyBBUEkuCgpUaGUgcHJvcG9zYWwgYWxzbyBhbGxvd3MgZXh0ZW5zaW9uIG1vZHVs ZXMgd2l0aCBub24tQVNDSUkgbmFtZXMuCgpOb3QgYWxsIHByb2JsZW1zIHRhY2tsZWQgaW4gUEVQ IDMxMjEgYXJlIHNvbHZlZCBpbiB0aGlzIHByb3Bvc2FsLgpJbiBwYXJ0aWN1bGFyLCBwcm9ibGVt cyB3aXRoIHJ1bi10aW1lIG1vZHVsZSBsb29rdXAgKFB5U3RhdGVfRmluZE1vZHVsZSkKYXJlIGxl ZnQgdG8gYSBmdXR1cmUgUEVQLgoKCk1vdGl2YXRpb24KPT09PT09PT09PQoKUHl0aG9uIG1vZHVs ZXMgYW5kIGV4dGVuc2lvbiBtb2R1bGVzIGFyZSBub3QgYmVpbmcgc2V0IHVwIGluIHRoZSBzYW1l IHdheS4KRm9yIFB5dGhvbiBtb2R1bGVzLCB0aGUgbW9kdWxlIG9iamVjdCBpcyBjcmVhdGVkIGFu ZCBzZXQgdXAgZmlyc3QsIHRoZW4gdGhlCm1vZHVsZSBjb2RlIGlzIGJlaW5nIGV4ZWN1dGVkIChQ RVAgMzAyKS4KQSBNb2R1bGVTcGVjIG9iamVjdCAoUEVQIDQ1MSkgaXMgdXNlZCB0byBob2xkIGlu Zm9ybWF0aW9uIGFib3V0IHRoZSBtb2R1bGUsCmFuZCBwYXNzZWQgdG8gdGhlIHJlbGV2YW50IGhv b2tzLgoKRm9yIGV4dGVuc2lvbnMgKGkuZS4gc2hhcmVkIGxpYnJhcmllcykgYW5kIGJ1aWx0LWlu IG1vZHVsZXMsIHRoZSBtb2R1bGUKaW5pdCBmdW5jdGlvbiBpcyBleGVjdXRlZCBzdHJhaWdodCBh d2F5IGFuZCBkb2VzIGJvdGggdGhlIGNyZWF0aW9uIGFuZAppbml0aWFsaXphdGlvbi4gVGhlIGlu aXRpYWxpemF0aW9uIGZ1bmN0aW9uIGlzIG5vdCBwYXNzZWQgdGhlIE1vZHVsZVNwZWMsCm9yIGFu eSBpbmZvcm1hdGlvbiBpdCBjb250YWlucywgc3VjaCBhcyB0aGUgX19maWxlX18gb3IgZnVsbHkt cXVhbGlmaWVkCm5hbWUuIFRoaXMgaGluZGVycyByZWxhdGl2ZSBpbXBvcnRzIGFuZCByZXNvdXJj ZSBsb2FkaW5nLgoKSW4gUHkzLCBtb2R1bGVzIGFyZSBhbHNvIG5vdCBiZWluZyBhZGRlZCB0byBz eXMubW9kdWxlcywgd2hpY2ggbWVhbnMgdGhhdCBhCihwb3RlbnRpYWxseSB0cmFuc2l0aXZlKSBy ZS1pbXBvcnQgb2YgdGhlIG1vZHVsZSB3aWxsIHJlYWxseSB0cnkgdG8gcmUtaW1wb3J0Cml0IGFu ZCB0aHVzIHJ1biBpbnRvIGFuIGluZmluaXRlIGxvb3Agd2hlbiBpdCBleGVjdXRlcyB0aGUgbW9k dWxlIGluaXQgZnVuY3Rpb24KYWdhaW4uIFdpdGhvdXQgYWNjZXNzIHRvIHRoZSBmdWxseS1xdWFs aWZpZWQgbW9kdWxlIG5hbWUsIGl0IGlzIG5vdCB0cml2aWFsIHRvCmNvcnJlY3RseSBhZGQgdGhl IG1vZHVsZSB0byBzeXMubW9kdWxlcyBlaXRoZXIuClRoaXMgaXMgc3BlY2lmaWNhbGx5IGEgcHJv YmxlbSBmb3IgQ3l0aG9uIGdlbmVyYXRlZCBtb2R1bGVzLCBmb3Igd2hpY2ggaXQncwpub3QgdW5j b21tb24gdGhhdCB0aGUgbW9kdWxlIGluaXQgY29kZSBoYXMgdGhlIHNhbWUgbGV2ZWwgb2YgY29t cGxleGl0eSBhcwp0aGF0IG9mIGFueSAncmVndWxhcicgUHl0aG9uIG1vZHVsZS4gQWxzbywgdGhl IGxhY2sgb2YgX19maWxlX18gYW5kIF9fbmFtZV9fCmluZm9ybWF0aW9uIGhpbmRlcnMgdGhlIGNv bXBpbGF0aW9uIG9mICJfX2luaXRfXy5weSIgbW9kdWxlcywgaS5lLiBwYWNrYWdlcywKZXNwZWNp YWxseSB3aGVuIHJlbGF0aXZlIGltcG9ydHMgYXJlIGJlaW5nIHVzZWQgYXQgbW9kdWxlIGluaXQg dGltZS4KCkZ1cnRoZXJtb3JlLCB0aGUgbWFqb3JpdHkgb2YgY3VycmVudGx5IGV4aXN0aW5nIGV4 dGVuc2lvbiBtb2R1bGVzIGhhcwpwcm9ibGVtcyB3aXRoIHN1Yi1pbnRlcnByZXRlciBzdXBwb3J0 IGFuZC9vciBpbnRlcnByZXRlciByZWxvYWRpbmcsIGFuZCwgd2hpbGUKaXQgaXMgcG9zc2libGUg d2l0aCB0aGUgY3VycmVudCBpbmZyYXN0cnVjdHVyZSB0byBzdXBwb3J0IHRoZXNlCmZlYXR1cmVz LCBpdCBpcyBuZWl0aGVyIGVhc3kgbm9yIGVmZmljaWVudC4KQWRkcmVzc2luZyB0aGVzZSBpc3N1 ZXMgd2FzIHRoZSBnb2FsIG9mIFBFUCAzMTIxLCBidXQgbWFueSBleHRlbnNpb25zLAppbmNsdWRp bmcgc29tZSBpbiB0aGUgc3RhbmRhcmQgbGlicmFyeSwgdG9vayB0aGUgbGVhc3QtZWZmb3J0IGFw cHJvYWNoCnRvIHBvcnRpbmcgdG8gUHl0aG9uIDMsIGxlYXZpbmcgdGhlc2UgaXNzdWVzIHVucmVz b2x2ZWQuClRoaXMgUEVQIGtlZXBzIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB3aGljaCBzaG91 bGQgcmVkdWNlIHByZXNzdXJlIGFuZCBnaXZlCmV4dGVuc2lvbiBhdXRob3JzIGFkZXF1YXRlIHRp bWUgdG8gY29uc2lkZXIgdGhlc2UgaXNzdWVzIHdoZW4gcG9ydGluZy4KCgpUaGUgY3VycmVudCBw cm9jZXNzCj09PT09PT09PT09PT09PT09PT0KCkN1cnJlbnRseSwgZXh0ZW5zaW9uIGFuZCBidWls dC1pbiBtb2R1bGVzIGV4cG9ydCBhbiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgpuYW1lZCAiUHlJ bml0X21vZHVsZW5hbWUiLCBuYW1lZCBhZnRlciB0aGUgZmlsZSBuYW1lIG9mIHRoZSBzaGFyZWQg bGlicmFyeS4KVGhpcyBmdW5jdGlvbiBpcyBleGVjdXRlZCBieSB0aGUgaW1wb3J0IG1hY2hpbmVy eSBhbmQgbXVzdCByZXR1cm4gYSBmdWxseQppbml0aWFsaXplZCBtb2R1bGUgb2JqZWN0LgpUaGUg ZnVuY3Rpb24gcmVjZWl2ZXMgbm8gYXJndW1lbnRzLCBzbyBpdCBoYXMgbm8gd2F5IG9mIGtub3dp bmcgYWJvdXQgaXRzCmltcG9ydCBjb250ZXh0LgoKRHVyaW5nIGl0cyBleGVjdXRpb24sIHRoZSBt b2R1bGUgaW5pdCBmdW5jdGlvbiBjcmVhdGVzIGEgbW9kdWxlIG9iamVjdApiYXNlZCBvbiBhIFB5 TW9kdWxlRGVmIG9iamVjdC4gSXQgdGhlbiBjb250aW51ZXMgdG8gaW5pdGlhbGl6ZSBpdCBieSBh ZGRpbmcKYXR0cmlidXRlcyB0byB0aGUgbW9kdWxlIGRpY3QsIGNyZWF0aW5nIHR5cGVzLCBldGMu CgpJbiB0aGUgYmFjaywgdGhlIHNoYXJlZCBsaWJyYXJ5IGxvYWRlciBrZWVwcyBhIG5vdGUgb2Yg dGhlIGZ1bGx5IHF1YWxpZmllZAptb2R1bGUgbmFtZSBvZiB0aGUgbGFzdCBtb2R1bGUgdGhhdCBp dCBsb2FkZWQsIGFuZCB3aGVuIGEgbW9kdWxlIGdldHMKY3JlYXRlZCB0aGF0IGhhcyBhIG1hdGNo aW5nIG5hbWUsIHRoaXMgZ2xvYmFsIHZhcmlhYmxlIGlzIHVzZWQgdG8gZGV0ZXJtaW5lCnRoZSBm dWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgbW9kdWxlIG9iamVjdC4gVGhpcyBpcyBub3QgZW50 aXJlbHkgc2FmZSBhcyBpdApyZWxpZXMgb24gdGhlIG1vZHVsZSBpbml0IGZ1bmN0aW9uIGNyZWF0 aW5nIGl0cyBvd24gbW9kdWxlIG9iamVjdCBmaXJzdCwKYnV0IHRoaXMgYXNzdW1wdGlvbiB1c3Vh bGx5IGhvbGRzIGluIHByYWN0aWNlLgoKClRoZSBwcm9wb3NhbAo9PT09PT09PT09PT0KClRoZSBp bml0aWFsaXphdGlvbiBmdW5jdGlvbiAoUHlJbml0X21vZHVsZW5hbWUpIHdpbGwgYmUgYWxsb3dl ZCB0byByZXR1cm4KYSBwb2ludGVyIHRvIGEgUHlNb2R1bGVEZWYgb2JqZWN0LiBUaGUgaW1wb3J0 IG1hY2hpbmVyeSB3aWxsIGJlIGluIGNoYXJnZQpvZiBjb25zdHJ1Y3RpbmcgdGhlIG1vZHVsZSBv YmplY3QsIGNhbGxpbmcgaG9va3MgcHJvdmlkZWQgaW4gdGhlIFB5TW9kdWxlRGVmCmluIHRoZSBy ZWxldmFudCBwaGFzZXMgb2YgaW5pdGlhbGl6YXRpb24gKGFzIGRlc2NyaWJlZCBiZWxvdykuCgpU aGlzIG11bHRpLXBoYXNlIGluaXRpYWxpemF0aW9uIGlzIGFuIGFkZGl0aW9uYWwgcG9zc2liaWxp dHkuIFNpbmdsZS1waGFzZQppbml0aWFsaXphdGlvbiwgdGhlIGN1cnJlbnQgcHJhY3RpY2Ugb2Yg cmV0dXJuaW5nIGEgZnVsbHkgaW5pdGlhbGl6ZWQgbW9kdWxlCm9iamVjdCwgd2lsbCBzdGlsbCBi ZSBhY2NlcHRlZCwgc28gZXhpc3RpbmcgY29kZSB3aWxsIHdvcmsgdW5jaGFuZ2VkLAppbmNsdWRp bmcgYmluYXJ5IGNvbXBhdGliaWxpdHkuCgpUaGUgUHlNb2R1bGVEZWYgc3RydWN0dXJlIHdpbGwg YmUgY2hhbmdlZCB0byBjb250YWluIGEgbGlzdCBvZiBzbG90cywKc2ltaWxhcmx5IHRvIFBFUCAz ODQncyBQeVR5cGVfU3BlYyBmb3IgdHlwZXMuClRvIGtlZXAgYmluYXJ5IGNvbXBhdGliaWxpdHks IGFuZCBhdm9pZCBuZWVkaW5nIHRvIGludHJvZHVjZSBhIG5ldyBzdHJ1Y3R1cmUKKHdoaWNoIHdv dWxkIGludHJvZHVjZSBhZGRpdGlvbmFsIHN1cHBvcnRpbmcgZnVuY3Rpb25zIGFuZCBwZXItbW9k dWxlIHN0b3JhZ2UpLAp0aGUgY3VycmVudGx5IHVudXNlZCBtX3JlbG9hZCBwb2ludGVyIG9mIFB5 TW9kdWxlRGVmIHdpbGwgYmUgY2hhbmdlZCB0bwpob2xkIHRoZSBzbG90cy4gVGhlIHN0cnVjdHVy ZXMgYXJlIGRlZmluZWQgYXM6OgoKICAgIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICBpbnQgc2xv dDsKICAgICAgICB2b2lkICp2YWx1ZTsKICAgIH0gUHlNb2R1bGVEZWZfU2xvdDsKCiAgICB0eXBl ZGVmIHN0cnVjdCBQeU1vZHVsZURlZiB7CiAgICAgICAgUHlNb2R1bGVEZWZfQmFzZSBtX2Jhc2U7 CiAgICAgICAgY29uc3QgY2hhciogbV9uYW1lOwogICAgICAgIGNvbnN0IGNoYXIqIG1fZG9jOwog ICAgICAgIFB5X3NzaXplX3QgbV9zaXplOwogICAgICAgIFB5TWV0aG9kRGVmICptX21ldGhvZHM7 CiAgICAgICAgUHlNb2R1bGVEZWZfU2xvdCAqbV9zbG90czsgIC8qIGNoYW5nZWQgZnJvbSBgaW5x dWlyeSBtX3JlbG9hZDtgICovCiAgICAgICAgdHJhdmVyc2Vwcm9jIG1fdHJhdmVyc2U7CiAgICAg ICAgaW5xdWlyeSBtX2NsZWFyOwogICAgICAgIGZyZWVmdW5jIG1fZnJlZTsKICAgIH0gUHlNb2R1 bGVEZWY7CgpUaGUgKm1fc2xvdHMqIG1lbWJlciBtdXN0IGJlIGVpdGhlciBOVUxMLCBvciBwb2lu dCB0byBhbiBhcnJheSBvZgpQeU1vZHVsZURlZl9TbG90IHN0cnVjdHVyZXMsIHRlcm1pbmF0ZWQg YnkgYSBzbG90IHdpdGggaWQgc2V0IHRvIDAKKGkuZS4gYGB7MCwgTlVMTH1gYCkuCgpUbyBzcGVj aWZ5IGEgc2xvdCwgYSB1bmlxdWUgc2xvdCBJRCBtdXN0IGJlIHByb3ZpZGVkLgpOZXcgUHl0aG9u IHZlcnNpb25zIG1heSBpbnRyb2R1Y2UgbmV3IHNsb3QgSURzLCBidXQgc2xvdCBJRHMgd2lsbCBu ZXZlciBiZQpyZWN5Y2xlZC4gU2xvdHMgbWF5IGdldCBkZXByZWNhdGVkLCBidXQgd2lsbCBjb250 aW51ZSB0byBiZSBzdXBwb3J0ZWQKdGhyb3VnaG91dCBQeXRob24gMy54LgoKQSBzbG90J3MgdmFs dWUgcG9pbnRlciBtYXkgbm90IGJlIE5VTEwsIHVubGVzcyBzcGVjaWZpZWQgb3RoZXJ3aXNlIGlu IHRoZQpzbG90J3MgZG9jdW1lbnRhdGlvbi4KClRoZSBmb2xsb3dpbmcgc2xvdHMgYXJlIGN1cnJl bnRseSBhdmFpbGFibGUsIGFuZCBkZXNjcmliZWQgbGF0ZXI6CgoqIFB5X21vZF9jcmVhdGUKKiBQ eV9tb2RfZXhlYwoKVW5rbm93biBzbG90IElEcyB3aWxsIGNhdXNlIHRoZSBpbXBvcnQgdG8gZmFp bCB3aXRoIFN5c3RlbUVycm9yLgoKV2hlbiB1c2luZyBtdWx0aS1waGFzZSBpbml0aWFsaXphdGlv biwgdGhlICptX25hbWUqIGZpZWxkIG9mIFB5TW9kdWxlRGVmIHdpbGwKbm90IGJlIHVzZWQgZHVy aW5nIGltcG9ydGluZzsgdGhlIG1vZHVsZSBuYW1lIHdpbGwgYmUgdGFrZW4gZnJvbSB0aGUgTW9k dWxlU3BlYy4KCkJlZm9yZSBpdCBpcyByZXR1cm5lZCBmcm9tIFB5SW5pdF8qLCB0aGUgUHlNb2R1 bGVEZWYgb2JqZWN0IG11c3QgYmUgaW5pdGlhbGl6ZWQKdXNpbmcgdGhlIG5ld2x5IGFkZGVkIFB5 TW9kdWxlRGVmX0luaXQgZnVuY3Rpb24uIFRoaXMgc2V0cyB0aGUgb2JqZWN0IHR5cGUKKHdoaWNo IGNhbm5vdCBiZSBkb25lIHN0YXRpY2FsbHkgb24gY2VydGFpbiBjb21waWxlcnMpLCByZWZjb3Vu dCwgYW5kIGludGVybmFsCmJvb2trZWVwaW5nIGRhdGEgKG1faW5kZXgpLgpGb3IgZXhhbXBsZSwg YW4gZXh0ZW5zaW9uIG1vZHVsZSAiZXhhbXBsZSIgd291bGQgYmUgZXhwb3J0ZWQgYXM6OgoKICAg IHN0YXRpYyBQeU1vZHVsZURlZiBleGFtcGxlX2RlZiA9IHsuLi59CgogICAgUHlNT0RJTklUX0ZV TkMKICAgIFB5SW5pdF9leGFtcGxlKHZvaWQpCiAgICB7CiAgICAgICAgcmV0dXJuIFB5TW9kdWxl RGVmX0luaXQoJmV4YW1wbGVfZGVmKTsKICAgIH0KClRoZSBQeU1vZHVsZURlZiBvYmplY3QgbXVz dCBiZSBhdmFpbGFibGUgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgbW9kdWxlIGNyZWF0ZWQKZnJv bSBpdCDigJMgdXN1YWxseSwgaXQgd2lsbCBiZSBkZWNsYXJlZCBzdGF0aWNhbGx5LgoKUHNldWRv LWNvZGUgT3ZlcnZpZXcKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkhlcmUgaXMgYW4gb3ZlcnZpZXcg b2YgaG93IHRoZSBtb2RpZmllZCBpbXBvcnRlcnMgd2lsbCBvcGVyYXRlLgpEZXRhaWxzIHN1Y2gg YXMgbG9nZ2luZyBvciBoYW5kbGluZyBvZiBlcnJvcnMgYW5kIGludmFsaWQgc3RhdGVzCmFyZSBs ZWZ0IG91dCwgYW5kIEMgY29kZSBpcyBwcmVzZW50ZWQgd2l0aCBhIGNvbmNpc2UgUHl0aG9uLWxp a2Ugc3ludGF4LgoKVGhlIGZyYW1ld29yayB0aGF0IGNhbGxzIHRoZSBpbXBvcnRlcnMgaXMgZXhw bGFpbmVkIGluIFBFUCA0NTEKWyNwZXAtMDQ1MS1sb2FkaW5nXV8uCgo6OgoKICAgIGltcG9ydGxp Yi9fYm9vdHN0cmFwLnB5OgoKICAgICAgICBjbGFzcyBCdWlsdGluSW1wb3J0ZXI6CiAgICAgICAg ICAgIGRlZiBjcmVhdGVfbW9kdWxlKHNlbGYsIHNwZWMpOgogICAgICAgICAgICAgICAgbW9kdWxl ID0gX2ltcC5jcmVhdGVfYnVpbHRpbihzcGVjKQoKICAgICAgICAgICAgZGVmIGV4ZWNfbW9kdWxl KHNlbGYsIG1vZHVsZSk6CiAgICAgICAgICAgICAgICBfaW1wLmV4ZWNfZHluYW1pYyhtb2R1bGUp CgogICAgICAgICAgICBkZWYgbG9hZF9tb2R1bGUoc2VsZiwgbmFtZSk6CiAgICAgICAgICAgICAg ICAjIHVzZSBhIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHNoaW0KICAgICAgICAgICAgICAgIF9s b2FkX21vZHVsZV9zaGltKHNlbGYsIG5hbWUpCgogICAgaW1wb3J0bGliL19ib290c3RyYXBfZXh0 ZXJuYWwucHk6CgogICAgICAgIGNsYXNzIEV4dGVuc2lvbkZpbGVMb2FkZXI6CiAgICAgICAgICAg IGRlZiBjcmVhdGVfbW9kdWxlKHNlbGYsIHNwZWMpOgogICAgICAgICAgICAgICAgbW9kdWxlID0g X2ltcC5jcmVhdGVfZHluYW1pYyhzcGVjKQoKICAgICAgICAgICAgZGVmIGV4ZWNfbW9kdWxlKHNl bGYsIG1vZHVsZSk6CiAgICAgICAgICAgICAgICBfaW1wLmV4ZWNfZHluYW1pYyhtb2R1bGUpCgog ICAgICAgICAgICBkZWYgbG9hZF9tb2R1bGUoc2VsZiwgbmFtZSk6CiAgICAgICAgICAgICAgICAj IHVzZSBhIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHNoaW0KICAgICAgICAgICAgICAgIF9sb2Fk X21vZHVsZV9zaGltKHNlbGYsIG5hbWUpCgogICAgUHl0aG9uL2ltcG9ydC5jICh0aGUgX2ltcCBt b2R1bGUpOgoKICAgICAgICBkZWYgY3JlYXRlX2R5bmFtaWMoc3BlYyk6CiAgICAgICAgICAgIG5h bWUgPSBzcGVjLm5hbWUKICAgICAgICAgICAgcGF0aCA9IHNwZWMub3JpZ2luCgogICAgICAgICAg ICAjIEZpbmQgYW4gYWxyZWFkeSBsb2FkZWQgbW9kdWxlIHRoYXQgdXNlZCBzaW5nbGUtcGhhc2Ug aW5pdC4KICAgICAgICAgICAgIyBGb3IgbXVsdGktcGhhc2UgaW5pdGlhbGl6YXRpb24sIG1vZCBp cyBOVUxMLCBzbyBhIG5ldyBtb2R1bGUKICAgICAgICAgICAgIyBpcyBhbHdheXMgY3JlYXRlZC4K ICAgICAgICAgICAgbW9kID0gX1B5SW1wb3J0X0ZpbmRFeHRlbnNpb25PYmplY3QobmFtZSwgbmFt ZSkKICAgICAgICAgICAgaWYgbW9kOgogICAgICAgICAgICAgICAgcmV0dXJuIG1vZAoKICAgICAg ICAgICAgcmV0dXJuIF9QeUltcG9ydF9Mb2FkRHluYW1pY01vZHVsZVdpdGhTcGVjKHNwZWMpCgog ICAgICAgIGRlZiBleGVjX2R5bmFtaWMobW9kdWxlKToKICAgICAgICAgICAgaWYgbm90IGlzaW5z dGFuY2UobW9kdWxlLCB0eXBlcy5Nb2R1bGVUeXBlKToKICAgICAgICAgICAgICAgICMgbm9uLW1v ZHVsZXMgYXJlIHNraXBwZWQgLS0gUHlNb2R1bGVfR2V0RGVmIGZhaWxzIG9uIHRoZW0KICAgICAg ICAgICAgICAgIHJldHVybgoKICAgICAgICAgICAgZGVmID0gUHlNb2R1bGVfR2V0RGVmKG1vZHVs ZSkKICAgICAgICAgICAgc3RhdGUgPSBQeU1vZHVsZV9HZXRTdGF0ZShtb2R1bGUpCiAgICAgICAg ICAgIGlmIHN0YXRlIGlzIE5VTEw6CiAgICAgICAgICAgICAgICBQeU1vZHVsZV9FeGVjRGVmKG1v ZHVsZSwgZGVmKQoKICAgICAgICBkZWYgY3JlYXRlX2J1aWx0aW4oc3BlYyk6CiAgICAgICAgICAg IG5hbWUgPSBzcGVjLm5hbWUKCiAgICAgICAgICAgICMgRmluZCBhbiBhbHJlYWR5IGxvYWRlZCBt b2R1bGUgdGhhdCB1c2VkIHNpbmdsZS1waGFzZSBpbml0LgogICAgICAgICAgICAjIEZvciBtdWx0 aS1waGFzZSBpbml0aWFsaXphdGlvbiwgbW9kIGlzIE5VTEwsIHNvIGEgbmV3IG1vZHVsZQogICAg ICAgICAgICAjIGlzIGFsd2F5cyBjcmVhdGVkLgogICAgICAgICAgICBtb2QgPSBfUHlJbXBvcnRf RmluZEV4dGVuc2lvbk9iamVjdChuYW1lLCBuYW1lKQogICAgICAgICAgICBpZiBtb2Q6CiAgICAg ICAgICAgICAgICByZXR1cm4gbW9kCgogICAgICAgICAgICBmb3IgaW5pdG5hbWUsIGluaXRmdW5j IGluIFB5SW1wb3J0X0luaXR0YWI6CiAgICAgICAgICAgICAgICBpZiBuYW1lID09IGluaXRuYW1l OgogICAgICAgICAgICAgICAgICAgIG0gPSBpbml0ZnVuYygpCiAgICAgICAgICAgICAgICAgICAg aWYgaXNpbnN0YW5jZShtLCBQeU1vZHVsZURlZik6CiAgICAgICAgICAgICAgICAgICAgICAgIGRl ZiA9IG0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFB5TW9kdWxlX0Zyb21EZWZBbmRT cGVjKGRlZiwgc3BlYykKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAg ICAgICAgICAjIGZhbGwgYmFjayB0byBzaW5nbGUtcGhhc2UgaW5pdGlhbGl6YXRpb24KICAgICAg ICAgICAgICAgICAgICAgICAgbW9kdWxlID0gbQogICAgICAgICAgICAgICAgICAgICAgICBfUHlJ bXBvcnRfRml4dXBFeHRlbnNpb25PYmplY3QobW9kdWxlLCBuYW1lLCBuYW1lKQogICAgICAgICAg ICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlCgogICAgUHl0aG9uL2ltcG9ydGRsLmM6CgogICAg ICAgIGRlZiBfUHlJbXBvcnRfTG9hZER5bmFtaWNNb2R1bGVXaXRoU3BlYyhzcGVjKToKICAgICAg ICAgICAgcGF0aCA9IHNwZWMub3JpZ2luCiAgICAgICAgICAgIHBhY2thZ2UsIGRvdCwgbmFtZSA9 IHNwZWMubmFtZS5ycGFydGl0aW9uKCcuJykKCiAgICAgICAgICAgICMgc2VlIHRoZSAiTm9uLUFT Q0lJIG1vZHVsZSBuYW1lcyIgc2VjdGlvbiBmb3IgZXhwb3J0X2hvb2tfbmFtZQogICAgICAgICAg ICBob29rX25hbWUgPSBleHBvcnRfaG9va19uYW1lKG5hbWUpCgogICAgICAgICAgICAjIGNhbGwg cGxhdGZvcm0tc3BlY2lmaWMgZnVuY3Rpb24gZm9yIGxvYWRpbmcgZXhwb3J0ZWQgZnVuY3Rpb24K ICAgICAgICAgICAgIyBmcm9tIHNoYXJlZCBsaWJyYXJ5CiAgICAgICAgICAgIGV4cG9ydGZ1bmMg PSBfZmluZF9zaGFyZWRfZnVuY3B0cihob29rX25hbWUsIHBhdGgpCgogICAgICAgICAgICBtID0g ZXhwb3J0ZnVuYygpCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobSwgUHlNb2R1bGVEZWYpOgog ICAgICAgICAgICAgICAgZGVmID0gbQogICAgICAgICAgICAgICAgcmV0dXJuIFB5TW9kdWxlX0Zy b21EZWZBbmRTcGVjKGRlZiwgc3BlYykKCiAgICAgICAgICAgIG1vZHVsZSA9IG0KCiAgICAgICAg ICAgICMgZmFsbCBiYWNrIHRvIHNpbmdsZS1waGFzZSBpbml0aWFsaXphdGlvbgogICAgICAgICAg ICAuLi4uCgogICAgT2JqZWN0cy9tb2R1bGVvYmplY3QuYzoKCiAgICAgICAgZGVmIFB5TW9kdWxl X0Zyb21EZWZBbmRTcGVjKGRlZiwgc3BlYyk6CiAgICAgICAgICAgIG5hbWUgPSBzcGVjLm5hbWUK ICAgICAgICAgICAgY3JlYXRlID0gTm9uZQogICAgICAgICAgICBmb3Igc2xvdCwgdmFsdWUgaW4g ZGVmLm1fc2xvdHM6CiAgICAgICAgICAgICAgICBpZiBzbG90ID09IFB5X21vZF9jcmVhdGU6CiAg ICAgICAgICAgICAgICAgICAgY3JlYXRlID0gdmFsdWUKICAgICAgICAgICAgaWYgY3JlYXRlOgog ICAgICAgICAgICAgICAgbSA9IGNyZWF0ZShzcGVjLCBkZWYpCiAgICAgICAgICAgIGVsc2U6CiAg ICAgICAgICAgICAgICBtID0gUHlNb2R1bGVfTmV3KG5hbWUpCgogICAgICAgICAgICBpZiBpc2lu c3RhbmNlKG0sIHR5cGVzLk1vZHVsZVR5cGUpOgogICAgICAgICAgICAgICAgbS5tZF9zdGF0ZSA9 IE5vbmUKICAgICAgICAgICAgICAgIG0ubWRfZGVmID0gZGVmCgogICAgICAgICAgICBpZiBkZWYu bV9tZXRob2RzOgogICAgICAgICAgICAgICAgUHlNb2R1bGVfQWRkRnVuY3Rpb25zKG0sIGRlZi5t X21ldGhvZHMpCiAgICAgICAgICAgIGlmIGRlZi5tX2RvYzoKICAgICAgICAgICAgICAgIFB5TW9k dWxlX1NldERvY1N0cmluZyhtLCBkZWYubV9kb2MpCgogICAgICAgIGRlZiBQeU1vZHVsZV9FeGVj RGVmKG1vZHVsZSwgZGVmKToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShtb2R1bGUsIHR5cGVz Lm1vZHVsZV90eXBlKToKICAgICAgICAgICAgICAgIGlmIG1vZHVsZS5tZF9zdGF0ZSBpcyBOVUxM OgogICAgICAgICAgICAgICAgICAgICMgYWxsb2NhdGUgYSBibG9jayBvZiB6ZXJvZWQtb3V0IG1l bW9yeQogICAgICAgICAgICAgICAgICAgIG1vZHVsZS5tZF9zdGF0ZSA9IF9hbGxvYyhtb2R1bGUu bWRfc2l6ZSkKCiAgICAgICAgICAgIGlmIGRlZi5tX3Nsb3RzIGlzIE5VTEw6CiAgICAgICAgICAg ICAgICByZXR1cm4KCiAgICAgICAgICAgIGZvciBzbG90LCB2YWx1ZSBpbiBkZWYubV9zbG90czoK ICAgICAgICAgICAgICAgIGlmIHNsb3QgPT0gUHlfbW9kX2V4ZWM6CiAgICAgICAgICAgICAgICAg ICAgdmFsdWUobW9kdWxlKQoKCk1vZHVsZSBDcmVhdGlvbiBQaGFzZQotLS0tLS0tLS0tLS0tLS0t LS0tLS0KCkNyZWF0aW9uIG9mIHRoZSBtb2R1bGUgb2JqZWN0IOKAkyB0aGF0IGlzLCB0aGUgaW1w bGVtZW50YXRpb24gb2YKRXhlY3V0aW9uTG9hZGVyLmNyZWF0ZV9tb2R1bGUg4oCTIGlzIGdvdmVy bmVkIGJ5IHRoZSBQeV9tb2RfY3JlYXRlIHNsb3QuCgpUaGUgUHlfbW9kX2NyZWF0ZSBzbG90Ci4u Li4uLi4uLi4uLi4uLi4uLi4uLi4KClRoZSBQeV9tb2RfY3JlYXRlIHNsb3QgaXMgdXNlZCB0byBz dXBwb3J0IGN1c3RvbSBtb2R1bGUgc3ViY2xhc3Nlcy4KVGhlIHZhbHVlIHBvaW50ZXIgbXVzdCBw b2ludCB0byBhIGZ1bmN0aW9uIHdpdGggdGhlIGZvbGxvd2luZyBzaWduYXR1cmU6OgoKICAgIFB5 T2JqZWN0KiAoKlB5TW9kdWxlQ3JlYXRlRnVuY3Rpb24pKFB5T2JqZWN0ICpzcGVjLCBQeU1vZHVs ZURlZiAqZGVmKQoKVGhlIGZ1bmN0aW9uIHJlY2VpdmVzIGEgTW9kdWxlU3BlYyBpbnN0YW5jZSwg YXMgZGVmaW5lZCBpbiBQRVAgNDUxLAphbmQgdGhlIFB5TW9kdWxlRGVmIHN0cnVjdHVyZS4KSXQg c2hvdWxkIHJldHVybiBhIG5ldyBtb2R1bGUgb2JqZWN0LCBvciBzZXQgYW4gZXJyb3IKYW5kIHJl dHVybiBOVUxMLgoKVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVzcG9uc2libGUgZm9yIHNldHRpbmcg aW1wb3J0LXJlbGF0ZWQgYXR0cmlidXRlcwpzcGVjaWZpZWQgaW4gUEVQIDQ1MSBbI3BlcC0wNDUx LWF0dHJpYnV0ZXNdXyAoc3VjaCBhcyBgYF9fbmFtZV9fYGAgb3IKYGBfX2xvYWRlcl9fYGApIG9u IHRoZSBuZXcgbW9kdWxlLgoKVGhlcmUgaXMgbm8gcmVxdWlyZW1lbnQgZm9yIHRoZSByZXR1cm5l ZCBvYmplY3QgdG8gYmUgYW4gaW5zdGFuY2Ugb2YKdHlwZXMuTW9kdWxlVHlwZS4gQW55IHR5cGUg Y2FuIGJlIHVzZWQsIGFzIGxvbmcgYXMgaXQgc3VwcG9ydHMgc2V0dGluZyBhbmQKZ2V0dGluZyBh dHRyaWJ1dGVzLCBpbmNsdWRpbmcgYXQgbGVhc3QgdGhlIGltcG9ydC1yZWxhdGVkIGF0dHJpYnV0 ZXMuCkhvd2V2ZXIsIG9ubHkgTW9kdWxlVHlwZSBpbnN0YW5jZXMgc3VwcG9ydCBtb2R1bGUtc3Bl Y2lmaWMgZnVuY3Rpb25hbGl0eQpzdWNoIGFzIHBlci1tb2R1bGUgc3RhdGUgYW5kIHByb2Nlc3Np bmcgb2YgZXhlY3V0aW9uIHNsb3RzLgpJZiBzb21ldGhpbmcgb3RoZXIgdGhhbiBhIE1vZHVsZVR5 cGUgc3ViY2xhc3MgaXMgcmV0dXJuZWQsIG5vIGV4ZWN1dGlvbiBzbG90cwptYXkgYmUgZGVmaW5l ZDsgaWYgYW55IGFyZSwgYSBTeXN0ZW1FcnJvciBpcyByYWlzZWQuCgpOb3RlIHRoYXQgd2hlbiB0 aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIG1vZHVsZSdzIGVudHJ5IGluIHN5cy5tb2R1bGVz CmlzIG5vdCBwb3B1bGF0ZWQgeWV0LiBBdHRlbXB0aW5nIHRvIGltcG9ydCB0aGUgc2FtZSBtb2R1 bGUgYWdhaW4KKHBvc3NpYmx5IHRyYW5zaXRpdmVseSksIG1heSBsZWFkIHRvIGFuIGluZmluaXRl IGxvb3AuCkV4dGVuc2lvbiBhdXRob3JzIGFyZSBhZHZpc2VkIHRvIGtlZXAgUHlfbW9kX2NyZWF0 ZSBtaW5pbWFsLCBhbiBpbiBwYXJ0aWN1bGFyCnRvIG5vdCBjYWxsIHVzZXIgY29kZSBmcm9tIGl0 LgoKTXVsdGlwbGUgUHlfbW9kX2NyZWF0ZSBzbG90cyBtYXkgbm90IGJlIHNwZWNpZmllZC4gSWYg dGhleSBhcmUsIGltcG9ydAp3aWxsIGZhaWwgd2l0aCBTeXN0ZW1FcnJvci4KCklmIFB5X21vZF9j cmVhdGUgaXMgbm90IHNwZWNpZmllZCwgdGhlIGltcG9ydCBtYWNoaW5lcnkgd2lsbCBjcmVhdGUg YSBub3JtYWwKbW9kdWxlIG9iamVjdCB1c2luZyBQeU1vZHVsZV9OZXcuIFRoZSBuYW1lIGlzIHRh a2VuIGZyb20gKnNwZWMqLgoKClBvc3QtY3JlYXRpb24gc3RlcHMKLi4uLi4uLi4uLi4uLi4uLi4u LgoKSWYgdGhlIFB5X21vZF9jcmVhdGUgZnVuY3Rpb24gcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0 eXBlcy5Nb2R1bGVUeXBlCm9yIGEgc3ViY2xhc3MgKG9yIGlmIGEgUHlfbW9kX2NyZWF0ZSBzbG90 IGlzIG5vdCBwcmVzZW50KSwgdGhlIGltcG9ydAptYWNoaW5lcnkgd2lsbCBhc3NvY2lhdGUgdGhl IFB5TW9kdWxlRGVmIHdpdGggdGhlIG1vZHVsZS4KVGhpcyBhbHNvIG1ha2VzIHRoZSBQeU1vZHVs ZURlZiBhY2Nlc3NpYmxlIHRvIGV4ZWN1dGlvbiBwaGFzZSwgdGhlClB5TW9kdWxlX0dldERlZiBm dW5jdGlvbiwgYW5kIGdhcmJhZ2UgY29sbGVjdGlvbiByb3V0aW5lcyAodHJhdmVyc2UsCmNsZWFy LCBmcmVlKS4KCklmIHRoZSBQeV9tb2RfY3JlYXRlIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBh IG1vZHVsZSBzdWJjbGFzcywgdGhlbiBtX3NpemUKbXVzdCBiZSAwLCBhbmQgbV90cmF2ZXJzZSwg bV9jbGVhciBhbmQgbV9mcmVlIG11c3QgYWxsIGJlIE5VTEwuCk90aGVyd2lzZSwgU3lzdGVtRXJy b3IgaXMgcmFpc2VkLgoKQWRkaXRpb25hbGx5LCBpbml0aWFsIGF0dHJpYnV0ZXMgc3BlY2lmaWVk IGluIHRoZSBQeU1vZHVsZURlZiBhcmUgc2V0IG9uIHRoZQptb2R1bGUgb2JqZWN0LCByZWdhcmRs ZXNzIG9mIGl0cyB0eXBlOgoKKiBUaGUgZG9jc3RyaW5nIGlzIHNldCBmcm9tIG1fZG9jLCBpZiBu b24tTlVMTC4KKiBUaGUgbW9kdWxlJ3MgZnVuY3Rpb25zIGFyZSBpbml0aWFsaXplZCBmcm9tIG1f bWV0aG9kcywgaWYgYW55LgoKCk1vZHVsZSBFeGVjdXRpb24gUGhhc2UKLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQoKTW9kdWxlIGV4ZWN1dGlvbiAtLSB0aGF0IGlzLCB0aGUgaW1wbGVtZW50YXRpb24g b2YKRXhlY3V0aW9uTG9hZGVyLmV4ZWNfbW9kdWxlIC0tIGlzIGdvdmVybmVkIGJ5ICJleGVjdXRp b24gc2xvdHMiLgpUaGlzIFBFUCBvbmx5IGFkZHMgb25lLCBQeV9tb2RfZXhlYywgYnV0IG90aGVy cyBtYXkgYmUgYWRkZWQgaW4gdGhlIGZ1dHVyZS4KClRoZSBleGVjdXRpb24gcGhhc2UgaXMgZG9u ZSBvbiB0aGUgUHlNb2R1bGVEZWYgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb2R1bGUKb2JqZWN0LiBG b3Igb2JqZWN0cyB0aGF0IGFyZSBub3QgYSBzdWJjbGFzcyBvZiBQeU1vZHVsZV9UeXBlIChmb3Ig d2hpY2gKUHlNb2R1bGVfR2V0RGVmIHdvdWxkIGZhaWwpLCB0aGUgZXhlY3V0aW9uIHBoYXNlIGlz IHNraXBwZWQuCgpFeGVjdXRpb24gc2xvdHMgbWF5IGJlIHNwZWNpZmllZCBtdWx0aXBsZSB0aW1l cywgYW5kIGFyZSBwcm9jZXNzZWQgaW4gdGhlIG9yZGVyCnRoZXkgYXBwZWFyIGluIHRoZSBzbG90 cyBhcnJheS4KV2hlbiB1c2luZyB0aGUgZGVmYXVsdCBpbXBvcnQgbWFjaGluZXJ5LCB0aGV5IGFy ZSBwcm9jZXNzZWQgYWZ0ZXIKaW1wb3J0LXJlbGF0ZWQgYXR0cmlidXRlcyBzcGVjaWZpZWQgaW4g UEVQIDQ1MSBbI3BlcC0wNDUxLWF0dHJpYnV0ZXNdXwooc3VjaCBhcyBgYF9fbmFtZV9fYGAgb3Ig YGBfX2xvYWRlcl9fYGApIGFyZSBzZXQgYW5kIHRoZSBtb2R1bGUgaXMgYWRkZWQKdG8gc3lzLm1v ZHVsZXMuCgoKUHJlLUV4ZWN1dGlvbiBzdGVwcwouLi4uLi4uLi4uLi4uLi4uLi4uCgpCZWZvcmUg cHJvY2Vzc2luZyB0aGUgZXhlY3V0aW9uIHNsb3RzLCBwZXItbW9kdWxlIHN0YXRlIGlzIGFsbG9j YXRlZCBmb3IgdGhlCm1vZHVsZS4gRnJvbSB0aGlzIHBvaW50IG9uLCBwZXItbW9kdWxlIHN0YXRl IGlzIGFjY2Vzc2libGUgdGhyb3VnaApQeU1vZHVsZV9HZXRTdGF0ZS4KCgpUaGUgUHlfbW9kX2V4 ZWMgc2xvdAouLi4uLi4uLi4uLi4uLi4uLi4uLgoKVGhlIGVudHJ5IGluIHRoaXMgc2xvdCBtdXN0 IHBvaW50IHRvIGEgZnVuY3Rpb24gd2l0aCB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZTo6CgogICAg aW50ICgqUHlNb2R1bGVFeGVjRnVuY3Rpb24pKFB5T2JqZWN0KiBtb2R1bGUpCgpJdCB3aWxsIGJl IGNhbGxlZCB0byBpbml0aWFsaXplIGEgbW9kdWxlLiBVc3VhbGx5LCB0aGlzIGFtb3VudHMgdG8K c2V0dGluZyB0aGUgbW9kdWxlJ3MgaW5pdGlhbCBhdHRyaWJ1dGVzLgpUaGUgIm1vZHVsZSIgYXJn dW1lbnQgcmVjZWl2ZXMgdGhlIG1vZHVsZSBvYmplY3QgdG8gaW5pdGlhbGl6ZS4KClRoZSBmdW5j dGlvbiBtdXN0IHJldHVybiBgYDBgYCBvbiBzdWNjZXNzLCBvciwgb24gZXJyb3IsIHNldCBhbiBl eGNlcHRpb24gYW5kCnJldHVybiBgYC0xYGAuCgpJZiBQeU1vZHVsZUV4ZWMgcmVwbGFjZXMgdGhl IG1vZHVsZSdzIGVudHJ5IGluIHN5cy5tb2R1bGVzLCB0aGUgbmV3IG9iamVjdAp3aWxsIGJlIHVz ZWQgYW5kIHJldHVybmVkIGJ5IGltcG9ydGxpYiBtYWNoaW5lcnkgYWZ0ZXIgYWxsIGV4ZWN1dGlv biBzbG90cwphcmUgcHJvY2Vzc2VkLiBUaGlzIGlzIGEgZmVhdHVyZSBvZiB0aGUgaW1wb3J0IG1h Y2hpbmVyeSBpdHNlbGYuClRoZSBzbG90cyB0aGVtc2VsdmVzIGFyZSBhbGwgcHJvY2Vzc2VkIHVz aW5nIHRoZSBtb2R1bGUgcmV0dXJuZWQgZnJvbSB0aGUKY3JlYXRpb24gcGhhc2U7IHN5cy5tb2R1 bGVzIGlzIG5vdCBjb25zdWx0ZWQgZHVyaW5nIHRoZSBleGVjdXRpb24gcGhhc2UuCihOb3RlIHRo YXQgZm9yIGV4dGVuc2lvbiBtb2R1bGVzLCBpbXBsZW1lbnRpbmcgUHlfbW9kX2NyZWF0ZSBpcyB1 c3VhbGx5CmEgYmV0dGVyIHNvbHV0aW9uIGZvciB1c2luZyBjdXN0b20gbW9kdWxlIG9iamVjdHMu KQoKCkxlZ2FjeSBJbml0Ci0tLS0tLS0tLS0tCgpUaGUgYmFja3dhcmRzLWNvbXBhdGlibGUgc2lu Z2xlLXBoYXNlIGluaXRpYWxpemF0aW9uIGNvbnRpbnVlcyB0byBiZSBzdXBwb3J0ZWQuCkluIHRo aXMgc2NoZW1lLCB0aGUgUHlJbml0IGZ1bmN0aW9uIHJldHVybnMgYSBmdWxseSBpbml0aWFsaXpl ZCBtb2R1bGUgcmF0aGVyCnRoYW4gYSBQeU1vZHVsZURlZiBvYmplY3QuCkluIHRoaXMgY2FzZSwg dGhlIFB5SW5pdCBob29rIGltcGxlbWVudHMgdGhlIGNyZWF0aW9uIHBoYXNlLCBhbmQgdGhlIGV4 ZWN1dGlvbgpwaGFzZSBpcyBhIG5vLW9wLgoKTW9kdWxlcyB0aGF0IG5lZWQgdG8gd29yayB1bmNo YW5nZWQgb24gb2xkZXIgdmVyc2lvbnMgb2YgUHl0aG9uIHNob3VsZCBzdGljayB0bwpzaW5nbGUt cGhhc2UgaW5pdGlhbGl6YXRpb24sIGJlY2F1c2UgdGhlIGJlbmVmaXRzIGl0IGJyaW5ncyBjYW4n dCBiZQpiYWNrLXBvcnRlZC4KSGVyZSBpcyBhbiBleGFtcGxlIG9mIGEgbW9kdWxlIHRoYXQgc3Vw cG9ydHMgbXVsdGktcGhhc2UgaW5pdGlhbGl6YXRpb24sCmFuZCBmYWxscyBiYWNrIHRvIHNpbmds ZS1waGFzZSB3aGVuIGNvbXBpbGVkIGZvciBhbiBvbGRlciB2ZXJzaW9uIG9mIENQeXRob24uCkl0 IGlzIGluY2x1ZGVkIG1haW5seSBhcyBhbiBpbGx1c3RyYXRpb24gb2YgdGhlIGNoYW5nZXMgbmVl ZGVkIHRvIGVuYWJsZQptdWx0aS1waGFzZSBpbml0OjoKCiAgICAjaW5jbHVkZSA8UHl0aG9uLmg+ CgogICAgc3RhdGljIGludCBzcGFtX2V4ZWMoUHlPYmplY3QgKm1vZHVsZSkgewogICAgICAgIFB5 TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KG1vZHVsZSwgImZvb2QiLCAic3BhbSIpOwogICAgICAg IHJldHVybiAwOwogICAgfQoKICAgICNpZmRlZiBQeV9tb2RfZXhlYwogICAgc3RhdGljIFB5TW9k dWxlRGVmX1Nsb3Qgc3BhbV9zbG90c1tdID0gewogICAgICAgIHtQeV9tb2RfZXhlYywgc3BhbV9l eGVjfSwKICAgICAgICB7MCwgTlVMTH0KICAgIH07CiAgICAjZW5kaWYKCiAgICBzdGF0aWMgUHlN b2R1bGVEZWYgc3BhbV9kZWYgPSB7CiAgICAgICAgUHlNb2R1bGVEZWZfSEVBRF9JTklULCAgICAg ICAgICAgICAgICAgICAgICAvKiBtX2Jhc2UgKi8KICAgICAgICAic3BhbSIsICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1fbmFtZSAqLwogICAgICAgIFB5RG9jX1NUUigi VXRpbGl0aWVzIGZvciBjb29raW5nIHNwYW0iKSwgICAgLyogbV9kb2MgKi8KICAgICAgICAwLCAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1fc2l6ZSAqLwogICAg ICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbV9tZXRo b2RzICovCiAgICAjaWZkZWYgUHlfbW9kX2V4ZWMKICAgICAgICBzcGFtX3Nsb3RzLCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1fc2xvdHMgKi8KICAgICNlbHNlCiAgICAgICAg TlVMTCwKICAgICNlbmRpZgogICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgLyogbV90cmF2ZXJzZSAqLwogICAgICAgIE5VTEwsICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgLyogbV9jbGVhciAqLwogICAgICAgIE5VTEwsICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbV9mcmVlICovCiAgICB9OwoKICAg IFB5TU9ESU5JVF9GVU5DCiAgICBQeUluaXRfc3BhbSh2b2lkKSB7CiAgICAjaWZkZWYgUHlfbW9k X2V4ZWMKICAgICAgICByZXR1cm4gUHlNb2R1bGVEZWZfSW5pdCgmc3BhbV9kZWYpOwogICAgI2Vs c2UKICAgICAgICBQeU9iamVjdCAqbW9kdWxlOwogICAgICAgIG1vZHVsZSA9IFB5TW9kdWxlX0Ny ZWF0ZSgmc3BhbV9kZWYpOwogICAgICAgIGlmIChtb2R1bGUgPT0gTlVMTCkgcmV0dXJuIE5VTEw7 CiAgICAgICAgaWYgKHNwYW1fZXhlYyhtb2R1bGUpICE9IDApIHsKICAgICAgICAgICAgUHlfREVD UkVGKG1vZHVsZSk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgICAgICBy ZXR1cm4gbW9kdWxlOwogICAgI2VuZGlmCiAgICB9CgoKQnVpbHQtSW4gbW9kdWxlcwotLS0tLS0t LS0tLS0tLS0tCgpBbnkgZXh0ZW5zaW9uIG1vZHVsZSBjYW4gYmUgdXNlZCBhcyBhIGJ1aWx0LWlu IG1vZHVsZSBieSBsaW5raW5nIGl0IGludG8KdGhlIGV4ZWN1dGFibGUsIGFuZCBpbmNsdWRpbmcg aXQgaW4gdGhlIGluaXR0YWIgKGVpdGhlciBhdCBydW50aW1lIHdpdGgKUHlJbXBvcnRfQXBwZW5k SW5pdHRhYiwgb3IgYXQgY29uZmlndXJhdGlvbiB0aW1lLCB1c2luZyB0b29scyBsaWtlICpmcmVl emUqKS4KClRvIGtlZXAgdGhpcyBwb3NzaWJpbGl0eSwgYWxsIGNoYW5nZXMgdG8gZXh0ZW5zaW9u IG1vZHVsZSBsb2FkaW5nIGludHJvZHVjZWQKaW4gdGhpcyBQRVAgd2lsbCBhbHNvIGFwcGx5IHRv IGJ1aWx0LWluIG1vZHVsZXMuClRoZSBvbmx5IGV4Y2VwdGlvbiBpcyBub24tQVNDSUkgbW9kdWxl IG5hbWVzLCBleHBsYWluZWQgYmVsb3cuCgoKU3ViaW50ZXJwcmV0ZXJzIGFuZCBJbnRlcnByZXRl ciBSZWxvYWRpbmcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkV4 dGVuc2lvbnMgdXNpbmcgdGhlIG5ldyBpbml0aWFsaXphdGlvbiBzY2hlbWUgYXJlIGV4cGVjdGVk IHRvIHN1cHBvcnQKc3ViaW50ZXJwcmV0ZXJzIGFuZCBtdWx0aXBsZSBQeV9Jbml0aWFsaXplL1B5 X0ZpbmFsaXplIGN5Y2xlcyBjb3JyZWN0bHksCmF2b2lkaW5nIHRoZSBpc3N1ZXMgbWVudGlvbmVk IGluIFB5dGhvbiBkb2N1bWVudGF0aW9uIFsjc3ViaW50ZXJwcmV0ZXItZG9jc11fLgpUaGUgbWVj aGFuaXNtIGlzIGRlc2lnbmVkIHRvIG1ha2UgdGhpcyBlYXN5LCBidXQgY2FyZSBpcyBzdGlsbCBy ZXF1aXJlZApvbiB0aGUgcGFydCBvZiB0aGUgZXh0ZW5zaW9uIGF1dGhvci4KTm8gdXNlci1kZWZp bmVkIGZ1bmN0aW9ucywgbWV0aG9kcywgb3IgaW5zdGFuY2VzIG1heSBsZWFrIHRvIGRpZmZlcmVu dAppbnRlcnByZXRlcnMuClRvIGFjaGlldmUgdGhpcywgYWxsIG1vZHVsZS1sZXZlbCBzdGF0ZSBz aG91bGQgYmUga2VwdCBpbiBlaXRoZXIgdGhlIG1vZHVsZQpkaWN0LCBvciBpbiB0aGUgbW9kdWxl IG9iamVjdCdzIHN0b3JhZ2UgcmVhY2hhYmxlIGJ5IFB5TW9kdWxlX0dldFN0YXRlLgpBIHNpbXBs ZSBydWxlIG9mIHRodW1iIGlzOiBEbyBub3QgZGVmaW5lIGFueSBzdGF0aWMgZGF0YSwgZXhjZXB0 IGJ1aWx0LWluIHR5cGVzCndpdGggbm8gbXV0YWJsZSBvciB1c2VyLXNldHRhYmxlIGNsYXNzIGF0 dHJpYnV0ZXMuCgoKRnVuY3Rpb25zIGluY29tcGF0aWJsZSB3aXRoIG11bHRpLXBoYXNlIGluaXRp YWxpemF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQoKVGhlIFB5TW9kdWxlX0NyZWF0ZSBmdW5jdGlvbiB3aWxsIGZhaWwgd2hlbiB1c2Vk IG9uIGEgUHlNb2R1bGVEZWYgc3RydWN0dXJlCndpdGggYSBub24tTlVMTCAqbV9zbG90cyogcG9p bnRlci4KVGhlIGZ1bmN0aW9uIGRvZXNuJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIE1vZHVsZVNwZWMg b2JqZWN0IG5lY2Vzc2FyeSBmb3IKbXVsdGktcGhhc2UgaW5pdGlhbGl6YXRpb24uCgpUaGUgUHlT dGF0ZV9GaW5kTW9kdWxlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIE5VTEwsIGFuZCBQeVN0YXRlX0Fk ZE1vZHVsZQphbmQgUHlTdGF0ZV9SZW1vdmVNb2R1bGUgd2lsbCBhbHNvIGZhaWwgb24gbW9kdWxl cyB3aXRoIG5vbi1OVUxMICptX3Nsb3RzKi4KUHlTdGF0ZSByZWdpc3RyYXRpb24gaXMgZGlzYWJs ZWQgYmVjYXVzZSBtdWx0aXBsZSBtb2R1bGUgb2JqZWN0cyBtYXkgYmUgY3JlYXRlZApmcm9tIHRo ZSBzYW1lIFB5TW9kdWxlRGVmLgoKCk1vZHVsZSBzdGF0ZSBhbmQgQy1sZXZlbCBjYWxsYmFja3MK LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKRHVlIHRvIHRoZSB1bmF2YWlsYWJp bGl0eSBvZiBQeVN0YXRlX0ZpbmRNb2R1bGUsIGFueSBmdW5jdGlvbiB0aGF0IG5lZWRzIGFjY2Vz cwp0byBtb2R1bGUtbGV2ZWwgc3RhdGUgKGluY2x1ZGluZyBmdW5jdGlvbnMsIGNsYXNzZXMgb3Ig ZXhjZXB0aW9ucyBkZWZpbmVkIGF0CnRoZSBtb2R1bGUgbGV2ZWwpIG11c3QgcmVjZWl2ZSBhIHJl ZmVyZW5jZSB0byB0aGUgbW9kdWxlIG9iamVjdCAob3IgdGhlCnBhcnRpY3VsYXIgb2JqZWN0IGl0 IG5lZWRzKSwgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuClRoaXMgaXMgY3VycmVudGx5 IGRpZmZpY3VsdCBpbiB0d28gc2l0dWF0aW9uczoKCiogTWV0aG9kcyBvZiBjbGFzc2VzLCB3aGlj aCByZWNlaXZlIGEgcmVmZXJlbmNlIHRvIHRoZSBjbGFzcywgYnV0IG5vdCB0bwogIHRoZSBjbGFz cydzIG1vZHVsZQoqIExpYnJhcmllcyB3aXRoIEMtbGV2ZWwgY2FsbGJhY2tzLCB1bmxlc3MgdGhl IGNhbGxiYWNrcyBjYW4gcmVjZWl2ZSBjdXN0b20KICBkYXRhIHNldCBhdCBjYWxsYmFjayByZWdp c3RyYXRpb24KCkZpeGluZyB0aGVzZSBjYXNlcyBpcyBvdXRzaWRlIG9mIHRoZSBzY29wZSBvZiB0 aGlzIFBFUCwgYnV0IHdpbGwgYmUgbmVlZGVkIGZvcgp0aGUgbmV3IG1lY2hhbmlzbSB0byBiZSB1 c2VmdWwgdG8gYWxsIG1vZHVsZXMuIFByb3BlciBmaXhlcyBoYXZlIGJlZW4gZGlzY3Vzc2VkCm9u IHRoZSBpbXBvcnQtc2lnIG1haWxpbmcgbGlzdCBbI2ZpbmRtb2R1bGUtZGlzY3Vzc2lvbl1fLgoK QXMgYSBydWxlIG9mIHRodW1iLCBtb2R1bGVzIHRoYXQgcmVseSBvbiBQeVN0YXRlX0ZpbmRNb2R1 bGUgYXJlLCBhdCB0aGUgbW9tZW50LApub3QgZ29vZCBjYW5kaWRhdGVzIGZvciBwb3J0aW5nIHRv IHRoZSBuZXcgbWVjaGFuaXNtLgoKCk5ldyBGdW5jdGlvbnMKLS0tLS0tLS0tLS0tLQoKQSBuZXcg ZnVuY3Rpb24gYW5kIG1hY3JvIGltcGxlbWVudGluZyB0aGUgbW9kdWxlIGNyZWF0aW9uIHBoYXNl IHdpbGwgYmUgYWRkZWQuClRoZXNlIGFyZSBzaW1pbGFyIHRvIFB5TW9kdWxlX0NyZWF0ZSBhbmQg UHlNb2R1bGVfQ3JlYXRlMiwgZXhjZXB0IHRoZXkKdGFrZSBhbiBhZGRpdGlvbmFsIE1vZHVsZVNw ZWMgYXJndW1lbnQsIGFuZCBoYW5kbGUgbW9kdWxlIGRlZmluaXRpb25zIHdpdGgKbm9uLU5VTEwg c2xvdHM6OgoKICAgIFB5T2JqZWN0ICogUHlNb2R1bGVfRnJvbURlZkFuZFNwZWMoUHlNb2R1bGVE ZWYgKmRlZiwgUHlPYmplY3QgKnNwZWMpCiAgICBQeU9iamVjdCAqIFB5TW9kdWxlX0Zyb21EZWZB bmRTcGVjMihQeU1vZHVsZURlZiAqZGVmLCBQeU9iamVjdCAqc3BlYywKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2R1bGVfYXBpX3ZlcnNpb24pCgpBIG5ldyBm dW5jdGlvbiBpbXBsZW1lbnRpbmcgdGhlIG1vZHVsZSBleGVjdXRpb24gcGhhc2Ugd2lsbCBiZSBh ZGRlZC4KVGhpcyBhbGxvY2F0ZXMgcGVyLW1vZHVsZSBzdGF0ZSAoaWYgbm90IGFsbG9jYXRlZCBh bHJlYWR5KSwgYW5kICphbHdheXMqCnByb2Nlc3NlcyBleGVjdXRpb24gc2xvdHMuIFRoZSBpbXBv cnQgbWFjaGluZXJ5IGNhbGxzIHRoaXMgbWV0aG9kIHdoZW4KYSBtb2R1bGUgaXMgZXhlY3V0ZWQs IHVubGVzcyB0aGUgbW9kdWxlIGlzIGJlaW5nIHJlbG9hZGVkOjoKCiAgICBQeUFQSV9GVU5DKGlu dCkgUHlNb2R1bGVfRXhlY0RlZihQeU9iamVjdCAqbW9kdWxlLCBQeU1vZHVsZURlZiAqZGVmKQoK QW5vdGhlciBmdW5jdGlvbiB3aWxsIGJlIGludHJvZHVjZWQgdG8gaW5pdGlhbGl6ZSBhIFB5TW9k dWxlRGVmIG9iamVjdC4KVGhpcyBpZGVtcG90ZW50IGZ1bmN0aW9uIGZpbGxzIGluIHRoZSB0eXBl LCByZWZjb3VudCwgYW5kIG1vZHVsZSBpbmRleC4KSXQgcmV0dXJucyBpdHMgYXJndW1lbnQgY2Fz dCB0byBQeU9iamVjdCosIHNvIGl0IGNhbiBiZSByZXR1cm5lZCBkaXJlY3RseQpmcm9tIGEgUHlJ bml0IGZ1bmN0aW9uOjoKCiAgICBQeU9iamVjdCAqIFB5TW9kdWxlRGVmX0luaXQoUHlNb2R1bGVE ZWYgKik7CgpBZGRpdGlvbmFsbHksIHR3byBoZWxwZXJzIHdpbGwgYmUgYWRkZWQgZm9yIHNldHRp bmcgdGhlIGRvY3N0cmluZyBhbmQKbWV0aG9kcyBvbiBhIG1vZHVsZTo6CgogICAgaW50IFB5TW9k dWxlX1NldERvY1N0cmluZyhQeU9iamVjdCAqLCBjb25zdCBjaGFyICopCiAgICBpbnQgUHlNb2R1 bGVfQWRkRnVuY3Rpb25zKFB5T2JqZWN0ICosIFB5TWV0aG9kRGVmICopCgoKRXhwb3J0IEhvb2sg TmFtZQotLS0tLS0tLS0tLS0tLS0tCgpBcyBwb3J0YWJsZSBDIGlkZW50aWZpZXJzIGFyZSBsaW1p dGVkIHRvIEFTQ0lJLCBtb2R1bGUgbmFtZXMKbXVzdCBiZSBlbmNvZGVkIHRvIGZvcm0gdGhlIFB5 SW5pdCBob29rIG5hbWUuCgpGb3IgQVNDSUkgbW9kdWxlIG5hbWVzLCB0aGUgaW1wb3J0IGhvb2sg aXMgbmFtZWQKUHlJbml0Xzxtb2R1bGVuYW1lPiwgd2hlcmUgPG1vZHVsZW5hbWU+IGlzIHRoZSBu YW1lIG9mIHRoZSBtb2R1bGUuCgpGb3IgbW9kdWxlIG5hbWVzIGNvbnRhaW5pbmcgbm9uLUFTQ0lJ IGNoYXJhY3RlcnMsIHRoZSBpbXBvcnQgaG9vayBpcyBuYW1lZApQeUluaXRVXzxlbmNvZGVkbmFt ZT4sIHdoZXJlIHRoZSBuYW1lIGlzIGVuY29kZWQgdXNpbmcgQ1B5dGhvbidzCiJwdW55Y29kZSIg ZW5jb2RpbmcgKFB1bnljb2RlIFsjcmZjLTM0OTJdXyB3aXRoIGEgbG93ZXJjYXNlIHN1ZmZpeCks CndpdGggaHlwaGVucyAoIi0iKSByZXBsYWNlZCBieSB1bmRlcnNjb3JlcyAoIl8iKS4KCgpJbiBQ eXRob246OgoKICAgIGRlZiBleHBvcnRfaG9va19uYW1lKG5hbWUpOgogICAgICAgIHRyeToKICAg ICAgICAgICAgc3VmZml4ID0gYidfJyArIG5hbWUuZW5jb2RlKCdhc2NpaScpCiAgICAgICAgZXhj ZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKICAgICAgICAgICAgc3VmZml4ID0gYidVXycgKyBuYW1l LmVuY29kZSgncHVueWNvZGUnKS5yZXBsYWNlKGInLScsIGInXycpCiAgICAgICAgcmV0dXJuIGIn UHlJbml0JyArIHN1ZmZpeAoKRXhhbXBsZXM6Cgo9PT09PT09PT09PT09ICA9PT09PT09PT09PT09 PT09PT09Ck1vZHVsZSBuYW1lICAgIEluaXQgaG9vayBuYW1lCj09PT09PT09PT09PT0gID09PT09 PT09PT09PT09PT09PT0Kc3BhbSAgICAgICAgICAgUHlJbml0X3NwYW0KbGFuxI1tw610ICAgICAg ICBQeUluaXRVX2xhbm10XzJzYTZ0CuOCueODkeODoCAgICAgICAgICBQeUluaXRVX3pjazViMmIK PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PQoKRm9yIG1vZHVsZXMgd2l0aCBub24t QVNDSUkgbmFtZXMsIHNpbmdsZS1waGFzZSBpbml0aWFsaXphdGlvbiBpcyBub3Qgc3VwcG9ydGVk LgoKSW4gdGhlIGluaXRpYWwgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBQRVAsIGJ1aWx0LWluIG1v ZHVsZXMgd2l0aCBub24tQVNDSUkKbmFtZXMgd2lsbCBub3QgYmUgc3VwcG9ydGVkLgoKCk1vZHVs ZSBSZWxvYWRpbmcKLS0tLS0tLS0tLS0tLS0tLQoKUmVsb2FkaW5nIGFuIGV4dGVuc2lvbiBtb2R1 bGUgdXNpbmcgaW1wb3J0bGliLnJlbG9hZCgpIHdpbGwgY29udGludWUgdG8KaGF2ZSBubyBlZmZl Y3QsIGV4Y2VwdCByZS1zZXR0aW5nIGltcG9ydC1yZWxhdGVkIGF0dHJpYnV0ZXMuCgpEdWUgdG8g bGltaXRhdGlvbnMgaW4gc2hhcmVkIGxpYnJhcnkgbG9hZGluZyAoYm90aCBkbG9wZW4gb24gUE9T SVggYW5kCkxvYWRNb2R1bGVFeCBvbiBXaW5kb3dzKSwgaXQgaXMgbm90IGdlbmVyYWxseSBwb3Nz aWJsZSB0byBsb2FkCmEgbW9kaWZpZWQgbGlicmFyeSBhZnRlciBpdCBoYXMgY2hhbmdlZCBvbiBk aXNrLgoKVXNlIGNhc2VzIGZvciByZWxvYWRpbmcgb3RoZXIgdGhhbiB0cnlpbmcgb3V0IGEgbmV3 IHZlcnNpb24gb2YgdGhlIG1vZHVsZQphcmUgdG9vIHJhcmUgdG8gcmVxdWlyZSBhbGwgbW9kdWxl IGF1dGhvcnMgdG8ga2VlcCByZWxvYWRpbmcgaW4gbWluZC4KSWYgcmVsb2FkLWxpa2UgZnVuY3Rp b25hbGl0eSBpcyBuZWVkZWQsIGF1dGhvcnMgY2FuIGV4cG9ydCBhIGRlZGljYXRlZApmdW5jdGlv biBmb3IgaXQuCgoKTXVsdGlwbGUgbW9kdWxlcyBpbiBvbmUgbGlicmFyeQotLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCgpUbyBzdXBwb3J0IG11bHRpcGxlIFB5dGhvbiBtb2R1bGVzIGlu IG9uZSBzaGFyZWQgbGlicmFyeSwgdGhlIGxpYnJhcnkgY2FuCmV4cG9ydCBhZGRpdGlvbmFsIFB5 SW5pdCogc3ltYm9scyBiZXNpZGVzIHRoZSBvbmUgdGhhdCBjb3JyZXNwb25kcwp0byB0aGUgbGli cmFyeSdzIGZpbGVuYW1lLgoKTm90ZSB0aGF0IHRoaXMgbWVjaGFuaXNtIGNhbiBjdXJyZW50bHkg b25seSBiZSB1c2VkIHRvICpsb2FkKiBleHRyYSBtb2R1bGVzLApidXQgbm90IHRvICpmaW5kKiB0 aGVtLiAoVGhpcyBpcyBhIGxpbWl0YXRpb24gb2YgdGhlIGxvYWRlciBtZWNoYW5pc20sCndoaWNo IHRoaXMgUEVQIGRvZXMgbm90IHRyeSB0byBtb2RpZnkuKQpUbyB3b3JrIGFyb3VuZCB0aGUgbGFj ayBvZiBhIHN1aXRhYmxlIGZpbmRlciwgY29kZSBsaWtlIHRoZSBmb2xsb3dpbmcKY2FuIGJlIHVz ZWQ6OgoKICAgIGltcG9ydCBpbXBvcnRsaWIubWFjaGluZXJ5CiAgICBpbXBvcnQgaW1wb3J0bGli LnV0aWwKICAgIGxvYWRlciA9IGltcG9ydGxpYi5tYWNoaW5lcnkuRXh0ZW5zaW9uRmlsZUxvYWRl cihuYW1lLCBwYXRoKQogICAgc3BlYyA9IGltcG9ydGxpYi51dGlsLnNwZWNfZnJvbV9sb2FkZXIo bmFtZSwgbG9hZGVyKQogICAgbW9kdWxlID0gaW1wb3J0bGliLnV0aWwubW9kdWxlX2Zyb21fc3Bl YyhzcGVjKQogICAgbG9hZGVyLmV4ZWNfbW9kdWxlKG1vZHVsZSkKICAgIHJldHVybiBtb2R1bGUK Ck9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgc3ltYm9saWMgbGlua3MsIHRoZXNlIG1heSBiZSB1 c2VkIHRvIGluc3RhbGwgb25lCmxpYnJhcnkgdW5kZXIgbXVsdGlwbGUgbmFtZXMsIGV4cG9zaW5n IGFsbCBleHBvcnRlZCBtb2R1bGVzIHRvIG5vcm1hbAppbXBvcnQgbWFjaGluZXJ5LgoKClRlc3Rp bmcgYW5kIGluaXRpYWwgaW1wbGVtZW50YXRpb25zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCgpGb3IgdGVzdGluZywgYSBuZXcgYnVpbHQtaW4gbW9kdWxlIGBgX3Rlc3RtdWx0 aXBoYXNlYGAgd2lsbCBiZSBjcmVhdGVkLgpUaGUgbGlicmFyeSB3aWxsIGV4cG9ydCBzZXZlcmFs IGFkZGl0aW9uYWwgbW9kdWxlcyB1c2luZyB0aGUgbWVjaGFuaXNtCmRlc2NyaWJlZCBpbiAiTXVs dGlwbGUgbW9kdWxlcyBpbiBvbmUgbGlicmFyeSIuCgpUaGUgYGBfdGVzdGNhcGlgYCBtb2R1bGUg d2lsbCBiZSB1bmNoYW5nZWQsIGFuZCB3aWxsIHVzZSBzaW5nbGUtcGhhc2UKaW5pdGlhbGl6YXRp b24gaW5kZWZpbml0ZWx5IChvciB1bnRpbCBpdCBpcyBubyBsb25nZXIgc3VwcG9ydGVkKS4KClRo ZSBgYGFycmF5YGAgYW5kIGBgeHgqYGAgbW9kdWxlcyB3aWxsIGJlIGNvbnZlcnRlZCB0byB1c2Ug bXVsdGktcGhhc2UKaW5pdGlhbGl6YXRpb24gYXMgcGFydCBvZiB0aGUgaW5pdGlhbCBpbXBsZW1l bnRhdGlvbi4KCgpTdW1tYXJ5IG9mIEFQSSBDaGFuZ2VzIGFuZCBBZGRpdGlvbnMKPT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpOZXcgZnVuY3Rpb25zOgoKKiBQeU1vZHVsZV9G cm9tRGVmQW5kU3BlYyAobWFjcm8pCiogUHlNb2R1bGVfRnJvbURlZkFuZFNwZWMyCiogUHlNb2R1 bGVfRXhlY0RlZgoqIFB5TW9kdWxlX1NldERvY1N0cmluZwoqIFB5TW9kdWxlX0FkZEZ1bmN0aW9u cwoqIFB5TW9kdWxlRGVmX0luaXQKCk5ldyBtYWNyb3M6CgoqIFB5X21vZF9jcmVhdGUKKiBQeV9t b2RfZXhlYwoKTmV3IHR5cGVzOgoKKiBQeU1vZHVsZURlZl9UeXBlIHdpbGwgYmUgZXhwb3NlZAoK TmV3IHN0cnVjdHVyZXM6CgoqIFB5TW9kdWxlRGVmX1Nsb3QKClB5TW9kdWxlRGVmLm1fcmVsb2Fk IGNoYW5nZXMgdG8gUHlNb2R1bGVEZWYubV9zbG90cy4KClRoZSBpbnRlcm5hbCBgYF9pbXBgYCBt b2R1bGUgd2lsbCBoYXZlIGJhY2t3YXJkcyBpbmNvbXBhdGlibGUgY2hhbmdlczoKYGBjcmVhdGVf YnVpbHRpbmBgLCBgYGNyZWF0ZV9keW5hbWljYGAsIGFuZCBgYGV4ZWNfZHluYW1pY2BgIHdpbGwg YmUgYWRkZWQ7CmBgaW5pdF9idWlsdGluYGAsIGBgbG9hZF9keW5hbWljYGAgd2lsbCBiZSByZW1v dmVkLgoKVGhlIHVuZG9jdW1lbnRlZCBmdW5jdGlvbnMgYGBpbXAubG9hZF9keW5hbWljYGAgYW5k IGBgaW1wLmluaXRfYnVpbHRpbmBgIHdpbGwKYmUgcmVwbGFjZWQgYnkgYmFja3dhcmRzLWNvbXBh dGlibGUgc2hpbXMuCgoKQmFja3dhcmRzIENvbXBhdGliaWxpdHkKLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KCkV4aXN0aW5nIG1vZHVsZXMgd2lsbCBjb250aW51ZSB0byBiZSBzb3VyY2UtIGFuZCBi aW5hcnktY29tcGF0aWJsZSB3aXRoIG5ldwp2ZXJzaW9ucyBvZiBQeXRob24uCk1vZHVsZXMgdGhh dCB1c2UgbXVsdGktcGhhc2UgaW5pdGlhbGl6YXRpb24gd2lsbCBub3QgYmUgY29tcGF0aWJsZSB3 aXRoCnZlcnNpb25zIG9mIFB5dGhvbiB0aGF0IGRvIG5vdCBpbXBsZW1lbnQgdGhpcyBQRVAuCgpU aGUgZnVuY3Rpb25zIGBgaW5pdF9idWlsdGluYGAgYW5kIGBgbG9hZF9keW5hbWljYGAgd2lsbCBi ZSByZW1vdmVkIGZyb20KdGhlIGBgX2ltcGBgIG1vZHVsZSAoYnV0IG5vdCBmcm9tIHRoZSBgYGlt cGBgIG1vZHVsZSkuCgpBbGwgY2hhbmdlZCBsb2FkZXJzIChgYEJ1aWx0aW5JbXBvcnRlcmBgIGFu ZCBgYEV4dGVuc2lvbkZpbGVMb2FkZXJgYCkgd2lsbApyZW1haW4gYmFja3dhcmRzLWNvbXBhdGli bGU7IHRoZSBgYGxvYWRfbW9kdWxlYGAgbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgYnkKYSBzaGlt LgoKSW50ZXJuYWwgZnVuY3Rpb25zIG9mIFB5dGhvbi9pbXBvcnQuYyBhbmQgUHl0aG9uL2ltcG9y dGRsLmMgd2lsbCBiZSByZW1vdmVkLgooU3BlY2lmaWNhbGx5LCB0aGVzZSBhcmUgYGBfUHlJbXBv cnRfR2V0RHluTG9hZEZ1bmNgYCwKYGBfUHlJbXBvcnRfR2V0RHluTG9hZFdpbmRvd3NgYCwgYW5k IGBgX1B5SW1wb3J0X0xvYWREeW5hbWljTW9kdWxlYGAuKQoKClBvc3NpYmxlIEZ1dHVyZSBFeHRl bnNpb25zCj09PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGUgc2xvdHMgbWVjaGFuaXNtLCBp bnNwaXJlZCBieSBQeVR5cGVfU2xvdCBmcm9tIFBFUCAzODQsCmFsbG93cyBsYXRlciBleHRlbnNp b25zLgoKU29tZSBleHRlbnNpb24gbW9kdWxlcyBleHBvcnRzIG1hbnkgY29uc3RhbnRzOyBmb3Ig ZXhhbXBsZSBfc3NsIGhhcwphIGxvbmcgbGlzdCBvZiBjYWxscyBpbiB0aGUgZm9ybTo6CgogICAg UHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNTTF9FUlJPUl9aRVJPX1JFVFVSTiIsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICBQWV9TU0xfRVJST1JfWkVST19SRVRVUk4pOwoKQ29udmVy dGluZyB0aGlzIHRvIGEgZGVjbGFyYXRpdmUgbGlzdCwgc2ltaWxhciB0byBQeU1ldGhvZERlZiwK d291bGQgcmVkdWNlIGJvaWxlcnBsYXRlLCBhbmQgcHJvdmlkZSBmcmVlIGVycm9yLWNoZWNraW5n IHdoaWNoCmlzIG9mdGVuIG1pc3NpbmcuCgpTdHJpbmcgY29uc3RhbnRzIGFuZCB0eXBlcyBjYW4g YmUgaGFuZGxlZCBzaW1pbGFybHkuCihOb3RlIHRoYXQgbm9uLWRlZmF1bHQgYmFzZXMgZm9yIHR5 cGVzIGNhbm5vdCBiZSBwb3J0YWJseSBzcGVjaWZpZWQKc3RhdGljYWxseTsgdGhpcyBjYXNlIHdv dWxkIG5lZWQgYSBQeV9tb2RfZXhlYyBmdW5jdGlvbiB0aGF0IHJ1bnMKYmVmb3JlIHRoZSBzbG90 cyBhcmUgYWRkZWQuIFRoZSBmcmVlIGVycm9yLWNoZWNraW5nIHdvdWxkIHN0aWxsIGJlCmJlbmVm aWNpYWwsIHRob3VnaC4pCgpBbm90aGVyIHBvc3NpYmlsaXR5IGlzIHByb3ZpZGluZyBhICJtYWlu IiBmdW5jdGlvbiB0aGF0IHdvdWxkIGJlIHJ1bgp3aGVuIHRoZSBtb2R1bGUgaXMgZ2l2ZW4gdG8g UHl0aG9uJ3MgLW0gc3dpdGNoLgpGb3IgdGhpcyB0byB3b3JrLCB0aGUgcnVucHkgbW9kdWxlIHdp bGwgbmVlZCB0byBiZSBtb2RpZmllZCB0byB0YWtlCmFkdmFudGFnZSBvZiBNb2R1bGVTcGVjLWJh c2VkIGxvYWRpbmcgaW50cm9kdWNlZCBpbiBQRVAgNDUxLgpBbHNvLCBpdCB3aWxsIGJlIG5lY2Vz c2FyeSB0byBhZGQgYSBtZWNoYW5pc20gZm9yIHNldHRpbmcgdXAgYSBtb2R1bGUKYWNjb3JkaW5n IHRvIHNsb3RzIGl0IHdhc24ndCBvcmlnaW5hbGx5IGRlZmluZWQgd2l0aC4KCgpJbXBsZW1lbnRh dGlvbgo9PT09PT09PT09PT09PQoKV29yay1pbi1wcm9ncmVzcyBpbXBsZW1lbnRhdGlvbiBpcyBh dmFpbGFibGUgaW4gYSBHaXRodWIgcmVwb3NpdG9yeSBbI2doLXJlcG9dXzsKYSBwYXRjaHNldCBp cyBhdCBbI2doLXBhdGNoXV8uCgoKUHJldmlvdXMgQXBwcm9hY2hlcwo9PT09PT09PT09PT09PT09 PT09CgpTdGVmYW4gQmVobmVsJ3MgaW5pdGlhbCBwcm90by1QRVAgWyNzdGVmYW5zX3Byb3RvcGVw XV8KaGFkIGEgIlB5SW5pdF9tb2R1bGVuYW1lIiBob29rIHRoYXQgd291bGQgY3JlYXRlIGEgbW9k dWxlIGNsYXNzLAp3aG9zZSBgYF9faW5pdF9fYGAgd291bGQgYmUgdGhlbiBjYWxsZWQgdG8gY3Jl YXRlIHRoZSBtb2R1bGUuClRoaXMgcHJvcG9zYWwgZGlkIG5vdCBjb3JyZXNwb25kIHRvIHRoZSAo dGhlbiBub25leGlzdGVudCkgUEVQIDQ1MSwKd2hlcmUgbW9kdWxlIGNyZWF0aW9uIGFuZCBpbml0 aWFsaXphdGlvbiBpcyBicm9rZW4gaW50byBkaXN0aW5jdCBzdGVwcy4KSXQgYWxzbyBkaWQgbm90 IHN1cHBvcnQgbG9hZGluZyBhbiBleHRlbnNpb24gaW50byBwcmUtZXhpc3RpbmcgbW9kdWxlIG9i amVjdHMuCgpOaWNrIENvZ2hsYW4gcHJvcG9zZWQgIkNyZWF0ZSIgYW5kICJFeGVjIiBob29rcywg YW5kIHdyb3RlIGEgcHJvdG90eXBlCmltcGxlbWVudGF0aW9uIFsjbmlja3MtcHJvdG90eXBlXV8u CkF0IHRoaXMgdGltZSBQRVAgNDUxIHdhcyBzdGlsbCBub3QgaW1wbGVtZW50ZWQsIHNvIHRoZSBw cm90b3R5cGUKZG9lcyBub3QgdXNlIE1vZHVsZVNwZWMuCgpUaGUgb3JpZ2luYWwgdmVyc2lvbiBv ZiB0aGlzIFBFUCB1c2VkIENyZWF0ZSBhbmQgRXhlYyBob29rcywgYW5kIGFsbG93ZWQKbG9hZGlu ZyBpbnRvIGFyYml0cmFyeSBwcmUtY29uc3RydWN0ZWQgb2JqZWN0cyB3aXRoIEV4ZWMgaG9vay4K VGhlIHByb3Bvc2FsIG1hZGUgZXh0ZW5zaW9uIG1vZHVsZSBpbml0aWFsaXphdGlvbiBjbG9zZXIg dG8gaG93IFB5dGhvbiBtb2R1bGVzCmFyZSBpbml0aWFsaXplZCwgYnV0IGl0IHdhcyBsYXRlciBy ZWNvZ25pemVkIHRoYXQgdGhpcyBpc24ndCBhbiBpbXBvcnRhbnQgZ29hbC4KVGhlIGN1cnJlbnQg UEVQIGRlc2NyaWJlcyBhIHNpbXBsZXIgc29sdXRpb24uCgpBIGZ1cnRoZXIgaXRlcmF0aW9uIHVz ZWQgYSAiUHlNb2R1bGVFeHBvcnQiIGhvb2sgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gUHlJbml0LAp3 aGVyZSBQeUluaXQgd2FzIHVzZWQgZm9yIGV4aXN0aW5nIHNjaGVtZSwgYW5kIFB5TW9kdWxlRXhw b3J0IGZvciBtdWx0aS1waGFzZS4KSG93ZXZlciwgbm90IGJlaW5nIGFibGUgdG8gZGV0ZXJtaW5l IHRoZSBob29rIG5hbWUgYmFzZWQgb24gbW9kdWxlIG5hbWUKY29tcGxpY2F0ZWQgYXV0b21hdGlj IGdlbmVyYXRpb24gb2YgUHlJbXBvcnRfSW5pdHRhYiBieSB0b29scyBsaWtlIGZyZWV6ZS4KS2Vl cGluZyBvbmx5IHRoZSBQeUluaXQgaG9vayBuYW1lLCBldmVuIGlmIGl0J3Mgbm90IGVudGlyZWx5 IGFwcHJvcHJpYXRlIGZvcgpleHBvcnRpbmcgYSBkZWZpbml0aW9uLCB5aWVsZGVkIGEgbXVjaCBz aW1wbGVyIHNvbHV0aW9uLgoKClJlZmVyZW5jZXMKPT09PT09PT09PQoKLi4gWyNwZXAtMDQ1MS1h dHRyaWJ1dGVzXQogICBodHRwczovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wNDUxLyNh dHRyaWJ1dGVzCgouLiBbI3N0ZWZhbnNfcHJvdG9wZXBdCiAgIGh0dHBzOi8vbWFpbC5weXRob24u b3JnL3BpcGVybWFpbC9weXRob24tZGV2LzIwMTMtQXVndXN0LzEyODA4Ny5odG1sCgouLiBbI25p Y2tzLXByb3RvdHlwZV0KICAgaHR0cHM6Ly9tYWlsLnB5dGhvbi5vcmcvcGlwZXJtYWlsL3B5dGhv bi1kZXYvMjAxMy1BdWd1c3QvMTI4MTAxLmh0bWwKCi4uIFsjcmZjLTM0OTJdCiAgIGh0dHA6Ly90 b29scy5pZXRmLm9yZy9odG1sL3JmYzM0OTIKCi4uIFsjZ2gtcmVwb10KICAgaHR0cHM6Ly9naXRo dWIuY29tL2VuY3Vrb3UvY3B5dGhvbi9jb21taXRzL3BlcDQ4OQoKLi4gWyNnaC1wYXRjaF0KICAg aHR0cHM6Ly9naXRodWIuY29tL2VuY3Vrb3UvY3B5dGhvbi9jb21wYXJlL21hc3Rlci4uLmVuY3Vr b3U6cGVwNDg5LnBhdGNoCgouLiBbI2ZpbmRtb2R1bGUtZGlzY3Vzc2lvbl0KICAgaHR0cHM6Ly9t YWlsLnB5dGhvbi5vcmcvcGlwZXJtYWlsL2ltcG9ydC1zaWcvMjAxNS1BcHJpbC8wMDA5NTkuaHRt bAoKLi4gWyNwZXAtMDQ1MS1sb2FkaW5nXQogICBodHRwczovL3d3dy5weXRob24ub3JnL2Rldi9w ZXBzL3BlcC0wNDUxLyNob3ctbG9hZGluZy13aWxsLXdvcmtdCgouLiBbI3N1YmludGVycHJldGVy LWRvY3NdCiAgIGh0dHBzOi8vZG9jcy5weXRob24ub3JnLzMvYy1hcGkvaW5pdC5odG1sI3N1Yi1p bnRlcnByZXRlci1zdXBwb3J0CgoKQ29weXJpZ2h0Cj09PT09PT09PQoKVGhpcyBkb2N1bWVudCBo YXMgYmVlbiBwbGFjZWQgaW4gdGhlIHB1YmxpYyBkb21haW4uCl9fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fCkltcG9ydC1TSUcgbWFpbGluZyBsaXN0CkltcG9y dC1TSUdAcHl0aG9uLm9yZwpodHRwczovL21haWwucHl0aG9uLm9yZy9tYWlsbWFuL2xpc3RpbmZv L2ltcG9ydC1zaWcK