# ful_ajax_gallery v0.7 # this plugin helps to create a dynamic archive browsing using ajax # Francesco Fullone # http://www.fullo.net/blog/progetti/textpattern-plugins/ # ...................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ...................................................................... YTo5OntzOjQ6Im5hbWUiO3M6MTY6ImZ1bF9hamF4X2dhbGxlcnkiO3M6NjoiYXV0aG9yIjtz OjE3OiJGcmFuY2VzY28gRnVsbG9uZSI7czoxMDoiYXV0aG9yX3VyaSI7czo1NToiaHR0cDov L3d3dy5mdWxsby5uZXQvYmxvZy9wcm9nZXR0aS90ZXh0cGF0dGVybi1wbHVnaW5zLyI7czo3 OiJ2ZXJzaW9uIjtzOjM6IjAuNyI7czoxMToiZGVzY3JpcHRpb24iO3M6NjU6InRoaXMgcGx1 Z2luIGhlbHBzIHRvIGNyZWF0ZSBhIGR5bmFtaWMgYXJjaGl2ZSBicm93c2luZyB1c2luZyBh amF4IjtzOjQ6InR5cGUiO2k6MDtzOjQ6ImhlbHAiO3M6Njg1MDoiCjxoMT5mdWxfYWpheF9n YWxsZXJ5PC9oMT4KPGgzPkRlc2NyaXB0aW9uPC9oMz4KVGhpcyBwbHVnaW4gaGVscHMgdG8g Y3JlYXRlIGEgZHluYW1pYyBhcmNoaXZlIGJyb3dzaW5nIHVzaW5nIGFqYXgsIGl0IHVzZXMg YWpheCB0byBxdWVyeSB0aGUgdGV4dHBhdHRlcm4gZGIgYW5kIHRvIHJldHJpZXZlIHBvc3Qg aW5mb3JtYXRpb24gc3VjaCB0aXRsZSwgdGV4dCBhbmQgd2hhdGV2ZXIuClRoZSBwbHVnaW4g aXMgc3Ryb25nbHkgaXNwaXJlZCBvbiB0aGUgY2JzX2xpdmVfc2VhcmNoIGJ1dCBpdCBkb2Vz bid0IHVzZSBoYXJkY29kZWQgcXVlcnkuIFNvIHlvdSBjYW4gY2hvb3NlIGhvdyB0byBkaXNw bGF5IHlvdXIgcmVzdWx0cyBzaW1wbHkgY3JlYXRpbmcgYSBuZXcgbGF5b3V0IGZvcm0uCgo8 aDM+UmVsZWFzZTwvaDM+CnYwLjcKCjxoMz5Eb3dubG9hZDwvaDM+Cjx1bD4KCTxsaT48YSBo cmVmPSJodHRwOi8vd3d3LmZ1bGxvLm5ldC9wcm9nZXR0aS90ZXh0cGF0dGVybi9mdWxfYWph eF9nYWxsZXJ5LnBocHMiPmZ1bF9hamF4X2dhbGxlcnkucGhwczwvYT4gcGx1Z2luIHRlbXBs YXRlIGZpbGUgbm90IGNvbXBpbGVkPC9saT4KCTxsaT48YSBocmVmPSJodHRwOi8vd3d3LmZ1 bGxvLm5ldC9wcm9nZXR0aS90ZXh0cGF0dGVybi9mdWxfYWpheF9nYWxsZXJ5LnR4dCI+ZnVs X2FqYXhfZ2FsbGVyeS50eHQ8L2E+IGNvbXBpbGVkIHBsdWdpbjwvbGk+CjwvdWw+Cgo8aDM+ RGVtbzwvaDM+CjxhIGhyZWY9Imh0dHA6Ly9waHAuZnVsbG8ubmV0L3RleHRwYXR0ZXJuLyI+ aHR0cDovL3BocC5mdWxsby5uZXQvdGV4dHBhdHRlcm4vPC9hPiBjbGljayBvbiAibmV4dCIg dG8gc3RhcnQgdGhlIGRlbW8KCjxoMz5SZWZlcmVuY2U8L2gzPgo8ZGl2Pgo8dWw+Cgk8bGk+ YWRkIGluIHRoZSAmbHQ7aGVhZCZndDsgc2VjdGlvbiBvZiB0aGUgcGFnZSB0ZW1wbGF0ZSB0 aGU8YnIvPgoJPGNvZGU+Jmx0O3R4cDpmdWxfYWpheF9nYWxsZXJ5X2pzIC8mZ3Q7PC9jb2Rl PgoJaXQgd2lsbCBhZGQgdGhlIG5lY2Vzc2FyaWVzIGphdmFzY3JpcHQgZnVuY3Rpb24gdG8g Y2FsbCBhamF4IHdpdGggcHJvdG90eXBlIGFuZCBzY3JpcHRhY291bHVzPC9saT4KCTxsaT50 aGUgPGNvZGU+Jmx0O3R4cDpmdWxfYWpheF9nYWxsZXJ5IC8mZ3Q7PC9jb2RlPiB0YWcgaXMg dGhlIG1haW4gdGFnIG9mIHRoZSBwbHVnaW4uIDxici8+CgkJVGhpcyB0YWcgdXNlcyB0aG9z ZSBhdHRyaWJ1dGVzOgoJCTx1bD4KCQkJPGxpPnNlY3Rpb246IHRoZSBzZWN0aW9uIHdoZXJl IHRvIHNlYXJjaCBkYXRhLCBub3RlIHRoYXQgaXMgdGhlIHNhbWUgb2YgY3VzdG9tX2FydGlj bGU8L2xpPgoJCQk8bGk+Y2F0ZWdvcnk6IHRoZSBjYXRlZ29yeSB3aGVyZSB0byBzZWFyY2gg ZGF0YSwgbm90ZSB0aGF0IGlzIHRoZSBzYW1lIG9mIGN1c3RvbV9hcnRpY2xlPC9saT4KCQkJ PGxpPmZvcm06IHRoZSBmb3JtIGxheW91dCBmb3IgdGhlIHJlc3VsdHM8L2xpPgoJCQk8bGk+ bGltaXQ6IGhvdyBtYW55IGFydGljbGVzIGFyZSByZXRyaWV2ZWQsIG5vdGUgdGhhdCBpcyB0 aGUgc2FtZSBvZiBjdXN0b21fYXJ0aWNsZTwvbGk+CgkJCTxsaT5vZmZzZXQ6IHRoZSBvZmZz ZXQgZnJvbSB3aGljaCB0aGUgZGF0YSBpcyByZXRyaWV2ZWQsIG5vdGUgdGhhdCBpcyB0aGUg c2FtZSBvZiBjdXN0b21fYXJ0aWNsZTwvbGk+CgkJCTxsaT5sYWJlbDogc2hvdyB0aGUgbWVu dWJhciBsYWJlbDwvbGk+CgkJCTxsaT5tZW51ICh0cnVlL2ZhbHNlKTogc2hvdyB0aGUgbWVu dWJhcjwvbGk+CgkJCTxsaT5zb3J0YnkgKHBvc3RlZCk6IGhvdyB0byBzb3J0IHRoZSByZXN1 bHRzLCBub3RlIHRoYXQgaXMgdGhlIHNhbWUgb2YgY3VzdG9tX2FydGljbGU8L2xpPgoJCQk8 bGk+c3Bpbm5lciAodHJ1ZS9mYWxzZSk6IGFkZCB0aGUgc3Bpbm5lciBkaXYgZGlyZWN0bHk8 L2xpPgoJCQk8bGk+dG9wICh0cnVlL2ZhbHNlKTogYWRkIHRoZSB0b3AgZGl2IGRpcmVjdGx5 PC9saT4KCQkJPGxpPmxhYmVsX21lbnVfbmV4dDogdGhlIGxhYmVsIGZvciB0aGUgJ25leHQn IGxpbms8L2xpPgoJCQk8bGk+bGFiZWxfbWVudV9wcmV2OiB0aGUgbGFiZWwgZm9yIHRoZSAn cHJldicgbGluazwvbGk+CgkJPC91bD4KCTwvbGk+Cgk8bGk+CgkJaWYgeW91IHdhbnQgdG8g YWRkIHRoZSBtZW51IGJhciBpbiBhbm90aGVyIHBvc2l0aW9uIHlvdSBjYW4gdXNlIHRoZSB0 YWcgIDxjb2RlPiZsdDt0eHA6ZnVsX2FqYXhfbWVudSZndDs8L2NvZGU+CgkJaXQgdXNlcyBh IGxpbWl0ZWQgc2V0cyBvZiB0aGUgYXR0cmlidXRlcyBvZiA8Y29kZT4mbHQ7dHhwOmZ1bF9h amF4X2dhbGxlcnkgLyZndDs8L2NvZGU+CgkJPHVsPgoJCQk8bGk+c2VjdGlvbjogdGhlIHNl Y3Rpb24gd2hlcmUgdG8gc2VhcmNoIGRhdGEsIG5vdGUgdGhhdCBpcyB0aGUgc2FtZSBvZiBj dXN0b21fYXJ0aWNsZTwvbGk+CgkJCTxsaT5jYXRlZ29yeTogdGhlIGNhdGVnb3J5IHdoZXJl IHRvIHNlYXJjaCBkYXRhLCBub3RlIHRoYXQgaXMgdGhlIHNhbWUgb2YgY3VzdG9tX2FydGlj bGU8L2xpPgoJCQk8bGk+Zm9ybTogdGhlIGZvcm0gbGF5b3V0IGZvciB0aGUgcmVzdWx0czwv bGk+CgkJCTxsaT5saW1pdDogaG93IG1hbnkgYXJ0aWNsZXMgYXJlIHJldHJpZXZlZCwgbm90 ZSB0aGF0IGlzIHRoZSBzYW1lIG9mIGN1c3RvbV9hcnRpY2xlPC9saT4KCQkJPGxpPm9mZnNl dDogdGhlIG9mZnNldCBmcm9tIHdoaWNoIHRoZSBkYXRhIGlzIHJldHJpZXZlZCwgbm90ZSB0 aGF0IGlzIHRoZSBzYW1lIG9mIGN1c3RvbV9hcnRpY2xlPC9saT4KCQkJPGxpPmxhYmVsIChu ZXh0L3ByZXYpOiB1c2VkIHRvIGNyZWF0ZSB0aGUgbGluayB0byBwcmV2aW91cyBvIG5leHQg YXJ0aWNsZXM8L2xpPgoJCTwvdWw+CgkJYW5kIGl0IG5lZWQgYWxzbyBhIG5lc3RlZCB0ZXh0 IGFzIHRoZSBsYWJlbAoJPC9saT4KCTxsaT4KCQlpZiB5b3Ugd2FudCB0byBhZGQgdGhlIGFq YXggY29udGFpbmVyIGZvciB0aGUgYXJ0aWNsZSBpbiBhbm90aGVyIHBvc2l0aW9uIHlvdSBo YXZlIHRvIHNldCB0aGUgYXR0cmlidXRlIHRvcD1mYWxzZSBmb3IKCQk8Y29kZT4mbHQ7dHhw OmZ1bF9hamF4X2dhbGxlcnkgLyZndDs8L2NvZGU+IGFuZCB0aGVuIHlvdSBjYW4gdXNlIDxj b2RlPiZsdDt0eHA6ZnVsX2FqYXhfdG9wIC8mZ3Q7PC9jb2RlPi4KCQlUaGlzIHRhZyBhY2Nl cHQgMiBhdHRyaWJ1dGVzIGFuZCBjYW4gbWFuYWdlIHRleHQuCgkJPHVsPgoJCQk8bGk+dGFn IChkaXYpOiB0aGUgdHlwZSBvZiB0YWcgZm9yIHRoZSBhamF4IGNvbnRhaW5lcjwvbGk+CgkJ CTxsaT5jbGFzczogdGhlIGNzcyBjbGFzcyBmb3IgdGhlIHRhZzwvbGk+CgkJPHVsPgoJPC9s aT4KCTxsaT4KCQlhcyBiZWZvcmUgaWYgeW91IHdhbnQgdG8gYWRkIHRoZSBhamF4IHNwaW5u ZXIgaW4gYW5vdGhlciBwb3NpdGlvbiB5b3UgaGF2ZSB0byBzZXQgdGhlIGF0dHJpYnV0ZSBz cGlubmVyPWZhbHNlIGZvcgoJCTxjb2RlPiZsdDt0eHA6ZnVsX2FqYXhfZ2FsbGVyeSAvJmd0 OzwvY29kZT4gYW5kIHRoZW4geW91IGNhbiB1c2UgPGNvZGU+Jmx0O3R4cDpmdWxfYWpheF9z cGlubmVyIC8mZ3Q7PC9jb2RlPi4KCQlUaGlzIHRhZyBhY2NlcHQgMiBhdHRyaWJ1dGVzIGFu ZCBjYW4gbWFuYWdlIHRleHQuCgkJPHVsPgoJCQk8bGk+dGFnIChkaXYpOiB0aGUgdHlwZSBv ZiB0YWcgZm9yIHRoZSBhamF4IGNvbnRhaW5lcjwvbGk+CgkJCTxsaT5jbGFzczogdGhlIGNz cyBjbGFzcyBmb3IgdGhlIHRhZzwvbGk+CgkJPHVsPgoJPC9saT4KCTxsaT4KCQl5b3UgY2Fu IGNvbmZpZ3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYWxsIHRoZSBwbHVnaW4gY2hhbmdp bmcgdGhlIDxjb2RlPmZ1bF9hamF4X2NvbmZpZygpPC9jb2RlPiBhcnJheS4KCTwvbGk+Cjwv dWw+CjwvZGl2PgoKPGgzPmNzcyBzdHlsZTwvaDM+CjxkaXY+CglFdmVyeSBvYmplY3QgY3Jl YXRlZCBieSB0aGUgcGx1Z2luIGhhcyBpdHMgb3duIGNzcyBJRDoKCTx1bD4KCQk8bGk+bWVu dSBhbmQgbWVudSBsaW5rczogYWpheC1tZW51LCBhamF4LW1lbnUtbmV4dCwgYWpheC1tZW51 LXByZXY8L2xpPgoJCTxsaT50aXRsZSBicm93c2luZyAoYm90dG9tIGludGVyZmFjZSk6IGZ1 bC1hamF4LWJvdHRvbTwvbGk+CgkJPGxpPmFydGljbGUgY29udGVudDogZnVsLWFqYXgtdG9w PC9saT4KCQk8bGk+c3Bpbm5lcjogZnVsLWFqYXgtc3Bpbm5lcjwvbGk+Cgk8L3VsPgo8L2Rp dj4KCjxoMz51c2FnZSBleGFtcGxlPC9oMz4KPGRpdj4KCWNyZWF0ZSBhIGxheW91dCBwYWdl LCBjbG9uaW5nIHRoZSBkZWZhdWx0IHRlbXBsYXRlLiBBZGQgdGhlbiBpbiB0aGUgaHRtbCBo ZWFkIHNlY3Rpb24gdGhlIGNhbGxpbmcgZm9yIHRoZSBqcyBsaWJyYXJpZXMuCgk8ZW0+bm90 ZSB0aGF0IElcJ3ZlIGluc3RhbGxlZCBwcm90b3R5cGUgYW5kIHNjcmlwdGFjdWxvdXMgaW4g dGhlIC9qcyBkaXJlY3Rvcnk8L2VtPjxici8+Cgk8YmxvY2txdW90ZT48Y29kZT4KCQkmbHQ7 c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSImbHQ7dHhwOnNpdGVfdXJsLyZn dDtqcy9wcm90b3R5cGUuanMiICZndDsmbHQ7L3NjcmlwdCZndDsKCQkmbHQ7c2NyaXB0IHR5 cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSImbHQ7dHhwOnNpdGVfdXJsLyZndDtqcy9zY3Jp cHRhY3Vsb3VzLmpzIiAmZ3Q7Jmx0Oy9zY3JpcHQmZ3Q7CgkJJmx0O3R4cDpmdWxsX2FqYXhf Z2FsbGVyeV9qcyAvJmd0OwoJPC9jb2RlPjwvYmxvY2txdW90ZT4KCgl0aGVuIGluIHRoZSBi b2R5IG9mIHRoZSBwYWdlIEkgYWRkIHRoZSB0YWcgdG8gY3JlYXRlIHRoZSBhamF4IGdhbGxl cnkKCTxibG9ja3F1b3RlPjxjb2RlPgoJCSZsdDtoMSZndDsgYWpheCBhcnRpY2xlIGdhbGxl cnkgJmx0Oy9oMSZndDsKCQkmbHQ7dHhwOmZ1bF9hamF4X2dhbGxlcnkgbGltaXQ9IjUiIGNh dGVnb3J5PSJteWNhdCIgZm9ybT0ibXlmb3JtIiAvJmd0OwoJPC9jb2RlPjwvYmxvY2txdW90 ZT4KCglub3cgYW4gYXJjaGl2ZSBnYWxsZXJ5IGZvciB0aGUgY2F0ZWdvcnkgPGVtPm15Y2F0 PC9lbT4gaXMgY3JlYXRlZCBieSB0ZXh0cGF0dGVybiwgYW5kIEkgaGF2ZSBhbHNvIGEgNSB0 aXRsZSBwYWdpbmF0aW9uLgoJVGhlIGFyY2hpdmUgdXNlcyBhIGdlbmVyaWMgYXJ0aWNsZSBm b3JtIDxlbT5teWZvcm08L2VtPgoJPGJsb2NrcXVvdGU+PGNvZGU+CgkJCSZsdDtkaXYgY2xh c3M9ImFydGljb2xvIiZndDsKCQkJJmx0O3R4cDpmdWxfYWpheF9zaG93X2xpbmsgZm9ybT0i bXlUb3BGb3JtIiZndDsjIyZsdDt0eHA6YXJ0aWNsZV9pZCAvJmd0OyMjJmx0O3R4cDp0aXRs ZSAvJmd0OyZsdDsvdHhwOmZ1bF9hamF4X3Nob3dfbGluayZndDsKCQkJJmx0Oy9kaXYmZ3Q7 Cgk8L2NvZGU+PC9ibG9ja3F1b3RlPgoJPHN0cm9uZz5pdCBpcyB2ZXJ5IGltcG9ydGFudDwv c3Ryb25nPiB0aGF0IHRoZSB2YWx1ZSBpbnNlcnRlZCBpbiB0aGUgPGVtPmZ1bF9hamF4X3No b3dfbGluazwvZW0+IHRhZyBzdGFydCB3aXRoICMjSUQtT0YtVEhFLVBPU1QjIyBUaGlzIGlz IGR1ZSBhCgl0ZXh0cGF0dGVybiBsaW1pdGF0aW9uIHdoaWNoIGNhbm5vdCBwZXJtaXQgdG8g dXNlIGEgdHhwOnRhZyBpbnNpZGUgYW5vdGhlciB0eHA6dGFnIGFzIGF0dHJpYnV0ZS4gQWZ0 ZXIgdGhhdCBwYXR0ZXJuIHlvdSBjYW4gYWRkIGFueXRoaW5nLgoJSGVyZSBJIHVzZSBhIGFy dGljbGUgZm9ybSBjYWxsZWQgPGVtPm15VG9wRm9ybTwvZW0+LgoJPGJsb2NrcXVvdGU+PGNv ZGU+CgkJJmx0O2gyJmd0OyZsdDt0eHA6cGVybWxpbmsmZ3Q7Jmx0O3R4cDp0aXRsZSAvJmd0 OyZsdDsvdHhwOnBlcm1saW5rPiZsdDsvaDImZ3Q7CgkJJmx0O3R4cDpib2R5IC8mZ3Q7Cgk8 L2NvZGU+PC9ibG9ja3F1b3RlPgoKCWlmIHlvdSB3YW50IHRvIGFkZCB0aGUgc3Bpbm5lciBv ciB0aGUgdG9wIGNvbnRhaW5lciBpbiBhbm90aGVyIHBsYWNlIHlvdSBjYW4gY2hhbmdlIHRo ZSBwYWdlIGxheW91dCBhcyBmb2xsb3c6Cgk8YmxvY2txdW90ZT48Y29kZT4KCgkJJmx0O3R4 cDpmdWxfYWpheF9zcGlubmVyJmd0OyZsdDtpbWcgc3JjPSJwYXRoLnRvL3NwaW5uZXIuaW1n IiBhbHQ9Im15IGFqYXggc3Bpbm5lciIgLyZndDsmbHQ7L3R4cDpmdWxfYWpheF9zcGlubmVy Jmd0OwoKCQkmbHQ7dHhwOmZ1bF9hamF4X21lbnUgbGFiZWw9InByZXYiIGxpbWl0PSI1IiBj YXRlZ29yeT0ibXljYXQiIGZvcm09Im15Zm9ybSIgbWVudT0iZmFsc2UiIC8mZ3Q7CgkJJmx0 O3R4cDpmdWxfYWpheF9tZW51IGxhYmVsPSJuZXh0IiBsaW1pdD0iNSIgY2F0ZWdvcnk9Im15 Y2F0IiBmb3JtPSJteWZvcm0iIG1lbnU9ImZhbHNlIiAvJmd0OwoKCQkvLyBzb21lIGh0bWwg Y29kZSBoZXJlCgoJCSZsdDtoMSZndDsgYWpheCBhcnRpY2xlIGdhbGxlcnkgJmx0Oy9oMSZn dDsKCQkmbHQ7dHhwOmZ1bF9hamF4X2dhbGxlcnkgbGltaXQ9IjUiIGNhdGVnb3J5PSJteWNh dCIgZm9ybT0ibXlmb3JtIiBzcGlubmVyPSJmYWxzZSIgdG9wPSJmYWxzZSIgbWVudT0iZmFs c2UiLyZndDsKCgkJLy8gc29tZSBodG1sIGNvZGUgaGVyZQoKCQkmbHQ7dHhwOmZ1bF9hamF4 X3RvcCBjbGFzcz0ibXlDU1MiIHRhZz0icCImZ3Q7U09NRSBURVhUIEhFUkUmbHQ7L3R4cDpm dWxfYWpheF90b3AmZ3Q7CgoJPC9jb2RlPjwvYmxvY2txdW90ZT4KCW5vdGUgdGhhdCBpcyA8 c3Ryb25nPnZlcnkgaW1wb3J0YW50PC9zdHJvbmc+IHRvIGFkZCB0aGUgc2FtZSBhdHRyaWJ1 dGVzIHRvIHRoZSBmdWxfYWpheF9tZW51IGFuZCBmdWxfYWpheF9nYWxsZXJ5IHRhZ3MuCjwv ZGl2PgoKPHA+PHN0cm9uZz5ub3RlOjwvc3Ryb25nPiBUaGlzIHBsdWdpbiBuZWVkIHRoZSBz Y3JpcHRhY291bHVzIGFuZCBwcm90b3R5cGUganMgbGlicmFyaWVzIGxvYWRlZCBpbiB0aGUg aGVhZCBvZiB5b3VyIHNpdGUgdGVtcGxhdGU8L3A+CiI7czo0OiJjb2RlIjtzOjc2MDc6Igpy ZWdpc3Rlcl9jYWxsYmFjaygnZnVsX2FqYXhfbmV4dCcsICd0ZXh0cGF0dGVybicpOwpyZWdp c3Rlcl9jYWxsYmFjaygnZnVsX2FqYXhfc2hvdycsICd0ZXh0cGF0dGVybicpOwpyZWdpc3Rl cl9jYWxsYmFjaygnZnVsX2FqYXhfbmV4dF9tZW51JywgJ3RleHRwYXR0ZXJuJyk7CgovLyB0 aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBhamF4IHNjcmlwdCAsIGNhbGxpbmcg aXQgZnJvbSBhIHR4cCB0YWcgaXNuJ3QgYSBnb29kIGlkZWEKZnVuY3Rpb24gZnVsX2FqYXhf c2hvdygpIHsKCglpZigocHMoJ2Z1bF9zaG93JykpID09ICcnKQoJCXJldHVybjsKCgkkaWQg PSAoaW50KXBzKCdpZCcpOwoJJGZvcm0gPSBwcygnZm9ybScpOwoKCWhlYWRlcignQ29udGVu dC1UeXBlOiBhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQ7IGNoYXJzZXQ9SVNPLTg4NTktMScp OwoKCWdsb2JhbCAkcHJlZnM7CgoJJGFyZ3MgPSBhcnJheSAoCgkJCQknaWQnPT4gJGlkLAoJ CQkJJ2Zvcm0nPT4gJGZvcm0KCQkpOwoKCSRvID0gYXJyYXkoKTsKCSRvW10gPSBhcnRpY2xl X2N1c3RvbSgkYXJncyk7CgoJZXhpdChkb1dyYXAoJG8sICR3cmFwdGFnLCAkYnJlYWspKTsK fQoKLy8gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB0aGUgYWpheCBzY3JpcHQgLCBj YWxsaW5nIGl0IGZyb20gYSB0eHAgdGFnIGlzbid0IGEgZ29vZCBpZGVhCmZ1bmN0aW9uIGZ1 bF9hamF4X25leHQoKSB7CgoJaWYoKHBzKCdmdWxfbmV4dCcpKSA9PSAnJykKCQlyZXR1cm47 CgoJJGxpbWl0ID0gKGludClwcygnbGltaXQnKTsKCSRvcmlnaW5hbF9vZmZzZXQgPSAoaW50 KXBzKCdvZmZzZXQnKSAtICRsaW1pdHMgOwoJJG9mZnNldCA9IChpbnQpcHMoJ29mZnNldCcp ICsgJGxpbWl0czsKCSRzZWN0aW9uID0gcHMoJ3NlY3Rpb24nKTsKCSRjYXRlZ29yeSA9IHBz KCdjYXRlZ29yeScpOwoJJGZvcm0gPSBwcygnZm9ybScpOwoJJG1lbnUgPSBwcygnbWVudScp OwoJJGJyZWFrPSAiIjsKCgloZWFkZXIoJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1q YXZhc2NyaXB0OyBjaGFyc2V0PUlTTy04ODU5LTEnKTsKCglnbG9iYWwgJHByZWZzOwoKCSRh cmdzID0gYXJyYXkgKAoJCQkJJ2xpbWl0JyA9PiAkbGltaXQsCgkJCQknZm9ybSc9PiAkZm9y bSwKCQkJCSdvZmZzZXQnPT4gJG9mZnNldCwKCQkJCSdzb3J0YnknPT4gJ3Bvc3RlZCcsCgkJ CQknc2VjdGlvbic9PiAkc2VjdGlvbiwKCQkJCSdjYXRlZ29yeSc9PiAkY2F0ZWdvcnksCgkJ CQknbWVudScgPT4gJG1lbnUKCQkJKTsKCgkkbyA9IGFycmF5KCk7Cgkkb1tdID0gYXJ0aWNs ZV9jdXN0b20oJGFyZ3MpOwoKCWlmICgkbWVudSA9PSAndHJ1ZScpCgl7CgkJJG9bXSA9ICc8 ZGl2IGlkPSJhamF4LW1lbnUiPic7CgoJCWlmICgkb3JpZ2luYWxfb2Zmc2V0ID49IDApCgkJ CSRvW10gPSBmdWxfYWpheF9tZW51KGFycmF5X21lcmdlKCRhcmdzLCBhcnJheSgnbGFiZWwn PT4ncHJldicpKSwncHJldicpOwoKCQkkb1tdID0gZnVsX2FqYXhfbWVudShhcnJheV9tZXJn ZSgkYXJncywgYXJyYXkoJ2xhYmVsJz0+J25leHQnKSksJ25leHQnKTsKCgkJJG9bXT0gJzwv ZGl2Pic7Cgl9CgoJZXhpdChkb1dyYXAoJG8sICR3cmFwdGFnLCAkYnJlYWspKTsKfQoKLy8g dGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB0aGUgYWpheCBzY3JpcHQgLCBjYWxsaW5n IGl0IGZyb20gYSB0eHAgdGFnIGlzbid0IGEgZ29vZCBpZGVhCmZ1bmN0aW9uIGZ1bF9hamF4 X25leHRfbWVudSgpIHsKCglpZigocHMoJ2Z1bF9uZXh0X21lbnUnKSkgPT0gJycpCgkJcmV0 dXJuOwoKCSRsaW1pdCA9IChpbnQpcHMoJ2xpbWl0Jyk7Cgkkb3JpZ2luYWxfb2Zmc2V0ID0g KGludClwcygnb2Zmc2V0JykgLSAkbGltaXRzIDsKCSRvZmZzZXQgPSAoaW50KXBzKCdvZmZz ZXQnKSArICRsaW1pdHM7Cgkkc2VjdGlvbiA9IHBzKCdzZWN0aW9uJyk7CgkkY2F0ZWdvcnkg PSBwcygnY2F0ZWdvcnknKTsKCSRmb3JtID0gcHMoJ2Zvcm0nKTsKCSRtZW51ID0gcHMoJ21l bnUnKTsKCSRicmVhaz0gIiI7CgoJaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9u L3gtamF2YXNjcmlwdDsgY2hhcnNldD1JU08tODg1OS0xJyk7CgoJZ2xvYmFsICRwcmVmczsK CgkkYXJncyA9IGFycmF5ICgKCQkJCSdsaW1pdCcgPT4gJGxpbWl0LAoJCQkJJ2Zvcm0nPT4g JGZvcm0sCgkJCQknb2Zmc2V0Jz0+ICRvZmZzZXQsCgkJCQknc29ydGJ5Jz0+ICdwb3N0ZWQn LAoJCQkJJ3NlY3Rpb24nPT4gJHNlY3Rpb24sCgkJCQknY2F0ZWdvcnknPT4gJGNhdGVnb3J5 LAoJCQkJJ21lbnUnID0+ICRtZW51CgkJCSk7CgoJJG8gPSBhcnJheSgpOwoKCWlmICgkb3Jp Z2luYWxfb2Zmc2V0ID49IDApCgkJJG9bXSA9IGZ1bF9hamF4X21lbnUoYXJyYXlfbWVyZ2Uo JGFyZ3MsIGFycmF5KCdsYWJlbCc9PidwcmV2JykpLCdwcmV2Jyk7CgoJJG9bXSA9IGZ1bF9h amF4X21lbnUoYXJyYXlfbWVyZ2UoJGFyZ3MsIGFycmF5KCdsYWJlbCc9PiduZXh0JykpLCdu ZXh0Jyk7CgoKCWV4aXQoZG9XcmFwKCRvLCAkd3JhcHRhZywgJGJyZWFrKSk7Cn0KCi8vIGFk ZCB0aGUganMgZnVuY3Rpb24gdG8gY2FsbCB0aGUgYWpheCBzY3JpcHQsIGFkZCB0aGlzIGlu IHRoZSBoZWFkZXIgb2YgeW91ciB0ZW1wbGF0ZQpmdW5jdGlvbiBmdWxfYWpheF9nYWxsZXJ5 X2pzKCl7CgoJcmV0dXJuICcKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCglm dW5jdGlvbiBmdWxfTmV4dChsaW1pdCxvZmZzZXQsc2VjdGlvbixjYXRlZ29yeSxmb3JtLG1l bnUpCgl7CgkJdmFyIHVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwoJCXZhciBwYXJhbXMg PSAiZnVsX25leHQ9dHJ1ZSZsaW1pdD0iK2xpbWl0KyImb2Zmc2V0PSIrb2Zmc2V0KyImc2Vj dGlvbj0iK3NlY3Rpb24rIiZjYXRlZ29yeT0iK2NhdGVnb3J5KyImZm9ybT0iK2Zvcm0rIiZt ZW51PSIrbWVudTsKCQl2YXIgYWpheCA9IG5ldyBBamF4LlVwZGF0ZXIoCgkJCXtzdWNjZXNz OiAiZnVsLWFqYXgtYm90dG9tIn0sCgkJCXVybCwKCQkJewoJCQlhc3luY2hyb25vdXM6dHJ1 ZSwKCQkJZXZhbFNjcmlwdHM6dHJ1ZSwKCQkJbWV0aG9kOiAicG9zdCIsCgkJCXBhcmFtZXRl cnM6IHBhcmFtcywKCQkJb25GYWlsdXJlOiByZXBvcnRFcnJvciwKCQkJb25Db21wbGV0ZTpm dW5jdGlvbihyZXF1ZXN0KSB7bmV3IEVmZmVjdC5IaWdobGlnaHQoImZ1bC1hamF4LWJvdHRv bSIpOyBFbGVtZW50LmhpZGUoImZ1bC1hamF4LXNwaW5uZXIiKTsgaWYgKG1lbnUgPT0gImZh bHNlIikgZnVsX05leHRfTWVudShsaW1pdCxvZmZzZXQsc2VjdGlvbixjYXRlZ29yeSxmb3Jt KX0sCgkJCW9uTG9hZGluZzpmdW5jdGlvbihyZXF1ZXN0KSB7bmV3IEVmZmVjdC5IaWdobGln aHQoImZ1bC1hamF4LXNwaW5uZXIiKTsgbmV3IEVmZmVjdC5BcHBlYXIoImZ1bC1hamF4LXNw aW5uZXIiKTsgfQoJCQl9KTsKCX0KCglmdW5jdGlvbiBmdWxfTmV4dF9NZW51KGxpbWl0LG9m ZnNldCxzZWN0aW9uLGNhdGVnb3J5LGZvcm0pCgl7CgkJdmFyIHVybCA9IHdpbmRvdy5sb2Nh dGlvbi5ocmVmOwoJCXZhciBwYXJhbXMgPSAiZnVsX25leHRfbWVudT10cnVlJmxpbWl0PSIr bGltaXQrIiZvZmZzZXQ9IitvZmZzZXQrIiZzZWN0aW9uPSIrc2VjdGlvbisiJmNhdGVnb3J5 PSIrY2F0ZWdvcnkrIiZmb3JtPSIrZm9ybSsiJm1lbnU9ZmFsc2UiOwoJCXZhciBhamF4ID0g bmV3IEFqYXguVXBkYXRlcigKCQkJe3N1Y2Nlc3M6ICJhamF4LW1lbnUifSwKCQkJdXJsLAoJ CQl7CgkJCWFzeW5jaHJvbm91czp0cnVlLAoJCQlldmFsU2NyaXB0czp0cnVlLAoJCQltZXRo b2Q6ICJwb3N0IiwKCQkJcGFyYW1ldGVyczogcGFyYW1zLAoJCQlvbkZhaWx1cmU6IHJlcG9y dEVycm9yLAoJCQlvbkNvbXBsZXRlOmZ1bmN0aW9uKHJlcXVlc3QpIHtuZXcgRWZmZWN0Lkhp Z2hsaWdodCgiYWpheC1tZW51Iik7IH0KCQkJfSk7Cgl9CgoKCWZ1bmN0aW9uIGZ1bF9TaG93 KGlkLGZvcm0pCgl7CgkJdmFyIHVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwoJCXZhciBw YXJhbXMgPSAiZnVsX3Nob3c9dHJ1ZSZpZD0iK2lkKyImZm9ybT0iK2Zvcm07CgkJdmFyIGFq YXggPSBuZXcgQWpheC5VcGRhdGVyKAoJCQl7c3VjY2VzczogImZ1bC1hamF4LXRvcCJ9LAoJ CQl1cmwsCgkJCXsKCQkJYXN5bmNocm9ub3VzOnRydWUsCgkJCWV2YWxTY3JpcHRzOnRydWUs CgkJCW1ldGhvZDogInBvc3QiLAoJCQlwYXJhbWV0ZXJzOiBwYXJhbXMsCgkJCW9uRmFpbHVy ZTogcmVwb3J0RXJyb3IsCgkJCW9uQ29tcGxldGU6ZnVuY3Rpb24ocmVxdWVzdCkge25ldyBF ZmZlY3QuSGlnaGxpZ2h0KCJmdWwtYWpheF90b3AiKTsgRWxlbWVudC5oaWRlKCJmdWwtYWph eC1zcGlubmVyIik7IH0sCgkJCW9uTG9hZGluZzpmdW5jdGlvbihyZXF1ZXN0KSB7IG5ldyBF ZmZlY3QuQXBwZWFyKCJmdWwtYWpheC1zcGlubmVyIik7IH0KCQkJfSk7Cgl9CgoKCWZ1bmN0 aW9uIHJlcG9ydEVycm9yKHJlcXVlc3QpCgl7CgkJJChmdWwtYWpheC10b3ApLmlubmVySFRN TCA9ICJFcnJvciAiK3JlcXVlc3Q7Cgl9CgoJPC9zY3JpcHQ+CgknOwoKfQoKLy9nZW5lcmF0 ZSB0aGUgbmV4dCwgcHJldiBtZW51IGxpbmsgYnV0dG9uCmZ1bmN0aW9uIGZ1bF9hamF4X21l bnUoJGF0dHMpIHsKCglleHRyYWN0KGxBdHRzKGZ1bF9hamF4X2NvbmZpZygpLCRhdHRzKSk7 CgoJaWYgKCFpbl9hcnJheShzdHJ0b2xvd2VyKCRsYWJlbCksYXJyYXkoJ25leHQnLCdwcmV2 JykpKSAkbGFiZWw9J25leHQnOwoJaWYgKHN0cnRvbG93ZXIoJGxhYmVsKSA9PSAnbmV4dCcp ICRvZmZzZXQgPSAkb2Zmc2V0ICsgJGxpbWl0OwoJaWYgKHN0cnRvbG93ZXIoJGxhYmVsKSA9 PSAncHJldicpICRvZmZzZXQgPSAkb2Zmc2V0IC0gJGxpbWl0OwoKCglpZiAoJG9mZnNldCA8 IDApIHJldHVybiAnJzsKCWVsc2UgcmV0dXJuICcKCQkJCQk8YSBocmVmPSIjIiByZWw9Im5v Zm9sbG93IiBpZD0iYWpheC1tZW51LScuJGxhYmVsLiciPicuJHsnbGFiZWxfbWVudV8nLiRs YWJlbH0uJzwvYT4KCQkJCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+RXZlbnQu b2JzZXJ2ZSgkKCJhamF4LW1lbnUtJy4kbGFiZWwuJyIpLCJjbGljayIsZnVuY3Rpb24oKXtm dWxfTmV4dChcJycuJGxpbWl0LidcJyxcJycuJG9mZnNldC4nXCcsXCcnLiRzZWN0aW9uLidc JyxcJycuJGNhdGVnb3J5LidcJyxcJycuJGZvcm0uJ1wnLFwnJy4kbWVudS4nXCcpO30sIGZh bHNlKTs8L3NjcmlwdD4KCQkJCSc7Cn0KCmZ1bmN0aW9uIGZ1bF9hamF4X3Nob3dfbGluaygk YXR0cywkdmFsdWUpewoKCSRzdHJpbmcgPSBwYXJzZSgkdmFsdWUpOwoJZXh0cmFjdChsQXR0 cyhmdWxfYWpheF9jb25maWcoKSwkYXR0cykpOwoKCWlmICgkaWQgPT0gJycpCgl7CgkJZXJl ZygnXiMjWzAtOV0rIyMnLCRzdHJpbmcsJG5ld2lkKTsKCQkkaWQgPSBlcmVnX3JlcGxhY2Uo JyMjJywnJywkbmV3aWRbMF0pOwoJCSRzdHJpbmcgPSBlcmVnX3JlcGxhY2UoJ14jI1swLTld KyMjJywnJywkc3RyaW5nKTsKCX0KCglyZXR1cm4gICcKCQkJCTxhIGhyZWY9IiMiIHJlbD0i bm9mb2xsb3ciIGlkPSJhamF4LXBvc3QtJy4kaWQuJyI+Jy4kc3RyaW5nLic8L2E+CgkJCQk8 c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+RXZlbnQub2JzZXJ2ZSgkKCJhamF4LXBv c3QtJy4kaWQuJyIpLCJjbGljayIsZnVuY3Rpb24oKXtmdWxfU2hvdyhcJycuJGlkLidcJyxc JycuJGZvcm0uJ1wnKTt9LGZhbHNlKTs8L3NjcmlwdD4KCQkJJzsKCn0KCi8vIG1haW4gZnVu Y3Rpb24gdG8gc2hvdyB0aGUgZGl2cyBmb3IgdGhlIGFqYXggZ2FsbGVyeQpmdW5jdGlvbiBm dWxfYWpheF9nYWxsZXJ5KCRhdHRzKSB7CgoJZXh0cmFjdChsQXR0cyhmdWxfYWpheF9jb25m aWcoKSwkYXR0cykpOwoKICAgICAgICBpZiAoJGNhdGVnb3J5ICE9ICcnKSAkYWRkX2NhdGVn b3J5ID0gJ2NhdGVnb3J5PScuJGNhdGVnb3J5OwogICAgICAgIGlmICgkc2VjdGlvbiAhPSAn JykgJGFkZF9zZWN0aW9uID0gJ3NlY3Rpb24gPScuJHNlY3Rpb24gOwoKCWlmICgkc3Bpbm5l ciA9PSAndHJ1ZScpICRzaG93X3NwaW5uZXIgPSAnPHR4cDpmdWxfYWpheF9zcGlubmVyPnNw aW5uZXI8L3R4cDpmdWxfYWpheF9zcGlubmVyPic7CgllbHNlICRzaG93X3NwaW5uZXIgPSAn JzsKCglpZiAoJHRvcCA9PSAndHJ1ZScpICRzaG93X3RvcCA9ICc8ZGl2IGlkPSJmdWwtYWph eC10b3AiPjwvZGl2Pic7CgllbHNlICRzaG93X3RvcCA9ICcnOwoKCWlmICgkbWVudSA9PSAn dHJ1ZScpICRzaG93X21lbnUgPSAnPGRpdiBpZD0iYWpheC1tZW51Ij48dHhwOmZ1bF9hamF4 X21lbnUgIGxpbWl0PSInLiRsaW1pdC4nIiBmb3JtPSInLiRmb3JtLiciICcuJGFkZF9zZWN0 aW9uLicgJy4kYWRkX2NhdGVnb3J5Licgb2Zmc2V0PSInLiRvZmZzZXQuJyIgbGFiZWw9Im5l eHQiPicuJGxhYmVsX21lbnVfbmV4dC4nPC90eHA6ZnVsX2FqYXhfbWVudT48L2Rpdj4nOwoJ ZWxzZSAkc2hvd19tZW51ID0gJyc7CgoJcmV0dXJuICcKCQknLiRzaG93X3RvcC4nCgoJCScu JHNob3dfc3Bpbm5lci4nCgoJCTxkaXYgaWQ9ImZ1bC1hamF4LWJvdHRvbSI+CgkJCTx0eHA6 YXJ0aWNsZV9jdXN0b20gbGltaXQ9IicuJGxpbWl0LiciIGZvcm09IicuJGZvcm0uJyIgJy4k YWRkX3NlY3Rpb24uJyAgJy4kYWRkX2NhdGVnb3J5Licgb2Zmc2V0PSInLiRvZmZzZXQuJyIg c29ydGJ5PSJwb3N0ZWQiIC8+CgoJCQknLiRzaG93X21lbnUuJwoKCQkJPC9kaXY+CgkJPC9k aXY+JzsKCn0KCi8vIGNyZWF0ZSB0aGUgYWpheCB0b3AgZGl2cwpmdW5jdGlvbiBmdWxfYWph eF90b3AoJGF0dHMsJHZhbHVlPScnKSB7CglleHRyYWN0KGxBdHRzKGFycmF5KAoJCSd0YWcn ICAgPT4gJ2RpdicsCgkJJ2NsYXNzJyAgID0+ICcnLAoJKSwkYXR0cykpOwoKCXJldHVybiAn PCcuJHRhZy4nIGlkPSJmdWwtYWpheC10b3AiIGNsYXNzPSInLiRjbGFzcy4nIj4nLnBhcnNl KCR2YWx1ZSkuJzwvJy4kdGFnLic+JzsKfQoKLy8gY3JlYXRlIHRoZSBhamF4IHNwaW5uZXIK ZnVuY3Rpb24gZnVsX2FqYXhfc3Bpbm5lcigkYXR0cywkdmFsdWU9J3NwaW5uZXInKSB7Cgll eHRyYWN0KGxBdHRzKGFycmF5KAoJCSd0YWcnICAgPT4gJ2RpdicsCgkJJ2NsYXNzJyAgID0+ ICcnLAoJKSwkYXR0cykpOwoKCXJldHVybiAnPCcuJHRhZy4nIGlkPSJmdWwtYWpheC1zcGlu bmVyIiBzdHlsZT0iZGlzcGxheTpub25lIiBjbGFzcz0iJy4kY2xhc3MuJyI+Jy5wYXJzZSgk dmFsdWUpLic8LycuJHRhZy4nPic7Cn0KCi8vIHdyaXRlIGhlcmUgeW91ciBkZWZhdWx0IGNv bmZpZyB2YWx1ZQpmdW5jdGlvbiBmdWxfYWpheF9jb25maWcoKQp7CglyZXR1cm4gYXJyYXko CgkJJ3NlY3Rpb24nICAgPT4gJycsCgkJJ2NhdGVnb3J5Jz0+ICdhcmNoaXZlJywKCQknZm9y bScgPT4gJ2FydGljbGUnLAoJCSdsaW1pdCcgPT4gJzMnLAoJCSdvZmZzZXQnICAgICA9PiAn MCcsCgkJJ2xhYmVsJyA9PiAnbmV4dCcsCgkJJ3NwaW5uZXInID0+ICd0cnVlJywKCQknbWVu dScgPT4gJ3RydWUnLAoJCSdzb3J0YnknID0+ICdwb3N0ZWQnLAoJCSd0b3AnID0+ICd0cnVl JywKCQknbGFiZWxfbWVudV9uZXh0JyA9PiAnbmV4dCAmZ3Q7JywKCQknbGFiZWxfbWVudV9w cmV2JyA9PiAnJmx0OyBwcmV2JywKCQknY2xhc3MnID0+ICcnCgkpOwp9CgoKIjtzOjM6Im1k NSI7czozMjoiMDNkNTA0NDZhMDcxNmIwZGUxYzVmNTY3MGFhMGFmOWMiO30=