# tru_tags v0.9 # Tagging support with full integration # Nathan Arthur # http://rainskit.com/ # ...................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ...................................................................... YTo5OntzOjc6InZlcnNpb24iO3M6MzoiMC45IjtzOjY6ImF1dGhvciI7czoxMzoiTmF0aGFu IEFydGh1ciI7czoxMDoiYXV0aG9yX3VyaSI7czoxODoiaHR0cDovL3RydWlzdC5jb20vIjtz OjExOiJkZXNjcmlwdGlvbiI7czozNzoiVGFnZ2luZyBzdXBwb3J0IHdpdGggZnVsbCBpbnRl Z3JhdGlvbiI7czo0OiJ0eXBlIjtpOjA7czo0OiJuYW1lIjtzOjg6InRydV90YWdzIjtzOjQ6 ImhlbHAiO3M6NzE1NzoiCgk8cD5UbyBsZWFybiBtb3JlIGFib3V0IHRydV90YWdzLCBjaGVj ayBvdXQgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cudHJ1aXN0LmNvbS9ibG9nLzQ5My90cnV0 YWdzLWEtdGFnZ2luZy1wbHVnaW4tZm9yLXRleHRwYXR0ZXJuIj5pbnRyb2R1Y3RvcnkgYXJ0 aWNsZTwvYT4uPC9wPgoJPGgzPkNvbmZpZ3VyYXRpb248L2gzPgoJPHA+VGhpcyBzZWN0aW9u IGRldGFpbHMgd2hhdCBkbyB0byBhZnRlciB5b3UmIzgyMTc7dmUgaW5zdGFsbGVkIHRoZSBw bHVnaW4uICBQbGVhc2UgPGEgaHJlZj0iL3N0YXNoL3RydV90YWdzLTAuOS50eHQiPmNsaWNr IGhlcmUgdG8gc2VlIHRoZSBpbnN0YWxsIGluc3RydWN0aW9uczwvYT4gaWYgeW91IGhhdmVu JiM4MjE3O3QgZG9uZSB0aGF0IHlldC48L3A+Cgk8aDQ+U3RlcCAxOiBDcmVhdGUgYSBuZXcg c2VjdGlvbjwvaDQ+Cgk8cD50cnVfdGFncyBkZXBlbmRzIG9uIHRoZSBleGlzdGVuY2Ugb2Yg YSBzcGVjaWFsIFRleHRwYXR0ZXJuIHNlY3Rpb24gbmFtZWQgJiM4MjIwO3RhZzxzdXA+PGEg aHJlZj0iI2ZuMTI0NjU4MzQwNDQwYTk5MDE2YmJiYyI+MTwvYT48L3N1cD4sJiM4MjIxOyBi eSBkZWZhdWx0LiAgQ3JlYXRlIHRoYXQgc2VjdGlvbiwgdXNpbmcgd2hhdGV2ZXIgc2V0dGlu Z3MgeW91IGxpa2UuICAoWW91IHdvbiYjODIxNzt0IGJlIHB1Ymxpc2hpbmcgYXJ0aWNsZXMg dG8gdGhhdCBzZWN0aW9uLikgIEhlcmUmIzgyMTc7cyB3aGF0IEkgdXNlPHN1cD48YSBocmVm PSIjZm4xNTU1MzM0MjcxNDQwYTk5MDE3MDlmNyI+MjwvYT48L3N1cD46PC9wPgoJPHA+PGlt ZyBzcmM9Imh0dHA6Ly93d3cudHJ1aXN0LmNvbS9pbWFnZXMvMi5wbmciIGhlaWdodD0iMjgw IiB3aWR0aD0iMzk4IiBhbHQ9InRhZyBzZWN0aW9uIGNvbmZpZ3VyYXRpb24iIGNsYXNzPSJk aWFncmFtIiAvPjwvcD4KCTxwIGNsYXNzPSJmb290bm90ZSIgaWQ9ImZuMTI0NjU4MzQwNDQw YTk5MDE2YmJiYyI+PHN1cD4xPC9zdXA+IFlvdSBjYW4gdXNlIGEgZGlmZmVyZW50IG5hbWUs IGJ1dCB5b3UgaGF2ZSB0byB1c2UgYSBzcGVjaWFsIGF0dHJpYnV0ZSBpbiBzb21lIG9mIHRo ZSBwbHVnaW4gY2FsbHMgdG8gbWFrZSAgZXZlcnl0aGluZyB3b3JrIGNvcnJlY3RseS4gIFNl ZSBiZWxvdyBmb3IgZGV0YWlscy48L3A+Cgk8cCBjbGFzcz0iZm9vdG5vdGUiIGlkPSJmbjE1 NTUzMzQyNzE0NDBhOTkwMTcwOWY3Ij48c3VwPjI8L3N1cD4gTm90ZSB0aGF0IEkgdXNlIHRo ZSAmIzgyMTY7ZGVmYXVsdCYjODIxNzsgcGFnZSAmIzgyMTE7IHRoYXQgY2hvaWNlIG1heSBu b3QgYmUgcmlnaHQgZm9yIHlvdS4gIFRoaXMgc2VjdGlvbiB3aWxsIGJlIHNob3duIHdoZW5l dmVyIHlvdSBjbGljayBvbiBhIHRhZywgdG8gZGlzcGxheSB0aGUgdGFnIHNlYXJjaCByZXN1 bHRzLiAgWW91JiM4MjE3O2xsIHdhbnQgYSBwYWdlIHRoYXQgaGFzIHRoZSBjb3JyZWN0IGxh eW91dC9oZWFkZXJzL2Zvb3RlcnMuICBJIHVzZSBteSBkZWZhdWx0IHBhZ2UsIHdpdGggPGNv ZGU+Jmx0O3R4cDppZl9zZWN0aW9uIG5hbWU9InRhZyImZ3Q7PC9jb2RlPiB0byBjaGFuZ2Ug dGhlIHBhZ2UgZGlzcGxheSBpbiB0aGlzIGNhc2UuPC9wPgoJPGg0PlN0ZXAgMjogQ2FsbCB0 aGUgcGx1Z2luIGZyb20gdGhhdCBzZWN0aW9uPC9oND4KCTxwPlRvIG1ha2UgdGFnIHNlYXJj aGluZyBhbmQgdGhlIGRlZmF1bHQgdGFnIGNsb3VkIHdvcmssIHlvdSYjODIxNztsbCBuZWVk IHRvIGNhbGwgPGNvZGU+Jmx0O3R4cDp0cnVfdGFnc19oYW5kbGVyIC8mZ3Q7PC9jb2RlPiBm cm9tIHRoZSBwYWdlIHlvdSBjaG9zZSBpbiBTdGVwIDEuICBJIHJlcGxhY2VkIHRoZSBkZWZh dWx0IDxjb2RlPiZsdDt0eHA6YXJ0aWNsZSAvJmd0OzwvY29kZT4gd2l0aCBzb21ldGhpbmcg bGlrZSB0aGlzOjwvcD4KPHByZT4mbHQ7dHhwOmlmX3NlY3Rpb24gbmFtZT0idGFnIiZndDsK ICAmbHQ7dHhwOnRydV90YWdzX2hhbmRsZXIgLyZndDsKJmx0O3R4cDplbHNlIC8mZ3Q7CiAg Jmx0O3R4cDphcnRpY2xlIC8mZ3Q7CiZsdDsvdHhwOmlmX3NlY3Rpb24mZ3Q7PC9wcmU+Cgk8 aDQ+U3RlcCAzOiBDb25maWd1cmUgeW91ciBhcnRpY2xlIGZvcm0gdG8gZGlzcGxheSB0YWdz PC9oND4KCTxwPlRvIG1ha2UgZWFjaCBhcnRpY2xlIHNob3cgYSBsaXN0IG9mIGFsbCB0aGUg dGFncyBhc3NvY2lhdGVkIHdpdGggaXQsIHB1dCBzb21ldGluZyBsaWtlIHRoaXMgaW4geW91 ciBhcnRpY2xlIGZvcm06PC9wPgo8cHJlPiZsdDt0eHA6dHJ1X3RhZ3NfaWZfaGFzX3RhZ3Mm Z3Q7CiAgdGFnczogJmx0O3R4cDp0cnVfdGFnc19mcm9tX2FydGljbGUgLyZndDsKJmx0Oy90 eHA6dHJ1X3RhZ3NfaWZfaGFzX3RhZ3MmZ3Q7PC9wcmU+Cgk8aDQ+U3RlcCA0OiBEcm9wIGEg Y3VzdG9tIHRhZyBjbG91ZCBzb21ld2hlcmUsIGlmIHlvdSB3YW50PC9oND4KCTxwPklmIHlv dSYjODIxNztkIGxpa2UgdG8gc2hvdyBhIHRhZyBjbG91ZCBzb21ld2hlcmUgb24geW91ciBz aXRlIChvdGhlciB0aGFuIC90YWcvKSwgcHV0IHNvbWV0aGluZyBsaWtlIHRoaXMsIGluIHRo YXQgcGFnZTo8L3A+CjxwcmU+Jmx0O3R4cDp0cnVfdGFnc19jbG91ZCAvJmd0OzwvcHJlPgoJ PGg0PlN0ZXAgNTogU3RhcnQgdGFnZ2luZyE8L2g0PgoJPHA+V2hlbmV2ZXIgeW91IHdyaXRl IGFuIGFydGljbGUsIHB1dCB5b3VyIHRhZ3MgaW50byB0aGUgS2V5d29yZHMgZmllbGQgaW4g VGV4dHBhdHRlcm4uICAoVGhlIEtleXdvcmRzIGZpZWxkIGhpZGVzIGJlaGluZCB0aGUgJiM4 MjIwO0FkdmFuY2VkIE9wdGlvbnMmIzgyMjE7IGxpbmsgb24gdGhlIGxlZnQgc2lkZSBvZiB0 aGUgJiM4MjIwO3dyaXRlJiM4MjIxOyBwYWdlLikgIFRhZ3Mgc2hvdWxkIGJlIHNlcGFyYXRl ZCBieSBjb21tYXMsIGFuZCBjYW4gaGF2ZSBzcGFjZXMuICBCZSBjYXJlZnVsIG5vdCB0byBs ZWF2ZSBzcGFjZXMgYXQgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIHRhZ3MuICBIZXJlJiM4 MjE3O3MgYSBnb29kIGV4YW1wbGU6PC9wPgoJPHA+PGltZyBzcmM9Imh0dHA6Ly93d3cudHJ1 aXN0LmNvbS9pbWFnZXMvMy5wbmciIGhlaWdodD0iMTEwIiB3aWR0aD0iMTE4IiBhbHQ9InRh Z3Mgd2l0aCBzcGFjZXMsIGJ1dCBub3QgbmV4dCB0byB0aGUgY29tbWFzIiBjbGFzcz0iZGlh Z3JhbSIgLz48L3A+Cgk8cD4uLi5hbmQgYSBiYWQgb25lOjwvcD4KCTxwPjxpbWcgc3JjPSJo dHRwOi8vd3d3LnRydWlzdC5jb20vaW1hZ2VzLzQucG5nIiBoZWlnaHQ9IjExMiIgd2lkdGg9 IjExOSIgYWx0PSJ0YWdzIHdpdGggc3BhY2VzIGFmdGVyIHRoZSBjb21tYXMgKFdST05HKSIg Y2xhc3M9ImRpYWdyYW0iIC8+PC9wPgoJPHA+WW91JiM4MjE3O2xsIHByb2JhYmx5IHdhbnQg dG8gaW5zdGFsbCBSb2IgU2FibGUmIzgyMTc7cyA8YSBocmVmPSJodHRwOi8vd3d3LndpbHNo aXJlb25lLmNvbS90ZXh0cGF0dGVybi1wbHVnaW5zL3Jzcy1hZG1pbi1zaG93LWFkdi1vcHRz Ij5yc3NfYWRtaW5fc2hvd19hZHZfb3B0czwvYT4sIHdoaWNoIHdpbGwgYXV0b21hdGljYWxs eSBleHBhbmQgdGhlICYjODIyMDtBZHZhbmNlZCBPcHRpb25zJiM4MjIxOyBzZWN0aW9uIG9m IHRoZSAmIzgyMjA7d3JpdGUmIzgyMjE7IHBhZ2UsIHdoZW4geW91IGFyZSB3cml0aW5nIGFy dGljbGVzLiAgVGhhdCBnaXZlcyB5b3UgZWFzeSBhY2Nlc3MgdG8gdGhlIEtleXdvcmRzIGZp ZWxkLjwvcD4KCTxoND5TdGVwIDY6IEZhbmN5IGRpc3BsYXkgY3VzdG9taXphdGlvbjwvaDQ+ Cgk8cD5Zb3UgY2FuIHVzZSA8Y29kZT50cnVfdGFnc19pZl90YWdfc2VhcmNoPC9jb2RlPiwg PGNvZGU+dHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcjwvY29kZT4sIGFuZCA8Y29kZT50cnVfdGFn c19zZWFyY2hfcGFyYW1ldGVyPC9jb2RlPiB0byBjdXN0b21pemUgeW91ciBwYWdlIHRpdGxl cyBvciB0YWcgc2VhcmNoIHJlc3VsdHMuICBTZWUgYmVsb3cgZm9yIGRldGFpbHMuICBTZWUg dGhlIHRpdGxlYmFyIG9mIDxhIGhyZWY9Imh0dHA6Ly93d3cudHJ1aXN0LmNvbS8iPnRydWlz dC5jb208L2E+IGZvciBhbiBleGFtcGxlLjwvcD4KCTxoMz5UYWcgcmVmZXJlbmNlPC9oMz4K CTxoND48Y29kZT50cnVfdGFnc19oYW5kbGVyPC9jb2RlPjwvaDQ+Cgk8cD5UaGlzIGlzIHRo ZSBtYWluIGZ1bmN0aW9uIHRoYXQgZHJpdmVzIHRhZyBzZWFyY2gsIGFuZCBzaG93cyB0aGUg Z2VuZXJpYyB0YWcgY2xvdWQuICBJdCBzaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIHBhZ2Ug dGhhdCBpcyB1c2VkIGluIHRoZSAmIzgyMTY7dGFnJiM4MjE3OyBzZWN0aW9uLiAgSXQgY2Fs bHMgPGNvZGU+ZG9BcnRpY2xlcygpPC9jb2RlPiB0byBkaXNwbGF5IHRhZyBzZWFyY2ggcmVz dWx0cy48L3A+Cgk8aDQ+PGNvZGU+dHJ1X3RhZ3NfaWZfaGFzX3RhZ3M8L2NvZGU+PC9oND4K CTxwPlRoaXMgY29uZGl0aW9uYWwgdGFnIGNhbiBiZSB1c2VkIGluIGFuIGFydGljbGUgZm9y bSwgYW5kIHdpbGwgZXZhbHVhdGUgaXRzIGNvbnRlbnRzIChlLmcuICYjODIyMDtyZXR1cm4g dHJ1ZSYjODIyMTspIGlmIHRoZSBjdXJyZW50IGFydGljbGUgaGFzIHRhZ3MuPC9wPgoJPGg0 Pjxjb2RlPnRydV90YWdzX2Zyb21fYXJ0aWNsZTwvY29kZT48L2g0PgoJPHA+VGhpcyB0YWcg Y2FuIGJlIHVzZWQgaW4gYW4gYXJ0aWNsZSBmb3JtIHRvIHJldHVybiBhIGxpc3Qgb2YgdGFn cyBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYXJ0aWNsZS4gIEVhY2ggdGFnIGluIHRo ZSBsaXN0IHdpbGwgYmUgYSBsaW5rICg8Y29kZT4mbHQ7YSBocmVmPS4uLiZndDs8L2NvZGU+ KSB0byB0aGUgdGFnIHNlYXJjaCB1cmwgZm9yIHRoYXQgcGFydGljdWxhciB0YWcuPC9wPgoJ PHA+VGhpcyB0YWcgYWNjZXB0cyB0aGUgc3RhbmRhcmQgPGNvZGU+YnJlYWs8L2NvZGU+LCA8 Y29kZT5jbGFzczwvY29kZT4sIGFuZCA8Y29kZT5icmVha2NsYXNzPC9jb2RlPiBhdHRyaWJ1 dGVzLjwvcD4KCTxwPkl0IGFsc28gYWNjZXB0cyBhIDxjb2RlPnRhZ3NlY3Rpb248L2NvZGU+ IGF0dHJpYnV0ZSwgd2hpY2ggdGVsbHMgdHJ1X3RhZ3Mgd2hhdCByZWxhdGl2ZSB1cmwgdG8g dXNlIHRvIGZpbmQgdGhlICYjODIxNjt0YWcmIzgyMTc7IHNlY3Rpb24uICBUaGlzIGNhbiBi ZSB1c2VmdWwgaWYgeW91IGhhdmUgbmFtZWQgdGhlIHNlY3Rpb24gc29tZXRoaW5nIG90aGVy IHRoYW4gJiM4MjE2O3RhZyYjODIxNzsuICBCeSBkZWZhdWx0LCB0aGlzIGlzIHNldCB0byA8 Y29kZT50YWc8L2NvZGU+LjwvcD4KCTxoND48Y29kZT50cnVfdGFnc19jbG91ZDwvY29kZT48 L2g0PgoJPHA+VGhhdCB0YWcgY2FuIGJlIHVzZWQgb24gYW55IHBhZ2UgdG8gZ2VuZXJhdGUg YSBzaW1wbGUgdGFnIGNsb3VkIG9mIGFsbCB0aGUgdGFncyB1c2VkIG9uIHlvdXIgc2l0ZS4g IFRoZSBjbG91ZCBpcyByZWFsbHkganVzdCBhIGxpc3Qgb2YgbGlua3MsIG11Y2ggbGlrZSB0 aGF0IGdlbmVyYXRlZCBieSA8Y29kZT50cnVfdGFnc19mcm9tX2FydGljbGU8L2NvZGU+LCBi dXQgd2l0aCBhIDxjb2RlPnN0eWxlPC9jb2RlPiBhdHRyaWJ1dGUgc2V0IG9uIGVhY2ggbGlu ayB0byBnaXZlIGl0IGEgZnJvbSBzaXplIHJhbmdpbmcgZnJvbSAxMDAlIHRvIDIwMCUuPC9w PgoJPHA+VGhpcyB0YWcgYWNjZXB0cyB0aGUgc3RhbmRhcmQgPGNvZGU+YnJlYWs8L2NvZGU+ LCA8Y29kZT5jbGFzczwvY29kZT4sIGFuZCA8Y29kZT5icmVha2NsYXNzPC9jb2RlPiBhdHRy aWJ1dGVzLjwvcD4KCTxwPkl0IGFsc28gYWNjZXB0cyBhIDxjb2RlPnRhZ3NlY3Rpb248L2Nv ZGU+IGF0dHJpYnV0ZSwgd2hpY2ggdGVsbHMgdHJ1X3RhZ3Mgd2hhdCByZWxhdGl2ZSB1cmwg dG8gdXNlIHRvIGZpbmQgdGhlICYjODIxNjt0YWcmIzgyMTc7IHNlY3Rpb24uICBUaGlzIGNh biBiZSB1c2VmdWwgaWYgeW91IGhhdmUgbmFtZWQgdGhlIHNlY3Rpb24gc29tZXRoaW5nIG90 aGVyIHRoYW4gJiM4MjE2O3RhZyYjODIxNzsuICBCeSBkZWZhdWx0LCB0aGlzIGlzIHNldCB0 byA8Y29kZT50YWc8L2NvZGU+LjwvcD4KCTxwPkxhc3RseSwgdGhpcyB0YWcgYWNjZXB0cyBh IDxjb2RlPnNlY3Rpb248L2NvZGU+IGF0dHJpYnV0ZSwgd2hpY2ggdGVsbHMgaXQgdG8gbGlt aXQgdGhlIGxpc3QgdG8gdGFncyBmcm9tIHRoZSBnaXZlbiBzZWN0aW9uLiAgRm9yIGV4YW1w bGUsIDxjb2RlPiZsdDt0eHA6dHJ1X3RhZ3NfY2xvdWQgc2VjdGlvbj0iYmxvZyIgLyZndDs8 L2NvZGU+IHdvdWxkIG9ubHkgc2hvdyB0YWdzIGZyb20gdGhlICYjODIyMDtibG9nJiM4MjIx OyBzZWN0aW9uLiAgQnkgZGVmYXVsdCwgdGhpcyBpcyBzZXQgdG8gYmxhbmsgKHRvIHNob3cg dGFncyBmcm9tIGFsbCBzZWN0aW9ucykuPC9wPgoJPGg0Pjxjb2RlPnRydV90YWdzX2lmX3Rh Z19zZWFyY2g8L2NvZGU+PC9oND4KCTxwPlRoaXMgY29uZGl0aW9uYWwgdGFnIGNhbiBiZSB1 c2VkIGFueXdoZXJlIGFuZCB3aWxsIGV2YWx1YXRlIGl0cyBjb250ZW50cyAoZS5nLiAmIzgy MjA7cmV0dXJuIHRydWUmIzgyMjE7KSBpZiB0aGUgY3VycmVudCB1cmwgaW5kaWNhdGVzIHRo YXQgdGhlcmUgaXMgYSB0YWcgc2VhcmNoIGdvaW5nIG9uLiAgVGhpcyBjYW4gYmUgdXNlZnVs IGlmIHlvdSB3YW50IHRvIGRvIHNvbWV0aGluZyBsaWtlIGN1c3RvbWl6ZSB0aGUgdGl0bGVi YXIgd2hlbiB1c2luZyB0aGUgdGFnIHNlYXJjaC48L3A+Cgk8aDQ+PGNvZGU+dHJ1X3RhZ3Nf dGFnX3BhcmFtZXRlcjwvY29kZT48L2g0PgoJPHA+VGhpcyB0YWcgY2FuIGJlIHVzZWQgYW55 d2hlcmUgYW5kIHdpbGwgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHRhZyB1bmRl ciBzZWFyY2gsIGR1cmluZyBhIHRhZyBzZWFyY2guICBUaGlzIGlzIGdlbmVyYWxseSB1c2Vk IHdpdGggPGNvZGU+dHJ1X3RhZ3NfaWZfdGFnX3NlYXJjaDwvY29kZT4uPC9wPgoJPGg0Pjxj b2RlPnRydV90YWdzX3NlYXJjaF9wYXJhbWV0ZXI8L2NvZGU+PC9oND4KCTxwPlRoaXMgdGFn IGNhbiBiZSB1c2VkIGFueXdoZXJlIGFuZCB3aWxsIHJldHVybiB3aGF0ZXZlciB0aGUgdXNl ciB0eXBlZCBpbnRvIHRoZSBUZXh0cGF0dGVybiBzZWFyY2ggYm94LCBkdXJpbmcgYSByZWd1 bGFyIHNlYXJjaC4gIFRoaXMgdGFnIGlzIG5vdCBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byB0 YWdnaW5nLCBidXQgY2FuIGJlIGhhbmR5IGZvciBjdXN0b21pemluZyB0aGUgdGl0bGViYXIg KG9yIHRoZSBwYWdlKSBkdXJpbmcgc2VhcmNoIHJlc3VsdHMuPC9wPgoKCiAiO3M6NDoiY29k ZSI7czoyOTY4OiIKCmZ1bmN0aW9uIHRydV90YWdzX2ZpZWxkKCkgewoJcmV0dXJuICdLZXl3 b3Jkcyc7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19oYW5kbGVyKCRhdHRzKSB7CglleHRyYWN0 KCRfR0VUKTsKCWlmICghaXNzZXQoJHQpKSB7CgkJcmV0dXJuIHRydV90YWdzX2Nsb3VkKDAp OwoJfQoJZWxzZSB7CgkJJGF0dHNbJ2tleXdvcmRzJ10gPSBzdHJpcF90YWdzKCR0KTsKCQly ZXR1cm4gZG9BcnRpY2xlcygkYXR0cywgdHJ1ZSk7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFn c19pZl9oYXNfdGFncygkYXR0cywgJHRoaW5nKSB7CglnbG9iYWwgJHRoaXNhcnRpY2xlOwoJ ZXh0cmFjdCgkdGhpc2FydGljbGUpOwoKCSR0YWdzX2ZpZWxkID0gdHJ1X3RhZ3NfZmllbGQo KTsKCgkkcnMgPSBzYWZlX3JvdygkdGFnc19maWVsZCwgInRleHRwYXR0ZXJuIiwgIklEPSck dGhpc2lkJyBBTkQgJHRhZ3NfZmllbGQgPD4gJyciKTsKCWlmICgkcnMpIHsKCQlyZXR1cm4g cGFyc2UoJHRoaW5nKTsKCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX2Zyb21fYXJ0aWNsZSgk YXR0cykgewoKCWdsb2JhbCAkdGhpc2FydGljbGUsICRzaXRldXJsLCAkcGF0aF9mcm9tX3Jv b3Q7CgoJZXh0cmFjdCgkX1NFUlZFUik7CglleHRyYWN0KCR0aGlzYXJ0aWNsZSk7CgoJZXh0 cmFjdChsQXR0cyhhcnJheSgnd3JhcHRhZycgICAgICAgPT4gJycsCgkJCQkJCSdicmVhaycg ICAgICAgICA9PiAnLCAnLAoJCQkJCQknY2xhc3MnICAgICAgICAgPT4gJycsCgkJCQkJCSdi cmVha2NsYXNzJwk9PiAnJywKCQkJCQkJJ3RhZ3NlY3Rpb24nCT0+ICd0YWcnLAoJCQkJCQkp LCRhdHRzKSk7CgoJJHRhZ3NfZmllbGQgPSB0cnVfdGFnc19maWVsZCgpOwoKCSRycyA9IHNh ZmVfcm93KCR0YWdzX2ZpZWxkLCAidGV4dHBhdHRlcm4iLCAiSUQ9JyR0aGlzaWQnIEFORCAk dGFnc19maWVsZCA8PiAnJyIpOwoJJGFsbF90YWdzID0gZXhwbG9kZSgiLCIsIHRyaW0oc3Ry dG9sb3dlcigkcnNbJHRhZ3NfZmllbGRdKSkpOwoJc29ydCgkYWxsX3RhZ3MpOwoJJGFsbF90 YWdzID0gYXJyYXlfdW5pcXVlKCRhbGxfdGFncyk7CgoJJHVybCA9ICdodHRwOi8vJyAuICRz aXRldXJsIC4gJHBhdGhfZnJvbV9yb290IC4gJHRhZ3NlY3Rpb24gLiAnP3Q9JzsKCglmb3Io JGk9MDsgJGk8Y291bnQoJGFsbF90YWdzKTsgJGkrKykgewoJCSR0YWdzX2h0bWxbXSA9ICc8 YSBocmVmPSInIC4gJHVybCAuICRhbGxfdGFnc1skaV0gLiAnIj4nIC4gJGFsbF90YWdzWyRp XSAuJzwvYT4nOwoJfQoJcmV0dXJuIGRvV3JhcCgkdGFnc19odG1sLCAkd3JhcHRhZywgJGJy ZWFrLCAkY2xhc3MsICRicmVha2NsYXNzKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2Nsb3Vk KCRhdHRzKSB7CglnbG9iYWwgJHNpdGV1cmwsICRwYXRoX2Zyb21fcm9vdDsKCWV4dHJhY3Qo JF9TRVJWRVIpOwoKCWV4dHJhY3QobEF0dHMoYXJyYXkoJ3dyYXB0YWcnICAgICAgID0+ICcn LAoJCQkJCQknYnJlYWsnICAgICAgICAgPT4gJywgJywKCQkJCQkJJ2NsYXNzJyAgICAgICAg ID0+ICcnLAoJCQkJCQknYnJlYWtjbGFzcycJPT4gJycsCgkJCQkJCSd0YWdzZWN0aW9uJwk9 PiAndGFnJywKCQkJCQkJJ3NlY3Rpb24nCT0+ICcnLAoJCQkJCQkpLCRhdHRzKSk7CgoJJHRh Z3NfZmllbGQgPSB0cnVfdGFnc19maWVsZCgpOwoKCSRzZWN0aW9uX2NsYXVzZSA9ICcnOwoJ aWYgKCRzZWN0aW9uIDw+ICcnKQoJCSRzZWN0aW9uX2NsYXVzZSA9ICIgQU5EIFNlY3Rpb24g PSAnJHNlY3Rpb24nIjsKCglpbmNsdWRlX29uY2UgdHhwYXRoLicvcHVibGlzaC9zZWFyY2gu cGhwJzsKCSRmaWx0ZXIgPSBmaWx0ZXJTZWFyY2goKTsKCSRhbGxfdGFncyA9IGFycmF5KCk7 CgkkcnMgPSBzYWZlX3Jvd3MoIiR0YWdzX2ZpZWxkIiwgInRleHRwYXR0ZXJuIiwgIiR0YWdz X2ZpZWxkIDw+ICcnIiAuICRzZWN0aW9uX2NsYXVzZSAuICRmaWx0ZXIgLiAiIGFuZCBTdGF0 dXMgPj0gJzQnIGFuZCBQb3N0ZWQgPCBub3coKSIpOwoJZm9yZWFjaCAoJHJzIGFzICRyb3cp IHsKCQkkYWxsX3RhZ3MgPSBhcnJheV9tZXJnZSgkYWxsX3RhZ3MsIGV4cGxvZGUoIiwiLCB0 cmltKHN0cnRvbG93ZXIoJHJvd1skdGFnc19maWVsZF0pKSkpOwoJfQoJc29ydCgkYWxsX3Rh Z3MpOwoKCSR0YWdzX3dlaWdodCA9IGFycmF5X2NvdW50X3ZhbHVlcygkYWxsX3RhZ3MpOwoJ JHRhZ3NfdW5pcXVlID0gYXJyYXlfdW5pcXVlKCRhbGxfdGFncyk7CgoJJG1heCA9IG1heCgk dGFnc193ZWlnaHQpOwoJJG1pbiA9IG1pbigkdGFnc193ZWlnaHQpOwoJJHN0ZXB2YWx1ZSA9 ICgkbWF4ID09ICRtaW4pID8gMCA6IDEwMCAvICgkbWF4IC0gJG1pbik7CgoJJHVybCA9ICdo dHRwOi8vJyAuICRzaXRldXJsIC4gJHBhdGhfZnJvbV9yb290IC4gJHRhZ3NlY3Rpb24gLiAn P3Q9JzsKCWZvcmVhY2ggKCR0YWdzX3VuaXF1ZSBhcyAkbm8pIHsKCQkkdGFnX3dlaWdodCA9 IDEwMCArICgkdGFnc193ZWlnaHRbJG5vXSAtICRtaW4pICogJHN0ZXB2YWx1ZTsKCQkkdGFn c19odG1sW10gPSAnPGEgaHJlZj0iJyAuICR1cmwgLiAkbm8gLiAnIiBzdHlsZT0iZm9udC1z aXplOicuICR0YWdfd2VpZ2h0IC4gJyU7Ij4nIC4gJG5vIC4nPC9hPic7Cgl9CgoJcmV0dXJu IGRvV3JhcCgkdGFnc19odG1sLCAkd3JhcHRhZywgJGJyZWFrLCAkY2xhc3MsICRicmVha2Ns YXNzKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2lmX3RhZ19zZWFyY2goJGF0dHMsICR0aGlu ZykKewoJJHRhZ19zZWFyY2hpbmcgPSBncHMoJ3QnKTsKCSRjb25kaXRpb24gPSAoIWVtcHR5 KCR0YWdfc2VhcmNoaW5nKSk/IHRydWUgOiBmYWxzZTsKCXJldHVybiBwYXJzZShFdmFsRWxz ZSgkdGhpbmcsICRjb25kaXRpb24pKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX3RhZ19wYXJh bWV0ZXIoKQp7CglyZXR1cm4gc3RyaXBfdGFncyhncHMoJ3QnKSk7Cn0KCgpmdW5jdGlvbiB0 cnVfdGFnc19zZWFyY2hfcGFyYW1ldGVyKCkKewoJcmV0dXJuIHN0cmlwX3RhZ3MoZ3BzKCdx JykpOwp9CgoKIjtzOjM6Im1kNSI7czozMjoiNTViNWI4ZWI3OGNlMWJkNTliMGRiZGVlZjk0 YTcxMDEiO30=