# Name: rah_comment_spam v0.7 # Type: Admin/Client side plugin # Anti-spam tools to prevent comment spam # Author: Jukka Svahn # URL: http://rahforum.biz # Recommended load order: 5 # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YToxMTp7czo2OiJhdXRob3IiO3M6MTE6Ikp1a2thIFN2YWhuIjtzOjEwOiJhdXRob3JfdXJp IjtzOjE5OiJodHRwOi8vcmFoZm9ydW0uYml6IjtzOjExOiJkZXNjcmlwdGlvbiI7czozOToi QW50aS1zcGFtIHRvb2xzIHRvIHByZXZlbnQgY29tbWVudCBzcGFtIjtzOjQ6ImhlbHAiO3M6 MTM1MTQ6Igk8aDE+cmFoX2NvbW1lbnRfc3BhbTwvaDE+CgoJPHA+UmFoX2NvbW1lbnRfc3Bh bSBwcm92aWRlcyBjdXN0b21pemFibGUgYW50aS1zcGFtIHRvb2xzIGZvciA8YSBocmVmPSJo dHRwOi8vd3d3LnRleHRwYXR0ZXJuLmNvbSI+VGV4dHBhdHRlcm4mIzgyMTc7czwvYT4gY29t bWVudCBzeXN0ZW0uIFNldCBtaW5pbXVtIGFuZCBtYXhpbXVtIG1lc3NhZ2UgbGVuZ3RoLCBm aWx0ZXIgc3BhbSB3b3JkcywgdmFsaWRhdGUgZW1haWwgYWRkcmVzc2VzLCBsaW1pdCBwb3N0 aW5nIGFjdGl2aXR5IGFuZCBzZXQgaGlkZGVuIHNwYW0gdHJhcHMuIEFsbCBmcm9tIHNpbXBs ZSBhZG1pbi1zaWRlIGdyYXBoaWNhbCB1c2VyIGludGVyZmFjZSwgbm8gaGVhZCBmaXJzdCBk aXZlIHRvIGNvZGUuPC9wPgoKCTx1bD4KCQk8bGk+VmVyc2lvbjogMC43PC9saT4KCQk8bGk+ VXBkYXRlZDogMjAxMS8xMS8wMyAxMTo0MCBQTSA8c3BhbiBjbGFzcz0iY2FwcyI+VVRDPC9z cGFuPjwvbGk+Cgk8L3VsPgoKCTxoMz5UYWJsZSBvZiBDb250ZW50czwvaDM+CgoJPHVsPgoJ CTxsaT48YSBocmVmPSIjbGlzdC1vZi1mZWF0dXJlcyI+TGlzdCBvZiBmZWF0dXJlczwvYT48 L2xpPgoJCTxsaT48YSBocmVmPSIjcmVxdWlyZW1lbnRzIj5SZXF1aXJlbWVudHM8L2E+PC9s aT4KCQk8bGk+PGEgaHJlZj0iI2luc3RhbGxhdGlvbiI+SW5zdGFsbGF0aW9uPC9hPjwvbGk+ CgkJPGxpPjxhIGhyZWY9IiNjb25maWd1cmF0aW9uIj5Db25maWd1cmF0aW9uPC9hPjwvbGk+ CgkJPGxpPjxhIGhyZWY9IiNwcmVmZXJlbmNlcyI+UHJlZmVyZW5jZXM8L2E+PC9saT4KCQk8 bGk+PGEgaHJlZj0iI2NoYW5nZWxvZyI+Q2hhbmdlbG9nPC9hPjwvbGk+Cgk8L3VsPgoKCTxo MyBpZD0ibGlzdC1vZi1mZWF0dXJlcyI+TGlzdCBvZiBmZWF0dXJlczwvaDM+CgoJPHVsPgoJ CTxsaT5TZXQgY29tbWVudCBtZXNzYWdlIGxlbmd0aCBsaW1pdGF0aW9uczogbWluaW11bSBh bmQgbWF4aW11bSwgd29yZHMgYW5kIGNoYXJhY3RlcnMuPC9saT4KCQk8bGk+TGltaXQgbGlu ayBwb3N0aW5nLjwvbGk+CgkJPGxpPkRlZmluZSBzcGFtIHdvcmRzLCBhbmQgc2V0IHRoZSBs aW1pdCBob3cgbWFueSBzcGFtIHdvcmRzIGFyZSBuZWVkZWQgdW50aWwgY29tbWVudCBiZWNv bWVzIHNwYW0uPC9saT4KCQk8bGk+U2hvdyBjdXN0b21pemFibGUgZXJyb3IgbWVzc2FnZXMg d2hlbiBjb21tZW50IGlzIGJsb2NrZWQuPC9saT4KCQk8bGk+U2V0IGEgY3VzdG9tIGhpZGRl biBzcGFtIHRyYXAgZmllbGQuPC9saT4KCQk8bGk+Q2hhbmdlIHRoZSBzcGFtIHByb3RlY3Rp b24gbWV0aG9kLjwvbGk+CgkJPGxpPlNldCBxdW90YXMsIGxpbWl0IHVzZXJzJiM4MjE3OyBj b21tZW50IHBvc3RpbmcgYWN0aXZpdHkuPC9saT4KCQk8bGk+SW50ZWdyYXRlcyB3aXRoIFRl eHRwYXR0ZXJuJiM4MjE3O3MgbmF0aXZlIHByZWZlcmVuY2VzIHBhbmVsOyBubyBkaXZpbmcg aW50byBjb2RlIG5lZWRlZCBhdCBhbGwuPC9saT4KCTwvdWw+CgoJPGgzIGlkPSJyZXF1aXJl bWVudHMiPlJlcXVpcmVtZW50czwvaDM+CgoJPHA+UmFoX2NvbW1lbnRfc3BhbSYjODIxNztz IG1pbmltdW0gcmVxdWlyZW1lbnRzOjwvcD4KCgk8dWw+CgkJPGxpPjxzcGFuIGNsYXNzPSJj YXBzIj5QSFA8L3NwYW4+IDUgb3IgbmV3ZXI8L2xpPgoJCTxsaT5UZXh0cGF0dGVybiA0LjIu MCBvciBuZXdlci48L2xpPgoJPC91bD4KCgk8cD5SZWNvbW1lbmRlZDo8L3A+CgoJPHVsPgoJ CTxsaT5UZXh0cGF0dGVybiA0LjQuMSBvciBuZXdlci48L2xpPgoJPC91bD4KCgk8aDMgaWQ9 Imluc3RhbGxhdGlvbiI+SW5zdGFsbGF0aW9uPC9oMz4KCgk8b2w+CgkJPGxpPk5hdmlnYXRl IHRvIHlvdXIgVGV4dHBhdHRlcm4gaW5zdGFsbGF0aW9uJiM4MjE3O3MgUGx1Z2lucyBwYW5l bCAoPGVtPlRleHRwYXR0ZXJuIC8gQWRtaW4gLyBQbHVnaW5zPC9lbT4pLjwvbGk+CgkJPGxp PkNvcHkgYW5kIHBhc3RlIHJhaF9jb21tZW50X3NwYW0mIzgyMTc7cyBwbHVnaW4gcGFja2Fn ZSBjb2RlIHRvIHRoZSBwbHVnaW4gaW5zdGFsbGVyIHRleHRhcmVhIGFuZCBydW4gdGhlIGF1 dG9tYXRlZCBzZXR1cC48L2xpPgoJCTxsaT5BZnRlciB0aGUgc2V0dXAgaXMgY29tcGxldGVk LCBhY3RpdmF0ZSB0aGUgcGx1Z2luIGFuZCB5b3UmIzgyMTc7cmUgc2V0LjwvbGk+CgkJPGxp PllvdSBjYW4gY3VzdG9taXplIHRoZSBwbHVnaW4mIzgyMTc7cyBzZXR0aW5ncyBpbiBQcmVm ZXJlbmNlcyBwYW5lbCYjODIxNztzIGNvbW1lbnQgc2VjdGlvbiAoPGVtPlRleHRwYXR0ZXJu IC8gQWRtaW4gLyBQcmVmZXJlbmNlczwvZW0+KS48L2xpPgoJPC9vbD4KCgk8aDMgaWQ9ImNv bmZpZ3VyYXRpb24iPkNvbmZpZ3VyYXRpb248L2gzPgoKCTxwPk9uY2UgdGhlIHBsdWdpbiBp cyBpbnN0YWxsZWQsIHlvdSBjYW4gZmluZCBzZXQgb2YgbmV3IHByZWZlcmVuY2VzIGluIHlv dXIgVGV4dHBhdHRlcm4gaW5zdGFsbGF0aW9uJiM4MjE3O3MgUHJlZmVyZW5jZXMgcGFuZWwu IFRvIGNvbmZpZ3VyZSByYWhfY29tbWVudF9zcGFtJiM4MjE3O3MgcHJlZmVyZW5jZXMgbmF2 aWdhdGUgdG8gPGVtPkFkbWluL1ByZWZlcmVuY2VzPC9lbT4gYW5kIHRha2UgYSBsb29rIGF0 IHRoZSA8ZW0+Q29tbWVudHM8L2VtPiBzZWN0aW9uLiBJZiB5b3UgaGF2ZSBjb21tZW50aW5n IGRpc2FibGVkIG9uIHlvdXIgc2l0ZSwgeW91IHdpbGwgaGF2ZSB0byB0b2dnbGUgdGhlIDxl bT5FbmFibGUgY29tbWVudHM8L2VtPiBvcHRpb24gdG8gc2VlIHRoZSBzZWN0aW9uLjwvcD4K Cgk8aDMgaWQ9InByZWZlcmVuY2VzIj5QcmVmZXJlbmNlczwvaDM+CgoJPHA+TG9va2luZyBh dCB0aGUgUHJlZmVyZW5jZSYjODIxNztzIHBhbmVsJiM4MjE3O3MgPGVtPkNvbW1lbnRzPC9l bT4gc2VjdGlvbiwgeW91IHNob3VsZCBzZWUgc2V0IG9mIG9wdGlvbnMgdGhhdCB3ZXJlbiYj ODIxNzt0IHRoZXJlIGJlZm9yZS4gVGhvc2UgYXJlIHRoZSBvcHRpb25zIHRoYXQgdGhlIHBs dWdpbiBvZmZlcnMuIEluIHRvdGFsLCB0aGVyZSBzaG91bGQgYmUgYXJvdW5kIDE4IG5ldyB0 b2dnbGUtYWJsZSBpdGVtcy4gVGhlIG9mZmVyZWQgcGx1Z2luJiM4MjE3O3Mgb3B0aW9ucyBh cmUgYXMgZm9sbG93cy48L3A+CgoJPHA+PHN0cm9uZz5XaGF0IHRvIGRvIGNvbW1lbnRzIGRl dGVjdGVkIGFzIHNwYW0/PC9zdHJvbmc+PGJyIC8+ClRoZSBvcHRpb24gc2V0cyB0aGUgYWN0 aW9uIHRoYXQgaXMgdGFrZW4gdG93YXJkcyB0byBjb21tZW50cyBmbGFnZ2VkIGFzIGEgc3Bh bS4gVGhlcmUgYXJlIHRocmVlIG9wdGlvbnMgeW91IGNhbiBjaG9vc2UgZnJvbS4gVGhlIGRl ZmF1bHQgb3B0aW9uIGlzIDxlbT5TYXZlIHRvIG1vZGVyYXRpb24gcXVldWU8L2VtPiB3aGlj aCBzYXZlcyB0aGUgY29tbWVudHMgdG8gbW9kZXJhdGlvbiBxdWV1ZS4gVGhlIGRldGVjdGVk IGNvbW1lbnRzIHdvbiYjODIxNzt0IGJlIHZpc2libGUgdG8gcHVibGljLCBidXQgYXJlIHNh dmVkIHRvIG1vZGVyYXRpb24gcXVldWUsIGFuZCBjYW4gYmUgbWFudWFsbHkgY29uZmlybWVk LiBUaGUgc2Vjb25kIG9wdGlvbiA8ZW0+SWdub3JlLCBkbyBub3Qgc2F2ZTwvZW0+IGJsb2Nr cyB0aGUgY29tbWVudHMuIFRoZSBjb21tZW50cyB3b24mIzgyMTc7dCBiZSBzYXZlZCBhbmQg dGhlIHVzZXIgaXMgZ3JlZXRlZCB3aXRoIHRoZSBtZXNzYWdlIHNldCBpbiA8ZW0+TWVzc2Fn ZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgd2hlbiB0aGUgY29tbWVudCB3YXMgYmxvY2tlZDwv ZW0+IG9wdGlvbi4gVGhlIHRoaXJkIGFuZCBsYXN0IG9wdGlvbiA8ZW0+U2F2ZSBhbmQgZmxh ZyBhcyBzcGFtPC9lbT4gc2F2ZXMgdGhlIGRldGVjdGVkIGNvbW1lbnQgdG8gdGhlIGRhdGFi YXNlIGFzIHNwYW0uPC9wPgoKCTxwPjxzdHJvbmc+TWVzc2FnZSBkaXNwbGF5ZWQgdG8gdGhl IHVzZXIgd2hlbiB0aGUgY29tbWVudCB3YXMgYmxvY2tlZDwvc3Ryb25nPjxiciAvPgpTZXRz IHRoZSBtZXNzYWdlIHRoYXQgaXMgc2hvd24gdG8gdXNlcnMgd2hlbiB0aGVpciBjb21tZW50 IGlzIGJsb2NrZWQgYnkgdGhlIGZpbHRlcnMuIFRoZSBtZXNzYWdlIGlzIG9ubHkgdXNlZCB3 aGVuIHRoZSBwcm90ZWN0aW9uIG1ldGhvZCBhYm92ZSBpcyBzZXQgdG8gPGVtPklnbm9yZSwg ZG8gbm90IHNhdmU8L2VtPi4gV2l0aCBvdGhlcnMsIFRleHRwYXR0ZXJuJiM4MjE3O3MgYnVp bGQgaW4gbGFuZ3VhZ2Ugc3RyaW5ncyBhcmUgdXNlZC48L3A+CgoJPHA+PHN0cm9uZz5MaXN0 IG9mIHNwYW0gd29yZHM8L3N0cm9uZz48YnIgLz4KU2V0cyB3b3Jkcy90ZXJtcyB0aGF0IGFy ZSBjb25zaWRlcmVkIGFzIHNvbWV0aGluZyB0aGF0IHNwYW0gd291bGQgY29udGFpbi4gU2Vw YXJhdGUgbXVsdGlwbGUgd29yZHMgd2l0aCBjb21tYXMgKDxjb2RlPiw8L2NvZGU+KS4gVXNl ZCB3b3JkcyBhcmUgaW5jYXNlLXNlbnNpdGl2ZS4gRXhhbXBsZSB2YWx1ZTogPGNvZGU+dmlh Z3JhLCB3YXJlcywgd293Z29sZDwvY29kZT4uPC9wPgoKCTxwPjxzdHJvbmc+U2VhcmNoIHNw YW0gd29yZHMgZnJvbSBmb2xsb3dpbmcgZmllbGRzPC9zdHJvbmc+PGJyIC8+ClNldHMgd2hp Y2ggZmllbGRzIGFyZSBmaWx0ZXJlZCBmb3Igc3BhbSB3b3Jkcy4gVXNlIGNvbW1hLXNlcGFy YXRlZCBsaXN0IG9mIGZpZWxkIG5hbWVzLiBBdmFpbGFibGUgdmFsdWVzIGFyZSA8Y29kZT5u YW1lPC9jb2RlPiwgPGNvZGU+ZW1haWw8L2NvZGU+LCA8Y29kZT53ZWI8L2NvZGU+IGFuZCA8 Y29kZT5tZXNzYWdlPC9jb2RlPi4gRGVmYXVsdCBvcHRpb24gaXMgPGNvZGU+bmFtZSwgZW1h aWwsIHdlYiwgbWVzc2FnZTwvY29kZT4uPC9wPgoKCTxwPjxzdHJvbmc+TWF4aW11bSBudW1i ZXIgb2Ygc3BhbSB3b3JkcyB1bnRpbCB0aGUgY29tbWVudCBpcyBjb25zaWRlcmVkIGFzIHNw YW08L3N0cm9uZz48YnIgLz4KU2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc3BhbSB3b3Jk cyBhIGNvbW1lbnQgY2FuIGhhdmUgdW50aWwgaXQmIzgyMTc7cyBjb25zaWRlcmVkIGFzIHNw YW0uIFRoZSBsb3dlciB0aGUgbnVtYmVyLCB0aGUgc3RyaWN0ZXIgdGhlIGZpbHRlciBpcy4g UmVjb21tZW5kZWQgdmFsdWUgaXMgYmV0d2VlbiAyIHRvIDEwLjwvcD4KCgk8cD48c3Ryb25n Pk51bWJlciBvZiBhbGxvd2VkIDxzcGFuIGNsYXNzPSJjYXBzIj5VUkw8L3NwYW4+czwvc3Ry b25nPjxiciAvPgpPcHRpb24gc2V0cyBjb21tZW50IG1lc3NhZ2UmIzgyMTc7cyA8c3BhbiBj bGFzcz0iY2FwcyI+VVJMPC9zcGFuPiBsaW1pdC4gSWYgYSBjb21tZW50IGNvbnRhaW5zIG1v cmUgPHNwYW4gY2xhc3M9ImNhcHMiPlVSTDwvc3Bhbj5zIHRoYW4gdGhlIG9wdGlvbnMgYWxs b3dzLCB0aGUgY29tbWVudCBpcyBjb25zaWRlcmVkIGFzIHNwYW0uPC9wPgoKCTxwPjxzdHJv bmc+TWluaW11bSBudW1iZXIgb2Ygd29yZHM8L3N0cm9uZz48YnIgLz4KUmVxdWlyZWQgbWlu aW11bSBsZW5ndGggb2YgY29tbWVudCBtZXNzYWdlIGluIHdvcmRzLiBTaG9ydGVyIG1lc3Nh Z2VzIGFyZSBjb25zaWRlcmVkIGFzIHNwYW0uIFJlY29tbWVuZGVkIHZhbHVlIGlzIDxjb2Rl PjE8L2NvZGU+IHRvIDxjb2RlPjM8L2NvZGU+LjwvcD4KCgk8cD48c3Ryb25nPk1heGltdW0g bnVtYmVyIG9mIHdvcmRzPC9zdHJvbmc+PGJyIC8+Ck1heGltdW0gbGVuZ3RoIG9mIGNvbW1l bnQgbWVzc2FnZSBpbiB3b3Jkcy4gTG9uZ2VyIG1lc3NhZ2VzIGFyZSBjb25zaWRlcmVkIGFz IHNwYW0uIE5vdGUgdGhhdCBtZXNzYWdlJiM4MjE3O3MgdG90YWwgc2l6ZSBpcyBsaW1pdGVk IHRvIDY1NTM1IGJ5dGVzIChlcXVhbHMgdG8gYXJvdW5kIDY1NTM1IDxzcGFuIGNsYXNzPSJj YXBzIj5BU0NJSTwvc3Bhbj4gY2hhcmFjdGVycykuPC9wPgoKCTxwPjxzdHJvbmc+TWluaW11 bSBudW1iZXIgb2YgY2hhcmFjdGVyczwvc3Ryb25nPjxiciAvPgpSZXF1aXJlZCBtaW5pbXVt IGxlbmd0aCBvZiBjb21tZW50IGluIGNoYXJhY3RlcnMuIFNob3J0ZXIgbWVzc2FnZXMgYXJl IGNvbnNpZGVycyBhcyBzcGFtLiBSZWNvbW1lbmRlZCBzZXR0aW5nIGlzIDxjb2RlPjE8L2Nv ZGU+IHRvIDxjb2RlPjEwPC9jb2RlPi48L3A+CgoJPHA+PHN0cm9uZz5NYXhpbXVtIG51bWJl ciBvZiBjaGFyYWN0ZXJzPC9zdHJvbmc+PGJyIC8+Ck1heGltdW0gbGVuZ3RoIG9mIGNvbW1l bnQgaW4gY2hhcmFjdGVycy4gTG9uZ2VyIG1lc3NhZ2VzIGFyZSBjb25zaWRlcnMgYXMgc3Bh bS4gTm90ZSB0aGF0IG1lc3NhZ2UmIzgyMTc7cyB0b3RhbCBzaXplIGlzIGxpbWl0ZWQgdG8g NjU1MzUgYnl0ZXMuIFZhbGlkIHZhbHVlcyByYW5nZSBmcm9tIDAgdG8gNjU1MzUgKGVxdWFs cyB0byBhcm91bmQgNjU1MzUgPHNwYW4gY2xhc3M9ImNhcHMiPkFTQ0lJPC9zcGFuPiBjaGFy YWN0ZXJzKS48L3A+CgoJPHA+PHN0cm9uZz5OYW1lIG9mIGhpZGRlbiBzcGFtIHRyYXAgZmll bGQ8L3N0cm9uZz48YnIgLz4KSWYgc2V0LCBoaWRkZW4gc3BhbSB0cmFwIGZpZWxkIGlzIGFk ZGVkIHRvIHRoZSBjb21tZW50IGZvcm0uIFRoZSBmaWVsZCB3aWxsIGJlIGhpZGRlbiB3aXRo IDxzcGFuIGNsYXNzPSJjYXBzIj5DU1M8L3NwYW4+LCBhbmQgaWYgdGhlIGZpZWxkIGlzIGZp bGxlZCwgdGhlIGNvbW1lbnQgaXMgY29uc2lkZXJlZCBhcyBzcGFtLiBEZWZhdWx0IHZhbHVl IGlzIDxlbT5waG9uZTwvZW0+LiBFbXB0eSB0aGUgZmllbGQgdG8gZGlzYWJsZSB0aGUgc3Bh bSB0cmFwLjwvcD4KCgk8cD48c3Ryb25nPlVzZSBxdW90YXMsIGxpbWl0IHVzZXJzJiM4MjE3 OyBjb21tZW50IHBvc3RpbmcgYWN0aXZpdHk/PC9zdHJvbmc+PGJyIC8+CklmIHNldCB0byA8 ZW0+WWVzPC9lbT4sIHVzZXJzIGNvbW1lbnQgcG9zdGluZyBhY3Rpdml0eSBpcyBsaW1pdGVk LiBDb21tZW50cyBnb2luZyBvdmVyIHRoZSBxdW90YSBhcmUgY29uc2lkZXJlZCBhcyBzcGFt LiBVc2VycyBhcmUgaWRlbnRpZmllZCBieSBJUCBhZGRyZXNzZXMuPC9wPgoKCTxwPjxzdHJv bmc+VXNlcnMmIzgyMTc7IGNvbW1lbnQgcXVvdGEgbGltaXQ8L3N0cm9uZz48YnIgLz4KU2V0 cyB0aGUgdXNlciYjODIxNztzIHF1b3RhIGxpbWl0LiBEZWZhdWx0IGlzIHRlbiAoPGNvZGU+ MTA8L2NvZGU+KSBjb21tZW50cyBwZXIgdXNlci48L3A+CgoJPHA+PHN0cm9uZz5Db3VudCB1 c2VycyYjODIxNzsgY29tbWVudHMgdG93YXJkcyBxdW90YSBpbjwvc3Ryb25nPjxiciAvPgpT ZXRzIHdoaWNoIGNvbW1lbnRzIGluIHdoaWNoIGFydGljbGVzIGFyZSBjb3VudGVkIHRvd2Fy ZHMgdGhlIHF1b3RhIGxpbWl0LiBCeSBkZWZhdWx0IHVzZXImIzgyMTc7cyBjb21tZW50cyBp biBhbnkgYXJ0aWNsZSBhcmUgdGFrZW4gaW50byBjb3VudC4gQXZhaWxhYmxlIHNldHRpbmdz IGFyZSA8ZW0+SW4gYWxsIGFydGljbGVzPC9lbT4sIGNvdW50cyBjb21tZW50cyBzaXRlLXdp ZGUsIGFuZCA8ZW0+SW4gY3VycmVudCBhcnRpY2xlPC9lbT4gd2hpY2ggY291bnRzIG9ubHkg Y29tbWVudHMgaW4gdGhlIGN1cnJlbnQgYXJ0aWNsZSB0aGUgbmV3IGNvbW1lbnQgaXMgYmVp bmcgcG9zdGVkIHRvLjwvcD4KCgk8cD48c3Ryb25nPlF1b3RhIHJlc2V0cyBldmVyeSBudW1i ZXIgb2Ygc2Vjb25kczwvc3Ryb25nPjxiciAvPgpTZXRzIHRoZSB0aW1lc3BhbiB1c2VkIGlu IHRoZSBhY3Rpdml0eSBsaW1pdGluZy4gQ29tbWVudHMgb2xkZXIgdGhhbiB0aGlzIGFyZSBu b3QgY291bnRlZCB0b3dhcmRzIHRoZSBxdW90YSBsaW1pdC4gVGhlIHRpbWUgaXMgc2V0IGlu IHNlY29uZHMuIEZvciBleGFtcGxlIHNldHRpbmcgdGhlIG9wdGlvbiB0byA8Y29kZT42MDA8 L2NvZGU+LCB3b3VsZCBjb3VudCBhbiB1c2VyJiM4MjE3O3MgY29tbWVudHMgZnJvbSB0aGUg bGFzdCB0ZW4gbWludXRlcywgYW5kIGlmIHRoZSBudW1iZXIgZ29lcyBvdmVyIHRoZSBxdW90 YSwgdGhlbiB0aGUgY29tbWVudCBpcyBjb25zaWRlcmVkIGFzIHNwYW0uPC9wPgoKCTxwPjxz dHJvbmc+Q2hlY2sgZW1haWwmIzgyMTc7cyA8c3BhbiBjbGFzcz0iY2FwcyI+RE5TPC9zcGFu PiByZWNvcmRzPzwvc3Ryb25nPjxiciAvPgpJZiBzZXQgPGVtPlllczwvZW0+LCBlbWFpbCBh ZGRyZXNzJiM4MjE3OyA8c3BhbiBjbGFzcz0iY2FwcyI+RE5TPC9zcGFuPiByZWNvcmRzIGFy ZSBjaGVja2VkLiBJZiB0aGUgZG9tYWluIGlzIGZvdW5kIHRvIGJlIG5vbi1leGlzdGVudCwg dGhlIGNvbW1lbnQgaXMgY29uc2lkZXJlZCBhcyBzcGFtLiBUaGUgZmVhdHVyZSByZXF1aXJl cyA8YSBocmVmPSJodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24uY2hlY2tkbnNy ci5waHAiPmNoZWNrZG5zcnIoKTwvYT4gZnVuY3Rpb24gYW5kIHRoZSBzZXJ2ZXIgbXVzdCBi ZSBhbGxvd2VkIHRvIG1ha2Ugb3V0Z29pbmcgY29ubmVjdGlvbnMuPC9wPgoKCTxwPjxzdHJv bmc+Q2hlY2sgdGhlIHRpbWUgdXNlciBzcGVudCB3cml0aW5nIHRoZSBjb21tZW50Pzwvc3Ry b25nPjxiciAvPgpNYWtlcyBzdXJlIHRoYXQgdGhlIHVzZXIgc3BlbnQgc2V0IGFtb3VudCBv ZiB0aW1lIHdyaXRpbmcgdGhlIGNvbW1lbnQuIEluc3RhbnQgcG9zdGVycyB3aWxsIGJlIHRy ZWF0ZWQgYXMgc3BhbW1lcnMuIFVzdWFsbHkgaXQmIzgyMTc7cyByZWNvbW1lbmRlZCB0byBr ZWVwIHRoaXMgZmVhdHVyZSBkaXNhYmxlZC4gSXQgY2FuIGFjY2lkZW50YWxseSBibG9jayBm YXN0IHdyaXRlcnMgaWYgdGhlIHJlcXVpcmVkIHRpbWUgaXMgc2V0IHRvIHRvbyBoaWdoLCBi dXQgaXQgY2FuIGFsc28gc3VjY2Vzc2Z1bGx5IGJsb2NrIHNwYW0gYm90cyB3aGljaCBtaWdo dCB0cnkgdG8gcG9zdCBjb21tZW50cyBpbnN0YW50bHksIHdpdGhvdXQgaW50ZXJhY3Rpbmcg d2l0aCB0aGUgY29tbWVudCBmb3JtLiBUaGUgdGltZSBpcyBjb3VudGVkIGZyb20gdGhlIGlu aXRpYWwgYXJ0aWNsZSBwYWdlIGxvYWQgdG8gdGhlIGNvbW1lbnQmIzgyMTc7cyBzdWJtaXR0 aW5nLjwvcD4KCgk8cD48c3Ryb25nPk1pbmltdW0gdGltZSByZXF1aXJlZCB0byBiZSBzcGVu dCB3cml0aW5nIGEgY29tbWVudD88L3N0cm9uZz48YnIgLz4KU2V0cyB0aGUgcmVxdWlyZWQg aW50ZXJhY3Rpb24gdGltZSBpbiBzZWNvbmRzLiBEZWZhdWx0IGlzIDxjb2RlPjU8L2NvZGU+ LiBIaWdoZXIgdmFsdWVzIGFyZSBub3QgcmVjb21tZW5kZWQgdXNhYmlsaXR5LXdpc2UuIElm IHlvdSBzZXQgdGhlIHZhbHVlIGhpZ2hlciB0aGFuIDUgc2Vjb25kcywgY29uc2lkZXIgYWRk aW5nIEphdmFTY3JpcHQgYmFzZWQgY291bnRlciB0byB0aGUgY29tbWVudCBmb3JtIHRoYXQg aW5mb3JtcyB0aGUgdXNlcnMgaG93IG11Y2ggdGhleSBoYXZlIHRvIHdhaXQuIEZvciBjb3Vu dGVycyBJIHJlY29tbWVuZCBjaGVja2luZyBvdXQgPGEgaHJlZj0iaHR0cDovL3BsdWdpbnMu anF1ZXJ5LmNvbS9wbHVnaW4tdGFncy9jb3VudGRvd24iPmpRdWVyeSYjODIxNztzIHBsdWdp biByZXBvc2l0b3J5PC9hPi48L3A+CgoJPGgzIGlkPSJjaGFuZ2Vsb2ciPkNoYW5nZWxvZzwv aDM+CgoJPHA+PHN0cm9uZz5WZXJzaW9uIDAuNzwvc3Ryb25nPjwvcD4KCgk8dWw+CgkJPGxp PkZpeGVkOiBVcGRhdGUgY2FjaGVkIHZlcnNpb24gbnVtYmVyIGFmdGVyIHJ1bm5pbmcgdGhl IGluc3RhbGxlci48L2xpPgoJCTxsaT5VcGRhdGVkIGhlbHAgZmlsZS48L2xpPgoJPC91bD4K Cgk8cD48c3Ryb25nPlZlcnNpb24gMC42PC9zdHJvbmc+PC9wPgoKCTx1bD4KCQk8bGk+Rml4 ZWQ6IENvbW1lbnQgcXVvdGEgbGltaXQmIzgyMTc7cyA8ZW0+SW4gY3VycmVudCBhcnRpY2xl PC9lbT4gb3B0aW9uLiBQcmV2aW91c2x5IGNvdW50aW5nIGRpZG4mIzgyMTc7dCB3b3JrIHdo ZW4gdGhlIDxlbT5pbiBjdXJyZW50IGFydGljbGU8L2VtPiBvcHRpb24gd2FzIHNlbGVjdGVk LjwvbGk+CgkJPGxpPkFkZGVkOiBsYW5ndWFnZSBzdHJpbmcgc3VwcG9ydC4gVGhlIGludGVy ZmFjZSBub3cgaXMgdHJhbnNsYXRhYmxlIHVzaW5nIFRleHRwYWNrcy48L2xpPgoJCTxsaT5B ZGRlZDogb3B0aW9uIHRvIGZyZWVseSBhZGQgYW55IGZpZWxkIHRvIHRoZSBsaXN0IG9mIHRo YXQgYXJlIGNoZWNrZWQgZm9yIHNwYW0gd29yZHMuIFVzZWQgZmllbGRzIG5lZWQgdG8gYmUg ZGVmaW5lZCBpbiBnZXRDb21tZW50KCkuPC9saT4KCQk8bGk+SW1wcm92ZWQ6IDxzcGFuIGNs YXNzPSJjYXBzIj5VVEY8L3NwYW4+LTggY29tcGF0aWJpbGl0eS4gVGhlIHBsdWdpbiBub3cg dXNlcyBtdWx0aWJ5dGUgc2FmZSBtZXRob2RzIHdoZW4gcG9zc2libGUuPC9saT4KCQk8bGk+ Q2hhbmdlZDogTWlncmF0ZWQgdGhlIHByZWZlcmVuY2VzIGZyb20gb3duIGFkbWluLWludGVy ZmFjZSBhbmQgZGF0YWJhc2UgdGFibGUsIHRvIFRleHRwYXR0ZXJuJiM4MjE3O3MgbmF0aXZl IHByZWZlcmVuY2VzIHBhbmVsLiBQcmVmZXJlbmNlcyBhcmUgbm93IGxvY2F0ZWQgYXQgPGVt PkFkbWluL1ByZWZlcmVuY2VzPC9lbT4sIGluIHRoZSA8ZW0+Q29tbWVudHM8L2VtPiBncm91 cC48L2xpPgoJCTxsaT5DaGFuZ2VkOiBGb3IgbmV3IGluc3RhbGxhdGlvbnMgcHJvdGVjdGlv biBtZXRob2Qgbm93IGRlZmF1bHRzIHRvIDxlbT5tb2RlcmF0ZTwvZW0+IGluc3RlYWQgb2Yg PGVtPmJsb2NraW5nPC9lbT4uPC9saT4KCQk8bGk+Q2hhbmdlZDogRm9yIG5ldyBpbnN0YWxs YXRpb25zLCBkZWZhdWx0IG1lc3NhZ2UgbGVuZ3RoIGxpbWl0cyBoYXZlIGJlZW4gaW5jcmVh c2VkLCBhbmQgdGhlIGV4YW1wbGUgc3BhbSB3b3JkcyBoYXZlIGJlZW4gcmVtb3ZlZC48L2xp PgoJCTxsaT5Ob3cgcmVxdWlyZXMgUEhQNSBvciBuZXdlci4gPHNwYW4gY2xhc3M9ImNhcHMi PlBIUDwvc3Bhbj4gdmVyc2lvbiA1LjMgb3IgbmV3ZXIgaXMgcmVjb21tZW5kZWQuIDxzcGFu IGNsYXNzPSJjYXBzIj5QSFA8L3NwYW4+IDQgc3VwcG9ydCBoYXMgYmVlbiBkcm9wcGVkLjwv bGk+CgkJPGxpPkZvciBmdWxsIGZlYXR1cmUgY29tcGF0aWJpbGl0eSBUZXh0cGF0dGVybiB2 ZXJzaW9uIDQuMi4wIG9yIG5ld2VyIGlzIHJlcXVpcmVkLiBUZXh0cGF0dGVybiB2NC40LjEg b3IgbmV3ZXIgaXMgcmVjb21tZW5kZWQuPC9saT4KCTwvdWw+CgoJPHA+PHN0cm9uZz5WZXJz aW9uIDAuNTwvc3Ryb25nPjwvcD4KCgk8dWw+CgkJPGxpPkFkZGVkIG9wdGlvbiB0byBjaGVj ayB0aGUgdGltZSB0aGUgdXNlciB1c2VkIHRvIHdyaXRlIHRoZSBjb21tZW50IGFuZCBibG9j ayBpbnN0YW50IHBvc3RlcnMuIDxhIGhyZWY9Imh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5j b20vdmlld3RvcGljLnBocD9pZD0zNDUzNSI+QXMgZGlzY3Vzc2VkIGhlcmU8L2E+LjwvbGk+ CgkJPGxpPlJlbW92ZWQgdW51c2VkIDxzcGFuIGNsYXNzPSJjYXBzIj5IVE1MPC9zcGFuPiBm aWVsZCBpZHMgYW5kIHNpemVzIGZyb20gdGhlIGJhY2tlbmQgcGFuZS48L2xpPgoJPC91bD4K Cgk8cD48c3Ryb25nPlZlcnNpb24gMC40PC9zdHJvbmc+PC9wPgoKCTx1bD4KCQk8bGk+QWRk ZWQ6IG5vdyBhbHNvIGZpbHRlcnMgPGNvZGU+aHR0cHM6Ly88L2NvZGU+LCA8Y29kZT5mdHA6 Ly88L2NvZGU+IGFuZCA8Y29kZT5mdHBzOi8vPC9jb2RlPiBwcm90b2NvbHMsIG5vdCBqdXN0 IGxpbmtzIHN0YXJ0aW5nIHdpdGggPGNvZGU+aHR0cDovLzwvY29kZT4uPC9saT4KCQk8bGk+ Q2hhbmdlZCBwb3N0aW5nIGxpbWl0IGZlYXR1cmUmIzgyMTc7cyBtYXhpbXVtIHBvc3Qgc2V0 dGluZyBmcm9tIDxlbT4mIzgyMjA7bW9yZSB0aGFuJiM4MjIxOzwvZW0+IHRvIDxlbT4mIzgy MjA7ZXF1YWxzIG9yIG1vcmUgdGhhbiYjODIyMTs8L2VtPi4gU2V0dGluZyB0aGUgdmFsdWUg dG8gemVyby9vciBsZWF2aW5nIGl0IGVtcHR5IHdpbGwgZGlzYWJsZSB0aGUgZmVhdHVyZS48 L2xpPgoJCTxsaT5DaGFuZ2VkIGZpbHRlcmluZyBtZXRob2QgZnJvbSA8ZW0+YW5kPC9lbT4g dG8gPGVtPm9yPC9lbT4uIFRoaXMgbWVhbnMsIHdoZW4gdGhlIGNvbW1lbnQgZ2V0cyBmbGFn Z2VkIGJ5IGEgZmlsdGVyIGZvciB0aGUgZmlyc3QgdGltZSwgdGhlIHNwYW0gZmlsdGVyaW5n IHByb2Nlc3MgZW5kcyBpbnN0ZWFkIGdvaW5nIHRocnUgYWxsIHRoZSBjaGVja3Mgd2hpY2gg YXJlIG5vIGxvbmdlciBuZWVkZWQuIEdpdmVzIHNsaWdodCBwZXJmb3JtYW5jZSBib29zdC48 L2xpPgoJCTxsaT5Gcm9tIHZlcnNpb24gMC40IG9ud2FyZHMgcmVxdWlyZXMgPHNwYW4gY2xh c3M9ImNhcHMiPlRYUDwvc3Bhbj4gNC4wLjcgb3IgbmV3ZXIuPC9saT4KCQk8bGk+Tm93IHBv c3RpbmcgbGltaXRzIGFyZSBjb3VudGVkIGJhcmVseSBieSBNeVNRTC4gTm8gaW52b2xtZW50 IG9mIDxzcGFuIGNsYXNzPSJjYXBzIj5QSFA8L3NwYW4+LjwvbGk+CgkJPGxpPk1lcmdlZCA8 Y29kZT5yYWhfY29tbWVudF9zcGFtX3VybGNvdW50KCk8L2NvZGU+IGFuZCA8Y29kZT5yYWhf Y29tbWVudF9zcGFtX3NwYW13b3JkcygpPC9jb2RlPi48L2xpPgoJCTxsaT5Ob3cgYWRtaW4g cGFuZWwgdXNlcyBzYW1lIHR5cGUgb2Ygc2xpZGluZyBwYW5lbHMgYXMgc2VlbiBpbiA8YSBo cmVmPSJodHRwOi8vcmFoZm9ydW0uYml6L3BsdWdpbnMvcmFoX3NpdGVtYXAiPnJhaF9zaXRl bWFwPC9hPi48L2xpPgoJPC91bD4KCgk8cD48c3Ryb25nPlZlcnNpb24gMC4zPC9zdHJvbmc+ PC9wPgoKCTx1bD4KCQk8bGk+QWRkZWQgZW1haWwgPHNwYW4gY2xhc3M9ImNhcHMiPkROUzwv c3Bhbj4gdmFsaWRhdGlvbi48L2xpPgoJPC91bD4KCgk8cD48c3Ryb25nPlZlcnNpb24gMC4y LjE8L3N0cm9uZz48L3A+CgoJPHVsPgoJCTxsaT5NYWRlIHdyaXRpbmcgc3BhbSBkZWZpbml0 aW9uIGxpc3QgbGVzcyBzdHJpY3QuIE5vdyBhbGxvd3MgZG91YmxlIGNvbW1hcywgc3BhY2Vz IGFuZCBzbyBvbi4gPGEgaHJlZj0iaHR0cDovL2ZvcnVtLnRleHRwYXR0ZXJuLmNvbS92aWV3 dG9waWMucGhwP3BpZD0yMTI5NDMjcDIxMjk0MyI+VGhhbmtzIFJvYmVydC48L2E+PC9saT4K CTwvdWw+CgoJPHA+PHN0cm9uZz5WZXJzaW9uIDAuMjwvc3Ryb25nPjwvcD4KCgk8dWw+CgkJ PGxpPkFkZGVkIHVzZXIgYmFzZWQgdGltZSByZWxhdGl2ZSBwb3N0aW5nIGxpbWl0LjwvbGk+ CgkJPGxpPkZpeGVkIGhpZGRlbiBzcGFtIHRyYXAgaW5wdXQmIzgyMTc7cyBlc2NhcGluZy48 L2xpPgoJCTxsaT5JbXByb3ZlZCBjb21tZW50IHBvc3RpbmcgZXZhbHVhdGluZyBzcGVlZC48 L2xpPgoJCTxsaT5NZXJnZWQgaW5zdGFsbCwgc2F2ZSwgdXBkYXRlIGFuZCBmZXRjaCBhcnJh eXMuPC9saT4KCQk8bGk+SW1wcm92ZWQgaW5zdGFsbGF0aW9uIHNjcmlwdC48L2xpPgoJCTxs aT5NZXJnZWQgPHNwYW4gY2xhc3M9ImNhcHMiPlNRTDwvc3Bhbj4gcXVlcmllcy48L2xpPgoJ PC91bD4KCgk8cD48c3Ryb25nPlZlcnNpb24gMC4xLjM8L3N0cm9uZz48L3A+CgoJPHVsPgoJ CTxsaT5GaXhlZCBmb3Jnb3R0ZW4gPGNvZGU+c3RydG9sb3dlcigpPC9jb2RlPi48L2xpPgoJ PC91bD4KCgk8cD48c3Ryb25nPlZlcnNpb24gMC4xLjI8L3N0cm9uZz48L3A+CgoJPHVsPgoJ CTxsaT5SZW1vdmVkIHR5cG8gZnJvbSBhZG1pbiBwYW5lbDogJiM4MjIwO0RvY3VtZW50aW9u JiM4MjIxOyB0byAmIzgyMjA7RG9jdW1lbnRhdGlvbiYjODIyMTsuPC9saT4KCTwvdWw+CgoJ PHA+PHN0cm9uZz5WZXJzaW9uIDAuMTwvc3Ryb25nPjwvcD4KCgk8dWw+CgkJPGxpPkZpcnN0 IHJlbGVhc2UuPC9saT4KCTwvdWw+IjtzOjQ6ImNvZGUiO3M6MTI3ODg6IgkjIyMjIyMjIyMj IyMjIyMjIyMKCSMKCSMJcmFoX2NvbW1lbnRfc3BhbS1wbHVnaW4gZm9yIFRleHRwYXR0ZXJu CgkjCXZlcnNpb24gMC43CgkjCWJ5IEp1a2thIFN2YWhuCgkjCWh0dHA6Ly9yYWhmb3J1bS5i aXoKCSMKCSMJQ29weXJpZ2h0IChDKSAyMDExIEp1a2thIFN2YWhuIDxodHRwOi8vcmFoZm9y dW0uYml6PgoJIwlMaWNlbnNlZCB1bmRlciBHTlUgR2VucmFsIFB1YmxpYyBMaWNlbnNlIHZl cnNpb24gMgoJIwlodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sCgkj CgkjIyMjIyMjIyMjIyMjIyMjIyMjCgoJaWYoQHR4cGludGVyZmFjZSA9PSAnYWRtaW4nKSB7 CgkJcmFoX2NvbW1lbnRfc3BhbV9pbnN0YWxsKCk7CgkJYWRkX3ByaXZzKCdwbHVnaW5fcHJl ZnMucmFoX2NvbW1lbnRfc3BhbScsJzEsMicpOwoJCXJlZ2lzdGVyX2NhbGxiYWNrKCdyYWhf Y29tbWVudF9zcGFtX3ByZWZzJywncGx1Z2luX3ByZWZzLnJhaF9jb21tZW50X3NwYW0nKTsK CQlyZWdpc3Rlcl9jYWxsYmFjaygncmFoX2NvbW1lbnRfc3BhbV9pbnN0YWxsJywncGx1Z2lu X2xpZmVjeWNsZS5yYWhfY29tbWVudF9zcGFtJyk7Cgl9IGVsc2UgewoJCXJlZ2lzdGVyX2Nh bGxiYWNrKCdyYWhfY29tbWVudF9zcGFtX3JlZ2lzdGVyJywnY29tbWVudC5zYXZlJyk7CgkJ cmVnaXN0ZXJfY2FsbGJhY2soJ3JhaF9jb21tZW50X3NwYW1fcmVnaXN0ZXInLCdjb21tZW50 LmZvcm0nKTsKCX0KCi8qKgoJSW5zdGFsbGVyCglAcGFyYW0gJGV2ZW50IHN0cmluZyBBZG1p bi1zaWRlIGV2ZW50LgoJQHBhcmFtICRzdGVwIHN0cmluZyBBZG1pbi1zaWRlLCBwbHVnaW4t bGlmZWN5Y2xlIHN0ZXAuCiovCgoJZnVuY3Rpb24gcmFoX2NvbW1lbnRfc3BhbV9pbnN0YWxs KCRldmVudD0nJywkc3RlcD0nJykgewoKCQlpZigkc3RlcCA9PSAnZGVsZXRlZCcpIHsKCQkJ c2FmZV9kZWxldGUoCgkJCQkndHhwX3ByZWZzJywKCQkJCSJuYW1lIGxpa2UgJ3JhaF9jb21t ZW50X3NwYW1fJSciCgkJCSk7CgkJCXJldHVybjsKCQl9CgoJCWdsb2JhbCAkcHJlZnMsICR0 ZXh0YXJyYXk7CgoJCS8qCgkJCU1ha2Ugc3VyZSBsYW5ndWFnZSBzdHJpbmdzIGFyZSBzZXQK CQkqLwoKCQlmb3JlYWNoKAoJCQlhcnJheSgKCQkJCSdtZXRob2QnID0+ICdXaGF0IHRvIGRv IGNvbW1lbnRzIGRldGVjdGVkIGFzIHNwYW0/JywKCQkJCSdtZXRob2RfYmxvY2snID0+ICdJ Z25vcmUsIGRvIG5vdCBzYXZlJywKCQkJCSdtZXRob2RfbW9kZXJhdGUnID0+ICdTYXZlIHRv IG1vZGVyYXRpb24gcXVldWUnLAoJCQkJJ21ldGhvZF9zcGFtJyA9PiAnU2F2ZSBhbmQgZmxh ZyBhcyBzcGFtJywKCQkJCSdtZXNzYWdlJyA9PiAnTWVzc2FnZSBkaXNwbGF5ZWQgdG8gdGhl IHVzZXIgd2hlbiB0aGUgY29tbWVudCB3YXMgYmxvY2tlZCcsCgkJCQknc3BhbXdvcmRzJyA9 PiAnTGlzdCBvZiBzcGFtIHdvcmRzIChjb21tYS1zZXBhcmF0ZWQpJywKCQkJCSdjaGVjaycg PT4gJ1NlYXJjaCBzcGFtIHdvcmRzIGZyb20gZm9sbG93aW5nIGZpZWxkcyAoY29tbWEtc2Vw YXJhdGVkKScsCgkJCQknbWF4c3BhbXdvcmRzJyA9PiAnTWF4aW11bSBudW1iZXIgb2Ygc3Bh bSB3b3JkcyB1bnRpbCB0aGUgY29tbWVudCBpcyBjb25zaWRlcmVkIGFzIHNwYW0nLAoJCQkJ J3VybGNvdW50JyA9PiAnTnVtYmVyIG9mIGFsbG93ZWQgVVJMcycsCgkJCQknbWlud29yZHMn ID0+ICdNaW5pbXVtIG51bWJlciBvZiB3b3JkcycsCgkJCQknbWF4d29yZHMnID0+ICdNYXhp bXVtIG51bWJlciBvZiB3b3JkcycsCgkJCQknbWluY2hhcnMnID0+ICdNaW5pbXVtIG51bWJl ciBvZiBjaGFyYWN0ZXJzJywKCQkJCSdtYXhjaGFycycgPT4gJ01heGltdW0gbnVtYmVyIG9m IGNoYXJhY3RlcnMnLAoJCQkJJ2ZpZWxkJyA9PiAnTmFtZSBvZiBoaWRkZW4gc3BhbSB0cmFw IGZpZWxkIChlbXB0eSB0byBkaXNhYmxlIHRoZSB0cmFwKScsCgkJCQknY29tbWVudHVzZScg PT4gJ1VzZSBxdW90YXMsIGxpbWl0IHVzZXJzXCcgY29tbWVudCBwb3N0aW5nIGFjdGl2aXR5 PycsCgkJCQknY29tbWVudGxpbWl0JyA9PiAnVXNlcnNcJyBjb21tZW50IHF1b3RhIGxpbWl0 JywKCQkJCSdjb21tZW50aW4nID0+ICdDb3VudCB1c2Vyc1wnIGNvbW1lbnRzIHRvd2FyZHMg cXVvdGEgaW4nLAoJCQkJJ2NvbW1lbnRpbl9hbGwnID0+ICdJbiBhbGwgYXJ0aWNsZXMnLAoJ CQkJJ2NvbW1lbnRpbl90aGlzJyA9PiAnSW4gY3VycmVudCBhcnRpY2xlJywKCQkJCSdjb21t ZW50dGltZScgPT4gJ1F1b3RhIHJlc2V0cyBldmVyeSBudW1iZXIgb2Ygc2Vjb25kcycsCgkJ CQknZW1haWxkbnMnID0+ICdDaGVjayBlbWFpbFwncyBETlMgcmVjb3Jkcz8nLAoJCQkJJ3Vz ZV90eXBlX2RldGVjdCcgPT4gJ0NoZWNrIHRoZSB0aW1lIHVzZXIgc3BlbnQgd3JpdGluZyB0 aGUgY29tbWVudD8nLAoJCQkJJ3R5cGVfaW50ZXJ2YWwnID0+ICdNaW5pbXVtIHRpbWUgcmVx dWlyZWQgdG8gYmUgc3BlbnQgd3JpdGluZyBhIGNvbW1lbnQgKGluIHNlY29uZHMpPycKCQkJ KSBhcyAkc3RyaW5nID0+ICR0cmFuc2xhdGlvbgoJCSkgewoJCQkkbmFtZSA9IHN0cnBvcygk c3RyaW5nLCAncmFoXycpID09PSAwID8gJHN0cmluZyA6ICdyYWhfY29tbWVudF9zcGFtXycu JHN0cmluZzsKCgkJCWlmKCFpc3NldCgkdGV4dGFycmF5WyRuYW1lXSkpCgkJCQkkdGV4dGFy cmF5WyRuYW1lXSA9ICR0cmFuc2xhdGlvbjsKCQl9CgoJCSR2ZXJzaW9uID0gJzAuNyc7CgoJ CSRjdXJyZW50ID0gaXNzZXQoJHByZWZzWydyYWhfY29tbWVudF9zcGFtX3ZlcnNpb24nXSkg PyAKCQkJJHByZWZzWydyYWhfY29tbWVudF9zcGFtX3ZlcnNpb24nXSA6ICdiYXNlJzsKCgkJ aWYoJHZlcnNpb24gPT0gJGN1cnJlbnQpCgkJCXJldHVybjsKCgkJJGluaSA9IAoJCQlhcnJh eSgKCQkJCSdtZXRob2QnID0+ICdtb2RlcmF0ZScsCgkJCQknbWVzc2FnZScgPT4gJ1lvdXIg Y29tbWVudCB3YXMgbWFya2VkIGFzIHNwYW0uJywKCQkJCSdzcGFtd29yZHMnID0+ICcnLAoJ CQkJJ21heHNwYW13b3JkcycgPT4gMywKCQkJCSdjaGVjaycgPT4gJ25hbWUsIGVtYWlsLCB3 ZWIsIG1lc3NhZ2UnLAoJCQkJJ3VybGNvdW50JyA9PiA2LAoJCQkJJ21pbndvcmRzJyA9PiAx LAoJCQkJJ21heHdvcmRzJyA9PiAxMDAwMCwKCQkJCSdtaW5jaGFycycgPT4gMSwKCQkJCSdt YXhjaGFycycgPT4gNjU1MzUsCgkJCQknZmllbGQnID0+ICdwaG9uZScsCgkJCQknY29tbWVu dHVzZScgPT4gMSwKCQkJCSdjb21tZW50bGltaXQnID0+IDEwLAoJCQkJJ2NvbW1lbnRpbicg PT4gJ3RoaXMnLAoJCQkJJ2NvbW1lbnR0aW1lJyA9PiAzMDAsCgkJCQknZW1haWxkbnMnID0+ IDAsCgkJCQkndXNlX3R5cGVfZGV0ZWN0JyA9PiAwLAoJCQkJJ3R5cGVfaW50ZXJ2YWwnID0+ IDUsCgkJCQknbm9uY2UnID0+IG1kNSh1bmlxaWQocmFuZCgpLHRydWUpKQoJCQkpOwoKCQkv KgoJCQlNaWdyYXRlIHByZWZlcmVuY2VzIGZvcm1hdCBmcm9tIDw9IDAuNSB0byA+PSAwLjYK CQkqLwoKCQlpZigkY3VycmVudCA9PSAnYmFzZScpIHsKCQkJQCRycyA9IAoJCQkJc2FmZV9y b3dzKAoJCQkJCSduYW1lLCB2YWx1ZScsCgkJCQkJJ3JhaF9jb21tZW50X3NwYW0nLAoJCQkJ CScxPTEnCgkJCQkpOwoKCQkJaWYoIWVtcHR5KCRycykgJiYgaXNfYXJyYXkoJHJzKSkgewoJ CQkJZm9yZWFjaCgkcnMgYXMgJGEpIHsKCQkJCQlpZighaXNzZXQoJGluaVskYVsnbmFtZSdd XSkpCgkJCQkJCWNvbnRpbnVlOwoJCQkJCQoJCQkJCWlmKGluX2FycmF5KCRhWyduYW1lJ10s IGFycmF5KAoJCQkJCQkndXNlX3R5cGVfZGV0ZWN0JywKCQkJCQkJJ2VtYWlsZG5zJywKCQkJ CQkJJ2NvbW1lbnR1c2UnLAoJCQkJCSkpKQoJCQkJCQkkYVsndmFsdWUnXSA9ICRhWyd2YWx1 ZSddID09ICdubycgPyAwIDogMTsKCQkJCQkKCQkJCQkkaW5pWyRhWyduYW1lJ11dID0gJGFb J3ZhbHVlJ107CgkJCQl9CgoJCQkJQHNhZmVfcXVlcnkoCgkJCQkJJ0RST1AgVEFCTEUgSUYg RVhJU1RTICcuc2FmZV9wZngoJ3JhaF9jb21tZW50X3NwYW0nKQoJCQkJKTsKCQkJfQoJCX0K CgkJJHBvc2l0aW9uID0gMjUwOwoKCQkvKgoJCQlBZGQgcHJlZmVyZW5jZSBzdHJpbmdzCgkJ Ki8KCQkKCQlmb3JlYWNoKCRpbmkgYXMgJG5hbWUgPT4gJHZhbCkgewoKCQkJJG4gPSAncmFo X2NvbW1lbnRfc3BhbV8nIC4gJG5hbWU7CgkJCQoJCQlpZighaXNzZXQoJHByZWZzWyRuXSkp IHsKCQkJCQoJCQkJaWYoJG5hbWUgPT0gJ25vbmNlJykgewoJCQkJCXNldF9wcmVmKCdyYWhf Y29tbWVudF9zcGFtX25vbmNlJywkdmFsLCdyYWhfY3NwYW0nLDIsJycsMCk7CgkJCQkJY29u dGludWU7CgkJCQl9CgkJCQkKCQkJCXN3aXRjaCgkbmFtZSkgewoJCQkJCWNhc2UgJ2NvbW1l bnR1c2UnOgoJCQkJCWNhc2UgJ2VtYWlsZG5zJzoKCQkJCQljYXNlICd1c2VfdHlwZV9kZXRl Y3QnOgoJCQkJCQkkaHRtbCA9ICd5ZXNub3JhZGlvJzsKCQkJCQkJYnJlYWs7CgkJCQkJY2Fz ZSAnY29tbWVudGluJzoKCQkJCQkJJGh0bWwgPSAncmFoX2NvbW1lbnRfc3BhbV9zZWxlY3Rf Y29tbWVudGluJzsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnbWV0aG9kJzoKCQkJCQkJJGh0 bWwgPSAncmFoX2NvbW1lbnRfc3BhbV9zZWxlY3RfbWV0aG9kJzsKCQkJCQkJYnJlYWs7CgkJ CQkJY2FzZSAnc3BhbXdvcmRzJzoKCQkJCQkJJGh0bWwgPSAncmFoX2NvbW1lbnRfc3BhbV90 ZXh0YXJlYSc7CgkJCQkJCWJyZWFrOwoJCQkJCWRlZmF1bHQ6CgkJCQkJCSRodG1sID0gJ3Rl eHRfaW5wdXQnOwoJCQkJfQoKCQkJCXNhZmVfaW5zZXJ0KAoJCQkJCSd0eHBfcHJlZnMnLAoJ CQkJCSJwcmVmc19pZD0xLAoJCQkJCW5hbWU9JyIuZG9TbGFzaCgkbikuIicsCgkJCQkJdmFs PSciLmRvU2xhc2goJHZhbCkuIicsCgkJCQkJdHlwZT0wLAoJCQkJCWV2ZW50PSdjb21tZW50 cycsCgkJCQkJaHRtbD0nJGh0bWwnLAoJCQkJCXBvc2l0aW9uPSIuJHBvc2l0aW9uCgkJCQkp OwoJCQkJCgkJCQkkcHJlZnNbJG5dID0gJHZhbDsKCQkJfQoJCQkKCQkJJHBvc2l0aW9uKys7 CgkJfQoJCQoJCS8qCgkJCVNldCB2ZXJzaW9uCgkJKi8KCQkKCQlzZXRfcHJlZigncmFoX2Nv bW1lbnRfc3BhbV92ZXJzaW9uJywkdmVyc2lvbiwncmFoX2NzcGFtJywyLCcnLDApOwoJCSRw cmVmc1sncmFoX2NvbW1lbnRfc3BhbV92ZXJzaW9uJ10gPSAkdmVyc2lvbjsKCX0KCi8qKgoJ Q2hlY2sgZm9yIHNwYW0KCUBwYXJhbSAkZXZlbnQgc3RyaW5nIENhbGxiYWNrIGV2ZW50Lgoq LwoKCWZ1bmN0aW9uIHJhaF9jb21tZW50X3NwYW1fcmVnaXN0ZXIoJGV2ZW50PScnKSB7CgkJ Z2xvYmFsICRwcmVmczsKCgkJcmFoX2NvbW1lbnRfc3BhbV9pbnN0YWxsKCk7CgoJCS8qCgkJ CUFkZCBzcGFtIHRyYXAgZmllbGQgdG8gdGhlIGNvbW1lbnQgZm9ybQoJCSovCgoJCWlmKCRl dmVudCA9PSAnY29tbWVudC5mb3JtJykgewoKCQkJJG91dCA9IGFycmF5KCk7CgoJCQlpZigk cHJlZnNbJ3JhaF9jb21tZW50X3NwYW1fdXNlX3R5cGVfZGV0ZWN0J10pIHsKCQkJCQoJCQkJ JG5vbmNlID0gcHMoJ3JhaF9jb21tZW50X3NwYW1fbm9uY2UnKTsKCQkJCSR0aW1lID0gcHMo J3JhaF9jb21tZW50X3NwYW1fdGltZScpOwoJCQkJCgkJCQlpZighJG5vbmNlICYmICEkdGlt ZSkgewoJCQkJCUAkdGltZSA9IHN0cnRvdGltZSgnbm93Jyk7CgkJCQkJJG5vbmNlID0gbWQ1 KCRwcmVmc1sncmFoX2NvbW1lbnRfc3BhbV9ub25jZSddLiR0aW1lKTsKCQkJCX0KCQkJCQoJ CQkJJG91dFtdID0KCQkJCQloSW5wdXQoJ3JhaF9jb21tZW50X3NwYW1fbm9uY2UnLCAkbm9u Y2UpLgoJCQkJCWhJbnB1dCgncmFoX2NvbW1lbnRfc3BhbV90aW1lJywgJHRpbWUpOwoJCQl9 CgoJCQlpZigkcHJlZnNbJ3JhaF9jb21tZW50X3NwYW1fZmllbGQnXSkKCQkJCSRvdXRbXSA9 IAoJCQkJCSc8ZGl2IHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4nLgoJCQkJCQlmSW5wdXQoCgkJ CQkJCQkndGV4dCcsCgkJCQkJCQlodG1sc3BlY2lhbGNoYXJzKCRwcmVmc1sncmFoX2NvbW1l bnRfc3BhbV9maWVsZCddKSwKCQkJCQkJCXBzKCRwcmVmc1sncmFoX2NvbW1lbnRfc3BhbV9m aWVsZCddKQoJCQkJCQkpLgoJCQkJCSc8L2Rpdj4nOwoKCQkJcmV0dXJuIG4uaW1wbG9kZSgn Jywkb3V0KS5uOwoJCX0KCgkJLyoKCQkJQ2hlY2sgc2VudCBjb21tZW50cyBiZWZvcmUgc2F2 aW5nCgkJKi8KCgkJJGNvbW1lbnQgPSBuZXcgcmFoX2NvbW1lbnRfc3BhbSgpOwoKCQlpZigk Y29tbWVudC0+aXNfc3BhbSgpKSB7CgkJCSRldmFsdWF0b3IgPSYgZ2V0X2NvbW1lbnRfZXZh bHVhdG9yKCk7CgkJCXN3aXRjaCgkcHJlZnNbJ3JhaF9jb21tZW50X3NwYW1fbWV0aG9kJ10p IHsKCQkJCWNhc2UgJ2Jsb2NrJyA6CgkJCQkJJGV2YWx1YXRvci0+YWRkX2VzdGltYXRlKFJF TE9BRCwxLCBnVHh0KCRwcmVmc1sncmFoX2NvbW1lbnRfc3BhbV9tZXNzYWdlJ10pKTsKCQkJ CWJyZWFrOwoJCQkJY2FzZSAnbW9kZXJhdGUnIDoKCQkJCQkkZXZhbHVhdG9yLT5hZGRfZXN0 aW1hdGUoTU9ERVJBVEUsMC43NSk7CgkJCQlicmVhazsKCQkJCWRlZmF1bHQgOgoJCQkJCSRl dmFsdWF0b3ItPmFkZF9lc3RpbWF0ZShTUEFNLDAuNzUpOwoJCQl9CgkJfQoJfQoKLyoqCglD b250YWlucyBhbnRpLXNwYW0gdG9vbHMKKi8KCmNsYXNzIHJhaF9jb21tZW50X3NwYW0gewoK CXByaXZhdGUgJGZvcm0gPSBhcnJheSgpOwoKLyoqCglGaWx0ZXIgY29tbWVudAoJQHJldHVy biBib29sIFRSVUUgaWYgY29tbWVudCBpcyBkZXRlY3RlZCBhcyBzcGFtLgoqLwoKCXB1Ymxp YyBmdW5jdGlvbiBpc19zcGFtKCkgewoJCWdsb2JhbCAkcHJlZnM7CgoJCSR0aGlzLT5mb3Jt ID0gZ2V0Q29tbWVudCgpOwoKCQlmb3JlYWNoKGRvX2xpc3QoJHByZWZzWydyYWhfY29tbWVu dF9zcGFtX2NoZWNrJ10pIGFzICRmKSAKCQkJaWYoaXNzZXQoJHRoaXMtPmZvcm1bJGZdKSAm JiAhaXNzZXQoJHN0YWNrWyRmXSkpCgkJCQkkc3RhY2tbJGZdID0gJHRoaXMtPmZvcm1bJGZd OwoKCQkkc3RhY2sgPSBpc3NldCgkc3RhY2spID8gaW1wbG9kZSgnICcsICRzdGFjaykgOiAn JzsKCgkJcmV0dXJuIAoJCQkoCgkJCQkoCgkJCQkJJHByZWZzWydyYWhfY29tbWVudF9zcGFt X2ZpZWxkJ10gJiYgCgkJCQkJdHJpbShwcygkcHJlZnNbJ3JhaF9jb21tZW50X3NwYW1fZmll bGQnXSkpCgkJCQkpIHx8CgkJCQkkdGhpcy0+d29yZGNvdW50KCR0aGlzLT5mb3JtWydtZXNz YWdlJ10pIHx8CgkJCQkkdGhpcy0+Y2hhcmNvdW50KCR0aGlzLT5mb3JtWydtZXNzYWdlJ10p IHx8CgkJCQkkdGhpcy0+c2VhcmNoKAoJCQkJCSRwcmVmc1sncmFoX2NvbW1lbnRfc3BhbV9z cGFtd29yZHMnXSwKCQkJCQkkc3RhY2ssCgkJCQkJJHByZWZzWydyYWhfY29tbWVudF9zcGFt X21heHNwYW13b3JkcyddCgkJCQkpIHx8CgkJCQkkdGhpcy0+c2VhcmNoKAoJCQkJCWFycmF5 KAoJCQkJCQknaHR0cHM6Ly8nLAoJCQkJCQknaHR0cDovLycsCgkJCQkJCSdmdHA6Ly8nLAoJ CQkJCQknZnRwczovLycKCQkJCQkpLAoJCQkJCSR0aGlzLT5mb3JtWydtZXNzYWdlJ10sCgkJ CQkJJHByZWZzWydyYWhfY29tbWVudF9zcGFtX3VybGNvdW50J10KCQkJCSkgfHwKCQkJCSR0 aGlzLT5jb21tZW50cXVvdGEoKSB8fCAKCQkJCSR0aGlzLT50eXBlc3BlZWQoKSB8fCAKCQkJ CSR0aGlzLT5lbWFpbGRucygpCgkJCSk7Cgl9CgovKioKCUZpbmRzIG5lZWRsZXMgZnJvbSBo YXlzdGFjay4gSWYgJG1heCBpcyBleGNlZWRlZCByZXR1cm5zIFRSVUUuCglAcGFyYW0gJG5l ZWRsZSBtaXhlZCBOZWVkbGUgdG8gc2VhcmNoIGZvci4gRWl0aGVyIGNvbW1hLXNlcGFyYXRl ZCBzdHJpbmcgb3IgYXJyYXkuCglAcGFyYW0gJHN0cmluZyBzdHJpbmcgU3RyaW5nIHRvIHNl YXJjaC4KCUBwYXJhbSAkbWF4IGludCBNYXhpbXVtIG9jY3VycmVuY2VzLgoJQHBhcmFtICRj b3VudCBpbnQgU3RhcnRpbmcgdmFsdWUuCglAcmV0dXJuIGJvb2wKKi8KCglwcml2YXRlIGZ1 bmN0aW9uIHNlYXJjaCgkbmVlZGxlLCRzdHJpbmcsJG1heD0wLCRjb3VudD0wKSB7CgoJCWlm KCEkbmVlZGxlIHx8ICEkc3RyaW5nKQoJCQlyZXR1cm4gZmFsc2U7CgkKCQkvKgoJCQlHZXQg dGhlIHN0YXR1cyBvZiBtdWx0aWJ5dGUgZnVuY3Rpb25zCgkJKi8KCgkJJG1iID0gZnVuY3Rp b25fZXhpc3RzKCdtYl9zdHJ0b2xvd2VyJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdtYl9zdWJz dHJfY291bnQnKTsKCgkJLyoKCQkJQ29udmVydCBjYXNlcywgdHVybiBuZWVkbGUgdG8KCQkJ YXJyYXkgaWYgc3RyaW5nIHdhcyBwcm92aWRlZAoJCSovCgoJCSRzdHJpbmcgPSAkbWIgPyBt Yl9zdHJ0b2xvd2VyKCcgJy4kc3RyaW5nLicgJywnVVRGLTgnKSA6IHN0cnRvbG93ZXIoJyAn LiRzdHJpbmcuJyAnKTsKCgkJaWYoIWlzX2FycmF5KCRuZWVkbGUpKSB7CgkJCSRuZWVkbGUg PSAkbWIgPyBtYl9zdHJ0b2xvd2VyKCRuZWVkbGUsJ1VURi04JykgOiBzdHJ0b2xvd2VyKCRu ZWVkbGUpOwoJCQkkbmVlZGxlID0gZG9fbGlzdCgkbmVlZGxlKTsKCQl9CgoJCWZvcmVhY2go JG5lZWRsZSBhcyAkZmluZCkKCQkJaWYoIWVtcHR5KCRmaW5kKSkKCQkJCSRjb3VudCArPSAk bWIgPyBtYl9zdWJzdHJfY291bnQoJHN0cmluZywkZmluZCwnVVRGLTgnKSA6IHN1YnN0cl9j b3VudCgkc3RyaW5nLCRmaW5kKTsKCgkJaWYoJGNvdW50ID4gJG1heCkKCQkJcmV0dXJuIHRy dWU7Cgl9CgovKioKCUNvdW50IGNoYXJhY3RlcnMsIHJldHVybiBUUlVFIGlmIGV4Y2VlZHMg dGhlIGxpbWl0LgoJQHBhcmFtICRzdHJpbmcgc3RyaW5nIFN0cmluZyB0byBjb3VudAoJQHJl dHVybiBib29sCiovCgoJcHJpdmF0ZSBmdW5jdGlvbiBjaGFyY291bnQoJHN0cmluZykgewoJ CWdsb2JhbCAkcHJlZnM7CgoJCWlmKCEkc3RyaW5nIHx8ICghJHByZWZzWydyYWhfY29tbWVu dF9zcGFtX21pbmNoYXJzJ10gJiYgISRwcmVmc1sncmFoX2NvbW1lbnRfc3BhbV9tYXhjaGFy cyddKSkKCQkJcmV0dXJuIGZhbHNlOwoKCQkkY2hhcnMgPSBmdW5jdGlvbl9leGlzdHMoJ21i X3N0cmxlbicpID8gbWJfc3RybGVuKCRzdHJpbmcsICdVVEYtOCcpIDogc3RybGVuKCRzdHJp bmcpOwoJCQoJCWlmKAoJCQkoJHByZWZzWydyYWhfY29tbWVudF9zcGFtX21heGNoYXJzJ10g JiYgJHByZWZzWydyYWhfY29tbWVudF9zcGFtX21heGNoYXJzJ10gPCAkY2hhcnMpIHx8IAoJ CQkoJHByZWZzWydyYWhfY29tbWVudF9zcGFtX21pbmNoYXJzJ10gJiYgJGNoYXJzIDw9ICRw cmVmc1sncmFoX2NvbW1lbnRfc3BhbV9taW5jaGFycyddKQoJCSkKCQkJcmV0dXJuIHRydWU7 Cgl9CgovKioKCUNvdW50IHdvcmRzIGluIHN0cmluZywgcmV0dXJuIFRSVUUgaWYgZXhlZWRz IHRoZSBsaW1pdC4KCUBwYXJhbSAkc3RyaW5nIHN0cmluZyBTdHJpbmcgdG8gY291bnQKCUBy ZXR1cm4gYm9vbAoqLwoKCXByaXZhdGUgZnVuY3Rpb24gd29yZGNvdW50KCRzdHJpbmcpIHsK CQlnbG9iYWwgJHByZWZzOwoJCQoJCWlmKCEkc3RyaW5nIHx8ICghJHByZWZzWydyYWhfY29t bWVudF9zcGFtX21heHdvcmRzJ10gJiYgISRwcmVmc1sncmFoX2NvbW1lbnRfc3BhbV9taW53 b3JkcyddKSkKCQkJcmV0dXJuIGZhbHNlOwoJCQoJCSR3b3JkcyA9IGNvdW50KGV4cGxvZGUo Y2hyKDMyKSwkc3RyaW5nKSk7CgkJCgkJaWYoCgkJCSgkcHJlZnNbJ3JhaF9jb21tZW50X3Nw YW1fbWF4d29yZHMnXSAmJiAkcHJlZnNbJ3JhaF9jb21tZW50X3NwYW1fbWF4d29yZHMnXSA8 ICR3b3JkcykgfHwgCgkJCSgkcHJlZnNbJ3JhaF9jb21tZW50X3NwYW1fbWlud29yZHMnXSAm JiAkd29yZHMgPD0gJHByZWZzWydyYWhfY29tbWVudF9zcGFtX21pbndvcmRzJ10pCgkJKQoJ CQlyZXR1cm4gdHJ1ZTsKCX0KCi8qKgoJTGltaXQgdXNlcidzIGNvbW1lbnQgcG9zdGluZy4K CUByZXR1cm4gYm9vbCBUUlVFIHdoZW4gYWN0aXZpdHkgZXhjZWVkcyBxdW90YS4KKi8KCglw cml2YXRlIGZ1bmN0aW9uIGNvbW1lbnRxdW90YSgpIHsKCQlnbG9iYWwgJHRoaXNhcnRpY2xl LCAkcHJlZnM7CgkJCgkJaWYoCgkJCSEkcHJlZnNbJ3JhaF9jb21tZW50X3NwYW1fY29tbWVu dHVzZSddIHx8IAoJCQkhJHByZWZzWydyYWhfY29tbWVudF9zcGFtX2NvbW1lbnRsaW1pdCdd IHx8CgkJCSgkcHJlZnNbJ3JhaF9jb21tZW50X3NwYW1fY29tbWVudGluJ10gPT0gJ3RoaXMn ICYmICFpc3NldCgkdGhpc2FydGljbGVbJ3RoaXNpZCddKSkgfHwKCQkJKCgkaXAgPSBkb1Ns YXNoKHJlbW90ZV9hZGRyKCkpKSAmJiAhJGlwKQoJCSkKCQkJcmV0dXJuIGZhbHNlOwoJCQoJ CSRwcmVyaW9kID0gKGludCkgJHByZWZzWydyYWhfY29tbWVudF9zcGFtX2NvbW1lbnR0aW1l J107CgkJCgkJaWYoCgkJCXNhZmVfY291bnQoCgkJCQkndHhwX2Rpc2N1c3MnLAoJCQkJImlw PSckaXAnIGFuZCBVTklYX1RJTUVTVEFNUChwb3N0ZWQpID4gKFVOSVhfVElNRVNUQU1QKG5v dygpKS0kcHJlcmlvZCkiLgoJCQkJKCRwcmVmc1sncmFoX2NvbW1lbnRfc3BhbV9jb21tZW50 aW4nXSA9PSAndGhpcycgPyAiIGFuZCBwYXJlbnRpZD0nIi5kb1NsYXNoKCR0aGlzYXJ0aWNs ZVsndGhpc2lkJ10pLiInIiA6ICcnKQoJCQkpID49ICRwcmVmc1sncmFoX2NvbW1lbnRfc3Bh bV9jb21tZW50bGltaXQnXQoJCSkKCQkJcmV0dXJuIHRydWU7Cgl9CgovKioKCUNoZWNrIHR5 cGluZyBzcGVlZCwgbWFrZSBzdXJlIHRoZSB1c2VyIGZpZGxlZCB3aXRoIHRoZSBjb21tZW50 IGZvcm0uCglAcmV0dXJuIGJvb2wgVFJVRSB3aGVuIGNvbW1lbnQgaXMgY29uc2lkZXJlZCBh cyBzcGFtLgoqLwoKCXByaXZhdGUgZnVuY3Rpb24gdHlwZXNwZWVkKCkgewoJCWdsb2JhbCAk cHJlZnM7CgoJCWlmKCEkcHJlZnNbJ3JhaF9jb21tZW50X3NwYW1fdXNlX3R5cGVfZGV0ZWN0 J10pCgkJCXJldHVybiBmYWxzZTsKCQkKCQkkdHlwZV9pbnRlcnZhbCA9IChpbnQpICRwcmVm c1sncmFoX2NvbW1lbnRfc3BhbV90eXBlX2ludGVydmFsJ107CgkJJHRpbWUgPSAoaW50KSBw cygncmFoX2NvbW1lbnRfc3BhbV90aW1lJyk7CgoJCUAkYmFycmllciA9IHN0cnRvdGltZSgn bm93JyktJHR5cGVfaW50ZXJ2YWw7CgkJJG1kNSA9IG1kNSgkcHJlZnNbJ3JhaF9jb21tZW50 X3NwYW1fbm9uY2UnXS4kdGltZSk7CgoJCWlmKCRtZDUgIT0gcHMoJ3JhaF9jb21tZW50X3Nw YW1fbm9uY2UnKSB8fCAkdGltZSA+PSAkYmFycmllcikKCQkJcmV0dXJuIHRydWU7Cgl9Cgov KioKCUNoZWNrIEROUyByZWNvcmRzIG9mIHRoZSBlbWFpbCBhZGRyZXNzLgoJQHJldHVybiBi b29sIFRSVUUgd2hlbiBjb21tZW50IGlzIGNvbnNpZGVyZWQgYXMgc3BhbS4KKi8KCglwcml2 YXRlIGZ1bmN0aW9uIGVtYWlsZG5zKCkgewoJCWdsb2JhbCAkcHJlZnM7CgkJCgkJaWYoISRw cmVmc1sncmFoX2NvbW1lbnRfc3BhbV9lbWFpbGRucyddIHx8ICF0cmltKCR0aGlzLT5mb3Jt WydlbWFpbCddKSkKCQkJcmV0dXJuIGZhbHNlOwoJCQoJCSRkb21haW4gPSB0cmltKGVuZChl eHBsb2RlKCdAJywkdGhpcy0+Zm9ybVsnZW1haWwnXSkpKTsKCgkJaWYoISRkb21haW4pCgkJ CXJldHVybiB0cnVlOwoJCQoJCWlmKCFmdW5jdGlvbl9leGlzdHMoJ2NoZWNrZG5zcnInKSkK CQkJcmV0dXJuIGZhbHNlOwoJCQoJCWlmKCEoY2hlY2tkbnNycigkZG9tYWluLCdNWCcpIHx8 IGNoZWNrZG5zcnIoJGRvbWFpbiwnQScpKSkKCQkJcmV0dXJuIHRydWU7Cgl9Cn0KCi8qKgoJ U3BhbSBwcm90ZWN0aW9uIG1ldGhvZCBvcHRpb24KCUBwYXJhbSAkbmFtZSBzdHJpbmcgRmll bGQgbmFtZS4KCUBwYXJhbSAkdmFsIGludCBDdXJyZW50IHZhbHVlLgoJQHJldHVybiBzdHJp bmcgSFRNTCBzZWxlY3QgZmllbGQuCiovCgoJZnVuY3Rpb24gcmFoX2NvbW1lbnRfc3BhbV9z ZWxlY3RfbWV0aG9kKCRuYW1lLCAkdmFsKSB7CgoJCWZvcmVhY2goYXJyYXkoJ2Jsb2NrJywg J21vZGVyYXRlJywgJ3NwYW0nKSBhcyAkb3B0KQoJCQkkb3V0WyRvcHRdID0gZ1R4dCgncmFo X2NvbW1lbnRfc3BhbV9tZXRob2RfJy4kb3B0KTsKCgkJcmV0dXJuIHNlbGVjdElucHV0KCRu YW1lLCAkb3V0LCAkdmFsLCAnJywgJycsICRuYW1lKTsKCX0KCi8qKgoJQ29tbWVudCBjb3Vu dCByYW5nZSBvcHRpb24KCUBwYXJhbSAkbmFtZSBzdHJpbmcgRmllbGQgbmFtZS4KCUBwYXJh bSAkdmFsIGludCBDdXJyZW50IHZhbHVlLgoJQHJldHVybiBzdHJpbmcgSFRNTCBzZWxlY3Qg ZmllbGQuCiovCgoJZnVuY3Rpb24gcmFoX2NvbW1lbnRfc3BhbV9zZWxlY3RfY29tbWVudGlu KCRuYW1lLCAkdmFsKSB7CgoJCWZvcmVhY2goYXJyYXkoJ2FsbCcsICd0aGlzJykgYXMgJG9w dCkKCQkJJG91dFskb3B0XSA9IGdUeHQoJ3JhaF9jb21tZW50X3NwYW1fY29tbWVudGluXycu JG9wdCk7CgkJCgkJcmV0dXJuIHNlbGVjdElucHV0KCRuYW1lLCAkb3V0LCAkdmFsLCAnJywg JycsICRuYW1lKTsKCX0KCi8qKgoJVGV4dGFyZWEgZm9yIHByZWZlcmVuY2VzIHBhbmVsCglA cGFyYW0gJG5hbWUgc3RyaW5nIEZpZWxkIG5hbWUuCglAcGFyYW0gJHZhbCBpbnQgQ3VycmVu dCB2YWx1ZS4KCUByZXR1cm4gc3RyaW5nIEhUTUwgdGV4dGFyZWEuCiovCgoJZnVuY3Rpb24g cmFoX2NvbW1lbnRfc3BhbV90ZXh0YXJlYSgkbmFtZSwgJHZhbCkgewoJCXJldHVybiB0ZXh0 X2FyZWEoJG5hbWUsIDEwMCwgMzAwLCAkdmFsLCAkbmFtZSk7Cgl9CgovKioKCVJlZGlyZWN0 IHRvIHByZWZlcmVuY2VzIHBhbmVsCiovCgoJZnVuY3Rpb24gcmFoX2NvbW1lbnRfc3BhbV9w cmVmcygpIHsKCQloZWFkZXIoJ0xvY2F0aW9uOiA/ZXZlbnQ9cHJlZnMjcHJlZnMtcmFoX2Nv bW1lbnRfc3BhbV9tZXRob2QnKTsKCQllY2hvIAoJCQknPHA+Jy5uLgoJCQknCTxhIGhyZWY9 Ij9ldmVudD1wcmVmcyNwcmVmcy1yYWhfY29tbWVudF9zcGFtX21ldGhvZCI+Jy5nVHh0KCdj b250aW51ZScpLic8L2E+Jy5uLgoJCQknPC9wPic7Cgl9IjtzOjQ6InR5cGUiO3M6MToiMSI7 czo1OiJvcmRlciI7czoxOiI1IjtzOjU6ImZsYWdzIjtzOjE6IjMiO3M6MzoibWQ1IjtzOjMy OiJlYTQ3YjQ1ZjZiYTFmMzRlNTgwMTMyN2Y0MjFmZjE5OCI7czo0OiJuYW1lIjtzOjE2OiJy YWhfY29tbWVudF9zcGFtIjtzOjc6InZlcnNpb24iO3M6MzoiMC43Ijt9