# Name: soo_toc v0.1.5 # Type: Client side plugin # Auto-generate table of contents for an article # Author: Jeff Soo # URL: http://ipsedixit.net/txp/ # Recommended load order: 5 # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YToxMTp7czo0OiJuYW1lIjtzOjc6InNvb190b2MiO3M6NjoiYXV0aG9yIjtzOjg6IkplZmYg U29vIjtzOjEwOiJhdXRob3JfdXJpIjtzOjI1OiJodHRwOi8vaXBzZWRpeGl0Lm5ldC90eHAv IjtzOjc6InZlcnNpb24iO3M6NToiMC4xLjUiO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjQ2OiJB dXRvLWdlbmVyYXRlIHRhYmxlIG9mIGNvbnRlbnRzIGZvciBhbiBhcnRpY2xlIjtzOjQ6Imhl bHAiO3M6OTgxODoiPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KZGl2I3NlZF9oZWxwIHByZSB7 cGFkZGluZzogMC41ZW0gMWVtOyBiYWNrZ3JvdW5kOiAjZWVlOyBib3JkZXI6IDFweCBkYXNo ZWQgI2NjYzt9CmRpdiNzZWRfaGVscCBoMSwgZGl2I3NlZF9oZWxwIGgyLCBkaXYjc2VkX2hl bHAgaDMsIGRpdiNzZWRfaGVscCBoMyBjb2RlIHtmb250LWZhbWlseTogc2Fucy1zZXJpZjsg Zm9udC13ZWlnaHQ6IGJvbGQ7fQpkaXYjc2VkX2hlbHAgaDEsIGRpdiNzZWRfaGVscCBoMiwg ZGl2I3NlZF9oZWxwIGgzIHttYXJnaW4tbGVmdDogLTFlbTt9CmRpdiNzZWRfaGVscCBoMiwg ZGl2I3NlZF9oZWxwIGgzIHttYXJnaW4tdG9wOiAyZW07fQpkaXYjc2VkX2hlbHAgaDEge2Zv bnQtc2l6ZTogMi40ZW07fQpkaXYjc2VkX2hlbHAgaDIge2ZvbnQtc2l6ZTogMS44ZW07fQpk aXYjc2VkX2hlbHAgaDMge2ZvbnQtc2l6ZTogMS40ZW07fQpkaXYjc2VkX2hlbHAgaDQge2Zv bnQtc2l6ZTogMS4yZW07fQpkaXYjc2VkX2hlbHAgaDUge2ZvbnQtc2l6ZTogMWVtO21hcmdp bi1sZWZ0OjFlbTtmb250LXN0eWxlOm9ibGlxdWU7fQpkaXYjc2VkX2hlbHAgaDYge2ZvbnQt c2l6ZTogMWVtO21hcmdpbi1sZWZ0OjJlbTtmb250LXN0eWxlOm9ibGlxdWU7fQpkaXYjc2Vk X2hlbHAgbGkge2xpc3Qtc3R5bGUtdHlwZTogZGlzYzt9CmRpdiNzZWRfaGVscCBsaSBsaSB7 bGlzdC1zdHlsZS10eXBlOiBjaXJjbGU7fQpkaXYjc2VkX2hlbHAgbGkgbGkgbGkge2xpc3Qt c3R5bGUtdHlwZTogc3F1YXJlO30KZGl2I3NlZF9oZWxwIGxpIGEgY29kZSB7Zm9udC13ZWln aHQ6IG5vcm1hbDt9CmRpdiNzZWRfaGVscCBsaSBjb2RlOmZpcnN0LWNoaWxkIHtiYWNrZ3Jv dW5kOiAjZGRkO3BhZGRpbmc6MCAuM2VtO21hcmdpbi1sZWZ0Oi0uM2VtO30KZGl2I3NlZF9o ZWxwIGxpIGxpIGNvZGU6Zmlyc3QtY2hpbGQge2JhY2tncm91bmQ6bm9uZTtwYWRkaW5nOjA7 bWFyZ2luLWxlZnQ6MDt9CmRpdiNzZWRfaGVscCBkZm4ge2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9u dC1zdHlsZTpvYmxpcXVlO30KZGl2I3NlZF9oZWxwIC5yZXF1aXJlZCwgZGl2I3NlZF9oZWxw IC53YXJuaW5nIHtjb2xvcjpyZWQ7fQpkaXYjc2VkX2hlbHAgLmRlZmF1bHQge2NvbG9yOmdy ZWVuO30KPC9zdHlsZT4KCTxwPjxkaXYgaWQ9InNlZF9oZWxwIj48L3A+CgoJPGgxPnNvb190 b2MgKHRhYmxlIG9mIGNvbnRlbnRzIGdlbmVyYXRvcik8L2gxPgoKIDxkaXYgaWQ9InRvYyI+ CgoJPGgyPkNvbnRlbnRzPC9oMj4KCgk8dWw+CgkJPGxpPjxhIGhyZWY9IiNvdmVydmlldyI+ T3ZlcnZpZXc8L2E+PC9saT4KCQk8bGk+PGEgaHJlZj0iI3N5bnRheCI+U3ludGF4PC9hPjwv bGk+CgkJPGxpPjxhIGhyZWY9IiNhdHRyaWJ1dGVzIj5BdHRyaWJ1dGVzPC9hPjwvbGk+CgkJ PGxpPjxhIGhyZWY9IiN1c2FnZSI+VXNhZ2U8L2E+Cgk8dWw+CgkJPGxpPjxhIGhyZWY9IiNn ZW5lcmFsIj5HZW5lcmFsPC9hPjwvbGk+CgkJPGxpPjxhIGhyZWY9IiNoZWFkaW5ncyI+VGhl IGFydGljbGUgaGVhZGluZ3M8L2E+PC9saT4KCQk8bGk+PGEgaHJlZj0iI2xldmVsIj5MZXZl bDwvYT48L2xpPgoJCTxsaT48YSBocmVmPSIjdXJscyI+UmVsYXRpdmUgdnMuIGFic29sdXRl IDxzcGFuIGNsYXNzPSJjYXBzIj5VUkw8L3NwYW4+czwvYT48L2xpPgoJCTxsaT48YSBocmVm PSIjbmVzdGVkIj5OZXN0ZWQgb3V0cHV0PC9hPjwvbGk+Cgk8L3VsPjwvbGk+CgkJPGxpPjxh IGhyZWY9IiNub3RlcyI+Tm90ZXM8L2E+Cgk8dWw+CgkJPGxpPjxhIGhyZWY9IiNwZXJmb3Jt YW5jZSI+UGVyZm9ybWFuY2U8L2E+PC9saT4KCQk8bGk+PGEgaHJlZj0iI2hpc3RvcnkiPkhp c3Rvcnk8L2E+PC9saT4KCTwvdWw+PC9saT4KCTwvdWw+CgogPC9kaXY+CgoJPGgyIGlkPSJv dmVydmlldyI+T3ZlcnZpZXc8L2gyPgoKCTxwPlRoaXMgaXMgYSA8YSBocmVmPSJodHRwOi8v dGV4dHBhdHRlcm4uY29tIj5UZXh0cGF0dGVybjwvYT4gcGx1Z2luLiBJdCBjb250YWlucyBv bmUgdGFnLCA8Y29kZT4mIzYwO3R4cDpzb29fdG9jIC8mIzYyOzwvY29kZT4uIFRoaXMgdGFn IGNhbiBiZSBwbGFjZWQganVzdCBhYm91dCBhbnl3aGVyZSBhbmQgd2lsbCBhdXRvbWF0aWNh bGx5IGdlbmVyYXRlIGEgdGFibGUgb2YgY29udGVudHMgZm9yIGFueSBhcnRpY2xlIGl0IGZp bmRzLCBzbyBsb25nIGFzIHRoYXQgYXJ0aWNsZSBjb250YWlucyA8c3BhbiBjbGFzcz0iY2Fw cyI+SFRNTDwvc3Bhbj4gaGVhZGluZ3MgKGgxLCBoMiwgZXRjLikgd2l0aCBpZCBhdHRyaWJ1 dGVzLiBPZiBjb3Vyc2UgaXQgcmVxdWlyZXMgYW4gYXJ0aWNsZSBjb250ZXh0LCBlaXRoZXIg bGlzdCBvciBpbmRpdmlkdWFsLjwvcD4KCgk8cD5JdCYjODIxNztzIG11Y2ggbGlrZSB0aGUg PGEgaHJlZj0iaHR0cDovL3RleHRwYXR0ZXJuLm9yZy9wbHVnaW5zLzY1OC9jYnNfYXJ0aWNs ZV9pbmRleCI+PGNvZGU+Y2JzX2FydGljbGVfaW5kZXg8L2NvZGU+IHBsdWdpbjwvYT4uIEhv d2V2ZXIsIDxjb2RlPiYjNjA7dHhwOnNvb190b2MgLyYjNjI7PC9jb2RlPiBvZmZlcnMgbmVz dGVkIGxpc3Qgb3V0cHV0LCBoZWFkaW5nLWxldmVsIGZpbHRlcmluZywgYW5kIGEgY2hvaWNl IG9mIHJlbGF0aXZlIG9yIGFic29sdXRlIDxzcGFuIGNsYXNzPSJjYXBzIj5VUkw8L3NwYW4+ cy4gSWYgeW91IGRvbiYjODIxNzt0IG5lZWQgdGhvc2UgZmVhdHVyZXMsIHlvdSBtaWdodCBw cmVmZXIgPGEgaHJlZj0iaHR0cDovL3RleHRwYXR0ZXJuLm9yZy9wbHVnaW5zLzY1OC9jYnNf YXJ0aWNsZV9pbmRleCI+PGNvZGU+Y2JzX2FydGljbGVfaW5kZXg8L2NvZGU+PC9hPiBmb3Ig aXRzIGxpZ2h0ZXIgZm9vdHByaW50LjwvcD4KCgk8aDIgaWQ9InN5bnRheCI+U3ludGF4PC9o Mj4KCjxwcmU+JiM2MDt0eHA6c29vX3RvYyAvJiM2MjsKPC9wcmU+CgoJPGgyIGlkPSJhdHRy aWJ1dGVzIj5BdHRyaWJ1dGVzPC9oMj4KCgk8cD5UaGUgZmlyc3QgZml2ZSBhcmUgc3RhbmRh cmQgVGV4dHBhdHRlcm4gYXR0cmlidXRlczsgb25seSB0aGUgbGFzdCB0d28gKDxjb2RlPmxl dmVsPC9jb2RlPiBhbmQgPGNvZGU+ZnVsbF91cmw8L2NvZGU+KSBhcmUgcGx1Z2luLXNwZWNp ZmljLjwvcD4KCgk8dWw+CgkJPGxpPjxjb2RlPmxhYmVsPSYjMzQ7dGV4dCYjMzQ7PC9jb2Rl PjxiciAvPgpMYWJlbCB0byBwcmVjZWRlIHRoZSBjb250ZW50cyBsaXN0LiBPcHRpb25hbDsg ZGVmYXVsdCBpcyB1bnNldC48L2xpPgoJCTxsaT48Y29kZT5sYWJlbHRhZz0mIzM0O3RhZyBu YW1lJiMzNDs8L2NvZGU+PGJyIC8+CihYKUhUTUwgZWxlbWVudCAod2l0aG91dCBicmFja2V0 cykgZm9yIHRoZSBsYWJlbC4gT3B0aW9uYWw7IGRlZmF1bHQgaXMgdW5zZXQuPC9saT4KCQk8 bGk+PGNvZGU+YnJlYWs9JiMzNDt0ZXh0JiMzNDs8L2NvZGU+PGJyIC8+CihYKUhUTUwgZWxl bWVudCAod2l0aG91dCBicmFja2V0cykgb3IgdGV4dCBmb3Igc2VwYXJhdGluZyBsaXN0IGl0 ZW1zLiBPcHRpb25hbDsgZGVmYXVsdCBpcyA8Y29kZT5saTwvY29kZT4uIElmIHlvdSBjaGFu Z2UgdGhpcywgeW91IHNob3VsZCBhbHNvIGNoYW5nZSB0aGUgPGNvZGU+d3JhcHRhZzwvY29k ZT4uPC9saT4KCQk8bGk+PGNvZGU+d3JhcHRhZz0mIzM0O3RhZyBuYW1lJiMzNDs8L2NvZGU+ PGJyIC8+CihYKUhUTUwgZWxlbWVudCBmb3IgZW5jbG9zaW5nIHRoZSBsaXN0LiBPcHRpb25h bDsgZGVmYXVsdCBpcyA8Y29kZT51bDwvY29kZT4uIElmIHlvdSBjaGFuZ2UgdGhpcyB0byBz b21ldGhpbmcgb3RoZXIgdGhhbiA8Y29kZT5vbDwvY29kZT4sIHlvdSBzaG91bGQgYWxzbyBj aGFuZ2UgdGhlIDxjb2RlPmJyZWFrPC9jb2RlPi48L2xpPgoJCTxsaT48Y29kZT5jbGFzcz0m IzM0O2NsYXNzIG5hbWUmIzM0OzwvY29kZT48YnIgLz4KKFgpSFRNTCBjbGFzcyBhdHRyaWJ1 dGUgdG8gYmUgYXBwbGllZCB0byA8Y29kZT53cmFwdGFnPC9jb2RlPi4gT3B0aW9uYWw7IGRl ZmF1bHQgaXMgPGNvZGU+dG9jPC9jb2RlPi48L2xpPgoJCTxsaT48Y29kZT5sZXZlbD0mIzM0 O3ZhbHVlJiMzNDs8L2NvZGU+PGJyIC8+Ck51bWJlciBpbiB0aGUgcmFuZ2UgMSYjODIxMTs2 LCBpbmRpY2F0aW5nIHRoZSBoaWdoZXN0IGhlYWRpbmcgbGV2ZWwgdG8gaW5jbHVkZSBpbiB0 aGUgdGFibGUgb2YgY29udGVudHMgKHNlZSA8YSBocmVmPSIjbGV2ZWwiPkxldmVsLCBiZWxv dzwvYT4pLiA8c3BhbiBjbGFzcz0icmVxdWlyZWQiPlJlcXVpcmVkPC9zcGFuPjsgZGVmYXVs dCBpcyA8Y29kZT42PC9jb2RlPiAoaW5jbHVkZSBhbGwgaGVhZGluZ3MpLjwvbGk+CgkJPGxp Pjxjb2RlPmZ1bGxfdXJsPSYjMzQ7Ym9vbGVhbiYjMzQ7PC9jb2RlPjxiciAvPgpJZiA8Y29k ZT50cnVlPC9jb2RlPiwgdXNlIGFic29sdXRlIGluc3RlYWQgb2YgcmVsYXRpdmUgPHNwYW4g Y2xhc3M9ImNhcHMiPlVSTDwvc3Bhbj5zLiBPcHRpb25hbCAoYnV0IHNlZSA8YSBocmVmPSIj dXJscyI+UmVsYXRpdmUgdnMuIEFic29sdXRlIDxzcGFuIGNsYXNzPSJjYXBzIj5VUkw8L3Nw YW4+czwvYT4sIGJlbG93KTsgZGVmYXVsdCBpcyB1bnNldCAoZmFsc2UpLjwvbGk+Cgk8L3Vs PgoKCTxoMiBpZD0idXNhZ2UiPlVzYWdlPC9oMj4KCgk8aDMgaWQ9ImdlbmVyYWwiPkdlbmVy YWw8L2gzPgoKCTxwPkNhbiBiZSB1c2VkIGluIGFuIGFydGljbGUgYm9keSwgaW4gYSBwYWdl LCBvciBpbiBhIGZvcm0uIElmIHVzZWQgd2l0aCByZWxhdGl2ZSA8c3BhbiBjbGFzcz0iY2Fw cyI+VVJMPC9zcGFuPnMgKHRoZSBkZWZhdWx0IHNldHRpbmcpIGl0IDxzcGFuIGNsYXNzPSJy ZXF1aXJlZCI+cmVxdWlyZXM8L3NwYW4+IGFuIGluZGl2aWR1YWwgYXJ0aWNsZSBjb250ZXh0 LiBJZiB1c2VkIGluIGFuIGFydGljbGUgbGlzdCwgb3Igb24gYSBwYWdlIGluIHdoaWNoIHRo ZSA8Y29kZT5iYXNlPC9jb2RlPiBlbGVtZW50IGluZGljYXRlcyBhbnl0aGluZyBvdGhlciB0 aGFuIGN1cnJlbnQgcGFnZSwgdGhlIDxjb2RlPmZ1bGxfdXJsPC9jb2RlPiBhdHRyaWJ1dGUg bXVzdCBiZSBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gKG9yIGFueXRoaW5nIG90aGVyIHRo YW4gPGNvZGU+MDwvY29kZT4pLiAoU2VlIDxhIGhyZWY9IiN1cmxzIj5SZWxhdGl2ZSB2cy4g QWJzb2x1dGUgPHNwYW4gY2xhc3M9ImNhcHMiPlVSTDwvc3Bhbj5zPC9hPiwgYmVsb3cuKTwv cD4KCgk8aDMgaWQ9ImhlYWRpbmdzIj5UaGUgYXJ0aWNsZSBoZWFkaW5nczwvaDM+CgoJPHA+ T25seSBoZWFkaW5ncyB0aGF0IGhhdmUgYW4gPGNvZGU+aWQ8L2NvZGU+IGF0dHJpYnV0ZSB3 aWxsIGJlIGluY2x1ZGVkLiBUaGlzIGlzIHRvIGdpdmUgdGhlIGxpbmtzIGluIHRoZSB0YWJs ZSBvZiBjb250ZW50cyBzb21ldGhpbmcgdG8gcG9pbnQgdG8uIEluIFRleHRpbGUsIHlvdSBj YW4gYXBwbHkgdGhlIDxjb2RlPmlkPC9jb2RlPiBhdHRyaWJ1dGUgbGlrZSB0aGlzOjwvcD4K CjxwcmU+aDMoI2V4YW1wbGUpLiBFeGFtcGxlCjwvcHJlPgoKCTxwPnRvIHByb2R1Y2U6PC9w PgoKPHByZT4mIzYwO2gzIGlkPSYjMzQ7ZXhhbXBsZSYjMzQ7JiM2MjtFeGFtcGxlJiM2MDsv aDMmIzYyOwo8L3ByZT4KCgk8aDMgaWQ9ImxldmVsIj5MZXZlbDwvaDM+CgoJPHA+VGhlIDxj b2RlPmxldmVsPC9jb2RlPiBhdHRyaWJ1dGUgYWxsb3dzIHlvdSB0byByZXN0cmljdCB3aGlj aCBoZWFkaW5nIGxldmVscyB0byBpbmNsdWRlIGluIHRoZSB0YWJsZSBvZiBjb250ZW50cy4g Rm9yIGV4YW1wbGUsIDxjb2RlPmxldmVsPSYjMzQ7MyYjMzQ7PC9jb2RlPiB3aWxsIHJlc3Ry aWN0IG91dHB1dCB0byA8Y29kZT5oMTwvY29kZT4sIDxjb2RlPmgyPC9jb2RlPiwgYW5kIDxj b2RlPmgzPC9jb2RlPiBoZWFkaW5ncy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+Njwv Y29kZT4sIHNob3cgYWxsIGhlYWRpbmdzLjwvcD4KCgk8cD5Zb3UgbWlnaHQgdXNlIHRoaXMg dG8gaGF2ZSBib3RoIGEgZnVsbCBhbmQgYSBjb25jaXNlIHRhYmxlIG9mIGNvbnRlbnRzLCBv bmUgaW4gdGhlIHNpZGViYXIgYW5kIHRoZSBvdGhlciBpbiB0aGUgYXJ0aWNsZSBib2R5LiBP ciBjb21iaW5lIHdpdGggYSBiaXQgb2YgamF2YXNjcmlwdCB0byBhbGxvdyB0aGUgdXNlciB0 byBleHBhbmQgb3IgY29sbGFwc2UgdGhlIHRhYmxlIG9mIGNvbnRlbnRzLjwvcD4KCgk8aDMg aWQ9InVybHMiPlJlbGF0aXZlIHZzLiBhYnNvbHV0ZSA8c3BhbiBjbGFzcz0iY2FwcyI+VVJM PC9zcGFuPnM8L2gzPgoKCTxwPlRoZSBkZWZhdWx0IG91dHB1dCB1c2VzIHNhbWUtcGFnZSBy ZWxhdGl2ZSA8c3BhbiBjbGFzcz0iY2FwcyI+VVJMPC9zcGFuPnMgKGUuZy4gPGNvZGU+aHJl Zj0mIzM0OyNpZF9uYW1lJiMzNDs8L2NvZGU+KSwgd2hpY2ggd2lsbCBvbmx5IHdvcmsgY29y cmVjdGx5IGluIGFuIGluZGl2aWR1YWwgYXJ0aWNsZSBjb250ZXh0LiBUbyBnZXQgYWJzb2x1 dGUgKGZ1bGwpIDxzcGFuIGNsYXNzPSJjYXBzIj5VUkw8L3NwYW4+cyBpbnN0ZWFkLCBzZXQg dGhlIDxjb2RlPmZ1bGxfdXJsPC9jb2RlPiBhdHRyaWJ1dGUgdG8gPGNvZGU+dHJ1ZTwvY29k ZT4gKG9yIGFueSB2YWx1ZSBvdGhlciB0aGFuIDxjb2RlPjA8L2NvZGU+KS48L3A+CgoJPHA+ SWYgeW91IHVzZSBhIDxjb2RlPmJhc2U8L2NvZGU+IHRhZyB0byBwb2ludCB0byB0aGUgc2l0 ZSByb290IChvciBhbnl0aGluZyBvdGhlciB0aGFuIHRoZSBjdXJyZW50IHBhZ2UpLCB5b3Ug d2lsbCBhbHNvIG5lZWQgdG8gdXNlIGZ1bGwgPHNwYW4gY2xhc3M9ImNhcHMiPlVSTDwvc3Bh bj5zLiAoTi4gQi4sIHN1Y2ggdXNhZ2Ugb2YgPGNvZGU+YmFzZTwvY29kZT4gaXMsIHN0cmlj dGx5IHNwZWFraW5nLCBpbmNvcnJlY3QuKTwvcD4KCgk8aDMgaWQ9Im5lc3RlZCI+TmVzdGVk IG91dHB1dDwvaDM+CgoJPHA+SWYgdGhlIDxjb2RlPndyYXB0YWc8L2NvZGU+IGlzIDxjb2Rl PnVsPC9jb2RlPiAodGhlIGRlZmF1bHQgdmFsdWUpIG9yIDxjb2RlPm9sPC9jb2RlPiwgYW5k IGlmIHRoZSBhcnRpY2xlIGhhcyBkaWZmZXJlbnQgbGV2ZWxzIG9mIGhlYWRpbmdzLCB0aGUg dGFibGUgb2YgY29udGVudHMgd2lsbCBiZSBhIG5lc3RlZCBsaXN0LiBGb3IgZXhhbXBsZSwg Z2l2ZW4gdGhlIGZvbGxvd2luZyBhcnRpY2xlIGhlYWRpbmdzIChzaG93biBpbiBUZXh0aWxl KTo8L3A+Cgo8cHJlPmgyKCNmb28pLiBGb28KLi4uCmgzKCNiYXIpLiBCYXIKPC9wcmU+CgoJ PHA+dGhlIHBsdWdpbiB3aWxsIHByb2R1Y2UsIHVzaW5nIGRlZmF1bHQgYXR0cmlidXRlczo8 L3A+Cgo8cHJlPiYjNjA7dWwgY2xhc3M9JiMzNDt0b2MmIzM0OyYjNjI7CgkmIzYwO2xpJiM2 MjsmIzYwO2EgaHJlZj0mIzM0OyNmb28mIzM0OyYjNjI7Rm9vJiM2MDsvYSYjNjI7CgkmIzYw O3VsJiM2MjsKCQkmIzYwO2xpJiM2MjsmIzYwO2EgaHJlZj0mIzM0OyNiYXImIzM0OyYjNjI7 QmFyJiM2MDsvYSYjNjI7JiM2MDsvbGkmIzYyOwoJJiM2MDsvdWwmIzYyOyYjNjA7L2xpJiM2 MjsKJiM2MDsvdWwmIzYyOwo8L3ByZT4KCgk8cD5Gb3IgdGhpcyBuZXN0ZWQgb3V0cHV0IHRv IG1ha2Ugc2Vuc2UsIHRoZSBhcnRpY2xlJiM4MjE3O3MgaGVhZGluZyBzdHJ1Y3R1cmUgbXVz dCBhbHNvIG1ha2Ugc2Vuc2UuIDxzcGFuIGNsYXNzPSJ3YXJuaW5nIj5JbiBwYXJ0aWN1bGFy Ojwvc3Bhbj48L3A+CgoJPHVsPgoJCTxsaT5kbyBub3QganVtcCB1cHdhcmRzIG1vcmUgdGhh biBvbmUgaGVhZGluZyBsZXZlbCBhdCBhIHRpbWUgKGUuZy4sIGdvIGRpcmVjdGx5IGZyb20g PGNvZGU+aDI8L2NvZGU+IHRvIDxjb2RlPmg0PC9jb2RlPik8L2xpPgoJCTxsaT50aGUgZmly c3QgaGVhZGluZyBzaG91bGQgYmUgYXQgdGhlIGxvd2VzdCBoZWFkaW5nIGxldmVsIChlLmcu LCBpZiB0aGUgZmlyc3QgaGVhZGluZyBpbiB0aGUgYXJ0aWNsZSBib2R5IGlzIDxjb2RlPmgy PC9jb2RlPiwgdGhlcmUgc2hvdWxkIG5vdCBiZSBhbnkgPGNvZGU+aDE8L2NvZGU+cyBpbiB0 aGUgYXJ0aWNsZSBib2R5KTwvbGk+Cgk8L3VsPgoKCTxwPkJlY2F1c2UgdGhlIHBsdWdpbiBp Z25vcmVzIGhlYWRpbmdzIHdpdGggbm8gaWQgYXR0cmlidXRlLCB5b3UgY291bGQgZ2V0IHVu ZXhwZWN0ZWQgcmVzdWx0cyAoYW5kIHBvc3NpYmx5IDxzcGFuIGNsYXNzPSJjYXBzIj5YSFRN TDwvc3Bhbj4gdmFsaWRhdGlvbiBlcnJvcnMpIGlmIHlvdSBhcmUgaW5jb25zaXN0ZW50IGFi b3V0IGFzc2lnbmluZyBpZCB0byBoZWFkaW5ncy48L3A+CgoJPGgyIGlkPSJub3RlcyI+Tm90 ZXM8L2gyPgoKCTxoMyBpZD0icGVyZm9ybWFuY2UiPlBlcmZvcm1hbmNlPC9oMz4KCgk8cD5U aGUgcGx1Z2luIHJ1bnMgYSA8Y29kZT5wcmVnX21hdGNoX2FsbDwvY29kZT4gc2VhcmNoIG9u IHRoZSBhcnRpY2xlJiM4MjE3O3MgPHNwYW4gY2xhc3M9ImNhcHMiPkhUTUw8L3NwYW4+IGJv ZHksIGFuZCBhbm90aGVyIDxjb2RlPnByZWdfbWF0Y2g8L2NvZGU+IG9uIGVhY2ggaGVhZGlu Zy4gVGhlb3JldGljYWxseSB0aGlzIGNvdWxkIGJlIGEgcGVyZm9ybWFuY2UgY29uY2VybiBp biBzb21lIHNpdHVhdGlvbnMsIHBhcnRpY3VsYXJseSBpbiBhbiBhcnRpY2xlIGxpc3QgY29u dGV4dC48L3A+CgoJPGgzIGlkPSJoaXN0b3J5Ij5IaXN0b3J5PC9oMz4KCgk8cD5UaGlzIHBs dWdpbiBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhlIDxhIGhyZWY9Imh0dHA6Ly90ZXh0cGF0dGVy bi5vcmcvcGx1Z2lucy82NTgvY2JzX2FydGljbGVfaW5kZXgiPjxjb2RlPmNic19hcnRpY2xl X2luZGV4PC9jb2RlPiBwbHVnaW48L2E+IChkaWRuJiM4MjE3O3QgcmVhbGl6ZSB0aGlzIHdo ZW4gSSB3cm90ZSBpdCksIGJ1dCB3aXRoIG1vcmUgb3B0aW9ucyBmb3Igb3V0cHV0IGFuZCBj b250cm9sLjwvcD4KCgk8aDQgaWQ9InZlcnNpb25fMF8xXzUiPlZlcnNpb24gMC4xLjUsIDIw MTctMDItMTU8L2g0PgoKCTx1bD4KCQk8bGk+VGV4dHBhdHRlcm4gNC42IGNvbXBhdGliaWxp dHkgdXBkYXRlPC9saT4KCTwvdWw+CgoJPGg0IGlkPSJ2ZXJzaW9uXzBfMV80Ij5WZXJzaW9u IDAuMS40LCAyMDA5LjQuMjY8L2g0PgoKCTx1bD4KCQk8bGk+TWlub3IgY29kZSBjbGVhbmlu ZzwvbGk+Cgk8L3VsPgoKCTxoNCBpZD0idmVyc2lvbl8wXzFfMyI+VmVyc2lvbiAwLjEuMywg MjAwOC4yLjAzPC9oND4KCgk8dWw+CgkJPGxpPkNvZGUgY2xlYW5pbmcsIHBsdXMgdmFsaWQg PHNwYW4gY2xhc3M9ImNhcHMiPlhIVE1MPC9zcGFuPiBvdXRwdXQgZXZlbiBmb3IgYXJ0aWNs ZXMgd2l0aCB1bnNlbWFudGljIGhlYWRpbmcgc3RydWN0dXJlPC9saT4KCTwvdWw+CgoJPGg0 IGlkPSJ2ZXJzaW9uXzBfMV8yIj5WZXJzaW9uIDAuMS4yLCAyMDA4LjIuMDM8L2g0PgoKCTx1 bD4KCQk8bGk+Rml4ZWQgYnVnIChkZXNpZ24gZmxhdywgYWN0dWFsbHkpIHJlIG5lc3RlZCBs aXN0IG91dHB1dDogdGhhbmtzIHRvIERlamFuIGZvciBzcG90dGluZyB0aGlzPC9saT4KCTwv dWw+CgoJPGg0IGlkPSJ2ZXJzaW9uXzBfMV8xIj5WZXJzaW9uIDAuMS4xLCAyMDA4LjEuMjk8 L2g0PgoKCTx1bD4KCQk8bGk+Rml4ZWQgYnVnIHJlIGhlYWRpbmdzIGNvbnRhaW5pbmcgPHNw YW4gY2xhc3M9ImNhcHMiPkhUTUw8L3NwYW4+IHRhZ3M8L2xpPgoJPC91bD4KCgk8aDQgaWQ9 InZlcnNpb25fMF8xIj5WZXJzaW9uIDAuMSwgMjAwOC4xLjI2PC9oND4KCgk8dWw+CgkJPGxp PkF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgYSBsaW5rZWQgdGFibGUgb2YgY29udGVudHMgZm9y IGFuIGFydGljbGU8L2xpPgoJCTxsaT5OZXN0ZWQgb3V0cHV0IGZvciAoWClIVE1MIGxpc3Rz PC9saT4KCQk8bGk+T3B0aW9uIHRvIGZpbHRlciByZXN1bHRzIHdpdGggdGhlIDxjb2RlPmxl dmVsPC9jb2RlPiBhdHRyaWJ1dGUuPC9saT4KCQk8bGk+T3B0aW9uIHRvIHVzZSBmdWxsIDxz cGFuIGNsYXNzPSJjYXBzIj5VUkw8L3NwYW4+czwvbGk+Cgk8L3VsPgoKCTxwPjwvZGl2Pjwv cD4iO3M6NDoiY29kZSI7czoyMTk1OiIKaWYoY2xhc3NfZXhpc3RzKCdcVGV4dHBhdHRlcm5c VGFnXFJlZ2lzdHJ5JykpIHsKCVR4cDo6Z2V0KCdcVGV4dHBhdHRlcm5cVGFnXFJlZ2lzdHJ5 JykKCQktPnJlZ2lzdGVyKCdzb29fdG9jJyk7Cn0KCmZ1bmN0aW9uIHNvb190b2MoICRhdHRz ICkgewoKCWdsb2JhbCAkdGhpc2FydGljbGU7Cglhc3NlcnRfYXJ0aWNsZSgpOwoKCWV4dHJh Y3QobEF0dHMoYXJyYXkoCgkJJ2xhYmVsJwkJCT0+ICcnLAoJCSdsYWJlbHRhZycJCT0+ICcn LAoJCSdicmVhaycJCQk9PiAnbGknLAoJCSd3cmFwdGFnJwkJPT4gJ3VsJywKCQknY2xhc3Mn CQkJPT4gJ3RvYycsCgkJJ2xldmVsJwkJCT0+IDYsCgkJJ2Z1bGxfdXJsJwkJPT4gJycsCgkp LCAkYXR0cykpOwoKCSRmdWxsX3VybCA9ICRmdWxsX3VybCA/IHBlcm1saW5rdXJsKCR0aGlz YXJ0aWNsZSkgOiAnJzsKCgkkcGF0dGVybiA9ICcvPGgoXGQpW14+XSs/aWRccyo9XHMqIihb XHctXSspIltePl0qPiguKz8pPFxcL2hcXDEvJzsKCXByZWdfbWF0Y2hfYWxsKCRwYXR0ZXJu LCAkdGhpc2FydGljbGVbJ2JvZHknXSwgJGhlYWRpbmdzLCBQUkVHX1NFVF9PUkRFUik7CgoJ JGl0ZW1zID0gYXJyYXkoKTsKCglmb3JlYWNoICggJGhlYWRpbmdzIGFzICRoICkKCQlpZiAo ICRoWzFdIDw9ICRsZXZlbCApIHsKIAkJCSRmaWx0ZXJlZFtdID0gJGg7CgkJCSRpdGVtc1td ID0gJzxhIGhyZWY9IicgLiAkZnVsbF91cmwgLiAnIycgLiAkaFsyXSAuICciPicgLiAkaFsz XSAuICc8L2E+JzsKCQl9CgoJaWYgKCAhJGl0ZW1zICkKCQlyZXR1cm47CgoJaWYgKCAkd3Jh cHRhZyAhPSAndWwnICYmICR3cmFwdGFnICE9ICdvbCcgKQoJCXJldHVybiBkb0xhYmVsKCRs YWJlbCwgJGxhYmVsdGFnKSAuIGRvV3JhcCgkaXRlbXMsICR3cmFwdGFnLCAkYnJlYWssICRj bGFzcyk7CgoJJG5lc3RfbGV2ZWwgPSAxOwoJJGxpbmVzW10gPSBzb29fdG9jX3ByZXBlbmQo JzxsaT4nIC4gJGl0ZW1zWzBdLCB0LCAkbmVzdF9sZXZlbCk7CgoJZm9yICgkaSA9IDE7ICRp IDwgY291bnQoJGl0ZW1zKTsgJGkrKykgewoJCSRsZXZlbF9jaGFuZ2UgPSAkZmlsdGVyZWRb JGldWzFdIC0gJGZpbHRlcmVkWyRpLTFdWzFdOwoJCWlmICgkbGV2ZWxfY2hhbmdlID4gMCkK CQkJZm9yICgkaiA9IDE7ICRqIDw9ICRsZXZlbF9jaGFuZ2U7ICRqKyspIHsKCQkJCSRsaW5l c1tdID0gc29vX3RvY19wcmVwZW5kKCI8JHdyYXB0YWc+IiwgdCwgJG5lc3RfbGV2ZWwpLgoJ CQkJCSgkbGV2ZWxfY2hhbmdlID4gJGogPyAnPGxpPicgOiAnJyk7CgkJCQkkbmVzdF9sZXZl bCArKzsKCQkJfQoJCWVsc2VpZiAoJGxldmVsX2NoYW5nZSA8IDApCgkJCWZvciAoJGogPSAx OyAkaiA8PSAtJGxldmVsX2NoYW5nZTsgJGorKykgewoJCQkJJG5lc3RfbGV2ZWwgLS07CgkJ CQkkbGluZXNbXSA9IHNvb190b2NfcHJlcGVuZCgiPC8kd3JhcHRhZz48L2xpPiIsIHQsICRu ZXN0X2xldmVsKTsKCQkJfQoJCSRsaW5lc1tdID0gc29vX3RvY19wcmVwZW5kKCc8bGk+JyAu ICRpdGVtc1skaV0sIHQsICRuZXN0X2xldmVsKTsKCX0KCgl3aGlsZSAoJG5lc3RfbGV2ZWwg PiAxKSB7CgkJJG5lc3RfbGV2ZWwgLS07CgkJJGxpbmVzW10gPSBzb29fdG9jX3ByZXBlbmQo IjwvJHdyYXB0YWc+PC9saT4iLCB0LCAkbmVzdF9sZXZlbCk7Cgl9CgoJZm9yICgkaSA9IDA7 ICRpIDwgY291bnQoJGxpbmVzKS0xOyAkaSsrKQoJCWlmICggcHJlZ19tYXRjaCgnLzxsaT4v JywgJGxpbmVzWyRpXSkKCQkJJiYgIXByZWdfbWF0Y2goIi88JHdyYXB0YWc+LyIsICRsaW5l c1skaSsxXSkgKQoJCQkJJGxpbmVzWyRpXSAuPSAnPC9saT4nOwoKCWlmICggIXByZWdfbWF0 Y2goIi88XC8kd3JhcHRhZz4vIiwgJGxpbmVzW2NvdW50KCRsaW5lcyktMV0pICkKCQkkbGlu ZXNbY291bnQoJGxpbmVzKS0xXSAuPSAnPC9saT4nOwoKCSRvdXQgPSAnPCcgLiAkd3JhcHRh ZyAuICggJGNsYXNzID8gJyBjbGFzcz0iJyAuICRjbGFzcyAuICciPicgOiAnPicgKQoJCS4g biAuIGpvaW4obiwgJGxpbmVzKSAuIG4gLiAiPC8kd3JhcHRhZz4iIC4gbjsKCglyZXR1cm4g ZG9MYWJlbCgkbGFiZWwsICRsYWJlbHRhZykgLiBuIC4gJG91dDsKfQoKZnVuY3Rpb24gc29v X3RvY19wcmVwZW5kKCRiYXNlLCAkYWRkLCAkdGltZXMpIHsKCWZvciAoICRpID0gMTsgJGkg PD0gJHRpbWVzOyAkaSsrICkKCQkkYmFzZSA9ICRhZGQgLiAkYmFzZTsKCXJldHVybiAkYmFz ZTsKfSI7czo0OiJ0eXBlIjtzOjE6IjAiO3M6NToiZmxhZ3MiO3M6MToiMCI7czo1OiJvcmRl ciI7czoxOiI1IjtzOjM6Im1kNSI7czozMjoiMWI4ZWYxZWQzZWMwYjU1NzEwZGZiYzg5ZjNj NmVjM2QiO30=