# Name: rah_plugin_download v1.0 # Type: Admin/Client side plugin # Public plugin downloads directly from database # Author: Jukka Svahn # URL: http://rahforum.biz # 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: # ..................................................................... YToxMTp7czo0OiJuYW1lIjtzOjE5OiJyYWhfcGx1Z2luX2Rvd25sb2FkIjtzOjY6ImF1dGhv ciI7czoxMToiSnVra2EgU3ZhaG4iO3M6MTA6ImF1dGhvcl91cmkiO3M6MTk6Imh0dHA6Ly9y YWhmb3J1bS5iaXoiO3M6NzoidmVyc2lvbiI7czozOiIxLjAiO3M6MTE6ImRlc2NyaXB0aW9u IjtzOjQ2OiJQdWJsaWMgcGx1Z2luIGRvd25sb2FkcyBkaXJlY3RseSBmcm9tIGRhdGFiYXNl IjtzOjQ6ImhlbHAiO3M6MTAyODM6Igk8aDE+cmFoX3BsdWdpbl9kb3dubG9hZHM8L2gxPgoK CTxwPkFsbG93cyBwbHVnaW4gYXV0aG9ycyBzZXJ2ZSBwbHVnaW4gZG93bmxvYWRzIGVhc2ls eSB3aXRoIG91dCBzYXZpbmcgYW5kIHVwbG9hZGluZyBmaWxlcyBhZ2FpbiBhbmQgYWdhaW4u PC9wPgoKCTx1bD4KCQk8bGk+VmVyc2lvbjogMS4wPC9saT4KCQk8bGk+VXBkYXRlZDogMjAx MC8wNi8xNSA0OjAwIFBNIDxzcGFuIGNsYXNzPSJjYXBzIj5VVEM8L3NwYW4+PC9saT4KCTwv dWw+CgoJPGgzPlRhYmxlIG9mIENvbnRlbnRzPC9oMz4KCgk8dWw+CgkJPGxpPjxhIGhyZWY9 IiNpbnRyby1hbmQtZGVzY3JpcHRpb24iPkludHJvIGFuZCBkZXNjcmlwdGlvbjwvYT48L2xp PgoJCTxsaT48YSBocmVmPSIjbGlzdC1vZi1mZWF0dXJlcyI+TGlzdCBvZiBmZWF0dXJlczwv YT48L2xpPgoJCTxsaT48YSBocmVmPSIjcmVxdWlyZW1lbnRzIj5SZXF1aXJlbWVudHM8L2E+ PC9saT4KCQk8bGk+PGEgaHJlZj0iI2luc3RhbGxhdGlvbi1hbmQtdXNhZ2UiPkluc3RhbGxh dGlvbiBhbmQgdXNhZ2U8L2E+PC9saT4KCQk8bGk+PGEgaHJlZj0iI2F0dHJpYnV0ZXMiPkF0 dHJpYnV0ZXM8L2E+PC9saT4KCQk8bGk+PGEgaHJlZj0iI2V4YW1wbGVzIj5FeGFtcGxlczwv YT48L2xpPgoJCTxsaT48YSBocmVmPSIjY2hhbmdlbG9nIj5DaGFuZ2Vsb2c8L2E+PC9saT4K CQk8bGk+PGEgaHJlZj0iI3RoYW5rcy10byI+VGhhbmtzIHRvPC9hPjwvbGk+Cgk8L3VsPgoK CTxoMyBpZD0iaW50cm8tYW5kLWRlc2NyaXB0aW9uIj5JbnRybyBhbmQgZGVzY3JpcHRpb248 L2gzPgoKCTxwPkEgPGEgaHJlZj0iaHR0cDovL3d3dy50ZXh0cGF0dGVybi5jb20iPlRleHRw YXR0ZXJuPC9hPiBwbHVnaW4gdXNlZCB0byBhbGxvdyBwdWJsaWMgcGx1Z2luIGRvd25sb2Fk cyBkaXJlY3RseSBmcm9tIHRoZSBkYXRhYmFzZS4gQSB0b29sIHRoYXQgcGx1Z2luIGRldmVs b3BlcnMgY2FuIHVzZSB0byBhbGxvdyB1c2VycyB0byBkb3dubG9hZCB0aGVpciBhbWF6aW5n IHBsdWdpbnMuIEZvciBleGFtcGxlIGl0IGNhbiBiZSB1c2VkIGFsb25nc2lkZSB3aXRoIGll ZF9wbHVnaW5fY29tcG9zZXIsIG9yIHlvdSBjYW4gbWFrZSB0aGUgcGx1Z2luIGxvY2FsbHkg YW5kIHRoZW4gaW5zdGFsbCBpdCB0byB5b3VyIHB1YmxpYyBUZXh0cGF0dGVybiBpbnN0YWxs LCB3aGVyZSByYWhfcGx1Z2luX2Rvd25sb2FkcyBhbGxvd3MgdGhlIHB1YmxpYyBkb3dubG9h ZGluZy48L3A+CgoJPGgzIGlkPSJsaXN0LW9mLWZlYXR1cmVzIj5MaXN0IG9mIGZlYXR1cmVz PC9oMz4KCgk8dWw+CgkJPGxpPlNpbXBsZSB0YWcgdG8gZ2VuZXJhdGUgZG93bmxvYWQgPHNw YW4gY2xhc3M9ImNhcHMiPlVSTDwvc3Bhbj5zIGFuZCBvdXRwdXQgZG93bmxvYWQgY291bnQu PC9saT4KCQk8bGk+U3VwcG9ydHMgY29tcHJlc3NlZCBhbmQgbm9ybWFsIHBsdWdpbiBmaWxl IGZvcm1hdHMgd2l0aCBzdGFubmFyZCBwbHVnaW4gdGVtcGxhdGUgYmxvY2stb3V0bG9vay48 L2xpPgoJCTxsaT5UZXh0aWxlcyBoZWxwIGRvY3VtZW50aW9uIGlmIGl0IHNwb3RzIHVuLXRl eHRpbGVkIGgxLiBpbiB0aGUgaGVscC48L2xpPgoJCTxsaT5BbGxvdyBqdXN0IHNvbWUgb3Ig YWxsIGluc3RhbGxlZCBwbHVnaW5zIHRvIGJlIGRvd25sb2FkZWQgYnkgdmlzaXRvcnMsIGN1 c3RvbWl6aWJsZSBieSBwcmVmaXggb3IgaW5kaXZpZHVhbCBwbHVnaW4gbmFtZS48L2xpPgoJ CTxsaT5Db250cm9sIHBhbmVsIHVuZGVyIFRleHRwYXR0ZXJuJiM4MjE3O3MgRXh0ZW5zaW9u cyB0YWIgd2hlcmUgeW91IGNhbiBsb2NhdGUgcGx1Z2luIGRvd25sb2FkIHByZWZlcmVuY2Vz OiBkaXNhbGxvdyBhbmQgYWxsb3cgZG93bmxvYWRzLjwvbGk+Cgk8L3VsPgoKCTxoMyBpZD0i cmVxdWlyZW1lbnRzIj5SZXF1aXJlbWVudHM8L2gzPgoKCTxwPk1pbmltdW06PC9wPgoKCTx1 bD4KCQk8bGk+VGV4dHBhdHRlcm4gNC54LngrPC9saT4KCQk8bGk+PHNwYW4gY2xhc3M9ImNh cHMiPlBIUDwvc3Bhbj4gNC4zKzwvbGk+Cgk8L3VsPgoKCTxwPlJlY29tbWVuZGVkOjwvcD4K Cgk8dWw+CgkJPGxpPlRleHRwYXR0ZXJuIDQuMC43KzwvbGk+CgkJPGxpPjxzcGFuIGNsYXNz PSJjYXBzIj5QSFA8L3NwYW4+IHdpdGggemxpYiBsaWJyYXJ5IGFuZCA8Y29kZT5nemVuY29k ZSgpPC9jb2RlPi48L2xpPgoJPC91bD4KCgk8aDMgaWQ9Imluc3RhbGxhdGlvbi1hbmQtdXNh Z2UiPkluc3RhbGxhdGlvbiBhbmQgdXNhZ2U8L2gzPgoKCTxwPlBsdWdpbiBtb3N0bHkgdXNl ZCBwbHVnaW4gZGV2cy4gWW91IGFsbCBrbm93IGhvdyB0byBpbnN0YWxsIHBsdWdpbiwgcmln aHQuIFllcywgaW5zZXJ0IGl0IHRvIHRoZSBwbHVnaW4gaW5zdGFsbCB0ZXh0YXJlYSBhbmQg cnVuIHRoZSBhdXRvbWF0aWMgc2V0dXAuIFRoZW4gaXQmIzgyMTc7cyByZWFkeS48L3A+CgoJ PHA+VG8gYWRkIG1vcmUgcHJlZmVyZW5jZXMsIGluIGV4YW1wbGUgYWxsb3cganVzdCBzb21l IHBsdWdpbnMgdG8gYmUgZG93bmxvYWRlZCwgZ28gdG8gPGEgaHJlZj0iP2V2ZW50PXJhaF9w bHVnaW5fZG93bmxvYWQiPkV4dGVybnNpb24gLyByYWhfcGx1Z2luX2Rvd25sb2FkPC9hPiBp biB5b3VyIFRleHRwYXR0ZXJuIGFkbWluIHBhbmVsLjwvcD4KCgk8aDMgaWQ9ImF0dHJpYnV0 ZXMiPkF0dHJpYnV0ZXM8L2gzPgoKCTxwPlRoZSB0YWcgaXMgPGNvZGU+Jmx0O3R4cDpyYWhf cGx1Z2luX2Rvd25sb2FkIC8mZ3Q7PC9jb2RlPiBhbmQgYXR0cmlidXRlcyBmb3IgaXQgZm9s bG93LiBUaGUgdGFnIG91dHB1dHMgYSBkb3dubG9hZCA8c3BhbiBjbGFzcz0iY2FwcyI+VVJM PC9zcGFuPi48L3A+CgoJPHA+PHN0cm9uZz5uYW1lPC9zdHJvbmc+PGJyIC8+ClRoZSBuYW1l IG9mIHBsdWdpbiB0byBiZSBzZXJ2ZWQuIFRoZSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQuPGJy IC8+CkRlZmF1bHQ6IDxjb2RlPm5hbWU9JnF1b3Q7JnF1b3Q7PC9jb2RlPiBFeGFtcGxlOiA8 Y29kZT5uYW1lPSZxdW90O3h4eF9teXBsdWdpbiZxdW90OzwvY29kZT48L3A+CgoJPHA+PHN0 cm9uZz50eXBlPC9zdHJvbmc+PGJyIC8+ClRoZSB0eXBlIG9mIGZpbGUgc2VydmVkLCBvciBz ZXQgdGhlIHRhZyB0byBvdXRwdXQgZG93bmxvYWQgY291bnQuIEFsbG93ZWQgdmFsdWVzIDxj b2RlPnppcDwvY29kZT4sIDxjb2RlPmNvdW50PC9jb2RlPiBvciB1bnNldC4gSWYgPGNvZGU+ emlwPC9jb2RlPiBpcyB1c2VkLCA8c3BhbiBjbGFzcz0iY2FwcyI+VVJMPC9zcGFuPiBwb2lu dHMgdG8gY29tcHJlc3NlZCBwbHVnaW4gZG93bmxvYWQuIFRoZSBkZWZhdWx0IHZhbHVlIDxj b2RlPnVuc2V0PC9jb2RlPiAoZW1wdHkpIG91dHB1dHMgPHNwYW4gY2xhc3M9ImNhcHMiPlVS TDwvc3Bhbj4gdG8gdGhlIG5vcm1hbCBmaWxlLCBhbmQgd2l0aCA8Y29kZT5jb3VudDwvY29k ZT4sIHRoZSB0YWcgc2hvd3MgZG93bmxvYWQgY291bnQgaW5zdGVhZCBvZiB0aGUgZG93bmxv YWQgPHNwYW4gY2xhc3M9ImNhcHMiPlVSTDwvc3Bhbj4uPGJyIC8+CkRlZmF1bHQ6IDxjb2Rl PnR5cGU9JnF1b3Q7JnF1b3Q7PC9jb2RlPiBFeGFtcGxlOiA8Y29kZT4mcXVvdDt6aXAmcXVv dDs8L2NvZGU+PC9wPgoKCTxwPjxzdHJvbmc+dmVyc2lvbjwvc3Ryb25nPjxiciAvPgpXaGlj aCB2ZXJzaW9uJiM4MjE3O3MgZG93bmxvYWQgY291bnQgaXMgc2hvd24uIFRoZSBhdHRyaWJ1 dGUgaXMgb25seSBlZmZlY3RpdmUgd2hlbiBkb3dubG9hZCA8Y29kZT5jb3VudDwvY29kZT4g aXMgc2hvd24gaW5zdGVhZCBvZiB0aGUgZG93bmxvYWQgbGluay4gQWxsb3dlZCB2YWx1ZXMg YXJlIHZlcnNpb24gbnVtYmVyIGFuZCB1bnNldCAoZW1wdHkpLiBJZiBsZWF2ZWQgZW1wdHkg dG90YWwgZG93bmxvYWQgY291bnQgaXMgc2hvd24uPGJyIC8+CkRlZmF1bHQ6IDxjb2RlPnZl cnNpb249JnF1b3Q7JnF1b3Q7PC9jb2RlPiBFeGFtcGxlOiA8Y29kZT4mcXVvdDswLjEmcXVv dDs8L2NvZGU+PC9wPgoKCTxoMyBpZD0iZXhhbXBsZXMiPkV4YW1wbGVzPC9oMz4KCgk8cD48 c3Ryb25nPkV4YW1wbGUgIzE6IFJldHVybiBwbHVnaW4gZG93bmxvYWQgPHNwYW4gY2xhc3M9 ImNhcHMiPlVSTDwvc3Bhbj48L3N0cm9uZz48L3A+CgoJPHA+Q29kZTo8L3A+Cgo8cHJlPjxj b2RlPiZsdDt0eHA6cmFoX3BsdWdpbl9kb3dubG9hZCBuYW1lPSZxdW90O3h4eF9teXBsdWdp biZxdW90OyAvJmd0Owo8L2NvZGU+PC9wcmU+CgoJPHA+UmV0dXJuczogPC9wPgoKPHByZT48 Y29kZT5odHRwOi8vZXhhbXBsZS5jb20vP3JhaF9wbHVnaW5fZG93bmxvYWQ9eHh4X215cGx1 Z2luCjwvY29kZT48L3ByZT4KCgk8cD48c3Ryb25nPkV4YW1wbGUgIzI6IENvbnRhaW5lciB1 c2FnZTwvc3Ryb25nPjwvcD4KCjxwcmU+PGNvZGU+Jmx0O3R4cDpyYWhfcGx1Z2luX2Rvd25s b2FkIG5hbWU9JnF1b3Q7eHh4X215cGx1Z2luJnF1b3Q7Jmd0OwoJRG93bmxvYWQgdGhlIHBs dWdpbgombHQ7L3R4cDpyYWhfcGx1Z2luX2Rvd25sb2FkJmd0Owo8L2NvZGU+PC9wcmU+CgoJ PHA+UmV0dXJuczo8L3A+Cgo8cHJlPjxjb2RlPiZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL2V4 YW1wbGUuY29tLz9yYWhfcGx1Z2luX2Rvd25sb2FkPXh4eF9teXBsdWdpbiZxdW90OyZndDsK CURvd25sb2FkIHRoZSBwbHVnaW4KJmx0Oy9hJmd0Owo8L2NvZGU+PC9wcmU+CgoJPHA+PHN0 cm9uZz5FeGFtcGxlICMzOiBPdXRwdXQgbGluayB1c2luZyBhcnRpY2xlczwvc3Ryb25nPjwv cD4KCgk8cD5JZiB5b3UgcG9zdCBhcnRpY2xlcyB0aXRsZWQgYnkgdGhlIG5hbWUgb2YgdGhl IHBsdWdpbiwgeW91IGNvdWxkIGRvIHRoZSB1cmwsIHBsdXMgbGluaywgYXV0b21hdGljYWxs eS48L3A+CgoJPHA+Q29kZTo8L3A+Cgo8cHJlPjxjb2RlPiZsdDthIGhyZWY9JnF1b3Q7Jmx0 O3R4cDpzaXRlX3VybCAvJmd0Oz9yYWhfcGx1Z2luX2Rvd25sb2FkPSZsdDt0eHA6dGl0bGUg LyZndDsmcXVvdDsmZ3Q7RG93bmxvYWQgdGhlIHBsdWdpbiZsdDsvYSZndDsKPC9jb2RlPjwv cHJlPgoKCTxwPlJldHVybnM6PC9wPgoKPHByZT48Y29kZT4mbHQ7YSBocmVmPSZxdW90O2h0 dHA6Ly9leGFtcGxlLmNvbS8/cmFoX3BsdWdpbl9kb3dubG9hZD14eHhfbXlwbHVnaW4mcXVv dDsmZ3Q7RG93bmxvYWQgdGhlIHBsdWdpbiZsdDsvYSZndDsKPC9jb2RlPjwvcHJlPgoKCTxw PjxzdHJvbmc+RXhhbXBsZSAjNDogQXJ0aWNsZSBsaXN0aW5ncyB1c2luZyBzYW1lIG1ldGhv ZCBhcyBhYm92ZSA8ZW0+RXhhbXBsZSAjMjwvZW0+PC9zdHJvbmc+PC9wPgoKCTxwPkV4YW1w bGUgdXNlcyBhcnRpY2xlcyB0byBub3RpZnkgdXNlcnMgYWJvdXQgeW91ciBwbHVnaW5zLjwv cD4KCgk8cD5Db2RlOjwvcD4KCjxwcmU+PGNvZGU+Jmx0O3R4cDphcnRpY2xlX2N1c3RvbSBs aW1pdD0mcXVvdDs5OTkmcXVvdDsmZ3Q7CgkmbHQ7YSBocmVmPSZxdW90OyZsdDt0eHA6c2l0 ZV91cmwgLyZndDs/cmFoX3BsdWdpbl9kb3dubG9hZD0mbHQ7dHhwOnRpdGxlIC8mZ3Q7JnF1 b3Q7Jmd0OyZsdDt0eHA6dGl0bGUgLyZndDsgW0NsaWNrIHRvIGRvd25sb2FkXSZsdDsvYSZn dDsKJmx0Oy90eHA6YXJ0aWNsZV9jdXN0b20mZ3Q7CjwvY29kZT48L3ByZT4KCgk8cD48c3Ry b25nPkV4YW1wbGUgIzU6IE91dHB1dCBkb3dubG9hZCBjb3VudDwvc3Ryb25nPjwvcD4KCgk8 cD5Db2RlOjwvcD4KCjxwcmU+PGNvZGU+Jmx0O3R4cDpyYWhfcGx1Z2luX2Rvd25sb2FkIG5h bWU9JnF1b3Q7eHh4X215cGx1Z2luJnF1b3Q7IHR5cGU9JnF1b3Q7Y291bnQmcXVvdDsgLyZn dDsKPC9jb2RlPjwvcHJlPgoKCTxwPlJldHVybnM6PC9wPgoKPHByZT48Y29kZT4xCjwvY29k ZT48L3ByZT4KCgk8aDMgaWQ9ImNoYW5nZWxvZyI+Q2hhbmdlbG9nPC9oMz4KCgk8cD48c3Ry b25nPlZlcnNpb24gMS4wPC9zdHJvbmc+PC9wPgoKCTx1bD4KCQk8bGk+Tm93IG9sZGVyIHBs dWdpbiB2ZXJzaW9ucyBjYW4gYmUgZG93bmxvYWRlZCBkaXJlY3RseSBmcm9tIDxhIGhyZWY9 Imh0dHA6Ly9yYWhmb3J1bS5iaXovcGx1Z2lucy9yYWhfcGx1Z2luX2RldiI+cmFoX3BsdWdp bl9kZXYmIzgyMTc7czwvYT4gdmVyc2lvbiBtYW5hZ2VyLiBUaGVyZSBpcyBzZXR0aW5nIGlu IHRoZSBwcmVmZXJlbmNlcyBwYW5lbCB0byBzZXQgdGhpcyBmZWF0dXJlIG9uLiBFbmFibGlu ZyB0aGUgZmVhdHVyZSByZXF1aXJlcyByYWhfcGx1Z2luX2RldiB2ZXJzaW9uIDAuNSBvciBu ZXdlci48L2xpPgoJPC91bD4KCgk8cD48c3Ryb25nPlZlcnNpb24gMC45PC9zdHJvbmc+PC9w PgoKCTx1bD4KCQk8bGk+PHN0cm9uZz5XYXJuaW5nLCBwbGVhc2Ugbm90ZTo8L3N0cm9uZz4g VGhpcyB1cGRhdGUgaW50cm9kdWNlcyBuZXcgcHJlZmVyZW5jZXMgc3lzdGVtIGFuZCB0aHVz IGFsbCA8c3Ryb25nPnVwZGF0ZXJzPC9zdHJvbmc+IHdpbGwgbG9zZSB0aGVpciBvbGQgc2V0 dGluZ3MuIFlvdSA8c3Ryb25nPndvbiYjODIxNzt0PC9zdHJvbmc+IGxvc2Ugc3RhdGljdGlj cywgYnV0IHlvdSB3aWxsIG5lZWQgdG8gPHN0cm9uZz5yZXNhdmUgeW91ciBzZXR0aW5nczwv c3Ryb25nPi4gU29ycnkgZm9yIGluY29udmVuaWVuY2UuPC9saT4KCQk8bGk+QWRkZWQgY29u dGFpbmVyIHN1cHBvcnQgdG8gPGNvZGU+Jmx0O3R4cDpyYWhfcGx1Z2luX2Rvd25sb2FkIC8m Z3Q7PC9jb2RlPi4gSWYgdXNlZCBhcyBhIGNvbnRhaW5lciwgcmV0dXJucyB0aGUgY29udGFp bmVkIHN0YXRlbWVudCBsaW5rZWQuPC9saT4KCQk8bGk+Q2hhbmdlZCBkb3dubG9hZCB2YWxp ZGl0eSBjaGVjay48L2xpPgoJCTxsaT5Ob3cgbGlzdCBvZiBwbHVnaW4gcHJlZml4ZXMgaXMg dHJpbW1lZCBmcm9tIHdoaXRlc3BhY2UgZHVyaW5nIHNhdmUuPC9saT4KCQk8bGk+Tm93IDxj b2RlPnJhaF9wbHVnaW5fZG93bmxvYWRfdGV4dGlsZSgpPC9jb2RlPiB3b24mIzgyMTc7dCBp bmNsdWRlIDxjb2RlPmNsYXNzVGV4dGlsZS5waHA8L2NvZGU+IGFuZCBkbyA8Y29kZT5wcmVn X21hdGNoKCk8L2NvZGU+IGZvciBub3RoaW5nLjwvbGk+CgkJPGxpPk5vdyBvbiB0aGUgcGx1 Z2luIGxpc3QgdGhlIHBsdWdpbiBuYW1lIGxpbmtzIHRvIHRoZSBzdGF0aWN0aWNzLiBUaW55 IHplcm8gaXMgYml0IGhhcmQgdG8gY2xpY2suPC9saT4KCQk8bGk+Tm93IHRoZSBwbHVnaW4g bGlzdCBzaG93cyB0aGUgdG90YWwgZG93bmxvYWQgY291bnQgYXQgZW5kIG9mIHRoZSBsaXN0 LjwvbGk+CgkJPGxpPkZpeGVkOiB2YWx1ZXMgaW4gdGhlIHBsdWdpbiBsaXN0IGFyZSBub3cg cHJvcGVybHkgZXNjYXBlZC48L2xpPgoJPC91bD4KCgk8cD48c3Ryb25nPlZlcnNpb24gMC44 PC9zdHJvbmc+PC9wPgoKCTx1bD4KCQk8bGk+Rml4ZWQ6IGlmIGFsbCBwbHVnaW5zIHdlcmUg YWxsb3dlZCBmb3IgZG93bmxvYWQsIHZpc2l0b3IgY291bGQgcHVsbCBvdXQgZW1wdHkgcGx1 Z2luIGZpbGUuPC9saT4KCQk8bGk+Q2hhbmdlZDogY29tcGFpbmVkIHBsdWdpbiBkYXRhIHF1 ZXJpZXMgaW50byBvbmUsIHdoaWxlIHByZXNlcnZlZCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0 eSBmZWF0dXJlcyBpbnRyb2R1Y2VkIGluIDAuNC48L2xpPgoJCTxsaT5BZGRlZCBzdXBwb3J0 IGZvciBvcHRpb25hbCBmbGFncy48L2xpPgoJCTxsaT5SZW1vdmVkIGluaXRpYWwgaW5zdGFs bCBjYWxsIGZyb20gZnJvbnRlbmQgZG93bmxvYWQgY2FsbDsgRGVmaW5lIHByZWZlcmVuY2Vz IGluIEV4dGVuc2lvbnMgcGFuZWwgYmVmb3JlIHVzaW5nIHRoZSBkb3dubG9hZHMuPC9saT4K CQk8bGk+UmVtb3ZlZCA8ZW0+aWYgaW5zdGFsbGVkPC9lbT4gY2hlY2sgZnJvbSBmcm9udGVu ZCBkb3dubG9hZCBjYWxsOyBNYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSBzZXQgcmFoX3BsdWdp bl9kb3dubG9hZCBwcmVmcyBiZWZvcmUgdHJ5aW5nIHRvIGRvd25sb2FkIHN0dWZmLiBQcm92 aWRlcyBsaXR0bGUgcGVyZm9ybWFuY2UgaW5jcmVhc2UuPC9saT4KCTwvdWw+CgoJPHA+PHN0 cm9uZz5WZXJzaW9uIDAuNzwvc3Ryb25nPjwvcD4KCgk8dWw+CgkJPGxpPkFkZGVkIGFiaWxp dHkgdG8gb3V0cHV0IGRvd25sb2FkIGNvdW50IHdpdGggdGFncy4gU2VlIDxjb2RlPiZsdDt0 eHA6cmFoX3BsdWdpbl9kb3dubG9hZCAvJmd0OzwvY29kZT4gYW5kIDxjb2RlPnR5cGU8L2Nv ZGU+IGF0dHJpYnV0ZSYjODIxNztzIDxjb2RlPmNvdW50PC9jb2RlPiBvcHRpb24uPC9saT4K CQk8bGk+QWRkZWQgYXR0cmlidXRlIDxjb2RlPnZlcnNpb248L2NvZGU+IGZvciB0aGUgZG93 bmxvYWQgY291bnQuPC9saT4KCQk8bGk+Tm93IDxjb2RlPnJhaF9wbHVnaW5fZG93bmxvYWRf dGV4dGlsZSgpPC9jb2RlPiBkZWZhdWx0cyB0byB1bnNldC48L2xpPgoJPC91bD4KCgk8cD48 c3Ryb25nPlZlcnNpb24gMC42PC9zdHJvbmc+PC9wPgoKCTx1bD4KCQk8bGk+QWRkZWQgZG93 bmxvYWQgY291bnRlciBhbmQgYSBzdGF0aXN0aWNzIHZpZXdlci48L2xpPgoJPC91bD4KCgk8 cD48c3Ryb25nPlZlcnNpb24gMC41LjM8L3N0cm9uZz48L3A+CgoJPHVsPgoJCTxsaT5SZW5h bWVkIGZ1bmN0aW9uIDxjb2RlPnJhaF9wbHVnaW5fdGV4dGlsZSgpPC9jb2RlPiB0byA8Y29k ZT5yYWhfcGx1Z2luX2Rvd25sb2FkX3RleHRpbGUoKTwvY29kZT4gZm9yIGZ1dHVyZSBwbGFu cywgYW5kIHRvIGtlZXAgdGhlIGZ1bmN0aW9uIG5hbWVzIHNpbWlsaWFyLjwvbGk+Cgk8L3Vs PgoKCTxwPjxzdHJvbmc+VmVyc2lvbiAwLjUuMjwvc3Ryb25nPjwvcD4KCgk8dWw+CgkJPGxp PkZpeGVkOiBhZGRlZCBtaXNzaW5nIGNvbW1hICg8Y29kZT4sPC9jb2RlPikgdG8gdGhlIGlu c3RhbGwgc2NyaXB0LjwvbGk+Cgk8L3VsPgoKCTxwPjxzdHJvbmc+VmVyc2lvbiAwLjU8L3N0 cm9uZz48L3A+CgoJPHVsPgoJCTxsaT5DdXQgdGhlIGFtb3VudCBvZiBjb2RlIHVzZWQuPC9s aT4KCQk8bGk+T25seSBnemlwcyBwbHVnaW4gZmlsZSBpZiBnemlwIGZ1bmN0aW9ucyBhcmUg ZW5hYmxlZCBvbiBzZXJ2ZXIuPC9saT4KCQk8bGk+U21hbGwgc3BlZWQgYW5kIHN0cmVzcyBp bXByb3ZlbWVudHMuPC9saT4KCQk8bGk+SW1wcm92ZWQgdGhlIGdlbmVyYWwgY29kZSBsYXlv dXQuPC9saT4KCQk8bGk+UmUtYXJyYW5nZWQgcGx1Z2luLXRvLWRvd25sb2FkIHF1ZXVlIGNo ZWNrLjwvbGk+CgkJPGxpPlJldHVybnMgPGVtPlVua25vd24gcGx1Z2luIHR5cGU8L2VtPiBp ZiBwbHVnaW4gdHlwZSBpcyBvdXQgb2YgdGhlIHJhbmdlIG9mIGN1cnJlbnQgdmFsaWQgdHlw ZXMuPC9saT4KCTwvdWw+CgoJPHA+PHN0cm9uZz5WZXJzaW9uIDAuNDwvc3Ryb25nPjwvcD4K Cgk8dWw+CgkJPGxpPlJlbW92ZWQgdXNlbGVzcyBleHRyYSA8Y29kZT5kb1NsYXNoKCk8L2Nv ZGU+LjwvbGk+CgkJPGxpPkFkZGVkIDxjb2RlPmxvYWRfb3JkZXI8L2NvZGU+IHN1cHBvcnQs IHdoaWxlIHByZXNlcnZlZCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS48L2xpPgoJPC91bD4K Cgk8cD48c3Ryb25nPlZlcnNpb24gMC4zPC9zdHJvbmc+PC9wPgoKCTx1bD4KCQk8bGk+TW9y ZSBhZHZhbmNlZCBhZG1pbiBwYW5lbCB1bmRlciBFeHRlbnNpb25zLgoJPHVsPgoJCTxsaT5D b3B5IGFuZCBwYXN0ZSA8Y29kZT4mbHQ7dHhwOnJhaF9wbHVnaW5fZG93bmxvYWQgLyZndDs8 L2NvZGU+IHRhZ3MuPC9saT4KCQk8bGk+RG93bmxvYWQgcGx1Z2luIGZpbGVzIHZpYSB0aGUg aW50ZXJmYWNlLjwvbGk+CgkJPGxpPkltcHJvdmVkIG91dGZpdC48L2xpPgoJPC91bD48L2xp PgoJPC91bD4KCgk8cD48c3Ryb25nPlZlcnNpb24gMC4yLjE8L3N0cm9uZz48L3A+CgoJPHVs PgoJCTxsaT5BZGRlZCBvbmUgbWlzc2luZyBkb1NsYXNoIHRvIHRoZSBhZG1pbiBwYW5lbCBj b2RlLjwvbGk+Cgk8L3VsPgoKCTxwPjxzdHJvbmc+VmVyc2lvbiAwLjI8L3N0cm9uZz48L3A+ CgoJPHVsPgoJCTxsaT5BZGRlZCBvcHRpb25zIHRvIGFsdGVybmF0aXZlbHkgbGltaXQgZG93 bmxvYWRhYmxlIHBsdWdpbnMgdmlhIGJhY2tlbmQgaW50ZXJmYWNlLjwvbGk+CgkJPGxpPlNv bWUgbWlub3IgaW1wcm92ZW1lbnRzLjwvbGk+Cgk8L3VsPgoKCTxwPjxzdHJvbmc+VmVyc2lv biAwLjE8L3N0cm9uZz48L3A+CgoJPHVsPgoJCTxsaT5GaXJzdCByZWxlYXNlPC9saT4KCTwv dWw+CgoJPGgzIGlkPSJ0aGFua3MtdG8iPlRoYW5rcyB0bzwvaDM+CgoJPHVsPgoJCTxsaT5u ZXQtY2FydmVyIGZvciB0aGUgaWRlYSBvZiBtYWtpbmcgYmFja2VuZCBpbnRlcmZhY2UgYW5k IGxpbWl0IGRvd25sb2FkYWJsZSBwbHVnaW5zPC9saT4KCQk8bGk+SmVmZiBTb28gZm9yIG5v dGlmeWluZyBhYm91dCB0aGUgbWlzc2luZyBwbHVnaW4gZmxhZ3MuPC9saT4KCQk8bGk+Vmlj dG9yIGZvciByZXBvcnRpbmcgYnJva2VuIGV4dGVuc2lvbnMgbGluay48L2xpPgoJCTxsaT5T dGVmIGZvciByZXBvcnRpbmcgbG9hZHMgb2Ygc3R1ZmYuPC9saT4KCTwvdWw+IjtzOjQ6ImNv ZGUiO3M6MTY0NjE6IgkjIyMjIyMjIyMjIyMjIyMjIyMNCgkjDQoJIwlyYWhfcGx1Z2luX2Rv d25sb2FkLXBsdWdpbiBmb3IgVGV4dHBhdHRlcm4NCgkjCXZlcnNpb24gMS4wDQoJIwlieSBK dWtrYSBTdmFobg0KCSMJaHR0cDovL3JhaGZvcnVtLmJpeg0KCSMNCgkjCUNvcHlyaWdodCAo QykgMjAxMCBKdWtrYSBTdmFobg0KCSMJTGljZW5zZWQgdW5kZXIgR05VIEdlbnJhbCBQdWJs aWMgTGljZW5zZSB2ZXJzaW9uIDINCgkjCWh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9n cGwtMi4wLmh0bWwNCgkjDQoJIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQoJaWYgKEB0eHBpbnRl cmZhY2UgPT0gJ2FkbWluJykgew0KCQlhZGRfcHJpdnMoJ3JhaF9wbHVnaW5fZG93bmxvYWQn LCcxLDInKTsNCgkJcmVnaXN0ZXJfdGFiKCdleHRlbnNpb25zJywncmFoX3BsdWdpbl9kb3du bG9hZCcsJ1BsdWdpbiBEb3dubG9hZHMnKTsNCgkJcmVnaXN0ZXJfY2FsbGJhY2soJ3JhaF9w bHVnaW5fZG93bmxvYWRfcGFnZScsJ3JhaF9wbHVnaW5fZG93bmxvYWQnKTsNCgl9IGVsc2Ug DQoJCXJhaF9wbHVnaW5fZG93bmxvYWRfbWFrZSgpOw0KDQovKioNCglUaGUgdGFnDQoqLw0K DQoJZnVuY3Rpb24gcmFoX3BsdWdpbl9kb3dubG9hZCgkYXR0cywkdGhpbmc9JycpIHsNCgkJ ZXh0cmFjdChsQXR0cyhhcnJheSgNCgkJCSd2ZXJzaW9uJyA9PiAnJywNCgkJCSd0eXBlJyA9 PiAnJywNCgkJCSduYW1lJyA9PiAnJw0KCQkpLCRhdHRzKSk7DQoJCWlmKCEkbmFtZSkNCgkJ CXJldHVybjsNCg0KCQlpZigkdHlwZSA9PSAnY291bnQnKSB7DQoJCQkkY291bnQgPSByYWhf cGx1Z2luX2Rvd25sb2FkX2Rvd25sb2FkcygkbmFtZSwkdmVyc2lvbik7DQoJCQlyZXR1cm4g KGlzc2V0KCRjb3VudFskbmFtZV0pKSA/ICRjb3VudFskbmFtZV0gOiAnMCc7DQoJCX0NCgkJ DQoJCSR1cmwgPSBodS4nP3JhaF9wbHVnaW5fZG93bmxvYWQ9Jy4kbmFtZS4NCgkJCSgoJHR5 cGUgPT0gJ3ppcCcpID8gJyZhbXA7cmFoX3R5cGU9emlwJyA6ICcnKS4NCgkJCSgoJHZlcnNp b24pID8gJyZhbXA7cmFoX3ZlcnNpb249Jy4kdmVyc2lvbiA6ICcnKQ0KCQk7DQoJCWlmKCR0 aGluZykgDQoJCQlyZXR1cm4gDQoJCQkJJzxhIGhyZWY9IicuJHVybC4nIj4nLnBhcnNlKCR0 aGluZykuJzwvYT4nOw0KCQlyZXR1cm4gJHVybDsNCgl9DQoNCi8qKg0KCUdlbmVyYXRlcyBw bHVnaW4gZmlsZXMNCiovDQoNCglmdW5jdGlvbiByYWhfcGx1Z2luX2Rvd25sb2FkX21ha2Uo KSB7DQoJCQ0KCQkkbmFtZSA9IGdwcygncmFoX3BsdWdpbl9kb3dubG9hZCcpOw0KCQkNCgkJ aWYoZW1wdHkoJG5hbWUpKQ0KCQkJcmV0dXJuOw0KCQkNCgkJJHR5cGUgPSBncHMoJ3JhaF90 eXBlJyk7DQoJCSR2ZXJzaW9uID0gZ3BzKCdyYWhfdmVyc2lvbicpOw0KCQkkcHJlZiA9IHJh aF9wbHVnaW5fZG93bmxvYWRfcHJlZnMoKTsNCg0KCQlpZihyYWhfcGx1Z2luX2Rvd25sb2Fk X3ZhbGlkYXRlKCRuYW1lLCR0eXBlLCRwcmVmKSA9PSBmYWxzZSkNCgkJCXJldHVybjsNCgkJ DQoJCSRwbHVnaW4gPSAnJzsNCgkJDQoJCWlmKGVtcHR5KCR2ZXJzaW9uKSkNCgkJCSRwbHVn aW4gPSANCgkJCQlzYWZlX3JvdygNCgkJCQkJJyonLA0KCQkJCQkndHhwX3BsdWdpbicsDQoJ CQkJCSJuYW1lPSciLmRvU2xhc2goJG5hbWUpLiInIExJTUlUIDAsIDEiDQoJCQkJKTsNCgkJ ZWxzZSB7DQoJCQlpZigNCgkJCQkkcHJlZlsncGx1Z2luX2RldiddID09IDEgJiYgDQoJCQkJ ZnVuY3Rpb25fZXhpc3RzKCdyYWhfcGx1Z2luX2Rldl9wcmVmJykgJiYNCgkJCQlzYWZlX2Nv dW50KA0KCQkJCQkndHhwX3BsdWdpbicsDQoJCQkJCSJuYW1lPSciLmRvU2xhc2goJG5hbWUp LiInIg0KCQkJCSkgPT0gMQ0KCQkJKSB7DQoJCQkJJHBsdWdpbl9kZXYgPSByYWhfcGx1Z2lu X2Rldl9wcmVmKCk7DQoJCQkJDQoJCQkJaWYoZW1wdHkoJHBsdWdpbl9kZXZbJ3BhdGgnXSkp IA0KCQkJCQkkcGx1Z2luX2RldlsncGF0aCddID0gdHhwYXRoIC4gRFMgLiAncmFoX3BsdWdp bl9kZXYnIC4gRFM7DQoJCQkJDQoJCQkJJGFsbG93ZWQgPSANCgkJCQkJcmFoX3BsdWdpbl9k ZXZfZGlycygNCgkJCQkJCSRwbHVnaW5fZGV2WydwYXRoJ10gLiAkbmFtZSAgLiBEUw0KCQkJ CQkpOw0KCQkJCQ0KCQkJCWlmKGlzc2V0KCRhbGxvd2VkWyR2ZXJzaW9uXSkpDQoJCQkJCSRw bHVnaW4gPSANCgkJCQkJCXJhaF9wbHVnaW5fZGV2X2RhdGEoDQoJCQkJCQkJJHBsdWdpbl9k ZXZbJ3BhdGgnXSAuICRuYW1lIC4gRFMgLiAkdmVyc2lvbiAgLiBEUywNCgkJCQkJCQkkbmFt ZSwNCgkJCQkJCQkkdmVyc2lvbiwNCgkJCQkJCQkkcGx1Z2luX2Rldg0KCQkJCQkJKTsNCgkJ CX0NCgkJfQ0KCQkNCgkJaWYoISRwbHVnaW4pDQoJCQlyZXR1cm47DQoNCgkJaWYoaXNzZXQo JHBsdWdpblsnbG9hZF9vcmRlciddKSkNCgkJCSRwbHVnaW5bJ29yZGVyJ10gPSAkcGx1Z2lu Wydsb2FkX29yZGVyJ107DQoJCQ0KCQlmb3JlYWNoKCRwbHVnaW4gYXMgJGtleSA9PiAkdmFs KSANCgkJCWlmKA0KCQkJCSFpbl9hcnJheSgNCgkJCQkJJGtleSwNCgkJCQkJYXJyYXkoDQoJ CQkJCQknbmFtZScsDQoJCQkJCQknYXV0aG9yJywNCgkJCQkJCSdhdXRob3JfdXJpJywNCgkJ CQkJCSd2ZXJzaW9uJywNCgkJCQkJCSdkZXNjcmlwdGlvbicsDQoJCQkJCQknaGVscCcsDQoJ CQkJCQknY29kZScsDQoJCQkJCQkndHlwZScsDQoJCQkJCQknb3JkZXInLA0KCQkJCQkJJ2Zs YWdzJw0KCQkJCQkpDQoJCQkJKQ0KCQkJKQ0KCQkJCXVuc2V0KCRwbHVnaW5bJGtleV0pOw0K CQ0KCQlvYl9zdGFydCgpOw0KCQlvYl9lbmRfY2xlYW4oKTsNCgkJDQoJCWlmKCFmdW5jdGlv bl9leGlzdHMoJ2d6ZW5jb2RlJykpDQoJCQkkdHlwZSA9ICcnOw0KCQkNCgkJJHR5cGVzID0g DQoJCQlhcnJheSgNCgkJCQknQ2xpZW50IHNpZGUnLA0KCQkJCSdBZG1pbi9DbGllbnQgc2lk ZScsDQoJCQkJJ0xpYnJhcnknLA0KCQkJCSdBZG1pbiBvbmx5Jw0KCQkJKTsNCgkJDQoJCSRw bHVnaW5bJ2hlbHAnXSA9IHJhaF9wbHVnaW5fZG93bmxvYWRfdGV4dGlsZSgkcGx1Z2luWydo ZWxwJ10pOw0KCQkkcGx1Z2luWydtZDUnXSA9IG1kNSgkcGx1Z2luWydjb2RlJ10pOw0KCQkN CgkJcmFoX3BsdWdpbl9kb3dubG9hZF9jb3VudCgNCgkJCSRwbHVnaW5bJ25hbWUnXSwNCgkJ CSRwbHVnaW5bJ3ZlcnNpb24nXQ0KCQkpOw0KCQkNCgkJaGVhZGVyKCJDb250ZW50LXR5cGU6 IHRleHQvcGxhaW4iKTsNCgkJZWNobyANCgkJCScjIE5hbWU6ICcuJHBsdWdpblsnbmFtZSdd LicgdicuJHBsdWdpblsndmVyc2lvbiddLicgJy4oKCR0eXBlID09ICd6aXAnKSA/ICcoY29t cHJlc3NlZCknIDogJycpLm4uDQoJCQknIyBUeXBlOiAnLigoaXNzZXQoJHR5cGVzWyRwbHVn aW5bJ3R5cGUnXV0pKSA/ICR0eXBlc1skcGx1Z2luWyd0eXBlJ11dIDogJ1Vua25vd24nKS4n IHBsdWdpbicubi4NCgkJCScjICcuJHBsdWdpblsnZGVzY3JpcHRpb24nXS5uLg0KCQkJJyMg QXV0aG9yOiAnLiRwbHVnaW5bJ2F1dGhvciddLm4uDQoJCQknIyBVUkw6ICcuJHBsdWdpblsn YXV0aG9yX3VyaSddLm4uDQoJCQknIyBSZWNvbW1lbmRlZCBsb2FkIG9yZGVyOiAnLiRwbHVn aW5bJ29yZGVyJ10ubi5uLg0KCQkJJyMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uJy5uLg0KCQkJJyMgVGhp cyBpcyBhIHBsdWdpbiBmb3IgVGV4dHBhdHRlcm4gLSBodHRwOi8vdGV4dHBhdHRlcm4uY29t Lycubi4NCgkJCScjIFRvIGluc3RhbGw6IHRleHRwYXR0ZXJuID4gYWRtaW4gPiBwbHVnaW5z Jy5uLg0KCQkJJyMgUGFzdGUgdGhlIGZvbGxvd2luZyB0ZXh0IGludG8gdGhlIFwnSW5zdGFs bCBwbHVnaW5cJyBib3g6Jy5uLg0KCQkJJyMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uJy5uLm4uDQoJCQko KCR0eXBlID09ICd6aXAnKSA/IGNodW5rX3NwbGl0KGJhc2U2NF9lbmNvZGUoZ3plbmNvZGUo c2VyaWFsaXplKCRwbHVnaW4pKSksIDcyKSA6IGNodW5rX3NwbGl0KGJhc2U2NF9lbmNvZGUo c2VyaWFsaXplKCRwbHVnaW4pKSwgNzIpKTsNCgkJZXhpdCgpOw0KCX0NCg0KLyoqDQoJVGV4 dGlsZXMgY29udGVudCBpZiBpdCBzdGFydHMgd2l0aCBoMS4NCiovDQoNCglmdW5jdGlvbiBy YWhfcGx1Z2luX2Rvd25sb2FkX3RleHRpbGUoJG91dD0nJykgew0KCQlpZighZW1wdHkoJG91 dCkgJiYgcHJlZ19tYXRjaCgnL2gxKFwoLipcKSk/XC4vJywkb3V0KSkgew0KCQkJQGluY2x1 ZGVfb25jZSB0eHBhdGguJy9saWIvY2xhc3NUZXh0aWxlLnBocCc7DQoJCQkkdGV4dGlsZSA9 IG5ldyBUZXh0aWxlKCk7DQoJCQkkb3V0ID0gJHRleHRpbGUtPlRleHRpbGVUaGlzKCRvdXQp Ow0KCQl9DQoJCXJldHVybiAkb3V0Ow0KCX0NCg0KLyoqDQoJRGVsaXZlcnMgcGFuZWxzDQoq Lw0KDQoJZnVuY3Rpb24gcmFoX3BsdWdpbl9kb3dubG9hZF9wYWdlKCkgew0KCQlnbG9iYWwg JHN0ZXA7DQoJCXJlcXVpcmVfcHJpdnMoJ3JhaF9wbHVnaW5fZG93bmxvYWQnKTsNCgkJcmFo X3BsdWdpbl9kb3dubG9hZF9pbnN0YWxsKCk7DQoJCWlmKGluX2FycmF5KCRzdGVwLGFycmF5 KA0KCQkJJ3JhaF9wbHVnaW5fZG93bmxvYWRfc2F2ZScsDQoJCQkncmFoX3BsdWdpbl9kb3du bG9hZF9zdGF0aWNzJw0KCQkpKSkgJHN0ZXAoKTsNCgkJZWxzZSByYWhfcGx1Z2luX2Rvd25s b2FkX2xpc3QoKTsNCgl9DQoNCi8qKg0KCVJldHVybnMgZG93bmxvYWQgY291bnRzIGFzIGFu IGFycmF5DQoqLw0KDQoJZnVuY3Rpb24gcmFoX3BsdWdpbl9kb3dubG9hZF9kb3dubG9hZHMo JG5hbWU9JycsJHZlcnNpb249JycpIHsNCgkJJG91dCA9IGFycmF5KCk7DQoJCSRycyA9IA0K CQkJc2FmZV9yb3dzKA0KCQkJCSduYW1lLCBTVU0oY291bnQpIGFzIHRvdGFsJywNCgkJCQkn cmFoX3BsdWdpbl9kb3dubG9hZF9jb3VudCcsDQoJCQkJJzE9MScuDQoJCQkJKCgkdmVyc2lv bikgPyANCgkJCQkJIiBhbmQgdmVyc2lvbj0nIi5kb1NsYXNoKCR2ZXJzaW9uKS4iJyINCgkJ CQk6ICcnKS4NCgkJCQkoKCRuYW1lKSA/IA0KCQkJCQkiIGFuZCBuYW1lPSciLmRvU2xhc2go JG5hbWUpLiInICINCgkJCQk6ICcnKS4NCgkJCQknIEdST1VQIEJZIG5hbWUnDQoJCQkpDQoJ CTsNCgkJZm9yZWFjaCgkcnMgYXMgJGEpIA0KCQkJJG91dFskYVsnbmFtZSddXSA9ICRhWyd0 b3RhbCddOw0KCQlyZXR1cm4gJG91dDsNCgl9DQoNCi8qKg0KCURvd25sb2FkIHN0YXRpc3Rp Y3MgcGFuZWwNCiovDQoNCglmdW5jdGlvbiByYWhfcGx1Z2luX2Rvd25sb2FkX3N0YXRpY3Mo KSB7DQoJCQ0KCQlwYWdldG9wKCdQbHVnaW4gRG93bmxvYWRzJyk7DQoJCQ0KCQkkcnMgPSAN CgkJCXNhZmVfcm93cygNCgkJCQknbmFtZSx2ZXJzaW9uLGNvdW50JywNCgkJCQkncmFoX3Bs dWdpbl9kb3dubG9hZF9jb3VudCcsDQoJCQkJIm5hbWU9JyIuZG9TbGFzaChncHMoJ25hbWUn KSkuIicgT1JERVIgQlkgdmVyc2lvbiBhc2MiDQoJCQkpDQoJCTsNCgkJDQoJCWVjaG8gbi4N CgkJCQknCTxkaXYgc3R5bGU9IndpZHRoOjk1MHB4O21hcmdpbjowIGF1dG87Ij4nLm4uDQoJ CQkJJwkJPGgxPjxzdHJvbmc+cmFoX3BsdWdpbl9kb3dubG9hZDwvc3Ryb25nPiB8IFN0YXRp c3RpY3MgZm9yICcuaHRtbHNwZWNpYWxjaGFycyhncHMoJ25hbWUnKSkuJzwvaDE+Jy5uLg0K CQkJCScJCTxwPiYjMTg3OyA8YSBocmVmPSI/ZXZlbnQ9cmFoX3BsdWdpbl9kb3dubG9hZCI+ QmFjayB0byBQbHVnaW4gRG93bmxvYWRcJ3MgTWFpbiBQYWdlPC9hPjwvcD4nLm4uDQoJCQkJ JwkJPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgaWQ9Imxpc3QiIGNs YXNzPSJsaXN0IiBzdHlsZT0id2lkdGg6MTAwJTsiPicubi4NCgkJCQknCQkJPHRyPicubi4N CgkJCQknCQkJCTx0aD5WZXJzaW9uPC90aD4nLm4uDQoJCQkJJwkJCQk8dGg+RG93bmxvYWRz PC90aD4nLm4uDQoJCQkJJwkJCQk8dGg+JiMxNjA7PC90aD4nLm4uDQoJCQkJJwkJCQk8dGg+ VG90YWw8L3RoPicubi4NCgkJCQknCQkJPC90cj4nLm47DQoNCgkJaWYoJHJzKSB7DQoJCQkk dG90YWwgPSAwOw0KCQkJDQoJCQkkaGlnaGVzdCA9IA0KCQkJCXNhZmVfZmllbGQoDQoJCQkJ CSdjb3VudCcsDQoJCQkJCSdyYWhfcGx1Z2luX2Rvd25sb2FkX2NvdW50JywNCgkJCQkJIm5h bWU9JyIuZG9TbGFzaChncHMoJ25hbWUnKSkuIicgT1JERVIgQlkgY291bnQgZGVzYyBMSU1J VCAwLCAxIg0KCQkJCSk7DQoJCQkNCgkJCWZvcmVhY2goJHJzIGFzICRhKSB7DQoJCQkJZXh0 cmFjdCgkYSk7DQoJCQkJJHRvdGFsID0gJHRvdGFsKyRjb3VudDsNCgkJCQllY2hvICANCgkJ CQkJJwkJCTx0cj4nLm4uDQoJCQkJCScJCQkJPHRkPicuaHRtbHNwZWNpYWxjaGFycygkdmVy c2lvbikuJzwvdGQ+Jy5uLg0KCQkJCQknCQkJCTx0ZD4nLiRjb3VudC4nPC90ZD4nLm4uDQoJ CQkJCScJCQkJPHRkIHN0eWxlPSJ3aWR0aDo1MDBweDsiPicubi4NCgkJCQkJJwkJCQkJPGRp diBjbGFzcz0icmFoX3BsdWdpbl9kb3dubG9hZF9iYXIiIHN0eWxlPSJ3aWR0aDonLnJvdW5k KCgkY291bnQvJGhpZ2hlc3QqNTAwKSwwKS4ncHg7aGVpZ2h0OjZweDtiYWNrZ3JvdW5kOiNj Y2M7Ym9yZGVyLXRvcDo2cHggc29saWQgI2RkZDsiPjwvZGl2Picubi4NCgkJCQkJJwkJCQk8 L3RkPicubi4NCgkJCQkJJwkJCQk8dGQ+Jy4kdG90YWwuJzwvdGQ+Jy5uLg0KCQkJCQknCQkJ PC90cj4nLm47DQoJCQl9DQoJCQkNCgkJfSBlbHNlIGVjaG8gDQoJCQkJCScJCQk8dHI+Jy5u Lg0KCQkJCQknCQkJCTx0ZCBjb2xzcGFuPSI0Ij5UaGUgcGx1Z2luIGRvZXNuXCd0IGhhdmUg YW55IGRvd25sb2Fkcy48L3RkPicubi4NCgkJCQkJJwkJCTwvdHI+Jy5uOw0KCQllY2hvIA0K CQkJCScJCTwvdGFibGU+Jy5uLg0KCQkJCScJPC9kaXY+Jy5uOw0KCX0NCg0KLyoqDQoJTGlz dHMgcGx1Z2lucyBhbmQgcHJlZmVyZW5jZXMgcGFuZWwNCiovDQoNCglmdW5jdGlvbiByYWhf cGx1Z2luX2Rvd25sb2FkX2xpc3QoJG1lc3NhZ2U9JycpIHsNCgkJcGFnZXRvcCgnUGx1Z2lu IERvd25sb2FkcycsJG1lc3NhZ2UpOw0KCQkNCgkJJHByZWYgPSByYWhfcGx1Z2luX2Rvd25s b2FkX3ByZWZzKCk7DQoJCWV4dHJhY3QoJHByZWYpOw0KCQkNCgkJJGluY2x1ZGVwbHVnaW5z ID0gZXhwbG9kZSgnLCcsJGluY2x1ZGVwbHVnaW5zKTsNCgkJJHRvdGFsID0gMDsNCgkJJGNv dW50ID0gcmFoX3BsdWdpbl9kb3dubG9hZF9kb3dubG9hZHMoKTsNCgkJDQoJCWVjaG8gbi4N CgkJCQknCTxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSJpbmRleC5waHAiIHN0eWxlPSJ3 aWR0aDo5NTBweDttYXJnaW46MCBhdXRvOyI+Jy5uLg0KCQkJCScJCTxoMT48c3Ryb25nPnJh aF9wbHVnaW5fZG93bmxvYWQ8L3N0cm9uZz4gfCBNYW5hZ2UgcGx1Z2luIGRvd25sb2Fkczwv aDE+Jy5uLg0KCQkJCScJCTxwPicuDQoJCQkJCQknICYjMTg3OyA8YSBocmVmPSI/ZXZlbnQ9 cGx1Z2luJmFtcDtzdGVwPXBsdWdpbl9oZWxwJmFtcDtuYW1lPXJhaF9wbHVnaW5fZG93bmxv YWQiPkRvY3VtZW50YXRpb248L2E+Jy4NCgkJCQkJCScgIyA8YSBocmVmPSIjcmFoX3BsdWdp bl9kb3dubG9hZF9ib3R0b20iPkp1bXAgVG8gQm90dG9tPC9hPicuDQoJCQkJCQknPC9wPicu bi4NCg0KCQkJCScJCTxwPjxzdHJvbmc+QWxsb3cgYWxsIGluc3RhbGxlZCBwbHVnaW5zIHRv IGJlIGRvd25sb2FkZWQ/PC9zdHJvbmc+IFdpbGwgb3ZlcnJpZGUgdGhlIGFsbG93ZWQgcGx1 Z2lucyBsaXN0IGFuZCBhbGwgb3RoZXIgZm9sbG93aW5nIHNldHRpbmdzLjwvcD4nLm4uDQoJ CQkJDQoJCQkJJwkJPHA+Jy5uLg0KCQkJCScJCQk8c2VsZWN0IHN0eWxlPSJ3aWR0aDogNDUw cHg7IiBuYW1lPSJwbHVnaW5hbGwiIGlkPSJyYWhfcGx1Z2luX2Rvd25sb2FkX3BsdWdpbmFs bCI+Jy5uLg0KCQkJCScJCQkJPG9wdGlvbiB2YWx1ZT0iMSInLigoJHBsdWdpbmFsbCA9PSAx KSA/ICcgc2VsZWN0ZWQ9InNlbGVjdGVkIicgOiAnJykuJz5ZZXM8L29wdGlvbj4nLm4uDQoJ CQkJJwkJCQk8b3B0aW9uIHZhbHVlPSIwIicuKCgkcGx1Z2luYWxsID09IDApID8gJyBzZWxl Y3RlZD0ic2VsZWN0ZWQiJyA6ICcnKS4nPk5vPC9vcHRpb24+Jy5uLg0KCQkJCScJCQk8L3Nl bGVjdD4nLm4uDQoJCQkJJwkJPC9wPicubi4NCgkJCQknCQk8cCBzdHlsZT0icGFkZGluZzog NXB4IDA7IGJvcmRlci10b3A6IDFweCBzb2xpZCAjY2NjOyI+PHN0cm9uZz5MaXN0IG9mIHBs dWdpbnMgYWxsb3dlZCB0byBiZSBkb3dubG9hZGVkLjwvc3Ryb25nPiBJbmRpdmlkdWFsbHkg c2VsZWN0IHdoaWNoIHBsdWdpbnMgYXJlIGZvciBkb3dubG9hZCwgYnJvd3NlciBkb3dubG9h ZCBzdGF0aXN0aWNzIGFuZCBncmFwIGluc3RhbGxhdGlvbiBmaWxlcy48L3A+Jy5uLg0KCQkJ CScJCTx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGlkPSJsaXN0IiBj bGFzcz0ibGlzdCIgc3R5bGU9IndpZHRoOjEwMCU7Ij4nLm4uDQoJCQkJJwkJCTx0cj4nLm4u DQoJCQkJJwkJCQk8dGg+TmFtZTwvdGg+Jy5uLg0KCQkJCScJCQkJPHRoPkFsbG93IGRvd25s b2FkaW5nPzwvdGg+Jy5uLg0KCQkJCScJCQkJPHRoPkd6aXAgZmlsZTwvdGg+Jy5uLg0KCQkJ CScJCQkJPHRoPk5vcm1hbCBmaWxlPC90aD4nLm4uDQoJCQkJJwkJCQk8dGg+VFhQIHRhZ3M8 L3RoPicubi4NCgkJCQknCQkJCTx0aD5Eb3dubG9hZHM8L3RoPicubi4NCgkJCQknCQkJPC90 cj4nLm47DQoNCgkJJHJzID0gDQoJCQlzYWZlX3Jvd3MoDQoJCQkJJ25hbWUnLA0KCQkJCSd0 eHBfcGx1Z2luJywNCgkJCQknMSBvcmRlciBieSBuYW1lJw0KCQkJKTsNCg0KCQlpZigkcnMp ew0KCQkJZm9yZWFjaCgkcnMgYXMgJGEpew0KCQkJCWV4dHJhY3QoJGEpOw0KCQkJCSRhbGxv dyA9IHJhaF9wbHVnaW5fZG93bmxvYWRfdmFsaWRhdGUoJG5hbWUsJycsJHByZWYpOw0KCQkJ CSRjb21wcmVzc2VkID0gcmFoX3BsdWdpbl9kb3dubG9hZF92YWxpZGF0ZSgkbmFtZSwnemlw JywkcHJlZik7DQoJCQkJZWNobyANCgkJCQkJJwkJCQk8dHI+Jy5uLg0KCQkJCQknCQkJCQk8 dGQ+PGEgaHJlZj0iP2V2ZW50PXJhaF9wbHVnaW5fZG93bmxvYWQmYW1wO3N0ZXA9cmFoX3Bs dWdpbl9kb3dubG9hZF9zdGF0aWNzJmFtcDtuYW1lPScuaHRtbHNwZWNpYWxjaGFycygkbmFt ZSkuJyI+Jy5odG1sc3BlY2lhbGNoYXJzKCRuYW1lKS4nPC9hPjwvdGQ+Jy5uLg0KCQkJCQkn CQkJCQk8dGQ+PGxhYmVsPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iaW5jbHVkZXBs dWdpbnNbXSIgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkbmFtZSkuJyInLigoaW5fYXJy YXkoJG5hbWUsJGluY2x1ZGVwbHVnaW5zKSkgPyAnIGNoZWNrZWQ9ImNoZWNrZWQiJyA6ICcn KS4nIC8+ICcuZ1R4dCgneWVzJykuJzwvbGFiZWw+PC90ZD4nLm4uDQoJCQkJCScJCQkJCTx0 ZD4nLigoJGNvbXByZXNzZWQgPT0gdHJ1ZSkgPyAnPGEgaHJlZj0iJy5odS4nP3JhaF9wbHVn aW5fZG93bmxvYWQ9Jy5odG1sc3BlY2lhbGNoYXJzKCRuYW1lKS4nJmFtcDtyYWhfdHlwZT16 aXAiPkRvd25sb2FkPC9hPicgOiAnPGRlbD5Eb3dubG9hZDwvZGVsPicpLic8L3RkPicubi4N CgkJCQkJJwkJCQkJPHRkPicuKCgkYWxsb3cgPT0gdHJ1ZSkgPyAnPGEgaHJlZj0iJy5odS4n P3JhaF9wbHVnaW5fZG93bmxvYWQ9Jy5odG1sc3BlY2lhbGNoYXJzKCRuYW1lKS4nIj5Eb3du bG9hZDwvYT4nIDogJzxkZWw+RG93bmxvYWQ8L2RlbD4nKS4nPC90ZD4nLm4uDQoJCQkJCScJ CQkJCTx0ZD48bGFiZWw+Tm9ybWFsOiA8aW5wdXQgc2l6ZT0iMTAiIHR5cGU9InRleHQiIG9u Y2xpY2s9InRoaXMuc2VsZWN0KCkiIHZhbHVlPSInLmh0bWxzcGVjaWFsY2hhcnMoJzx0eHA6 cmFoX3BsdWdpbl9kb3dubG9hZCBuYW1lPSInLiRuYW1lLiciIC8+JykuJyIgLz48L2xhYmVs PiA8bGFiZWw+R3ppcDogPGlucHV0IHNpemU9IjEwIiB0eXBlPSJ0ZXh0IiBvbmNsaWNrPSJ0 aGlzLnNlbGVjdCgpIiB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCc8dHhwOnJhaF9wbHVn aW5fZG93bmxvYWQgbmFtZT0iJy4kbmFtZS4nIiB0eXBlPSJ6aXAiIC8+JykuJyIgLz48L2xh YmVsPjwvdGQ+Jy5uLg0KCQkJCQknCQkJCQk8dGQ+PGEgaHJlZj0iP2V2ZW50PXJhaF9wbHVn aW5fZG93bmxvYWQmYW1wO3N0ZXA9cmFoX3BsdWdpbl9kb3dubG9hZF9zdGF0aWNzJmFtcDtu YW1lPScuaHRtbHNwZWNpYWxjaGFycygkbmFtZSkuJyI+Jy4oKGlzc2V0KCRjb3VudFskbmFt ZV0pKT8gJGNvdW50WyRuYW1lXSA6ICcwJykuJzwvYT48L3RkPicubi4NCgkJCQkJJwkJCQk8 L3RyPicubjsNCg0KCQkJCWlmKGlzc2V0KCRjb3VudFskbmFtZV0pKQ0KCQkJCQkkdG90YWwg PSAkdG90YWwgKyAkY291bnRbJG5hbWVdOw0KDQoJCQl9DQoNCgkJCWVjaG8gDQoJCQkJJwkJ CQk8dHI+Jy5uLg0KCQkJCScJCQkJCTx0ZCBjb2xzcGFuPSI1Ij4mIzE2MDs8L3RkPicuDQoJ CQkJJwkJCQkJPHRkPicuJHRvdGFsLic8L3RkPicubi4NCgkJCQknCQkJCTwvdHI+Jy5uOw0K DQoJCX0NCgkJZWxzZQ0KCQkJZWNobyAnCQkJCTx0cj48dGQgY29sc3Bhbj0iNiI+Tm8gcGx1 Z2lucyBpbnN0YWxsZWQgeWV0LjwvdGQ+PC90cj4nLm47DQoNCgkJZWNobyANCgkJCQknCQk8 L3RhYmxlPicubi4NCgkJCQknCQk8cCBzdHlsZT0icGFkZGluZzogMTBweCAwIDAgMDsiPjxz dHJvbmc+QWxsb3cgYW4gYXV0aG9yIHByZWZpeChlcykgdG8gYmUgZG93bmxvYWRlZC48L3N0 cm9uZz4gV2lsbCBhbGxvdyBhbGwgcGx1Z2lucyBzdGFydGluZyB3aXRoIHRoZSBzcGVjaWZp YyA8c3Ryb25nPnByZWZpeDwvc3Ryb25nPiB0byBiZSBkb3dubG9hZGVkIGJ5IHZpc2l0b3Jz LiBUaGlzIHNldHRpbmcgd2lsbCBvdmVycmlkZSB0aGUgbWFudWFsbHkgc2V0IGFsbG93ZWQg cGx1Z2lucyBsaXN0LiBDb21tYSBzZXBlcmF0ZWQgbGlzdCBpZiBtdWx0aXBsZS4gUmVtZW1i ZXIgdGhhdCB2YWxpZCBmb3JtIGlzIHRvIHVzZSBhIHNpbmdsZSAzIGxldHRlciBwcmVmaXgs IGp1c3QgbGlrZSA8YSBocmVmPSJodHRwOi8vdGV4dHBhdHRlcm4ubmV0L3dpa2kvaW5kZXgu cGhwP3RpdGxlPVJlc2VydmVkX1BsdWdpbl9QcmVmaXhlcyI+VGV4dGJvb2sgdGVsbHMgdXM8 L2E+LjwvcD4nLm4uDQoJCQkJJwkJPHA+PGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJlZGl0 IiBuYW1lPSJwbHVnaW5wcmVmaXgiIHN0eWxlPSJ3aWR0aDo5NDBweDsiIHZhbHVlPSInLmh0 bWxzcGVjaWFsY2hhcnMoJHBsdWdpbnByZWZpeCkuJyIgLz48L3A+Jy5uLg0KCQkJCScJCTxw PjxzdHJvbmc+VXNlIGNvbXByZXNzaW9uPzwvc3Ryb25nPiBJZiBzZXQgdG8gTm8sIHZpc2l0 b3JzIGNhblwndCBkb3dubG9hZCBjb21wcmVzc2VkIGZpbGVzLCBvbmx5IHVuY29tcHJlc3Nl ZCB2ZXJzaW9ucy4gSXRcJ3MgcmVjb21tZW5kZWQgdG8gdHVybiBjb21wcmVzc2lvbiBvZmYg aWYgeW91IGRvblwndCBoYXZlIHpsaWIgaW5zdGFsbGVkIG9yIGlmIGl0XCdzIGFjdGluZyBm dW5ueS48L3A+Jy5uLg0KCQkJCScJCTxwPicubi4NCgkJCQknCQkJPHNlbGVjdCBzdHlsZT0i d2lkdGg6IDQ1MHB4OyIgbmFtZT0iY29tcHJlc3MiPicubi4NCgkJCQknCQkJCTxvcHRpb24g dmFsdWU9IjEiJy4oKCRjb21wcmVzcyA9PSAxKSA/ICcgc2VsZWN0ZWQ9InNlbGVjdGVkIicg OiAnJykuJz5ZZXM8L29wdGlvbj4nLm4uDQoJCQkJJwkJCQk8b3B0aW9uIHZhbHVlPSIwIicu KCgkY29tcHJlc3MgPT0gMCkgPyAnIHNlbGVjdGVkPSJzZWxlY3RlZCInIDogJycpLic+Tm88 L29wdGlvbj4nLm4uDQoJCQkJJwkJCTwvc2VsZWN0Picubi4NCgkJCQknCQk8L3A+Jy5uLg0K CQkJCScJCTxwPjxzdHJvbmc+QWxsb3cgZG93bmxvYWRpbmcgb2xkZXIgdmVyc2lvbnMgb2Yg cGx1Z2lucyBmcm9tIDxhIGhyZWY9Imh0dHA6Ly9yYWhmb3J1bS5iaXovcGx1Z2lucy9yYWhf cGx1Z2luX2RldiI+cmFoX3BsdWdpbl9kZXY8L2E+XCdzIHZlcnNpb24gbWFuYWdlcj88L3N0 cm9uZz4gVXNpbmcgdGhpcyBmZWF0dXJlIHJlcXVpcmVzIHJhaF9wbHVnaW5fZGV2IHZlcnNp b24gMC41IG9yIG5ld2VyLiBWZXJzaW9uIG1hbmFnZXJcJ3Mgb2xkZXIgcGx1Z2luIHZlcnNp b25zIGNhbiBiZSBkb3dubG9hZGVkIGJ5IGFkZGluZyA8Y29kZT5yYWhfdmVyc2lvbjwvY29k ZT4gKEdFVCkgVVJMIHBhcmFtZXRlciB0byB0aGUgZG93bmxvYWQgVVJMICg8Y29kZT4mYW1w O3JhaF92ZXJzaW9uPTAuMjwvY29kZT4pLjwvcD4nLm4uDQoJCQkJJwkJPHA+Jy5uLg0KCQkJ CScJCQk8c2VsZWN0IHN0eWxlPSJ3aWR0aDogNDUwcHg7IiBuYW1lPSJwbHVnaW5fZGV2Ij4n Lm4uDQoJCQkJJwkJCQk8b3B0aW9uIHZhbHVlPSIxIicuKCgkcGx1Z2luX2RldiA9PSAxKSA/ ICcgc2VsZWN0ZWQ9InNlbGVjdGVkIicgOiAnJykuJz5ZZXM8L29wdGlvbj4nLm4uDQoJCQkJ JwkJCQk8b3B0aW9uIHZhbHVlPSIwIicuKCgkcGx1Z2luX2RldiA9PSAwKSA/ICcgc2VsZWN0 ZWQ9InNlbGVjdGVkIicgOiAnJykuJz5Obzwvb3B0aW9uPicubi4NCgkJCQknCQkJPC9zZWxl Y3Q+Jy5uLg0KCQkJCScJCTwvcD4nLm4uDQoJCQkJJwkJPGlucHV0IHR5cGU9ImhpZGRlbiIg bmFtZT0iZXZlbnQiIHZhbHVlPSJyYWhfcGx1Z2luX2Rvd25sb2FkIiAvPicubi4NCgkJCQkn CQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzdGVwIiB2YWx1ZT0icmFoX3BsdWdpbl9k b3dubG9hZF9zYXZlIiAvPicubi4NCgkJCQknCQk8cCBzdHlsZT0iYm9yZGVyLXRvcDogMXB4 IHNvbGlkICNjY2M7IiBpZD0icmFoX3BsdWdpbl9kb3dubG9hZF9ib3R0b20iPjxpbnB1dCB0 eXBlPSJzdWJtaXQiIG5hbWU9IiIgdmFsdWU9IlNhdmUgc2V0dGluZ3MiIGNsYXNzPSJwdWJs aXNoIiAvPjwvcD4nLm4uDQoJCQkJJwk8L2Zvcm0+Jy5uOw0KCX0NCg0KLyoqDQoJU2F2ZXMg cHJlZmVyZW5jZXMNCiovDQoNCglmdW5jdGlvbiByYWhfcGx1Z2luX2Rvd25sb2FkX3NhdmUo KSB7DQoJCWV4dHJhY3QoZG9TbGFzaChncHNhKGFycmF5KA0KCQkJJ3BsdWdpbmFsbCcsDQoJ CQknY29tcHJlc3MnLA0KCQkJJ3BsdWdpbl9kZXYnDQoJCSkpKSk7DQoJCQ0KCQkkb3V0ID0g YXJyYXkoKTsNCgkJDQoJCSRwbHVnaW5wcmVmaXggPSBleHBsb2RlKCcsJyxwcygncGx1Z2lu cHJlZml4JykpOw0KCQkNCgkJZm9yZWFjaCgkcGx1Z2lucHJlZml4IGFzICRwcmVmaXgpDQoJ CQkkb3V0W10gPSB0cmltKCRwcmVmaXgpOw0KCQkNCgkJJHBsdWdpbnByZWZpeCA9IGltcGxv ZGUoJywnLCRvdXQpOw0KCQkNCgkJJGluY2x1ZGVwbHVnaW5zID0gcHMoJ2luY2x1ZGVwbHVn aW5zJyk7DQoJCWlmKGlzX2FycmF5KCRpbmNsdWRlcGx1Z2lucykpDQoJCQkkaW5jbHVkZXBs dWdpbnMgPSBpbXBsb2RlKCcsJywkaW5jbHVkZXBsdWdpbnMpOw0KCQkkaW5jbHVkZXBsdWdp bnMgPSBkb1NsYXNoKCRpbmNsdWRlcGx1Z2lucyk7DQoJCQ0KCQlmb3JlYWNoKHJhaF9wbHVn aW5fZG93bmxvYWRfcHJlZnNfZGVmYXVsdCgpIGFzICRrZXkgPT4gJHZhbCkgDQoJCQkNCgkJ CXNhZmVfdXBkYXRlKA0KCQkJCSdyYWhfcGx1Z2luX2Rvd25sb2FkX3ByZWZzJywNCgkJCQki dmFsdWU9JyIuJCRrZXkuIiciLA0KCQkJCSJuYW1lPSciLiRrZXkuIiciDQoJCQkpOw0KCQkN CgkJcmFoX3BsdWdpbl9kb3dubG9hZF9saXN0KCdQcmVmZXJlbmNlcyBzYXZlZC4nKTsNCgl9 DQoNCi8qKg0KCVVwZGF0ZXMgZG93bmxvYWQgY291bnQNCiovDQoNCglmdW5jdGlvbiByYWhf cGx1Z2luX2Rvd25sb2FkX2NvdW50KCRuYW1lPScnLCR2ZXJzaW9uPScnKSB7DQoJCSRuYW1l ID0gZG9TbGFzaCgkbmFtZSk7DQoJCSR2ZXJzaW9uID0gZG9TbGFzaCgkdmVyc2lvbik7DQoJ CWlmKA0KCQkJc2FmZV9jb3VudCgNCgkJCQkncmFoX3BsdWdpbl9kb3dubG9hZF9jb3VudCcs DQoJCQkJIm5hbWU9JyIuJG5hbWUuIicgYW5kIHZlcnNpb249JyIuJHZlcnNpb24uIiciDQoJ CQkpID4gMA0KCQkpIA0KCQkJc2FmZV91cGRhdGUoDQoJCQkJJ3JhaF9wbHVnaW5fZG93bmxv YWRfY291bnQnLA0KCQkJCSJjb3VudD1jb3VudCsxIiwNCgkJCQkibmFtZT0nIi4kbmFtZS4i JyBhbmQgdmVyc2lvbj0nIi4kdmVyc2lvbi4iJyINCgkJCSk7DQoJCWVsc2UgDQoJCQlzYWZl X2luc2VydCgNCgkJCQkncmFoX3BsdWdpbl9kb3dubG9hZF9jb3VudCcsDQoJCQkJImNvdW50 PTEsDQoJCQkJbmFtZT0nIi4kbmFtZS4iJywNCgkJCQl2ZXJzaW9uPSciLiR2ZXJzaW9uLiIn Ig0KCQkJKTsNCgl9DQoNCi8qKg0KCVZhbGlkYXRlcyB0aGUgZG93bmxvYWQNCiovDQoNCglm dW5jdGlvbiByYWhfcGx1Z2luX2Rvd25sb2FkX3ZhbGlkYXRlKCRuYW1lPScnLCR0eXBlPScn LCRwcmVmPScnKSB7DQoJCWlmKGVtcHR5KCRwcmVmKSkNCgkJCUAkcHJlZiA9IHJhaF9wbHVn aW5fZG93bmxvYWRfcHJlZnMoKTsNCgkJDQoJCWlmKCEkcHJlZikNCgkJCXJldHVybiB0cnVl Ow0KCQkNCgkJaWYoJHByZWZbJ2NvbXByZXNzJ10gPT0gMCAmJiAkdHlwZSA9PSAnemlwJykN CgkJCXJldHVybiBmYWxzZTsNCgkJDQoJCWlmKCRwcmVmWydwbHVnaW5hbGwnXSAhPSAwKQ0K CQkJcmV0dXJuIHRydWU7DQoNCgkJaWYoIWVtcHR5KCRwcmVmWydpbmNsdWRlcGx1Z2lucydd KSApIHsNCgkJCSRwbHVnaW5zID0gZXhwbG9kZSgnLCcsJHByZWZbJ2luY2x1ZGVwbHVnaW5z J10pOw0KCQkJaWYoaW5fYXJyYXkoJG5hbWUsJHBsdWdpbnMpKSANCgkJCQlyZXR1cm4gdHJ1 ZTsNCgkJfQ0KCQkNCgkJaWYoIWVtcHR5KCRwcmVmWydwbHVnaW5wcmVmaXgnXSkpIHsNCgkJ CSRwcmVmaXhlcyA9IGV4cGxvZGUoJywnLCRwcmVmWydwbHVnaW5wcmVmaXgnXSk7DQoJCQkk cHJlZml4ID0gc3Vic3RyKCRuYW1lLDAsMyk7DQoJCQlpZihpbl9hcnJheSgkcHJlZml4LCRw cmVmaXhlcykpDQoJCQkJcmV0dXJuIHRydWU7DQoJCX0NCgkJDQoJCXJldHVybiBmYWxzZTsN Cgl9DQoNCi8qKg0KCUZldGNoZXMgcHJlZmVyZW5jZXMuIEdvZXMgdGhydWUgaW5zdGFsbGVy IGlmIG5vIHByZWZlcmVuY2VzIGlzIHJlY2VpdmVkLg0KKi8NCg0KCWZ1bmN0aW9uIHJhaF9w bHVnaW5fZG93bmxvYWRfcHJlZnMoKSB7DQoJCUAkcnMgPSANCgkJCXNhZmVfcm93cygNCgkJ CQknbmFtZSx2YWx1ZScsDQoJCQkJJ3JhaF9wbHVnaW5fZG93bmxvYWRfcHJlZnMnLA0KCQkJ CScxPTEnDQoJCQkpOw0KCQkNCgkJZm9yZWFjaCgkcnMgYXMgJGEpDQoJCQkkb3V0WyRhWydu YW1lJ11dID0gJGFbJ3ZhbHVlJ107DQoJCQ0KCQlpZighaXNzZXQoJG91dFsncGx1Z2luX2Rl diddKSkgew0KCQkJcmFoX3BsdWdpbl9kb3dubG9hZF9pbnN0YWxsKCk7DQoJCQlyZXR1cm4g cmFoX3BsdWdpbl9kb3dubG9hZF9wcmVmcygpOw0KCQl9DQoJCQ0KCQlpZihpc3NldCgkb3V0 KSkNCgkJCXJldHVybiAkb3V0Ow0KCX0NCg0KLyoqDQoJRGVmYXVsdCBwcmVmZXJlbmNlcy4g VXNlZCBpbiBzYXZpbmcgYW5kIGluc3RhbGxpbmcNCiovDQoNCglmdW5jdGlvbiByYWhfcGx1 Z2luX2Rvd25sb2FkX3ByZWZzX2RlZmF1bHQoKSB7DQoJCXJldHVybiAgDQoJCQlhcnJheSgN CgkJCQkncGx1Z2lucHJlZml4JyA9PiAnJywNCgkJCQkncGx1Z2luYWxsJyA9PiAnMScsDQoJ CQkJJ2luY2x1ZGVwbHVnaW5zJyA9PiAnJywNCgkJCQknY29tcHJlc3MnID0+ICcxJywNCgkJ CQkncGx1Z2luX2RldicgPT4gJzAnDQoJCQkpOw0KCX0NCg0KLyoqDQoJSW5zdGFsbGVyDQoq Lw0KDQoJZnVuY3Rpb24gcmFoX3BsdWdpbl9kb3dubG9hZF9pbnN0YWxsKCkgew0KCQlzYWZl X3F1ZXJ5KA0KCQkJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTICIuc2FmZV9wZngoJ3Jh aF9wbHVnaW5fZG93bmxvYWRfcHJlZnMnKS4iICgNCgkJCQlgbmFtZWAgVkFSQ0hBUigyNTUp IE5PVCBOVUxMLA0KCQkJCWB2YWx1ZWAgTE9OR1RFWFQgTk9UIE5VTEwsDQoJCQkJUFJJTUFS WSBLRVkoYG5hbWVgKQ0KCQkJKSINCgkJKTsNCg0KCQlmb3JlYWNoKHJhaF9wbHVnaW5fZG93 bmxvYWRfcHJlZnNfZGVmYXVsdCgpIGFzICRrZXkgPT4gJHZhbCkgew0KCQkJaWYoDQoJCQkJ c2FmZV9jb3VudCgNCgkJCQkJJ3JhaF9wbHVnaW5fZG93bmxvYWRfcHJlZnMnLA0KCQkJCQki bmFtZT0nIi5kb1NsYXNoKCRrZXkpLiInIg0KCQkJCSkgPT0gMA0KCQkJKQ0KCQkJCXNhZmVf aW5zZXJ0KA0KCQkJCQkncmFoX3BsdWdpbl9kb3dubG9hZF9wcmVmcycsDQoJCQkJCSJuYW1l PSciLmRvU2xhc2goJGtleSkuIicsDQoJCQkJCXZhbHVlPSciLmRvU2xhc2goJHZhbCkuIici DQoJCQkJKTsNCgkJfQ0KDQoJCXNhZmVfcXVlcnkoDQoJCQkiQ1JFQVRFIFRBQkxFIElGIE5P VCBFWElTVFMgIi5zYWZlX3BmeCgncmFoX3BsdWdpbl9kb3dubG9hZF9jb3VudCcpLiIgKA0K CQkJCWBpZGAgaW50KDExKSBOT1QgTlVMTCBhdXRvX2luY3JlbWVudCwNCgkJCQlgbmFtZWAg VkFSQ0hBUigyNTUpIE5PVCBOVUxMICwNCgkJCQlgdmVyc2lvbmAgVkFSQ0hBUigxMCkgTk9U IE5VTEwgZGVmYXVsdCAnMS4wJywNCgkJCQlgY291bnRgIGludCgxMSkgdW5zaWduZWQgTk9U IE5VTEwgZGVmYXVsdCAnMCcsDQoJCQkJUFJJTUFSWSBLRVkoYGlkYCkNCgkJCSkiDQoJCSk7 DQoJfSI7czo0OiJ0eXBlIjtzOjE6IjEiO3M6NToiZmxhZ3MiO3M6MToiMCI7czo1OiJvcmRl ciI7czoxOiI1IjtzOjM6Im1kNSI7czozMjoiODNhNDRlZDUwMTUzN2QwNjZkMTc4MzE1MThj MGY0YmEiO30=