Textpattern - на русском языке

форум общения русскоязычных пользователей CMS Текстпаттерн

Вы не зашли.

#1 29-08-2007 23:29:50

Colin Foster
глаголь
Откуда: Лимерик
Зарегистрирован: 22-08-2007
Сообщений: 32
Вебсайт

mem_self_register

Стоит ли вообще использовать плагин?

1. Кто-нибудь пользовался? Можете показать примеры?
2. Нет ли дыр?

Пока больше проблем, редактировал настройки (по инструкции), теперь вылезает следующий баг:

Parse error: syntax error, unexpected T_STRING in /home/aporno/public_html/textpattern/include/txp_auth.php on line 27

Вообще не знаю, как с этим бороться, жалею уже, что установил (

Неактивен

 

#2 30-08-2007 00:46:37

AngryCAT
ферт
Откуда: Германия
Зарегистрирован: 18-04-2006
Сообщений: 486
Вебсайт

Re: mem_self_register

Собственно плагин не пробовал, но почему нельзя попробовать на локале, чтобы потом не приходилось жалеть об установке?


TextPattern строить и жить помогает! Кстати, пишу плагины на заказ. ICQ 155-08-081. В асю, пожалуйста, по поводу заказов или платных консультаций (10$ час). Остальные вопросы в форум или на почту.

Неактивен

 

#3 31-08-2007 03:36:48

Colin Foster
глаголь
Откуда: Лимерик
Зарегистрирован: 22-08-2007
Сообщений: 32
Вебсайт

Re: mem_self_register

Да, вы, конечно, правы, но до этого всё шло как по маслу? Можно ли теперь сделать откат? Просто заменить изменённые вручную файлы на исходные?

Неактивен

 

#4 31-08-2007 16:19:14

Evgeny
ять
Зарегистрирован: 15-03-2005
Сообщений: 1869

Re: mem_self_register

Colin Foster написал:

заменить изменённые вручную файлы на исходные?

да, проблем быть не должно

Неактивен

 

#5 15-11-2007 16:24:07

tima
аз
Зарегистрирован: 15-11-2007
Сообщений: 1

Re: mem_self_register

Где можно скачать данный плагин?
С  официального сайта не скачивается sad

Отредактированно tima (15-11-2007 16:24:46)

Неактивен

 

#6 16-11-2007 01:55:44

AngryCAT
ферт
Откуда: Германия
Зарегистрирован: 18-04-2006
Сообщений: 486
Вебсайт

Re: mem_self_register

Всем страждущим посвящается.

Код:

YTo5OntzOjQ6Im5hbWUiO3M6MTc6Im1lbV9zZWxmX3JlZ2lzdGVyIjtzOjc6InZlcnNpb24iO3M6NToiMC44LjMiO3M6NjoiYXV0aG9yIjtzOjE0OiJNaWNoYWVsIE1hbmZyZSI7czoxMDoiYXV0aG9yX3VyaSI7czoxODoiaHR0cDovL21hbmZyZS5uZXQvIjtzOjExOiJkZXNjcmlwdGlvbiI7czo0OToiVXNlciBzZWxmIHJlZ2lzdHJhdGlvbi4gUmVhZCB0aGUgaGVscCB0byBpbnN0YWxsLiI7czo0OiJ0eXBlIjtpOjE7czo0OiJoZWxwIjtzOjkyMzc6IgoJPGgyPlVzZXIgU2VsZiBSZWdpc3RyYXRpb248L2gyPgoKCTxoMz5JbnN0YWxsYXRpb248L2gzPgoKCTxwPjxhIGhyZWY9ImluZGV4LnBocD9ldmVudD1zZWxmLXJlZyYjMzg7c3RlcD1wcmVpbnN0YWxsJiMzODthcmVhPWFkbWluIj5TdGFydCBJbnN0YWxsIFdpemFyZDwvYT48L3A+CgoJPGgzPlN1bW1hcnk8L2gzPgoKCTxwPlRoaXMgcGx1Z2luIGlzIGRlc2lnbmVkIHRvIGVuYWJsZSBjb21tdW5pdHkgZHJpdmVuIHNpdGVzLiBVc2VycyB3aWxsIGJlIGFibGUgdG8gcmVnaXN0ZXIgdGhlbXNlbHZlcyBmb3IgYW4gYWNjb3VudCB0byBhY2Nlc3MgdGhlIHN5c3RlbS4gVGhpcyBwbHVnaW4gaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBpZ25fdXNlcl9wYXNzd29yZCBwbHVnaW4gYWx0ZXJuYXRlIHVzZXIgdGFibGUuIFRoaXMgcGx1Z2luIHByb3ZpZGVzIHVzZXIgc2lkZSB0YWdzIGZvciBnZW5lcmF0aW5nIGFuIGh0bWwgZm9ybSB3aGVyZSB1c2VycyBjYW4gZWRpdCB0aGVpciBhY2NvdW50IGluZm9ybWF0aW9uLjwvcD4KCgk8aDM+Q2xpZW50IFBsdWctaW4gVGFnczo8L2gzPgoKCTx1bD4KCTxsaT48c3Ryb25nPm1lbV9zZWxmX3JlZ2lzdGVyX2Zvcm08L3N0cm9uZz48L2xpPgoJCTxsaT48c3Ryb25nPnNlbGZfcmVnaXN0ZXJfZW1haWxfbWVzc2FnZTwvc3Ryb25nPjwvbGk+CgkJPGxpPjxzdHJvbmc+c2VsZl9yZWdpc3Rlcl9zdGF0dXNfbWVzc2FnZTwvc3Ryb25nPjwvbGk+CgkJPGxpPjxzdHJvbmc+aWZfc2VsZl9yZWdpc3RlcmVkPC9zdHJvbmc+PC9saT4KCQk8bGk+PHN0cm9uZz5tZW1fY2hhbmdlX3Bhc3N3b3JkX2Zvcm08L3N0cm9uZz48L2xpPgoJCTxsaT48c3Ryb25nPm1lbV91c2VyX2VkaXRfZm9ybTwvc3Ryb25nPjwvbGk+CgkJPGxpPjxzdHJvbmc+bWVtX3Byb2ZpbGU8L3N0cm9uZz48L2xpPgoJPC91bD4KCgk8cD48aHIgLz48L3A+CgoJPGg0Pm1lbV9zZWxmX3JlZ2lzdGVyX2Zvcm08L2g0PgoKCTxwPlRoaXMgd2lsbCBvdXRwdXQgYW4gSFRNTCBmb3JtIHRoYXQgd2lsbCBhbGxvdyBhIHVzZXIgdG8gcmVnaXN0ZXIgdGhlbXNlbHZlcyB3aXRoIGFuIGFjY291bnQuPC9wPgoKCTxwPlRhZyBBdHRyaWJ1dGVzOjwvcD4KCgk8dWw+Cgk8bGk+PHN0cm9uZz5mb3JtPC9zdHJvbmc+JiM4MjEyO1NwZWNpZmllcyB3aGljaCBmb3JtIGNvbnRhaW5zIHRoZSBIVE1MIGZvcm0gdGVtcGxhdGUuIERlZmF1bHQgaXMgJiM4MjIwO3NlbGZfcmVnaXN0ZXJfZm9ybSYjODIyMTsuPC9saT4KCQk8bGk+PHN0cm9uZz5lbWFpbF9mb3JtPC9zdHJvbmc+JiM4MjEyO1NwZWNpZmllcyB3aGljaCBmb3JtIGNvbnRhaW5zIHRoZSBlbWFpbCBtZXNzYWdlIHRlbXBsYXRlIHRoYXQgd2lsbCBiZSBzZW50IHRvIGEgdXNlciB1cG9uIHJlZ2lzdGVyaW5nLiBEZWZhdWx0IGlzICYjODIyMDtzZWxmX3JlZ2lzdGVyX2VtYWlsJiM4MjIxOy48L2xpPgoJCTxsaT48c3Ryb25nPndyYXB0YWc8L3N0cm9uZz4mIzgyMTI7VGhlIEhUTUwgdGFnIHRoYXQgd2lsbCB3cmFwIHRoZSBnZW5lcmF0ZWQgZm9ybS4gRGVmYXVsdCBpcyBub25lLjwvbGk+CgkJPGxpPjxzdHJvbmc+aXNpemU8L3N0cm9uZz4mIzgyMTI7VGhlIHNpemUgb2YgdGhlIGlucHV0IGZpZWxkcy4gRGVmYXVsdCBpcyAyNS48L2xpPgoJCTxsaT48c3Ryb25nPmxhYmVsPC9zdHJvbmc+JiM4MjEyO1RoZSB0ZXh0IHRvIHBsYWNlIG9uIHRoZSBzdWJtaXQgYnV0dG9uLiBEZWZhdWx0IGlzIHRoZSBsb2NhbGl6ZWQgJiM4MjIwO3N1Ym1pdCYjODIyMTsuPC9saT4KCQk8bGk+PHN0cm9uZz5uYW1ld2Fybjwvc3Ryb25nPiYjODIxMjtBbiBlcnJvciBtZXNzYWdlIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgd2hlbiB0aGUgbmFtZSBmaWVsZCBpcyBsZWZ0IGJsYW5rLjwvbGk+CgkJPGxpPjxzdHJvbmc+dXNlcndhcm48L3N0cm9uZz4mIzgyMTI7QW4gZXJyb3IgbWVzc2FnZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyIHdoZW4gdGhlIHVzZXIgZmllbGQgaXMgbGVmdCBibGFuay48L2xpPgoJCTxsaT48c3Ryb25nPmVtYWlsd2Fybjwvc3Ryb25nPiYjODIxMjtBbiBlcnJvciBtZXNzYWdlIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgd2hlbiB0aGUgZW1haWwgZmllbGQgaXMgbGVmdCBibGFuay48L2xpPgoJCTxsaT48c3Ryb25nPmNsYXNzPC9zdHJvbmc+JiM4MjEyO1RoZSBjc3Mgc3R5bGUgY2xhc3MgdG8gYWRkIHRvIHRoZSB3cmFwdGFnLiBEZWZhdWx0IGlzICYjODIyMDttZW1fc2VsZl9yZWdpc3Rlcl9mb3JtJiM4MjIxOy48L2xpPgoJPC91bD4KCgk8cD5UZW1wbGF0ZSB0YWdzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aGluIHRoZSBIVE1MIHRlbXBsYXRlIGZvcm0uPC9wPgoKCTx1bD4KCTxsaT48Y29kZT4mbHQ7dHhwOm1lbV9uYW1lX3dhcm4gLyZndDs8L2NvZGU+JiM4MjEyO1RoaXMgd2lsbCBkaXNwbGF5IHRoZSBjb250ZW50cyBvZiBuYW1ld2FybiB3aGVuIHRoZSBuYW1lX2lucHV0IGZpZWxkIGlzIGxlZnQgYmxhbmsuPC9saT4KCQk8bGk+PGNvZGU+Jmx0O3R4cDptZW1fdXNlcl93YXJuIC8mZ3Q7PC9jb2RlPiYjODIxMjtUaGlzIHdpbGwgZGlzcGxheSB0aGUgY29udGVudHMgb2YgdXNlcndhcm4gd2hlbiB0aGUgdXNlcl9pbnB1dCBmaWVsZCBpcyBsZWZ0IGJsYW5rLjwvbGk+CgkJPGxpPjxjb2RlPiZsdDt0eHA6bWVtX2VtYWlsX3dhcm4gLyZndDs8L2NvZGU+JiM4MjEyO1RoaXMgd2lsbCBkaXNwbGF5IHRoZSBjb250ZW50cyBvZiBlbWFpbHdhcm4gd2hlbiB0aGUgZW1haWxfaW5wdXQgZmllbGQgaXMgbGVmdCBibGFuay48L2xpPgoJCTxsaT48Y29kZT4mbHQ7dHhwOm1lbV9uYW1lX2lucHV0IC8mZ3Q7PC9jb2RlPiYjODIxMjtUaGlzIHdpbGwgZGlzcGxheSB0aGUgbmFtZSBmaWVsZC48L2xpPgoJCTxsaT48Y29kZT4mbHQ7dHhwOm1lbV91c2VyX2lucHV0IC8mZ3Q7PC9jb2RlPiYjODIxMjtUaGlzIHdpbGwgZGlzcGxheSB0aGUgdXNlciBmaWVsZC48L2xpPgoJCTxsaT48Y29kZT4mbHQ7dHhwOm1lbV9lbWFpbF9pbnB1dCAvJmd0OzwvY29kZT4mIzgyMTI7VGhpcyB3aWxsIGRpc3BsYXkgdGhlIGVtYWlsIGZpZWxkLjwvbGk+CgkJPGxpPjxjb2RlPiZsdDt0eHA6bWVtX3N1Ym1pdCAvJmd0OzwvY29kZT4mIzgyMTI7VGhpcyB3aWxsIGRpc3BsYXkgdGhlIHN1Ym1pdCBidXR0b24uPC9saT4KCTwvdWw+CgoJPHA+U3RhcnRlciBUZW1wbGF0ZTo8L3A+Cgo8Y29kZT48YnIgLz4KTmFtZTogJmx0O3R4cDptZW1fbmFtZV9pbnB1dCAvJmd0OyZsdDticiAvJmd0OzxiciAvPgpVc2VyIE5hbWU6ICZsdDt0eHA6bWVtX3VzZXJfaW5wdXQgLyZndDsmbHQ7YnIgLyZndDs8YnIgLz4KRW1haWw6ICZsdDt0eHA6bWVtX2VtYWlsX2lucHV0IC8mZ3Q7Jmx0O2JyIC8mZ3Q7PGJyIC8+CiZsdDt0eHA6bWVtX3N1Ym1pdCAvJmd0OzxiciAvPgo8L2NvZGU+CgoJPHA+VGVtcGxhdGUgdGFncyB0aGF0IGNhbiBiZSB1c2VkIHdpdGhpbiB0aGUgZW1haWwgdGVtcGxhdGUgZm9ybS4gSW4gYWRkaXRpb24gdG8gdGhlIHRhZ3MgbGlzdGVkIGJlbG93LCBhbnkgb3RoZXIgVGV4dHBhdHRlcm4gdGFnIGNhbiBiZSB1c2VkLjwvcD4KCgk8dWw+Cgk8bGk+PGNvZGU+Jmx0O3R4cDptZW1fbmFtZSAvJmd0OzwvY29kZT4mIzgyMTI7VGhlIG5hbWUgc3VibWl0dGVkIGJ5IHRoZSB1c2VyLjwvbGk+CgkJPGxpPjxjb2RlPiZsdDt0eHA6bWVtX3VzZXJuYW1lIC8mZ3Q7PC9jb2RlPiYjODIxMjtUaGUgdXNlcm5hbWUgc3VibWl0dGVkIGJ5IHRoZSB1c2VyLjwvbGk+CgkJPGxpPjxjb2RlPiZsdDt0eHA6bWVtX2VtYWlsIC8mZ3Q7PC9jb2RlPiYjODIxMjtUaGUgZW1haWwgYWRkcmVzcyBzdWJtaXR0ZWQgYnkgdGhlIHVzZXIuPC9saT4KCQk8bGk+PGNvZGU+Jmx0O3R4cDptZW1fcGFzc3dvcmQgLyZndDs8L2NvZGU+JiM4MjEyO1RoZSBwYXNzd29yZCBnZW5lcmF0ZWQgZm9yIHRoZSB1c2VyLjwvbGk+CgkJPGxpPjxjb2RlPiZsdDt0eHA6bWVtX3NpdGVuYW1lIC8mZ3Q7PC9jb2RlPiYjODIxMjtUaGUgc2l0ZSBuYW1lIGFzIHNwZWNpZmllZCBpbiB0aGUgU2l0ZSBDb25maWd1cmF0aW9uIChwcmVmcyB0YWIpLjwvbGk+CgkJPGxpPjxjb2RlPiZsdDt0eHA6bWVtX3NpdGV1cmwgLyZndDs8L2NvZGU+JiM4MjEyO1RoZSB1cmwgdG8gdGhlIGZyb250IHBhZ2Ugb2YgdGhpcyBzaXRlLjwvbGk+CgkJPGxpPjxjb2RlPiZsdDt0eHA6bWVtX2xvZ2ludXJsIC8mZ3Q7PC9jb2RlPiYjODIxMjtUaGUgdXJsIHRvIHRoZSBUZXh0cGF0dGVybiBsb2cgaW4gcGFnZS48L2xpPgoJCTxsaT48Y29kZT4mbHQ7dHhwOm1lbV9hZG1pbl9uYW1lIC8mZ3Q7PC9jb2RlPiYjODIxMjtUaGUgbmFtZSBvZiB0aGUgYWRtaW5pc3RyYXRpdmUgY29udGFjdC4gVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgaW4gdGhlIGVtYWlsIGZyb20gZmllbGQuPC9saT4KCQk8bGk+PGNvZGU+Jmx0O3R4cDptZW1fYWRtaW5fZW1haWwgLyZndDs8L2NvZGU+JiM4MjEyO1RoZSBlbWFpbCBhZGRyZXNzIG9mIHRoZSBhZG1pbmlzdHJhdGl2ZSBjb250YWN0LiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBiZSBpbiB0aGUgZW1haWwgZnJvbSBmaWVsZC48L2xpPgoJPC91bD4KCgk8cD5TdGFydGVyIFRlbXBsYXRlOjwvcD4KCjxjb2RlPjxiciAvPgpEZWFyICZsdDt0eHA6bWVtX25hbWUgLyZndDssCiAgVGhhbmsgeW91IGZvciByZWdpc3RlcmluZyBmb3IgJmx0O3R4cDptZW1fc2l0ZW5hbWUgLyZndDsuIEJlbG93IGFyZSB5b3UgdXNlciBhY2NvdW50IGRldGFpbHMuCgoJPHA+VXNlcm5hbWU6ICZsdDt0eHA6bWVtX3VzZXJuYW1lIC8mZ3Q7PGJyIC8+ClBhc3N3b3JkOiAmbHQ7dHhwOm1lbV9wYXNzd29yZCAvJmd0OzxiciAvPgpTaXRlIFVSTDogJmx0O3R4cDptZW1fc2l0ZXVybCAvJmd0OzxiciAvPgpMb2dpbiBVUkw6ICZsdDt0eHA6bWVtX2xvZ2ludXJsIC8mZ3Q7PC9wPgoKCTxwPlNpbmNlcmVseSw8YnIgLz4KJmx0O3R4cDptZW1fYWRtaW5fbmFtZSAvJmd0OzxiciAvPgpFbWFpbDogJmx0O3R4cDptZW1fYWRtaW5fZW1haWwgLyZndDs8YnIgLz4KPC9jb2RlPjwvcD4KCgk8cD5FeGFtcGxlOjwvcD4KCgk8cD48Y29kZT48YnIgLz4KJmx0O3R4cDptZW1fc2VsZl9yZWdpc3Rlcl9mb3JtIHdyYXB0YWc9ImRpdiIgaXNpemU9IjIwIiBsYWJlbD0iUmVnaXN0ZXIiIG5hbWV3YXJuPSJOYW1lIGlzIHJlcXVpcmVkIiB1c2Vyd2Fybj0iVXNlcm5hbWUgaXMgcmVxdWlyZWQiIGVtYWlsd2Fybj0iRW1haWwgYWRkcmVzcyBpcyByZXF1aXJlZCIgLyZndDs8YnIgLz4KPC9jb2RlPjwvcD4KCgk8cD48aHIgLz48L3A+CgoJPGg0PnNlbGZfcmVnaXN0ZXJfc3RhdHVzX21lc3NhZ2U8L2g0PgoKCTxwPlRoaXMgd2lsbCBvdXRwdXQgdGhlIHN0YXR1cyBtZXNzYWdlIGdlbmVyYXRlZCBhZnRlciBzdWJtaXR0aW5nIHRoZSBzZWxmIHJlZ2lzdHJhdGlvbiBmb3JtLjwvcD4KCgk8cD48aHIgLz48L3A+CgoJPGg0PnNlbGZfcmVnaXN0ZXJfZW1haWxfbWVzc2FnZTwvaDQ+CgoJPHA+QWZ0ZXIgdGhlIGZvcm0gaXMgc3VibWl0dGVkLCB0aGlzIHdpbGwgb3V0cHV0IHRoZSBlbnRpcmUgZW1haWwgbWVzc2FnZSB0aGF0IHdhcyBzZW50IHRvIHRoZSB1c2VyLjwvcD4KCgk8cD48aHIgLz48L3A+CgoJPGg0PmlmX3NlbGZfcmVnaXN0ZXJlZDwvaDQ+CgoJPHA+VGhpcyB3aWxsIG91dHB1dCB0aGUgY29udGVudHMgb2YgdGhlIHRhZyBpZiB0aGUgdXNlciBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQuIFRvIHdvcmsgcHJvcGVybHksIHRoaXMgcmVxdWlyZXMgYnJvd3NlciBjb29raWVzIGFmdGVyIHRoZSBpbml0aWFsIGZvcm0gc3VibWlzc2lvbi4gVGhpcyB0YWcgc3VwcG9ydHMgPGNvZGU+Jmx0O3R4cDplbHNlIC8mZ3Q7PC9jb2RlPjwvcD4KCgk8cD5FeGFtcGxlOjwvcD4KCgk8cD48Y29kZT48YnIgLz4KJmx0O3R4cDppZl9zZWxmX3JlZ2lzdGVyZWQmZ3Q7PGJyIC8+CllvdSBhbHJlYWR5IGhhdmUgYW4gYWNjb3VudC48YnIgLz4KJmx0O3R4cDplbHNlIC8mZ3Q7PGJyIC8+CiZsdDt0eHA6bWVtX3NlbGZfcmVnaXN0ZXJfZm9ybSAvJmd0OzxiciAvPgombHQ7L3R4cDppZl9zZWxmX3JlZ2lzdGVyZWQmZ3Q7PGJyIC8+CjwvY29kZT48L3A+CgoJPHA+PGhyIC8+PC9wPgoKCTxoND5tZW1fY2hhbmdlX3Bhc3N3b3JkX2Zvcm08L2g0PgoKCTxwPlRoaXMgdGFnIGFsbG93cyBhIGNoYW5nZSBwYXNzd29yZCBmb3JtIHRvIGJlIGRpc3BsYXllZCBvbiB0aGUgdXNlciBwb3J0aW9uIG9mIHRoZSB3ZWJzaXRlLiBUaGlzIGlzIG1lYW50IHRvIGJlIHVzZWQgd2l0aCB0aGUgaWduX3Bhc3N3b3JkX3Byb3RlY3QgcGx1Z2luLiBUaGlzIHRhZyBzdXBwb3J0cyB0aGUgdGFnIHR4cDptZW1fcHJvZmlsZSAoc2VlIGJlbG93KS48L3A+CgoJPHA+VGFnIEF0dHJpYnV0ZXM6PC9wPgoKCTx1bD4KCTxsaT48c3Ryb25nPmZvcm08L3N0cm9uZz4mIzgyMTI7U3BlY2lmaWVzIHdoaWNoIGZvcm0gY29udGFpbnMgdGhlIEhUTUwgZm9ybSB0ZW1wbGF0ZS4gVGhpcyBmb3JtIHdpbGwgYmUgcmVwYXJzZWQgYnkgVHhwLiBEZWZhdWx0IGlzIG5vbmUuIElmIG5vdCBzcGVjaWZpZWQsIGEgZGVmYXVsdCBmb3JtIHdpbGwgYmUgdXNlZC48L2xpPgoJCTxsaT48c3Ryb25nPmZvcm1fbWFpbDwvc3Ryb25nPiYjODIxMjtTcGVjaWZpZXMgd2hpY2ggZm9ybSBjb250YWlucyB0aGUgbWVzc2FnZSB0ZW1wbGF0ZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIGVtYWlsZWQgdG8gdGhlIHVzZXIuIERlZmF1bHQgaXMgbm9uZS4gSWYgbm90IHNwZWNpZmllZCwgYSBkZWZhdWx0IG1lc3NhZ2UgdGVtcGxhdGUgd2lsbCBiZSB1c2VkLjwvbGk+CgkJPGxpPjxzdHJvbmc+d3JhcHRhZzwvc3Ryb25nPiYjODIxMjtUaGUgSFRNTCB0YWcgdGhhdCB3aWxsIHdyYXAgdGhlIGdlbmVyYXRlZCBmb3JtLiBEZWZhdWx0IGlzIG5vbmUuPC9saT4KCQk8bGk+PHN0cm9uZz5jbGFzczwvc3Ryb25nPiYjODIxMjtUaGUgY3NzIHN0eWxlIGNsYXNzIHRvIGFkZCB0byB0aGUgd3JhcHRhZy4gRGVmYXVsdCBpcyAmIzgyMjA7bWVtX3Bhc3N3b3JkX2Zvcm0mIzgyMjE7LjwvbGk+Cgk8L3VsPgoKCTxwPlRlbXBsYXRlIHRhZ3MgdGhhdCBjYW4gYmUgdXNlZCB3aXRoaW4gdGhlICYjODIxNjtmb3JtJiM4MjE3OyB0ZW1wbGF0ZSBmb3JtLjwvcD4KCgk8dWw+Cgk8bGk+PGNvZGU+Jmx0O3R4cDptZW1fcGFzc3dvcmRfaW5wdXQgLyZndDs8L2NvZGU+JiM4MjEyO1RoaXMgd2lsbCBkaXNwbGF5IGEgcGFzc3dvcmQgZm9ybSBmaWVsZDwvbGk+CgkJPGxpPjxjb2RlPiZsdDt0eHA6bWVtX3N1Ym1pdCAvJmd0OzwvY29kZT4mIzgyMTI7VGhpcyB3aWxsIGRpc3BsYXkgYSBmb3JtIHN1Ym1pdCBidXR0b248L2xpPgoJPC91bD4KCgk8cD5UZW1wbGF0ZSB0YWdzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aGluIHRoZSAmIzgyMTY7Zm9ybV9tYWlsJiM4MjE3OyB0ZW1wbGF0ZSBmb3JtLjwvcD4KCgk8dWw+Cgk8bGk+PGNvZGU+Jmx0O3R4cDptZW1fcmVhbG5hbWUgLyZndDs8L2NvZGU+JiM4MjEyO1RoaXMgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSB1c2VyJiM4MjE3O3MgcmVhbCBuYW1lLjwvbGk+CgkJPGxpPjxjb2RlPiZsdDt0eHA6bWVtX3Bhc3N3b3JkIC8mZ3Q7PC9jb2RlPiYjODIxMjtUaGlzIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgdXNlciYjODIxNztzIHBhc3N3b3JkLjwvbGk+Cgk8L3VsPgoKCTxwPjxociAvPjwvcD4KCgk8aDQ+bWVtX3VzZXJfZWRpdF9mb3JtPC9oND4KCgk8cD5UaGlzIHRhZyBhbGxvd3MgYSBmb3JtIHRvIG1vZGlmeSB1c2VyIGluZm9ybWF0aW9uIHRvIGJlIGRpc3BsYXllZCBvbiB0aGUgdXNlciBwb3J0aW9uIG9mIHRoZSB3ZWJzaXRlLiBUaGlzIGlzIG1lYW50IHRvIGJlIHVzZWQgd2l0aCB0aGUgaWduX3Bhc3N3b3JkX3Byb3RlY3QgcGx1Z2luLiBUaGlzIHRhZyBzdXBwb3J0cyB0aGUgdGFnIHR4cDptZW1fcHJvZmlsZS48L3A+CgoJPHA+VGFnIEF0dHJpYnV0ZXM6PC9wPgoKCTx1bD4KCTxsaT48c3Ryb25nPmZvcm08L3N0cm9uZz4mIzgyMTI7U3BlY2lmaWVzIHdoaWNoIGZvcm0gY29udGFpbnMgdGhlIEhUTUwgZm9ybSB0ZW1wbGF0ZS4gVGhpcyBmb3JtIHdpbGwgYmUgcmVwYXJzZWQgYnkgVHhwLiBEZWZhdWx0IGlzIG5vbmUuPC9saT4KCQk8bGk+PHN0cm9uZz53cmFwdGFnPC9zdHJvbmc+JiM4MjEyO1RoZSBIVE1MIHRhZyB0aGF0IHdpbGwgd3JhcCB0aGUgZ2VuZXJhdGVkIGZvcm0uIERlZmF1bHQgaXMgbm9uZS48L2xpPgoJCTxsaT48c3Ryb25nPmNsYXNzPC9zdHJvbmc+JiM4MjEyO1RoZSBjc3Mgc3R5bGUgY2xhc3MgdG8gYWRkIHRvIHRoZSB3cmFwdGFnLiBEZWZhdWx0IGlzICYjODIyMDttZW1fdWVkaXRfZm9ybSYjODIyMTsuPC9saT4KCTwvdWw+CgoJPHA+VGVtcGxhdGUgdGFncyB0aGF0IGNhbiBiZSB1c2VkIHdpdGhpbiB0aGUgSFRNTCB0ZW1wbGF0ZSBmb3JtLjwvcD4KCgk8dWw+Cgk8bGk+PGNvZGU+Jmx0O3R4cDptZW1fbWVzc2FnZSAvJmd0OzwvY29kZT4mIzgyMTI7VGhpcyB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIG1lc3NhZ2UgZ2VuZXJhdGVkIGZyb20gc3VibWl0dGluZyB0aGUgZm9ybS48L2xpPgoJCTxsaT48Y29kZT4mbHQ7dHhwOm1lbV9yZWFsbmFtZV9pbnB1dCAvJmd0OzwvY29kZT4mIzgyMTI7VGhpcyB3aWxsIGRpc3BsYXkgYSBmb3JtIGZpZWxkIGZvciBjaGFuZ2luZyB0aGUgdXNlciYjODIxNztzIFJlYWwgTmFtZS48L2xpPgoJCTxsaT48Y29kZT4mbHQ7dHhwOm1lbV9lbWFpbF9pbnB1dCAvJmd0OzwvY29kZT4mIzgyMTI7VGhpcyB3aWxsIGRpc3BsYXkgYSBmb3JtIGZpZWxkIGZvciBjaGFuZ2luZyB0aGUgdXNlciYjODIxNztzIGVtYWlsIGFkZHJlc3MuPC9saT4KCQk8bGk+PGNvZGU+Jmx0O3R4cDptZW1fc3VibWl0IC8mZ3Q7PC9jb2RlPiYjODIxMjtUaGlzIHdpbGwgZGlzcGxheSBhIGZvcm0gc3VibWl0IGJ1dHRvbjwvbGk+Cgk8L3VsPgoKCTxoND5tZW1fcHJvZmlsZTwvaDQ+CgoJPHA+VGhpcyB0YWcgd2lsbCBvdXRwdXQgdGhlIHZhbHVlcyBvZiB0aGUgdXNlciYjODIxNztzIHByb2ZpbGUuPC9wPgoKCTxwPlRhZyBBdHRyaWJ1dGVzOjwvcD4KCgk8dWw+Cgk8bGk+PHN0cm9uZz52YXI8L3N0cm9uZz4mIzgyMTI7U3BlY2lmaWVzIHRoZSBwcm9maWxlIHZhbHVlIG5hbWUgdG8gb3V0cHV0LiBTdXBwb3J0ZWQgdmFsdWVzIGFyZSAmIzgyMjA7UmVhbE5hbWUmIzgyMjE7LCYjODIyMTtlbWFpbCYjODIyMTssIGFuZCAmIzgyMjA7bmV3X3Bhc3MmIzgyMjE7LjwvbGk+Cgk8L3VsPgoKCgoKICI7czo0OiJjb2RlIjtzOjI2OTg3OiIKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIFBsdWdpbiBtZW1fc2VsZl9yZWdpc3RlcgovLyBBdXRob3I6IE1pY2hhZWwgTWFuZnJlIChodHRwOi8vbWFuZnJlLm5ldC8pCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21lbV9zZXRfcHJlZicpKSB7CglmdW5jdGlvbiBtZW1fc2V0X3ByZWYoJG5hbWUsICR2YWwsICRldmVudCwgICR0eXBlLCAkcG9zaXRpb249MCwgJGh0bWw9J3RleHRfaW5wdXQnKQoJewoJCWdsb2JhbCAkcHJlZl9jYWNoZTsKCgkJaWYgKCRwcmVmX2NhY2hlPT1udWxsKQoJCQkkcHJlZl9jYWNoZSA9IGFycmF5KCk7CgoJCSRhcmdzID0gZnVuY19nZXRfYXJncygpOwoJCSRhcmdzWydodG1sJ10gPSAkaHRtbDsKCQkkYXJnc1sncG9zaXRpb24nXSA9ICRwb3NpdGlvbjsKCQkkYXJnc1sncHJlZnNfaWQnXSA9IDE7CgoJCSRwcmVmX2NhY2hlWyRuYW1lXSA9ICRhcmdzOwoKCQlleHRyYWN0KGRvU2xhc2goJGFyZ3MpKTsKCiAgICAJaWYgKCFzYWZlX3JvdygiKiIsICd0eHBfcHJlZnMnLCAibmFtZSA9ICckbmFtZSciKSApIHsKICAgICAgICAJcmV0dXJuIHNhZmVfaW5zZXJ0KCd0eHBfcHJlZnMnLCAiCgkJCQluYW1lICA9ICckbmFtZScsCgkJCQl2YWwgICA9ICckdmFsJywKCQkJCWV2ZW50ID0gJyRldmVudCcsCgkJCQlodG1sICA9ICckaHRtbCcsCgkJCQl0eXBlICA9ICckdHlwZScsCgkJCQlwb3NpdGlvbiA9ICckcG9zaXRpb24nLAoJCQkJcHJlZnNfaWQgPSAxIgoJCQkpOwogICAgCX0gZWxzZSB7CiAgICAgICAgCXJldHVybiBzYWZlX3VwZGF0ZSgJJ3R4cF9wcmVmcycsICIKCSAgICAgICAgCQkJCQkJdmFsICAgPSAnJHZhbCcsCgkgICAgICAgIAkJCQkJCWV2ZW50ID0gJyRldmVudCcsCgkgICAgICAgIAkJCQkJCWh0bWwgID0gJyRodG1sJywKCSAgICAgICAgCQkJCQkJdHlwZSAgPSAnJHR5cGUnLAoJICAgICAgICAJCQkJCQlwb3NpdGlvbiA9ICckcG9zaXRpb24nIiwKICAgICAgICAJCQkJCQkibmFtZSBsaWtlICckbmFtZSciKTsKICAgIAl9CiAgICAJcmV0dXJuIGZhbHNlOwoJfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWVtX2dldF9wcmVmJykpIHsKCWZ1bmN0aW9uIG1lbV9nZXRfcHJlZigkbmFtZSwkdmFsPScnKQoJewoJCWdsb2JhbCAkcHJlZl9jYWNoZTsKCgkJaWYgKCRwcmVmX2NhY2hlPT1udWxsKQoJCQkkcHJlZl9jYWNoZSA9IGFycmF5KCk7CgoJCWlmICghaW5fYXJyYXkoJG5hbWUsJHByZWZfY2FjaGUpIG9yICRwcmVmX2NhY2hlWyRuYW1lXSA9PT0gZmFsc2UpIHsKCQkJJHByZWZfY2FjaGVbJG5hbWVdID0gc2FmZV9yb3coJyonLCd0eHBfcHJlZnMnLCJuYW1lPSckbmFtZSciKTsKCQl9IGVsc2UgewoJCQkkcHJlZl9jYWNoZVskbmFtZV0gPSBmYWxzZTsKCQl9CgoJCWlmICghZW1wdHkoJHZhbCkgJiYgaW5fYXJyYXkoJHZhbCwkcHJlZl9jYWNoZVskbmFtZV0pKQoJCQlyZXR1cm4gJHByZWZfY2FjaGVbJG5hbWVdWyR2YWxdOwoJCWVsc2UKCQkJcmV0dXJuICRwcmVmX2NhY2hlWyRuYW1lXTsKCX0KfQoKZ2xvYmFsICRtZW1fc2VsZl9sYW5nOwoKaWYgKCFpc19hcnJheSgkbWVtX3NlbGZfbGFuZykpCnsKCSRtZW1fc2VsZl9sYW5nID0gYXJyYXkoCgkJJ3lvdXJfbG9naW5faW5mbycJPT4JJ1lvdXIgTG9naW4gSW5mbycsCgkJJ2FkbWluX25hbWUnCQk9PgknQWRtaW4gTmFtZScsCgkJJ2FkbWluX2VtYWlsJwkJPT4JJ0FkbWluIEVtYWlsJywKCQkncGFzc3dvcmRfc2VudF90bycJPT4JJ1Bhc3N3b3JkIFNlbnQgVG8nLAoJCSdlcnJvcl9hZGRpbmdfbmV3X2F1dGhvcicJPT4JJ0Vycm9yIGFkZGluZyBuZXcgYXV0aG9yJywKCQknZ3JlZXRpbmcnCQkJPT4JJ0hlbGxvJywKCQkneW91cl9wYXNzd29yZF9pcycJPT4JJ1lvdXIgcGFzc3dvcmQgaXMnLAoJCSd5b3VyX25ld19wYXNzd29yZCcJPT4JJ1lvdXIgbmV3IHBhc3N3b3JkJywKCQkncGFzc3dvcmRfY2hhbmdlZCcJPT4JJ1Bhc3N3b3JkIGNoYW5nZWQnLAoJCSdwYXNzd29yZF9jaGFuZ2VfZmFpbGVkJwk9PgknRmFpbGVkIHRvIGNoYW5nZSBwYXNzd29yZCcsCgkJJ2xvZ19pbl9hdCcJCQk9PgknTG9nIGluIGF0JywKCQknc2F2ZWRfdXNlcl9wcm9maWxlJwk9PgknU2F2ZWQgVXNlciBQcm9maWxlJywKCQkndXNlcl9leGlzdHMnCQk9PgknVXNlcm5hbWUgYWxyZWFkeSBleGlzdHMuIFBsZWFzZSB0cnkgYW5vdGhlciBuYW1lJywKCSk7Cn0KCmZ1bmN0aW9uIG1lbV9zZWxmX2dUeHQoJG5hbWUpCnsKCWdsb2JhbCAkbWVtX3NlbGZfbGFuZzsKCgkkZ3R4dCA9IGdUeHQoJG5hbWUpOwoKCWlmICggc3RyY21wKCRndHh0LCRuYW1lKSA9PSAwICkKCXsKCQlpZiAoIGFycmF5X2tleV9leGlzdHMoJG5hbWUsJG1lbV9zZWxmX2xhbmcpICkKCQkJJGd0eHQgPSAkbWVtX3NlbGZfbGFuZ1skbmFtZV07Cgl9CgoJcmV0dXJuICRndHh0Owp9CgpnbG9iYWwgJGV2ZW50OwoKaWYgKCFpc3NldCgkZXZlbnQpKSAkZXZlbnQgPSAnJzsKCmlmICgkZXZlbnQgIT0gJ2FkbWluJykgewoJcmVxdWlyZV9vbmNlIHR4cGF0aC4nL2luY2x1ZGUvdHhwX2FkbWluLnBocCc7CgoJZ2xvYmFsICRsZXZlbHM7CgoJLy8gY29waWVkIGZyb20gdHhwX2FkbWluLnBocAoJJGxldmVscyA9IGFycmF5KAoJCTAgPT4gbWVtX3NlbGZfZ1R4dCgnbm9uZScpLAoJCTYgPT4gbWVtX3NlbGZfZ1R4dCgnZGVzaWduZXInKSwKCQk1ID0+IG1lbV9zZWxmX2dUeHQoJ2ZyZWVsYW5jZXInKSwKCQk0ID0+IG1lbV9zZWxmX2dUeHQoJ3N0YWZmX3dyaXRlcicpLAoJCTMgPT4gbWVtX3NlbGZfZ1R4dCgnY29weV9lZGl0b3InKSwKCQkyID0+IG1lbV9zZWxmX2dUeHQoJ21hbmFnaW5nX2VkaXRvcicpLAoJCTEgPT4gbWVtX3NlbGZfZ1R4dCgncHVibGlzaGVyJykKCSk7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWlmICghZnVuY3Rpb25fZXhpc3RzKCdwcml2X2xldmVscycpKSB7CgkJZnVuY3Rpb24gcHJpdl9sZXZlbHMoJGl0ZW0sICR2YXIpIHsKCQkJZ2xvYmFsICRsZXZlbHM7CgoJCQlyZXR1cm4gc2VsZWN0SW5wdXQoJGl0ZW0sICRsZXZlbHMsICR2YXIpOwoJCX0KCX0KfQoKCmdsb2JhbCAkbWVtX3NlbGY7CgokbWVtX3NlbGYgPSBhcnJheSgKCQkJCSdhZG1pbl9lbWFpbCcJCT0+CScnLAoJCQkJJ2FkbWluX25hbWUnCQk9PgknJywKCQkJCSduZXdfdXNlcl9wcml2JwkJPT4JJzAnLAoJCQkJJ3N0YXR1cycJCQk9PglmYWxzZSwKCQkJCSdzdGF0dXNfbWVzc2FnZScJPT4JJ1lvdSBhcmUgYWxyZWFkeSByZWdpc3RlcmVkLicsCgkJCQknZW1haWxfbWVzc2FnZScJCT0+CScnCgkJCSk7CgokbWVtX3NlbGZbJ2FkbWluX2VtYWlsJ10gPSBtZW1fZ2V0X3ByZWYoJ21lbV9zZWxmX2FkbWluX2VtYWlsJywndmFsJyk7IC8vc2FmZV9maWVsZCgndmFsJywndHhwX3ByZWZzJywibmFtZT0nbWVtX3NlbGZfYWRtaW5fZW1haWwnIik7CiRtZW1fc2VsZlsnYWRtaW5fbmFtZSddID0gbWVtX2dldF9wcmVmKCdtZW1fc2VsZl9hZG1pbl9uYW1lJywndmFsJyk7IC8vc2FmZV9maWVsZCgndmFsJywndHhwX3ByZWZzJywibmFtZT0nbWVtX3NlbGZfYWRtaW5fbmFtZSciKTsKJG1lbV9zZWxmWyduZXdfdXNlcl9wcml2J10gPSBtZW1fZ2V0X3ByZWYoJ21lbV9zZWxmX25ld191c2VyX3ByaXYnLCd2YWwnKTsgLy9zYWZlX2ZpZWxkKCd2YWwnLCd0eHBfcHJlZnMnLCJuYW1lPSdtZW1fc2VsZl9uZXdfdXNlcl9wcml2JyIpOwoKaWYgKCBAdHhwaW50ZXJmYWNlID09ICdhZG1pbicgKSB7CglyZWdpc3Rlcl9jYWxsYmFjaygnbWVtX3NlbGZfcmVnaXN0ZXInLCdzZWxmLXJlZycsJycsIDEpOwoJaWYgKCRldmVudD09J3NlbGYtcmVnJykgewoJCS8vIGZha2UgdGFicyB3aGVuIHVzaW5nIHRoZW0uIFNpbGVuY2VzIHdhcm5pbmdzIGZyb20gcGFnZVRvcCgpCgkJcmVnaXN0ZXJfdGFiKCdhZG1pbicsJ3NlbGYtcmVnJywnc2VsZi1yZWcnKTsKCgkJaW5jbHVkZV9vbmNlIHR4cGF0aC4nL3B1Ymxpc2gvdGFnaGFuZGxlcnMucGhwJzsKCX0KCglmdW5jdGlvbiBtZW1fc2VsZl9yZWdpc3RlcigkZXZlbnQsICRzdGVwKSB7CgkJaWYgKCRldmVudCE9J3NlbGYtcmVnJykKCQkJcmV0dXJuOwoKCQlwYWdlVG9wKCdTZWxmIFJlZ2lzdHJhdGlvbicsJycpOwoKCQlpZiAoJHN0ZXAgPT0gJ2luc3RhbGwnKSB7CgkJCWVjaG8gbWVtX3NlbGZfcmVnaXN0ZXJfaW5zdGFsbCgpOwoJCX0gZWxzZSBpZiAoJHN0ZXA9PSdwcmVpbnN0YWxsJykgewoJCQkkbWVtX2FkbWluX25hbWUJPSBtZW1fZ2V0X3ByZWYoJ21lbV9zZWxmX2FkbWluX25hbWUnKTsKCQkJJG1lbV9hZG1pbl9lbWFpbAk9IG1lbV9nZXRfcHJlZignbWVtX3NlbGZfYWRtaW5fZW1haWwnKTsKCQkJJG1lbV9uZXdfdXNlcl9wcml2CT0gbWVtX2dldF9wcmVmKCdtZW1fc2VsZl9uZXdfdXNlcl9wcml2Jyk7CgkJCSRtZW1fdXNlX2lnbl9kYgk9IG1lbV9nZXRfcHJlZignbWVtX3NlbGZfdXNlX2lnbl9kYicpOwoJCQkkbWVtX3h0cmFfY29sdW1ucwk9IG1lbV9nZXRfZXh0cmFfdXNlcl9jb2x1bW5zKCk7CgoJCQkkbWVtX2FkbWluX25hbWUgPSBAJG1lbV9hZG1pbl9uYW1lID8gJG1lbV9hZG1pbl9uYW1lWyd2YWwnXSA6ICdBZG1pbic7CgkJCSRtZW1fYWRtaW5fZW1haWwgPSBAJG1lbV9hZG1pbl9lbWFpbCA/ICRtZW1fYWRtaW5fZW1haWxbJ3ZhbCddIDogJ0FkbWluQHlvdXJkb21haW4uY29tJzsKCQkJJG1lbV9uZXdfdXNlX3ByaXYgPSBAJG1lbV9uZXdfdXNlX3ByaXYgPyAkbWVtX25ld191c2VfcHJpdlsndmFsJ10gOiAnMCc7CgoJCQkkdXNlX2lnbl9pbnB1dCA9ICcnOwoJCQkvLyBpcyBpZ25fcGFzc3dvcmRfcHJvdGVjdCBsb2FkZWQgb24gdGhlIHN5c3RlbT8KCQkJaWYgKGxvYWRfcGx1Z2luKCdpZ25fcGFzc3dvcmRfcHJvdGVjdCcpIHx8ICRtZW1fdXNlX2lnbl9kYikgewoJCQkJJG1lbV91c2VfaWduX2RiID0gJG1lbV91c2VfaWduX2RiID8gJG1lbV91c2VfaWduX2RiWyd2YWwnXSA6ICcwJzsKCQkJCSR1c2VfaWduX2lucHV0ID0geWVzbm9yYWRpbygndXNlX2lnbl9kYicsJG1lbV91c2VfaWduX2RiKTsKCQkJfQoKCQkJJHh0cmFfY29sdW1ucyA9IG1lbV9nZXRfZXh0cmFfdXNlcl9jb2x1bW5zKCk7CgkJCSRoYXNfYWRkcmVzcyA9IGluX2FycmF5KCdhZGRyZXNzJywkeHRyYV9jb2x1bW5zKTsKCQkJJGhhc19waG9uZSA9IGluX2FycmF5KCdwaG9uZScsJHh0cmFfY29sdW1ucyk7CgoJCQkkYWRkX2FkZHJlc3NfaW5wdXQgPSB5ZXNub3JhZGlvKCdhZGRfYWRkcmVzcycsJzAnKTsKCQkJJGFkZF9waG9uZV9pbnB1dCA9IHllc25vcmFkaW8oJ2FkZF9waG9uZScsJzAnKTsKCgkJCWVjaG8gZm9ybSgKCQkJCWVJbnB1dCgnc2VsZi1yZWcnKS5zSW5wdXQoJ2luc3RhbGwnKS4KCQkJCXN0YXJ0VGFibGUoJ2VkaXQnKSAuCgkJCQkJdHIoIGZMYWJlbENlbGwoJ2FkbWluX25hbWUnKQkuIHRkYShmSW5wdXQoJ3RleHQnLCdhZG1pbl9uYW1lJywkbWVtX2FkbWluX25hbWUsJ2VkaXQnKSkgKSAuCgkJCQkJdHIoIGZMYWJlbENlbGwoJ2FkbWluX2VtYWlsJykJLiB0ZGEoZklucHV0KCd0ZXh0JywnYWRtaW5fZW1haWwnLCRtZW1fYWRtaW5fZW1haWwsJ2VkaXQnKSkgKSAuCgkJCQkJdHIoIGZMYWJlbENlbGwoJ25ld191c2VyX3ByaXYnKQkuIHRkYShwcml2X2xldmVscygnbmV3X3VzZXJfcHJpdicsJG1lbV9uZXdfdXNlX3ByaXYpKSApIC4KCQkJCQl0ciggZkxhYmVsQ2VsbCgndXNlX2lnbl9kYicpCS4gdGRhKCR1c2VfaWduX2lucHV0KSApIC4KCQkJCQkoJGhhc19hZGRyZXNzID8gJycgOiB0ciggZkxhYmVsQ2VsbCgnYWRkX2FkZHJlc3NfZmllbGQnKSAuIHRkYSgkYWRkX2FkZHJlc3NfaW5wdXQpICkgKSAuCgkJCQkJKCRoYXNfcGhvbmUgPyAnJyA6IHRyKCBmTGFiZWxDZWxsKCdhZGRfcGhvbmVfZmllbGQnKSAuIHRkYSgkYWRkX3Bob25lX2lucHV0KSApICkgLgoJCQkJCXRyKCB0ZCgpIC4gdGQoIGZJbnB1dCgic3VibWl0IiwgJ3N1Ym1pdCcsbWVtX3NlbGZfZ1R4dCgnaW5zdGFsbCcpLCJQdWJsaXNoIiksIDIgKSApIC4KCQkJCWVuZFRhYmxlKCkKCQkJCSk7CgkJfSBlbHNlIHsKCQkJZWNobyAnPGRpdj48YSBocmVmPSI/ZXZlbnQ9c2VsZi1yZWcmc3RlcD1wcmVpbnN0YWxsIj4nLm1lbV9zZWxmX2dUeHQoJ2luc3RhbGwnKS4nPC9hPjwvZGl2Pic7CgkJfQoJfQoKCglmdW5jdGlvbiBtZW1fc2VsZl9yZWdpc3Rlcl9pbnN0YWxsKCkgewoJCWdsb2JhbCAkbWVtX3NlbGY7CgoJCWV4dHJhY3QoZG9TbGFzaChncHNhKGFycmF5KAoJCQknYWRtaW5fZW1haWwnLAoJCQknYWRtaW5fbmFtZScsCgkJCSduZXdfdXNlcl9wcml2JywKCQkJJ3VzZV9pZ25fZGInLAoJCQknYWRkX2FkZHJlc3MnLAoJCQknYWRkX3Bob25lJwoJCSkpKSk7CgoJCWlmICghaXNzZXQoJG5ld191c2VyX3ByaXYpIHx8IGVtcHR5KCRuZXdfdXNlcl9wcml2KSkgJG5ld191c2VyX3ByaXYgPSAnMCc7CgoJCSRsb2cgPSBhcnJheSgpOwoKCQlpZiAoISgkcnM9c2FmZV9maWVsZCgndmFsLGh0bWwnLCd0eHBfcHJlZnMnLCJuYW1lPSdtZW1fc2VsZl91c2VfaWduX2RiJyIpKSkgewoJCQlpZiAoIG1lbV9zZXRfcHJlZignbWVtX3NlbGZfdXNlX2lnbl9kYicsJHVzZV9pZ25fZGIsJ3NlbGZfcmVnJywxLCd5ZXNub3JhZGlvJykpIHsKCQkJCSRsb2dbXSA9ICJBZGRlZCBwcmVmICdtZW1fc2VsZl91c2VfaWduX2RiJyI7CgkJCX0gZWxzZSB7CgkJCQkkbG9nW10gPSAiRmFpbGVkIHRvIGFkZCBwcmVmICdtZW1fc2VsZl91c2VfaWduX2RiJy4gIiAuIG15c3FsX2Vycm9yKCk7CgkJCX0KCQl9IGVsc2UgewoJCQlpZiAoJHJzWydodG1sJ10gIT0gJ3llc25vcmFkaW8nKSB7CgkJCQlzYWZlX3VwZGF0ZSgndHhwX3ByZWZzJywiaHRtbD0neWVzbm9yYWRpbyciLCJuYW1lPSdtZW1fc2VsZl91c2VfaWduX2RiJyIpOwoJCQl9CgkJCSRsb2dbXSA9ICJQcmVmICdtZW1fc2VsZl91c2VfaWduX2RiJyBpcyBhbHJlYWR5IGluc3RhbGxlZC4gQ3VycmVudCB2YWx1ZSBpcyAneyRyc30nLiI7CgkJfQoKCQkkdXNlcl90YWJsZSA9IG1lbV9nZXRfdXNlcl90YWJsZV9uYW1lKCk7CgoJCSR4dHJhX2NvbHVtbnMgPSBtZW1fZ2V0X2V4dHJhX3VzZXJfY29sdW1ucygpOwoJCWlmICgkYWRkX2FkZHJlc3MpIHsKCQkJaWYgKCFpbl9hcnJheSgnYWRkcmVzcycsJHh0cmFfY29sdW1ucykpIHsKCQkJCWlmIChzYWZlX2FsdGVyKCR1c2VyX3RhYmxlLCJBREQgYGFkZHJlc3NgIFZBUkNIQVIoIDEyOCApIikpIHsKCQkJCQkkbG9nW10gPSAiQWRkZWQgY29sdW1uICdhZGRyZXNzJyB0byB1c2VyIHRhYmxlICd7JHVzZXJfdGFibGV9JyI7CgkJCQl9IGVsc2UgewoJCQkJCSRsb2dbXSA9ICJGYWlsZWQgdG8gYWRkIGNvbHVtbiAnYWRkcmVzcycgdG8gdXNlciB0YWJsZSAneyR1c2VyX3RhYmxlfScuICIgLiBteXNxbF9lcnJvcigpOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJJGxvZ1tdID0gIlRhYmxlIHskdXNlcl90YWJsZX0gYWxyZWFkeSBoYXMgY29sdW1uICdhZGRyZXNzJyI7CgkJCX0KCQl9CgkJaWYgKCRhZGRfcGhvbmUpIHsKCQkJaWYgKCFpbl9hcnJheSgncGhvbmUnLCR4dHJhX2NvbHVtbnMpKSB7CgkJCQlpZiAoc2FmZV9hbHRlcigkdXNlcl90YWJsZSwiQUREIGBwaG9uZWAgVkFSQ0hBUiggMzIgKSIpKSB7CgkJCQkJJGxvZ1tdID0gIkFkZGVkIGNvbHVtbiAncGhvbmUnIHRvIHVzZXIgdGFibGUgJ3skdXNlcl90YWJsZX0nIjsKCQkJCX0gZWxzZSB7CgkJCQkJJGxvZ1tdID0gIkZhaWxlZCB0byBhZGQgY29sdW1uICdwaG9uZScgdG8gdXNlciB0YWJsZSAneyR1c2VyX3RhYmxlfScuICIgLiBteXNxbF9lcnJvcigpOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJJGxvZ1tdID0gIlRhYmxlIHskdXNlcl90YWJsZX0gYWxyZWFkeSBoYXMgY29sdW1uICdwaG9uZSciOwoJCQl9CgkJfQoKCQlpZiAoISgkcnM9c2FmZV9maWVsZCgndmFsJywndHhwX3ByZWZzJywibmFtZT0nbWVtX3NlbGZfYWRtaW5fZW1haWwnIikpKSB7CgkJCWlmICggbWVtX3NldF9wcmVmKCdtZW1fc2VsZl9hZG1pbl9lbWFpbCcsJGFkbWluX2VtYWlsLCdzZWxmX3JlZycsMSkpIHsKCQkJCSRsb2dbXSA9ICJBZGRlZCBwcmVmICdtZW1fc2VsZl9hZG1pbl9lbWFpbCciOwoJCQl9IGVsc2UgewoJCQkJJGxvZ1tdID0gIkZhaWxlZCB0byBhZGQgcHJlZiAnbWVtX3NlbGZfYWRtaW5fZW1haWwnLiAiIC4gbXlzcWxfZXJyb3IoKTsKCQkJfQoJCX0gZWxzZSB7CgkJCSRsb2dbXSA9ICJQcmVmICdtZW1fc2VsZl9hZG1pbl9lbWFpbCcgaXMgYWxyZWFkeSBpbnN0YWxsZWQuIEN1cnJlbnQgdmFsdWUgaXMgJ3skcnN9Jy4iOwoJCX0KCQlpZiAoISgkcnM9c2FmZV9maWVsZCgndmFsJywndHhwX3ByZWZzJywibmFtZT0nbWVtX3NlbGZfYWRtaW5fbmFtZSciKSkpIHsKCQkJaWYgKCBtZW1fc2V0X3ByZWYoJ21lbV9zZWxmX2FkbWluX25hbWUnLCRhZG1pbl9uYW1lLCdzZWxmX3JlZycsMSkpIHsKCQkJCSRsb2dbXSA9ICJBZGRlZCBwcmVmICdtZW1fc2VsZl9hZG1pbl9uYW1lJyI7CgkJCX0gZWxzZSB7CgkJCQkkbG9nW10gPSAiRmFpbGVkIHRvIGFkZCBwcmVmICdtZW1fc2VsZl9hZG1pbl9uYW1lJy4gIiAuIG15c3FsX2Vycm9yKCk7CgkJCX0KCQl9IGVsc2UgewoJCQkkbG9nW10gPSAiUHJlZiAnbWVtX3NlbGZfYWRtaW5fbmFtZScgaXMgYWxyZWFkeSBpbnN0YWxsZWQuIEN1cnJlbnQgdmFsdWUgaXMgJ3skcnN9Jy4iOwoJCX0KCQlpZiAoKCRycz1zYWZlX2ZpZWxkKCd2YWwsaHRtbCcsJ3R4cF9wcmVmcycsIm5hbWU9J21lbV9zZWxmX25ld191c2VyX3ByaXYnIikpID09PSBmYWxzZSkgewoJCQlpZiAoIG1lbV9zZXRfcHJlZignbWVtX3NlbGZfbmV3X3VzZXJfcHJpdicsJG5ld191c2VyX3ByaXYsJ3NlbGZfcmVnJywxLCdwcml2X2xldmVscycpKSB7CgkJCQkkbG9nW10gPSAiQWRkZWQgcHJlZiAnbWVtX3NlbGZfbmV3X3VzZXJfcHJpdicgd2l0aCB2YWx1ZSBvZiAneyRuZXdfdXNlcl9wcml2fSciOwoJCQkJJG1lbV9zZWxmWyduZXdfdXNlcl9wcml2J10gPSAkbmV3X3VzZXJfcHJpdjsKCQkJfSBlbHNlIHsKCQkJCSRsb2dbXSA9ICJGYWlsZWQgdG8gYWRkIHByZWYgJ21lbV9zZWxmX25ld3VzZXJfcHJpdicuICIgLiBteXNxbF9lcnJvcigpOwoJCQl9CgkJfSBlbHNlIHsKCQkJaWYgKCRyc1snaHRtbCddICE9ICdwcml2X2xldmVscycpCgkJCQlzYWZlX3VwZGF0ZSgndHhwX3ByZWZzJywiaHRtbD0ncHJpdl9sZXZlbHMnIiwibmFtZT0nbWVtX3NlbGZfbmV3X3VzZXJfcHJpdiciKTsKCgkJCSRsb2dbXSA9ICJQcmVmICdtZW1fc2VsZl9uZXdfdXNlcl9wcml2JyBpcyBhbHJlYWR5IGluc3RhbGxlZC4gQ3VycmVudCB2YWx1ZSBpcyAneyRyc30nLiI7CgkJfQoKCQkvLyBjcmVhdGUgZGVmYXVsdCByZWdpc3RyYXRpb24gZm9ybQoJCSRmb3JtX2h0bWwgPSA8PDxFT0YKPHRhYmxlPgo8dHI+Cgk8dGQ+RnVsbCBOYW1lPC90ZD4KCTx0ZD48dHhwOm1lbV9uYW1lX2lucHV0IC8+PC90ZD4KCTx0ZD48dHhwOm1lbV9uYW1lX3dhcm4gLz48L3RkPgo8L3RyPgo8dHI+Cgk8dGQ+VXNlcm5hbWU8L3RkPgoJPHRkPjx0eHA6bWVtX3VzZXJfaW5wdXQgLz48L3RkPgoJPHRkPjx0eHA6bWVtX3VzZXJfd2FybiAvPjwvdGQ+CjwvdHI+Cjx0cj4KCTx0ZD5FbWFpbDwvdGQ+Cgk8dGQ+PHR4cDptZW1fZW1haWxfaW5wdXQgLz48L3RkPgoJPHRkPjx0eHA6bWVtX2VtYWlsX3dhcm4gLz48L3RkPgo8L3RyPgo8dHI+Cgk8dGQgY29sc3Bhbj0iMyI+PHR4cDptZW1fc3VibWl0IC8+PC90ZD4KPC90cj4KPC90YWJsZT4KRU9GOwoKCQkkZm9ybSA9IGZldGNoKCdGb3JtJywndHhwX2Zvcm0nLCduYW1lJywnc2VsZl9yZWdpc3Rlcl9mb3JtJyk7CgkJaWYgKCEkZm9ybSkgewoJCQlpZiAoc2FmZV9pbnNlcnQoJ3R4cF9mb3JtJywibmFtZT0nc2VsZl9yZWdpc3Rlcl9mb3JtJyx0eXBlPSdtaXNjJyxGb3JtPSd7JGZvcm1faHRtbH0nIikpIHsKCQkJCSRsb2dbXSA9ICJBZGRlZCBmb3JtICdzZWxmX3JlZ2lzdGVyX2Zvcm0nIjsKCQkJfSBlbHNlIHsKCQkJCSRsb2dbXSA9ICJGYWlsZWQgdG8gYWRkIGZvcm0gJ3NlbGZfcmVnaXN0ZXJfZm9ybScuICIgLiBteXNxbF9lcnJvcigpLmJyLgoJCQkJCSJZb3UgbmVlZCB0byBtYW51YWxseSBjcmVhdGUgYSBmb3JtIHRlbXBsYXRlLiBIZXJlIGlzIGFuIGV4YW1wbGUuIi5ici4KCQkJCQknPHRleHRwYXR0ZXJuIHN0eWxlPSJ3aWR0aDozMDBweDtoZWlnaHQ6MTUwcHg7Ij4nLmh0bWxzcGVjaWFsY2hhcnMoJGZvcm1faHRtbCkuJzwvdGV4dGFyZWE+JzsKCQkJfQoJCX0gZWxzZSB7CgkJCSRsb2dbXSA9ICJGb3VuZCBmb3JtICdzZWxmX3JlZ2lzdGVyX2Zvcm0nLiBTa2lwcGluZyBpbnN0YWxsYXRpb24gb2YgZGVmYXVsdCBmb3JtLiI7CgkJfQoKCQkvLyBjcmVhdGUgZGVmYXVsdCBzdWNjZXNzZnVsIHJlZ2lzdHJhdGlvbiBmb3JtIHRvIHNob3cgdGhlIHVzZXIKCQkkZm9ybV9odG1sID0gPDw8RU9GCjxoMz5BY2NvdW50IENyZWF0ZWQ8L2gzPgo8cD5BbiBlbWFpbCBjb250YWluaW5nIHlvdXIgcGFzc3dvcmQgaGFzIGJlZW4gc2VudCB0byA8dHhwOm1lbV9wcm9maWxlIHZhcj0iZW1haWwiIC8+LjwvcD4KRU9GOwoKCQkkZm9ybSA9IGZldGNoKCdGb3JtJywndHhwX2Zvcm0nLCduYW1lJywnc2VsZl9yZWdpc3Rlcl9zdWNjZXNzJyk7CgkJaWYgKCEkZm9ybSkgewoJCQlpZiAoc2FmZV9pbnNlcnQoJ3R4cF9mb3JtJywibmFtZT0nc2VsZl9yZWdpc3Rlcl9zdWNjZXNzJyx0eXBlPSdtaXNjJyxGb3JtPSd7JGZvcm1faHRtbH0nIikpIHsKCQkJCSRsb2dbXSA9ICJBZGRlZCBmb3JtICdzZWxmX3JlZ2lzdGVyX3N1Y2Nlc3MnIjsKCQkJfSBlbHNlIHsKCQkJCSRsb2dbXSA9ICJGYWlsZWQgdG8gYWRkIGZvcm0gJ3NlbGZfcmVnaXN0ZXJfc3VjY2VzcycuICIgLiBteXNxbF9lcnJvcigpLmJyLgoJCQkJCSJZb3UgbmVlZCB0byBtYW51YWxseSBjcmVhdGUgYSBmb3JtIHRlbXBsYXRlLiBIZXJlIGlzIGFuIGV4YW1wbGUuIi5ici4KCQkJCQknPHRleHRwYXR0ZXJuIHN0eWxlPSJ3aWR0aDozMDBweDtoZWlnaHQ6MTUwcHg7Ij4nLmh0bWxzcGVjaWFsY2hhcnMoJGZvcm1faHRtbCkuJzwvdGV4dGFyZWE+JzsKCQkJfQoJCX0gZWxzZSB7CgkJCSRsb2dbXSA9ICJGb3VuZCBmb3JtICdzZWxmX3JlZ2lzdGVyX3N1Y2Nlc3MnLiBTa2lwcGluZyBpbnN0YWxsYXRpb24gb2YgZGVmYXVsdCBmb3JtLiI7CgkJfQoKCQkvLyBjcmVhdGUgZGVmYXVsdCBzdWNjZXNzZnVsIHJlZ2lzdHJhdGlvbiBlbWFpbCBmb3JtCgkJJGZvcm1faHRtbCA9IDw8PEVPRgpEZWFyIDx0eHA6bWVtX25hbWUgLz4sCgpUaGFuayB5b3UgZm9yIHJlZ2lzdGVyaW5nIGF0IDx0eHA6bWVtX3NpdGV1cmwgLz4uCgpZb3VyIGxvZ2luIG5hbWU6IDx0eHA6bWVtX3VzZXJuYW1lIC8+CllvdXIgcGFzc3dvcmQ6IDx0eHA6bWVtX3Bhc3N3b3JkIC8+CgpJZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zIHBsZWFzZSByZXBseSB0byB0aGlzIGVtYWlsIGFkZHJlc3MuCgpTaW5jZXJlbHksCjx0eHA6bWVtX2FkbWluX25hbWUgLz4KPHR4cDptZW1fYWRtaW5fZW1haWwgLz4KRU9GOwoKCQkkZm9ybSA9IGZldGNoKCdGb3JtJywndHhwX2Zvcm0nLCduYW1lJywnc2VsZl9yZWdpc3Rlcl9lbWFpbCcpOwoJCWlmICghJGZvcm0pIHsKCQkJaWYgKHNhZmVfaW5zZXJ0KCd0eHBfZm9ybScsIm5hbWU9J3NlbGZfcmVnaXN0ZXJfZW1haWwnLHR5cGU9J21pc2MnLEZvcm09J3skZm9ybV9odG1sfSciKSkgewoJCQkJJGxvZ1tdID0gIkFkZGVkIGZvcm0gJ3NlbGZfcmVnaXN0ZXJfZW1haWwnIjsKCQkJfSBlbHNlIHsKCQkJCSRsb2dbXSA9ICJGYWlsZWQgdG8gYWRkIGZvcm0gJ3NlbGZfcmVnaXN0ZXJfZW1haWwnLiAiIC4gbXlzcWxfZXJyb3IoKS5ici4KCQkJCQkiWW91IG5lZWQgdG8gbWFudWFsbHkgY3JlYXRlIGEgZm9ybSB0ZW1wbGF0ZS4gSGVyZSBpcyBhbiBleGFtcGxlLiIuYnIuCgkJCQkJJzx0ZXh0cGF0dGVybiBzdHlsZT0id2lkdGg6MzAwcHg7aGVpZ2h0OjE1MHB4OyI+Jy5odG1sc3BlY2lhbGNoYXJzKCRmb3JtX2h0bWwpLic8L3RleHRhcmVhPic7CgkJCX0KCQl9IGVsc2UgewoJCQkkbG9nW10gPSAiRm91bmQgZm9ybSAnc2VsZl9yZWdpc3Rlcl9mb3JtJy4gU2tpcHBpbmcgaW5zdGFsbGF0aW9uIG9mIGRlZmF1bHQgZm9ybS4iOwoJCX0KCgkJJHRhZ19oZWxwID0gJzx0eHA6bWVtX3NlbGZfcmVnaXN0ZXJfZm9ybSBmb3JtPSJzZWxmX3JlZ2lzdGVyX2Zvcm0iIC8+JzsKCQkkbG9nW10gPSAnRXhhbXBsZSB0YWcgdG8gdXNlIGluIHlvdXIgcGFnZSB0ZW1wbGF0ZS4nLmJyLgoJCQknPHRleHRhcmVhIHN0eWxlPSJ3aWR0aDo0MDBweDtoZWlnaHQ6NDBweDsiPicuaHRtbHNwZWNpYWxjaGFycygkdGFnX2hlbHApLic8L3RleHRhcmVhPic7CgoJCXJldHVybiBkb1dyYXAoJGxvZywndWwnLCdsaScpOwoJfQp9CgpmdW5jdGlvbiBtZW1fZ2V0X3VzZXJfdGFibGVfbmFtZSgpIHsKCSR1c2VfaWduX2RiID0gbWVtX2dldF9wcmVmKCdtZW1fc2VsZl91c2VfaWduX2RiJyk7CgoJJHRhYmxlX25hbWUgPSAndHhwX3VzZXJzJzsKCglpZiAoJHVzZV9pZ25fZGIpIHsKCQkkaWduX3VzZV9jdXN0b20gPSBtZW1fZ2V0X3ByZWYoJ2lnbl91c2VfY3VzdG9tJyk7CgkJaWYgKCRpZ25fdXNlX2N1c3RvbSAmJiAkaWduX3VzZV9jdXN0b21bJ3ZhbCddPT0nMScpIHsKCQkJJGlnbl91c2VyX2RiID0gbWVtX2dldF9wcmVmKCdpZ25fdXNlcl9kYicpOwoJCQlpZiAoJGlnbl91c2VyX2RiICYmICFlbXB0eSgkaWduX3VzZXJfZGJbJ3ZhbCddKSkKCQkJCSR0YWJsZV9uYW1lID0gJGlnbl91c2VyX2RiWyd2YWwnXTsKCQl9Cgl9CglyZXR1cm4gJHRhYmxlX25hbWU7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZnVuY3Rpb24gbWVtX3NlbGZfcmVnaXN0ZXJfZm9ybSgkYXR0cywkdGhpbmc9JycpCnsKCWdsb2JhbCAkdHhwYWM7CgoJJG5hbWV3YXJuID0gJHVzZXJ3YXJuID0gJGVtYWlsd2FybiA9ICcnOwoKCWV4dHJhY3QoZG9TbGFzaChwc2EoYXJyYXkoJ2V2ZW50Jywnc3RlcCcsJ25hbWUnLCdlbWFpbCcsJ3VzZXJuYW1lJywnYWRkcmVzcycsJ3Bob25lJywnbWVtX3NlbGZfcmVnaXN0ZXInKSkpKTsKCglleHRyYWN0KGxBdHRzKGFycmF5KAoJCSdjbGFzcycJCT0+IF9fRlVOQ1RJT05fXywKCQknZm9ybScJCT0+ICdzZWxmX3JlZ2lzdGVyX2Zvcm0nLAoJCSdzdWNjZXNzX2Zvcm0nCT0+ICdzZWxmX3JlZ2lzdGVyX3N1Y2Nlc3MnLAoJCSdlbWFpbF9mb3JtJwk9PiAnc2VsZl9yZWdpc3Rlcl9lbWFpbCcsCgkJJ3dyYXB0YWcnCT0+ICcnLAoJCSdpc2l6ZScJCT0+ICcyNScsCgkJJ2xhYmVsJwkJPT4gbWVtX3NlbGZfZ1R4dCgnc3VibWl0JyksCgkJJ25hbWV3YXJuJwk9PiBtZW1fc2VsZl9nVHh0KCduYW1lX3JlcXVpcmVkJyksCgkJJ3VzZXJ3YXJuJwk9PiBtZW1fc2VsZl9nVHh0KCd1c2VyX3JlcXVpcmVkJyksCgkJJ2VtYWlsd2FybicJPT4gbWVtX3NlbGZfZ1R4dCgnZW1haWxfcmVxdWlyZWQnKSwKCSksJGF0dHMpKTsKCgkkbmFtZSA9IHRyaW0oJG5hbWUpOwoJJHVzZXJuYW1lID0gdHJpbSgkdXNlcm5hbWUpOwoJJGVtYWlsID0gdHJpbSgkZW1haWwpOwoJJHBob25lID0gdHJpbSgkcGhvbmUpOwoJJGFkZHJlc3MgPSB0cmltKCRhZGRyZXNzKTsKCgkkc2F2ZWQgPSBmYWxzZTsKCglpZiAoJGV2ZW50PT0nc2VsZi1yZWcnICYmICRzdGVwPT0ncmVnaXN0ZXInKSB7CgkJaWYgKCFpc192YWxpZF9mb3JtKCkpIHsKCQkJJG5hbWV3YXJuID0gZW1wdHkoJG5hbWUpID8gJG5hbWV3YXJuIDogJyc7CgkJCSR1c2Vyd2FybiA9IGVtcHR5KCR1c2VybmFtZSkgPyAkdXNlcndhcm4gOiAnJzsKCQkJLy8gaWYgYWxsIGZpZWxkcyBhcmUgbm9uIGVtcHR5LCB0aGVuIHRoZSBlbWFpbCBhZGRyZXNzIGZhaWxlZCBmb3Igc29tZSByZWFzb24uCgkJCSRlbWFpbHdhcm4gPSBlbXB0eSgkZW1haWwpID8gJGVtYWlsd2FybiA6IChlbXB0eSgkbmFtZXdhcm4pIGFuZCBlbXB0eSgkdXNlcndhcm4pID8gJGVtYWlsd2FybiA6ICcnKTsKCQl9IGVsc2UgewoKCQkJJHJzID0gc2FmZV9maWVsZCgnbmFtZScsbWVtX2dldF91c2VyX3RhYmxlX25hbWUoKSwibmFtZT0neyR1c2VybmFtZX0nIik7CgoJCQlpZiAoZW1wdHkoJHJzKSkgewoJCQkJbWVtX3NlbGZfcmVnaXN0ZXJfc2F2ZSgpOwoJCQkJJHNhdmVkID0gdHJ1ZTsKCQkJfSBlbHNlIHsKCQkJCS8vIGRvbid0IGNoYW5nZSAkdXNlcndhcm4KCQkJCSRuYW1ld2FybiA9ICRlbWFpbHdhcm4gPSAnJzsKCQkJfQoJCX0KCX0gZWxzZSB7CgkJLy8gZG9uJ3Qgc2hvdyB0aGUgd2FybmluZ3MKCQkkbmFtZXdhcm4gPSAnJzsKCQkkdXNlcndhcm4gPSAnJzsKCQkkZW1haWx3YXJuID0gJyc7Cgl9CgoJaWYgKEAkc2F2ZWQpIHsKCQkkRm9ybSA9IGZldGNoX2Zvcm0oJHN1Y2Nlc3NfZm9ybSk7CgkJJG91dCA9IHBhcnNlKCRGb3JtKTsKCX0gZWxzZSB7CgoJCSRGb3JtID0gZmV0Y2hfZm9ybSgkZm9ybSk7CgoJCSR2YWxzID0gYXJyYXkoCgkJCSduYW1lX3dhcm4nCQk9PiAkbmFtZXdhcm4sCgkJCSd1c2VyX3dhcm4nCQk9PiAkdXNlcndhcm4sCgkJCSdlbWFpbF93YXJuJwk9PiAkZW1haWx3YXJuLAoJCQknbmFtZV9pbnB1dCcJPT4gZklucHV0KCd0ZXh0JywnbmFtZScsICAkbmFtZSwgJ3JlZ2lzdGVyX25hbWVfaW5wdXQnLCcnLCcnLCRpc2l6ZSwiMCIsICdtZW1fbmFtZV9pbnB1dCcpLAoJCQkndXNlcl9pbnB1dCcJPT4gZklucHV0KCd0ZXh0JywndXNlcm5hbWUnLCAkdXNlcm5hbWUsICdyZWdpc3Rlcl91c2VyX2lucHV0JywgJycsICcnLCAkaXNpemUsICIwIiwgJ21lbV91c2VyX2lucHV0JyksCgkJCSdlbWFpbF9pbnB1dCcJPT4gZklucHV0KCd0ZXh0JywnZW1haWwnLCAkZW1haWwsJ3JlZ2lzdGVyX2VtYWlsX2lucHV0JywnJywnJywkaXNpemUsIjAiLCAnbWVtX2VtYWlsX2lucHV0JyksCgkJCSdzdWJtaXQnCQk9PiBmSW5wdXQoJ3N1Ym1pdCcsJ3N1Ym1pdCcsbWVtX3NlbGZfZ1R4dCgkbGFiZWwpLCdidXR0b24nKSwKCQkJJ3Bob25lX2lucHV0Jwk9PiBmSW5wdXQoJ3RleHQnLCdwaG9uZScsICRwaG9uZSwgJ3JlZ2lzdGVyX3Bob25lX2lucHV0JywgJycsICcnLCAkaXNpemUsICIwIiwgJ21lbV9waG9uZV9pbnB1dCcpLAoJCQknYWRkcmVzc19pbnB1dCcJPT4gZklucHV0KCd0ZXh0JywnYWRkcmVzcycsICRhZGRyZXNzLCAncmVnaXN0ZXJfYWRkcmVzc19pbnB1dCcsICcnLCAnJywgJGlzaXplLCAiMCIsICdtZW1fYWRkcmVzc19pbnB1dCcpLAoJCSk7CgoJCWZvcmVhY2ggKCR2YWxzIGFzICRhPT4kYikgewoJCQkkRm9ybSA9IHN0cl9yZXBsYWNlKCc8dHhwOm1lbV8nLiRhLicgLz4nLCRiLCRGb3JtKTsKCQl9CgoJCSRhY3Rpb25fdXJsID0gJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ107CgkJJHFzID0gc3RycG9zKCRhY3Rpb25fdXJsLCc/Jyk7CgkJaWYgKCRxcykgJGFjdGlvbl91cmwgPSBzdWJzdHIoJGFjdGlvbl91cmwsIDAsICRxcyk7CgoJCSRvdXQgPQluLm4uIjxmb3JtIGVuY3R5cGU9J211bHRpcGFydC9mb3JtLWRhdGEnIGFjdGlvbj0neyRhY3Rpb25fdXJsfScgbWV0aG9kPSdwb3N0Jz4iIC4KCQkJCWVJbnB1dCgnc2VsZi1yZWcnKSAuIHNJbnB1dCgncmVnaXN0ZXInKSAuIGhJbnB1dCgnZW1haWxfZm9ybScsJGVtYWlsX2Zvcm0pIC4gaElucHV0KCdtZW1fc2VsZl9yZWdpc3RlcicsJ3JlZ2lzdGVyJykgLgoJCQkJcGFyc2UoJEZvcm0pIC4KCQkJCSI8L2Zvcm0+Ii5uOwoJfQoKCXJldHVybiBkb1RhZygkb3V0LCR3cmFwdGFnLCRjbGFzcyk7Cgp9CgpmdW5jdGlvbiBtZW1fZ2V0X2V4dHJhX3VzZXJfY29sdW1uc19pbnNlcnRfc3RyaW5nKCkgewoJJHh0cmFfY29sdW1ucyA9IG1lbV9nZXRfZXh0cmFfdXNlcl9jb2x1bW5zKCk7CgoJJHh0cmEgPSAnJzsKCglmb3JlYWNoICgkeHRyYV9jb2x1bW5zIGFzICR4Y29sKSB7CgkJJG5hbWUgPSAkeGNvbFsnRmllbGQnXTsKCQkkdHlwZSA9IHN0cnRvbG93ZXIoJHhjb2xbJ1R5cGUnXSk7CgkJJHZhbCA9IGdwcygkbmFtZSk7CgoJCWlmICggc3Ryc3RyKCR0eXBlLCdpbnQnKQoJCQkJfHwgJHR5cGU9PSdmbG9hdCcKCQkJCXx8ICR0eXBlPT0nZGVjaW1hbCcKCQkJCXx8ICR0eXBlPT0nZG91YmxlJwoJCQkJfHwgJHR5cGU9PSdib29sJyApIHsKCQkJLy8gZG9uJ3QgcXVvdGUgdmFsdWUKCQkJJHh0cmEgLj0gIiwgeyRuYW1lfT0iIC4gZG9TbGFzaCgkdmFsKTsKCQl9IGVsc2UgewoJCQkvLyBxdW90ZSB2YWx1ZQoJCQkkeHRyYSAuPSAiLCB7JG5hbWV9PSciIC4gZG9TbGFzaCgkdmFsKSAuIiciOwoJCX0KCX0KCglyZXR1cm4gJHh0cmE7Cn0KCmZ1bmN0aW9uIG1lbV9nZXRfZXh0cmFfdXNlcl9jb2x1bW5zKCkKewoJc3RhdGljICRkZWZhdWx0X2NvbHVtbnMgPSBhcnJheSgndXNlcl9pZCcsJ25hbWUnLCdwYXNzJywnUmVhbE5hbWUnLCdlbWFpbCcsJ3ByaXZzJywnbGFzdF9hY2Nlc3MnLCdub25jZScpOwoJc3RhdGljICR4dHJhX2NvbHVtbnMgPSBmYWxzZTsKCglpZiAoaXNfYXJyYXkoJHh0cmFfY29sdW1ucykpCgkJcmV0dXJuICR4dHJhX2NvbHVtbnM7CgoJJHRhYmxlX25hbWUgPSBtZW1fZ2V0X3VzZXJfdGFibGVfbmFtZSgpOwoJJHR4cGRlc2MgPSBnZXRSb3dzKCdkZXNjcmliZSAnLlBGWC4gJHRhYmxlX25hbWUpOwoKCSR4dHJhX2NvbHMgPSBhcnJheSgpOwoKCSRkY29scyA9ICRkZWZhdWx0X2NvbHVtbnM7CgoJZm9yZWFjaCgkdHhwZGVzYyBhcyAkcikgewoJCWlmICggIWluX2FycmF5KCRyWydGaWVsZCddLCAkZGVmYXVsdF9jb2x1bW5zKSApCgkJCSR4dHJhX2NvbHNbXSA9ICRyOwoJfQoKCXJldHVybiAkeHRyYV9jb2xzOwp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmZ1bmN0aW9uIG1lbV9zZWxmX3JlZ2lzdGVyX3NhdmUoKQp7CglnbG9iYWwgJG1lbV9zZWxmLCRzaXRlbmFtZSwkbWVtX3Byb2ZpbGU7CgoJZXh0cmFjdChkb1NsYXNoKHBzYShhcnJheSgnbmFtZScsJ2VtYWlsJywndXNlcm5hbWUnLCdlbWFpbF9mb3JtJywnYWRkcmVzcycsJ3Bob25lJywnbWVtX3NlbGZfcmVnaXN0ZXInLCdsb2dpbl91cmwnKSkpKTsKCWV4dHJhY3QoJG1lbV9zZWxmKTsKCglpZiAoJG1lbV9zZWxmX3JlZ2lzdGVyICE9ICdyZWdpc3RlcicpIHJldHVybiAnJzsKCgkkcHcgPSBnZW5lcmF0ZV9wYXNzd29yZCg2KTsKCglpZiAoISRtZW1fcHJvZmlsZSkgJG1lbV9wcm9maWxlID0gYXJyYXkoKTsKCgkkbWVtX3Byb2ZpbGVbJ25vbmNlJ10gPSAkbm9uY2UgPSBtZDUoIHVuaXFpZCggcmFuZCgpLCB0cnVlICkgKTsKCgkkbWVtX3Byb2ZpbGVbJ1JlYWxOYW1lJ10gPSAkbmFtZSA9IHRyaW0oJG5hbWUpOwoJJG1lbV9wcm9maWxlWydlbWFpbCddID0gJGVtYWlsID0gdHJpbSgkZW1haWwpOwoJJG1lbV9wcm9maWxlWyduYW1lJ10gPSAkdXNlcm5hbWUgPSB0cmltKCR1c2VybmFtZSk7CgkkbWVtX3Byb2ZpbGVbJ3ByaXZzJ10gPSAkbmV3X3VzZXJfcHJpdjsKCgkkeHRyYV9jb2x1bW5zID0gbWVtX2dldF9leHRyYV91c2VyX2NvbHVtbnMoKTsKCglmb3JlYWNoKCR4dHJhX2NvbHVtbnMgYXMgJGMpIHsKCQkkY19uYW1lID0gdHJpbSggJGNbJ0ZpZWxkJ10gKTsKCgkJJG1lbV9wcm9maWxlWyRjX25hbWVdID0gZ3BzKCRjX25hbWUpOwoJfQoKCSRycyA9IGZhbHNlOwoKCSR4dHJhID0gbWVtX2dldF9leHRyYV91c2VyX2NvbHVtbnNfaW5zZXJ0X3N0cmluZygpOwoKCSRycyA9IHNhZmVfaW5zZXJ0KAoJCW1lbV9nZXRfdXNlcl90YWJsZV9uYW1lKCksCgkJInByaXZzICAgID0gJyRuZXdfdXNlcl9wcml2JywKCQkgbmFtZSAgICAgPSAnJHVzZXJuYW1lJywKCQkgZW1haWwgICAgPSAnJGVtYWlsJywKCQkgUmVhbE5hbWUgPSAnJG5hbWUnLAoJCSBwYXNzICAgICA9ICBwYXNzd29yZChsb3dlcignJHB3JykpLAoJCSBub25jZSAgICA9ICckbm9uY2UnIiAuICR4dHJhCgkpOwoKCWlmICgkcnMpIHsKCQkkbWVtX3Byb2ZpbGVbJ3VzZXJfaWQnXSA9ICRyczsKCQkkbWVtX3Byb2ZpbGVbJ2xhc3RfYWNjZXNzJ10gPSAwOwoKCQlpZiAoJGVtYWlsX2Zvcm0pIHsKCQkJJG1lc3NhZ2UgPSBmZXRjaCgnRm9ybScsJ3R4cF9mb3JtJywnbmFtZScsJGVtYWlsX2Zvcm0pOwoKCQkJaWYgKGlzX2FycmF5KCRhZG1pbl9uYW1lKSkKCQkJCSRhZG1pbl9uYW1lID0gJGFkbWluX25hbWVbJ3ZhbCddOwoJCQlpZiAoaXNfYXJyYXkoJGFkbWluX2VtYWlsKSkKCQkJCSRhZG1pbl9lbWFpbCA9ICRhZG1pbl9lbWFpbFsndmFsJ107CgoJCQlpZiAoZW1wdHkoJGxvZ2luX3VybCkpCgkJCQkkbG9naW5fdXJsID0gcnRyaW0oaHUsJy8nKS4nL3RleHRwYXR0ZXJuL2luZGV4LnBocCc7CgoJCQkkdmFscyA9IGFycmF5KAoJCQkJJ2FkbWluX25hbWUnCT0+CSRhZG1pbl9uYW1lLAoJCQkJJ2FkbWluX2VtYWlsJwk9PgkkYWRtaW5fZW1haWwsCgkJCQknbmFtZScJCT0+CSRuYW1lLAoJCQkJJ3VzZXJuYW1lJwk9PgkkdXNlcm5hbWUsCgkJCQknZW1haWwnCQk9PgkkZW1haWwsCgkJCQkncGFzc3dvcmQnCT0+CSRwdywKCQkJCSdzaXRlbmFtZScJPT4JJHNpdGVuYW1lLAoJCQkJJ2xvZ2ludXJsJwk9PgkkbG9naW5fdXJsLAoJCQkJJ3NpdGV1cmwnCT0+CWh1LAoJCQkJJ2FkZHJlc3MnCT0+CSRhZGRyZXNzLAoJCQkJJ3Bob25lJwkJPT4JJHBob25lCgkJCSk7CgoJCQlmb3JlYWNoICgkdmFscyBhcyAkYT0+JGIpIHsKCQkJCUAkbWVzc2FnZSA9IHN0cl9yZXBsYWNlKCc8dHhwOm1lbV8nLiRhLicgLz4nLCRiLCRtZXNzYWdlKTsKCQkJfQoKCQkJJG1lc3NhZ2UgPSBwYXJzZSgkbWVzc2FnZSk7CgoJCQkkZW1haWxib2R5ID0gIkZyb206IHskYWRtaW5fbmFtZX0gPHskYWRtaW5fZW1haWx9PlxyXG4iCgkJCQkuIkJjYzogeyRhZG1pbl9lbWFpbH1cclxuIgoJCQkJLiJSZXBseS1UbzogeyRhZG1pbl9lbWFpbH1cclxuIgoJCQkJLiJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XHJcbiIKCQkJCS4iQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVwiVVRGLThcIlxyXG4iOwoKCQkJJHNlbnQgPSBtYWlsKCRlbWFpbCwgIlskc2l0ZW5hbWVdICIubWVtX3NlbGZfZ1R4dCgneW91cl9sb2dpbl9pbmZvJyksICRtZXNzYWdlLCAkZW1haWxib2R5KTsKCgkJCSRtZW1fc2VsZlsnZW1haWxfc3RhdHVzJ10gPSAkc2VudDsKCQkJJG1lbV9zZWxmWydlbWFpbF9tZXNzYWdlJ10gPSAkbWVzc2FnZTsKCgkJCWlmICgkc2VudCkgewoJCQkJJGNvb2tpZXRpbWUgPSB0aW1lKCkgKyAoMzY1KjI0KjM2MDApOwoJCQkJc2V0Y29va2llKCJ0eHBfc2VsZl9yZWdpc3RlcmVkIiwgIjEiLCAgJGNvb2tpZXRpbWUsICIvIik7CgoJCQkJJG1lbV9zZWxmWydzdGF0dXNfbWVzc2FnZSddID0gbWVtX3NlbGZfZ1R4dCgncGFzc3dvcmRfc2VudF90bycpLnNwLiRlbWFpbDsKCQkJfSBlbHNlIHsKCQkJCS8vIGZhaWxlZCB0byBzZW5kIGVtYWlsCgkJCX0KCQl9Cgl9IGVsc2UgewoJCSRtZW1fc2VsZlsnc3RhdHVzX21lc3NhZ2UnXSA9IG1lbV9zZWxmX2dUeHQoJ2Vycm9yX2FkZGluZ19uZXdfYXV0aG9yJyk7Cgl9Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZnVuY3Rpb24gc2VsZl9yZWdpc3Rlcl9lbWFpbF9tZXNzYWdlKCRhdHRzKQp7CglnbG9iYWwgJG1lbV9zZWxmOwoJcmV0dXJuICRtZW1fc2VsZlsnZW1haWxfbWVzc2FnZSddOwp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmZ1bmN0aW9uIHNlbGZfcmVnaXN0ZXJfc3RhdHVzX21lc3NhZ2UoJGF0dHMpCnsKCWdsb2JhbCAkbWVtX3NlbGY7CglyZXR1cm4gJG1lbV9zZWxmWydzdGF0dXNfbWVzc2FnZSddOwp9CgoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpmdW5jdGlvbiBpZl9tZXNzYWdlX3NlbnQoJGF0dHMsJHRoaW5nKQp7CglnbG9iYWwgJG1lbV9zZWxmOwoJJGNvbmRpdGlvbiA9ICgkbWVtX3NlbGZbJ2VtYWlsX3N0YXR1cyddKTsKCXJldHVybiBwYXJzZShFdmFsRWxzZSgkdGhpbmcsICRjb25kaXRpb24pKTsKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpmdW5jdGlvbiBpZl9zZWxmX3JlZ2lzdGVyZWQoJGF0dHMsJHRoaW5nKQp7CglnbG9iYWwgJG1lbV9zZWxmLCR0eHBfdXNlcjsKCSRjb25kaXRpb24gPSAoJG1lbV9zZWxmWydzdGF0dXMnXSBvciAkbWVtX3NlbGZbJ2Zvcm1fdmFsaWQnXSBvciAhZW1wdHkoJF9DT09LSUVbJ3R4cF9zZWxmX3JlZ2lzdGVyZWQnXSkgb3IgKGlzc2V0KCR0eHBfdXNlcikgYW5kICFlbXB0eSgkdHhwX3VzZXIpKSApOwoJcmV0dXJuIHBhcnNlKEV2YWxFbHNlKCR0aGluZywgJGNvbmRpdGlvbikpOwp9CgovLyBhZGRlZCB0byB0eHBsaWJfbWlzYwppZiAoIWZ1bmN0aW9uX2V4aXN0cygnaXNfdmFsaWRfZW1haWwnKSkgewpmdW5jdGlvbiBpc192YWxpZF9lbWFpbCgkZW1haWwpCnsKCSRhZGRyID0gZXhwbG9kZSgnQCcsJGVtYWlsKTsKCgkkaG9zdCA9ICRhZGRyWzFdOwoKCWlmICgkaG9zdCAhPSBnZXRob3N0YnluYW1lKCRob3N0KSBhbmQgZXJlZ2koIl5bMC05YS16XShbLV8ufl0/WzAtOWEtel0pKiQiLCRhZGRyWzBdKSkKCQlyZXR1cm4gdHJ1ZTsKCglyZXR1cm4gZmFsc2U7Cn0KfQoKZnVuY3Rpb24gaXNfdmFsaWRfZm9ybSgpCnsKCWV4dHJhY3QoZG9TbGFzaChwc2EoYXJyYXkoJ25hbWUnLCdlbWFpbCcsJ3VzZXJuYW1lJywnbWVtX3NlbGZfcmVnaXN0ZXInKSkpKTsKCgkkbmFtZSA9IHRyaW0oJG5hbWUpOwoJJGVtYWlsID0gdHJpbSgkZW1haWwpOwoJJHVzZXJuYW1lID0gdHJpbSgkdXNlcm5hbWUpOwoKCWlmICgkbWVtX3NlbGZfcmVnaXN0ZXI9PSdyZWdpc3RlcicpIHsKCQlpZiAoIShlbXB0eSgkbmFtZSkgfHwgZW1wdHkoJHVzZXJuYW1lKSB8fCBlbXB0eSgkZW1haWwpKSAmJiBpc192YWxpZF9lbWFpbCgkZW1haWwpKSB7CgkJCXJldHVybiB0cnVlOwoJCX0KCX0KCglyZXR1cm4gZmFsc2U7Cn0KCgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gVXNlciBTaWRlIFByb2ZpbGUgYW5kIFBhc3N3b3JkIENoYW5nZSBGb3JtcwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmZ1bmN0aW9uIG1lbV9jaGFuZ2VfcGFzc3dvcmRfZm9ybSgkYXR0cywkdGhpbmc9JycpCnsKCXJldHVybiBtZW1fY2hhbmdlX3Bhc3NfZm9ybSgkYXR0cywkdGhpbmcpOwp9CmZ1bmN0aW9uIG1lbV9jaGFuZ2VfcGFzc19mb3JtKCRhdHRzLCR0aGluZz0nJykKewoJZ2xvYmFsICRpZ25fdXNlciwkdHhwX3VzZXIsJHNpdGVuYW1lLCRtZW1fcHJvZmlsZTsKCglleHRyYWN0KGxBdHRzKGFycmF5KAoJCSdjbGFzcycJCT0+ICdtZW1fcGFzc3dvcmRfZm9ybScsCgkJJ3dyYXB0YWcnCT0+ICcnLAoJCSdmb3JtJwkJPT4gJycsCgkJJ2Zvcm1fbWFpbCcJPT4gJycKCSksJGF0dHMpKTsKCgkkb3V0ID0gJyc7CgoJaWYgKGlzc2V0KCRpZ25fdXNlcikpICR0eHBfdXNlciA9ICRpZ25fdXNlcjsKCgkkc3RlcCA9IGdwcygnc3RlcCcpOwoKCWlmIChpc3NldCgkc3RlcCkgJiYgJHN0ZXA9PSdtZW1fY2hhbmdlX3Bhc3MnKSB7CgkJJG5ld19wYXNzID0gZ3BzKCduZXdfcGFzcycpOwoKCQkkcnMgPSBzYWZlX3VwZGF0ZSgKCQkJbWVtX2dldF91c2VyX3RhYmxlX25hbWUoKSwKCQkJInBhc3MgPSBwYXNzd29yZChsb3dlcignJG5ld19wYXNzJykpIiwKCQkJIm5hbWU9JyR0eHBfdXNlciciCgkJKTsKCgkJaWYgKCRycykgewoKCQkJLy8gc3VjY2Vzc2Z1bAoJCQkkbWVtX3Byb2ZpbGUgPSBzYWZlX3JvdygnKicsbWVtX2dldF91c2VyX3RhYmxlX25hbWUoKSwibmFtZSA9ICd7JHR4cF91c2VyfSciKTsKCgkJCWlmICgkbWVtX3Byb2ZpbGUpIHsKCQkJCSRtZW1fcHJvZmlsZVsnbmV3X3Bhc3MnXSA9ICRuZXdfcGFzczsKCgkJCQlpZiAoIWVtcHR5KCRmb3JtX21haWwpKQoJCQkJCSRtZXNzYWdlID0gZmV0Y2hfZm9ybSgkZm9ybV9tYWlsKTsKCQkJCWlmIChlbXB0eSgkbWVzc2FnZSkpIHsKCQkJCQkkbWVzc2FnZSA9IG1lbV9zZWxmX2dUeHQoJ2dyZWV0aW5nJykuJyA8dHhwOm1lbV9yZWFsbmFtZSAvPiwnLiJcclxuIi4KCQkJCQkJbWVtX3NlbGZfZ1R4dCgneW91cl9wYXNzd29yZF9pcycpLiI6IDx0eHA6bWVtX3Bhc3N3b3JkIC8+XHJcbiIuIlxyXG4iLgoJCQkJCQltZW1fc2VsZl9nVHh0KCdsb2dfaW5fYXQnKS4nICcuaHUuJ3RleHRwYXR0ZXJuL2luZGV4LnBocCc7CgkJCQl9CgoJCQkJJHZhbHMgPSBhcnJheSgKCQkJCQkncmVhbG5hbWUnCT0+CSRtZW1fcHJvZmlsZVsnUmVhbE5hbWUnXSwKCQkJCQkncGFzc3dvcmQnCT0+CSRtZW1fcHJvZmlsZVsnbmV3X3Bhc3MnXSwKCQkJCSk7CgoJCQkJZm9yZWFjaCAoJHZhbHMgYXMgJGE9PiRiKSB7CgkJCQkJJG1lc3NhZ2UgPSBzdHJfcmVwbGFjZSgnPHR4cDptZW1fJy4kYS4nIC8+JywkYiwkbWVzc2FnZSk7CgkJCQl9CgoJCQkJJG1lc3NhZ2UgPSBwYXJzZSgkbWVzc2FnZSk7CgoJCQkJLy8gZW1haWwgcGFzc3dvcmQKCQkJCWlmICh0eHBNYWlsKCRtZW1fcHJvZmlsZVsnZW1haWwnXSwgIlskc2l0ZW5hbWVdICIubWVtX3NlbGZfZ1R4dCgneW91cl9uZXdfcGFzc3dvcmQnKSwgJG1lc3NhZ2UpKQoJCQkJCSRvdXQgPSBtZW1fc2VsZl9nVHh0KCdwYXNzd29yZF9jaGFuZ2VkJyk7CgkJCQllbHNlCgkJCQkJJG91dCA9IG1lbV9zZWxmX2dUeHQoJ3Bhc3N3b3JkX2NoYW5nZV9mYWlsZWQnKTsKCQkJfSBlbHNlIHJldHVybiBteXNxbF9lcnJvcigpOwoJCX0gZWxzZSB7CgkJCXJldHVybiBteXNxbF9lcnJvcigpOwoJCX0KCX0gZWxzZSB7CgkJJEZvcm0gPSAkdGhpbmc7CgkJaWYgKCFlbXB0eSgkZm9ybSkpCgkJCSRGb3JtID0gZmV0Y2hfZm9ybSgkZm9ybSk7CgkJaWYgKGVtcHR5KCRGb3JtKSkgewoJCQkkRm9ybSA9ICI8aDM+Q2hhbmdlIFBhc3N3b3JkPC9oMz48ZGl2Pjx0eHA6bWVtX3Bhc3N3b3JkX2lucHV0IC8+PHR4cDptZW1fc3VibWl0IC8+PC9kaXY+IjsKCQl9CgkJJG91dCA9IAkiPGZvcm0gYWN0aW9uPSd7JF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ119JyBtZXRob2Q9J3Bvc3QnPiIuCgkJCQlwYXJzZSgkRm9ybSkuCgkJCQllSW5wdXQoJ21lbV91c2VyX3dvcmtzcGFjZScpLnNJbnB1dCgnbWVtX2NoYW5nZV9wYXNzJykuCgkJCQkiPC9mb3JtPiI7CgovLwkJCQlncmFmKG1lbV9zZWxmX2dUeHQoJ25ld19wYXNzd29yZCcpLicgJy5mSW5wdXQoJ3Bhc3N3b3JkJywnbmV3X3Bhc3MnLCcnLCdlZGl0JywnJywnJywnMjAnLCcxJykuCgoJfQoKCXJldHVybiAkb3V0Owp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmZ1bmN0aW9uIG1lbV91c2VyX2VkaXRfZm9ybSgkYXR0cywgJHRoaW5nKQp7CglnbG9iYWwgJHR4cGNmZywkdHhwX3VzZXIsJGlnbl91c2VyLCRtZW1fcHJvZmlsZTsKCglpZiAoaXNzZXQoJGlnbl91c2VyKSkgJHR4cF91c2VyID0gJGlnbl91c2VyOwoKCWV4dHJhY3QobEF0dHMoYXJyYXkoCgkJJ2NsYXNzJwkJPT4gJ21lbV91ZWRpdF9mb3JtJywKCQknd3JhcHRhZycJPT4gJycsCgkJJ2Zvcm0nCQk9PiAnJwoJCSksICRhdHRzKSk7CgoJJG91dCA9ICcnOwoJJG1lc3NhZ2UgPSAnJzsKCgkkc3RlcCA9IGdwcygnc3RlcCcpOwoJJG5ld19wYXNzID0gZ3BzKCduZXdfcGFzcycpOwoKCWlmIChpc3NldCgkc3RlcCkgJiYgJHN0ZXA9PSdzYXZlX3VzZXJfcHJvZmlsZScpIHsKCQlleHRyYWN0KGdwc2EoYXJyYXkoJ2VtYWlsJywnbmFtZScsJ1JlYWxOYW1lJywnYWRkcmVzcycsJ3Bob25lJykpKTsKCgkJJHh0cmEgPSBtZW1fZ2V0X2V4dHJhX3VzZXJfY29sdW1uc19pbnNlcnRfc3RyaW5nKCk7CgoJCSRycyA9IHNhZmVfdXBkYXRlKG1lbV9nZXRfdXNlcl90YWJsZV9uYW1lKCksCgkJCSJlbWFpbCA9ICd7JGVtYWlsfScsIFJlYWxOYW1lID0gJ3skUmVhbE5hbWV9JyIgLiAkeHRyYSwKCQkJIm5hbWUgPSAneyR0eHBfdXNlcn0nIik7CgoJCWlmICgkcnMpIHsKCQkJJG1lc3NhZ2UgPSBtZW1fc2VsZl9nVHh0KCdzYXZlZF91c2VyX3Byb2ZpbGUnKTsKCQl9IGVsc2UgewoJCQkkbWVzc2FnZSA9IG15c3FsX2Vycm9yKCk7CgkJfQoJfQoKCSRtZW1fcHJvZmlsZSA9IHNhZmVfcm93KCcqJyxtZW1fZ2V0X3VzZXJfdGFibGVfbmFtZSgpLCJuYW1lID0gJ3skdHhwX3VzZXJ9JyIpOwoKCWlmICgkbWVtX3Byb2ZpbGUpIHsKCQkkRm9ybSA9ICR0aGluZzsKCQlpZiAoIWVtcHR5KCRmb3JtKSkKCQkJJEZvcm0gPSBmZXRjaF9mb3JtKCRmb3JtKTsKCgkJJEZvcm0gPSBlcmVnaV9yZXBsYWNlKCc8dHhwOm1lbV9tZXNzYWdlIC8+JywkbWVzc2FnZSwkRm9ybSk7CgoJCSRvdXQgPSAJIjxmb3JtIGFjdGlvbj0neyRfU0VSVkVSWydSRVFVRVNUX1VSSSddfScgbWV0aG9kPSdwb3N0Jz4iLgoJCQkJcGFyc2UoJEZvcm0pLgoJCQkJZUlucHV0KCdtZW1fdXNlcl93b3Jrc3BhY2UnKS5zSW5wdXQoJ3NhdmVfdXNlcl9wcm9maWxlJykuCgkJCQkiPC9mb3JtPiI7Cgl9CgoJcmV0dXJuIGRvVGFnKCRvdXQsJHdyYXB0YWcsJGNsYXNzKTsKfQoKZnVuY3Rpb24gbWVtX3Byb2ZpbGUoJGF0dHMpCnsKCWdsb2JhbCAkbWVtX3Byb2ZpbGUsJHR4cF91c2VyLCRpZ25fdXNlcjsKCglpZiAoaXNzZXQoJGlnbl91c2VyKSkgJHR4cF91c2VyID0gJGlnbl91c2VyOwoKCWV4dHJhY3QoJGF0dHMpOwoJaWYgKCFpc19hcnJheSgkbWVtX3Byb2ZpbGUpICYmICR0eHBfdXNlcikKCQkkbWVtX3Byb2ZpbGUgPSBzYWZlX3JvdygnKicsbWVtX2dldF91c2VyX3RhYmxlX25hbWUoKSwibmFtZSA9ICd7JHR4cF91c2VyfSciKTsKCglpZiAoJG1lbV9wcm9maWxlKQoJCXJldHVybiBhcnJheV9rZXlfZXhpc3RzKCR2YXIsJG1lbV9wcm9maWxlKSA/ICRtZW1fcHJvZmlsZVskdmFyXSA6ICcnOwoJcmV0dXJuICcnOwp9CmZ1bmN0aW9uIG1lbV9zdWJtaXQoJGF0dHMpCnsKCWV4dHJhY3QoJGF0dHMpOwoJJGNsYXNzID0gaXNzZXQoJGNsYXNzKSA/ICRjbGFzcyA6ICdzbWFsbGVyYm94JzsKCSR2YWx1ZSA9IGlzc2V0KCR2YWx1ZSkgPyAkdmFsdWUgOiBtZW1fc2VsZl9nVHh0KCdzYXZlJyk7CglyZXR1cm4gZklucHV0KCJzdWJtaXQiLCdzYXZlJyxodG1sc3BlY2lhbGNoYXJzKCR2YWx1ZSksJGNsYXNzKTsKfQpmdW5jdGlvbiBtZW1fcGFzc3dvcmRfaW5wdXQoJGF0dHMpCnsKCWdsb2JhbCAkbWVtX3Byb2ZpbGU7CglleHRyYWN0KCRhdHRzKTsKCSRpc2l6ZSA9IGlzc2V0KCRpc2l6ZSkgPyAkaXNpemUgOiAyMDsKCSRjbGFzcyA9IGlzc2V0KCRjbGFzcykgPyAkY2xhc3MgOiAnZWRpdCc7CgoJcmV0dXJuIGZJbnB1dCgncGFzc3dvcmQnLCduZXdfcGFzcycsJycsJGNsYXNzKTsKfQpmdW5jdGlvbiBtZW1fcmVhbG5hbWVfaW5wdXQoJGF0dHMpCnsKCWdsb2JhbCAkbWVtX3Byb2ZpbGU7CglleHRyYWN0KCRhdHRzKTsKCSRpc2l6ZSA9IGlzc2V0KCRpc2l6ZSkgPyAkaXNpemUgOiAyMDsKCSRjbGFzcyA9IGlzc2V0KCRjbGFzcykgPyAkY2xhc3MgOiAnZWRpdCc7CgoJcmV0dXJuIGZJbnB1dCgndGV4dCcsJ1JlYWxOYW1lJyxodG1sc3BlY2lhbGNoYXJzKCRtZW1fcHJvZmlsZVsnUmVhbE5hbWUnXSksJGNsYXNzKTsKfQpmdW5jdGlvbiBtZW1fZW1haWxfaW5wdXQoJGF0dHMpCnsKCWdsb2JhbCAkbWVtX3Byb2ZpbGU7CglleHRyYWN0KCRhdHRzKTsKCSRpc2l6ZSA9IGlzc2V0KCRpc2l6ZSkgPyAkaXNpemUgOiAyMDsKCSRjbGFzcyA9IGlzc2V0KCRjbGFzcykgPyAkY2xhc3MgOiAnZWRpdCc7CgoJcmV0dXJuIGZJbnB1dCgndGV4dCcsJ2VtYWlsJyxodG1sc3BlY2lhbGNoYXJzKCRtZW1fcHJvZmlsZVsnZW1haWwnXSksJGNsYXNzKTsKfQpmdW5jdGlvbiBtZW1fcGhvbmVfaW5wdXQoJGF0dHMpCnsKCWdsb2JhbCAkbWVtX3Byb2ZpbGU7CglleHRyYWN0KCRhdHRzKTsKCSRpc2l6ZSA9IGlzc2V0KCRpc2l6ZSkgPyAkaXNpemUgOiAyMDsKCSRjbGFzcyA9IGlzc2V0KCRjbGFzcykgPyAkY2xhc3MgOiAnZWRpdCc7CgoJcmV0dXJuIGZJbnB1dCgndGV4dCcsJ3Bob25lJyxodG1sc3BlY2lhbGNoYXJzKCRtZW1fcHJvZmlsZVsncGhvbmUnXSksJGNsYXNzKTsKfQpmdW5jdGlvbiBtZW1fYWRkcmVzc19pbnB1dCgkYXR0cykKewoJZ2xvYmFsICRtZW1fcHJvZmlsZTsKCWV4dHJhY3QoJGF0dHMpOwoJJGlzaXplID0gaXNzZXQoJGlzaXplKSA/ICRpc2l6ZSA6IDIwOwoJJGNsYXNzID0gaXNzZXQoJGNsYXNzKSA/ICRjbGFzcyA6ICdlZGl0JzsKCglyZXR1cm4gJzx0ZXh0YXJlYSBjbGFzcz0iJy4kY2xhc3MuJyIgbmFtZT0iYWRkcmVzcyI+Jy5odG1sc3BlY2lhbGNoYXJzKCRtZW1fcHJvZmlsZVsnYWRkcmVzcyddKS4nPC90ZXh0YXJlYT4nOwp9CgpmdW5jdGlvbiBtZW1fc2VsZl91c2VyX2NvdW50KCRhdHRzKQp7CglnbG9iYWwgJG1lbV9zZWxmOwoKCWV4dHJhY3QobEF0dHMoYXJyYXkoCgkJJ3VzZXJfbGV2ZWxzJwk9PiAnMCwxLDIsMyw0LDUsNicsCgkJJ3dyYXB0YWcnCT0+ICcnLAoJCSdjbGFzcycJCT0+ICcnCgkpLCRhdHRzKSk7CgoJaWYgKCFlbXB0eSgkdXNlcl9sZXZlbHMpIHx8ICR1c2VyX2xldmVscz09JzAnKQoJCSR1c2VyX2xldmVscyA9IGRvU2xhc2goc3BsaXQoJywnLCR1c2VyX2xldmVscykpOwoJZWxzZQoJCSR1c2VyX2xldmVscyA9IGFycmF5KCRtZW1fc2VsZlsnbmV3X3VzZXJfcHJpdiddKTsKCgkkbGV2ZWxzID0gam9pbignLCcsJHVzZXJfbGV2ZWxzKTsKCSRjb3VudCA9IHNhZmVfZmllbGQoJ0NPVU5UKCopJywgbWVtX2dldF91c2VyX3RhYmxlX25hbWUoKSwgInByaXZzIElOICh7JGxldmVsc30pIik7CgoJcmV0dXJuIGRvVGFnKCRjb3VudCwkd3JhcHRhZywkY2xhc3MpOwp9CiI7czozOiJtZDUiO3M6MzI6IjNhZDg4MGFiMjJmM2NhZmYxZDA4M2YxYWQ2MTE4ZjA1Ijt9

TextPattern строить и жить помогает! Кстати, пишу плагины на заказ. ICQ 155-08-081. В асю, пожалуйста, по поводу заказов или платных консультаций (10$ час). Остальные вопросы в форум или на почту.

Неактивен

 

#7 07-12-2007 19:52:13

snowman
добро
Зарегистрирован: 11-03-2007
Сообщений: 41

Re: mem_self_register

Ну, вот хороший же плагин! Черт, ну почему не могу с ним совладать? Уже устал биться головой об стенку!!! Как бы я не ухищрялся, он у меня всеравно упорно регистрирует новых пользователей с привелегией "нет" вместо, например, "штатный писатель" или "внештатник"... Из-за этого плагином пользоваться просто не возможно - пропадает весь смысл. Ведь человек не сможет залогинится, пока я сам ему из админки не поменяю статус...

О том, что я выставлял эти опции в настройках, думаю и упоминать не стоит, я даже пытался ковырять сам код плагина, но это было на интуитивном уровне, ведь я совсем не знаю РНР... Люди добрые! Помогите. Может вы подскажете как заставить этот плагин забыть об уровне пользователей "нет" ( levels 0 ) ??

Если неохота ставить плагин, то вот код:

Код:

////////////////////////////////////////////////////////////
// Plugin mem_self_register
// Author: Michael Manfre (http://manfre.net/)
////////////////////////////////////////////////////////////

if (!function_exists('mem_set_pref')) {
    function mem_set_pref($name, $val, $event,  $type, $position=0, $html='text_input')
    {
        global $pref_cache;

        if ($pref_cache==null)
            $pref_cache = array();

        $args = func_get_args();
        $args['html'] = $html;
        $args['position'] = $position;
        $args['prefs_id'] = 1;

        $pref_cache[$name] = $args;

        extract(doSlash($args));

        if (!safe_row("*", 'txp_prefs', "name = '$name'") ) {
            return safe_insert('txp_prefs', "
                name  = '$name',
                val   = '$val',
                event = '$event',
                html  = '$html',
                type  = '$type',
                position = '$position',
                prefs_id = 1"
            );
        } else {
            return safe_update(    'txp_prefs', "
                                    val   = '$val',
                                    event = '$event',
                                    html  = '$html',
                                    type  = '$type',
                                    position = '$position'",
                                "name like '$name'");
        }
        return false;
    }
}

if (!function_exists('mem_get_pref')) {
    function mem_get_pref($name,$val='')
    {
        global $pref_cache;

        if ($pref_cache==null)
            $pref_cache = array();

        if (!in_array($name,$pref_cache) or $pref_cache[$name] === false) {
            $pref_cache[$name] = safe_row('*','txp_prefs',"name='$name'");
        } else {
            $pref_cache[$name] = false;
        }

        if (!empty($val) && in_array($val,$pref_cache[$name]))
            return $pref_cache[$name][$val];
        else
            return $pref_cache[$name];
    }
}

global $mem_self_lang;

if (!is_array($mem_self_lang))
{
    $mem_self_lang = array(
        'your_login_info'    =>    'Your Login Info',
        'admin_name'        =>    'Admin Name',
        'admin_email'        =>    'Admin Email',
        'password_sent_to'    =>    'Password Sent To',
        'error_adding_new_author'    =>    'Error adding new author',
        'greeting'            =>    'Hello',
        'your_password_is'    =>    'Your password is',
        'your_new_password'    =>    'Your new password',
        'password_changed'    =>    'Password changed',
        'password_change_failed'    =>    'Failed to change password',
        'log_in_at'            =>    'Log in at',
        'saved_user_profile'    =>    'Saved User Profile',
        'user_exists'        =>    'Username already exists. Please try another name',
    );
}

function mem_self_gTxt($name)
{
    global $mem_self_lang;

    $gtxt = gTxt($name);

    if ( strcmp($gtxt,$name) == 0 )
    {
        if ( array_key_exists($name,$mem_self_lang) )
            $gtxt = $mem_self_lang[$name];
    }

    return $gtxt;
}

global $event;

if (!isset($event)) $event = '';

if ($event != 'admin') {
    require_once txpath.'/include/txp_admin.php';

    global $levels;

    // copied from txp_admin.php
    $levels = array(
        0 => mem_self_gTxt('none'),
        6 => mem_self_gTxt('designer'),
        5 => mem_self_gTxt('freelancer'),
        4 => mem_self_gTxt('staff_writer'),
        3 => mem_self_gTxt('copy_editor'),
        2 => mem_self_gTxt('managing_editor'),
        1 => mem_self_gTxt('publisher')
    );

//-------------------------------------------------------------
    if (!function_exists('priv_levels')) {
        function priv_levels($item, $var) {
            global $levels;

            return selectInput($item, $levels, $var);
        }
    }
}


global $mem_self;

$mem_self = array(
                'admin_email'        =>    '',
                'admin_name'        =>    '',
                'new_user_priv'        =>    '0',
                'status'            =>    false,
                'status_message'    =>    'You are already registered.',
                'email_message'        =>    ''
            );

$mem_self['admin_email'] = mem_get_pref('mem_self_admin_email','val'); //safe_field('val','txp_prefs',"name='mem_self_admin_email'");
$mem_self['admin_name'] = mem_get_pref('mem_self_admin_name','val'); //safe_field('val','txp_prefs',"name='mem_self_admin_name'");
$mem_self['new_user_priv'] = mem_get_pref('mem_self_new_user_priv','val'); //safe_field('val','txp_prefs',"name='mem_self_new_user_priv'");

if ( @txpinterface == 'admin' ) {
    register_callback('mem_self_register','self-reg','', 1);
    if ($event=='self-reg') {
        // fake tabs when using them. Silences warnings from pageTop()
        register_tab('admin','self-reg','self-reg');

        include_once txpath.'/publish/taghandlers.php';
    }

    function mem_self_register($event, $step) {
        if ($event!='self-reg')
            return;

        pageTop('Self Registration','');

        if ($step == 'install') {
            echo mem_self_register_install();
        } else if ($step=='preinstall') {
            $mem_admin_name    = mem_get_pref('mem_self_admin_name');
            $mem_admin_email    = mem_get_pref('mem_self_admin_email');
            $mem_new_user_priv    = mem_get_pref('mem_self_new_user_priv');
            $mem_use_ign_db    = mem_get_pref('mem_self_use_ign_db');
            $mem_xtra_columns    = mem_get_extra_user_columns();

            $mem_admin_name = @$mem_admin_name ? $mem_admin_name['val'] : 'Admin';
            $mem_admin_email = @$mem_admin_email ? $mem_admin_email['val'] : 'Admin@yourdomain.com';
            $mem_new_use_priv = @$mem_new_use_priv ? $mem_new_use_priv['val'] : '0';

            $use_ign_input = '';
            // is ign_password_protect loaded on the system?
            if (load_plugin('ign_password_protect') || $mem_use_ign_db) {
                $mem_use_ign_db = $mem_use_ign_db ? $mem_use_ign_db['val'] : '0';
                $use_ign_input = yesnoradio('use_ign_db',$mem_use_ign_db);
            }

            $xtra_columns = mem_get_extra_user_columns();
            $has_address = in_array('address',$xtra_columns);
            $has_phone = in_array('phone',$xtra_columns);

            $add_address_input = yesnoradio('add_address','0');
            $add_phone_input = yesnoradio('add_phone','0');

            echo form(
                eInput('self-reg').sInput('install').
                startTable('edit') .
                    tr( fLabelCell('admin_name')    . tda(fInput('text','admin_name',$mem_admin_name,'edit')) ) .
                    tr( fLabelCell('admin_email')    . tda(fInput('text','admin_email',$mem_admin_email,'edit')) ) .
                    tr( fLabelCell('new_user_priv')    . tda(priv_levels('new_user_priv',$mem_new_use_priv)) ) .
                    tr( fLabelCell('use_ign_db')    . tda($use_ign_input) ) .
                    ($has_address ? '' : tr( fLabelCell('add_address_field') . tda($add_address_input) ) ) .
                    ($has_phone ? '' : tr( fLabelCell('add_phone_field') . tda($add_phone_input) ) ) .
                    tr( td() . td( fInput("submit", 'submit',mem_self_gTxt('install'),"Publish"), 2 ) ) .
                endTable()
                );
        } else {
            echo '<div><a href="?event=self-reg&step=preinstall">'.mem_self_gTxt('install').'</a></div>';
        }
    }


    function mem_self_register_install() {
        global $mem_self;

        extract(doSlash(gpsa(array(
            'admin_email',
            'admin_name',
            'new_user_priv',
            'use_ign_db',
            'add_address',
            'add_phone'
        ))));

        if (!isset($new_user_priv) || empty($new_user_priv)) $new_user_priv = '0';

        $log = array();

        if (!($rs=safe_field('val,html','txp_prefs',"name='mem_self_use_ign_db'"))) {
            if ( mem_set_pref('mem_self_use_ign_db',$use_ign_db,'self_reg',1,'yesnoradio')) {
                $log[] = "Added pref 'mem_self_use_ign_db'";
            } else {
                $log[] = "Failed to add pref 'mem_self_use_ign_db'. " . mysql_error();
            }
        } else {
            if ($rs['html'] != 'yesnoradio') {
                safe_update('txp_prefs',"html='yesnoradio'","name='mem_self_use_ign_db'");
            }
            $log[] = "Pref 'mem_self_use_ign_db' is already installed. Current value is '{$rs}'.";
        }

        $user_table = mem_get_user_table_name();

        $xtra_columns = mem_get_extra_user_columns();
        if ($add_address) {
            if (!in_array('address',$xtra_columns)) {
                if (safe_alter($user_table,"ADD `address` VARCHAR( 128 )")) {
                    $log[] = "Added column 'address' to user table '{$user_table}'";
                } else {
                    $log[] = "Failed to add column 'address' to user table '{$user_table}'. " . mysql_error();
                }
            } else {
                $log[] = "Table {$user_table} already has column 'address'";
            }
        }
        if ($add_phone) {
            if (!in_array('phone',$xtra_columns)) {
                if (safe_alter($user_table,"ADD `phone` VARCHAR( 32 )")) {
                    $log[] = "Added column 'phone' to user table '{$user_table}'";
                } else {
                    $log[] = "Failed to add column 'phone' to user table '{$user_table}'. " . mysql_error();
                }
            } else {
                $log[] = "Table {$user_table} already has column 'phone'";
            }
        }

        if (!($rs=safe_field('val','txp_prefs',"name='mem_self_admin_email'"))) {
            if ( mem_set_pref('mem_self_admin_email',$admin_email,'self_reg',1)) {
                $log[] = "Added pref 'mem_self_admin_email'";
            } else {
                $log[] = "Failed to add pref 'mem_self_admin_email'. " . mysql_error();
            }
        } else {
            $log[] = "Pref 'mem_self_admin_email' is already installed. Current value is '{$rs}'.";
        }
        if (!($rs=safe_field('val','txp_prefs',"name='mem_self_admin_name'"))) {
            if ( mem_set_pref('mem_self_admin_name',$admin_name,'self_reg',1)) {
                $log[] = "Added pref 'mem_self_admin_name'";
            } else {
                $log[] = "Failed to add pref 'mem_self_admin_name'. " . mysql_error();
            }
        } else {
            $log[] = "Pref 'mem_self_admin_name' is already installed. Current value is '{$rs}'.";
        }
        if (($rs=safe_field('val,html','txp_prefs',"name='mem_self_new_user_priv'")) === false) {
            if ( mem_set_pref('mem_self_new_user_priv',$new_user_priv,'self_reg',1,'priv_levels')) {
                $log[] = "Added pref 'mem_self_new_user_priv' with value of '{$new_user_priv}'";
                $mem_self['new_user_priv'] = $new_user_priv;
            } else {
                $log[] = "Failed to add pref 'mem_self_newuser_priv'. " . mysql_error();
            }
        } else {
            if ($rs['html'] != 'priv_levels')
                safe_update('txp_prefs',"html='priv_levels'","name='mem_self_new_user_priv'");

            $log[] = "Pref 'mem_self_new_user_priv' is already installed. Current value is '{$rs}'.";
        }

        // create default registration form
        $form_html = <<<EOF
<table>
<tr>
    <td>Full Name</td>
    <td><txp:mem_name_input /></td>
    <td><txp:mem_name_warn /></td>
</tr>
<tr>
    <td>Username</td>
    <td><txp:mem_user_input /></td>
    <td><txp:mem_user_warn /></td>
</tr>
<tr>
    <td>Email</td>
    <td><txp:mem_email_input /></td>
    <td><txp:mem_email_warn /></td>
</tr>
<tr>
    <td colspan="3"><txp:mem_submit /></td>
</tr>
</table>
EOF;

        $form = fetch('Form','txp_form','name','self_register_form');
        if (!$form) {
            if (safe_insert('txp_form',"name='self_register_form',type='misc',Form='{$form_html}'")) {
                $log[] = "Added form 'self_register_form'";
            } else {
                $log[] = "Failed to add form 'self_register_form'. " . mysql_error().br.
                    "You need to manually create a form template. Here is an example.".br.
                    '<textpattern style="width:300px;height:150px;">'.htmlspecialchars($form_html).'</textarea>';
            }
        } else {
            $log[] = "Found form 'self_register_form'. Skipping installation of default form.";
        }

        // create default successful registration form to show the user
        $form_html = <<<EOF
<h3>Account Created</h3>
<p>An email containing your password has been sent to <txp:mem_profile var="email" />.</p>
EOF;

        $form = fetch('Form','txp_form','name','self_register_success');
        if (!$form) {
            if (safe_insert('txp_form',"name='self_register_success',type='misc',Form='{$form_html}'")) {
                $log[] = "Added form 'self_register_success'";
            } else {
                $log[] = "Failed to add form 'self_register_success'. " . mysql_error().br.
                    "You need to manually create a form template. Here is an example.".br.
                    '<textpattern style="width:300px;height:150px;">'.htmlspecialchars($form_html).'</textarea>';
            }
        } else {
            $log[] = "Found form 'self_register_success'. Skipping installation of default form.";
        }

        // create default successful registration email form
        $form_html = <<<EOF
Dear <txp:mem_name />,

Thank you for registering at <txp:mem_siteurl />.

Your login name: <txp:mem_username />
Your password: <txp:mem_password />

If you have any questions please reply to this email address.

Sincerely,
<txp:mem_admin_name />
<txp:mem_admin_email />
EOF;

        $form = fetch('Form','txp_form','name','self_register_email');
        if (!$form) {
            if (safe_insert('txp_form',"name='self_register_email',type='misc',Form='{$form_html}'")) {
                $log[] = "Added form 'self_register_email'";
            } else {
                $log[] = "Failed to add form 'self_register_email'. " . mysql_error().br.
                    "You need to manually create a form template. Here is an example.".br.
                    '<textpattern style="width:300px;height:150px;">'.htmlspecialchars($form_html).'</textarea>';
            }
        } else {
            $log[] = "Found form 'self_register_form'. Skipping installation of default form.";
        }

        $tag_help = '<txp:mem_self_register_form form="self_register_form" />';
        $log[] = 'Example tag to use in your page template.'.br.
            '<textarea style="width:400px;height:40px;">'.htmlspecialchars($tag_help).'</textarea>';

        return doWrap($log,'ul','li');
    }
}

function mem_get_user_table_name() {
    $use_ign_db = mem_get_pref('mem_self_use_ign_db');

    $table_name = 'txp_users';

    if ($use_ign_db) {
        $ign_use_custom = mem_get_pref('ign_use_custom');
        if ($ign_use_custom && $ign_use_custom['val']=='1') {
            $ign_user_db = mem_get_pref('ign_user_db');
            if ($ign_user_db && !empty($ign_user_db['val']))
                $table_name = $ign_user_db['val'];
        }
    }
    return $table_name;
}

// -------------------------------------------------------------
function mem_self_register_form($atts,$thing='')
{
    global $txpac;

    $namewarn = $userwarn = $emailwarn = '';

    extract(doSlash(psa(array('event','step','name','email','username','address','phone','mem_self_register'))));

    extract(lAtts(array(
        'class'        => __FUNCTION__,
        'form'        => 'self_register_form',
        'success_form'    => 'self_register_success',
        'email_form'    => 'self_register_email',
        'wraptag'    => '',
        'isize'        => '25',
        'label'        => mem_self_gTxt('submit'),
        'namewarn'    => mem_self_gTxt('name_required'),
        'userwarn'    => mem_self_gTxt('user_required'),
        'emailwarn'    => mem_self_gTxt('email_required'),
    ),$atts));

    $name = trim($name);
    $username = trim($username);
    $email = trim($email);
    $phone = trim($phone);
    $address = trim($address);

    $saved = false;

    if ($event=='self-reg' && $step=='register') {
        if (!is_valid_form()) {
            $namewarn = empty($name) ? $namewarn : '';
            $userwarn = empty($username) ? $userwarn : '';
            // if all fields are non empty, then the email address failed for some reason.
            $emailwarn = empty($email) ? $emailwarn : (empty($namewarn) and empty($userwarn) ? $emailwarn : '');
        } else {

            $rs = safe_field('name',mem_get_user_table_name(),"name='{$username}'");

            if (empty($rs)) {
                mem_self_register_save();
                $saved = true;
            } else {
                // don't change $userwarn
                $namewarn = $emailwarn = '';
            }
        }
    } else {
        // don't show the warnings
        $namewarn = '';
        $userwarn = '';
        $emailwarn = '';
    }

    if (@$saved) {
        $Form = fetch_form($success_form);
        $out = parse($Form);
    } else {

        $Form = fetch_form($form);

        $vals = array(
            'name_warn'        => $namewarn,
            'user_warn'        => $userwarn,
            'email_warn'    => $emailwarn,
            'name_input'    => fInput('text','name',  $name, 'register_name_input','','',$isize,"0", 'mem_name_input'),
            'user_input'    => fInput('text','username', $username, 'register_user_input', '', '', $isize, "0", 'mem_user_input'),
            'email_input'    => fInput('text','email', $email,'register_email_input','','',$isize,"0", 'mem_email_input'),
            'submit'        => fInput('submit','submit',mem_self_gTxt($label),'button'),
            'phone_input'    => fInput('text','phone', $phone, 'register_phone_input', '', '', $isize, "0", 'mem_phone_input'),
            'address_input'    => fInput('text','address', $address, 'register_address_input', '', '', $isize, "0", 'mem_address_input'),
        );

        foreach ($vals as $a=>$b) {
            $Form = str_replace('<txp:mem_'.$a.' />',$b,$Form);
        }

        $action_url = $_SERVER['REQUEST_URI'];
        $qs = strpos($action_url,'?');
        if ($qs) $action_url = substr($action_url, 0, $qs);

        $out =    n.n."<form enctype='multipart/form-data' action='{$action_url}' method='post'>" .
                eInput('self-reg') . sInput('register') . hInput('email_form',$email_form) . hInput('mem_self_register','register') .
                parse($Form) .
                "</form>".n;
    }

    return doTag($out,$wraptag,$class);

}

function mem_get_extra_user_columns_insert_string() {
    $xtra_columns = mem_get_extra_user_columns();

    $xtra = '';

    foreach ($xtra_columns as $xcol) {
        $name = $xcol['Field'];
        $type = strtolower($xcol['Type']);
        $val = gps($name);

        if ( strstr($type,'int')
                || $type=='float'
                || $type=='decimal'
                || $type=='double'
                || $type=='bool' ) {
            // don't quote value
            $xtra .= ", {$name}=" . doSlash($val);
        } else {
            // quote value
            $xtra .= ", {$name}='" . doSlash($val) ."'";
        }
    }

    return $xtra;
}

function mem_get_extra_user_columns()
{
    static $default_columns = array('user_id','name','pass','RealName','email','privs','last_access','nonce');
    static $xtra_columns = false;

    if (is_array($xtra_columns))
        return $xtra_columns;

    $table_name = mem_get_user_table_name();
    $txpdesc = getRows('describe '.PFX. $table_name);

    $xtra_cols = array();

    $dcols = $default_columns;

    foreach($txpdesc as $r) {
        if ( !in_array($r['Field'], $default_columns) )
            $xtra_cols[] = $r;
    }

    return $xtra_cols;
}

// -------------------------------------------------------------
function mem_self_register_save()
{
    global $mem_self,$sitename,$mem_profile;

    extract(doSlash(psa(array('name','email','username','email_form','address','phone','mem_self_register','login_url'))));
    extract($mem_self);

    if ($mem_self_register != 'register') return '';

    $pw = generate_password(6);

    if (!$mem_profile) $mem_profile = array();

    $mem_profile['nonce'] = $nonce = md5( uniqid( rand(), true ) );

    $mem_profile['RealName'] = $name = trim($name);
    $mem_profile['email'] = $email = trim($email);
    $mem_profile['name'] = $username = trim($username);
    $mem_profile['privs'] = $new_user_priv;

    $xtra_columns = mem_get_extra_user_columns();

    foreach($xtra_columns as $c) {
        $c_name = trim( $c['Field'] );

        $mem_profile[$c_name] = gps($c_name);
    }

    $rs = false;

    $xtra = mem_get_extra_user_columns_insert_string();

    $rs = safe_insert(
        mem_get_user_table_name(),
        "privs    = '$new_user_priv',
         name     = '$username',
         email    = '$email',
         RealName = '$name',
         pass     =  password(lower('$pw')),
         nonce    = '$nonce'" . $xtra
    );

    if ($rs) {
        $mem_profile['user_id'] = $rs;
        $mem_profile['last_access'] = 0;

        if ($email_form) {
            $message = fetch('Form','txp_form','name',$email_form);

            if (is_array($admin_name))
                $admin_name = $admin_name['val'];
            if (is_array($admin_email))
                $admin_email = $admin_email['val'];

            if (empty($login_url))
                $login_url = rtrim(hu,'/').'/textpattern/index.php';

            $vals = array(
                'admin_name'    =>    $admin_name,
                'admin_email'    =>    $admin_email,
                'name'        =>    $name,
                'username'    =>    $username,
                'email'        =>    $email,
                'password'    =>    $pw,
                'sitename'    =>    $sitename,
                'loginurl'    =>    $login_url,
                'siteurl'    =>    hu,
                'address'    =>    $address,
                'phone'        =>    $phone
            );

            foreach ($vals as $a=>$b) {
                @$message = str_replace('<txp:mem_'.$a.' />',$b,$message);
            }

            $message = parse($message);

            $emailbody = "From: {$admin_name} <{$admin_email}>\r\n"
                ."Bcc: {$admin_email}\r\n"
                ."Reply-To: {$admin_email}\r\n"
                ."Content-Transfer-Encoding: 8bit\r\n"
                ."Content-Type: text/plain; charset=\"UTF-8\"\r\n";

            $sent = mail($email, "[$sitename] ".mem_self_gTxt('your_login_info'), $message, $emailbody);

            $mem_self['email_status'] = $sent;
            $mem_self['email_message'] = $message;

            if ($sent) {
                $cookietime = time() + (365*24*3600);
                setcookie("txp_self_registered", "1",  $cookietime, "/");

                $mem_self['status_message'] = mem_self_gTxt('password_sent_to').sp.$email;
            } else {
                // failed to send email
            }
        }
    } else {
        $mem_self['status_message'] = mem_self_gTxt('error_adding_new_author');
    }
}

// -------------------------------------------------------------
function self_register_email_message($atts)
{
    global $mem_self;
    return $mem_self['email_message'];
}

// -------------------------------------------------------------
function self_register_status_message($atts)
{
    global $mem_self;
    return $mem_self['status_message'];
}


// -------------------------------------------------------------
function if_message_sent($atts,$thing)
{
    global $mem_self;
    $condition = ($mem_self['email_status']);
    return parse(EvalElse($thing, $condition));
}

// -------------------------------------------------------------
function if_self_registered($atts,$thing)
{
    global $mem_self,$txp_user;
    $condition = ($mem_self['status'] or $mem_self['form_valid'] or !empty($_COOKIE['txp_self_registered']) or (isset($txp_user) and !empty($txp_user)) );
    return parse(EvalElse($thing, $condition));
}

// added to txplib_misc
if (!function_exists('is_valid_email')) {
function is_valid_email($email)
{
    $addr = explode('@',$email);

    $host = $addr[1];

    if ($host != gethostbyname($host) and eregi("^[0-9a-z]([-_.~]?[0-9a-z])*$",$addr[0]))
        return true;

    return false;
}
}

function is_valid_form()
{
    extract(doSlash(psa(array('name','email','username','mem_self_register'))));

    $name = trim($name);
    $email = trim($email);
    $username = trim($username);

    if ($mem_self_register=='register') {
        if (!(empty($name) || empty($username) || empty($email)) && is_valid_email($email)) {
            return true;
        }
    }

    return false;
}



////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
// User Side Profile and Password Change Forms
// -------------------------------------------------------------
function mem_change_password_form($atts,$thing='')
{
    return mem_change_pass_form($atts,$thing);
}
function mem_change_pass_form($atts,$thing='')
{
    global $ign_user,$txp_user,$sitename,$mem_profile;

    extract(lAtts(array(
        'class'        => 'mem_password_form',
        'wraptag'    => '',
        'form'        => '',
        'form_mail'    => ''
    ),$atts));

    $out = '';

    if (isset($ign_user)) $txp_user = $ign_user;

    $step = gps('step');

    if (isset($step) && $step=='mem_change_pass') {
        $new_pass = gps('new_pass');

        $rs = safe_update(
            mem_get_user_table_name(),
            "pass = password(lower('$new_pass'))",
            "name='$txp_user'"
        );

        if ($rs) {

            // successful
            $mem_profile = safe_row('*',mem_get_user_table_name(),"name = '{$txp_user}'");

            if ($mem_profile) {
                $mem_profile['new_pass'] = $new_pass;

                if (!empty($form_mail))
                    $message = fetch_form($form_mail);
                if (empty($message)) {
                    $message = mem_self_gTxt('greeting').' <txp:mem_realname />,'."\r\n".
                        mem_self_gTxt('your_password_is').": <txp:mem_password />\r\n"."\r\n".
                        mem_self_gTxt('log_in_at').' '.hu.'textpattern/index.php';
                }

                $vals = array(
                    'realname'    =>    $mem_profile['RealName'],
                    'password'    =>    $mem_profile['new_pass'],
                );

                foreach ($vals as $a=>$b) {
                    $message = str_replace('<txp:mem_'.$a.' />',$b,$message);
                }

                $message = parse($message);

                // email password
                if (txpMail($mem_profile['email'], "[$sitename] ".mem_self_gTxt('your_new_password'), $message))
                    $out = mem_self_gTxt('password_changed');
                else
                    $out = mem_self_gTxt('password_change_failed');
            } else return mysql_error();
        } else {
            return mysql_error();
        }
    } else {
        $Form = $thing;
        if (!empty($form))
            $Form = fetch_form($form);
        if (empty($Form)) {
            $Form = "<h3>Change Password</h3><div><txp:mem_password_input /><txp:mem_submit /></div>";
        }
        $out =     "<form action='{$_SERVER['REQUEST_URI']}' method='post'>".
                parse($Form).
                eInput('mem_user_workspace').sInput('mem_change_pass').
                "</form>";

//                graf(mem_self_gTxt('new_password').' '.fInput('password','new_pass','','edit','','','20','1').

    }

    return $out;
}

// -------------------------------------------------------------
function mem_user_edit_form($atts, $thing)
{
    global $txpcfg,$txp_user,$ign_user,$mem_profile;

    if (isset($ign_user)) $txp_user = $ign_user;

    extract(lAtts(array(
        'class'        => 'mem_uedit_form',
        'wraptag'    => '',
        'form'        => ''
        ), $atts));

    $out = '';
    $message = '';

    $step = gps('step');
    $new_pass = gps('new_pass');

    if (isset($step) && $step=='save_user_profile') {
        extract(gpsa(array('email','name','RealName','address','phone')));

        $xtra = mem_get_extra_user_columns_insert_string();

        $rs = safe_update(mem_get_user_table_name(),
            "email = '{$email}', RealName = '{$RealName}'" . $xtra,
            "name = '{$txp_user}'");

        if ($rs) {
            $message = mem_self_gTxt('saved_user_profile');
        } else {
            $message = mysql_error();
        }
    }

    $mem_profile = safe_row('*',mem_get_user_table_name(),"name = '{$txp_user}'");

    if ($mem_profile) {
        $Form = $thing;
        if (!empty($form))
            $Form = fetch_form($form);

        $Form = eregi_replace('<txp:mem_message />',$message,$Form);

        $out =     "<form action='{$_SERVER['REQUEST_URI']}' method='post'>".
                parse($Form).
                eInput('mem_user_workspace').sInput('save_user_profile').
                "</form>";
    }

    return doTag($out,$wraptag,$class);
}

function mem_profile($atts)
{
    global $mem_profile,$txp_user,$ign_user;

    if (isset($ign_user)) $txp_user = $ign_user;

    extract($atts);
    if (!is_array($mem_profile) && $txp_user)
        $mem_profile = safe_row('*',mem_get_user_table_name(),"name = '{$txp_user}'");

    if ($mem_profile)
        return array_key_exists($var,$mem_profile) ? $mem_profile[$var] : '';
    return '';
}
function mem_submit($atts)
{
    extract($atts);
    $class = isset($class) ? $class : 'smallerbox';
    $value = isset($value) ? $value : mem_self_gTxt('save');
    return fInput("submit",'save',htmlspecialchars($value),$class);
}
function mem_password_input($atts)
{
    global $mem_profile;
    extract($atts);
    $isize = isset($isize) ? $isize : 20;
    $class = isset($class) ? $class : 'edit';

    return fInput('password','new_pass','',$class);
}
function mem_realname_input($atts)
{
    global $mem_profile;
    extract($atts);
    $isize = isset($isize) ? $isize : 20;
    $class = isset($class) ? $class : 'edit';

    return fInput('text','RealName',htmlspecialchars($mem_profile['RealName']),$class);
}
function mem_email_input($atts)
{
    global $mem_profile;
    extract($atts);
    $isize = isset($isize) ? $isize : 20;
    $class = isset($class) ? $class : 'edit';

    return fInput('text','email',htmlspecialchars($mem_profile['email']),$class);
}
function mem_phone_input($atts)
{
    global $mem_profile;
    extract($atts);
    $isize = isset($isize) ? $isize : 20;
    $class = isset($class) ? $class : 'edit';

    return fInput('text','phone',htmlspecialchars($mem_profile['phone']),$class);
}
function mem_address_input($atts)
{
    global $mem_profile;
    extract($atts);
    $isize = isset($isize) ? $isize : 20;
    $class = isset($class) ? $class : 'edit';

    return '<textarea class="'.$class.'" name="address">'.htmlspecialchars($mem_profile['address']).'</textarea>';
}

function mem_self_user_count($atts)
{
    global $mem_self;

    extract(lAtts(array(
        'user_levels'    => '0,1,2,3,4,5,6',
        'wraptag'    => '',
        'class'        => ''
    ),$atts));

    if (!empty($user_levels) || $user_levels=='0')
        $user_levels = doSlash(split(',',$user_levels));
    else
        $user_levels = array($mem_self['new_user_priv']);

    $levels = join(',',$user_levels);
    $count = safe_field('COUNT(*)', mem_get_user_table_name(), "privs IN ({$levels})");

    return doTag($count,$wraptag,$class);
}

Неактивен

 

#8 07-12-2007 20:25:41

snowman
добро
Зарегистрирован: 11-03-2007
Сообщений: 41

Re: mem_self_register

Дамы и господа! Всё отменяется! smile Ларчик, оказывается, сука просто открывался! Потратил 3 часа мучая этот плагин, потом погуглил, на считанные минуты нашел и поставил новую версию плагина ( 0.8.5 вместо той 0.8.3 что в этом топике) и плагин стал как родной! ))))) всё работает

Неактивен

 

#9 08-12-2007 20:02:03

Evgeny
ять
Зарегистрирован: 15-03-2005
Сообщений: 1869

Re: mem_self_register

snowman написал:

погуглил, на считанные минуты нашел и поставил новую версию плагина ( 0.8.5 вместо той 0.8.3 что в этом топике) и плагин стал как родной! ))))) всё работает

Кинь ссылку на свежую версию, пожалуйста.

Неактивен

 

#10 08-12-2007 20:05:54

AngryCAT
ферт
Откуда: Германия
Зарегистрирован: 18-04-2006
Сообщений: 486
Вебсайт

Re: mem_self_register

На сайте автора всё лежит


TextPattern строить и жить помогает! Кстати, пишу плагины на заказ. ICQ 155-08-081. В асю, пожалуйста, по поводу заказов или платных консультаций (10$ час). Остальные вопросы в форум или на почту.

Неактивен

 

#11 10-12-2007 15:15:57

snowman
добро
Зарегистрирован: 11-03-2007
Сообщений: 41

Re: mem_self_register

AngryCAT написал:

На сайте автора всё лежит

да, всё верно. Оттуда брал

Неактивен

 

#12 31-07-2008 12:40:58

deXes
буки
Зарегистрирован: 30-07-2008
Сообщений: 7

Re: mem_self_register

А я не догнал, как его установить sad Нету руководства хотя бы на английском? Я только начал изучать TP и вот решил сначала обхавестись всеми необходимыми плагинами, а потом сверастать smile Я вот скопировал этот код в окошко на странице плагинов, применил. Зашел на сайт, а там вот такая строка:

При загрузке модуля произошла ошибка: mem_self_register -> User_Error: Unable to include required plugin "mem_form" on line 448

Как я понял надо еще дорабатывать код шаблонов или создать файл с формой smile

Неактивен

 

#13 08-01-2009 10:33:47

Calm
добро
Зарегистрирован: 03-01-2009
Сообщений: 41

Re: mem_self_register

Чтобы mem_self_register применять, надо установить плагин mem_form.

Пытаюсь использовать mem_self_register версии 0.9.1. Документация действительно отстойная. Упоминаются тэги, которых в коде нет. Видимо в хелпе остались следы прошлых версий. На сайте автора плагина и вовсе написано - смотрите хелп в админке.

Неактивен

 

#14 03-06-2009 21:33:41

Xeon
глаголь
Зарегистрирован: 03-06-2009
Сообщений: 36

Re: mem_self_register

Отбой тревоги, справился сам ^_^

Отредактированно Xeon (03-06-2009 21:39:48)

Неактивен

 

#15 03-06-2009 21:56:36

Xeon
глаголь
Зарегистрирован: 03-06-2009
Сообщений: 36

Re: mem_self_register

А, нет, оказывается не справился, при поптыки устоновить плагин mem_form
http://manfre.net/file_download/32
cms мне пишет: "Неправильно оформленный или пустой код плагина"
В чём может быть проблемма?
UPD:
Плагин установил, оба запустились и работают тольо вот форма для реги на странице не появилась... Что ещё нужно сделать?
Пониманию что надо вставить код форм на страницу но какой именно и куда что бы всё работалло правильно не знаю...

Отредактированно Xeon (03-06-2009 22:14:04)

Неактивен

 

#16 31-08-2009 22:25:27

Gerich
земля
Зарегистрирован: 07-09-2008
Сообщений: 100

Re: mem_self_register

Вот этот код нужно вставить в нужном месте страницы. Также после установки плагина были созданы три формы, которые можно редактировать.

Код:

<txp:mem_self_register_form form="self_register_form" email_form="self_register_email" subject="[site.ru] Информация о вашем аккаунте" />

Неактивен

 

#17 22-09-2009 13:27:58

itshaman
слово
Откуда: Омск
Зарегистрирован: 03-06-2009
Сообщений: 395
Вебсайт

Re: mem_self_register

Gerich можно поподробнее. После установки двух нужных плагинов у меня не добавились две формы.
Если Вы устанавливали, можете ли Вы описать процесс установки.

Приведенный Вами код у меня не выводит ничего

Xeon
Скачайте не *.txt, а *.gz.txt
Уменя добавилось

Отредактированно itshaman (22-09-2009 13:29:25)


Помогу сделать Ваш сайт лучше! Принимаю Webmoney, PayPal, рубли, доллары, печеньки

Неактивен

 

#18 07-11-2009 20:12:53

retroman
веди
Зарегистрирован: 06-11-2009
Сообщений: 18

Re: mem_self_register

Добрый вечер, Уважаемые.
А не мог бы кто нибудь, кто успешно установил этот плагин пошагово проинструктировать новичка? То есть установить то я установил,  а вот воплотить систему регистрации пользователей с уже установленным плагином как то не соображу как. Понимаю, что видимо нужно появившиеся после его установки новые формы вывести как то в нужном месте шаблона?  Но что, как и куда выводить?

Неактивен

 

#19 03-03-2011 07:04:57

Skrishi
есть
Зарегистрирован: 26-01-2011
Сообщений: 50

Неактивен

 

Board footer

RSS   Rambler's Top100
Powered by PunBB
Textpattern.ru