# tru_tags v1.2 # 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: # ...................................................................... YTo5OntzOjc6InZlcnNpb24iO3M6MzoiMS4yIjtzOjY6ImF1dGhvciI7czoxMzoiTmF0aGFu IEFydGh1ciI7czoxMDoiYXV0aG9yX3VyaSI7czoxODoiaHR0cDovL3RydWlzdC5jb20vIjtz OjExOiJkZXNjcmlwdGlvbiI7czozNzoiVGFnZ2luZyBzdXBwb3J0IHdpdGggZnVsbCBpbnRl Z3JhdGlvbiI7czo0OiJ0eXBlIjtpOjA7czo0OiJuYW1lIjtzOjg6InRydV90YWdzIjtzOjQ6 ImhlbHAiO3M6MTI5MDA6IgoJPHA+VG8gbGVhcm4gbW9yZSBhYm91dCB0cnVfdGFncywgY2hl Y2sgb3V0IHRoZSA8YSBocmVmPSIvYmxvZy80OTMvdHJ1dGFncy1hLXRhZ2dpbmctcGx1Z2lu LWZvci10ZXh0cGF0dGVybiI+aW50cm9kdWN0b3J5IGFydGljbGU8L2E+IGFuZCA8YSBocmVm PSJodHRwOi8vd3d3LnRydWlzdC5jb20vcmVmZXJlbmNlLzQ5NS90cnV0YWdzLWZlYXR1cmUt bGlzdCI+ZmVhdHVyZSBsaXN0PC9hPi48L3A+Cgk8cD5Db3B5cmlnaHQgMjAwNiBOYXRoYW4g QXJ0aHVyPC9wPgoJPHA+UmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSwg c2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UucGhw IGZvciBkZXRhaWxzPC9wPgoJPHA+VGhpcyB3b3JrIGlzIGJhc2VkIG9uIHJhbl90YWdzIGJ5 IFJhbiBBcm91c3NpLCBvcmlnaW5hbGx5IGZvdW5kIGF0IGh0dHA6Ly9hcm91c3NpLmNvbS9h cnRpY2xlLzQ1L3RhZ2dpbmctdGV4dHBhdHRlcm4uICBJdCBhbHNvIGNvbnRhaW5zIGNvZGUg YWRhcHRlZCBmcm9tIGdkdHJvaWFubywgc2VlIGh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5j b20vdmlld3RvcGljLnBocD9waWQ9MTAyODc1I3AxMDI4NzUuPC9wPgoJPGgzPkNvbmZpZ3Vy YXRpb248L2gzPgoJPGg0PlN0ZXAgMTogQ3JlYXRlIGEgbmV3IHNlY3Rpb248L2g0PgoJPHA+ dHJ1X3RhZ3MgZGVwZW5kcyBvbiB0aGUgZXhpc3RlbmNlIG9mIGEgc3BlY2lhbCBUZXh0cGF0 dGVybiBzZWN0aW9uIG5hbWVkICYjODIyMDt0YWcsJiM4MjIxOyBieSBkZWZhdWx0PHN1cD48 YSBocmVmPSIjZm44NzI0MjQwMDQ0MTIyYjdlYmRlOTgiPjE8L2E+PC9zdXA+LiAgQ3JlYXRl IHRoYXQgc2VjdGlvbiwgdXNpbmcgd2hhdGV2ZXIgc2V0dGluZ3MgeW91IGxpa2UuICAoWW91 IHdvbiYjODIxNzt0IGJlIHB1Ymxpc2hpbmcgYXJ0aWNsZXMgdG8gdGhhdCBzZWN0aW9uLikg IEhlcmUmIzgyMTc7cyB3aGF0IEkgdXNlPHN1cD48YSBocmVmPSIjZm40NDUxNzMzNjY0NDEy MmI3ZWMyY2Q0Ij4yPC9hPjwvc3VwPjo8L3A+Cgk8cD48aW1nIHNyYz0iaHR0cDovL3d3dy50 cnVpc3QuY29tL2ltYWdlcy8yLnBuZyIgaGVpZ2h0PSIyODAiIHdpZHRoPSIzOTgiIGFsdD0i dGFnIHNlY3Rpb24gY29uZmlndXJhdGlvbiIgY2xhc3M9ImRpYWdyYW0iIC8+PC9wPgoJPHAg Y2xhc3M9ImZvb3Rub3RlIiBpZD0iZm44NzI0MjQwMDQ0MTIyYjdlYmRlOTgiPjxzdXA+MTwv c3VwPiBZb3UgY2FuIHVzZSBhIGRpZmZlcmVudCBuYW1lLCBidXQgeW91IGhhdmUgdG8gdXNl IGEgc3BlY2lhbCBhdHRyaWJ1dGUgaW4gc29tZSBvZiB0aGUgcGx1Z2luIGNhbGxzIHRvIG1h a2UgIGV2ZXJ5dGhpbmcgd29yayBjb3JyZWN0bHkuICBTZWUgYmVsb3cgZm9yIGRldGFpbHMu PC9wPgoJPHAgY2xhc3M9ImZvb3Rub3RlIiBpZD0iZm40NDUxNzMzNjY0NDEyMmI3ZWMyY2Q0 Ij48c3VwPjI8L3N1cD4gTm90ZSB0aGF0IEkgdXNlIHRoZSAmIzgyMTY7ZGVmYXVsdCYjODIx NzsgcGFnZSAmIzgyMTE7IHRoYXQgY2hvaWNlIG1heSBub3QgYmUgcmlnaHQgZm9yIHlvdS4g IFRoaXMgc2VjdGlvbiB3aWxsIGJlIHNob3duIHdoZW5ldmVyIHlvdSBjbGljayBvbiBhIHRh ZywgdG8gZGlzcGxheSB0aGUgdGFnIHNlYXJjaCByZXN1bHRzLiAgWW91JiM4MjE3O2xsIHdh bnQgYSBwYWdlIHRoYXQgaGFzIHRoZSBjb3JyZWN0IGxheW91dC9oZWFkZXJzL2Zvb3RlcnMu ICBJIHVzZSBteSBkZWZhdWx0IHBhZ2UsIHdpdGggPGNvZGU+Jmx0O3R4cDppZl9zZWN0aW9u IG5hbWU9InRhZyImZ3Q7PC9jb2RlPiB0byBjaGFuZ2UgdGhlIHBhZ2UgZGlzcGxheSBpbiB0 aGlzIGNhc2UuPC9wPgoJPGg0PlN0ZXAgMjogQ2FsbCB0aGUgcGx1Z2luIGZyb20gdGhhdCBz ZWN0aW9uPC9oND4KCTxwPlRvIG1ha2UgdGFnIHNlYXJjaGluZyBhbmQgdGhlIGRlZmF1bHQg dGFnIGNsb3VkIHdvcmssIHlvdSYjODIxNztsbCBuZWVkIHRvIGNhbGwgPGNvZGU+Jmx0O3R4 cDp0cnVfdGFnc19oYW5kbGVyIC8mZ3Q7PC9jb2RlPiBmcm9tIHRoZSBwYWdlIHlvdSBjaG9z ZSBpbiBTdGVwIDEuICBJIHJlcGxhY2VkIHRoZSBkZWZhdWx0IDxjb2RlPiZsdDt0eHA6YXJ0 aWNsZSAvJmd0OzwvY29kZT4gd2l0aCBzb21ldGhpbmcgbGlrZSB0aGlzOjwvcD4KPHByZT4m bHQ7dHhwOmlmX3NlY3Rpb24gbmFtZT0idGFnIiZndDsKICAmbHQ7dHhwOnRydV90YWdzX2hh bmRsZXIgLyZndDsKJmx0O3R4cDplbHNlIC8mZ3Q7CiAgJmx0O3R4cDphcnRpY2xlIC8mZ3Q7 CiZsdDsvdHhwOmlmX3NlY3Rpb24mZ3Q7PC9wcmU+Cgk8aDQ+U3RlcCAzOiBDb25maWd1cmUg eW91ciBhcnRpY2xlIGZvcm0gdG8gZGlzcGxheSB0YWdzPC9oND4KCTxwPlRvIG1ha2UgZWFj aCBhcnRpY2xlIHNob3cgYSBsaXN0IG9mIGFsbCB0aGUgdGFncyBhc3NvY2lhdGVkIHdpdGgg aXQsIHB1dCBzb21ldGluZyBsaWtlIHRoaXMgaW4geW91ciBhcnRpY2xlIGZvcm06PC9wPgo8 cHJlPiZsdDt0eHA6dHJ1X3RhZ3NfaWZfaGFzX3RhZ3MmZ3Q7CiAgdGFnczogJmx0O3R4cDp0 cnVfdGFnc19mcm9tX2FydGljbGUgLyZndDsKJmx0Oy90eHA6dHJ1X3RhZ3NfaWZfaGFzX3Rh Z3MmZ3Q7PC9wcmU+Cgk8aDQ+U3RlcCA0OiBEcm9wIGEgY3VzdG9tIHRhZyBjbG91ZCBzb21l d2hlcmUsIGlmIHlvdSB3YW50PC9oND4KCTxwPklmIHlvdSYjODIxNztkIGxpa2UgdG8gc2hv dyBhIHRhZyBjbG91ZCBzb21ld2hlcmUgb24geW91ciBzaXRlIChvdGhlciB0aGFuIC90YWcv KSwgcHV0IHNvbWV0aGluZyBsaWtlIHRoaXMgaW4gdGhhdCBwYWdlOjwvcD4KPHByZT4mbHQ7 dHhwOnRydV90YWdzX2Nsb3VkIC8mZ3Q7PC9wcmU+Cgk8cD5TZWUgYmVsb3cgZm9yIGxvdHMg b2YgZm9ybWF0dGluZyBvcHRpb25zLCBpbmNsdWRpbmcgdGhlIGFiaWxpdHkgdG8gb3V0cHV0 IGEgc2ltcGxlIGxpc3QgaW5zdGVhZCBvZiBhIGNsb3VkICh1c2luZyA8Y29kZT50cnVfdGFn c19saXN0PC9jb2RlPikuPC9wPgoJPGg0PlN0ZXAgNTogU3RhcnQgdGFnZ2luZyE8L2g0PgoJ PHA+V2hlbmV2ZXIgeW91IHdyaXRlIGFuIGFydGljbGUsIHB1dCB5b3VyIHRhZ3MgaW50byB0 aGUgS2V5d29yZHMgZmllbGQgaW4gVGV4dHBhdHRlcm4uICAoVGhlIEtleXdvcmRzIGZpZWxk IGhpZGVzIGJlaGluZCB0aGUgJiM4MjIwO0FkdmFuY2VkIE9wdGlvbnMmIzgyMjE7IGxpbmsg b24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgJiM4MjIwO3dyaXRlJiM4MjIxOyBwYWdlLikgIFRh Z3Mgc2hvdWxkIGJlIHNlcGFyYXRlZCBieSBjb21tYXMsIGFuZCBjYW4gaGF2ZSBzcGFjZXMu ICBCZSBjYXJlZnVsIG5vdCB0byBsZWF2ZSBzcGFjZXMgYXQgdGhlIGJlZ2lubmluZyBhbmQg ZW5kIG9mIHRhZ3MuICBIZXJlJiM4MjE3O3MgYSBnb29kIGV4YW1wbGU6PC9wPgoJPHA+PGlt ZyBzcmM9Imh0dHA6Ly93d3cudHJ1aXN0LmNvbS9pbWFnZXMvMy5wbmciIGhlaWdodD0iMTEw IiB3aWR0aD0iMTE4IiBhbHQ9InRhZ3Mgd2l0aCBzcGFjZXMsIGJ1dCBub3QgbmV4dCB0byB0 aGUgY29tbWFzIiBjbGFzcz0iZGlhZ3JhbSIgLz48L3A+Cgk8cD4uLi5hbmQgYSBiYWQgb25l OjwvcD4KCTxwPjxpbWcgc3JjPSJodHRwOi8vd3d3LnRydWlzdC5jb20vaW1hZ2VzLzQucG5n IiBoZWlnaHQ9IjExMiIgd2lkdGg9IjExOSIgYWx0PSJ0YWdzIHdpdGggc3BhY2VzIGFmdGVy IHRoZSBjb21tYXMgKFdST05HKSIgY2xhc3M9ImRpYWdyYW0iIC8+PC9wPgoJPHA+WW91JiM4 MjE3O2xsIHByb2JhYmx5IHdhbnQgdG8gaW5zdGFsbCBSb2IgU2FibGUmIzgyMTc7cyA8YSBo cmVmPSJodHRwOi8vd3d3LndpbHNoaXJlb25lLmNvbS90ZXh0cGF0dGVybi1wbHVnaW5zL3Jz cy1hZG1pbi1zaG93LWFkdi1vcHRzIj5yc3NfYWRtaW5fc2hvd19hZHZfb3B0czwvYT4sIHdo aWNoIHdpbGwgYXV0b21hdGljYWxseSBleHBhbmQgdGhlICYjODIyMDtBZHZhbmNlZCBPcHRp b25zJiM4MjIxOyBzZWN0aW9uIG9mIHRoZSAmIzgyMjA7d3JpdGUmIzgyMjE7IHBhZ2UsIHdo ZW4geW91IGFyZSB3cml0aW5nIGFydGljbGVzLiAgVGhhdCBnaXZlcyB5b3UgZWFzeSBhY2Nl c3MgdG8gdGhlIEtleXdvcmRzIGZpZWxkLjwvcD4KCTxoND5TdGVwIDY6IEZhbmN5IGRpc3Bs YXkgY3VzdG9taXphdGlvbjwvaDQ+Cgk8cD5Zb3UgY2FuIHVzZSA8Y29kZT50cnVfdGFnc19p Zl90YWdfc2VhcmNoPC9jb2RlPiwgPGNvZGU+dHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcjwvY29k ZT4sIGFuZCA8Y29kZT50cnVfdGFnc19zZWFyY2hfcGFyYW1ldGVyPC9jb2RlPiB0byBjdXN0 b21pemUgeW91ciBwYWdlIHRpdGxlcyBvciB0YWcgc2VhcmNoIHJlc3VsdHMuICBTZWUgYmVs b3cgZm9yIGRldGFpbHMuICBTZWUgdGhlIHRpdGxlYmFyIG9mIDxhIGhyZWY9Imh0dHA6Ly93 d3cudHJ1aXN0LmNvbS8iPnRydWlzdC5jb208L2E+IGZvciBhbiBleGFtcGxlLjwvcD4KCTxo ND5TdGVwIDc6IFR1cm4gb24gY2xlYW4gdXJsczwvaDQ+Cgk8cD5DbGVhbiB1cmxzIGFyZSBu b3cgcG9zc2libGUgd2l0aCB0cnVfdGFncywgcHJvdmlkZWQgdGhhdCB5b3UgYXJlIHdpbGxp bmcgdG8gbW9kaWZ5IFRleHRwYXR0ZXJuJiM4MjE3O3MgcmV3cml0ZSBydWxlcyAoaW4gdGhl IC5odGFjY2VzcyBmaWxlKS4gIEJ1dCBiZSB3YXJuZWQgJiM4MjExOyByZXdyaXRlIHJ1bGVz IGFyZSBjb21wbGV4LiAgSSBtYWtlIG5vIGd1YXJhbnRlZXMgdGhhdCB0aGlzIHdvbiYjODIx Nzt0IGVhdCB5b3VyIGNoaWxkcmVuLiAgPHN0cm9uZz5Zb3UgZG9uJiM4MjE3O3QgaGF2ZSB0 byBkbyB0aGlzPC9zdHJvbmc+IGJ1dCBhIGxvdCBvZiBwZW9wbGUgd2FudCBpdC4gIFRoaXMg c2l0ZSB1c2VzIGl0LCBpZiB0aGF0IGhlbHBzLjwvcD4KCTxwPkhlcmUmIzgyMTc7cyB3aGF0 IHRvIGRvOjwvcD4KCTxvbD4KCQk8bGk+QWRkIHRoZSBmb2xsb3dpbmcgbGluZXMgdG8gVGV4 dHBhdHRlcm4mIzgyMTc7cyAuaHRhY2Nlc3MgZmlsZSAoZm91bmQgaW4gdGhlIHJvb3Qgb2Yg eW91ciBUZXh0cGF0dGVybiBkaXJlY3RvcnkpLCBhZGp1c3RpbmcgdGhlbSBpZiBuZWNlc3Nh cnkuICBUaGVzZSBsaW5lcyBzaG91bGQgYmUgPHN0cm9uZz5hZnRlcjwvc3Ryb25nPiB0aGU8 L2xpPgoJPC9vbD4KCTxwPjxkaXYgY2xhc3M9InByZSI+PC9wPgoJPHA+UmV3cml0ZVJ1bGUg JiM5NDsoLiYjNDM7KSAmIzQ1OyBbUFQsTF08L3A+Cgk8cD48L2Rpdj48L3A+Cgk8cD5hbmQg PHN0cm9uZz5iZWZvcmU8L3N0cm9uZz4gdGhlPC9wPgoJPHA+PGRpdiBjbGFzcz0icHJlIj48 L3A+Cgk8cD5SZXdyaXRlUnVsZSAmIzk0OyguJiM0MjspIGluZGV4LnBocDwvcD4KCTxwPjwv ZGl2PjwvcD4KCTxwPkhlcmUmIzgyMTc7cyB0aGUgYml0IHRvIGluc2VydDo8L3A+Cgk8cD48 ZGl2IGNsYXNzPSJwcmUiPjwvcD4KCTxwPiNUaGlzIHBhdGggc2hvdWxkIG1hdGNoIHRoZSBy ZWxhdGl2ZSB1cmwgb2YgeW91ciBUZXh0cGF0dGVybiBpbnN0YWxsPGJyIC8+ClJld3JpdGVC YXNlIC88YnIgLz4KI0lmIHlvdSdyZSB1c2luZyBhIHNlY3Rpb24gb3RoZXIgdGhhbiAmIzM0 O3RhZyYjMzQ7LCBjaGFuZ2UgdGhlIGZvbGxvd2luZyB0d28gcnVsZXMgYWNjb3JkaW5nbHk8 YnIgLz4KUmV3cml0ZVJ1bGUgJiM5NDt0YWcvKFsmIzk0Oy9dJiM0MzspJCB0YWcvJDEvIFtS LExdPGJyIC8+ClJld3JpdGVSdWxlICYjOTQ7dGFnLyguJiM0MzspLyQgJiM2MztzJiM2MTt0 YWd4JiMzNzt4JiMzNzt0JiM2MTskMTwvcD4KCTxwPjwvZGl2PjwvcD4KCTxvbD4KCQk8bGk+ PHN0cm9uZz5DaGVjayB0byBtYWtlIHN1cmUgeW91ciBzaXRlIGlzIHN0aWxsIHdvcmtpbmcu PC9zdHJvbmc+PC9saT4KCQk8bGk+RWRpdCB0aGUgdHJ1X3RhZ3MgcGx1Z2luIChhZG1pbiAt PiBwbHVnaW5zLCBjbGljayAmIzgyMTY7RWRpdCYjODIxNzspIGFuZCBjaGFuZ2UgdGhlIDxj b2RlPnRydV90YWdzX3VzZV9jbGVhbl91cmxzKCk8L2NvZGU+IGZ1bmN0aW9uIHRvIHJldHVy biA8Y29kZT4xPC9jb2RlPi4gIChJdCYjODIxNztzIHRoZSBmaXJzdCBmdW5jdGlvbi4pPC9s aT4KCQk8bGk+Q2xlYW4gdXJscyBzaG91bGQgYmUgd29ya2luZyBub3cuICBUcnkgY2xpY2tp bmcgYSB0YWcgbGluayB0byBzZWUgd2hhdCB1cmwgaXQgcmVmZXJlbmNlcy48L2xpPgoJCTxs aT5CeSBkZWZhdWx0LCBhcnRpY2xlIHRhZ3Mgd2lsbCB1c2UgdGhlIDxjb2RlPnJlbD0idGFn IjwvY29kZT4gYXR0cmlidXRlLCBhbmQgdGhlIHRhZyBjbG91ZCAob3IgbGlzdCkgd29uJiM4 MjE3O3QuICBUaGlzIGNhbiBiZSBjb250cm9sbGVkIHdpdGggdGhlIDxjb2RlPnVzZXJlbHRh ZzwvY29kZT4gYXR0cmlidXRlOyBzZWUgYmVsb3cgZm9yIGRldGFpbHMuPC9saT4KCTwvb2w+ Cgk8aDM+VGFnIHJlZmVyZW5jZTwvaDM+Cgk8aDQ+PGNvZGU+dHJ1X3RhZ3NfaGFuZGxlcjwv Y29kZT48L2g0PgoJPHA+VGhpcyBpcyB0aGUgbWFpbiBmdW5jdGlvbiB0aGF0IGRyaXZlcyB0 YWcgc2VhcmNoLCBhbmQgc2hvd3MgdGhlIGdlbmVyaWMgdGFnIGNsb3VkLiAgSXQgc2hvdWxk IGJlIGNhbGxlZCBmcm9tIHRoZSBwYWdlIHRoYXQgaXMgdXNlZCBpbiB0aGUgJiM4MjE2O3Rh ZyYjODIxNzsgc2VjdGlvbi4gIEl0IGNhbGxzIDxjb2RlPnRydV90YWdzX2Nsb3VkPC9jb2Rl PiBieSBkZWZhdWx0LCBvciA8Y29kZT5kb0FydGljbGVzKCk8L2NvZGU+IChpbiB0aGUgVGV4 dHBhdHRlcm4gY29kZSkgdG8gZGlzcGxheSB0YWcgc2VhcmNoIHJlc3VsdHMuPC9wPgoJPHA+ VGhpcyB0YWcgd2lsbCBhY2NlcHQgYWxsIG9mIHRoZSBhdHRyaWJ1dGVzIHVzZWQgYnkgPGNv ZGU+dHJ1X3RhZ19jbG91ZDwvY29kZT4uICBTZWUgYmVsb3cgZm9yIGRldGFpbHMuPC9wPgoJ PGg0Pjxjb2RlPnRydV90YWdzX2lmX2hhc190YWdzPC9jb2RlPjwvaDQ+Cgk8cD5UaGlzIGNv bmRpdGlvbmFsIHRhZyBjYW4gYmUgdXNlZCBpbiBhbiBhcnRpY2xlIGZvcm0sIGFuZCB3aWxs IGV2YWx1YXRlIGl0cyBjb250ZW50cyAoZS5nLiAmIzgyMjA7cmV0dXJuIHRydWUmIzgyMjE7 KSBpZiB0aGUgY3VycmVudCBhcnRpY2xlIGhhcyB0YWdzLjwvcD4KCTxoND48Y29kZT50cnVf dGFnc19mcm9tX2FydGljbGU8L2NvZGU+PC9oND4KCTxwPlRoaXMgdGFnIGNhbiBiZSB1c2Vk IGluIGFuIGFydGljbGUgZm9ybSB0byByZXR1cm4gYSBsaXN0IG9mIHRhZ3MgYXNzb2NpYXRl ZCB3aXRoIHRoZSBjdXJyZW50IGFydGljbGUuICBFYWNoIHRhZyBpbiB0aGUgbGlzdCB3aWxs IGJlIGEgbGluayAoPGNvZGU+Jmx0O2EgaHJlZj0uLi4mZ3Q7PC9jb2RlPikgdG8gdGhlIHRh ZyBzZWFyY2ggdXJsIGZvciB0aGF0IHBhcnRpY3VsYXIgdGFnLjwvcD4KCTxwPlRoaXMgdGFn IGFjY2VwdHMgdGhlIHN0YW5kYXJkIDxjb2RlPmJyZWFrPC9jb2RlPiwgPGNvZGU+Y2xhc3M8 L2NvZGU+LCBhbmQgPGNvZGU+YnJlYWtjbGFzczwvY29kZT4gYXR0cmlidXRlcy48L3A+Cgk8 cD5JdCBhbHNvIGFjY2VwdHMgYSA8Y29kZT50YWdzZWN0aW9uPC9jb2RlPiBhdHRyaWJ1dGUs IHdoaWNoIHRlbGxzIHRydV90YWdzIHdoYXQgcmVsYXRpdmUgdXJsIHRvIHVzZSB0byBmaW5k IHRoZSAmIzgyMTY7dGFnJiM4MjE3OyBzZWN0aW9uLiAgVGhpcyBjYW4gYmUgdXNlZnVsIGlm IHlvdSBoYXZlIG5hbWVkIHRoZSBzZWN0aW9uIHNvbWV0aGluZyBvdGhlciB0aGFuICYjODIx Njt0YWcmIzgyMTc7LiAgQnkgZGVmYXVsdCwgdGhpcyBpcyBzZXQgdG8gPGNvZGU+dGFnPC9j b2RlPi48L3A+Cgk8cD5JZiB5b3UgaGF2ZSBjbGVhbiB1cmxzIHR1cm5lZCBvbiAoc2VlIGFi b3ZlKSwgeW91IGNhbiB1c2UgdGhlIDxjb2RlPnVzZXJlbHRhZ3M8L2NvZGU+IGF0dHJpYnV0 ZSB0byBzcGVjaWZ5IHdoZXRoZXIgbGlua3MgaW4gdGhlIGxpc3Qgc2hvdWxkIGhhdmUgdGhl IDxhIGhyZWY9Imh0dHA6Ly9taWNyb2Zvcm1hdHMub3JnL3dpa2kvcmVsdGFnIj48Y29kZT5y ZWw9InRhZyI8L2NvZGU+PC9hPiAgKHVzZWQgYnkgPGEgaHJlZj0iaHR0cDovL3d3dy50ZWNo bm9yYXRpLmNvbS8iPlRlY2hub3JhdGk8L2E+KSBhdHRyaWJ1dGUgc2V0LiAgVGhpcyBpcyBv biBieSBkZWZhdWx0LjwvcD4KCTxoND48Y29kZT50cnVfdGFnc19jbG91ZDwvY29kZT48L2g0 PgoJPGg0Pjxjb2RlPnRydV90YWdzX2xpc3Q8L2NvZGU+PC9oND4KCTxwPlRoZXNlIHR3byB0 YWdzIGRvIHRoZSBleGFjdCBzYW1lIHRoaW5nICYjODIxMTsgPGNvZGU+dHJ1X3RhZ3NfY2xv dWQ8L2NvZGU+IGp1c3QgcHJvdmlkZXMgZGlmZmVyZW50IGRlZmF1bHRzIHRvIDxjb2RlPnRy dV90YWdzX2xpc3Q8L2NvZGU+LjwvcD4KPHA+PGNvZGU+dHJ1X3RhZ3NfY2xvdWQ8L2NvZGU+ IGNhbiBiZSB1c2VkIG9uIGFueSBwYWdlLCBhbmQgaXMgZ2VuZXJhbGx5IHVzZWQgdG8gZ2Vu ZXJhdGUgYSBzaW1wbGUgdGFnIGNsb3VkIG9mIGFsbCB0aGUgdGFncyB1c2VkIG9uIHlvdXIg c2l0ZS4gIFRoZSBjbG91ZCBpcyByZWFsbHkganVzdCBhIGxpc3Qgb2YgbGlua3MsIG11Y2gg bGlrZSB0aGF0IGdlbmVyYXRlZCBieSA8Y29kZT50cnVfdGFnc19mcm9tX2FydGljbGU8L2Nv ZGU+LCBidXQgd2l0aCBhIDxjb2RlPnN0eWxlPC9jb2RlPiBhdHRyaWJ1dGUgc2V0IG9uIGVh Y2ggbGluayB0byBnaXZlIGl0IGEgZm9udCBzaXplIHJhbmdpbmcgZnJvbSAxMDAlIHRvIDIw MCUuPC9wPgo8cD48Y29kZT50cnVfdGFnc19saXN0PC9jb2RlPiBjYW4gYmUgdXNlZCBvbiBh bnkgcGFnZSwgYW5kIGlzIGdlbmVyYWxseSB1c2VkIHRvIG91dHB1dCBhIGJ1bGxldGVkIGxp c3Qgb2YgYWxsIHRoZSB0YWdzIHVzZWQgb24geW91ciBzaXRlLiAgQnkgZGVmYXVsdCwgdGhl IHRhZ3Mgd2lsbCBhbGwgaGF2ZSBhIGZvbnQtc2l6ZSBvZiAxMDAlLjwvcD4KCTxoNT5Cb3Ro IHRhZ3MgYWNjZXB0IHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L2g1PgoJPHVsPgoJCTxs aT5UaGUgc3RhbmRhcmQgPGNvZGU+d3JhcHRhZzwvY29kZT4sIDxjb2RlPmJyZWFrPC9jb2Rl PiwgPGNvZGU+Y2xhc3M8L2NvZGU+LCBhbmQgPGNvZGU+YnJlYWtjbGFzczwvY29kZT4gYXR0 cmlidXRlcy4gIDxjb2RlPnRydV90YWdzX2Nsb3VkPC9jb2RlPiBoYXMgYSBkZWZhdWx0IDxj b2RlPmJyZWFrPC9jb2RlPiBvZiBhIGNvbW1hLiAgPGNvZGU+dHJ1X3RhZ3NfbGlzdDwvY29k ZT4gaGFzIGEgZGVmYXVsdCA8Y29kZT53cmFwdGFnPC9jb2RlPiBvZiA8Y29kZT51bDwvY29k ZT4gYW5kIGEgZGVmYXVsdCA8Y29kZT5icmVhazwvY29kZT4gb2YgPGNvZGU+bGk8L2NvZGU+ LjwvbGk+CgkJPGxpPjxjb2RlPnRhZ3NlY3Rpb248L2NvZGU+LCB3aGljaCB0ZWxscyB0cnVf dGFncyB3aGF0IHJlbGF0aXZlIHVybCB0byB1c2UgdG8gZmluZCB0aGUgJiM4MjE2O3RhZyYj ODIxNzsgc2VjdGlvbi4gIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgaGF2ZSBuYW1lZCB0 aGUgc2VjdGlvbiBzb21ldGhpbmcgb3RoZXIgdGhhbiAmIzgyMTY7dGFnJiM4MjE3Oy4gIEJ5 IGRlZmF1bHQsIHRoaXMgaXMgc2V0IHRvIDxjb2RlPnRhZzwvY29kZT4uPC9saT4KCQk8bGk+ PGNvZGU+c2VjdGlvbjwvY29kZT4sIHdoaWNoIHRlbGxzIGl0IHRvIGxpbWl0IHRoZSBsaXN0 IHRvIHRhZ3MgZnJvbSB0aGUgZ2l2ZW4gc2VjdGlvbiBvciBzZWN0aW9ucy4gIEZvciBleGFt cGxlLCA8Y29kZT4mbHQ7dHhwOnRydV90YWdzX2Nsb3VkIHNlY3Rpb249ImJsb2cscmVmZXJl bmNlIiAvJmd0OzwvY29kZT4gd291bGQgb25seSBzaG93IHRhZ3MgZnJvbSB0aGUgJiM4MjIw O2Jsb2cmIzgyMjE7IGFuZCAmIzgyMjA7cmVmZXJlbmNlJiM4MjIxOyBzZWN0aW9ucy4gIEJ5 IGRlZmF1bHQsIHRoaXMgaXMgc2V0IHRvIGJsYW5rICh0byBzaG93IHRhZ3MgZnJvbSBhbGwg c2VjdGlvbnMpLgoJPHVsPgoJCTxsaT48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IGlmIHlvdSB1 c2UgPGNvZGU+c2VjdGlvbjwvY29kZT4gdG8gbGltaXQgdGhlIGNsb3VkIHRvIGEgcGFydGlj dWxhciBzZWN0aW9uLCBpdCB3b24mIzgyMTc7dCBsaW1pdCB0aGUgdGFnIHNlYXJjaCBmZWF0 dXJlIHRvIHRoYXQgc2VjdGlvbi4gIFRoZSB0YWcgc2VhcmNoIGZpbmRzICh0YWdnZWQpIGFy dGljbGVzIGZyb20gYWxsIHNlY3Rpb25zLCBubyBtYXR0ZXIgd2hhdC4gIFRoYXQmIzgyMTc7 cyBhIHNpZGUtZWZmZWN0IG9mIHRoZSB1c2Ugb2YgPGNvZGU+ZG9BcnRpY2xlcygpPC9jb2Rl PiwgYW5kIEkgZG9uJiM4MjE3O3QgdGhpbmsgdGhlcmUmIzgyMTc7cyBhbnl0aGluZyBJIGNh biBkbyBhYm91dCBpdC48L2xpPgoJPC91bD48L2xpPgoJCTxsaT48Y29kZT5taW5wZXJjZW50 PC9jb2RlPiBhbmQgPGNvZGU+bWF4cGVyY2VudDwvY29kZT4sIHdoaWNoIGNhbiBiZSB1c2Vk IHRvIGNvbnRyb2wgdGhlIHdlaWdodGVkIGZvbnQgc2l6ZXMgaW4gdGhlIHRhZyBjbG91ZC9s aXN0LiAgPGNvZGU+dHJ1X3RhZ3NfY2xvdWQ8L2NvZGU+IGRlZmF1bHRzIHRvIDxjb2RlPjEw MDwvY29kZT4gYW5kIDxjb2RlPjIwMDwvY29kZT4sIHJlc3BlY3RpdmVseSwgYW5kIDxjb2Rl PnRydV90YWdzX2xpc3Q8L2NvZGU+IGRlZmF1bHRzIHRvIDxjb2RlPjEwMDwvY29kZT4gYW5k IDxjb2RlPjEwMDwvY29kZT4uPC9saT4KCQk8bGk+PGNvZGU+c2hvd2NvdW50czwvY29kZT4s IHdoaWNoIHdpbGwgYXBwZW5kIGEgbnVtYmVyIGluZGljYXRpbmcgdGhlIG51bWJlciBvZiB0 aW1lcyBhIHRhZyBoYXMgYmVlbiB1c2VkLCB0byBlYWNoIHRhZyBpbiB0aGUgbGlzdC4gIEZv ciBleGFtcGxlLCB5b3UgbWlnaHQgc2VlOiA8c3BhbiBjbGFzcz0icHJlIj48YSBocmVmPSIv P3M9dGFnJiMzODt0PWxpZmUiPmxpZmU8L2E+IFszXSwgPGEgaHJlZj0iLz9zPXRhZyYjMzg7 dD10ZWNoIj50ZWNoPC9hPiBbNV08L3NwYW4+IGluIG15IHRhZyBjbG91ZCwgaWYgdGhpcyB3 YXMgdHVybmVkIG9uLiAgVGhpcyBpcyBvZmYgYnkgZGVmYXVsdC4gIFVzZSA8Y29kZT4xPC9j b2RlPiBvciA8Y29kZT50cnVlPC9jb2RlPiB0byB0dXJuIGl0IG9uLjwvbGk+CgkJPGxpPjxj b2RlPmNvdW50d3JhcGNoYXJzPC9jb2RlPiwgd2hpY2ggY29udHJvbHMgdGhlIGNoYXJhY3Rl cnMgdXNlZCB0byBzaG93IHRoZSB0YWcgY291bnQsIGlmIDxjb2RlPnNob3djb3VudHM8L2Nv ZGU+IGlzIHR1cm5lZCBvbi4gIEJ5IGRlZmF1bHQgdGhpcyBpcyA8Y29kZT5bXTwvY29kZT4u ICBUaGUgZmlyc3QgY2hhcmFjdGVyIHdpbGwgYmUgcHV0IG9uIHRoZSBsZWZ0IHNpZGUgb2Yg dGhlIG51bWJlciwgYW5kIHRoZSBzZWNvbmQgY2hhcmFjdGVyIHdpbGwgYmUgcHV0IG9uIHRo ZSByaWdodC4gIEZvciBleGFtcGxlLCBhIDxjb2RlPmNvdW50d3JhcGNoYXJzPC9jb2RlPiBv ZiA8Y29kZT4oKTwvY29kZT4gd291bGQgc2hvdzogPHNwYW4gY2xhc3M9InByZSI+PGEgaHJl Zj0iLz9zPXRhZyYjMzg7dD1saWZlIj5saWZlPC9hPiAoMyksIDxhIGhyZWY9Ii8/cz10YWcm IzM4O3Q9dGVjaCI+dGVjaDwvYT4gKDUpPC9zcGFuPjwvbGk+CgkJPGxpPklmIHlvdSBoYXZl IGNsZWFuIHVybHMgdHVybmVkIG9uIChzZWUgYWJvdmUpLCB5b3UgY2FuIHVzZSB0aGUgPGNv ZGU+dXNlcmVsdGFnczwvY29kZT4gYXR0cmlidXRlIHRvIHNwZWNpZnkgd2hldGhlciBsaW5r cyBpbiB0aGUgbGlzdCBzaG91bGQgaGF2ZSB0aGUgPGEgaHJlZj0iaHR0cDovL21pY3JvZm9y bWF0cy5vcmcvd2lraS9yZWx0YWciPjxjb2RlPnJlbD0idGFnIjwvY29kZT48L2E+ICAodXNl ZCBieSA8YSBocmVmPSJodHRwOi8vd3d3LnRlY2hub3JhdGkuY29tLyI+VGVjaG5vcmF0aTwv YT4pIGF0dHJpYnV0ZSBzZXQuICBUaGlzIGlzIG9uIGJ5IGRlZmF1bHQuPC9saT4KCTwvdWw+ Cgk8cD5Ob3RlIHRoYXQgeW91IGNhbiB1c2UgdGhlIGF0dHJpYnV0ZXMgdG8gbWFrZSBlYWNo IHRhZyBkbyB0aGUgc2FtZSB0aGluZy4gIDxjb2RlPnRydV90YWdzX2Nsb3VkPC9jb2RlPiBp cyBqdXN0IGEgY29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIGdlbmVyYXRpbmcgYSB0YWcgY2xv dWQgdXNpbmcgPGNvZGU+dHJ1X3RhZ3NfbGlzdDwvY29kZT4uICBUaGVyZWZvcmUsIGl0JiM4 MjE3O3MgcG9zc2libGUgdG8gaGF2ZSBhIHRhZyBjbG91ZCB3aXRoIHRhZyBjb3VudHMgc2hv d2luZywgb3IgaGF2ZSBhIGJ1bGxldGVkIGxpc3Qgd2l0aCB2YXJpYWJsZSBmb250IHNpemVz LCBldGMuPC9wPgoJPGg0Pjxjb2RlPnRydV90YWdzX2lmX3RhZ19zZWFyY2g8L2NvZGU+PC9o ND4KCTxwPlRoaXMgY29uZGl0aW9uYWwgdGFnIGNhbiBiZSB1c2VkIGFueXdoZXJlIGFuZCB3 aWxsIGV2YWx1YXRlIGl0cyBjb250ZW50cyAoZS5nLiAmIzgyMjA7cmV0dXJuIHRydWUmIzgy MjE7KSBpZiB0aGUgY3VycmVudCB1cmwgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgYSB0YWcg c2VhcmNoIGdvaW5nIG9uLiAgVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGRv IHNvbWV0aGluZyBsaWtlIGN1c3RvbWl6ZSB0aGUgdGl0bGViYXIgd2hlbiB1c2luZyB0aGUg dGFnIHNlYXJjaC48L3A+Cgk8aDQ+PGNvZGU+dHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcjwvY29k ZT48L2g0PgoJPHA+VGhpcyB0YWcgY2FuIGJlIHVzZWQgYW55d2hlcmUgYW5kIHdpbGwgcmV0 dXJuIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHRhZyB1bmRlciBzZWFyY2gsIGR1cmluZyBh IHRhZyBzZWFyY2guICBUaGlzIGlzIGdlbmVyYWxseSB1c2VkIHdpdGggPGNvZGU+dHJ1X3Rh Z3NfaWZfdGFnX3NlYXJjaDwvY29kZT4uPC9wPgoJPGg0Pjxjb2RlPnRydV90YWdzX3NlYXJj aF9wYXJhbWV0ZXI8L2NvZGU+PC9oND4KCTxwPlRoaXMgdGFnIGNhbiBiZSB1c2VkIGFueXdo ZXJlIGFuZCB3aWxsIHJldHVybiB0aGUgdGV4dCB0aGUgdXNlciB0eXBlZCBpbnRvIHRoZSBz dGFuZGFyZCBzZWFyY2ggYm94LCBkdXJpbmcgYSByZWd1bGFyIHNlYXJjaC4gIFRoaXMgdGFn IGlzIG5vdCBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byB0YWdnaW5nLCBidXQgY2FuIGJlIGhh bmR5IGZvciBjdXN0b21pemluZyB0aGUgdGl0bGViYXIgb24gc2VhcmNoIHJlc3VsdCBwYWdl cy48L3A+CgoKICI7czo0OiJjb2RlIjtzOjQ5NjA6IgoKCiNDb3B5cmlnaHQgMjAwNiBOYXRo YW4gQXJ0aHVyCiNSZWxlYXNlZCB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlLCBzZWUg aHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5waHAgZm9y IGRldGFpbHMKI1RoaXMgd29yayBpcyBiYXNlZCBvbiByYW5fdGFncyBieSBSYW4gQXJvdXNz aSwgb3JpZ2luYWxseSBmb3VuZCBhdCBodHRwOi8vYXJvdXNzaS5jb20vYXJ0aWNsZS80NS90 YWdnaW5nLXRleHRwYXR0ZXJuCgoKI1NlZSBodHRwOi8vd3d3LnRydWlzdC5jb20vcmVmZXJl bmNlLzQ5Ny90cnV0YWdzLXVzYWdlLWluc3RydWN0aW9ucyBmb3IgaW5zdHJ1Y3Rpb25zCmZ1 bmN0aW9uIHRydV90YWdzX3VzZV9jbGVhbl91cmxzKCkKewoJcmV0dXJuIDA7ICNETyBOT1Qg RU5BQkxFIFRISVMgdW5sZXNzIHlvdSd2ZSByZWFkIHRoZSBpbnN0cnVjdGlvbnMKfQoKCmZ1 bmN0aW9uIHRydV90YWdzX2hhbmRsZXIoJGF0dHMpIHsKCWV4dHJhY3QoJF9HRVQpOwoJaWYg KCFpc3NldCgkdCkpIHsKCQlyZXR1cm4gdHJ1X3RhZ3NfY2xvdWQoJGF0dHMpOwoJfQoJZWxz ZSB7CgkJJGF0dHNbJ2tleXdvcmRzJ10gPSBzdHJpcF90YWdzKCR0KTsKCQkkYXR0c1snc2Vj dGlvbiddID0gJyc7CgkJcmV0dXJuIGRvQXJ0aWNsZXMoJGF0dHMsIHRydWUpOwoJfQp9CgoK ZnVuY3Rpb24gdHJ1X3RhZ3NfaWZfaGFzX3RhZ3MoJGF0dHMsICR0aGluZykgewoJZ2xvYmFs ICR0aGlzYXJ0aWNsZTsKCWV4dHJhY3QoJHRoaXNhcnRpY2xlKTsKCgkkdGFnc19maWVsZCA9 IHRydV90YWdzX2ZpZWxkKCk7CgoJJHJzID0gc2FmZV9yb3coJHRhZ3NfZmllbGQsICJ0ZXh0 cGF0dGVybiIsICJJRD0nJHRoaXNpZCcgQU5EICR0YWdzX2ZpZWxkIDw+ICcnIik7CglpZiAo JHJzKSB7CgkJcmV0dXJuIHBhcnNlKCR0aGluZyk7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFn c19mcm9tX2FydGljbGUoJGF0dHMpIHsKCglnbG9iYWwgJHRoaXNhcnRpY2xlLCAkc2l0ZXVy bCwgJHBhdGhfZnJvbV9yb290OwoKCWV4dHJhY3QoJF9TRVJWRVIpOwoJZXh0cmFjdCgkdGhp c2FydGljbGUpOwoKCWV4dHJhY3QobEF0dHMoYXJyYXkoJ3dyYXB0YWcnICAgICAgID0+ICcn LAoJCQkJCQknYnJlYWsnICAgICAgICAgPT4gJywgJywKCQkJCQkJJ2NsYXNzJyAgICAgICAg ID0+ICcnLAoJCQkJCQknYnJlYWtjbGFzcycJPT4gJycsCgkJCQkJCSd0YWdzZWN0aW9uJwk9 PiAndGFnJywKCQkJCQkJJ3VzZXJlbHRhZycJPT4gJzEnCgkJCQkJCSksJGF0dHMpKTsKCgkk dGFnc19maWVsZCA9IHRydV90YWdzX2ZpZWxkKCk7CgoJJHJzID0gc2FmZV9yb3coJHRhZ3Nf ZmllbGQsICJ0ZXh0cGF0dGVybiIsICJJRD0nJHRoaXNpZCcgQU5EICR0YWdzX2ZpZWxkIDw+ ICcnIik7CgkkYWxsX3RhZ3MgPSBleHBsb2RlKCIsIiwgdHJpbShzdHJ0b2xvd2VyKCRyc1sk dGFnc19maWVsZF0pKSk7Cglzb3J0KCRhbGxfdGFncyk7CgkkYWxsX3RhZ3MgPSBhcnJheV91 bmlxdWUoJGFsbF90YWdzKTsKCglpZiAodHJ1X3RhZ3NfdXNlX2NsZWFuX3VybHMoKSkgewoJ CSR1cmxwcmVmaXggPSAnaHR0cDovLycgLiAkc2l0ZXVybCAuICRwYXRoX2Zyb21fcm9vdCAu ICR0YWdzZWN0aW9uIC4gJy8nOwoJCSR1cmxzdWZmaXggPSAkdXNlcmVsdGFnID8gJy8iIHJl bD0idGFnJzogJy8nOwoJfSBlbHNlIHsKCQkkdXJscHJlZml4ID0gJ2h0dHA6Ly8nIC4gJHNp dGV1cmwgLiAkcGF0aF9mcm9tX3Jvb3QgLiAnP3M9JyAuICR0YWdzZWN0aW9uIC4gJyZhbXA7 dD0nOwoJCSR1cmxzdWZmaXggPSAnJzsKCX0KCglmb3IoJGk9MDsgJGk8Y291bnQoJGFsbF90 YWdzKTsgJGkrKykgewoJCSR0YWdzX2h0bWxbXSA9ICc8YSBocmVmPSInIC4gJHVybHByZWZp eCAuICRhbGxfdGFnc1skaV0gLiAkdXJsc3VmZml4IC4gJyI+JyAuICRhbGxfdGFnc1skaV0g Lic8L2E+JzsKCX0KCXJldHVybiBkb1dyYXAoJHRhZ3NfaHRtbCwgJHdyYXB0YWcsICRicmVh aywgJGNsYXNzLCAkYnJlYWtjbGFzcyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19jbG91ZCgk YXR0cykgewoJJGF0dHMgPSBsQXR0cyhhcnJheSgnd3JhcHRhZycJPT4gJycsCgkJCQknYnJl YWsnCT0+ICcsICcsCgkJCQknY2xhc3MnCT0+ICcnLAoJCQkJJ2JyZWFrY2xhc3MnCT0+ICcn LAoJCQkJJ3RhZ3NlY3Rpb24nCT0+ICd0YWcnLAoJCQkJJ3NlY3Rpb24nCT0+ICcnLAoJCQkJ J21pbnBlcmNlbnQnCT0+ICcxMDAnLAoJCQkJJ21heHBlcmNlbnQnCT0+ICcyMDAnLAoJCQkJ J3Nob3djb3VudHMnCT0+ICcnLAoJCQkJJ2NvdW50d3JhcGNoYXJzJwk9PiAnW10nLAoJCQkJ J3VzZXJlbHRhZycJPT4gJycKCQkJKSwkYXR0cyk7CgoJcmV0dXJuIHRydV90YWdzX2xpc3Qo JGF0dHMpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfbGlzdCgkYXR0cykgewoJZ2xvYmFsICRz aXRldXJsLCAkcGF0aF9mcm9tX3Jvb3Q7CglleHRyYWN0KCRfU0VSVkVSKTsKCgkkYXR0cyA9 IGxBdHRzKGFycmF5KCd3cmFwdGFnJwk9PiAndWwnLAoJCQkJJ2JyZWFrJwk9PiAnbGknLAoJ CQkJJ2NsYXNzJwk9PiAnJywKCQkJCSdicmVha2NsYXNzJwk9PiAnJywKCQkJCSd0YWdzZWN0 aW9uJwk9PiAndGFnJywKCQkJCSdzZWN0aW9uJwk9PiAnJywKCQkJCSdtaW5wZXJjZW50Jwk9 PiAnMTAwJywKCQkJCSdtYXhwZXJjZW50Jwk9PiAnMTAwJywKCQkJCSdzaG93Y291bnRzJwk9 PiAnJywKCQkJCSdjb3VudHdyYXBjaGFycycJPT4gJ1tdJywKCQkJCSd1c2VyZWx0YWcnCT0+ ICcnCgkJCSksJGF0dHMpOwoJZXh0cmFjdCgkYXR0cyk7CgoJJHRhZ3NfZmllbGQgPSB0cnVf dGFnc19maWVsZCgpOwoKCSRzZWN0aW9uX2NsYXVzZSA9ICcnOwoJaWYgKCRzZWN0aW9uIDw+ ICcnKSB7CgkJJGtleXMgPSBzcGxpdCgnLCcsICRzZWN0aW9uKTsKCQlmb3JlYWNoICgka2V5 cyBhcyAka2V5KSB7CgkJCSRrZXlwYXJ0c1tdID0gIiBTZWN0aW9uID0gJyIgLiB0cmltKCRr ZXkpIC4gIiciOwoJCX0KCQkkc2VjdGlvbl9jbGF1c2UgPSAiIEFORCAoIiAuIGpvaW4oJyBv ciAnLCAka2V5cGFydHMpIC4gIikiOwoJfQoKCWluY2x1ZGVfb25jZSB0eHBhdGguJy9wdWJs aXNoL3NlYXJjaC5waHAnOwoJJGZpbHRlciA9IGZpbHRlclNlYXJjaCgpOwoJJGFsbF90YWdz ID0gYXJyYXkoKTsKCSRycyA9IHNhZmVfcm93cygiJHRhZ3NfZmllbGQiLCAidGV4dHBhdHRl cm4iLCAiJHRhZ3NfZmllbGQgPD4gJyciIC4gJHNlY3Rpb25fY2xhdXNlIC4gJGZpbHRlciAu ICIgYW5kIFN0YXR1cyA+PSAnNCcgYW5kIFBvc3RlZCA8IG5vdygpIik7Cglmb3JlYWNoICgk cnMgYXMgJHJvdykgewoJCSRhbGxfdGFncyA9IGFycmF5X21lcmdlKCRhbGxfdGFncywgZXhw bG9kZSgiLCIsIHRyaW0oc3RydG9sb3dlcigkcm93WyR0YWdzX2ZpZWxkXSkpKSk7Cgl9Cglz b3J0KCRhbGxfdGFncyk7CgoJJHRhZ3Nfd2VpZ2h0ID0gYXJyYXlfY291bnRfdmFsdWVzKCRh bGxfdGFncyk7CgkkdGFnc191bmlxdWUgPSBhcnJheV91bmlxdWUoJGFsbF90YWdzKTsKCgkk bWF4ID0gbWF4KCR0YWdzX3dlaWdodCk7CgkkbWluID0gbWluKCR0YWdzX3dlaWdodCk7Cgkk c3RlcHZhbHVlID0gKCRtYXggPT0gJG1pbikgPyAwIDogKCRtYXhwZXJjZW50IC0gJG1pbnBl cmNlbnQpIC8gKCRtYXggLSAkbWluKTsKCglpZiAodHJ1X3RhZ3NfdXNlX2NsZWFuX3VybHMo KSkgewoJCSR1cmxwcmVmaXggPSAnaHR0cDovLycgLiAkc2l0ZXVybCAuICRwYXRoX2Zyb21f cm9vdCAuICR0YWdzZWN0aW9uIC4gJy8nOwoJCSR1cmxzdWZmaXggPSAkdXNlcmVsdGFnID8g Jy8iIHJlbD0idGFnJzogJy8nOwoJfSBlbHNlIHsKCQkkdXJscHJlZml4ID0gJ2h0dHA6Ly8n IC4gJHNpdGV1cmwgLiAkcGF0aF9mcm9tX3Jvb3QgLiAnP3M9JyAuICR0YWdzZWN0aW9uIC4g JyZhbXA7dD0nOwoJCSR1cmxzdWZmaXggPSAnJzsKCX0KCglmb3JlYWNoICgkdGFnc191bmlx dWUgYXMgJHRhZykgewoJCSR0YWdfd2VpZ2h0ID0gJG1pbnBlcmNlbnQgKyAoJHRhZ3Nfd2Vp Z2h0WyR0YWddIC0gJG1pbikgKiAkc3RlcHZhbHVlOwoKCQkvL2FkYXB0ZWQgZnJvbSBjb2Rl IGJ5IGdkdHJvaWFubywgc2VlIGh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3Rv cGljLnBocD9waWQ9MTAyODc1I3AxMDI4NzUKCQkkY291bnQgPSAkY291bnR3cmFwY2hhcnN7 MH0gLiAkdGFnc193ZWlnaHRbJHRhZ10gLiAkY291bnR3cmFwY2hhcnN7MX07CgkJaWYgKCRz aG93Y291bnRzID09ICd0aXRsZScgfHwgJHNob3djb3VudHMgPT0gJ2JvdGgnKQoJCQkkdGl0 bGVjb3VudCA9ICcgdGl0bGU9IicgLiAkY291bnQgLiAnIic7CgkJaWYgKCRzaG93Y291bnRz ICYmICRzaG93Y291bnRzICE9ICd0aXRsZScpCgkJCSRkaXNwbGF5Y291bnQgPSAnICcgLiAk Y291bnQ7CgoJCSR0YWdzX2h0bWxbXSA9ICc8YSBocmVmPSInIC4gJHVybHByZWZpeCAuICR0 YWcgLiAkdXJsc3VmZml4IC4gJyIgc3R5bGU9ImZvbnQtc2l6ZTonLiAkdGFnX3dlaWdodCAu ICclOyInIC4gJHRpdGxlY291bnQgLiAnPicgLiAkdGFnIC4nPC9hPicgLiAkZGlzcGxheWNv dW50OwoJfQoKCXJldHVybiBkb1dyYXAoJHRhZ3NfaHRtbCwgJHdyYXB0YWcsICRicmVhaywg JGNsYXNzLCAkYnJlYWtjbGFzcyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19pZl90YWdfc2Vh cmNoKCRhdHRzLCAkdGhpbmcpCnsKCSR0YWdfc2VhcmNoaW5nID0gZ3BzKCd0Jyk7CgkkY29u ZGl0aW9uID0gKCFlbXB0eSgkdGFnX3NlYXJjaGluZykpPyB0cnVlIDogZmFsc2U7CglyZXR1 cm4gcGFyc2UoRXZhbEVsc2UoJHRoaW5nLCAkY29uZGl0aW9uKSk7Cn0KCgpmdW5jdGlvbiB0 cnVfdGFnc190YWdfcGFyYW1ldGVyKCkKewoJcmV0dXJuIHN0cmlwX3RhZ3MoZ3BzKCd0Jykp Owp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nfc2VhcmNoX3BhcmFtZXRlcigpCnsKCXJldHVybiBz dHJpcF90YWdzKGdwcygncScpKTsKfQoKZnVuY3Rpb24gdHJ1X3RhZ3NfZmllbGQoKSB7Cgly ZXR1cm4gJ0tleXdvcmRzJzsKfQoKCgoiO3M6MzoibWQ1IjtzOjMyOiI5ZWE1YTJjOTZjZDZi OGNkMjI0MDkxYmM4ZTA5ZGQwMiI7fQ==