# Name: rah_plugin_installer v0.4 # Type: Admin/Client side plugin # Plugin installer for rah-prefixed plugins. # 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 IjtzOjE5OiJodHRwOi8vcmFoZm9ydW0uYml6IjtzOjExOiJkZXNjcmlwdGlvbiI7czo0Mjoi UGx1Z2luIGluc3RhbGxlciBmb3IgcmFoLXByZWZpeGVkIHBsdWdpbnMuIjtzOjQ6ImhlbHAi O3M6MzU4NDoiCTxoMT5yYWhfcGx1Z2luX2luc3RhbGxlcjwvaDE+CgoJPHA+SW5zdGFsbCBh bmQgdXBkYXRlIHJhaC1wbHVnaW5zIGRpcmVjdGx5IGZyb20geW91ciA8YSBocmVmPSJodHRw Oi8vd3d3LnRleHRwYXR0ZXJuLmNvbSI+VGV4dHBhdHRlcm48L2E+IGluc3RhbGxhdGlvbi4g Q2xpY2sgYW5kIGluc3RhbGwsIHJlYWR5IHRvIGdvLjwvcD4KCgk8dWw+CgkJPGxpPlZlcnNp b246IDAuNDwvbGk+CgkJPGxpPlVwZGF0ZWQ6IDIwMTEvMDcvMTkgMTI6MjAgUE0gPHNwYW4g Y2xhc3M9ImNhcHMiPlVUQzwvc3Bhbj48L2xpPgoJPC91bD4KCgk8aDM+VGFibGUgb2YgQ29u dGVudHM8L2gzPgoKCTx1bD4KCQk8bGk+PGEgaHJlZj0iI2ludHJvLWFuZC1kZXNjcmlwdGlv biI+SW50cm8gYW5kIGRlc2NyaXB0aW9uPC9hPjwvbGk+CgkJPGxpPjxhIGhyZWY9IiNsaXN0 LW9mLWZlYXR1cmVzIj5MaXN0IG9mIGZlYXR1cmVzPC9hPjwvbGk+CgkJPGxpPjxhIGhyZWY9 IiNyZXF1aXJlbWVudHMiPlJlcXVpcmVtZW50czwvYT48L2xpPgoJCTxsaT48YSBocmVmPSIj aW5zdGFsbGF0aW9uLWFuZC11c2FnZSI+SW5zdGFsbGF0aW9uIGFuZCB1c2FnZTwvYT48L2xp PgoJPC91bD4KCgk8aDMgaWQ9Imxpc3Qtb2YtZmVhdHVyZXMiPkxpc3Qgb2YgZmVhdHVyZXM8 L2gzPgoKCTx1bD4KCQk8bGk+U2ltcGxlIGluc3RhbGw6IGp1c3QgcnVuIHRoZSBhdXRvbWF0 aWMgcGx1Z2luIGluc3RhbGwuIE5vIG5lZWQgdG8gdXBsb2FkIGFueSBmaWxlcyBub3Igc2V0 IHBlcm1pc3Npb25zLjwvbGk+CgkJPGxpPkRvd25sb2FkIGFuZCBpbnN0YWxsIHJhaC1mYW1p bHkgcGx1Z2luIGRpcmVjdGx5IGZyb20geW91ciBUZXh0cGF0dGVybiBiYWNrZW5kLjwvbGk+ CgkJPGxpPlNlcnZlciBzaWRlIGNhY2hpbmcgb2YgdGhlIHVwZGF0ZSBsaXN0LjwvbGk+CgkJ PGxpPkFkbWluIHBhbmVsIHVuZGVyIFRleHRwYXR0ZXJuICZndDsgRXh0ZW5zaW9ucyAmZ3Q7 IDxlbT5QbHVnaW4gSW5zdGFsbGVyPC9lbT4uPC9saT4KCTwvdWw+CgoJPGgzIGlkPSJyZXF1 aXJlbWVudHMiPlJlcXVpcmVtZW50czwvaDM+CgoJPHA+UmFoX3BsdWdpbl9pbnN0YWxsZXIm IzgyMTc7cyBtaW5pbXVtIHJlcXVpcmVtZW50OjwvcD4KCgk8dWw+CgkJPGxpPlRleHRwYXR0 ZXJuIDQuNC4xKzwvbGk+CgkJPGxpPjxzcGFuIGNsYXNzPSJjYXBzIj5QSFA8L3NwYW4+IDQu My4wKwoJPHVsPgoJCTxsaT48YSBocmVmPSJodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vYm9v ay5jdXJsLnBocCI+Y1VSTDwvYT4gbGlicmFyeSBvciA8YSBocmVmPSJodHRwOi8vcGhwLm5l dC9tYW51YWwvZW4vZmlsZXN5c3RlbS5jb25maWd1cmF0aW9uLnBocCI+YWxsb3dfdXJsX2Zv cGVuPC9hPiBzZXQgdHJ1ZTwvbGk+CgkJPGxpPkludGVybmV0IGNvbm5lY3Rpb24gZm9yIGNv bW11bmljYXRpb25zIHdpdGggdGhlIHNlcnZlcjwvbGk+Cgk8L3VsPjwvbGk+CgkJPGxpPk9w dGlvbmFsOiBabGliIGxpYnJhcnkuPC9saT4KCTwvdWw+CgoJPGgzIGlkPSJpbnN0YWxsYXRp b24tYW5kLXVzYWdlIj5JbnN0YWxsYXRpb24gYW5kIHVzYWdlPC9oMz4KCgk8cD5UaGUgZ2Vu ZXJhbCBiZWhhdmlvciBzdGFuZHM6IHBhc3RlIHBsdWdpbiBjb2RlIHRvIHRoZSBwbHVnaW4g aW5zdGFsbGVyIHRleHRhcmVhIGFuZCBydW4gdGhlIGF1dG9tYXRpYyBzZXR1cC4gVGhlbiBq dXN0IGFjdGl2YXRlIHRoZSBwbHVnaW4gYW5kIHlvdSBhcmUgcmVhZHkgdG8gdXNlIHRoZSBm dW5jdGlvbmFsaXRpZXMuPC9wPgoKCTxwPllvdSBjYW4gZG93bmxvYWQgYW5kIGluc3RhbGwg cmFoLXBsdWdpbnMgZnJvbSBUZXh0cGF0dGVybiAmZ3Q7IEV4dGVuc2lvbnMgJmd0OyBQbHVn aW4gSW5zdGFsbGVyLjwvcD4KCgk8aDMgaWQ9ImNoYW5nZWxvZyI+Q2hhbmdlbG9nPC9oMz4K Cgk8cD48c3Ryb25nPlZlcnNpb24gMC40PC9zdHJvbmc+PC9wPgoKCTx1bD4KCQk8bGk+Rml4 ZWQgc21hbGwgYnVnIHRoYXQgYXBwZWFyZWQgd2l0aCB0aGUgYWN0aW9uIGxpbmtzLjwvbGk+ Cgk8L3VsPgoKCTxwPjxzdHJvbmc+VmVyc2lvbiAwLjM8L3N0cm9uZz48L3A+CgoJPHVsPgoJ CTxsaT5Db21wYXRpYmlsaXR5IHdpdGggVGV4dHBhdHRlcm4gdjQuNC4xLjwvbGk+CgkJPGxp PkFkZGVkOiBTdXBwb3J0IGZvciBjVVJMIGxpYnJhcnkgYW5kIHByZWZlcnMgaXQgaWYgaW5z dGFsbGVkLiBJZiBub3QgaW5zdGFsbGVkLCB1c2VzIHJlZ3VsYXIgZmlsZSBmdW5jdGlvbnMg YXMgZmFsbGJhY2suPC9saT4KCQk8bGk+QWRkZWQ6IExvY2FsaXphdGlvbiBhbmQgbGFuZ3Vh Z2Ugc3RyaW5nIHN1cHBvcnQuIFRleHRQYWNrcyBjYW4gYmUgdXNlZCB0byB0cmFuc2xhdGUg dGhlIGFkbWluIGludGVyZmFjZS48L2xpPgoJCTxsaT5BZGRlZDogQnVpbGQgaW4gdW5pbnN0 YWxsZXIuPC9saT4KCQk8bGk+Q2hhbmdlZDogTW92ZWQgdGhlIHByZWZlcmVuY2Ugc3RyaW5n cyB0byBUZXh0cGF0dGVybiYjODIxNztzIGNvcmUgdHhwX3ByZWZzIHRhYmxlLjwvbGk+CgkJ PGxpPkNoYW5nZWQ6IEhUTUw1IHJlYWR5IG1hcmt1cCwgYWRkZWQgPGNvZGU+Jmx0O3Rib2R5 Jmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDt0aGVhZCZndDs8L2NvZGU+IGVsZW1lbnRzIHRv IHRoZSA8c3BhbiBjbGFzcz0iY2FwcyI+SFRNTDwvc3Bhbj4gdGFibGUgYW5kIHJlbW92ZWQg aW5saW5lIHN0eWxlcy48L2xpPgoJCTxsaT5JbXByb3ZlZDogTmV3IHVwZGF0ZSBmaWxlIGZv cm1hdC4gVGhlIHN5bnRheCBpcyBzaW1pbGFyIHRvIFRleHRwYXR0ZXJuJiM4MjE3O3MgbGFu Z3VhZ2UgZmlsZXMuPC9saT4KCQk8bGk+SW1wcm92ZWQ6IEFkZGl0aW9uYWwgdmFsaWRhdGlv biB3aGVuIGRvd25sb2FkaW5nIHVwZGF0ZSBmaWxlcy48L2xpPgoJCTxsaT5JbXByb3ZlZDog Tm93IHVwZGF0ZSBmaWxlcyBhcmUgcGFyc2VkIGFuZCBpbnNlcnRlZCB0byBkYXRhYmFzZSBh cyBpbmRpdmlkdWFsIHJvd3MgaW5zdGVhZCBvZiBjYWNoZWQgYW5kIHBhcnNlZCBvbiBldmVy eSBwYWdlIHJlcXVlc3QuIEFsbG93cyBmdXR1cmUgZXhwYW5zaW9ucy48L2xpPgoJCTxsaT5O b3cgcmVxdWlyZXMgVGV4dHBhdHRlcm4gdjQuNC4xIG9yIG5ld2VyLjwvbGk+Cgk8L3VsPgoK CTxwPjxzdHJvbmc+VmVyc2lvbiAwLjI8L3N0cm9uZz48L3A+CgoJPHVsPgoJCTxsaT5BZGRl ZCBtb3JlIHZhbGlkaXR5IGFuZCBlcnJvciBjaGVja3MuPC9saT4KCQk8bGk+QWRkZWQgdGlt ZW91dCBzdXBwb3J0IGZvciB1cGRhdGUgZG93bmxvYWRzLiAzIHNlY29uZHMgZm9yIHVwZGF0 ZSBjaGVja3MgYW5kIDEwIHNlY29uZHMgZm9yIGFjdHVhbCBmaWxlcy48L2xpPgoJCTxsaT5B ZGRlZCBvcHRpb24gdG8gdHVybiBhdXRvbWF0aWMtdXBkYXRlcyBvZmYuPC9saT4KCQk8bGk+ Q2xlYW5lZCB0aGUgYWRtaW4gcGFuZWwuPC9saT4KCQk8bGk+Rml4ZWQgbWFudWFsIHVwZGF0 ZSBjaGVjay48L2xpPgoJCTxsaT5GaXhlZCBjb25mbGljdHMgd2l0aCBvdGhlciBleHRlbnNp b24gdGhhdCBpbmNsdWRlZCA8Y29kZT50eHBfcGx1Z2luLnBocDwvY29kZT4uPC9saT4KCTwv dWw+CgoJPHA+PHN0cm9uZz5WZXJzaW9uIDAuMTwvc3Ryb25nPjwvcD4KCgk8dWw+CgkJPGxp PkluaXRpYWwgcmVsZWFzZS48L2xpPgoJPC91bD4iO3M6NDoiY29kZSI7czoxMzYwNjoiCSMj IyMjIyMjIyMjIyMjIyMjIwoJIwoJIwlyYWhfcGx1Z2luX2luc3RhbGxlci1wbHVnaW4gZm9y IFRleHRwYXR0ZXJuCgkjCXZlcnNpb24gMC40CgkjCWJ5IEp1a2thIFN2YWhuCgkjCWh0dHA6 Ly9yYWhmb3J1bS5iaXoKCSMKCSMJQ29weXJpZ2h0IChDKSAyMDExIEp1a2thIFN2YWhuIDxo dHRwOi8vcmFoZm9ydW0uYml6PgoJIwlMaWNlbnNlZCB1bmRlciBHTlUgR2VucmFsIFB1Ymxp YyBMaWNlbnNlIHZlcnNpb24gMgoJIwlodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3Bs LTIuMC5odG1sCgkjCgkjIyMjIyMjIyMjIyMjIyMjIyMKCglpZihAdHhwaW50ZXJmYWNlID09 ICdhZG1pbicpIHsKCQlhZGRfcHJpdnMoJ3JhaF9wbHVnaW5faW5zdGFsbGVyJywnMScpOwoJ CWFkZF9wcml2cygncGx1Z2luX3ByZWZzLnJhaF9wbHVnaW5faW5zdGFsbGVyJywnMSwyJyk7 CgkJcmVnaXN0ZXJfdGFiKCdleHRlbnNpb25zJywncmFoX3BsdWdpbl9pbnN0YWxsZXInLGdU eHQoJ3JhaF9wbHVnaW5faW5zdGFsbGVyJykgPT0gJ3JhaF9wbHVnaW5faW5zdGFsbGVyJyA/ ICdQbHVnaW4gSW5zdGFsbGVyJyA6IGdUeHQoJ3JhaF9wbHVnaW5faW5zdGFsbGVyJykpOwoJ CXJlZ2lzdGVyX2NhbGxiYWNrKCdyYWhfcGx1Z2luX2luc3RhbGxlcl9oZWFkJywnYWRtaW5f c2lkZScsJ2hlYWRfZW5kJyk7CgkJcmVnaXN0ZXJfY2FsbGJhY2soJ3JhaF9wbHVnaW5faW5z dGFsbGVyJywncmFoX3BsdWdpbl9pbnN0YWxsZXInKTsKCQlyZWdpc3Rlcl9jYWxsYmFjaygn cmFoX3BsdWdpbl9pbnN0YWxsZXJfb3B0aW9ucycsJ3BsdWdpbl9wcmVmcy5yYWhfcGx1Z2lu X2luc3RhbGxlcicpOwoJCXJlZ2lzdGVyX2NhbGxiYWNrKCdyYWhfcGx1Z2luX2luc3RhbGxl cl9pbnN0YWxsJywncGx1Z2luX2xpZmVjeWNsZS5yYWhfcGx1Z2luX2luc3RhbGxlcicpOwoJ fQoKLyoqCglJbnN0YWxsZXIgc2NyaXB0CglAcGFyYW0gJGV2ZW50IHN0cmluZyBBZG1pbi1z aWRlIGV2ZW50LgoJQHBhcmFtICRzdGVwIHN0cmluZyBBZG1pbi1zaWRlLCBwbHVnaW4tbGlm ZWN5Y2xlIHN0ZXAuCiovCgoJZnVuY3Rpb24gcmFoX3BsdWdpbl9pbnN0YWxsZXJfaW5zdGFs bCgkZXZlbnQ9JycsICRzdGVwPScnKSB7CgkJCgkJLyoKCQkJVW5pbnN0YWxsIGlmIHVuaW5z dGFsbGluZyB0aGUKCQkJcGx1Z2luCgkJKi8KCQkKCQlpZigkc3RlcCA9PSAnZGVsZXRlZCcp IHsKCQkJCgkJCUBzYWZlX3F1ZXJ5KAoJCQkJJ0RST1AgVEFCTEUgSUYgRVhJU1RTICcuc2Fm ZV9wZngoJ3JhaF9wbHVnaW5faW5zdGFsbGVyX2RlZicpCgkJCSk7CgkJCQoJCQlzYWZlX2Rl bGV0ZSgKCQkJCSd0eHBfcHJlZnMnLAoJCQkJIm5hbWUgbGlrZSAncmFoX3BsdWdpbl9pbnN0 YWxsZXJfJSciCgkJCSk7CgkJCQoJCQlyZXR1cm47CgkJfQoJCQoJCWdsb2JhbCAkcHJlZnMs ICR0ZXh0YXJyYXk7CgkJCgkJLyoKCQkJTWFrZSBzdXJlIGxhbmd1YWdlIHN0cmluZ3MgYXJl IHNldAoJCSovCgkJCgkJZm9yZWFjaCgKCQkJYXJyYXkoCgkJCQknJyA9PiAnUGx1Z2luIGlu c3RhbGxlcicsCgkJCQknY2hlY2tfZm9yX3VwZGF0ZXMnID0+ICdDaGVjayBmb3IgdXBkYXRl cycsCgkJCQknbmFtZScgPT4gJ05hbWUnLAoJCQkJJ3ZlcnNpb24nID0+ICdWZXJzaW9uJywK CQkJCSdkZXNjcmlwdGlvbicgPT4gJ0Rlc2NyaXB0aW9uJywKCQkJCSdpbnN0YWxsZWRfdmVy c2lvbicgPT4gJ0luc3RhbGxlZCB2ZXJzaW9uJywKCQkJCSdub19wbHVnaW5zJyA9PiAnTm8g cGx1Z2luIHVwZGF0ZSBkZWZpbml0aW9ucyBkb3dubG9hZGVkIHlldC4nLAoJCQkJJ2FscmVh ZHlfdXBfdG9fZGF0ZScgPT4gJ1BsdWdpbiB1cGRhdGUgZGVmaW5pdGlvbnMgYXJlIHVwLXRv LWRhdGUuJywKCQkJCSdhbHJlYWR5X2luc3RhbGxlZCcgPT4gJ1BsdWdpbiBpcyBhbHJlYWR5 IGluc3RhbGxlZC4nLAoJCQkJJ2luY29ycmVjdF9zZWxlY3Rpb24nID0+ICdJbmNvcnJlY3Qg c2VsZWN0aW9uLicsCgkJCQknb3Blbl9wb3J0c19vcl9pbnN0YWxsX2N1cmwnID0+ICdDYW4g bm90IGNvbm5lY3QgdG8gc2VydmVyIGR1ZSB0byB1bnN1cHBvcnRlZCBzZXJ2ZXIgY29uZmln dXJhdGlvbi4gUGxlYXNlIGVpdGhlciBpbnN0YWxsIGNVUkwgb3Igc2V0IGFsbG93X3VybF9m b3BlbiBkaXJlY3RpdmUgaW4gUEhQIGNvbmZpZ3VyYXRpb24gZmlsZSB0byB0cnVlLicsCgkJ CQknZG93bmxvYWRpbmdfcGx1Z2luX2ZhaWxlZCcgPT4gJ0Rvd25sb2FkaW5nIHBsdWdpbiBm YWlsZWQnLAoJCQkJJ2luX3BsdWdpbl9jYWNoZScgPT4gJ0luaXRpYWxpemVkIGZyb20gcGx1 Z2luIGNhY2hlJywKCQkJCSd1cGRhdGUnID0+ICdVcGRhdGUnLAoJCQkJJ2Rvd25sb2FkJyA9 PiAnRG93bmxvYWQnLAoJCQkJJ2luc3RhbGwnID0+ICdJbnN0YWxsJywKCQkJCSdkZWZpbml0 aW9uX3VwZGF0ZXNfY2hlY2tlZCcgPT4gJ05ldyBwbHVnaW4gdXBkYXRlIGRlZmluaXRpb25z IGRvd25sb2FkZWQgc3VjY2Vzc2Z1bGx5LicKCQkJKSBhcyAkc3RyaW5nID0+ICR0cmFuc2xh dGlvbgoJCSkgewoJCQkkc3RyaW5nID0gJ3JhaF9wbHVnaW5faW5zdGFsbGVyJyAuICgkc3Ry aW5nID8gJ18nIC4gJHN0cmluZyA6ICcnKTsKCQkJCgkJCWlmKCFpc3NldCgkdGV4dGFycmF5 WyRzdHJpbmddKSkKCQkJCSR0ZXh0YXJyYXlbJHN0cmluZ10gPSAkdHJhbnNsYXRpb247CgkJ fQoJCQkJCgkJJHZlcnNpb24gPSAnMC40JzsKCQkKCQkkY3VycmVudCA9IAoJCQlpc3NldCgk cHJlZnNbJ3JhaF9wbHVnaW5faW5zdGFsbGVyX3ZlcnNpb24nXSkgPwoJCQkkcHJlZnNbJ3Jh aF9wbHVnaW5faW5zdGFsbGVyX3ZlcnNpb24nXSA6ICcnOwoJCQoJCWlmKCRjdXJyZW50ID09 ICR2ZXJzaW9uKQoJCQlyZXR1cm47CgkJCgkJaWYoISRjdXJyZW50KQoJCQlAc2FmZV9xdWVy eSgnRFJPUCBUQUJMRSBJRiBFWElTVFMgJy5zYWZlX3BmeCgncmFoX3BsdWdpbl9pbnN0YWxs ZXInKSk7CgkJCgkJLyoKCQkJU3RvcmVzIHBsdWdpbidzIHZlcnNpb24gYW5kIHVwZGF0ZSBk ZXRhaWxzLgoJCQkKCQkJKiBuYW1lOiBQbHVnaW4ncyBuYW1lLiBQcmltYXJ5IGtleS4KCQkJ KiBhdXRob3I6IEF1dGhvcidzIG5hbWUuCgkJCSogYXV0aG9yX3VyaTogQXV0aG9yJ3Mgd2Vi c2l0ZSBhZGRyZXNzLgoJCQkqIHZlcnNpb246IFBsdWdpbidzIGxhdGVzdCB2ZXJzaW9uIG51 bWJlci4KCQkJKiBkZXNjcmlwdGlvbjogUGx1Z2luJ3MgZGVzY3JpcHRpb24uCgkJCSogaGVs cDogQ2FjaGVkIGhlbHAgZmlsZS4KCQkJKiB0eXBlOiBQbHVnaW4ncyB0eXBlLgoJCQkqIG1k NV9jaGVja3N1bTogTUQ1IGNoZWNrc3VtIGZvciBpbnN0YWxsZXIgZmlsZS4KCQkqLwoJCQoJ CXNhZmVfcXVlcnkoCgkJCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAiLnNhZmVfcGZ4 KCdyYWhfcGx1Z2luX2luc3RhbGxlcl9kZWYnKS4iICgKCQkJCWBuYW1lYCB2YXJjaGFyKDY0 KSBOT1QgTlVMTCBkZWZhdWx0ICcnLAoJCQkJYGF1dGhvcmAgdmFyY2hhcigxMjgpIE5PVCBO VUxMIGRlZmF1bHQgJycsCgkJCQlgYXV0aG9yX3VyaWAgdmFyY2hhcigxMjgpIE5PVCBOVUxM IGRlZmF1bHQgJycsCgkJCQlgdmVyc2lvbmAgdmFyY2hhcigxMCkgTk9UIE5VTEwgZGVmYXVs dCAnMS4wJywKCQkJCWBkZXNjcmlwdGlvbmAgdGV4dCBOT1QgTlVMTCwKCQkJCWBoZWxwYCB0 ZXh0IE5PVCBOVUxMLAoJCQkJYHR5cGVgIGludCgyKSBOT1QgTlVMTCBkZWZhdWx0IDAsCgkJ CQlgbWQ1X2NoZWNrc3VtYCB2YXJjaGFyKDMyKSBOT1QgTlVMTCBkZWZhdWx0ICcnLAoJCQkJ UFJJTUFSWSBLRVkoYG5hbWVgKQoJCQkpIFBBQ0tfS0VZUz0xIENIQVJTRVQ9dXRmOCIKCQkp OwoJCQoJCS8qCgkJCUFkZCBwcmVmZXJlbmNlcyBzdHJpbmdzCgkJKi8KCQkKCQlmb3JlYWNo KAoJCQlhcnJheSgKCQkJCSd2ZXJzaW9uJyA9PiAkdmVyc2lvbiwKCQkJCSd1cGRhdGVkJyA9 PiAwLAoJCQkJJ2NoZWNrc3VtJyA9PiAnJwoJCQkpIGFzICRuYW1lID0+ICR2YWx1ZQoJCSkg ewoJCQlpZighaXNzZXQoJHByZWZzWydyYWhfcGx1Z2luX2luc3RhbGxlcl8nLiRuYW1lXSkg fHwgJG5hbWUgPT0gJ3ZlcnNpb24nKSB7CgkJCQlzZXRfcHJlZigncmFoX3BsdWdpbl9pbnN0 YWxsZXJfJy4kbmFtZSwkdmFsdWUsJ3JhaF9waW5zJywyLCcnLDApOwoJCQkJJHByZWZzWydy YWhfcGx1Z2luX2luc3RhbGxlcl8nLiRuYW1lXSA9ICR2YWx1ZTsKCQkJfQoJCX0KCX0KCi8q KgoJRGVsaXZlcnMgdGhlIHBhbmVzCiovCgoJZnVuY3Rpb24gcmFoX3BsdWdpbl9pbnN0YWxs ZXIoKSB7CgkJcmVxdWlyZV9wcml2cygncmFoX3BsdWdpbl9pbnN0YWxsZXInKTsKCQlyZXF1 aXJlX3ByaXZzKCdwbHVnaW4nKTsKCQkKCQlyYWhfcGx1Z2luX2luc3RhbGxlcl9pbnN0YWxs KCk7CgkJCgkJZ2xvYmFsICRzdGVwOwoJCQoJCSRzdGVwcyA9IAoJCQlhcnJheSgKCQkJCSdk b3dubG9hZCcgPT4gdHJ1ZSwKCQkJCSd1cGRhdGUnID0+IHRydWUsCgkJCSk7CgkJCgkJaWYo ISRzdGVwIHx8ICFib3VuY2VyKCRzdGVwLCAkc3RlcHMpKQoJCQkkc3RlcCA9ICdsaXN0JzsK CQkKCQkkZnVuYyA9ICdyYWhfcGx1Z2luX2luc3RhbGxlcl8nIC4gJHN0ZXA7CgkJJGZ1bmMo KTsKCX0KCi8qKgoJVGhlIG1haW4gcGFuZTsgdGhlIHBsdWdpbiBsaXN0aW5nCglAcGFyYW0g JG1lc3NhZ2Ugc3RyaW5nIEFjdGl2aXR5IG1lc3NhZ2UuCglAcGFyYW0gJGNoZWNrIGJvb2wg Q2hlY2sgZm9yIHVwZGF0ZXMuCiovCgoJZnVuY3Rpb24gcmFoX3BsdWdpbl9pbnN0YWxsZXJf bGlzdCgkbWVzc2FnZT0nJywkY2hlY2s9ZmFsc2UpIHsKCQkKCQlnbG9iYWwgJGV2ZW50OwoJ CQoJCXBhZ2V0b3AoJ1BsdWdpbiBJbnN0YWxsZXInLCRtZXNzYWdlKTsKCQkKCQlpZigoJHVw ZGF0ZXMgPSByYWhfcGx1Z2luX2luc3RhbGxlcl9jaGVjaygkY2hlY2spKSAmJiAkdXBkYXRl cykKCQkJJHVwZGF0ZXMgPSBnVHh0KCdyYWhfcGx1Z2luX2luc3RhbGxlcl8nIC4gJHVwZGF0 ZXMpOwoJCQoJCSRpbnN0YWxsZWQgPSByYWhfcGx1Z2luX2luc3RhbGxlcl9pbnN0YWxsZWQo KTsKCQkKCQkkcnMgPSAKCQkJc2FmZV9yb3dzKAoJCQkJJ25hbWUsIHZlcnNpb24sIGRlc2Ny aXB0aW9uJywKCQkJCSdyYWhfcGx1Z2luX2luc3RhbGxlcl9kZWYnLAoJCQkJJzE9MScKCQkJ KTsKCQkKCQkkb3V0W10gPQoJCQoJCQknCTxkaXYgaWQ9InJhaF9wbHVnaW5faW5zdGFsbGVy X2NvbnRhaW5lciIgY2xhc3M9InJhaF91aV9jb250YWluZXIiPicubi4KCQkJCgkJCScJCTxw IGNsYXNzPSJyYWhfdWlfbmF2Ij4nLgoJCQkJCQknPHNwYW4gY2xhc3M9InJhaF91aV9zZXAi PiYjMTg3Ozwvc3Bhbj4gJy4KCQkJCQkJJzxhIGlkPSJyYWhfcGx1Z2luX2luc3RhbGxlcl91 cGRhdGUiIGhyZWY9Ij9ldmVudD0nLiRldmVudC4nJmFtcDtzdGVwPXVwZGF0ZSZhbXA7X3R4 cF90b2tlbj0nLmZvcm1fdG9rZW4oKS4nIj4nLgoJCQkJCQkJZ1R4dCgncmFoX3BsdWdpbl9p bnN0YWxsZXJfY2hlY2tfZm9yX3VwZGF0ZXMnKS4KCQkJCQkJJzwvYT4nLgoJCQknCQk8L3A+ Jy4KCQkJCgkJCSgkdXBkYXRlcyAmJiAkcnMgPyAnCQk8cCBpZD0id2FybmluZyI+Jy4kdXBk YXRlcy4nPC9wPicgOiAnJykuCgkJCQoJCQknCQk8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNl bGxwYWRkaW5nPSIwIiBpZD0ibGlzdCI+Jy5uLgoJCQknCQkJPHRoZWFkPicubi4KCQkJJwkJ CQk8dHI+Jy5uLgoJCQknCQkJCQk8dGg+Jy5nVHh0KCdyYWhfcGx1Z2luX2luc3RhbGxlcl9u YW1lJykuJzwvdGg+Jy5uLgoJCQknCQkJCQk8dGg+Jy5nVHh0KCdyYWhfcGx1Z2luX2luc3Rh bGxlcl92ZXJzaW9uJykuJzwvdGg+Jy5uLgoJCQknCQkJCQk8dGg+Jy5nVHh0KCdyYWhfcGx1 Z2luX2luc3RhbGxlcl9kZXNjcmlwdGlvbicpLic8L3RoPicubi4KCQkJJwkJCQkJPHRoPicu Z1R4dCgncmFoX3BsdWdpbl9pbnN0YWxsZXJfaW5zdGFsbGVkX3ZlcnNpb24nKS4nPC90aD4n Lm4uCgkJCScJCQkJCTx0aD4mIzE2MDs8L3RoPicubi4KCQkJJwkJCQk8L3RyPicubi4KCQkJ JwkJCTwvdGhlYWQ+Jy5uLgoJCQknCQkJPHRib2R5PicubjsKCQkKCQlpZigkcnMpIHsKCQkJ Zm9yZWFjaCgkcnMgYXMgJGEpIHsKCgkJCQkkYWN0aW9uID0gJ2luc3RhbGwnOwoJCQkJJGlu cyA9ICcmIzE2MDsnOwoJCQkgCQoJCQkgCWlmKGlzc2V0KCRpbnN0YWxsZWRbJGFbJ25hbWUn XV0pKSB7CgkJCSAJCSRpbnMgPSAkaW5zdGFsbGVkWyAkYVsnbmFtZSddXTsKCQkJIAkJJGFj dGlvbiA9ICRpbnMgPT0gJGFbJ3ZlcnNpb24nXSA/ICcnIDogJ3VwZGF0ZSc7CgkJCSAJfQoJ CQkKCQkJCSRvdXRbXSA9IAoJCQkJCScJCQkJPHRyPicubi4KCQkJCQknCQkJCQk8dGQ+Jy5o dG1sc3BlY2lhbGNoYXJzKCRhWyduYW1lJ10pLic8L3RkPicubi4KCQkJCQknCQkJCQk8dGQ+ Jy5odG1sc3BlY2lhbGNoYXJzKCRhWyd2ZXJzaW9uJ10pLic8L3RkPicubi4KCQkJCQknCQkJ CQk8dGQ+Jy5odG1sc3BlY2lhbGNoYXJzKCRhWydkZXNjcmlwdGlvbiddKS4nPC90ZD4nLm4u CgkJCQkJJwkJCQkJPHRkPicuJGlucy4nPC90ZD4nLm4uCgkJCQkJJwkJCQkJPHRkPicuKCRh Y3Rpb24gPyAnPGEgaHJlZj0iP2V2ZW50PScuJGV2ZW50LicmYW1wO3N0ZXA9ZG93bmxvYWQm YW1wO25hbWU9Jy4kYVsnbmFtZSddLicmYW1wO190eHBfdG9rZW49Jy5mb3JtX3Rva2VuKCku JyI+Jy5nVHh0KCdyYWhfcGx1Z2luX2luc3RhbGxlcl8nLiRhY3Rpb24pLic8L2E+JyA6ICcm IzE2MDsnKS4nPC90ZD4nLm4uCgkJCQkJJwkJCQk8L3RyPicubjsKCQkJCX0KCQl9IGVsc2UK CQkJJG91dFtdID0KCQkJCScJCQk8dHI+Jy5uLgoJCQkJJwkJCQk8dGQgY29sc3Bhbj0iNSI+ Jy4oJHVwZGF0ZXMgPyAkdXBkYXRlcyA6IGdUeHQoJ3JhaF9wbHVnaW5faW5zdGFsbGVyX25v X3BsdWdpbnMnKSkuJzwvdGQ+Jy5uLgoJCQkJJwkJCTwvdHI+Jy5uOwoJCQoJCSRvdXRbXSA9 IAoJCQkKCQkJJwkJCTwvdGJvZHk+Jy5uLgoJCQknCQk8L3RhYmxlPicubi4KCQkJJwk8L2Rp dj4nLm47CgkJCQoJCWVjaG8gaW1wbG9kZSgnJywgJG91dCk7Cgl9CgovKioKCUdldCBsaXN0 IG9mIGluc3RhbGxlZCBwbHVnaW5zCiovCgoJZnVuY3Rpb24gcmFoX3BsdWdpbl9pbnN0YWxs ZXJfaW5zdGFsbGVkKCkgewoKCQlzdGF0aWMgJGNhY2hlID0gTlVMTDsKCQkKCQlpZigkY2Fj aGUgIT09IE5VTEwpIHsKCQkJcmV0dXJuICRjYWNoZTsKCQl9CgkJCgkJJGNhY2hlID0gYXJy YXkoKTsKCQkJCgkJJHJzID0gCgkJCXNhZmVfcm93cygKCQkJCSduYW1lLCB2ZXJzaW9uJywK CQkJCSd0eHBfcGx1Z2luJywKCQkJCScxPTEnCgkJCSk7CgkJCQoJCWZvcmVhY2goJHJzIGFz ICRhKQoJCQkkY2FjaGVbJGFbJ25hbWUnXV0gPSAkYVsndmVyc2lvbiddOwoJCQoJCXJldHVy biAkY2FjaGU7Cgl9CgovKioKCUNoZWNrcyBmb3IgdXBkYXRlcwoJQHBhcmFtICRtYW51YWwg Ym9vbCBJZiB1c2VyLWxhdW5jaGVkIHVwZGF0ZSBjaGVjaywgb3IgYXV0by4KCUByZXR1cm4g c3RyaW5nIFJldHVybmVkIG1lc3NhZ2UgYXMgYSBsYW5ndWFnZSBzdHJpbmcuCiovCgoJZnVu Y3Rpb24gcmFoX3BsdWdpbl9pbnN0YWxsZXJfY2hlY2soJG1hbnVhbD1mYWxzZSkgewoJCQoJ CWdsb2JhbCAkcHJlZnM7CgkJCgkJQCRkaXNhYmxlZCA9ICFpbmlfZ2V0KCdhbGxvd191cmxf Zm9wZW4nKSAmJiAhZnVuY3Rpb25fZXhpc3RzKCdjdXJsX2luaXQnKTsKCQkKCQlpZigkZGlz YWJsZWQpCgkJCXJldHVybiAnb3Blbl9wb3J0c19vcl9pbnN0YWxsX2N1cmwnOwoJCQoJCSRu b3cgPSBzdHJ0b3RpbWUoJ25vdycpOwoJCQoJCSR3YWl0ID0gISRtYW51YWwgPyA2MDQ4MDAg OiAxODAwOwoJCQoJCWlmKCRwcmVmc1sncmFoX3BsdWdpbl9pbnN0YWxsZXJfdXBkYXRlZCdd ICsgJHdhaXQgPj0gJG5vdykgewoJCQlyZXR1cm4gJG1hbnVhbCA/ICdhbHJlYWR5X3VwX3Rv X2RhdGUnIDogJyc7CgkJfQoJCQoJCSRkZWYgPSByYWhfcGx1Z2luX2luc3RhbGxlcl9mZ2V0 KCdodHRwOi8vcmFoZm9ydW0uYml6Lz9yYWhfcGx1Z2luX2luc3RhbGxlcj0xJnJhaF92ZXJz aW9uPTInICwgJG1hbnVhbCA/IDMwIDogNSk7CgkJCgkJLyoKCQkJVXBkYXRlIHRoZSBsYXN0 LXVwZGF0ZSB0aW1lc3RhbXAgaWYgd2UgZ290IHBheWxvYWQKCQkqLwoJCQoJCWlmKCRkZWYp IHsKCQkJCgkJCXNhZmVfdXBkYXRlKAoJCQkJJ3R4cF9wcmVmcycsCgkJCQkidmFsPSckbm93 JyIsCgkJCQkibmFtZT0ncmFoX3BsdWdpbl9pbnN0YWxsZXJfdXBkYXRlZCciCgkJCSk7CgkJ CgkJCSRwcmVmc1sncmFoX3BsdWdpbl9pbnN0YWxsZXJfdXBkYXRlZCddID0gJG5vdzsKCQl9 CgkJCgkJaWYoISRkZWYgfHwgIXByZWdfbWF0Y2goJyFeW2EtekEtWjAtOS8rXSo9ezAsMn0k IScsJGRlZikpIHsKCQkJcmV0dXJuICdjb3VsZF9ub3RfZmV0Y2gnOwoJCX0KCQkKCQkkZGVm ID0gYmFzZTY0X2RlY29kZSgkZGVmKTsKCQkkbWQ1ID0gbWQ1KCRkZWYpOwoJCQoJCWlmKCRt ZDUgPT0gJHByZWZzWydyYWhfcGx1Z2luX2luc3RhbGxlcl9jaGVja3N1bSddKQoJCQlyZXR1 cm4gJ2FscmVhZHlfdXBfdG9fZGF0ZSc7CgkJCgkJc2FmZV91cGRhdGUoCgkJCSd0eHBfcHJl ZnMnLAoJCQkidmFsPSckbWQ1JyIsCgkJCSJuYW1lPSdyYWhfcGx1Z2luX2luc3RhbGxlcl9j aGVja3N1bSciCgkJKTsKCQkKCQlyYWhfcGx1Z2luX2luc3RhbGxlcl9pbXBvcnQocmFoX3Bs dWdpbl9pbnN0YWxsZXJfcGFyc2VyKCRkZWYpKTsKCQkKCQlyZXR1cm4gJ2RlZmluaXRpb25f dXBkYXRlc19jaGVja2VkJzsKCX0KCi8qKgoJRmlyZSBtYW51YWwgbGlzdGluZyByZWZyZXNo CiovCgoJZnVuY3Rpb24gcmFoX3BsdWdpbl9pbnN0YWxsZXJfdXBkYXRlKCkgewoJCXJhaF9w bHVnaW5faW5zdGFsbGVyX2xpc3QoJycsdHJ1ZSk7Cgl9CgovKioKCVBhcnNlcyB1cGRhdGUg ZmlsZQoJQHBhcmFtICRmaWxlIHN0cmluZyBGaWxlIHRvIHBhcnNlLgoJQHJldHVybiBhcnJh eQoqLwoKCWZ1bmN0aW9uIHJhaF9wbHVnaW5faW5zdGFsbGVyX3BhcnNlcigkZmlsZSkgewoK CQkkZmlsZSA9IGV4cGxvZGUobiwgJGZpbGUpOwoJCSRwbHVnaW4gPSAnJzsKCQkkb3V0ID0g YXJyYXkoKTsKCgkJZm9yZWFjaCgkZmlsZSBhcyAkbGluZSkgewoJCQkKCQkJJGxpbmUgPSB0 cmltKCRsaW5lKTsKCQkJCgkJCWlmKCEkbGluZSB8fCBzdHJwb3MoJGxpbmUsJyMnKSA9PT0g MCkKCQkJCWNvbnRpbnVlOwoKCQkJLyoKCQkJCVNldCB0aGUgcGx1Z2luIG5hbWUKCQkJKi8K CQkJCgkJCWlmKHN0cnBvcygkbGluZSwnQCcpID09PSAwICYmIHN0cnBvcygkbGluZSwnXycp ID09IDQpIHsKCQkJCSRwbHVnaW4gPSBzdWJzdHIoJGxpbmUsIDEpOwoJCQkJY29udGludWU7 CgkJCX0KCQkJCgkJCWlmKCEkcGx1Z2luKQoJCQkJY29udGludWU7CgkJCQoJCQlpZighcHJl Z19tYXRjaCgnL14oXHcrKVxzKj0+XHMqKC4rKSQvJywgJGxpbmUsICRtKSkKCQkJCWNvbnRp bnVlOwoJCQkJCgkJCWlmKGVtcHR5KCRtWzFdKSB8fCBlbXB0eSgkbVsyXSkpCgkJCQljb250 aW51ZTsKCQkJCQkKCQkJJG91dFskcGx1Z2luXVskbVsxXV0gPSAkbVsyXTsKCQl9CgkJCgkJ cmV0dXJuICRvdXQ7Cgl9CgkKLyoqCglJbXBvcnRzIHVwZGF0ZSBmaWxlIHRvIHRoZSBkYXRh YmFzZQoJQHBhcmFtICRpbmMgYXJyYXkgRGVmaW5pdGlvbnMgdG8gaW1wb3J0LgoJQHJldHVy biBOb3RoaW5nLgoqLwoKCWZ1bmN0aW9uIHJhaF9wbHVnaW5faW5zdGFsbGVyX2ltcG9ydCgk aW5jKSB7CgkJCgkJJHBsdWdpbiA9IGFycmF5KCk7CgkJCgkJJHJzID0gCgkJCXNhZmVfcm93 cygKCQkJCSduYW1lLCB2ZXJzaW9uJywKCQkJCSdyYWhfcGx1Z2luX2luc3RhbGxlcl9kZWYn LAoJCQkJJzE9MScKCQkJKTsKCQkKCQlmb3JlYWNoKCRycyBhcyAkYSkKCQkJJHBsdWdpblsk YVsnbmFtZSddXSA9ICRhWyd2ZXJzaW9uJ107CgkJCgkJZm9yZWFjaCgkaW5jIGFzICRuYW1l ID0+ICRhKSB7CgkJCQoJCQlpZighaXNzZXQoJGFbJ2Rlc2NyaXB0aW9uJ10pIHx8ICFpc3Nl dCgkYVsndmVyc2lvbiddKSkKCQkJCWNvbnRpbnVlOwoJCQkKCQkJaWYoIWlzc2V0KCRwbHVn aW5bJG5hbWVdKSkgewoJCQkJCgkJCQlzYWZlX2luc2VydCgKCQkJCQkncmFoX3BsdWdpbl9p bnN0YWxsZXJfZGVmJywKCQkJCQkibmFtZT0nIi5kb1NsYXNoKCRuYW1lKS4iJywKCQkJCQl2 ZXJzaW9uPSciLmRvU2xhc2goJGFbJ3ZlcnNpb24nXSkuIicsCgkJCQkJZGVzY3JpcHRpb249 JyIuZG9TbGFzaCgkYVsnZGVzY3JpcHRpb24nXSkuIiciCgkJCQkpOwoJCQkJCQoJCQl9CgkJ CWVsc2UgaWYoJHBsdWdpblskbmFtZV0gIT0gJGFbJ3ZlcnNpb24nXSkgewoJCQkKCQkJCXNh ZmVfdXBkYXRlKAoJCQkJCSdyYWhfcGx1Z2luX2luc3RhbGxlcl9kZWYnLAoJCQkJCSJ2ZXJz aW9uPSciLmRvU2xhc2goJGFbJ3ZlcnNpb24nXSkuIicsCgkJCQkJZGVzY3JpcHRpb249JyIu ZG9TbGFzaCgkYVsnZGVzY3JpcHRpb24nXSkuIiciLAoJCQkJCSJuYW1lPSciLmRvU2xhc2go JG5hbWUpLiInIgoJCQkJKTsKCQkJCQoJCQl9CgkJCQoJCQl1bnNldCgkcGx1Z2luWyRuYW1l XSk7CgkJfQoJCQoJCWlmKCFlbXB0eSgkcGx1Z2luKSAmJiBpc19hcnJheSgkcGx1Z2luKSkg ewoJCQkKCQkJZm9yZWFjaCgkcGx1Z2luIGFzICRuYW1lID0+ICR2ZXJzaW9uKQoJCQkJJHJl bW92ZVtdID0gIiciLmRvU2xhc2goJG5hbWUpLiInIjsKCQkJCQoJCQlzYWZlX2RlbGV0ZSgK CQkJCSdyYWhfcGx1Z2luX2luc3RhbGxlcl9kZWYnLAoJCQkJJ25hbWUgaW4oJy4gaW1wbG9k ZSgnLCcsICRyZW1vdmUpIC4gJyknCgkJCSk7CgkJCQoJCX0KCQkKCX0KCi8qKgoJRG93bmxv YWQgdGhlIHBsdWdpbiBjb2RlIGFuZCBydW4gVGV4dHBhdHRlcm4ncyBwbHVnaW4gaW5zdGFs bGVyCiovCgoJZnVuY3Rpb24gcmFoX3BsdWdpbl9pbnN0YWxsZXJfZG93bmxvYWQoKSB7CgkJ CgkJQCRkaXNhYmxlZCA9ICFpbmlfZ2V0KCdhbGxvd191cmxfZm9wZW4nKSAmJiAhZnVuY3Rp b25fZXhpc3RzKCdjdXJsX2luaXQnKTsKCQkKCQlpZigkZGlzYWJsZWQpIHsKCQkJcmFoX3Bs dWdpbl9pbnN0YWxsZXJfbGlzdCgnb3Blbl9wb3J0c19vcl9pbnN0YWxsX2N1cmwnKTsKCQkJ cmV0dXJuOwoJCX0KCQkKCQkkbmFtZSA9IGdwcygnbmFtZScpOwoJCQoJCSRkZWYgPSAKCQkJ c2FmZV9yb3coCgkJCQknbmFtZSwgdmVyc2lvbicsCgkJCQkncmFoX3BsdWdpbl9pbnN0YWxs ZXJfZGVmJywKCQkJCSJuYW1lPSciLmRvU2xhc2goJG5hbWUpLiInIExJTUlUIDAsIDEiCgkJ CSk7CgkJCgkJaWYoISRuYW1lIHx8ICEkZGVmKSB7CgkJCXJhaF9wbHVnaW5faW5zdGFsbGVy X2xpc3QoJ3JhaF9wbHVnaW5faW5zdGFsbGVyX2luY29ycmVjdF9zZWxlY3Rpb24nKTsKCQkJ cmV0dXJuOwoJCX0KCQkKCQlpZihmZXRjaCgndmVyc2lvbicsICd0eHBfcGx1Z2luJywgJ25h bWUnLCAkbmFtZSkgPT0gJGRlZlsndmVyc2lvbiddKSB7CgkJCXJhaF9wbHVnaW5faW5zdGFs bGVyX2xpc3QoJ3JhaF9wbHVnaW5faW5zdGFsbGVyX2FscmVhZHlfaW5zdGFsbGVkJyk7CgkJ CXJldHVybjsKCQl9CgkJCgkJJHVybCA9ICdodHRwOi8vcmFoZm9ydW0uYml6Lz9yYWhfcGx1 Z2luX2Rvd25sb2FkPScuJG5hbWU7CgkJJHVybCA9IGZ1bmN0aW9uX2V4aXN0cygnZ3plbmNv ZGUnKSA/ICR1cmwgLiAnJnJhaF90eXBlPXppcCcgOiAkdXJsOwoJCQkKCQkkcGx1Z2luID0g cmFoX3BsdWdpbl9pbnN0YWxsZXJfZmdldCgkdXJsKTsKCQkKCQlpZihlbXB0eSgkcGx1Z2lu KSkgewoJCQlyYWhfcGx1Z2luX2luc3RhbGxlcl9saXN0KCdyYWhfcGx1Z2luX2luc3RhbGxl cl9kb3dubG9hZGluZ19wbHVnaW5fZmFpbGVkJyk7CgkJCXJldHVybjsKCQl9CgoJCSRfUE9T VFsnaW5zdGFsbF9uZXcnXSA9ICdVcGxvYWQnOwkKCQkkX1BPU1RbJ3BsdWdpbiddID0gJHBs dWdpbjsKCQkkX1BPU1RbJ3BsdWdpbjY0J10gPSAkcGx1Z2luOwoJCSRfUE9TVFsnZXZlbnQn XSA9ICdwbHVnaW4nOwoJCSRfUE9TVFsnc3RlcCddID0gJ3BsdWdpbl92ZXJpZnknOwoJCSRf UE9TVFsnX3R4cF90b2tlbiddID0gZm9ybV90b2tlbigpOwoJCQoJCSRzdGVwID0gJ3BsdWdp bl92ZXJpZnknOwoJCSRldmVudCA9ICdwbHVnaW4nOwoJCQoJCWluY2x1ZGVfb25jZSB0eHBh dGguJy9pbmNsdWRlL3R4cF9wbHVnaW4ucGhwJzsKCQlleGl0OwoJfQoKLyoqCglEb3dubG9h ZHMgcmVtb3RlIGZpbGUKCUBwYXJhbSAkdXJsIHN0cmluZyBVUkwgdG8gZG93bmxvYWQuCglA cGFyYW0gJHRpbWVvdXQgaW50IENvbm5lY3Rpb24gdGltZW91dCBpbiBzZWNvbmRzLgoJQHJl dHVybiBzdHJpbmcgQ29udGVudHMgb2YgdGhlIGZpbGUuIEZhbHNlIG9uIGZhaWx1cmUuCiov CgoJZnVuY3Rpb24gcmFoX3BsdWdpbl9pbnN0YWxsZXJfZmdldCgkdXJsLCAkdGltZW91dD0x MCkgewoJCQoJCS8qCgkJCUlmIGNVUkwgaXNuJ3QgYXZhaWxhYmxlLAoJCQl1c2UgZmlsZV9n ZXRfY29udGVudHMgaWYgcG9zc2libGUKCQkqLwoJCQkKCQlpZighZnVuY3Rpb25fZXhpc3Rz KCdjdXJsX2luaXQnKSkgewoJCQkKCQkJaWYoIWluaV9nZXQoJ2FsbG93X3VybF9mb3Blbicp KQoJCQkJcmV0dXJuIGZhbHNlOwoJCQkKCQkJJGNvbnRleHQgPSAKCQkJCXN0cmVhbV9jb250 ZXh0X2NyZWF0ZSgKCQkJCQlhcnJheSgKCQkJCQknaHR0cCcgPT4gCgkJCQkJCWFycmF5KAoJ CQkJCQkJJ3RpbWVvdXQnID0+ICR0aW1lb3V0CgkJCQkJCSkKCQkJCQkpCgkJCQkpOwoKCQkJ QCRmaWxlID0gZmlsZV9nZXRfY29udGVudHMoJHVybCwgMCwgJGNvbnRleHQpOwoJCQlyZXR1 cm4gISRmaWxlID8gZmFsc2UgOiB0cmltKCRmaWxlKTsKCQl9CgkJCgkJJGNoID0gY3VybF9p bml0KCk7CgkJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJHVybCk7CgkJY3VybF9z ZXRvcHQoJGNoLCBDVVJMT1BUX0ZBSUxPTkVSUk9SLCAxKTsKCQljdXJsX3NldG9wdCgkY2gs IENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIDEpOwoJCSRmaWxlID0gY3VybF9leGVjKCRjaCk7 CgkJJGh0dHAgPSBjdXJsX2dldGluZm8oJGNoLCBDVVJMSU5GT19IVFRQX0NPREUpOwoJCWN1 cmxfY2xvc2UoJGNoKTsKCQkKCQlyZXR1cm4gJGZpbGUgIT09IGZhbHNlICYmICRodHRwID09 ICcyMDAnID8gdHJpbSgkZmlsZSkgOiBmYWxzZTsKCX0KCi8qKgoJUmVkaXJlY3QgdG8gdGhl IGFkbWluLXNpZGUgaW50ZXJmYWNlCiovCgoJZnVuY3Rpb24gcmFoX3BsdWdpbl9pbnN0YWxs ZXJfb3B0aW9ucygpIHsKCQloZWFkZXIoJ0xvY2F0aW9uOiA/ZXZlbnQ9cmFoX3BsdWdpbl9p bnN0YWxsZXInKTsKCQllY2hvIAoJCQknPHA+Jy5uLgoJCQknCTxhIGhyZWY9Ij9ldmVudD1y YWhfcGx1Z2luX2luc3RhbGxlciI+Jy5nVHh0KCdjb250aW51ZScpLic8L2E+Jy5uLgoJCQkn PC9wPic7Cgl9CgovKioKCUFkZHMgc3R5bGVzIHRvIHRoZSA8aGVhZD4KKi8KCglmdW5jdGlv biByYWhfcGx1Z2luX2luc3RhbGxlcl9oZWFkKCkgewoJCWdsb2JhbCAkZXZlbnQ7CgkJCgkJ aWYoJGV2ZW50ICE9ICdyYWhfcGx1Z2luX2luc3RhbGxlcicpCgkJCXJldHVybjsKCQkKCQll Y2hvIDw8PEVPRgoJCQk8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJCQkJI3JhaF9wbHVnaW5f aW5zdGFsbGVyX2NvbnRhaW5lciB7CgkJCQkJd2lkdGg6IDk1MHB4OwoJCQkJCW1hcmdpbjog MCBhdXRvOwkKCQkJCX0KCQkJCSNyYWhfcGx1Z2luX2luc3RhbGxlcl9jb250YWluZXIgdGFi bGUgewoJCQkJCXdpZHRoOiAxMDAlOwkKCQkJCX0KCQkJPC9zdHlsZT4KRU9GOwoJfSI7czo0 OiJ0eXBlIjtzOjE6IjEiO3M6NToib3JkZXIiO3M6MToiNSI7czo1OiJmbGFncyI7czoxOiIz IjtzOjM6Im1kNSI7czozMjoiYjliZjJkMjQ2MzY4ODIwOGJhNzVlZTM4Yjc3NzA4MGEiO3M6 NDoibmFtZSI7czoyMDoicmFoX3BsdWdpbl9pbnN0YWxsZXIiO3M6NzoidmVyc2lvbiI7czoz OiIwLjQiO30=