[Tͪ#n$;<:a4sX[1te:oB0A|>'%ޚP?nRM4 dr9X%nX8Jq`2Z0[Tuz`<R5צZjԲ1f`e*ugmiKO99c^Mfxdjsͼ:s[cms4^ֽGfn}ئ۰_ѷm"s#BD	hV'
|X#צo<YQ,-Z@nG|+`|wX.3dsfɍ@wTC =/˕#Kl#|0)(<eq1K<$'^٤_tb&Cw\~ܘXb[ƞƱS$lH4%hPDtwNdٷYFi*8jN*#-+藉#3:rA(̬cIwv 8k8#հv hcAfɍ@wTCE
>E8fuZ%/MSg6^/
/"Ϛ%Bss$p7#9CTQu) ~rkea_fEn;^S.^{K> +
#1l%SZ񷶩g>T|n5^h=8_YU1lّ/#pyܻfiJtx8ͬ *'3ğ`,UFuRsJY(kSv*?Jt1kVo^ɬ#Ŧ6jUCeflKꮼj1k5kRGZ<5ƙ`DSOz"6|L}ǝ40fS5]B֕BJ_ QT\"LtwBDJtRo֟$hy&܉P۽%"&tuAyrvEeIhُ:,裘5{AÆ.x`Ͳ<q
W\DJ?]T7	wϖ/:RXqh5x_쯿yXː15,jiInğ`,UFuR.	#gC-,eH03sm aɯ*C<+1S\G	7 }0UN0D!J~-N3mԗd (#{gk1Uf;4?\Ij<MVGz
[L:,fL^ߢS
+=b{DMôw+- QDTZ5TJ hdT)`+sW2(6cu9"'
ZejprP";_U^!ѣK_*+8Ncю1HY_ÌfQyL:**S4>1np	iS=k֊&`-A?*,}3!/+2'X-\{$Dz	a͍VP31/ⶦT񊒮> -Zk.s5=rIǽfrxu#G]iI^mdŲTmt6:%tB =|0QMUX:X+|J_U%w&|[\gBSVb	wUzfѲrބ!2<W<qJ5O,oGlԙN24mf٦8h`C,)V0pO<~K_0ʳQ&Qn2UNC0[B-]،?-HK(8ZRlhGdYnV k]y&YMECE&aAp,()%\bcŀXNy[ԭE$uR3<J%J@&]O)i#׾Av8ht0jQ0&7}EĄk:hW~̹asF8\]ctϮ`V*vjBlqcSETeg)(ysrʅszZE@^X
U9SO|+3$vf?J*҄81]ta]3gc01I
/qBD	A%O?\M;ғȽjMFim' @0!wcf1d {-L
o&]fU2qLpSb˜2oO3/L0ix^oFa0nziqC,SRpj?F	CxS0ߓ1<麯}b
Z=xW၊t}~V0x.r8q>@VA+U8WHUT|_ftkuXA28 N^C?ӽC]໾:.!s~2,q_7$H_)ݮG-rI1ELCi۞`y|e2N=)iWmVk`\zghQlzlxi*v`q
=@N'e~bcflMK=|1_r@Xoy5h7cX"9V~I	zs(eFvW>k2ԫ5'"B-É=L0ix^oFa0nz0"D"zLȫEw"fMMw+}Z٦$G71Rőgn#8s	sQ= ={H=wOHmQ@IF˼o<N]mZ}֬rT+v|cŅ䢾t)]ڧG|h➊MR(E'j> <,Rg ' I_MTZh=72iI	r,8zghQlzlxi*v`q
=@[~+b!騬ƉkqWrg'DrSs֧#7wdvQqK^UkfJVzrg&ڋ۠@?tz3H9s݈! H szZE-q{ș'\U>t{@v-yHy$"v2#CS(=%g+raFgV6471bH*byiO0QT*ӒΥʦZh}RZB9zxԩ+W+l)jAzwg|ڲ=3rZtÈt>L޼$xq?7Sz*3|q>l	\c1rW_n)yBt~<+KG0tMu^>Ӛp[HTK)ӿ9"}}GEL!yU߽1Vbpy'q;6pHDA:S?GlZ?MX=~cT
0QmBY/|&K~<xx#haϿN,bsi]pn=+,Sxuh	B  lH3Nᾣ1#Ɏzg
wRn5VYbucmƧTwIV|EԐo}&[RF_!ٗYNKN;؏ts>XFt*PUEtcU	!T(Yt/MHzɷrhkɅ?ֿ.h<ҹ.9%2r /Rɼ.YL	T:x*SNAV(qͅ,| [9lگ.Ԥ>"IHXik%Bܻ%e@Ib!Tsde
WJ)+H9y{cإ8DŖq@(=u6
    /**
     * magic method: return string representation for this object
     *
     * @return string
     */
    public function __toString()
    {
        return $this->getMessage();
    }

    /**
     * get Message of type success
     *
     * shorthand for getting a simple success message
     *
     * @param string $string A localized string
     *                       e.g. __('Your SQL query has been
     *                       executed successfully')
     *
     * @return Message
     * @static
     */
    static public function success($string = '')
    {
        if (empty($string)) {
            $string = __('Your SQL query has been executed successfully.');
        }

        return new Message($string, Message::SUCCESS);
    }

    /**
     * get Message of type error
     *
     * shorthand for getting a simple error message
     *
     * @param string $string A localized string e.g. __('Error')
     *
     * @return Message
     * @static
     */
    static public function error($string = '')
    {
        if (empty($string)) {
            $string = __('Error');
        }

        return new Message($string, Message::ERROR);
    }

    /**
     * get Message of type notice
     *
     * shorthand for getting a simple notice message
     *
     * @param string $string A localized string
     *                       e.g. __('The additional features for working with
     *                       linked tables have been deactivated. To find out
     *                       why click %shere%s.')
     *
     * @return Message
     * @static
     */
    static public function notice($string)
    {
        return new Message($string, Message::NOTICE);
    }

    /**
     * get Message with customized content
     *
     * shorthand for getting a customized message
     *
     * @param string  $message A localized string
     * @param integer $type    A numeric representation of the type of message
     *
     * @return Message
     * @static
     */
    static public function raw($message, $type = Message::NOTICE)
    {
        $r = new Message('', $type);
        $r->setMessage($message);
        $r->setBBCode(false);
        return $r;
    }

    /**
     * get Message for number of affected rows
     *
     * shorthand for getting a customized message
     *
     * @param integer $rows Number of rows
     *
     * @return Message
     * @static
     */
    static public function getMessageForAffectedRows($rows)
    {
        $message = Message::success(
            _ngettext('%1$d row affected.', '%1$d rows affected.', $rows)
        );
        $message->addParam($rows);
        return $message;
    }

    /**
     * get Message for number of deleted rows
     *
     * shorthand for getting a customized message
     *
     * @param integer $rows Number of rows
     *
     * @return Message
     * @static
     */
    static public function getMessageForDeletedRows($rows)
    {
        $message = Message::success(
            _ngettext('%1$d row deleted.', '%1$d rows deleted.', $rows)
        );
        $message->addParam($rows);
        return $message;
    }

    /**
     * get Message for number of inserted rows
     *
     * shorthand for getting a customized message
     *
     * @param integer $rows Number of rows
     *
     * @return Message
     * @static
     */
    static public function getMessageForInsertedRows($rows)
    {
        $message = Message::success(
            _ngettext('%1$d row inserted.', '%1$d rows inserted.', $rows)
        );
        $message->addParam($rows);
        return $message;
    }

    /**
     * get Message of type error with custom content
     *
     * shorthand for getting a customized error message
     *
     * @param string $message A localized string
     *
     * @return Message
     * @static
     */
    static public function rawError($message)
    {
        return Message::raw($message, Message::ERROR);
    }

    /**
     * get Message of type notice with custom content
     *
     * shorthand for getting a customized notice message
     *
     * @param string $message A localized string
     *
     * @return Message
     * @static
     */
    static public function rawNotice($message)
    {
        return Message::raw($message, Message::NOTICE);
    }

    /**
     * get Message of type success with custom content
     *
     * shorthand for getting a customized success message
     *
     * @param string $message A localized string
     *
     * @return Message
     * @static
     */
    static public function rawSuccess($message)
    {
        return Message::raw($message, Message::SUCCESS);
    }

    /**
     * returns whether this message is a success message or not
     * and optionally makes this message a success message
     *
     * @param boolean $set Whether to make this message of SUCCESS type
     *
     * @return boolean whether this is a success message or not
     */
    public function isSuccess($set = false)
    {
        if ($set) {
            $this->setNumber(Message::SUCCESS);
        }

        return $this->getNumber() === Message::SUCCESS;
    }

    /**
     * returns whether this message is a notice message or not
     * and optionally makes this message a notice message
     *
     * @param boolean $set Whether to make this message of NOTICE type
     *
     * @return boolean whether this is a notice message or not
     */
    public function isNotice($set = false)
    {
        if ($set) {
            $this->setNumber(Message::NOTICE);
        }

        return $this->getNumber() === Message::NOTICE;
    }

    /**
     * returns whether this message is an error message or not
     * and optionally makes this message an error message
     *
     * @param boolean $set Whether to make this message of ERROR type
     *
     * @return boolean Whether this is an error message or not
     */
    public function isError($set = false)
    {
        if ($set) {
            $this->setNumber(Message::ERROR);
        }

        return $this->getNumber() === Message::ERROR;
    }

    /**
     * Set whether we should use BB Code when rendering.
     *
     * @param boolean $useBBCode Use BB Code?
     *
     * @return void
     */
    public function setBBCode($useBBCode)
    {
        $this->useBBCode = $useBBCode;
    }

    /**
     * set raw message (overrides string)
     *
     * @param string  $message  A localized string
     * @param boolean $sanitize Whether to sanitize $message or not
     *
     * @return void
     */
    public function setMessage($message, $sanitize = false)
    {
        if ($sanitize) {
            $message = Message::sanitize($message);
        }
        $this->message = $message;
    }

    /**
     * set string (does not take effect if raw message is set)
     *
     * @param string  $string   string to set
     * @param boolean $sanitize whether to sanitize $string or not
     *
     * @return void
     */
    public function setString($string, $sanitize = true)
    {
        if ($sanitize) {
            $string = Message::sanitize($string);
        }
        $this->string = $string;
    }

    /**
     * set message type number
     *
     * @param integer $number message type number to set
     *
     * @return void
     */
    public function setNumber($number)
    {
        $this->number = $number;
    }

    /**
     * add parameter, usually in conjunction with strings
     *
     * usage
     * <code>
     * $message->addParam('strLocale', false);
     * $message->addParam('[em]some string[/em]');
     * $message->addParam('<img src="img" />', false);
     * </code>
     *
     * @param mixed   $param parameter to add
     * @param boolean $raw   whether parameter should be passed as is
     *                       without html escaping
     *
     * @return void
     */
    public function addParam($param, $raw = true)
    {
        if ($param instanceof Message) {
            $this->params[] = $param;
        } elseif ($raw) {
            $this->params[] = htmlspecialchars($param);
        } else {
            $this->params[] = Message::notice($param);
        }
    }

    /**
     * add another string to be concatenated on displaying
     *
     * @param string $string    to be added
     * @param string $separator to use between this and previous string/message
     *
     * @return void
     */
    public function addString($string, $separator = ' ')
    {
        $this->addedMessages[] = $separator;
        $this->addedMessages[] = Message::notice($string);
    }

    /**
     * add a bunch of messages at once
     *
     * @param array  $messages  to be added
     * @param string $separator to use between this and previous string/message
     *
     * @return void
     */
    public function addMessages($messages, $separator = ' ')
    {
        foreach ($messages as $message) {
            $this->addMessage($message, $separator);
        }
    }

    /**
     * add another raw message to be concatenated on displaying
     *
     * @param mixed  $message   to be added
     * @param string $separator to use between this and previous string/message
     *
     * @return void
     */
    public function addMessage($message, $separator = ' ')
    {
        if (mb_strlen($separator)) {
            $this->addedMessages[] = $separator;
        }

        if ($message instanceof Message) {
            $this->addedMessages[] = $message;
        } else {
            $this->addedMessages[] = Message::rawNotice($message);
        }
    }

    /**
     * set all params at once, usually used in conjunction with string
     *
     * @param array|string $params   parameters to set
     * @param boolean      $sanitize whether to sanitize params
     *
     * @return void
     */
    public function setParams($params, $sanitize = false)
    {
        if ($sanitize) {
            $params = Message::sanitize($params);
        }
        $this->params = $params;
    }

    /**
     * return all parameters
     *
     * @return array
     */
    public function getParams()
    {
        return $this->params;
    }

    /**
     * return all added messages
     *
     * @return array
     */
    public function getAddedMessages()
    {
        return $this->addedMessages;
    }

    /**
     * Sanitizes $message
     *
     * @param mixed $message the message(s)
     *
     * @return mixed  the sanitized message(s)
     * @access  public
     * @static
     */
    static public function sanitize($message)
    {
        if (is_array($message)) {
            foreach ($message as $key => $val) {
                $message[$key] = Message::sanitize($val);
            }

            return $message;
        }

        return htmlspecialchars($message);
    }

    /**
     * decode $message, taking into account our special codes
     * for formatting
     *
     * @param string $message the message
     *
     * @return string  the decoded message
     * @access  public
     * @static
     */
    static public function decodeBB($message)
    {
        return PMA_sanitize($message, false, true);
    }

    /**
     * wrapper for sprintf()
     *
     * @return string formatted
     */
    static public function format()
    {
        $params = func_get_args();
        if (isset($params[1]) && is_array($params[1])) {
            array_unshift($params[1], $params[0]);
            $params = $params[1];
        }

        return call_user_func_array('sprintf', $params);
    }

    /**
     * returns unique Message::$hash, if not exists it will be created
     *
     * @return string Message::$hash
     */
    public function getHash()
    {
        if (null === $this->hash) {
            $this->hash = md5(
                $this->getNumber() .
                $this->string .
                $this->message
            );
        }

        return $this->hash;
    }

    /**
     * returns compiled message
     *
     * @return string complete message
     */
    public function getMessage()
    {
        $message = $this->message;

        if (0 === mb_strlen($message)) {
            $string = $this->getString();
            if (isset($GLOBALS[$string])) {
                $message = $GLOBALS[$string];
            } elseif (0 === mb_strlen($string)) {
                $message = '';
            } else {
                $message = $string;
            }
        }

        if ($this->isDisplayed()) {
            $message = $this->getMessageWithIcon($message);
        }
        if (count($this->getParams()) > 0) {
            $message = Message::format($message, $this->getParams());
        }

        if ($this->useBBCode) {
            $message = Message::decodeBB($message);
        }

        foreach ($this->getAddedMessages() as $add_message) {
            $message .= $add_message;
        }

        return $message;
    }

    /**
    * Returns only message string without image & other HTML.
    *
    * @return string
    */
    public function getOnlyMessage()
    {
        return $this->message;
    }


    /**
     * returns Message::$string
     *
     * @return string Message::$string
     */
    public function getString()
    {
        return $this->string;
    }

    /**
     * returns Message::$number
     *
     * @return integer Message::$number
     */
    public function getNumber()
    {
        return $this->number;
    }

    /**
     * returns level of message
     *
     * @return string  level of message
     */
    public function getLevel()
    {
        return Message::$level[$this->getNumber()];
    }

    /**
     * Displays the message in HTML
     *
     * @return void
     */
    public function display()
    {
        echo $this->getDisplay();
        $this->isDisplayed(true);
    }

    /**
     * returns HTML code for displaying this message
     *
     * @return string whole message box
     */
    public function getDisplay()
    {
        $this->isDisplayed(true);
        return '<div class="' . $this->getLevel() . '">'
            . $this->getMessage() . '</div>';
    }

    /**
     * sets and returns whether the message was displayed or not
     *
     * @param boolean $isDisplayed whether to set displayed flag
     *
     * @return boolean Message::$isDisplayed
     */
    public function isDisplayed($isDisplayed = false)
    {
        if ($isDisplayed) {
            $this->isDisplayed = true;
        }

        return $this->isDisplayed;
    }

    /**
     * Returns the message with corresponding image icon
     *
     * @param string $message the message(s)
     *
     * @return string message with icon
     */
    public function getMessageWithIcon($message)
    {
        if ('error' == $this->getLevel()) {
            $image = 's_error.png';
        } elseif ('success' == $this->getLevel()) {
            $image = 's_success.png';
        } else {
            $image = 's_notice.png';
        }
        $message = Message::notice(Util::getImage($image)) . " " . $message;
        return $message;

    }
}
