Aufruf-Statistik für world-of-flybook.de

Auslastungsstatistik für den Zeitraum: April 2010
Erstellt am 08-Apr-2010 05:40 CEST

[Tages-Statistik] [Stunden-Statistik] [URLs] [Eingang] [Ausgang] [Rechner (IP-Adressen)] [Verweise] [Suche] [Anwenderprogramme]

Monats-Statistik für April 2010
Summe der Anfragen 2
Summe der Dateien 2
Summe Seiten 1
Summe Besuche 1
Summe in kb 1
Summe der unterschiedlichen Rechner (IP-Adressen) 1
Summe der unterschiedlichen URLs 2
Summe der unterschiedlichen Verweise 2
Summe der unterschiedlichen Anwenderprogramme 1
. Schnitt Maximum
Anfragen pro Stunde 0 3
Anfragen pro Tag 2 2
Dateien pro Tag 2 2
Seiten pro Tag 1 1
Rechner (IP-Adressen) pro Tag 1 1
Besuche pro Tag 1 1
kb pro Tag 1 1
Anfragen nach Status-Codes
Code 200 - OK 100.00% 2

Tages-Statistik im Monat April 2010

Tages-Statistik im Monat April 2010
Tag Anfragen Dateien Seiten Besuche Rechner kb
7 2 100.00% 2 100.00% 1 100.00% 1 100.00% 1 100.00% 1 100.00%

Stunden-Statistik im Monat April 2010

Stunden-Statistik im Monat April 2010
Stunde Anfragen Dateien Seiten kb
Schnitt Summe Schnitt Summe Schnitt Summe Schnitt Summe
0 0 0 0.00% 0 0 0.00% 0 0 0.00% 0 0 0.00%
1 0 0 0.00% 0 0 0.00% 0 0 0.00% 0 0 0.00%
2 0 0 0.00% 0 0 0.00% 0 0 0.00% 0 0 0.00%
3 0 0 0.00% 0 0 0.00% 0 0 0.00% 0 0 0.00%
4 0 0 0.00% 0 0 0.00% 0 0 0.00% 0 0 0.00%
5 0 0 0.00% 0 0 0.00% 0 0 0.00% 0 0 0.00%
6 0 0 0.00% 0 0 0.00% 0 0 0.00% 0 0 0.00%
7 0 0 0.00% 0 0 0.00% 0 0 0.00% 0 0 0.00%
8 0 0 0.00% 0 0 0.00% 0 0 0.00% 0 0 0.00%
9 2 2 100.00% 2 2 100.00% 1 1 100.00% 1 1 100.00%
10 0 0 0.00% 0 0 0.00% 0 0 0.00% 0 0 0.00%
11 0 0 0.00% 0 0 0.00% 0 0 0.00% 0 0 0.00%
12 0 0 0.00% 0 0 0.00% 0 0 0.00% 0 0 0.00%
13 0 0 0.00% 0 0 0.00% 0 0 0.00% 0 0 0.00%
14 0 0 0.00% 0 0 0.00% 0 0 0.00% 0 0 0.00%
15 0 0 0.00% 0 0 0.00% 0 0 0.00% 0 0 0.00%
16 0 0 0.00% 0 0 0.00% 0 0 0.00% 0 0 0.00%
17 0 0 0.00% 0 0 0.00% 0 0 0.00% 0 0 0.00%
18 0 0 0.00% 0 0 0.00% 0 0 0.00% 0 0 0.00%
19 0 0 0.00% 0 0 0.00% 0 0 0.00% 0 0 0.00%
20 0 0 0.00% 0 0 0.00% 0 0 0.00% 0 0 0.00%
21 0 0 0.00% 0 0 0.00% 0 0 0.00% 0 0 0.00%
22 0 0 0.00% 0 0 0.00% 0 0 0.00% 0 0 0.00%
23 0 0 0.00% 0 0 0.00% 0 0 0.00% 0 0 0.00%

Top 2 von 2 URLs
# Anfragen kb URL
1 1 50.00% 0 50.00% /
2 1 50.00% 0 50.00% /robots.txt

Top 2 von 2 URLs sortiert nach kb
# Anfragen kb URL
1 1 50.00% 0 50.00% /
2 1 50.00% 0 50.00% /robots.txt

Top 1 von 1 Eingangsseiten Gesamt
# Anfragen Besuche URL
1 1 50.00% 1 100.00% /

Top 1 von 1 Rechnern (IP-Adressen)
# Anfragen Dateien kb Besuche Rechnername
1 2 100.00% 2 100.00% 1 100.00% 1 100.00% 64.246.165.140

Top 1 von 1 Rechnern (IP-Adressen) sortiert nach kb
# Anfragen Dateien kb Besuche Rechnername
1 2 100.00% 2 100.00% 1 100.00% 1 100.00% 64.246.165.140

Top 1 von 2 Verweise
# Anfragen Verweise
1 1 50.00% - (Direct Request)

Top 1 von 1 Anwenderprogramme
# Anfragen Anwenderprogramm
1 2 100.00% Mozilla/5.0 (Windows; U; Windows NT 5.1; en; rv:1.9.0.13) Gecko/2009073022 Firefox/3.5.2 (.NET CLR 3.5.30729) SurveyBot/2.3 (


Generated by Webalizer Version 2.21
PNG  IHDR7T!PLTE\@|Z IDATx;s6\\*<+2JZƭʥΝ|~ex|S $k q H\9(rw!#hz4Ϫ6ZP2J%fIEoKI˫ 䫷kuqQGT:/PX} ,LC}!48!_"'"7` ,3XEl5uNi@)rPLyG<YlOٵӉJa`Ltk%6|NVFR|9f\4|PŖcf5d*˗0( dtIQpֱ ibql{@@GQeeGvHsaY"|YȃHb߱+߫kɬ<a'AT_8"k`OeL=LAJ r pJBJ? |L2MrP":/]P EV^]k{@D b@@a5Rn$%5@`cHYk|%ػvo}D[cyؾNpx}L޶n8xR#ʥ'C[;;AA+ ؕ'E|؃:t銐@ tHSwХ+BN9L` `;~6LxAe[Zy8$[` !r@ȧC(졓!YdU{AC<*Oh%,@( >0{cF!V-ju:2y[g+$-y̾b5&HV0fMgbeYj[dRAn y<89@v&E`T$RBO˸?2%NZJK>jAXP@DĨ@ә Q FLv(\) Aufruf-Statistik für world-of-flybook.de - Zusammenfassung nach Monaten

Aufruf-Statistik für world-of-flybook.de

Zusammenfassung nach Monaten
Erstellt am 08-Apr-2010 05:40 CEST

Zusammenfassung der Anfragen an world-of-flybook.de

Zusammenfassung nach Monaten
Monat Tagesdurchschnitt Monats-Summe
Anfragen Dateien Seiten Besuche Rechner kb Besuche Seiten Dateien Anfragen
Apr 2010 2 2 1 1 1 1 1 1 2 2
Mar 2010 0 0 0 0 5 3 5 5 8 8
Feb 2010 0 0 0 0 4 2 4 4 6 6
Jan 2010 0 0 0 0 4 2 4 4 7 7
Dez 2009 0 0 0 0 4 2 4 4 7 7
Nov 2009 0 0 0 0 3 2 3 3 6 6
Okt 2009 0 0 0 0 4 2 4 4 7 7
Sep 2009 0 0 0 0 4 6 4 4 7 7
Aug 2009 0 0 0 0 4 61 4 4 8 8
Jul 2009 0 0 0 0 2 57 3 3 6 6
Jun 2009 0 0 0 0 0 0 0 0 0 0
Mai 2009 0 0 0 0 0 0 0 0 0 0
Summen 138 36 36 64 64


Generated by Webalizer Version 2.21
qqQ jkrsQ Q jovsQ Q jkrsQ Q ihqsQ Q 1290113779 7586 a:4:{s:5:"local";a:41:{s:2:"f_";i:0;s:10:"f_announce";i:1;s:8:"f_attach";i:2;s:8:"f_bbcode";i:3;s:6:"f_bump";i:4;s:8:"f_delete";i:5;s:10:"f_download";i:6;s:6:"f_edit";i:7;s:7:"f_email";i:8;s:7:"f_flash";i:9;s:7:"f_icons";i:10;s:13:"f_ignoreflood";i:11;s:5:"f_img";i:12;s:6:"f_list";i:13;s:11:"f_noapprove";i:14;s:6:"f_poll";i:15;s:6:"f_post";i:16;s:11:"f_postcount";i:17;s:7:"f_print";i:18;s:6:"f_read";i:19;s:7:"f_reply";i:20;s:8:"f_report";i:21;s:8:"f_search";i:22;s:6:"f_sigs";i:23;s:9:"f_smilies";i:24;s:8:"f_sticky";i:25;s:11:"f_subscribe";i:26;s:11:"f_user_lock";i:27;s:6:"f_vote";i:28;s:9:"f_votechg";i:29;s:2:"m_";i:30;s:9:"m_approve";i:31;s:11:"m_chgposter";i:32;s:8:"m_delete";i:33;s:6:"m_edit";i:34;s:6:"m_info";i:35;s:6:"m_lock";i:36;s:7:"m_merge";i:37;s:6:"m_move";i:38;s:8:"m_report";i:39;s:7:"m_split";i:40;}s:2:"id";a:117:{s:2:"f_";i:1;s:10:"f_announce";i:2;s:8:"f_attach";i:3;s:8:"f_bbcode";i:4;s:6:"f_bump";i:5;s:8:"f_delete";i:6;s:10:"f_download";i:7;s:6:"f_edit";i:8;s:7:"f_email";i:9;s:7:"f_flash";i:10;s:7:"f_icons";i:11;s:13:"f_ignoreflood";i:12;s:5:"f_img";i:13;s:6:"f_list";i:14;s:11:"f_noapprove";i:15;s:6:"f_poll";i:16;s:6:"f_post";i:17;s:11:"f_postcount";i:18;s:7:"f_print";i:19;s:6:"f_read";i:20;s:7:"f_reply";i:21;s:8:"f_report";i:22;s:8:"f_search";i:23;s:6:"f_sigs";i:24;s:9:"f_smilies";i:25;s:8:"f_sticky";i:26;s:11:"f_subscribe";i:27;s:11:"f_user_lock";i:28;s:6:"f_vote";i:29;s:9:"f_votechg";i:30;s:2:"m_";i:31;s:9:"m_approve";i:32;s:11:"m_chgposter";i:33;s:8:"m_delete";i:34;s:6:"m_edit";i:35;s:6:"m_info";i:36;s:6:"m_lock";i:37;s:7:"m_merge";i:38;s:6:"m_move";i:39;s:8:"m_report";i:40;s:7:"m_split";i:41;s:5:"m_ban";i:42;s:6:"m_warn";i:43;s:2:"a_";i:44;s:7:"a_aauth";i:45;s:8:"a_attach";i:46;s:12:"a_authgroups";i:47;s:11:"a_authusers";i:48;s:8:"a_backup";i:49;s:5:"a_ban";i:50;s:8:"a_bbcode";i:51;s:7:"a_board";i:52;s:6:"a_bots";i:53;s:11:"a_clearlogs";i:54;s:7:"a_email";i:55;s:7:"a_fauth";i:56;s:7:"a_forum";i:57;s:10:"a_forumadd";i:58;s:10:"a_forumdel";i:59;s:7:"a_group";i:60;s:10:"a_groupadd";i:61;s:10:"a_groupdel";i:62;s:7:"a_icons";i:63;s:8:"a_jabber";i:64;s:10:"a_language";i:65;s:7:"a_mauth";i:66;s:9:"a_modules";i:67;s:7:"a_names";i:68;s:9:"a_phpinfo";i:69;s:9:"a_profile";i:70;s:7:"a_prune";i:71;s:7:"a_ranks";i:72;s:9:"a_reasons";i:73;s:7:"a_roles";i:74;s:8:"a_search";i:75;s:8:"a_server";i:76;s:8:"a_styles";i:77;s:12:"a_switchperm";i:78;s:7:"a_uauth";i:79;s:6:"a_user";i:80;s:9:"a_userdel";i:81;s:10:"a_viewauth";i:82;s:10:"a_viewlogs";i:83;s:7:"a_words";i:84;s:2:"u_";i:85;s:8:"u_attach";i:86;s:11:"u_chgavatar";i:87;s:12:"u_chgcensors";i:88;s:10:"u_chgemail";i:89;s:8:"u_chggrp";i:90;s:9:"u_chgname";i:91;s:11:"u_chgpasswd";i:92;s:10:"u_download";i:93;s:12:"u_hideonline";i:94;s:13:"u_ignoreflood";i:95;s:8:"u_masspm";i:96;s:14:"u_masspm_group";i:97;s:11:"u_pm_attach";i:98;s:11:"u_pm_bbcode";i:99;s:11:"u_pm_delete";i:100;s:13:"u_pm_download";i:101;s:9:"u_pm_edit";i:102;s:12:"u_pm_emailpm";i:103;s:10:"u_pm_flash";i:104;s:12:"u_pm_forward";i:105;s:8:"u_pm_img";i:106;s:12:"u_pm_printpm";i:107;s:12:"u_pm_smilies";i:108;s:8:"u_readpm";i:109;s:12:"u_savedrafts";i:110;s:8:"u_search";i:111;s:11:"u_sendemail";i:112;s:8:"u_sendim";i:113;s:8:"u_sendpm";i:114;s:5:"u_sig";i:115;s:12:"u_viewonline";i:116;s:13:"u_viewprofile";i:117;}s:6:"option";a:117:{i:1;s:2:"f_";i:2;s:10:"f_announce";i:3;s:8:"f_attach";i:4;s:8:"f_bbcode";i:5;s:6:"f_bump";i:6;s:8:"f_delete";i:7;s:10:"f_download";i:8;s:6:"f_edit";i:9;s:7:"f_email";i:10;s:7:"f_flash";i:11;s:7:"f_icons";i:12;s:13:"f_ignoreflood";i:13;s:5:"f_img";i:14;s:6:"f_list";i:15;s:11:"f_noapprove";i:16;s:6:"f_poll";i:17;s:6:"f_post";i:18;s:11:"f_postcount";i:19;s:7:"f_print";i:20;s:6:"f_read";i:21;s:7:"f_reply";i:22;s:8:"f_report";i:23;s:8:"f_search";i:24;s:6:"f_sigs";i:25;s:9:"f_smilies";i:26;s:8:"f_sticky";i:27;s:11:"f_subscribe";i:28;s:11:"f_user_lock";i:29;s:6:"f_vote";i:30;s:9:"f_votechg";i:31;s:2:"m_";i:32;s:9:"m_approve";i:33;s:11:"m_chgposter";i:34;s:8:"m_delete";i:35;s:6:"m_edit";i:36;s:6:"m_info";i:37;s:6:"m_lock";i:38;s:7:"m_merge";i:39;s:6:"m_move";i:40;s:8:"m_report";i:41;s:7:"m_split";i:42;s:5:"m_ban";i:43;s:6:"m_warn";i:44;s:2:"a_";i:45;s:7:"a_aauth";i:46;s:8:"a_attach";i:47;s:12:"a_authgroups";i:48;s:11:"a_authusers";i:49;s:8:"a_backup";i:50;s:5:"a_ban";i:51;s:8:"a_bbcode";i:52;s:7:"a_board";i:53;s:6:"a_bots";i:54;s:11:"a_clearlogs";i:55;s:7:"a_email";i:56;s:7:"a_fauth";i:57;s:7:"a_forum";i:58;s:10:"a_forumadd";i:59;s:10:"a_forumdel";i:60;s:7:"a_group";i:61;s:10:"a_groupadd";i:62;s:10:"a_groupdel";i:63;s:7:"a_icons";i:64;s:8:"a_jabber";i:65;s:10:"a_language";i:66;s:7:"a_mauth";i:67;s:9:"a_modules";i:68;s:7:"a_names";i:69;s:9:"a_phpinfo";i:70;s:9:"a_profile";i:71;s:7:"a_prune";i:72;s:7:"a_ranks";i:73;s:9:"a_reasons";i:74;s:7:"a_roles";i:75;s:8:"a_search";i:76;s:8:"a_server";i:77;s:8:"a_styles";i:78;s:12:"a_switchperm";i:79;s:7:"a_uauth";i:80;s:6:"a_user";i:81;s:9:"a_userdel";i:82;s:10:"a_viewauth";i:83;s:10:"a_viewlogs";i:84;s:7:"a_words";i:85;s:2:"u_";i:86;s:8:"u_attach";i:87;s:11:"u_chgavatar";i:88;s:12:"u_chgcensors";i:89;s:10:"u_chgemail";i:90;s:8:"u_chggrp";i:91;s:9:"u_chgname";i:92;s:11:"u_chgpasswd";i:93;s:10:"u_download";i:94;s:12:"u_hideonline";i:95;s:13:"u_ignoreflood";i:96;s:8:"u_masspm";i:97;s:14:"u_masspm_group";i:98;s:11:"u_pm_attach";i:99;s:11:"u_pm_bbcode";i:100;s:11:"u_pm_delete";i:101;s:13:"u_pm_download";i:102;s:9:"u_pm_edit";i:103;s:12:"u_pm_emailpm";i:104;s:10:"u_pm_flash";i:105;s:12:"u_pm_forward";i:106;s:8:"u_pm_img";i:107;s:12:"u_pm_printpm";i:108;s:12:"u_pm_smilies";i:109;s:8:"u_readpm";i:110;s:12:"u_savedrafts";i:111;s:8:"u_search";i:112;s:11:"u_sendemail";i:113;s:8:"u_sendim";i:114;s:8:"u_sendpm";i:115;s:5:"u_sig";i:116;s:12:"u_viewonline";i:117;s:13:"u_viewprofile";}s:6:"global";a:87:{s:2:"m_";i:0;s:9:"m_approve";i:1;s:11:"m_chgposter";i:2;s:8:"m_delete";i:3;s:6:"m_edit";i:4;s:6:"m_info";i:5;s:6:"m_lock";i:6;s:7:"m_merge";i:7;s:6:"m_move";i:8;s:8:"m_report";i:9;s:7:"m_split";i:10;s:5:"m_ban";i:11;s:6:"m_warn";i:12;s:2:"a_";i:13;s:7:"a_aauth";i:14;s:8:"a_attach";i:15;s:12:"a_authgroups";i:16;s:11:"a_authusers";i:17;s:8:"a_backup";i:18;s:5:"a_ban";i:19;s:8:"a_bbcode";i:20;s:7:"a_board";i:21;s:6:"a_bots";i:22;s:11:"a_clearlogs";i:23;s:7:"a_email";i:24;s:7:"a_fauth";i:25;s:7:"a_forum";i:26;s:10:"a_forumadd";i:27;s:10:"a_forumdel";i:28;s:7:"a_group";i:29;s:10:"a_groupadd";i:30;s:10:"a_groupdel";i:31;s:7:"a_icons";i:32;s:8:"a_jabber";i:33;s:10:"a_language";i:34;s:7:"a_mauth";i:35;s:9:"a_modules";i:36;s:7:"a_names";i:37;s:9:"a_phpinfo";i:38;s:9:"a_profile";i:39;s:7:"a_prune";i:40;s:7:"a_ranks";i:41;s:9:"a_reasons";i:42;s:7:"a_roles";i:43;s:8:"a_search";i:44;s:8:"a_server";i:45;s:8:"a_styles";i:46;s:12:"a_switchperm";i:47;s:7:"a_uauth";i:48;s:6:"a_user";i:49;s:9:"a_userdel";i:50;s:10:"a_viewauth";i:51;s:10:"a_viewlogs";i:52;s:7:"a_words";i:53;s:2:"u_";i:54;s:8:"u_attach";i:55;s:11:"u_chgavatar";i:56;s:12:"u_chgcensors";i:57;s:10:"u_chgemail";i:58;s:8:"u_chggrp";i:59;s:9:"u_chgname";i:60;s:11:"u_chgpasswd";i:61;s:10:"u_download";i:62;s:12:"u_hideonline";i:63;s:13:"u_ignoreflood";i:64;s:8:"u_masspm";i:65;s:14:"u_masspm_group";i:66;s:11:"u_pm_attach";i:67;s:11:"u_pm_bbcode";i:68;s:11:"u_pm_delete";i:69;s:13:"u_pm_download";i:70;s:9:"u_pm_edit";i:71;s:12:"u_pm_emailpm";i:72;s:10:"u_pm_flash";i:73;s:12:"u_pm_forward";i:74;s:8:"u_pm_img";i:75;s:12:"u_pm_printpm";i:76;s:12:"u_pm_smilies";i:77;s:8:"u_readpm";i:78;s:12:"u_savedrafts";i:79;s:8:"u_search";i:80;s:11:"u_sendemail";i:81;s:8:"u_sendim";i:82;s:8:"u_sendpm";i:83;s:5:"u_sig";i:84;s:12:"u_viewonline";i:85;s:13:"u_viewprofile";i:86;}} _rootref['META'])) ? $this->_rootref['META'] : ''; ?> <?php echo (isset($this->_rootref['SITENAME'])) ? $this->_rootref['SITENAME'] : ''; ?> • <?php if ($this->_rootref['S_IN_MCP']) { echo ((isset($this->_rootref['L_MCP'])) ? $this->_rootref['L_MCP'] : ((isset($user->lang['MCP'])) ? $user->lang['MCP'] : '{ MCP }')); ?> • <?php } else if ($this->_rootref['S_IN_UCP']) { echo ((isset($this->_rootref['L_UCP'])) ? $this->_rootref['L_UCP'] : ((isset($user->lang['UCP'])) ? $user->lang['UCP'] : '{ UCP }')); ?> • <?php } echo (isset($this->_rootref['PAGE_TITLE'])) ? $this->_rootref['PAGE_TITLE'] : ''; ?> _rootref['S_CONTENT_DIRECTION'] == ('rtl')) { ?> _tpldata['DEFINE']['.']['POPUP'] = 1; ?>
1290113779 179 a:5:{s:4:"name";s:26:"WoW Wrath of the Lich King";s:9:"copyright";s:24:"© phpBB Group, 2007";s:7:"version";s:5:"3.0.2";s:14:"parse_css_file";b:1;s:8:"filetime";i:1257791616;}ext(); } $body = new xmlrpcval ($rows, "array"); return $body; } /** * Returns an xmlrpc struct value as string out of an AdoDB recordset */ function rs2xmlrpcstring (&$adodbrs) { $xmlrpc = rs2xmlrpcval ($adodbrs); if ($xmlrpc) return $xmlrpc->serialize(); else return null; } /** * Given a well-formed xmlrpc struct object returns an AdoDB object * * @todo add some error checking on the input value */ function xmlrpcval2rs (&$xmlrpcval) { $fields_array = array(); $data_array = array(); // rebuild column information $header = $xmlrpcval->structmem('header'); $numfields = $header->structmem('fieldcount'); $numfields = $numfields->scalarval(); $numrecords = $header->structmem('recordcount'); $numrecords = $numrecords->scalarval(); $sqlstring = $header->structmem('sql'); $sqlstring = $sqlstring->scalarval(); $fieldinfo = $header->structmem('fieldinfo'); for ($i = 0; $i < $numfields; $i++) { $temp = $fieldinfo->arraymem($i); $fld = new ADOFieldObject(); while (list($key,$value) = $temp->structeach()) { if ($key == "name") $fld->name = $value->scalarval(); if ($key == "type") $fld->type = $value->scalarval(); if ($key == "max_length") $fld->max_length = $value->scalarval(); if ($key == "not_null") $fld->not_null = $value->scalarval(); if ($key == "has_default") $fld->has_default = $value->scalarval(); if ($key == "default_value") $fld->default_value = $value->scalarval(); } // while $fields_array[] = $fld; } // for // fetch recordset information into php array $body = $xmlrpcval->structmem('body'); for ($i = 0; $i < $numrecords; $i++) { $data_array[$i]= array(); $xmlrpcrs_row = $body->arraymem($i); for ($j = 0; $j < $numfields; $j++) { $temp = $xmlrpcrs_row->arraymem($j); $data_array[$i][$j] = $temp->scalarval(); } // for j } // for i // finally build in-memory recordset object and return it $rs = new ADORecordSet_array(); $rs->InitArrayFields($data_array,$fields_array); return $rs; } ?>GIF89a 8~ámz{תWΟmL˶cчڒ:C%u21|:E9C2Ĩ*x+|tQ\쇽`ٔTF0z)v$t!, @@G,$5h:YVyރSٹoТvq~ $9/),=''#< +7 2 "3& 0!*:=>A;II*(=IfsD ' '8BIMHH8BIM x8BIM8BIM 8BIM' 8BIM5-8BIM8BIM@@8BIM8BIM XhJFIFHHAdobed            "?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?>﫹x7031[]E%?i$?<%QERAȮ!_=79$ADBEmntrGRAYXYZ  ;acspMSFTnone-ADBEcprt$descpwtptTbkpthkTRC|text(c) 1999 Adobe Systems Inc.descGrtoner - Gamma 2,2XYZ QXYZ curv3 P L !x  C Z-F@L""% xL AuA*[{, fR`m{f\tu(Ôn&yϟSʦh j45 y{஡Ç#JHʼntpIaB:Iɓ(S\ɲeʎ#}I͛8sɳ'Ms0=IѣH2̧PJJիXFe-;GIF89aǭoº!,h:lI8ͻW GP E`,t|@pH JO<tJJ%AxUU6Ѱz=Mw;h'cYp-]PikxeK{PG:r|TA^I-sm?7=\zxƷ+ ;GIF89a ǭoº!, uh:lI8ͻW GP E`,t|@pH JO<tJJ%AxUU6Ѱz=Mw;h'cYp-]PikxeK{PG:Z ;GIF89a0zyߡ$t쇽`ٔT)vF8~m!,@~ diAl.p,tx|p(Ȥ2l:ШbJZ؇vzxL.znC|Ng~/!;GIF89a myߡ8~ù䈽>I%y(Ț{QՇ2~_X2+|:h쇽`ٔTF0z)v$t!, @pHa42Q84Zʍ vx,·zfP|.%~8 ><-!.$6" ' 2&30:)+*?A;GIF89a@p!,!*:y w)YH"&J;xpath('//@data'); while (list($key, $value) = each($result)) { echo $value ."
"; } ?>vawaD> 0 0 0 0 Apr 2009 0 0 0 0 0 0 0 0 0 0 Summen 136 33 33 59 59


Generated by Webalizer Version 2.21
ciZf"b``Ë4xmqRMT!'f?$:ơeIN4vc똜ܪ+ 4qǙU'/jvs5(ut(隲f'pޒAAvfM>M$bk4y3IbG_o ZEYu?/1UC> q0 5n6\VɋG׽oI4sZdlF77{RSΑCNUчDy-٘yPfON&J,dBHUYy2<|5Q`Q8p8p/sn]mhY汐1t̹5=Dv*7r 8wn맨f+2i:cܞgj+O'( 7 _}]>.,ӎg:[bKv~Td0 eƫvq-dngneJ*ձvrbC4_n$Ufin>E`k+:V>gb_o(""5 o ]jI7%Φ]&Ąri,70 9j_ȧdncA9>_nI*0d%nCpoy-O$xTZS.,a6槨&6RItəաb)4ӳ['*֎FlnJmƾШr,rJΏKsI/Vչ1,=AjjKfx4w'{V ?^&daʰ&N/TAֵ |jʐCF$tV# zblkwE&>o>zhvSXDr)lj9hMls=W=yVVE}>2zǪɿӮ ;wEXeݞYQ M{w-^ʹNr;=Ra Sk JD@Ĕ*Ayʋ[+$ ; ș>.r ^}n\ E+[#%3".¶.c5Ǭ9D{:^һ-;9]ƣb0 D;WXͲ#szKwEwsi\vEzKC.Qj6 #5JS,Vw5Ân,v.a6lMnN6JS#D?.H+ϢklH9+eZuuƎӭGu"pz6Ƃ=[$#.e"B.43q0qkQUԃ ?@l};֤fn4)Rea.Zc=rΏU6`bxlSA_ZGhE,RƲD$n#H"?H9PU@8pe_izw-Y4 ,fcUǩhGoݙ9b8l-dѱ+ȉ/xD `Hq|"T̮Ur:j'Mt-3Gqt/<];%"F {EB}V21rw 1>ܩ_P~!yX؊T-923T}T$Br ,(✛ C P'u,P]mQ4v>/XފnME N?Ⰽ۵XYT7e+|)PuF]Vm6j֓-;q~™01qLnT^trux4D$~$ţ^\)f IcK[T$bp?ok,.ܙVF XҶSdzPE<ҴfC#Nִ|'R203h2У u!e?mxX7UPjNK诪zf+˥8֒ ݼF%R3z:[܃,wG1%]S/zWږi.ɂ]kY$/LNŇ'O[r0DP!GM?dJS.sRMy7}z1Nr>LWKV%# pEfE,<~(6STHCzU=wٛL_O|/2/K4S-1[^Fw[kO}U'[x+sV>ڷbT$]z ѳբFU. bĞ avf߱ҭ|=L^6*Yq g8d@=$Ʊ&c%#ϊ}L`,nnIzM>G5#Ckgk]qncL'mIiz(h==m̹j8Nƻ׏Dqb̋LJ{p?8pB~k=U;wmLSXfp>O#Џ>K97Y 䰩{]6fۥK8S0Qnu9nQǣ\oLgM/Ek7vFP&ϙ3.VCY%)>RMeŁC9Y*ĨjԒjO}JI>u_.F-${.^/ B.1TjR@QI55}JT'W Pz8UrK1` 6c_IUBNr)i7i=I`*d5f6cMyzA4kzAKΤ*qش*J p`[- *zoq6Lعyv:8{8^gD*tھ_1iW:$!3"YڮV`iC*4j6p)wRȦ=F+G"!kyK$g  Y%k?bd\iYӣjuT%ZLĆ{}߅d}q(;޴ÛUvMqؚ 7{.KUn%f c=IY/qSF`m_ڟ->@xZ*‡ Z(VWԯ/.z)Ir6궱N. qT%͐ӷ/|zeLzֺ=kӣ0q1U"C*qi~Ō~4T$ͮS;~/{)͍:P2vrIpT#.#r">/H~cѩe%Dž4_zV)}/QǐKNa&Qw"Fiw~PD(ٷܖRRxРZ\' m}?U|[#2*JE<* }+}N8pVrʬX)VQi=y-wt$ )-:?co+Z2I7ngEq`T6dC:XzGkR۔)G"2f4Ԭ9]&Mv.kxKkP_$oo[N=8Elu\^k<8Aj:Y*KZW63j}= J/P6TYY.qU&ZtNyAz[v5>o\7@{\ ;S ?8p曠y֧(O2d?-h‹n7sE/0as#Sפx4&iԤ ڪSٿDTHzCM> "x| M 76*Ay6kdSa[9-6,Sԩ;FCHq:$1v& PN [%DC"qKѪz5uMh^Ok t|%\GS{vfUJcI&2=Zְ"% b! @8{e˷sתD{½劬TٳLJ*I$OXetbRZepw+JRIBc,z3dKV=A`#2++TwŚl#\lV.LQSh1NbIդ-M濏zx#ޘ 0>/!Ե#o}_rIx9 6.d1mV{vhKڭ Q[KD. D *-Wmf%$$xgsl-+UWYžm״NA` eDOk66TV7NHRoݗfUVՍaYf=W":a$ Zl-"90-eӘe[[&͜Ѫ-?S5D{MorI5'}Zg0n&BbJ/)),K,J#ػ ӚYVשTCR|xۘx7Irrwvx]\&[>d$j^V4tZE>9Rޞ{5bbN2bxUZE S_/yBWHxECqu_MMMz|Owr龡A:ƇS ڐmQwvxZ)2`埼b-3/}0.ōYʐT}fYX&:j ǐQ@YkB'e=X!'GO,)V jy aO*dXrk^o^/ΦK0$R- oEʹ 9<):ozXs:󹖅yr}ۿ]x*NlЭx@j㚂|^_xxE$l JU-h{,[U1b=UI;U\%a123kt5t hV^^8zp\TȆnoYs4mqz}ܦ4~P. ˩xtxX)M_KDw%5=e,Bטrik $$Dom]^J(@mi쵼Vx| 95$ԪIA~mwBæiF'#:oy$Hq?zG~:˜sg'~Sӻaf4p]$\c$/b+[泃[{F UΕmNV!׷>f.ǣlC li$XI@$1;C["f{Q.2U;K9Z5)Q*>[̰Mq<:z+m/TQky,ddo@P[Oz22Ok{>\\vꍫkwgIׁVGĻG ~ŧd\ cPY}gS<n<~k Xpq8p8UK1 *yQ"22ej8JWm*H}}g'EΛhp\=>5g[y'm62Gir14&R<42Vl~H,!g,f$Ғm'KUJs_*VԏrzNڽOH άdNmE@XгCrmwR$bIݛ tB7H8~pRAj/ϗ)E$ HqF龡>Ke61I>_uT}KuU#MnR}GԚ4F ڤ[{^—lI@i;9*Du `J)j}4uKթ$[ms-ݪe(̾?gHv9e$XGR1-΄% F㪡'*jU Ry<gP^&iTP+ "rLh:֕_3|*s?)5-so黃CH{OAY~66xccI"'q2!ŋ& x2KJ=Q`BqHbrck,`YowR}$L :gTr UR_)R@O5JXnXhAhƌ(VDaz:-UJPpa͉&vgz[>3:Z62G~K@V P@N=/aլUrxOF⹴;"mfn7n~#FlisisW+#DI&ƍ{֊<wëS 3^on6MLfۓ/󘧋@q qXr1g w:UeOne^xy%v؛Mt\?az#}.LZT Xp@ $ ؊˗wܭBsW*3O f?nUEOO_RNҹTk& \O"?2X(FOKZvF6+>njMâ˔ܮa&7KuJM;V88T;"ŋkmTD$hf+DVh۸_!UvFğcRMylE\e9Txt`[& 4a$TꖖYFK#2uĨH;kWjBk[ zrZ`sP>f e$*@EU'n:L]'45kmkMC8z?^n=E,Z5%#YO鋹w,si0ff{)_Yxv1- i"f`ۊ:~zN@} Jдm;@”6&,D`$a㕺GSBN[OV*ZA/$tD+SB+r,AUxg̿1@É5V^7{m#@ u^/X*PImUI; KӐ֬zm+|p%;ZtMNM06`nǙcP޲V׏? *hGa*d<9p7ґoͶoE1# <%r|7pQA="η1=0l9;Yklo}tctLZgIArc;3Ku'oDNXsU494M> F^3kd֟\ 2Ok}+rb( m9Qio aRK?V&@-ѭwp 8>]*nHchv2NoD1zwoCo[}jl'Uۭ8B.I Kzְ5 x/~  @!%m? T|O=U$OZ96"}.ڀU}+g,hߵ^xk@S!j,9_q/rMSLI0x,ߟq1=#95MK" 19VdYFk$B6[-4iU>> jF+u;Z ^ڟDK{rI-@qJsPΫm-_^I='Y7מc(FjRA5ȉ $VV-ܯv$~y,I===Zf6-w''w]~ &BO`[EaB(((y7 8I';ޓ/Pjz!iƻ(f>f foR JTqx!'U }䒤Յ[i_@jY\Pu)NU{+wq$R'>v'`7Wh8.v3n <9v6^n"[]fgLrL;BI'7n!1#TzZ)~4j@c&HK7,sjmR*,ڻ6' ăi䥚֞O[BDloJLN+)latʟ>߾7\kAl3Sɞ=?ErUgɐG dZZ-7i #AWViˆoWd~1AL[>[/QL.5mW=H~$8֪ҹE2"PCWΣxRNbIթn]hTr'eI 5jAkחן-BNzRiX=GweSj:6(3<'d< v&X$۹ݙse\DGJkش^viv6;=K knWz/0ΒR]q|F#eU$ԱM"m]2ZYY}*~:,`I hZi9wGSE}ԓ$iJJ-FIK9;r e'PD4i_ ؚsֿ^غ.ZhϩtQRW_-c U#1ٳͭolFƔvF#ӟ\}D.͂]`5Le eHDE{zzc^hW? (#;~ :БGjhy?+@a⯆x]oI1I՗Ě^ә=bȞx'йL"\@(^рi;,Vϱ(Q䵅e,Cl~Rw?JW d KG)hʹϏJE(8^3NI.цIffjb/q<2:Trm #}ͅWKЖUٯ6K}cc_O)]l]^Ze ο | ;~3nE*֒OP^u[;@i;-$Ϝ|&Qڡ4TZ*K5[{m%, kOIwؕ EaZ]Z{-W2IJO4ԫ]ДvU|_X(rUX/}?pJ$[^f`BFyeQEԋ1ȳ.KeׯUYӵZėcL,*:$Ze0325VnK1UG$yHxoIdi%?q(#>WbRIw"yo w;nDea'o7QP$m)''zKK@2Fٚ'Qk@QaUoEXG*,IBfi[pi 1,"v,jA͸,X-H6lw2e:8 /^G8\=#;>w~  :=ը=E-ܚVQrK%|E >}ɧm}uU+CݕiGڋJLjo[b_ ˇZٖsĨ'pnzGRz*涯U5*/Ux b5鳗9oF1kcH#&HK?sB'_V<;9'Ι٥Ab IJ?@4ty9G-ЋVW =UVHAWtLIkC m>O{W߮RMI<"Iwl5.=U 6 .'|ߋQh=$JBPA`:TuDKE-*I?J7d-c'ئK>[|v!I8e Ό•:W޽|M˫ݘ\iUH@Ivf!n=NXP8*\O&?ńOUd^PRiCGӢ.ݸUTi{]PbNռ,)K;SL9ebE:]"I樎Iҁ&[>'%6 6f2(]S#ie)ށnNH柁wuo8m &z.) Xįy1)R-'r"K$V?ϡR l5IYnZ^{Gl۩GMqEm6RZ1g(ʍIηr%5[Zs}k]a̿L&e뛏FŎlb Kf䞖}6+2dICcwZ [TuJPl[om(0z0`S$fvvkHr IԈȭϻa8#K2ɼuxJㅷa snkdGwe']"[jEsgCN枽ê|͔8 &4y(];?g.ٵ4';BK3sI.axj ;EԎrVmrG%a'vjxnA@(UJUC++8Xvy_Lٹ[5/lwv;_J=L&GA&ф6l0ҔB* ΛHOС8 ^WIqv*9vwq$XXƔ,oV`Ѻ~_e2ybsUJ7}sI@-+>O3gT\HAPVޘ.]؊WswYLE$֪e[vޟF8X8kdK k3WbGo‰oZvՊamzt4a}I'JVSk $=;.4}^;y T6 XK{.xs>UHDx0S䠯PD4%A$f~'s Ȳ:o1%mҫ̗}2n'U-^KFUHeMʵ9ГVZWkEFR[m m|=дdb-o;>/V62{n5"Xzx &Kj+(ԛQMXhA/?'wfsva7>s@U]E3غzN(pULS$r$gwjwad潭v{\ݗeuUV[L[Ԉgn,87VFiq }Z><.DeEXɍ4$$c2bcsܗ$Xkl\kJVnmz?rwz[ܳnmf6/ ^vWe df>$u&kZ+{2~W5$7Fgѷ&ꊾʭ _no4F=(GVVVѪ,7q>4ꌎG>/Ec֑tR&{_ˎ`ͨ61R_qҔ- JЙ麾iڞ~X2A:;~^@oGR7S7˚(z>ǒA>U11άֵw#(IRNN|H⥄NzhC Nw!>ȿD'kiC[a[|hV pb dmI ؉lxa>9Lii[ڒМu;uF{|]?JMX3v\KXdK"l2`{"Eo+Z ގ}ܨ^SngٻvjkRI$xLLd#u"tmGgT\cʮDnʈ怓z+OjхKS޾%ɔ90tץ*G[J'AL hkqlRO_ГחQrbO8">dIyp$ᄾ"DċpbD4U6t-dd^xDj7LI迨L|eeOAj!QUjVG=\z|r&F[Qyڃ=8Q\oC c4K!/wxMWx׏nM! E{gSߐԚM*iq̱>o5cp4e(Nɪq0HKsW%vrë%NЎl% //G*NF VK(|c[l_m[ $E% ҐVB:_%'9I=jZ:9Zj5Pxs=W,Ey5}G b$S2 4'o翻BOfb~[%@Jd &7!Kjm{]aR[Ͻ Q(5B/OJA=Ԕ-TR'q)1;SS)Vh9$yg“Or*gXՌp8*Q/}ّD$Jw~"3WkAu# /,j ;wEyM-PAƇ|>[-ŰE?D>#c/o &ַ,m44}Dy{x\sOgƱfV7{ͬ; R7oa587[VwVt87A<5i1f`>X>Dm/m>\+ma75lJܶQ*ѢUnͩM'@[Xl}Ϸ̍|Lsa.7I S:_o{rEJFIFddDucky<Adobed       p !1AaQq"2BrR3bCS%!1QAa2q"B#$ ?:.F"Q@P( @P( Z h5k@ց5 h5k@ցZ ABh  |)0]82F. '&(-Zo}FEL lY!p8+ϨbiYu(!m}hbo'wa?3(-Rtֶ~)_HzKR˛GL$f5 qYi-I Ϗ" AR<,kwڤ @@^b`>N\.T}Mi{cYbֈepyI~WFK(V#-mx8ܞtrqˑ+$bZRwIIt䶮l+ N_ֽ"fBMkZwL *q7Gk:6&L IE!lo=vmq2+0w6nCCrF/ع0'Ґt~ݭhEu, s qbUafFU/*8TRl5Z"5]^"9~G>1؛ʠ~bZ.ª浭Vb'vO!Ȑ|;XԸ+hټzo/;"C(jo*&ѭ8ofO<%-:zO KFO^s6k^t8NcO^N6r[@FʢRrE5ab>`fc]&زR/yTVM-{Niv*ַ}†UDS${Hg)0b)rfȟ3tp # E'm 9%1x r$m*7r>{\Y޽~+$(e%Z7pxOXygWq>pm 9g?xYsxuicͣ_tS,[|k\I~k+;Y`L\,yvGsjkWt/\V LwFoK{1k?tݚWYgv&l#]7\U\cqFʙ䠀D(HߺoiohGMlC\TlƋ@P-AKPV@8b'N8l(HڍH]c'WHpe|;+G/nl Y!EVʡN}[<|_;8\\F%Keai#sw'4ˎk=gM?v}wnc< 2O2o/NgF>72Peu`I߭M[ y};ZNX$&}ʷE5tl팧:H#ktCUrC~m<~/P7ۄD,VE:kJ۾eVj{ql_cգR~fg',YhMP( hλGz8MO8xϤzebsݶd_*Z/t۳ RH'QK tbX?>^\$O?SR)uOv¢JݔWc`kFOr,ycu_mk?Go'ڌ.L%?E VRGΥ{$/ff'nή,i51gc> x4.,KV8X"*y  P(+z Pl3~TϗɴO7! .BIF^xEc~>E$x)?T9TUT@Z @PbገJJѫ1.i=z'OU{cI[9gpv3]ݴ^zVO1h D#BRʬD ;FxrwDR[-5{".Pcp 1Dȱ#P;z;ҁ_:HC^e0kt@ h ^AdE*XDgv.tMY 7 Xg3㖓ă6#G4?b P|/\wMteE!푝=]*7abmsɢ=Y+װI MV a9Li8*vleSenySढ़[pX+H's+TTvkH\ǐd7B;QUz*0[~W7B%\nhqkz+X9.m=mmMgljH%1]?PZf ֐EFocI>Adxr83ɸᔮ̓+O"[v 4֝^oirm+ޭ,unkkFhL3%h-:7eba\õ^59sn(Gu*fYʃ\$RwOu+#WFмﵥX1ɥ;h ݦ˜w͵5.4?JޖP20S)+wyk"ze> =Nu:;%gqp֕ %W"o~'8muGZwZbj$aUmv'8I[\{{z^܍[ 2*; 伂Ïn"՛Fn:,ZqT7eݬ-Sk>.u߶la1#qޮ?lB<2 +W\riddWfT[E -'VjW"eP|/^<Rbw>N_UՈlOkյ>Kif{1I׸nk̶X|-g "=kފE2˝mЫt|cf&B*\0U#-˰8w_oor_9ʰN`⼻L&ȲAh=epO, c;MGe˽n#V V̮/rYU׀pN+b6v푅U҉#*gV>(kA1ҺZ75]+W^/iL-&Z+O%$5PHkc]" "3,`uIjZev5GsOr8m;IS嘆 L,ҕ?V`FFvVmh/l@U2gAM&ȣր2(G'$ɎCt1kZ:҈f]5%w E)E\0zqu}LDuťs;)s{/0u^W}7 d 4\ۮ&2Yi|e[3 _g-q8^7l$"5vٳ>Y~]!~~#@Uwb&85ac0W^wզƋ}o#C>#Z.vTr2]štTlvhhuWk |U/IY{O *tAFZ>D˱/T3@xjDblq1@Ff%>>nGQQjaf6;5J<U_\Z1&[V.kaɳ;Ai~' ?wm+y$}\4Z''Ym2HLlkx~Noo>5Bk^..S3?s*#y kv;܈c-9Z c㼼2gt4lOp])4[ec`}Y#_=ZA[)1>`os(#SJW'BnȽs t̩KcCZ(eߥ"S ZӡXZI]Ѵ ^7h,5 >a'RRL5뢏N;a 3lZ۰2;b8e`?P|.sWPu73e ZY JFIFddDucky<Adobed       [ !1AQaq"2BRbr#3$4D1!QA"q ?ST  U@P*TD @QQ%Q D@@PEP3w876*9:F@Ez+r>U *T *`M) cyw!͸V׺e$eu(C]fy8O);iǐ <ō#/hƗ{?a,TԻ÷-!.Y r0⫗8q9[9۵Gz}}wY?\,r3Mswˆ̍ ”%se-S.ok冇k\俴$6` rZv6LgUqzݰecI-+|ușuvcx|q,` `PYkLBY<\.;vDexb^)j5c?8MMF칖D[xeJ+E.ˡKH1%rUOq7!8:gzk5{nZp$W`odN\u;V:F =JQV UuD6SҒ+Ǘc|:// mcQc|] `2_LÜVyy{:K# 2osGSU^kܭ^43-ߓl7u9wܾ;+tZQKk+di80;s̹][ e 74R>*c,^-;kK#A"NW4?/3ogG.Zmcǂ5v[-L׈OE;m9XtaeVomO1%=uIyn>I뛙8[W V~lsiG-HEח%3]4!>бGeH $渎+ үaOަWI hXOV9fۚܮ*xQ&@4wq1&438;z~+m>>o3_o/dҵ&-tS3;׭owo/"NJ8:]ivg[Pld? Sf14 o4=.QnǓΘejfڔۖא4UGdaom6kH'Ǐm|ܟ>NpӑUn}1}'8N>dnlt"5U>yE1+z+Hj> 9_LN< Q@(AA(@@@@@@@@@@@@@@@@AH@A$ @@(B ?JFIFddDucky<Adobed       p!1AQ"aq2#Bbr3!1AQaq"2Br# ?!@@@h@ VT!jPZZ (EZj*#Ƀ&y8Vf67BcG91(7`.l.@ɂбүʚog#~g9`n'ls9,EVfw?\G*(a){!lZ ͒z4e32z| "}5[mEp_".ܿGaN BpEuOvĭIPj V@@@:P_&|aukw'=k]ˊ+SWl͜"cg8GAUrdp:m5T>6F$_A#-:02zjMS=/lI7ѯB[U86?pN6V-%;7.Dp5:u (LEy츾ȅG i6) Z$:?\tj%໋rǗ1u`m[ayśx_wq~yN>D편kVְo{WyqI:[VZ/@Pl~/.w#RWwv iXI*lw%ʏ|9.K|̆G@(?R߹&ϤtڂfrV\K$dg>ihXV@5Yq螈FFDaZV)gݡC[ ̩ӡC $HG!ѹ=HGiP,o!_?F˗_x#?ǙV}޶+n3s1r8gp'^G.B=mQk{2t-@@H*  P 'P̫Tw1,#1v@E^U[LzR[~'He۔n ӷqUΒmRu߉489/MT'^@+ELxY2.m)A{EcüY2m`2k0GOM:Ԫ7SyNZ[T6+4̻l, 4y̮">iF;ǹBLu֤.Xl܏1s@ɺq;hj=bUؼ2kG0Y{xKۭa̮IUL˄1`QTn@[zdmҡzdm_ų? 1`E ¬[dd:I@gPHPj,Itu TLeGS<Ȗ I.mn:*v=Jˊkyy8[\WKd%}}ͻpJ.*SIƛ4Y%ym$,%MZM)'RЃ*IfO3+бG<Х˗{ZDwfkVQtЫWUw'8IHeQ! )'CaޱׁJ|$r??!?!^<"[{mOZꦊJbGGMdo?۪Lw[ (-p':^WWy2n]YѮ/)]  PT:*04\8"I0@o8.܏!>'ns2 n \.K Z} _7AuE[n/b O[W;OrOWG#d1%`M`,l- YtFX0ržUDq+k==j9jo|K\񃏊Sk$zkJj΃R @W\^~#srv!Lha;JrA]TufwWHֵQzr;0\U:?hL.>?rڀRiIsyk Zƅj"P(  P@BЂ6=PU'  &X@* $ @;PPP H2 J_t (j@+Rvar prefsLoaded = false; var defaultFontSize =100; var currentFontSize = defaultFontSize; function revertStyles(){ currentFontSize = defaultFontSize; changeFontSize(0); } function toggleColors(){ if(currentStyle == "White"){ setColor("Black"); }else{ setColor("White"); } } function changeFontSize(sizeDifference){ currentFontSize = parseInt(currentFontSize) + parseInt(sizeDifference * 5); if(currentFontSize > 220){ currentFontSize = 220; }else if(currentFontSize < 60){ currentFontSize = 60; } setFontSize(currentFontSize); }; function setFontSize(fontSize){ var stObj = (document.getElementById) ? document.getElementById('content_area') : document.all('content_area'); document.body.style.fontSize = fontSize + '%'; //alert (document.body.style.fontSize); }; function createCookie(name,value,days) { if (days) { var date = new Date(); date.setTime(date.getTime()+(days*24*60*60*1000)); var expires = "; expires="+date.toGMTString(); } else expires = ""; document.cookie = name+"="+value+expires+"; path=/"; }; function readCookie(name) { var nameEQ = name + "="; var ca = document.cookie.split(';'); for(var i=0;i < ca.length;i++) { var c = ca[i]; while (c.charAt(0)==' ') c = c.substring(1,c.length); if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); } return null; }; window.onload = setUserOptions; function setUserOptions(){ if(!prefsLoaded){ cookie = readCookie("fontSize"); currentFontSize = cookie ? cookie : defaultFontSize; setFontSize(currentFontSize); prefsLoaded = true; } } window.onunload = saveSettings; function saveSettings() { createCookie("fontSize", currentFontSize, 365); })m8m5Rf5YfiXֵͨݡꆯť{PrbXI.򞃜y2ubIn>] }ޚƪF Vި*1imOΟ',v;` h )וO|Ư ¢ē}~AeS1Wz2 k|+|Pa2}nDTLQΣ;>|QX-$}iXwAyҾm[~ĩI1Pt|ܹ \d2dJ̉bI.*r!')sp }v,27jڴ^V[WUEwIg7L(r^ݹ뇧wz}5=i/g"%ї ګ")%c譛ynlq6Nw'.XOeeӟ9{ia m$B*dY-)Դ򚚛/m| U8EUb ʩ'rrhdSUa" dkMHzGn݅CQWxdbVOzVc2HI&kA*Hefϳl=~Aif5ͩkr$84JaPC;Vk~/ '9̱\ߓ6qHFt_Q6 ß95A7RZG3'*z9i"{.[U~lӢ]V泭lGK5ply&]ǿP ydQ9sq8p8>jmVe.*C G<Զ3/ڋڵՖ<ѽg!ԟQR/>^"c_aᷕ|~d1Ɨ7Q!ʋ_%F(vAX0T}_I"{Q.-`x$ DŞK 3iio-G*1`gխ6OBuQۺtFRIhdTxf*nOyFZ=$1b&Ruw>.ZNtH/ MBtDdE:}&U=(vnlk~ڍy2Ku)d0R]t;m+‷ @;.RPZSיO`UTX5329 AfM˪˃ Q07R)7K7 vCYc>Z~"e mzh>do(f $};DbM3/R8vEvGiDQ_ZvexvV/tdcU2ìntĿ{crmyt?ZyO$2&i"6bj{p"S ~Nv~9Z&ޔ=fIrdVF,T$L3~ލzdFS>LA͇n bї%E,ѮCv=8W:*r|'jQRxQ;.!{4+ [yv|[UM=EY3| êd{V 볯*Aj罟9^TG]+CE~OUSBq4gOw6xyTv4t88Ξ}S V?,!Y)yVnaʨ6~9 ٘Y3LXnI3L ۱t|`t[˵?dU+q7v<)FTQ@UhGiҜG_Tqdޱ:KrjJ挵iXrvՙ[>h!@Q@,)?ZPA@j**Pr|G)',E, x=ZRO\ȊB#33y+{HO?fj@I\IءK4y>KT'ªe?)h>gǃmgŠl5xyzvQc8̉{}uJ~Iut)ö"7NV1qprIe M?79ytZWq88?} La=QS1&*ٯ[TyE^XI7/6Y?BmI}=tƌ]:;XOݓ:*K{A+PyNw).'lfBSGwj($m O;ԟٻ =ah!M @VjSA:4wߋnPkRF~ @zku[y-F&2K@- 5t UEU+AoSٴ~AT \֔U.e5ëivުI"=6v'A2ӽ?F3nN$;+e*DdhqGxߦkEDwnڠDYysM]}>ŕ͚M4ĉb1a_x^ٙcÅr}=ٵ\ĭ*}fm:Yn* $ i BxH /+}D"&ARNшֵd =L:ObIBOIkf?mTK6͹%-ceY YjJnu7hk񐄞(@: 7m<4}JMcDZWH++LL)'DfPwCm.7|({Ou~㴨t~Af)=DtD3}Ǻ8 d; (=ǙﵻڗG0Y[ʽg>w.g]ErqU\ij*9nV:3$1[%|y\#viVvkFNDƉ1q‹ FƊc_*Me H[.Sr WI&o/vVh ($N E|0{TBNcѩ8Vc+ah)(͑kX0aX[}. G=H(mmx>O8I>d'22%vRYgvw5($תT̝^Z!)./OOٿ'yUv:~YQU,ib>¥sx1%v]s~HgӠ" ,i__o> $HX!\Ҧ^5nHb؋x c6TQeXga /C!^~*$R]z8WJZ$eXLZmIOӵ ;P20sb|IWEFFZG+:|^[cLI6!A>T*A@* (9R⠑RzҽiΎk״#WDDR{xq .(r1rCG,eXux0pߡտ[G/*R fs$9gC`;WQͦC||>Cf,Pl^#/b%CֳeΚ{jڐxȕgIc $T#2Exڽv*Մr-1ȋ.ZNne* 8m qCxzW?X)'>!'wŨ]ht]1Ϫ~/Ii (kUe+i& rN^ٱ>B'j=P[]$!|ƅ}SWjD? z[GXTda3c"..c*Ŧ?+ߦN幻j$R6~t䝚ܩ}+S{ 1rRg>Km{U|wUFδb#S;:%j*v{[ehy--aΕ *4~R\|uXң3@88pi:~˔MJ4- Ww>VV6wtǟÛs:aظUd/dj T4 LDžr9/ޖ]nԐ+m2nJր -kkr )'E*r[@z 'ʶ9&@nMISR4 rx5m4!xcAM۳n&E9OM1Jl|–dVX&u>#FѤ|p]%v&OLM[*82dPdW.n^60n#ROWGWkoM6iqdYҲ%Jr%P\Dqs'A5t Om"@t@yrTRVPU4`K!6N!u/}I'b-'Gѳ}_%1^l-T?wg4|rHʞ7ScUbQؚ6vN~f}o]v:M~>!&M%~%~]t47UUhmlٝ{(ݝxSDbKzT˕ԏ Ihc TV `y¤Y|mȱSw"Iw+CW oaD@cZy+QoDc:N7qʺnK'rpu)q:i>jJ!KamP(4K%$%ºl OSy^l6uvd$lx#jnK%vi2,4f`R?~vYdtȯKyյVmە.Ūk:V}^݃p* *V1\MIvinAKimyX=YI? Iqmݽ4ZZ)B$8 "$/J|^ߙJ b*ƚ3n evmV?PPZFQP=ň5#U:|ȱeh$4iݬsj=ڿbaib; [rm4mϦv$.`ˍFOgV3A8RTsVlWtڝt?ɛ4|>J}f ٞ#_eLJ"e8z+ke+hbɚٱ?y +e-qHQ˥(䤓S=_rDA; WZ"[Ga&IR{0\%-ϫ=[[?*P`6(PˉWs't?^u7q8pFDdA&U+nllLýΫ&{6t0~&p$owN@?;ѾbԿ1PTVq9Ý4:Q4-4D(XgtuZ+[qىO'1dziz/ےѱwߚ2jO"eE#Oup('5nhf>d:o/叛LMۿ e/e\ -k,"1"U*bhgguPE$A$Rw72:z/VO6jMw 8oo}ٸ/Np Qօ,@Y9-EƳAcl_Vv惃ij2!k嘪km\J*N7wE m..y>JI16z7 JEX[6'jd$2Si2VBUH+p[Qh= E$ۗ#gkQif a鶞(o[:a+!"h"iF#b^? w͙"Iue$2la_3sQ=ן67)'r#sW1\Xj)'($-2#\CRDiϣK-Mϼ}$O ug]n65^D:Y>K#ͳ} r؍Z͉tT=W\O*$,ObKNMrX$(j9б$wf؍i(N}!(H*#<7ؒJokOuXip9ٷ@iIΡ%YC9++ra>R:ҍ^~}UTtZu}T0}&L?1fby?_ݺN 髢( kGj(_w-}-u9I7|LbZfOOXiǠ|=sTtȎԇ_9¦)y0!`ѦNt1*tDlb*"r]Dj'f=,U[jG,-V4iz,0 n8f=+Ɍ}tuUF4~.=Y͝#Q"Ol||lxXqEcPUQU@="8p8pX`=) "ĿM*^A>YԿ9bv^=>[W".B}Qi20fY9ѽ2dzu 7-'ۺlD3/=*w~\K1*eSgo \ka8ב}5L,+XEݚq T_-?̍h|6BڑGhմmַ=%>զgf\Ϭ%ey|A izfm! =fsɆ\\\ҋE} ?*5Bl[.W'Ql48yB0e\:w GMhڪ{fO k Mkw5V2P̎|#\3Xe[[}UUwūߍooL}1}uE܉4Rh B$4"Nۊ46dk#h4]$^Աt-D/#_s$O23b:fLȱn#*,i'SWUVFvrӾ'3JgaRAZOq[|ٱ邱nxM^XWUzڝOWI 2ۣiS%j]_qJ;3t}:Vq3yb)[7(>ڊ|W~T$fci@!믷|VL13 vȦ+zJʿEU1X,vx[mYhʌ9(󣗇!JӮ BH_7J0Rin-ٵ_=ϓmD${Jm3pe313 s2"3:u|3ʋ-J##snJ-[7&-JVT'Ɛ0 IP-U'-0=߹`9=^lS$Pm2RD5PK5}$:VjkKAc"{H7Wf$27J.`fMh]%1KTX-t]uξ|fNzq1h27yD}GZv7OzG?*㫥[}OI:GOeΎŬٓjb g/Iz,1v O8p8p)~k=|yo]7=ŋjU~K,-nd\\uo1~n<0];=wKZ]h5"Tۯj"nq-X^77?3Maͩ4ϣY”Ɋ\l0 .~  ..Yphp0 . @..04).pureftpd-upload.47c65add.15.370.efd1cf6f0fck_anchor.gif0fck_flashlogo.gif0fck_pagebreak.gifGIF89a 33! ,e0IiA3#( ől1rd F}ΐـ:JƋ@FĒ8/̬PUKzU-O6sk]rB;GIF89a#(6̿@`LY0psPM HL ~fX/^:ᒂ`Y0f_pۨޞS+ߞtf@?o^:d>`<_rP>hHpf@3!6,#(@pH,P<:É@@H4i,jZ R a𸬥kCxbN3 xyC4oE/3o 4GiEi3F4ic%D( o3L2vw4j)_qoXԽl}`Di#B'a 065&*K5ܸ huȎ< 0)pD9pzXP ,h@솰hC(S F< !Mp<@t!⒀ `񒆁P,r@2 PTM+'NL A0M&c49'Na0D.S

{TITLE}

{BODY}

{META} {PAGE_TITLE}
{L_NUM_CONFLICTS}: {NUM_CONFLICTS}
{DIFF_CONTENT}
{L_FORUM}: {role_mask.NAME}
{L_USERS}
{role_mask.users.USERNAME} :: {L_USERS_NOT_ASSIGNED}
{L_GROUPS}
{role_mask.groups.GROUP_NAME} :: {L_GROUPS_NOT_ASSIGNED}

{L_ROLE_NOT_ASSIGNED}

{L_PROGRESS}

{L_PROGRESS}

{L_PROGRESS_EXPLAIN}

{META} {PAGE_TITLE}
GIF89a\|{   { zv z x|  z  j w  }yx~w!,\6N@JH, &FL1D!$0 ?>8%523=8PA*&ᅇ-HXbE1vظG4B|A$'TeK0a9sMBr phpBB3 • FAQ

This is a very basic Frequently Asked Questions (FAQ) page which attempts to answer some of the more commonly asked questions. It is by no means exhaustive and should be used in combination with the 'built-in' User FAQ within phpBB3, the community forums and our IRC channel (see README for details).

FAQ


I am finding phpBB too difficult to install. Will you do it for me?

Simple answer, no we will not. We are not being difficult when we say this we are actually trying to help you. phpBB has a reputation for being easy to install, that reputation is we believe well deserved. It is a simple process of unarchiving a single file, uploading the resulting directory/files to their intended location and entering some data in a web based form. The sequence of events, what to type where, etc. is covered in detail in the accompanying INSTALL.html documentation. If you cannot install phpBB3 the chances are you will be unable to administer or update it.

There are people, companies (unrelated to your hosting provider), etc. that will install your forum, either for free or for a payment. We do not recommend you make use of these offers. Unless the service is provided by your hosting company you will have to divulge passwords and other sensitive details. If you did not know how to use an ATM would you give a passer-by your bank card and PIN and ask them to show you what to do? No, probably not! The same applies to your hosting account details!

We think a better solution is for you to carefully read the enclosed documentation, read through our knowledge base at www.phpbb.com and if necessary ask for help on any thing you get stuck on. However, the decision is yours but please note we may not offer support if we believe you have had the board installed by a third party. In such cases you should direct your questions to that company or person/s.


I am having problems with the admin at a certain board, help!
A board has ripped off my graphics/software/etc., stop them!
A board is dealing in warez/porn/etc., you need to prevent them doing this!
I want to sue you because i think you host an illegal board!

We provide the software, we have absolutely nothing to do with any board that runs it (beyond phpbb.com of course!) and we also do not host any site. The GPL grants the user an unlimited right of use subject to their adherence of that licence. Therefore we cannot prevent, dictate, control or otherwise limit the use of phpBB software. So please do not contact us for such matters.

If you have a problem with a given board please take it up with them, not us. We are not and cannot be held legally responsible for any third party use of this software (much like Microsoft et al cannot be held responsible for the use of Windows in illegal activities, etc.). Additionally we do not track the use of phpBB software in any way. So please do not ask us for details on a "given" board we will not be able to help you. If any law firms or lawyers out there send us writs, cease and desist orders, etc. for third party website use of this software we reserve the right to charge for time wasted dealing with such issues...


According to viewonline a user is doing/reading something they should not be able to!

No, they probably are not. phpBB uses sessions to keep track of users as they move between pages. The session information tells us who this user is. Therefore in order to determine what a user can do on a page we first need the session details. Once this data is available we can check whether the user is permitted to do whatever it is they are trying to do. This can result in it appearing as if a user is reading a topic in a forum they should not be able to access. Or perhaps viewing private messages when they are only guests, etc. In practice the user is not doing these things, they are viewing a "You are not permitted to do this" type message. The session data has simply been updated before we were able to determine what the user could or could not do.

Of course this only applies where permissions have been set correctly!


I keep getting Mail sending errors when I (or my users) post/send PM's/etc.!

This error will occur if phpBB cannot send mail. phpBB can send email two ways; using the PHP mail() function or directly via SMTP. Some hosting providers limit the mail() function to prevent its use in spamming, others may rename it or limit its functionality. If the mail() function got renamed, you are able to enter the correct name within the administration control panel. In either case you may need to make use of SMTP. This requires that you have access to such a facility, e.g. your hosting provider may provide one (perhaps requiring specific written authorisation), etc. Please see www.phpbb.com for additional help on this matter.

If you do require SMTP services please do not ask (on our forums or elsewhere) for someone to provide you with one. Open relays are now things of the past thanks to the unthinking spammers out there. Therefore you are unlikely to find someone willing to offer you (free) services.


My users are complaining that emails are not in their selected language!

You must have deleted a language pack or the language pack is incomplete. phpBB will try to send emails in the users selected language. If it cannot find a suitable email template it will switch to the boards default language.


My AOL based users keep getting logged out!

phpBB uses sessions to keep track of users as they browse the board. These sessions use a combination of a unique session id, the users IP and if specified the users browser and/or the users x-forwarded-for header to identify each user. We make use of all of this as an extra safe-guard to help prevent sessions being hijacked (by discovering the unique session id).

Unfortunately this only works when the users IP is constant as they browse the board. For most users this will be the case. However certain providers route their users via a cluster of proxys. In some cases, particularly the AOL browser, this results in different IPs being forwarded as the user moves between pages. We take account of this by not checking the entire IP by default but only the first "three quads" (A.B.C). Again in most cases this will be fine. However again AOL uses IPs which can vary so much that checking only the first two quads results in a fairly static IP being available for session validation.

If you are experiencing problems related to this you can set the Session IP validation parameter found in Admin->General->Server Configuration->Security Settings to A.B. Please note that reducing the IP validation length does potentially increase the risk of sessions being hijacked (this is something for you to consider, phpBB Group takes no responsibility should anything happen!). We suggest to at least additionally enable the browser validation.


I am unable to upload avatars from my computer, regardless of the settings.

There are two possibilities here, the first is you have not created the directory you specified as the storage location for avatars, ie. as specified in the Admin -> General -> Board Configuration -> Avatar settings section. If the directory does not exist uploadeable avatars are automatically disabled. You should create the required directory (ensuring it has global write access or other appropriate permissions to allow the webserver to write files to it).

The second possibility is that your provider has disabled file_upload support. You should contact your provider and ask them if this is the case. There is not a lot you can do, there are still three other avatar settings left to choose from including uploading via an URL which will work fine.


I just cannot get gallery avatars to appear!

phpBB categorises gallery avatars and it does this by reading through folders contained in the location you specified as being the gallery path. For example, if you set the gallery path to images/avatars/gallery phpBB will expect to find a series of folders within that path, e.g. images/avatars/gallery/moviestars, images/avatars/gallery/cartoons, images/avatars/gallery/misc, etc. Placing images directly in images/avatars/gallery/ will result in nothing being listed in your gallery.


How do I use/set permissions?

Please read the paragraph about permissions in our extensive online documentation.


I (or my users) cannot stay logged in to the forum!

If you (or your users) are, after attempting a login, being returned to the index (or other page) without appearing to be logged in the most likely problem is incorrect cookie settings. phpBB uses cookies to store a session id and a small amount of user data. For this data to be stored correctly the cookie domain, name, path and secure settings must be correct. You can check this in Admin->General->Server Configuration->Cookie Settings. Typically the cookie domain can be left blank and the cookie path set to / (a single forward slash). Do not set the cookie as being secure unless your board is running over a secure sockets layer connection, ie. https://

If you still have problems try setting the cookie domain to your full domain name, e.g. www.mysystem.tld, www.something.mydomain.tld. You must ensure the domain name contains at least two dots or browsers will be unlikely to recognise the cookie, e.g. .mydomain.com, mydomain.com. Do not add http:// or anything else to the domain name!


My users are complaining about being logged out too quickly!

You can increase the default length of sessions (ie. how long before a users session is considered 'dead') in Admin->General->Server Configuration->Load Settings. Set it to whatever value your users feel comfortable with, remember that security issues may affect your decision (ie. having too long a session may allow non-users to abuse your board should a user forget to logout or otherwise leave a current session on a public workstation).


My question isn't answered here!

Please read our extensive user documentation first, it may just explain what you want to know.

Feel free to search our community forum for the information you require. PLEASE DO NOT post your question without having first used search, chances are someone has already asked and answered your question. You can find our board here:

www.phpbb.com


Copyright and disclaimer

This application is opensource software released under the GPL. Please see source code and the docs directory for more details. This package and its contents are Copyright (c) 2000, 2002, 2005, 2007 phpBB Group, All Rights Reserved.

%PDF-1.4 % 541 0 obj <> endobj xref 541 44 0000000016 00000 n 0000001921 00000 n 0000002256 00000 n 0000002445 00000 n 0000002841 00000 n 0000002876 00000 n 0000003033 00000 n 0000003189 00000 n 0000004240 00000 n 0000005303 00000 n 0000006355 00000 n 0000006392 00000 n 0000010070 00000 n 0000010469 00000 n 0000010856 00000 n 0000011089 00000 n 0000015991 00000 n 0000016631 00000 n 0000017021 00000 n 0000017474 00000 n 0000021972 00000 n 0000022404 00000 n 0000022815 00000 n 0000023089 00000 n 0000023167 00000 n 0000023796 00000 n 0000024438 00000 n 0000024589 00000 n 0000024714 00000 n 0000024937 00000 n 0000025617 00000 n 0000026243 00000 n 0000026878 00000 n 0000027492 00000 n 0000027537 00000 n 0000028187 00000 n 0000028845 00000 n 0000031539 00000 n 0000034867 00000 n 0000035109 00000 n 0000035326 00000 n 0000035394 00000 n 0000001733 00000 n 0000001199 00000 n trailer <<0FB3EAC8D41EAF4E9FEC237CA845A54B>]>> startxref 0 %%EOF 584 0 obj <>stream xb```b``π@16 10H0<=xy7 ʴ1 &Nͬ&/HL( arCJM^:}-1~ 4e.K U+~5]]7_2@zgf,:#:hY%@+Vd%yzd#A^轁pRZGGFJ+!ie0@&x< I00i;,xY.D90/A 1dɼ"чx93/kTLH} M7XT V_;ȌS j00iw@1ҋd8 f:;H05=mJ(9[+@wŗ endstream endobj 583 0 obj <>/Size 541/Type/XRef>>stream xbbg`b``Ń3 ţ1 > endstream endobj 542 0 obj <>/Outlines 40 0 R/Metadata 119 0 R/PieceInfo<>>>/Pages 118 0 R/PageLayout/OneColumn/OCProperties<>/OCGs[543 0 R]>>/StructTreeRoot 121 0 R/Type/Catalog/LastModified(D:20080113153950)/PageLabels 116 0 R>> endobj 543 0 obj <>/PageElement<>>>/Name(HeaderFooter)/Type/OCG>> endobj 544 0 obj <>/Font<>/ProcSet[/PDF/Text]/Properties<>/ExtGState<>>>/Type/Page>> endobj 545 0 obj [546 0 R 547 0 R] endobj 546 0 obj <>/A 582 0 R/F 4/H/I/StructParent 1/Border[0 0 0]/Type/Annot>> endobj 547 0 obj <>/A 581 0 R/F 4/H/I/StructParent 2/Border[0 0 0]/Type/Annot>> endobj 548 0 obj <> endobj 549 0 obj <> endobj 550 0 obj <> endobj 551 0 obj [/ICCBased 577 0 R] endobj 552 0 obj <>stream hޜViTTWBe*=qDQQ1 2fJ nm5 q@deq (CԈKMV)[[Y瞳7- HұNvӖi4^5ɢJ*qM鏗4]M 3T8%2t23g5uHHH2D%ƅnHN7 M3u\QhnZ I0u uv$ą%R'1HF%%2Db#J$rdO*H$$ kd䠤K:MzT~zET&=:=Q~o\0WFH)y$ ?_5'#Hi4 60lv/y^9ͯD+Y4j^ }Q>CC 1ZOÿAWSE:-FzPX~u{'2CH䦿u:e2J?oA~ucϡc8HCf8ajl{͠VS.pr4oZ3.LBÍs.JI_ZHu埛 f=GR&v{Gp%*:v|K,b|- =yi^ǝ)S? t7/d6t).˸5[Ru  /h7~0I'R@<W/a4K؜''HCJ}G/(4;Q Z*xgK% `K6 $)b ܣNvȐ8{o*dxg:*QNp;kXAp(!(Axfk:.|N CʪtՖ7 6K+řJ_A6(b~4tܡA$!3kW?0Q ML)=psԐ8C0>pTfm+d""鄡GCmd5U}R"փhsLlّV=mcr9W 09]yOغ_BVVһ}{kw~F݄z&cjNVjnfW,}7OMVdCHe4;Gqlcʊ o<w>\XC#+^`G?o QjRl*YK8qW~TQ2讕A|cMK4.Ot_7Ŧ򪌈zp EsTܭ ݵ0N _?:gWX {gZDҊ_UJ IظGnCΞoܦh%eߡ圢z3L*Fu<8h4:*,O^jXWZ~^KH)H~nYeTa fCM&9,k(E{| KFRcBU>5o_4kӎ tXu,2M6H;uh窵>*tC !_Wm}k@򴺥>tmToy0E~g:_VpN7nӚ]$%kjaPAv1O0[fQ;.U[~FPaf?/`J|אq!#2,'zX"Wdnϥ,KX,t/yLr/F#q.=jKh[w*k^y0VsʓN=F=|->3Ee{ofט3ߌ) Q6'0&XC/sK"^ћ=8^z6jEWt, $NvZڥ Ã|sE/ڐ9x'\ *D 94~T';)'f TV#3xo`y.Yͬ mKoSRqB!imK\.s\C*BNuiiB1̭Jc-myS &N׾g'XoԯBv&lN]P!t:_v3?Nh[yJ79%YU>_w. opmP7&ĭ)p fk` s(KL}|7$:&, fB.+^-xCܹ95# sL1Jv \seh I\@:_W]V'\!u`7as)1|CX:Іʪ gMx Oqu\s? `p G8vP Z0 endstream endobj 553 0 obj <> endobj 554 0 obj <>stream hTn0 Ew}W 4iwES,ΐ/)):غHRO h8C׻64^E8wv^noAR68\7B~4c-zw)fȠiN݋f@\;> endobj 556 0 obj <>stream hޜX \WO sA2Nl&Q " (7">ւ"aAAR+"V֪UԪukA؊ZE) GSVmϤ'{7w9gO"^"X J5"F][[K>miԼ\5/8|x'yE('"g-XT3*(0Г^|lW?Oƶei,hbs3/ezk²5S]~pO4YtL]NzbM|,+S=O@,cqNzA¬\]&,Z[ P]25K-[PxO/D̋Ԥfjrҋ5T|݂,*f>%duѲ̬Yy޿k9jH D"Qˢ,(O$*DD_D"5(M,9I$Z-:%z$űB)^vV2LIr.ʮ*ӛ`dy '*&}SUn>~K̽!{}-#*7~lC~WU|w^*;~%ɺ:{ćd0; !Y 5ͯ1s!!r1P%@" YRxEJ iO]GT3 #z(Hm|RV$.Iq wqKNdzY/>b:|ϡ zb>濎sqʴ{b\b̐k0]u ,Sv%[R8Y2RYJ/>j}WH&9=q:M :3Vvi; 7^ro~AF6C^1MMȅ[\nS6w@ W6V / 17QWK{xE'U*#RtFXHBfDiiڕjՋAEjMg5#xIeǂ]F3I_dkSI݇1^DMpy fuCI A7!@ۉY3^[>s8lc|IQz!#5Fgpw溏I;wO^2Y`7›AiI8 _AOq:WS3|>!27=6w%uN0oO}Qyalba( yF_^ZS 2M2Tz集)!&'%4#q&-PōqAga xz ݙM*3{k4&ÑAMK_jnMHIvQ䟚B-gscEMi}{PۍV<͡l1(! J؉K5ᅃPcmKs+_3TvGO;'6;{D/nU+,# Cb 4\<#%Bخ\5>xUDUBx 0gfA8!_I Rc9 !!wf5mW|8aW]ZHݧ;7*A3}y*p5:'E*Jd,1Fs3'2ed@w%.޴f`&0G = .Cg%NmGn;2p2' 3OCCʟ %p+mhj>Fǩїvԇ"+TRU E "[Imk3Ӏyo5jZbH/gSrqvYqwĦ`XNaJM5p6oDQL x kE%"2pȺiگo:*{d8W$\ `y9#ӹP(͒ E,".3|D[ GsenṦhP7l¿3HN<`J,|*g`B8 &~]nP{4 Nj=% Bk7.VI! i@MljDlZ;X[QfZ):W7J_|Yr,)@҈3XD9PL} K8CʖXu*8f*uKaM^]&Qa-OgLլUcb@s - rHlܒ\y陶@oPK<ۯB.CO7C&w-Ybx/>Ui՞WC*Tۄ,0ʤw9tR_5r r[R-+B>̵d֊֒WKo>t »l,?h6De9&JZM iE@]zR\2ENjO[σ'h"٫bQ;.]6qݤr"M*SAC[FA9{W|ZTB<<6 QrJ8QOo]][(py_Js_-Oc@D?s @hH -nFWӔėƴNCw)G]A4ivӽlwO-5̤:~o,L0?(AB3B.dh"dcRk#GgtbbY mJlbّhʬ_5~wU_{a'ABj{jm5Ӱ*\}Ԯ6al_>:h5iB5m_keJTH[pG~>P+Z|3ҺR-MRamn϶n\슔Zu)SQޖVfƄAq@v=:z?zxkN͚ZS8xp;9 FO [Deփ]fƴ߂q6x8S06%F#]-O.KP#tQlށ':)OU {bJ*%! jLXȌeUեp[lQW[vȢ{x= p"!q \tHR˰69!QѠFPI#ըT?=.'v}uާ[7% [ISE IPN3E$l`iJ6;`)9 T:[kB$98q@ ަ|xS=U&ZmD9:GDF3X:B"$(֓V53ŽjJVj8Z' U)|ÝFbɿkZ-Dvȶ&+!0LґΛhO8bj(fcva ?L{3ւ1jlQw9yvˉnC+| Q:ܘws9t7b]"JgDJeş~w:[E}& ҍp^+H}^Ǘ F:QOK#a3]8%hyjSu+FϦR l5BF|I`u s섪#d, كb]kfОxK )?vg֑Ȣ(8VʋWuQ}ƍ>*d4qýG%f1hZ ab:s\jVP?"tjxtAa U0.y0"d~J# #{Yi%b? ,KYҶx{R}ocT&_ &? endstream endobj 557 0 obj <> endobj 558 0 obj <>stream hTMo0 >n!MHU%TalҚFi9g'i4O׮Z630K0'<T7f$%ӌu#Tt9 zAwgx8/ .n ,vB6/ڿAr_xy<ۏGvg*j:S:NEJ9u[YF 0w[ⲨZ0;f!߬2r$&56rMLkUvŜ-[$:/)k2Eszq^s ӌI^WZ endstream endobj 559 0 obj <> endobj 560 0 obj <>stream hެWyTSN ゗b.}T"IUZъȚ¾"ܰ nhS{/·93g3gΜ& F B!u\(Hm]Bnj_~Q):FJ3|&hD?FӠO1[0et$;҂2N»`!.!?,B&+/5 IjxEzވxᱴV/ IR!!gg;u)C}Y_$G>!?sPğjc{tZ]^>hlhs<sk VO[y -ɜ%Io<'& j*+$}p T}!une٨7wKYXjo [a?Y# L?h2g+Nj#pS=谌Z9L$_IMΔb!`#"/ Rk؄"UjJykQ]tg*9UX26um7#!d>>gp@%`l r0-'+R|XJ:^f3 cB0kp8oa*@u8 / E la۟<YUlX%JQvOŎX-+@0&oE3v^/z?lM>1lĔ' %)ùH7PX|@ #|LC]Xj7KcX{_sX:@+F-x0Wv=.@_H`}lgXaϣ"qtZ,1>6rGcw-{6S:1sі woq#p_'䟘>/EFkjY|ixfUQϴ.4{=u, '`bf~ƓĒ촧B{^%Mx1u}-?V?nN^FZOKyxA !afbG @Eh.r܇W0 ZJKM 5w ^n>OEAKhq'ǯ55 : Μ$8{ }[:)yz;)z\OV8@7j9n3zHmKEj<]xӣٰQ 5s]O_8b+ Sҫ1KCUTUQ~9@.x)>[ISx߸>a /Î |l0;Ĵ&0ɨoEEJ]h5永=?JnĆHwoDh:,yJh⪐$6GU<=M~/$lhؤ&b_[y:8۝ ӆ l{.q7%:%FXv.Vz=e"/V! \'ۦGjaɕURJZj+YW:Cٽ'Vl3o.@Z8K-/X-{O?0Öm*-[@e[fs[rt,s<1W]%ˀtؘ.W@-*Fզhӡɬ{rG7_C|Qlq=\RA(%U-L2{v-عD~:>m6{[rosU _@ cL:}0#MYRcyHh"F׏ws7t`^\*Jxs_?7d%ֲgӏrx2X HdDݿ)_IRx̀;(YT>} †r-(A㕺_uȷ7<[϶9|`r$t}/6m4j{$yG.`X `;.M(XoDe1Mv I>(Q !cX71ȇmg(W ɋfjߋ0\ayE)g"hn.čC`o ̅`p`` x 6vvD>tcٵy]mOckKL0cpO2+Clj]B(I { F:?qk6;E +rWHE/h ~q -He0rw< $YTNx)SK?r_X`3<鳉N땨6{&6sP?nE:ZT37FJ\F \ųΘ0?x~܂hs#IyYL'WtaϭVe M7bN}Y9'hrB ,&_S)ׅDEDUVjK*bJ]9h(J?2o lssUj_]/L&d\W^񖟯jѩN˜mŠU()g^L=Ai.IS\^Aj)r$PɑI$AʔnwxY^DuRXpE2#>fHxg|' h hr׹U+Xlngq[[KtP lh~qоgQ\@P9lX$.執tWpO[ah W ꅦ|ixB81ʼn#JBRe X"]=wuOi0go@ U4U=&"]HU`Ovt*Cx4^CZw $0B":N%6"oں߾y p2n{i?x[<]-/_ka 8OQ2Z?,~qy<8R΋S㲫Meo^Gzx [!Hy>+ݴ(-r $ϯ 2Qf*%">>K""\M0J݄a_9CK.$@| g^(5%E}w/vtsZp+?_D|ݢ,F*rxIFIU)4 G60IJi4{YoJ⸬gY nBKaX U*!nIpr"Qub[@0/ZM`\0&-.>WxMe"ͣ|0Ox&9j6 nEߔH%Fv82">f O`+򣑒JS$Ua^wժz\nʏȕ{ֹ*,><*r9ijw._qx=j3N}IC4~HzKOKN)^*>[foQarH9 "waF6SX*$ak;GkĒGτ"S;3RXZ6JY_bT\81C1Fk1!t4\C4 T&_7<|2"Jҗ8]{X0tJZE5jMyi]sbKN *eH.]y{jg~eb r6 I "u 莯61'&HKtLBi{0vUۮa2WkВ mIE\%Eo?C[e/sd~ > o̥QA ocуcۓA endstream endobj 561 0 obj <> endobj 562 0 obj <>stream hTRN0+X!/')ʁJ=)c9ϮqH2x=I׻ a2{\ 8O`x,U|Q{Hywm6%a-oH_0#O"'qD@]$]?iGG(:Og mut^Hǡ7_:$ReIZu1}?GF"f.!ϋzw[X*P,7V˻H&_&T!`N5h(֨*52]͢5OX5ذF#AXfCr4) *$O/G< endstream endobj 563 0 obj <> endobj 564 0 obj <> endobj 565 0 obj <>stream Ht_o0 U:ڤӔtDZטШ,;ǫ[|nnnV5xBnD$82((0_p4"c)0%q* {tU4c*!IGNBcm^i4֦U A[7LvDM VaNNbIHbJ)72 >iT]iPYL[ԯFث A+9Ѭ[M." Cu 7+M`[ EM.]I K+N !KNm辩Ji@j,2tp[kWU (Dg 9z$Ng~nh+vR!UgԺ­J}- bU }pR69q:NX.WbN݀?o7mtQx'tCLB.Ɍ#쎳1?2eDF0pmW͐E][mi"W ճ3uDE 0n7|<  endstream endobj 566 0 obj <>stream HdQk0+4bUdف҇%v,=8&ʈ^qC_+s2PtK/,R#20:q.՞˦>:XV4527P`kgi?{3ŦwMnC`2ɉ4A. t endstream endobj 567 0 obj <> endobj 568 0 obj <> endobj 569 0 obj <> endobj 570 0 obj <>stream H\S]k0|GhTI(KSh y0=']ەԽck̎^ز')]޹;>|bm࿳DYD\9( m@d hE+~{\ILQ +#)ڀ J mk$BkCv+C#L0 :@ Ćp'j._"SȊ腭Vpj\ɕa%} ;׹6_[EG Q|!JH'b:#-D-p R̘6U#K1nY+}a@"h~$eA>cU@HmsvW}G2%|F]KW$ fe26H Zڷi;^ stRO72Z*ex>?)fɗ9_@Y+Cme4uG4$-X^}Gp'A+ endstream endobj 571 0 obj <>stream HSM0W#_ :aC\%V7,>Y$R,͌fL_a>3rf 8 | 87$ o& ƒegW<P9+ |pG0h$S-|z Q2)hTS +T={41no&)}p2fUT2@ϭfy xfDm"LgU&C@C d:\D3?L0_ F| <dtxN`0/hp# * 4p>iHқ2 ްDONu^ v'9յ-e\C$lfIņǎjUzhDjJa*FEx ,{ e2U .v)+]^S!'b<;KweEQKS" :ְ⊞X5q^` n q8"/漫ԡƙT-G" endstream endobj 572 0 obj <>stream HtS[k0~8֨IoK҇:  ڌJ6Q2_ȯߑ8ݲ #rQFP_|}Hre0׍?}"Ld~:c ME@[ @~{an>stream Hۊ0s)CȒ9-5)eƓ؍,[@CKCJodi48xܟYg v3˂]ǐVaBvoX8e2L|r3(Ma[7Ҹ1]O0PZ#ڞ]/f gg &QNő'TbBi*-;8h,wx2}@7KjzK+ws*P0e)BNiՑZLZåkTR,m! KǍr'uDwJ 6♏OO&H!Da2ڰ VmB;aM=EX/.yk}*P-iXW'Nmkm`$$}D,v#M[4!@$Eÿ3h~;őAmwSvI9C@;`_zqZ Et ^H?Qo?pI儐  k`յgU)1~yo"K d endstream endobj 574 0 obj <> endobj 575 0 obj <>stream H|[k@+q^t-&Pmii >%($ZZ]_YYI]ŗeoJ!,mD*cPq jr>oz:Xa'aUaU ɣNzlvT9 hW?x3lZ񅅻o)|ǚV0q,;l3Xε7+eOuȃȪbN=>]]˯s\\RIP?L$Kb $}&H@TDZTET0~Q\ݩA[Bd#'Go"G,< ,H-i]nlFHzSԶ34C O#my`زH!˦ZXv?P58C}@#Q!Nȯ6cV'H1BGJzj! UvY:̈́I:j2zj8xiƷÿ#9lbYn!#~|Caֿ{f endstream endobj 576 0 obj <>stream Hdoo0)%HTU*i7u[JAڋ\p p Dq˾=ϝ)P16؅`PӤ-C,DYMslES9RʡnGB˲̒b;zNÛ"P"07 IDGKx(TIaj"qII\E4HKԫ,gNE.и3xbFʼnp̹>\2bQtfK?F[?Dq6!Mpܗz}^ow(KB0`v/G3* endstream endobj 577 0 obj <>stream hޜwTTϽwz0z.0. Qf Ml@DEHb!(`HPb0dFJ|yyǽgs{.$O./ 'z8WGбx0Y驾A@$/7z HeOOҬT_lN:K"N3"$F/JPrb[䥟}Qd[Sl1x{#bG\NoX3I[ql2$ 8xtrp/8 pCfq.Knjm͠{r28?.)ɩL^6g,qm"[Z[Z~Q7%" 3R`̊j[~: w!$E}kyhyRm333: }=#vʉe tqX)I)B>== <8Xȉ9yP:8p΍Lg kk Ѐ$t!0V87`ɀ2A. @JPA#h'@8 .: ``a!2D!UH 2 dA>P ECqB**Z:]B=h~L2  5pN:|ó@ QC !H,G6 H9R ]H/r Aw( Q(OTJCm@*QGQ-(j MF+ 6h/*t:].G7Зw7 Xa<1:L1s3bXyeb~19 vGĩp+5qy^ oó|= ?'Htv`Ba3BDxHxE$Չ"XAP44077&9$An0;T2421t.54ld+s;# V]=iY9FgM֚k&=%Ō:nc1gcbcfX.}lGv{c)LŖN퉛w/p+/<j$.$%&㒣OdxTԂԑ4i3|o~C:&S@L u[Uo3C3OfIgwdO|;W-wsz 17jl8c͉̈́3+{%lKWr[ $ llGmnacOkE&EEY׾2⫅;K,KhtiN=e²{^-_V^Oo§s]?TWީrjVQ=w}`嚢zԶiו8>k׍ E  [ly邟~_Y53rW򯎼^{7so}x>|쇊z>yz endstream endobj 578 0 obj <>stream hXPU?wYI>oV@#QO!ƈ=5=xy>I!kv膦I/b֤հmRgnfnNigCm6Iۙw9||wyQDśJK^rx)"Aiܻ"y޶-/~Ql4 bO Cck+at9E^9.)ݮ.oG-({(#g;cͯ|vo#-f.&K4SX2ϦF ﯌_M)*JKk?W>Sif~~? kԄc@xi81{R̶pd'om:j ї5cr˶w=։G2wwEKwy# ~&xL̏<=zKo Vbv-lbgc!8*dGqn񗥀\j Yq4t(F0Ց1ζm=ŽKl!/B"d}e Ș]{\W[!Ata-9Lw= k7tӓtEzIIW}f$}(:a/Wٛ| v ;UsU]>-HMRtB:-..'XJj_si/kkϻWBUh:N#wmr/DD'BnaUmNdY{$;^ބ]eҖʳxL #Qu NA|=&IRXIՐm.n4$,]&or]_\\eҪ+> eBMW%]]U-Z-JFMNk{Wsi*{z>C-E*NDZ+GDuZ#[gHrQ|vHMi$gHtNh=&JYOtZ;PJmPIOtm߰I:hXyAK3kj eZLsc,#hs#l.Dzg"Y>Ӱ~Xel?Uf&l}y`0|٭UłϪiU74+#v'AMfUì CUVYj*Q%BaaW ,Vl6YdVX)vUXjQOn%b|kYemg<`=o*Gm󟧺ު-_Hq_vxak [Tm V")lM2+Al֢E[x.)6瘁P z`k 9+=I8s-EM$2s֭|krqRJl-*+ǫ zz3հdM5EXrGrߨ0zAM9g[xPx.N{2 Og|ċ`f-𵮱X֧#x?/ ؚj<i_Jpӫ B#|:"cz]91^;tٞzsd7>;&|W|ln:O7]-4UOs{ $ꪹf}tI@챭oςtLj7R؛L!=M5C63=)N:-Гs֡6:Tסr9tCCCC̻6p'oC$-8=vo;:p)pʡ PCCC!zooc+ep5 Qj@6Т DNm /oz|=Yw뺮uQkT+Xu 7(soi)f~[EUo#(fK戗ԃGsPV\%l5iі@FXl뀰lvJC}P}Xah?SEr#<ɍ~9@EVjgZOeŸIM<@ 7n.|c |pe\yLRaNRJ|I]/Iӛ77)RDE&R'h/q-)^Iyz%C/kWߥC4܆$I\#~JD+K)3Le&'kOMN^;'ٮk'v(uD|鑙R.Q6F.CK*\ރH]w >9gDŬ?/$t ]qQZ\|)h6*;bPw}eltEb=j6mm F2"H ~"{]ݑX$ltBPl!<-_m7ݡHj!A=As]ݱhkACnL1.aN% V mm/e"{p #6A͔O;ݎp;]]*8# hwoѫX,n*7 cθ{>af$1h;FQ1#=l(QAǬ1 ^QQԎ> endobj 580 0 obj <>/DW 1000/Type/Font>> endobj 581 0 obj <> endobj 582 0 obj <> endobj 1 0 obj <>/Font<>/ProcSet[/PDF/Text]/Properties<>/ExtGState<>>>/Type/Page>> endobj 2 0 obj <>stream HWk>?be']]ig_7ZeqMnT51hgUN^lMRK~mPoϓ&$Y6I:#uy"_VkwSˋeAV(KFH$9 ؗȗܭ> t[yHjHmFePdOY ?ݓ(HVo{y!G.{oT {0?p޺0.= n  bE!2`a="b^cm;XrW+c Z`fK6pF\R`j&y\F"ꓷ&/oHWu#.!ly%Yɛ9}BXx  sK-zcaH6>>nmT1 $pžiAA |u/0Gę9GL( ?r(6,Z,hy !Yް9v_Ŵcvpu~<EnHR93XeP *tܓ1k,I=Vj\ZC 6)yv _> ?S,1ĵy }jc◐Y0F[ ]m0I rgh>y]pu@M$%VXRH9EMɃK; ^ʑ;b8Q``Cbm]gbr`e.E]a &DEF6ڤpwBzO}8013i-D+ՎŹ8\%'NC7:[Gçx:hk;Fym^yMadߩf^,[BF5q}QTÕJqY(W J@YG<O$uHjEls I Yf0a2yeAMlq|m 6!IB Ѵ[ت~uX Do&۱Ƽ$򬚗då# }SE|1ȐQ.[\48b\NvChY]3 N2=ZnpB!892"Yb;lZI)im%lؽhqS*uL7PFҦ*_Rz>zv?\7}p r@)5VDѢg1;Ӑa"AP5o@3^V.j >h9X68X*ɾ@7В-.^B(^]7n"t|CLٱ ] L3߲ @>T6rCR{f d^'N16t+(Q,iӾpgt`\}`b,o&i%4YCXS:ly 9L:NPh jgST}Osw~K5pv69&p pe֠{?/˦r`)&`z0۳G_ ~ǂsGj"8 fEp"ȏ0|M@6V=N@З` ,4èWX dQYՀDZ?T̊P_wߋCd&!9x l( yYaEo6!Mgb-I5B1(ıB ?7cd9DrO%\JXpS4L!PƑY"!Lb,\@E0HC~/嘛t P)TT}>1kNSq f ڜ^MxI%p؂ 8Ӑi/f<r"_H"01B,e12yl<aǓ٘,b>j$sT COb~2Pߨ E0YRŶ!ٴdaWI2Q'] % \菐םlO@tO>K3WƦCm01l,d,v6gv;iogi%>me9*,PΆRJfٸ9ڙ4' ˎf1iM>K$)A?ctRcIhY:I#zkhD=^ O{>K'iFT9T0me,`oL3X{R g651,Uc ;YRIKu s/-0YRI741⛮l9z O1K0)SFfTL;1K/)hi|~d43 :%=,ڟ=e$C?OޗY6y\ݗ֖GevO|Jvyؼ,A"DHyaz+zWA$pQFW ^nItK=!{yxP"IHj@nne%q[zwDêyUol{(2ubk}ؠ@bDlݭI=煆/wxSc <LO  qC: ntr֬HJ2Ast3QqEK) endstream endobj 3 0 obj <>/Font<>/ProcSet[/PDF/Text]/Properties<>/ExtGState<>>>/Type/Page>> endobj 4 0 obj [27 0 R] endobj 5 0 obj <>stream HWkoF_1Il4"3C( vM7Am?A@Kc[?~̐lHk{}QOɢ"?8w~QRdZ-lݑ/sJJ9]]m"X0DHTx~D5>]G̫dv}EI<!})xrOf?U9iQp S}$xWBX"F^@ɽ[ﮮH@=Jy[sen(wʜ4wSVZᙸ_N>QDLzR@=I 5y|E:Э&Q@EDB) )*a}{ Ud:o3t/&CʙM!t%NV6槈G,  |pkOI=H'804:(!;8`?MŮuYC8W>p-fӭ@'G |C6IѨt(ţt.{ EJ>}-q<)N< P.O]{;3!eE> ei.ɘSv:0qc$#''tR,]G 9Nޘa&PJ)a6N *C VhJBn?4(ѓ<縀b.rΣMxBdLsQ*mѧҏh v8DȆm!%"`dPLI6,zk;AF ])?7Zmzp>l(IKɓ>4k(?AcE~09lQJ)p[BcV0J+]>|^4lq iaGٛ!6 ؀`nCn!lp|(D\QF}*'6sܛDjrQCDmQx!Q3Pސp M{OWsɋJ+U~(rgYUeivqfYY;eԥyESNIu#gy$ÕQūJ<-K<0L- sl) ut:H3cAoԧ>9iN@t:.k-ҋj,`omG%@8c QheHHM7ƴEv0 ִd07`2u,?Y(]m$6E`Ӕ;"Ѱ7Jnq~"2Ē;s?oې,rJEV,{G@R4n\mȼ'J5U|FŔX8:FnERYfz&ն k.i f@S2dSYjt?rK0⬗ӼAKbj]˽sS tҲ/lWGe(1+# >.u,f>o߉n"Yn;ٴUXZ-5}>CYG а}ڄSyW6 )Be=R&MFupuJOMM#{qےߩD ,[8ACvIi `8#$6N#fwǰX s;>b䡠|1ZjC`x"*U&A6wDPݞ[{[ĬBo۟ 0#gP4o@/bpߴv}62{ijq1\wDj~8Wy9dTu"-M!&/,`J$샏Kd0;)YVue?~UZ?\-z> &iA fv>)]QlF%x@G6(m~YϬջl,wfOEݺN>Z3T)X-K'aCO~~0kKi2@>T8*5JVp9p;ji|obe+=Wع]{@Vx)c!IYa fѪ MY%ƎpI@0&Πˋ+CF rIҜVrf B_Qd7ې t0+j4+muxI#H֪pkt\bٛ4 I+ Pvw"YneR/:#F 5ݦ0Y]ُmkm0)SmL\V6klk3fӹ9fj(w0 WILLp%џ=崁 zWQN%htTres}`0h(AO!0._Yz}uO/Zd |F֔"Nƈ,~/R`T3z+M(, /./kSI+~ @LT ?]̗G) *0}=vN-&01Uq͞0KOt¶ZcN,f`4+z0iV'T%aIV,2ɫ#V ;gmv{-l=QCcL;Q]IhwHy(evRG#Nn`R1 q)]?]Fg2'̀ޛwgN& dnGo\uM'޺'tUt@'~:Yՠ:P)^R+w YV֍jF)П] 0x\P#] XemNV9O$VS `K|AI{'ZGbmZ9"g6T飣{늤{IT 2/($ WB;XV/&3 GK>|0es84֚z Ǽb4!"zN`NGSX$)%JzyxFalXuX蒔`VHF^A2=Y8έW#mA誗/zƾVTEzw;˜Aל4*nV!}${|CPODZgHi endstream endobj 6 0 obj <> endobj 7 0 obj <>/Font<>/ProcSet[/PDF/Text]/Properties<>/ExtGState<>>>/Type/Page>> endobj 8 0 obj <>stream HtWioH_ɅE>(xY`[$T $~_u72뽪WN O?m?6;us^"u+}B'XFN%YD?~f6ޱ;_7ݝ=s$H>g?.feW.ؚ1=3_}N_R'I݀Nocxsevlnd;T7X^V-eKe_WwrE‹c".7n::"A1}L޾?&pDtu7(-D4C撋}.P"cGp]V ݿ~Bc-OO\Ld=sQpK6ul2٧GU{ oRNԶj{X>܋S:ekQ-|C Jb?}>H7Y/y%}j8=|#Jy,DGwm}c{Y;vY)0(ַM# ,F/ {kcp ɋP1Q*U9r )9?TQHp83d`HWdYU{.8{oN&1ў_&Y_kپ "{V߃ܜMƞX |:x@4u8= A,^4>Ze5P, 7=F1u8Ddr/ 'u@ +r!54 V=u{ ^FLJ$؀HCcw<&|ez?l-dV]o/4"aѰEJ:Y~ŀh;`wCYh2Vf t2:TNiZyڮ L.S9qSoGb঱SPB:䅾Eo\5pn8hw${nQ ,#Xݗol~o3;η@h"&"McmOϤt=:=xZijxi\'(Eh g>miojn=`m٫AKSA%5`BFh! ^NLUǼ[.Yo$Yȵ0}7unn TGTA%4hG1&0^*ZuIv,xPA S8ME._O514nu|P!IfNr!n&Ž Ԑ`5aFi|Y(R%otK=Յy2 O+$ݎ=βĠ8^O}wY?T[xhOX~?PhrAپҋLGjԷ 039"*s$D:jոB!z)jGV<݂%̈́ o|6fF$5C'.虔˛yaa^gRОjRԙ6R-b-Y LaP=ϼw)CQd^WRuzVIY=p@8[&5-\y]qLx ́@@ڐ=N6-Hl_Xph"aLKTuBgzPd^-0/LʃǼ`?"'i.}$Ly:HnL5~' ҎFV$);䞥$aiM Pq5Rpi)$=4)eK[IE.hOt+ Y/u44S0oxky,(kᘭj %;?è䤕YkgqG2uow+I](Klqu~?;h4 \(F tW88ec\GfPl5^zDLreӠUȾb^@_(ŋ1ҬvOTf+ v;q(oȢ/+x :0 uƚq#J|.}('ٌ;MOSu)m7~&|-b K1)lfzSqn^sY\K@+lfiͦf‰Pa(gwblsR$rA=. ĥ[*Cg|Ѳ_k5AieA4veqZ&&YmW93 sM͟8< **&TwQf疗9L3Xn"%CX̒^AA#W `fre ̼Bbԯw{3u͕QÁ05ToԷPCԏɽ|nKbq%%*S$Ũ88S?b>U(WasN2 ,203ű7[/5{bEgTiӟO^C(qgN=` !gk. pme} f*2ϟI7Ilm'OT endstream endobj 9 0 obj <>/Font<>/ProcSet[/PDF/Text]/Properties<>/ExtGState<>>>/Type/Page>> endobj 10 0 obj <>stream HWkoF_1ɜEk{7f)w@FHcIɒq@+ROwuuuMݖ?_tAO2_Zߴmky%?rfN$EH̉\/ݭr+n]nWۅ+:IG̓Es5_zv'+q]Č^X> /}?*NX>[F+غ-x*YUvbI{[#iKY_a%NDqEűQ"Q7\rp‡:8 } ΓB^y!8YW0kS^RuR=m۩Be#nyn(IIPs&΄Jf=ґ:SM";%Ve;f+>2JֶZ|"R!A%;t~G$&C B\wv`mVkS 6QUicZ N U"$$xnQY;>:X[ NkaϐO+[n_w;qțFIX5 'EKgسjo^(~\adVG+:zSA;=u;@˫ǀ&A]DV!wA|9 濜2a;„зSk͝,'lR>-r2hZI?uer`SlO-~1<降!Z=MikOx-ӧ6Pw,<":OlBkg{"k&tk_bԳ|e1R⩬ǏR/Ŗ@G 2_~TiqPDnZm3't4g(LJ]-&M38y#;h0RCxg=V5mϱ;őgN{TJZ٦`Cm\yt/nhdv(Y8h,ZP42ϺfϢ%|R| JB:b] /]#bRڞp!lHX3a ̎4ۼi/@}E9Q:FY_+l<@h]սo\\Q5();0,3kߔx@Fn(L\j1h98Mq[r*1t*S-D:De'YRFt-ƸRhaOrRbdG0=0x>i~i֓Y7[033tײœNa)I$ɰ$X 9fTasF0./W2` ׵!}"!L׏# О$7ZId@o$.@wS7Ďi!28JEsRj^G}9},><pd -h\]gyGe6V͊.b#@Cr~[$ j6PsF1(z7°._8ubwІ׆w4^U򞽠P$l g%"3'D̼k^>LaS:sU@~[-|K=2×X&.7ǜucFk 6fl3eӧ"]'HaaaaaaaaaaaaaaMAszԺ?03U40rUdX4%6nOg"OG+ϫhȱog|IÓxIߎ!VJq䌑߮Ž]gݸ] VZpte]#(/$W' |9OMLs}¤"$%ڒ17J^x B:6V]#I;*6kz¨3?W[!bq2aL W{.KJod ,ZƔ;12xEr^_b*RDPH ~$T"f5_&|f=7 1EMv&Z  @m+01$n}XwQŘaF[C[M(OHpI6RٙC|v)2Jm%DGᕗ6 endstream endobj 11 0 obj <>/Font<>/ProcSet[/PDF/Text]/Properties<>/ExtGState<>>>/Type/Page>> endobj 12 0 obj <>stream HWnH}W#().dxba8XPVKljEҎ{IQǘKvԩٶɗm#޽_q#7-VϚ&]˅6U}<㟯U&O- 4$rBOD"IS'r\8sWd|~ZN$x Qߪ'O3?ly:ݭ[?/\EL@ʓofNEŽߍ׷k%N,i|+WvdM.W+|b$V'Q^q8b+O'.PLW(8"JQwd܎C$s"^j-g7AAĽ>H-$BSmQ4G#H_E# !D@^E!-`3r_nUj=-Yg-,Ղ/l.Zvvs(~䡼ƣ,9V7%Veֶy!9Tۣq1l-g2H)NK3Ge]-+*WO6϶hBy"+ L~/FyǺ%|jkxm2o$"\ @uеCtvEhQKQrVH^pn7At6C;QuoD(\gX%vKV٣Z `R! ʼn qQql>RS^۩'x]SpmЙy%ӞX } ó g ~Oɜ`yAإ/'~?(k4?M!FdR[u;2"i5„ђC+*Y _MN{ c]} \q%V2 #XHE2WΎ-C=!^M̀|1cmKv Xge[qrMKS+x"Jxf$sy_m}`y7?Euޮ R/.4}3 ƒqzNw:%EsdʛXRGԊ&SwƆ~]{ةs%4ߘo'ķ10G~@`@w'HFrI9w ;[T2K LphefjZE WTj 0KM5 yϙ^ɗ\9Bf| zP"k#N!mS94D8*ȷ}HX }*jx|*U<@f:[EU(>m6Z۷4 nRkz"#Hctۈ90$;{~dsd)eNJE4v|Æ#gg}vߤo63!|ƀ~h|9A3b0#7eYS4I{Y˼YZ!LlZC!2qFl֭+XC J*ij0Xn8&'p }&Cd4:"Q )o,8C;&?46" \#Ŝw8Wk]c|nUS녦,)a'YO9_*.:etoHS!H`Țe/c<;_튿͗6U3髙$]f5ZV,?PUB=rACMIWhioJj^)ת^G94 P]ٽy 7Int$ DX%]pq3տnXp֑~ȸiJI|'YR 4&%Э $K5EI#Eot$_t>>/Uz`Yx]r+a3S+}Rih7t=7 xz,3Z~h\]Ilq즁zP!4g~f+6׏]iM$^G!dd!j者ܛI5o.sj==K,z=BNVC֒10i 4wV(_+PzT=2A}]=&$ʆnϕ^`W>.EϠtKHiBI?i,iHՇT*u$B&&TtztuG&PBE'X jH ltggzG{~<)ltD:07`#뷪3 I%tWWWWG߰n,$w ֭f C}ۜA\/_ Ѩq4r}pcdk vߋM[≏Qְ9 (l^}.;\2Ǐp^iE'kp쌇zm:ov K_(hj#ڝ8o h!Fks玫UBC9n h_CZ(QzV}imwUq尩.zЋ5 @2;IK቙ujh :<}$I^܆XrqFkUV!/Q? *'-#D"oN'pAEPmM`hdBJvl?C]{PXdUf$)hXKR[S#8p>P i\i"z /i #"CPT{x^n cM5B[աYdPiO ͤ!mA z8 43iIl;paec y y嬍oS Ivkۗ(ǩ͹3Sk8FOLKd-h׈aٴ㛲-zÞMOzd2$6qɉKQS&,"JXM)'WżJuA=HqipWP*p(n0VPZq/x 3oC{,sZ O4BQ r" =Oވ[uiuMlWxc@ia? P(AƐS9+v7 Kζ.B+$ErvuԼ߁'~}ʛKuseHMs/ o7">nCinhSС4`΋y֧xY qp+@}!KxG̣Dۊ{:&WtupC~'-l >|}`jm9fa0}V0Gc,o|2QPI-g٩:Vn LV7 g3cJ+?[ endstream endobj 13 0 obj <>/Font<>/ProcSet[/PDF/Text]/Properties<>/ExtGState<>>>/Type/Page>> endobj 14 0 obj [34 0 R] endobj 15 0 obj <>stream HWnH}W#(Ldl0֛ (EqC^~lg`"Mvԩӳ۪c_es'aLWmӤbofJ|`6oo'Dq`.7oo?oa4_;XcG"«xP?|7.,78=”n{p]QX7nALB߂ǍE1,9zV&U7&o-bMc\N:!Tf} e?П.>N'b"I|yXw: E^`û\IȟLk3q;A`NU\VqYY7XIL}0xDO!qx*;r:S+I`\퇝sc;V*HŜC@@0@HJ;Ȇ2 ۍ\4X-([Udʴ2opl30-NV"\55O]h-hÎ4]\va $Z3tQehdL%A<sȸ"^\ds:w3%P($/GQ?Se$D 80?9ih}; ͥj׬qk .[UhJmdiɅv*?ŴV @vqZv CE8LCk.e7a!8d,$:sR5{A,Mw ʊ2-.ǰ2a-~cw CΉjovҵH=jW+ K!|)5~jBRWM3BA8(>V }\8|KeE#ʉԃi5>g)CZҷа3׽S C&m`M_gA 406`7Rz!8E5+-|i H$Gx d>#U }X-/e߉$ղgiݴ+Bٽ9xqE8w,YP:Y>J"ς^uh3ݞnt#ەk ~x>c;gLHzс?\}d및’S#)K-"64Xi]?P8#яY#θe5:4_л"t|BhZO^Yk/4Oc!K`QSziԝLkülI-q \e=j8`{-ra9U)҇ΥL\ 뫣_t"a> 꾋F[rꇮ>vSh"F"Ƞ0JzmO5Ήη.]b]N~vDF؁ WR3W"6Fg),):]Eu\7AF\GdDgO&b<NjQkʫm7m(J`|?B&Q-ɃN|}gCJϞݝqV5b#z&# G }[#Np=vQh~ }(\wv@9`BTA_!pRw}4z@ =v;ET3 DR’n >7 7B@Jx(kv^(h!9jڲbI9C)*4Ѯ4uIY}}k}w8n㷐t<[+hs@.rRxhU Z3f18c9@&DBP5c\Vw Wo'W!vSZQ\7t/+ƝortUiUa͊*2u?Z/M lVRokcSA<"uߤBzOū=;]|Y.2Fv죛qrdw\ѻᤏ7|pI[p}KR}+D\<ᶣr[fݢG1kLEv١')9_0X endstream endobj 16 0 obj <>/Font<>/ProcSet[/PDF/Text]/Properties<>/ExtGState<>>>/Type/Page>> endobj 17 0 obj [36 0 R] endobj 18 0 obj <>stream HWkoH_1ɃEM1؉׷p.u8`@Y#152믺g,9[)Ylj]ČT,"c(|OIeees?itu%"n܇~Ǝ{(YnHw:r*Yp.~;^ b"ʳ$B./ME9Sȳ-T'B-|3> %@Lq$VxnUս*M,EQUߥæ&Jte`֜J8B›|ϭPϽxj,^Ku.vK!+%gJ /nlgwTjÈX:[lڶTwE)n꾒bN|5oNQ1rTY6}y^4X01 NGHx_b؉U%Q5UnW5뛦z"Xb>s$F`,CWnYTj;4cg1  W01b;zvRbZhZEjSuQd,b4a箻>2;KYQ&-ҹy~- HՂ2#I!& ``> ⏕į\;`_5n0wVuTrj!#hAm;wf,e頨+ rI8(NiVPDG$ :*GVFZGCxS1- m1nYhI\ kbʣ!ۢ)عA"},JFRY=R?i;= `# -n(7pnYTFKػS\7[kAhE&sg6I#h<)L늮^aCvȆA"|arl[ꙉr_wpR{<`d_a?^wĊU?ey3PCAMe/9hFo)Ho]\!pFWE+p1j.ҐW@ @ġƽ~I#2RNpm tdS<(FK5r(~Qtb`YqƚԺ*FVjg#f4y3+Xhaz(³/AU. 2>Y5#A}fxBfF\p#-]JOB5\I ZDY-;J 1Yy0dk (VY[:ҵԥ\|E*R7GVn*+5Γ jt̒ChoWc8FDQ,WFuGIcT'5֓ bZXBK:"my a5$s. GB͑&ŝ /'`kҮ4Pt1s4 IO sݙkBfg2*@}sjͷ 2{Yң,\$B\ ^`A9-+Ӷ&P-/Tn԰j;?:Fac5#ɓ8p`mPֵf=IT[R$vT{`;8Mx@Lrp5HrLrNXX_ +s|$ (݊^=# h5FI}y+ ^,IiU'vN(iZvL(6)V`ꒌ߇Df-xdդ7R .NKf ǮAl֘ Z)FbI x65Ajx/!U$< I)ndUwt$sL_ ܜdv4<> M(.뺔[f ˤSҤ=WH7.{5RZݧ%[PVxb)6+PX~d 0ճ{+"(nReKZp 1pXe;OL; ~oŦ~ p/gsń_Z{S3zĔqEDwϲ1Ѱ+op$+,3~/y|k83!=-1K0 hjXW6\zGR/}GR# ALiM8SZs F47D[MqX@-׶vKU8{J)+Œ'p hn0hn^uiޙy88W?M>AS}9AiDtZO&@/:T/;]A)1K ?g2p[SO4PZhaY=;t[A.xx^s~ ˤi2̝'0罛$G1d4aM'g f|'g0E^0<H,K$6ho581)>|bf&=uW(J2;̱l[t 8)D*x9f^c趡XuPU}~:m_jujJ.e*&ۛYBt ]Z'67Pw z:QıeZf>#Eƃ66q;31W*QEjM4{H{ڱ$qH+aE[l~/6ӆdOzVNK|^0^Ьmc-@gg$܆ȗR %e @$`4dmHZs3ڏTt!d}trPYddWͱԛŲ~?@}y7e@+ś WyY[=a2cymCMՋCO )o6ױW4AM 3+6'*DW{"+<= endstream endobj 19 0 obj <>/Font<>/ProcSet[/PDF/Text]/Properties<>/ExtGState<>>>/Type/Page>> endobj 20 0 obj <>stream HWko_¢X$Nۤ7j 4 ZIɥ q}>Dwf̜svzuԋ7o_eNd{1i+Wt?TV}-K"y[YQYo߿7ӿB/nニa0Kf~&a,Dn񦻙."Ma'181!,fea"7oߋ${q'>mkI{3+͇"fbseAHQW8Ga.f}3Tӯw#S8""]PE$q"2[CfJSaKxc.ZR[t۽Ty0E\S8 "E vm ޠVbUIq?vwRUן'sԡ =uj70X#"=4gB:fgsT 5(!+%j_1ń0B$M#r%(1^D>ih"O5{?͠Im_ ^=GqB{ aveI#.Rk6!͔iJ6JbDs3 ,wMl)ղ?iԔ ~P Srm&saRӕ4NlWZ:c9}ߺo|DͳBOЏ:7r!}X$ҙ)'!3 @ævOҋ닟e^@lvyWОse i:oNL!Znn"@}[`9i):]X<1; .ah'L `Niô[oKJռmj21%`>ksHHeacW0t3%:G ò6( :i'$ h!=И(JbXr汕Y 8Z=/U-7`m4/,;&T S% En-r_*=gKJɾn ޗ ]'sydnxRѡM$ j=?&&rI ģA=A$vh_, y$ޕq\0ə{pH$752D/O#gDe5 uqJ9a xAxiZ#]d#3k%Xgb~`\VDiW#?'"HؕL3#kƊEvDtJ#bDg9ͮJQW#- rkvKY.0 5ԎKUke|Tv8{ar$vQ9VM D:/%+VǖǁvbυKYtOU$! /xaPaJhCX%ީg3=mJ>Uȑ:Xu:\|ON>"'4ZO훡.9?jvY3>8a2#ITZ&4E;<.UxpyƞdOBvf oh v'ž --8]XS{dܨ.ӭ;QN'wC~/i5Y.$,茥$"^ȕ+]h;v͵?7:Ը,}Yry@R{ 63@\8p\fŸϹ$JHIMW8D%P-{vDž>>sMZ{VvYoZ4cgaWGO!vR;1cI On}9ii']/q SMMW.&n,*VsGa Χ$S/^ju{.=[p/LP%H9z1Ge+OnPpځ޲AIE#w;-$"0q0K(y`Ds~91 MkItE;ec\CqH7vT-!Dն|Bh )e=19^h.bEcNj8\+̴Eõ(N9(sC;7$Un'vch:tí߆F'P'F2?L.kbI`hOYsaPv80kهsRnNf[C(h11{эʛn|anz֩I#jzi9n <1AkGCTUsAq>b1sɸ [0[8#z49dП,^_ ?5Ն|JS`O1J 4-~U|Bv#B :v͞:g 0+E"`EFP Č/Wtvʹ ]-]pB*D\ IňFh e&#->=|6燼,٧*Vr_)U}ZhB`I(yX͎Ѯ}`%C endstream endobj 21 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 22 0 obj [39 0 R] endobj 23 0 obj <>stream HWko_q?E^`+iRct$6$%c{f.IQY)Jsf̙je:o׿2}F\\uży^esWLR̖.bB*G!q*HDqDYqqgmTx+кWn`Kvdi{n2_agwqw3 "N ?I7iPTby1}J#èCd c<#hty,aTANnqdҞk b.G|,R(׍Il~{Yk<#˳V|TyIh))u,S4Q7`oq)dl!LĘȧ>Ðg8虲l=ON uRntM~S(AjHB σ*> sg]/JJibD<ו]46Tl Mv0ywtԯ^'Wl+;Hɏ_M ~_b|/8oo\`3I|6)uh]U|-UN !a"ń!YB!AȽWl+Z SL@eh-O#OAhϊK=ygWԾ\WS]͓(iɹO([Yg:@Q34 F177v$ɘd9h90IĘafGu{y5.&^W^I<=xtf fMY>pen^|>s'c{Ndt:qGC(!MJk6q `Qo4tYEK䛀Ѻt\kY @W:b3t9IoK--K"/ZP;xM[~k>S56 1t#Fޅt kg0- LoOutdEg>/Z8`av G  #50AQ1 q9S2~wG1sy@_ڲ!}(t:uO]xuFs()<>-D *YIrϵQ), }Dy6 G)=F#[PO"eQT[~Tk8uPpS5;RT94L+Nr.H=_hvRA_hѩ6}jt$j4 U*{0Q3M`7Ɨ+ZG}jJIt ?(-bQ/}m?v L) ݌tI$aX?l)ǖUAlY$tWӣYya:R>eKOdJW/̧|3sNY|H*zCsp"M)bkkG-ù:[fGi,iKASo7"m+8DO7Z[D%d>I1UQȮ}{T>]Vr:|^@r݂Z,]ir0Ef; 3v}ʮ9Ęt;"I%[Y]\٥X@S|;stDܶ@BGChb,Iܘ:6& ̐Q:͉4t9)Z4cJ;;g@wmzu/trV%跌<ۥ  U Ă|N7v63{/ ,5+nǟL䱌c9@Uyw:c v$9,>GQlWIow"oqӸTT 0uEa<%u(w zǎ?t\9C& ހy&dPZxYB2J:[ef1Lop_ Ys;711K a Z56x{æ;FT;Ǝ6Z0MP  "EMb PW4g!1#21LBbܐu4 !/GjTӊ QY% @ tՐɞAS<"Oh27i맖c;1qy-is1npjJx*nh񪱹o>%@ꔏֽzn1!<.y Dx/`7P^_H8-̽)Mx0CIUReVjzPwxe~qY2v/(녞8^愄Hڧ5h0' InG8 i[ɲCJ]]3rÃ8NU4Ze㚒!QGkwQ]wR}@R/"F±ʞXekL7cT[Ҩv\oǰw69XL:+ `27c.PmX|a"ȑyIl`h@ endstream endobj 24 0 obj <> endobj 25 0 obj <> endobj 26 0 obj <> endobj 27 0 obj <>/A 26 0 R/F 4/H/I/StructParent 5/Border[0 0 0]/Type/Annot>> endobj 28 0 obj <> endobj 29 0 obj <> endobj 30 0 obj <> endobj 31 0 obj <>stream hTQMo +qP61&&v,ӌCcʒ9ns~s]o:؝ϋ'N8!-r@$ΫE:݂G 4B%Qqm՗t,L?r/?yG.Ă)a{Ezƈ2O<) ""!D`$$$NԔL~!g[| [R2O ޞЎ01g endstream endobj 32 0 obj <> endobj 33 0 obj <>stream h|UyTSW$74Vb({ϸPYDvj R!DBIQіbU:V\qUQ(+A{ZuPj]&ߣ_Μqf3$o҅aYvP|ԉ9Fɐ:՘m2k=}T| H+ TJ^߮fPAwf_Oƅa^qyV @Qqtph1.ݒfg,8lXWXvcz)&61h3ZsCM61U[SӍYe 33ӌ֥F8ޚmXj3dF W2mcfi26chϰZfSLf=oNҬ<11+mBjNRDj\j8d F=˲&[`7Y̶1 a8ѳ 0,$) f,`ANY33GYa[]. .9.݊xE2DQ}:rhRNWRSuXT'=cwhH)mDt81Au mj'IX2.ʒ_Bd@@ :8tB4w@(IrO{)>P*4 "~Փ0rJH'Ta<- s@ h<[!D r> }m$`,4:7ð}7fp :<>d5?x)?qZuDO2p 4x.vs3@jU&vLztD{ὂ鳆q8xx@?PO7.`$wpWFaae#hp Wo]ZIIT`-ỵ'l!jJkzRh9d~фȸu'1\'Q0}09=)r?~r?8g ޢT*q hzU!i̡9^~Nտ(TL4=˧aXԡ h/-M{%-QBtuѡ[-#<v~xCDt +*!:hpY^(#TFSydNq\sNAux^q⋚] +m+K&O  j W|8A>Nۦ}**tHߖP4wO"Ƣ}P߂ܼPH⊗Ύ/UNݷA9(8C;,{ciqص;gHs,E攕뽈^[-RyyuI&񴅢 g.h{ޡGڧY1Ի27Wmy/|~x 7rVkK ֗|%|2i]aOQɔe5pVpK >>e̶>Xv^xH 8T 1w]>/A 35 0 R/F 4/H/I/StructParent 10/Border[0 0 0]/Type/Annot>> endobj 35 0 obj <> endobj 36 0 obj <>/A 37 0 R/F 4/H/I/StructParent 12/Border[0 0 0]/Type/Annot>> endobj 37 0 obj <> endobj 38 0 obj <> endobj 39 0 obj <>/A 38 0 R/F 4/H/I/StructParent 15/Border[0 0 0]/Type/Annot>> endobj 40 0 obj <> endobj 41 0 obj <> endobj 42 0 obj <> endobj 43 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <> endobj 46 0 obj <> endobj 47 0 obj <> endobj 48 0 obj <> endobj 49 0 obj <> endobj 50 0 obj <> endobj 51 0 obj <> endobj 52 0 obj <> endobj 53 0 obj <> endobj 54 0 obj <> endobj 55 0 obj <> endobj 56 0 obj <> endobj 57 0 obj <> endobj 58 0 obj <> endobj 59 0 obj <> endobj 60 0 obj <> endobj 61 0 obj <> endobj 62 0 obj <> endobj 63 0 obj <> endobj 64 0 obj <> endobj 65 0 obj <> endobj 66 0 obj <> endobj 67 0 obj <> endobj 68 0 obj <> endobj 69 0 obj <> endobj 70 0 obj <> endobj 71 0 obj <> endobj 72 0 obj <> endobj 73 0 obj <> endobj 74 0 obj <> endobj 75 0 obj <> endobj 76 0 obj <> endobj 77 0 obj <> endobj 78 0 obj <> endobj 79 0 obj <> endobj 80 0 obj <> endobj 81 0 obj <> endobj 82 0 obj <> endobj 83 0 obj <> endobj 84 0 obj <> endobj 85 0 obj <> endobj 86 0 obj <> endobj 87 0 obj <> endobj 88 0 obj <> endobj 89 0 obj <> endobj 90 0 obj <> endobj 91 0 obj <> endobj 92 0 obj <> endobj 93 0 obj <> endobj 94 0 obj <> endobj 95 0 obj <> endobj 96 0 obj <> endobj 97 0 obj <> endobj 98 0 obj <> endobj 99 0 obj <> endobj 100 0 obj <> endobj 101 0 obj <> endobj 102 0 obj <> endobj 103 0 obj <> endobj 104 0 obj <> endobj 105 0 obj <> endobj 106 0 obj <> endobj 107 0 obj <> endobj 108 0 obj <> endobj 109 0 obj <> endobj 110 0 obj <> endobj 111 0 obj <>stream xZ]oTG+-U_R E"@h,? k¿gF& aTwUx78/⼏I\̅T04`.N>C~0LúRhP[+!ar*|IUt" 'LFN*`qw*^aԩl7s3XpZpzoRϒz'KXqf2apw82`D]d7_e&8!=tI8qTccR3G c`g#<*5b$%vH&5OI`R f ȸ&@S`E!aSG@:tʰl*aT`a29aR!>L ,pl]d֐(I{1 a WƜ 5R0I<r2|drdrd2N 3\]͗s2@.Ve\JA85Q\WpRe~./lEd R 0ߗ+AT:T"g yϗq{ljx xy?([^~If[_~8 Y|zDYD:u &L:,MTABBŸ?xx]~' fY 56Gg5oO[_4⾒fU56k0pECm=\f,T6=#suz=PgC%0.e|-vy<{ /œQ$MAjC>wl.;"b7Y"WċċċċċċKKKKKKKKKK+++++++c֏!~~&qa cfԣ8.ؽ詏(z<==õG2k}8!.9"B\!\!.9)(]!}.`-츅9Cm {ma-e&9{kvmܢn <[ua.l҅-hG#GrTQ!Gb$THR!I$THR!I$THR!I$THR!I$Tf`dB Y*dBYjdQήgb>3^~! eZ9#FO]gLF]k k!"L+31lFVdҞuhA0la6 L<;3IZNNNጙ͘ьO^r:gf o==g fQeT]=ـ6RfOS=u0ZXYo䨗qe*NJ(s)d>+LJ*Sʔd25)Sԥ de..} ,Jb(,J5\!Ѵ}kim}¼foXdvqp~w"|ʷo# {o۹[Vn-hߪrӶ}iW%]qsWs#>jRh͇GM;n8n?(+q\|]f͚js:޵ُpPf>ϣչ.5?Sc?rExKCܭE?_Kb[Bؿ%}'?v>m]C>q>'SxS}WϫUyU*}^>JWϫUyU}^>jWϫUyj}^>ZWϫU]v3j8=`.tmpK:uI.u*6Xyw׾R}^Jz+W굯k_׾R w j endstream endobj 112 0 obj <>stream xڜWˎF |4 #m^88r>EIޱGZ/zT)i1Sv,R\h!%X4 :c"=բT&\+RAOf+KГQ,^F}š#rqC Q;ȐZBj8HA @xVq0xB Q qAӠ! ݡӠ<4P,(;lЪ` eM`pT+ EM b#FԳ=0*f=pq. [~, pX e"ljG-RA8B0q[(2Nk[X`+"p"IPn! t([}&A0'T8QF q+t.F4!tj p* pAKUŁ(-Jx!_(ŕQZ~8ÂNxq _n~u7oJpz|͛E˗_{>rpOs.9-Ϲ*\v_Υݿ{_@8ZqNY9bk'ǻSp|MT/ ($zyNim#\ߕPo?}@峠#JJ< ֐佡D ghS(Z>*Sx~j'6y> |&d"Niql"N7g 阐;!6t>{K>}N͌eħ?SGO<8OKzSmU`G_J endstream endobj 113 0 obj <>stream xڜXM4+n[ZrX']"!pOdK29<9wWG$ĐS %aAb b-!ņTif! []*1hX%{Pi5TXK?[hFCi N4€PVV(8I ZqрY.:pQqH KҖr E`R kM&rr#|̹ jƤj02tɥq廿?M|/}__&>3>3|}NlǞ=["6'>P{oiK=NPVZOyp1kiuN8~awR|"$8gNHz41%O3Lg_=')NkUqbxY,̕Jylq>}޷]-;ֆe<"̭dޟ;\\:s\X>p-\[dL#'<qpP\Cr八l;s2M~}brgUOwyCZ+d򊵭M he[[ tme9d ۖېwx.[_tmȷ3l㬗tYC͟^Wo 뮽BfGkU6:0GlŖVv2=~A>BA?Dw]wm6&{;gȦq6՝]ZiZ_.s-QQ makX endstream endobj 114 0 obj <>stream xڴXn7 xEJ% := ڠIONM uȳ/VE#929" Cp)a|("cLL']\ ȃnH.h1:t$jPCvIS"w7ӌu!֣ŕ`ɕds{dLVcqD&c?QŽ0`o pD?&JM6 C!Xq`~,24$`]2 gQ< %Em;@=.8!Ђ bMP%be lb5Q%&pHpF8xy<ۏ6タAg}&*&>@b1lDVQ[f֛s+|jcDݑsi>|I(0u&P\qDf CtZtZEk{qE1EjN?rTGzEW"TjZKb7MyhDjM',dJtЗR1Gd~cQ}ZhIύ̵+$rSyˢ8װNdJPtcs *$0VY+*q76WQty!]4j*<ۛoWۺCy]k;Qunܟ"姁qS|8C4-k'[N ̡Ǖ2V\WRYߊK؊hJ ťh+c5=JeZ/4[\Zm)/ZՕơy8.Y˽mVX#Ecҍc #*G,ݘkYۇ^qh0%~n簳So+=1zǐcn.C=lVsGU9:4\pw͟2de0rCcv-K .K<[?}V{ݜmNI'grRߟ\q=lOKvPA|^~Mub*<>f x%l.҉!1iM'*~ 7p ko=V *d'Ov'0n[r "eR%~{_Y3|wc"}>stream xڼOk1ſ@&ɟ ڋ(TZ{.EݵZ27f^ &g Y T%f舝GdtD d\@,HC$ɉ& dj.lNlf`Ԍ$Г|D W@UC2VzRwbwcܪPzIJ4eIåCU&e[b@ iNl󜈳THVcpxnxsO2/ MCMטt^ϟ˦6\ҋ;/rr;N3O\ y(7GTZUZ:m` бfm#yr` endstream endobj 116 0 obj <> endobj 117 0 obj <> endobj 118 0 obj <> endobj 119 0 obj <>stream 2008-01-13T15:39:17+01:00 Acrobat PDFMaker 8.1 für Word 2008-01-13T15:39:50+01:00 2008-01-13T15:39:50+01:00 Acrobat Distiller 8.1.0 (Windows) application/pdf jnwsQ Q jnwsQ Q GIF89a UK3њpcV3"}r^qc:cW@naF]&QD.i\;#׌nx_T:\H,G{uhE|ynYs9C0٘ oؗ pb: ^U;|q]XQGM\I,|\RM>(M@*  o~_U; TJ21 y YJ0 F:' [H, K>)! NETSCAPE2.0!2,g b*x !2ĊE R GX^5@BY0d vP5C-m*1D4x%'ʒ₂ Ht)J\x@V Ynd}«V=`‬U޴= V V@A^3~@ HrŬ\et` ċ]5v p*0cffC|(fJ*  `Dݐ .8!, KHYG$e'(D?0bVf%S#5Q,R YB"8@*!, Tg͊%AIhC "D(f2ڙE'YgƴICfV9l.HҪL›Ք HB5eUB!, ggPѬ!,|g HA*`8I%B (@eI XMJ (,>l)d}UN2:0k!F_R#PAfZ22 A \i jYzP! 6 !,Zg H*\a Nb`MJQxbV WlE@ AC YHf} 0A a)L1,U<")!M L€!, )̚%f* q8," 3jBh !, QHp֣ e$aBҘ ;GIF89aK F:'UK3 p}r^cV3"qc:x׌]&~h7#naFcW@ni\;[H,QD._T:\K$~p4|~o4v20+ynY/yd8C٘3339s.uhE9!K,@ՀK(1H))#(K G/  %#8%K6594 CK :,=I,K37 +'" ;' > JE"$ ,T(PC-.  TC +qP% <F&LL4xao!~ȥKž \ZMH; 0 . 0 ..0.guard FROM ' . TOPICS_TABLE . ' t1 LEFT JOIN ' . TOPICS_TABLE . ' t2 ON (t2.topic_id = t1.topic_moved_id) WHERE ' . $db->sql_in_set('t1.topic_id', $moved_topics) . ' AND t2.topic_id IS NULL'; $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { $delete_topics[] = $row['topic_id']; } $db->sql_freeresult($result); if (sizeof($delete_topics)) { delete_topics('topic_id', $delete_topics, false); } unset($delete_topics); // Make sure shadow topics having no last post data being updated (this only rarely happens...) $sql = 'SELECT topic_id, topic_moved_id, topic_last_post_id, topic_first_post_id FROM ' . TOPICS_TABLE . ' WHERE ' . $db->sql_in_set('topic_id', $moved_topics) . ' AND topic_last_post_time = 0'; $result = $db->sql_query($sql); $shadow_topic_data = $post_ids = array(); while ($row = $db->sql_fetchrow($result)) { $shadow_topic_data[$row['topic_moved_id']] = $row; $post_ids[] = $row['topic_last_post_id']; $post_ids[] = $row['topic_first_post_id']; } $db->sql_freeresult($result); $sync_shadow_topics = array(); if (sizeof($post_ids)) { $sql = 'SELECT p.post_id, p.topic_id, p.post_approved, p.poster_id, p.post_subject, p.post_username, p.post_time, u.username, u.user_colour FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u WHERE ' . $db->sql_in_set('p.post_id', $post_ids) . ' AND u.user_id = p.poster_id'; $result = $db->sql_query($sql); $post_ids = array(); while ($row = $db->sql_fetchrow($result)) { $topic_id = (int) $row['topic_id']; // Ok, there should be a shadow topic. If there isn't, then there's something wrong with the db. // However, there's not much we can do about it. if (!empty($shadow_topic_data[$topic_id])) { if ($row['post_id'] == $shadow_topic_data[$topic_id]['topic_first_post_id']) { $orig_topic_id = $shadow_topic_data[$topic_id]['topic_id']; if (!isset($sync_shadow_topics[$orig_topic_id])) { $sync_shadow_topics[$orig_topic_id] = array(); } $sync_shadow_topics[$orig_topic_id]['topic_time'] = $row['post_time']; $sync_shadow_topics[$orig_topic_id]['topic_poster'] = $row['poster_id']; $sync_shadow_topics[$orig_topic_id]['topic_first_poster_name'] = ($row['poster_id'] == ANONYMOUS) ? $row['post_username'] : $row['username']; $sync_shadow_topics[$orig_topic_id]['topic_first_poster_colour'] = $row['user_colour']; } if ($row['post_id'] == $shadow_topic_data[$topic_id]['topic_last_post_id']) { $orig_topic_id = $shadow_topic_data[$topic_id]['topic_id']; if (!isset($sync_shadow_topics[$orig_topic_id])) { $sync_shadow_topics[$orig_topic_id] = array(); } $sync_shadow_topics[$orig_topic_id]['topic_last_poster_id'] = $row['poster_id']; $sync_shadow_topics[$orig_topic_id]['topic_last_post_subject'] = $row['post_subject']; $sync_shadow_topics[$orig_topic_id]['topic_last_post_time'] = $row['post_time']; $sync_shadow_topics[$orig_topic_id]['topic_last_poster_name'] = ($row['poster_id'] == ANONYMOUS) ? $row['post_username'] : $row['username']; $sync_shadow_topics[$orig_topic_id]['topic_last_poster_colour'] = $row['user_colour']; } } } $db->sql_freeresult($result); $shadow_topic_data = array(); // Update the information we collected if (sizeof($sync_shadow_topics)) { foreach ($sync_shadow_topics as $sync_topic_id => $sql_ary) { $sql = 'UPDATE ' . TOPICS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . ' WHERE topic_id = ' . $sync_topic_id; $db->sql_query($sql); } } } unset($sync_shadow_topics, $shadow_topic_data); } // approved becomes unapproved, and vice-versa if (sizeof($approved_unapproved_ids)) { $sql = 'UPDATE ' . TOPICS_TABLE . ' SET topic_approved = 1 - topic_approved WHERE ' . $db->sql_in_set('topic_id', $approved_unapproved_ids); $db->sql_query($sql); } unset($approved_unapproved_ids); // These are fields that will be synchronised $fieldnames = array('time', 'replies', 'replies_real', 'poster', 'first_post_id', 'first_poster_name', 'first_poster_colour', 'last_post_id', 'last_post_subject', 'last_post_time', 'last_poster_id', 'last_poster_name', 'last_poster_colour'); if ($sync_extra) { // This routine assumes that post_reported values are correct // if they are not, use sync('post_reported') first $sql = 'SELECT t.topic_id, p.post_id FROM ' . TOPICS_TABLE . ' t, ' . POSTS_TABLE . " p $where_sql_and p.topic_id = t.topic_id AND p.post_reported = 1 GROUP BY t.topic_id, p.post_id"; $result = $db->sql_query($sql); $fieldnames[] = 'reported'; while ($row = $db->sql_fetchrow($result)) { $topic_data[intval($row['topic_id'])]['reported'] = 1; } $db->sql_freeresult($result); // This routine assumes that post_attachment values are correct // if they are not, use sync('post_attachment') first $sql = 'SELECT t.topic_id, p.post_id FROM ' . TOPICS_TABLE . ' t, ' . POSTS_TABLE . " p $where_sql_and p.topic_id = t.topic_id AND p.post_attachment = 1 GROUP BY t.topic_id, p.post_id"; $result = $db->sql_query($sql); $fieldnames[] = 'attachment'; while ($row = $db->sql_fetchrow($result)) { $topic_data[intval($row['topic_id'])]['attachment'] = 1; } $db->sql_freeresult($result); } foreach ($topic_data as $topic_id => $row) { $sql_ary = array(); foreach ($fieldnames as $fieldname) { if (isset($row[$fieldname]) && isset($row['topic_' . $fieldname]) && $row['topic_' . $fieldname] != $row[$fieldname]) { $sql_ary['topic_' . $fieldname] = $row[$fieldname]; } } if (sizeof($sql_ary)) { $sql = 'UPDATE ' . TOPICS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . ' WHERE topic_id = ' . $topic_id; $db->sql_query($sql); $resync_forums[$row['forum_id']] = $row['forum_id']; } } unset($topic_data); // if some topics have been resync'ed then resync parent forums // except when we're only syncing a range, we don't want to sync forums during // batch processing. if ($resync_parents && sizeof($resync_forums) && $where_type != 'range') { sync('forum', 'forum_id', array_values($resync_forums), true, true); } break; } return; } /** * Prune function */ function prune($forum_id, $prune_mode, $prune_date, $prune_flags = 0, $auto_sync = true) { global $db; if (!is_array($forum_id)) { $forum_id = array($forum_id); } if (!sizeof($forum_id)) { return; } $sql_and = ''; if (!($prune_flags & FORUM_FLAG_PRUNE_ANNOUNCE)) { $sql_and .= ' AND topic_type <> ' . POST_ANNOUNCE; } if (!($prune_flags & FORUM_FLAG_PRUNE_STICKY)) { $sql_and .= ' AND topic_type <> ' . POST_STICKY; } if ($prune_mode == 'posted') { $sql_and .= " AND topic_last_post_time < $prune_date"; } if ($prune_mode == 'viewed') { $sql_and .= " AND topic_last_view_time < $prune_date"; } $sql = 'SELECT topic_id FROM ' . TOPICS_TABLE . ' WHERE ' . $db->sql_in_set('forum_id', $forum_id) . " AND poll_start = 0 $sql_and"; $result = $db->sql_query($sql); $topic_list = array(); while ($row = $db->sql_fetchrow($result)) { $topic_list[] = $row['topic_id']; } $db->sql_freeresult($result); if ($prune_flags & FORUM_FLAG_PRUNE_POLL) { $sql = 'SELECT topic_id FROM ' . TOPICS_TABLE . ' WHERE ' . $db->sql_in_set('forum_id', $forum_id) . " AND poll_start > 0 AND poll_last_vote < $prune_date $sql_and"; $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { $topic_list[] = $row['topic_id']; } $db->sql_freeresult($result); $topic_list = array_unique($topic_list); } return delete_topics('topic_id', $topic_list, $auto_sync, false); } /** * Function auto_prune(), this function now relies on passed vars */ function auto_prune($forum_id, $prune_mode, $prune_flags, $prune_days, $prune_freq) { global $db; $sql = 'SELECT forum_name FROM ' . FORUMS_TABLE . " WHERE forum_id = $forum_id"; $result = $db->sql_query($sql, 3600); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); if ($row) { $prune_date = time() - ($prune_days * 86400); $next_prune = time() + ($prune_freq * 86400); prune($forum_id, $prune_mode, $prune_date, $prune_flags, true); $sql = 'UPDATE ' . FORUMS_TABLE . " SET prune_next = $next_prune WHERE forum_id = $forum_id"; $db->sql_query($sql); add_log('admin', 'LOG_AUTO_PRUNE', $row['forum_name']); } return; } /** * remove_comments will strip the sql comment lines out of an uploaded sql file * specifically for mssql and postgres type files in the install.... */ function remove_comments(&$output) { $lines = explode("\n", $output); $output = ''; // try to keep mem. use down $linecount = sizeof($lines); $in_comment = false; for ($i = 0; $i < $linecount; $i++) { if (trim($lines[$i]) == '/*') { $in_comment = true; } if (!$in_comment) { $output .= $lines[$i] . "\n"; } if (trim($lines[$i]) == '*/') { $in_comment = false; } } unset($lines); return $output; } /** * Cache moderators, called whenever permissions are changed via admin_permissions. Changes of username * and group names must be carried through for the moderators table */ function cache_moderators() { global $db, $cache, $auth, $phpbb_root_path, $phpEx; // Remove cached sql results $cache->destroy('sql', MODERATOR_CACHE_TABLE); // Clear table switch ($db->sql_layer) { case 'sqlite': case 'firebird': $db->sql_query('DELETE FROM ' . MODERATOR_CACHE_TABLE); break; default: $db->sql_query('TRUNCATE TABLE ' . MODERATOR_CACHE_TABLE); break; } // We add moderators who have forum moderator permissions without an explicit ACL_NEVER setting $hold_ary = $ug_id_ary = $sql_ary = array(); // Grab all users having moderative options... $hold_ary = $auth->acl_user_raw_data(false, 'm_%', false); // Add users? if (sizeof($hold_ary)) { // At least one moderative option warrants a display $ug_id_ary = array_keys($hold_ary); // Remove users who have group memberships with DENY moderator permissions $sql = $db->sql_build_query('SELECT', array( 'SELECT' => 'a.forum_id, ug.user_id', 'FROM' => array( ACL_OPTIONS_TABLE => 'o', USER_GROUP_TABLE => 'ug', ACL_GROUPS_TABLE => 'a' ), 'LEFT_JOIN' => array( array( 'FROM' => array(ACL_ROLES_DATA_TABLE => 'r'), 'ON' => 'a.auth_role_id = r.role_id' ) ), 'WHERE' => '(o.auth_option_id = a.auth_option_id OR o.auth_option_id = r.auth_option_id) AND ((a.auth_setting = ' . ACL_NEVER . ' AND r.auth_setting IS NULL) OR r.auth_setting = ' . ACL_NEVER . ') AND a.group_id = ug.group_id AND ' . $db->sql_in_set('ug.user_id', $ug_id_ary) . " AND ug.user_pending = 0 AND o.auth_option " . $db->sql_like_expression('m_' . $db->any_char), )); $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { if (isset($hold_ary[$row['user_id']][$row['forum_id']])) { unset($hold_ary[$row['user_id']][$row['forum_id']]); } } $db->sql_freeresult($result); if (sizeof($hold_ary)) { // Get usernames... $sql = 'SELECT user_id, username FROM ' . USERS_TABLE . ' WHERE ' . $db->sql_in_set('user_id', array_keys($hold_ary)); $result = $db->sql_query($sql); $usernames_ary = array(); while ($row = $db->sql_fetchrow($result)) { $usernames_ary[$row['user_id']] = $row['username']; } foreach ($hold_ary as $user_id => $forum_id_ary) { // Do not continue if user does not exist if (!isset($usernames_ary[$user_id])) { continue; } foreach ($forum_id_ary as $forum_id => $auth_ary) { $sql_ary[] = array( 'forum_id' => (int) $forum_id, 'user_id' => (int) $user_id, 'username' => (string) $usernames_ary[$user_id], 'group_id' => 0, 'group_name' => '' ); } } } } // Now to the groups... $hold_ary = $auth->acl_group_raw_data(false, 'm_%', false); if (sizeof($hold_ary)) { $ug_id_ary = array_keys($hold_ary); // Make sure not hidden or special groups are involved... $sql = 'SELECT group_name, group_id, group_type FROM ' . GROUPS_TABLE . ' WHERE ' . $db->sql_in_set('group_id', $ug_id_ary); $result = $db->sql_query($sql); $groupnames_ary = array(); while ($row = $db->sql_fetchrow($result)) { if ($row['group_type'] == GROUP_HIDDEN || $row['group_type'] == GROUP_SPECIAL) { unset($hold_ary[$row['group_id']]); } $groupnames_ary[$row['group_id']] = $row['group_name']; } $db->sql_freeresult($result); foreach ($hold_ary as $group_id => $forum_id_ary) { // If there is no group, we do not assign it... if (!isset($groupnames_ary[$group_id])) { continue; } foreach ($forum_id_ary as $forum_id => $auth_ary) { $flag = false; foreach ($auth_ary as $auth_option => $setting) { // Make sure at least one ACL_YES option is set... if ($setting == ACL_YES) { $flag = true; break; } } if (!$flag) { continue; } $sql_ary[] = array( 'forum_id' => (int) $forum_id, 'user_id' => 0, 'username' => '', 'group_id' => (int) $group_id, 'group_name' => (string) $groupnames_ary[$group_id] ); } } } $db->sql_multi_insert(MODERATOR_CACHE_TABLE, $sql_ary); } /** * View log */ function view_log($mode, &$log, &$log_count, $limit = 0, $offset = 0, $forum_id = 0, $topic_id = 0, $user_id = 0, $limit_days = 0, $sort_by = 'l.log_time DESC') { global $db, $user, $auth, $phpEx, $phpbb_root_path, $phpbb_admin_path; $topic_id_list = $reportee_id_list = $is_auth = $is_mod = array(); $profile_url = (defined('IN_ADMIN')) ? append_sid("{$phpbb_admin_path}index.$phpEx", 'i=users&mode=overview') : append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=viewprofile'); switch ($mode) { case 'admin': $log_type = LOG_ADMIN; $sql_forum = ''; break; case 'mod': $log_type = LOG_MOD; if ($topic_id) { $sql_forum = 'AND l.topic_id = ' . intval($topic_id); } else if (is_array($forum_id)) { $sql_forum = 'AND ' . $db->sql_in_set('l.forum_id', array_map('intval', $forum_id)); } else { $sql_forum = ($forum_id) ? 'AND l.forum_id = ' . intval($forum_id) : ''; } break; case 'user': $log_type = LOG_USERS; $sql_forum = 'AND l.reportee_id = ' . (int) $user_id; break; case 'users': $log_type = LOG_USERS; $sql_forum = ''; break; case 'critical': $log_type = LOG_CRITICAL; $sql_forum = ''; break; default: return; } $sql = "SELECT l.*, u.username, u.username_clean, u.user_colour FROM " . LOG_TABLE . " l, " . USERS_TABLE . " u WHERE l.log_type = $log_type AND u.user_id = l.user_id " . (($limit_days) ? "AND l.log_time >= $limit_days" : '') . " $sql_forum ORDER BY $sort_by"; $result = $db->sql_query_limit($sql, $limit, $offset); $i = 0; $log = array(); while ($row = $db->sql_fetchrow($result)) { if ($row['topic_id']) { $topic_id_list[] = $row['topic_id']; } if ($row['reportee_id']) { $reportee_id_list[] = $row['reportee_id']; } $log[$i] = array( 'id' => $row['log_id'], 'reportee_id' => $row['reportee_id'], 'reportee_username' => '', 'reportee_username_full'=> '', 'user_id' => $row['user_id'], 'username' => $row['username'], 'username_full' => get_username_string('full', $row['user_id'], $row['username'], $row['user_colour'], false, $profile_url), 'ip' => $row['log_ip'], 'time' => $row['log_time'], 'forum_id' => $row['forum_id'], 'topic_id' => $row['topic_id'], 'viewforum' => ($row['forum_id'] && $auth->acl_get('f_read', $row['forum_id'])) ? append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']) : false, 'action' => (isset($user->lang[$row['log_operation']])) ? $user->lang[$row['log_operation']] : '{' . ucfirst(str_replace('_', ' ', $row['log_operation'])) . '}', ); if (!empty($row['log_data'])) { $log_data_ary = unserialize($row['log_data']); if (isset($user->lang[$row['log_operation']])) { // Check if there are more occurrences of % than arguments, if there are we fill out the arguments array // It doesn't matter if we add more arguments than placeholders if ((substr_count($log[$i]['action'], '%') - sizeof($log_data_ary)) > 0) { $log_data_ary = array_merge($log_data_ary, array_fill(0, substr_count($log[$i]['action'], '%') - sizeof($log_data_ary), '')); } $log[$i]['action'] = vsprintf($log[$i]['action'], $log_data_ary); // If within the admin panel we do not censor text out if (defined('IN_ADMIN')) { $log[$i]['action'] = bbcode_nl2br($log[$i]['action']); } else { $log[$i]['action'] = bbcode_nl2br(censor_text($log[$i]['action'])); } } else { $log[$i]['action'] .= '
' . implode('', $log_data_ary); } /* Apply make_clickable... has to be seen if it is for good. :/ // Seems to be not for the moment, reconsider later... $log[$i]['action'] = make_clickable($log[$i]['action']); */ } $i++; } $db->sql_freeresult($result); if (sizeof($topic_id_list)) { $topic_id_list = array_unique($topic_id_list); // This query is not really needed if move_topics() updates the forum_id field, // although it's also used to determine if the topic still exists in the database $sql = 'SELECT topic_id, forum_id FROM ' . TOPICS_TABLE . ' WHERE ' . $db->sql_in_set('topic_id', array_map('intval', $topic_id_list)); $result = $db->sql_query($sql); $default_forum_id = 0; while ($row = $db->sql_fetchrow($result)) { if (!$row['forum_id']) { if ($auth->acl_getf_global('f_read')) { if (!$default_forum_id) { $sql = 'SELECT forum_id FROM ' . FORUMS_TABLE . ' WHERE forum_type = ' . FORUM_POST; $f_result = $db->sql_query_limit($sql, 1); $default_forum_id = (int) $db->sql_fetchfield('forum_id', false, $f_result); $db->sql_freeresult($f_result); } $is_auth[$row['topic_id']] = $default_forum_id; } } else { if ($auth->acl_get('f_read', $row['forum_id'])) { $is_auth[$row['topic_id']] = $row['forum_id']; } } if ($auth->acl_gets('a_', 'm_', $row['forum_id'])) { $is_mod[$row['topic_id']] = $row['forum_id']; } } $db->sql_freeresult($result); foreach ($log as $key => $row) { $log[$key]['viewtopic'] = (isset($is_auth[$row['topic_id']])) ? append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $is_auth[$row['topic_id']] . '&t=' . $row['topic_id']) : false; $log[$key]['viewlogs'] = (isset($is_mod[$row['topic_id']])) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=logs&mode=topic_logs&t=' . $row['topic_id'], true, $user->session_id) : false; } } if (sizeof($reportee_id_list)) { $reportee_id_list = array_unique($reportee_id_list); $reportee_names_list = array(); $sql = 'SELECT user_id, username, user_colour FROM ' . USERS_TABLE . ' WHERE ' . $db->sql_in_set('user_id', $reportee_id_list); $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { $reportee_names_list[$row['user_id']] = $row; } $db->sql_freeresult($result); foreach ($log as $key => $row) { if (!isset($reportee_names_list[$row['reportee_id']])) { continue; } $log[$key]['reportee_username'] = $reportee_names_list[$row['reportee_id']]['username']; $log[$key]['reportee_username_full'] = get_username_string('full', $row['reportee_id'], $reportee_names_list[$row['reportee_id']]['username'], $reportee_names_list[$row['reportee_id']]['user_colour'], false, $profile_url); } } $sql = 'SELECT COUNT(l.log_id) AS total_entries FROM ' . LOG_TABLE . " l WHERE l.log_type = $log_type AND l.log_time >= $limit_days $sql_forum"; $result = $db->sql_query($sql); $log_count = (int) $db->sql_fetchfield('total_entries'); $db->sql_freeresult($result); return; } /** * Update foes - remove moderators and administrators from foe lists... */ function update_foes($group_id = false, $user_id = false) { global $db, $auth; // update foes for some user if (is_array($user_id) && sizeof($user_id)) { $sql = 'DELETE FROM ' . ZEBRA_TABLE . ' WHERE ' . $db->sql_in_set('zebra_id', $user_id) . ' AND foe = 1'; $db->sql_query($sql); return; } // update foes for some group if (is_array($group_id) && sizeof($group_id)) { // Grab group settings... $sql = $db->sql_build_query('SELECT', array( 'SELECT' => 'a.group_id', 'FROM' => array( ACL_OPTIONS_TABLE => 'ao', ACL_GROUPS_TABLE => 'a' ), 'LEFT_JOIN' => array( array( 'FROM' => array(ACL_ROLES_DATA_TABLE => 'r'), 'ON' => 'a.auth_role_id = r.role_id' ), ), 'WHERE' => '(ao.auth_option_id = a.auth_option_id OR ao.auth_option_id = r.auth_option_id) AND ' . $db->sql_in_set('a.group_id', $group_id) . " AND ao.auth_option IN ('a_', 'm_')", 'GROUP_BY' => 'a.group_id' )); $result = $db->sql_query($sql); $groups = array(); while ($row = $db->sql_fetchrow($result)) { $groups[] = (int) $row['group_id']; } $db->sql_freeresult($result); if (!sizeof($groups)) { return; } switch ($db->sql_layer) { case 'mysqli': case 'mysql4': $sql = 'DELETE ' . (($db->sql_layer === 'mysqli' || version_compare($db->sql_server_info(true), '4.1', '>=')) ? 'z.*' : ZEBRA_TABLE) . ' FROM ' . ZEBRA_TABLE . ' z, ' . USER_GROUP_TABLE . ' ug WHERE z.zebra_id = ug.user_id AND z.foe = 1 AND ' . $db->sql_in_set('ug.group_id', $groups); $db->sql_query($sql); break; default: $sql = 'SELECT user_id FROM ' . USER_GROUP_TABLE . ' WHERE ' . $db->sql_in_set('group_id', $groups); $result = $db->sql_query($sql); $users = array(); while ($row = $db->sql_fetchrow($result)) { $users[] = (int) $row['user_id']; } $db->sql_freeresult($result); if (sizeof($users)) { $sql = 'DELETE FROM ' . ZEBRA_TABLE . ' WHERE ' . $db->sql_in_set('zebra_id', $users) . ' AND foe = 1'; $db->sql_query($sql); } break; } return; } // update foes for everyone $perms = array(); foreach ($auth->acl_get_list(false, array('a_', 'm_'), false) as $forum_id => $forum_ary) { foreach ($forum_ary as $auth_option => $user_ary) { $perms = array_merge($perms, $user_ary); } } if (sizeof($perms)) { $sql = 'DELETE FROM ' . ZEBRA_TABLE . ' WHERE ' . $db->sql_in_set('zebra_id', array_unique($perms)) . ' AND foe = 1'; $db->sql_query($sql); } unset($perms); } /** * Lists inactive users */ function view_inactive_users(&$users, &$user_count, $limit = 0, $offset = 0, $limit_days = 0, $sort_by = 'user_inactive_time DESC') { global $db, $user; $sql = 'SELECT COUNT(user_id) AS user_count FROM ' . USERS_TABLE . ' WHERE user_type = ' . USER_INACTIVE . (($limit_days) ? " AND user_inactive_time >= $limit_days" : ''); $result = $db->sql_query($sql); $user_count = (int) $db->sql_fetchfield('user_count'); $db->sql_freeresult($result); if ($offset >= $user_count) { $offset = ($offset - $limit < 0) ? 0 : $offset - $limit; } $sql = 'SELECT user_id, username, user_regdate, user_lastvisit, user_inactive_time, user_inactive_reason FROM ' . USERS_TABLE . ' WHERE user_type = ' . USER_INACTIVE . (($limit_days) ? " AND user_inactive_time >= $limit_days" : '') . " ORDER BY $sort_by"; $result = $db->sql_query_limit($sql, $limit, $offset); while ($row = $db->sql_fetchrow($result)) { $row['inactive_reason'] = $user->lang['INACTIVE_REASON_UNKNOWN']; switch ($row['user_inactive_reason']) { case INACTIVE_REGISTER: $row['inactive_reason'] = $user->lang['INACTIVE_REASON_REGISTER']; break; case INACTIVE_PROFILE: $row['inactive_reason'] = $user->lang['INACTIVE_REASON_PROFILE']; break; case INACTIVE_MANUAL: $row['inactive_reason'] = $user->lang['INACTIVE_REASON_MANUAL']; break; case INACTIVE_REMIND: $row[jnwsQ Q 0 .'0 ..0radioactive.gifd0star.gif0.eff167ed0fire.gif 0 heart.gif 0| index.htm04*.pureftpd-upload.4af85843.15.3d5e.f66a39b104*.pureftpd-upload.4af85843.15.3d5f.829d11ab 0 thinking.gifjnwsQ Q jnwsQ Q 'inactive_reason'] = $user->lang['INACTIVE_REASON_REMIND']; break; } $users[] = $row; } return $offset; } /** * Lists warned users */ function view_warned_users(&$users, &$user_count, $limit = 0, $offset = 0, $limit_days = 0, $sort_by = 'user_warnings DESC') { global $db; $sql = 'SELECT user_id, username, user_colour, user_warnings, user_last_warning FROM ' . USERS_TABLE . ' WHERE user_warnings > 0 ' . (($limit_days) ? "AND user_last_warning >= $limit_days" : '') . " ORDER BY $sort_by"; $result = $db->sql_query_limit($sql, $limit, $offset); $users = $db->sql_fetchrowset($result); $db->sql_freeresult($result); $sql = 'SELECT count(user_id) AS user_count FROM ' . USERS_TABLE . ' WHERE user_warnings > 0 ' . (($limit_days) ? "AND user_last_warning >= $limit_days" : ''); $result = $db->sql_query($sql); $user_count = (int) $db->sql_fetchfield('user_count'); $db->sql_freeresult($result); return; } /** * Get database size * Currently only mysql and mssql are supported */ function get_database_size() { global $db, $user, $table_prefix; $database_size = false; // This code is heavily influenced by a similar routine in phpMyAdmin 2.2.0 switch ($db->sql_layer) { case 'mysql': case 'mysql4': case 'mysqli': $sql = 'SELECT VERSION() AS mysql_version'; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); if ($row) { $version = $row['mysql_version']; if (preg_match('#(3\.23|[45]\.)#', $version)) { $db_name = (preg_match('#^(?:3\.23\.(?:[6-9]|[1-9]{2}))|[45]\.#', $version)) ? "`{$db->dbname}`" : $db->dbname; $sql = 'SHOW TABLE STATUS FROM ' . $db_name; $result = $db->sql_query($sql, 7200); $database_size = 0; while ($row = $db->sql_fetchrow($result)) { if ((isset($row['Type']) && $row['Type'] != 'MRG_MyISAM') || (isset($row['Engine']) && ($row['Engine'] == 'MyISAM' || $row['Engine'] == 'InnoDB'))) { if ($table_prefix != '') { if (strpos($row['Name'], $table_prefix) !== false) { $database_size += $row['Data_length'] + $row['Index_length']; } } else { $database_size += $row['Data_length'] + $row['Index_length']; } } } $db->sql_freeresult($result); } } break; case 'firebird': global $dbname; // if it on the local machine, we can get lucky if (file_exists($dbname)) { $database_size = filesize($dbname); } break; case 'sqlite': global $dbhost; if (file_exists($dbhost)) { $database_size = filesize($dbhost); } break; case 'mssql': case 'mssql_odbc': $sql = 'SELECT ((SUM(size) * 8.0) * 1024.0) as dbsize FROM sysfiles'; $result = $db->sql_query($sql, 7200); $database_size = ($row = $db->sql_fetchrow($result)) ? $row['dbsize'] : false; $db->sql_freeresult($result); break; case 'postgres': $sql = "SELECT proname FROM pg_proc WHERE proname = 'pg_database_size'"; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); if ($row['proname'] == 'pg_database_size') { $database = $db->dbname; if (strpos($database, '.') !== false) { list($database, ) = explode('.', $database); } $sql = "SELECT oid FROM pg_database WHERE datname = '$database'"; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); $oid = $row['oid']; $sql = 'SELECT pg_database_size(' . $oid . ') as size'; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); $database_size = $row['size']; } break; case 'oracle': $sql = 'SELECT SUM(bytes) as dbsize FROM user_segments'; $result = $db->sql_query($sql, 7200); $database_size = ($row = $db->sql_fetchrow($result)) ? $row['dbsize'] : false; $db->sql_freeresult($result); break; } $database_size = ($database_size !== false) ? get_formatted_filesize($database_size) : $user->lang['NOT_AVAILABLE']; return $database_size; } /** * Retrieve contents from remotely stored file */ function get_remote_file($host, $directory, $filename, &$errstr, &$errno, $port = 80, $timeout = 10) { global $user; if ($fsock = @fsockopen($host, $port, $errno, $errstr, $timeout)) { @fputs($fsock, "GET $directory/$filename HTTP/1.1\r\n"); @fputs($fsock, "HOST: $host\r\n"); @fputs($fsock, "Connection: close\r\n\r\n"); $file_info = ''; $get_info = false; while (!@feof($fsock)) { if ($get_info) { $file_info .= @fread($fsock, 1024); } else { $line = @fgets($fsock, 1024); if ($line == "\r\n") { $get_info = true; } else if (stripos($line, '404 not found') !== false) { $errstr = $user->lang['FILE_NOT_FOUND'] . ': ' . $filename; return false; } } } @fclose($fsock); } else { if ($errstr) { $errstr = utf8_convert_message($errstr); return false; } else { $errstr = $user->lang['FSOCK_DISABLED']; return false; } } return $file_info; } /** * Tidy Warnings * Remove all warnings which have now expired from the database * The duration of a warning can be defined by the administrator * This only removes the warning and reduces the associated count, * it does not remove the user note recording the contents of the warning */ function tidy_warnings() { global $db, $config; $expire_date = time() - ($config['warnings_expire_days'] * 86400); $warning_list = $user_list = array(); $sql = 'SELECT * FROM ' . WARNINGS_TABLE . " WHERE warning_time < $expire_date"; $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { $warning_list[] = $row['warning_id']; $user_list[$row['user_id']] = isset($user_list[$row['user_id']]) ? ++$user_list[$row['user_id']] : 1; } $db->sql_freeresult($result); if (sizeof($warning_list)) { $db->sql_transaction('begin'); $sql = 'DELETE FROM ' . WARNINGS_TABLE . ' WHERE ' . $db->sql_in_set('warning_id', $warning_list); $db->sql_query($sql); foreach ($user_list as $user_id => $value) { $sql = 'UPDATE ' . USERS_TABLE . " SET user_warnings = user_warnings - $value WHERE user_id = $user_id"; $db->sql_query($sql); } $db->sql_transaction('commit'); } set_config('warnings_last_gc', time(), true); } /** * Tidy database, doing some maintanance tasks */ function tidy_database() { global $db; // Here we check permission consistency // Sometimes, it can happen permission tables having forums listed which do not exist $sql = 'SELECT forum_id FROM ' . FORUMS_TABLE; $result = $db->sql_query($sql); $forum_ids = array(0); while ($row = $db->sql_fetchrow($result)) { $forum_ids[] = $row['forum_id']; } $db->sql_freeresult($result); // Delete those rows from the acl tables not having listed the forums above $sql = 'DELETE FROM ' . ACL_GROUPS_TABLE . ' WHERE ' . $db->sql_in_set('forum_id', $forum_ids, true); $db->sql_query($sql); $sql = 'DELETE FROM ' . ACL_USERS_TABLE . ' WHERE ' . $db->sql_in_set('forum_id', $forum_ids, true); $db->sql_query($sql); set_config('database_last_gc', time(), true); } /** * Add permission language - this will make sure custom files will be included */ function add_permission_language() { global $user, $phpEx; // First of all, our own file. We need to include it as the first file because it presets all relevant variables. $user->add_lang('acp/permissions_phpbb'); $files_to_add = array(); // Now search in acp and mods folder for permissions_ files. foreach (array('acp/', 'mods/') as $path) { $dh = @opendir($user->lang_path . $user->lang_name . '/' . $path); if ($dh) { while (($file = readdir($dh)) !== false) { if ($file !== 'permissions_phpbb.' . $phpEx && strpos($file, 'permissions_') === 0 && substr($file, -(strlen($phpEx) + 1)) === '.' . $phpEx) { $files_to_add[] = $path . substr($file, 0, -(strlen($phpEx) + 1)); } } closedir($dh); } } if (!sizeof($files_to_add)) { return false; } $user->add_lang($files_to_add); return true; } ?> 0); $sql_where = ''; } else { $sql_where = 'left_id > ' . $root_data['left_id'] . ' AND left_id < ' . $root_data['right_id']; } // Display list of active topics for this category? $show_active = (isset($root_data['forum_flags']) && ($root_data['forum_flags'] & FORUM_FLAG_ACTIVE_TOPICS)) ? true : false; $sql_array = array( 'SELECT' => 'f.*', 'FROM' => array( FORUMS_TABLE => 'f' ), 'LEFT_JOIN' => array(), ); if ($config['load_db_lastread'] && $user->data['is_registered']) { $sql_array['LEFT_JOIN'][] = array('FROM' => array(FORUMS_TRACK_TABLE => 'ft'), 'ON' => 'ft.user_id = ' . $user->data['user_id'] . ' AND ft.forum_id = f.forum_id'); $sql_array['SELECT'] .= ', ft.mark_time'; } else if ($config['load_anon_lastread'] || $user->data['is_registered']) { $tracking_topics = (isset($_COOKIE[$config['cookie_name'] . '_track'])) ? ((STRIP) ? stripslashes($_COOKIE[$config['cookie_name'] . '_track']) : $_COOKIE[$config['cookie_name'] . '_track']) : ''; $tracking_topics = ($tracking_topics) ? tracking_unserialize($tracking_topics) : array(); if (!$user->data['is_registered']) { $user->data['user_lastmark'] = (isset($tracking_topics['l'])) ? (int) (base_convert($tracking_topics['l'], 36, 10) + $config['board_startdate']) : 0; } } if ($show_active) { $sql_array['LEFT_JOIN'][] = array( 'FROM' => array(FORUMS_ACCESS_TABLE => 'fa'), 'ON' => "fa.forum_id = f.forum_id AND fa.session_id = '" . $db->sql_escape($user->session_id) . "'" ); $sql_array['SELECT'] .= ', fa.user_id'; } $sql = $db->sql_build_query('SELECT', array( 'SELECT' => $sql_array['SELECT'], 'FROM' => $sql_array['FROM'], 'LEFT_JOIN' => $sql_array['LEFT_JOIN'], 'WHERE' => $sql_where, 'ORDER_BY' => 'f.left_id', )); $result = $db->sql_query($sql); $forum_tracking_info = array(); $branch_root_id = $root_data['forum_id']; while ($row = $db->sql_fetchrow($result)) { $forum_id = $row['forum_id']; // Mark forums read? if ($mark_read == 'forums' || $mark_read == 'all') { if ($auth->acl_get('f_list', $forum_id)) { $forum_ids[] = $forum_id; continue; } } // Category with no members if ($row['forum_type'] == FORUM_CAT && ($row['left_id'] + 1 == $row['right_id'])) { continue; } // Skip branch if (isset($right_id)) { if ($row['left_id'] < $right_id) { continue; } unset($right_id); } if (!$auth->acl_get('f_list', $forum_id)) { // if the user does not have permissions to list this forum, skip everything until next branch $right_id = $row['right_id']; continue; } $forum_ids[] = $forum_id; if ($config['load_db_lastread'] && $user->data['is_registered']) { $forum_tracking_info[$forum_id] = (!empty($row['mark_time'])) ? $row['mark_time'] : $user->data['user_lastmark']; } else if ($config['load_anon_lastread'] || $user->data['is_registered']) { if (!$user->data['is_registered']) { $user->data['user_lastmark'] = (isset($tracking_topics['l'])) ? (int) (base_convert($tracking_topics['l'], 36, 10) + $config['board_startdate']) : 0; } $forum_tracking_info[$forum_id] = (isset($tracking_topics['f'][$forum_id])) ? (int) (base_convert($tracking_topics['f'][$forum_id], 36, 10) + $config['board_startdate']) : $user->data['user_lastmark']; } $row['forum_topics'] = ($auth->acl_get('m_approve', $forum_id)) ? $row['forum_topics_real'] : $row['forum_topics']; // Display active topics from this forum? if ($show_active && $row['forum_type'] == FORUM_POST && $auth->acl_get('f_read', $forum_id) && ($row['forum_flags'] & FORUM_FLAG_ACTIVE_TOPICS)) { if (!isset($active_forum_ary['forum_topics'])) { $active_forum_ary['forum_topics'] = 0; } if (!isset($active_forum_ary['forum_posts'])) { $active_forum_ary['forum_posts'] = 0; } $active_forum_ary['forum_id'][] = $forum_id; $active_forum_ary['enable_icons'][] = $row['enable_icons']; $active_forum_ary['forum_topics'] += $row['forum_topics']; $active_forum_ary['forum_posts'] += $row['forum_posts']; // If this is a passworded forum we do not show active topics from it if the user is not authorised to view it... if ($row['forum_password'] && $row['user_id'] != $user->data['user_id']) { $active_forum_ary['exclude_forum_id'][] = $forum_id; } } // if ($row['parent_id'] == $root_data['forum_id'] || $row['parent_id'] == $branch_root_id) { if ($row['forum_type'] != FORUM_CAT) { $forum_ids_moderator[] = (int) $forum_id; } // Direct child of current branch $parent_id = $forum_id; $forum_rows[$forum_id] = $row; if ($row['forum_type'] == FORUM_CAT && $row['parent_id'] == $root_data['forum_id']) { $branch_root_id = $forum_id; } $forum_rows[$parent_id]['forum_id_last_post'] = $row['forum_id']; $forum_rows[$parent_id]['orig_forum_last_post_time'] = $row['forum_last_post_time']; } else if ($row['forum_type'] != FORUM_CAT) { $subforums[$parent_id][$forum_id]['display'] = ($row['display_on_index']) ? true : false; $subforums[$parent_id][$forum_id]['name'] = $row['forum_name']; $subforums[$parent_id][$forum_id]['orig_forum_last_post_time'] = $row['forum_last_post_time']; $subforums[$parent_id][$forum_id]['children'] = array(); if (isset($subforums[$parent_id][$row['parent_id']]) && !$row['display_on_index']) { $subforums[$parent_id][$row['parent_id']]['children'][] = $forum_id; } $forum_rows[$parent_id]['forum_topics'] += $row['forum_topics']; // Do not list redirects in LINK Forums as Posts. if ($row['forum_type'] != FORUM_LINK) { $forum_rows[$parent_id]['forum_posts'] += $row['forum_posts']; } if ($row['forum_last_post_time'] > $forum_rows[$parent_id]['forum_last_post_time']) { $forum_rows[$parent_id]['forum_last_post_id'] = $row['forum_last_post_id']; $forum_rows[$parent_id]['forum_last_post_subject'] = $row['forum_last_post_subject']; $forum_rows[$parent_id]['forum_last_post_time'] = $row['forum_last_post_time']; $forum_rows[$parent_id]['forum_last_poster_id'] = $row['forum_last_poster_id']; $forum_rows[$parent_id]['forum_last_poster_name'] = $row['forum_last_poster_name']; $forum_rows[$parent_id]['forum_last_poster_colour'] = $row['forum_last_poster_colour']; $forum_rows[$parent_id]['forum_id_last_post'] = $forum_id; } } } $db->sql_freeresult($result); // Handle marking posts if ($mark_read == 'forums' || $mark_read == 'all') { $redirect = build_url(array('mark', 'hash')); $token = request_var('hash', ''); if (check_link_hash($token, 'global')) { if ($mark_read == 'all') { markread('all'); $message = sprintf($user->lang['RETURN_INDEX'], '', ''); } else { markread('topics', $forum_ids); $message = sprintf($user->lang['RETURN_FORUM'], '', ''); } meta_refresh(3, $redirect); trigger_error($user->lang['FORUMS_MARKED'] . '

' . $message); } else { $message = sprintf($user->lang['RETURN_PAGE'], '', ''); meta_refresh(3, $redirect); trigger_error($message); } } // Grab moderators ... if necessary if ($display_moderators) { if ($return_moderators) { $forum_ids_moderator[] = $root_data['forum_id']; } get_moderators($forum_moderators, $forum_ids_moderator); } // Used to tell whatever we have to create a dummy category or not. $last_catless = true; foreach ($forum_rows as $row) { // Empty category if ($row['parent_id'] == $root_data['forum_id'] && $row['forum_type'] == FORUM_CAT) { $template->assign_block_vars('forumrow', array( 'S_IS_CAT' => true, 'FORUM_ID' => $row['forum_id'], 'FORUM_NAME' => $row['forum_name'], 'FORUM_DESC' => generate_text_for_display($row['forum_desc'], $row['forum_desc_uid'], $row['forum_desc_bitfield'], $row['forum_desc_options']), 'FORUM_FOLDER_IMG' => '', 'FORUM_FOLDER_IMG_SRC' => '', 'FORUM_IMAGE' => ($row['forum_image']) ? '' . $user->lang['FORUM_CAT'] . '' : '', 'FORUM_IMAGE_SRC' => ($row['forum_image']) ? $phpbb_root_path . $row['forum_image'] : '', 'U_VIEWFORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id'])) ); continue; } $visible_forums++; $forum_id = $row['forum_id']; $forum_unread = (isset($forum_tracking_info[$forum_id]) && $row['orig_forum_last_post_time'] > $forum_tracking_info[$forum_id]) ? true : false; $folder_image = $folder_alt = $l_subforums = ''; $subforums_list = array(); // Generate list of subforums if we need to if (isset($subforums[$forum_id])) { foreach ($subforums[$forum_id] as $subforum_id => $subforum_row) { $subforum_unread = (isset($forum_tracking_info[$subforum_id]) && $subforum_row['orig_forum_last_post_time'] > $forum_tracking_info[$subforum_id]) ? true : false; if (!$subforum_unread && !empty($subforum_row['children'])) { foreach ($subforum_row['children'] as $child_id) { if (isset($forum_tracking_info[$child_id]) && $subforums[$forum_id][$child_id]['orig_forum_last_post_time'] > $forum_tracking_info[$child_id]) { // Once we found an unread child forum, we can drop out of this loop $subforum_unread = true; break; } } } if ($subforum_row['display'] && $subforum_row['name']) { $subforums_list[] = array( 'link' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $subforum_id), 'name' => $subforum_row['name'], 'unread' => $subforum_unread, ); } else { unset($subforums[$forum_id][$subforum_id]); } // If one subforum is unread the forum gets unread too... if ($subforum_unread) { $forum_unread = true; } } $l_subforums = (sizeof($subforums[$forum_id]) == 1) ? $user->lang['SUBFORUM'] . ': ' : $user->lang['SUBFORUMS'] . ': '; $folder_image = ($forum_unread) ? 'forum_unread_subforum' : 'forum_read_subforum'; } else { switch ($row['forum_type']) { case FORUM_POST: $folder_image = ($forum_unread) ? 'forum_unread' : 'forum_read'; break; case FORUM_LINK: $folder_image = 'forum_link'; break; } } // Which folder should we display? if ($row['forum_status'] == ITEM_LOCKED) { $folder_image = ($forum_unread) ? 'forum_unread_locked' : 'forum_read_locked'; $folder_alt = 'FORUM_LOCKED'; } else { $folder_alt = ($forum_unread) ? 'NEW_POSTS' : 'NO_NEW_POSTS'; } // Create last post link information, if appropriate if ($row['forum_last_post_id']) { $last_post_subject = $row['forum_last_post_subject']; $last_post_time = $user->format_date($row['forum_last_post_time']); $last_post_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $row['forum_id_last_post'] . '&p=' . $row['forum_last_post_id']) . '#p' . $row['forum_last_post_id']; } else { $last_post_subject = $last_post_time = $last_post_url = ''; } // Output moderator listing ... if applicable $l_moderator = $moderators_list = ''; if ($display_moderators && !empty($forum_moderators[$forum_id])) { $l_moderator = (sizeof($forum_moderators[$forum_id]) == 1) ? $user->lang['MODERATOR'] : $user->lang['MODERATORS']; $moderators_list = implode(', ', $forum_moderators[$forum_id]); } $l_post_click_count = ($row['forum_type'] == FORUM_LINK) ? 'CLICKS' : 'POSTS'; $post_click_count = ($row['forum_type'] != FORUM_LINK || $row['forum_flags'] & FORUM_FLAG_LINK_TRACK) ? $row['forum_posts'] : ''; $s_subforums_list = array(); foreach ($subforums_list as $subforum) { $s_subforums_list[] = '' . $subforum['name'] . ''; } $s_subforums_list = (string) implode(', ', $s_subforums_list); $catless = ($row['parent_id'] == $root_data['forum_id']) ? true : false; if ($row['forum_type'] != FORUM_LINK) { $u_viewforum = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']); } else { // If the forum is a link and we count redirects we need to visit it // If the forum is having a password or no read access we do not expose the link, but instead handle it in viewforum if (($row['forum_flags'] & FORUM_FLAG_LINK_TRACK) || $row['forum_password'] || !$auth->acl_get('f_read', $forum_id)) { $u_viewforum = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']); } else { $u_viewforum = $row['forum_link']; } } $template->assign_block_vars('forumrow', array( 'S_IS_CAT' => false, 'S_NO_CAT' => $catless && !$last_catless, 'S_IS_LINK' => ($row['forum_type'] == FORUM_LINK) ? true : false, 'S_UNREAD_FORUM' => $forum_unread, 'S_LOCKED_FORUM' => ($row['forum_status'] == ITEM_LOCKED) ? true : false, 'S_LIST_SUBFORUMS' => ($row['display_subforum_list']) ? true : false, 'S_SUBFORUMS' => (sizeof($subforums_list)) ? true : false, 'FORUM_ID' => $row['forum_id'], 'FORUM_NAME' => $row['forum_name'], 'FORUM_DESC' => generate_text_for_display($row['forum_desc'], $row['forum_desc_uid'], $row['forum_desc_bitfield'], $row['forum_desc_options']), 'TOPICS' => $row['forum_topics'], $l_post_click_count => $post_click_count, 'FORUM_FOLDER_IMG' => $user->img($folder_image, $folder_alt), 'FORUM_FOLDER_IMG_SRC' => $user->img($folder_image, $folder_alt, false, '', 'src'), 'FORUM_FOLDER_IMG_ALT' => isset($user->lang[$folder_alt]) ? $user->lang[$folder_alt] : '', 'FORUM_IMAGE' => ($row['forum_image']) ? '' . $user->lang[$folder_alt] . '' : '', 'FORUM_IMAGE_SRC' => ($row['forum_image']) ? $phpbb_root_path . $row['forum_image'] : '', 'LAST_POST_SUBJECT' => censor_text($last_post_subject), 'LAST_POST_TIME' => $last_post_time, 'LAST_POSTER' => get_username_string('username', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']), 'LAST_POSTER_COLOUR' => get_username_string('colour', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']), 'LAST_POSTER_FULL' => get_username_string('full', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']), 'MODERATORS' => $moderators_list, 'SUBFORUMS' => $s_subforums_list, 'L_SUBFORUM_STR' => $l_subforums, 'L_FORUM_FOLDER_ALT' => $folder_alt, 'L_MODERATOR_STR' => $l_moderator, 'U_VIEWFORUM' => $u_viewforum, 'U_LAST_POSTER' => get_username_string('profile', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']), 'U_LAST_POST' => $last_post_url) ); // Assign subforums loop for style authors foreach ($subforums_list as $subforum) { $template->assign_block_vars('forumrow.subforum', array( 'U_SUBFORUM' => $subforum['link'], 'SUBFORUM_NAME' => $subforum['name'], 'S_UNREAD' => $subforum['unread']) ); } $last_catless = $catless; } $template->assign_vars(array( 'U_MARK_FORUMS' => ($user->data['is_registered'] || $config['load_anon_lastread']) ? append_sid("{$phpbb_root_path}viewforum.$phpEx", 'hash=' . generate_link_hash('global') . '&f=' . $root_data['forum_id'] . '&mark=forums') : '', 'S_HAS_SUBFORUM' => ($visible_forums) ? true : false, 'L_SUBFORUM' => ($visible_forums == 1) ? $user->lang['SUBFORUM'] : $user->lang['SUBFORUMS'], 'LAST_POST_IMG' => $user->img('icon_topic_latest', 'VIEW_LATEST_POST')) ); if ($return_moderators) { return array($active_forum_ary, $forum_moderators); } return array($active_forum_ary, array()); } /** * Create forum rules for given forum */ function generate_forum_rules(&$forum_data) { if (!$forum_data['forum_rules'] && !$forum_data['forum_rules_link']) { return; } global $template, $phpbb_root_path, $phpEx; if ($forum_data['forum_rules']) { $forum_data['forum_rules'] = generate_text_for_display($forum_data['forum_rules'], $forum_data['forum_rules_uid'], $forum_data['forum_rules_bitfield'], $forum_data['forum_rules_options']); } $template->assign_vars(array( 'S_FORUM_RULES' => true, 'U_FORUM_RULES' => $forum_data['forum_rules_link'], 'FORUM_RULES' => $forum_data['forum_rules']) ); } /** * Create forum navigation links for given forum, create parent * list if currently null, assign basic forum info to template */ function generate_forum_nav(&$forum_data) { global $db, $user, $template, $auth; global $phpEx, $phpbb_root_path; if (!$auth->acl_get('f_list', $forum_data['forum_id'])) { return; } // Get forum parents $forum_parents = get_forum_parents($forum_data); // Build navigation links if (!empty($forum_parents)) { foreach ($forum_parents as $parent_forum_id => $parent_data) { list($parent_name, $parent_type) = array_values($parent_data); // Skip this parent if the user does not have the permission to view it if (!$auth->acl_get('f_list', $parent_forum_id)) { continue; } $template->assign_block_vars('navlinks', array( 'S_IS_CAT' => ($parent_type == FORUM_CAT) ? true : false, 'S_IS_LINK' => ($parent_type == FORUM_LINK) ? true : false, 'S_IS_POST' => ($parent_type == FORUM_POST) ? true : false, 'FORUM_NAME' => $parent_name, 'FORUM_ID' => $parent_forum_id, 'U_VIEW_FORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $parent_forum_id)) ); } } $template->assign_block_vars('navlinks', array( 'S_IS_CAT' => ($forum_data['forum_type'] == FORUM_CAT) ? true : false, 'S_IS_LINK' => ($forum_data['forum_type'] == FORUM_LINK) ? true : false, 'S_IS_POST' => ($forum_data['forum_type'] == FORUM_POST) ? true : false, 'FORUM_NAME' => $forum_data['forum_name'], 'FORUM_ID' => $forum_data['forum_id'], 'U_VIEW_FORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_data['forum_id'])) ); $template->assign_vars(array( 'FORUM_ID' => $forum_data['forum_id'], 'FORUM_NAME' => $forum_data['forum_name'], 'FORUM_DESC' => generate_text_for_display($forum_data['forum_desc'], $forum_data['forum_desc_uid'], $forum_data['forum_desc_bitfield'], $forum_data['forum_desc_options'])) ); return; } /** * Returns forum parents as an array. Get them from forum_data if available, or update the database otherwise */ function get_forum_parents(&$forum_data) { global $db; $forum_parents = array(); if ($forum_data['parent_id'] > 0) { if ($forum_data['forum_parents'] == '') { $sql = 'SELECT forum_id, forum_name, forum_type FROM ' . FORUMS_TABLE . ' WHERE left_id < ' . $forum_data['left_id'] . ' AND right_id > ' . $forum_data['right_id'] . ' ORDER BY left_id ASC'; $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { $forum_parents[$row['forum_id']] = array($row['forum_name'], (int) $row['forum_type']); } $db->sql_freeresult($result); $forum_data['forum_parents'] = serialize($forum_parents); $sql = 'UPDATE ' . FORUMS_TABLE . " SET forum_parents = '" . $db->sql_escape($forum_data['forum_parents']) . "' WHERE parent_id = " . $forum_data['parent_id']; $db->sql_query($sql); } else { $forum_parents = unserialize($forum_data['forum_parents']); } } return $forum_parents; } /** * Generate topic pagination */ function topic_generate_pagination($replies, $url) { global $config, $user; // Make sure $per_page is a valid value $per_page = ($config['posts_per_page'] <= 0) ? 1 : $config['posts_per_page']; if (($replies + 1) > $per_page) { $total_pages = ceil(($replies + 1) / $per_page); $pagination = ''; $times = 1; for ($j = 0; $j < $replies + 1; $j += $per_page) { $pagination .= '' . $times . ''; if ($times == 1 && $total_pages > 5) { $pagination .= ' ... '; // Display the last three pages $times = $total_pages - 3; $j += ($total_pages - 4) * $per_page; } else if ($times < $total_pages) { $pagination .= '' . $user->lang['COMMA_SEPARATOR'] . ''; } $times++; } } else { $pagination = ''; } return $pagination; } /** * Obtain list of moderators of each forum */ function get_moderators(&$forum_moderators, $forum_id = false) { global $config, $template, $db, $phpbb_root_path, $phpEx, $user, $auth; // Have we disabled the display of moderators? If so, then return // from whence we came ... if (!$config['load_moderators']) { return; } $forum_sql = ''; if ($forum_id !== false) { if (!is_array($forum_id)) { $forum_id = array($forum_id); } // If we don't have a forum then we can't have a moderator if (!sizeof($forum_id)) { return; } $forum_sql = 'AND m.' . $db->sql_in_set('forum_id', $forum_id); } $sql_array = array( 'SELECT' => 'm.*, u.user_colour, g.group_colour, g.group_type', 'FROM' => array( MODERATOR_CACHE_TABLE => 'm', ), 'LEFT_JOIN' => array( array( 'FROM' => array(USERS_TABLE => 'u'), 'ON' => 'm.user_id = u.user_id', ), array( 'FROM' => array(GROUPS_TABLE => 'g'), 'ON' => 'm.group_id = g.group_id', ), ), 'WHERE' => "m.display_on_index = 1 $forum_sql", ); $sql = $db->sql_build_query('SELECT', $sql_array); $result = $db->sql_query($sql, 3600); while ($row = $db->sql_fetchrow($result)) { if (!empty($row['user_id'])) { $forum_moderators[$row['forum_id']][] = get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']); } else { $group_name = (($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']); if ($user->data['user_id'] != ANONYMOUS && !$auth->acl_get('u_viewprofile')) { $forum_moderators[$row['forum_id']][] = '' . $group_name . ''; } else { $forum_moderators[$row['forum_id']][] = '' . $group_name . ''; } } } $db->sql_freeresult($result); return; } /** * User authorisation levels output * * @param string $mode Can be forum or topic. Not in use at the moment. * @param int $forum_id The current forum the user is in. * @param int $forum_status The forums status bit. */ function gen_forum_auth_level($mode, $forum_id, $forum_status) { global $template, $auth, $user, $config; $locked = ($forum_status == ITEM_LOCKED && !$auth->acl_get('m_edit', $forum_id)) ? true : false; $rules = array( ($auth->acl_get('f_post', $forum_id) && !$locked) ? $user->lang['RULES_POST_CAN'] : $user->lang['RULES_POST_CANNOT'], ($auth->acl_get('f_reply', $forum_id) && !$locked) ? $user->lang['RULES_REPLY_CAN'] : $user->lang['RULES_REPLY_CANNOT'], ($user->data['is_registered'] && $auth->acl_gets('f_edit', 'm_edit', $forum_id) && !$locked) ? $user->lang['RULES_EDIT_CAN'] : $user->lang['RULES_EDIT_CANNOT'], ($user->data['is_registered'] && $auth->acl_gets('f_delete', 'm_delete', $forum_id) && !$locked) ? $user->lang['RULES_DELETE_CAN'] : $user->lang['RULES_DELETE_CANNOT'], ); if ($config['allow_attachments']) { $rules[] = ($auth->acl_get('f_attach', $forum_id) && $auth->acl_get('u_attach') && !$locked) ? $user->lang['RULES_ATTACH_CAN'] : $user->lang['RULES_ATTACH_CANNOT']; } foreach ($rules as $rule) { $template->assign_block_vars('rules', array('RULE' => $rule)); } return; } /** * Generate topic status */ function topic_status(&$topic_row, $replies, $unread_topic, &$folder_img, &$folder_alt, &$topic_type) { global $user, $config; $folder = $folder_new = ''; if ($topic_row['topic_status'] == ITEM_MOVED) { $topic_type = $user->lang['VIEW_TOPIC_MOVED']; $folder_img = 'topic_moved'; $folder_alt = 'TOPIC_MOVED'; } else { switch ($topic_row['topic_type']) { case POST_GLOBAL: $topic_type = $user->lang['VIEW_TOPIC_GLOBAL']; $folder = 'global_read'; $folder_new = 'global_unread'; break; case POST_ANNOUNCE: $topic_type = $user->lang['VIEW_TOPIC_ANNOUNCEMENT']; $folder = 'announce_read'; $folder_new = 'announce_unread'; break; case POST_STICKY: $topic_type = $user->lang['VIEW_TOPIC_STICKY']; $folder = 'sticky_read'; $folder_new = 'sticky_unread'; break; default: $topic_type = ''; $folder = 'topic_read'; $folder_new = 'topic_unread'; // Hot topic threshold is for posts in a topic, which is replies + the first post. ;) if ($config['hot_threshold'] && ($replies + 1) >= $config['hot_threshold'] && $topic_row['topic_status'] != ITEM_LOCKED) { $folder .= '_hot'; $folder_new .= '_hot'; } break; } if ($topic_row['topic_status'] == ITEM_LOCKED) { $topic_type = $user->lang['VIEW_TOPIC_LOCKED']; $folder .= '_locked'; $folder_new .= '_locked'; } $folder_img = ($unread_topic) ? $folder_new : $folder; $folder_alt = ($unread_topic) ? 'NEW_POSTS' : (($topic_row['topic_status'] == ITEM_LOCKED) ? 'TOPIC_LOCKED' : 'NO_NEW_POSTS'); // Posted image? if (!empty($topic_row['topic_posted']) && $topic_row['topic_posted']) { $folder_img .= '_mine'; } } if ($topic_row['poll_start'] && $topic_row['topic_status'] != ITEM_MOVED) { $topic_type = $user->lang['VIEW_TOPIC_POLL']; } } /** * Assign/Build custom bbcodes for display in screens supporting using of bbcodes * The custom bbcodes buttons will be placed within the template block 'custom_codes' */ function display_custom_bbcodes() { global $db, $template, $user; // Start counting from 22 for the bbcode ids (every bbcode takes two ids - opening/closing) $num_predefined_bbcodes = 22; $sql = 'SELECT bbcode_id, bbcode_tag, bbcode_helpline FROM ' . BBCODES_TABLE . ' WHERE display_on_posting = 1 ORDER BY bbcode_tag'; $result = $db->sql_query($sql); $i = 0; while ($row = $db->sql_fetchrow($result)) { // If the helpline is defined within the language file, we will use the localised version, else just use the database entry... if (isset($user->lang[strtoupper($row['bbcode_helpline'])])) { $row['bbcode_helpline'] = $user->lang[strtoupper($row['bbcode_helpline'])]; } $template->assign_block_vars('custom_tags', array( 'BBCODE_NAME' => "'[{$row['bbcode_tag']}]', '[/" . str_replace('=', '', $row['bbcode_tag']) . "]'", 'BBCODE_ID' => $num_predefined_bbcodes + ($i * 2), 'BBCODE_TAG' => $row['bbcode_tag'], 'BBCODE_HELPLINE' => $row['bbcode_helpline'], 'A_BBCODE_HELPLINE' => str_replace(array('&', '"', "'", '<', '>'), array('&', '"', "\'", '<', '>'), $row['bbcode_helpline']), )); $i++; } $db->sql_freeresult($result); } /** * Display reasons */ function display_reasons($reason_id = 0) { global $db, $user, $template; $sql = 'SELECT * FROM ' . REPORTS_REASONS_TABLE . ' ORDER BY reason_order ASC'; $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { // If the reason is defined within the language file, we will use the localized version, else just use the database entry... if (isset($user->lang['report_reasons']['TITLE'][strtoupper($row['reason_title'])]) && isset($user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])])) { $row['reason_description'] = $user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])]; $row['reason_title'] = $user->lang['report_reasons']['TITLE'][strtoupper($row['reason_title'])]; } $template->assign_block_vars('reason', array( 'ID' => $row['reason_id'], 'TITLE' => $row['reason_title'], 'DESCRIPTION' => $row['reason_description'], 'S_SELECTED' => ($row['reason_id'] == $reason_id) ? true : false) ); } $db->sql_freeresult($result); } /** * Display user activity (action forum/topic) */ function display_user_activity(&$userdata) { global $auth, $template, $db, $user; global $phpbb_root_path, $phpEx; // Do not display user activity for users having more than 5000 posts... if ($userdata['user_posts'] > 5000) { return; } $forum_ary = array(); // Do not include those forums the user is not having read access to... $forum_read_ary = $auth->acl_getf('!f_read'); foreach ($forum_read_ary as $forum_id => $not_allowed) { if ($not_allowed['f_read']) { $forum_ary[] = (int) $forum_id; } } $forum_ary = array_unique($forum_ary); $forum_sql = (sizeof($forum_ary)) ? 'AND ' . $db->sql_in_set('forum_id', $forum_ary, true) : ''; // Obtain active forum $sql = 'SELECT forum_id, COUNT(post_id) AS num_posts FROM ' . POSTS_TABLE . ' WHERE poster_id = ' . $userdata['user_id'] . " AND post_postcount = 1 $forum_sql GROUP BY forum_id ORDER BY num_posts DESC"; $result = $db->sql_query_limit($sql, 1); $active_f_row = $db->sql_fetchrow($result); $db->sql_freeresult($result); if (!empty($active_f_row)) { $sql = 'SELECT forum_name FROM ' . FORUMS_TABLE . ' WHERE forum_id = ' . $active_f_row['forum_id']; $result = $db->sql_query($sql, 3600); $active_f_row['forum_name'] = (string) $db->sql_fetchfield('forum_name'); $db->sql_freeresult($result); } // Obtain active topic $sql = 'SELECT topic_id, COUNT(post_id) AS num_posts FROM ' . POSTS_TABLE . ' WHERE poster_id = ' . $userdata['user_id'] . " AND post_postcount = 1 $forum_sql GROUP BY topic_id ORDER BY num_posts DESC"; $result = $db->sql_query_limit($sql, 1); $active_t_row = $db->sql_fetchrow($result); $db->sql_freeresult($result); if (!empty($active_t_row)) { $sql = 'SELECT topic_title FROM ' . TOPICS_TABLE . ' WHERE topic_id = ' . $active_t_row['topic_id']; $result = $db->sql_query($sql); $active_t_row['topic_title'] = (string) $db->sql_fetchfield('topic_title'); $db->sql_freeresult($result); } $userdata['active_t_row'] = $active_t_row; $userdata['active_f_row'] = $active_f_row; $active_f_name = $active_f_id = $active_f_count = $active_f_pct = ''; if (!empty($active_f_row['num_posts'])) { $active_f_name = $active_f_row['forum_name']; $active_f_id = $active_f_row['forum_id']; $active_f_count = $active_f_row['num_posts']; $active_f_pct = ($userdata['user_posts']) ? ($active_f_count / $userdata['user_posts']) * 100 : 0; } $active_t_name = $active_t_id = $active_t_count = $active_t_pct = ''; if (!empty($active_t_row['num_posts'])) { $active_t_name = $active_t_row['topic_title']; $active_t_id = $active_t_row['topic_id']; $active_t_count = $active_t_row['num_posts']; $active_t_pct = ($userdata['user_posts']) ? ($active_t_count / $userdata['user_posts']) * 100 : 0; } $l_active_pct = ($userdata['user_id'] != ANONYMOUS && $userdata['user_id'] == $user->data['user_id']) ? $user->lang['POST_PCT_ACTIVE_OWN'] : $user->lang['POST_PCT_ACTIVE']; $template->assign_vars(array( 'ACTIVE_FORUM' => $active_f_name, 'ACTIVE_FORUM_POSTS' => ($active_f_count == 1) ? sprintf($user->lang['USER_POST'], 1) : sprintf($user->lang['USER_POSTS'], $active_f_count), 'ACTIVE_FORUM_PCT' => sprintf($l_active_pct, $active_f_pct), 'ACTIVE_TOPIC' => censor_text($active_t_name), 'ACTIVE_TOPIC_POSTS' => ($active_t_count == 1) ? sprintf($user->lang['USER_POST'], 1) : sprintf($user->lang['USER_POSTS'], $active_t_count), 'ACTIVE_TOPIC_PCT' => sprintf($l_active_pct, $active_t_pct), 'U_ACTIVE_FORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $active_f_id), 'U_ACTIVE_TOPIC' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 't=' . $active_t_id), 'S_SHOW_ACTIVITY' => true) ); } /** * Topic and forum watching common code */ function watch_topic_forum($mode, &$s_watching, $user_id, $forum_id, $topic_id, $notify_status = 'unset', $start = 0) { global $template, $db, $user, $phpEx, $start, $phpbb_root_path; $table_sql = ($mode == 'forum') ? FORUMS_WATCH_TABLE : TOPICS_WATCH_TABLE; $where_sql = ($mode == 'forum') ? 'forum_id' : 'topic_id'; $match_id = ($mode == 'forum') ? $forum_id : $topic_id; $u_url = "uid={$user->data['user_id']}"; $u_url .= ($mode == 'forum') ? '&f' : '&f=' . $forum_id . '&t'; // Is user watching this thread? if ($user_id != ANONYMOUS) { $can_watch = true; if ($notify_status == 'unset') { $sql = "SELECT notify_status FROM $table_sql WHERE $where_sql = $match_id AND user_id = $user_id"; $result = $db->sql_query($sql); $notify_status = ($row = $db->sql_fetchrow($result)) ? $row['notify_status'] : NULL; $db->sql_freeresult($result); } if (!is_null($notify_status) && $notify_status !== '') { if (isset($_GET['unwatch'])) { $uid = request_var('uid', 0); if ($uid != $user_id) { $redirect_url = append_sid("{$phpbb_root_path}view$mode.$phpEx", "$u_url=$match_id&start=$start"); $message = $user->lang['ERR_UNWATCHING'] . '

' . sprintf($user->lang['RETURN_' . strtoupper($mode)], '', ''); trigger_error($message); } if ($_GET['unwatch'] == $mode) { $is_watching = 0; $sql = 'DELETE FROM ' . $table_sql . " WHERE $where_sql = $match_id AND user_id = $user_id"; $db->sql_query($sql); } $redirect_url = append_sid("{$phpbb_root_path}view$mode.$phpEx", "$u_url=$match_id&start=$start"); meta_refresh(3, $redirect_url); $message = $user->lang['NOT_WATCHING_' . strtoupper($mode)] . '

' . sprintf($user->lang['RETURN_' . strtoupper($mode)], '', ''); trigger_error($message); } else { $is_watching = true; if ($notify_status) { $sql = 'UPDATE ' . $table_sql . " SET notify_status = 0 WHERE $where_sql = $match_id AND user_id = $user_id"; $db->sql_query($sql); } } } else { if (isset($_GET['watch'])) { $token = request_var('hash', ''); $redirect_url = append_sid("{$phpbb_root_path}view$mode.$phpEx", "$u_url=$match_id&start=$start"); if ($_GET['watch'] == $mode && check_link_hash($token, "{$mode}_$match_id")) { $is_watching = true; $sql = 'INSERT INTO ' . $table_sql . " (user_id, $where_sql, notify_status) VALUES ($user_id, $match_id, 0)"; $db->sql_query($sql); $message = $user->lang['ARE_WATCHING_' . strtoupper($mode)] . '

' . sprintf($user->lang['RETURN_' . strtoupper($mode)], '', ''); } else { $message = $user->lang['ERR_WATCHING'] . '

' . sprintf($user->lang['RETURN_' . strtoupper($mode)], '', ''); } meta_refresh(3, $redirect_url); trigger_error($message); } else { $is_watching = 0; } } } else { if (isset($_GET['unwatch']) && $_GET['unwatch'] == $mode) { login_box(); } else { $can_watch = 0; $is_watching = 0; } } if ($can_watch) { $s_watching['link'] = append_sid("{$phpbb_root_path}view$mode.$phpEx", "$u_url=$match_id&" . (($is_watching) ? 'unwatch' : 'watch') . "=$mode&start=$start&hash=" . generate_link_hash("{$mode}_$match_id")); $s_watching['title'] = $user->lang[(($is_watching) ? 'STOP' : 'START') . '_WATCHING_' . strtoupper($mode)]; $s_watching['is_watching'] = $is_watching; } return; } /** * Get user rank title and image * * @param int $user_rank the current stored users rank id * @param int $user_posts the users number of posts * @param string &$rank_title the rank title will be stored here after execution * @param string &$rank_img the rank image as full img tag is stored here after execution * @param string &$rank_img_src the rank image source is stored here after execution * * Note: since we do not want to break backwards-compatibility, this function will only properly assign ranks to guests if you call it for them with user_posts == false */ function get_user_rank($user_rank, $user_posts, &$rank_title, &$rank_img, &$rank_img_src) { global $ranks, $config, $phpbb_root_path; if (empty($ranks)) { global $cache; $ranks = $cache->obtain_ranks(); } if (!empty($user_rank)) { $rank_title = (isset($ranks['special'][$user_rank]['rank_title'])) ? $ranks['special'][$user_rank]['rank_title'] : ''; $rank_img = (!empty($ranks['special'][$user_rank]['rank_image'])) ? '' . $ranks['special'][$user_rank]['rank_title'] . '' : ''; $rank_img_src = (!empty($ranks['special'][$user_rank]['rank_image'])) ? $phpbb_root_path . $config['ranks_path'] . '/' . $ranks['special'][$user_rank]['rank_image'] : ''; } else if ($user_posts !== false) { if (!empty($ranks['normal'])) { foreach ($ranks['normal'] as $rank) { if ($user_posts >= $rank['rank_min']) { $rank_title = $rank['rank_title']; $rank_img = (!empty($rank['rank_image'])) ? '' . $rank['rank_title'] . '' : ''; $rank_img_src = (!empty($rank['rank_image'])) ? $phpbb_root_path . $config['ranks_path'] . '/' . $rank['rank_image'] : ''; break; } } } } } /** * Get user avatar * * @param string $avatar Users assigned avatar name * @param int $avatar_type Type of avatar * @param string $avatar_width Width of users avatar * @param string $avatar_height Height of users avatar * @param string $alt Optional language string for alt tag within image, can be a language key or text * * @return string Avatar image */ function get_user_avatar($avatar, $avatar_type, $avatar_width, $avatar_height, $alt = 'USER_AVATAR') { global $user, $config, $phpbb_root_path, $phpEx; if (empty($avatar) || !$avatar_type) { return ''; } $avatar_img = ''; switch ($avatar_type) { case AVATAR_UPLOAD: $avatar_img = $phpbb_root_path . "download/file.$phpEx?avatar="; break; case AVATAR_GALLERY: $avatar_img = $phpbb_root_path . $config['avatar_gallery_path'] . '/'; break; } $avatar_img .= $avatar; return '' . ((!empty($user->lang[$alt])) ? $user->lang[$alt] : $alt) . ''; } ?>include_path = ($include_path !== false) ? $include_path : $phpbb_root_path . 'includes/'; // Make sure the path ends with / if (substr($this->include_path, -1) !== '/') { $this->include_path .= '/'; } } /** * Set custom include path for modules * Schema for inclusion is include_path . modulebase * * @param string $include_path include path to be used. * @access public */ function set_custom_include_path($include_path) { $this->include_path = $include_path; // Make sure the path ends with / if (substr($this->include_path, -1) !== '/') { $this->include_path .= '/'; } } /** * List modules * * This creates a list, stored in $this->module_ary of all available * modules for the given class (ucp, mcp and acp). Additionally * $this->module_y_ary is created with indentation information for * displaying the module list appropriately. Only modules for which * the user has access rights are included in these lists. */ function list_modules($p_class) { global $auth, $db, $user, $cache; global $config, $phpbb_root_path, $phpEx; // Sanitise for future path use, it's escaped as appropriate for queries $this->p_class = str_replace(array('.', '/', '\\'), '', basename($p_class)); // Get cached modules if (($this->module_cache = $cache->get('_modules_' . $this->p_class)) === false) { // Get modules $sql = 'SELECT * FROM ' . MODULES_TABLE . " WHERE module_class = '" . $db->sql_escape($this->p_class) . "' ORDER BY left_id ASC"; $result = $db->sql_query($sql); $rows = array(); while ($row = $db->sql_fetchrow($result)) { $rows[$row['module_id']] = $row; } $db->sql_freeresult($result); $this->module_cache = array(); foreach ($rows as $module_id => $row) { $this->module_cache['modules'][] = $row; $this->module_cache['parents'][$row['module_id']] = $this->get_parents($row['parent_id'], $row['left_id'], $row['right_id'], $rows); } unset($rows); $cache->put('_modules_' . $this->p_class, $this->module_cache); } if (empty($this->module_cache)) { $this->module_cache = array('modules' => array(), 'parents' => array()); } // We "could" build a true tree with this function - maybe mod authors want to use this... // Functions for traversing and manipulating the tree are not available though // We might re-structure the module system to use true trees in 3.2.x... // $tree = $this->build_tree($this->module_cache['modules'], $this->module_cache['parents']); // Clean up module cache array to only let survive modules the user can access $right_id = false; foreach ($this->module_cache['modules'] as $key => $row) { // Not allowed to view module? if (!$this->module_auth($row['module_auth'])) { unset($this->module_cache['modules'][$key]); continue; } // Category with no members, ignore if (!$row['module_basename'] && ($row['left_id'] + 1 == $row['right_id'])) { unset($this->module_cache['modules'][$key]); continue; } // Skip branch if ($right_id !== false) { if ($row['left_id'] < $right_id) { unset($this->module_cache['modules'][$key]); continue; } $right_id = false; } // Not enabled? if (!$row['module_enabled']) { // If category is disabled then disable every child too unset($this->module_cache['modules'][$key]); $right_id = $row['right_id']; continue; } } // Re-index (this is needed, else we are not able to array_slice later) $this->module_cache['modules'] = array_merge($this->module_cache['modules']); // Include MOD _info files for populating language entries within the menus $this->add_mod_info($this->p_class); // Now build the module array, but exclude completely empty categories... $right_id = false; $names = array(); foreach ($this->module_cache['modules'] as $key => $row) { // Skip branch if ($right_id !== false) { if ($row['left_id'] < $right_id) { continue; } $right_id = false; } // Category with no members on their way down (we have to check every level) if (!$row['module_basename']) { $empty_category = true; // We go through the branch and look for an activated module foreach (array_slice($this->module_cache['modules'], $key + 1) as $temp_row) { if ($temp_row['left_id'] > $row['left_id'] && $temp_row['left_id'] < $row['right_id']) { // Module there if ($temp_row['module_basename'] && $temp_row['module_enabled']) { $empty_category = false; break; } continue; } break; } // Skip the branch if ($empty_category) { $right_id = $row['right_id']; continue; } } $depth = sizeof($this->module_cache['parents'][$row['module_id']]); // We need to prefix the functions to not create a naming conflict // Function for building 'url_extra' $url_func = '_module_' . $row['module_basename'] . '_url'; // Function for building the language name $lang_func = '_module_' . $row['module_basename'] . '_lang'; // Custom function for calling parameters on module init (for example assigning template variables) $custom_func = '_module_' . $row['module_basename']; $names[$row['module_basename'] . '_' . $row['module_mode']][] = true; $module_row = array( 'depth' => $depth, 'id' => (int) $row['module_id'], 'parent' => (int) $row['parent_id'], 'cat' => ($row['right_id'] > $row['left_id'] + 1) ? true : false, 'is_duplicate' => ($row['module_basename'] && sizeof($names[$row['module_basename'] . '_' . $row['module_mode']]) > 1) ? true : false, 'name' => (string) $row['module_basename'], 'mode' => (string) $row['module_mode'], 'display' => (int) $row['module_display'], 'url_extra' => (function_exists($url_func)) ? $url_func($row['module_mode'], $row) : '', 'lang' => ($row['module_basename'] && function_exists($lang_func)) ? $lang_func($row['module_mode'], $row['module_langname']) : ((!empty($user->lang[$row['module_langname']])) ? $user->lang[$row['module_langname']] : $row['module_langname']), 'langname' => $row['module_langname'], 'left' => $row['left_id'], 'right' => $row['right_id'], ); if (function_exists($custom_func)) { $custom_func($row['module_mode'], $module_row); } $this->module_ary[] = $module_row; } unset($this->module_cache['modules'], $names); } /** * Check if a certain main module is accessible/loaded * By giving the module mode you are able to additionally check for only one mode within the main module * * @param string $module_basename The module base name, for example logs, reports, main (for the mcp). * @param mixed $module_mode The module mode to check. If provided the mode will be checked in addition for presence. * * @return bool Returns true if module is loaded and accessible, else returns false */ function loaded($module_basename, $module_mode = false) { if (empty($this->loaded_cache)) { $this->loaded_cache = array(); foreach ($this->module_ary as $row) { if (!$row['name']) { continue; } if (!isset($this->loaded_cache[$row['name']])) { $this->loaded_cache[$row['name']] = array(); } if (!$row['mode']) { continue; } $this->loaded_cache[$row['name']][$row['mode']] = true; } } if ($module_mode === false) { return (isset($this->loaded_cache[$module_basename])) ? true : false; } return (!empty($this->loaded_cache[$module_basename][$module_mode])) ? true : false; } /** * Check module authorisation */ function module_auth($module_auth, $forum_id = false) { global $auth, $config; $module_auth = trim($module_auth); // Generally allowed to access module if module_auth is empty if (!$module_auth) { return true; } // With the code below we make sure only those elements get eval'd we really want to be checked preg_match_all('/(?: "[^"\\\\]*(?:\\\\.[^"\\\\]*)*" | \'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\' | [(),] | [^\s(),]+)/x', $module_auth, $match); $tokens = $match[0]; for ($i = 0, $size = sizeof($tokens); $i < $size; $i++) { $token = &$tokens[$i]; switch ($token) { case ')': case '(': case '&&': case '||': case ',': break; default: if (!preg_match('#(?:acl_([a-z0-9_]+)(,\$id)?)|(?:\$id)|(?:aclf_([a-z0-9_]+))|(?:cfg_([a-z0-9_]+))|(?:request_([a-zA-Z0-9_]+))#', $token)) { $token = ''; } break; } } $module_auth = implode(' ', $tokens); // Make sure $id seperation is working fine $module_auth = str_replace(' , ', ',', $module_auth); $forum_id = ($forum_id === false) ? $this->acl_forum_id : $forum_id; $is_auth = false; eval('$is_auth = (int) (' . preg_replace(array('#acl_([a-z0-9_]+)(,\$id)?#', '#\$id#', '#aclf_([a-z0-9_]+)#', '#cfg_([a-z0-9_]+)#', '#request_([a-zA-Z0-9_]+)#'), array('(int) $auth->acl_get(\'\\1\'\\2)', '(int) $forum_id', '(int) $auth->acl_getf_global(\'\\1\')', '(int) $config[\'\\1\']', '!empty($_REQUEST[\'\\1\'])'), $module_auth) . ');'); return $is_auth; } /** * Set active module */ function set_active($id = false, $mode = false) { $icat = false; $this->active_module = false; if (request_var('icat', '')) { $icat = $id; $id = request_var('icat', ''); } $category = false; foreach ($this->module_ary as $row_id => $item_ary) { // If this is a module and it's selected, active // If this is a category and the module is the first within it, active // If this is a module and no mode selected, select first mode // If no category or module selected, go active for first module in first category if ( (($item_ary['name'] === $id || $item_ary['id'] === (int) $id) && (($item_ary['mode'] == $mode && !$item_ary['cat']) || ($icat && $item_ary['cat']))) || ($item_ary['parent'] === $category && !$item_ary['cat'] && !$icat && $item_ary['display']) || (($item_ary['name'] === $id || $item_ary['id'] === (int) $id) && !$mode && !$item_ary['cat']) || (!$id && !$mode && !$item_ary['cat'] && $item_ary['display']) ) { if ($item_ary['cat']) { $id = $icat; $icat = false; continue; } $this->p_id = $item_ary['id']; $this->p_parent = $item_ary['parent']; $this->p_name = $item_ary['name']; $this->p_mode = $item_ary['mode']; $this->p_left = $item_ary['left']; $this->p_right = $item_ary['right']; $this->module_cache['parents'] = $this->module_cache['parents'][$this->p_id]; $this->active_module = $item_ary['id']; $this->active_module_row_id = $row_id; break; } else if (($item_ary['cat'] && $item_ary['id'] === (int) $id) || ($item_ary['parent'] === $category && $item_ary['cat'])) { $category = $item_ary['id']; } } } /** * Loads currently active module * * This method loads a given module, passing it the relevant id and mode. */ function load_active($mode = false, $module_url = false, $execute_module = true) { global $phpbb_root_path, $phpbb_admin_path, $phpEx, $user; $module_path = $this->include_path . $this->p_class; $icat = request_var('icat', ''); if ($this->active_module === false) { trigger_error('Module not accessible', E_USER_ERROR); } if (!class_exists("{$this->p_class}_$this->p_name")) { if (!file_exists("$module_path/{$this->p_class}_$this->p_name.$phpEx")) { trigger_error("Cannot find module $module_path/{$this->p_class}_$this->p_name.$phpEx", E_USER_ERROR); } include("$module_path/{$this->p_class}_$this->p_name.$phpEx"); if (!class_exists("{$this->p_class}_$this->p_name")) { trigger_error("Module file $module_path/{$this->p_class}_$this->p_name.$phpEx does not contain correct class [{$this->p_class}_$this->p_name]", E_USER_ERROR); } if (!empty($mode)) { $this->p_mode = $mode; } // Create a new instance of the desired module ... if it has a // constructor it will of course be executed $instance = "{$this->p_class}_$this->p_name"; $this->module = new $instance($this); // We pre-define the action parameter we are using all over the place if (defined('IN_ADMIN')) { // Is first module automatically enabled a duplicate and the category not passed yet? if (!$icat && $this->module_ary[$this->active_module_row_id]['is_duplicate']) { $icat = $this->module_ary[$this->active_module_row_id]['parent']; } // Not being able to overwrite ;) $this->module->u_action = append_sid("{$phpbb_admin_path}index.$phpEx", "i={$this->p_name}") . (($icat) ? '&icat=' . $icat : '') . "&mode={$this->p_mode}"; } else { // If user specified the module url we will use it... if ($module_url !== false) { $this->module->u_action = $module_url; } else { $this->module->u_action = $phpbb_root_path . (($user->page['page_dir']) ? $user->page['page_dir'] . '/' : '') . $user->page['page_name']; } $this->module->u_action = append_sid($this->module->u_action, "i={$this->p_name}") . (($icat) ? '&icat=' . $icat : '') . "&mode={$this->p_mode}"; } // Add url_extra parameter to u_action url if (!empty($this->module_ary) && $this->active_module !== false && $this->module_ary[$this->active_module_row_id]['url_extra']) { $this->module->u_action .= $this->module_ary[$this->active_module_row_id]['url_extra']; } // Assign the module path for re-usage $this->module->module_path = $module_path . '/'; // Execute the main method for the new instance, we send the module id and mode as parameters // Users are able to call the main method after this function to be able to assign additional parameters manually if ($execute_module) { $this->module->main($this->p_name, $this->p_mode); } return; } } /** * Appending url parameter to the currently active module. * * This function is called for adding specific url parameters while executing the current module. * It is doing the same as the _module_{name}_url() function, apart from being able to be called after * having dynamically parsed specific parameters. This allows more freedom in choosing additional parameters. * One example can be seen in /includes/mcp/mcp_notes.php - $this->p_master->adjust_url() call. * * @param string $url_extra Extra url parameters, e.g.: &u=$user_id * */ function adjust_url($url_extra) { if (empty($this->module_ary[$this->active_module_row_id])) { return; } $row = &$this->module_ary[$this->active_module_row_id]; // We check for the same url_extra in $row['url_extra'] to overcome doubled additions... if (strpos($row['url_extra'], $url_extra) === false) { $row['url_extra'] .= $url_extra; } } /** * Check if a module is active */ function is_active($id, $mode = false) { // If we find a name by this id and being enabled we have our active one... foreach ($this->module_ary as $row_id => $item_ary) { if (($item_ary['name'] === $id || $item_ary['id'] === (int) $id) && $item_ary['display']) { if ($mode === false || $mode === $item_ary['mode']) { return true; } } } return false; } /** * Get parents */ function get_parents($parent_id, $left_id, $right_id, &$all_parents) { global $db; $parents = array(); if ($parent_id > 0) { foreach ($all_parents as $module_id => $row) { if ($row['left_id'] < $left_id && $row['right_id'] > $right_id) { $parents[$module_id] = $row['parent_id']; } if ($row['left_id'] > $left_id) { break; } } } return $parents; } /** * Get tree branch */ function get_branch($left_id, $right_id, $remaining) { $branch = array(); foreach ($remaining as $key => $row) { if ($row['left_id'] > $left_id && $row['left_id'] < $right_id) { $branch[] = $row; continue; } break; } return $branch; } /** * Build true binary tree from given array * Not in use */ function build_tree(&$modules, &$parents) { $tree = array(); foreach ($modules as $row) { $branch = &$tree; if ($row['parent_id']) { // Go through the tree to find our branch $parent_tree = $parents[$row['module_id']]; foreach ($parent_tree as $id => $value) { if (!isset($branch[$id]) && isset($branch['child'])) { $branch = &$branch['child']; } $branch = &$branch[$id]; } $branch = &$branch['child']; } $branch[$row['module_id']] = $row; if (!isset($branch[$row['module_id']]['child'])) { $branch[$row['module_id']]['child'] = array(); } } return $tree; } /** * Build navigation structure */ function assign_tpl_vars($module_url) { global $template; $current_id = $right_id = false; // Make sure the module_url has a question mark set, effectively determining the delimiter to use $delim = (strpos($module_url, '?') === false) ? '?' : '&'; $current_padding = $current_depth = 0; $linear_offset = 'l_block1'; $tabular_offset = 't_block2'; // Generate the list of modules, we'll do this in two ways ... // 1) In a linear fashion // 2) In a combined tabbed + linear fashion ... tabs for the categories // and a linear list for subcategories/items foreach ($this->module_ary as $row_id => $item_ary) { // Skip hidden modules if (!$item_ary['display']) { continue; } // Skip branch if ($right_id !== false) { if ($item_ary['left'] < $right_id) { continue; } $right_id = false; } // Category with no members on their way down (we have to check every level) if (!$item_ary['name']) { $empty_category = true; // We go through the branch and look for an activated module foreach (array_slice($this->module_ary, $row_id + 1) as $temp_row) { if ($temp_row['left'] > $item_ary['left'] && $temp_row['left'] < $item_ary['right']) { // Module there and displayed? if ($temp_row['name'] && $temp_row['display']) { $empty_category = false; break; } continue; } break; } // Skip the branch if ($empty_category) { $right_id = $item_ary['right']; continue; } } // Select first id we can get if (!$current_id && (isset($this->module_cache['parents'][$item_ary['id']]) || $item_ary['id'] == $this->p_id)) { $current_id = $item_ary['id']; } $depth = $item_ary['depth']; if ($depth > $current_depth) { $linear_offset = $linear_offset . '.l_block' . ($depth + 1); $tabular_offset = ($depth + 1 > 2) ? $tabular_offset . '.t_block' . ($depth + 1) : $tabular_offset; } else if ($depth < $current_depth) { for ($i = $current_depth - $depth; $i > 0; $i--) { $linear_offset = substr($linear_offset, 0, strrpos($linear_offset, '.')); $tabular_offset = ($i + $depth > 1) ? substr($tabular_offset, 0, strrpos($tabular_offset, '.')) : $tabular_offset; } } $u_title = $module_url . $delim . 'i=' . (($item_ary['cat']) ? $item_ary['id'] : $item_ary['name'] . (($item_ary['is_duplicate']) ? '&icat=' . $current_id : '') . '&mode=' . $item_ary['mode']); // Was not allowed in categories before - /*!$item_ary['cat'] && */ $u_title .= (isset($item_ary['url_extra'])) ? $item_ary['url_extra'] : ''; // Only output a categories items if it's currently selected if (!$depth || ($depth && (in_array($item_ary['parent'], array_values($this->module_cache['parents'])) || $item_ary['parent'] == $this->p_parent))) { $use_tabular_offset = (!$depth) ? 't_block1' : $tabular_offset; $tpl_ary = array( 'L_TITLE' => $item_ary['lang'], 'S_SELECTED' => (isset($this->module_cache['parents'][$item_ary['id']]) || $item_ary['id'] == $this->p_id) ? true : false, 'U_TITLE' => $u_title ); $template->assign_block_vars($use_tabular_offset, array_merge($tpl_ary, array_change_key_case($item_ary, CASE_UPPER))); } $tpl_ary = array( 'L_TITLE' => $item_ary['lang'], 'S_SELECTED' => (isset($this->module_cache['parents'][$item_ary['id']]) || $item_ary['id'] == $this->p_id) ? true : false, 'U_TITLE' => $u_title ); $template->assign_block_vars($linear_offset, array_merge($tpl_ary, array_change_key_case($item_ary, CASE_UPPER))); $current_depth = $depth; } } /** * Returns desired template name */ function get_tpl_name() { return $this->module->tpl_name . '.html'; } /** * Returns the desired page title */ function get_page_title() { global $user; if (!isset($this->module->page_title)) { return ''; } return (isset($user->lang[$this->module->page_title])) ? $user->lang[$this->module->page_title] : $this->module->page_title; } /** * Load module as the current active one without the need for registering it */ function load($class, $name, $mode = false) { $this->p_class = $class; $this->p_name = $name; // Set active module to true instead of using the id $this->active_module = true; $this->load_active($mode); } /** * Display module */ function display($page_title, $display_online_list = true) { global $template, $user; // Generate the page if (defined('IN_ADMIN') && isset($user->data['session_admin']) && $user->data['session_admin']) { adm_page_header($page_title); } else { page_header($page_title, $display_online_list); } $template->set_filenames(array( 'body' => $this->get_tpl_name()) ); if (defined('IN_ADMIN') && isset($user->data['session_admin']) && $user->data['session_admin']) { adm_page_footer(); } else { page_footer(); } } /** * Toggle whether this module will be displayed or not */ function set_display($id, $mode = false, $display = true) { foreach ($this->module_ary as $row_id => $item_ary) { if (($item_ary['name'] === $id || $item_ary['id'] === (int) $id) && (!$mode || $item_ary['mode'] === $mode)) { $this->module_ary[$row_id]['display'] = (int) $display; } } } /** * Add custom MOD info language file */ function add_mod_info($module_class) { global $user, $phpEx; if (file_exists($user->lang_path . $user->lang_name . '/mods')) { $add_files = array(); $dir = @opendir($user->lang_path . $user->lang_name . '/mods'); if ($dir) { while (($entry = readdir($dir)) !== false) { if (strpos($entry, 'info_' . strtolower($module_class) . '_') === 0 && substr(strrchr($entry, '.'), 1) == $phpEx) { $add_files[] = 'mods/' . substr(basename($entry), 0, -(strlen($phpEx) + 1)); } } closedir($dir); } if (sizeof($add_files)) { $user->add_lang($add_files); } } } } ?> 'int', FIELD_STRING => 'string', FIELD_TEXT => 'text', FIELD_BOOL => 'bool', FIELD_DROPDOWN => 'dropdown', FIELD_DATE => 'date'); var $profile_cache = array(); var $options_lang = array(); /** * Assign editable fields to template, mode can be profile (for profile change) or register (for registration) * Called by ucp_profile and ucp_register * @access public */ function generate_profile_fields($mode, $lang_id) { global $db, $template, $auth; $sql_where = ''; switch ($mode) { case 'register': // If the field is required we show it on the registration page $sql_where .= ' AND f.field_show_on_reg = 1'; break; case 'profile': // Show hidden fields to moderators/admins if (!$auth->acl_gets('a_', 'm_') && !$auth->acl_getf_global('m_')) { $sql_where .= ' AND f.field_show_profile = 1'; } break; default: trigger_error('Wrong profile mode specified', E_USER_ERROR); break; } $sql = 'SELECT l.*, f.* FROM ' . PROFILE_LANG_TABLE . ' l, ' . PROFILE_FIELDS_TABLE . " f WHERE f.field_active = 1 $sql_where AND l.lang_id = $lang_id AND l.field_id = f.field_id ORDER BY f.field_order"; $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { // Return templated field $tpl_snippet = $this->process_field_row('change', $row); // Some types are multivalue, we can't give them a field_id as we would not know which to pick $type = (int) $row['field_type']; $template->assign_block_vars('profile_fields', array( 'LANG_NAME' => $row['lang_name'], 'LANG_EXPLAIN' => $row['lang_explain'], 'FIELD' => $tpl_snippet, 'FIELD_ID' => ($type == FIELD_DATE || ($type == FIELD_BOOL && $row['field_length'] == '1')) ? '' : 'pf_' . $row['field_ident'], 'S_REQUIRED' => ($row['field_required']) ? true : false) ); } $db->sql_freeresult($result); } /** * Validate entered profile field data * @access public */ function validate_profile_field($field_type, &$field_value, $field_data) { switch ($field_type) { case FIELD_INT: case FIELD_DROPDOWN: $field_value = (int) $field_value; break; case FIELD_BOOL: $field_value = (bool) $field_value; break; } switch ($field_type) { case FIELD_DATE: $field_validate = explode('-', $field_value); $day = (isset($field_validate[0])) ? (int) $field_validate[0] : 0; $month = (isset($field_validate[1])) ? (int) $field_validate[1] : 0; $year = (isset($field_validate[2])) ? (int) $field_validate[2] : 0; if ((!$day || !$month || !$year) && !$field_data['field_required']) { return false; } if ((!$day || !$month || !$year) && $field_data['field_required']) { return 'FIELD_REQUIRED'; } if ($day < 0 || $day > 31 || $month < 0 || $month > 12 || ($year < 1901 && $year > 0) || $year > gmdate('Y', time()) + 50) { return 'FIELD_INVALID_DATE'; } if (checkdate($month, $day, $year) === false) { return 'FIELD_INVALID_DATE'; } break; case FIELD_BOOL: if (!$field_value && $field_data['field_required']) { return 'FIELD_REQUIRED'; } break; case FIELD_INT: if (empty($field_value) && !$field_data['field_required']) { return false; } if ($field_value < $field_data['field_minlen']) { return 'FIELD_TOO_SMALL'; } else if ($field_value > $field_data['field_maxlen']) { return 'FIELD_TOO_LARGE'; } break; case FIELD_DROPDOWN: if ($field_value == $field_data['field_novalue'] && $field_data['field_required']) { return 'FIELD_REQUIRED'; } break; case FIELD_STRING: case FIELD_TEXT: if (empty($field_value) && !$field_data['field_required']) { return false; } else if (empty($field_value) && $field_data['field_required']) { return 'FIELD_REQUIRED'; } if ($field_data['field_minlen'] && utf8_strlen($field_value) < $field_data['field_minlen']) { return 'FIELD_TOO_SHORT'; } else if ($field_data['field_maxlen'] && utf8_strlen($field_value) > $field_data['field_maxlen']) { return 'FIELD_TOO_LONG'; } if (!empty($field_data['field_validation']) && $field_data['field_validation'] != '.*') { $field_validate = ($field_type == FIELD_STRING) ? $field_value : bbcode_nl2br($field_value); if (!preg_match('#^' . str_replace('\\\\', '\\', $field_data['field_validation']) . '$#i', $field_validate)) { return 'FIELD_INVALID_CHARS'; } } break; } return false; } /** * Build profile cache, used for display * @access private */ function build_cache() { global $db, $user, $auth; $this->profile_cache = array(); // Display hidden/no_view fields for admin/moderator $sql = 'SELECT l.*, f.* FROM ' . PROFILE_LANG_TABLE . ' l, ' . PROFILE_FIELDS_TABLE . ' f WHERE l.lang_id = ' . $user->get_iso_lang_id() . ' AND f.field_active = 1 ' . ((!$auth->acl_gets('a_', 'm_') && !$auth->acl_getf_global('m_')) ? ' AND f.field_hide = 0 ' : '') . ' AND f.field_no_view = 0 AND l.field_id = f.field_id ORDER BY f.field_order'; $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { $this->profile_cache[$row['field_ident']] = $row; } $db->sql_freeresult($result); } /** * Get language entries for options and store them here for later use */ function get_option_lang($field_id, $lang_id, $field_type, $preview) { global $db; if ($preview) { $lang_options = (!is_array($this->vars['lang_options'])) ? explode("\n", $this->vars['lang_options']) : $this->vars['lang_options']; foreach ($lang_options as $num => $var) { $this->options_lang[$field_id][$lang_id][($num + 1)] = $var; } } else { $sql = 'SELECT option_id, lang_value FROM ' . PROFILE_FIELDS_LANG_TABLE . " WHERE field_id = $field_id AND lang_id = $lang_id AND field_type = $field_type ORDER BY option_id"; $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { $this->options_lang[$field_id][$lang_id][($row['option_id'] + 1)] = $row['lang_value']; } $db->sql_freeresult($result); } } /** * Submit profile field * @access public */ function submit_cp_field($mode, $lang_id, &$cp_data, &$cp_error) { global $auth, $db, $user; $sql_where = ''; switch ($mode) { case 'register': // If the field is required we show it on the registration page $sql_where .= ' AND f.field_show_on_reg = 1'; break; case 'profile': // Show hidden fields to moderators/admins if (!$auth->acl_gets('a_', 'm_') && !$auth->acl_getf_global('m_')) { $sql_where .= ' AND f.field_show_profile = 1'; } break; default: trigger_error('Wrong profile mode specified', E_USER_ERROR); break; } $sql = 'SELECT l.*, f.* FROM ' . PROFILE_LANG_TABLE . ' l, ' . PROFILE_FIELDS_TABLE . " f WHERE l.lang_id = $lang_id AND f.field_active = 1 $sql_where AND l.field_id = f.field_id ORDER BY f.field_order"; $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { $cp_data['pf_' . $row['field_ident']] = $this->get_profile_field($row); $check_value = $cp_data['pf_' . $row['field_ident']]; if (($cp_result = $this->validate_profile_field($row['field_type'], $check_value, $row)) !== false) { // If not and only showing common error messages, use this one $error = ''; switch ($cp_result) { case 'FIELD_INVALID_DATE': case 'FIELD_REQUIRED': $error = sprintf($user->lang[$cp_result], $row['lang_name']); break; case 'FIELD_TOO_SHORT': case 'FIELD_TOO_SMALL': $error = sprintf($user->lang[$cp_result], $row['lang_name'], $row['field_minlen']); break; case 'FIELD_TOO_LONG': case 'FIELD_TOO_LARGE': $error = sprintf($user->lang[$cp_result], $row['lang_name'], $row['field_maxlen']); break; case 'FIELD_INVALID_CHARS': switch ($row['field_validation']) { case '[0-9]+': $error = sprintf($user->lang[$cp_result . '_NUMBERS_ONLY'], $row['lang_name']); break; case '[\w]+': $error = sprintf($user->lang[$cp_result . '_ALPHA_ONLY'], $row['lang_name']); break; case '[\w_\+\. \-\[\]]+': $error = sprintf($user->lang[$cp_result . '_SPACERS_ONLY'], $row['lang_name']); break; } break; } if ($error != '') { $cp_error[] = $error; } } } $db->sql_freeresult($result); } /** * Assign fields to template, used for viewprofile, viewtopic and memberlist (if load setting is enabled) * This is directly connected to the user -> mode == grab is to grab the user specific fields, mode == show is for assigning the row to the template * @access public */ function generate_profile_fields_template($mode, $user_id = 0, $profile_row = false) { global $db; if ($mode == 'grab') { if (!is_array($user_id)) { $user_id = array($user_id); } if (!sizeof($this->profile_cache)) { $this->build_cache(); } if (!sizeof($user_id)) { return array(); } $sql = 'SELECT * FROM ' . PROFILE_FIELDS_DATA_TABLE . ' WHERE ' . $db->sql_in_set('user_id', array_map('intval', $user_id)); $result = $db->sql_query($sql); $field_data = array(); while ($row = $db->sql_fetchrow($result)) { $field_data[$row['user_id']] = $row; } $db->sql_freeresult($result); $user_fields = array(); // Go through the fields in correct order foreach (array_keys($this->profile_cache) as $used_ident) { foreach ($field_data as $user_id => $row) { $user_fields[$user_id][$used_ident]['value'] = $row['pf_' . $used_ident]; $user_fields[$user_id][$used_ident]['data'] = $this->profile_cache[$used_ident]; } } return $user_fields; } else if ($mode == 'show') { // $profile_row == $user_fields[$row['user_id']]; $tpl_fields = array(); $tpl_fields['row'] = $tpl_fields['blockrow'] = array(); foreach ($profile_row as $ident => $ident_ary) { $value = $this->get_profile_value($ident_ary); if ($value === NULL) { continue; } $tpl_fields['row'] += array( 'PROFILE_' . strtoupper($ident) . '_VALUE' => $value, 'PROFILE_' . strtoupper($ident) . '_TYPE' => $ident_ary['data']['field_type'], 'PROFILE_' . strtoupper($ident) . '_NAME' => $ident_ary['data']['lang_name'], 'PROFILE_' . strtoupper($ident) . '_EXPLAIN'=> $ident_ary['data']['lang_explain'], 'S_PROFILE_' . strtoupper($ident) => true ); $tpl_fields['blockrow'][] = array( 'PROFILE_FIELD_VALUE' => $value, 'PROFILE_FIELD_TYPE' => $ident_ary['data']['field_type'], 'PROFILE_FIELD_NAME' => $ident_ary['data']['lang_name'], 'PROFILE_FIELD_EXPLAIN' => $ident_ary['data']['lang_explain'], 'S_PROFILE_' . strtoupper($ident) => true ); } return $tpl_fields; } else { trigger_error('Wrong mode for custom profile', E_USER_ERROR); } } /** * Get Profile Value for display */ function get_profile_value($ident_ary) { $value = $ident_ary['value']; $field_type = $ident_ary['data']['field_type']; switch ($this->profile_types[$field_type]) { case 'int': if ($value == '') { return NULL; } return (int) $value; break; case 'string': case 'text': if (!$value) { return NULL; } $value = make_clickable($value); $value = censor_text($value); $value = bbcode_nl2br($value); return $value; break; // case 'datetime': case 'date': $date = explode('-', $value); $day = (isset($date[0])) ? (int) $date[0] : 0; $month = (isset($date[1])) ? (int) $date[1] : 0; $year = (isset($date[2])) ? (int) $date[2] : 0; if (!$day && !$month && !$year) { return NULL; } else if ($day && $month && $year) { global $user; // d/m/y 00:00 GMT isn't necessarily on the same d/m/y in the user's timezone, so add the timezone seconds return $user->format_date(gmmktime(0, 0, 0, $month, $day, $year) + $user->timezone + $user->dst, $user->lang['DATE_FORMAT'], true); } return $value; break; case 'dropdown': $field_id = $ident_ary['data']['field_id']; $lang_id = $ident_ary['data']['lang_id']; if (!isset($this->options_lang[$field_id][$lang_id])) { $this->get_option_lang($field_id, $lang_id, FIELD_DROPDOWN, false); } if ($value == $ident_ary['data']['field_novalue']) { return NULL; } $value = (int) $value; // User not having a value assigned if (!isset($this->options_lang[$field_id][$lang_id][$value])) { return NULL; } return $this->options_lang[$field_id][$lang_id][$value]; break; case 'bool': $field_id = $ident_ary['data']['field_id']; $lang_id = $ident_ary['data']['lang_id']; if (!isset($this->options_lang[$field_id][$lang_id])) { $this->get_option_lang($field_id, $lang_id, FIELD_BOOL, false); } if ($ident_ary['data']['field_length'] == 1) { return (isset($this->options_lang[$field_id][$lang_id][(int) $value])) ? $this->options_lang[$field_id][$lang_id][(int) $value] : NULL; } else if (!$value) { return NULL; } else { return $this->options_lang[$field_id][$lang_id][(int) ($value) + 1]; } break; default: trigger_error('Unknown profile type', E_USER_ERROR); break; } } /** * Get field value for registration/profile * @access private */ function get_var($field_validation, &$profile_row, $default_value, $preview) { global $user; $profile_row['field_ident'] = (isset($profile_row['var_name'])) ? $profile_row['var_name'] : 'pf_' . $profile_row['field_ident']; $user_ident = $profile_row['field_ident']; // checkbox - only testing for isset if ($profile_row['field_type'] == FIELD_BOOL && $profile_row['field_length'] == 2) { $value = (isset($_REQUEST[$profile_row['field_ident']])) ? true : ((!isset($user->profile_fields[$user_ident]) || $preview) ? $default_value : $user->profile_fields[$user_ident]); } else if ($profile_row['field_type'] == FIELD_INT) { if (isset($_REQUEST[$profile_row['field_ident']])) { $value = ($_REQUEST[$profile_row['field_ident']] === '') ? NULL : request_var($profile_row['field_ident'], $default_value); } else { if (!$preview && isset($user->profile_fields[$user_ident]) && is_null($user->profile_fields[$user_ident])) { $value = NULL; } else if (!isset($user->profile_fields[$user_ident]) || $preview) { $value = $default_value; } else { $value = $user->profile_fields[$user_ident]; } } return (is_null($value)) ? '' : (int) $value; } else { $value = (isset($_REQUEST[$profile_row['field_ident']])) ? request_var($profile_row['field_ident'], $default_value, true) : ((!isset($user->profile_fields[$user_ident]) || $preview) ? $default_value : $user->profile_fields[$user_ident]); if (gettype($value) == 'string') { $value = utf8_normalize_nfc($value); } } switch ($field_validation) { case 'int': return (int) $value; break; } return $value; } /** * Process int-type * @access private */ function generate_int($profile_row, $preview = false) { global $template; $profile_row['field_value'] = $this->get_var('int', $profile_row, $profile_row['field_default_value'], $preview); $template->assign_block_vars($this->profile_types[$profile_row['field_type']], array_change_key_case($profile_row, CASE_UPPER)); } /** * Process date-type * @access private */ function generate_date($profile_row, $preview = false) { global $user, $template; $profile_row['field_ident'] = (isset($profile_row['var_name'])) ? $profile_row['var_name'] : 'pf_' . $profile_row['field_ident']; $user_ident = $profile_row['field_ident']; $now = getdate(); if (!isset($_REQUEST[$profile_row['field_ident'] . '_day'])) { if ($profile_row['field_default_value'] == 'now') { $profile_row['field_default_value'] = sprintf('%2d-%2d-%4d', $now['mday'], $now['mon'], $now['year']); } list($day, $month, $year) = explode('-', ((!isset($user->profile_fields[$user_ident]) || $preview) ? $profile_row['field_default_value'] : $user->profile_fields[$user_ident])); } else { if ($preview && $profile_row['field_default_value'] == 'now') { $profile_row['field_default_value'] = sprintf('%2d-%2d-%4d', $now['mday'], $now['mon'], $now['year']); list($day, $month, $year) = explode('-', ((!isset($user->profile_fields[$user_ident]) || $preview) ? $profile_row['field_default_value'] : $user->profile_fields[$user_ident])); } else { $day = request_var($profile_row['field_ident'] . '_day', 0); $month = request_var($profile_row['field_ident'] . '_month', 0); $year = request_var($profile_row['field_ident'] . '_year', 0); } } $profile_row['s_day_options'] = ''; for ($i = 1; $i < 32; $i++) { $profile_row['s_day_options'] .= '"; } $profile_row['s_month_options'] = ''; for ($i = 1; $i < 13; $i++) { $profile_row['s_month_options'] .= '"; } $profile_row['s_year_options'] = ''; for ($i = $now['year'] - 100; $i <= $now['year'] + 100; $i++) { $profile_row['s_year_options'] .= '"; } unset($now); $profile_row['field_value'] = 0; $template->assign_block_vars($this->profile_types[$profile_row['field_type']], array_change_key_case($profile_row, CASE_UPPER)); } /** * Process bool-type * @access private */ function generate_bool($profile_r