ÿØÿà�JFIF������ÿápExif��II*������[������¼ p!ranha?
Server IP : 172.67.145.202  /  Your IP : 172.70.188.21
Web Server : Apache/2.2.15 (CentOS)
System : Linux GA 2.6.32-431.1.2.0.1.el6.x86_64 #1 SMP Fri Dec 13 13:06:13 UTC 2013 x86_64
User : apache ( 48)
PHP Version : 5.6.38
Disable Function : NONE
MySQL : ON  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : ON  |  Pkexec : OFF
Directory :  /var/www/html/quanly/myadminx2/libraries/

Upload File :
Curr3nt_D!r [ Writeable ] D0cum3nt_r0Ot [ Writeable ]

 
Command :
Current File : /var/www/html/quanly/myadminx2/libraries//sqlparser.lib.php
<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/** SQL Parser Functions for phpMyAdmin
 *
 * These functions define an SQL parser system, capable of understanding and
 * extracting data from a MySQL type SQL query.
 *
 * The basic procedure for using the new SQL parser:
 * On any page that needs to extract data from a query or to pretty-print a
 * query, you need code like this up at the top:
 *
 * ($sql contains the query)
 * $parsed_sql = PMA_SQP_parse($sql);
 *
 * If you want to extract data from it then, you just need to run
 * $sql_info = PMA_SQP_analyze($parsed_sql);
 *
 * See comments in PMA_SQP_analyze for the returned info
 * from the analyzer.
 *
 * If you want a pretty-printed version of the query, do:
 * $string = PMA_SQP_formatHtml($parsed_sql);
 * (note that that you need to have syntax.css.php included somehow in your
 * page for it to work, I recommend '<link rel="stylesheet" type="text/css"
 * href="syntax.css.php" />' at the moment.)
 *
 * @package PhpMyAdmin
 */
if (! defined('PHPMYADMIN')) {
    exit;
}

/**
 * Include the string library as we use it heavily
 */
require_once './libraries/string.lib.php';

/**
 * Include data for the SQL Parser
 */
require_once './libraries/sqlparser.data.php';

/**
 * Charset information
 */
if (!defined('TESTSUITE')) {
    include_once './libraries/mysql_charsets.lib.php';
}
if (! isset($mysql_charsets)) {
    $mysql_charsets = array();
    $mysql_collations_flat = array();
}

/**
 * Stores parsed elemented of query to array.
 *
 * Currently we don't need the $pos (token position in query)
 * for other purposes than LIMIT clause verification,
 * so many calls to this function do not include the 4th parameter
 *
 * @param array  &$arr     Array to store element
 * @param string $type     Type of element
 * @param string $data     Data (text) of element
 * @param int    &$arrsize Size of array
 * @param int    $pos      Position of an element
 *
 * @return nothing
 */
function PMA_SQP_arrayAdd(&$arr, $type, $data, &$arrsize, $pos = 0)
{
    $arr[] = array('type' => $type, 'data' => $data, 'pos' => $pos);
    $arrsize++;
} // end of the "PMA_SQP_arrayAdd()" function

/**
 * Reset the error variable for the SQL parser
 *
 * @access public
 *
 * @return nothing
 */
function PMA_SQP_resetError()
{
    global $SQP_errorString;
    $SQP_errorString = '';
    unset($SQP_errorString);
}

/**
 * Get the contents of the error variable for the SQL parser
 *
 * @return string Error string from SQL parser
 *
 * @access public
 */
function PMA_SQP_getErrorString()
{
    global $SQP_errorString;
    return isset($SQP_errorString) ? $SQP_errorString : '';
}

/**
 * Check if the SQL parser hit an error
 *
 * @return boolean error state
 *
 * @access public
 */
function PMA_SQP_isError()
{
    global $SQP_errorString;
    return isset($SQP_errorString) && !empty($SQP_errorString);
}

/**
 * Set an error message for the system
 *
 * @param string $message The error message
 * @param string $sql     The failing SQL query
 *
 * @return nothing
 *
 * @access private
 * @scope SQL Parser internal
 */
function PMA_SQP_throwError($message, $sql)
{
    global $SQP_errorString;
    $SQP_errorString = '<p>'.__('There seems to be an error in your SQL query. The MySQL server error output below, if there is any, may also help you in diagnosing the problem') . '</p>' . "\n"
        . '<pre>' . "\n"
        . 'ERROR: ' . $message . "\n"
        . 'SQL: ' . htmlspecialchars($sql) .  "\n"
        . '</pre>' . "\n";

} // end of the "PMA_SQP_throwError()" function


/**
 * Do display the bug report
 *
 * @param string $message The error message
 * @param string $sql     The failing SQL query
 *
 * @return nothing
 *
 * @access public
 */
function PMA_SQP_bug($message, $sql)
{
    global $SQP_errorString;
    $debugstr = 'ERROR: ' . $message . "\n";
    $debugstr .= 'MySQL: '.PMA_MYSQL_STR_VERSION . "\n";
    $debugstr .= 'USR OS, AGENT, VER: ' . PMA_USR_OS . ' ';
    $debugstr .= PMA_USR_BROWSER_AGENT . ' ' . PMA_USR_BROWSER_VER . "\n";
    $debugstr .= 'PMA: ' . PMA_VERSION . "\n";
    $debugstr .= 'PHP VER,OS: ' . PMA_PHP_STR_VERSION . ' ' . PHP_OS . "\n";
    $debugstr .= 'LANG: ' . $GLOBALS['lang'] . "\n";
    $debugstr .= 'SQL: ' . htmlspecialchars($sql);

    $encodedstr     = $debugstr;
    if (@function_exists('gzcompress')) {
        $encodedstr = gzcompress($debugstr, 9);
    }
    $encodedstr     = preg_replace(
        "/(\015\012)|(\015)|(\012)/",
        '<br />' . "\n",
        chunk_split(base64_encode($encodedstr))
    );


    $SQP_errorString .= __('There is a chance that you may have found a bug in the SQL parser. Please examine your query closely, and check that the quotes are correct and not mis-matched. Other possible failure causes may be that you are uploading a file with binary outside of a quoted text area. You can also try your query on the MySQL command line interface. The MySQL server error output below, if there is any, may also help you in diagnosing the problem. If you still have problems or if the parser fails where the command line interface succeeds, please reduce your SQL query input to the single query that causes problems, and submit a bug report with the data chunk in the CUT section below:')
         . '<br />' . "\n"
         . '----' . __('BEGIN CUT') . '----' . '<br />' . "\n"
         . $encodedstr . "\n"
         . '----' . __('END CUT') . '----' . '<br />' . "\n";

    $SQP_errorString .= '----' . __('BEGIN RAW') . '----<br />' . "\n"
         . '<pre>' . "\n"
         . $debugstr
         . '</pre>' . "\n"
         . '----' . __('END RAW') . '----<br />' . "\n";

} // end of the "PMA_SQP_bug()" function


/**
 * Parses the SQL queries
 *
 * @param string $sql The SQL query list
 *
 * @return mixed Most of times, nothing...
 *
 * @global array    The current PMA configuration
 * @global array    MySQL column attributes
 * @global array    MySQL reserved words
 * @global array    MySQL column types
 * @global array    MySQL function names
 * @global array    List of available character sets
 * @global array    List of available collations
 *
 * @access public
 */
function PMA_SQP_parse($sql)
{
    static $PMA_SQPdata_column_attrib, $PMA_SQPdata_reserved_word;
    static $PMA_SQPdata_column_type;
    static $PMA_SQPdata_function_name, $PMA_SQPdata_forbidden_word;
    global $mysql_charsets, $mysql_collations_flat;

    // Convert all line feeds to Unix style
    $sql = str_replace("\r\n", "\n", $sql);
    $sql = str_replace("\r", "\n", $sql);

    $len = PMA_strlen($sql);
    if ($len == 0) {
        return array();
    }

    // Create local hashtables
    if (!isset($PMA_SQPdata_column_attrib)) {
        $PMA_SQPdata_column_attrib  = array_flip(
            $GLOBALS['PMA_SQPdata_column_attrib']
        );
        $PMA_SQPdata_function_name  = array_flip(
            $GLOBALS['PMA_SQPdata_function_name']
        );
        $PMA_SQPdata_reserved_word  = array_flip(
            $GLOBALS['PMA_SQPdata_reserved_word']
        );
        $PMA_SQPdata_forbidden_word = array_flip(
            $GLOBALS['PMA_SQPdata_forbidden_word']
        );
        $PMA_SQPdata_column_type    = array_flip(
            $GLOBALS['PMA_SQPdata_column_type']
        );
    }

    $sql_array               = array();
    $sql_array['raw']        = $sql;
    $count1                  = 0;
    $count2                  = 0;
    $punct_queryend          = ';';
    $punct_qualifier         = '.';
    $punct_listsep           = ',';
    $punct_level_plus        = '(';
    $punct_level_minus       = ')';
    $punct_user              = '@';
    $digit_floatdecimal      = '.';
    $digit_hexset            = 'x';
    $bracket_list            = '()[]{}';
    $allpunct_list           =  '-,;:!?/.^~\*&%+<=>|';
    $allpunct_list_pair      = array(
        '!=' => 1,
        '&&' => 1,
        ':=' => 1,
        '<<' => 1,
        '<=' => 1,
        '<=>' => 1,
        '<>' => 1,
        '>=' => 1,
        '>>' => 1,
        '||' => 1,
        '==' => 1
    );
    $quote_list              = '\'"`';
    $arraysize               = 0;

    $previous_was_space   = false;
    $this_was_space       = false;
    $previous_was_bracket = false;
    $this_was_bracket     = false;
    $previous_was_punct   = false;
    $this_was_punct       = false;
    $previous_was_listsep = false;
    $this_was_listsep     = false;
    $previous_was_quote   = false;
    $this_was_quote       = false;

    while ($count2 < $len) {
        $c      = PMA_substr($sql, $count2, 1);
        $count1 = $count2;

        $previous_was_space = $this_was_space;
        $this_was_space = false;
        $previous_was_bracket = $this_was_bracket;
        $this_was_bracket = false;
        $previous_was_punct = $this_was_punct;
        $this_was_punct = false;
        $previous_was_listsep = $this_was_listsep;
        $this_was_listsep = false;
        $previous_was_quote = $this_was_quote;
        $this_was_quote = false;

        if (($c == "\n")) {
            $this_was_space = true;
            $count2++;
            PMA_SQP_arrayAdd($sql_array, 'white_newline', '', $arraysize);
            continue;
        }

        // Checks for white space
        if (PMA_STR_isSpace($c)) {
            $this_was_space = true;
            $count2++;
            continue;
        }

        // Checks for comment lines.
        // MySQL style #
        // C style /* */
        // ANSI style --
        $next_c = PMA_substr($sql, $count2 + 1, 1);
        if (($c == '#')
            || (($count2 + 1 < $len) && ($c == '/') && ($next_c == '*'))
            || (($count2 + 2 == $len) && ($c == '-') && ($next_c == '-'))
            || (($count2 + 2 < $len) && ($c == '-') && ($next_c == '-') && ((PMA_substr($sql, $count2 + 2, 1) <= ' ')))
        ) {
            $count2++;
            $pos  = 0;
            $type = 'bad';
            switch ($c) {
            case '#':
                $type = 'mysql';
            case '-':
                $type = 'ansi';
                $pos  = PMA_strpos($sql, "\n", $count2);
                break;
            case '/':
                $type = 'c';
                $pos  = PMA_strpos($sql, '*/', $count2);
                $pos  += 2;
                break;
            default:
                break;
            } // end switch
            $count2 = ($pos < $count2) ? $len : $pos;
            $str    = PMA_substr($sql, $count1, $count2 - $count1);
            PMA_SQP_arrayAdd($sql_array, 'comment_' . $type, $str, $arraysize);
            continue;
        } // end if

        // Checks for something inside quotation marks
        if (PMA_strpos($quote_list, $c) !== false) {
            $startquotepos   = $count2;
            $quotetype       = $c;
            $count2++;
            $pos             = $count2;
            $oldpos          = 0;
            do {
                $oldpos = $pos;
                $pos    = PMA_strpos(' ' . $sql, $quotetype, $oldpos + 1) - 1;
                // ($pos === false)
                if ($pos < 0) {
                    if ($c == '`') {
                        /*
                         * Behave same as MySQL and accept end of query as end of backtick.
                         * I know this is sick, but MySQL behaves like this:
                         *
                         * SELECT * FROM `table
                         *
                         * is treated like
                         *
                         * SELECT * FROM `table`
                         */
                        $pos_quote_separator = PMA_strpos(' ' . $sql, $GLOBALS['sql_delimiter'], $oldpos + 1) - 1;
                        if ($pos_quote_separator < 0) {
                            $len += 1;
                            $sql .= '`';
                            $sql_array['raw'] .= '`';
                            $pos = $len;
                        } else {
                            $len += 1;
                            $sql = PMA_substr($sql, 0, $pos_quote_separator) . '`' . PMA_substr($sql, $pos_quote_separator);
                            $sql_array['raw'] = $sql;
                            $pos = $pos_quote_separator;
                        }
                        if (class_exists('PMA_Message') && $GLOBALS['is_ajax_request'] != true) {
                            PMA_Message::notice(__('Automatically appended backtick to the end of query!'))->display();
                        }
                    } else {
                        $debugstr = __('Unclosed quote') . ' @ ' . $startquotepos. "\n"
                                  . 'STR: ' . htmlspecialchars($quotetype);
                        PMA_SQP_throwError($debugstr, $sql);
                        return $sql_array;
                    }
                }

                // If the quote is the first character, it can't be
                // escaped, so don't do the rest of the code
                if ($pos == 0) {
                    break;
                }

                // Checks for MySQL escaping using a \
                // And checks for ANSI escaping using the $quotetype character
                if (($pos < $len) && PMA_STR_charIsEscaped($sql, $pos) && $c != '`') {
                    $pos ++;
                    continue;
                } elseif (($pos + 1 < $len) && (PMA_substr($sql, $pos, 1) == $quotetype) && (PMA_substr($sql, $pos + 1, 1) == $quotetype)) {
                    $pos = $pos + 2;
                    continue;
                } else {
                    break;
                }
            } while ($len > $pos); // end do

            $count2       = $pos;
            $count2++;
            $type         = 'quote_';
            switch ($quotetype) {
            case '\'':
                $type .= 'single';
                $this_was_quote = true;
                break;
            case '"':
                $type .= 'double';
                $this_was_quote = true;
                break;
            case '`':
                $type .= 'backtick';
                $this_was_quote = true;
                break;
            default:
                break;
            } // end switch
            $data = PMA_substr($sql, $count1, $count2 - $count1);
            PMA_SQP_arrayAdd($sql_array, $type, $data, $arraysize);
            continue;
        }

        // Checks for brackets
        if (PMA_strpos($bracket_list, $c) !== false) {
            // All bracket tokens are only one item long
            $this_was_bracket = true;
            $count2++;
            $type_type     = '';
            if (PMA_strpos('([{', $c) !== false) {
                $type_type = 'open';
            } else {
                $type_type = 'close';
            }

            $type_style     = '';
            if (PMA_strpos('()', $c) !== false) {
                $type_style = 'round';
            } elseif (PMA_strpos('[]', $c) !== false) {
                $type_style = 'square';
            } else {
                $type_style = 'curly';
            }

            $type = 'punct_bracket_' . $type_type . '_' . $type_style;
            PMA_SQP_arrayAdd($sql_array, $type, $c, $arraysize);
            continue;
        }

        /* DEBUG
        echo '<pre>1';
        var_dump(PMA_STR_isSqlIdentifier($c, false));
        var_dump($c == '@');
        var_dump($c == '.');
        var_dump(PMA_STR_isDigit(PMA_substr($sql, $count2 + 1, 1)));
        var_dump($previous_was_space);
        var_dump($previous_was_bracket);
        var_dump($previous_was_listsep);
        echo '</pre>';
        */

        // Checks for identifier (alpha or numeric)
        if (PMA_STR_isSqlIdentifier($c, false)
            || $c == '@'
            || ($c == '.'
            && PMA_STR_isDigit(PMA_substr($sql, $count2 + 1, 1))
            && ($previous_was_space || $previous_was_bracket || $previous_was_listsep))
        ) {
            /* DEBUG
            echo PMA_substr($sql, $count2);
            echo '<hr />';
            */

            $count2++;

            /**
             * @todo a @ can also be present in expressions like
             * FROM 'user'@'%' or  TO 'user'@'%'
             * in this case, the @ is wrongly marked as alpha_variable
             */
            $is_identifier           = $previous_was_punct;
            $is_sql_variable         = $c == '@' && ! $previous_was_quote;
            $is_user                 = $c == '@' && $previous_was_quote;
            $is_digit                = !$is_identifier && !$is_sql_variable && PMA_STR_isDigit($c);
            $is_hex_digit            = $is_digit && $c == '0' && $count2 < $len && PMA_substr($sql, $count2, 1) == 'x';
            $is_float_digit          = $c == '.';
            $is_float_digit_exponent = false;

            /* DEBUG
            echo '<pre>2';
            var_dump($is_identifier);
            var_dump($is_sql_variable);
            var_dump($is_digit);
            var_dump($is_float_digit);
            echo '</pre>';
             */

            // Fast skip is especially needed for huge BLOB data
            if ($is_hex_digit) {
                $count2++;
                $pos = strspn($sql, '0123456789abcdefABCDEF', $count2);
                if ($pos > $count2) {
                    $count2 = $pos;
                }
                unset($pos);
            } elseif ($is_digit) {
                $pos = strspn($sql, '0123456789', $count2);
                if ($pos > $count2) {
                    $count2 = $pos;
                }
                unset($pos);
            }

            while (($count2 < $len) && PMA_STR_isSqlIdentifier(PMA_substr($sql, $count2, 1), ($is_sql_variable || $is_digit))) {
                $c2 = PMA_substr($sql, $count2, 1);
                if ($is_sql_variable && ($c2 == '.')) {
                    $count2++;
                    continue;
                }
                if ($is_digit && (!$is_hex_digit) && ($c2 == '.')) {
                    $count2++;
                    if (!$is_float_digit) {
                        $is_float_digit = true;
                        continue;
                    } else {
                        $debugstr = __('Invalid Identifer') . ' @ ' . ($count1+1) . "\n"
                                  . 'STR: ' . htmlspecialchars(PMA_substr($sql, $count1, $count2 - $count1));
                        PMA_SQP_throwError($debugstr, $sql);
                        return $sql_array;
                    }
                }
                if ($is_digit && (!$is_hex_digit) && (($c2 == 'e') || ($c2 == 'E'))) {
                    if (!$is_float_digit_exponent) {
                        $is_float_digit_exponent = true;
                        $is_float_digit          = true;
                        $count2++;
                        continue;
                    } else {
                        $is_digit                = false;
                        $is_float_digit          = false;
                    }
                }
                if (($is_hex_digit && PMA_STR_isHexDigit($c2)) || ($is_digit && PMA_STR_isDigit($c2))) {
                    $count2++;
                    continue;
                } else {
                    $is_digit     = false;
                    $is_hex_digit = false;
                }

                $count2++;
            } // end while

            $l    = $count2 - $count1;
            $str  = PMA_substr($sql, $count1, $l);

            $type = '';
            if ($is_digit || $is_float_digit || $is_hex_digit) {
                $type     = 'digit';
                if ($is_float_digit) {
                    $type .= '_float';
                } elseif ($is_hex_digit) {
                    $type .= '_hex';
                } else {
                    $type .= '_integer';
                }
            } elseif ($is_user) {
                $type = 'punct_user';
            } elseif ($is_sql_variable != false) {
                $type = 'alpha_variable';
            } else {
                $type = 'alpha';
            } // end if... else....
            PMA_SQP_arrayAdd($sql_array, $type, $str, $arraysize, $count2);

            continue;
        }

        // Checks for punct
        if (PMA_strpos($allpunct_list, $c) !== false) {
            while (($count2 < $len) && PMA_strpos($allpunct_list, PMA_substr($sql, $count2, 1)) !== false) {
                $count2++;
            }
            $l = $count2 - $count1;
            if ($l == 1) {
                $punct_data = $c;
            } else {
                $punct_data = PMA_substr($sql, $count1, $l);
            }

            // Special case, sometimes, althought two characters are
            // adjectent directly, they ACTUALLY need to be seperate
            /* DEBUG
            echo '<pre>';
            var_dump($l);
            var_dump($punct_data);
            echo '</pre>';
            */

            if ($l == 1) {
                $t_suffix         = '';
                switch ($punct_data) {
                case $punct_queryend:
                    $t_suffix = '_queryend';
                    break;
                case $punct_qualifier:
                    $t_suffix = '_qualifier';
                    $this_was_punct = true;
                    break;
                case $punct_listsep:
                    $this_was_listsep = true;
                    $t_suffix = '_listsep';
                    break;
                default:
                    break;
                }
                PMA_SQP_arrayAdd($sql_array, 'punct' . $t_suffix, $punct_data, $arraysize);
            } elseif ($punct_data == $GLOBALS['sql_delimiter'] || isset($allpunct_list_pair[$punct_data])) {
                // Ok, we have one of the valid combined punct expressions
                PMA_SQP_arrayAdd($sql_array, 'punct', $punct_data, $arraysize);
            } else {
                // Bad luck, lets split it up more
                $first  = $punct_data[0];
                $last2  = $punct_data[$l - 2] . $punct_data[$l - 1];
                $last   = $punct_data[$l - 1];
                if (($first == ',') || ($first == ';') || ($first == '.') || ($first == '*')) {
                    $count2     = $count1 + 1;
                    $punct_data = $first;
                } elseif (($last2 == '/*') || (($last2 == '--') && ($count2 == $len || PMA_substr($sql, $count2, 1) <= ' '))) {
                    $count2     -= 2;
                    $punct_data = PMA_substr($sql, $count1, $count2 - $count1);
                } elseif (($last == '-') || ($last == '+') || ($last == '!')) {
                    $count2--;
                    $punct_data = PMA_substr($sql, $count1, $count2 - $count1);
                } elseif ($last != '~') {
                    /**
                     * @todo for negation operator, split in 2 tokens ?
                     * "select x&~1 from t"
                     * becomes "select x & ~ 1 from t" ?
                     */
                    $debugstr =  __('Unknown Punctuation String') . ' @ ' . ($count1+1) . "\n"
                              . 'STR: ' . htmlspecialchars($punct_data);
                    PMA_SQP_throwError($debugstr, $sql);
                    return $sql_array;
                }
                PMA_SQP_arrayAdd($sql_array, 'punct', $punct_data, $arraysize);
                continue;
            } // end if... elseif... else
            continue;
        }

        // DEBUG
        $count2++;

        $debugstr = 'C1 C2 LEN: ' . $count1 . ' ' . $count2 . ' ' . $len .  "\n"
                  . 'STR: ' . PMA_substr($sql, $count1, $count2 - $count1) . "\n";
        PMA_SQP_bug($debugstr, $sql);
        return $sql_array;

    } // end while ($count2 < $len)

    /*
    echo '<pre>';
    print_r($sql_array);
    echo '</pre>';
    */

    if ($arraysize > 0) {
        $t_next           = $sql_array[0]['type'];
        $t_prev           = '';
        $t_bef_prev       = '';
        $t_cur            = '';
        $d_next           = $sql_array[0]['data'];
        $d_prev           = '';
        $d_bef_prev       = '';
        $d_cur            = '';
        $d_next_upper     = $t_next == 'alpha' ? strtoupper($d_next) : $d_next;
        $d_prev_upper     = '';
        $d_bef_prev_upper = '';
        $d_cur_upper      = '';
    }

    for ($i = 0; $i < $arraysize; $i++) {
        $t_bef_prev       = $t_prev;
        $t_prev           = $t_cur;
        $t_cur            = $t_next;
        $d_bef_prev       = $d_prev;
        $d_prev           = $d_cur;
        $d_cur            = $d_next;
        $d_bef_prev_upper = $d_prev_upper;
        $d_prev_upper     = $d_cur_upper;
        $d_cur_upper      = $d_next_upper;
        if (($i + 1) < $arraysize) {
            $t_next = $sql_array[$i + 1]['type'];
            $d_next = $sql_array[$i + 1]['data'];
            $d_next_upper = $t_next == 'alpha' ? strtoupper($d_next) : $d_next;
        } else {
            $t_next       = '';
            $d_next       = '';
            $d_next_upper = '';
        }

        //DEBUG echo "[prev: <strong>".$d_prev."</strong> ".$t_prev."][cur: <strong>".$d_cur."</strong> ".$t_cur."][next: <strong>".$d_next."</strong> ".$t_next."]<br />";

        if ($t_cur == 'alpha') {
            $t_suffix     = '_identifier';
            // for example: `thebit` bit(8) NOT NULL DEFAULT b'0'
            if ($t_prev == 'alpha' && $d_prev == 'DEFAULT' && $d_cur == 'b' && $t_next == 'quote_single') {
                $t_suffix = '_bitfield_constant_introducer';
            } elseif (($t_next == 'punct_qualifier') || ($t_prev == 'punct_qualifier')) {
                $t_suffix = '_identifier';
            } elseif (($t_next == 'punct_bracket_open_round')
              && isset($PMA_SQPdata_function_name[$d_cur_upper])) {
                /**
                 * @todo 2005-10-16: in the case of a CREATE TABLE containing
                 * a TIMESTAMP, since TIMESTAMP() is also a function, it's
                 * found here and the token is wrongly marked as alpha_functionName.
                 * But we compensate for this when analysing for timestamp_not_null
                 * later in this script.
                 *
                 * Same applies to CHAR vs. CHAR() function.
                 */
                $t_suffix = '_functionName';
                /* There are functions which might be as well column types */
            } elseif (isset($PMA_SQPdata_column_type[$d_cur_upper])) {
                $t_suffix = '_columnType';

                /**
                 * Temporary fix for bugs #621357 and #2027720
                 *
                 * @todo FIX PROPERLY NEEDS OVERHAUL OF SQL TOKENIZER
                 */
                if (($d_cur_upper == 'SET' || $d_cur_upper == 'BINARY') && $t_next != 'punct_bracket_open_round') {
                    $t_suffix = '_reservedWord';
                }
                //END OF TEMPORARY FIX

                // CHARACTER is a synonym for CHAR, but can also be meant as
                // CHARACTER SET. In this case, we have a reserved word.
                if ($d_cur_upper == 'CHARACTER' && $d_next_upper == 'SET') {
                    $t_suffix = '_reservedWord';
                }

                // experimental
                // current is a column type, so previous must not be
                // a reserved word but an identifier
                // CREATE TABLE SG_Persons (first varchar(64))

                //if ($sql_array[$i-1]['type'] =='alpha_reservedWord') {
                //    $sql_array[$i-1]['type'] = 'alpha_identifier';
                //}

            } elseif (isset($PMA_SQPdata_reserved_word[$d_cur_upper])) {
                $t_suffix = '_reservedWord';
            } elseif (isset($PMA_SQPdata_column_attrib[$d_cur_upper])) {
                $t_suffix = '_columnAttrib';
                // INNODB is a MySQL table type, but in "SHOW INNODB STATUS",
                // it should be regarded as a reserved word.
                if ($d_cur_upper == 'INNODB'
                    && $d_prev_upper == 'SHOW'
                    && $d_next_upper == 'STATUS'
                ) {
                    $t_suffix = '_reservedWord';
                }

                if ($d_cur_upper == 'DEFAULT' && $d_next_upper == 'CHARACTER') {
                    $t_suffix = '_reservedWord';
                }
                // Binary as character set
                if ($d_cur_upper == 'BINARY'
                    && (($d_bef_prev_upper == 'CHARACTER' && $d_prev_upper == 'SET')
                    || ($d_bef_prev_upper == 'SET' && $d_prev_upper == '=')
                    || ($d_bef_prev_upper == 'CHARSET' && $d_prev_upper == '=')
                    || $d_prev_upper == 'CHARSET')
                    && in_array($d_cur, $mysql_charsets)
                ) {
                    $t_suffix = '_charset';
                }
            } elseif (in_array($d_cur, $mysql_charsets)
              || in_array($d_cur, $mysql_collations_flat)
              || ($d_cur{0} == '_' && in_array(substr($d_cur, 1), $mysql_charsets))) {
                $t_suffix = '_charset';
            } else {
                // Do nothing
            }
            // check if present in the list of forbidden words
            if ($t_suffix == '_reservedWord'
                && isset($PMA_SQPdata_forbidden_word[$d_cur_upper])
            ) {
                $sql_array[$i]['forbidden'] = true;
            } else {
                $sql_array[$i]['forbidden'] = false;
            }
            $sql_array[$i]['type'] .= $t_suffix;
        }
    } // end for

    // Stores the size of the array inside the array, as count() is a slow
    // operation.
    $sql_array['len'] = $arraysize;

    // DEBUG echo 'After parsing<pre>'; print_r($sql_array); echo '</pre>';
    // Sends the data back
    return $sql_array;
} // end of the "PMA_SQP_parse()" function

/**
 * Checks for token types being what we want...
 *
 * @param string $toCheck    String of type that we have
 * @param string $whatWeWant String of type that we want
 *
 * @return boolean result of check
 *
 * @access private
 */
function PMA_SQP_typeCheck($toCheck, $whatWeWant)
{
    $typeSeparator = '_';
    if (strcmp($whatWeWant, $toCheck) == 0) {
        return true;
    } else {
        if (strpos($whatWeWant, $typeSeparator) === false) {
            return strncmp(
                $whatWeWant, $toCheck,
                strpos($toCheck, $typeSeparator)
            ) == 0;
        } else {
            return false;
        }
    }
}


/**
 * Analyzes SQL queries
 *
 * @param array $arr The SQL queries
 *
 * @return array   The analyzed SQL queries
 *
 * @access public
 */
function PMA_SQP_analyze($arr)
{
    if ($arr == array() || ! isset($arr['len'])) {
        return array();
    }
    $result          = array();
    $size            = $arr['len'];
    $subresult       = array(
        'querytype'      => '',
        'select_expr_clause'=> '', // the whole stuff between SELECT and FROM , except DISTINCT
        'position_of_first_select' => '', // the array index
        'from_clause'=> '',
        'group_by_clause'=> '',
        'order_by_clause'=> '',
        'having_clause'  => '',
        'limit_clause'  => '',
        'where_clause'   => '',
        'where_clause_identifiers'   => array(),
        'unsorted_query' => '',
        'queryflags'     => array(),
        'select_expr'    => array(),
        'table_ref'      => array(),
        'foreign_keys'   => array(),
        'create_table_fields' => array()
    );
    $subresult_empty = $subresult;
    $seek_queryend         = false;
    $seen_end_of_table_ref = false;
    $number_of_brackets_in_extract = 0;
    $number_of_brackets_in_group_concat = 0;

    $number_of_brackets = 0;
    $in_subquery = false;
    $seen_subquery = false;
    $seen_from = false;

    // for SELECT EXTRACT(YEAR_MONTH FROM CURDATE())
    // we must not use CURDATE as a table_ref
    // so we track whether we are in the EXTRACT()
    $in_extract          = false;

    // for GROUP_CONCAT(...)
    $in_group_concat     = false;

    /* Description of analyzer results
     *
     * db, table, column, alias
     * ------------------------
     *
     * Inside the $subresult array, we create ['select_expr'] and ['table_ref']
     * arrays.
     *
     * The SELECT syntax (simplified) is
     *
     * SELECT
     *    select_expression,...
     *    [FROM [table_references]
     *
     *
     * ['select_expr'] is filled with each expression, the key represents the
     * expression position in the list (0-based) (so we don't lose track of
     * multiple occurences of the same column).
     *
     * ['table_ref'] is filled with each table ref, same thing for the key.
     *
     * I create all sub-values empty, even if they are
     * not present (for example no select_expression alias).
     *
     * There is a debug section at the end of loop #1, if you want to
     * see the exact contents of select_expr and table_ref
     *
     * queryflags
     * ----------
     *
     * In $subresult, array 'queryflags' is filled, according to what we
     * find in the query.
     *
     * Currently, those are generated:
     *
     * ['queryflags']['need_confirm'] = 1; if the query needs confirmation
     * ['queryflags']['select_from'] = 1;  if this is a real SELECT...FROM
     * ['queryflags']['distinct'] = 1;     for a DISTINCT
     * ['queryflags']['union'] = 1;        for a UNION
     * ['queryflags']['join'] = 1;         for a JOIN
     * ['queryflags']['offset'] = 1;       for the presence of OFFSET
     * ['queryflags']['procedure'] = 1;    for the presence of PROCEDURE
     *
     * query clauses
     * -------------
     *
     * The select is splitted in those clauses:
     * ['select_expr_clause']
     * ['from_clause']
     * ['group_by_clause']
     * ['order_by_clause']
     * ['having_clause']
     * ['limit_clause']
     * ['where_clause']
     *
     * The identifiers of the WHERE clause are put into the array
     * ['where_clause_identifier']
     *
     * For a SELECT, the whole query without the ORDER BY clause is put into
     * ['unsorted_query']
     *
     * foreign keys
     * ------------
     * The CREATE TABLE may contain FOREIGN KEY clauses, so they get
     * analyzed and ['foreign_keys'] is an array filled with
     * the constraint name, the index list,
     * the REFERENCES table name and REFERENCES index list,
     * and ON UPDATE | ON DELETE clauses
     *
     * position_of_first_select
     * ------------------------
     *
     * The array index of the first SELECT we find. Will be used to
     * insert a SQL_CALC_FOUND_ROWS.
     *
     * create_table_fields
     * -------------------
     *
     * Used to detect the DEFAULT CURRENT_TIMESTAMP and
     * ON UPDATE CURRENT_TIMESTAMP clauses of the CREATE TABLE query.
     * Also used to store the default value of the field.
     * An array, each element is the identifier name.
     * Note that for now, the timestamp_not_null element is created
     * even for non-TIMESTAMP fields.
     *
     * Sub-elements: ['type'] which contains the column type
     *               optional (currently they are never false but can be absent):
     *               ['default_current_timestamp'] boolean
     *               ['on_update_current_timestamp'] boolean
     *               ['timestamp_not_null'] boolean
     *
     * section_before_limit, section_after_limit
     * -----------------------------------------
     *
     * Marks the point of the query where we can insert a LIMIT clause;
     * so the section_before_limit will contain the left part before
     * a possible LIMIT clause
     *
     *
     * End of description of analyzer results
     */

    // must be sorted
    // TODO: current logic checks for only one word, so I put only the
    // first word of the reserved expressions that end a table ref;
    // maybe this is not ok (the first word might mean something else)
    //        $words_ending_table_ref = array(
    //            'FOR UPDATE',
    //            'GROUP BY',
    //            'HAVING',
    //            'LIMIT',
    //            'LOCK IN SHARE MODE',
    //            'ORDER BY',
    //            'PROCEDURE',
    //            'UNION',
    //            'WHERE'
    //        );
    $words_ending_table_ref = array(
        'FOR' => 1,
        'GROUP' => 1,
        'HAVING' => 1,
        'LIMIT' => 1,
        'LOCK' => 1,
        'ORDER' => 1,
        'PROCEDURE' => 1,
        'UNION' => 1,
        'WHERE' => 1
    );

    $words_ending_clauses = array(
        'FOR' => 1,
        'LIMIT' => 1,
        'LOCK' => 1,
        'PROCEDURE' => 1,
        'UNION' => 1
    );

    $supported_query_types = array(
        'SELECT' => 1,
        /*
        // Support for these additional query types will come later on.
        'DELETE' => 1,
        'INSERT' => 1,
        'REPLACE' => 1,
        'TRUNCATE' => 1,
        'UPDATE' => 1,
        'EXPLAIN' => 1,
        'DESCRIBE' => 1,
        'SHOW' => 1,
        'CREATE' => 1,
        'SET' => 1,
        'ALTER' => 1
        */
    );

    // loop #1 for each token: select_expr, table_ref for SELECT

    for ($i = 0; $i < $size; $i++) {
        //DEBUG echo "Loop1 <strong>"  . $arr[$i]['data']
        //. "</strong> (" . $arr[$i]['type'] . ")<br />";

        // High speed seek for locating the end of the current query
        if ($seek_queryend == true) {
            if ($arr[$i]['type'] == 'punct_queryend') {
                $seek_queryend = false;
            } else {
                continue;
            } // end if (type == punct_queryend)
        } // end if ($seek_queryend)

        /**
         * Note: do not split if this is a punct_queryend for the first and only
         * query
         * @todo when we find a UNION, should we split in another subresult?
         */
        if ($arr[$i]['type'] == 'punct_queryend' && ($i + 1 != $size)) {
            $result[]  = $subresult;
            $subresult = $subresult_empty;
            continue;
        } // end if (type == punct_queryend)

        // ==============================================================
        if ($arr[$i]['type'] == 'punct_bracket_open_round') {
            $number_of_brackets++;
            if ($in_extract) {
                $number_of_brackets_in_extract++;
            }
            if ($in_group_concat) {
                $number_of_brackets_in_group_concat++;
            }
        }
        // ==============================================================
        if ($arr[$i]['type'] == 'punct_bracket_close_round') {
            $number_of_brackets--;
            if ($number_of_brackets == 0) {
                $in_subquery = false;
            }
            if ($in_extract) {
                $number_of_brackets_in_extract--;
                if ($number_of_brackets_in_extract == 0) {
                    $in_extract = false;
                }
            }
            if ($in_group_concat) {
                $number_of_brackets_in_group_concat--;
                if ($number_of_brackets_in_group_concat == 0) {
                    $in_group_concat = false;
                }
            }
        }

        if ($in_subquery) {
            /**
             * skip the subquery to avoid setting
             * select_expr or table_ref with the contents
             * of this subquery; this is to avoid a bug when
             * trying to edit the results of
             * select * from child where not exists (select id from
             * parent where child.parent_id = parent.id);
             */
            continue;
        }
        // ==============================================================
        if ($arr[$i]['type'] == 'alpha_functionName') {
            $upper_data = strtoupper($arr[$i]['data']);
            if ($upper_data =='EXTRACT') {
                $in_extract = true;
                $number_of_brackets_in_extract = 0;
            }
            if ($upper_data =='GROUP_CONCAT') {
                $in_group_concat = true;
                $number_of_brackets_in_group_concat = 0;
            }
        }

        // ==============================================================
        if ($arr[$i]['type'] == 'alpha_reservedWord') {
            // We don't know what type of query yet, so run this
            if ($subresult['querytype'] == '') {
                $subresult['querytype'] = strtoupper($arr[$i]['data']);
            } // end if (querytype was empty)

            // Check if we support this type of query
            if (!isset($supported_query_types[$subresult['querytype']])) {
                // Skip ahead to the next one if we don't
                $seek_queryend = true;
                continue;
            } // end if (query not supported)

            // upper once
            $upper_data = strtoupper($arr[$i]['data']);
            /**
             * @todo reset for each query?
             */

            if ($upper_data == 'SELECT') {
                if ($number_of_brackets > 0) {
                    $in_subquery = true;
                    $seen_subquery = true;
                    // this is a subquery so do not analyze inside it
                    continue;
                }
                $seen_from = false;
                $previous_was_identifier = false;
                $current_select_expr = -1;
                $seen_end_of_table_ref = false;
            } // end if (data == SELECT)

            if ($upper_data =='FROM' && !$in_extract) {
                $current_table_ref = -1;
                $seen_from = true;
                $previous_was_identifier = false;
                $save_table_ref = true;
            } // end if (data == FROM)

            // here, do not 'continue' the loop, as we have more work for
            // reserved words below
        } // end if (type == alpha_reservedWord)

        // ==============================
        if ($arr[$i]['type'] == 'quote_backtick'
            || $arr[$i]['type'] == 'quote_double'
            || $arr[$i]['type'] == 'quote_single'
            || $arr[$i]['type'] == 'alpha_identifier'
            || ($arr[$i]['type'] == 'alpha_reservedWord'
            && $arr[$i]['forbidden'] == false)
        ) {
            switch ($arr[$i]['type']) {
            case 'alpha_identifier':
            case 'alpha_reservedWord':
                /**
                 * this is not a real reservedWord, because it's not
                 * present in the list of forbidden words, for example
                 * "storage" which can be used as an identifier
                 *
                 * @todo avoid the pretty printing in color in this case
                 */
                $identifier = $arr[$i]['data'];
                break;

            case 'quote_backtick':
            case 'quote_double':
            case 'quote_single':
                $identifier = PMA_Util::unQuote($arr[$i]['data']);
                break;
            } // end switch

            if ($subresult['querytype'] == 'SELECT'
                && ! $in_group_concat
                && ! ($seen_subquery && $arr[$i - 1]['type'] == 'punct_bracket_close_round')
            ) {
                if (!$seen_from) {
                    if ($previous_was_identifier && isset($chain)) {
                        // found alias for this select_expr, save it
                        // but only if we got something in $chain
                        // (for example, SELECT COUNT(*) AS cnt
                        // puts nothing in $chain, so we avoid
                        // setting the alias)
                        $alias_for_select_expr = $identifier;
                    } else {
                        $chain[] = $identifier;
                        $previous_was_identifier = true;

                    } // end if !$previous_was_identifier
                } else {
                    // ($seen_from)
                    if ($save_table_ref && !$seen_end_of_table_ref) {
                        if ($previous_was_identifier) {
                            // found alias for table ref
                            // save it for later
                            $alias_for_table_ref = $identifier;
                        } else {
                            $chain[] = $identifier;
                            $previous_was_identifier = true;

                        } // end if ($previous_was_identifier)
                    } // end if ($save_table_ref &&!$seen_end_of_table_ref)
                } // end if (!$seen_from)
            } // end if (querytype SELECT)
        } // end if (quote_backtick or double quote or alpha_identifier)

        // ===================================
        if ($arr[$i]['type'] == 'punct_qualifier') {
            // to be able to detect an identifier following another
            $previous_was_identifier = false;
            continue;
        } // end if (punct_qualifier)

        /**
         * @todo check if 3 identifiers following one another -> error
         */

        //    s a v e    a    s e l e c t    e x p r
        // finding a list separator or FROM
        // means that we must save the current chain of identifiers
        // into a select expression

        // for now, we only save a select expression if it contains
        // at least one identifier, as we are interested in checking
        // the columns and table names, so in "select * from persons",
        // the "*" is not saved

        if (isset($chain) && !$seen_end_of_table_ref
            && ((!$seen_from && $arr[$i]['type'] == 'punct_listsep')
            || ($arr[$i]['type'] == 'alpha_reservedWord' && $upper_data == 'FROM'))
        ) {
            $size_chain = count($chain);
            $current_select_expr++;
            $subresult['select_expr'][$current_select_expr] = array(
              'expr' => '',
              'alias' => '',
              'db'   => '',
              'table_name' => '',
              'table_true_name' => '',
              'column' => ''
             );

            if (isset($alias_for_select_expr) && strlen($alias_for_select_expr)) {
                // we had found an alias for this select expression
                $subresult['select_expr'][$current_select_expr]['alias'] = $alias_for_select_expr;
                unset($alias_for_select_expr);
            }
            // there is at least a column
            $subresult['select_expr'][$current_select_expr]['column'] = $chain[$size_chain - 1];
            $subresult['select_expr'][$current_select_expr]['expr'] = $chain[$size_chain - 1];

            // maybe a table
            if ($size_chain > 1) {
                $subresult['select_expr'][$current_select_expr]['table_name'] = $chain[$size_chain - 2];
                // we assume for now that this is also the true name
                $subresult['select_expr'][$current_select_expr]['table_true_name'] = $chain[$size_chain - 2];
                $subresult['select_expr'][$current_select_expr]['expr']
                    = $subresult['select_expr'][$current_select_expr]['table_name']
                    . '.' . $subresult['select_expr'][$current_select_expr]['expr'];
            } // end if ($size_chain > 1)

            // maybe a db
            if ($size_chain > 2) {
                $subresult['select_expr'][$current_select_expr]['db'] = $chain[$size_chain - 3];
                $subresult['select_expr'][$current_select_expr]['expr']
                    = $subresult['select_expr'][$current_select_expr]['db']
                    . '.' . $subresult['select_expr'][$current_select_expr]['expr'];
            } // end if ($size_chain > 2)
            unset($chain);

            /**
             * @todo explain this:
             */
            if (($arr[$i]['type'] == 'alpha_reservedWord')
                && ($upper_data != 'FROM')
            ) {
                $previous_was_identifier = true;
            }

        } // end if (save a select expr)


        //======================================
        //    s a v e    a    t a b l e    r e f
        //======================================

        // maybe we just saw the end of table refs
        // but the last table ref has to be saved
        // or we are at the last token
        // or we just got a reserved word
        /**
         * @todo there could be another query after this one
         */

        if (isset($chain) && $seen_from && $save_table_ref
            && ($arr[$i]['type'] == 'punct_listsep'
            || ($arr[$i]['type'] == 'alpha_reservedWord' && $upper_data != "AS")
            || $seen_end_of_table_ref
            || $i == $size - 1)
        ) {

            $size_chain = count($chain);
            $current_table_ref++;
            $subresult['table_ref'][$current_table_ref] = array(
              'expr'            => '',
              'db'              => '',
              'table_name'      => '',
              'table_alias'     => '',
              'table_true_name' => ''
             );
            if (isset($alias_for_table_ref) && strlen($alias_for_table_ref)) {
                $subresult['table_ref'][$current_table_ref]['table_alias'] = $alias_for_table_ref;
                unset($alias_for_table_ref);
            }
            $subresult['table_ref'][$current_table_ref]['table_name'] = $chain[$size_chain - 1];
            // we assume for now that this is also the true name
            $subresult['table_ref'][$current_table_ref]['table_true_name'] = $chain[$size_chain - 1];
            $subresult['table_ref'][$current_table_ref]['expr']
                = $subresult['table_ref'][$current_table_ref]['table_name'];
            // maybe a db
            if ($size_chain > 1) {
                $subresult['table_ref'][$current_table_ref]['db'] = $chain[$size_chain - 2];
                $subresult['table_ref'][$current_table_ref]['expr']
                    = $subresult['table_ref'][$current_table_ref]['db']
                    . '.' . $subresult['table_ref'][$current_table_ref]['expr'];
            } // end if ($size_chain > 1)

            // add the table alias into the whole expression
            $subresult['table_ref'][$current_table_ref]['expr']
             .= ' ' . $subresult['table_ref'][$current_table_ref]['table_alias'];

            unset($chain);
            $previous_was_identifier = true;
            //continue;

        } // end if (save a table ref)


        // when we have found all table refs,
        // for each table_ref alias, put the true name of the table
        // in the corresponding select expressions

        if (isset($current_table_ref)
            && ($seen_end_of_table_ref || $i == $size-1)
            && $subresult != $subresult_empty
        ) {
            for ($tr=0; $tr <= $current_table_ref; $tr++) {
                $alias = $subresult['table_ref'][$tr]['table_alias'];
                $truename = $subresult['table_ref'][$tr]['table_true_name'];
                for ($se=0; $se <= $current_select_expr; $se++) {
                    if (isset($alias)
                        && strlen($alias)
                        && $subresult['select_expr'][$se]['table_true_name'] == $alias
                    ) {
                        $subresult['select_expr'][$se]['table_true_name'] = $truename;
                    } // end if (found the alias)
                } // end for (select expressions)

            } // end for (table refs)
        } // end if (set the true names)


        // e n d i n g    l o o p  #1
        // set the $previous_was_identifier to false if the current
        // token is not an identifier
        if (($arr[$i]['type'] != 'alpha_identifier')
            && ($arr[$i]['type'] != 'quote_double')
            && ($arr[$i]['type'] != 'quote_single')
            && ($arr[$i]['type'] != 'quote_backtick')
        ) {
            $previous_was_identifier = false;
        } // end if

        // however, if we are on AS, we must keep the $previous_was_identifier
        if (($arr[$i]['type'] == 'alpha_reservedWord')
            && ($upper_data == 'AS')
        ) {
            $previous_was_identifier = true;
        }

        if (($arr[$i]['type'] == 'alpha_reservedWord')
            && ($upper_data =='ON' || $upper_data =='USING')
        ) {
            $save_table_ref = false;
        } // end if (data == ON)

        if (($arr[$i]['type'] == 'alpha_reservedWord')
            && ($upper_data =='JOIN' || $upper_data =='FROM')
        ) {
            $save_table_ref = true;
        } // end if (data == JOIN)

        /**
         * no need to check the end of table ref if we already did
         *
         * @todo maybe add "&& $seen_from"
         */
        if (!$seen_end_of_table_ref) {
            // if this is the last token, it implies that we have
            // seen the end of table references
            // Check for the end of table references
            //
            // Note: if we are analyzing a GROUP_CONCAT clause,
            // we might find a word that seems to indicate that
            // we have found the end of table refs (like ORDER)
            // but it's a modifier of the GROUP_CONCAT so
            // it's not the real end of table refs
            if (($i == $size-1)
                || ($arr[$i]['type'] == 'alpha_reservedWord'
                && !$in_group_concat
                && isset($words_ending_table_ref[$upper_data]))
            ) {
                $seen_end_of_table_ref = true;
                // to be able to save the last table ref, but do not
                // set it true if we found a word like "ON" that has
                // already set it to false
                if (isset($save_table_ref) && $save_table_ref != false) {
                    $save_table_ref = true;
                } //end if

            } // end if (check for end of table ref)
        } //end if (!$seen_end_of_table_ref)

        if ($seen_end_of_table_ref) {
            $save_table_ref = false;
        } // end if

    } // end for $i (loop #1)

    //DEBUG
    /*
      if (isset($current_select_expr)) {
       for ($trace=0; $trace<=$current_select_expr; $trace++) {
           echo "<br />";
           reset ($subresult['select_expr'][$trace]);
           while (list ($key, $val) = each ($subresult['select_expr'][$trace]))
               echo "sel expr $trace $key => $val<br />\n";
           }
      }

      if (isset($current_table_ref)) {
       echo "current_table_ref = " . $current_table_ref . "<br>";
       for ($trace=0; $trace<=$current_table_ref; $trace++) {

           echo "<br />";
           reset ($subresult['table_ref'][$trace]);
           while (list ($key, $val) = each ($subresult['table_ref'][$trace]))
           echo "table ref $trace $key => $val<br />\n";
           }
      }
    */
    // -------------------------------------------------------


    // loop #2: - queryflags
    //          - querytype (for queries != 'SELECT')
    //          - section_before_limit, section_after_limit
    //
    // we will also need this queryflag in loop 2
    // so set it here
    if (isset($current_table_ref) && $current_table_ref > -1) {
        $subresult['queryflags']['select_from'] = 1;
    }

    $section_before_limit = '';
    $section_after_limit = ''; // truly the section after the limit clause
    $seen_reserved_word = false;
    $seen_group = false;
    $seen_order = false;
    $seen_order_by = false;
    $in_group_by = false; // true when we are inside the GROUP BY clause
    $in_order_by = false; // true when we are inside the ORDER BY clause
    $in_having = false; // true when we are inside the HAVING clause
    $in_select_expr = false; // true when we are inside the select expr clause
    $in_where = false; // true when we are inside the WHERE clause
    $seen_limit = false; // true if we have seen a LIMIT clause
    $in_limit = false; // true when we are inside the LIMIT clause
    $after_limit = false; // true when we are after the LIMIT clause
    $in_from = false; // true when we are in the FROM clause
    $in_group_concat = false;
    $first_reserved_word = '';
    $current_identifier = '';
    $unsorted_query = $arr['raw']; // in case there is no ORDER BY
    $number_of_brackets = 0;
    $in_subquery = false;

    for ($i = 0; $i < $size; $i++) {
        //DEBUG echo "Loop2 <strong>"  . $arr[$i]['data']
        //. "</strong> (" . $arr[$i]['type'] . ")<br />";

        // need_confirm
        //
        // check for reserved words that will have to generate
        // a confirmation request later in sql.php
        // the cases are:
        //   DROP TABLE
        //   DROP DATABASE
        //   ALTER TABLE... DROP
        //   DELETE FROM...
        //
        // this code is not used for confirmations coming from functions.js

        if ($arr[$i]['type'] == 'punct_bracket_open_round') {
            $number_of_brackets++;
        }

        if ($arr[$i]['type'] == 'punct_bracket_close_round') {
            $number_of_brackets--;
            if ($number_of_brackets == 0) {
                $in_subquery = false;
            }
        }

        if ($arr[$i]['type'] == 'alpha_reservedWord') {
            $upper_data = strtoupper($arr[$i]['data']);

            if ($upper_data == 'SELECT' && $number_of_brackets > 0) {
                $in_subquery = true;
            }

            if (!$seen_reserved_word) {
                $first_reserved_word = $upper_data;
                $subresult['querytype'] = $upper_data;
                $seen_reserved_word = true;

                // if the first reserved word is DROP or DELETE,
                // we know this is a query that needs to be confirmed
                if ($first_reserved_word=='DROP'
                    || $first_reserved_word == 'DELETE'
                    || $first_reserved_word == 'TRUNCATE'
                ) {
                    $subresult['queryflags']['need_confirm'] = 1;
                }

                if ($first_reserved_word=='SELECT') {
                    $position_of_first_select = $i;
                }

            } else {
                if ($upper_data == 'DROP' && $first_reserved_word == 'ALTER') {
                    $subresult['queryflags']['need_confirm'] = 1;
                }
            }

            if ($upper_data == 'LIMIT' && ! $in_subquery) {
                $section_before_limit = substr($arr['raw'], 0, $arr[$i]['pos'] - 5);
                $in_limit = true;
                $seen_limit = true;
                $limit_clause = '';
                $in_order_by = false; // @todo maybe others to set false
            }

            if ($upper_data == 'PROCEDURE') {
                $subresult['queryflags']['procedure'] = 1;
                $in_limit = false;
                $after_limit = true;
            }
            /**
             * @todo set also to false if we find FOR UPDATE or LOCK IN SHARE MODE
             */
            if ($upper_data == 'SELECT') {
                $in_select_expr = true;
                $select_expr_clause = '';
            }
            if ($upper_data == 'DISTINCT' && !$in_group_concat) {
                $subresult['queryflags']['distinct'] = 1;
            }

            if ($upper_data == 'UNION') {
                $subresult['queryflags']['union'] = 1;
            }

            if ($upper_data == 'JOIN') {
                $subresult['queryflags']['join'] = 1;
            }

            if ($upper_data == 'OFFSET') {
                $subresult['queryflags']['offset'] = 1;
            }

            // if this is a real SELECT...FROM
            if ($upper_data == 'FROM'
                && isset($subresult['queryflags']['select_from'])
                && $subresult['queryflags']['select_from'] == 1
            ) {
                $in_from = true;
                $from_clause = '';
                $in_select_expr = false;
            }


            // (we could have less resetting of variables to false
            // if we trust that the query respects the standard
            // MySQL order for clauses)

            // we use $seen_group and $seen_order because we are looking
            // for the BY
            if ($upper_data == 'GROUP') {
                $seen_group = true;
                $seen_order = false;
                $in_having = false;
                $in_order_by = false;
                $in_where = false;
                $in_select_expr = false;
                $in_from = false;
            }
            if ($upper_data == 'ORDER' && !$in_group_concat) {
                $seen_order = true;
                $seen_group = false;
                $in_having = false;
                $in_group_by = false;
                $in_where = false;
                $in_select_expr = false;
                $in_from = false;
            }
            if ($upper_data == 'HAVING') {
                $in_having = true;
                $having_clause = '';
                $seen_group = false;
                $seen_order = false;
                $in_group_by = false;
                $in_order_by = false;
                $in_where = false;
                $in_select_expr = false;
                $in_from = false;
            }

            if ($upper_data == 'WHERE') {
                $in_where = true;
                $where_clause = '';
                $where_clause_identifiers = array();
                $seen_group = false;
                $seen_order = false;
                $in_group_by = false;
                $in_order_by = false;
                $in_having = false;
                $in_select_expr = false;
                $in_from = false;
            }

            if ($upper_data == 'BY') {
                if ($seen_group) {
                    $in_group_by = true;
                    $group_by_clause = '';
                }
                if ($seen_order) {
                    $seen_order_by = true;
                    // Here we assume that the ORDER BY keywords took
                    // exactly 8 characters.
                    // We use PMA_substr() to be charset-safe; otherwise
                    // if the table name contains accents, the unsorted
                    // query would be missing some characters.
                    $unsorted_query = PMA_substr(
                        $arr['raw'], 0, $arr[$i]['pos'] - 8
                    );
                    $in_order_by = true;
                    $order_by_clause = '';
                }
            }

            // if we find one of the words that could end the clause
            if (isset($words_ending_clauses[$upper_data])) {

                $in_group_by = false;
                $in_order_by = false;
                $in_having   = false;
                $in_where    = false;
                $in_select_expr = false;
                $in_from = false;
            }

        } // endif (reservedWord)


        // do not add a space after a function name
        /**
         * @todo can we combine loop 2 and loop 1? some code is repeated here...
         */

        $sep = ' ';
        if ($arr[$i]['type'] == 'alpha_functionName') {
            $sep='';
            $upper_data = strtoupper($arr[$i]['data']);
            if ($upper_data =='GROUP_CONCAT') {
                $in_group_concat = true;
                $number_of_brackets_in_group_concat = 0;
            }
        }

        if ($arr[$i]['type'] == 'punct_bracket_open_round') {
            if ($in_group_concat) {
                $number_of_brackets_in_group_concat++;
            }
        }
        if ($arr[$i]['type'] == 'punct_bracket_close_round') {
            if ($in_group_concat) {
                $number_of_brackets_in_group_concat--;
                if ($number_of_brackets_in_group_concat == 0) {
                    $in_group_concat = false;
                }
            }
        }

        // do not add a space after an identifier if followed by a dot
        if ($arr[$i]['type'] == 'alpha_identifier'
            && $i < $size - 1 && $arr[$i + 1]['data'] == '.'
        ) {
            $sep = '';
        }

        // do not add a space after a dot if followed by an identifier
        if ($arr[$i]['data'] == '.' && $i < $size - 1
            && $arr[$i + 1]['type'] == 'alpha_identifier'
        ) {
            $sep = '';
        }

        if ($in_select_expr && $upper_data != 'SELECT'
            && $upper_data != 'DISTINCT'
        ) {
            $select_expr_clause .= $arr[$i]['data'] . $sep;
        }
        if ($in_from && $upper_data != 'FROM') {
            $from_clause .= $arr[$i]['data'] . $sep;
        }
        if ($in_group_by && $upper_data != 'GROUP' && $upper_data != 'BY') {
            $group_by_clause .= $arr[$i]['data'] . $sep;
        }
        if ($in_order_by && $upper_data != 'ORDER' && $upper_data != 'BY') {
            // add a space only before ASC or DESC
            // not around the dot between dbname and tablename
            if ($arr[$i]['type'] == 'alpha_reservedWord') {
                $order_by_clause .= $sep;
            }
            $order_by_clause .= $arr[$i]['data'];
        }
        if ($in_having && $upper_data != 'HAVING') {
            $having_clause .= $arr[$i]['data'] . $sep;
        }
        if ($in_where && $upper_data != 'WHERE') {
            $where_clause .= $arr[$i]['data'] . $sep;

            if (($arr[$i]['type'] == 'quote_backtick')
                || ($arr[$i]['type'] == 'alpha_identifier')
            ) {
                $where_clause_identifiers[] = $arr[$i]['data'];
            }
        }

        // to grab the rest of the query after the ORDER BY clause
        if (isset($subresult['queryflags']['select_from'])
            && $subresult['queryflags']['select_from'] == 1
            && ! $in_order_by
            && $seen_order_by
            && $upper_data != 'BY'
        ) {
            $unsorted_query .= $arr[$i]['data'];
            if ($arr[$i]['type'] != 'punct_bracket_open_round'
                && $arr[$i]['type'] != 'punct_bracket_close_round'
                && $arr[$i]['type'] != 'punct'
            ) {
                $unsorted_query .= $sep;
            }
        }

        if ($in_limit) {
            if ($upper_data == 'OFFSET') {
                $limit_clause .= $sep;
            }
            $limit_clause .= $arr[$i]['data'];
            if ($upper_data == 'LIMIT' || $upper_data == 'OFFSET') {
                $limit_clause .= $sep;
            }
        }
        if ($after_limit && $seen_limit) {
            $section_after_limit .= $arr[$i]['data'] . $sep;
        }

        // clear $upper_data for next iteration
        $upper_data='';
    } // end for $i (loop #2)
    if (empty($section_before_limit)) {
        $section_before_limit = $arr['raw'];
    }

    // -----------------------------------------------------
    // loop #3: foreign keys and MySQL 4.1.2+ TIMESTAMP options
    // (for now, check only the first query)
    // (for now, identifiers are assumed to be backquoted)

    // If we find that we are dealing with a CREATE TABLE query,
    // we look for the next punct_bracket_open_round, which
    // introduces the fields list. Then, when we find a
    // quote_backtick, it must be a field, so we put it into
    // the create_table_fields array. Even if this field is
    // not a timestamp, it will be useful when logic has been
    // added for complete field attributes analysis.

    $seen_foreign = false;
    $seen_references = false;
    $seen_constraint = false;
    $foreign_key_number = -1;
    $seen_create_table = false;
    $seen_create = false;
    $seen_alter = false;
    $in_create_table_fields = false;
    $brackets_level = 0;
    $in_timestamp_options = false;
    $seen_default = false;

    for ($i = 0; $i < $size; $i++) {
        if ($arr[$i]['type'] == 'alpha_reservedWord') {
            $upper_data = strtoupper($arr[$i]['data']);

            if ($upper_data == 'NOT' && $in_timestamp_options) {
                $create_table_fields[$current_identifier]['timestamp_not_null'] = true;

            }

            if ($upper_data == 'CREATE') {
                $seen_create = true;
            }

            if ($upper_data == 'ALTER') {
                $seen_alter = true;
            }

            if ($upper_data == 'TABLE' && $seen_create) {
                $seen_create_table = true;
                $create_table_fields = array();
            }

            if ($upper_data == 'CURRENT_TIMESTAMP') {
                if ($in_timestamp_options) {
                    if ($seen_default) {
                        $create_table_fields[$current_identifier]['default_current_timestamp'] = true;
                    }
                }
            }

            if ($upper_data == 'CONSTRAINT') {
                $foreign_key_number++;
                $seen_foreign = false;
                $seen_references = false;
                $seen_constraint = true;
            }
            if ($upper_data == 'FOREIGN') {
                $seen_foreign = true;
                $seen_references = false;
                $seen_constraint = false;
            }
            if ($upper_data == 'REFERENCES') {
                $seen_foreign = false;
                $seen_references = true;
                $seen_constraint = false;
            }


            // Cases covered:

            // [ON DELETE {CASCADE | SET NULL | NO ACTION | RESTRICT}]
            // [ON UPDATE {CASCADE | SET NULL | NO ACTION | RESTRICT}]

            // but we set ['on_delete'] or ['on_cascade'] to
            // CASCADE | SET_NULL | NO_ACTION | RESTRICT

            // ON UPDATE CURRENT_TIMESTAMP

            if ($upper_data == 'ON') {
                if (isset($arr[$i+1]) && $arr[$i+1]['type'] == 'alpha_reservedWord') {
                    $second_upper_data = strtoupper($arr[$i+1]['data']);
                    if ($second_upper_data == 'DELETE') {
                        $clause = 'on_delete';
                    }
                    if ($second_upper_data == 'UPDATE') {
                        $clause = 'on_update';
                    }
                    if (isset($clause)
                        && ($arr[$i+2]['type'] == 'alpha_reservedWord'
                        // ugly workaround because currently, NO is not
                        // in the list of reserved words in sqlparser.data
                        // (we got a bug report about not being able to use
                        // 'no' as an identifier)
                        || ($arr[$i+2]['type'] == 'alpha_identifier'
                        && strtoupper($arr[$i+2]['data'])=='NO'))
                    ) {
                        $third_upper_data = strtoupper($arr[$i+2]['data']);
                        if ($third_upper_data == 'CASCADE'
                            || $third_upper_data == 'RESTRICT'
                        ) {
                            $value = $third_upper_data;
                        } elseif ($third_upper_data == 'SET'
                            || $third_upper_data == 'NO'
                        ) {
                            if ($arr[$i+3]['type'] == 'alpha_reservedWord') {
                                $value = $third_upper_data . '_' . strtoupper($arr[$i+3]['data']);
                            }
                        } elseif ($third_upper_data == 'CURRENT_TIMESTAMP') {
                            if ($clause == 'on_update'
                                && $in_timestamp_options
                            ) {
                                $create_table_fields[$current_identifier]['on_update_current_timestamp'] = true;
                                $seen_default = false;
                            }

                        } else {
                            $value = '';
                        }
                        if (!empty($value)) {
                            $foreign[$foreign_key_number][$clause] = $value;
                        }
                        unset($clause);
                    } // endif (isset($clause))
                }
            }

        } // end of reserved words analysis


        if ($arr[$i]['type'] == 'punct_bracket_open_round') {
            $brackets_level++;
            if ($seen_create_table && $brackets_level == 1) {
                $in_create_table_fields = true;
            }
        }


        if ($arr[$i]['type'] == 'punct_bracket_close_round') {
            $brackets_level--;
            if ($seen_references) {
                $seen_references = false;
            }
            if ($seen_create_table && $brackets_level == 0) {
                $in_create_table_fields = false;
            }
        }

        if (($arr[$i]['type'] == 'alpha_columnAttrib')) {
            $upper_data = strtoupper($arr[$i]['data']);
            if ($seen_create_table && $in_create_table_fields) {
                if ($upper_data == 'DEFAULT') {
                    $seen_default = true;
                    $create_table_fields[$current_identifier]['default_value'] = $arr[$i + 1]['data'];
                }
            }
        }

        /**
         * @see @todo 2005-10-16 note: the "or" part here is a workaround for a bug
         */
        if (($arr[$i]['type'] == 'alpha_columnType')
            || ($arr[$i]['type'] == 'alpha_functionName' && $seen_create_table)
        ) {
            $upper_data = strtoupper($arr[$i]['data']);
            if ($seen_create_table && $in_create_table_fields
                && isset($current_identifier)
            ) {
                $create_table_fields[$current_identifier]['type'] = $upper_data;
                if ($upper_data == 'TIMESTAMP') {
                    $arr[$i]['type'] = 'alpha_columnType';
                    $in_timestamp_options = true;
                } else {
                    $in_timestamp_options = false;
                    if ($upper_data == 'CHAR') {
                        $arr[$i]['type'] = 'alpha_columnType';
                    }
                }
            }
        }


        if ($arr[$i]['type'] == 'quote_backtick'
            || $arr[$i]['type'] == 'alpha_identifier'
        ) {

            if ($arr[$i]['type'] == 'quote_backtick') {
                // remove backquotes
                $identifier = PMA_Util::unQuote($arr[$i]['data']);
            } else {
                $identifier = $arr[$i]['data'];
            }

            if ($seen_create_table && $in_create_table_fields) {
                $current_identifier = $identifier;
                // we set this one even for non TIMESTAMP type
                $create_table_fields[$current_identifier]['timestamp_not_null'] = false;
            }

            if ($seen_constraint) {
                $foreign[$foreign_key_number]['constraint'] = $identifier;
            }

            if ($seen_foreign && $brackets_level > 0) {
                $foreign[$foreign_key_number]['index_list'][] = $identifier;
            }

            if ($seen_references) {
                if ($seen_alter && $brackets_level > 0) {
                    $foreign[$foreign_key_number]['ref_index_list'][] = $identifier;
                    // here, the first bracket level corresponds to the
                    // bracket of CREATE TABLE
                    // so if we are on level 2, it must be the index list
                    // of the foreign key REFERENCES
                } elseif ($brackets_level > 1) {
                    $foreign[$foreign_key_number]['ref_index_list'][] = $identifier;
                } elseif ($arr[$i+1]['type'] == 'punct_qualifier') {
                    // identifier is `db`.`table`
                    // the first pass will pick the db name
                    // the next pass will pick the table name
                    $foreign[$foreign_key_number]['ref_db_name'] = $identifier;
                } else {
                    // identifier is `table`
                    $foreign[$foreign_key_number]['ref_table_name'] = $identifier;
                }
            }
        }
    } // end for $i (loop #3)


    // Fill the $subresult array

    if (isset($create_table_fields)) {
        $subresult['create_table_fields'] = $create_table_fields;
    }

    if (isset($foreign)) {
        $subresult['foreign_keys'] = $foreign;
    }

    if (isset($select_expr_clause)) {
        $subresult['select_expr_clause'] = $select_expr_clause;
    }
    if (isset($from_clause)) {
        $subresult['from_clause'] = $from_clause;
    }
    if (isset($group_by_clause)) {
        $subresult['group_by_clause'] = $group_by_clause;
    }
    if (isset($order_by_clause)) {
        $subresult['order_by_clause'] = $order_by_clause;
    }
    if (isset($having_clause)) {
        $subresult['having_clause'] = $having_clause;
    }
    if (isset($limit_clause)) {
        $subresult['limit_clause'] = $limit_clause;
    }
    if (isset($where_clause)) {
        $subresult['where_clause'] = $where_clause;
    }
    if (isset($unsorted_query) && !empty($unsorted_query)) {
        $subresult['unsorted_query'] = $unsorted_query;
    }
    if (isset($where_clause_identifiers)) {
        $subresult['where_clause_identifiers'] = $where_clause_identifiers;
    }

    if (isset($position_of_first_select)) {
        $subresult['position_of_first_select'] = $position_of_first_select;
        $subresult['section_before_limit'] = $section_before_limit;
        $subresult['section_after_limit'] = $section_after_limit;
    }

    // They are naughty and didn't have a trailing semi-colon,
    // then still handle it properly
    if ($subresult['querytype'] != '') {
        $result[] = $subresult;
    }
    return $result;
} // end of the "PMA_SQP_analyze()" function


/**
 * Colorizes SQL queries html formatted
 *
 * @param array $arr The SQL queries html formatted
 *
 * @return array   The colorized SQL queries
 *
 * @todo check why adding a "\n" after the </span> would cause extra blanks
 * to be displayed: SELECT p . person_name
 *
 * @access public
 */
function PMA_SQP_formatHtml_colorize($arr)
{
    $i         = PMA_strpos($arr['type'], '_');
    $class     = '';
    if ($i > 0) {
        $class = 'syntax_' . PMA_substr($arr['type'], 0, $i) . ' ';
    }

    $class     .= 'syntax_' . $arr['type'];

    return '<span class="' . $class . '">'
        . htmlspecialchars($arr['data']) . '</span>';
} // end of the "PMA_SQP_formatHtml_colorize()" function


/**
 * Formats SQL queries to html
 *
 * @param array   $arr              The SQL queries
 * @param string  $mode             mode of printing
 * @param integer $start_token      starting token
 * @param integer $number_of_tokens number of tokens to format, -1 = all
 *
 * @return string  The formatted SQL queries
 *
 * @access public
 */
function PMA_SQP_formatHtml(
    $arr, $mode='color', $start_token=0,
    $number_of_tokens=-1
) {
    global $PMA_SQPdata_operators_docs, $PMA_SQPdata_functions_docs;

    //DEBUG echo 'in Format<pre>'; print_r($arr); echo '</pre>';
    // then check for an array
    if (! is_array($arr)) {
        return htmlspecialchars($arr);
    }
    // first check for the SQL parser having hit an error
    if (PMA_SQP_isError()) {
        return htmlspecialchars($arr['raw']);
    }
    // else do it properly
    switch ($mode) {
    case 'color':
        $str                                = '<span class="syntax">';
        $html_line_break                    = '<br />';
        $docu                               = true;
        break;
    case 'query_only':
        $str                                = '';
        $html_line_break                    = "\n";
        $docu                               = false;
        break;
    case 'text':
        $str                                = '';
        $html_line_break                    = '<br />';
        $docu                               = true;
        break;
    } // end switch
    // inner_sql is a span that exists for all cases, except query_only
    // of $cfg['SQP']['fmtType'] to make possible a replacement
    // for inline editing
    if ($mode!='query_only') {
        $str .= '<span class="inner_sql">';
    }
    $close_docu_link = false;
    $indent                                     = 0;
    $bracketlevel                               = 0;
    $functionlevel                              = 0;
    $infunction                                 = false;
    $space_punct_listsep                        = ' ';
    $space_punct_listsep_function_name          = ' ';
    // $space_alpha_reserved_word = '<br />'."\n";
    $space_alpha_reserved_word                  = ' ';

    $keywords_with_brackets_1before            = array(
        'INDEX' => 1,
        'KEY' => 1,
        'ON' => 1,
        'USING' => 1
    );

    $keywords_with_brackets_2before            = array(
        'IGNORE' => 1,
        'INDEX' => 1,
        'INTO' => 1,
        'KEY' => 1,
        'PRIMARY' => 1,
        'PROCEDURE' => 1,
        'REFERENCES' => 1,
        'UNIQUE' => 1,
        'USE' => 1
    );

    // These reserved words do NOT get a newline placed near them.
    $keywords_no_newline               = array(
        'AS' => 1,
        'ASC' => 1,
        'DESC' => 1,
        'DISTINCT' => 1,
        'DUPLICATE' => 1,
        'HOUR' => 1,
        'INTERVAL' => 1,
        'IS' => 1,
        'LIKE' => 1,
        'NOT' => 1,
        'NULL' => 1,
        'ON' => 1,
        'REGEXP' => 1
    );

    // These reserved words introduce a privilege list
    $keywords_priv_list                = array(
        'GRANT' => 1,
        'REVOKE' => 1
    );

    if ($number_of_tokens == -1) {
        $number_of_tokens = $arr['len'];
    }
    $typearr   = array();
    if ($number_of_tokens >= 0) {
        $typearr[0] = '';
        $typearr[1] = '';
        $typearr[2] = '';
        $typearr[3] = $arr[$start_token]['type'];
    }

    $in_priv_list = false;
    for ($i = $start_token; $i < $number_of_tokens; $i++) {
        // DEBUG echo "Loop format <strong>" . $arr[$i]['data']
        // . "</strong> " . $arr[$i]['type'] . "<br />";
        $before = '';
        $after  = '';
        // array_shift($typearr);
        /*
        0 prev2
        1 prev
        2 current
        3 next
        */
        if (($i + 1) < $number_of_tokens) {
            $typearr[4] = $arr[$i + 1]['type'];
        } else {
            $typearr[4] = '';
        }

        for ($j=0; $j<4; $j++) {
            $typearr[$j] = $typearr[$j + 1];
        }

        switch ($typearr[2]) {
        case 'alpha_bitfield_constant_introducer':
            $before     = ' ';
            $after      = '';
            break;
        case 'white_newline':
            $before     = '';
            break;
        case 'punct_bracket_open_round':
            $bracketlevel++;
            $infunction = false;
            $keyword_brackets_2before = isset(
                $keywords_with_brackets_2before[strtoupper($arr[$i - 2]['data'])]
            );
            $keyword_brackets_1before = isset(
                $keywords_with_brackets_1before[strtoupper($arr[$i - 1]['data'])]
            );
            // Make sure this array is sorted!
            if (($typearr[1] == 'alpha_functionName')
                || ($typearr[1] == 'alpha_columnType') || ($typearr[1] == 'punct')
                || ($typearr[3] == 'digit_integer') || ($typearr[3] == 'digit_hex')
                || ($typearr[3] == 'digit_float')
                || ($typearr[0] == 'alpha_reservedWord' && $keyword_brackets_2before)
                || ($typearr[1] == 'alpha_reservedWord' && $keyword_brackets_1before)
            ) {
                $functionlevel++;
                $infunction = true;
                $after      .= ' ';
            } else {
                $indent++;
                if ($mode != 'query_only') {
                    $after .= '<div class="syntax_indent' . $indent . '">';
                } else {
                    $after .= ' ';
                }
            }
            break;
        case 'alpha_identifier':
            if (($typearr[1] == 'punct_qualifier')
                || ($typearr[3] == 'punct_qualifier')
            ) {
                $after      = '';
                $before     = '';
            }
            // for example SELECT 1 somealias
            if ($typearr[1] == 'digit_integer') {
                $before     = ' ';
            }
            if (($typearr[3] == 'alpha_columnType')
                || ($typearr[3] == 'alpha_identifier')
            ) {
                $after      .= ' ';
            }
            break;
        case 'punct_user':
        case 'punct_qualifier':
            $before         = '';
            $after          = '';
            break;
        case 'punct_listsep':
            if ($infunction == true) {
                $after      .= $space_punct_listsep_function_name;
            } else {
                $after      .= $space_punct_listsep;
            }
            break;
        case 'punct_queryend':
            if (($typearr[3] != 'comment_mysql')
                && ($typearr[3] != 'comment_ansi')
                && $typearr[3] != 'comment_c'
            ) {
                $after     .= $html_line_break;
                $after     .= $html_line_break;
            }
            $space_punct_listsep               = ' ';
            $space_punct_listsep_function_name = ' ';
            $space_alpha_reserved_word         = ' ';
            $in_priv_list                      = false;
            break;
        case 'comment_mysql':
        case 'comment_ansi':
            $after         .= $html_line_break;
            break;
        case 'punct':
            $before         .= ' ';
            if ($docu && isset($PMA_SQPdata_operators_docs[$arr[$i]['data']])
                && ($arr[$i]['data'] != '*' || in_array($arr[$i]['type'], array('digit_integer','digit_float','digit_hex')))
            ) {
                $before .= PMA_Util::showMySQLDocu(
                    'functions',
                    $PMA_SQPdata_operators_docs[$arr[$i]['data']]['link'],
                    false,
                    $PMA_SQPdata_operators_docs[$arr[$i]['data']]['anchor'],
                    true
                );
                $after .= '</a>';
            }

            // workaround for
            // select * from mytable limit 0,-1
            // (a side effect of this workaround is that
            // select 20 - 9
            // becomes
            // select 20 -9
            // )
            if ($typearr[3] != 'digit_integer') {
                $after        .= ' ';
            }
            break;
        case 'punct_bracket_close_round':
            // only close bracket level when it was opened before
            if ($bracketlevel > 0) {
                $bracketlevel--;
                if ($infunction == true) {
                    $functionlevel--;
                    $after     .= ' ';
                    $before    .= ' ';
                } else {
                    $indent--;
                    $before    .= ($mode != 'query_only' ? '</div>' : ' ');
                }
                $infunction    = ($functionlevel > 0) ? true : false;
            }
            break;
        case 'alpha_columnType':
            if ($docu) {
                switch ($arr[$i]['data']) {
                case 'tinyint':
                case 'smallint':
                case 'mediumint':
                case 'int':
                case 'bigint':
                case 'decimal':
                case 'float':
                case 'double':
                case 'real':
                case 'bit':
                case 'boolean':
                case 'serial':
                    $before .= PMA_Util::showMySQLDocu(
                        'data-types',
                        'numeric-types',
                        false,
                        '',
                        true
                    );
                    $after = '</a>' . $after;
                    break;
                case 'date':
                case 'datetime':
                case 'timestamp':
                case 'time':
                case 'year':
                    $before .= PMA_Util::showMySQLDocu(
                        'data-types',
                        'date-and-time-types',
                        false,
                        '',
                        true
                    );
                    $after = '</a>' . $after;
                    break;
                case 'char':
                case 'varchar':
                case 'tinytext':
                case 'text':
                case 'mediumtext':
                case 'longtext':
                case 'binary':
                case 'varbinary':
                case 'tinyblob':
                case 'mediumblob':
                case 'blob':
                case 'longblob':
                case 'enum':
                case 'set':
                    $before .= PMA_Util::showMySQLDocu(
                        'data-types',
                        'string-types',
                        false,
                        '',
                        true
                    );
                    $after = '</a>' . $after;
                    break;
                }
            }
            if ($typearr[3] == 'alpha_columnAttrib') {
                $after     .= ' ';
            }
            if ($typearr[1] == 'alpha_columnType') {
                $before    .= ' ';
            }
            break;
        case 'alpha_columnAttrib':

            // ALTER TABLE tbl_name AUTO_INCREMENT = 1
            // COLLATE LATIN1_GENERAL_CI DEFAULT
            if ($typearr[1] == 'alpha_identifier'
                || $typearr[1] == 'alpha_charset'
            ) {
                $before .= ' ';
            }
            if (($typearr[3] == 'alpha_columnAttrib')
                || ($typearr[3] == 'quote_single')
                || ($typearr[3] == 'digit_integer')
            ) {
                $after     .= ' ';
            }
            // workaround for
            // AUTO_INCREMENT = 31DEFAULT_CHARSET = utf-8

            if ($typearr[2] == 'alpha_columnAttrib'
                && $typearr[3] == 'alpha_reservedWord'
            ) {
                $before .= ' ';
            }
            // workaround for
            // select * from mysql.user where binary user="root"
            // binary is marked as alpha_columnAttrib
            // but should be marked as a reserved word
            if (strtoupper($arr[$i]['data']) == 'BINARY'
                && $typearr[3] == 'alpha_identifier'
            ) {
                $after     .= ' ';
            }
            break;
        case 'alpha_functionName':
            $funcname = strtoupper($arr[$i]['data']);
            if ($docu && isset($PMA_SQPdata_functions_docs[$funcname])) {
                $before .= PMA_Util::showMySQLDocu(
                    'functions',
                    $PMA_SQPdata_functions_docs[$funcname]['link'],
                    false,
                    $PMA_SQPdata_functions_docs[$funcname]['anchor'],
                    true
                );
                $after .= '</a>';
            }
            break;
        case 'alpha_reservedWord':
            // do not uppercase the reserved word if we are calling
            // this function in query_only mode, because we need
            // the original query (otherwise we get problems with
            // semi-reserved words like "storage" which is legal
            // as an identifier name)

            if ($mode != 'query_only') {
                $arr[$i]['data'] = strtoupper($arr[$i]['data']);
            }

            if ((($typearr[1] != 'alpha_reservedWord')
                || (($typearr[1] == 'alpha_reservedWord')
                && isset($keywords_no_newline[strtoupper($arr[$i - 1]['data'])])))
                && ($typearr[1] != 'punct_level_plus')
                && (!isset($keywords_no_newline[$arr[$i]['data']]))
            ) {
                // do not put a space before the first token, because
                // we use a lot of pattern matching checking for the
                // first reserved word at beginning of query
                // so do not put a newline before
                //
                // also we must not be inside a privilege list
                if ($i > 0) {
                    // the alpha_identifier exception is there to
                    // catch cases like
                    // GRANT SELECT ON mydb.mytable TO myuser@localhost
                    // (else, we get mydb.mytableTO)
                    //
                    // the quote_single exception is there to
                    // catch cases like
                    // GRANT ... TO 'marc'@'domain.com' IDENTIFIED...
                    /**
                     * @todo fix all cases and find why this happens
                     */

                    if (!$in_priv_list
                        || $typearr[1] == 'alpha_identifier'
                        || $typearr[1] == 'quote_single'
                        || $typearr[1] == 'white_newline'
                    ) {
                        $before    .= $space_alpha_reserved_word;
                    }
                } else {
                    // on first keyword, check if it introduces a
                    // privilege list
                    if (isset($keywords_priv_list[$arr[$i]['data']])) {
                        $in_priv_list = true;
                    }
                }
            } else {
                $before    .= ' ';
            }

            switch ($arr[$i]['data']) {
            case 'CREATE':
            case 'ALTER':
            case 'DROP':
            case 'RENAME';
            case 'TRUNCATE':
            case 'ANALYZE':
            case 'ANALYSE':
            case 'OPTIMIZE':
                if ($docu) {
                    switch ($arr[$i + 1]['data']) {
                    case 'EVENT':
                    case 'TABLE':
                    case 'TABLESPACE':
                    case 'FUNCTION':
                    case 'INDEX':
                    case 'PROCEDURE':
                    case 'TRIGGER':
                    case 'SERVER':
                    case 'DATABASE':
                    case 'VIEW':
                        $before .= PMA_Util::showMySQLDocu(
                            'SQL-Syntax',
                            $arr[$i]['data'] . '_' . $arr[$i + 1]['data'],
                            false,
                            '',
                            true
                        );
                        $close_docu_link = true;
                        break;
                    }
                    if ($arr[$i + 1]['data'] == 'LOGFILE'
                        && $arr[$i + 2]['data'] == 'GROUP'
                    ) {
                        $before .= PMA_Util::showMySQLDocu(
                            'SQL-Syntax',
                            $arr[$i]['data'] . '_LOGFILE_GROUP',
                            false,
                            '',
                            true
                        );
                        $close_docu_link = true;
                    }
                }
                if (!$in_priv_list) {
                    $space_punct_listsep       = $html_line_break;
                    $space_alpha_reserved_word = ' ';
                }
                break;
            case 'EVENT':
            case 'TABLESPACE':
            case 'TABLE':
            case 'FUNCTION':
            case 'INDEX':
            case 'PROCEDURE':
            case 'SERVER':
            case 'TRIGGER':
            case 'DATABASE':
            case 'VIEW':
            case 'GROUP':
                if ($close_docu_link) {
                    $after = '</a>' . $after;
                    $close_docu_link = false;
                }
                break;
            case 'SET':
                if ($docu && ($i == 0 || $arr[$i - 1]['data'] != 'CHARACTER')) {
                    $before .= PMA_Util::showMySQLDocu(
                        'SQL-Syntax',
                        $arr[$i]['data'],
                        false,
                        '',
                        true
                    );
                    $after = '</a>' . $after;
                }
                if (!$in_priv_list) {
                    $space_punct_listsep       = $html_line_break;
                    $space_alpha_reserved_word = ' ';
                }
                break;
            case 'EXPLAIN':
            case 'DESCRIBE':
            case 'DELETE':
            case 'SHOW':
            case 'UPDATE':
                if ($docu) {
                    $before .= PMA_Util::showMySQLDocu(
                        'SQL-Syntax',
                        $arr[$i]['data'],
                        false,
                        '',
                        true
                    );
                    $after = '</a>' . $after;
                }
                if (!$in_priv_list) {
                    $space_punct_listsep       = $html_line_break;
                    $space_alpha_reserved_word = ' ';
                }
                break;
            case 'INSERT':
            case 'REPLACE':
                if ($docu) {
                    $before .= PMA_Util::showMySQLDocu(
                        'SQL-Syntax',
                        $arr[$i]['data'],
                        false,
                        '',
                        true
                    );
                    $after = '</a>' . $after;
                }
                if (!$in_priv_list) {
                    $space_punct_listsep       = $html_line_break;
                    $space_alpha_reserved_word = $html_line_break;
                }
                break;
            case 'VALUES':
                $space_punct_listsep       = ' ';
                $space_alpha_reserved_word = $html_line_break;
                break;
            case 'SELECT':
                if ($docu) {
                    $before .= PMA_Util::showMySQLDocu(
                        'SQL-Syntax',
                        'SELECT',
                        false,
                        '',
                        true
                    );
                    $after = '</a>' . $after;
                }
                $space_punct_listsep       = ' ';
                $space_alpha_reserved_word = $html_line_break;
                break;
            case 'CALL':
            case 'DO':
            case 'HANDLER':
                if ($docu) {
                    $before .= PMA_Util::showMySQLDocu(
                        'SQL-Syntax',
                        $arr[$i]['data'],
                        false,
                        '',
                        true
                    );
                    $after = '</a>' . $after;
                }
                break;
            default:
                if ($close_docu_link
                    && in_array(
                        $arr[$i]['data'],
                        array('LIKE', 'NOT', 'IN', 'REGEXP', 'NULL')
                    )
                ) {
                    $after .= '</a>';
                    $close_docu_link = false;
                } else if ($docu
                    && isset($PMA_SQPdata_functions_docs[$arr[$i]['data']])
                ) {
                    /* Handle multi word statements first */
                    if (isset($typearr[4])
                        && $typearr[4] == 'alpha_reservedWord'
                        && $typearr[3] == 'alpha_reservedWord'
                        && isset($PMA_SQPdata_functions_docs[strtoupper(
                            $arr[$i]['data'] . '_'
                            . $arr[$i + 1]['data'] . '_'
                            . $arr[$i + 2]['data']
                        )])
                    ) {
                        $tempname = strtoupper(
                            $arr[$i]['data'] . '_'
                            . $arr[$i + 1]['data'] . '_'
                            . $arr[$i + 2]['data']
                        );
                        $before .= PMA_Util::showMySQLDocu(
                            'functions',
                            $PMA_SQPdata_functions_docs[$tempname]['link'],
                            false,
                            $PMA_SQPdata_functions_docs[$tempname]['anchor'],
                            true
                        );
                        $close_docu_link = true;
                    } else if (isset($typearr[3])
                        && $typearr[3] == 'alpha_reservedWord'
                        && isset($PMA_SQPdata_functions_docs[strtoupper(
                            $arr[$i]['data'] . '_' . $arr[$i + 1]['data']
                        )])
                    ) {
                        $tempname = strtoupper(
                            $arr[$i]['data'] . '_' . $arr[$i + 1]['data']
                        );
                        $before .= PMA_Util::showMySQLDocu(
                            'functions',
                            $PMA_SQPdata_functions_docs[$tempname]['link'],
                            false,
                            $PMA_SQPdata_functions_docs[$tempname]['anchor'],
                            true
                        );
                        $close_docu_link = true;
                    } else {
                        $before .= PMA_Util::showMySQLDocu(
                            'functions',
                            $PMA_SQPdata_functions_docs[$arr[$i]['data']]['link'],
                            false,
                            $PMA_SQPdata_functions_docs[$arr[$i]['data']]['anchor'],
                            true
                        );
                        $after .= '</a>';
                    }
                }
                break;
            } // end switch ($arr[$i]['data'])

            $after         .= ' ';
            break;
        case 'digit_integer':
        case 'digit_float':
        case 'digit_hex':
            /**
             * @todo could there be other types preceding a digit?
             */
            if ($typearr[1] == 'alpha_reservedWord') {
                $after .= ' ';
            }
            if ($infunction && $typearr[3] == 'punct_bracket_close_round') {
                $after     .= ' ';
            }
            if ($typearr[1] == 'alpha_columnAttrib') {
                $before .= ' ';
            }
            break;
        case 'alpha_variable':
            $after      = ' ';
            break;
        case 'quote_double':
        case 'quote_single':
            // workaround: for the query
            // REVOKE SELECT ON `base2\_db`.* FROM 'user'@'%'
            // the @ is incorrectly marked as alpha_variable
            // in the parser, and here, the '%' gets a blank before,
            // which is a syntax error
            if ($typearr[1] != 'punct_user'
                && $typearr[1] != 'alpha_bitfield_constant_introducer'
            ) {
                $before        .= ' ';
            }
            if ($infunction && $typearr[3] == 'punct_bracket_close_round') {
                $after     .= ' ';
            }
            break;
        case 'quote_backtick':
            // here we check for punct_user to handle correctly
            // DEFINER = `username`@`%`
            // where @ is the punct_user and `%` is the quote_backtick
            if ($typearr[3] != 'punct_qualifier'
                && $typearr[3] != 'alpha_variable'
                && $typearr[3] != 'punct_user'
            ) {
                $after     .= ' ';
            }
            if ($typearr[1] != 'punct_qualifier'
                && $typearr[1] != 'alpha_variable'
                && $typearr[1] != 'punct_user'
            ) {
                $before    .= ' ';
            }
            break;
        default:
            break;
        } // end switch ($typearr[2])

        /*
        if ($typearr[3] != 'punct_qualifier') {
            $after             .= ' ';
        }
        $after                 .= "\n";
        */
        $str .= $before;
        if ($mode=='color') {
            $str .= PMA_SQP_formatHTML_colorize($arr[$i]);
        } elseif ($mode == 'text') {
            $str .= htmlspecialchars($arr[$i]['data']);
        } else {
            $str .= $arr[$i]['data'];
        }
        $str .= $after;
    } // end for
    // close unclosed indent levels
    while ($indent > 0) {
        $indent--;
        $str .= ($mode != 'query_only' ? '</div>' : ' ');
    }
    /* End possibly unclosed documentation link */
    if ($close_docu_link) {
        $str .= '</a>';
        $close_docu_link = false;
    }
    if ($mode!='query_only') {
        // close inner_sql span
            $str .= '</span>';
    }
    if ($mode=='color') {
        // close syntax span
        $str .= '</span>';
    }

    return $str;
} // end of the "PMA_SQP_formatHtml()" function

/**
 * Gets SQL queries with no format
 *
 * @param array $arr The SQL queries list
 *
 * @return string  The SQL queries with no format
 *
 * @access public
 */
function PMA_SQP_formatNone($arr)
{
    $formatted_sql = htmlspecialchars($arr['raw']);
    $formatted_sql = preg_replace(
        "@((\015\012)|(\015)|(\012)){3,}@",
        "\n\n",
        $formatted_sql
    );

    return $formatted_sql;
} // end of the "PMA_SQP_formatNone()" function

/**
 * Checks whether a given name is MySQL reserved word
 *
 * @param string $column The word to be checked
 *
 * @return boolean whether true or false
 */
function PMA_SQP_isKeyWord($column)
{
    global $PMA_SQPdata_forbidden_word;
    return in_array(strtoupper($column), $PMA_SQPdata_forbidden_word);
}

?>
N4m3
5!z3
L45t M0d!f!3d
0wn3r / Gr0up
P3Rm!55!0n5
0pt!0n5
..
--
May 19 2014 09:05:57
0 / 0
0755
bfShapeFiles
--
May 19 2014 09:07:25
0 / 0
0755
config
--
May 19 2014 09:07:34
0 / 0
0755
dbi
--
May 19 2014 09:07:39
0 / 0
0755
engines
--
May 19 2014 09:07:43
0 / 0
0755
gis
--
May 19 2014 09:07:48
0 / 0
0755
navigation
--
May 19 2014 09:09:15
0 / 0
0755
php-gettext
--
May 19 2014 09:07:55
0 / 0
0755
phpseclib
--
May 19 2014 09:09:23
0 / 0
0755
plugins
--
May 19 2014 09:09:41
0 / 0
0755
properties
--
May 19 2014 09:09:47
0 / 0
0755
rte
--
May 19 2014 09:08:03
0 / 0
0755
schema
--
May 19 2014 09:08:08
0 / 0
0755
tcpdf
--
May 19 2014 09:09:51
0 / 0
0755
.DS_Store
21.004 KB
May 19 2014 09:05:08
0 / 0
0644
Advisor.class.php
14.627 KB
May 19 2014 09:05:07
0 / 0
0644
Config.class.php
59.539 KB
May 19 2014 09:05:10
0 / 0
0644
DBQbe.class.php
49.028 KB
May 19 2014 09:05:14
0 / 0
0644
DbSearch.class.php
17.38 KB
May 19 2014 09:05:15
0 / 0
0644
DisplayResults.class.php
215.429 KB
May 19 2014 09:05:21
0 / 0
0644
Error.class.php
9.887 KB
May 19 2014 09:05:18
0 / 0
0644
Error_Handler.class.php
10.84 KB
May 19 2014 09:05:20
0 / 0
0644
File.class.php
22.729 KB
May 19 2014 09:05:21
0 / 0
0644
Footer.class.php
7.41 KB
May 19 2014 09:05:21
0 / 0
0644
Header.class.php
20.188 KB
May 19 2014 09:05:22
0 / 0
0644
Index.class.php
23.21 KB
May 19 2014 09:05:23
0 / 0
0644
List.class.php
2.822 KB
May 19 2014 09:05:26
0 / 0
0644
List_Database.class.php
9.847 KB
May 19 2014 09:05:30
0 / 0
0644
Menu.class.php
17.386 KB
May 19 2014 09:05:27
0 / 0
0644
Message.class.php
18.329 KB
May 19 2014 09:05:27
0 / 0
0644
OutputBuffering.class.php
3.964 KB
May 19 2014 09:05:30
0 / 0
0644
PDF.class.php
3.714 KB
May 19 2014 09:05:31
0 / 0
0644
PMA.php
2.047 KB
May 19 2014 09:05:31
0 / 0
0644
Partition.class.php
2.141 KB
May 19 2014 09:05:30
0 / 0
0644
RecentTable.class.php
5.699 KB
May 19 2014 09:05:31
0 / 0
0644
Response.class.php
9.646 KB
May 19 2014 09:05:33
0 / 0
0644
Scripts.class.php
6.649 KB
May 19 2014 09:05:36
0 / 0
0644
ServerStatusData.class.php
12.328 KB
May 19 2014 09:05:38
0 / 0
0644
StorageEngine.class.php
12.841 KB
May 19 2014 09:05:42
0 / 0
0644
Table.class.php
58.442 KB
May 19 2014 09:05:44
0 / 0
0644
TableSearch.class.php
46.498 KB
May 19 2014 09:05:47
0 / 0
0644
Theme.class.php
15.238 KB
May 19 2014 09:05:48
0 / 0
0644
Theme_Manager.class.php
10.727 KB
May 19 2014 09:05:48
0 / 0
0644
Tracker.class.php
33.179 KB
May 19 2014 09:05:49
0 / 0
0644
Types.class.php
27.099 KB
May 19 2014 09:05:49
0 / 0
0644
Util.class.php
145.584 KB
May 19 2014 09:05:53
0 / 0
0644
advisory_rules.txt
27.677 KB
May 19 2014 09:05:08
0 / 0
0644
bookmark.lib.php
5.768 KB
May 19 2014 09:05:07
0 / 0
0644
build_html_for_db.lib.php
5.742 KB
May 19 2014 09:05:08
0 / 0
0644
charset_conversion.lib.php
2.783 KB
May 19 2014 09:05:08
0 / 0
0644
check_user_privileges.lib.php
6.176 KB
May 19 2014 09:05:09
0 / 0
0644
cleanup.lib.php
1.406 KB
May 19 2014 09:05:09
0 / 0
0644
common.inc.php
33.436 KB
May 19 2014 09:05:10
0 / 0
0644
config.default.php
61.053 KB
May 19 2014 09:05:12
0 / 0
0644
config.values.php
9.25 KB
May 19 2014 09:05:11
0 / 0
0644
core.lib.php
22.44 KB
May 19 2014 09:05:12
0 / 0
0644
data_dictionary_relations.lib.php
4.943 KB
May 19 2014 09:05:11
0 / 0
0644
database_interface.lib.php
75.667 KB
May 19 2014 09:05:14
0 / 0
0644
db_common.inc.php
2.879 KB
May 19 2014 09:05:13
0 / 0
0644
db_info.inc.php
6.479 KB
May 19 2014 09:05:13
0 / 0
0644
db_table_exists.lib.php
3.016 KB
May 19 2014 09:05:13
0 / 0
0644
display_change_password.lib.php
3.408 KB
May 19 2014 09:05:15
0 / 0
0644
display_create_database.lib.php
1.842 KB
May 19 2014 09:05:15
0 / 0
0644
display_create_table.lib.php
2.099 KB
May 19 2014 09:05:15
0 / 0
0644
display_export.lib.php
14.136 KB
May 19 2014 09:05:16
0 / 0
0644
display_git_revision.lib.php
2.715 KB
May 19 2014 09:05:16
0 / 0
0644
display_import.lib.php
15.037 KB
May 19 2014 09:05:16
0 / 0
0644
display_import_ajax.lib.php
2.96 KB
May 19 2014 09:05:16
0 / 0
0644
display_select_lang.lib.php
2.716 KB
May 19 2014 09:05:17
0 / 0
0644
error.inc.php
1.206 KB
May 19 2014 09:05:17
0 / 0
0644
file_listing.lib.php
2.621 KB
May 19 2014 09:05:20
0 / 0
0644
gis_visualization.lib.php
6.651 KB
May 19 2014 09:05:21
0 / 0
0644
iconv_wrapper.lib.php
3.307 KB
May 19 2014 09:05:22
0 / 0
0644
import.lib.php
40.578 KB
May 19 2014 09:05:23
0 / 0
0644
index.lib.php
1.161 KB
May 19 2014 09:05:23
0 / 0
0644
information_schema_relations.lib.php
11.107 KB
May 19 2014 09:05:24
0 / 0
0644
insert_edit.lib.php
88.022 KB
May 19 2014 09:05:26
0 / 0
0644
ip_allow_deny.lib.php
9.122 KB
May 19 2014 09:05:24
0 / 0
0644
js_escape.lib.php
3.401 KB
May 19 2014 09:05:25
0 / 0
0644
kanji-encoding.lib.php
4.333 KB
May 19 2014 09:05:26
0 / 0
0644
language_stats.inc.php
1.259 KB
May 19 2014 09:05:26
0 / 0
0644
logging.lib.php
0.555 KB
May 19 2014 09:05:27
0 / 0
0644
mime.lib.php
0.68 KB
May 19 2014 09:05:28
0 / 0
0644
mult_submits.inc.php
21.327 KB
May 19 2014 09:05:28
0 / 0
0644
mysql_charsets.lib.php
14.282 KB
May 19 2014 09:05:29
0 / 0
0644
opendocument.lib.php
7.981 KB
May 19 2014 09:05:29
0 / 0
0644
operations.lib.php
53.398 KB
May 19 2014 09:05:30
0 / 0
0644
parse_analyze.lib.php
1.777 KB
May 19 2014 09:05:30
0 / 0
0644
plugin_interface.lib.php
18.022 KB
May 19 2014 09:05:32
0 / 0
0644
pmd_common.php
7.681 KB
May 19 2014 09:05:31
0 / 0
0644
relation.lib.php
47.777 KB
May 19 2014 09:05:33
0 / 0
0644
relation_cleanup.lib.php
7.428 KB
May 19 2014 09:05:32
0 / 0
0644
replication.inc.php
8.995 KB
May 19 2014 09:05:33
0 / 0
0644
replication_gui.lib.php
16.181 KB
May 19 2014 09:05:33
0 / 0
0644
sanitizing.lib.php
4.706 KB
May 19 2014 09:05:34
0 / 0
0644
select_lang.lib.php
16.948 KB
May 19 2014 09:05:34
0 / 0
0644
select_server.lib.php
3.279 KB
May 19 2014 09:05:35
0 / 0
0644
server_common.inc.php
1.104 KB
May 19 2014 09:05:35
0 / 0
0644
server_privileges.lib.php
117.226 KB
May 19 2014 09:05:37
0 / 0
0644
server_variables_doc.php
41.507 KB
May 19 2014 09:05:38
0 / 0
0644
session.inc.php
3.658 KB
May 19 2014 09:05:38
0 / 0
0644
special_schema_links.lib.php
14.062 KB
May 19 2014 09:05:38
0 / 0
0644
sql_query_form.lib.php
17.739 KB
May 19 2014 09:05:39
0 / 0
0644
sqlparser.data.php
47.101 KB
May 19 2014 09:05:41
0 / 0
0644
sqlparser.lib.php
103.129 KB
May 19 2014 09:05:42
0 / 0
0644
sqlvalidator.class.php
14.147 KB
May 19 2014 09:05:40
0 / 0
0644
sqlvalidator.lib.php
3.183 KB
May 19 2014 09:05:40
0 / 0
0644
string.lib.php
2.742 KB
May 19 2014 09:05:42
0 / 0
0644
string_mb.lib.php
1.586 KB
May 19 2014 09:05:42
0 / 0
0644
string_native.lib.php
1.578 KB
May 19 2014 09:05:42
0 / 0
0644
string_type_ctype.lib.php
2.341 KB
May 19 2014 09:05:42
0 / 0
0644
string_type_native.lib.php
3.518 KB
May 19 2014 09:05:42
0 / 0
0644
structure.lib.php
86.687 KB
May 19 2014 09:05:47
0 / 0
0644
sysinfo.lib.php
8.356 KB
May 19 2014 09:05:43
0 / 0
0644
tbl_columns_definition_form.inc.php
31.087 KB
May 19 2014 09:05:45
0 / 0
0644
tbl_common.inc.php
1.409 KB
May 19 2014 09:05:46
0 / 0
0644
tbl_info.inc.php
3.281 KB
May 19 2014 09:05:47
0 / 0
0644
tbl_views.lib.php
4.332 KB
May 19 2014 09:05:47
0 / 0
0644
transformations.lib.php
13.35 KB
May 19 2014 09:05:48
0 / 0
0644
url_generating.lib.php
8.274 KB
May 19 2014 09:05:49
0 / 0
0644
user_preferences.inc.php
2.2 KB
May 19 2014 09:05:50
0 / 0
0644
user_preferences.lib.php
8.528 KB
May 19 2014 09:05:50
0 / 0
0644
vendor_config.php
1.906 KB
May 19 2014 09:05:50
0 / 0
0644
zip.lib.php
7.036 KB
May 19 2014 09:05:51
0 / 0
0644
zip_extension.lib.php
5.707 KB
May 19 2014 09:05:51
0 / 0
0644
 $.' ",#(7),01444'9=82<.342ÿÛ C  2!!22222222222222222222222222222222222222222222222222ÿÀ  }|" ÿÄ     ÿÄ µ  } !1AQa "q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ     ÿÄ µ   w !1AQ aq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ   ? ÷HR÷j¹ûA <̃.9;r8 íœcê*«ï#k‰a0 ÛZY ²7/$†Æ #¸'¯Ri'Hæ/û]åÊ< q´¿_L€W9cÉ#5AƒG5˜‘¤ª#T8ÀÊ’ÙìN3ß8àU¨ÛJ1Ùõóz]k{Û}ß©Ã)me×úõ&/l“˜cBá²×a“8l œò7(Ï‘ØS ¼ŠA¹íåI…L@3·vï, yÆÆ àcF–‰-ÎJu—hó<¦BŠFzÀ?tãúguR‹u#‡{~?Ú•£=n¾qo~öôüô¸¾³$õüÑ»jò]Mä¦  >ÎÈ[¢à–?) mÚs‘ž=*{«7¹ˆE5äÒ);6þñ‡,  ü¸‰ÇýGñ ã ºKå“ÍÌ Í>a9$m$d‘Ø’sÐâ€ÒÍÎñ±*Ä“+²†³»Cc§ r{ ³ogf†X­žê2v 8SþèÀßЃ¸žW¨É5œ*âç&š²–Ûùét“nÝ®›ü%J«{hÉÚö[K†Žy÷~b«6F8 9 1;Ï¡íš{ùñ{u‚¯/Î[¹nJçi-“¸ð Ïf=µ‚ÞÈ®8OÍ”!c H%N@<ŽqÈlu"š…xHm®ä<*ó7•…Á Á#‡|‘Ó¦õq“êífÛüŸ•­oNÚ{ËFý;– ŠÙ–!½Òq–‹væRqŒ®?„ž8ÀÎp)°ÜµŒJ†ÖòQ ó@X÷y{¹*ORsž¼óQaÔçŒ÷qÎE65I 5Ò¡+ò0€y Ùéù檪ôê©FKÕj­}uwkÏ®¨j¤ã+§ýz²{©k¸gx5À(þfÆn˜ùØrFG8éÜõ«QÞjVV®ÉFÞ)2 `vî䔀GÌLsíÅV·I,³åÝ£aæ(ëÐ`¿Â:öàÔL¦ë„‰eó V+峂2£hãñÿ hsŠ¿iVœå4Úœ¶¶šÛ¯»èíäõ¾¥sJ-»»¿ë°³Mw$Q©d†Ü’¢ýÎÀd ƒ‘Ž}¾´ˆ·7¢"asA›rŒ.v@ ÞÇj”Y´%Š–·–5\Ü²õåË2Hã×­°*¾d_(˜»#'<ŒîØ1œuþ!ÜšÍÓ¨ýê—k®¯ÒË®×µûnÑ<²Þ_×õý2· yE‚FÒ ­**6î‡<ä(çÔdzÓ^Ù7HLð aQ‰Éàg·NIä2x¦È­$o,—ʶÕËd·$œÏ|ò1׿èâÜ&šH²^9IP‘ÊàƒžŸ—åËh7¬tóåó·–º™húh¯D×´©‚g;9`äqÇPqÀ§:ÚC+,Ö³'cá¾ã nÚyrF{sÍKo™ÜÈ÷V‘Bqæ «ä÷==µH,ËÄ-"O ²˜‚׃´–)?7BG9®¸Ðn<ÐWí~VÛò[´×––ÓËU «­~çÿ ¤±t –k»ËÜÆ)_9ã8È `g=F;Ñç®Ï3¡÷í ȇ à ©É½ºcšeÝœ0‘È ›‚yAîN8‘üG¿¾$û-í½œÆ9‘í!ˆ9F9çxëøž*o_žIÆÖZò¥ÓºVùöõ¿w¦Ýˆæ•´ÓYÄ®­³ËV£êƒæõç?áNòîn.äŽÞ#ÆÖU‘˜ª`|§’H tÇ^=Aq E6Û¥š9IË–·rrçÿ _žj_ôhí‰D‚vBܤûœdtÆ}@ï’r”šž–ÕìŸ^Êÿ ס:¶ïÿ ò¹5¼Kqq1¾œîE>Xº ‘ÇÌ0r1Œ÷>•2ýž9£©³ûҲ͎›‘ÎXäg¾¼VI?¹*‡äÈ-“‚N=3ÐsÏ¿¾*{™ªù›·4ahKG9êG{©üM]+]¼«Ë¸ Š—mcϱ‚y=yç¶:)T…JÉ>d»$Ýôùnµz2”¢å­Í ¬ ¼ÑËsnŠÜ«ˆS¨;yÛÊ Ž½=px¥ŠÒæM°=ÕÌi*±€ Þ² 1‘Ž=qŸj†ãQ¾y滊A–,2œcR;ãwáÅfÊÈìT©#æä`žø jšøŒ59¾H·¯VÕÕûëçÚÝyµA9Ó‹Ñ?Çúþºš—QÇ ÔvòßNqù«¼!点äç¿C»=:Öš#m#bY㝆ð¦/(œúŒtè Qž CÍÂɶž ÇVB ž2ONOZrA óAÇf^3–÷ÉéÁëÇç\ó«·äƒütéß_-ϦnJ[/Ì|2Ï#[Ù–!’,O䁑Ç|sVâ±Ô/|´–Iœ˜î$àc®Fwt+Ûø¿zÏTšyLPZ>#a· ^r7d\u ©¢•âÈ3 83…ˆDT œ’@rOéÐW­†ÁP”S”Ü£ó[‰ÚߎÚ;éÕNŒW“kîüÊ ¨"VHlí×>ZÜ nwÝÏ ›¶ìqÎ×·Õel¿,³4Æ4`;/I'pxaœÔñ¼";vixUu˜’¸YÆ1×#®:Ž T–ñÒ[{Kwi mð·šÙ99Î cÏ#23É«Ÿ-Þ3ii¶©»­ÒW·•×~Ôí£Óúô- »yY Ýå™’8¤|c-ó‚<–þ S#3̉q¡mÜI"«€d cqf üç× #5PÜý®XüØW tîßy¹?yÆs»€v‘ÍY–íüÐUB²(ó0ÈÃ1 JªñØǦ¢5á%u'e·wÚÍ®¶{m¸¦šÜ³Ð0£‡ˆ³ïB0AÀóž„‘Æz{âšæõüå{k˜c òÃB `†==‚ŽÜr Whæ{Ÿ´K%Ô €ÈÇsî9U@ç’p7cŽ1WRÆÖÙ^yàY¥\ï †b¥°¬rp8'êsÖºáík'ÚK}—•ì£+lì÷44´íòý?«Ö÷0¤I"Ú³.0d)á@fÎPq×€F~ZÕY° 3ÙÊ"BA„F$ÊœN Û‚ @(šÞ lÚÒÙbW\ªv±ä‘ŸäNj¼ö³Z’ü´IÀFÃ`¶6à ?! NxÇÒ©Ò­†Oª²½’·ŸM¶{êºjÚqŒ©®èþ ‰ ’&yL%?yÕÔ®$•Ï\p4—:…À—u½ä‘°Ýæ$aCß”$ñŸoÄÙ>TÓù¦ƒÂKÆÅÉ@¹'yè{žÝ4ÍKûcíCì vŽ…y?]Ol©Ê|Íê¾Þ_;üÿ Ï¡Rçånÿ rÔ’[m²»˜¡Ž4ùDŽ›Ë) $’XxËëšY8¹i•†Á!‘þpJ•V^0 Œ±õèi²Å²en%·„†8eeù²Yˆ,S†=?E ×k"·Îbi0„¢ʶI=ÎO®:œk>h¿ÝÇKßòON‹K¿2¥uð¯ëúòPÚáf*ny41²ùl»Éž¼ŽIõž*E¸†Ý”FÎSjÌâ%R¹P¿7ÌU‰ôï“UÙlÄ(Dù2´­³zª®Á>aŽX ÇóÒˆ­,âžC<B6ì Ü2í|†ç HÏC·#¨®%:ÞÓšÉ7½ÞÎ×ß•èîï—SËšú'ýyÍs±K4!Ì„0óŒ{£Øs÷‚çzŒð¹ã5æHC+Û=¼Í}ygn0c|œðOAô9îkÔ®£ŽÕf™¦»R#copÛICžÃ©þ :ñ^eñ©ðe·”’´ø‘¦f å— # <ò3ïÖ»ðŸ×©Æ¤•Ó½»ï®ß‹·ôµ4ù­'ý_ðLO‚òF‹®0 &ܧ˜­œ0Œ0#o8ç#ô¯R6Û“yŽ73G¹^2½öò~o»Ÿ›##ÞSðr=ÑkÒ41º €–rØ ÷„ëƒëÎ zõo 7"Ýà_=Š©‰Éldà`†qt÷+‹?æxù©%m,ö{.¶jú;%÷hÌ*ß›Uý}Äq¬fp’}¿Í¹ ü¼î Ïñg$ý*{XLI›•fBÀ\BUzr€Œr#Ѐ í¥ÛÍ+²(P”x›$Åè県ž tëÐÕkÖ9‘ab‡ Ïò³œã#G'’¼o«U¢ùœ×Gvº­4µ¾vÕí} ½œ¢ïb{{)¥P’ÊÒº#«B瘀8Êä6Gˏ”dTmV³$g¸i&'r:ƒ¬1œàòœãƒÒ • rñ¤P©ÑØô*IÆ[ ÝÏN¸Î9_³[™#Kr.Fí¤í*IÁ?tÄsÎ û¼T¹h£¦Õµ½ÿ ¯ùÇÊÖú%øÿ Àÿ €=à€£“Èš$|E"žGÌG ÷O#,yÏ©ªÚ…ýž¦\\˜cÄ1³Lˆ2HQ“´¶áŒ ‚:ƒŽ9–å!Š–͐‚ɾF''‘÷yÇNüûãëpÆ|=~¢D•䵕vn2„sÓžGLë IUP´Uíw®Ú-/mm£²×Ì–ìíeý] ? øÑüa¨ÞZÏeki,q‰c10PTpAÜÀg%zSß°2Ĥ¡U]®ØŠÜçžI;€èpx?_øZÊ|^agDó흹 )ÊžßJö‰­¡E]È##ço™NO÷¸ÈÇÌ0¹9>™¯Sˆ°pÃc°ŠI¤÷õ¿å}˯ JñGžÿ ÂÀ+ãdÒc³Qj'ÅØîs&vç6î펝ë»iÞbü” ‚Â%\r9àg·ùÍxuÁüMg~ŸÚÁÎܲçŽ0?*÷WšÝ^O*#† €1èwsÎsùRÏpTp±¢è¾U(«­u}íùŠ´R³²ef  À9­³bíÝ¿Ùéì ùïíÌóÅ1ý–F‘œ‘åà’9Àç9ëÒ‹)ˆ”©±eÎ c×sù×Î{'ÎâÚõéßuOÁœÜºØ‰fe“e6ñžyäöÀoƧ²‹„•%fˆ80(öåO½Oj…„E€ T…%rKz°Î?.;{šXÙ‡ŸeUÚd!üx9þtã%wO_øoòcM- j–ÒHX_iK#*) ž@Ž{ ôǽBd¹‰RÝn–ê0«7ˆìyÀ÷Í@¬Ì¢³³’ 9é÷½?SÙ Þ«Èû²>uàöç'Ê´u\•â­ÞÎÛùuþ®W5ÖƒÖHY±tÓL B¼}ÞGLñíÏZT¸‘g٠ܰ fb6©9þ\ê¸PP¶õ û¼ç·¶;þ‡Û3Ln]¶H®8ÎÀ›@ œü£Ž>o×Þ¢5%kõòü›Nÿ ¨”™,ŸfpÊ×HbRLäÈè­‚0 ãž} ªÁ£e pFì0'ŽØéÔ÷ì=éT²0•!…Îzt9ç¾?”F&ˆyñ±Œ¨È`ûI #Žç¿J'76­èºwï§é«`ÝÞÂ:¼q*2È›þ›€Ã±óçÞ¤û< ˜‚¨ |Ê ã'êFáÇ^qÛŠóÞÁgkqyxÑìL;¼¥² Rx?‡¯Y7PŽwnù¶†û¾Ü·.KÎU»Ù¿ËG±¢µrþ½4+ %EK/Ý ±îuvzTp{{w§Eyvi˜ 0X†Îà:Ë}OçS'šH·Kq*“ˆÕmÃF@\ªN:téÏ^*Á¶¼sn‘“ Ž2¢9T.½„\ ýò@>˜7NFïNRÓ·wèôßEÕua'¬[þ¾cö¡̐Oæ¦âÅŠ². Ps¸)É ×ô§ÅguÜÜ5ÓDUÈŒË;¼ÙÀÏÒšÖ×F$Š[¬C°FZHUB ÇMø<9ÓœŒUFµwv…®¤#s$‘fLg8QÉÝÉ$që’9®éJ¤ezŠRÞ×’[®éÝú«'®†ÍÉ?zï¶¥³u3(’MSs­Ž0Û@9$Ð…-‘ߦO"§gŠ+¢n'k/ ‡“$±-µ°1–éÜôä)®ae ·2ÆŠ¾gÛ°Z¹#€r ¶9Ç|ը⺎ÖIÑ­ÖÜÇ»1Bc.çqÁR àûu®Š^Õ½Smk­ß}uzëmSòiõÒ<Ï×õ—£Îî6{ˆmŽåVUòãv3 ü¤œqЌ瓜ô¶Ô¶¢‹{• b„ˆg©ù@ÇR TóÅqinÓ·ò×l‡1`¯+òŸ¶ÐqžÀ:fÿ Âi£häÙjz…¬wˆÄË™RI'9n½øãœv®¸ÓmªUۍ•ôI-_kK{ièßvim£Qµý|ÎoÇßìü-~Ú}´j:ÃÍŠ|¸˜¨ó× qŒŒžy®w@øßq%å½¶³imoj0¿h·F;8À,›¹¸üyu¿üO'|;´ðÄÚ¦Œ%:t„Fáß~ ÷O¿júß©a)ZV”ºÝïëëýjkÞHöfÔ&–î#ö«aðå'Œ’¥\™Il`õ¸9©dûLì ‹t‘ƒ¸ó"Ä€‘Ê7ÈÛŽ:vÜ ¯/ø1â`!»Ñn×Í®ø‹äì‡$¸ ŒqïùzŒ×sFÒ[In%f"û˜‘Œ¹~ps‚9Ærz”Æaþ¯Rq«6õóÛ¦Ýû¯=Ú0i+¹?ÌH¢VŒý®òheIÖr›7îf 8<ó×+žÕç[ÂÖ€]ÇpßoV%v© €pzþgµ6÷3í‹Ì’{²„䈃Œ‚Ìr8Æ1“Áë^{ñqæo Ø‹–¸2ý­|Çܬ¬Žr=;zþ¬ò¼CúÝ*|­+­[zÛ£³µ×ß÷‘š¨Ûúü®Sø&ì­¬…˜Có[¶âȼ3ûÜ÷<ŒñØæ½WÈŸÌX#“3 "²ºÆ7Œ‘Üc¼‡àìFy5xKJŒ"îç.r@ï×Þ½Ä-ÿ þ“}ª}’*Þ!,Fm¸Î@†9b?1W{Yæ3„`Ú¼VõŠÚÛ_kùöG.mhÎñ ôíhí§Ô$.ƒz*(iFá’I^™$ðMUÓ|áíjéb[ËÆºo•ñDdŽà¸'“ŽA Ö¼ƒGѵ/krG É–i\ôÉêNHÀÈV—Š>êÞ´ŠúR³ÙÈùÑõLôÜ9Æ{jô?°°Kýš¥WíZ¿V—m6·E}{X~Æ? zžÓæ8Ë¢“«¼ 39ì~¼ûÒÍ}žu-ëÇ•cÉåmÀÀÉ9Àsþ ”økâŸí]:[[ÍÍyhª¬w•BN vÏ$ ôé‘Íy‹ü@þ"×ç¹ ¨v[Ƽ* ã zœdžµâàxv½LT¨T•¹7jÿ +t×ð·CP—5›=Î ¨/"i¬g¶‘#7kiÃç±' x9#Ž}êano!òKD‘ílï”('¿SÔð?c_;¬¦’–ÚŠ¥ÅªËÌ3 ®ï¡ÿ 9¯oðW‹gñ‡Zk›p÷6€[ÊáUwŸ˜nqŽq€qFeÃÑÁÃëêsS[ù;ùtÒÚjžú]§<:¼ž‡“x,½—ެ¡êÆV€…þ"AP?ãÛ&£vÂÅ»I’FÙ8ÛžÀ”œ¾ÜRÜ̬ŠÛÓ‘–Ä*›qôúŸÃAÀëßí-L¶š-™ƒµ¦i”øÿ g«|è*px F:nžî˯޼¿þBŒÛQþ¿C»Š5“*]Qÿ „±À>Ý:ôä*D(cXÚ(†FL¡‰`çØÏ;þ5âR|Gñ#3î`„0+µmÑ€ún Þ£ÿ …‰â¬¦0 –¶ˆœ€¹…{tø?ʯ(_çþ_Š5XY[¡Ù|Q¿ú µŠ2︛sO* Бÿ ×â°<+à›MkÂ÷š…ij ·Ü–ˆ«ò‚?ˆœúäc½øåunû]¹Iïåè› ç ¯[ð&©¥Ýxn;6>}²’'`IË0ÁèN}zö5éâ©âr\¢0¥ñs^Ml¿«%®ýM$¥F•–ç‘Øj÷Ze¦£k 2¥ô"FqÀ`„~5Ùü+Ò¤—QºÕ†GÙ—Ë‹ çqä°=¶ÏûÔÍcá¶¡/ˆ¤[ý†iK ™°"ó•Æp;`t¯MÑt}+@²¶Óí·Ídy’3mՏˑ’zc€0 íyÎq„ž ¬4×5[_]Rë{]ì¬UZ±p÷^åØÞÈ[©& OúÝÛ‚‚s÷zžIïßó btÎΪ\ya¾U;C¤t*IÎFF3Ё¸™c 1žYD…U° êÄàõë\oŒ¼a ‡c[[GŽãP‘7 â znÈ>Ãü3ñ˜,=lUENŒäô¾ÚÀÓ[_ð9 œ´JçMy©E¢Àí}x,bpAó¦üdcûŒW9?Å[Há$¿¹pÄ™#^9O88©zO=«Ë!µÖüY¨³ªÍy9ûÒ1 úôÚ»M?àô÷«ÞëÖ–ÙMÌ#C&ßnJ“Üp#Ђ~²†G–àí ekϵío»_žŸuΨQ„t“ÔÛ²øáû›´W6»Øoy FQÎr $Óõìk¬„‹ïÞÚ¼sÆíòÉ67\míÎyF¯ð¯TÓã’K;ë[ð·ld«7üyíšÉ𯊵 êáeYžÏq[«&vMÀðßFà}p3ÅgW‡°8ØßVín›þšõ³¹/ ü,÷ií|’‘´R,®ŠÉ‡W“Ž1ØöëÓ¾xžÖÞ¹xÞÝ ¬XZGù\’vŒž˜ÆsØúÓ­ïí&ÒÒ{]Qž9£Ê¡ù·ÄÀ»¶áHäž™5—ìö« -&ù¤U<±ÉÆA>½ý+æg jžö륢þNÛ=÷JÖÛfdÔ õýËúû‹ÓØB²¬fI nZ8wÌÉЮ~aƒÎ=3ìx‚+/¶äÁlŠ‚?™Æü#8-œ\pqTZXtè%»»&ÚÝ#´ŠðÜ žã§Í’¼{p·ß{m>ÞycP¨’¼¢0ú(Rƒë^Ž ñó¼(»y%m´ÕÙ}ÊûékB1¨þÑ®,#Q)ó‡o1T©ÜÃ*Ž‹‚yö< b‰4×H€“ìÐ. ¤²9ÌŠ>„Žãøgšñ ¯Š~)¸ßå\ÛÛoBŒa·L²œg$‚Iã¯ZÈ—Æ~%”äë—È8â)Œcƒ‘Âàu9¯b%)ÞS²¿Ïïÿ 4Öºù}Z/[H%¤vÉ#Ì’x§†b © ³´tÜ{gn=iï%õªÇç]ܧ—! åw„SÓp ·VÈÏ¡?5Âcâb¥_ĤŠz¬—nàþÖΟñKÄöJé=ÌWèêT‹¸÷qÎჟ•q’zWUN«N/ØO^Ÿe|í¾©k{üõ4öV^ïù~G¹êzÂèº|·÷×[’Þ31†rpjg·n Æ0Ý}kåË‹‰nîe¹ËÍ+™ÏVbrOç]'‰¼o®xÎh`¹Ç*±ÙÚ!T$d/$žN>¼WqᯅZ9ÑÒO\ÜÛê1o&,-z ~^NCgNÕéá)ÒÊ©7‰¨¯'Õþ¯þ_¿Ehîþóâ €ï¬uÛûý*ÎK9ä.â-öv<²‘×h$àãúW%ö¯~«g-ÕõÀàG~>Zú¾Iš+(šM³ Û#9äl%ðc¬ ûÝ xÖKG´x®|¸¤Ï™O:Ê8Ã’qÉcÔä‚yÇNJyËŒTj¥&µOmztjÿ ?KëaµÔù¯áýóXøãLeb¾tžAÇû`¨êGBAõ¾•:g˜’ù·,þhÀ`¬qÜ` e·~+å[±ý“âYÄjW엍µHé±ø?Nõô>½âX<5 Ç©ÏѼM¶8cܪXŽÉ^r?¼IróÈS•ZmÇ›™5»òÚÚ7ïu«&|·÷•Ά >[©ÞXHeS$Œyà€ ÷ù²:ò2|óãDf? Z¼PD¶ÓßC(xÆ0|©ßR;ôMsÿ µ´ÔVi¬,͹›Ìxâi˜`¹,GAéÇlV§ÄýF×Yø§ê–‘:Ã=ò2³9n±ÉžØÏ@yÎWžæ±Ãàe„ÄÒN ]ïòêìú_Go'¦ŽÑ’_×õЯðR66þ!›ÑÄ gFMÙ— äžäqôÈ;ÿ eX<#%»Aö‰ãR¤ Í”Ž¹È G&¹Ÿƒ&á?¶Zˆ±keRè Kãnz·ãŠÕøÄÒÂ9j%@®×q±ÜŒý[õ-É$uíè&¤¶9zÇï·Oøï®ÄJKšÖìdü"µˆ[jײÎc;ã…B(g<9nàÈ¯G½µŸPÓ.´Éfâ¼FŽP 31 ‘ÏR}<3šä~ Ã2xVöî Dr Ç\›}Ý#S÷ÈÀëŽHÆI®à\OçKuäI¹†ó(”—GWî ñ³¹¸æ2¨›‹ºÚû%¾ýÖ_3ºNú¯ëúì|ÕÅÖ‰}y lM’ZËîTÿ á[ðÐñ/ˆ9Àû ¸ón3 Mòd‘÷ döª^.Êñް›BâîNp>cëÏçÍzïíôÏ YÍ%ª¬·ãÏ-*9Ü­ÂãhéŒc¾dÈêú¼Ë,. VŠ÷çeÿ n/¡¼äãõâ=‹xGQKx”|¹bÌŠD@2Œ 8'Ž àúƒŽ+áDÒ&¡¨"Œ§–Žr22 Ç·s]ŸÄ‹«ð%ÚÄ<¹ä’(×{e›HÀqÁç©Ç½`üŽÚõK饚9ƒÄ±€< –úƒú~ çðñO#­Í%iKKlµ¦¾F)'Iê¬Î+Ç(`ñ¾£œdÈ’` ™ºcßéé^ÿ i¸”Û\ý¡æhÔB«aq¸}ãÀÆ:ÜWƒ|FÛÿ BŒÇÀeaŸ-sÊ€:úW½ÜÝÜ<%$µ†%CóDªÀí%IÈÏʤ…ôäñÞŒ÷‘a0“ôŽÚë¤nŸoW÷0«e¶y'Å»aΗ2r’# Û°A^ý9ÉQÔõ=ù5¬£Öü.(Þ’M$~V«=éSÄFN½®©ÔWô»ÿ þHžkR‹ìÏ+µµžöê;khÚI¤m¨‹Ôš–âÖçJ¾_Z•’6 a”Èô> ÕÉaÕ<%®£2n bQŠå\tÈõUÿ ø»þ‹k15‚ÃuCL$ݹp P1=Oøýs¯^u éEJ”–éêŸê½5ýzy›jÛ³á›Ûkÿ ÚOcn±ÛÏîW;boºz{ãžüVÆ¡a£a5½äÎÂks¸J@?1è¿{$䑐=k”øsÖ^nŒ¦)ÝåXÃíùN1ØõÚOJë–xF÷h¸ Œ"Ž?x䜚ü³ì¨c*Fœ¯i;7~ñí׫Ðó¥Ë»3Ãü púw ‰°<Á%»ñž ÿ P+Û^ ¾Ye£ŽCÄŒ„/>˜>•á¶Ìm~&&À>M[hÈÈÿ [Ž•íd…RO@3^Ç(ʽ*¶ÖQZyßþ 1Vº}Ñç?¼O4Rh6R€ª£í¡ûÙ a‚3ß·Õ ü=mRÍ/µ9¤‚0ÑC¼Iè:cŽsÛ¾™x£ÆÐ¬ªÍöˢ샒W$•€Å{¨ÀPG ÀÀàŸZìÍ1RÉ0´ðxEË9+Éÿ ^rEÕ—±Š„70l¼áË@û.' ¼¹Žz€N3úUÉ<3á×*?²¬‚ä†"Ùc=p íÛ'¡ª1ñ"økJ†HÒ'»Ÿ+ oÏN¬Ã9 dÙãÜדÏâÍ~æc+j·Jzâ7(£ðW]•晍?nê´º6åwéåç÷N•ZŠíž›¬|?Ðõ?Ñ-E…®³ÇV$~X¯/…õ x‘LˆÑÜÚÈ7¦pzãÜüë½ðÄ^õtÝYËÍ7ÉÖÕ8ÏUe# #€r=sU¾/é’E§jRC4mxNÝ´9†íuá»›V‘ ZI€­×cr1Ÿpzsøf»¨åV‹ìû`qËLÊIã?\~¼³áËC©êhªOîO»‘ÃmçÛçút×¢x“Z}?Üê#b-¤X7õ Äò gž zzbº3œm*qvs·M=íúéw}¿&Úª°^Ö×µÏ(ø‡â†Öµƒenñý†×åQáYûœ÷ÇLœôÎNk¡ð‡¼/µ¸n0æÉ0¬ƒ‚üîÉÆvŒw®Sáö”š¯‹-üÕVŠØÙ[$`(9cqƒÔ_@BëqûÙ`Ýæ­0;79È?w<ó |ÙÜkßÌ1±Ëã ¿ìÒ»ðlìï«ÓnªèèrP´NÏš&Žéö Ù¸÷æ°~-_O'‰`°!RÚÚÝ%]Ø%þbß1'¿ÿ X՝áOöÎŒ·‹¬+Åæ*ÛÛ™0¤ƒOÍÔ `u¯¦ÂaèÐÃÓ«‹¨Ô¥µœ¿¯ÉyÅÙ.oÔôŸ Úx&(STðݽ¦õ] ’ÒNóÁäÈùr3í·žÚ[™ƒ¼veÈ÷ÞIõÎGlqÎ=M|«gsªxÅI6 ]Z·Îªä,¨zŒŽÄ~#ØŠúFñiÉqc©éÐD>S딑 GñŽ1éÐ^+ Ëi;Ô„µVÕú»i¯ÈÒ-ZÍ]òܘ®ì` bÛÙ¥_/y(@÷qÐúg Ô÷W0.Ø› 6Ò© r>QƒŒ0+Èîzb¨É+I0TbNñ"$~)ÕÒ6Þ‹{0VÆ27œWWñcÄcX×íôûyKZéðªc'iQ¿¯LaWŠŸS\·Š“źʸ…ôÙÂí|öÀÇåV|!¤ÂGâÛ[[’ï 3OrÙËPY¹=Î1õ5öåTžÑè Ú64/üö?Zëžk}¬¶éào፾á}3“ü]8Éæ¿´n²Žš_6¾pœ)2?úWÓÚ¥¾¨iWúdŽq{*ª1rXŒd…m»‰äcô¯–dâ•ã‘Jº¬§¨#¨® §,df«8ÉÅßN¾hˆ;îÓ=7áùpën®É 6ûJžO2^œÐò JÖø¥²ã›Ò6Ü·‰!wbÍ‚¬O©»õ¬ÿ ƒP=Ä:â¤-&ÙŽ ` È9 r9íϧzë> XÅ7ƒ5X–krÑ¢L 7€ìw}ÑŸNHëŒüþ:2†á¼+u·á÷N/Û'Ðç~ߘô«ëh!ónRéeQ´6QÛÿ èEwëÅÒ|¸Yqó1uêyùzð8 ƒŠù¦Ò;¹ä6öi<'ü³„[íZhu½ ùÍ¡g‚>r¯׊îÌx}bñ2“­k꣧oø~›hTèóËWò4|ki"xßQ˜Ï6øÀLnß‚0 ¹Æ{±–¶Öe#¨27È@^Ìß.1N¾œyç€õ†ñeé·Õã†çQ°€=­Ì©ºB€Ø8<‚ÃSõ®ùcc>×Ú .Fr:žÝGæ=kÁâ,^!Fž ¬,àµ}%¶«îõ¹†"r²ƒGœüYÕd?aÑÍY®49PyU ÷þ!žxÅm|/‚ãNð˜¼PcûTÒ,¹/Ý=FkÏ|u¨¶«â녏{¤m¢]Û¾ïP>®XãÞ½iÓÁ¾ ‰'¬–6ß¼(„ï— í!úÙäzôë^–:œ¨å|,_¿&š×]uÓѵÛô4’j”bž§x‘Æ©ã›á,‚[Ô ÎÞ= ŒËæ ÀùYÁ?ŽïÚ¼?ÁªxºÕÛ,°1¸‘¿ÝäãØ¯v…@¤åq½ºã œàûââ·z8Xýˆþz~—û»™âµj=Ž â~ãáh@'h¼F#·Üp?ŸëQü-løvépx»cŸø…lxâÃûG·‰¶ø”L£©%y?¦úõÆü-Õ¶¥y`Òl7>q’2üA?•F}c‡jB:¸Jÿ +§¹¿¸Q÷°ív=VÑìu[Qml%R7a×IèTõéŽx¬ ?†š7 1†îã-ˆã’L¡lŽ0OÓ=ÅuˆpÇ•¼3ÛùÒ¶W/!|’wŽw^qÔ×Ïaó M8Q¨ãÑ?ëï0IEhÄa¸X•`a ?!ÐñùQ!Rä žqŽžÝO`I0ÿ J“y|ñ!Îã@99>þ8–+éáu…!ù—ä ʰ<÷6’I®z ÅS„¾)Zþ_Öýµ×ËPåOwø÷þ*üïænÖùmØÝûþ¹=>¦½öî×Jh]¼ç&@§nTŒ6IT Àõ^Fxð7Å3!Ö·aÛ$þÿ ¹ã5îIo:ȪmËY[’8ÇӾlj*òû¢¥xõ¾¼ú•åk+\ð¯ HÚoŽl•Ûk,¯ ç²²cõÅ{²Z\ ´ìQ åpzŽ3Ôð}ÿ Jð¯XO¡øÎé€hÙ¥ûLdŒ`““ù6Gá^ÃáÝ^Ë[Ñb¾YåŒÊ»dŽ4 †2§,;ÿ CQÄ´¾°¨c–±”mºV{«ßÕýÄW\ÖŸ‘çŸ,çMRÆí“l-ƒn~ë©ÉÈê Ü?#Ž•¹ðãSÒ¥ÐWNíà½;ãž)™ÎSÈ9cóLj뵿Å«iÍk¨ió­¶X‚7÷ƒ€yãnyÏŽëÞ Öt`×À×V's$È9Ú:ä{wÆEk€«†Çàc—â$éÎ.éí~Ýëk}ÅAÆpörÑ¢‡Šl¡ÑüSs‹¨‰IÝ„óÀ×wñ&eºðf™pŒÆ9gŽTø£lñëÀçŽ NkÊUK0U’p ï^¡ãÈ¥´ø{£ÙHp`’ØåbqÏ©äó^Æ: Ž' ÊóM«õz+ß×ó5Ÿ»('¹­ð¦C„$˜Å¢_ºÈI?»^äã'ñêzž+ë€ñ-½»´}¡Ë*õ?.xÇ^1ŽMyǸ&“—L–îëöâ7…' bqéÎGé]˪â1$o²¸R8Ã`.q€}sÖ¾C9­8cêÆÞíïóòvÓòùœÕfÔÚéýu­èÖ·Ú Å‚_¤³ÜۺƑߝ”àרý:׃xPþÅÕî-/üØmnQìïGΊÙRqê=>¢½õnæ·r!—h`+’;ò3È<“Û©éšóŸx*÷V¹¸×tÈiˆßwiÔÿ |cŒñÏ®3Ö½̰‰Ë Qr©ö½®¼ÛoÑÙZÅÑ«O൯ýw8;k›ÿ x†;ˆJa;‘º9÷÷R+¡ñgŽí|Iáë{ôáo2ʲ9 029ÉÏLí\‰¿¸Ÿb˜ "Bv$£&#ßiê>=ªª©f ’N ëí>¡N­XW­~5×úíø\‰»½Ï^ø(—wÖú¥¤2íŽÞXæÁ$ °eÈ888^nÝë²ñÝÔ^ ÖÚ9Q~Ëå7ï DC¶ÑµƒsËÇè9®Wáþƒ6‡£´·°2\Ý:ÈÑ?(#¨'$õèGJ¥ñW\ÿ ‰E¶—¸™g˜ÌÀ¹;Pv ú±ÎNs·ëŸ’–"Ž/:té+ûË]öJöÓM»ëø˜*‘•^Uý—êd|‰åñMæÔÝ‹23å™6æHùÛ‚ëüñ^…ñ1¢oêûÑEØ.õ7*ÅHtÎp{g<·Á«+¸c¿¿pÓ¾Æby=8É_ÄsÆk¬ñB\jÞÔì••Ë[9Píb‹Bヅ =9­3§ð§LšÛáÖšÆæXÌÞdÛP.0\ãïÛ0?™úJ¸™Ë ”•œº+=<µI£¦í¯õêt¬d‹T¬P=ËFêT>ÍØØ@Ï9<÷AQÌ×»Õ¡xùk",JÎæù±Éç$œŽŸZWH®¯"·UÌQ ’ÙÈ]ÅXg<ã ߨg3-Üqe€0¢¨*Œ$܃ ’Sû 8㎼_/e'+Ï–-èÓ¶¶Õíß[·ÙÙ½î쏗¼sk%§µxä‰â-pÒeÆCrú ôσžû=”šÅô(QW‚Õd\ƒæ. \àö¹¯F½°³½0M>‘gr÷q+œ¶NïºHO— ¤ ܥݭ”n·J|ÆP6Kµc=Isó}Ò çGš)a=—#vK›åoK§ßóٍ¤¶¿õú…ÄRÚ[Ësöټˏ•Ë ópw®qœŒ·Ø ùÇâ‹ý‡ãKèS&ÞvûD Aù‘É9 ŒîqÅ} $SnIV[]ѐ´Ó}ØÜ¾A Ü|½kÅþÓ|E Mu R¼.I¼¶däò‚ÃkÆ}ðy¹vc iUœZ…­Õõ»z¾÷¿n¦*j-É­/àœHã\y5 Û ß™ó0— äŸnzôã#Ô¯,†¥ÚeÔ÷ÜÅ´„“'c…<íÝ€<·SŠ¥k§Ã¢éÆÆÙna‚8–=«ʪ[Ÿ™°pNî02z“ÔÙ–K8.È’Þî(vƒ2®@ äÈûãçžxäÇf¯ˆu¹yUÕîýWšÙ|›ëÒ%Q^í[æ|éo5ZY•^{96ˆY‚§v*x>âº_|U¹Ö´©tûMÒÂ9PÇ#«£#€ éÉñ‘ƒÍz/‰´-į¹°dd,Б›p03ƒœ{ç9=+ Ûᧇ¬¦[‡‚ê婺¸#±ß=³ý¿•Õµjñ½HÙh›Û[§ÚýÊöô÷{˜?ô÷·Ô.u©–_%còcAÀ˜’ }0x9Î>žñÇáÍ9,ahï¦Ì2òÓ ñÛAäry$V²Nð ]=$Ž ‚#Ù‚1ƒƒødõMax‡ÂÖ^!±KkÛ‘ «“Çó²FN8+ëÎ{Ò¼oí§[«ÕMRoËeç×[_m/¦¦k.kôgŽxsSÓ´ý`êzªÜÜKo‰cPC9ÎY‰#§^üý9¹âïÞx£Ë·Ú`±‰‹¤;³–=ÏaôÕAð‚÷kêÁNBéÎælcõö®£Fð†ô2Ò¬]ßÂK$ÓÜ®•”/ÊHàã$ä ¸÷ëf¹Oµúâ“”’²ø­è´µþöjçNü÷üÌ¿ xNïFÒd»¼·h®îT9ŽAµÖ>qÁçÔœtïÒ»\ȶÎîcÞäîó3¶@#ÉIÎ ÔñW.<´’¥–ÑÑ€ÕšA‚ ;†qÓë‚2q ÒÂó$# Çí‡ !Ë}Õ9ÈÎÑÉã=;ŒÇÎuñ+ÉûÏ¥öíeÙ+$úíÜ娯'+êZH4ƒq¶FV‹gïŒ208ÆÌ)íб>M|÷âÍã¾"iì‹¥£Jd´™OÝç;sÈúr+ÜäˆË)DŒ¥šF°*3Õ”d {zÔwºQ¿·UžÉf†~>I+ŒqÔ`ð3œ“Ü×f]œTÁÔn4“ƒø’Ýßõ_«*5šzGCÊ,þ+ê1ò÷O¶¸cœºb2yÇ;cùÕ£ñh¬›áÑŠr¤ÝäNBk¥—á—†gxšX/쑘hŸ*Tçn =û㦠2|(ð¿e·ºÖ$ ýìŸ!'åΰyîî+×öœ=Y:²¦ÓÞ×iü’—ü -BK™£˜›âÆ¡&véðõ-ûÉY¹=Onj¹ø¯¯yf4·±T Pó`çœ7={×mÃ/ ¢˜ZÚòK…G½¥b„’G AãÜœ*í¯Ã¿ IoæI¦NU8‘RwÈã;·€ Û×ëÒ”1Y •£E»ÿ Oyto¢<£Áö·šï,䉧ûA¼sû»Nò}¹üE{ÜÖªò1’õÞr0â}ÎØ#>à/8ïéÎ~—áÍ#ñÎlí§³2f'h”?C÷YËdð:qëõÓ·‚ïeÄ© ÔÈØÜRL+žAÎ3¼g=åšó³Œt3 ÑQ¦ùRÙßE®¼±w_;þhš’Sirÿ ^ˆã¼iੇ|RòO„m°J/“$·l“ ÇÓ¿ÿ [ÑŠÆ“„†Õø>cFÆ6Ø1ƒ– àz7Ldòxäüwá‹ÝAXùO•Úý’é®ähm­ •NÀ±ÌTÈç ƒ‘I$pGž:‚ÄbêW¢®œ´|­¦­nÍ>¶ÖÏ¢§ÎÜ¢ºö¹•%ÄqL^öÛ KpNA<ã¡ …î==ª¸óffËF‡yÌcÉ ©ç$ð=ñÏ­YþÊ’Ú]—¥‚¬‚eDïÎH>Ÿ_ÌTP™a‰ch['çÆÜò7a‡?w°Ïn§âÎ5”’¨¹uÚÛ|´ÓÓc§{O—ü1•ªxsÃZ…ÊÏy¡Ã3¸Ë2Èé» ‘ƒÎ äžÜðA§cáOéúÛ4ý5-fŒï„ù¬ûô.Ç Üsž•Ò¾•wo<¶Ÿ"¬¡º|£ î2sÇ¡éE²ÉFѱrU°dÜ6œ¨ mc†Îxë׺Þ'0²¡Rr„{j¾í·è›µ÷)º·å–‹î2|I®Y¼ºÍË·–ÃÆà㍣'óÆxƒOÆÞ&>\lóÌxP Xc¸ì Sþ5§qà/ê>#žÞW¸if$\3 ® ûÄ“ùŽÕê¾ð<Ó‹H¶óÏ" å·( á‘€:ã†8Ï=+ꨬUA×ÃËÚT’ÑÞöù¥¢]{»ms¥F0\ÑÕ—ô}&ÛB´ƒOŽÚ+›xíÄÀ1 ,v± žIëíZ0ǧ™3 í2®0ทp9öÝÔž)ÓZËoq/Ú“‘L ²ŒmùŽÓ9§[Û#Ä‘\ÞB¬Çs [;à à«g‚2ôòªœÝV§»·¯/[uó½õÛï¾ /šÍ}öüÿ «=x»HŸÂÞ.™ ÌQùŸh´‘#a$‚'¡u<Š›Æ>2>+ƒLSiöwµFó1!eg`£åœ ÷ëÛö}Á¿ÛVÙêv $¬ƒ|,s÷z€ð΃¨x÷ÅD\ÜŒÞmåÔ„ ˆ o| :{ÇÓ¶–òÁn!´0Ål€, ƒ ( ÛŒŒ c¶rsšæ,4‹MÛOH!@¢ ÇŽ„`å²9ÝÃw;AÍt0®¤¡…¯ØÄ.Àì클ƒ‘ßñ5Í,Óëu-ÈÔc¢KÃÓ£òÖ̺U.õL¯0…%2È—"~x ‚[`có±nHàŽyàö™¥keˆìŒÛFç{(Ø©†`Jã#Žwg<“:ÚÉ;M ^\yhûX‡vB·÷zrF?§BÊÔ/s<ÐÈB)Û± ·ÍÔwç5Âã:så§e{mѤï«Òíh—]Wm4âí¿ùþW4bC3¶ª¾Ùr$ pw`àädzt!yŠI„hÂîàM)!edŒm'æ>Ç?wzºK­ìcŒ´¯Ìq6fp$)ãw¡éUl`µ»ARAˆÝÕgr:äŒgƒéé[Ôö±”iYs5Ýï«ÙG—K=þF’æMG«óÿ `ŠKɦuOQ!ÕåŒ/ÎGÞ`@ËqÕzdõâ«Ê/Ö(ƒK´%ŽbMü åÜŸö—>¤óŒŒV‘°„I¢Yž#™¥ùÏÊ@8 œgqöö5ª4vד[¬(q cò¨À!FGaÁõõ¯?§†¥ÏU½í¿WªZ$úyú½Žz×§Éþ?>Ã×È•6°{™™ŽÙ.$`­ÎUœ…çè ' ¤r$1Ø(y7 ðV<ž:È  ÁÎMw¾Â'Øb§øxb7gãО½óÉÊë²,i„Fȹ£§8ãä½k¹¥¦ê/ç{ïê驪2œ/«ü?¯Ô›ìñÜ$þeýœRIåŒg9Ác’zrrNO bÚi¢ ѺË/$,“ª¯Ýä;Œ× ´<ÛÑn³IvŸb™¥ nm–ÄŸ—nÝÀãŽ3ëÍG,.öó³˜Ù£¹u ÊÌrŠ[<±!@Æ:c9ÅZh ì’M5ÄìÌ-‚¼ëÉùqŽGì9¬á ;¨A-ž—évþÖ–^ON·Ô”ŸEý}ú×PO&e[]ÒG¸˜Ûp ƒÃà/Ë·8ûÀ€1ž@¿ÚB*²­¼ñì8@p™8Q“žÆH'8«I-%¸‚ F»“åó6°Uù|¶Ú¸ã ò^Äw¥ŠÖK–1ÜÝK,Žddlí²0PÀü“×ükG…¯U«·¶–´w¶ŽÍ¾©yÞú[Zös•¯Á[™6° ¨¼ÉVæq·,# ìãï‘×8îry®A››¨,ãc66»Ë´ã'æÉù?t}¢æH--Òá"›|ˆ¬[í  7¶ö#¸9«––‹$,+Ëqœ\Êø c€yê^ݸÄa°«™B-9%«×®‹V´w~vÜTéꢷþ¼ˆ%·¹• ’[xç•÷2gØS?6åÀÚ õ9É#š@÷bT¸º²C*3Bá¤òÎA9 =úU§Ó"2Ãlá0iÝIc‚2Î@%öç94ùô»'»HÄ¥Ô¾@à Tp£šíx:úÊ:5eºßMý×wµ›Ó_+šº3Ýyvÿ "ºÇ<ÂI>Õ 1G·Ë«È«É# àÈÇ øp Jv·šæDûE¿›†Ë’NFr2qŸ½ÇAÜšu•´éí#Ħ8£2”Ú2Ã/€[ÎTr;qŠz*ý’Îþ(≠;¡TÆâ›;ºÿ àçœk‘Þ­8¾Uª¾íé{^×IZéwÓkXÉûÑZo¯_øo×È¡¬ â–ÞR§2„‚Àœü½ùç® SVa†Âüª¼±D‘ŒísŸàä|ä2 æ[‹z”¯s{wn„ÆmáóCO+†GO8Ïeçåº`¯^¼ðG5f{Xžä,k‰<á y™¥voÆ éÛõëI=œ1‹éíÔÀÑ)R#;AÂncäŽ:tÏ#¶TkB.0Œ-ÖÞZÛgumß}fÎJÉ+#2êÔP£žùÈÅi¢%œ3P*Yƒò‚Aì“Ž2r:ƒÐúñi­RUQq‰H9!”={~¼ “JŽV¥»×²m.ÛߺiYl¾òk˜gL³·rT• ’…wHÁ6ä`–Î3ùÌ4Øe³†&òL‘•%clyîAÂäà0 žüç$[3uŘpNOÀÉ=† cï{rYK ååä~FÁ •a»"Lär1Ó¯2Äõæ<™C•.fÕ»è¥~½-¿g½Â4¡{[ør¨¶·Žõäx¥’l®qpwÇ»8ärF \cޏܯÓ-g‚yciÏÀ¾rÎwèØÈ#o°Á9ã5¢šfÔxÞæfGusÏÌJÿ µ×œ/LtãÅT7²¶w,l ɳ;”eúà·¨çîŒsÜgTÃS¦­^ '~‹®›¯+k÷ZÖd©Æ*Ó[Ü«%Œk0ŽXƒ”$k#Ȩ P2bv‘ƒŸáÇ™ÆÕb)m$É*8óLE‘8'–ÜN Úyàúô­+{uº±I'wvš4fÜr íì½=úuú sFlìV$‘ö†Hсù€$§ õ=½¸«Ž] :Ž+•¦ïmRþ½l´îÊT#nkiøÿ _ðÆT¶7Ò½ºÒ£Î¸d\ã8=yãŽÜäR{x]ZâÚé#¸r²#»ÎHÆ6õ ç® ÎFkr;sºÄ.&;só± Ç9êH÷ýSšÕ­tÐU¢-n­ Ì| vqœ„{gŒt§S.P‹’މ_[;m¥Þ­ZýRûÂX{+¥úü¼ú•-àÓ7!„G"“´‹žƒnrYXã¸îp éœ!Ó­oP̏tÑ (‰Þ¹é€sÓ#GLçÕšÑnJý¡!‘Tä#“ß?îýp}xÇ‚I¥Õn#·¸–y'qó@r[ Êô÷<ÔWÃÓ¢áN¥4ԝ’I&ݼ¬¬¼ÞºvéÆ FQV~_ÒüJÖÚt¥¦Xá3BÄP^%ÈÎW-×c¡ú©¤·Iþèk¥š?–UQåIR[’O 5x\ÉhÆI¶K4«2ùªŠŒ<¼óœçØ`u«‚Í.VHä € Ëgfx''9ÆI#±®Z8 sISºku¢ßÞ]úk»Jößl¡B.Ü»ÿ MWe °·Ž%šêɆ¼»Âù³´œ O¿cÐÓÄh©"ÛÜÏ.ÖV ’3nüÄmnq[ŒòznšÖ>J¬òˆæ…qýØP Ž:ä7^0yëWšÍ_79äoaÈ °#q0{ää×mœy”R{vÒÞ¶ÚÏe¥“ÚÆÐ¥Ì®—õýjR •íç›Ìb„+J yÜØÙ•Ç]¿Ôd þËOL²”9-Œ—õÃc'æÝלçÚ²ìejP“½ âù°¨†ðqòädЃÉäÖÜj÷PÇp“ÍšŠå«‘î <iWN­smª»¶vÓz5»ûì:Rs\Ðßôû×uÔÿÙ