dcs18 Posted December 13, 2015 Share Posted December 13, 2015 1 hour ago, shought said: I will look into restoring the post preview functionality, I understand it can be helpful and it doesn't use much if any server resources. Sweet! Link to comment Share on other sites More sharing options...
sinders Posted December 13, 2015 Share Posted December 13, 2015 There is a hook for IPS Community Suite that brings back the post preview functionality. https://community.invisionpower.com/files/file/7859-preview-post-button/ I am not sure if shought knows about it. Link to comment Share on other sites More sharing options...
sinders Posted December 13, 2015 Share Posted December 13, 2015 Preview Post Button 1.0.2 hook for IPS Community Suite. Preview Post.zip This hook was downloaded by myself from the IPS Marketplace using my own licensed IPS account. See my post above this one for info link for the hook. Link to comment Share on other sites More sharing options...
shought Posted December 13, 2015 Author Share Posted December 13, 2015 Thanks sinders, I knew about the hook, just hadn't gotten around to installing it yet (I have quite a few tasks to attend to over here at the moment). We've got an active IPB license ourselves, in order to get support etc. Link to comment Share on other sites More sharing options...
shought Posted December 13, 2015 Author Share Posted December 13, 2015 3 hours ago, hihello said: What is the new rule regarding member title? I believe members are required to be ViP now before they can change their member title. I could change this to Advanced Member though, as a matter of fact I think I'll do so right away. Edit: members now need 250 posts in order to change their member title. Link to comment Share on other sites More sharing options...
Kalju Posted December 13, 2015 Share Posted December 13, 2015 Two words about the Post Preview Button, it does not have any importance at all, because already you can see exactly what you are posting. (WYSIWYG) This is a preview, but in a different format, and deceptive. Almost full width of the page pop-up window will open. Here, the proposed version is not 1.0.2, but 1.0.1 PS! If it does not allowed to post here, please delete. Spoiler <?xml version="1.0" encoding="UTF-8"?> <plugin name="Preview Post" version_long="10001" version_human="1.0.1" author="Shir Raanan" website="" update_check=""><hooks><hook type="C" class="\IPS\forums\modules\front\forums\index" filename="indexCodeHook"><![CDATA[//<?php class hook42 extends _HOOK_CLASS_ { public function previewPost() { try { \IPS\Output::i()->sendOutput( \IPS\Theme::i()->getTemplate( 'plugins', 'core', 'global' )->postPreview() ); } catch ( \RuntimeException $e ) { if ( method_exists( get_parent_class(), __FUNCTION__ ) ) { return call_user_func_array( 'parent::' . __FUNCTION__, func_get_args() ); } else { throw $e; } } } }]]></hook><hook type="S" class="\IPS\Theme\class_core_front_forms" filename="formsThemeHook"><![CDATA[//<?php class hook43 extends _HOOK_CLASS_ { /* !Hook Data - DO NOT REMOVE */ public static function hookData() { return array_merge_recursive( array ( 'commentTemplate' => array ( 0 => array ( 'selector' => 'form > div.ipsComposeArea > div.ipsComposeArea_editor > ul.ipsToolList > li:last-child', 'type' => 'add_inside_end', 'content' => '<li><a href=\'\' data-controller="plugins.previewPost" data-ipsdialog data-ipsdialog-title="{lang="preview_post"}" data-ipsdialog-content="{template=\'postPreview\' app=\'core\' location=\'global\' group=\'plugins\'}" class="ipsButton ipsButton_link">{lang="preview_post"}</a></li>', ), ), 'popupTemplate' => array ( 0 => array ( 'selector' => 'form > ul.ipsPad.ipsToolList', 'type' => 'add_inside_end', 'content' => '<li><a href=\'\' data-controller="plugins.previewPost" data-ipsdialog data-ipsdialog-title="{lang="preview_post"}" data-ipsdialog-content="{template=\'postPreview\' app=\'core\' location=\'global\' group=\'plugins\'}" class="ipsButton ipsButton_link">{lang="preview_post"}</a></li>', ), ), ), parent::hookData() ); } /* End Hook Data */ }]]></hook><hook type="S" class="\IPS\Theme\class_forums_front_submit" filename="topicThemeHook"><![CDATA[//<?php class hook44 extends _HOOK_CLASS_ { /* !Hook Data - DO NOT REMOVE */ public static function hookData() { return array_merge_recursive( array ( 'createTopicForm' => array ( 0 => array ( 'selector' => 'form > div.ipsBox > div.ipsAreaBackground.ipsPad.ipsType_center', 'type' => 'add_inside_start', 'content' => '<a href=\'\' data-controller="plugins.previewPost" data-ipsdialog data-ipsdialog-title="{lang="preview_post"}" data-ipsdialog-content="{template=\'postPreview\' app=\'core\' location=\'global\' group=\'plugins\'}" class="ipsButton ipsButton_link">{lang="preview_post"}</a>', ), ), ), parent::hookData() ); } /* End Hook Data */ }]]></hook></hooks><settings><setting><key>preview_parse_bbcode</key><default/></setting></settings><htmlFiles><html filename="postPreview.phtml">PGlwczp0ZW1wbGF0ZSBwYXJhbWV0ZXJzPSIiIC8+CjxkaXYgY2xhc3M9J2NQb3N0X2NvbnRlbnRXcmFwIGlwc1BhZCc+CQoJPGRpdiBkYXRhLXJvbGU9J2NvbW1lbnRDb250ZW50JyBpdGVtcHJvcD0ndGV4dCcgY2xhc3M9J2lwc1R5cGVfbm9ybWFsIGlwc1R5cGVfcmljaFRleHQgaXBzQ29udGFpbmVkJyBkYXRhLWNvbnRyb2xsZXI9J2NvcmUuZnJvbnQuY29yZS5saWdodGJveGVkSW1hZ2VzJz4KCTwvZGl2Pgo8L2Rpdj4=</html></htmlFiles><cssFiles><css filename="xbbcode.css">LnhiYmNvZGUtYiB7CiAgICBmb250LXdlaWdodDpib2xkOwp9CgoueGJiY29kZS1ibG9ja3F1b3RlIHsKCn0KCi54YmJjb2RlLWNlbnRlciB7CiAgICBtYXJnaW4tbGVmdDphdXRvOwoJbWFyZ2luLXJpZ2h0OmF1dG87CglkaXNwbGF5OiBibG9jazsKCXRleHQtYWxpZ246IGNlbnRlcjsKfQoKLnhiYmNvZGUtY29kZSB7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwp9CgoueGJiY29kZS1pIHsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsgCn0KCi54YmJjb2RlLWp1c3RpZnkgewoJZGlzcGxheTogYmxvY2s7Cgl0ZXh0LWFsaWduOiBqdXN0aWZ5Owp9CgoueGJiY29kZS1sZWZ0IHsKCWRpc3BsYXk6IGJsb2NrOwoJdGV4dC1hbGlnbjogbGVmdDsKfQoKLnhiYmNvZGUtcmlnaHQgewoJZGlzcGxheTogYmxvY2s7Cgl0ZXh0LWFsaWduOiByaWdodDsKfQoKLnhiYmNvZGUtcyB7CiAgICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDsKfQoKLnhiYmNvZGUtc2l6ZS00IHtmb250LXNpemU6NHB4O30KLnhiYmNvZGUtc2l6ZS01IHtmb250LXNpemU6NXB4O30KLnhiYmNvZGUtc2l6ZS02IHtmb250LXNpemU6NnB4O30KLnhiYmNvZGUtc2l6ZS03IHtmb250LXNpemU6N3B4O30KLnhiYmNvZGUtc2l6ZS04IHtmb250LXNpemU6OHB4O30KLnhiYmNvZGUtc2l6ZS05IHtmb250LXNpemU6OXB4O30KLnhiYmNvZGUtc2l6ZS0xMCB7Zm9udC1zaXplOjEwcHg7fQoueGJiY29kZS1zaXplLTExIHtmb250LXNpemU6MTFweDt9Ci54YmJjb2RlLXNpemUtMTIge2ZvbnQtc2l6ZToxMnB4O30KLnhiYmNvZGUtc2l6ZS0xMyB7Zm9udC1zaXplOjEzcHg7fQoueGJiY29kZS1zaXplLTE0IHtmb250LXNpemU6MTRweDt9Ci54YmJjb2RlLXNpemUtMTUge2ZvbnQtc2l6ZToxNXB4O30KLnhiYmNvZGUtc2l6ZS0xNiB7Zm9udC1zaXplOjE2cHg7fQoueGJiY29kZS1zaXplLTE3IHtmb250LXNpemU6MTdweDt9Ci54YmJjb2RlLXNpemUtMTh7Zm9udC1zaXplOjE4cHg7fQoueGJiY29kZS1zaXplLTE5IHtmb250LXNpemU6MTlweDt9Ci54YmJjb2RlLXNpemUtMjAge2ZvbnQtc2l6ZToyMHB4O30KLnhiYmNvZGUtc2l6ZS0yMSB7Zm9udC1zaXplOjIxcHg7fQoueGJiY29kZS1zaXplLTIyIHtmb250LXNpemU6MjJweDt9Ci54YmJjb2RlLXNpemUtMjMge2ZvbnQtc2l6ZToyM3B4O30KLnhiYmNvZGUtc2l6ZS0yNCB7Zm9udC1zaXplOjI0cHg7fQoueGJiY29kZS1zaXplLTI1IHtmb250LXNpemU6MjVweDt9Ci54YmJjb2RlLXNpemUtMjYge2ZvbnQtc2l6ZToyNnB4O30KLnhiYmNvZGUtc2l6ZS0yNyB7Zm9udC1zaXplOjI3cHg7fQoueGJiY29kZS1zaXplLTI4IHtmb250LXNpemU6MjhweDt9Ci54YmJjb2RlLXNpemUtMjkge2ZvbnQtc2l6ZToyOXB4O30KLnhiYmNvZGUtc2l6ZS0zMCB7Zm9udC1zaXplOjMwcHg7fQoueGJiY29kZS1zaXplLTMxIHtmb250LXNpemU6MzFweDt9Ci54YmJjb2RlLXNpemUtMzIge2ZvbnQtc2l6ZTozMnB4O30KLnhiYmNvZGUtc2l6ZS0zMyB7Zm9udC1zaXplOjMzcHg7fQoueGJiY29kZS1zaXplLTM0IHtmb250LXNpemU6MzRweDt9Ci54YmJjb2RlLXNpemUtMzUge2ZvbnQtc2l6ZTozNXB4O30KLnhiYmNvZGUtc2l6ZS0zNiB7Zm9udC1zaXplOjM2cHg7fQoueGJiY29kZS1zaXplLTM3IHtmb250LXNpemU6MzdweDt9Ci54YmJjb2RlLXNpemUtMzgge2ZvbnQtc2l6ZTozOHB4O30KLnhiYmNvZGUtc2l6ZS0zOSB7Zm9udC1zaXplOjM5cHg7fQoueGJiY29kZS1zaXplLTQwIHtmb250LXNpemU6NDBweDt9CgoueGJiY29kZS11IHsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9CgoueGJiY29kZS10YWJsZSB7CiAgICBib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Cn0KCi54YmJjb2RlLXRyIHsKCn0KCi54YmJjb2RlLXRhYmxlICwgLnhiYmNvZGUtdGgsIC54YmJjb2RlLXRkIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkICM2NjY7Cn0K</css></cssFiles><jsFiles><js filename="xbbcode.js">LyoKQ29weXJpZ2h0IChDKSAyMDExIFBhdHJpY2sgR2lsbGVzcGllLCBodHRwOi8vcGF0b3Jqay5jb20vCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoqLwoKLyoKICAgIEV4dGVuZGlibGUgQkJDb2RlIFBhcnNlciB2MS4wLjAKICAgIEJ5IFBhdHJpY2sgR2lsbGVzcGllIChwYXRvcmprQGdtYWlsLmNvbSkKICAgIFdlYnNpdGU6IGh0dHA6Ly9wYXRvcmprLmNvbS8KCiAgICBUaGlzIG1vZHVsZSBhbGxvd3MgeW91IHRvIHBhcnNlIEJCQ29kZSBhbmQgdG8gZXh0ZW5kIHRvIHRoZSBtYXJrLXVwIGxhbmd1YWdlCiAgICB0byBhZGQgaW4geW91ciBvd24gdGFncy4KKi8KCiJ1c2Ugc3RyaWN0IjsKCnZhciBYQkJDT0RFID0gKGZ1bmN0aW9uKCkgewoKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBTZXQgdXAgcHJpdmF0ZSB2YXJpYWJsZXMKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgdmFyIG1lID0ge30sCiAgICAgICAgdXJsUGF0dGVybiA9IC9eKD86aHR0cHM/fGZpbGV8Yyk6KD86XC97MSwzfXxcXHsxfSlbLWEtekEtWjAtOTo7QCMlJigpfl8/XCs9XC9cXFwuXSokLywKICAgICAgICBjb2xvck5hbWVQYXR0ZXJuID0gL14oPzphbGljZWJsdWV8YW50aXF1ZXdoaXRlfGFxdWF8YXF1YW1hcmluZXxhenVyZXxiZWlnZXxiaXNxdWV8YmxhY2t8YmxhbmNoZWRhbG1vbmR8Ymx1ZXxibHVldmlvbGV0fGJyb3dufGJ1cmx5d29vZHxjYWRldGJsdWV8Y2hhcnRyZXVzZXxjaG9jb2xhdGV8Y29yYWx8Y29ybmZsb3dlcmJsdWV8Y29ybnNpbGt8Y3JpbXNvbnxjeWFufGRhcmtibHVlfGRhcmtjeWFufGRhcmtnb2xkZW5yb2R8ZGFya2dyYXl8ZGFya2dyZWVufGRhcmtraGFraXxkYXJrbWFnZW50YXxkYXJrb2xpdmVncmVlbnxkYXJrb3JhbmdlfGRhcmtvcmNoaWR8ZGFya3JlZHxkYXJrc2FsbW9ufGRhcmtzZWFncmVlbnxkYXJrc2xhdGVibHVlfGRhcmtzbGF0ZWdyYXl8ZGFya3R1cnF1b2lzZXxkYXJrdmlvbGV0fGRlZXBwaW5rfGRlZXBza3libHVlfGRpbWdyYXl8ZG9kZ2VyYmx1ZXxmaXJlYnJpY2t8ZmxvcmFsd2hpdGV8Zm9yZXN0Z3JlZW58ZnVjaHNpYXxnYWluc2Jvcm98Z2hvc3R3aGl0ZXxnb2xkfGdvbGRlbnJvZHxncmF5fGdyZWVufGdyZWVueWVsbG93fGhvbmV5ZGV3fGhvdHBpbmt8aW5kaWFucmVkfGluZGlnb3xpdm9yeXxraGFraXxsYXZlbmRlcnxsYXZlbmRlcmJsdXNofGxhd25ncmVlbnxsZW1vbmNoaWZmb258bGlnaHRibHVlfGxpZ2h0Y29yYWx8bGlnaHRjeWFufGxpZ2h0Z29sZGVucm9keWVsbG93fGxpZ2h0Z3JheXxsaWdodGdyZWVufGxpZ2h0cGlua3xsaWdodHNhbG1vbnxsaWdodHNlYWdyZWVufGxpZ2h0c2t5Ymx1ZXxsaWdodHNsYXRlZ3JheXxsaWdodHN0ZWVsYmx1ZXxsaWdodHllbGxvd3xsaW1lfGxpbWVncmVlbnxsaW5lbnxtYWdlbnRhfG1hcm9vbnxtZWRpdW1hcXVhbWFyaW5lfG1lZGl1bWJsdWV8bWVkaXVtb3JjaGlkfG1lZGl1bXB1cnBsZXxtZWRpdW1zZWFncmVlbnxtZWRpdW1zbGF0ZWJsdWV8bWVkaXVtc3ByaW5nZ3JlZW58bWVkaXVtdHVycXVvaXNlfG1lZGl1bXZpb2xldHJlZHxtaWRuaWdodGJsdWV8bWludGNyZWFtfG1pc3R5cm9zZXxtb2NjYXNpbnxuYXZham93aGl0ZXxuYXZ5fG9sZGxhY2V8b2xpdmV8b2xpdmVkcmFifG9yYW5nZXxvcmFuZ2VyZWR8b3JjaGlkfHBhbGVnb2xkZW5yb2R8cGFsZWdyZWVufHBhbGV0dXJxdW9pc2V8cGFsZXZpb2xldHJlZHxwYXBheWF3aGlwfHBlYWNocHVmZnxwZXJ1fHBpbmt8cGx1bXxwb3dkZXJibHVlfHB1cnBsZXxyZWR8cm9zeWJyb3dufHJveWFsYmx1ZXxzYWRkbGVicm93bnxzYWxtb258c2FuZHlicm93bnxzZWFncmVlbnxzZWFzaGVsbHxzaWVubmF8c2lsdmVyfHNreWJsdWV8c2xhdGVibHVlfHNsYXRlZ3JheXxzbm93fHNwcmluZ2dyZWVufHN0ZWVsYmx1ZXx0YW58dGVhbHx0aGlzdGxlfHRvbWF0b3x0dXJxdW9pc2V8dmlvbGV0fHdoZWF0fHdoaXRlfHdoaXRlc21va2V8eWVsbG93fHllbGxvd2dyZWVuKSQvLAogICAgICAgIGNvbG9yQ29kZVBhdHRlcm4gPSAvXiM/W2EtZkEtRjAtOV17Nn0kLywKICAgICAgICBlbWFpbFBhdHRlcm4gPSAvW15cc0BdK0BbXlxzQF0rXC5bXlxzQF0rLywKICAgICAgICBmb250RmFjZVBhdHRlcm4gPSAvXihbYS16XVthLXowLTlfXSt8IlthLXpdW2EtejAtOV9cc10rIikkL2ksCiAgICAgICAgdGFncywKICAgICAgICB0YWdMaXN0LAogICAgICAgIHRhZ3NOb1BhcnNlTGlzdCA9IFtdLAogICAgICAgIGJiUmVnRXhwLAogICAgICAgIHBiYlJlZ0V4cCwKICAgICAgICBwYmJSZWdFeHAyLAogICAgICAgIG9wZW5UYWdzLAogICAgICAgIGNsb3NlVGFnczsKCiAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogdGFncwogICAgICogVGhpcyBvYmplY3QgY29udGFpbnMgYSBsaXN0IG9mIHRhZ3MgdGhhdCB5b3VyIGNvZGUgd2lsbCBiZSBhYmxlIHRvIHVuZGVyc3RhbmQuCiAgICAgKiBFYWNoIHRhZyBvYmplY3QgaGFzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKICAgICAqCiAgICAgKiAgIG9wZW5UYWcgLSBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgaW4gdGhlIHRhZydzIHBhcmFtZXRlcnMgKGlmIGFueSkgYW5kIGl0cwogICAgICogICAgICAgICAgICAgY29udGVudHMsIGFuZCByZXR1cm5zIHdoYXQgaXRzIEhUTUwgb3BlbiB0YWcgc2hvdWxkIGJlLgogICAgICogICAgICAgICAgICAgRXhhbXBsZTogW2NvbG9yPXJlZF10ZXN0Wy9jb2xvcl0gd291bGQgdGFrZSBpbiAiPXJlZCIgYXMgYQogICAgICogICAgICAgICAgICAgcGFyYW1ldGVyIGlucHV0LCBhbmQgInRlc3QiIGFzIGEgY29udGVudCBpbnB1dC4KICAgICAqICAgICAgICAgICAgIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IGFueSBCQkNvZGUgaW5zaWRlIG9mICJjb250ZW50IiB3aWxsIGhhdmUKICAgICAqICAgICAgICAgICAgIGJlZW4gcHJvY2Vzc2VkIGJ5IHRoZSB0aW1lIGl0IGVudGVyIHRoZSBvcGVuVGFnIGZ1bmN0aW9uLgogICAgICoKICAgICAqICAgY2xvc2VUYWcgLSBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgaW4gdGhlIHRhZydzIHBhcmFtZXRlcnMgKGlmIGFueSkgYW5kIGl0cwogICAgICogICAgICAgICAgICAgIGNvbnRlbnRzLCBhbmQgcmV0dXJucyB3aGF0IGl0cyBIVE1MIGNsb3NlIHRhZyBzaG91bGQgYmUuCiAgICAgKgogICAgICogICBkaXNwbGF5Q29udGVudCAtIERlZmF1bHRzIHRvIHRydWUuIElmIGZhbHNlLCB0aGUgY29udGVudCBmb3IgdGhlIHRhZyB3aWxsCiAgICAgKiAgICAgICAgICAgICAgICAgICAgbm90IGJlIGRpc3BsYXllZC4gVGhpcyBpcyB1c2VmdWwgZm9yIHRhZ3MgbGlrZSBJTUcgd2hlcmUKICAgICAqICAgICAgICAgICAgICAgICAgICBpdHMgY29udGVudHMgYXJlIGFjdHVhbGx5IGEgcGFyYW1ldGVyIGlucHV0LgogICAgICoKICAgICAqICAgcmVzdHJpY3RDaGlsZHJlblRvIC0gQSBsaXN0IG9mIEJCQ29kZSB0YWdzIHdoaWNoIGFyZSBhbGxvd2VkIHRvIGJlIG5lc3RlZAogICAgICogICAgICAgICAgICAgICAgICAgICAgICB3aXRoaW4gdGhpcyBCQkNvZGUgdGFnLiBJZiB0aGlzIHByb3BlcnR5IGlzIG9taXR0ZWQsCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGFueSBCQkNvZGUgdGFnIG1heSBiZSBuZXN0ZWQgd2l0aGluIHRoZSB0YWcuCiAgICAgKgogICAgICogICByZXN0cmljdFBhcmVudHNUbyAtIEEgbGlzdCBvZiBCQkNvZGUgdGFncyB3aGljaCBhcmUgYWxsb3dlZCB0byBiZSBwYXJlbnRzIG9mCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBCQkNvZGUgdGFnLiBJZiB0aGlzIHByb3BlcnR5IGlzIG9taXR0ZWQsIGFueSBCQkNvZGUKICAgICAqICAgICAgICAgICAgICAgICAgICAgICB0YWcgbWF5IGJlIGEgcGFyZW50IG9mIHRoZSB0YWcuCiAgICAgKgogICAgICogICBub1BhcnNlIC0gdHJ1ZSBvciBmYWxzZS4gSWYgdHJ1ZSwgbm9uZSBvZiB0aGUgY29udGVudCBXSVRISU4gdGhpcyB0YWcgd2lsbCBiZQogICAgICogICAgICAgICAgICAgcGFyc2VkIGJ5IHRoZSBYQkJDb2RlIHBhcnNlci4KICAgICAqCiAgICAgKgogICAgICoKICAgICAqIExJTUlUSU9OUyBvbiBhZGRpbmcgTkVXIFRBR1M6CiAgICAgKiAgLSBUYWcgbmFtZXMgc2hvdWxkIGJlIGFscGhhbnVtZXJpYyAoaW5jbHVkaW5nIHVuZGVyc2NvcmVzKSBhbmQgYWxsIHRhZ3Mgc2hvdWxkIGhhdmUgYW4gb3BlbmluZyB0YWcKICAgICAqICAgIGFuZCBhIGNsb3NpbmcgdGFnLgogICAgICogICAgVGhlIFsqXSB0YWcgaXMgYW4gZXhjZXB0aW9uIGJlY2F1c2UgaXQgd2FzIGFscmVhZHkgYSBzdGFuZGFyZAogICAgICogICAgYmJjb2RlIHRhZy4gVGVjaG5lY2lhbGx5IHRhZ3MgZG9uJ3QgKmhhdmUqIHRvIGJlIGFscGhhbnVtZXJpYywgYnV0IHNpbmNlCiAgICAgKiAgICByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSB1c2VkIHRvIHBhcnNlIHRoZSB0ZXh0LCBpZiB5b3UgdXNlIGEgbm9uLWFscGhhbnVtZXJpYwogICAgICogICAgdGFnIG5hbWVzLCBqdXN0IG1ha2Ugc3VyZSB0aGUgdGFnIG5hbWUgZ2V0cyBlc2NhcGVkIHByb3Blcmx5IChpZiBuZWVkZWQpLgogICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgogICAgdGFncyA9IHsKICAgICAgICAiYiI6IHsKICAgICAgICAgICAgb3BlblRhZzogZnVuY3Rpb24ocGFyYW1zLGNvbnRlbnQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnPHNwYW4gY2xhc3M9InhiYmNvZGUtYiI+JzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY2xvc2VUYWc6IGZ1bmN0aW9uKHBhcmFtcyxjb250ZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJzwvc3Bhbj4nOwogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAvKgogICAgICAgICAgICBUaGlzIHRhZyBkb2VzIG5vdGhpbmcgYW5kIGlzIGhlcmUgbW9zdGx5IHRvIGJlIHVzZWQgYXMgYSBjbGFzc2lmaWNhdGlvbiBmb3IKICAgICAgICAgICAgdGhlIGJiY29kZSBpbnB1dCB3aGVuIGV2YWx1YXRpbmcgcGFyZW50LWNoaWxkIHRhZyByZWxhdGlvbnNoaXBzCiAgICAgICAgKi8KICAgICAgICAiYmJjb2RlIjogewogICAgICAgICAgICBvcGVuVGFnOiBmdW5jdGlvbihwYXJhbXMsY29udGVudCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9LAogICAgICAgICAgICBjbG9zZVRhZzogZnVuY3Rpb24ocGFyYW1zLGNvbnRlbnQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImNlbnRlciI6IHsKICAgICAgICAgICAgb3BlblRhZzogZnVuY3Rpb24ocGFyYW1zLGNvbnRlbnQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnPHNwYW4gY2xhc3M9InhiYmNvZGUtY2VudGVyIj4nOwogICAgICAgICAgICB9LAogICAgICAgICAgICBjbG9zZVRhZzogZnVuY3Rpb24ocGFyYW1zLGNvbnRlbnQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnPC9zcGFuPic7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAiY29kZSI6IHsKICAgICAgICAgICAgb3BlblRhZzogZnVuY3Rpb24ocGFyYW1zLGNvbnRlbnQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnPHNwYW4gY2xhc3M9InhiYmNvZGUtY29kZSI+JzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY2xvc2VUYWc6IGZ1bmN0aW9uKHBhcmFtcyxjb250ZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJzwvc3Bhbj4nOwogICAgICAgICAgICB9LAogICAgICAgICAgICBub1BhcnNlOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAiY29sb3IiOiB7CiAgICAgICAgICAgIG9wZW5UYWc6IGZ1bmN0aW9uKHBhcmFtcyxjb250ZW50KSB7CgogICAgICAgICAgICAgICAgdmFyIGNvbG9yQ29kZSA9IChwYXJhbXMuc3Vic3RyKDEpKS50b0xvd2VyQ2FzZSgpIHx8ICJibGFjayI7CiAgICAgICAgICAgICAgICBjb2xvck5hbWVQYXR0ZXJuLmxhc3RJbmRleCA9IDA7CiAgICAgICAgICAgICAgICBjb2xvckNvZGVQYXR0ZXJuLmxhc3RJbmRleCA9IDA7CiAgICAgICAgICAgICAgICBpZiAoICFjb2xvck5hbWVQYXR0ZXJuLnRlc3QoIGNvbG9yQ29kZSApICkgewogICAgICAgICAgICAgICAgICAgIGlmICggIWNvbG9yQ29kZVBhdHRlcm4udGVzdCggY29sb3JDb2RlICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yQ29kZSA9ICJibGFjayI7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yQ29kZS5zdWJzdHIoMCwxKSAhPT0gIiMiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvckNvZGUgPSAiIyIgKyBjb2xvckNvZGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuICc8c3BhbiBzdHlsZT0iY29sb3I6JyArIGNvbG9yQ29kZSArICciPic7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGNsb3NlVGFnOiBmdW5jdGlvbihwYXJhbXMsY29udGVudCkgewogICAgICAgICAgICAgICAgcmV0dXJuICc8L3NwYW4+JzsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImVtYWlsIjogewogICAgICAgICAgICBvcGVuVGFnOiBmdW5jdGlvbihwYXJhbXMsY29udGVudCkgewoKICAgICAgICAgICAgICAgIHZhciBteUVtYWlsOwoKICAgICAgICAgICAgICAgIGlmICghcGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgbXlFbWFpbCA9IGNvbnRlbnQucmVwbGFjZSgvPC4qPz4vZywiIik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIG15RW1haWwgPSBwYXJhbXMuc3Vic3RyKDEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGVtYWlsUGF0dGVybi5sYXN0SW5kZXggPSAwOwogICAgICAgICAgICAgICAgaWYgKCAhZW1haWxQYXR0ZXJuLnRlc3QoIG15RW1haWwgKSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzxhPic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuICc8YSBocmVmPSJtYWlsdG86JyArIG15RW1haWwgKyAnIj4nOwogICAgICAgICAgICB9LAogICAgICAgICAgICBjbG9zZVRhZzogZnVuY3Rpb24ocGFyYW1zLGNvbnRlbnQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnPC9hPic7CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJmYWNlIjogewogICAgICAgICAgICBvcGVuVGFnOiBmdW5jdGlvbihwYXJhbXMsY29udGVudCkgewoKICAgICAgICAgICAgICAgIHZhciBmYWNlQ29kZSA9IHBhcmFtcy5zdWJzdHIoMSkgfHwgImluaGVyaXQiOwogICAgICAgICAgICAgICAgZm9udEZhY2VQYXR0ZXJuLmxhc3RJbmRleCA9IDA7CiAgICAgICAgICAgICAgICBpZiAoICFmb250RmFjZVBhdHRlcm4udGVzdCggZmFjZUNvZGUgKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmFjZUNvZGUgPSAiaW5oZXJpdCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gJzxzcGFuIHN0eWxlPSJmb250LWZhbWlseTonICsgZmFjZUNvZGUgKyAnIj4nOwogICAgICAgICAgICB9LAogICAgICAgICAgICBjbG9zZVRhZzogZnVuY3Rpb24ocGFyYW1zLGNvbnRlbnQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnPC9zcGFuPic7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKCiAgICAgICAgImZvbnQiOiB7CiAgICAgICAgICAgIG9wZW5UYWc6IGZ1bmN0aW9uKHBhcmFtcyxjb250ZW50KSB7CgogICAgICAgICAgICAgICAgdmFyIGZhY2VDb2RlID0gcGFyYW1zLnN1YnN0cigxKSB8fCAiaW5oZXJpdCI7CiAgICAgICAgICAgICAgICBmb250RmFjZVBhdHRlcm4ubGFzdEluZGV4ID0gMDsKICAgICAgICAgICAgICAgIGlmICggIWZvbnRGYWNlUGF0dGVybi50ZXN0KCBmYWNlQ29kZSApICkgewogICAgICAgICAgICAgICAgICAgICAgICBmYWNlQ29kZSA9ICJpbmhlcml0IjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAnPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OicgKyBmYWNlQ29kZSArICciPic7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGNsb3NlVGFnOiBmdW5jdGlvbihwYXJhbXMsY29udGVudCkgewogICAgICAgICAgICAgICAgcmV0dXJuICc8L3NwYW4+JzsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgICJpIjogewogICAgICAgICAgICBvcGVuVGFnOiBmdW5jdGlvbihwYXJhbXMsY29udGVudCkgewogICAgICAgICAgICAgICAgcmV0dXJuICc8c3BhbiBjbGFzcz0ieGJiY29kZS1pIj4nOwogICAgICAgICAgICB9LAogICAgICAgICAgICBjbG9zZVRhZzogZnVuY3Rpb24ocGFyYW1zLGNvbnRlbnQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnPC9zcGFuPic7CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJpbWciOiB7CiAgICAgICAgICAgIG9wZW5UYWc6IGZ1bmN0aW9uKHBhcmFtcyxjb250ZW50KSB7CgogICAgICAgICAgICAgICAgdmFyIG15VXJsID0gY29udGVudDsKCiAgICAgICAgICAgICAgICB1cmxQYXR0ZXJuLmxhc3RJbmRleCA9IDA7CiAgICAgICAgICAgICAgICBpZiAoICF1cmxQYXR0ZXJuLnRlc3QoIG15VXJsICkgKSB7CiAgICAgICAgICAgICAgICAgICAgbXlVcmwgPSAiIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gJzxpbWcgc3JjPSInICsgbXlVcmwgKyAnIiAvPic7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGNsb3NlVGFnOiBmdW5jdGlvbihwYXJhbXMsY29udGVudCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9LAogICAgICAgICAgICBkaXNwbGF5Q29udGVudDogZmFsc2UKICAgICAgICB9LAogICAgICAgICJqdXN0aWZ5IjogewogICAgICAgICAgICBvcGVuVGFnOiBmdW5jdGlvbihwYXJhbXMsY29udGVudCkgewogICAgICAgICAgICAgICAgcmV0dXJuICc8c3BhbiBjbGFzcz0ieGJiY29kZS1qdXN0aWZ5Ij4nOwogICAgICAgICAgICB9LAogICAgICAgICAgICBjbG9zZVRhZzogZnVuY3Rpb24ocGFyYW1zLGNvbnRlbnQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnPC9zcGFuPic7CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJsYXJnZSI6IHsKICAgICAgICAgICAgb3BlblRhZzogZnVuY3Rpb24ocGFyYW1zLGNvbnRlbnQpIHsKCQkJCXZhciBwYXJhbXMgPSBwYXJhbXMgfHwgJyc7CgkJCQl2YXIgY29sb3JDb2RlID0gcGFyYW1zLnN1YnN0cigxKSB8fCAiaW5oZXJpdCI7CiAgICAgICAgICAgICAgICBjb2xvck5hbWVQYXR0ZXJuLmxhc3RJbmRleCA9IDA7CiAgICAgICAgICAgICAgICBjb2xvckNvZGVQYXR0ZXJuLmxhc3RJbmRleCA9IDA7CiAgICAgICAgICAgICAgICBpZiAoICFjb2xvck5hbWVQYXR0ZXJuLnRlc3QoIGNvbG9yQ29kZSApICkgewogICAgICAgICAgICAgICAgICAgIGlmICggIWNvbG9yQ29kZVBhdHRlcm4udGVzdCggY29sb3JDb2RlICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yQ29kZSA9ICJpbmhlcml0IjsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sb3JDb2RlLnN1YnN0cigwLDEpICE9PSAiIyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yQ29kZSA9ICIjIiArIGNvbG9yQ29kZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICAgICAgcmV0dXJuICc8c3BhbiBjbGFzcz0ieGJiY29kZS1zaXplLTM2IiBzdHlsZT0iY29sb3I6JyArIGNvbG9yQ29kZSArICciPic7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGNsb3NlVGFnOiBmdW5jdGlvbihwYXJhbXMsY29udGVudCkgewogICAgICAgICAgICAgICAgcmV0dXJuICc8L3NwYW4+JzsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImxlZnQiOiB7CiAgICAgICAgICAgIG9wZW5UYWc6IGZ1bmN0aW9uKHBhcmFtcyxjb250ZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJzxzcGFuIGNsYXNzPSJ4YmJjb2RlLWxlZnQiPic7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGNsb3NlVGFnOiBmdW5jdGlvbihwYXJhbXMsY29udGVudCkgewogICAgICAgICAgICAgICAgcmV0dXJuICc8L3NwYW4+JzsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImxpIjogewogICAgICAgICAgICBvcGVuVGFnOiBmdW5jdGlvbihwYXJhbXMsY29udGVudCkgewogICAgICAgICAgICAgICAgcmV0dXJuICI8bGk+IjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY2xvc2VUYWc6IGZ1bmN0aW9uKHBhcmFtcyxjb250ZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIjwvbGk+IjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcmVzdHJpY3RQYXJlbnRzVG86IFsibGlzdCIsInVsIiwib2wiXQogICAgICAgIH0sCiAgICAgICAgImxpc3QiOiB7CiAgICAgICAgICAgIG9wZW5UYWc6IGZ1bmN0aW9uKHBhcmFtcyxjb250ZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJzx1bD4nOwogICAgICAgICAgICB9LAogICAgICAgICAgICBjbG9zZVRhZzogZnVuY3Rpb24ocGFyYW1zLGNvbnRlbnQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnPC91bD4nOwogICAgICAgICAgICB9LAogICAgICAgICAgICByZXN0cmljdENoaWxkcmVuVG86IFsiKiIsICJsaSJdCiAgICAgICAgfSwKICAgICAgICAibm9wYXJzZSI6IHsKICAgICAgICAgICAgb3BlblRhZzogZnVuY3Rpb24ocGFyYW1zLGNvbnRlbnQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY2xvc2VUYWc6IGZ1bmN0aW9uKHBhcmFtcyxjb250ZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG5vUGFyc2U6IHRydWUKICAgICAgICB9LAogICAgICAgICJvbCI6IHsKICAgICAgICAgICAgb3BlblRhZzogZnVuY3Rpb24ocGFyYW1zLGNvbnRlbnQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnPG9sPic7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGNsb3NlVGFnOiBmdW5jdGlvbihwYXJhbXMsY29udGVudCkgewogICAgICAgICAgICAgICAgcmV0dXJuICc8L29sPic7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHJlc3RyaWN0Q2hpbGRyZW5UbzogWyIqIiwgImxpIl0KICAgICAgICB9LAogICAgICAgICJwaHAiOiB7CiAgICAgICAgICAgIG9wZW5UYWc6IGZ1bmN0aW9uKHBhcmFtcyxjb250ZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJzxzcGFuIGNsYXNzPSJ4YmJjb2RlLWNvZGUiPic7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGNsb3NlVGFnOiBmdW5jdGlvbihwYXJhbXMsY29udGVudCkgewogICAgICAgICAgICAgICAgcmV0dXJuICc8L3NwYW4+JzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbm9QYXJzZTogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgInF1b3RlIjogewogICAgICAgICAgICBvcGVuVGFnOiBmdW5jdGlvbihwYXJhbXMsY29udGVudCkgewogICAgICAgICAgICAgICAgcmV0dXJuICc8YmxvY2txdW90ZSBjbGFzcz0ieGJiY29kZS1ibG9ja3F1b3RlIj4nOwogICAgICAgICAgICB9LAogICAgICAgICAgICBjbG9zZVRhZzogZnVuY3Rpb24ocGFyYW1zLGNvbnRlbnQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnPC9ibG9ja3F1b3RlPic7CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJyaWdodCI6IHsKICAgICAgICAgICAgb3BlblRhZzogZnVuY3Rpb24ocGFyYW1zLGNvbnRlbnQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnPHNwYW4gY2xhc3M9InhiYmNvZGUtcmlnaHQiPic7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGNsb3NlVGFnOiBmdW5jdGlvbihwYXJhbXMsY29udGVudCkgewogICAgICAgICAgICAgICAgcmV0dXJuICc8L3NwYW4+JzsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInMiOiB7CiAgICAgICAgICAgIG9wZW5UYWc6IGZ1bmN0aW9uKHBhcmFtcyxjb250ZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJzxzcGFuIGNsYXNzPSJ4YmJjb2RlLXMiPic7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGNsb3NlVGFnOiBmdW5jdGlvbihwYXJhbXMsY29udGVudCkgewogICAgICAgICAgICAgICAgcmV0dXJuICc8L3NwYW4+JzsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInNpemUiOiB7CiAgICAgICAgICAgIG9wZW5UYWc6IGZ1bmN0aW9uKHBhcmFtcyxjb250ZW50KSB7CgogICAgICAgICAgICAgICAgdmFyIG15U2l6ZSA9IHBhcnNlSW50KHBhcmFtcy5zdWJzdHIoMSksMTApIHx8IDA7CiAgICAgICAgICAgICAgICBpZiAobXlTaXplIDwgNCB8fCBteVNpemUgPiA0MCkgewogICAgICAgICAgICAgICAgICAgIG15U2l6ZSA9IDE0OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiAnPHNwYW4gY2xhc3M9InhiYmNvZGUtc2l6ZS0nICsgbXlTaXplICsgJyI+JzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY2xvc2VUYWc6IGZ1bmN0aW9uKHBhcmFtcyxjb250ZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJzwvc3Bhbj4nOwogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAic21hbGwiOiB7CiAgICAgICAgICAgIG9wZW5UYWc6IGZ1bmN0aW9uKHBhcmFtcyxjb250ZW50KSB7CgkJCQl2YXIgcGFyYW1zID0gcGFyYW1zIHx8ICcnOwoJCQkJdmFyIGNvbG9yQ29kZSA9IHBhcmFtcy5zdWJzdHIoMSkgfHwgImluaGVyaXQiOwogICAgICAgICAgICAgICAgY29sb3JOYW1lUGF0dGVybi5sYXN0SW5kZXggPSAwOwogICAgICAgICAgICAgICAgY29sb3JDb2RlUGF0dGVybi5sYXN0SW5kZXggPSAwOwogICAgICAgICAgICAgICAgaWYgKCAhY29sb3JOYW1lUGF0dGVybi50ZXN0KCBjb2xvckNvZGUgKSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICFjb2xvckNvZGVQYXR0ZXJuLnRlc3QoIGNvbG9yQ29kZSApICkgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvckNvZGUgPSAiaW5oZXJpdCI7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yQ29kZS5zdWJzdHIoMCwxKSAhPT0gIiMiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvckNvZGUgPSAiIyIgKyBjb2xvckNvZGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuICc8c3BhbiBjbGFzcz0ieGJiY29kZS1zaXplLTEwIiBzdHlsZT0iY29sb3I6JyArIGNvbG9yQ29kZSArICciPic7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGNsb3NlVGFnOiBmdW5jdGlvbihwYXJhbXMsY29udGVudCkgewogICAgICAgICAgICAgICAgcmV0dXJuICc8L3NwYW4+JzsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgICJzdWIiOiB7CiAgICAgICAgICAgIG9wZW5UYWc6IGZ1bmN0aW9uKHBhcmFtcyxjb250ZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJzxzdWI+JzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY2xvc2VUYWc6IGZ1bmN0aW9uKHBhcmFtcyxjb250ZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJzwvc3ViPic7CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJzdXAiOiB7CiAgICAgICAgICAgIG9wZW5UYWc6IGZ1bmN0aW9uKHBhcmFtcyxjb250ZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJzxzdXA+JzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY2xvc2VUYWc6IGZ1bmN0aW9uKHBhcmFtcyxjb250ZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJzwvc3VwPic7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAidGFibGUiOiB7CiAgICAgICAgICAgIG9wZW5UYWc6IGZ1bmN0aW9uKHBhcmFtcyxjb250ZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJzx0YWJsZSBjbGFzcz0ieGJiY29kZS10YWJsZSI+JzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY2xvc2VUYWc6IGZ1bmN0aW9uKHBhcmFtcyxjb250ZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJzwvdGFibGU+JzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcmVzdHJpY3RDaGlsZHJlblRvOiBbInRib2R5IiwidGhlYWQiLCAidGZvb3QiLCAidHIiXQogICAgICAgIH0sCiAgICAgICAgInRib2R5IjogewogICAgICAgICAgICBvcGVuVGFnOiBmdW5jdGlvbihwYXJhbXMsY29udGVudCkgewogICAgICAgICAgICAgICAgcmV0dXJuICc8dGJvZHk+JzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY2xvc2VUYWc6IGZ1bmN0aW9uKHBhcmFtcyxjb250ZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJzwvdGJvZHk+JzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcmVzdHJpY3RDaGlsZHJlblRvOiBbInRyIl0sCiAgICAgICAgICAgIHJlc3RyaWN0UGFyZW50c1RvOiBbInRhYmxlIl0KICAgICAgICB9LAogICAgICAgICJ0Zm9vdCI6IHsKICAgICAgICAgICAgb3BlblRhZzogZnVuY3Rpb24ocGFyYW1zLGNvbnRlbnQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnPHRmb290Pic7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGNsb3NlVGFnOiBmdW5jdGlvbihwYXJhbXMsY29udGVudCkgewogICAgICAgICAgICAgICAgcmV0dXJuICc8L3Rmb290Pic7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHJlc3RyaWN0Q2hpbGRyZW5UbzogWyJ0ciJdLAogICAgICAgICAgICByZXN0cmljdFBhcmVudHNUbzogWyJ0YWJsZSJdCiAgICAgICAgfSwKICAgICAgICAidGhlYWQiOiB7CiAgICAgICAgICAgIG9wZW5UYWc6IGZ1bmN0aW9uKHBhcmFtcyxjb250ZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJzx0aGVhZCBjbGFzcz0ieGJiY29kZS10aGVhZCI+JzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY2xvc2VUYWc6IGZ1bmN0aW9uKHBhcmFtcyxjb250ZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJzwvdGhlYWQ+JzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcmVzdHJpY3RDaGlsZHJlblRvOiBbInRyIl0sCiAgICAgICAgICAgIHJlc3RyaWN0UGFyZW50c1RvOiBbInRhYmxlIl0KICAgICAgICB9LAogICAgICAgICJ0ZCI6IHsKICAgICAgICAgICAgb3BlblRhZzogZnVuY3Rpb24ocGFyYW1zLGNvbnRlbnQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnPHRkIGNsYXNzPSJ4YmJjb2RlLXRkIj4nOwogICAgICAgICAgICB9LAogICAgICAgICAgICBjbG9zZVRhZzogZnVuY3Rpb24ocGFyYW1zLGNvbnRlbnQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnPC90ZD4nOwogICAgICAgICAgICB9LAogICAgICAgICAgICByZXN0cmljdFBhcmVudHNUbzogWyJ0ciJdCiAgICAgICAgfSwKICAgICAgICAidGgiOiB7CiAgICAgICAgICAgIG9wZW5UYWc6IGZ1bmN0aW9uKHBhcmFtcyxjb250ZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJzx0aCBjbGFzcz0ieGJiY29kZS10aCI+JzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY2xvc2VUYWc6IGZ1bmN0aW9uKHBhcmFtcyxjb250ZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJzwvdGg+JzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcmVzdHJpY3RQYXJlbnRzVG86IFsidHIiXQogICAgICAgIH0sCiAgICAgICAgInRyIjogewogICAgICAgICAgICBvcGVuVGFnOiBmdW5jdGlvbihwYXJhbXMsY29udGVudCkgewogICAgICAgICAgICAgICAgcmV0dXJuICc8dHIgY2xhc3M9InhiYmNvZGUtdHIiPic7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGNsb3NlVGFnOiBmdW5jdGlvbihwYXJhbXMsY29udGVudCkgewogICAgICAgICAgICAgICAgcmV0dXJuICc8L3RyPic7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHJlc3RyaWN0Q2hpbGRyZW5UbzogWyJ0ZCIsInRoIl0sCiAgICAgICAgICAgIHJlc3RyaWN0UGFyZW50c1RvOiBbInRhYmxlIiwidGJvZHkiLCJ0Zm9vdCIsInRoZWFkIl0KICAgICAgICB9LAogICAgICAgICJ1IjogewogICAgICAgICAgICBvcGVuVGFnOiBmdW5jdGlvbihwYXJhbXMsY29udGVudCkgewogICAgICAgICAgICAgICAgcmV0dXJuICc8c3BhbiBjbGFzcz0ieGJiY29kZS11Ij4nOwogICAgICAgICAgICB9LAogICAgICAgICAgICBjbG9zZVRhZzogZnVuY3Rpb24ocGFyYW1zLGNvbnRlbnQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnPC9zcGFuPic7CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJ1bCI6IHsKICAgICAgICAgICAgb3BlblRhZzogZnVuY3Rpb24ocGFyYW1zLGNvbnRlbnQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnPHVsPic7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGNsb3NlVGFnOiBmdW5jdGlvbihwYXJhbXMsY29udGVudCkgewogICAgICAgICAgICAgICAgcmV0dXJuICc8L3VsPic7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHJlc3RyaWN0Q2hpbGRyZW5UbzogWyIqIiwgImxpIl0KICAgICAgICB9LAogICAgICAgICJ1cmwiOiB7CiAgICAgICAgICAgIG9wZW5UYWc6IGZ1bmN0aW9uKHBhcmFtcyxjb250ZW50KSB7CgogICAgICAgICAgICAgICAgdmFyIG15VXJsOwoKICAgICAgICAgICAgICAgIGlmICghcGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgbXlVcmwgPSBjb250ZW50LnJlcGxhY2UoLzwuKj8+L2csIiIpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBteVVybCA9IHBhcmFtcy5zdWJzdHIoMSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdXJsUGF0dGVybi5sYXN0SW5kZXggPSAwOwogICAgICAgICAgICAgICAgaWYgKCAhdXJsUGF0dGVybi50ZXN0KCBteVVybCApICkgewogICAgICAgICAgICAgICAgICAgIG15VXJsID0gIiMiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiAnPGEgaHJlZj0iJyArIG15VXJsICsgJyI+JzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY2xvc2VUYWc6IGZ1bmN0aW9uKHBhcmFtcyxjb250ZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJzwvYT4nOwogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAvKgogICAgICAgICAgICBUaGUgWypdIHRhZyBpcyBzcGVjaWFsIHNpbmNlIHRoZSB1c2VyIGRvZXMgbm90IGRlZmluZSBhIGNsb3NpbmcgWy8qXSB0YWcgd2hlbiB3cml0aW5nIHRoZWlyIGJiY29kZS4KICAgICAgICAgICAgSW5zdGVhZCB0aGlzIG1vZHVsZSBwYXJzZXMgdGhlIGNvZGUgYW5kIGFkZHMgdGhlIGNsb3NpbmcgWy8qXSB0YWcgaW4gZm9yIHRoZW0uIE5vbmUgb2YgdGhlIHRhZ3MgeW91CiAgICAgICAgICAgIGFkZCB3aWxsIGFjdCBsaWtlIHRoaXMgYW5kIHRoaXMgdGFnIGlzIGFuIGV4Y2VwdGlvbiB0byB0aGUgb3RoZXJzLgogICAgICAgICovCiAgICAgICAgIioiOiB7CiAgICAgICAgICAgIG9wZW5UYWc6IGZ1bmN0aW9uKHBhcmFtcyxjb250ZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIjxsaT4iOwogICAgICAgICAgICB9LAogICAgICAgICAgICBjbG9zZVRhZzogZnVuY3Rpb24ocGFyYW1zLGNvbnRlbnQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiPC9saT4iOwogICAgICAgICAgICB9LAogICAgICAgICAgICByZXN0cmljdFBhcmVudHNUbzogWyJsaXN0IiwidWwiLCJvbCJdCiAgICAgICAgfQogICAgfTsKCiAgICAvLyBjcmVhdGUgdGFnIGxpc3QgYW5kIGxvb2t1cCBmaWVsZHMKICAgIGZ1bmN0aW9uIGluaXRUYWdzKCkgewogICAgICAgIHRhZ0xpc3QgPSBbXTsKICAgICAgICB2YXIgcHJvcCwKICAgICAgICAgICAgaWksCiAgICAgICAgICAgIGxlbjsKICAgICAgICBmb3IgKHByb3AgaW4gdGFncykgewogICAgICAgICAgICBpZiAodGFncy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgICAgICAgaWYgKHByb3AgPT09ICIqIikgewogICAgICAgICAgICAgICAgICAgIHRhZ0xpc3QucHVzaCgiXFwiICsgcHJvcCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRhZ0xpc3QucHVzaChwcm9wKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIHRhZ3NbcHJvcF0ubm9QYXJzZSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGFnc05vUGFyc2VMaXN0LnB1c2gocHJvcCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRhZ3NbcHJvcF0udmFsaWRDaGlsZExvb2t1cCA9IHt9OwogICAgICAgICAgICAgICAgdGFnc1twcm9wXS52YWxpZFBhcmVudExvb2t1cCA9IHt9OwogICAgICAgICAgICAgICAgdGFnc1twcm9wXS5yZXN0cmljdFBhcmVudHNUbyA9IHRhZ3NbcHJvcF0ucmVzdHJpY3RQYXJlbnRzVG8gfHwgW107CiAgICAgICAgICAgICAgICB0YWdzW3Byb3BdLnJlc3RyaWN0Q2hpbGRyZW5UbyA9IHRhZ3NbcHJvcF0ucmVzdHJpY3RDaGlsZHJlblRvIHx8IFtdOwoKICAgICAgICAgICAgICAgIGxlbiA9IHRhZ3NbcHJvcF0ucmVzdHJpY3RDaGlsZHJlblRvLmxlbmd0aDsKICAgICAgICAgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IGxlbjsgaWkrKykgewogICAgICAgICAgICAgICAgICAgIHRhZ3NbcHJvcF0udmFsaWRDaGlsZExvb2t1cFsgdGFnc1twcm9wXS5yZXN0cmljdENoaWxkcmVuVG9baWldIF0gPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGVuID0gdGFnc1twcm9wXS5yZXN0cmljdFBhcmVudHNUby5sZW5ndGg7CiAgICAgICAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCBsZW47IGlpKyspIHsKICAgICAgICAgICAgICAgICAgICB0YWdzW3Byb3BdLnZhbGlkUGFyZW50TG9va3VwWyB0YWdzW3Byb3BdLnJlc3RyaWN0UGFyZW50c1RvW2lpXSBdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgYmJSZWdFeHAgPSBuZXcgUmVnRXhwKCI8YmJjbD0oWzAtOV0rKSAoIiArIHRhZ0xpc3Quam9pbigifCIpICsgIikoWyA9XVtePl0qPyk/PigoPzoufFtcXHJcXG5dKSo/KTxiYmNsPVxcMSAvXFwyPiIsICJnaSIpOwogICAgICAgIHBiYlJlZ0V4cCA9IG5ldyBSZWdFeHAoIlxcWygiICsgdGFnTGlzdC5qb2luKCJ8IikgKyAiKShbID1dW15cXF1dKj8pP1xcXShbXlxcW10qPylcXFsvXFwxXFxdIiwgImdpIik7CiAgICAgICAgcGJiUmVnRXhwMiA9IG5ldyBSZWdFeHAoIlxcWygiICsgdGFnc05vUGFyc2VMaXN0LmpvaW4oInwiKSArICIpKFsgPV1bXlxcXV0qPyk/XFxdKFtcXHNcXFNdKj8pXFxbL1xcMVxcXSIsICJnaSIpOwoKICAgICAgICAvLyBjcmVhdGUgdGhlIHJlZ2V4IGZvciBlc2NhcGluZyBbJ3MgdGhhdCBhcmVuJ3QgYXBhcnQgb2YgdGFncwogICAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGNsb3NlVGFnTGlzdCA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgdGFnTGlzdC5sZW5ndGg7IGlpKyspIHsKICAgICAgICAgICAgICAgIGlmICggdGFnTGlzdFtpaV0gIT09ICJcXCoiICkgeyAvLyB0aGUgKiB0YWcgZG9lc24ndCBoYXZlIGFuIG9mZmljYWwgY2xvc2luZyB0YWcKICAgICAgICAgICAgICAgICAgICBjbG9zZVRhZ0xpc3QucHVzaCAoICIvIiArIHRhZ0xpc3RbaWldICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG9wZW5UYWdzID0gbmV3IFJlZ0V4cCgiKFxcWykoKD86IiArIHRhZ0xpc3Quam9pbigifCIpICsgIikoPzpbID1dW15cXF1dKj8pPykoXFxdKSIsICJnaSIpOwogICAgICAgICAgICBjbG9zZVRhZ3MgPSBuZXcgUmVnRXhwKCIoXFxbKSgiICsgY2xvc2VUYWdMaXN0LmpvaW4oInwiKSArICIpKFxcXSkiLCAiZ2kiKTsKICAgICAgICB9KSgpOwoKICAgIH07CiAgICBpbml0VGFncygpOwoKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBwcml2YXRlIGZ1bmN0aW9ucwogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBmdW5jdGlvbiBjaGVja1BhcmVudENoaWxkUmVzdHJpY3Rpb25zKHBhcmVudFRhZywgYmJjb2RlLCBiYmNvZGVMZXZlbCwgdGFnTmFtZSwgdGFnUGFyYW1zLCB0YWdDb250ZW50cywgZXJyUXVldWUpIHsKCiAgICAgICAgZXJyUXVldWUgPSBlcnJRdWV1ZSB8fCBbXTsKICAgICAgICBiYmNvZGVMZXZlbCsrOwoKICAgICAgICAvLyBnZXQgYSBsaXN0IG9mIGFsbCBvZiB0aGUgY2hpbGQgdGFncyB0byB0aGlzIHRhZwogICAgICAgIHZhciByZVRhZ05hbWVzID0gbmV3IFJlZ0V4cCgiKDxiYmNsPSIgKyBiYmNvZGVMZXZlbCArICIgKSgiICsgdGFnTGlzdC5qb2luKCJ8IikgKyAiKShbID0+XSkiLCJnaSIpLAogICAgICAgICAgICByZVRhZ05hbWVzUGFydHMgPSBuZXcgUmVnRXhwKCIoPGJiY2w9IiArIGJiY29kZUxldmVsICsgIiApKCIgKyB0YWdMaXN0LmpvaW4oInwiKSArICIpKFsgPT5dKSIsImkiKSwKICAgICAgICAgICAgbWF0Y2hpbmdUYWdzID0gdGFnQ29udGVudHMubWF0Y2gocmVUYWdOYW1lcykgfHwgW10sCiAgICAgICAgICAgIGNJbmZvLAogICAgICAgICAgICBlcnJTdHIsCiAgICAgICAgICAgIGlpLAogICAgICAgICAgICBjaGlsZFRhZywKICAgICAgICAgICAgcEluZm8gPSB0YWdzW3BhcmVudFRhZ10gfHwge307CgogICAgICAgIHJlVGFnTmFtZXMubGFzdEluZGV4ID0gMDsKCiAgICAgICAgaWYgKCFtYXRjaGluZ1RhZ3MpIHsKICAgICAgICAgICAgdGFnQ29udGVudHMgPSAiIjsKICAgICAgICB9CgogICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IG1hdGNoaW5nVGFncy5sZW5ndGg7IGlpKyspIHsKICAgICAgICAgICAgcmVUYWdOYW1lc1BhcnRzLmxhc3RJbmRleCA9IDA7CiAgICAgICAgICAgIGNoaWxkVGFnID0gKG1hdGNoaW5nVGFnc1tpaV0ubWF0Y2gocmVUYWdOYW1lc1BhcnRzKSlbMl0udG9Mb3dlckNhc2UoKTsKCiAgICAgICAgICAgIGlmICggcEluZm8gJiYgcEluZm8ucmVzdHJpY3RDaGlsZHJlblRvICYmIHBJbmZvLnJlc3RyaWN0Q2hpbGRyZW5Uby5sZW5ndGggPiAwICkgewogICAgICAgICAgICAgICAgaWYgKCAhcEluZm8udmFsaWRDaGlsZExvb2t1cFtjaGlsZFRhZ10gKSB7CiAgICAgICAgICAgICAgICAgICAgZXJyU3RyID0gIlRoZSB0YWcgXCIiICsgY2hpbGRUYWcgKyAiXCIgaXMgbm90IGFsbG93ZWQgYXMgYSBjaGlsZCBvZiB0aGUgdGFnIFwiIiArIHBhcmVudFRhZyArICJcIi4iOwogICAgICAgICAgICAgICAgICAgIGVyclF1ZXVlLnB1c2goZXJyU3RyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjSW5mbyA9IHRhZ3NbY2hpbGRUYWddIHx8IHt9OwogICAgICAgICAgICBpZiAoIGNJbmZvLnJlc3RyaWN0UGFyZW50c1RvLmxlbmd0aCA+IDAgKSB7CiAgICAgICAgICAgICAgICBpZiAoICFjSW5mby52YWxpZFBhcmVudExvb2t1cFtwYXJlbnRUYWddICkgewogICAgICAgICAgICAgICAgICAgIGVyclN0ciA9ICJUaGUgdGFnIFwiIiArIHBhcmVudFRhZyArICJcIiBpcyBub3QgYWxsb3dlZCBhcyBhIHBhcmVudCBvZiB0aGUgdGFnIFwiIiArIGNoaWxkVGFnICsgIlwiLiI7CiAgICAgICAgICAgICAgICAgICAgZXJyUXVldWUucHVzaChlcnJTdHIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgdGFnQ29udGVudHMgPSB0YWdDb250ZW50cy5yZXBsYWNlKGJiUmVnRXhwLCBmdW5jdGlvbihtYXRjaFN0ciwgYmJjb2RlTGV2ZWwsIHRhZ05hbWUsIHRhZ1BhcmFtcywgdGFnQ29udGVudHMgKSB7CiAgICAgICAgICAgIGVyclF1ZXVlID0gY2hlY2tQYXJlbnRDaGlsZFJlc3RyaWN0aW9ucyh0YWdOYW1lLnRvTG93ZXJDYXNlKCksIG1hdGNoU3RyLCBiYmNvZGVMZXZlbCwgdGFnTmFtZSwgdGFnUGFyYW1zLCB0YWdDb250ZW50cywgZXJyUXVldWUpOwogICAgICAgICAgICByZXR1cm4gbWF0Y2hTdHI7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGVyclF1ZXVlOwogICAgfQoKICAgIC8qCiAgICAgICAgVGhpcyBmdW5jdGlvbiB1cGRhdGVzIG9yIGFkZHMgYSBwaWVjZSBvZiBtZXRhZGF0YSB0byBlYWNoIHRhZyBjYWxsZWQgImJiY2wiIHdoaWNoCiAgICAgICAgaW5kaWNhdGVzIGhvdyBkZWVwbHkgbmVzdGVkIGEgcGFydGljdWxhciB0YWcgd2FzIGluIHRoZSBiYmNvZGUuIFRoaXMgcHJvcGVydHkgaXMgcmVtb3ZlZAogICAgICAgIGZyb20gdGhlIEhUTUwgY29kZSB0YWdzIGF0IHRoZSBlbmQgb2YgdGhlIHByb2Nlc3NpbmcuCiAgICAqLwogICAgZnVuY3Rpb24gdXBkYXRlVGFnRGVwdGhzKHRhZ0NvbnRlbnRzKSB7CiAgICAgICAgdGFnQ29udGVudHMgPSB0YWdDb250ZW50cy5yZXBsYWNlKC9cPChbXlw+XVteXD5dKj8pXD4vZ2ksIGZ1bmN0aW9uKG1hdGNoU3RyLCBzdWJNYXRjaFN0cikgewogICAgICAgICAgICB2YXIgYmJDb2RlTGV2ZWwgPSBzdWJNYXRjaFN0ci5tYXRjaCgvXmJiY2w9KFswLTldKykgLyk7CiAgICAgICAgICAgIGlmIChiYkNvZGVMZXZlbCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuICI8YmJjbD0wICIgKyBzdWJNYXRjaFN0ciArICI+IjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAiPCIgKyBzdWJNYXRjaFN0ci5yZXBsYWNlKC9eKGJiY2w9KShbMC05XSspLywgZnVuY3Rpb24obWF0Y2hTdHIsIG0xLCBtMikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBtMSArIChwYXJzZUludChtMiwgMTApICsgMSk7CiAgICAgICAgICAgICAgICB9KSArICI+IjsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiB0YWdDb250ZW50czsKICAgIH0KCiAgICAvKgogICAgICAgIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyB0aGUgbWV0YWRhdGEgYWRkZWQgYnkgdGhlIHVwZGF0ZVRhZ0RlcHRocyBmdW5jdGlvbgogICAgKi8KICAgIGZ1bmN0aW9uIHVucHJvY2Vzcyh0YWdDb250ZW50KSB7CiAgICAgICAgcmV0dXJuIHRhZ0NvbnRlbnQucmVwbGFjZSgvPGJiY2w9WzAtOV0rIFwvXCo+L2dpLCIiKS5yZXBsYWNlKC88YmJjbD1bMC05XSsgL2dpLCImIzkxOyIpLnJlcGxhY2UoLz4vZ2ksIiYjOTM7Iik7CiAgICB9CgogICAgdmFyIHJlcGxhY2VGdW5jdCA9IGZ1bmN0aW9uKG1hdGNoU3RyLCBiYmNvZGVMZXZlbCwgdGFnTmFtZSwgdGFnUGFyYW1zLCB0YWdDb250ZW50cykgewoKICAgICAgICB0YWdOYW1lID0gdGFnTmFtZS50b0xvd2VyQ2FzZSgpOwoKICAgICAgICB2YXIgcHJvY2Vzc2VkQ29udGVudCA9IHRhZ3NbdGFnTmFtZV0ubm9QYXJzZSA/IHVucHJvY2Vzcyh0YWdDb250ZW50cykgOiB0YWdDb250ZW50cy5yZXBsYWNlKGJiUmVnRXhwLCByZXBsYWNlRnVuY3QpLAogICAgICAgICAgICBvcGVuVGFnID0gdGFnc1t0YWdOYW1lXS5vcGVuVGFnKHRhZ1BhcmFtcyxwcm9jZXNzZWRDb250ZW50KSwKICAgICAgICAgICAgY2xvc2VUYWcgPSB0YWdzW3RhZ05hbWVdLmNsb3NlVGFnKHRhZ1BhcmFtcyxwcm9jZXNzZWRDb250ZW50KTsKCiAgICAgICAgaWYgKCB0YWdzW3RhZ05hbWVdLmRpc3BsYXlDb250ZW50ID09PSBmYWxzZSkgewogICAgICAgICAgICBwcm9jZXNzZWRDb250ZW50ID0gIiI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gb3BlblRhZyArIHByb2Nlc3NlZENvbnRlbnQgKyBjbG9zZVRhZzsKICAgIH07CgogICAgZnVuY3Rpb24gcGFyc2UoY29uZmlnKSB7CiAgICAgICAgdmFyIG91dHB1dCA9IGNvbmZpZy50ZXh0OwogICAgICAgIG91dHB1dCA9IG91dHB1dC5yZXBsYWNlKGJiUmVnRXhwLCByZXBsYWNlRnVuY3QpOwogICAgICAgIHJldHVybiBvdXRwdXQ7CiAgICB9CgogICAgLyoKICAgICAgICBUaGUgc3RhciB0YWcgWypdIGlzIHNwZWNpYWwgaW4gdGhhdCBpdCBkb2VzIG5vdCB1c2UgYSBjbG9zaW5nIHRhZy4gU2luY2UgdGhpcyBwYXJzZXIgcmVxdWlyZXMgdGhhdCB0YWdzIHRvIGhhdmUgYSBjbG9zaW5nCiAgICAgICAgdGFnLCB3ZSBtdXN0IHByZS1wcm9jZXNzIHRoZSBpbnB1dCBhbmQgYWRkIGluIGNsb3NpbmcgdGFncyBbLypdIGZvciB0aGUgc3RhciB0YWcuCiAgICAgICAgV2UgaGF2ZSBhIGxpdHRsZSBsZXZhcmlkZ2UgaW4gdGhhdCB3ZSBrbm93IHRoZSB0ZXh0IHdlJ3JlIHByb2Nlc3Npbmcgd29udCBjb250YWluIHRoZSA8PiBjaGFyYWN0ZXJzICh0aGV5IGhhdmUgYmVlbgogICAgICAgIGNoYW5nZWQgaW50byB0aGVpciBIVE1MIGVudGl0eSBmb3JtIHRvIHByZXZlbnQgWFNTIGFuZCBjb2RlIGluamVjdGlvbiksIHNvIHdlIGNhbiB1c2UgdGhvc2UgY2hhcmFjdGVycyBhcyBtYXJrZXJzIHRvCiAgICAgICAgaGVscCB1cyBkZWZpbmUgYm91bmRhcmllcyBhbmQgZmlndXJlIG91dCB3aGVyZSB0byBwbGFjZSB0aGUgWy8qXSB0YWdzLgogICAgKi8KICAgIGZ1bmN0aW9uIGZpeFN0YXJUYWcodGV4dCkgewogICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xbKD8hXCpbID1cXV18bGlzdChbID1dW15cXV0qKT9cXXxcL2xpc3RbXF1dKS9pZywgIjwiKTsKICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cWyg/PWxpc3QoWyA9XVteXF1dKik/XF18XC9saXN0W1xdXSkvaWcsICI+Iik7CgogICAgICAgIHdoaWxlICh0ZXh0ICE9PSAodGV4dCA9IHRleHQucmVwbGFjZSgvPmxpc3QoWyA9XVteXF1dKik/XF0oW14+XSo/KSg+XC9saXN0XSkvZ2ksIGZ1bmN0aW9uKG1hdGNoU3RyLGNvbnRlbnRzLGVuZFRhZykgewoKICAgICAgICAgICAgdmFyIGlubmVyTGlzdFR4dCA9IG1hdGNoU3RyOwogICAgICAgICAgICB3aGlsZSAoaW5uZXJMaXN0VHh0ICE9PSAoaW5uZXJMaXN0VHh0ID0gaW5uZXJMaXN0VHh0LnJlcGxhY2UoL1xbXCpcXShbXlxbXSo/KShcW1wqXF18PlwvbGlzdF0pL2ksIGZ1bmN0aW9uKG1hdGNoU3RyLGNvbnRlbnRzLGVuZFRhZykgewogICAgICAgICAgICAgICAgaWYgKGVuZFRhZy50b0xvd2VyQ2FzZSgpID09PSAiPi9saXN0XSIpIHsKICAgICAgICAgICAgICAgICAgICBlbmRUYWcgPSAiPC8qXTwvbGlzdF0iOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBlbmRUYWcgPSAiPC8qXVsqXSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gIjwqXSIgKyBjb250ZW50cyArIGVuZFRhZzsKICAgICAgICAgICAgfSkpKTsKCiAgICAgICAgICAgIGlubmVyTGlzdFR4dCA9IGlubmVyTGlzdFR4dC5yZXBsYWNlKC8+L2csICI8Iik7CiAgICAgICAgICAgIHJldHVybiBpbm5lckxpc3RUeHQ7CiAgICAgICAgfSkpKTsKCiAgICAgICAgLy8gYWRkIFsncyBmb3Igb3VyIHRhZ3MgYmFjayBpbgogICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoLzwvZywgIlsiKTsKICAgICAgICByZXR1cm4gdGV4dDsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGRCYmNvZGVMZXZlbHModGV4dCkgewogICAgICAgIHdoaWxlICggdGV4dCAhPT0gKHRleHQgPSB0ZXh0LnJlcGxhY2UocGJiUmVnRXhwLCBmdW5jdGlvbihtYXRjaFN0ciwgdGFnTmFtZSwgdGFnUGFyYW1zLCB0YWdDb250ZW50cykgewogICAgICAgICAgICBtYXRjaFN0ciA9IG1hdGNoU3RyLnJlcGxhY2UoL1xbL2csICI8Iik7CiAgICAgICAgICAgIG1hdGNoU3RyID0gbWF0Y2hTdHIucmVwbGFjZSgvXF0vZywgIj4iKTsKICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVRhZ0RlcHRocyhtYXRjaFN0cik7CiAgICAgICAgfSkpICk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9CgogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIHB1YmxpYyBmdW5jdGlvbnMKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgLy8gQVBJLCBFeHBvc2UgYWxsIGF2YWlsYWJsZSB0YWdzCiAgICBtZS50YWdzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRhZ3M7CiAgICB9CgogICAgLy8gQVBJCiAgICBtZS5hZGRUYWdzID0gZnVuY3Rpb24obmV3dGFncykgewogICAgICAgIHZhciB0YWc7CiAgICAgICAgZm9yICh0YWcgaW4gbmV3dGFncykgewogICAgICAgICAgICB0YWdzW3RhZ10gPSBuZXd0YWdzW3RhZ107CiAgICAgICAgfQogICAgICAgIGluaXRUYWdzKCk7CiAgICB9CgogICAgbWUucHJvY2VzcyA9IGZ1bmN0aW9uKGNvbmZpZykgewoKICAgICAgICB2YXIgcmV0ID0ge2h0bWw6ICIiLCBlcnJvcjogZmFsc2V9LAogICAgICAgICAgICBlcnJRdWV1ZSA9IFtdOwoKICAgICAgICAvL2NvbmZpZy50ZXh0ID0gY29uZmlnLnRleHQucmVwbGFjZSgvPC9nLCAiJmx0OyIpOyAvLyBlc2NhcGUgSFRNTCB0YWcgYnJhY2tldHMKICAgICAgICAvL2NvbmZpZy50ZXh0ID0gY29uZmlnLnRleHQucmVwbGFjZSgvPi9nLCAiJmd0OyIpOyAvLyBlc2NhcGUgSFRNTCB0YWcgYnJhY2tldHMKCiAgICAgICAgY29uZmlnLnRleHQgPSBjb25maWcudGV4dC5yZXBsYWNlKG9wZW5UYWdzLCBmdW5jdGlvbihtYXRjaFN0ciwgb3BlbkIsIGNvbnRlbnRzLCBjbG9zZUIpIHsKICAgICAgICAgICAgcmV0dXJuICI8IiArIGNvbnRlbnRzICsgIj4iOwogICAgICAgIH0pOwogICAgICAgIGNvbmZpZy50ZXh0ID0gY29uZmlnLnRleHQucmVwbGFjZShjbG9zZVRhZ3MsIGZ1bmN0aW9uKG1hdGNoU3RyLCBvcGVuQiwgY29udGVudHMsIGNsb3NlQikgewogICAgICAgICAgICByZXR1cm4gIjwiICsgY29udGVudHMgKyAiPiI7CiAgICAgICAgfSk7CgogICAgICAgIGNvbmZpZy50ZXh0ID0gY29uZmlnLnRleHQucmVwbGFjZSgvXFsvZywgIiYjOTE7Iik7IC8vIGVzY2FwZSBbJ3MgdGhhdCBhcmVuJ3QgYXBhcnQgb2YgdGFncwogICAgICAgIGNvbmZpZy50ZXh0ID0gY29uZmlnLnRleHQucmVwbGFjZSgvXF0vZywgIiYjOTM7Iik7IC8vIGVzY2FwZSBbJ3MgdGhhdCBhcmVuJ3QgYXBhcnQgb2YgdGFncwogICAgICAgIGNvbmZpZy50ZXh0ID0gY29uZmlnLnRleHQucmVwbGFjZSgvPC9nLCAiWyIpOyAvLyBlc2NhcGUgWydzIHRoYXQgYXJlbid0IGFwYXJ0IG9mIHRhZ3MKICAgICAgICBjb25maWcudGV4dCA9IGNvbmZpZy50ZXh0LnJlcGxhY2UoLz4vZywgIl0iKTsgLy8gZXNjYXBlIFsncyB0aGF0IGFyZW4ndCBhcGFydCBvZiB0YWdzCgogICAgICAgIC8vIHByb2Nlc3MgdGFncyB0aGF0IGRvbid0IGhhdmUgdGhlaXIgY29udGVudCBwYXJzZWQKICAgICAgICB3aGlsZSAoIGNvbmZpZy50ZXh0ICE9PSAoY29uZmlnLnRleHQgPSBjb25maWcudGV4dC5yZXBsYWNlKHBiYlJlZ0V4cDIsIGZ1bmN0aW9uKG1hdGNoU3RyLCB0YWdOYW1lLCB0YWdQYXJhbXMsIHRhZ0NvbnRlbnRzKSB7CiAgICAgICAgICAgIHRhZ0NvbnRlbnRzID0gdGFnQ29udGVudHMucmVwbGFjZSgvXFsvZywgIiYjOTE7Iik7CiAgICAgICAgICAgIHRhZ0NvbnRlbnRzID0gdGFnQ29udGVudHMucmVwbGFjZSgvXF0vZywgIiYjOTM7Iik7CiAgICAgICAgICAgIHRhZ1BhcmFtcyA9IHRhZ1BhcmFtcyB8fCAiIjsKICAgICAgICAgICAgdGFnQ29udGVudHMgPSB0YWdDb250ZW50cyB8fCAiIjsKICAgICAgICAgICAgcmV0dXJuICJbIiArIHRhZ05hbWUgKyB0YWdQYXJhbXMgKyAiXSIgKyB0YWdDb250ZW50cyArICJbLyIgKyB0YWdOYW1lICsgIl0iOwogICAgICAgIH0pKSApOwoKICAgICAgICBjb25maWcudGV4dCA9IGZpeFN0YXJUYWcoY29uZmlnLnRleHQpOyAvLyBhZGQgaW4gY2xvc2luZyB0YWdzIGZvciB0aGUgWypdIHRhZwogICAgICAgIGNvbmZpZy50ZXh0ID0gYWRkQmJjb2RlTGV2ZWxzKGNvbmZpZy50ZXh0KTsgLy8gYWRkIGluIGxldmVsIG1ldGFkYXRhCgogICAgICAgIGVyclF1ZXVlID0gY2hlY2tQYXJlbnRDaGlsZFJlc3RyaWN0aW9ucygiYmJjb2RlIiwgY29uZmlnLnRleHQsIC0xLCAiIiwgIiIsIGNvbmZpZy50ZXh0KTsKCiAgICAgICAgcmV0Lmh0bWwgPSBwYXJzZShjb25maWcpOzsKCiAgICAgICAgaWYgKCByZXQuaHRtbC5pbmRleE9mKCJbIikgIT09IC0xIHx8IHJldC5odG1sLmluZGV4T2YoIl0iKSAhPT0gLTEpIHsKICAgICAgICAgICAgZXJyUXVldWUucHVzaCgiU29tZSB0YWdzIGFwcGVhciB0byBiZSBtaXNhbGlnbmVkLiIpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGNvbmZpZy5yZW1vdmVNaXNhbGlnbmVkVGFncykgewogICAgICAgICAgICByZXQuaHRtbCA9IHJldC5odG1sLnJlcGxhY2UoL1xbLio/XF0vZywiIik7CiAgICAgICAgfQogICAgICAgIGlmIChjb25maWcuYWRkSW5MaW5lQnJlYWtzKSB7CiAgICAgICAgICAgIHJldC5odG1sID0gJzxkaXYgc3R5bGU9IndoaXRlLXNwYWNlOnByZTsiPicgKyByZXQuaHRtbCArICc8L2Rpdj4nOwogICAgICAgIH0KCiAgICAgICAgcmV0Lmh0bWwgPSByZXQuaHRtbC5yZXBsYWNlKC9cWy9nLCAiPCIpOyAvLyBwdXQgPCdzIGJhY2sgaW4KICAgICAgICByZXQuaHRtbCA9IHJldC5odG1sLnJlcGxhY2UoL1xdL2csICI+Iik7IC8vIHB1dCA+J3MgYmFjayBpbgoKICAgICAgICByZXQuaHRtbCA9IHJldC5odG1sLnJlcGxhY2UoIiYjOTE7IiwgIlsiKTsgLy8gcHV0IFsncyBiYWNrIGluCiAgICAgICAgcmV0Lmh0bWwgPSByZXQuaHRtbC5yZXBsYWNlKCImIzkzOyIsICJdIik7IC8vIHB1dCBbJ3MgYmFjayBpbgoKICAgICAgICByZXQuZXJyb3IgPSBlcnJRdWV1ZS5sZW5ndGggIT09IDA7CiAgICAgICAgcmV0LmVycm9yUXVldWUgPSBlcnJRdWV1ZTsKCiAgICAgICAgcmV0dXJuIHJldDsKICAgIH07CgogICAgcmV0dXJuIG1lOwp9KSgpOwo=</js><js filename="plugins.previewPost.js">OyggZnVuY3Rpb24oJCwgXywgdW5kZWZpbmVkKXsKCSJ1c2Ugc3RyaWN0IjsKCglpcHMuY29udHJvbGxlci5yZWdpc3RlcigncGx1Z2lucy5wcmV2aWV3UG9zdCcsCgl7CgkJZGlhbG9nSWQ6IG51bGwsCgoJCWluaXRpYWxpemU6IGZ1bmN0aW9uICgpCgkJewoJCQl0aGlzLnNjb3BlLm9uKCAnY2xpY2snLCB0aGlzLnByZXZpZXdQb3N0ICk7CgkJfSwKCQkKCQlwcmV2aWV3UG9zdDogZnVuY3Rpb24oIGUgKQoJCXsKCQkJdmFyIHNlbGYgPSB0aGlzOwoJCQl2YXIgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCggZnVuY3Rpb24oKQoJCQl7CgkJCQlpZiggc2VsZi5kaWFsb2dJZCApCgkJCQl7CgkJCQkJaWYoICQoICIjIiArIHNlbGYuZGlhbG9nSWQgKyAiX2RpYWxvZyIgKS5maW5kKCAnW2RhdGEtcm9sZT0iY29tbWVudENvbnRlbnQiXScgKS5sZW5ndGggPiAwICkKCQkJCQl7CgkJCQkJCXZhciBpbnB1dFRleHQgPSAkKCBzZWxmICkuY2xvc2VzdCggJ2Zvcm0nICkuZmluZCggJ2Rpdi5ja2VfZWRpdGFibGUnICkuZmlyc3QoKS5odG1sKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnZW5lcmF0ZWRIdG1sID0gdHlwZW9mIFhCQkNPREUgIT09ICd1bmRlZmluZWQnID8gWEJCQ09ERS5wcm9jZXNzKCB7IHRleHQ6IGlucHV0VGV4dCB9ICkuaHRtbCA6IGlucHV0VGV4dDsKCQkJCQkJJCggIiMiICsgc2VsZi5kaWFsb2dJZCArICJfZGlhbG9nIiApLmZpbmQoICdbZGF0YS1yb2xlPSJjb21tZW50Q29udGVudCJdJyApLmh0bWwoIGdlbmVyYXRlZEh0bWwgKTsKCQkJCQkJaWYoIHR5cGVvZiBNYXRoSmF4ICE9PSAndW5kZWZpbmVkJyApCgkJCQkJCXsKCQkJCQkJCU1hdGhKYXguSHViLlR5cGVzZXQoIHNlbGYuZGlhbG9nSWQgKyAiX2RpYWxvZyIgKTsKCQkJCQkJfQoJCQkJCQkkKCBkb2N1bWVudCApLnRyaWdnZXIoICdjb250ZW50Q2hhbmdlJywgWyAkKCAiIyIgKyBzZWxmLmRpYWxvZ0lkICsgIl9kaWFsb2ciICkgXSApOwoJCQkJCQljbGVhckludGVydmFsKCBpbnRlcnZhbCApOwoJCQkJCX0KCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlzZWxmLmRpYWxvZ0lkID0gJCggc2VsZiApLmF0dHIoICdpZCcgKTsKCQkJCX0KCQkJfSwgMTUwICk7CgkJfQoJfSk7Cn0oalF1ZXJ5LCBfKSk7CgogICAgICAgIGZ1bmN0aW9uIGRlY29kZUVudGl0aWVzKGVuY29kZWRTdHJpbmcpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdGV4dEFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpOwogICAgICAgICAgICB0ZXh0QXJlYS5pbm5lckhUTUwgPSBlbmNvZGVkU3RyaW5nOwogICAgICAgICAgICByZXR1cm4gdGV4dEFyZWEudmFsdWU7CiAgICAgICAgfQ==</js></jsFiles><resourcesFiles/><lang><word key="preview_post" js="0">Preview Post</word><word key="preview_parse_bbcode" js="0">Parse BBCode?</word></lang><versions><version long="10000" human="1.0.0"><![CDATA[//<?php /* To prevent PHP errors (extending class does not exist) revealing path */ if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) ) { header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' ); exit; } /** * Install Code */ class ips_plugins_setup_install { /** * ... * * @return array If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops) */ public function step1() { return TRUE; } // You can create as many additional methods (step2, step3, etc.) as is necessary. // Each step will be executed in a new HTTP request }]]></version><version long="10001" human="1.0.1"><![CDATA[//<?php /* To prevent PHP errors (extending class does not exist) revealing path */ if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) ) { header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' ); exit; } /** * 1.0.1 Upgrade Code */ class ips_plugins_setup_upg_10001 { /** * ... * * @return array If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops) */ public function step1() { return TRUE; } // You can create as many additional methods (step2, step3, etc.) as is necessary. // Each step will be executed in a new HTTP request }]]></version></versions></plugin> Link to comment Share on other sites More sharing options...
dcs18 Posted December 13, 2015 Share Posted December 13, 2015 3 minutes ago, Kalju said: Two words about the Post Preview Button, it does not have any importance at all, because already you can see exactly what you are posting. (WYSIWYG) Not true — almost every post that I make, is having to be re-posted due to mistakes (the WYSIWYG on the V4 is relatively better than the one on the V3 — it's far from perfect, though.) Taking into consideration the massive nSane User base — the Board resources would take a bad hit if most folks had to re-post (remember we are not resorting to copy-paste from the Google Translate.) Link to comment Share on other sites More sharing options...
asf Posted December 13, 2015 Share Posted December 13, 2015 41 minutes ago, Kalju said: Two words about the Post Preview Button, it does not have any importance at all, because already you can see exactly what you are posting. (WYSIWYG) Not true! one of the things for example is the spoiler, that i cant see how it will look in the end Link to comment Share on other sites More sharing options...
Kalju Posted December 13, 2015 Share Posted December 13, 2015 Here are all my changes what I've tested: Spoiler /** * This file is for your custom CSS. * This file is not modified or overwritten during upgrades *//* Chatbox changes */ .ipsTabs { padding: 5px 10px 0 10px; } #elChatbox { height: 40px; font-size: 120%; font-weight: 500; background: #1c2c3b; } /* Header Changes */ #ipsLayout_header header { background: rgba(22, 32, 41, .1) url(../../background/pattern_012.png); } header li > a .fa, #elUserNav_mobile > li > a .fa { font-size: 12px !Important; } /* Body Changes */ body { background-image: url(../../background/pattern_012.png); /* url(../../background/background/noise_overlay.png) */ } body#elLogin { background: #0D334C url(../../uploads/background/sports-car.jpg) no-repeat -100px -200px; } .ipsType_sectionTitle { background: #1c2c3b;/* #304d66; default color */ } /* NavBar Changes */ .ipsNavBar_secondary > li > a { color: rgba(50, 50, 50, 1); } .ipsButtonBar .ipsButtonRow li > a, .ipsButtonBar .ipsButtonRow li > button, .ipsButtonBar .ipsButtonRow li > span { background: rgba(255, 255, 255, 0.1); color: #323232; font-weight: bold; } /* NAV Bar Primary */ .ipsNavBar_primary { position: relative; padding: 5px 5px 40px; /* background: #1F3F4F none repeat scroll 0% 0%; */ border-radius: 2px 2px 0px 0px; } .ipsNavBar_primary > ul > li.ipsNavBar_active > a { font-weight: 500; color: #1c2c3b; } .ipsNavBar_primary > ul > li > a { font-weight: 500; } /* Hide Error Message form Forum Page */ #elLicenseKey { margin: 0; border-radius: 0; font-size: 14px; padding-right: 40px; display: none !Important; } /* Hide Error Message End */ /* Display if New Version is available */ div#acpNewVersion { display: none !Important; } /* Hide footer container */ div.ipsLayout_container { /* display: none !Important;*/ padding: 1px 10px 10px 10px; color: rgba(0, 0, 0, 1); width: 97%; opacity: 1; background: rgba(28, 44, 59, 1) url() no-repeat; } #elCopyright_userLine { display: none;/* block;*/ color: rgba(28, 44, 59, 1); opacity: 1; } #ipsLayout_footer a, #ipsLayout_footer p { color: #fff;/*rgba(28, 44, 59, 1);*/ } /* New posts icon color */ .ipsItemStatus.ipsItemStatus_large { background: #1C2C3B; } /* Admin Panel Members editor */ .ipsButtonBar .ipsButtonRow li > a, .ipsButtonBar .ipsButtonRow li > button, .ipsButtonBar .ipsButtonRow li > span { background: rgba(255, 255, 255, 0.1); color: #FFF; font-weight: bold; } .ipsButtonRow li > a.ipsButtonRow_active, .ipsButtonRow li > button.ipsButtonRow_active { background: #323232; border-color: #323232; color: #04A5CC; text-shadow: none; } Here is what it looks like: http://i.imgur.com/PVu5TJh.png See it here Link to comment Share on other sites More sharing options...
rudrax Posted December 14, 2015 Share Posted December 14, 2015 The 3 buttons in forum's top-right corner (android) are not working. Tapping on them gives no response. http://s7.postimg.org/y1wlv4a9n/Screenshot_2015_12_14_09_39_41_1.jpg Another bug: (android) can't post image using IMG BBcode. If I paste the image link, it gets converted into link directly right in the editor. Example is the image posted above. Link to comment Share on other sites More sharing options...
dcs18 Posted December 14, 2015 Share Posted December 14, 2015 Have switched back from the Dark Theme to the Light (default) Theme — the Dark Theme was quite easy on the eyes, but came at the cost of readability (especially on tutorials with blue fonts.) Have managed to cut down a reasonable deal of contrast on my Light (default) Theme — now, after ironing out most of the inconsistencies, the Light (default) Theme looks ravishing. Link to comment Share on other sites More sharing options...
VileTouch Posted December 14, 2015 Share Posted December 14, 2015 the dark theme is looking better by the minute! every time i check back, i see new additions that i can remove from stylish. still pondering what to do with the activity feed grey background, but maybe the buttons would look more defined with a border: groove 1px; to give that embossed look. more effective than a box-shadow imho but you can always mix and match. Link to comment Share on other sites More sharing options...
shought Posted December 14, 2015 Author Share Posted December 14, 2015 39 minutes ago, VileTouch said: the dark theme is looking better by the minute! every time i check back, i see new additions that i can remove from stylish. still pondering what to do with the activity feed grey background, but maybe the buttons would look more defined with a border: groove 1px; to give that embossed look. more effective than a box-shadow imho but you can always mix and match. I'd be happy to take a look at your suggestions for the activity feed. I didn't know quite what to do with it myself. The post preview button has been available since yesterday afternoon. @dcs18I'd be happy to look at your modifications of the default theme as well. Link to comment Share on other sites More sharing options...
asf Posted December 14, 2015 Share Posted December 14, 2015 1 hour ago, shought said: The post preview button has been available since yesterday afternoon. Where is it? i don't see it. Link to comment Share on other sites More sharing options...
asf Posted December 14, 2015 Share Posted December 14, 2015 14 minutes ago, AP1972 said: Here is a look http://www.nsaneforums.com/discover/ ?????? Link to comment Share on other sites More sharing options...
vissha Posted December 14, 2015 Share Posted December 14, 2015 4 minutes ago, asf said: ?????? Please try to create new topic/reply. You'll see the Preview Post button near Submit reply. Link to comment Share on other sites More sharing options...
asf Posted December 14, 2015 Share Posted December 14, 2015 6 minutes ago, vissha said: Please try to create new topic/reply. You'll see the Preview Post button near Submit reply. Oh but there still isn't at all posts, where we also need it. Link to comment Share on other sites More sharing options...
dcs18 Posted December 14, 2015 Share Posted December 14, 2015 Link to comment Share on other sites More sharing options...
dcs18 Posted December 14, 2015 Share Posted December 14, 2015 2 hours ago, shought said: @dcs18I'd be happy to look at your modifications of the default theme as well. Made my previous post as an image so that you could see my CKEditor, too — didn't know that you were interested in having the Default (Light) Theme altered (shall submit some codes later.) Here is a sneak peek into my custom New Content view — for a full screen view, click the following image and then click Full Size (at the bottom-left-hand side corner):— Link to comment Share on other sites More sharing options...
dcs18 Posted December 14, 2015 Share Posted December 14, 2015 Accurate rendition and reproduction of posts (especially, those containing a lot of blue texts is the area where the Default (Light) Theme creams it for me — check out the following screenshot (the devil is in the details — you might most likely spot them):— http://www.mediafire.com/download/3u84u95bb8nixad/Tutorials.rar Link to comment Share on other sites More sharing options...
dcs18 Posted December 14, 2015 Share Posted December 14, 2015 1 hour ago, vissha said: Please try to create new topic/reply. You'll see the Preview Post button near Submit reply. If you are referring to the following — then, I'm afraid only copy-paste Trolls who spam the Board would benefit. FWIW, why would copy-paste artists have any need for a Preview button? Link to comment Share on other sites More sharing options...
vissha Posted December 14, 2015 Share Posted December 14, 2015 6 minutes ago, dcs18 said: If you are referring to the following — then, I'm afraid only copy-paste Trolls who spam the Board would benefit. FWIW, why would copy-paste artists have any need for a Preview button? You are wrong. Don't judge copy-paste artists as spammers. They are here to make every nsaners up-to-date with news, tips n tricks, security and other stuff from all over the world to a single forum making it convenient. Also, they also need it for formatting preview, if they do it either manually or copy-paste. Link to comment Share on other sites More sharing options...
dcs18 Posted December 14, 2015 Share Posted December 14, 2015 1 minute ago, vissha said: Don't judge copy-paste artists as spammers. They are here to make every nsaners up-to-date with news, tips n tricks, security and other stuff from all over the world to a single forum making it convenient. Oh yeah, you're right — can't express how much I love your "tips" and "tricks." Link to comment Share on other sites More sharing options...
dcs18 Posted December 14, 2015 Share Posted December 14, 2015 The new Board no longer supports links which contain non alphanumeric characters, example . . . . . #:— Link to comment Share on other sites More sharing options...
Guest Posted December 14, 2015 Share Posted December 14, 2015 4 hours ago, shought said: I'd be happy to take a look at your suggestions for the activity feed. I didn't know quite what to do with it myself. The post preview button has been available since yesterday afternoon. @dcs18I'd be happy to look at your modifications of the default theme as well. and I thought all the privacy issues would be the most important things to fix first. I really dont care what theme is employed by the ENTIRE FCUKING WORLD to view ALL OUR ACTIVITIES!!! or is it just me? 1 hour ago, dcs18 said: Oh yeah, you're right — can't express how much I love your "tips" and "tricks." @dcs18 lol I believe you just did! Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.