# rvm_latin1_to_utf8 v0.3 # Alter pre-MySQL 4.1 tables to use UTF-8 charset # # License: GNU GPLv2 or later # # Ruud van Melick # http://vanmelick.com/ # ...................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ...................................................................... YTo5OntzOjc6InZlcnNpb24iO3M6MzoiMC4zIjtzOjY6ImF1dGhvciI7czoxNToiUnV1ZCB2 YW4gTWVsaWNrIjtzOjEwOiJhdXRob3JfdXJpIjtzOjIxOiJodHRwOi8vdmFubWVsaWNrLmNv bS8iO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjQ3OiJBbHRlciBwcmUtTXlTUUwgNC4xIHRhYmxl cyB0byB1c2UgVVRGLTggY2hhcnNldCI7czo0OiJ0eXBlIjtpOjE7czo0OiJuYW1lIjtzOjE4 OiJydm1fbGF0aW4xX3RvX3V0ZjgiO3M6NDoiaGVscCI7czoyOTU0OiIJPGgxPmxhdGluMSB0 byB1dGY4PC9oMT4KCgk8cD48c3Ryb25nPldBUk5JTkc6IGNhcmVmdWxseSByZWFkIHRoaXMg ZG9jdW1lbnRhdGlvbiBhbmQgPHNwYW4gY2xhc3M9ImNhcHMiPkJBQ0tVUDwvc3Bhbj4gPHNw YW4gY2xhc3M9ImNhcHMiPllPVVI8L3NwYW4+IDxzcGFuIGNsYXNzPSJjYXBzIj5EQVRBQkFT RTwvc3Bhbj4gYmVmb3JlIGFjdGl2YXRpbmcvdXNpbmcgdGhpcyBwbHVnaW4uPC9zdHJvbmc+ PC9wPgoKCTxwPlRleHRwYXR0ZXJuIGFsd2F5cyB1c2VzICYjODIxNjt1dGY4JiM4MjE3OyB0 byBzdG9yZSBkYXRhIGluIHRoZSBkYXRhYmFzZSwgYnV0IGRlcGVuZGluZyBvbiB3aGljaCBN eVNRTCB2ZXJzaW9uIHlvdSB1c2VkIHdoZW4gaW5zdGFsbGluZyBUZXh0cGF0dGVybiwgdGhl IGNoYXJhY3RlciBzZXQgb2YgdGhlIHRhYmxlcyBhbmQgY29sdW1ucyBkaWZmZXJzOjwvcD4K Cgk8b2w+CgkJPGxpPk15U1FMIHZlcnNpb25zIG9sZGVyIHRoYW4gNC4xOiB0aGUgY2hhcmFj dGVyIHNldCBvZiB0aGUgdGFibGVzIGNyZWF0ZWQgYnkgVGV4dHBhdHRlcm4gaXMgdHlwaWNh bGx5ICYjODIxNjtsYXRpbjEmIzgyMTc7LjwvbGk+CgkJPGxpPk15U1FMIHZlcnNpb25zIDQu MSBhbmQgaGlnaGVyOiB0aGUgdGFibGVzIGFyZSBzZXQgdG8gdXNlIHRoZSAmIzgyMTY7dXRm OCYjODIxNzsgY2hhcmFjdGVyIHNldCwgd2hpY2ggbWF0Y2hlcyB0aGUgYWN0dWFsIGNoYXJh Y3RlciBzZXQgb2YgdGhlIGRhdGEgc3RvcmVkIGluIHRob3NlIHRhYmxlcy48L2xpPgoJPC9v bD4KCgk8cD5IYXZpbmcgdGhlIHRhYmxlcy9jb2x1bW5zIHRoZW1zZWx2ZXMgdXNlIHRoZSBz YW1lIGNoYXJhY3RlciBzZXQgYXMgdGhlIGRhdGEgc3RvcmVkIGluIHRoZW0gaGFzIHNvbWUg YWR2YW50YWdlcyB3aGVuIHBlcmZvcm1pbmcgc2VhcmNoZXMgb3Igc29ydGluZyBpbiBUZXh0 cGF0dGVybiwgZXNwZWNpYWxseSBpZiB5b3UgdXNlIGNoYXJhY3RlcnMgb3V0c2lkZSA8c3Bh biBjbGFzcz0iY2FwcyI+VVMtQVNDSUk8L3NwYW4+LjwvcD4KCgk8cD5JZiB5b3UgdXBncmFk ZSB5b3VyIE15U1FMIHZlcnNpb24gZnJvbSBwcmUtNC4xIHRvIDQuMSBvciBoaWdoZXIsIHRo ZSB0YWJsZS9jb2x1bW4gY2hhcmFjdGVyIHNldHMgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IGNv bnZlcnRlZCB0byAmIzgyMTY7dXRmOCYjODIxNzssIHNvIHRoZXkgc3RheSAmIzgyMTY7bGF0 aW4xJiM4MjE3OyB3aGlsZSB0aGUgZGF0YSBzdG9yZWQgaW4gdGhvc2UgdGFibGVzIGlzIHN0 aWxsICYjODIxNjt1dGY4JiM4MjE3Oy48L3A+CgoJPHA+Q2hhbmdpbmcgdGhpcyBpcyB0cmlj a3ksIGJlY2F1c2UgaWYgeW91IHNpbXBseSBjaGFuZ2UgdGhlIGNoYXJhY3RlciBzZXQsIE15 U1FMIGFzc3VtZXMgdGhhdCB0aGUgc3RvcmVkIGRhdGEgbXVzdCBhbHNvIGJlIGNvbnZlcnRl ZCBmcm9tICYjODIxNjtsYXRpbjEmIzgyMTc7IHRvICYjODIxNjt1dGY4JiM4MjE3Oywgd2hp Y2ggbGVhZHMgdG8gZ2FyYmFnZSwgYmVjYXVzZSB0aGUgZGF0YSBpcyBhbHJlYWR5ICYjODIx Njt1dGY4JiM4MjE3Oy48L3A+CgoJPHA+VGhpcyBwbHVnaW4gYXZvaWRzIHRoZSB1bndhbnRl ZCBjaGFyYWN0ZXIgc2V0IGNvbnZlcnNpb24gb2YgdGhlIHN0b3JlZCBkYXRhIGJ5IHRha2lu ZyB0aGUgZm9sbG93aW5nIHN0ZXBzIGZvciBlYWNoIFRleHRwYXR0ZXJuIHRhYmxlOjwvcD4K Cgk8b2w+CgkJPGxpPmRyb3AgaW5kZXhlczwvbGk+CgkJPGxpPmNvbnZlcnQgYWxsIGNvbHVt bnMgdGhhdCBjb250YWluIHRleHQgdG8gdXNlIGEgJiM4MjE2O2JpbmFyeSYjODIxNzsgY2hh cnNldCAoaW5zdGVhZCBvZiAmIzgyMTY7bGF0aW4xJiM4MjE3Oyk8L2xpPgoJCTxsaT5jb252 ZXJ0IHRob3NlIGNvbHVtbnMgeWV0IGFnYWluLCB0aGlzIHRpbWUgdG8gJiM4MjE2O3V0Zjgm IzgyMTc7IGNoYXJzZXQgKGluc3RlYWQgb2YgJiM4MjE2O2JpbmFyeSYjODIxNzspPC9saT4K CQk8bGk+YWRkIGluZGV4ZXM8L2xpPgoJCTxsaT5vcHRpbWl6ZSB0YWJsZTwvbGk+Cgk8L29s PgoKCTxwPkFmdGVyd2FyZHMgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHVwZGF0ZSB0aGUgJiM4 MjE2O2RiY2hhcnNldCYjODIxNzsgc2V0dGluZyBpbiB0aGUgPGNvZGU+dGV4dHBhdHRlcm4v Y29uZmlnLnBocDwvY29kZT4gZmlsZSB0byAmIzgyMTY7dXRmOCYjODIxNzsuIFNob3VsZCB0 aGlzIGZhaWwgZHVlIHRvIGxhY2sgb2YgcGVybWlzc2lvbnMsIHlvdSB3aWxsIGJlIGFza2Vk IHRvIG1ha2UgdGhpcyBjaGFuZ2UgeW91cnNlbGYuIERvIG5vdCBza2lwIHRoaXMgc3RlcCwg b3RoZXJ3aXNlIHlvdSB3aWxsIGV4cGVyaWVuY2UgaXJyZXBhcmFibGUgZGF0YSBjb3JydXB0 aW9uIHNvIHNldmVyZSB0aGF0IHlvdSB3aWxsIGNyeSBsaWtlIGEgYmFieSAoeW91IG1hZGUg YmFja3VwcywgcmlnaHQ/KSwgbXVjaCB0byB0aGUgYW11c2VtZW50IG9mIG9ubG9va2Vycy48 L3A+CgoJPHA+SG93IHRvIHVzZSB0aGlzIHBsdWdpbjo8L3A+CgoJPG9sPgoJCTxsaT48c3Ry b25nPjxzcGFuIGNsYXNzPSJjYXBzIj48c3BhbiBjbGFzcz0iY2FwcyI+TUFLRTwvc3Bhbj48 L3NwYW4+IDxzcGFuIGNsYXNzPSJjYXBzIj48c3BhbiBjbGFzcz0iY2FwcyI+QkFDS1VQUzwv c3Bhbj48L3NwYW4+IEZJUlNUITwvc3Ryb25nPiAobm90IGp1c3QgdGhlIDxzcGFuIGNsYXNz PSJjYXBzIj48c3BhbiBjbGFzcz0iY2FwcyI+VFhQPC9zcGFuPjwvc3Bhbj4gdGFibGVzLCBi dXQgdGhlIGVudGlyZSBkYXRhYmFzZSk8L2xpPgoJCTxsaT5NYWtlIHN1cmUgeW91IGhhdmUg TXlTUUwgdmVyc2lvbiA0LjEgb3IgaGlnaGVyIGluc3RhbGxlZC48L2xpPgoJCTxsaT5BY3Rp dmF0ZSB0aGUgcGx1Z2luLjwvbGk+CgkJPGxpPjxhIGhyZWY9Ij9ldmVudD1ydm1fbGF0aW4x X3RvX3V0ZjgiPkNsaWNrIGhlcmU8L2E+IGFuZCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyBv biB0aGUgc2NyZWVuLjwvbGk+Cgk8L29sPiI7czo0OiJjb2RlIjtzOjYzMDM6IgppZiAodHhw aW50ZXJmYWNlID09ICdhZG1pbicgYW5kIGdwcygnZXZlbnQnKSA9PSAncnZtX2xhdGluMV90 b191dGY4JykKewogIGFkZF9wcml2cygncnZtX2xhdGluMV90b191dGY4JywgJzEnKTsKICBy ZWdpc3Rlcl90YWIoJ2V4dGVuc2lvbnMnLCAncnZtX2xhdGluMV90b191dGY4JywgJ2xhdGlu MV90b191dGY4Jyk7CiAgcmVnaXN0ZXJfY2FsbGJhY2soJ3J2bV9sYXRpbjFfdG9fdXRmOCcs ICdydm1fbGF0aW4xX3RvX3V0ZjgnKTsKfQoKZnVuY3Rpb24gcnZtX2xhdGluMV90b191dGY4 KCkKewogIGdsb2JhbCAkdHhwY2ZnOwoKICAkZGVidWcgPSBGQUxTRTsKCiAgcmVxdWlyZV9w cml2cygncnZtX2xhdGluMV90b191dGY4Jyk7CgogIHBhZ2V0b3AoJycpOwoKICBlY2hvICc8 ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogNTBweCI+JzsKCiAgaWYgKHZlcnNpb25fY29tcGFy ZShteXNxbF9nZXRfc2VydmVyX2luZm8oKSwgJzQuMS4wJywgJzwnKSkKICB7CiAgICBlY2hv IGdyYWYoJ1RoZSBydm1fbGF0aW4xX3RvX3V0ZjggcGx1Z2luIGhhcyBiZWVuIHJlbW92ZWQs IGJlY2F1c2UgeW91ciBNeVNRTCB2ZXJzaW9uIGlzIGxvd2VyIHRoYW4gNC4xLicpOwogICAg c2FmZV9kZWxldGUoJ3R4cF9wbHVnaW4nLCAibmFtZSA9ICdydm1fbGF0aW4xX3RvX3V0Zjgn Iik7CiAgICBydm1fbGF0aW4xX3RvX3V0ZjhfZW5kKCk7CiAgfQoKICAjIHN0YW5kYXJkIFRY UCB0YWJsZXMKICAkdHhwdGFibGVzID0gYXJyYXkoCiAgICAndGV4dHBhdHRlcm4nLAogICAg J3R4cF9jYXRlZ29yeScsCiAgICAndHhwX2NzcycsCiAgICAndHhwX2Rpc2N1c3MnLAogICAg J3R4cF9kaXNjdXNzX2lwYmFuJywKICAgICd0eHBfZGlzY3Vzc19ub25jZScsCiAgICAndHhw X2ZpbGUnLAogICAgJ3R4cF9mb3JtJywKICAgICd0eHBfaW1hZ2UnLAogICAgJ3R4cF9sYW5n JywKICAgICd0eHBfbGluaycsCiAgICAndHhwX2xvZycsCiAgICAndHhwX3BhZ2UnLAogICAg J3R4cF9wbHVnaW4nLAogICAgJ3R4cF9wcmVmcycsCiAgICAndHhwX3ByaXYnLAogICAgJ3R4 cF9zZWN0aW9uJywKICAgICd0eHBfdXNlcnMnCiAgKTsKCiAgIyBmaW5kIHRhYmxlcyB0aGF0 IG1hdGNoIHRoZSBUWFAgdGFibGUgcHJlZml4LCBtYXJrIHN0YW5kYXJkIGFuZCBzZWxlY3Rl ZCBvbmVzLgogICRteXRhYmxlcyA9IHBzKCdteXRhYmxlcycsIGFycmF5KCkpID8gcHMoJ215 dGFibGVzJykgOiBhcnJheSgpOwogICR1bmtub3duICA9IEZBTFNFOwoKICBpZiAoJHJzID0g c2FmZV9xdWVyeSgiU0hPVyBUQUJMRVMgTElLRSAnIi5hZGRjc2xhc2hlcyhkb1NsYXNoKFBG WCksICclXycpLiIlJyIpKQogIHsKICAgIHdoaWxlICgkcm93ID0gbXlzcWxfZmV0Y2hfcm93 KCRycykpCiAgICB7CiAgICAgICR0YWJsZSA9IHN1YnN0cigkcm93WzBdLCBzdHJsZW4oUEZY KSk7CgogICAgICBpZiAoaW5fYXJyYXkoJHRhYmxlLCAkdHhwdGFibGVzKSBvciBpbl9hcnJh eSgkdGFibGUsICRteXRhYmxlcykpCiAgICAgIHsKICAgICAgICAkdGFibGVzW10gPSAkdGFi bGU7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgJHVua25vd24gPSBUUlVF OwogICAgICB9CgogICAgICAkaW5wdXRzW10gPQogICAgICAgICc8bGFiZWw+Jy4KICAgICAg ICAgICc8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9Im15dGFibGVzW10iIHZhbHVlPSIn Lmh0bWxzcGVjaWFsY2hhcnMoJHRhYmxlKS4nIiAnLgogICAgICAgICAgICAoaW5fYXJyYXko JHRhYmxlLCAkdHhwdGFibGVzKSA/ICdkaXNhYmxlZD0iZGlzYWJsZWQiIGNoZWNrZWQ9ImNo ZWNrZWQiJyA6ICcnKS4nIC8+Jy4KICAgICAgICAgIGh0bWxzcGVjaWFsY2hhcnMoUEZYLiR0 YWJsZSkuCiAgICAgICAgJzwvbGFiZWw+JzsKICAgIH0KICB9CiAgZWxzZQogIHsKICAgIGVj aG8gZ3JhZignSG1tbS4uLiBzdHJhbmdlLCBJIGNhbm5vdCBmaW5kIGFueSB0YWJsZXMgdGhh dCBtYXRjaCB5b3VyIFRYUCB0YWJsZSBwcmVmaXgnKTsKICB9CgogICMgYXNrIHVzZXIgd2hh dCB0byBkbyB3aXRoIHRhYmxlcyB3ZSdyZSBub3Qgc3VyZSBhYm91dC4KICBpZiAoJHVua25v d24gYW5kICFwcygnY29udGludWUnKSkKICB7CiAgICBlY2hvCiAgICAgIGdyYWYoJ0JlbG93 LCBhIGxpc3Qgb2YgdGFibGVzIGlzIHNob3duIHRoYXQgbWF5IGJlIHBhcnQgb2YgeW91ciBU ZXh0cGF0dGVybiBpbnN0YWxsLicpLgogICAgICBncmFmKCdTb21lIG9mIHRoZXNlIHRhYmxl cyBtYXkgaGF2ZSBiZWVuIGNyZWF0ZWQgYnkgcGx1Z2lucyB5b3UgaGF2ZSBpbnN0YWxsZWQu PGJyIC8+CiAgICAgICAgSW4gdGhhdCBjYXNlLCBjaGVjayB0aGUgdGFibGVzIHRoYXQgdGhl c2UgcGx1Z2lucyBoYXZlIGFkZGVkLjxiciAvPgogICAgICAgIEJlIGNhcmVmdWwgbm90IHRv IGNoZWNrIHRhYmxlcyB0aGF0IGFyZSBub3QgcmVsYXRlZCB0byB0aGlzIFRleHRwYXR0ZXJu IGluc3RhbGwhJykuCiAgICAgIGdyYWYoJ1RoZSBzdGFuZGFyZCBUZXh0cGF0dGVybiB0YWJs ZXMgYXJlIGFscmVhZHkgY2hlY2tlZC4nKS4KICAgICAgZm9ybSgKICAgICAgICBqb2luKCc8 YnIgLz4nLCAkaW5wdXRzKS4KICAgICAgICBncmFmKAogICAgICAgICAgZUlucHV0KCdydm1f bGF0aW4xX3RvX3V0ZjgnKS4nPGJyIC8+Jy4KICAgICAgICAgIGZJbnB1dCgnc3VibWl0Jywg J2NvbnRpbnVlJywgJ0NvbnRpbnVlJywgJ3B1Ymxpc2gnKQogICAgICAgICkKICAgICAgKTsK CiAgICBydm1fbGF0aW4xX3RvX3V0ZjhfZW5kKCk7CiAgfQoKICBlY2hvIGdyYWYoJ1VwZGF0 aW5nIFRleHRwYXR0ZXJuIHRhYmxlcy4uLicpOwoKICAjIGxvb3AgdGhyb3VnaCB0YWJsZXMK ICBmb3JlYWNoICgkdGFibGVzIGFzICR0YWJsZSkKICB7CiAgICAkaW5kZXhlcyA9IGFycmF5 KCk7CiAgICAkZHJvcCAgICA9IGFycmF5KCk7CiAgICAkY3JlYXRlICA9IGFycmF5KCk7CiAg ICAkYmluICAgICA9IGFycmF5KCk7CiAgICAkdXRmOCAgICA9IGFycmF5KCk7CiAgICAkY29s cyAgICA9IGFycmF5KCk7CgogICAgIyBwcmVwYXJlIGFsdGVyIHN0YXRlbWVudHMgZm9yIGNv bHVtbnMKICAgICRjb2x1bW5zID0gZ2V0Um93cygnU0hPVyBDT0xVTU5TIEZST00gJy5zYWZl X3BmeCgkdGFibGUpKTsKCiAgICBpZiAoJGNvbHVtbnMpIGZvcmVhY2ggKCRjb2x1bW5zIGFz ICRjb2x1bW4pCiAgICB7CiAgICAgIGV4dHJhY3QoJGNvbHVtbik7CgogICAgICBpZiAocHJl Z19tYXRjaCgnL14oY2hhcnx2YXJjaGFyfHRpbnl0ZXh0fHRleHR8bWVkaXVtdGV4dHxsb25n dGV4dHxlbnVtfHNldClcYi8nLCAkVHlwZSkpCiAgICAgIHsKICAgICAgICAkTnVsbCA9ICgk TnVsbCA9PSAnWUVTJyA/ICcgTlVMTCcgOiAnIE5PVCBOVUxMJyk7CgogICAgICAgICRiZWdp biA9ICdNT0RJRlkgYCcuZG9TbGFzaCgkRmllbGQpLidgICcuJFR5cGUuJyBDSEFSQUNURVIg U0VUICc7CiAgICAgICAgJGVuZCAgID0gJE51bGwuIiBERUZBVUxUICciLmRvU2xhc2goJERl ZmF1bHQpLiInIjsKCiAgICAgICAgJGJpbltdICA9ICRiZWdpbi4nYmluYXJ5Jy4kZW5kOwog ICAgICAgICR1dGY4W10gPSAkYmVnaW4uJ3V0ZjggQ09MTEFURSB1dGY4X2dlbmVyYWxfY2kn LiRlbmQ7CiAgICAgICAgJGNvbHNbXSA9ICRGaWVsZDsKICAgICAgfQogICAgfQoKICAgICMg YW5hbHlzZSBpbmRleCBzdHJ1Y3R1cmVzCiAgICAkcm93cyA9IGdldFJvd3MoJ1NIT1cgSU5E RVggRlJPTSAnLnNhZmVfcGZ4KCR0YWJsZSkpOwoKICAgIGlmICgkcm93cykgZm9yZWFjaCAo JHJvd3MgYXMgJHJvdykKICAgIHsKICAgICAgZXh0cmFjdCgkcm93KTsKCiAgICAgIGlmICgk S2V5X25hbWUgPT0gJ1BSSU1BUlknIG9yICFpbl9hcnJheSgkQ29sdW1uX25hbWUsICRjb2xz KSkKICAgICAgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgICAkS2V5X25hbWUg PSAnYCcuJEtleV9uYW1lLidgJzsKCiAgICAgICRpbmRleGVzWyRLZXlfbmFtZV1bJ3VuaXF1 ZSddID0gKCROb25fdW5pcXVlID8gJycgOiAnIFVOSVFVRScpOwogICAgICAkaW5kZXhlc1sk S2V5X25hbWVdWydmdWxsdGV4dCddID0gKCRJbmRleF90eXBlID09ICdGVUxMVEVYVCcgPyAn IEZVTExURVhUJyA6ICcnKTsKICAgICAgJGluZGV4ZXNbJEtleV9uYW1lXVsnY29sdW1ucydd WyRTZXFfaW5faW5kZXhdID0gJ2AnLiRDb2x1bW5fbmFtZS4nYCcuKCRTdWJfcGFydCA/ICcg KCcuJFN1Yl9wYXJ0LicpJyA6ICcnKTsKICAgIH0KCiAgICAjIHByZXBhcmUgaW5kZXggZHJv cC9jcmVhdGUgc3RhdGVtZW50cwogICAgZm9yZWFjaCAoJGluZGV4ZXMgYXMgJGluZGV4ID0+ ICRzdHJ1Y3R1cmUpCiAgICB7CiAgICAgIGV4dHJhY3QoJHN0cnVjdHVyZSk7CgogICAgICAk ZHJvcFtdICAgPSAnRFJPUCBJTkRFWCAnLiRpbmRleDsKICAgICAgJGNyZWF0ZVtdID0gJ0FE RCcuJHVuaXF1ZS4kZnVsbHRleHQuJyBJTkRFWCAnLiRpbmRleC4nICgnLmpvaW4oJywgJywg JGNvbHVtbnMpLicpJzsKICAgIH0KCiAgICAkc3VjY2VzcyA9IFRSVUU7CgogICAgIyBhbHRl ciB0aGUgdGFibGUgKyBpbmRleGVzCiAgICBpZiAoJGRyb3ApCiAgICB7CiAgICAgICRzdWNj ZXNzICo9IHNhZmVfYWx0ZXIoJHRhYmxlLCBqb2luKCcsICcsICRkcm9wKSwgJGRlYnVnKTsK ICAgIH0KCiAgICBpZiAoJGJpbiBhbmQgJHN1Y2Nlc3MpCiAgICB7CiAgICAgICRzdWNjZXNz ICo9IHNhZmVfYWx0ZXIoJHRhYmxlLCBqb2luKCcsICcsICRiaW4pLCAkZGVidWcpOwoKICAg ICAgaWYgKCRzdWNjZXNzKQogICAgICB7CiAgICAgICAgJHN1Y2Nlc3MgKj0gc2FmZV9hbHRl cigkdGFibGUsIGpvaW4oJywgJywgJHV0ZjgpLicsIERFRkFVTFQgQ0hBUkFDVEVSIFNFVCB1 dGY4IENPTExBVEUgdXRmOF9nZW5lcmFsX2NpJywgJGRlYnVnKTsKICAgICAgfQogICAgfQoK ICAgIGlmICgkY3JlYXRlIGFuZCAkc3VjY2VzcykKICAgIHsKICAgICAgJHN1Y2Nlc3MgKj0g c2FmZV9hbHRlcigkdGFibGUsIGpvaW4oJywgJywgJGNyZWF0ZSksICRkZWJ1Zyk7CiAgICB9 CiAgfQoKICAjIHdoaWxlIHdlJ3JlIGhlcmUsIG1pZ2h0IGFzIHdlbGwgb3B0aW1pemUgdGhl IHRhYmxlcwogIHNhZmVfcXVlcnkoIk9QVElNSVpFIFRBQkxFICIuam9pbignLCAnLCBhcnJh eV9tYXAoJ3NhZmVfcGZ4JywgJHRhYmxlcykpLCAkZGVidWcpOwoKICBpZiAoJHN1Y2Nlc3Mp CiAgewogICAgZWNobyBncmFmKCdTdWNjZXNmdWxseSBjb21wbGV0ZWQuJyk7CgogICAgJGZp bGUgICA9IHR4cGF0aC4nL2NvbmZpZy5waHAnOwogICAgJGNvbmZpZyA9IGZpbGVfZ2V0X2Nv bnRlbnRzKCRmaWxlKTsKICAgICRjb25maWcgPSBzdHJfcmVwbGFjZSgnPz4nLCBuLicjIHJ2 bV9sYXRpbjFfdG9fdXRmOCBwbHVnaW4gYWRkZWQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIGVu c3VyZSBhIGNvcnJlY3QgZGJjaGFyc2V0Jy5uLickdHhwY2ZnW1wnZGJjaGFyc2V0XCddID0g XCd1dGY4XCcnLm4uJz8+JywgJGNvbmZpZyk7CgogICAgaWYgKCR0eHBjZmdbJ2RiY2hhcnNl dCddID09ICd1dGY4JwogICAgICBvciBpc193cml0YWJsZSgkZmlsZSkKICAgICAgYW5kICRo YW5kbGUgPSBmb3BlbigkZmlsZSwgJ3cnKQogICAgICBhbmQgZndyaXRlKCRoYW5kbGUsICRj b25maWcpICE9PSBGQUxTRQogICAgICBhbmQgZmNsb3NlKCRoYW5kbGUpKQogICAgewogICAg ICBlY2hvIGdyYWYoJ1RoZSBydm1fbGF0aW4xX3RvX3V0ZjggcGx1Z2luIGhhcyBiZWVuIGF1 dG9tYXRpY2FsbHkgZGUtaW5zdGFsbGVkLicpOwogICAgICBzYWZlX2RlbGV0ZSgndHhwX3Bs dWdpbicsICJuYW1lID0gJ3J2bV9sYXRpbjFfdG9fdXRmOCciKTsKICAgIH0KICAgIGVsc2UK ICAgIHsKICAgICAgZWNobyBncmFmKCc8Yj5XQVJOSU5HOiB0ZXh0cGF0dGVybi9jb25maWcu cGhwIGNvdWxkIG5vdCBiZSB1cGRhdGVkIGF1dG9tYXRpY2FsbHkuIFBsZWFzZSB1cGRhdGUg eW91ciB0ZXh0cGF0dGVybi9jb25maWcucGhwIGZpbGUgdG8gY29udGFpbiA8Y29kZT4kdHhw Y2ZnW1wnZGJjaGFyc2V0XCddID0gXCd1dGY4XCc7PC9jb2RlPjwvYj4gYW5kIGRlaW5zdGFs bCB0aGUgcnZtX2xhdGluMV90b191dGY4IHBsdWdpbiBtYW51YWxseScpOwogICAgfQogIH0K ICBlbHNlCiAgewogICAgZWNobyBncmFmKCdEdWUgdG8gb25lIG9yIG1vcmUgZXJyb3JzIHRo ZSB0YWJsZXMgY291bGQgbm90IGJlIHVwZGF0ZWQgY29ycmVjdGx5LiBZb3UgbWF5IGhhdmUg dG8gcmVzdG9yZSBhIGJhY2t1cC4nKTsKICB9CgogIHJ2bV9sYXRpbjFfdG9fdXRmOF9lbmQo KTsKfQoKZnVuY3Rpb24gcnZtX2xhdGluMV90b191dGY4X2VuZCgpCnsKICBlY2hvICc8L2Rp dj4nOwogIGVuZF9wYWdlKCk7CiAgZXhpdCgpOwp9CiI7czozOiJtZDUiO3M6MzI6ImQyYWEw YmY5MjE5NGU4YmZjNjUxMWY4YTk2ZTY3NTJiIjt9