diff -x graphtree -Naru ./README.md graphtree/README.md
--- ./README.md	1970-01-01 08:00:00.000000000 +0800
+++ graphtree/README.md	2016-04-18 19:04:39.000000000 +0800
@@ -0,0 +1 @@
+#OneOaas-Zabbix301
diff -x graphtree -Naru ./biggraph.php graphtree/biggraph.php
--- ./biggraph.php	1970-01-01 08:00:00.000000000 +0800
+++ graphtree/biggraph.php	2016-04-18 19:04:38.000000000 +0800
@@ -0,0 +1,166 @@
+<?php
+    /*
+    ** Zabbix
+    ** Copyright (C) 2001-2015 Zabbix SIA
+    **
+    ** This program is free software; you can redistribute it and/or modify
+    ** it under the terms of the GNU General Public License as published by
+    ** the Free Software Foundation; either version 2 of the License, or
+    ** (at your option) any later version.
+    **
+    ** This program is distributed in the hope that it will be useful,
+    ** but WITHOUT ANY WARRANTY; without even the implied warranty of
+    ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+    ** GNU General Public License for more details.
+    **
+    ** You should have received a copy of the GNU General Public License
+    ** along with this program; if not, write to the Free Software
+    ** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+    **/
+
+
+    require_once dirname(__FILE__) . '/include/config.inc.php';
+    require_once dirname(__FILE__) . '/include/hosts.inc.php';
+    require_once dirname(__FILE__) . '/include/graphs.inc.php';
+
+    $page['title'] = _('Big graphs');
+    $page['file'] = 'biggraph.php';
+    $page['hist_arg'] = array('hostid', 'groupid', 'graphid');
+    $page['scripts'] = array('class.calendar.js', 'gtlc.js', 'flickerfreescreen.js');
+    $page['type'] = detect_page_type(PAGE_TYPE_HTML);
+
+    define('ZBX_PAGE_DO_JS_REFRESH', 1);
+    define('ZBX_PAGE_NO_MENU', 1);
+
+    ob_start();
+    require_once dirname(__FILE__) . '/include/page_header.php';
+
+    // VAR	TYPE	OPTIONAL	FLAGS	VALIDATION	EXCEPTION
+    $fields = array(
+        'groupid'     => array(T_ZBX_INT, O_OPT, P_SYS, DB_ID, null),
+        'hostid'      => array(T_ZBX_INT, O_OPT, P_SYS, DB_ID, null),
+        'graphid'     => array(T_ZBX_INT, O_OPT, P_SYS, DB_ID, null),
+        'period'      => array(T_ZBX_INT, O_OPT, P_SYS, null, null),
+        'stime'       => array(T_ZBX_STR, O_OPT, P_SYS, null, null),
+        'fullscreen'  => array(T_ZBX_INT, O_OPT, P_SYS, IN('0,1'), null),
+        // ajax
+        'filterState' => array(T_ZBX_INT, O_OPT, P_ACT, null, null),
+        'favobj'      => array(T_ZBX_STR, O_OPT, P_ACT, null, null),
+        'favid'       => array(T_ZBX_INT, O_OPT, P_ACT, null, null),
+        'favaction'   => array(T_ZBX_STR, O_OPT, P_ACT, IN('"add","remove"'), null)
+    );
+    check_fields($fields);
+
+    /*
+     * Permissions
+     */
+    if (getRequest('groupid') && !API::HostGroup()->isReadable(array($_REQUEST['groupid']))) {
+        access_deny();
+    }
+    if (getRequest('hostid') && !API::Host()->isReadable(array($_REQUEST['hostid']))) {
+        access_deny();
+    }
+
+    if (getRequest('graphid')) {
+        $graphs = API::Graph()->get(array(
+            'graphids' => array($_REQUEST['graphid']),
+            'output'   => array('graphid')
+        ));
+        if (!$graphs) {
+            access_deny();
+        }
+    }
+
+
+    $pageFilter = new CPageFilter(array(
+        'groups'  => array('real_hosts' => true, 'with_graphs' => true),
+        'hosts'   => array('with_graphs' => true),
+        'groupid' => getRequest('groupid'),
+        'hostid'  => getRequest('hostid'),
+        'graphs'  => array('templated' => 0),
+        'graphid' => getRequest('graphid')
+    ));
+
+    /*
+     * Ajax
+     */
+    if (hasRequest('filterState')) {
+        CProfile::update('web.biggraph.filter.state', getRequest('filterState'), PROFILE_TYPE_INT);
+    }
+
+    if (isset($_REQUEST['favobj'])) {
+        if (getRequest('favobj') === 'timelinefixedperiod' && hasRequest('favid')) {
+            CProfile::update('web.biggraph.timelinefixed', getRequest('favid'), PROFILE_TYPE_INT);
+        }
+
+        if (str_in_array($_REQUEST['favobj'], array('itemid', 'graphid'))) {
+            $result = false;
+
+            DBstart();
+
+            if ($_REQUEST['favaction'] == 'add') {
+                $result = CFavorite::add('web.favorite.graphids', $_REQUEST['favid'], $_REQUEST['favobj']);
+                if ($result) {
+                    echo '$("addrm_fav").title = "' . _('Remove from favourites') . '";' . "\n";
+                    echo '$("addrm_fav").onclick = function() { rm4favorites("graphid", "' . $_REQUEST['favid'] . '"); }' . "\n";
+                }
+            } elseif ($_REQUEST['favaction'] == 'remove') {
+                $result = CFavorite::remove('web.favorite.graphids', $_REQUEST['favid'], $_REQUEST['favobj']);
+                if ($result) {
+                    echo '$("addrm_fav").title = "' . _('Add to favourites') . '";' . "\n";
+                    echo '$("addrm_fav").onclick = function() { add2favorites("graphid", "' . $_REQUEST['favid'] . '"); }' . "\n";
+                }
+            }
+
+            $result = DBend($result);
+
+            if ($page['type'] == PAGE_TYPE_JS && $result) {
+                echo 'switchElementClass("addrm_fav", "iconminus", "iconplus");';
+            }
+        }
+    }
+
+    if (!empty($_REQUEST['period']) || !empty($_REQUEST['stime'])) {
+        CScreenBase::calculateTime(array(
+            'profileIdx'    => 'web.biggraph',
+            'profileIdx2'   => $pageFilter->graphid,
+            'updateProfile' => true,
+            'period'        => getRequest('period'),
+            'stime'         => getRequest('stime')
+        ));
+
+        $curl = new CUrl();
+        $curl->removeArgument('period');
+        $curl->removeArgument('stime');
+
+        ob_end_clean();
+
+        DBstart();
+        CProfile::flush();
+        DBend();
+        redirect($curl->getUrl());
+    }
+
+    ob_end_flush();
+
+
+    if ($page['type'] == PAGE_TYPE_JS || $page['type'] == PAGE_TYPE_HTML_BLOCK) {
+        require_once dirname(__FILE__) . '/include/page_footer.php';
+        exit;
+    }
+
+    /*
+     * Display
+     */
+    $data = array(
+        'pageFilter' => $pageFilter,
+        'graphid'    => $pageFilter->graphid,
+        'fullscreen' => $_REQUEST['fullscreen']
+    );
+
+    // render view
+    $chartsView = new CView('monitoring.charts', $data);
+    $chartsView->render();
+    $chartsView->show();
+
+    require_once dirname(__FILE__) . '/include/page_footer.php';
diff -x graphtree -Naru ./graphtree.left.php graphtree/graphtree.left.php
--- ./graphtree.left.php	1970-01-01 08:00:00.000000000 +0800
+++ graphtree/graphtree.left.php	2016-04-18 19:04:38.000000000 +0800
@@ -0,0 +1,140 @@
+<?php
+
+require_once dirname(__FILE__) . '/include/config.inc.php';
+
+$type = getRequest("type", "");
+if ($type === "zTree") {
+    $page['scripts'] = ["jquery.ztree.core-3.5.js", "graphtree.js"];
+    $page['type'] = detect_page_type(PAGE_TYPE_HTML);
+    $page['css'] = ["ztree/zTreeStyle.css"];
+    define("ZBX_PAGE_NO_MENU", 1);
+    define("ZBX_PAGE_NO_HEADER", 1);
+    define("ZBX_PAGE_NO_THEME", 1);
+
+    require_once dirname(__FILE__) . '/include/page_header.php';
+
+    $left_tree = new CTag("ul", "yes");
+    $left_tree->setAttribute("id", "graphtree");
+    $left_tree->setAttribute("class", "ztree");
+
+    $graphtreeJs = <<<GRAPHJS
+
+        var zTree;
+        var setting = {
+            view: {
+                dblClickExpand: false
+            },
+            async: { //å¼‚æ­¥åŠ è½½è¯·æ±‚æ•°æ�®
+                enable: true,
+                url: "graphtree.left.php",
+                autoParam: ["groupid=groupid", "hostid=hostid"], //è¯·æ±‚çš„å�‚æ•°å�³groupid=nodeid
+                otherParam: {"timestamp": new Date().getTime()},
+                type: "get"
+            },
+            callback: {}
+        };
+
+        jQuery(document).ready(function () {
+            jQuery.fn.zTree.init(jQuery("#graphtree"), setting);
+            //å�³é”®è�œå�•
+            zTree = jQuery.fn.zTree.getZTreeObj("graphtree");
+        });
+GRAPHJS;
+    insert_js($graphtreeJs, true);
+    $left_tree->show();
+} else {
+    $groupid = getRequest("groupid", 0);
+    $hostid = getRequest("hostid", 0);
+
+    if ($groupid > 0) {
+        //æ ¹æ�®åˆ†ç»„idæŸ¥è¯¢åˆ†ç»„ä¸‹çš„æœºå™¨
+        $hosts = API::Host()->get([
+            "output"          => ["hostid", "host", "name"],
+            "monitored_hosts" => true,
+            "groupids"        => [$groupid],
+            "sortfield"       => ["host"],
+            "sortorder"       => ["ASC"]
+        ]);
+
+        $new_list = $hosts;
+        foreach ($hosts as &$each_host) {
+            $each_host['target'] = 'rightFrame';
+            $each_host['isParent'] = "true";
+            $app_count = API::Application()->get([
+                'countOutput' => "1",
+                'hostids'     => $each_host['hostid']
+            ]);
+            $each_host['name'] = $each_host['name'] . '(' . $app_count . ')';
+            $each_host['url'] = 'graphtree.right.php?hostid=' . $each_host['hostid'];
+        }
+        unset($each_host);
+        echo json_encode(array_values($hosts));
+    } else {
+        if ($groupid == 0) {
+            if ($hostid == 0) {
+                //æŸ¥è¯¢æ‰€æœ‰çš„åˆ†ç»„åˆ—è¡¨
+                $groups = API::HostGroup()->get([
+                    "output"               => "extend",
+                    "monitored_hosts"      => true,
+                    "with_monitored_items" => 1,
+                    "sortfield"            => "name"
+                ]);
+
+                //$groups = getAvailableHostGroup();
+                foreach ($groups as &$each) {
+                    $each['id'] = $each['groupid'];
+                    $each['isParent'] = true;
+                    $each['target'] = 'rightFrame';
+                    $each['url'] = 'graphtree.right.php?groupid=' . $each['groupid'];
+
+                    //æŸ¥è¯¢ä¸‹é�¢æœ‰å¤šå°‘æœºå™¨
+                    $hosts = API::Host()->get([
+                        "output"          => "extend",
+                        "monitored_hosts" => true,
+                        "groupids"        => [$each['groupid']]
+                    ]);
+
+                    $each['name'] = $each['name'] . '(' . count($hosts) . ')';
+                }
+                /*$groups[] = array(
+                    'groupid' => -1,
+                    'name' => 'others',
+                    'internal' => 0 ,
+                    'flags'=> 0,
+                    'id' => -1,
+                    'isParent' => 1,
+                    'target' => 'rightFrame',
+                    'url' => 'graphtree.right.php?groupid=-1'
+                );*/
+                echo json_encode($groups);
+            } else {
+                $applications = API::Application()->get([
+                    "output"    => "extend",
+                    "hostids"   => [$hostid],
+                    "sortfield" => ["name"],
+                    "sortorder" => ["ASC"]
+                ]);
+
+                if (is_array($applications)) {
+                    foreach ($applications as &$each) {
+                        $each['target'] = 'rightFrame';
+                        $each['url'] = 'graphtree.right.php?applicationid=' . $each['applicationid'];
+                    }
+                }
+
+                echo json_encode($applications);
+            }
+        }
+    }/*else{
+            $other_items = array(
+                'applicationid' => 10000,
+                'name' => "other_001",
+                'target' => 'rightFrame',
+                'url' => 'graphtree.right.php?applicationid=10000'
+            );
+            echo json_encode($other_items);
+        }*/
+}
+
+
+
diff -x graphtree -Naru ./graphtree.patch graphtree/graphtree.patch
--- ./graphtree.patch	2016-04-18 19:05:13.000000000 +0800
+++ graphtree/graphtree.patch	1970-01-01 08:00:00.000000000 +0800
@@ -1,319 +0,0 @@
-diff -x graphtree -Naru ./README.md graphtree/README.md
---- ./README.md	1970-01-01 08:00:00.000000000 +0800
-+++ graphtree/README.md	2016-04-18 19:04:39.000000000 +0800
-@@ -0,0 +1 @@
-+#OneOaas-Zabbix301
-diff -x graphtree -Naru ./biggraph.php graphtree/biggraph.php
---- ./biggraph.php	1970-01-01 08:00:00.000000000 +0800
-+++ graphtree/biggraph.php	2016-04-18 19:04:38.000000000 +0800
-@@ -0,0 +1,166 @@
-+<?php
-+    /*
-+    ** Zabbix
-+    ** Copyright (C) 2001-2015 Zabbix SIA
-+    **
-+    ** This program is free software; you can redistribute it and/or modify
-+    ** it under the terms of the GNU General Public License as published by
-+    ** the Free Software Foundation; either version 2 of the License, or
-+    ** (at your option) any later version.
-+    **
-+    ** This program is distributed in the hope that it will be useful,
-+    ** but WITHOUT ANY WARRANTY; without even the implied warranty of
-+    ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+    ** GNU General Public License for more details.
-+    **
-+    ** You should have received a copy of the GNU General Public License
-+    ** along with this program; if not, write to the Free Software
-+    ** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-+    **/
-+
-+
-+    require_once dirname(__FILE__) . '/include/config.inc.php';
-+    require_once dirname(__FILE__) . '/include/hosts.inc.php';
-+    require_once dirname(__FILE__) . '/include/graphs.inc.php';
-+
-+    $page['title'] = _('Big graphs');
-+    $page['file'] = 'biggraph.php';
-+    $page['hist_arg'] = array('hostid', 'groupid', 'graphid');
-+    $page['scripts'] = array('class.calendar.js', 'gtlc.js', 'flickerfreescreen.js');
-+    $page['type'] = detect_page_type(PAGE_TYPE_HTML);
-+
-+    define('ZBX_PAGE_DO_JS_REFRESH', 1);
-+    define('ZBX_PAGE_NO_MENU', 1);
-+
-+    ob_start();
-+    require_once dirname(__FILE__) . '/include/page_header.php';
-+
-+    // VAR	TYPE	OPTIONAL	FLAGS	VALIDATION	EXCEPTION
-+    $fields = array(
-+        'groupid'     => array(T_ZBX_INT, O_OPT, P_SYS, DB_ID, null),
-+        'hostid'      => array(T_ZBX_INT, O_OPT, P_SYS, DB_ID, null),
-+        'graphid'     => array(T_ZBX_INT, O_OPT, P_SYS, DB_ID, null),
-+        'period'      => array(T_ZBX_INT, O_OPT, P_SYS, null, null),
-+        'stime'       => array(T_ZBX_STR, O_OPT, P_SYS, null, null),
-+        'fullscreen'  => array(T_ZBX_INT, O_OPT, P_SYS, IN('0,1'), null),
-+        // ajax
-+        'filterState' => array(T_ZBX_INT, O_OPT, P_ACT, null, null),
-+        'favobj'      => array(T_ZBX_STR, O_OPT, P_ACT, null, null),
-+        'favid'       => array(T_ZBX_INT, O_OPT, P_ACT, null, null),
-+        'favaction'   => array(T_ZBX_STR, O_OPT, P_ACT, IN('"add","remove"'), null)
-+    );
-+    check_fields($fields);
-+
-+    /*
-+     * Permissions
-+     */
-+    if (getRequest('groupid') && !API::HostGroup()->isReadable(array($_REQUEST['groupid']))) {
-+        access_deny();
-+    }
-+    if (getRequest('hostid') && !API::Host()->isReadable(array($_REQUEST['hostid']))) {
-+        access_deny();
-+    }
-+
-+    if (getRequest('graphid')) {
-+        $graphs = API::Graph()->get(array(
-+            'graphids' => array($_REQUEST['graphid']),
-+            'output'   => array('graphid')
-+        ));
-+        if (!$graphs) {
-+            access_deny();
-+        }
-+    }
-+
-+
-+    $pageFilter = new CPageFilter(array(
-+        'groups'  => array('real_hosts' => true, 'with_graphs' => true),
-+        'hosts'   => array('with_graphs' => true),
-+        'groupid' => getRequest('groupid'),
-+        'hostid'  => getRequest('hostid'),
-+        'graphs'  => array('templated' => 0),
-+        'graphid' => getRequest('graphid')
-+    ));
-+
-+    /*
-+     * Ajax
-+     */
-+    if (hasRequest('filterState')) {
-+        CProfile::update('web.biggraph.filter.state', getRequest('filterState'), PROFILE_TYPE_INT);
-+    }
-+
-+    if (isset($_REQUEST['favobj'])) {
-+        if (getRequest('favobj') === 'timelinefixedperiod' && hasRequest('favid')) {
-+            CProfile::update('web.biggraph.timelinefixed', getRequest('favid'), PROFILE_TYPE_INT);
-+        }
-+
-+        if (str_in_array($_REQUEST['favobj'], array('itemid', 'graphid'))) {
-+            $result = false;
-+
-+            DBstart();
-+
-+            if ($_REQUEST['favaction'] == 'add') {
-+                $result = CFavorite::add('web.favorite.graphids', $_REQUEST['favid'], $_REQUEST['favobj']);
-+                if ($result) {
-+                    echo '$("addrm_fav").title = "' . _('Remove from favourites') . '";' . "\n";
-+                    echo '$("addrm_fav").onclick = function() { rm4favorites("graphid", "' . $_REQUEST['favid'] . '"); }' . "\n";
-+                }
-+            } elseif ($_REQUEST['favaction'] == 'remove') {
-+                $result = CFavorite::remove('web.favorite.graphids', $_REQUEST['favid'], $_REQUEST['favobj']);
-+                if ($result) {
-+                    echo '$("addrm_fav").title = "' . _('Add to favourites') . '";' . "\n";
-+                    echo '$("addrm_fav").onclick = function() { add2favorites("graphid", "' . $_REQUEST['favid'] . '"); }' . "\n";
-+                }
-+            }
-+
-+            $result = DBend($result);
-+
-+            if ($page['type'] == PAGE_TYPE_JS && $result) {
-+                echo 'switchElementClass("addrm_fav", "iconminus", "iconplus");';
-+            }
-+        }
-+    }
-+
-+    if (!empty($_REQUEST['period']) || !empty($_REQUEST['stime'])) {
-+        CScreenBase::calculateTime(array(
-+            'profileIdx'    => 'web.biggraph',
-+            'profileIdx2'   => $pageFilter->graphid,
-+            'updateProfile' => true,
-+            'period'        => getRequest('period'),
-+            'stime'         => getRequest('stime')
-+        ));
-+
-+        $curl = new CUrl();
-+        $curl->removeArgument('period');
-+        $curl->removeArgument('stime');
-+
-+        ob_end_clean();
-+
-+        DBstart();
-+        CProfile::flush();
-+        DBend();
-+        redirect($curl->getUrl());
-+    }
-+
-+    ob_end_flush();
-+
-+
-+    if ($page['type'] == PAGE_TYPE_JS || $page['type'] == PAGE_TYPE_HTML_BLOCK) {
-+        require_once dirname(__FILE__) . '/include/page_footer.php';
-+        exit;
-+    }
-+
-+    /*
-+     * Display
-+     */
-+    $data = array(
-+        'pageFilter' => $pageFilter,
-+        'graphid'    => $pageFilter->graphid,
-+        'fullscreen' => $_REQUEST['fullscreen']
-+    );
-+
-+    // render view
-+    $chartsView = new CView('monitoring.charts', $data);
-+    $chartsView->render();
-+    $chartsView->show();
-+
-+    require_once dirname(__FILE__) . '/include/page_footer.php';
-diff -x graphtree -Naru ./graphtree.left.php graphtree/graphtree.left.php
---- ./graphtree.left.php	1970-01-01 08:00:00.000000000 +0800
-+++ graphtree/graphtree.left.php	2016-04-18 19:04:38.000000000 +0800
-@@ -0,0 +1,140 @@
-+<?php
-+
-+require_once dirname(__FILE__) . '/include/config.inc.php';
-+
-+$type = getRequest("type", "");
-+if ($type === "zTree") {
-+    $page['scripts'] = ["jquery.ztree.core-3.5.js", "graphtree.js"];
-+    $page['type'] = detect_page_type(PAGE_TYPE_HTML);
-+    $page['css'] = ["ztree/zTreeStyle.css"];
-+    define("ZBX_PAGE_NO_MENU", 1);
-+    define("ZBX_PAGE_NO_HEADER", 1);
-+    define("ZBX_PAGE_NO_THEME", 1);
-+
-+    require_once dirname(__FILE__) . '/include/page_header.php';
-+
-+    $left_tree = new CTag("ul", "yes");
-+    $left_tree->setAttribute("id", "graphtree");
-+    $left_tree->setAttribute("class", "ztree");
-+
-+    $graphtreeJs = <<<GRAPHJS
-+
-+        var zTree;
-+        var setting = {
-+            view: {
-+                dblClickExpand: false
-+            },
-+            async: { //å¼‚æ­¥åŠ è½½è¯·æ±‚æ•°æ�®
-+                enable: true,
-+                url: "graphtree.left.php",
-+                autoParam: ["groupid=groupid", "hostid=hostid"], //è¯·æ±‚çš„å�‚æ•°å�³groupid=nodeid
-+                otherParam: {"timestamp": new Date().getTime()},
-+                type: "get"
-+            },
-+            callback: {}
-+        };
-+
-+        jQuery(document).ready(function () {
-+            jQuery.fn.zTree.init(jQuery("#graphtree"), setting);
-+            //å�³é”®è�œå�•
-+            zTree = jQuery.fn.zTree.getZTreeObj("graphtree");
-+        });
-+GRAPHJS;
-+    insert_js($graphtreeJs, true);
-+    $left_tree->show();
-+} else {
-+    $groupid = getRequest("groupid", 0);
-+    $hostid = getRequest("hostid", 0);
-+
-+    if ($groupid > 0) {
-+        //æ ¹æ�®åˆ†ç»„idæŸ¥è¯¢åˆ†ç»„ä¸‹çš„æœºå™¨
-+        $hosts = API::Host()->get([
-+            "output"          => ["hostid", "host", "name"],
-+            "monitored_hosts" => true,
-+            "groupids"        => [$groupid],
-+            "sortfield"       => ["host"],
-+            "sortorder"       => ["ASC"]
-+        ]);
-+
-+        $new_list = $hosts;
-+        foreach ($hosts as &$each_host) {
-+            $each_host['target'] = 'rightFrame';
-+            $each_host['isParent'] = "true";
-+            $app_count = API::Application()->get([
-+                'countOutput' => "1",
-+                'hostids'     => $each_host['hostid']
-+            ]);
-+            $each_host['name'] = $each_host['name'] . '(' . $app_count . ')';
-+            $each_host['url'] = 'graphtree.right.php?hostid=' . $each_host['hostid'];
-+        }
-+        unset($each_host);
-+        echo json_encode(array_values($hosts));
-+    } else {
-+        if ($groupid == 0) {
-+            if ($hostid == 0) {
-+                //æŸ¥è¯¢æ‰€æœ‰çš„åˆ†ç»„åˆ—è¡¨
-+                $groups = API::HostGroup()->get([
-+                    "output"               => "extend",
-+                    "monitored_hosts"      => true,
-+                    "with_monitored_items" => 1,
-+                    "sortfield"            => "name"
-+                ]);
-+
-+                //$groups = getAvailableHostGroup();
-+                foreach ($groups as &$each) {
-+                    $each['id'] = $each['groupid'];
-+                    $each['isParent'] = true;
-+                    $each['target'] = 'rightFrame';
-+                    $each['url'] = 'graphtree.right.php?groupid=' . $each['groupid'];
-+
-+                    //æŸ¥è¯¢ä¸‹é�¢æœ‰å¤šå°‘æœºå™¨
-+                    $hosts = API::Host()->get([
-+                        "output"          => "extend",
-+                        "monitored_hosts" => true,
-+                        "groupids"        => [$each['groupid']]
-+                    ]);
-+
-+                    $each['name'] = $each['name'] . '(' . count($hosts) . ')';
-+                }
-+                /*$groups[] = array(
-+                    'groupid' => -1,
-+                    'name' => 'others',
-+                    'internal' => 0 ,
-+                    'flags'=> 0,
-+                    'id' => -1,
-+                    'isParent' => 1,
-+                    'target' => 'rightFrame',
-+                    'url' => 'graphtree.right.php?groupid=-1'
-+                );*/
-+                echo json_encode($groups);
-+            } else {
-+                $applications = API::Application()->get([
-+                    "output"    => "extend",
-+                    "hostids"   => [$hostid],
-+                    "sortfield" => ["name"],
-+                    "sortorder" => ["ASC"]
-+                ]);
-+
-+                if (is_array($applications)) {
-+                    foreach ($applications as &$each) {
-+                        $each['target'] = 'rightFrame';
-+                        $each['url'] = 'graphtree.right.php?applicationid=' . $each['applicationid'];
-+                    }
-+                }
-+
-+                echo json_encode($applications);
-+            }
-+        }
-+    }/*else{
-+            $other_items = array(
-+                'applicationid' => 10000,
-+                'name' => "other_001",
-+                'target' => 'rightFrame',
-+                'url' => 'graphtree.right.php?applicationid=10000'
-+            );
-+            echo json_encode($other_items);
-+        }*/
-+}
-+
-+
-+
diff -x graphtree -Naru ./graphtree.right.php graphtree/graphtree.right.php
--- ./graphtree.right.php	1970-01-01 08:00:00.000000000 +0800
+++ graphtree/graphtree.right.php	2016-04-18 19:04:38.000000000 +0800
@@ -0,0 +1,354 @@
+<?php
+require_once dirname(__FILE__) . '/include/config.inc.php';
+require_once dirname(__FILE__) . '/include/hosts.inc.php';
+include_once dirname(__FILE__) . '/include/items.inc.php';
+require_once dirname(__FILE__) . '/include/graphs.inc.php';
+
+$page['title'] = _('Graph trees');
+$page['file'] = 'graphtree.right.php';
+$page['hist_arg'] = ['hostid', 'groupid', 'graphid'];
+$page['scripts'] = ['class.calendar.js', 'gtlc.js', 'flickerfreescreen.js'];
+$page['type'] = detect_page_type(PAGE_TYPE_HTML);
+
+define("ZBX_PAGE_NO_MENU", 1);
+define("ZBX_PAGE_NO_HEADER", 1);
+require_once dirname(__FILE__) . '/include/page_header.php';
+
+// VAR	TYPE	OPTIONAL	FLAGS	VALIDATION	EXCEPTION
+$fields = [
+    'groupid'       => [T_ZBX_INT, O_OPT, P_SYS, DB_ID, null],
+    'hostid'        => [T_ZBX_INT, O_OPT, P_SYS, DB_ID, null],
+    'graphid'       => [T_ZBX_INT, O_OPT, P_SYS, DB_ID, null],
+    'applicationid' => [T_ZBX_INT, O_OPT, P_SYS, DB_ID, null],
+    'period'        => [T_ZBX_INT, O_OPT, P_SYS, null, null],
+    'stime'         => [T_ZBX_STR, O_OPT, P_SYS, null, null],
+    'fullscreen'    => [T_ZBX_INT, O_OPT, P_SYS, IN('0,1'), null],
+    // ajax
+    'filterState'   => [T_ZBX_INT, O_OPT, P_ACT, null, null],
+    'favobj'        => [T_ZBX_STR, O_OPT, P_ACT, null, null],
+    'favid'         => [T_ZBX_INT, O_OPT, P_ACT, null, null],
+    'favaction'     => [T_ZBX_STR, O_OPT, P_ACT, IN('"add","remove"'), null]
+];
+check_fields($fields);
+
+/*
+ * Filter
+ */
+if (hasRequest('filterState')) {
+    CProfile::update('web.graphtree.filter.state', getRequest('filterState'), PROFILE_TYPE_INT);
+}
+
+/*
+ * ajax update timelinefixedperiod
+ */
+if (isset($_REQUEST['favobj'])) {
+    // saving fixed/dynamic setting to profile
+    if ($_REQUEST['favobj'] == 'timelinefixedperiod' && isset($_REQUEST['favid'])) {
+        CProfile::update('web.graphtree.timelinefixed', $_REQUEST['favid'], PROFILE_TYPE_INT);
+    }
+}
+
+if ($page['type'] == PAGE_TYPE_JS || $page['type'] == PAGE_TYPE_HTML_BLOCK) {
+    require_once dirname(__FILE__) . '/include/page_footer.php';
+    exit;
+}
+
+$hostid = getRequest("hostid", -1);
+$groupid = getRequest("groupid", -1);
+$applicationid = getRequest("applicationid", -1);
+
+$curtime = time(); //å½“å‰�æ—¶é—´
+$timeline = [];
+
+if (!empty($_REQUEST['period']) || !empty($_REQUEST['stime'])) {
+    $timeline = CScreenBase::calculateTime([
+        'period' => getRequest('period'),
+        'stime'  => getRequest('stime')
+    ]);
+
+
+    $screen = new CScreenBuilder();
+    CScreenBuilder::insertScreenStandardJs([
+        'timeline'   => $timeline,
+        'profileIdx' => 'web.graphtree'
+    ]);
+} else {
+    $timeline = [
+        'period' => 3600,
+        'stime'  => $curtime - 3600
+    ];
+
+    $screen = new CScreenBuilder();
+    CScreenBuilder::insertScreenStandardJs([
+        'timeline'   => $screen->timeline,
+        'profileIdx' => "web.graphtree"
+    ]);
+}
+
+$graph_list = []; //è®°å½•ç»“æžœä¿¡æ�¯æ•°
+$value_list = [];
+$item_list = [];
+$graphids = null;
+$pagingLine = null;
+if ($groupid > 0 || $hostid > 0 || $applicationid > 0) {
+    DBstart();
+    $result = [];
+
+    if ($groupid !== -1 && $groupid > 0) {
+        $sql = "
+                    SELECT DISTINCT
+                      g.graphid,g.graphtype
+                    FROM
+                      `graphs` g,
+                      `graphs_items` gi,
+                      `items` i,
+                      `hosts` h,
+                      `hosts_groups` hg
+                    WHERE i.hostid = h.`hostid`
+                      AND gi.graphid = g.graphid
+                      AND i.itemid = gi.itemid
+                      AND g.flags IN ('0', '4')
+                      AND hg.groupid = {$groupid}
+                      AND hg.hostid = h.hostid
+                      AND h.status = 0
+                      AND EXISTS
+                      (SELECT
+                        NULL
+                      FROM
+                        `items` i
+                      WHERE h.hostid = i.hostid
+                        AND i.status = 0
+                        AND i.flags IN (0, 4))
+                    ORDER BY g.name ";
+
+        $dbRes = DBselect($sql);
+        while ($graph = DBfetch($dbRes)) {
+            $result["graph_" . $graph['graphid']] = $graph;
+        }
+        $graph_list = $result;
+
+    } elseif ($hostid !== -1 && $hostid > 0) {
+        $sql = "
+                    SELECT DISTINCT
+                      g.*
+                    FROM
+                      `graphs` g,
+                      `graphs_items` gi,
+                      `items` i,
+                      `hosts` h
+                    WHERE i.hostid = {$hostid}
+                      AND gi.graphid = g.graphid
+                      AND i.itemid = gi.itemid
+                      AND g.flags IN ('0', '4')
+                      AND h.status = 0
+                      AND EXISTS
+                      (SELECT
+                        NULL
+                      FROM
+                        `items` i
+                      WHERE h.hostid = i.hostid
+                        AND i.status = 0
+                        AND i.flags IN (0, 4))
+                    ORDER BY g.name ";
+
+        $dbRes = DBselect($sql);
+        while ($graph = DBfetch($dbRes)) {
+            $result["graph_" . $graph['graphid']] = $graph;
+        }
+        $graph_list = $result;
+    } elseif ($applicationid !== -1 && $applicationid > 0) {
+        //graph list
+        $sql = "
+                    SELECT DISTINCT
+                      g.graphid,g.graphtype
+                    FROM
+                      items_applications ia,
+                      `graphs_items` gi,
+                      `graphs` g
+                    WHERE ia.applicationid = {$applicationid}
+                      AND gi.`itemid` = ia.`itemid`
+                      AND g.`graphid` = gi.`graphid`
+                      AND g.flags IN ('0', '4')
+                    ORDER BY g.name";
+
+        $dbRes = DBselect($sql);
+        while ($graph = DBfetch($dbRes)) {
+            $result["graph_" . $graph['graphid']] = $graph;
+        }
+        $graph_list = $result;
+
+        //no graphid
+        $result = [];
+        $sql = "
+                    SELECT
+                      i.itemid,i.name,i.value_type
+                    FROM
+                      `items` i,
+                      `items_applications` ia
+                    WHERE i.itemid = ia.itemid
+                      AND ia.applicationid = {$applicationid}
+                      AND i.state = 0
+                      AND i.flags IN ('0', '4')
+                      AND NOT EXISTS
+                      (SELECT
+                        NULL
+                      FROM
+                        `items_applications` ia,
+                        `graphs_items` gi,
+                        `graphs` g
+                      WHERE ia.applicationid = {$applicationid}
+                        AND gi.`itemid` = i.`itemid`
+                        AND g.`graphid` = gi.`graphid`
+                        AND g.`flags` IN ('0', '4'))
+                    ";
+
+        $dbRes = DBselect($sql);
+        while ($item = DBfetch($dbRes)) {
+            $result["item_" . $item['itemid']] = $item;
+        }
+
+        $item_list = $result;
+
+        /*
+         * 0 float
+         * 1 character
+         * 2 log
+         * 3 unsign float
+         * 4 text
+         */
+        foreach ($item_list as $k => $item) {
+            switch ($item['value_type']) {
+                case 1:
+                case 2:
+                case 4:
+                    $value_list[$item['itemid']] = $item;
+                    unset($item_list[$k]);
+                    break;
+                default:
+                    break;
+            }
+        }
+
+        $graph_list = zbx_array_merge($graph_list, $item_list);
+
+        if ($value_list) {
+            // get history
+            if ($history = Manager::History()->getLast($value_list, 1, ZBX_HISTORY_PERIOD)) {
+                foreach ($value_list as &$item) {
+                    if (isset($history[$item['itemid']])) {
+                        $item = zbx_array_merge($item, $history[$item['itemid']][0]);
+                    } else {
+                        $item = zbx_array_merge($item, ['clock' => null, 'value' => null, 'ns' => null]);
+                    }
+                }
+            } else {
+                $value_list = [];
+            }
+            unset($item);
+        }
+    }
+    $url = new CUrl();
+    $pagingLine = getPagingLine($graph_list, ZBX_SORT_UP, $url);
+    DBend(true);
+}
+
+/*
+ * Display
+ */
+$graphWidth = 520; //å›¾å½¢å®½åº¦
+$displayWidth = "50%";//"50%"; //æ˜¾ç¤ºå®½åº¦
+$height = 260;
+
+$chartsWidget = (new CWidget())->setTitle("Graphs");
+
+$chartForm = (new CForm('get'))->addVar('fullscreen', getRequest('fullscreen'));
+$chartsWidget->setControls($chartForm);
+
+$filterForm = (new CFilter('web.graphtree.filter.state'))->addNavigator();
+$chartsWidget->addItem($filterForm);
+if (!is_null($pagingLine)) {
+    $chartsWidget->addItem($pagingLine);
+}
+
+if (is_array($graph_list) && !empty($graph_list)) {
+    $imgDiv = (new CDiv())->setId("imgDiv");
+    //graphid --> graph
+    foreach ($graph_list as $key => $item) {
+        if (strpos($key, "graph_") === 0) {
+            $chart = 'chart2.php';
+            if($item['graphtype'] == 2 || $item['graphtype'] == 3){
+                $chart = 'chart6.php';
+            }
+
+            $small_graph = $chart.'?graphid=' . $item['graphid'] . '&width=' . $graphWidth . '&height=' . $height . '&stime=' . $timeline['stime'] . '&period=' . $timeline['period'];
+            $big_graph = 'biggraph.php?graphid=' . $item['graphid'] . '&stime=' . $timeline['stime'] . '&period=' . $timeline['period'];
+            $div_tmp = (new CDiv())->setId("div_" . $item['graphid']);
+        }
+        if (strpos($key, "item_") === 0) {
+            $small_graph = "chart.php?itemids=" . $item['itemid'] . "&width=" . $graphWidth . "&height=" . $height . "&stime=" . $timeline['stime'] . "&period=" . $timeline['period'];
+            $big_graph = "history.php?action=showgraph&itemids[]=" . $item['itemid'];
+            $div_tmp = (new CDiv())->setId("div_" . $item['itemid']);
+        }
+
+        $div_tmp->addStyle("box-sizing: border-box;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;width:{$displayWidth};float: left;text-align: center;padding: 6px 6px 0px 0px;");
+
+        $img_tmp = new CImg($small_graph, null, null, $height);
+        $img_tmp->setAttribute('style', "width:100%");
+        $a_tmp = new CLink($img_tmp, $big_graph);
+
+        if (strpos($key, "item_") === 0) {
+            $a_tmp->setAttribute("target", "_blank");
+        }
+
+        $div_tmp->addItem($a_tmp);
+        $imgDiv->addItem($div_tmp);
+
+    }
+    $chartsWidget->addItem($imgDiv);
+    unset($item);
+
+    $chartsWidget->addItem(BR());
+
+    $chartsWidget->addItem((new CDiv($pagingLine))->addStyle("clear:both;padding:12px 0;"));
+
+}
+
+if ($value_list) {
+    $valueTable = (new CTableInfo())->setHeader([
+        _("Name"),
+        _("Last check"),
+        _("Last value"),
+        _("Option"),
+    ]);
+
+    foreach ($value_list as $item) {
+        $history_link = new CLink(new CSpan("history"), "history.php?action=showvalues&period=86400&itemids[]=" . $item['itemid']);
+        $history_link->setTarget("_blank");
+        $valueTable->addRow([
+            new CCol(new CSpan($item['name'], "item")),
+            new CCol(new CSpan(zbx_date2str(DATE_TIME_FORMAT_SECONDS, $item['clock']), "item")),
+            new CCol(new CSpan(($item['value'] !== null) ? $item['value'] : _("No Value"), "item")),
+            new CCol($history_link)
+        ]);
+        unset($history_link);
+    }
+
+    $valueTable->addStyle("clear:both");
+    $chartsWidget->addItem($valueTable);
+    unset($item);
+}
+
+if(empty($graph_list) && empty($value_list)){
+    $chartsWidget->addItem(new CTableInfo());
+}
+echo "<div>Graphtreeç”±<a href=\"http://www.oneoaas.com\">OneOaaS</a>å¼€æº�<a href=\"http://www.oneoaas.com\">https://www.oneoaas.com</a></br>
+OneOaaSä¸“æ³¨äºŽå›½å†…Zabbixç›‘æŽ§æŠ€æœ¯(åŒ…æ‹¬äºŒæ¬¡å¼€å�‘)æœ�åŠ¡,Zabbixå®˜æ–¹ä¸­å›½åŒºå�ˆä½œä¼™ä¼´</br>
+å¾®ä¿¡å…¬ä¼—å�·ä¸“æ³¨äºŽZabbixç›‘æŽ§å’Œè¿�ç»´å·¥å…·çŸ¥è¯†æŽ¨å¹¿,æ‰«æ��ç«‹å�³å…³æ³¨</br>
+ <img src='img/oneoaas-wechat.jpg'></br></div>";
+echo "ç¼–è¾‘";
+echo dirname(__FILE__);
+echo "/graphtree.right.php 344-350è¡Œåˆ é™¤æ­¤æ��ç¤ºä¿¡æ�¯";  
+
+$chartsWidget->show();
+
+require_once dirname(__FILE__) . '/include/page_footer.php';
diff -x graphtree -Naru ./graphtrees.php graphtree/graphtrees.php
--- ./graphtrees.php	1970-01-01 08:00:00.000000000 +0800
+++ graphtree/graphtrees.php	2016-04-18 19:04:38.000000000 +0800
@@ -0,0 +1,68 @@
+<?php
+/*
+** Zabbix
+** Copyright (C) 2001-2015 Zabbix SIA
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+**/
+
+require_once dirname(__FILE__) . '/include/config.inc.php';
+require_once dirname(__FILE__) . '/include/hosts.inc.php';
+require_once dirname(__FILE__) . '/include/graphs.inc.php';
+
+
+$page['title'] = _('Graphtrees');
+$page['file'] = 'graphtrees.php';
+$page['hist_arg'] = ['graphid', 'groupid', 'hostid'];
+$page['type'] = detect_page_type(PAGE_TYPE_HTML);
+
+//define('ZBX_PAGE_DO_JS_REFRESH', 1); no refresh
+
+ob_start();
+require_once dirname(__FILE__) . '/include/page_header.php';
+
+$fields = [
+    'groupid'     => [T_ZBX_INT, O_OPT, P_SYS, DB_ID, null],
+    'hostid'      => [T_ZBX_INT, O_OPT, P_SYS, DB_ID, null],
+    'graphid'     => [T_ZBX_INT, O_OPT, P_SYS, DB_ID, null],
+    'period'      => [T_ZBX_INT, O_OPT, P_SYS, null, null],
+    'stime'       => [T_ZBX_STR, O_OPT, P_SYS, null, null],
+    'fullscreen'  => [T_ZBX_INT, O_OPT, P_SYS, IN('0,1'), null],
+    // ajax
+    'filterState' => [T_ZBX_INT, O_OPT, P_ACT, null, null],
+    'favobj'      => [T_ZBX_STR, O_OPT, P_ACT, null, null],
+    'favid'       => [T_ZBX_INT, O_OPT, P_ACT, null, null],
+    'favaction'   => [T_ZBX_STR, O_OPT, P_ACT, IN('"add","remove"'), null]
+];
+check_fields($fields);
+$gtreeWidget = (new CWidget())->setTitle(_('Graphtrees'))->setControls((new CList())->addItem(get_icon('fullscreen', ['fullscreen' => getRequest('fullscreen')])));
+
+
+$gtree_iframe_left = new CIFrame("graphtree.left.php?type=zTree", "100%", "100%", "auto", "zatree_iframe_left");
+$gtree_iframe_right = new CIFrame("graphtree.right.php", "100%", "100%", "auto", "zatree_iframe_right");
+$gtree_iframe_left->setAttribute("name", "leftFrame");
+$gtree_iframe_left->setAttribute("id", "leftFrame");
+$gtree_iframe_right->setAttribute("name", "rightFrame");
+$gtree_iframe_right->setAttribute("id", "rightFrame");
+$gtree_div_left = (new CDiv($gtree_iframe_left))->setAttribute('style', "width:20%;height:800px;display:inline-block");
+$gtree_div_right = (new CDiv($gtree_iframe_right))->setAttribute('style', "width:80%;height:800px;display:inline-block");
+
+$gtreeWidget->addItem($gtree_div_left);
+$gtreeWidget->addItem($gtree_div_right);
+
+$gtreeWidget->show();
+
+require_once dirname(__FILE__) . '/include/page_footer.php';
+
diff -x graphtree -Naru ./hosts.php graphtree/hosts.php
--- ./hosts.php	2016-02-26 17:45:56.000000000 +0800
+++ graphtree/hosts.php	2016-04-18 19:04:38.000000000 +0800
@@ -1,1130 +1,1145 @@
 <?php
-/*
-** Zabbix
-** Copyright (C) 2001-2016 Zabbix SIA
-**
-** This program is free software; you can redistribute it and/or modify
-** it under the terms of the GNU General Public License as published by
-** the Free Software Foundation; either version 2 of the License, or
-** (at your option) any later version.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-**
-** You should have received a copy of the GNU General Public License
-** along with this program; if not, write to the Free Software
-** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-**/
-
-
-require_once dirname(__FILE__).'/include/config.inc.php';
-require_once dirname(__FILE__).'/include/forms.inc.php';
-
-if (hasRequest('action') && getRequest('action') == 'host.export' && hasRequest('hosts')) {
-	$page['file'] = 'zbx_export_hosts.xml';
-	$page['type'] = detect_page_type(PAGE_TYPE_XML);
-
-	$exportData = true;
-}
-else {
-	$page['title'] = _('Configuration of hosts');
-	$page['file'] = 'hosts.php';
-	$page['type'] = detect_page_type(PAGE_TYPE_HTML);
-	$page['scripts'] = ['multiselect.js'];
-
-	$exportData = false;
-}
-
-require_once dirname(__FILE__).'/include/page_header.php';
-
-// VAR	TYPE	OPTIONAL	FLAGS	VALIDATION	EXCEPTION
-$fields = [
-	'hosts' =>			[T_ZBX_INT, O_OPT, P_SYS,			DB_ID,		null],
-	'groups' =>			[T_ZBX_INT, O_OPT, P_SYS,			DB_ID,		null],
-	'new_groups' =>		[T_ZBX_STR, O_OPT, P_SYS,			null,		null],
-	'hostids' =>		[T_ZBX_INT, O_OPT, P_SYS,			DB_ID,		null],
-	'groupids' =>		[T_ZBX_INT, O_OPT, P_SYS,			DB_ID,		null],
-	'applications' =>	[T_ZBX_INT, O_OPT, P_SYS,			DB_ID,		null],
-	'groupid' =>		[T_ZBX_INT, O_OPT, P_SYS,			DB_ID,		null],
-	'hostid' =>			[T_ZBX_INT, O_OPT, P_SYS,			DB_ID,		'isset({form}) && {form} == "update"'],
-	'clone_hostid' =>	[T_ZBX_INT, O_OPT, P_SYS,			DB_ID,		'isset({form}) && {form} == "full_clone"'],
-	'host' =>			[T_ZBX_STR, O_OPT, null,			NOT_EMPTY,	'isset({add}) || isset({update})', _('Host name')],
-	'visiblename' =>	[T_ZBX_STR, O_OPT, null,			null,		'isset({add}) || isset({update})'],
-	'description' =>	[T_ZBX_STR, O_OPT, null,			null,		null],
-	'proxy_hostid' =>	[T_ZBX_INT, O_OPT, P_SYS,		    DB_ID,		null],
-	'status' =>			[T_ZBX_INT, O_OPT, null,			IN([HOST_STATUS_MONITORED, HOST_STATUS_NOT_MONITORED]), null],
-	'newgroup' =>		[T_ZBX_STR, O_OPT, null,			null,		null],
-	'interfaces' =>		[T_ZBX_STR, O_OPT, null,			NOT_EMPTY,	'isset({add}) || isset({update})', _('Agent or SNMP or JMX or IPMI interface')],
-	'mainInterfaces' =>	[T_ZBX_INT, O_OPT, null,			DB_ID,		null],
-	'templates' =>		[T_ZBX_INT, O_OPT, null,			DB_ID,		null],
-	'add_template' =>	[T_ZBX_STR, O_OPT, null,			null,		null],
-	'add_templates' => [T_ZBX_INT, O_OPT, null,			DB_ID,		null],
-	'templates_rem' =>	[T_ZBX_STR, O_OPT, P_SYS|P_ACT,	null,		null],
-	'clear_templates' => [T_ZBX_INT, O_OPT, null,			DB_ID,		null],
-	'ipmi_authtype' =>	[T_ZBX_INT, O_OPT, null,			BETWEEN(-1, 6), null],
-	'ipmi_privilege' =>	[T_ZBX_INT, O_OPT, null,			BETWEEN(0, 5), null],
-	'ipmi_username' =>	[T_ZBX_STR, O_OPT, null,			null,		null],
-	'ipmi_password' =>	[T_ZBX_STR, O_OPT, null,			null,		null],
-	'tls_connect' =>	[T_ZBX_INT, O_OPT, null,
-		IN([HOST_ENCRYPTION_NONE, HOST_ENCRYPTION_PSK, HOST_ENCRYPTION_CERTIFICATE]), null],
-	'tls_accept' =>		[T_ZBX_INT, O_OPT, null,
-		BETWEEN(0, (HOST_ENCRYPTION_NONE | HOST_ENCRYPTION_PSK | HOST_ENCRYPTION_CERTIFICATE)), null],
-	'tls_subject' =>	[T_ZBX_STR, O_OPT, null,		null,		null],
-	'tls_issuer' =>		[T_ZBX_STR, O_OPT, null,		null,		null],
-	'tls_psk_identity' =>	[T_ZBX_STR, O_OPT, null,		null,		null],
-	'tls_psk' =>		[T_ZBX_STR, O_OPT, null,			null,		null],
-	'flags' =>			[T_ZBX_INT, O_OPT, null,
-		IN([ZBX_FLAG_DISCOVERY_NORMAL, ZBX_FLAG_DISCOVERY_CREATED]), null],
-	'mass_replace_tpls' => [T_ZBX_STR, O_OPT, null,		null,		null],
-	'mass_clear_tpls' => [T_ZBX_STR, O_OPT, null,			null,		null],
-	'inventory_mode' => [T_ZBX_INT, O_OPT, null,
-		IN(HOST_INVENTORY_DISABLED.','.HOST_INVENTORY_MANUAL.','.HOST_INVENTORY_AUTOMATIC), null],
-	'host_inventory' =>	[T_ZBX_STR, O_OPT, P_UNSET_EMPTY,	null,		null],
-	'macros' =>			[T_ZBX_STR, O_OPT, P_SYS,			null,		null],
-	'visible' =>		[T_ZBX_STR, O_OPT, null,			null,		null],
-	'show_inherited_macros' => [T_ZBX_INT, O_OPT, null, IN([0,1]), null],
-	// actions
-	'action' =>			[T_ZBX_STR, O_OPT, P_SYS|P_ACT,
-							IN('"host.export","host.massdelete","host.massdisable","host.massenable","host.massupdate"'.
-								',"host.massupdateform"'
-							),
-							null
-						],
-	'add_to_group' =>	[T_ZBX_INT, O_OPT, P_SYS|P_ACT,	DB_ID,		null],
-	'delete_from_group' => [T_ZBX_INT, O_OPT, P_SYS|P_ACT,	DB_ID,		null],
-	'unlink' =>			[T_ZBX_STR, O_OPT, P_SYS|P_ACT,	null,		null],
-	'unlink_and_clear' => [T_ZBX_STR, O_OPT, P_SYS|P_ACT,	null,		null],
-	'add' =>			[T_ZBX_STR, O_OPT, P_SYS|P_ACT,	null,		null],
-	'update' =>			[T_ZBX_STR, O_OPT, P_SYS|P_ACT,	null,		null],
-	'masssave' =>		[T_ZBX_STR, O_OPT, P_SYS|P_ACT,	null,		null],
-	'clone' =>			[T_ZBX_STR, O_OPT, P_SYS|P_ACT,	null,		null],
-	'full_clone' =>		[T_ZBX_STR, O_OPT, P_SYS|P_ACT,	null,		null],
-	'delete' =>			[T_ZBX_STR, O_OPT, P_SYS|P_ACT,	null,		null],
-	'cancel' =>			[T_ZBX_STR, O_OPT, P_SYS,		null,			null],
-	'form' =>			[T_ZBX_STR, O_OPT, P_SYS,		null,			null],
-	'form_refresh' =>	[T_ZBX_INT, O_OPT, null,		null,			null],
-	// filter
-	'filter_set' =>		[T_ZBX_STR, O_OPT, P_SYS,		null,			null],
-	'filter_rst' =>		[T_ZBX_STR, O_OPT, P_SYS,		null,			null],
-	'filter_host' =>	[T_ZBX_STR, O_OPT, null,		null,			null],
-	'filter_ip' =>		[T_ZBX_STR, O_OPT, null,		null,			null],
-	'filter_dns' =>		[T_ZBX_STR, O_OPT, null,		null,			null],
-	'filter_port' =>	[T_ZBX_STR, O_OPT, null,		null,			null],
-	// sort and sortorder
-	'sort' =>			[T_ZBX_STR, O_OPT, P_SYS, IN('"name","status"'),						null],
-	'sortorder' =>		[T_ZBX_STR, O_OPT, P_SYS, IN('"'.ZBX_SORT_DOWN.'","'.ZBX_SORT_UP.'"'),	null]
-];
-check_fields($fields);
-
-/*
- * Permissions
- */
-if (getRequest('groupid') && !API::HostGroup()->isWritable([$_REQUEST['groupid']])) {
-	access_deny();
-}
-if (getRequest('hostid') && !API::Host()->isWritable([$_REQUEST['hostid']])) {
-	access_deny();
-}
-
-$hostIds = getRequest('hosts', []);
-
-/*
- * Export
- */
-if ($exportData) {
-	$export = new CConfigurationExport(['hosts' => $hostIds]);
-	$export->setBuilder(new CConfigurationExportBuilder());
-	$export->setWriter(CExportWriterFactory::getWriter(CExportWriterFactory::XML));
-	$exportData = $export->export();
-
-	if (hasErrorMesssages()) {
-		show_messages();
-	}
-	else {
-		print($exportData);
-	}
-
-	exit;
-}
-
-/*
- * Filter
- */
-if (hasRequest('filter_set')) {
-	CProfile::update('web.hosts.filter_ip', getRequest('filter_ip', ''), PROFILE_TYPE_STR);
-	CProfile::update('web.hosts.filter_dns', getRequest('filter_dns', ''), PROFILE_TYPE_STR);
-	CProfile::update('web.hosts.filter_host', getRequest('filter_host', ''), PROFILE_TYPE_STR);
-	CProfile::update('web.hosts.filter_port', getRequest('filter_port', ''), PROFILE_TYPE_STR);
-}
-elseif (hasRequest('filter_rst')) {
-	DBStart();
-	CProfile::delete('web.hosts.filter_ip');
-	CProfile::delete('web.hosts.filter_dns');
-	CProfile::delete('web.hosts.filter_host');
-	CProfile::delete('web.hosts.filter_port');
-	DBend();
-}
-
-$filter['ip'] = CProfile::get('web.hosts.filter_ip', '');
-$filter['dns'] = CProfile::get('web.hosts.filter_dns', '');
-$filter['host'] = CProfile::get('web.hosts.filter_host', '');
-$filter['port'] = CProfile::get('web.hosts.filter_port', '');
-
-// remove inherited macros data (actions: 'add', 'update' and 'form')
-$macros = cleanInheritedMacros(getRequest('macros', []));
-
-// remove empty new macro lines
-foreach ($macros as $idx => $macro) {
-	if (!array_key_exists('hostmacroid', $macro) && $macro['macro'] === '' && $macro['value'] === '') {
-		unset($macros[$idx]);
-	}
-}
-
-/*
- * Actions
- */
-if (isset($_REQUEST['add_template']) && isset($_REQUEST['add_templates'])) {
-	$_REQUEST['templates'] = getRequest('templates', []);
-	$_REQUEST['templates'] = array_merge($_REQUEST['templates'], $_REQUEST['add_templates']);
-}
-if (isset($_REQUEST['unlink']) || isset($_REQUEST['unlink_and_clear'])) {
-	$_REQUEST['clear_templates'] = getRequest('clear_templates', []);
-
-	$unlinkTemplates = [];
-
-	if (isset($_REQUEST['unlink'])) {
-		// templates_rem for old style removal in massupdate form
-		if (isset($_REQUEST['templates_rem'])) {
-			$unlinkTemplates = array_keys($_REQUEST['templates_rem']);
-		}
-		elseif (is_array($_REQUEST['unlink'])) {
-			$unlinkTemplates = array_keys($_REQUEST['unlink']);
-		}
-	}
-	else {
-		$unlinkTemplates = array_keys($_REQUEST['unlink_and_clear']);
-
-		$_REQUEST['clear_templates'] = array_merge($_REQUEST['clear_templates'], $unlinkTemplates);
-	}
-
-	foreach ($unlinkTemplates as $templateId) {
-		unset($_REQUEST['templates'][array_search($templateId, $_REQUEST['templates'])]);
-	}
-}
-elseif ((hasRequest('clone') || hasRequest('full_clone')) && hasRequest('hostid')) {
-	$_REQUEST['form'] = hasRequest('clone') ? 'clone' : 'full_clone';
-
-	$groupids = getRequest('groups', []);
-	if ($groupids) {
-		// leave only writable groups
-		$_REQUEST['groups'] = array_keys(API::HostGroup()->get([
-			'output' => [],
-			'groupids' => $groupids,
-			'editable' => true,
-			'preservekeys' => true
-		]));
-	}
-
-	if (hasRequest('interfaces')) {
-		$interfaceid = 1;
-		foreach ($_REQUEST['interfaces'] as &$interface) {
-			$interface['interfaceid'] = (string) $interfaceid++;
-			unset($interface['locked'], $interface['items']);
-		}
-		unset($interface);
-	}
-
-	if (hasRequest('full_clone')) {
-		$_REQUEST['clone_hostid'] = $_REQUEST['hostid'];
-	}
-
-	unset($_REQUEST['hostid'], $_REQUEST['flags']);
-}
-elseif (hasRequest('action') && getRequest('action') == 'host.massupdate' && hasRequest('masssave')) {
-	$hostIds = getRequest('hosts', []);
-	$visible = getRequest('visible', []);
-	$_REQUEST['proxy_hostid'] = getRequest('proxy_hostid', 0);
-	$_REQUEST['templates'] = getRequest('templates', []);
-
-	try {
-		DBstart();
-
-		// filter only normal and discovery created hosts
-		$hosts = API::Host()->get([
-			'output' => ['hostid'],
-			'hostids' => $hostIds,
-			'filter' => ['flags' => [ZBX_FLAG_DISCOVERY_NORMAL, ZBX_FLAG_DISCOVERY_CREATED]]
-		]);
-		$hosts = ['hosts' => $hosts];
-
-		$properties = [
-			'proxy_hostid', 'ipmi_authtype', 'ipmi_privilege', 'ipmi_username', 'ipmi_password', 'description'
-		];
-
-		$newValues = [];
-		foreach ($properties as $property) {
-			if (isset($visible[$property])) {
-				$newValues[$property] = $_REQUEST[$property];
-			}
-		}
-
-		if (isset($visible['status'])) {
-			$newValues['status'] = getRequest('status', HOST_STATUS_NOT_MONITORED);
-		}
-
-		if (isset($visible['inventory_mode'])) {
-			$newValues['inventory_mode'] = getRequest('inventory_mode', HOST_INVENTORY_DISABLED);
-			$newValues['inventory'] = ($newValues['inventory_mode'] == HOST_INVENTORY_DISABLED)
-				? []
-				: getRequest('host_inventory', []);
-		}
-
-		if (array_key_exists('encryption', $visible)) {
-			$newValues['tls_connect'] = getRequest('tls_connect', HOST_ENCRYPTION_NONE);
-			$newValues['tls_accept'] = getRequest('tls_accept', HOST_ENCRYPTION_NONE);
-			$newValues['tls_issuer'] = getRequest('tls_issuer', '');
-			$newValues['tls_subject'] = getRequest('tls_subject', '');
-			$newValues['tls_psk_identity'] = getRequest('tls_psk_identity', '');
-			$newValues['tls_psk'] = getRequest('tls_psk', '');
-		}
-
-		$templateIds = [];
-		if (isset($visible['templates'])) {
-			$templateIds = $_REQUEST['templates'];
-		}
-
-		// add new or existing host groups
-		$newHostGroupIds = [];
-		if (isset($visible['new_groups']) && !empty($_REQUEST['new_groups'])) {
-			if (CWebUser::getType() == USER_TYPE_SUPER_ADMIN) {
-				foreach ($_REQUEST['new_groups'] as $newGroup) {
-					if (is_array($newGroup) && isset($newGroup['new'])) {
-						$newGroups[] = ['name' => $newGroup['new']];
-					}
-					else {
-						$newHostGroupIds[] = $newGroup;
-					}
-				}
-
-				if (isset($newGroups)) {
-					if (!$createdGroups = API::HostGroup()->create($newGroups)) {
-						throw new Exception();
-					}
-
-					$newHostGroupIds = $newHostGroupIds
-						? array_merge($newHostGroupIds, $createdGroups['groupids'])
-						: $createdGroups['groupids'];
-				}
-			}
-			else {
-				$newHostGroupIds = getRequest('new_groups');
-			}
-		}
-
-		if (isset($visible['groups'])) {
-			if (isset($_REQUEST['groups'])) {
-				$replaceHostGroupsIds = $newHostGroupIds
-					? array_unique(array_merge(getRequest('groups'), $newHostGroupIds))
-					: $_REQUEST['groups'];
-			}
-			elseif ($newHostGroupIds) {
-				$replaceHostGroupsIds = $newHostGroupIds;
-			}
-
-			if (isset($replaceHostGroupsIds)) {
-				$hosts['groups'] = API::HostGroup()->get([
-					'groupids' => $replaceHostGroupsIds,
-					'editable' => true,
-					'output' => ['groupid']
-				]);
-			}
-			else {
-				$hosts['groups'] = [];
-			}
-		}
-		elseif ($newHostGroupIds) {
-			$newHostGroups = API::HostGroup()->get([
-				'groupids' => $newHostGroupIds,
-				'editable' => true,
-				'output' => ['groupid']
-			]);
-		}
-
-		if (isset($_REQUEST['mass_replace_tpls'])) {
-			if (isset($_REQUEST['mass_clear_tpls'])) {
-				$hostTemplates = API::Template()->get([
-					'output' => ['templateid'],
-					'hostids' => $hostIds
-				]);
-
-				$hostTemplateIds = zbx_objectValues($hostTemplates, 'templateid');
-				$templatesToDelete = array_diff($hostTemplateIds, $templateIds);
-
-				$hosts['templates_clear'] = zbx_toObject($templatesToDelete, 'templateid');
-			}
-
-			$hosts['templates'] = $templateIds;
-		}
-
-		$result = API::Host()->massUpdate(array_merge($hosts, $newValues));
-		if ($result === false) {
-			throw new Exception();
-		}
-
-		$add = [];
-		if ($templateIds && isset($visible['templates'])) {
-			$add['templates'] = $templateIds;
-		}
-
-		// add new host groups
-		if ($newHostGroupIds && (!isset($visible['groups']) || !isset($replaceHostGroups))) {
-			$add['groups'] = zbx_toObject($newHostGroupIds, 'groupid');
-		}
-
-		if ($add) {
-			$add['hosts'] = $hosts['hosts'];
-
-			$result = API::Host()->massAdd($add);
-
-			if ($result === false) {
-				throw new Exception();
-			}
-		}
-
-		DBend(true);
-
-		uncheckTableRows();
-		show_message(_('Hosts updated'));
-
-		unset($_REQUEST['massupdate'], $_REQUEST['form'], $_REQUEST['hosts']);
-	}
-	catch (Exception $e) {
-		DBend(false);
-		show_error_message(_('Cannot update hosts'));
-	}
-}
-elseif (hasRequest('add') || hasRequest('update')) {
-	try {
-		DBstart();
-
-		$hostId = getRequest('hostid', 0);
-
-		if ($hostId != 0) {
-			$create = false;
-
-			$msgOk = _('Host updated');
-			$msgFail = _('Cannot update host');
-
-			$dbHost = API::Host()->get([
-				'output' => API_OUTPUT_EXTEND,
-				'hostids' => $hostId,
-				'editable' => true
-			]);
-			$dbHost = reset($dbHost);
-		}
-		else {
-			$create = true;
-
-			$msgOk = _('Host added');
-			$msgFail = _('Cannot add host');
-		}
-
-		// host data
-		if (!$create && $dbHost['flags'] == ZBX_FLAG_DISCOVERY_CREATED) {
-			$host = [
-				'hostid' => $hostId,
-				'status' => getRequest('status', HOST_STATUS_NOT_MONITORED),
-				'description' => getRequest('description', ''),
-				'inventory' => (getRequest('inventory_mode') == HOST_INVENTORY_DISABLED)
-					? []
-					: getRequest('host_inventory', [])
-			];
-		}
-		else {
-			// templates
-			$templates = [];
-
-			foreach (getRequest('templates', []) as $templateId) {
-				$templates[] = ['templateid' => $templateId];
-			}
-
-			// interfaces
-			$interfaces = getRequest('interfaces', []);
-
-			foreach ($interfaces as $key => $interface) {
-				if (zbx_empty($interface['ip']) && zbx_empty($interface['dns'])) {
-					unset($interface[$key]);
-					continue;
-				}
-
-				if ($interface['type'] == INTERFACE_TYPE_SNMP && !isset($interface['bulk'])) {
-					$interfaces[$key]['bulk'] = SNMP_BULK_DISABLED;
-				}
-				else {
-					$interfaces[$key]['bulk'] = SNMP_BULK_ENABLED;
-				}
-
-				if ($interface['isNew']) {
-					unset($interfaces[$key]['interfaceid']);
-				}
-
-				unset($interfaces[$key]['isNew']);
-				$interfaces[$key]['main'] = 0;
-			}
-
-			$mainInterfaces = getRequest('mainInterfaces', []);
-			foreach ([INTERFACE_TYPE_AGENT, INTERFACE_TYPE_SNMP, INTERFACE_TYPE_JMX, INTERFACE_TYPE_IPMI] as $type) {
-				if (array_key_exists($type, $mainInterfaces)) {
-					$interfaces[$mainInterfaces[$type]]['main'] = INTERFACE_PRIMARY;
-				}
-			}
-
-			// new group
-			$groups = getRequest('groups', []);
-			$newGroup = getRequest('newgroup');
-
-			if (!zbx_empty($newGroup)) {
-				$newGroup = API::HostGroup()->create(['name' => $newGroup]);
-
-				if (!$newGroup) {
-					throw new Exception();
-				}
-
-				$groups[] = reset($newGroup['groupids']);
-			}
-
-			$groups = zbx_toObject($groups, 'groupid');
-
-			// host data
-			$host = [
-				'host' => getRequest('host'),
-				'name' => getRequest('visiblename'),
-				'status' => getRequest('status', HOST_STATUS_NOT_MONITORED),
-				'description' => getRequest('description'),
-				'proxy_hostid' => getRequest('proxy_hostid', 0),
-				'ipmi_authtype' => getRequest('ipmi_authtype'),
-				'ipmi_privilege' => getRequest('ipmi_privilege'),
-				'ipmi_username' => getRequest('ipmi_username'),
-				'ipmi_password' => getRequest('ipmi_password'),
-				'tls_connect' => getRequest('tls_connect', HOST_ENCRYPTION_NONE),
-				'tls_accept' => getRequest('tls_accept', HOST_ENCRYPTION_NONE),
-				'tls_issuer' => getRequest('tls_issuer'),
-				'tls_subject' => getRequest('tls_subject'),
-				'tls_psk_identity' => getRequest('tls_psk_identity'),
-				'tls_psk' => getRequest('tls_psk'),
-				'groups' => $groups,
-				'templates' => $templates,
-				'interfaces' => $interfaces,
-				'macros' => $macros,
-				'inventory_mode' => getRequest('inventory_mode'),
-				'inventory' => (getRequest('inventory_mode') == HOST_INVENTORY_DISABLED)
-					? []
-					: getRequest('host_inventory', [])
-			];
-
-			if (!$create) {
-				$host['templates_clear'] = zbx_toObject(getRequest('clear_templates', []), 'templateid');
-			}
-		}
-
-		if ($create) {
-			$hostIds = API::Host()->create($host);
-
-			if ($hostIds) {
-				$hostId = reset($hostIds['hostids']);
-			}
-			else {
-				throw new Exception();
-			}
-
-			add_audit_ext(AUDIT_ACTION_ADD, AUDIT_RESOURCE_HOST, $hostId, $host['host'], null, null, null);
-		}
-		else {
-			$host['hostid'] = $hostId;
-
-			if (!API::Host()->update($host)) {
-				throw new Exception();
-			}
-
-			$dbHostNew = API::Host()->get([
-				'output' => API_OUTPUT_EXTEND,
-				'hostids' => $hostId,
-				'editable' => true
-			]);
-			$dbHostNew = reset($dbHostNew);
-
-			add_audit_ext(AUDIT_ACTION_UPDATE, AUDIT_RESOURCE_HOST, $dbHostNew['hostid'], $dbHostNew['host'], 'hosts',
-				$dbHost, $dbHostNew);
-		}
-
-		// full clone
-		if (getRequest('form', '') === 'full_clone' && getRequest('clone_hostid', 0) != 0) {
-			$srcHostId = getRequest('clone_hostid');
-
-			// copy applications
-			if (!copyApplications($srcHostId, $hostId)) {
-				throw new Exception();
-			}
-
-			// copy items
-			if (!copyItems($srcHostId, $hostId)) {
-				throw new Exception();
-			}
-
-			// copy web scenarios
-			if (!copyHttpTests($srcHostId, $hostId)) {
-				throw new Exception();
-			}
-
-			// copy triggers
-			$dbTriggers = API::Trigger()->get([
-				'output' => ['triggerid'],
-				'hostids' => $srcHostId,
-				'inherited' => false
-			]);
-
-			if ($dbTriggers) {
-				if (!copyTriggersToHosts(zbx_objectValues($dbTriggers, 'triggerid'), $hostId, $srcHostId)) {
-					throw new Exception();
-				}
-			}
-
-			// copy discovery rules
-			$dbDiscoveryRules = API::DiscoveryRule()->get([
-				'output' => ['itemid'],
-				'hostids' => $srcHostId,
-				'inherited' => false
-			]);
-
-			if ($dbDiscoveryRules) {
-				$copyDiscoveryRules = API::DiscoveryRule()->copy([
-					'discoveryids' => zbx_objectValues($dbDiscoveryRules, 'itemid'),
-					'hostids' => [$hostId]
-				]);
-
-				if (!$copyDiscoveryRules) {
-					throw new Exception();
-				}
-			}
-
-			// copy graphs
-			$dbGraphs = API::Graph()->get([
-				'output' => API_OUTPUT_EXTEND,
-				'selectHosts' => ['hostid'],
-				'selectItems' => ['type'],
-				'hostids' => $srcHostId,
-				'filter' => ['flags' => ZBX_FLAG_DISCOVERY_NORMAL],
-				'inherited' => false
-			]);
-
-			foreach ($dbGraphs as $dbGraph) {
-				if (count($dbGraph['hosts']) > 1) {
-					continue;
-				}
-
-				if (httpItemExists($dbGraph['items'])) {
-					continue;
-				}
-
-				if (!copyGraphToHost($dbGraph['graphid'], $hostId)) {
-					throw new Exception();
-				}
-			}
-		}
-
-		$result = DBend(true);
-
-		if ($result) {
-			uncheckTableRows();
-		}
-		show_messages($result, $msgOk, $msgFail);
-
-		unset($_REQUEST['form'], $_REQUEST['hostid']);
-	}
-	catch (Exception $e) {
-		DBend(false);
-		show_messages(false, $msgOk, $msgFail);
-	}
-}
-elseif (hasRequest('delete') && hasRequest('hostid')) {
-	DBstart();
-
-	$result = API::Host()->delete([getRequest('hostid')]);
-	$result = DBend($result);
-
-	if ($result) {
-		unset($_REQUEST['form'], $_REQUEST['hostid']);
-		uncheckTableRows();
-	}
-	show_messages($result, _('Host deleted'), _('Cannot delete host'));
-
-	unset($_REQUEST['delete']);
-}
-elseif (hasRequest('action') && getRequest('action') == 'host.massdelete' && hasRequest('hosts')) {
-	DBstart();
-
-	$result = API::Host()->delete(getRequest('hosts'));
-	$result = DBend($result);
-
-	if ($result) {
-		uncheckTableRows();
-	}
-	show_messages($result, _('Host deleted'), _('Cannot delete host'));
-}
-elseif (hasRequest('action') && str_in_array(getRequest('action'), ['host.massenable', 'host.massdisable']) && hasRequest('hosts')) {
-	$enable =(getRequest('action') == 'host.massenable');
-	$status = $enable ? TRIGGER_STATUS_ENABLED : TRIGGER_STATUS_DISABLED;
-
-	$actHosts = API::Host()->get([
-		'hostids' => getRequest('hosts'),
-		'editable' => true,
-		'templated_hosts' => true,
-		'output' => ['hostid']
-	]);
-	$actHosts = zbx_objectValues($actHosts, 'hostid');
-
-	if ($actHosts) {
-		DBstart();
-
-		$result = updateHostStatus($actHosts, $status);
-		$result = DBend($result);
-
-		if ($result) {
-			uncheckTableRows();
-		}
-
-		$updated = count($actHosts);
-
-		$messageSuccess = $enable
-			? _n('Host enabled', 'Hosts enabled', $updated)
-			: _n('Host disabled', 'Hosts disabled', $updated);
-		$messageFailed = $enable
-			? _n('Cannot enable host', 'Cannot enable hosts', $updated)
-			: _n('Cannot disable host', 'Cannot disable hosts', $updated);
-
-		show_messages($result, $messageSuccess, $messageFailed);
-	}
-}
-
-/*
- * Display
- */
-$pageFilter = new CPageFilter([
-	'groups' => [
-		'real_hosts' => true,
-		'editable' => true
-	],
-	'groupid' => getRequest('groupid')
-]);
-
-$_REQUEST['groupid'] = $pageFilter->groupid;
-$_REQUEST['hostid'] = getRequest('hostid', 0);
-
-$config = select_config();
-
-if (hasRequest('action') && getRequest('action') === 'host.massupdateform' && hasRequest('hosts')) {
-	$data = [
-		'hosts' => getRequest('hosts'),
-		'visible' => getRequest('visible', []),
-		'mass_replace_tpls' => getRequest('mass_replace_tpls'),
-		'mass_clear_tpls' => getRequest('mass_clear_tpls'),
-		'groups' => getRequest('groups', []),
-		'newgroup' => getRequest('newgroup', ''),
-		'status' => getRequest('status', HOST_STATUS_MONITORED),
-		'description' => getRequest('description'),
-		'proxy_hostid' => getRequest('proxy_hostid', ''),
-		'ipmi_authtype' => getRequest('ipmi_authtype', IPMI_AUTHTYPE_DEFAULT),
-		'ipmi_privilege' => getRequest('ipmi_privilege', IPMI_PRIVILEGE_USER),
-		'ipmi_username' => getRequest('ipmi_username', ''),
-		'ipmi_password' => getRequest('ipmi_password', ''),
-		'inventory_mode' => getRequest('inventory_mode', HOST_INVENTORY_DISABLED),
-		'host_inventory' => getRequest('host_inventory', []),
-		'templates' => getRequest('templates', []),
-		'inventories' => zbx_toHash(getHostInventories(), 'db_field'),
-		'tls_connect' => getRequest('tls_connect', HOST_ENCRYPTION_NONE),
-		'tls_accept' => getRequest('tls_accept', HOST_ENCRYPTION_NONE),
-		'tls_issuer' => getRequest('tls_issuer', ''),
-		'tls_subject' => getRequest('tls_subject', ''),
-		'tls_psk_identity' => getRequest('tls_psk_identity', ''),
-		'tls_psk' => getRequest('tls_psk', '')
-	];
-
-	// sort templates
-	natsort($data['templates']);
-
-	// get groups
-	$data['all_groups'] = API::HostGroup()->get([
-		'output' => API_OUTPUT_EXTEND,
-		'editable' => true
-	]);
-	order_result($data['all_groups'], 'name');
-
-	// get proxies
-	$data['proxies'] = DBfetchArray(DBselect(
-		'SELECT h.hostid,h.host'.
-		' FROM hosts h'.
-		' WHERE h.status IN ('.HOST_STATUS_PROXY_ACTIVE.','.HOST_STATUS_PROXY_PASSIVE.')'
-	));
-	order_result($data['proxies'], 'host');
-
-	// get templates data
-	$data['linkedTemplates'] = null;
-	if (!empty($data['templates'])) {
-		$getLinkedTemplates = API::Template()->get([
-			'templateids' => $data['templates'],
-			'output' => ['templateid', 'name']
-		]);
-
-		foreach ($getLinkedTemplates as $getLinkedTemplate) {
-			$data['linkedTemplates'][] = [
-				'id' => $getLinkedTemplate['templateid'],
-				'name' => $getLinkedTemplate['name']
-			];
-		}
-	}
-
-	$hostView = new CView('configuration.host.massupdate', $data);
-}
-elseif (hasRequest('form')) {
-	$data = [
-		// Common & auxiliary
-		'form' => getRequest('form', ''),
-		'hostid' => getRequest('hostid', 0),
-		'clone_hostid' => getRequest('clone_hostid', 0),
-		'groupid' => getRequest('groupid', 0),
-		'flags' => getRequest('flags', ZBX_FLAG_DISCOVERY_NORMAL),
-
-		// Host
-		'host' => getRequest('host', ''),
-		'visiblename' => getRequest('visiblename', ''),
-		'groups' => getRequest('groups', []),
-		'newgroup' => getRequest('newgroup', ''),
-		'interfaces' => getRequest('interfaces', []),
-		'mainInterfaces' => getRequest('mainInterfaces', []),
-		'description' => getRequest('description', ''),
-		'proxy_hostid' => getRequest('proxy_hostid', 0),
-		'status' => getRequest('status', HOST_STATUS_NOT_MONITORED),
-
-		// Templates
-		'templates' => getRequest('templates', []),
-		'clear_templates' => getRequest('clear_templates', []),
-		'original_templates' => [],
-		'linked_templates' => [],
-
-		// IPMI
-		'ipmi_authtype' => getRequest('ipmi_authtype', IPMI_AUTHTYPE_DEFAULT),
-		'ipmi_privilege' => getRequest('ipmi_privilege', IPMI_PRIVILEGE_USER),
-		'ipmi_username' => getRequest('ipmi_username', ''),
-		'ipmi_password' => getRequest('ipmi_password', ''),
-
-		// Macros
-		'macros' => $macros,
-		'show_inherited_macros' => getRequest('show_inherited_macros', 0),
-
-		// Host inventory
-		'inventory_mode' => getRequest('inventory_mode', $config['default_inventory_mode']),
-		'host_inventory' => getRequest('host_inventory', []),
-		'inventory_items' => [],
-
-		// Encryption
-		'tls_connect' => getRequest('tls_connect', HOST_ENCRYPTION_NONE),
-		'tls_accept' => getRequest('tls_accept', HOST_ENCRYPTION_NONE),
-		'tls_issuer' => getRequest('tls_issuer', ''),
-		'tls_subject' => getRequest('tls_subject', ''),
-		'tls_psk_identity' => getRequest('tls_psk_identity', ''),
-		'tls_psk' => getRequest('tls_psk', '')
-	];
-
-	if (!hasRequest('form_refresh')) {
-		if ($data['hostid'] != 0) {
-			$dbHosts = API::Host()->get([
-				'output' => ['hostid', 'proxy_hostid', 'host', 'name', 'status', 'ipmi_authtype', 'ipmi_privilege',
-					'ipmi_username', 'ipmi_password', 'flags', 'description', 'tls_connect', 'tls_accept', 'tls_issuer',
-					'tls_subject', 'tls_psk_identity', 'tls_psk'
-				],
-				'selectGroups' => ['groupid'],
-				'selectParentTemplates' => ['templateid'],
-				'selectMacros' => ['hostmacroid', 'macro', 'value'],
-				'selectDiscoveryRule' => ['itemid', 'name'],
-				'selectInventory' => true,
-				'hostids' => [$data['hostid']]
-			]);
-			$dbHost = reset($dbHosts);
-
-			$data['flags'] = $dbHost['flags'];
-			if ($data['flags'] == ZBX_FLAG_DISCOVERY_CREATED) {
-				$data['discoveryRule'] = $dbHost['discoveryRule'];
-			}
-
-			// Host
-			$data['host'] = $dbHost['host'];
-			$data['visiblename'] = $dbHost['name'];
-			$data['groups'] = zbx_objectValues($dbHost['groups'], 'groupid');
-			$data['interfaces'] = API::HostInterface()->get([
-				'output' => ['interfaceid', 'main', 'type', 'useip', 'ip', 'dns', 'port', 'bulk'],
-				'selectItems' => ['type'],
-				'hostids' => [$data['hostid']],
-				'sortfield' => 'interfaceid'
-			]);
-			$data['description'] = $dbHost['description'];
-			$data['proxy_hostid'] = $dbHost['proxy_hostid'];
-			$data['status'] = $dbHost['status'];
-
-			// Templates
-			$data['templates'] = zbx_objectValues($dbHost['parentTemplates'], 'templateid');
-			$data['original_templates'] = array_combine($data['templates'], $data['templates']);
-
-			// IPMI
-			$data['ipmi_authtype'] = $dbHost['ipmi_authtype'];
-			$data['ipmi_privilege'] = $dbHost['ipmi_privilege'];
-			$data['ipmi_username'] = $dbHost['ipmi_username'];
-			$data['ipmi_password'] = $dbHost['ipmi_password'];
-
-			// Macros
-			$data['macros'] = $dbHost['macros'];
-
-			// Interfaces
-			foreach ($data['interfaces'] as &$interface) {
-				if ($data['flags'] == ZBX_FLAG_DISCOVERY_CREATED) {
-					$interface['locked'] = true;
-				}
-				else {
-					// check if interface has items that require specific interface type, if so type cannot be changed
-					$interface['locked'] = false;
-					foreach ($interface['items'] as $item) {
-						$type = itemTypeInterface($item['type']);
-						if ($type !== false && $type != INTERFACE_TYPE_ANY) {
-							$interface['locked'] = true;
-							break;
-						}
-					}
-				}
-
-				$interface['items'] = (bool) $interface['items'];
-			}
-			unset($interface);
-
-			// Host inventory
-			$data['inventory_mode'] = array_key_exists('inventory_mode', $dbHost['inventory'])
-				? $dbHost['inventory']['inventory_mode']
-				: HOST_INVENTORY_DISABLED;
-			$data['host_inventory'] = $dbHost['inventory'];
-			unset($data['host_inventory']['inventory_mode']);
-
-			// Encryption
-			$data['tls_connect'] = $dbHost['tls_connect'];
-			$data['tls_accept'] = $dbHost['tls_accept'];
-			$data['tls_issuer'] = $dbHost['tls_issuer'];
-			$data['tls_subject'] = $dbHost['tls_subject'];
-			$data['tls_psk_identity'] = $dbHost['tls_psk_identity'];
-			$data['tls_psk'] = $dbHost['tls_psk'];
-
-			// display empty visible name if equal to host name
-			if ($data['host'] === $data['visiblename']) {
-				$data['visiblename'] = '';
-			}
-		}
-		else {
-			$data['status'] = HOST_STATUS_MONITORED;
-		}
-
-		if (!$data['groups'] && $data['groupid'] != 0) {
-			$data['groups'][] = $data['groupid'];
-		}
-	}
-	else {
-		if ($data['hostid'] != 0) {
-			$dbHosts = API::Host()->get([
-				'output' => ['flags'],
-				'selectParentTemplates' => ['templateid'],
-				'selectDiscoveryRule' => ['itemid', 'name'],
-				'hostids' => [$data['hostid']]
-			]);
-			$dbHost = reset($dbHosts);
-
-			$data['flags'] = $dbHost['flags'];
-			if ($data['flags'] == ZBX_FLAG_DISCOVERY_CREATED) {
-				$data['discoveryRule'] = $dbHost['discoveryRule'];
-			}
-
-			$templateids = zbx_objectValues($dbHost['parentTemplates'], 'templateid');
-			$data['original_templates'] = array_combine($templateids, $templateids);
-		}
-
-		foreach ([INTERFACE_TYPE_AGENT, INTERFACE_TYPE_SNMP, INTERFACE_TYPE_JMX, INTERFACE_TYPE_IPMI] as $type) {
-			if (array_key_exists($type, $data['mainInterfaces'])) {
-				$interfaceid = $data['mainInterfaces'][$type];
-				$data['interfaces'][$interfaceid]['main'] = '1';
-			}
-		}
-		$data['interfaces'] = array_values($data['interfaces']);
-	}
-
-	if ($data['hostid'] != 0) {
-		// get items that populate host inventory fields
-		$data['inventory_items'] = API::Item()->get([
-			'output' => ['inventory_link', 'itemid', 'hostid', 'name', 'key_'],
-			'hostids' => [$dbHost['hostid']],
-			'filter' => ['inventory_link' => array_keys(getHostInventories())]
-		]);
-		$data['inventory_items'] = zbx_toHash($data['inventory_items'], 'inventory_link');
-		$data['inventory_items'] = CMacrosResolverHelper::resolveItemNames($data['inventory_items']);
-	}
-
-	if ($data['flags'] == ZBX_FLAG_DISCOVERY_CREATED) {
-		if ($data['proxy_hostid'] != 0) {
-			$data['proxies'] = API::Proxy()->get([
-				'output' => ['host'],
-				'proxyids' => [$data['proxy_hostid']],
-				'preservekeys' => true
-			]);
-		}
-		else {
-			$data['proxies'] = [];
-		}
-	}
-	else {
-		$data['proxies'] = API::Proxy()->get([
-			'output' => ['host'],
-			'preservekeys' => true
-		]);
-		order_result($proxies, 'host');
-	}
-
-	foreach ($data['proxies'] as &$proxy) {
-		$proxy = $proxy['host'];
-	}
-	unset($proxy);
-
-	if ($data['show_inherited_macros']) {
-		$data['macros'] = mergeInheritedMacros($data['macros'], getInheritedMacros($data['templates']));
-	}
-	$data['macros'] = array_values(order_macros($data['macros'], 'macro'));
-
-	if (!$data['macros'] && $data['flags'] != ZBX_FLAG_DISCOVERY_CREATED) {
-		$macro = ['macro' => '', 'value' => ''];
-		if ($data['show_inherited_macros']) {
-			$macro['type'] = MACRO_TYPE_HOSTMACRO;
-		}
-		$data['macros'][] = $macro;
-	}
-
-	// groups with RW permissions
-	$data['groupsAllowed'] = API::HostGroup()->get([
-		'output' => [],
-		'editable' => true,
-		'preservekeys' => true
-	]);
-
-	// all available groups
-	$data['groupsAll'] = API::HostGroup()->get(['output' => ['groupid', 'name']]);
-	CArrayHelper::sort($data['groupsAll'], ['name']);
-
-	if ($data['templates']) {
-		$data['linked_templates'] = API::Template()->get([
-			'output' => ['templateid', 'name'],
-			'templateids' => $data['templates']
-		]);
-		CArrayHelper::sort($data['linked_templates'], ['name']);
-	}
-
-	$hostView = new CView('configuration.host.edit', $data);
-}
-else {
-	$sortField = getRequest('sort', CProfile::get('web.'.$page['file'].'.sort', 'name'));
-	$sortOrder = getRequest('sortorder', CProfile::get('web.'.$page['file'].'.sortorder', ZBX_SORT_UP));
-
-	CProfile::update('web.'.$page['file'].'.sort', $sortField, PROFILE_TYPE_STR);
-	CProfile::update('web.'.$page['file'].'.sortorder', $sortOrder, PROFILE_TYPE_STR);
-
-	// get Hosts
-	$hosts = [];
-	if ($pageFilter->groupsSelected) {
-		$hosts = API::Host()->get([
-			'output' => ['hostid', $sortField],
-			'groupids' => ($pageFilter->groupid > 0) ? $pageFilter->groupid : null,
-			'editable' => true,
-			'sortfield' => $sortField,
-			'limit' => $config['search_limit'] + 1,
-			'search' => [
-				'name' => ($filter['host'] === '') ? null : $filter['host'],
-				'ip' => ($filter['ip'] === '') ? null : $filter['ip'],
-				'dns' => ($filter['dns'] === '') ? null : $filter['dns']
-			],
-			'filter' => [
-				'port' => ($filter['port'] === '') ? null : $filter['port']
-			]
-		]);
-	}
-	order_result($hosts, $sortField, $sortOrder);
-
-	$pagingLine = getPagingLine($hosts, $sortOrder);
-
-	$hosts = API::Host()->get([
-		'hostids' => zbx_objectValues($hosts, 'hostid'),
-		'output' => API_OUTPUT_EXTEND,
-		'selectParentTemplates' => ['hostid', 'name'],
-		'selectInterfaces' => API_OUTPUT_EXTEND,
-		'selectItems' => API_OUTPUT_COUNT,
-		'selectDiscoveries' => API_OUTPUT_COUNT,
-		'selectTriggers' => API_OUTPUT_COUNT,
-		'selectGraphs' => API_OUTPUT_COUNT,
-		'selectApplications' => API_OUTPUT_COUNT,
-		'selectHttpTests' => API_OUTPUT_COUNT,
-		'selectDiscoveryRule' => ['itemid', 'name'],
-		'selectHostDiscovery' => ['ts_delete']
-	]);
-	order_result($hosts, $sortField, $sortOrder);
-
-	// selecting linked templates to templates linked to hosts
-	$templateIds = [];
-	foreach ($hosts as $host) {
-		$templateIds = array_merge($templateIds, zbx_objectValues($host['parentTemplates'], 'templateid'));
-	}
-	$templateIds = array_unique($templateIds);
-
-	$templates = API::Template()->get([
-		'output' => ['templateid', 'name'],
-		'templateids' => $templateIds,
-		'selectParentTemplates' => ['hostid', 'name'],
-		'preservekeys' => true
-	]);
-
-	// get proxy host IDs that that are not 0
-	$proxyHostIds = [];
-	foreach ($hosts as $host) {
-		if ($host['proxy_hostid']) {
-			$proxyHostIds[$host['proxy_hostid']] = $host['proxy_hostid'];
-		}
-	}
-	$proxies = [];
-	if ($proxyHostIds) {
-		$proxies = API::Proxy()->get([
-			'proxyids' => $proxyHostIds,
-			'output' => ['host'],
-			'preservekeys' => true
-		]);
-	}
-
-	$data = [
-		'pageFilter' => $pageFilter,
-		'hosts' => $hosts,
-		'paging' => $pagingLine,
-		'filter' => $filter,
-		'sortField' => $sortField,
-		'sortOrder' => $sortOrder,
-		'groupId' => $pageFilter->groupid,
-		'config' => $config,
-		'templates' => $templates,
-		'proxies' => $proxies
-	];
+    /*
+    ** Zabbix
+    ** Copyright (C) 2001-2016 Zabbix SIA
+    **
+    ** This program is free software; you can redistribute it and/or modify
+    ** it under the terms of the GNU General Public License as published by
+    ** the Free Software Foundation; either version 2 of the License, or
+    ** (at your option) any later version.
+    **
+    ** This program is distributed in the hope that it will be useful,
+    ** but WITHOUT ANY WARRANTY; without even the implied warranty of
+    ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+    ** GNU General Public License for more details.
+    **
+    ** You should have received a copy of the GNU General Public License
+    ** along with this program; if not, write to the Free Software
+    ** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+    **/
+
+
+    require_once dirname(__FILE__) . '/include/config.inc.php';
+    require_once dirname(__FILE__) . '/include/forms.inc.php';
+
+    if (hasRequest('action') && getRequest('action') == 'host.export' && hasRequest('hosts')) {
+        $page['file'] = 'zbx_export_hosts.xml';
+        $page['type'] = detect_page_type(PAGE_TYPE_XML);
+
+        $exportData = true;
+    } else {
+        $page['title'] = _('Configuration of hosts');
+        $page['file'] = 'hosts.php';
+        $page['type'] = detect_page_type(PAGE_TYPE_HTML);
+        $page['scripts'] = ['multiselect.js'];
+
+        $exportData = false;
+    }
+
+    require_once dirname(__FILE__) . '/include/page_header.php';
+
+    // VAR	TYPE	OPTIONAL	FLAGS	VALIDATION	EXCEPTION
+    $fields = [
+        'hosts'                 => [T_ZBX_INT, O_OPT, P_SYS, DB_ID, null],
+        'groups'                => [T_ZBX_INT, O_OPT, P_SYS, DB_ID, null],
+        'new_groups'            => [T_ZBX_STR, O_OPT, P_SYS, null, null],
+        'hostids'               => [T_ZBX_INT, O_OPT, P_SYS, DB_ID, null],
+        'groupids'              => [T_ZBX_INT, O_OPT, P_SYS, DB_ID, null],
+        'applications'          => [T_ZBX_INT, O_OPT, P_SYS, DB_ID, null],
+        'groupid'               => [T_ZBX_INT, O_OPT, P_SYS, DB_ID, null],
+        'hostid'                => [T_ZBX_INT, O_OPT, P_SYS, DB_ID, 'isset({form}) && {form} == "update"'],
+        'clone_hostid'          => [T_ZBX_INT, O_OPT, P_SYS, DB_ID, 'isset({form}) && {form} == "full_clone"'],
+        'host'                  => [
+            T_ZBX_STR,
+            O_OPT,
+            null,
+            NOT_EMPTY,
+            'isset({add}) || isset({update})',
+            _('Host name')
+        ],
+        'visiblename'           => [T_ZBX_STR, O_OPT, null, null, 'isset({add}) || isset({update})'],
+        'description'           => [T_ZBX_STR, O_OPT, null, null, null],
+        'proxy_hostid'          => [T_ZBX_INT, O_OPT, P_SYS, DB_ID, null],
+        'status'                => [
+            T_ZBX_INT,
+            O_OPT,
+            null,
+            IN([HOST_STATUS_MONITORED, HOST_STATUS_NOT_MONITORED]),
+            null
+        ],
+        'newgroup'              => [T_ZBX_STR, O_OPT, null, null, null],
+        'interfaces'            => [
+            T_ZBX_STR,
+            O_OPT,
+            null,
+            NOT_EMPTY,
+            'isset({add}) || isset({update})',
+            _('Agent or SNMP or JMX or IPMI interface')
+        ],
+        'mainInterfaces'        => [T_ZBX_INT, O_OPT, null, DB_ID, null],
+        'templates'             => [T_ZBX_INT, O_OPT, null, DB_ID, null],
+        'add_template'          => [T_ZBX_STR, O_OPT, null, null, null],
+        'add_templates'         => [T_ZBX_INT, O_OPT, null, DB_ID, null],
+        'templates_rem'         => [T_ZBX_STR, O_OPT, P_SYS | P_ACT, null, null],
+        'clear_templates'       => [T_ZBX_INT, O_OPT, null, DB_ID, null],
+        'ipmi_authtype'         => [T_ZBX_INT, O_OPT, null, BETWEEN(-1, 6), null],
+        'ipmi_privilege'        => [T_ZBX_INT, O_OPT, null, BETWEEN(0, 5), null],
+        'ipmi_username'         => [T_ZBX_STR, O_OPT, null, null, null],
+        'ipmi_password'         => [T_ZBX_STR, O_OPT, null, null, null],
+        'tls_connect'           => [
+            T_ZBX_INT,
+            O_OPT,
+            null,
+            IN([HOST_ENCRYPTION_NONE, HOST_ENCRYPTION_PSK, HOST_ENCRYPTION_CERTIFICATE]),
+            null
+        ],
+        'tls_accept'            => [
+            T_ZBX_INT,
+            O_OPT,
+            null,
+            BETWEEN(0, (HOST_ENCRYPTION_NONE | HOST_ENCRYPTION_PSK | HOST_ENCRYPTION_CERTIFICATE)),
+            null
+        ],
+        'tls_subject'           => [T_ZBX_STR, O_OPT, null, null, null],
+        'tls_issuer'            => [T_ZBX_STR, O_OPT, null, null, null],
+        'tls_psk_identity'      => [T_ZBX_STR, O_OPT, null, null, null],
+        'tls_psk'               => [T_ZBX_STR, O_OPT, null, null, null],
+        'flags'                 => [
+            T_ZBX_INT,
+            O_OPT,
+            null,
+            IN([ZBX_FLAG_DISCOVERY_NORMAL, ZBX_FLAG_DISCOVERY_CREATED]),
+            null
+        ],
+        'mass_replace_tpls'     => [T_ZBX_STR, O_OPT, null, null, null],
+        'mass_clear_tpls'       => [T_ZBX_STR, O_OPT, null, null, null],
+        'inventory_mode'        => [
+            T_ZBX_INT,
+            O_OPT,
+            null,
+            IN(HOST_INVENTORY_DISABLED . ',' . HOST_INVENTORY_MANUAL . ',' . HOST_INVENTORY_AUTOMATIC),
+            null
+        ],
+        'host_inventory'        => [T_ZBX_STR, O_OPT, P_UNSET_EMPTY, null, null],
+        'macros'                => [T_ZBX_STR, O_OPT, P_SYS, null, null],
+        'visible'               => [T_ZBX_STR, O_OPT, null, null, null],
+        'show_inherited_macros' => [T_ZBX_INT, O_OPT, null, IN([0, 1]), null],
+        // actions
+        'action'                => [
+            T_ZBX_STR,
+            O_OPT,
+            P_SYS | P_ACT,
+            IN('"host.export","host.massdelete","host.massdisable","host.massenable","host.massupdate"' . ',"host.massupdateform"'),
+            null
+        ],
+        'add_to_group'          => [T_ZBX_INT, O_OPT, P_SYS | P_ACT, DB_ID, null],
+        'delete_from_group'     => [T_ZBX_INT, O_OPT, P_SYS | P_ACT, DB_ID, null],
+        'unlink'                => [T_ZBX_STR, O_OPT, P_SYS | P_ACT, null, null],
+        'unlink_and_clear'      => [T_ZBX_STR, O_OPT, P_SYS | P_ACT, null, null],
+        'add'                   => [T_ZBX_STR, O_OPT, P_SYS | P_ACT, null, null],
+        'update'                => [T_ZBX_STR, O_OPT, P_SYS | P_ACT, null, null],
+        'masssave'              => [T_ZBX_STR, O_OPT, P_SYS | P_ACT, null, null],
+        'clone'                 => [T_ZBX_STR, O_OPT, P_SYS | P_ACT, null, null],
+        'full_clone'            => [T_ZBX_STR, O_OPT, P_SYS | P_ACT, null, null],
+        'delete'                => [T_ZBX_STR, O_OPT, P_SYS | P_ACT, null, null],
+        'cancel'                => [T_ZBX_STR, O_OPT, P_SYS, null, null],
+        'form'                  => [T_ZBX_STR, O_OPT, P_SYS, null, null],
+        'form_refresh'          => [T_ZBX_INT, O_OPT, null, null, null],
+        // filter
+        'filter_set'            => [T_ZBX_STR, O_OPT, P_SYS, null, null],
+        'filter_rst'            => [T_ZBX_STR, O_OPT, P_SYS, null, null],
+        'filter_host'           => [T_ZBX_STR, O_OPT, null, null, null],
+        'filter_ip'             => [T_ZBX_STR, O_OPT, null, null, null],
+        'filter_dns'            => [T_ZBX_STR, O_OPT, null, null, null],
+        'filter_port'           => [T_ZBX_STR, O_OPT, null, null, null],
+        // sort and sortorder
+        'sort'                  => [T_ZBX_STR, O_OPT, P_SYS, IN('"name","status"'), null],
+        'sortorder'             => [T_ZBX_STR, O_OPT, P_SYS, IN('"' . ZBX_SORT_DOWN . '","' . ZBX_SORT_UP . '"'), null]
+    ];
+    check_fields($fields);
+
+    /*
+     * Permissions
+     */
+    if (getRequest('groupid') && !API::HostGroup()->isWritable([$_REQUEST['groupid']])) {
+        access_deny();
+    }
+    if (getRequest('hostid') && !API::Host()->isWritable([$_REQUEST['hostid']])) {
+        access_deny();
+    }
+
+    $hostIds = getRequest('hosts', []);
+
+    /*
+     * Export
+     */
+    if ($exportData) {
+        $export = new CConfigurationExport(['hosts' => $hostIds]);
+        $export->setBuilder(new CConfigurationExportBuilder());
+        $export->setWriter(CExportWriterFactory::getWriter(CExportWriterFactory::XML));
+        $exportData = $export->export();
+
+        if (hasErrorMesssages()) {
+            show_messages();
+        } else {
+            print($exportData);
+        }
+
+        exit;
+    }
+
+    /*
+     * Filter
+     */
+    if (hasRequest('filter_set')) {
+        CProfile::update('web.hosts.filter_ip', getRequest('filter_ip', ''), PROFILE_TYPE_STR);
+        CProfile::update('web.hosts.filter_dns', getRequest('filter_dns', ''), PROFILE_TYPE_STR);
+        CProfile::update('web.hosts.filter_host', getRequest('filter_host', ''), PROFILE_TYPE_STR);
+        CProfile::update('web.hosts.filter_port', getRequest('filter_port', ''), PROFILE_TYPE_STR);
+    } elseif (hasRequest('filter_rst')) {
+        DBStart();
+        CProfile::delete('web.hosts.filter_ip');
+        CProfile::delete('web.hosts.filter_dns');
+        CProfile::delete('web.hosts.filter_host');
+        CProfile::delete('web.hosts.filter_port');
+        DBend();
+    }
+
+    $filter['ip'] = CProfile::get('web.hosts.filter_ip', '');
+    $filter['dns'] = CProfile::get('web.hosts.filter_dns', '');
+    $filter['host'] = CProfile::get('web.hosts.filter_host', '');
+    $filter['port'] = CProfile::get('web.hosts.filter_port', '');
+
+    // remove inherited macros data (actions: 'add', 'update' and 'form')
+    $macros = cleanInheritedMacros(getRequest('macros', []));
+
+    // remove empty new macro lines
+    foreach ($macros as $idx => $macro) {
+        if (!array_key_exists('hostmacroid', $macro) && $macro['macro'] === '' && $macro['value'] === '') {
+            unset($macros[$idx]);
+        }
+    }
+
+    /*
+     * Actions
+     */
+    if (isset($_REQUEST['add_template']) && isset($_REQUEST['add_templates'])) {
+        $_REQUEST['templates'] = getRequest('templates', []);
+        $_REQUEST['templates'] = array_merge($_REQUEST['templates'], $_REQUEST['add_templates']);
+    }
+    if (isset($_REQUEST['unlink']) || isset($_REQUEST['unlink_and_clear'])) {
+        $_REQUEST['clear_templates'] = getRequest('clear_templates', []);
+
+        $unlinkTemplates = [];
+
+        if (isset($_REQUEST['unlink'])) {
+            // templates_rem for old style removal in massupdate form
+            if (isset($_REQUEST['templates_rem'])) {
+                $unlinkTemplates = array_keys($_REQUEST['templates_rem']);
+            } elseif (is_array($_REQUEST['unlink'])) {
+                $unlinkTemplates = array_keys($_REQUEST['unlink']);
+            }
+        } else {
+            $unlinkTemplates = array_keys($_REQUEST['unlink_and_clear']);
+
+            $_REQUEST['clear_templates'] = array_merge($_REQUEST['clear_templates'], $unlinkTemplates);
+        }
+
+        foreach ($unlinkTemplates as $templateId) {
+            unset($_REQUEST['templates'][array_search($templateId, $_REQUEST['templates'])]);
+        }
+    } elseif ((hasRequest('clone') || hasRequest('full_clone')) && hasRequest('hostid')) {
+        $_REQUEST['form'] = hasRequest('clone') ? 'clone' : 'full_clone';
+
+        $groupids = getRequest('groups', []);
+        if ($groupids) {
+            // leave only writable groups
+            $_REQUEST['groups'] = array_keys(API::HostGroup()->get([
+                'output'       => [],
+                'groupids'     => $groupids,
+                'editable'     => true,
+                'preservekeys' => true
+            ]));
+        }
+
+        if (hasRequest('interfaces')) {
+            $interfaceid = 1;
+            foreach ($_REQUEST['interfaces'] as &$interface) {
+                $interface['interfaceid'] = (string) $interfaceid++;
+                unset($interface['locked'], $interface['items']);
+            }
+            unset($interface);
+        }
+
+        if (hasRequest('full_clone')) {
+            $_REQUEST['clone_hostid'] = $_REQUEST['hostid'];
+        }
+
+        unset($_REQUEST['hostid'], $_REQUEST['flags']);
+    } elseif (hasRequest('action') && getRequest('action') == 'host.massupdate' && hasRequest('masssave')) {
+        $hostIds = getRequest('hosts', []);
+        $visible = getRequest('visible', []);
+        $_REQUEST['proxy_hostid'] = getRequest('proxy_hostid', 0);
+        $_REQUEST['templates'] = getRequest('templates', []);
+
+        try {
+            DBstart();
+
+            // filter only normal and discovery created hosts
+            $hosts = API::Host()->get([
+                'output'  => ['hostid'],
+                'hostids' => $hostIds,
+                'filter'  => ['flags' => [ZBX_FLAG_DISCOVERY_NORMAL, ZBX_FLAG_DISCOVERY_CREATED]]
+            ]);
+            $hosts = ['hosts' => $hosts];
+
+            $properties = [
+                'proxy_hostid',
+                'ipmi_authtype',
+                'ipmi_privilege',
+                'ipmi_username',
+                'ipmi_password',
+                'description'
+            ];
+
+            $newValues = [];
+            foreach ($properties as $property) {
+                if (isset($visible[$property])) {
+                    $newValues[$property] = $_REQUEST[$property];
+                }
+            }
+
+            if (isset($visible['status'])) {
+                $newValues['status'] = getRequest('status', HOST_STATUS_NOT_MONITORED);
+            }
+
+            if (isset($visible['inventory_mode'])) {
+                $newValues['inventory_mode'] = getRequest('inventory_mode', HOST_INVENTORY_DISABLED);
+                $newValues['inventory'] = ($newValues['inventory_mode'] == HOST_INVENTORY_DISABLED) ? [] : getRequest('host_inventory', []);
+            }
+
+            if (array_key_exists('encryption', $visible)) {
+                $newValues['tls_connect'] = getRequest('tls_connect', HOST_ENCRYPTION_NONE);
+                $newValues['tls_accept'] = getRequest('tls_accept', HOST_ENCRYPTION_NONE);
+                $newValues['tls_issuer'] = getRequest('tls_issuer', '');
+                $newValues['tls_subject'] = getRequest('tls_subject', '');
+                $newValues['tls_psk_identity'] = getRequest('tls_psk_identity', '');
+                $newValues['tls_psk'] = getRequest('tls_psk', '');
+            }
+
+            $templateIds = [];
+            if (isset($visible['templates'])) {
+                $templateIds = $_REQUEST['templates'];
+            }
+
+            // add new or existing host groups
+            $newHostGroupIds = [];
+            if (isset($visible['new_groups']) && !empty($_REQUEST['new_groups'])) {
+                if (CWebUser::getType() == USER_TYPE_SUPER_ADMIN) {
+                    foreach ($_REQUEST['new_groups'] as $newGroup) {
+                        if (is_array($newGroup) && isset($newGroup['new'])) {
+                            $newGroups[] = ['name' => $newGroup['new']];
+                        } else {
+                            $newHostGroupIds[] = $newGroup;
+                        }
+                    }
+
+                    if (isset($newGroups)) {
+                        if (!$createdGroups = API::HostGroup()->create($newGroups)) {
+                            throw new Exception();
+                        }
+
+                        $newHostGroupIds = $newHostGroupIds ? array_merge($newHostGroupIds, $createdGroups['groupids']) : $createdGroups['groupids'];
+                    }
+                } else {
+                    $newHostGroupIds = getRequest('new_groups');
+                }
+            }
+
+            if (isset($visible['groups'])) {
+                if (isset($_REQUEST['groups'])) {
+                    $replaceHostGroupsIds = $newHostGroupIds ? array_unique(array_merge(getRequest('groups'), $newHostGroupIds)) : $_REQUEST['groups'];
+                } elseif ($newHostGroupIds) {
+                    $replaceHostGroupsIds = $newHostGroupIds;
+                }
+
+                if (isset($replaceHostGroupsIds)) {
+                    $hosts['groups'] = API::HostGroup()->get([
+                        'groupids' => $replaceHostGroupsIds,
+                        'editable' => true,
+                        'output'   => ['groupid']
+                    ]);
+                } else {
+                    $hosts['groups'] = [];
+                }
+            } elseif ($newHostGroupIds) {
+                $newHostGroups = API::HostGroup()->get([
+                    'groupids' => $newHostGroupIds,
+                    'editable' => true,
+                    'output'   => ['groupid']
+                ]);
+            }
+
+            if (isset($_REQUEST['mass_replace_tpls'])) {
+                if (isset($_REQUEST['mass_clear_tpls'])) {
+                    $hostTemplates = API::Template()->get([
+                        'output'  => ['templateid'],
+                        'hostids' => $hostIds
+                    ]);
+
+                    $hostTemplateIds = zbx_objectValues($hostTemplates, 'templateid');
+                    $templatesToDelete = array_diff($hostTemplateIds, $templateIds);
+
+                    $hosts['templates_clear'] = zbx_toObject($templatesToDelete, 'templateid');
+                }
+
+                $hosts['templates'] = $templateIds;
+            }
+
+            $result = API::Host()->massUpdate(array_merge($hosts, $newValues));
+            if ($result === false) {
+                throw new Exception();
+            }
+
+            $add = [];
+            if ($templateIds && isset($visible['templates'])) {
+                $add['templates'] = $templateIds;
+            }
+
+            // add new host groups
+            if ($newHostGroupIds && (!isset($visible['groups']) || !isset($replaceHostGroups))) {
+                $add['groups'] = zbx_toObject($newHostGroupIds, 'groupid');
+            }
+
+            if ($add) {
+                $add['hosts'] = $hosts['hosts'];
+
+                $result = API::Host()->massAdd($add);
+
+                if ($result === false) {
+                    throw new Exception();
+                }
+            }
+
+            DBend(true);
+
+            uncheckTableRows();
+            show_message(_('Hosts updated'));
+
+            unset($_REQUEST['massupdate'], $_REQUEST['form'], $_REQUEST['hosts']);
+        } catch (Exception $e) {
+            DBend(false);
+            show_error_message(_('Cannot update hosts'));
+        }
+    } elseif (hasRequest('add') || hasRequest('update')) {
+        try {
+            DBstart();
+
+            $hostId = getRequest('hostid', 0);
+
+            if ($hostId != 0) {
+                $create = false;
+
+                $msgOk = _('Host updated');
+                $msgFail = _('Cannot update host');
+
+                $dbHost = API::Host()->get([
+                    'output'   => API_OUTPUT_EXTEND,
+                    'hostids'  => $hostId,
+                    'editable' => true
+                ]);
+                $dbHost = reset($dbHost);
+            } else {
+                $create = true;
+
+                $msgOk = _('Host added');
+                $msgFail = _('Cannot add host');
+            }
+
+            // host data
+            if (!$create && $dbHost['flags'] == ZBX_FLAG_DISCOVERY_CREATED) {
+                $host = [
+                    'hostid'      => $hostId,
+                    'status'      => getRequest('status', HOST_STATUS_NOT_MONITORED),
+                    'description' => getRequest('description', ''),
+                    'inventory'   => (getRequest('inventory_mode') == HOST_INVENTORY_DISABLED) ? [] : getRequest('host_inventory', [])
+                ];
+            } else {
+                // templates
+                $templates = [];
+
+                foreach (getRequest('templates', []) as $templateId) {
+                    $templates[] = ['templateid' => $templateId];
+                }
+
+                // interfaces
+                $interfaces = getRequest('interfaces', []);
+
+                foreach ($interfaces as $key => $interface) {
+                    if (zbx_empty($interface['ip']) && zbx_empty($interface['dns'])) {
+                        unset($interface[$key]);
+                        continue;
+                    }
+
+                    if ($interface['type'] == INTERFACE_TYPE_SNMP && !isset($interface['bulk'])) {
+                        $interfaces[$key]['bulk'] = SNMP_BULK_DISABLED;
+                    } else {
+                        $interfaces[$key]['bulk'] = SNMP_BULK_ENABLED;
+                    }
+
+                    if ($interface['isNew']) {
+                        unset($interfaces[$key]['interfaceid']);
+                    }
+
+                    unset($interfaces[$key]['isNew']);
+                    $interfaces[$key]['main'] = 0;
+                }
+
+                $mainInterfaces = getRequest('mainInterfaces', []);
+                foreach ([INTERFACE_TYPE_AGENT, INTERFACE_TYPE_SNMP, INTERFACE_TYPE_JMX, INTERFACE_TYPE_IPMI] as $type)
+                {
+                    if (array_key_exists($type, $mainInterfaces)) {
+                        $interfaces[$mainInterfaces[$type]]['main'] = INTERFACE_PRIMARY;
+                    }
+                }
+
+                // new group
+                $groups = getRequest('groups', []);
+                $newGroup = getRequest('newgroup');
+
+                if (!zbx_empty($newGroup)) {
+                    $newGroup = API::HostGroup()->create(['name' => $newGroup]);
+
+                    if (!$newGroup) {
+                        throw new Exception();
+                    }
+
+                    $groups[] = reset($newGroup['groupids']);
+                }
+
+                $groups = zbx_toObject($groups, 'groupid');
+
+                // host data
+                $host = [
+                    'host'             => getRequest('host'),
+                    'name'             => getRequest('visiblename'),
+                    'status'           => getRequest('status', HOST_STATUS_NOT_MONITORED),
+                    'description'      => getRequest('description'),
+                    'proxy_hostid'     => getRequest('proxy_hostid', 0),
+                    'ipmi_authtype'    => getRequest('ipmi_authtype'),
+                    'ipmi_privilege'   => getRequest('ipmi_privilege'),
+                    'ipmi_username'    => getRequest('ipmi_username'),
+                    'ipmi_password'    => getRequest('ipmi_password'),
+                    'tls_connect'      => getRequest('tls_connect', HOST_ENCRYPTION_NONE),
+                    'tls_accept'       => getRequest('tls_accept', HOST_ENCRYPTION_NONE),
+                    'tls_issuer'       => getRequest('tls_issuer'),
+                    'tls_subject'      => getRequest('tls_subject'),
+                    'tls_psk_identity' => getRequest('tls_psk_identity'),
+                    'tls_psk'          => getRequest('tls_psk'),
+                    'groups'           => $groups,
+                    'templates'        => $templates,
+                    'interfaces'       => $interfaces,
+                    'macros'           => $macros,
+                    'inventory_mode'   => getRequest('inventory_mode'),
+                    'inventory'        => (getRequest('inventory_mode') == HOST_INVENTORY_DISABLED) ? [] : getRequest('host_inventory', [])
+                ];
+
+                if (!$create) {
+                    $host['templates_clear'] = zbx_toObject(getRequest('clear_templates', []), 'templateid');
+                }
+            }
+
+            if ($create) {
+                $hostIds = API::Host()->create($host);
+
+                if ($hostIds) {
+                    $hostId = reset($hostIds['hostids']);
+                } else {
+                    throw new Exception();
+                }
+
+                add_audit_ext(AUDIT_ACTION_ADD, AUDIT_RESOURCE_HOST, $hostId, $host['host'], null, null, null);
+            } else {
+                $host['hostid'] = $hostId;
+
+                if (!API::Host()->update($host)) {
+                    throw new Exception();
+                }
+
+                $dbHostNew = API::Host()->get([
+                    'output'   => API_OUTPUT_EXTEND,
+                    'hostids'  => $hostId,
+                    'editable' => true
+                ]);
+                $dbHostNew = reset($dbHostNew);
+
+                add_audit_ext(AUDIT_ACTION_UPDATE, AUDIT_RESOURCE_HOST, $dbHostNew['hostid'], $dbHostNew['host'], 'hosts', $dbHost, $dbHostNew);
+            }
+
+            // full clone
+            if (getRequest('form', '') === 'full_clone' && getRequest('clone_hostid', 0) != 0) {
+                $srcHostId = getRequest('clone_hostid');
+
+                // copy applications
+                if (!copyApplications($srcHostId, $hostId)) {
+                    throw new Exception();
+                }
+
+                // copy items
+                if (!copyItems($srcHostId, $hostId)) {
+                    throw new Exception();
+                }
+
+                // copy web scenarios
+                if (!copyHttpTests($srcHostId, $hostId)) {
+                    throw new Exception();
+                }
+
+                // copy triggers
+                $dbTriggers = API::Trigger()->get([
+                    'output'    => ['triggerid'],
+                    'hostids'   => $srcHostId,
+                    'inherited' => false
+                ]);
+
+                if ($dbTriggers) {
+                    if (!copyTriggersToHosts(zbx_objectValues($dbTriggers, 'triggerid'), $hostId, $srcHostId)) {
+                        throw new Exception();
+                    }
+                }
+
+                // copy discovery rules
+                $dbDiscoveryRules = API::DiscoveryRule()->get([
+                    'output'    => ['itemid'],
+                    'hostids'   => $srcHostId,
+                    'inherited' => false
+                ]);
+
+                if ($dbDiscoveryRules) {
+                    $copyDiscoveryRules = API::DiscoveryRule()->copy([
+                        'discoveryids' => zbx_objectValues($dbDiscoveryRules, 'itemid'),
+                        'hostids'      => [$hostId]
+                    ]);
+
+                    if (!$copyDiscoveryRules) {
+                        throw new Exception();
+                    }
+                }
+
+                // copy graphs
+                $dbGraphs = API::Graph()->get([
+                    'output'      => API_OUTPUT_EXTEND,
+                    'selectHosts' => ['hostid'],
+                    'selectItems' => ['type'],
+                    'hostids'     => $srcHostId,
+                    'filter'      => ['flags' => ZBX_FLAG_DISCOVERY_NORMAL],
+                    'inherited'   => false
+                ]);
+
+                foreach ($dbGraphs as $dbGraph) {
+                    if (count($dbGraph['hosts']) > 1) {
+                        continue;
+                    }
+
+                    if (httpItemExists($dbGraph['items'])) {
+                        continue;
+                    }
+
+                    if (!copyGraphToHost($dbGraph['graphid'], $hostId)) {
+                        throw new Exception();
+                    }
+                }
+            }
+
+            $result = DBend(true);
+
+            if ($result) {
+                uncheckTableRows();
+            }
+            show_messages($result, $msgOk, $msgFail);
+
+            unset($_REQUEST['form'], $_REQUEST['hostid']);
+        } catch (Exception $e) {
+            DBend(false);
+            show_messages(false, $msgOk, $msgFail);
+        }
+    } elseif (hasRequest('delete') && hasRequest('hostid')) {
+        DBstart();
+
+        $result = API::Host()->delete([getRequest('hostid')]);
+        $result = DBend($result);
+
+        if ($result) {
+            unset($_REQUEST['form'], $_REQUEST['hostid']);
+            uncheckTableRows();
+        }
+        show_messages($result, _('Host deleted'), _('Cannot delete host'));
+
+        unset($_REQUEST['delete']);
+    } elseif (hasRequest('action') && getRequest('action') == 'host.massdelete' && hasRequest('hosts')) {
+        DBstart();
+
+        $result = API::Host()->delete(getRequest('hosts'));
+        $result = DBend($result);
+
+        if ($result) {
+            uncheckTableRows();
+        }
+        show_messages($result, _('Host deleted'), _('Cannot delete host'));
+    } elseif (hasRequest('action') && str_in_array(getRequest('action'), [
+            'host.massenable',
+            'host.massdisable'
+        ]) && hasRequest('hosts')
+    ) {
+        $enable = (getRequest('action') == 'host.massenable');
+        $status = $enable ? TRIGGER_STATUS_ENABLED : TRIGGER_STATUS_DISABLED;
+
+        $actHosts = API::Host()->get([
+            'hostids'         => getRequest('hosts'),
+            'editable'        => true,
+            'templated_hosts' => true,
+            'output'          => ['hostid']
+        ]);
+        $actHosts = zbx_objectValues($actHosts, 'hostid');
+
+        if ($actHosts) {
+            DBstart();
+
+            $result = updateHostStatus($actHosts, $status);
+            $result = DBend($result);
+
+            if ($result) {
+                uncheckTableRows();
+            }
+
+            $updated = count($actHosts);
+
+            $messageSuccess = $enable ? _n('Host enabled', 'Hosts enabled', $updated) : _n('Host disabled', 'Hosts disabled', $updated);
+            $messageFailed = $enable ? _n('Cannot enable host', 'Cannot enable hosts', $updated) : _n('Cannot disable host', 'Cannot disable hosts', $updated);
+
+            show_messages($result, $messageSuccess, $messageFailed);
+        }
+    }
+
+    /*
+     * Display
+     */
+    $pageFilter = new CPageFilter([
+        'groups'  => [
+            'real_hosts' => true,
+            'editable'   => true
+        ],
+        'groupid' => getRequest('groupid')
+    ]);
+
+    $_REQUEST['groupid'] = $pageFilter->groupid;
+    $_REQUEST['hostid'] = getRequest('hostid', 0);
+
+    $config = select_config();
+
+    if (hasRequest('action') && getRequest('action') === 'host.massupdateform' && hasRequest('hosts')) {
+        $data = [
+            'hosts'             => getRequest('hosts'),
+            'visible'           => getRequest('visible', []),
+            'mass_replace_tpls' => getRequest('mass_replace_tpls'),
+            'mass_clear_tpls'   => getRequest('mass_clear_tpls'),
+            'groups'            => getRequest('groups', []),
+            'newgroup'          => getRequest('newgroup', ''),
+            'status'            => getRequest('status', HOST_STATUS_MONITORED),
+            'description'       => getRequest('description'),
+            'proxy_hostid'      => getRequest('proxy_hostid', ''),
+            'ipmi_authtype'     => getRequest('ipmi_authtype', IPMI_AUTHTYPE_DEFAULT),
+            'ipmi_privilege'    => getRequest('ipmi_privilege', IPMI_PRIVILEGE_USER),
+            'ipmi_username'     => getRequest('ipmi_username', ''),
+            'ipmi_password'     => getRequest('ipmi_password', ''),
+            'inventory_mode'    => getRequest('inventory_mode', HOST_INVENTORY_DISABLED),
+            'host_inventory'    => getRequest('host_inventory', []),
+            'templates'         => getRequest('templates', []),
+            'inventories'       => zbx_toHash(getHostInventories(), 'db_field'),
+            'tls_connect'       => getRequest('tls_connect', HOST_ENCRYPTION_NONE),
+            'tls_accept'        => getRequest('tls_accept', HOST_ENCRYPTION_NONE),
+            'tls_issuer'        => getRequest('tls_issuer', ''),
+            'tls_subject'       => getRequest('tls_subject', ''),
+            'tls_psk_identity'  => getRequest('tls_psk_identity', ''),
+            'tls_psk'           => getRequest('tls_psk', '')
+        ];
+
+        // sort templates
+        natsort($data['templates']);
+
+        // get groups
+        $data['all_groups'] = API::HostGroup()->get([
+            'output'   => API_OUTPUT_EXTEND,
+            'editable' => true
+        ]);
+        order_result($data['all_groups'], 'name');
+
+        // get proxies
+        $data['proxies'] = DBfetchArray(DBselect('SELECT h.hostid,h.host' . ' FROM hosts h' . ' WHERE h.status IN (' . HOST_STATUS_PROXY_ACTIVE . ',' . HOST_STATUS_PROXY_PASSIVE . ')'));
+        order_result($data['proxies'], 'host');
+
+        // get templates data
+        $data['linkedTemplates'] = null;
+        if (!empty($data['templates'])) {
+            $getLinkedTemplates = API::Template()->get([
+                'templateids' => $data['templates'],
+                'output'      => ['templateid', 'name']
+            ]);
+
+            foreach ($getLinkedTemplates as $getLinkedTemplate) {
+                $data['linkedTemplates'][] = [
+                    'id'   => $getLinkedTemplate['templateid'],
+                    'name' => $getLinkedTemplate['name']
+                ];
+            }
+        }
+
+        $hostView = new CView('configuration.host.massupdate', $data);
+    } elseif (hasRequest('form')) {
+        $data = [
+            // Common & auxiliary
+            'form'                  => getRequest('form', ''),
+            'hostid'                => getRequest('hostid', 0),
+            'clone_hostid'          => getRequest('clone_hostid', 0),
+            'groupid'               => getRequest('groupid', 0),
+            'flags'                 => getRequest('flags', ZBX_FLAG_DISCOVERY_NORMAL),
+
+            // Host
+            'host'                  => getRequest('host', ''),
+            'visiblename'           => getRequest('visiblename', ''),
+            'groups'                => getRequest('groups', []),
+            'newgroup'              => getRequest('newgroup', ''),
+            'interfaces'            => getRequest('interfaces', []),
+            'mainInterfaces'        => getRequest('mainInterfaces', []),
+            'description'           => getRequest('description', ''),
+            'proxy_hostid'          => getRequest('proxy_hostid', 0),
+            'status'                => getRequest('status', HOST_STATUS_NOT_MONITORED),
+
+            // Templates
+            'templates'             => getRequest('templates', []),
+            'clear_templates'       => getRequest('clear_templates', []),
+            'original_templates'    => [],
+            'linked_templates'      => [],
+
+            // IPMI
+            'ipmi_authtype'         => getRequest('ipmi_authtype', IPMI_AUTHTYPE_DEFAULT),
+            'ipmi_privilege'        => getRequest('ipmi_privilege', IPMI_PRIVILEGE_USER),
+            'ipmi_username'         => getRequest('ipmi_username', ''),
+            'ipmi_password'         => getRequest('ipmi_password', ''),
+
+            // Macros
+            'macros'                => $macros,
+            'show_inherited_macros' => getRequest('show_inherited_macros', 0),
+
+            // Host inventory
+            'inventory_mode'        => getRequest('inventory_mode', $config['default_inventory_mode']),
+            'host_inventory'        => getRequest('host_inventory', []),
+            'inventory_items'       => [],
+
+            // Encryption
+            'tls_connect'           => getRequest('tls_connect', HOST_ENCRYPTION_NONE),
+            'tls_accept'            => getRequest('tls_accept', HOST_ENCRYPTION_NONE),
+            'tls_issuer'            => getRequest('tls_issuer', ''),
+            'tls_subject'           => getRequest('tls_subject', ''),
+            'tls_psk_identity'      => getRequest('tls_psk_identity', ''),
+            'tls_psk'               => getRequest('tls_psk', '')
+        ];
+
+        if (!hasRequest('form_refresh')) {
+            if ($data['hostid'] != 0) {
+                $dbHosts = API::Host()->get([
+                    'output'                => [
+                        'hostid',
+                        'proxy_hostid',
+                        'host',
+                        'name',
+                        'status',
+                        'ipmi_authtype',
+                        'ipmi_privilege',
+                        'ipmi_username',
+                        'ipmi_password',
+                        'flags',
+                        'description',
+                        'tls_connect',
+                        'tls_accept',
+                        'tls_issuer',
+                        'tls_subject',
+                        'tls_psk_identity',
+                        'tls_psk'
+                    ],
+                    'selectGroups'          => ['groupid'],
+                    'selectParentTemplates' => ['templateid'],
+                    'selectMacros'          => ['hostmacroid', 'macro', 'value'],
+                    'selectDiscoveryRule'   => ['itemid', 'name'],
+                    'selectInventory'       => true,
+                    'hostids'               => [$data['hostid']]
+                ]);
+                $dbHost = reset($dbHosts);
+
+                $data['flags'] = $dbHost['flags'];
+                if ($data['flags'] == ZBX_FLAG_DISCOVERY_CREATED) {
+                    $data['discoveryRule'] = $dbHost['discoveryRule'];
+                }
+
+                // Host
+                $data['host'] = $dbHost['host'];
+                $data['visiblename'] = $dbHost['name'];
+                $data['groups'] = zbx_objectValues($dbHost['groups'], 'groupid');
+                $data['interfaces'] = API::HostInterface()->get([
+                    'output'      => ['interfaceid', 'main', 'type', 'useip', 'ip', 'dns', 'port', 'bulk'],
+                    'selectItems' => ['type'],
+                    'hostids'     => [$data['hostid']],
+                    'sortfield'   => 'interfaceid'
+                ]);
+                $data['description'] = $dbHost['description'];
+                $data['proxy_hostid'] = $dbHost['proxy_hostid'];
+                $data['status'] = $dbHost['status'];
+
+                // Templates
+                $data['templates'] = zbx_objectValues($dbHost['parentTemplates'], 'templateid');
+                $data['original_templates'] = array_combine($data['templates'], $data['templates']);
+
+                // IPMI
+                $data['ipmi_authtype'] = $dbHost['ipmi_authtype'];
+                $data['ipmi_privilege'] = $dbHost['ipmi_privilege'];
+                $data['ipmi_username'] = $dbHost['ipmi_username'];
+                $data['ipmi_password'] = $dbHost['ipmi_password'];
+
+                // Macros
+                $data['macros'] = $dbHost['macros'];
+
+                // Interfaces
+                foreach ($data['interfaces'] as &$interface) {
+                    if ($data['flags'] == ZBX_FLAG_DISCOVERY_CREATED) {
+                        $interface['locked'] = true;
+                    } else {
+                        // check if interface has items that require specific interface type, if so type cannot be changed
+                        $interface['locked'] = false;
+                        foreach ($interface['items'] as $item) {
+                            $type = itemTypeInterface($item['type']);
+                            if ($type !== false && $type != INTERFACE_TYPE_ANY) {
+                                $interface['locked'] = true;
+                                break;
+                            }
+                        }
+                    }
+
+                    $interface['items'] = (bool) $interface['items'];
+                }
+                unset($interface);
+
+                // Host inventory
+                $data['inventory_mode'] = array_key_exists('inventory_mode', $dbHost['inventory']) ? $dbHost['inventory']['inventory_mode'] : HOST_INVENTORY_DISABLED;
+                $data['host_inventory'] = $dbHost['inventory'];
+                unset($data['host_inventory']['inventory_mode']);
+
+                // Encryption
+                $data['tls_connect'] = $dbHost['tls_connect'];
+                $data['tls_accept'] = $dbHost['tls_accept'];
+                $data['tls_issuer'] = $dbHost['tls_issuer'];
+                $data['tls_subject'] = $dbHost['tls_subject'];
+                $data['tls_psk_identity'] = $dbHost['tls_psk_identity'];
+                $data['tls_psk'] = $dbHost['tls_psk'];
+
+                // display empty visible name if equal to host name
+                if ($data['host'] === $data['visiblename']) {
+                    $data['visiblename'] = '';
+                }
+            } else {
+                $data['status'] = HOST_STATUS_MONITORED;
+            }
+
+            if (!$data['groups'] && $data['groupid'] != 0) {
+                $data['groups'][] = $data['groupid'];
+            }
+        } else {
+            if ($data['hostid'] != 0) {
+                $dbHosts = API::Host()->get([
+                    'output'                => ['flags'],
+                    'selectParentTemplates' => ['templateid'],
+                    'selectDiscoveryRule'   => ['itemid', 'name'],
+                    'hostids'               => [$data['hostid']]
+                ]);
+                $dbHost = reset($dbHosts);
+
+                $data['flags'] = $dbHost['flags'];
+                if ($data['flags'] == ZBX_FLAG_DISCOVERY_CREATED) {
+                    $data['discoveryRule'] = $dbHost['discoveryRule'];
+                }
+
+                $templateids = zbx_objectValues($dbHost['parentTemplates'], 'templateid');
+                $data['original_templates'] = array_combine($templateids, $templateids);
+            }
+
+            foreach ([INTERFACE_TYPE_AGENT, INTERFACE_TYPE_SNMP, INTERFACE_TYPE_JMX, INTERFACE_TYPE_IPMI] as $type) {
+                if (array_key_exists($type, $data['mainInterfaces'])) {
+                    $interfaceid = $data['mainInterfaces'][$type];
+                    $data['interfaces'][$interfaceid]['main'] = '1';
+                }
+            }
+            $data['interfaces'] = array_values($data['interfaces']);
+        }
+
+        if ($data['hostid'] != 0) {
+            // get items that populate host inventory fields
+            $data['inventory_items'] = API::Item()->get([
+                'output'  => ['inventory_link', 'itemid', 'hostid', 'name', 'key_'],
+                'hostids' => [$dbHost['hostid']],
+                'filter'  => ['inventory_link' => array_keys(getHostInventories())]
+            ]);
+            $data['inventory_items'] = zbx_toHash($data['inventory_items'], 'inventory_link');
+            $data['inventory_items'] = CMacrosResolverHelper::resolveItemNames($data['inventory_items']);
+        }
+
+        if ($data['flags'] == ZBX_FLAG_DISCOVERY_CREATED) {
+            if ($data['proxy_hostid'] != 0) {
+                $data['proxies'] = API::Proxy()->get([
+                    'output'       => ['host'],
+                    'proxyids'     => [$data['proxy_hostid']],
+                    'preservekeys' => true
+                ]);
+            } else {
+                $data['proxies'] = [];
+            }
+        } else {
+            $data['proxies'] = API::Proxy()->get([
+                'output'       => ['host'],
+                'preservekeys' => true
+            ]);
+            order_result($proxies, 'host');
+        }
+
+        foreach ($data['proxies'] as &$proxy) {
+            $proxy = $proxy['host'];
+        }
+        unset($proxy);
+
+        if ($data['show_inherited_macros']) {
+            $data['macros'] = mergeInheritedMacros($data['macros'], getInheritedMacros($data['templates']));
+        }
+        $data['macros'] = array_values(order_macros($data['macros'], 'macro'));
+
+        if (!$data['macros'] && $data['flags'] != ZBX_FLAG_DISCOVERY_CREATED) {
+            $macro = ['macro' => '', 'value' => ''];
+            if ($data['show_inherited_macros']) {
+                $macro['type'] = MACRO_TYPE_HOSTMACRO;
+            }
+            $data['macros'][] = $macro;
+        }
+
+        // groups with RW permissions
+        $data['groupsAllowed'] = API::HostGroup()->get([
+            'output'       => [],
+            'editable'     => true,
+            'preservekeys' => true
+        ]);
+
+        // all available groups
+        $data['groupsAll'] = API::HostGroup()->get(['output' => ['groupid', 'name']]);
+        CArrayHelper::sort($data['groupsAll'], ['name']);
+
+        if ($data['templates']) {
+            $data['linked_templates'] = API::Template()->get([
+                'output'      => ['templateid', 'name'],
+                'templateids' => $data['templates']
+            ]);
+            CArrayHelper::sort($data['linked_templates'], ['name']);
+        }
+
+        $hostView = new CView('configuration.host.edit', $data);
+    } else {
+        $sortField = getRequest('sort', CProfile::get('web.' . $page['file'] . '.sort', 'name'));
+        $sortOrder = getRequest('sortorder', CProfile::get('web.' . $page['file'] . '.sortorder', ZBX_SORT_UP));
+
+        CProfile::update('web.' . $page['file'] . '.sort', $sortField, PROFILE_TYPE_STR);
+        CProfile::update('web.' . $page['file'] . '.sortorder', $sortOrder, PROFILE_TYPE_STR);
+
+        // get Hosts
+        $hosts = [];
+        if ($pageFilter->groupsSelected) {
+            $hosts = API::Host()->get([
+                'output'    => ['hostid', $sortField],
+                'groupids'  => ($pageFilter->groupid > 0) ? $pageFilter->groupid : null,
+                'editable'  => true,
+                'sortfield' => $sortField,
+                'limit'     => $config['search_limit'] + 1,
+                'search'    => [
+                    'name' => ($filter['host'] === '') ? null : $filter['host'],
+                    'ip'   => ($filter['ip'] === '') ? null : $filter['ip'],
+                    'dns'  => ($filter['dns'] === '') ? null : $filter['dns']
+                ],
+                'filter'    => [
+                    'port' => ($filter['port'] === '') ? null : $filter['port']
+                ]
+            ]);
+        }
+        order_result($hosts, $sortField, $sortOrder);
+
+        $pagingLine = getPagingLine($hosts, $sortOrder);
+
+        $hosts = API::Host()->get([
+            'hostids'               => zbx_objectValues($hosts, 'hostid'),
+            'output'                => API_OUTPUT_EXTEND,
+            'selectParentTemplates' => ['hostid', 'name'],
+            'selectInterfaces'      => API_OUTPUT_EXTEND,
+            'selectItems'           => API_OUTPUT_COUNT,
+            'selectDiscoveries'     => API_OUTPUT_COUNT,
+            'selectTriggers'        => API_OUTPUT_COUNT,
+            'selectGraphs'          => API_OUTPUT_COUNT,
+            'selectApplications'    => API_OUTPUT_COUNT,
+            'selectHttpTests'       => API_OUTPUT_COUNT,
+            'selectDiscoveryRule'   => ['itemid', 'name'],
+            'selectHostDiscovery'   => ['ts_delete']
+        ]);
+        order_result($hosts, $sortField, $sortOrder);
+
+        // selecting linked templates to templates linked to hosts
+        $templateIds = [];
+        foreach ($hosts as $host) {
+            $templateIds = array_merge($templateIds, zbx_objectValues($host['parentTemplates'], 'templateid'));
+        }
+        $templateIds = array_unique($templateIds);
+
+        $templates = API::Template()->get([
+            'output'                => ['templateid', 'name'],
+            'templateids'           => $templateIds,
+            'selectParentTemplates' => ['hostid', 'name'],
+            'preservekeys'          => true
+        ]);
+
+        // get proxy host IDs that that are not 0
+        $proxyHostIds = [];
+        foreach ($hosts as $host) {
+            if ($host['proxy_hostid']) {
+                $proxyHostIds[$host['proxy_hostid']] = $host['proxy_hostid'];
+            }
+        }
+        $proxies = [];
+        if ($proxyHostIds) {
+            $proxies = API::Proxy()->get([
+                'proxyids'     => $proxyHostIds,
+                'output'       => ['host'],
+                'preservekeys' => true
+            ]);
+        }
+
+        $data = [
+            'pageFilter' => $pageFilter,
+            'hosts'      => $hosts,
+            'paging'     => $pagingLine,
+            'filter'     => $filter,
+            'sortField'  => $sortField,
+            'sortOrder'  => $sortOrder,
+            'groupId'    => $pageFilter->groupid,
+            'config'     => $config,
+            'templates'  => $templates,
+            'proxies'    => $proxies
+        ];
 
-	$hostView = new CView('configuration.host.list', $data);
-}
+        $hostView = new CView('configuration.host.list', $data);
+    }
 
-$hostView->render();
-$hostView->show();
+    $hostView->render();
+    $hostView->show();
 
-require_once dirname(__FILE__).'/include/page_footer.php';
+    require_once dirname(__FILE__) . '/include/page_footer.php';
diff -x graphtree -Naru ./img/icon-sprite.svg graphtree/img/icon-sprite.svg
--- ./img/icon-sprite.svg	2016-02-26 17:45:47.000000000 +0800
+++ graphtree/img/icon-sprite.svg	2016-04-18 19:04:38.000000000 +0800
@@ -1,71 +1,71 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" width="114" height="928" viewBox="0 0 114 928" xml:space="preserve" style="enable-background:new 0 0 114 928;overflow:visible">
-  <rect y="903" width="95" height="25" fill="#FFF"/>
-  <rect y="864" width="114" height="30" fill="#FFF"/>
-  <path d="M20.91 19.85l-0.26 0.27 -0.73-0.73c1.49-1.77 1.43-4.4-0.24-6.07 -1.76-1.76-4.61-1.76-6.36 0 -1.76 1.76-1.75 4.6 0 6.36 1.67 1.67 4.31 1.74 6.07 0.24l0.73 0.73 -0.27 0.27L22.94 24l1.06-1.06L20.91 19.85zM14.38 18.62c-1.17-1.17-1.17-3.07 0-4.24 1.17-1.17 3.07-1.17 4.24 0s1.17 3.07 0 4.24C17.45 19.79 15.55 19.79 14.38 18.62z" fill="#3C5563"/>
-  <path d="M18.39 56.56c-0.06-0.13-0.12-0.29-0.18-0.48 -0.06-0.19-0.09-0.4-0.09-0.63 0-0.28 0.07-0.53 0.21-0.76 0.14-0.23 0.32-0.45 0.54-0.66 0.21-0.21 0.45-0.42 0.69-0.63 0.25-0.21 0.48-0.45 0.69-0.73 0.22-0.27 0.39-0.57 0.54-0.9C20.93 51.45 21 51.08 21 50.66c0-0.44-0.08-0.82-0.25-1.15 -0.17-0.33-0.4-0.61-0.69-0.83 -0.29-0.22-0.64-0.39-1.03-0.51C18.63 48.06 18.22 48 17.77 48c-0.96 0-1.88 0.26-2.77 0.78v1.88c0.74-0.72 1.51-1.08 2.32-1.08 0.25 0 0.49 0.03 0.71 0.09 0.22 0.06 0.42 0.15 0.59 0.27 0.17 0.12 0.31 0.28 0.41 0.46 0.1 0.18 0.15 0.4 0.15 0.64 0 0.27-0.07 0.52-0.2 0.75 -0.13 0.23-0.3 0.44-0.5 0.65 -0.2 0.21-0.41 0.42-0.64 0.63 -0.23 0.22-0.45 0.44-0.64 0.68 -0.2 0.23-0.36 0.48-0.5 0.75 -0.13 0.27-0.2 0.57-0.2 0.9 0 0.21 0.02 0.43 0.06 0.64 0.04 0.22 0.08 0.4 0.13 0.53H18.39zM18.41 59.68c0.23-0.21 0.34-0.46 0.34-0.76 0-0.31-0.11-0.56-0.34-0.76 -0.23-0.22-0.51-0.32-0.82-0.32 -0.32 0-0.59 0.11-0.82 0.33 -0.23 0.2-0.34 0.46-0.34 0.76 0 0.3 0.11 0.56 0.34 0.77C17.01 59.9 17.29 60 17.6 60 17.9 60 18.17 59.9 18.41 59.68L18.41 59.68z" fill="#3C5563"/>
-  <path d="M18 128c-2.28 0-4.36 0.8-6 2.14V132h12v-1.86C22.36 128.8 20.28 128 18 128zM18 126c1.66 0 3-1.34 3-3 0-1.66-1.34-3-3-3 -1.66 0-3 1.34-3 3C15 124.66 16.34 126 18 126z" fill="#3C5563"/>
-  <path d="M24.89 193.23l-2.01 2.01 -2.12-2.12 2.01-2.01C22.52 191.05 22.27 191 22 191c-1.66 0-3 1.34-3 3 0 0.27 0.05 0.52 0.11 0.77l-4.34 4.34C14.52 199.05 14.27 199 14 199c-1.66 0-3 1.34-3 3 0 0.27 0.05 0.52 0.11 0.77l2.01-2.01 2.12 2.12 -2.01 2.01C13.48 204.95 13.73 205 14 205c1.66 0 3-1.34 3-3 0-0.27-0.04-0.52-0.11-0.77l4.35-4.34C21.48 196.96 21.73 197 22 197c1.66 0 3-1.34 3-3C25 193.73 24.95 193.48 24.89 193.23z" fill="#FFF"/>
-  <polygon points="25 341 11 341 11 343 25 343 " fill="#FFF"/>
-  <path d="M11 372v2h14v-2H11zM11 379h14v-2H11V379zM11 384h14v-2H11V384z" fill="#FFF"/>
-  <polygon points="25 305 19 305 19 299 17 299 17 305 11 305 11 307 17 307 17 313 19 313 19 307 25 307 " fill="#FFF"/>
-  <path d="M18.7 409.25c0.18 0.22 0.48 0.33 0.9 0.33 0.44 0 0.79-0.16 1.04-0.47 0.25-0.31 0.37-0.66 0.37-1.05 0-0.32-0.1-0.57-0.31-0.77C20.49 407.1 20.21 407 19.85 407c-0.42 0-0.76 0.14-1.03 0.42s-0.4 0.61-0.4 1C18.43 408.76 18.52 409.03 18.7 409.25zM15.35 414.17c0.93-0.61 1.52-0.91 1.79-0.91 0.16 0 0.24 0.09 0.24 0.27 0 0.36-0.29 1.55-0.86 3.58 -0.26 0.91-0.43 1.55-0.51 1.92 -0.08 0.37-0.12 0.7-0.12 0.99 0 0.29 0.06 0.53 0.2 0.71 0.13 0.18 0.33 0.27 0.59 0.27 0.21 0 0.46-0.05 0.74-0.15 0.28-0.1 0.76-0.35 1.42-0.76 0.66-0.41 1.23-0.77 1.71-1.08l0.04-0.12 -0.23-0.38 -0.12-0.01c-0.89 0.59-1.44 0.88-1.64 0.88 -0.07 0-0.14-0.03-0.2-0.1 -0.06-0.07-0.09-0.14-0.09-0.23 0-0.32 0.3-1.5 0.89-3.53 0.34-1.18 0.56-1.98 0.67-2.41 0.11-0.42 0.16-0.77 0.16-1.05 0-0.21-0.06-0.38-0.18-0.52s-0.27-0.2-0.44-0.2c-0.38 0-0.9 0.18-1.58 0.54 -0.67 0.36-1.61 0.97-2.82 1.84L15 413.83l0.2 0.33L15.35 414.17z" fill="#FFF"/>
-  <path d="M22 486c0-1.48-0.81-2.74-2-3.44v6.87C21.19 488.75 22 487.48 22 486z" fill="#768D99"/>
-  <polygon points="11 483.38 11 488.63 13.56 488.63 18 493 18 479 13.56 483.38 " fill="#768D99"/>
-  <path d="M20 479.31v1.58c2.05 0.8 3.5 2.78 3.5 5.11 0 2.33-1.45 4.31-3.5 5.11v1.58C22.89 491.83 25 489.17 25 486 25 482.83 22.89 480.17 20 479.31z" fill="#768D99"/>
-  <path d="M23.5 522c0 0.39-0.05 0.77-0.13 1.14l1.22 1.22C24.85 523.62 25 522.83 25 522c0-3.17-2.11-5.83-5-6.69v1.58C22.05 517.69 23.5 519.67 23.5 522zM20 518.56v1.21l1.98 1.98C21.9 520.39 21.13 519.22 20 518.56zM24.7 527.3l-12.01-12.01 -1.41 1.41 2.48 2.48 -0.2 0.2H11v5.25h2.56L18 529v-5.59l2 2v0.02c0 0 0.01-0.01 0.01-0.01l1.09 1.09c-0.34 0.24-0.71 0.44-1.1 0.6v1.58c0.8-0.24 1.52-0.62 2.17-1.1l1.13 1.13 1.41-1.41 -0.01-0.01L24.7 527.3zM18 515l-1.4 1.38L18 517.77V515z" fill="#768D99"/>
-  <path d="M18 565c1.11 0 2-0.9 2-2h-4C16 564.1 16.9 565 18 565zM22 559.63v-3c0-1.86-1.28-3.41-3-3.86V552c0-0.55-0.45-1-1-1s-1 0.45-1 1v0.77c-1.72 0.45-3 2-3 3.86v3l-2 2h12L22 559.63z" fill="#768D99"/>
-  <path d="M22 592.63c0-1.86-1.28-3.41-3-3.86V588c0-0.55-0.45-1-1-1s-1 0.45-1 1v0.77c-0.01 0-0.02 0.01-0.03 0.01L22 593.81V592.63zM18 601c1.11 0 2-0.9 2-2h-4C16 600.1 16.9 601 18 601zM24.99 599.59l-0.01 0.01 -12.59-12.6L11 588.4l3.16 3.16c-0.09 0.34-0.16 0.69-0.16 1.06v3l-2 2h8.22L23.6 601 25 599.6 24.99 599.59z" fill="#768D99"/>
-  <path d="M24 628c-1.1 0-2 0.9-2 2s0.9 2 2 2 2-0.9 2-2S25.1 628 24 628zM12 628c-1.1 0-2 0.9-2 2s0.9 2 2 2 2-0.9 2-2S13.1 628 12 628zM18 628c-1.1 0-2 0.9-2 2s0.9 2 2 2 2-0.9 2-2S19.1 628 18 628z" fill="#768D99"/>
-  <path d="M24.14 667.97L18 662l-6.14 5.97c-0.48 0.46-0.48 1.22 0 1.68 0.48 0.46 1.25 0.46 1.73 0L18 665.36l4.42 4.3c0.48 0.46 1.25 0.46 1.73 0S24.62 668.44 24.14 667.97z" fill="#768D99"/>
-  <path d="M11.86 700.03L18 706l6.14-5.97c0.48-0.46 0.48-1.22 0-1.68 -0.48-0.46-1.25-0.46-1.73 0L18 702.64l-4.42-4.3c-0.48-0.46-1.25-0.46-1.73 0S11.38 699.56 11.86 700.03z" fill="#768D99"/>
-  <path d="M18 729c-4.97 0-9 4.03-9 9 0 4.97 4.03 9 9 9 4.97 0 9-4.03 9-9C27 733.03 22.97 729 18 729zM19 743h-2v-6h2V743zM19 735h-2v-2h2V735z" fill="#ACBBC2"/>
-  <rect x="17" y="811" width="2" height="2" fill="#ACBBC2"/>
-  <rect x="13" y="811" width="2" height="2" fill="#ACBBC2"/>
-  <rect x="13" y="807" width="2" height="2" fill="#ACBBC2"/>
-  <rect x="21" y="807" width="2" height="2" fill="#ACBBC2"/>
-  <rect x="21" y="811" width="2" height="2" fill="#ACBBC2"/>
-  <rect x="17" y="807" width="2" height="2" fill="#ACBBC2"/>
-  <path d="M19 783v-2h2v2H19zM19 777h2v2h-2V777zM19 773h2v2h-2V773zM19 769h2v2h-2V769zM19 765h2v2h-2V765zM15 781h2v2h-2V781zM15 777h2v2h-2V777zM15 773h2v2h-2V773zM15 769h2v2h-2V769zM15 765h2v2h-2V765z" fill="#ACBBC2"/>
-  <path d="M23.77 841.74c-0.31-0.32-0.81-0.32-1.12 0l-6.51 6.78 -2.79-2.9c-0.31-0.32-0.81-0.32-1.12 0 -0.31 0.32-0.31 0.84 0 1.16l3.35 3.49c0.31 0.32 0.81 0.32 1.12 0l7.07-7.36C24.08 842.58 24.08 842.06 23.77 841.74z" fill="#768D99"/>
-  <path d="M57.02 876.4c0.68-0.51 1.02-1.3 1.02-2.37 0-1.05-0.34-1.84-1.02-2.36 -0.68-0.52-1.71-0.78-3.1-0.78h-4.2v6.29h4.21C55.31 877.18 56.34 876.92 57.02 876.4z" fill="#D40000"/>
-  <path d="M54.27 879.47h-4.56v7.64h4.56c1.53 0 2.66-0.31 3.4-0.94 0.73-0.63 1.1-1.59 1.1-2.89 0-1.3-0.37-2.27-1.1-2.88C56.93 879.78 55.8 879.47 54.27 879.47z" fill="#D40000"/>
-  <path d="M76.08 876.4c0.68-0.51 1.02-1.3 1.02-2.37 0-1.05-0.34-1.84-1.02-2.36 -0.68-0.52-1.71-0.78-3.1-0.78h-4.2v6.29h4.2C74.36 877.18 75.4 876.92 76.08 876.4z" fill="#D40000"/>
-  <polygon points="30.28 881.73 37.99 881.73 34.13 871.35 " fill="#D40000"/>
-  <path d="M0 864v30h114v-30H0zM21.68 889.43H4.55v-2.15l13.27-16.33H4.87v-2.37H21.36v2.15L8.09 887.05h13.59V889.43zM40.79 889.43l-1.91-5.35H29.42l-1.91 5.35h-2.99l8.01-20.85h3.22l8 20.85H40.79zM59.85 887.91c-1.27 1.01-3.09 1.52-5.44 1.52H46.88v-20.85h7.25c2.16 0 3.83 0.45 5 1.34 1.17 0.89 1.76 2.17 1.76 3.81 0 1.27-0.3 2.29-0.9 3.05 -0.6 0.75-1.48 1.22-2.64 1.41 1.4 0.3 2.48 0.92 3.26 1.86 0.77 0.95 1.16 2.13 1.16 3.54C61.76 885.45 61.13 886.89 59.85 887.91zM78.91 887.91c-1.27 1.01-3.09 1.52-5.44 1.52h-7.53v-20.85h7.25c2.16 0 3.83 0.45 5 1.34 1.17 0.89 1.76 2.17 1.76 3.81 0 1.27-0.3 2.29-0.9 3.05 -0.6 0.75-1.48 1.22-2.64 1.41 1.4 0.3 2.48 0.92 3.25 1.86 0.78 0.95 1.16 2.13 1.16 3.54C80.82 885.45 80.18 886.89 78.91 887.91zM88.16 889.43h-2.84v-20.85h2.84V889.43zM106.33 889.43l-5.75-8.73 -5.8 8.73h-3.02l7.32-11.01 -6.49-9.85h3.12l4.94 7.49 4.98-7.49h3.02l-6.5 9.77 7.31 11.09H106.33z" fill="#D40000"/>
-  <path d="M73.33 879.47h-4.55v7.64h4.56c1.53 0 2.66-0.31 3.4-0.94 0.73-0.63 1.1-1.59 1.1-2.89 0-1.3-0.37-2.27-1.1-2.88C75.99 879.78 74.86 879.47 73.33 879.47z" fill="#D40000"/>
-  <polygon points="108.64 868.57 105.63 868.57 100.65 876.06 95.71 868.57 92.59 868.57 99.08 878.42 91.76 889.43 94.77 889.43 100.58 880.7 106.33 889.43 109.45 889.43 102.15 878.34 " fill="#FFF"/>
-  <polygon points="21.36 870.72 21.36 868.57 4.87 868.57 4.87 870.95 17.82 870.95 4.55 887.28 4.55 889.43 21.68 889.43 21.68 887.05 8.09 887.05 " fill="#FFF"/>
-  <path d="M32.53 868.57l-8.01 20.85h2.99l1.91-5.35h9.46l1.91 5.35h2.95l-8-20.85H32.53zM30.28 881.73l3.85-10.38 3.86 10.38H30.28z" fill="#FFF"/>
-  <path d="M57.35 878.18c1.16-0.19 2.04-0.66 2.64-1.41 0.6-0.76 0.9-1.77 0.9-3.05 0-1.65-0.59-2.92-1.76-3.81 -1.17-0.89-2.84-1.34-5-1.34H46.88v20.85h7.53c2.35 0 4.17-0.51 5.44-1.52 1.28-1.02 1.91-2.45 1.91-4.32 0-1.42-0.38-2.6-1.16-3.54C59.83 879.1 58.75 878.48 57.35 878.18zM49.72 870.89h4.21c1.39 0 2.42 0.26 3.1 0.78 0.68 0.52 1.02 1.31 1.02 2.36 0 1.06-0.34 1.85-1.02 2.37 -0.68 0.52-1.71 0.78-3.1 0.78h-4.2V870.89zM57.67 886.17c-0.73 0.63-1.87 0.94-3.39 0.94h-4.56v-7.64h4.56c1.53 0 2.66 0.31 3.4 0.93 0.73 0.62 1.1 1.58 1.1 2.89C58.77 884.57 58.4 885.54 57.67 886.17z" fill="#FFF"/>
-  <rect x="85.33" y="868.57" width="2.84" height="20.85" fill="#FFF"/>
-  <path d="M76.41 878.18c1.16-0.19 2.04-0.66 2.64-1.41 0.6-0.76 0.9-1.77 0.9-3.05 0-1.65-0.59-2.92-1.76-3.81 -1.17-0.89-2.84-1.34-5-1.34h-7.25v20.85h7.53c2.35 0 4.17-0.51 5.44-1.52 1.27-1.02 1.91-2.45 1.91-4.32 0-1.42-0.38-2.6-1.16-3.54C78.89 879.1 77.8 878.48 76.41 878.18zM68.77 870.89h4.2c1.39 0 2.42 0.26 3.1 0.78 0.68 0.52 1.02 1.31 1.02 2.36 0 1.06-0.34 1.85-1.02 2.37 -0.68 0.52-1.71 0.78-3.1 0.78h-4.2V870.89zM76.72 886.17c-0.74 0.63-1.87 0.94-3.4 0.94h-4.55v-7.64h4.56c1.53 0 2.66 0.31 3.4 0.93 0.73 0.62 1.1 1.58 1.1 2.89C77.83 884.57 77.46 885.54 76.72 886.17z" fill="#FFF"/>
-  <path d="M47.52 913.34c0.56-0.44 0.84-1.1 0.84-1.98 0-0.89-0.28-1.54-0.84-1.97 -0.57-0.43-1.44-0.65-2.59-0.65h-3.5v5.25h3.5C46.09 913.99 46.95 913.77 47.52 913.34z" fill="#D40000"/>
-  <path d="M45.23 915.89h-3.79v6.36h3.8c1.28 0 2.22-0.26 2.83-0.77 0.61-0.52 0.92-1.33 0.92-2.4 0-1.09-0.3-1.89-0.92-2.4C47.44 916.14 46.5 915.89 45.23 915.89z" fill="#D40000"/>
-  <path d="M63.4 913.34c0.57-0.44 0.85-1.1 0.85-1.98 0-0.89-0.28-1.54-0.85-1.97 -0.56-0.43-1.43-0.65-2.58-0.65h-3.5v5.25h3.5C61.97 913.99 62.83 913.77 63.4 913.34z" fill="#D40000"/>
-  <polygon points="25.23 917.78 31.66 917.78 28.44 909.13 " fill="#D40000"/>
-  <path d="M0 903v25h95v-25H0zM18.07 924.2H3.79v-1.8l11.06-13.6H4.06v-1.98h13.74v1.8l-11.05 13.6h11.32V924.2zM33.99 924.2l-1.59-4.46h-7.89l-1.59 4.46h-2.49l6.68-17.38h2.68l6.66 17.38H33.99zM49.88 922.92c-1.06 0.85-2.58 1.28-4.53 1.28h-6.27v-17.38h6.04c1.8 0 3.19 0.37 4.17 1.12 0.97 0.74 1.46 1.8 1.46 3.18 0 1.05-0.25 1.9-0.75 2.53 -0.5 0.63-1.23 1.02-2.2 1.19 1.16 0.24 2.06 0.75 2.71 1.55 0.64 0.78 0.96 1.77 0.96 2.95C51.47 920.87 50.94 922.07 49.88 922.92zM65.75 922.92c-1.06 0.85-2.57 1.28-4.53 1.28h-6.28v-17.38h6.04c1.8 0 3.19 0.37 4.17 1.12 0.97 0.74 1.47 1.8 1.47 3.18 0 1.05-0.25 1.9-0.75 2.53 -0.5 0.63-1.23 1.02-2.21 1.19 1.16 0.24 2.07 0.75 2.71 1.55 0.65 0.78 0.97 1.77 0.97 2.95C67.35 920.87 66.82 922.07 65.75 922.92zM73.47 924.2h-2.37v-17.38h2.37V924.2zM88.61 924.2l-4.79-7.28 -4.84 7.28h-2.51l6.1-9.18 -5.4-8.2h2.6l4.11 6.24 4.15-6.24h2.51l-5.41 8.14 6.09 9.25H88.61z" fill="#D40000"/>
-  <path d="M61.11 915.89h-3.8v6.36h3.8c1.27 0 2.21-0.26 2.83-0.77 0.61-0.52 0.92-1.33 0.92-2.4 0-1.09-0.31-1.89-0.92-2.4C63.32 916.14 62.38 915.89 61.11 915.89z" fill="#D40000"/>
-  <polygon points="90.53 906.81 88.02 906.81 83.87 913.06 79.76 906.81 77.16 906.81 82.56 915.01 76.47 924.2 78.97 924.2 83.82 916.92 88.61 924.2 91.21 924.2 85.12 914.95 " fill="#FFF"/>
-  <polygon points="17.8 908.61 17.8 906.81 4.06 906.81 4.06 908.8 14.85 908.8 3.79 922.4 3.79 924.2 18.07 924.2 18.07 922.21 6.75 922.21 " fill="#FFF"/>
-  <path d="M27.11 906.81l-6.68 17.38h2.49l1.59-4.46H32.4l1.59 4.46h2.46l-6.66-17.38H27.11zM25.23 917.78l3.21-8.65 3.21 8.65H25.23z" fill="#FFF"/>
-  <path d="M47.8 914.83c0.96-0.17 1.7-0.56 2.2-1.19 0.5-0.63 0.75-1.47 0.75-2.53 0-1.38-0.48-2.44-1.46-3.18 -0.98-0.75-2.37-1.12-4.17-1.12h-6.04v17.38h6.28c1.96 0 3.48-0.43 4.53-1.28 1.06-0.85 1.59-2.05 1.59-3.59 0-1.17-0.32-2.17-0.96-2.95C49.86 915.58 48.96 915.07 47.8 914.83zM41.43 908.74h3.5c1.15 0 2.02 0.22 2.59 0.65 0.56 0.43 0.84 1.08 0.84 1.97 0 0.88-0.28 1.54-0.84 1.98 -0.57 0.43-1.44 0.65-2.59 0.65h-3.5V908.74zM48.06 921.47c-0.61 0.52-1.55 0.78-2.83 0.78h-3.79v-6.36h3.8c1.28 0 2.22 0.26 2.83 0.78 0.61 0.51 0.92 1.31 0.92 2.4C48.97 920.14 48.67 920.95 48.06 921.47z" fill="#FFF"/>
-  <rect x="71.1" y="906.81" width="2.37" height="17.38" fill="#FFF"/>
-  <path d="M63.67 914.83c0.97-0.17 1.71-0.56 2.21-1.19 0.5-0.63 0.75-1.47 0.75-2.53 0-1.38-0.49-2.44-1.47-3.18 -0.98-0.75-2.37-1.12-4.17-1.12h-6.04v17.38h6.28c1.96 0 3.47-0.43 4.53-1.28 1.07-0.85 1.6-2.05 1.6-3.59 0-1.17-0.32-2.17-0.97-2.95C65.74 915.58 64.83 915.07 63.67 914.83zM57.31 908.74h3.5c1.16 0 2.02 0.22 2.58 0.65 0.57 0.43 0.85 1.08 0.85 1.97 0 0.88-0.28 1.54-0.85 1.98 -0.56 0.43-1.43 0.65-2.58 0.65h-3.5V908.74zM63.94 921.47c-0.62 0.52-1.56 0.78-2.83 0.78h-3.8v-6.36h3.8c1.27 0 2.21 0.26 2.83 0.78 0.61 0.51 0.92 1.31 0.92 2.4C64.86 920.14 64.55 920.95 63.94 921.47z" fill="#FFF"/>
-  <path d="M23 84H13C12.45 84 12 84.45 12 85v10c0 0.55 0.45 1 1 1h10c0.55 0 1-0.45 1-1V85C24 84.45 23.55 84 23 84zM21.02 93.82h-6.03v-1.23l3.54-4.81h-3.33V86.18h5.7v1.35l-3.44 4.69h3.57V93.82z" fill="#3C5563"/>
-  <polygon points="25 227 19.63 227 21.63 229.01 19 231.64 20.36 233 22.99 230.37 25 232.37 " fill="#FFF"/>
-  <polygon points="15.64 235 13.01 237.63 11 235.63 11 241 16.37 241 14.37 239 17 236.36 " fill="#FFF"/>
-  <polygon points="25 264.36 23.64 263 21.01 265.63 19 263.63 19 269 24.37 269 22.37 267 " fill="#FFF"/>
-  <polygon points="13.63 273.01 11 275.64 12.36 277 14.99 274.37 17 276.37 17 271 11.63 271 " fill="#FFF"/>
-  <path d="M22.35 158.06l-1.06 1.06c0.74 0.79 1.21 1.82 1.21 2.98 0 2.44-2.02 4.42-4.5 4.42s-4.5-1.98-4.5-4.42c0-1.16 0.47-2.19 1.21-2.98l-1.06-1.06c-1.02 1.05-1.65 2.47-1.65 4.04 0 3.26 2.69 5.9 6 5.9 3.31 0 6-2.64 6-5.9C24 160.54 23.37 159.12 22.35 158.06zM19 156h-2v6h2V156z" fill="#3C5563"/>
-  <path d="M96.39 56.56c-0.06-0.13-0.12-0.29-0.18-0.48 -0.06-0.19-0.09-0.4-0.09-0.63 0-0.28 0.07-0.53 0.21-0.76 0.14-0.23 0.32-0.45 0.54-0.66 0.21-0.21 0.45-0.42 0.69-0.63 0.25-0.21 0.48-0.45 0.69-0.73 0.22-0.27 0.39-0.57 0.54-0.9C98.93 51.45 99 51.08 99 50.66c0-0.44-0.08-0.82-0.25-1.15 -0.17-0.33-0.4-0.61-0.69-0.83 -0.29-0.22-0.64-0.39-1.03-0.51C96.63 48.06 96.22 48 95.78 48c-0.96 0-1.88 0.26-2.77 0.78v1.88c0.74-0.72 1.51-1.08 2.32-1.08 0.25 0 0.49 0.03 0.71 0.09 0.22 0.06 0.42 0.15 0.59 0.27 0.17 0.12 0.31 0.28 0.41 0.46 0.1 0.18 0.15 0.4 0.15 0.64 0 0.27-0.07 0.52-0.2 0.75 -0.13 0.23-0.3 0.44-0.5 0.65 -0.2 0.21-0.41 0.42-0.64 0.63 -0.23 0.22-0.45 0.44-0.64 0.68 -0.2 0.23-0.36 0.48-0.5 0.75 -0.13 0.27-0.2 0.57-0.2 0.9 0 0.21 0.02 0.43 0.06 0.64 0.04 0.22 0.08 0.4 0.13 0.53H96.39zM96.41 59.68c0.23-0.21 0.34-0.46 0.34-0.76 0-0.31-0.11-0.56-0.34-0.76 -0.23-0.22-0.51-0.32-0.82-0.32 -0.32 0-0.59 0.11-0.82 0.33 -0.23 0.2-0.34 0.46-0.34 0.76 0 0.3 0.11 0.56 0.34 0.77C95.01 59.9 95.29 60 95.6 60 95.9 60 96.17 59.9 96.41 59.68L96.41 59.68z" fill="#FFF"/>
-  <path d="M96 128c-2.28 0-4.36 0.8-6 2.14V132h12v-1.86C100.36 128.8 98.28 128 96 128zM96 126c1.66 0 3-1.34 3-3 0-1.66-1.34-3-3-3 -1.66 0-3 1.34-3 3C93 124.66 94.34 126 96 126z" fill="#FFF"/>
-  <path d="M101 84H91C90.45 84 90 84.45 90 85v10c0 0.55 0.45 1 1 1h10c0.55 0 1-0.45 1-1V85C102 84.45 101.55 84 101 84zM99.02 93.82h-6.03v-1.23l3.54-4.81h-3.33V86.18h5.7v1.35l-3.44 4.69h3.57V93.82z" fill="#FFF"/>
-  <path d="M100.35 158.06l-1.06 1.06c0.74 0.79 1.21 1.82 1.21 2.98 0 2.44-2.02 4.42-4.5 4.42s-4.5-1.98-4.5-4.42c0-1.16 0.47-2.19 1.21-2.98l-1.06-1.06c-1.02 1.05-1.65 2.47-1.65 4.04 0 3.26 2.69 5.9 6 5.9 3.31 0 6-2.64 6-5.9C102 160.54 101.37 159.12 100.35 158.06zM97 156h-2v6h2V156z" fill="#FFF"/>
-  <path d="M22.76 452.13c-0.82 1.83-2.62 3.13-4.76 3.13 -2.9 0-5.25-2.35-5.25-5.25 0-2.9 2.35-5.25 5.25-5.25 1.45 0 2.75 0.6 3.69 1.56l0 0 -2.82 2.82L25 449.13V443l-2.06 2.06c0 0-0.01 0.01-0.02 0.01C21.66 443.8 19.93 443 18 443c-3.86 0-7 3.14-7 7 0 3.87 3.14 7 7 7 3.12 0 5.74-2.05 6.64-4.87H22.76z" fill="#FFF"/>
-  <path d="M61.5 837h-15c-0.83 0-1.5 0.67-1.5 1.5v15c0 0.83 0.67 1.5 1.5 1.5h15c0.83 0 1.5-0.67 1.5-1.5v-15C63 837.67 62.33 837 61.5 837zM61 853H47v-12h14V853zM51 844h-2v2h2V844zM59 844h-2v2h2V844zM55 844h-2v2h2V844zM55 848h-2v2h2V848zM51 848h-2v2h2V848zM59 848h-2v2h2V848z" fill="#ACBBC2"/>
-  <path d="M58.79 807.22l-2.19 2.19 -2.01-2.01 2.19-2.18c-1.21-0.45-2.62-0.19-3.59 0.78 -1.02 1.02-1.25 2.52-0.71 3.77L49 813.23 50.77 815l3.48-3.48c1.25 0.54 2.74 0.3 3.76-0.71C58.98 809.84 59.23 808.43 58.79 807.22z" fill="#F3A914"/>
-  <path d="M55 777v-5.21c0.88-0.39 1.5-1.26 1.5-2.29 0-1.38-1.12-2.5-2.5-2.5 -1.38 0-2.5 1.12-2.5 2.5 0 1.02 0.62 1.9 1.5 2.29V777h-3l4 4 4-4H55z" fill="#768D99"/>
-  <path d="M53 735v5.21c-0.88 0.39-1.5 1.26-1.5 2.29 0 1.38 1.12 2.5 2.5 2.5 1.38 0 2.5-1.12 2.5-2.5 0-1.02-0.62-1.9-1.5-2.29V735h3l-4-4 -4 4H53z" fill="#768D99"/>
-  <path d="M61.68 695.71c-0.42-0.45-1.11-0.45-1.53 0l-8.45 8.91 -3.84-4.05c-0.42-0.45-1.11-0.45-1.53 0 -0.42 0.45-0.43 1.17 0 1.62l4.6 4.86c0.21 0.22 0.49 0.33 0.77 0.33 0.28 0 0.56-0.11 0.77-0.33l9.21-9.71C62.11 696.88 62.11 696.16 61.68 695.71z" fill="#768D99"/>
-  <path d="M98.91 19.85l-0.26 0.27 -0.73-0.73c1.49-1.77 1.43-4.4-0.24-6.07 -1.76-1.76-4.61-1.76-6.36 0 -1.76 1.76-1.75 4.6 0 6.36 1.67 1.67 4.31 1.74 6.07 0.24l0.73 0.73 -0.27 0.27L100.94 24l1.06-1.06L98.91 19.85zM92.38 18.62c-1.17-1.17-1.17-3.07 0-4.24 1.17-1.17 3.07-1.17 4.24 0s1.17 3.07 0 4.24C95.45 19.79 93.55 19.79 92.38 18.62z" fill="#FFF"/>
-</svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" width="114" height="928" viewBox="0 0 114 928" xml:space="preserve" style="enable-background:new 0 0 114 928;overflow:visible">
+  <rect y="903" width="95" height="25" fill="#FFF"/>
+  <rect y="864" width="114" height="30" fill="#FFF"/>
+  <path d="M20.91 19.85l-0.26 0.27 -0.73-0.73c1.49-1.77 1.43-4.4-0.24-6.07 -1.76-1.76-4.61-1.76-6.36 0 -1.76 1.76-1.75 4.6 0 6.36 1.67 1.67 4.31 1.74 6.07 0.24l0.73 0.73 -0.27 0.27L22.94 24l1.06-1.06L20.91 19.85zM14.38 18.62c-1.17-1.17-1.17-3.07 0-4.24 1.17-1.17 3.07-1.17 4.24 0s1.17 3.07 0 4.24C17.45 19.79 15.55 19.79 14.38 18.62z" fill="#3C5563"/>
+  <path d="M18.39 56.56c-0.06-0.13-0.12-0.29-0.18-0.48 -0.06-0.19-0.09-0.4-0.09-0.63 0-0.28 0.07-0.53 0.21-0.76 0.14-0.23 0.32-0.45 0.54-0.66 0.21-0.21 0.45-0.42 0.69-0.63 0.25-0.21 0.48-0.45 0.69-0.73 0.22-0.27 0.39-0.57 0.54-0.9C20.93 51.45 21 51.08 21 50.66c0-0.44-0.08-0.82-0.25-1.15 -0.17-0.33-0.4-0.61-0.69-0.83 -0.29-0.22-0.64-0.39-1.03-0.51C18.63 48.06 18.22 48 17.77 48c-0.96 0-1.88 0.26-2.77 0.78v1.88c0.74-0.72 1.51-1.08 2.32-1.08 0.25 0 0.49 0.03 0.71 0.09 0.22 0.06 0.42 0.15 0.59 0.27 0.17 0.12 0.31 0.28 0.41 0.46 0.1 0.18 0.15 0.4 0.15 0.64 0 0.27-0.07 0.52-0.2 0.75 -0.13 0.23-0.3 0.44-0.5 0.65 -0.2 0.21-0.41 0.42-0.64 0.63 -0.23 0.22-0.45 0.44-0.64 0.68 -0.2 0.23-0.36 0.48-0.5 0.75 -0.13 0.27-0.2 0.57-0.2 0.9 0 0.21 0.02 0.43 0.06 0.64 0.04 0.22 0.08 0.4 0.13 0.53H18.39zM18.41 59.68c0.23-0.21 0.34-0.46 0.34-0.76 0-0.31-0.11-0.56-0.34-0.76 -0.23-0.22-0.51-0.32-0.82-0.32 -0.32 0-0.59 0.11-0.82 0.33 -0.23 0.2-0.34 0.46-0.34 0.76 0 0.3 0.11 0.56 0.34 0.77C17.01 59.9 17.29 60 17.6 60 17.9 60 18.17 59.9 18.41 59.68L18.41 59.68z" fill="#3C5563"/>
+  <path d="M18 128c-2.28 0-4.36 0.8-6 2.14V132h12v-1.86C22.36 128.8 20.28 128 18 128zM18 126c1.66 0 3-1.34 3-3 0-1.66-1.34-3-3-3 -1.66 0-3 1.34-3 3C15 124.66 16.34 126 18 126z" fill="#3C5563"/>
+  <path d="M24.89 193.23l-2.01 2.01 -2.12-2.12 2.01-2.01C22.52 191.05 22.27 191 22 191c-1.66 0-3 1.34-3 3 0 0.27 0.05 0.52 0.11 0.77l-4.34 4.34C14.52 199.05 14.27 199 14 199c-1.66 0-3 1.34-3 3 0 0.27 0.05 0.52 0.11 0.77l2.01-2.01 2.12 2.12 -2.01 2.01C13.48 204.95 13.73 205 14 205c1.66 0 3-1.34 3-3 0-0.27-0.04-0.52-0.11-0.77l4.35-4.34C21.48 196.96 21.73 197 22 197c1.66 0 3-1.34 3-3C25 193.73 24.95 193.48 24.89 193.23z" fill="#FFF"/>
+  <polygon points="25 341 11 341 11 343 25 343 " fill="#FFF"/>
+  <path d="M11 372v2h14v-2H11zM11 379h14v-2H11V379zM11 384h14v-2H11V384z" fill="#FFF"/>
+  <polygon points="25 305 19 305 19 299 17 299 17 305 11 305 11 307 17 307 17 313 19 313 19 307 25 307 " fill="#FFF"/>
+  <path d="M18.7 409.25c0.18 0.22 0.48 0.33 0.9 0.33 0.44 0 0.79-0.16 1.04-0.47 0.25-0.31 0.37-0.66 0.37-1.05 0-0.32-0.1-0.57-0.31-0.77C20.49 407.1 20.21 407 19.85 407c-0.42 0-0.76 0.14-1.03 0.42s-0.4 0.61-0.4 1C18.43 408.76 18.52 409.03 18.7 409.25zM15.35 414.17c0.93-0.61 1.52-0.91 1.79-0.91 0.16 0 0.24 0.09 0.24 0.27 0 0.36-0.29 1.55-0.86 3.58 -0.26 0.91-0.43 1.55-0.51 1.92 -0.08 0.37-0.12 0.7-0.12 0.99 0 0.29 0.06 0.53 0.2 0.71 0.13 0.18 0.33 0.27 0.59 0.27 0.21 0 0.46-0.05 0.74-0.15 0.28-0.1 0.76-0.35 1.42-0.76 0.66-0.41 1.23-0.77 1.71-1.08l0.04-0.12 -0.23-0.38 -0.12-0.01c-0.89 0.59-1.44 0.88-1.64 0.88 -0.07 0-0.14-0.03-0.2-0.1 -0.06-0.07-0.09-0.14-0.09-0.23 0-0.32 0.3-1.5 0.89-3.53 0.34-1.18 0.56-1.98 0.67-2.41 0.11-0.42 0.16-0.77 0.16-1.05 0-0.21-0.06-0.38-0.18-0.52s-0.27-0.2-0.44-0.2c-0.38 0-0.9 0.18-1.58 0.54 -0.67 0.36-1.61 0.97-2.82 1.84L15 413.83l0.2 0.33L15.35 414.17z" fill="#FFF"/>
+  <path d="M22 486c0-1.48-0.81-2.74-2-3.44v6.87C21.19 488.75 22 487.48 22 486z" fill="#768D99"/>
+  <polygon points="11 483.38 11 488.63 13.56 488.63 18 493 18 479 13.56 483.38 " fill="#768D99"/>
+  <path d="M20 479.31v1.58c2.05 0.8 3.5 2.78 3.5 5.11 0 2.33-1.45 4.31-3.5 5.11v1.58C22.89 491.83 25 489.17 25 486 25 482.83 22.89 480.17 20 479.31z" fill="#768D99"/>
+  <path d="M23.5 522c0 0.39-0.05 0.77-0.13 1.14l1.22 1.22C24.85 523.62 25 522.83 25 522c0-3.17-2.11-5.83-5-6.69v1.58C22.05 517.69 23.5 519.67 23.5 522zM20 518.56v1.21l1.98 1.98C21.9 520.39 21.13 519.22 20 518.56zM24.7 527.3l-12.01-12.01 -1.41 1.41 2.48 2.48 -0.2 0.2H11v5.25h2.56L18 529v-5.59l2 2v0.02c0 0 0.01-0.01 0.01-0.01l1.09 1.09c-0.34 0.24-0.71 0.44-1.1 0.6v1.58c0.8-0.24 1.52-0.62 2.17-1.1l1.13 1.13 1.41-1.41 -0.01-0.01L24.7 527.3zM18 515l-1.4 1.38L18 517.77V515z" fill="#768D99"/>
+  <path d="M18 565c1.11 0 2-0.9 2-2h-4C16 564.1 16.9 565 18 565zM22 559.63v-3c0-1.86-1.28-3.41-3-3.86V552c0-0.55-0.45-1-1-1s-1 0.45-1 1v0.77c-1.72 0.45-3 2-3 3.86v3l-2 2h12L22 559.63z" fill="#768D99"/>
+  <path d="M22 592.63c0-1.86-1.28-3.41-3-3.86V588c0-0.55-0.45-1-1-1s-1 0.45-1 1v0.77c-0.01 0-0.02 0.01-0.03 0.01L22 593.81V592.63zM18 601c1.11 0 2-0.9 2-2h-4C16 600.1 16.9 601 18 601zM24.99 599.59l-0.01 0.01 -12.59-12.6L11 588.4l3.16 3.16c-0.09 0.34-0.16 0.69-0.16 1.06v3l-2 2h8.22L23.6 601 25 599.6 24.99 599.59z" fill="#768D99"/>
+  <path d="M24 628c-1.1 0-2 0.9-2 2s0.9 2 2 2 2-0.9 2-2S25.1 628 24 628zM12 628c-1.1 0-2 0.9-2 2s0.9 2 2 2 2-0.9 2-2S13.1 628 12 628zM18 628c-1.1 0-2 0.9-2 2s0.9 2 2 2 2-0.9 2-2S19.1 628 18 628z" fill="#768D99"/>
+  <path d="M24.14 667.97L18 662l-6.14 5.97c-0.48 0.46-0.48 1.22 0 1.68 0.48 0.46 1.25 0.46 1.73 0L18 665.36l4.42 4.3c0.48 0.46 1.25 0.46 1.73 0S24.62 668.44 24.14 667.97z" fill="#768D99"/>
+  <path d="M11.86 700.03L18 706l6.14-5.97c0.48-0.46 0.48-1.22 0-1.68 -0.48-0.46-1.25-0.46-1.73 0L18 702.64l-4.42-4.3c-0.48-0.46-1.25-0.46-1.73 0S11.38 699.56 11.86 700.03z" fill="#768D99"/>
+  <path d="M18 729c-4.97 0-9 4.03-9 9 0 4.97 4.03 9 9 9 4.97 0 9-4.03 9-9C27 733.03 22.97 729 18 729zM19 743h-2v-6h2V743zM19 735h-2v-2h2V735z" fill="#ACBBC2"/>
+  <rect x="17" y="811" width="2" height="2" fill="#ACBBC2"/>
+  <rect x="13" y="811" width="2" height="2" fill="#ACBBC2"/>
+  <rect x="13" y="807" width="2" height="2" fill="#ACBBC2"/>
+  <rect x="21" y="807" width="2" height="2" fill="#ACBBC2"/>
+  <rect x="21" y="811" width="2" height="2" fill="#ACBBC2"/>
+  <rect x="17" y="807" width="2" height="2" fill="#ACBBC2"/>
+  <path d="M19 783v-2h2v2H19zM19 777h2v2h-2V777zM19 773h2v2h-2V773zM19 769h2v2h-2V769zM19 765h2v2h-2V765zM15 781h2v2h-2V781zM15 777h2v2h-2V777zM15 773h2v2h-2V773zM15 769h2v2h-2V769zM15 765h2v2h-2V765z" fill="#ACBBC2"/>
+  <path d="M23.77 841.74c-0.31-0.32-0.81-0.32-1.12 0l-6.51 6.78 -2.79-2.9c-0.31-0.32-0.81-0.32-1.12 0 -0.31 0.32-0.31 0.84 0 1.16l3.35 3.49c0.31 0.32 0.81 0.32 1.12 0l7.07-7.36C24.08 842.58 24.08 842.06 23.77 841.74z" fill="#768D99"/>
+  <path d="M57.02 876.4c0.68-0.51 1.02-1.3 1.02-2.37 0-1.05-0.34-1.84-1.02-2.36 -0.68-0.52-1.71-0.78-3.1-0.78h-4.2v6.29h4.21C55.31 877.18 56.34 876.92 57.02 876.4z" fill="#D40000"/>
+  <path d="M54.27 879.47h-4.56v7.64h4.56c1.53 0 2.66-0.31 3.4-0.94 0.73-0.63 1.1-1.59 1.1-2.89 0-1.3-0.37-2.27-1.1-2.88C56.93 879.78 55.8 879.47 54.27 879.47z" fill="#D40000"/>
+  <path d="M76.08 876.4c0.68-0.51 1.02-1.3 1.02-2.37 0-1.05-0.34-1.84-1.02-2.36 -0.68-0.52-1.71-0.78-3.1-0.78h-4.2v6.29h4.2C74.36 877.18 75.4 876.92 76.08 876.4z" fill="#D40000"/>
+  <polygon points="30.28 881.73 37.99 881.73 34.13 871.35 " fill="#D40000"/>
+  <path d="M0 864v30h114v-30H0zM21.68 889.43H4.55v-2.15l13.27-16.33H4.87v-2.37H21.36v2.15L8.09 887.05h13.59V889.43zM40.79 889.43l-1.91-5.35H29.42l-1.91 5.35h-2.99l8.01-20.85h3.22l8 20.85H40.79zM59.85 887.91c-1.27 1.01-3.09 1.52-5.44 1.52H46.88v-20.85h7.25c2.16 0 3.83 0.45 5 1.34 1.17 0.89 1.76 2.17 1.76 3.81 0 1.27-0.3 2.29-0.9 3.05 -0.6 0.75-1.48 1.22-2.64 1.41 1.4 0.3 2.48 0.92 3.26 1.86 0.77 0.95 1.16 2.13 1.16 3.54C61.76 885.45 61.13 886.89 59.85 887.91zM78.91 887.91c-1.27 1.01-3.09 1.52-5.44 1.52h-7.53v-20.85h7.25c2.16 0 3.83 0.45 5 1.34 1.17 0.89 1.76 2.17 1.76 3.81 0 1.27-0.3 2.29-0.9 3.05 -0.6 0.75-1.48 1.22-2.64 1.41 1.4 0.3 2.48 0.92 3.25 1.86 0.78 0.95 1.16 2.13 1.16 3.54C80.82 885.45 80.18 886.89 78.91 887.91zM88.16 889.43h-2.84v-20.85h2.84V889.43zM106.33 889.43l-5.75-8.73 -5.8 8.73h-3.02l7.32-11.01 -6.49-9.85h3.12l4.94 7.49 4.98-7.49h3.02l-6.5 9.77 7.31 11.09H106.33z" fill="#D40000"/>
+  <path d="M73.33 879.47h-4.55v7.64h4.56c1.53 0 2.66-0.31 3.4-0.94 0.73-0.63 1.1-1.59 1.1-2.89 0-1.3-0.37-2.27-1.1-2.88C75.99 879.78 74.86 879.47 73.33 879.47z" fill="#D40000"/>
+  <polygon points="108.64 868.57 105.63 868.57 100.65 876.06 95.71 868.57 92.59 868.57 99.08 878.42 91.76 889.43 94.77 889.43 100.58 880.7 106.33 889.43 109.45 889.43 102.15 878.34 " fill="#FFF"/>
+  <polygon points="21.36 870.72 21.36 868.57 4.87 868.57 4.87 870.95 17.82 870.95 4.55 887.28 4.55 889.43 21.68 889.43 21.68 887.05 8.09 887.05 " fill="#FFF"/>
+  <path d="M32.53 868.57l-8.01 20.85h2.99l1.91-5.35h9.46l1.91 5.35h2.95l-8-20.85H32.53zM30.28 881.73l3.85-10.38 3.86 10.38H30.28z" fill="#FFF"/>
+  <path d="M57.35 878.18c1.16-0.19 2.04-0.66 2.64-1.41 0.6-0.76 0.9-1.77 0.9-3.05 0-1.65-0.59-2.92-1.76-3.81 -1.17-0.89-2.84-1.34-5-1.34H46.88v20.85h7.53c2.35 0 4.17-0.51 5.44-1.52 1.28-1.02 1.91-2.45 1.91-4.32 0-1.42-0.38-2.6-1.16-3.54C59.83 879.1 58.75 878.48 57.35 878.18zM49.72 870.89h4.21c1.39 0 2.42 0.26 3.1 0.78 0.68 0.52 1.02 1.31 1.02 2.36 0 1.06-0.34 1.85-1.02 2.37 -0.68 0.52-1.71 0.78-3.1 0.78h-4.2V870.89zM57.67 886.17c-0.73 0.63-1.87 0.94-3.39 0.94h-4.56v-7.64h4.56c1.53 0 2.66 0.31 3.4 0.93 0.73 0.62 1.1 1.58 1.1 2.89C58.77 884.57 58.4 885.54 57.67 886.17z" fill="#FFF"/>
+  <rect x="85.33" y="868.57" width="2.84" height="20.85" fill="#FFF"/>
+  <path d="M76.41 878.18c1.16-0.19 2.04-0.66 2.64-1.41 0.6-0.76 0.9-1.77 0.9-3.05 0-1.65-0.59-2.92-1.76-3.81 -1.17-0.89-2.84-1.34-5-1.34h-7.25v20.85h7.53c2.35 0 4.17-0.51 5.44-1.52 1.27-1.02 1.91-2.45 1.91-4.32 0-1.42-0.38-2.6-1.16-3.54C78.89 879.1 77.8 878.48 76.41 878.18zM68.77 870.89h4.2c1.39 0 2.42 0.26 3.1 0.78 0.68 0.52 1.02 1.31 1.02 2.36 0 1.06-0.34 1.85-1.02 2.37 -0.68 0.52-1.71 0.78-3.1 0.78h-4.2V870.89zM76.72 886.17c-0.74 0.63-1.87 0.94-3.4 0.94h-4.55v-7.64h4.56c1.53 0 2.66 0.31 3.4 0.93 0.73 0.62 1.1 1.58 1.1 2.89C77.83 884.57 77.46 885.54 76.72 886.17z" fill="#FFF"/>
+  <path d="M47.52 913.34c0.56-0.44 0.84-1.1 0.84-1.98 0-0.89-0.28-1.54-0.84-1.97 -0.57-0.43-1.44-0.65-2.59-0.65h-3.5v5.25h3.5C46.09 913.99 46.95 913.77 47.52 913.34z" fill="#D40000"/>
+  <path d="M45.23 915.89h-3.79v6.36h3.8c1.28 0 2.22-0.26 2.83-0.77 0.61-0.52 0.92-1.33 0.92-2.4 0-1.09-0.3-1.89-0.92-2.4C47.44 916.14 46.5 915.89 45.23 915.89z" fill="#D40000"/>
+  <path d="M63.4 913.34c0.57-0.44 0.85-1.1 0.85-1.98 0-0.89-0.28-1.54-0.85-1.97 -0.56-0.43-1.43-0.65-2.58-0.65h-3.5v5.25h3.5C61.97 913.99 62.83 913.77 63.4 913.34z" fill="#D40000"/>
+  <polygon points="25.23 917.78 31.66 917.78 28.44 909.13 " fill="#D40000"/>
+  <path d="M0 903v25h95v-25H0zM18.07 924.2H3.79v-1.8l11.06-13.6H4.06v-1.98h13.74v1.8l-11.05 13.6h11.32V924.2zM33.99 924.2l-1.59-4.46h-7.89l-1.59 4.46h-2.49l6.68-17.38h2.68l6.66 17.38H33.99zM49.88 922.92c-1.06 0.85-2.58 1.28-4.53 1.28h-6.27v-17.38h6.04c1.8 0 3.19 0.37 4.17 1.12 0.97 0.74 1.46 1.8 1.46 3.18 0 1.05-0.25 1.9-0.75 2.53 -0.5 0.63-1.23 1.02-2.2 1.19 1.16 0.24 2.06 0.75 2.71 1.55 0.64 0.78 0.96 1.77 0.96 2.95C51.47 920.87 50.94 922.07 49.88 922.92zM65.75 922.92c-1.06 0.85-2.57 1.28-4.53 1.28h-6.28v-17.38h6.04c1.8 0 3.19 0.37 4.17 1.12 0.97 0.74 1.47 1.8 1.47 3.18 0 1.05-0.25 1.9-0.75 2.53 -0.5 0.63-1.23 1.02-2.21 1.19 1.16 0.24 2.07 0.75 2.71 1.55 0.65 0.78 0.97 1.77 0.97 2.95C67.35 920.87 66.82 922.07 65.75 922.92zM73.47 924.2h-2.37v-17.38h2.37V924.2zM88.61 924.2l-4.79-7.28 -4.84 7.28h-2.51l6.1-9.18 -5.4-8.2h2.6l4.11 6.24 4.15-6.24h2.51l-5.41 8.14 6.09 9.25H88.61z" fill="#D40000"/>
+  <path d="M61.11 915.89h-3.8v6.36h3.8c1.27 0 2.21-0.26 2.83-0.77 0.61-0.52 0.92-1.33 0.92-2.4 0-1.09-0.31-1.89-0.92-2.4C63.32 916.14 62.38 915.89 61.11 915.89z" fill="#D40000"/>
+  <polygon points="90.53 906.81 88.02 906.81 83.87 913.06 79.76 906.81 77.16 906.81 82.56 915.01 76.47 924.2 78.97 924.2 83.82 916.92 88.61 924.2 91.21 924.2 85.12 914.95 " fill="#FFF"/>
+  <polygon points="17.8 908.61 17.8 906.81 4.06 906.81 4.06 908.8 14.85 908.8 3.79 922.4 3.79 924.2 18.07 924.2 18.07 922.21 6.75 922.21 " fill="#FFF"/>
+  <path d="M27.11 906.81l-6.68 17.38h2.49l1.59-4.46H32.4l1.59 4.46h2.46l-6.66-17.38H27.11zM25.23 917.78l3.21-8.65 3.21 8.65H25.23z" fill="#FFF"/>
+  <path d="M47.8 914.83c0.96-0.17 1.7-0.56 2.2-1.19 0.5-0.63 0.75-1.47 0.75-2.53 0-1.38-0.48-2.44-1.46-3.18 -0.98-0.75-2.37-1.12-4.17-1.12h-6.04v17.38h6.28c1.96 0 3.48-0.43 4.53-1.28 1.06-0.85 1.59-2.05 1.59-3.59 0-1.17-0.32-2.17-0.96-2.95C49.86 915.58 48.96 915.07 47.8 914.83zM41.43 908.74h3.5c1.15 0 2.02 0.22 2.59 0.65 0.56 0.43 0.84 1.08 0.84 1.97 0 0.88-0.28 1.54-0.84 1.98 -0.57 0.43-1.44 0.65-2.59 0.65h-3.5V908.74zM48.06 921.47c-0.61 0.52-1.55 0.78-2.83 0.78h-3.79v-6.36h3.8c1.28 0 2.22 0.26 2.83 0.78 0.61 0.51 0.92 1.31 0.92 2.4C48.97 920.14 48.67 920.95 48.06 921.47z" fill="#FFF"/>
+  <rect x="71.1" y="906.81" width="2.37" height="17.38" fill="#FFF"/>
+  <path d="M63.67 914.83c0.97-0.17 1.71-0.56 2.21-1.19 0.5-0.63 0.75-1.47 0.75-2.53 0-1.38-0.49-2.44-1.47-3.18 -0.98-0.75-2.37-1.12-4.17-1.12h-6.04v17.38h6.28c1.96 0 3.47-0.43 4.53-1.28 1.07-0.85 1.6-2.05 1.6-3.59 0-1.17-0.32-2.17-0.97-2.95C65.74 915.58 64.83 915.07 63.67 914.83zM57.31 908.74h3.5c1.16 0 2.02 0.22 2.58 0.65 0.57 0.43 0.85 1.08 0.85 1.97 0 0.88-0.28 1.54-0.85 1.98 -0.56 0.43-1.43 0.65-2.58 0.65h-3.5V908.74zM63.94 921.47c-0.62 0.52-1.56 0.78-2.83 0.78h-3.8v-6.36h3.8c1.27 0 2.21 0.26 2.83 0.78 0.61 0.51 0.92 1.31 0.92 2.4C64.86 920.14 64.55 920.95 63.94 921.47z" fill="#FFF"/>
+  <path d="M23 84H13C12.45 84 12 84.45 12 85v10c0 0.55 0.45 1 1 1h10c0.55 0 1-0.45 1-1V85C24 84.45 23.55 84 23 84zM21.02 93.82h-6.03v-1.23l3.54-4.81h-3.33V86.18h5.7v1.35l-3.44 4.69h3.57V93.82z" fill="#3C5563"/>
+  <polygon points="25 227 19.63 227 21.63 229.01 19 231.64 20.36 233 22.99 230.37 25 232.37 " fill="#FFF"/>
+  <polygon points="15.64 235 13.01 237.63 11 235.63 11 241 16.37 241 14.37 239 17 236.36 " fill="#FFF"/>
+  <polygon points="25 264.36 23.64 263 21.01 265.63 19 263.63 19 269 24.37 269 22.37 267 " fill="#FFF"/>
+  <polygon points="13.63 273.01 11 275.64 12.36 277 14.99 274.37 17 276.37 17 271 11.63 271 " fill="#FFF"/>
+  <path d="M22.35 158.06l-1.06 1.06c0.74 0.79 1.21 1.82 1.21 2.98 0 2.44-2.02 4.42-4.5 4.42s-4.5-1.98-4.5-4.42c0-1.16 0.47-2.19 1.21-2.98l-1.06-1.06c-1.02 1.05-1.65 2.47-1.65 4.04 0 3.26 2.69 5.9 6 5.9 3.31 0 6-2.64 6-5.9C24 160.54 23.37 159.12 22.35 158.06zM19 156h-2v6h2V156z" fill="#3C5563"/>
+  <path d="M96.39 56.56c-0.06-0.13-0.12-0.29-0.18-0.48 -0.06-0.19-0.09-0.4-0.09-0.63 0-0.28 0.07-0.53 0.21-0.76 0.14-0.23 0.32-0.45 0.54-0.66 0.21-0.21 0.45-0.42 0.69-0.63 0.25-0.21 0.48-0.45 0.69-0.73 0.22-0.27 0.39-0.57 0.54-0.9C98.93 51.45 99 51.08 99 50.66c0-0.44-0.08-0.82-0.25-1.15 -0.17-0.33-0.4-0.61-0.69-0.83 -0.29-0.22-0.64-0.39-1.03-0.51C96.63 48.06 96.22 48 95.78 48c-0.96 0-1.88 0.26-2.77 0.78v1.88c0.74-0.72 1.51-1.08 2.32-1.08 0.25 0 0.49 0.03 0.71 0.09 0.22 0.06 0.42 0.15 0.59 0.27 0.17 0.12 0.31 0.28 0.41 0.46 0.1 0.18 0.15 0.4 0.15 0.64 0 0.27-0.07 0.52-0.2 0.75 -0.13 0.23-0.3 0.44-0.5 0.65 -0.2 0.21-0.41 0.42-0.64 0.63 -0.23 0.22-0.45 0.44-0.64 0.68 -0.2 0.23-0.36 0.48-0.5 0.75 -0.13 0.27-0.2 0.57-0.2 0.9 0 0.21 0.02 0.43 0.06 0.64 0.04 0.22 0.08 0.4 0.13 0.53H96.39zM96.41 59.68c0.23-0.21 0.34-0.46 0.34-0.76 0-0.31-0.11-0.56-0.34-0.76 -0.23-0.22-0.51-0.32-0.82-0.32 -0.32 0-0.59 0.11-0.82 0.33 -0.23 0.2-0.34 0.46-0.34 0.76 0 0.3 0.11 0.56 0.34 0.77C95.01 59.9 95.29 60 95.6 60 95.9 60 96.17 59.9 96.41 59.68L96.41 59.68z" fill="#FFF"/>
+  <path d="M96 128c-2.28 0-4.36 0.8-6 2.14V132h12v-1.86C100.36 128.8 98.28 128 96 128zM96 126c1.66 0 3-1.34 3-3 0-1.66-1.34-3-3-3 -1.66 0-3 1.34-3 3C93 124.66 94.34 126 96 126z" fill="#FFF"/>
+  <path d="M101 84H91C90.45 84 90 84.45 90 85v10c0 0.55 0.45 1 1 1h10c0.55 0 1-0.45 1-1V85C102 84.45 101.55 84 101 84zM99.02 93.82h-6.03v-1.23l3.54-4.81h-3.33V86.18h5.7v1.35l-3.44 4.69h3.57V93.82z" fill="#FFF"/>
+  <path d="M100.35 158.06l-1.06 1.06c0.74 0.79 1.21 1.82 1.21 2.98 0 2.44-2.02 4.42-4.5 4.42s-4.5-1.98-4.5-4.42c0-1.16 0.47-2.19 1.21-2.98l-1.06-1.06c-1.02 1.05-1.65 2.47-1.65 4.04 0 3.26 2.69 5.9 6 5.9 3.31 0 6-2.64 6-5.9C102 160.54 101.37 159.12 100.35 158.06zM97 156h-2v6h2V156z" fill="#FFF"/>
+  <path d="M22.76 452.13c-0.82 1.83-2.62 3.13-4.76 3.13 -2.9 0-5.25-2.35-5.25-5.25 0-2.9 2.35-5.25 5.25-5.25 1.45 0 2.75 0.6 3.69 1.56l0 0 -2.82 2.82L25 449.13V443l-2.06 2.06c0 0-0.01 0.01-0.02 0.01C21.66 443.8 19.93 443 18 443c-3.86 0-7 3.14-7 7 0 3.87 3.14 7 7 7 3.12 0 5.74-2.05 6.64-4.87H22.76z" fill="#FFF"/>
+  <path d="M61.5 837h-15c-0.83 0-1.5 0.67-1.5 1.5v15c0 0.83 0.67 1.5 1.5 1.5h15c0.83 0 1.5-0.67 1.5-1.5v-15C63 837.67 62.33 837 61.5 837zM61 853H47v-12h14V853zM51 844h-2v2h2V844zM59 844h-2v2h2V844zM55 844h-2v2h2V844zM55 848h-2v2h2V848zM51 848h-2v2h2V848zM59 848h-2v2h2V848z" fill="#ACBBC2"/>
+  <path d="M58.79 807.22l-2.19 2.19 -2.01-2.01 2.19-2.18c-1.21-0.45-2.62-0.19-3.59 0.78 -1.02 1.02-1.25 2.52-0.71 3.77L49 813.23 50.77 815l3.48-3.48c1.25 0.54 2.74 0.3 3.76-0.71C58.98 809.84 59.23 808.43 58.79 807.22z" fill="#F3A914"/>
+  <path d="M55 777v-5.21c0.88-0.39 1.5-1.26 1.5-2.29 0-1.38-1.12-2.5-2.5-2.5 -1.38 0-2.5 1.12-2.5 2.5 0 1.02 0.62 1.9 1.5 2.29V777h-3l4 4 4-4H55z" fill="#768D99"/>
+  <path d="M53 735v5.21c-0.88 0.39-1.5 1.26-1.5 2.29 0 1.38 1.12 2.5 2.5 2.5 1.38 0 2.5-1.12 2.5-2.5 0-1.02-0.62-1.9-1.5-2.29V735h3l-4-4 -4 4H53z" fill="#768D99"/>
+  <path d="M61.68 695.71c-0.42-0.45-1.11-0.45-1.53 0l-8.45 8.91 -3.84-4.05c-0.42-0.45-1.11-0.45-1.53 0 -0.42 0.45-0.43 1.17 0 1.62l4.6 4.86c0.21 0.22 0.49 0.33 0.77 0.33 0.28 0 0.56-0.11 0.77-0.33l9.21-9.71C62.11 696.88 62.11 696.16 61.68 695.71z" fill="#768D99"/>
+  <path d="M98.91 19.85l-0.26 0.27 -0.73-0.73c1.49-1.77 1.43-4.4-0.24-6.07 -1.76-1.76-4.61-1.76-6.36 0 -1.76 1.76-1.75 4.6 0 6.36 1.67 1.67 4.31 1.74 6.07 0.24l0.73 0.73 -0.27 0.27L100.94 24l1.06-1.06L98.91 19.85zM92.38 18.62c-1.17-1.17-1.17-3.07 0-4.24 1.17-1.17 3.07-1.17 4.24 0s1.17 3.07 0 4.24C95.45 19.79 93.55 19.79 92.38 18.62z" fill="#FFF"/>
+</svg>
diff -x graphtree -Naru ./img/oneoaas-wechat.jpg graphtree/img/oneoaas-wechat.jpg
--- ./img/oneoaas-wechat.jpg	1970-01-01 08:00:00.000000000 +0800
+++ graphtree/img/oneoaas-wechat.jpg	2016-04-18 19:04:38.000000000 +0800
@@ -0,0 +1,73 @@
+ÿØÿàJFIFÿÛC
+
+
+

ÿÛC		

ÿÀ"ÿÄ	
+ÿÄµ}!1AQa"q2�‘¡#B±ÁRÑð$3br‚	
+%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ	
+ÿÄµw!1AQaq"2�B‘¡±Á	#3RðbrÑ
+$4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚâãäåæçèéêòóôõö÷øùúÿÚ?ýS¢Š(¢“"ŒÐÑIš3@E&hÍ-™dPÑIšZ(¤È¥ ŠLŠZ(¢Š(¢Š(¢Š(¤È¥ Š)3@E&hÍ-™£4´QEQE‡¥-! ÈÛ×öõøíð[ö±ñÏƒ|ãŸì
é¿aû%—öEŒþ_™ao+üòÀÎrò9åŽ3�À¼þ�ûNÿÑLÿÊ™ÿÈÔÁQÿäû>&ÿÜ3ÿMv•û§ñKâ—†>xSñ—Œµ?ì
é¾WÚï~Ï,þ_™*DŸ$JÎrò áN3“€	 ÂÏøz?í;ÿE3ÿ(gÿ#QÿGý§è¦åLÿäjýTÿ‡£þÌ_ôS?ò�ªò5ðôÙ‹þŠoþP5OþF Ê¿øz?í;ÿE3ÿ(gÿ#WßßðJ_Ú�âwí)ÿGþ?‰¿á"þÅþËûú­¯“ç}¯ÍÿQnÏ•ÞÎ6ñŒœú·üþLOâoýÃ?ôéi_*Á¿æ¶Üÿoè•ý½o_Žß¿kø7Á¾9þÇðÞ›ö²YdXÏåù–ò¿Ï,ç/#žXã8(ý‚¿o_Žßkx7Æ^9þØðÞ¥öïµÙdXÁæyv§Ï
+ãg<(ý½`¯ŽßkøËÁ¾þØðÞ¥ö²^ÿkØÁæyvñ?É,êãŽTghý‚¿`¯Žß¿kxËÆ^þÇðÞ›öïµÞÿkØÏåù–'Éìç/"ã9<hßÿà«_µÄïÙ¯þwü+�Â;ýµý©öÿô[¯;Éû'•þ¾'Û�6O»Œîç8úö	ø£â�²w�¼eã-OûcÄšŸÛ¾×{öx ó<»ûˆ“ä‰U4(Î2y$×Å_ð\ÞáIÿÜoÿl+âÏ…ß°OÇo�Ó<eàßløoRó~É{ý¯a™åÊñ?É,êãŽTgú§ö
+ý½~;|iý¬|
àßxçûcÃz—Û¾×eý‘c™åØ\JŸ<P+Œ<hxaœ`ðH¯×ìq_Šÿ²çì·ñ?ö.øíáŸŒ¿<3ÿwÃ
}«ûWZû}­÷Ù¾Ñk-¬?¹µ–YŸt×'È‡²p ‘ú§ð3ö£øcûIÿmÿÂ¸ñ7ü$Ø¾GÛÿÐ.­|Ÿ;Ìò¿×Ä›³åI÷s�¼ã# šß·¯íëñÛà·ícãŸø7Ç?ØþÓ~ÃöK/ì‹ü¿2ÂÞWùå�œåäsËg€~¿×Ïÿoo�?üw©ø7Æ^9þÆñ&›å}®Ëû"þ/Ì‰%Ož(RD<1ÆppAù­û.~ËÿbïŽÞøËñ“Ã?ð‡|7ð×Ú¿µu¯·Úß}›í²ÚÃû›Ye™÷Mq|ˆq»'
+	µ4WåWíÏÿ'ÿ„#þÇþ./ü!ŸmþÞÿ˜_ØþÙö³Çï“æoû%Çú½Ûv|ØÊçó[â—ÂßüñÞ§àßiŸØþ$Ó|¯µÙ}¢)ü¿2$•>x™�å$CÃg�EOÔQ_ŸÿðU¯Ùsâwí(~Â¸ðÏü$Ø¿ÚŸoÿOµµò|ï²y_ëåMÙò¤û¹ÆÞq‘�Ð
+ùÿööø£â‚ÿ²wŽ|eàÝOûÄšgØ~É{öx§òüËûxŸä•YRG©Ær9×äü:ãö�ÿ¢gÿ•ý3ÿ’k÷ú€?áèÿ´ïýÏü iŸü�_¯ß°OÅühý“¼
ã/jÛ$ÔþÝö»ß³Å™åßÜDŸ$J¨0‘ áFq“É&¾+ÿ‚çuø'ÿq¿ý°®«ö
+ý½~üý“¼
àßxçûÄšoÛ¾×eý‘?—æ_ÜJŸ<P2¤ˆxcŒàò ª¿ooŠ>'ø/û'xçÆ^
Ôÿ±üI¦}‡ì—¿gŠ/Ì¿·‰þIU�å$qÊœg#�
~@ÿÃÑÿißú)Ÿù@Ó?ù¿U?à¨ÿòbîÿ§KJùSþcÿ5³þàŸû@+ÃÑÿißú)Ÿù@Ó?ù�øz?í;ÿE3ÿ(gÿ#Wë÷ÅÛÛàOÁê~
ñ—Ž±¼I¦ù_k²þÈ¿ŸËó"ISçŠC”‘qœEr¿ðôÙ‹þŠoþP5OþF Ê¿øz?í;ÿE3ÿ(gÿ#QÿGý§è¦åLÿäjý¨øûQü1ý¥?¶ÿá\x›þ?ì_#íÿèV¾O�æy_ëâMÙò¤û¹ÆÞq‘ŸÅø*?üŸgÄßû†é®Ò€?¨¢Š(¢Š)
-! À/ø*?üŸgÄßû†é®Ò¿U?à¨ÿòbŸ?îÿ§;Jü«ÿ‚£ÿÉö|Mÿ¸gþší+õSþ
+�ÿ&'ñ7þáŸút´ À(¢€?¿à¨ÿòbîÿ§KJùSþeÿ5³þàŸû_UÿÁQÿäÄþ&ÿÜ3ÿN–•ò§üÇþkgýÁ?öþ€=Wö£ÿ‚¬ÿÃ5üvñ7Ã�øUßð‘ÿbý—þ&ð�}—Îó­bŸýWÙ_n<Ý¿xçnxÎßüWàüþO³âoýÃ?ô×iGü=ö�ÿ¢™ÿ”
3ÿ‘¨ê¯ø.o_‚xÿ¨ßþØWÕ?ðKœÃ
+|3ÿ¸Ÿþœîëñ_ãŸíIñ;ö”þÄÿ…�âoøHÿ±|ÿ° ZÚù>w—æÿ¨‰7gÊ�ïgxÆNz¿…ß··Ço‚þÓ<àßÿcxoMó~Éeý‘a?—æJò¿Ï,ç/#žXã8
+ûP~ÜÿðòøÇøBá]Âiÿ3/ö¯ö§ØþÇþŸÿÞL>fÿ²yënýÜíÚ~©ý†¿a“ûÿÂmÿ·ü&?ð’ý‹þa?aû7ÙþÑÿMåß»íØÛß<~VÁ.?äû>ÜOÿMwuûûÚ€>ý¨ÿà”ßðÒŸ|Mñþ�ü#ŸÛ_fÿ‰gü#ÿjò|›X ÿ[ö¤ÝŸ+wÝÝŽq“õWíIð0~Ò¼Mðãûoþßí¯³ÄÏìŸjò|›¨§ÿW½7gÊÛ÷†7gœ`þk~Þ¿·¯Ço‚ßµ�Ž|àßÿcøoMûÙ,¿²,gòüËy_ç–s—‘Ï,qœ~Á_·¯Ço�?µ��¼ã/ÿlxoRûwÚì¿²,`ó<»‰SçŠq‡�3Œ	ö§ì5ûÿÃÿÂmÿ·ü&?ð’ý‹þa_aû7ÙþÑÿM¥ß»íØÛß<~VÁQÿäúþ&Ü3ÿM–•ûûŽ+À>(þÁ?~4xïSñ—Œ¼
ý³âMKÊû]ïö½üg—DŸ$Sª$h8Qœdä’hªý©>:Ã6|	ñ7Äì_øH¿±~ÍÿÏµý—Îó®¢ƒýnÇÛ�7wÝ9ÛŽ3‘å_°ÏíÍÿ
¢|mÿOü!ßð�}‹þb¿nûOÚ>ÑÿLbÙ·ìþùÝÛþA|Qý½¾;|hð&§àßxçûgÃz—•ö»/ì‹<Ï.T•>x WxÐðÃ8ÁÈ$W)ð3ö¤ø�û5ÿmÿÂ¸ñ7ü#ŸÛ^GÛÿÐ-n¼ï'Ìò¿×ÄûqæÉ÷q�ÜçÒ—ÔµøÿGý§è¦åLÿäjý~ý½¾(øŸà¿ì�ãŸx7SþÇñ&™ö²^ýž)ü¿2þÞ'ù%VC”‘Ç*qœŽ@4ñWü;þhŸýÆÿöÂ¿+3šõ_ŽµÄïÚSûþ?‰¿á#þÅóþÁþ�kkäùÞ_›þ¢$ÝŸ*?½œmã9òªýþÿ‚£ÿÉ‰üMÿ¸gþ�-+åOø!—üÖÏû‚íý}WÿGÿ“ø›ÿpÏý:ZWÊŸðCù­Ÿ÷ÿÛúù[þ
+�ÿ'Ùñ3þáŸúl´¯•kê¯ø*?üŸgÄßû†é®Ò¾U Õ?ø!—üÖÏû‚íý|­ÿGÿ“ìø›ÿpÏý5ÚWÕ?ðCù­Ÿ÷ÿÛúù[þ
+�ÿ'Ùñ7þáŸúk´ ßê(¢€
+(¢€
+CKHzPàüþO³âoýÃ?ô×i_ªŸðôÙ‹þŠoþP5OþF¯*ý¨ÿà”¿ðÒŸ¼Mñþ�ü#ŸÛ_eÿ‰gü#ÿjò|›X ÿ[ö¤ÝŸ+wÝÝŽq“å_ðãú­Ÿùj÷m}UÿGý˜¿è¦ÿåTÿäj?áèÿ³ýßü jŸü�_*ÃŒ¿ê¶å©ÿÝ´ÃŒê¶å©ÿÝ´ÕþÞ¿·¯ÀŸ�?²wŽ|àßÿlx“RûÙ,¿²/àó<»ûy_ç–A„�Ï,3ŒHÊÁ¿æ¶ÜÿoéáÆXÿšÙÿ–§ÿv×Õ?°Ïì3ÿ_ÿ	¶<mÿ	�ü$¿bÿ˜OØ~Íö´ÓiwîûG¶6÷Ï•ŸðTù>Ï‰¿÷ÿÓ]¥z¯ì¹û-üOý‹¾;xgã/ÆOÿÂðßÃ_jþÕÖ¾ßk}öo´ZËkîme–gÝ5ÄIò!Æìœ($}UûQÿÁ)á¥>;x›â?ü-øG?¶¾ËÿÏøGþÕäù6±Aþ·íI»>Vïº1»ã'Õà¨ßòbŸ?îÿ§;JùSöçÿ�“ÿÂÿãÿþ¿¶ÿoÌ/ìkû?Ù¿ã÷Éó7ý’ãý^í»>lesêß²ßíIðÃö.øáŸƒ<MÿwÄ�
}«ûWEûÕ÷Ù¾Ñu-Ô?¾µŠX_t7?Èç°pÀ�å?ðC>ávgþ �íþ¾Vÿ‚£ÿÉõüLÿ¸gþ›-(÷Oâ—Å/|ð&§ã/jØþÓ|¯µÞýžYü¿2T‰>H•œåäAÂœg'_š¿·?ül£þŸøgø¸¿ð†}·û{þacû_ÙþÍÿÞO™¿ì—ê÷mÙóc+Ÿ+ý¨ÿà«_ðÒŸ|Mðãþwü#ŸÛ_eÿ‰Ÿü$jò|›¨§ÿUöTÝŸ+oÞÝžqƒå_°×íÌ?bÿøM¿â‰ÿ„Çþ_±ÌWì?fû?Ú?é„»÷yþØÛß<}ÿû-þÔŸ?bï�>ø7ñ“Äßð‡|Hð×Ú¿µt_°]_}›íRÝCûëX¥…÷CqüŽq»šß`ŸŽßü	©øËÆ^þÆðÞ›å}®÷û^Â/Ì•"O’)ÙÎ^D)Ærp5Ê~Ôÿá¥>;x›â?ö'ü#¿Û_eÿ‰gÚþÕäù6±Aþ·bnÏ•»îŒnÇ8Éú«ö£ÿ‚­ÃJ|
+ñ7Ã�øUßðŽm}—þ&ð�}«Éòn¢ŸýWÙSv|­¿xcvyÆÊ¿?e¿‰ß´§ößü+�ÿÂGý‹ä}¿ý>Ö×Éó¼Ï+ý|©»>TŸw8ÛÎ23Ê|Rø[â‚þ;Ôüã-3ûÄšo•ö»/´E?—æD’§Ï2¤ˆxcŒàò¯ ?aŸÛ›þ¿þoø¢á1ÿ„—ì?óûÙ¾Ïö�úa.ýßhöÆÞùãê¯øa�øyGüdwü&ßð®¿á4ÿ™kû+ûSìdÿ@ÿ�Ÿ:3Ù<Ïõk·~Þvî üQý‚~;|ð&§ã/xûÃzo•ö»ßí{	ü¿2T‰>H§g9yp§ÉÀ×ÚðC.?ávÜÿoëÊÿj?ø*Ïü4§À¯|8ÿ…]ÿçö×Ùâgÿ	Ú¼Ÿ&ê)ÿÕ}•7gÊÛ÷†7gœ`ùWì5ûsÃÿÂmÿOü&?ð’ý‡þb¿aû7ÙþÑÿL%ß»íØÛß<~¿|Qý½¾üñÞ§àßxçûÄšo•ö»/ì‹ùü¿2$•>x d9IðÇÁÁWâ¿ÅØ'ã·Áj~2ñ—�¿±¼7¦ù_k½þ×°ŸËó%H“äŠvs—‘
+qœœMrŸµ'Ç?øiOŽÞ&ø�ý‰ÿïö×Ù¿âYö¿µy>M¬P­Ø›³ånû£±Î2jO�ŸðÒ¼Mðãûoþßí¯³ÄÏìŸjò|›¨§ÿU½7gÊÛ÷†7gœ`€~|ý–þ'~ÒŸÛð®<3ÿ	ö/‘öÿôû[_'Îó<¯õò¦ìùR}Üão8ÈÏ)ñKáo‰þøïSðoŒ´Ïìi¾WÚì¾Ñþ_™JŸ<LÈr’!áŽ3ƒÈ"¿tÿaŸØgþ¿þoø­¿á1ÿ„—ì?ó
+ûÙ¾Ïö�úo.ýßhöÆÞùãÊ¿j?ø%/ü4§Ço|Gÿ…£ÿïö×Ù¿âYÿÿÚ¼Ÿ&Ö(?Öý©7gÊÝ÷F7cœd€z·üþLOâoýÃ?ôéi_Á)?j?†?³_ü-øXþ&ÿ„sûkû/ìèW^w“ö¿7ýDO·l{ÝÆpqú©ûR|ÿ†”øâo‡ÛðŽÿm}—þ&dûW“äÝE?ú­é»>Vß¼1»<ãàøq—ýVÏüµ?û¶€>ªÿ‡£þÌ_ôSò�ªò5ðôÙ‹þŠoþP5OþF¯•?áÆ_õ[?òÔÿîÚ?áÆCþ‹gþZŸýÛ@UÃÑÿf/ú)Ÿù@Ôÿù¿ ooŠ>øÑûXøçÆ^
Ôÿ¶<7©ý‡ì—¿g–3Ë°·‰þIU\aãqÊŒã#‚
}©ÿ2ÿªÙÿ–§ÿvÑÿ2ÿªÙÿ–§ÿvÐê­Q@Q@Q@óÿÅÛÛàOÁê~
ñ—Ž±¼I¦ù_k²þÈ¿ŸËó"ISçŠC”‘qœE~+~Á?|1ð_ö±ð7Œ¼e©ÿcøoLûwÚï~Ï,þ_™aq|‘+9ËÈƒ…8ÎOšý)ÿ‚­~Ô¿f³ð»þÇ‰¿áþÚþÔûú­×�äý“Êÿ_íÇ›'ÝÆwsœ}ûüQñ?Æ�Ù;ÀÞ2ñ–§ý±âMOíßk½û<Pyž]ýÄIòDªƒ	g<’kó[þ
+µûQü1ý¥?áWÂ¸ñ7ü$_Ø¿ÚŸoÿ@ºµò|ï²y_ëâMÙò¤û¹ÆÞq‘Ÿ€(ú(ý½¾(øŸà¿ì�ãŸx7SþÇñ&™ö²^ýž)ü¿2þÞ'ù%VC”‘Ç*qœŽ@5óÿü—ö£ø�ûJŠ?ð±üMÿ	ö/ö_Ø?Ð-m|Ÿ;í~oúˆ“v|¨þöq·ŒdçÕ¿áèÿ³ýßü jŸü�^©ð3ö¤øcûJmÿÂ¸ñ7ü$Ø¾GÛÿÐ.­|Ÿ;Ìò¿×Ä›³åI÷s�¼ã# ­\§Å/…¾øÓàMOÁ¾2Ó?¶<7©y_k²ûD°yž\©*|ñ2¸ÃÆ‡†ÆA"¼«â�ííð'à¿Žõ?øËÇ?ØÞ$Ó|¯µÙd_Ïåù‘$©óÅ!ÊH‡†8Î"¼ö¤ý©>~Ú?|Mðoàß‰¿á1ø‘â_²ÿeh¿`º±ûOÙî¢º›÷×QE
+m†ÞWùÜgnX€@<§öçÿ�kÿÂÿãÿëþ?¶ÿoÌSíŸcû?Ù¿ãûÎòö}®ãý^Üïù³…Çæ·Å/Š^'øÑã½OÆ^2Ôÿ¶<I©y_k½û<Pyž\I|‘* ÂFƒ…ÆO$šý~ÿ‚RþËŸ¿f¿øZ?ð±ü3ÿïö×ö_Ø?Óín¼ï'í~oú‰_n<Øþö3»ŒàãèŠ?··ÀŸ‚þ;Ôüã/ÿcx“Mò¾×eý‘?—æD’§Ï‡)"ã88 Šåá×³ý/ü¯êŸü“Gü:ãöbÿ¢eÿ•ýSÿ’kªý½¾xŸãGì�ãŸø7LþØñ&§ö²Y}¢(<Ï.þÞWùåeA„�Ï,3ŒHùÿ¸ý§è™ÿåLÿäšýTÿ‡\~Ì_ôL¿ò¿ªòM~×UñKáo‰þøïSðoŒ´Ïìi¾WÚì¾Ñþ_™JŸ<LÈr’!áŽ3ƒÈ"½Wö	ø£á�‚ÿµ��¼eã-OûÃzgÛ¾×{öygòüËˆ“ä‰YÎ^D)ÆrxÐÐðJ_Ùsá�í)ÿGþ?†á"þÅþËûú}Õ¯“ç}¯ÍÿQ*nÏ•ÞÎ6ñŒœþ¿|-ø[á�‚ÞÓ<àÝ3ûÃzo›öK/´K?—æJò¿Ï+3œ¼ŽycŒà`+óWöçÿ�“ÿÂÿãÿþÏ¶ÿoÌ/ìkû?Ù¿ã÷Éó7ý’ãý^í»>lesù­ñKáo‰þøïSðoŒ´Ïìi¾WÚì¾Ñþ_™JŸ<LÈr’!áŽ3ƒÈ"€?U?o_Ø+àOÁoÙ;Ç>2ðo�¿±üI¦ý‡ì—¿Ú÷óù~eý¼OòK;!ÊHã•8ÎG ðø%/ì¹ðÇö”ÿ…£ÿÃ?ð‘bÿeýƒý>ê×Éó¾×æÿ¨•7gÊ�ïgxÆN|«þqûNÿÑ3ÿÊþ™ÿÉ4Ã®?ißú&ù_Ó?ù&€?U?á×³ý/ü¯êŸü“]WííñGÄÿÿdïøËÁºŸö?‰4Ï°ý’÷ìñOåù—öñ?É*²¤Ž9SŒär£ö	ø]â‚ÿ²w�¼ã-3ûÄšgÛ¾×eöˆ§òüËû‰Sç‰™RD<1ÆpyWäü:ãö�ÿ¢gÿ•ý3ÿ’hÿ‡£þÓ¿ôS?ò�¦ò5~¿~Á?|Oñ£öNð7Œ¼e©ÿlx“SûwÚï~Ïg—q|‘* ÂFƒ…ÆO$šùÿþ	Kû.|NýšÿáhÿÂÇðÏü#ŸÛ_Ù`ÿOµºó¼Ÿµù¿ê%}¸ócûØÎî3ƒ�€à¨ÿò}Ÿîÿ¦»Jýþ¯Ïÿø*×íGñ;ök?¿á\x›þÏí¯íO·ÿ ZÝyÞOÙ<¯õñ>Üy²}Ügw9ÀÇ«ÁQÿäÄþ&ÿÜ3ÿN–•ò§üÇþkgýÁ?öþ€>Vÿ‡£þÓ¿ôS?ò�¦ò5{ÿìûzüvøÓûXøÁ¾2ñÏöÇ†õ/·}®Ëû"Æ3Ë°¸•>x WxÐðÃ8Áà‘_üQý½¾üñÞ§àßxçûÄšo•ö»/ì‹ùü¿2$•>x d9IðÇÁÁQû{|.ñ?Æ�Ù;Ç>
ðn™ý±âMOì?d²ûDPyž]ý¼¯óÊÊƒ	žXg�(çÿø*×íGñ;ökÿ…]ÿ
+ãÄßðŽÿmj}¿ýÖëÎò~Éå¯‰öãÍ“îã;¹Î>ÿ‡£þÓ¿ôS?ò�¦ò5ðë�Úwþ‰ŸþWôÏþI¯Ÿþ)|-ñ?Áê~
ñ–™ý�âM7Êû]—Ú"ŸËó"ISç‰™RD<1ÆpyPôýEPEPHzRÒüÿ‚£ÿÉö|Lÿ¸gþ›-+åZú«þ
+�ÿ'Ùñ7þáŸúk´®Sö	ø]á��µ��¼ã-3ûcÃzŸÛ¾×eö‰`ó<»‰Sç‰•Æ4<0Î0x$PWûþÃ?ðÚ?ð›Åmÿwü#_bÿ˜OÛ¾Óö�´Óx¶mò=ó»¶9ú§þd?è¶å©ÿÝµ÷ÿÀÏÙoá�ìØ5¿øWÿ„sûkÈûú}Õ×�äùž_úù_n<Ù>î3»œàcó[öõý½~;|ý¬|sàßøçûÃzoØ~Éeý‘c?—æX[Êÿ<°3œ¼ŽycŒàp ŠÿeÏ�ŸðÒŸ¼3ðãûoþßí¯µÄÏìŸjò|›YgÿU½7gÊÛ÷†7gœ`ýýÿ(^ôXáeÜû;û?ÿ|ß3íÿìmò¿‹wËêßµ'ì·ðÃö.øâoŒŸü3ÿwÄ�
}—û+Zû}Õ÷Ù¾Ñu¬ß¹º–X_t7§Î‡²0ÀùWñÏö£ø�ûJbÂÇñ7ü$Ø¾Ø?Ð-m|Ÿ;ËóÔD›³åG÷³�¼c' íIñÏþSã·‰¾#ÿbÂ;ýµöoø–}¯í^O“këv&ìù[¾èÆìsŒŸ¿¿á†?áÛñ‘ßð›ÂÅÿ„/þeŸì¯ì¿¶}³ýþ>|é¼½Ÿkó?Õ¶í›xÎáùY_þËŸµ'ÄÿÛGã·†~
|dñ7ü&?
üKö¯í]ì¶?iû=¬·PþúÖ(¦M³[Äÿ#ŒíÁÊ’ßß°ÏíËÿ
¡ÿ	°ÿ„'þïøF¾Ãÿ1_·}§íhÿ¦lÛö|îíŽ|«ö£ÿ‚SÃJ|uñ7ÄøZ?ðŽm}›þ%Ÿð�ý«ÉòmbƒýoÚ“v|­ßtcv9ÆOÕ_?eÏ†?³`Öÿá\xgþÏí¯#íÿé÷W^w“æyëå}¸ódû¸Îîs��ÍoÛ×öõøíð[ö±ñÏƒ|ãŸì
é¿aû%—öEŒþ_™ao+üòÀÎrò9åŽ3�À€?JjOŽðÍŸ¼Mñûþ?ì_³Ä³íeó¼ë¨ ÿY±öãÍÝ÷NvãŒä|à¹˜ãþŸþ]ýÅ^Uû.~ÔŸÿmŽÞø5ñ“Äßð˜ü7ñ/Ú¿µt_°ZØý£ìö²ÝCûëX¢™6ÍoüŽ3·*H'ükö\øcû5ÿÂ®ÿ…qáŸøG¶¿µ>ßþŸuuçy?dò¿×ÊûqæÉ÷q�Üç*þÔŸÿá¥>;x›â?ö'ü#¿Û_fÿ‰gÚþÕäù6±Aþ·bnÏ•»îŒnÇ8Éûÿþe�ù­Ÿùj÷m~U×ôQû{|Qñ?ÁÙ;Ç>2ðn§ý�âM3ì?d½û<Sù~eý¼OòJ¬‡)#ŽTã9€h”ý†aŸøbÿøM¿â¶ÿ„ÇþO±Ì'ì?fû?Ú?é¼»÷}£Û{ç�*ý¨ÿà”ßðÒŸ|Mñþ�ü#ŸÛ_fÿ‰gü#ÿjò|›X ÿ[ö¤ÝŸ+wÝÝŽq’Á)j?‰ß´§ü-øXþ&ÿ„‹ûû/ìè¶¾O�ö¿7ýDI»>T{8ÛÆ2sà·¯íëñÛà·ícãŸø7Ç?ØþÓ~ÃöK/ì‹ü¿2ÂÞWùå�œåäsËg€~”þÔŸÿášþø›â?ö'ü$_Ø¿eÿ‰gÚþËçy×QAþ·cíÇ›»îœíÇÈò¯Øgöæÿ†Ñÿ„Ûþ(ŸøC¿áûüÅ~ÝöŸ´}£þ˜Å³oÙýó»¶9_ø*?ü˜ŸÄßû†éÒÒ¿¾~ÔŸ¿f¿í¿øW&ÿ„sûkÈûú­×�äùžWúøŸn<Ù>î3»œà`úRâ¾ý—?à«_ðÒŸ¼3ðãþwü#ŸÛ_jÿ‰Ÿü$jò|›YgÿUöTÝŸ+oÞÝžqƒðü=ö�ÿ¢™ÿ”
3ÿ‘¨ÿ‚\Éö|2ÿ¸ŸþšîèõOöæý¹¿á‹¿á	ÿŠ'þøI~Ûÿ1o°ý›ìÿgÿ¦ïÝö�lmïž>Vÿ†ÿ‡”ÆGÂmÿ
+ëþOù–¿²¿µ>Çö?ôøùó¡ó7ý“ÌÿV»wíçnâŸð\ïù¢÷ÿÛ
+ú¯þ	qÿ&'ðËþâút» Tý©>ÃIü	ñ7Ã�í¿øG¶¾Ëÿ?²}«Éòn¢ŸýVôÝŸ+oÞÝžqƒðü¡{§ü^øY?÷þÎþÏÿÀŸ7Ìûû|¯âÝòý«û{|Qñ?ÁÙ;Ç>2ðn§ý�âM3ì?d½û<Sù~eý¼OòJ¬‡)#ŽTã9€kâ¯Øcþ6Oÿ	¿ü4wü\_øC>Åýƒÿ0¿±ý¯íiÿ�'ÌßöKõ›¶ìùq–ÈÀ?µ'Ç?øiOŽÞ&ø�ý‰ÿïö×Ù¿âYö¿µy>M¬P­Ø›³ånû£±Î2¥:þu¿oo…Þø/ûXøçÁ¾
Ó?±ü7¦}‡ì–_h–/Ì°·•þyYœåäsËg€E4˜¯À/ø*?üŸgÄÏû†é²Ò¿M~ÁQÿäû>&ÿÜ3ÿMv”ûýEPEPHiiJüÿ‚£ÿÉö|Mÿ¸gþší+÷ú¿à¨ÿò}Ÿ?îÿ¦ËJýýÍy_Ç?Ú�á�ì×ý‰ÿÄßðŽmyÿ`ÿ@ººó¼Ÿ/ÍÿQíÇ›ÞÆwqœu_~)xcãO�4Ïx7SþØðÞ¥æý’÷ìòÁæyr¼OòJªãŽTgüÖÿ‚æž~	ÿÜoÿl+Ê¿eÏø*×ü3_ÀŸü8ÿ…]ÿ	ö/Ú¿âgÿ	Ù|ï:êYÿÕ}•öãÍÛ÷ŽvçŒà|ÿûüQðÇÁÚÇÀÞ2ñ–§ý�á½3íßk½û<³ù~e…ÄIòD¬ç/"ã9<kõûþ�û1ÑLÿÊ§ÿÈÕò¯ü8Ëþ«gþZŸýÛGü8Ëþ«gþZŸýÛ@UÿÃÑÿf/ú)¿ù@Õ?ù¿ ?`ŸŠ>ø/ûXøÆ^2Ôÿ±ü7¦}»íw¿g–/Ì°¸‰>H•œåäAÂœg'€M}©ÿ2ô[?òÔÿîÚü¬ Õ?ÛŸþ6OÿGü3�ü\_øC>Ûý½ÿ0¿±ý¯ìÿfÿ�ß'ÌßöK�õ{¶ìù±•Ï«~ËŸµÃØ»àO†~
|eñ7ü!ß<5ö¯í]ìWßfûEÔ·PþúÖ)a}ÐÜDÿ#œnÁÃ”ÿÁ¹ÿ…ÙŸú‚íý|­ÿGÿ“ìø™ÿpÏý5ÚPÍ#þ	_ûKj¥µ­Ç€­ô¸&�$—·zåƒE'—qÎäöU� 5ôŸðJ¯…>oìïü~Ž-r Ô–*ÄýJ•2³ÝpO\à~�|i×¯<3ð§Åz–Ÿ)·¾·Óåhf^±¹\ã9Jü¾wgvfbìÄ–f9,OROs_W’ä«5Œç9ò¨é¡ù÷qDòÓ¥Jš”¤›×d�¹ÿfÝkáWìáð_Ã¿ì>"Ùk6š7Ú6_\‘’y×2Îr£ `ÊGá_3þÍß±×Á/ÙÃãG‡~"iÿN³w£}§e�Í¼qÇ'�m,,§#R
+òê+éÿÕ?üýr>þ"63þ|GïgÓ¿¶gÂŸƒß¶Gü!ÿÚ¿aðçü#Ÿlò¾ÇMç}£ÈÎíÄco�1�ïW¦~ÍÚ×Â¯ÙÃà·‡~Ø|E²Öm4o´ì¾¹"9$ó®eœåF@Á”�Â¾¢�õCÿ?_Üƒþ"63þ|GïgéªþÐß
�Àÿ„ÏI\ÿÎ©<Æ¾?ÿ‚§~Íÿj+…Sü0ðúxª
)u7»–-FÖÝQgfÒ pÂ'9\ôçðªúƒàÏÇ;ïƒ?²ŸÄO\YÉâ+o	Ëö›]1î|€QÂf%“kì]ÌÍ÷O$ú×…œpôrì?·§6õ³¹õ|7Æ3œgÕ+ÒQm6šo§{Ÿ‹Ÿ¾xŸà¿Žõ?øËLþÇñ&›å}®ËíOåù‘$©óÄÌ‡)"ã8<‚+Õ`ŸŠ>ø/ûXøÆ^2Ôÿ±ü7¦}»íw¿g–/Ì°¸‰>H•œåäAÂœg'€M}©ÿ1ÿ'ÿŒ�ÿ„Ûþ×ü&ó-ej}�ìèñóçCæoû'™þ­vïÛÎÝÇò²¾(ýDþ”¾~ÔŸi1­ÿÂ¸ñ7ü$Ø¾GÛÿÐ.­|Ÿ;Ìòÿ×Ä›³åI÷s�¼ã#?šß·¯ìñÛãOícãŸx7ÀßÛÔ¾ÃöKßí{<Ï.ÂÞ'ù%�\aãqÊŒã#‚
xì1ûsÃÿÂmÿWü&?ð’ý‹þb¿aû7ÙþÑÿL%ß»íØÛß<~Ô~Ë¿á¤þøgâ?ö'ü#¿Û_iÿ‰gÚþÕäù7RÁþ·bnÏ•»îŒnÇ8Éø¯öõý½~üiý“¼sàßøçûcÄš—Ø~Éeý‘™åßÛÊÿ<°*$nyaœ`r@¯Ío�Ÿ²ßÄïÚSûoþÇ†á#þÅò>ßþŸkkäùÞg•þ¾TÝŸ*O»œmçûÿþe�ù­Ÿùj÷mò…ïú¬_ð²îý�ýŸÿ�>o™öÿö6ù_Å»åûSö	ø]â‚ÿ²w�¼ã-3ûÄšgÛ¾×eöˆ§òüËû‰Sç‰™RD<1ÆpyWæ·ì¹û-üOý‹¾;xgã/ÆOÿÂðßÃ_jþÕÖ¾ßk}öo´ZËkîme–gÝ5ÄIò!Æìœ($~©þËÿá¤þøgâ?ö'ü#¿Û_iÿ‰gÚþÕäù7RÁþ·bnÏ•»îŒnÇ8É?j?�ŸðÒ¼MðàkðŽÿm}›þ&dûW“äÝE?ú½é»>Vß¼1»<ãàÛŸþ6OÿGü3�ü\_øC>Ûý½ÿ0¿±ý³ìÿfÿ�ß'ÌßöK�õ{¶ìù±•Ïæ·Å/…¾'ø/ã½OÁ¾2Ó?±üI¦ù_k²ûDSù~dI*|ñ3!ÊH‡†8Î Šý*?ñ¥ÿú¬_ð²îý�ýŸÿ�>o™öÿö6ù_Å»å?á†?áåñ‘ßð›Âºÿ„Óþe¯ì¯íO±ý“ýþ>|è|Íÿdó?Õ®ÝûyÛ¸€~ªQEQEQEóÿÅØ'àOÆ�ê~2ñ—�¿¶|I©y_k½þ×¿ƒÌòâH“äŠuA„�
+3Œœ’M~@ÿÃÑÿißú)Ÿù@Ó?ù¿«ùÖý‚~(øcà¿ícàoxËSþÇðÞ™öïµÞýžYü¿2Ââ$ù"Vs—‘
+qœž4Êüsý©>'~ÒŸØŸð±üMÿ	ö/Ÿöô[_'Îòüßõ&ìùQýìãoÉÏ•Wô¥ð3ö£øcûJ
oþÇ‰¿á#þÅò>ßþ�ukäùÞg•þ¾$ÝŸ*O»œmçüWÿ‚£ÿÉö|Mÿ¸gþší(ÿ‡£þÓ¿ôS?ò�¦ò5}ýÿ¥ý¨þ'~ÒŸð´ácø›þ/ì_ì¿° ZÚù>wÚüßõ&ìùQýìãoÉÏÚ¿¾)xcà·�5?xËSþÇðÞ›å}®÷ìòÏåù’¤IòD¬ç/"ã98šå~~ÔiOí¿øW&ÿ„�ûÈûúÕ¯“çyžWúø“v|©>îq·œddóWöõý½~;|ý¬|sàßøçûÃzoØ~Éeý‘c?—æX[Êÿ<°3œ¼ŽycŒàp¯Íjþª+å_øz?ìÅÿE7ÿ(§ÿ#PÊŸðCù­Ÿ÷ÿÛúù[þ
+�ÿ'Ùñ3þáŸúk´¯Ú��Ÿµ'ÃÚSûoþÇ‰¿á#þÅò>ßþ�ukäùÞg•þ¾$ÝŸ*O»œmçå~(þÞß~øëSðoŒ¼sý�âM7Êû]—öEüþ_™JŸ<P2¤ˆxcŒàà‚(¶ý¡¿äŠøÓþÁïý+ó?½ÿ˜ðùñgìóñ—EY|ƒ¨jv6¾iÙ½
+îÇ|g5ô–·ðSÀú›^E¥h­¦Ÿ
ø–ÃI¹vº–C¨Á+Â¯»'ämÒ·+Ùzó�÷|;™ÒÀÒœ*&îï§NŸ‹?#ãL–¾gˆ§V”’å�µêîÞž‹SäüqFy¯«üðÂ¾mr[}7Ì´mgKK<éŽgÏwrw#Œœ‘¸sWõ¯€^_�š~ŽÞM#ÃV¶WZ‡™¢ó6¤±ˆVBÅ£
+òãüÃ5õKˆ°ÒI¨½Ÿn‰��ÏçÂÊrp”•ÓK¯VÕöÛKŸ âŒWÔ1üð÷Ž¼Wð«]Òt!¥é>!Šk­KK…ÚH�A‚qžpÙ�Ž£¹­-cöiƒPø©¥ëði1èÞx!Ôol.R[p±î’‹9ä 
Ž›Ï¥_úÁ…M)¦�›×ºm[×C7Âxæœ©ÚK™-/³Ióz+«Ÿ&cšõCþLãçýqOçzv·ðÂþÑ^³Ô¬N�áMvÂ;Ë]>LÀ<â›|†ç*KHÎIlw¯oø¢Ï ¯‹¬æð”>dº‡vÓ™¢”mâdrCtãû§¾Ex9îiO‚TàŸ¼”ºwµ¿ÎÇÖðžG[šºµ$½×(Ù_²wòNú_sñáíëñÛà·�4Ïø7Ç?ØþÓ|ß²YdXÏåù’¼¯óË9ËÈç–8Î¿_á×³ý/ü¯êŸü“_þÞ?°WÇo�?µwŽ<eàßlxoRe½þ×°ƒÌòì-â’YÕÆ7¨Î28 ×èííð»Äÿ?dïø7ÁºgöÇ‰5?°ý’ËíAæywöò¿Ï+*$nyaœ`r@¯ÍOÜÎWþqû1Ñ3ÿÊþ©ÿÉ5ïÿ~øcà·�4Ïø7LþÇðÞ›æý’ËíÏåù’¼¯óÊÌç/#žXã8
+ø«þ	Kû.|NýšÿáhÿÂÇðÏü#¿Û_Ù`ÿOµºó¼Ÿµù¿ê%}¸ócûØÎî3ƒ�€à¨ÿò}Ÿîÿ¦»J?áèÿ´ïýÏü iŸü�_TþÃñ²�øM¿á£¿ââÿÂö/ìù…ý�íhûOüxùfÿ²[ÿ¬Ý�Ÿ.2ÙüÖø[ð·Äÿ<w¦x7ÁºgöÇ‰5/7ì–_hŠ3Ë‰åžVTHÜòÃ8Àä�_¯ßðJ_Ùsâwì×ÿGþ?†áþÚþËûú}­×�äý¯ÍÿQ+íÇ›ÞÆwqœ}«ð·áo†>xLðoƒtÏì
é¾oÙ,¾Ñ,þ_™+Êÿ<¬Îrò9åŽ3�€¯ÂÏøz?í;ÿE3ÿ(gÿ#W¿þÞ¿°WÇo�?µ�Ž|eàßlxoRûÙ/µì`ó<»xŸä–uq‡�Ç*3ŒŽ5ù­@ª°Çül£þoøhïø¸¿ð†}‹ûþacû_Ú>Óÿ>G™¿ì–ÿë7cgËŒ¶J¾ü-ðÇÁoiž
ðn™ý�á½7Íû%—Ú%ŸËó%y_ç•™Î^G<±Æp0ùÿ¥ý¨þþÍð´ácø›þßí¯ì¿° ]]yÞOÚüßõ>Üy±ýìgwÁÇÏÿ··Å|hý¬|sã/êÛÔþÃöKß³Ë™åØ[Äÿ$ª®0ñ¸åFq‘Á€?¢š(¢€
+(¢€
+CÒ–Šøö£ÿ‚­Ã5üuñ7Ã�øUßð‘ÿbý›þ&ð�}—Îó­bŸýWÙ_n<Ý¿xçnxÎâµE`Ÿ�?<w©øËÆ^þÙñ&¥å}®÷û^þ3Ë‰"O’)Õ4(Î2rI5ÊÿÃ®?f/ú&_ù_Õ?ù&€?*ÿaŸÛ›þ¿þoø¢á1ÿ„—ì_óûÙ¾Ïö�úa.ýßhöÆÞùãêŸøaŸøyGüdwü&ßð®¿á4ÿ™kû+ûSìcÿ@ÿ�Ÿ:3Ù<Ïõk·~Þvî>WÿZý—>þÍð«¿á\xgþÏí¯íO·ÿ§Ý]yÞOÙ<¯õò¾Üy²}Ügw9ÀÇ€|.ý½¾;|ð&™àßøçûÃzo›öK/ì‹	ü¿2W•þy`g9yòÇÀÀPî—íIð3þOàO‰¾mÿÂ;ýµöoø™ý“í^O“uÿê·¦ìù[~ðÆìóŒ*ý†aŸøbóãoø­¿á1ÿ„—ì_ó
+ûÙ¾Ïö�úm.ýßhöÆÞùã«ý½¾(øŸà¿ì�ãŸx7SþÇñ&™ö²^ýž)ü¿2þÞ'ù%VC”‘Ç*qœŽ@5ùÿGý§è¦åLÿäjýýÍ5¿²ßÀÏøiOŽÞøqý·ÿïö×ÚâgöOµy>M¬³ÿªÞ›³åmûÃ³Î0}Wþ�ûNÿÑLÿÊ™ÿÈÕúýð»ö	øð_ÇzgŒ¼àoìoi¾oÙ/µïçòüÈž'ù%��å$qÊœg#@§ì1ûÿÃÂmÿ¯ü&?ð’ý‹þa_aû7ÙþÑÿM¥ß»íØÛß<~VÁQÿäû>&Ü3ÿM–•ûûŠðŠ?°OÀŸ�;Ôüeã/lø“Rò¾×{ý¯™åÄ‘'Éêƒ	g9$šø[þ	e«Ýxöbøå©ÙIå^YÞÚ\C&3µÖ2Êqß�+Ú¼GûPCªý—û7Ã)¤5Æ¯k¬ë%oO¶Ë	Br¿ >Z¨síZÏìßðëöqøñ#OøwáïøG­5+O>î?·\ÜùŽ£jœÏ#‘€HÀÅ|3_¡ðÎ‹¥9Ö�Ú¡øÇf˜¼&•<<¬¥t]ÿÞ‡ºê¿´Üº¿‡õ*}!š)üBšÝ»œ˜#9‡yùƒ|ßítãcRý¦tÑñ6ÓÆÚO„ÃR‘^PI|Ò‹èYýÐ®Àr$ûøö+%Á-¡ß«ë¿_#óGÄ™”·©}º.—·O7òÐ÷¹ÿj‰´¹„~ðô:-�ž”ú^—\™M˜vVyrWçbQ0M¼ç&°t¿ÚöÇán±áÉm^ç^¾y‘ué&ÌËÌ�4d‘¹‹l#;»�Jò**–O‚Š²‡T÷}?¯™3â,Êræuz5²µžú~O§CØã¥�‹,<7iãßc$Ñ-ßÛž	fGÆí^Jí^sÎ9ä’}®Ïö¨“Døñ#â:øi%±ð¤Ei£-éF–%
+yÊ±Ý—<í<Áê~4¯«ÿe_è_þ	øûÂ¾&±þÓÐuK¨à»´ó¤‹ÍMªq¾6V�È"¾sˆ²ü=«N6ié«²»ÖËcíx77Æb³HÐ«+¦�ôWvVW{»:¯ü0(Çü)?üºÿûŠ¿@?jOŽðÍŸ|Mñûþ/ì_²ÿÄ³íeó¼ë¨ ÿ[±öãÍÝ÷NvãŒäyRÿÁ.¿f6POÃ<Ÿûêü“KÿGÿ“ø›ÿpÏý:ZWå‡ïâ~Ã?·7ü6�ü&ØðWü!ßð�}‡þb¿nûOÚ>ÑÿLbÙ·ìþùÝÛùWíGÿ¥ÿ†”øíâoˆÿð´áþÚû/üK?áûW“äÚÅúßµ&ìù[¾èÆìsŒŸÊÏ�Ÿµ'ÄïÙ¯ûoþÇ‰¿áþÚò>ßþ�kuçy>g•þ¾'Û�6O»Œîç8õ_øz?í;ÿE3ÿ(gÿ#P•~Ëÿá›>;xgâ?ö'ü$_Ø¿iÿ‰gÚþËçyÖ²Áþ·cíÇ›»îœíÇÈûûþ›�ù¢ùuÿ÷u·¯ìð'à·ì�ãŸx7ÀßØþ$Ó~ÃöKßí{ùü¿2þÞ'ù%��å$qÊœg#�
~@ÐêŸü?4ÑÿË¯ÿ¸«Êÿj?ø%/ü3_ÀŸ|Gÿ…£ÿ	ö/ÙâYÿÿÙ|ï:ê(?Öý©öãÍÝ÷NvãŒä|_ÓïÅ/…¾øÓàMOÁ¾2Ó?¶<7©y_k²ûD°yž\©*|ñ2¸ÃÆ‡†ÆA"€??a¯Øgþ?þoø­¿áÿ„kì_ó
+ûwÚ~Ñö�úoÍ¿g÷ÎîØçÊ¿jO�ŸðÍŸ¼Mðãûoþ?ì_²ÿÄÏìŸeó¼ëX§ÿU½öãÍÛ÷ŽvçŒà}ýûsÿÆµÿá	ÿ†qÿ‹uÿ	ŸÛ·¿æ)öÏ²}Ÿìßñýçy{>×qþ¯níÿ6p¸õoÙoö[øaûhü	ðÏÆOŒžÿ„ÇâG‰~Õý«­}¾êÇí?gº–ÖÜÚË)¶x“äA�¹9bIûþŠ( Š( Š)JZüÿ‚\Éö|2ÿ¸ŸþšîëïÿÚ�þ
+µÿ×ñ×Äß?áWÂGý‹öoø™ÿÂAö_;ÎµŠõ_e}¸óvýã�¹ã8ì¹ÿ¥ÿ†køíáŸˆÿð´á#þÅûWüK?áû/�çZËúßµ>Üy»¾éÎÜqœ€ª~9þÔf¿ìOøXþ&ÿ„sûkÏûúÕ×�äù~oúˆŸn<Øþö3»Œàã«ø[ñKÃ|	¦xËÁºŸöÇ†õ/7ì—¿g–3Ë•â’UWxÜr£8ÈÈ ×æ·ü3�øR÷ÿÛ
+ò¯Ùsþ
+µÿÕð+Ã??áWÂEý‹öŸø™ÿÂAö_;Îº–õ_e}¸óvýã�¹ã8?þÁ?|1ð_ö±ð7Œ¼e©ÿcøoLûwÚï~Ï,þ_™aq|‘+9ËÈƒ…8ÎOšý~ÿ‡£þÌXÿ’™ÿ”
Oÿ‘«ñ_ö[øÿ
'ñÛÃ??¶ÿáþÚûWüLþÉö¯'Éµ–õ[Óv|­¿xcvyÆªþÜß°Ïü1ü!?ñ[Âb|Kößù…}‡ìßgû?ý7—~ï´{co|ðû§ð·â—†>4øLñ—ƒu?í�
ê^oÙ/~Ï,g—+Äÿ$ª®0ñ¸åFq‘�A¯Ê¿Ø+ö
+øíð[ö±ð7Œ¼eàoì
é¿nû]ïö½Œþ_™aq|‘NÎrò áN3“À&¾Ôÿ‚\øÁO†÷ÿÓ�Ý}U�@•ð\ÞáIÿÜoÿl+âÏ…ß°OÇo�Ó<eàßlxoRó~É{ý¯a™åÊñ?É,êãŽTgý}ý¹ÿaŸømàŸø­¿áÿ„kí¿ó
+ûwÚ~ÑöúoÍ¿g÷ÎîØçå_ønqÿØÿŒqÿ„'þ/ü!ó2ÿjÿeý³íŸéÿñíäÍåìû_—þ±·lÝÆí ô7öƒ�¤ø+ãm£;tÙ½•FIü'ð¯ÌÃ^ßû7ÿÁUWö“øÙáÿ‡Oð¬h�ëit’^x]„X­eœ�(Ú lˆ¶ýá÷»ô®«ãWÃ€_õ{[Ÿ|D—À�êÍ+ZXÝ)tù6ù‚2P¶õà“÷¸8¯µáüã—FtëßW{­OË¸Ã†ñ™ÍJUð–n)¦›·[Ÿ3Q^£ý¡û*ÿÑ}·ÿ¿Gÿ�×¦xÇöyøKðÿÃ—šÿˆ¾$Ýi:5¦Ï>òâ=Î¨¹Â÷fQø××ÿ¬ùwó?¸üçýEÎ¿’?ø>b¢½GûCöVÿ¢ûoÿ~�ÿ£íÿ²°ÿšûoÿ~�ÿ£ýgË¿™ýÁþ¢ç_Éü	]_gþÃ
+áñKà•þÑDÏlùjHüˆüë&?Ùáû°ÆÚ™óåÀ�¿¡þF¾�ø}á­ÂzŸ‡ü3dÖš5±ÞÒÊ™pç»É$õ'ÐWÎg¹î…ö.Ûk¥¶>Ó…8S•ãþ·‹²I4’w»gâüþO§â_ÓLÿÓ]¥~êüRø¥á�‚ÞÔüeã-OûÃzo•ö»ß³Ë?—æJ‘'É³œ¼ˆ8SŒäàkâ¯Ú‹þ	Iÿ
'ñÓÄßÿáhÿÂ9ýµö_ø–Â?ö¯'ÉµŠõ¿jMÙò·}Ñ�Øç?+~ÔðU¯øiO�>&øqÿ
+»þßí¯³ÄÏþµy>MÔSÿªû*nÏ•·ïnÏ8ÁüøýŒýSøûR|1ý¥?¶ÿá\x›þ?ì_#íÿèV¾O�æy_ëâMÙò¤û¹ÆÞq‘žWâ�ííð'à¿Žõ?øËÇ?ØÞ$Ó|¯µÙd_Ïåù‘$©óÅ!ÊH‡†8Î"¾+ÿ‚ñÿ³Óþ$Ÿû_*ÿÁQÿäúþ&Ü3ÿM–”ÊüQý‚~;|ð&§ã/xûÃzo•ö»ßí{	ü¿2T‰>H§g9yp§ÉÀ×¿ÿÁ)j?†?³_ü-øXþ&ÿ„sûkû/ìèW^w“ö¿7ýDO·l{ÝÆpp~ÔðU¯øiO�^&øqÿ
+»þÏí¯²ÿÄÏþµy>MÔSÿªû*nÏ•·ïnÏ8Áò¯Øköÿ†Ñÿ„Ûþ+oøC¿áûüÂ¾ÝöŸ´}£þ›Å³oÙýó»¶9ýTÿ‡£þÌ_ôSò�ªò5|ÿûzþÞ¿~4þÉÞ9ðoƒ|sý±âMKì?d²þÈ¿ƒÌòïíåžX7<°Î09 Wæ·íIð3þ¯ã·‰¾mÿÂEý‹öoø™ý“ì¾w�kÿê·¾Üy»~ñÎÜñœ¿ÿáÆXÿšÙÿ–§ÿvÐå_zý~ý‚¿o_�?¿dïx7Æ^9þÇñ&›öïµÙd_Ïåù—÷§Ï‡)"ã8<‚+”ÿ‡ÕlÿËSÿ»kàÚ“àgü3gÇo|8þÛÿ„‹ûì¿ñ3û'Ù|ï:Ö)ÿÕo}¸óvýã�¹ã8Ò�Q@Q@Q@?üQý‚~ühñÞ§ã/xûgÄš—•ö»ßí{ø<Ï.$‰>H§THÐp£8ÉÉ$×ÐóÿÅÛÛàOÁê~
ñ—Ž±¼I¦ù_k²þÈ¿ŸËó"ISçŠC”‘qœE}@•ð\î¿ÿî7ÿ¶Õ~Á_°WÀŸ�?²w�¼eã/lx“RûwÚïµïàó<»ûˆ“äŠuA„�
+3ŒžI5ö¯Ç?Ú�á�ì×ý‰ÿÄßðŽmyÿ`ÿ@ººó¼Ÿ/ÍÿQíÇ›ÞÆwqœu_~)xcãO�4Ïx7SþØðÞ¥æý’÷ìòÁæyr¼OòJªãŽTgø¯ö¤ý–þ~Åß|Mñ“àß†áø‘á¯²ÿek_oº¾û7Ú.¢µ›÷7RËî†âTùÐãvF?*þ9þÔ¿iOìOøXþ&ÿ„�ûÏûú­¯“çy~oúˆ“v|¨þöq·Œdçö§þ�û1ÑMÿÊ©ÿÈÕò§íÏÿ'ÿ„'þÇþ./ü!ŸmþÞÿ˜_Øþ×ö³Ç÷‘æoû%Çú½Ûv|ØÊäâÏ…ß··Ço‚þÓ<àßÿcxoMó~Éeý‘a?—æJò¿Ï,ç/#žXã8
+þŠ+àÙoö¤øaû|	ðÏÁ¿Œž&ÿ„;âG†¾Õý«¢ý‚êûìßhº–êßZÅ,/ºˆŸäs�Ø8`@÷ÿ…ß··ÀŸ�;Ó<àßÿlø“Ró~Éeý‘™åÄò¿Ï,
+ƒ	žXg$
+ùÿþ
+·ûQüNýšÿáWÂ¸ñ7ü#¿Û_ÚŸoÿ@µºó¼Ÿ²y_ëâ}¸ódû¸Îîs�…ý–ÿe¿†¶�ÀŸüdøÉáŸøL~$x—í_Úº×Ûî¬~Óö{©maýÍ¬±B›a·‰>DÛ“–$”ÿ‚­~ËŸ¿iOøUßð®<3ÿ	ö/ö§ÛÿÓím|Ÿ;ìžWúùSv|©>îq·œdgòâ—ÂßüñÞ§àßiŸØþ$Ó|¯µÙ}¢)ü¿2$•>x™�å$CÃg�Eþ(ø›àÇŽ´ßø;R?ˆôß7ì·¿gŠ/Ì‰â’Ud9Ir§ÈÁ×Mñ·ö›ø•ûF6ŽßüF<@t�;ìDXZÚù^nÏ3ýDI»>T{8ÛÆ2såõê¿?eÏ‰ß´§ößü+�ÿÂGý‹ä}¿ý>Ö×Éó¼Ï+ý|©»>TŸw8ÛÎ22åDæ¾ðý•?hˆ¶7ÇÏü ø½¯/‹>ø�í_Úš:Ø[X›�³ÚÍuï­£ŽTÛ47Êã;pr	ãŸŠ_|Oð_ÇzŸƒ|e¦cø“Mò¾×eöˆ§òüÈ’TùâfC”‘qœAûýû{|.ñ?Æ�Ù;Ç>
ðn™ý±âMOì?d²ûDPyž]ý¼¯óÊÊƒ	žXg�(óWþ
+±û-ü2ýšáWÿÂ¸ðÙð÷ö×ö§Ûósuçy?dòÿ×HûqæÉ÷q�Üçýû~Áþ5~ÊñŸŒ¼Ú¿‰5/·}ªôj÷Ðyž]ýÄIòG2 ÂFƒ€3ŒžI5ËþÃñ­øM¿á£¿âÝÂgö/ìùŠ}³ìŸhûOüxùþ^ÏµÛÿ¬Û�ÿ.pØú«þ�û1ÑMÿÊ©ÿÈÔ­ûxø³Vø%û(øçÆž»]ÄºgØ~ÉzmâŸËó/íâ’Ud9Ir3‘È¿$!ÿ‚Ÿ~ÓãüI=�¦ò5s_`ŸŽßü	©øËÆ^þÆðÞ›å}®÷û^Â/Ì•"O’)ÙÎ^D)Ærp5Ê|ý–þ'~ÒŸÛð®<3ÿ	ö/‘öÿôû[_'Îó<¯õò¦ìùR}Üão8ÈÈªÿÃÑÿißú)Ÿù@Ó?ù¹OØ'áw†>4~Ö>ðoŒ´Ïí�
ênû]—Ú%ƒÌòì.%Ož&WxÐðÃ8Áà‘^UñKáo‰þøïSðoŒ´Ïìi¾WÚì¾Ñþ_™JŸ<LÈr’!áŽ3ƒÈ"¿u?à¨ÿòbîÿ§KJùSöçÿ�lÂÿãÿëþ?¶ÿoÌSíŸdû?Ù¿ã÷Îòö}®ãý^ÝÛþláqêß²ßì·ðÃöÑøáŸŒŸ<3ÿ	�Ä�ý«ûWZû}Õ�Ú~Ïu-¬?¹µ–(Sl6ñ'Èƒ;rrÄ“å?ðC/ù­Ÿ÷ÿÛúåo_Ø+ã·ÆŸÚÇÇ>2ðo�¿¶<7©}‡ì—¿Úö0yž]…¼OòK:¸ÃÆã•ÆGüÖ¯UøûQüNýšÿ¶ÿá\x›þÏí¯#íÿè·^w“æy_ëâ}¸ódû¸Îîs�ŽSáoÂßühñÞ™àßéŸÛ$Ô¼ß²Y}¢(<Ï.'•þyYPa#sËã’}ÿ¸ý§è™ÿåLÿäšùÿâ—Å/ühñÞ§ã/jÛ$Ô¼¯µÞýž(<Ï.$‰>H•Pa#AÂŒã'’M}ÿGý§è¦åLÿäjûÿö[ý©>~Åß|3ðoã'‰¿áø‘á¯µjè¿`º¾û7Ú.¥º‡÷Ö±Kî†â'ùãv=Wþ�û1ÑMÿÊ©ÿÈÔå?ðJ_Ú�âwí)ÿGþ?‰¿á#þÅþËûú­¯“ç}¯ÍÿQnÏ•ÞÎ6ñŒœüÿGÿ“ìø›ÿpÏý5ÚWíGÀÏÚ�á�í)ý·ÿ
+ãÄßð‘ÿbùoÿ@ºµò|ï3Êÿ_nÏ•'ÝÎ6óŒŒþ+ÿÁQÿäû>&ÿÜ3ÿMv”ûýEPEPHzRÒ”ðíGÿ¦ÿ†”øëâoˆÿð´áþÚû7üK?áûW“äÚÅúßµ&ìù[¾èÆìsŒ•ý—?à«_ðÒŸ|3ðãþwü#ŸÛ_jÿ‰Ÿü$jò|›YgÿUöTÝŸ+oÞÝžqƒóÿíëûzüvø-ûXøçÁ¾
ñÏö?†ôß°ý’Ëû"Æ/Ì°·•þy`g9yòÇÀà_|-ø¥â‚þ;Ó<eàÝOûÄšo›öKß³Å?—æDñ?É*²¤Ž9SŒär Ý?Û›öÿ†Ðÿ„$ŸÂÿ×Ûæöï´ý£ìÿôÞ-›~Ïï�Ý±ÏÊßðÜÿðíøÇøBábÿÂÿ3/ö¯ö_Û>ÙþŸÿÞLÞ^ÏµùëvÍÜnÚ>Uÿ‡£þÓ¿ôS?ò�¦ò5}ÿû-þË?m�>øÉñ“Ã?ð˜üHñ/Ú¿µu¯·ÝXý§ì÷RÚÃû›Yb…6Ão|ˆ3·',I Sÿ1ÿªÙÿ–§ÿvÑÿ(^ôX¿ádÿÜû;û?ÿ|ß3íÿìmò¿‹wËö¯ííñGÄÿÿdïøËÁºŸö?‰4Ï°ý’÷ìñOåù—öñ?É*²¤Ž9SŒär¯Šÿa�øÙGü&ßðÑßñqáûöüÂþÇö¿´}§þ<|�3Ù-ÿÖnÆÏ—l€|ûQüsÿ†”øíâoˆÿØŸðŽÿm}—þ%ŸkûW“äÚÅúÝ‰»>Vïº1»ã'õOö\ÿ‚RÿÃ5üuðÏÄøZ?ð‘ÿbý«þ%Ÿð�ý—Îó­eƒýoÚŸn<Ýßtçn8ÎG«Ã®?f/ú&_ù_Õ?ù&¿*ÿáèÿ´ïýÏü iŸü�@¿�«ðþ
+�ÿ'×ñ3þáŸúl´£þ�ûNÿÑLÿÊ™ÿÈÕóÿÅ/Š^'øÑã½OÆ^2Ôÿ¶<I©y_k½û<Pyž\I|‘* ÂFƒ…ÆO$šûWö£ÿ‚RÿÃ5ü	ñ7ÄøZ?ð‘ÿbý—þ%Ÿð�ý—Îó®¢ƒýoÚŸn<Ýßtçn8ÎG•~Ã?·7ü1wü&ØðOü&?ð’ý‡þb¿aû7ÙþÑÿLeß»íØÛß<~éüRø[á��>Ôüã-3ûcÃz—•ö»/´K™åÊ’§Ï+Œ<hxaœ`ä+çÿøuÇìÅ�ù&ù_Ôÿù&€?ÿjOŽðÒŸ¼Mñûþßí¯³Ä³íjò|›X ÿ[±7gÊÝ÷F7cœdþ©þËŸðU¯øiOŽÞøqÿ
+»þßí¯´ÿÄÏþµy>M¬³ÿªû*nÏ•·ïnÏ8ÁüÖý½¾xcà¿ícãŸø7LþÇðÞ™ö²Y}¢Yü¿2ÂÞWùåfs—‘Ï,qœå_~)xŸà¿ŽôÏx7SþÇñ&›æý’÷ìñOåù‘<OòJ¬‡)#ŽTã9€hô§þ–3ÿ
+Oþãûa^Wû.Á)á¥>xgâ?ü-øG?¶¾ÕÿÏøGþÕäù7RÁþ³íI»>Vïº1»ã'Õ?a�øÙ?ü&ÿðÑßñqáûöüÂþÇöÏ´}§þ<¼Ÿ3Ù-ÿÖnÛ³åÆ[>WûQþÔŸÿbïŽÞ&ø5ðoÄßð‡|7ð×Ù²´_°Zß}›í±]Mûë¨¥™÷Mq+üîq»
+ªµ'ÀÏøi?�^&øqý·ÿïö×Ù¿âgöOµy>MÔSÿªÞ›³åmûÃ³Î0|«öý†á‹¿á6ÿŠÛþøI~Åÿ0¯°ý›ìÿhÿ¦ÒïÝö�lmïž:¿ÛÛâ�‰þþÉÞ9ñ—ƒu?ìiŸaû%ïÙâŸËó/íâ’Ud9Ir§Èä_�?ðôÚwþŠgþP4ÏþF þ
+�ÿ'×ñ3þáŸúl´¯Uý¨ÿà«_ðÒŸ|Mðãþwü#ŸÛ_eÿ‰Ÿü$jò|›¨§ÿUöTÝŸ+oÞÝžqƒõWì·û-ü0ý´~øgã'ÆOÿÂcñ#Ä¿jþÕÖ¾ßucöŸ³ÝKkîmeŠÛ
¼Iò ÎÜœ±$ú¯ü:ãöbÿ¢eÿ•ýSÿ’håOø!ŸüÖÌÔÿoëÕj?ø*Ïü3_Ço|8ÿ…]ÿ	ö/Ùâgÿ	Ù|ï:Ö)ÿÕ}•öãÍÛ÷ŽvçŒà}Uð3ö\øcû5ÿmÿÂ¸ðÏü#ŸÛ^GÛÿÓî®¼ï'Ìò¿×ÊûqæÉ÷q�ÜçŠÿðTù>Ï‰¿÷ÿÓ]¥yWì·ñÏþ¯ã·†~#ÿbÂEý‹öŸø–}¯ì¾w�k,ëv>Üy»¾éÎÜqœ�¿¿áù™ãþŸþ]ýÅ_•”PêŸü0Àÿ‚“ÿÆGÂmÿ
+ëþOù–¿²¿µ>Çö?ôøùó¡ó7ý“ÌÿV»wíçnâÃŒ¿ê¶å©ÿÝµñgÂïÛÛã·Áiž
ðoŽ±¼7¦ù¿d²þÈ°ŸËó%y_ç–s—‘Ï,qœu_ðôÚwþŠgþP4ÏþF Õ?Øgöÿ†.ÿ„Ûþ+oøLá$ûüÂ¾Ãöo³ý£þ›K¿wÚ=±·¾xü¬ÿ‚£ÿÉõüLÿ¸gþší(ÿ‡£þÓ¿ôS?ò�¦ò5}ÿû-þË?m�>øÉñ“Ã?ð˜üHñ/Ú¿µu¯·ÝXý§ì÷RÚÃû›Yb…6Ão|ˆ3·',I ÑEQEQE!é@ñGööøð_ÇzŸƒ|eãŸìoi¾WÚì¿²/çòüÈ’Tùâ��å$CÃg\¯ü=öbÿ¢›ÿ”
Sÿ‘«ò¯þ
+�ÿ'Ùñ3þáŸúl´¯ªáÆ?õ[?òÔÿîÚú¯þ�û1ÑMÿÊ©ÿÈÔÃÑÿf/ú)¿ù@Õ?ù¾Tÿ‡ÕlÿËSÿ»hÿ‡ÕlÿËSÿ»hê¿øz?ìÅÿE7ÿ(§ÿ#Wª|
ý©>þÒc[ÿ…qâoøHÿ±|�·ÿ ]Zù>w™å¯‰7gÊ“îçyÆF+?j?ø%/ü3_ÀŸ|Gÿ…£ÿ	ö/ÙâYÿÿÙ|ï:ê(?Öý©öãÍÝ÷NvãŒäz¯üË¯ÆÏû‚íýrŸ·¯ìñÛãOícãŸx7ÀßÛÔ¾ÃöKßí{<Ï.ÂÞ'ù%�\aãqÊŒã#‚
~kWõO�_Íoì·ð3þSã·†~mÿÂ;ýµöŸø™ý“í^O“k,ÿê·¦ìù[~ðÆìóŒ¿¿à†_ó[?î	ÿ·õÊþÞ¿°WÇo�?µ�Ž|eàßlxoRûÙ/µì`ó<»xŸä–uq‡�Ç*3ŒŽ5ÕÊê°ÿÂÉÿ¸öwöþù¾gÛÿØÛåï”ÿ‡æ�ú"ùuÿ÷|­ÿ¸ÿ“ìøeÿq?ý5Ý×íGÇ?Ú�á�ì×ý‰ÿÄßðŽmyÿ`ÿ@ººó¼Ÿ/ÍÿQíÇ›ÞÆwqœ|«û.Á)¿ášþ;xgâ?ü-øHÿ±~ÕÿÏøGþËçyÖ²Áþ·íO·nïºs·g#Êÿà¹ŸóDÿî7ÿ¶úSð·â—†>4øLñ—ƒu?í�
ê^oÙ/~Ï,g—+Äÿ$ª®0ñ¸åFq‘�A¯ŠÿjOÚ“á‡í£ð'Äßþ
ø›þ‰%û/öV‹ö«´ýžê+©¿}uP¦Ømå�Ævàeˆå_Ùsþ
+µÿ×ð'Ã??áWÂEý‹öŸø™ÿÂAö_;Îº–õ_e}¸óvýã�¹ã8©ÿ0?à›ñ‘ßð›ÂÅÿ„/þe¯ì¯ì¿¶}³ýþ>|é¼½Ÿkó?Õ¶í›xÝ¸°Çük_þoøhïø·_ð™ý‹ûþbŸlû'Ú>Óÿ>w—³ívÿë6îßòç
�Ò¯…¿¼1ñ§ÀšgŒ¼©ÿlxoRó~É{öy`ó<¹^'ù%Uq‡�Ç*3ŒŒ‚
~j�øÝýQßøV¿÷þÑþÐÿÀo+Ëûû{¼ßáÛó}ÿû-üÿ†løáŸ‡Ûð‘bý§þ&dû/�ç]K?ú­ï·nß¼s·<gñ_þqûNÿÑ3ÿÊþ™ÿÉ5÷÷ü—ö\ø�û5ÿÂÑÿ…�áŸøG¶¿²þÁþŸkuçy?kóÔJûqæÇ÷±�ÜgUÿÍÿª'ÿ—_ÿqQÿÍÿª'ÿ—_ÿqP+ûzþÁ_¾4þÖ>9ñ—ƒ|
ý±á½Kì?d½þ×±ƒÌòì-â’YÕÆ7¨Î28 ×ßÿ··Âïühý“¼sàßéŸÛ$ÔþÃöK/´E™åßÛÊÿ<¬¨0‘¹å†q�É¾*ÿ‡æãþhŸþ]ýÅ_þÔŸÿá›>x›â?ö'ü$Ø¿fÿ‰gÚþËçy×QAþ³cíÇ›»îœíÇÈùWþ	Kû.|NýšÿáhÿÂÇðÏü#¿Û_Ù`ÿOµºó¼Ÿµù¿ê%}¸ócûØÎî3ƒ�€à¨ÿò}Ÿîÿ¦»JýSý†noømãoø¢áÿ„kì_óûwÚ~Ñö�úcÍ¿g÷ÎîØçò³þ
+�ÿ'Ùñ7þáŸúk´ Ý?Š_¼1ð[ÀšŸŒ¼e©ÿcøoMò¾×{öygòüÉR$ù"Vs—‘
+qœœMrŸ?j?†?´§ößü+�ÂGý‹ä}¿ýê×Éó¼Ï+ý|I»>TŸw8ÛÎ22~ÔŸ?á¥>ø›áÇößü#¿Û_fÿ‰ŸÙ>Õäù7QOþ«znÏ•·ïnÏ8Áò¯Øgöÿ†/ÿ„Ûþ+oøLá%ûüÂ¾Ãöo³ý£þ›K¿wÚ=±·¾xü¬ÿ‚£ÿÉö|Mÿ¸gþší+÷Oâ—Å/|ð&§ã/jØþÓ|¯µÞýžYü¿2T‰>H•œåäAÂœg'_…ŸðTù>Ï‰Ÿ÷ÿÓe¥~ªÁQ¿äÅ>&Ü3ÿNv”ðükö£øcûJÂ®ÿ…qâoøH¿±µ>ßþ�ukäùßdò¿×Ä›³åI÷s�¼ã#?WÕ_°×ì1ÿ
¡ÿ	¶|mÿqð×Ø¿æöï´ý£íôÚ-›|�|îíŽ~©ÿ‡ÿÕlÿËSÿ»hõVŠ( Š( �ÒÒüÿ‚£ÿÉö|Mÿ¸gþší+õûööø£â‚ÿ²wŽ|eàÝOûÄšgØ~É{öx§òüËûxŸä•YRG©Ær9×äüþO³âoýÃ?ô×i_ªŸðTù1?‰¿÷ÿÓ¥¥~UÿÃÑÿißú)Ÿù@Ó?ù�øz?í;ÿE3ÿ(gÿ#WÊ´Pï÷üþLOâoýÃ?ôéi_*Áæ¶Üÿoëê¿ø*?ü˜ŸÄßû†éÒÒ¾Tÿ‚Ílÿ¸'þßÐê­0?~)xŸà¿ŽôÏx7SþÇñ&›æý’÷ìñOåù‘<OòJ¬‡)#ŽTã9€kïÿÛ×ö
+øíñ§ö±ñÏŒ¼àoí�
ê_aû%ïö½Œg—aoü’Î®0ñ¸åFq‘Á¿U>)|RðÇÁoj~2ñ–§ý�á½7Êû]ïÙåŸËó%H“ä‰YÎ^D)Ærp4üëüsý¨þ'~ÒŸØŸð±üMÿ	ö/Ÿöô[_'Îòüßõ&ìùQýìãoÉÏ•WßÿðU¯Ú�á�í)ÿ
+»þÇ‰¿á"þÅþÔûúÕ¯“ç}“Êÿ_nÏ•'ÝÎ6óŒŒûÿìûzü	ø-û'xÁ¾2ñÏö?‰4ß·}®Ëû"þ/Ì¿¸•>x d9IðÇÁä@Uû~Þ¿¾4þÖ>ðoŒ¼sý±á½Kíßk²þÈ±ƒÌòì.%Ož(Æ4<0Î0x$WéOÇ?Ùoá�í&4OøXþÿ„�ûÏûú}Õ¯“çy~gú‰Sv|¨þöq·Œdç«ø¥ñKÃ¼	©øËÆZŸö?†ôß+íw¿g–/Ì•"O’%g9yp§ÉÀ×)ð3ö¤øcûJmÿÂ¸ñ7ü$Ø¾GÛÿÐ.­|Ÿ;Ìò¿×Ä›³åI÷s�¼ã# …Ÿ··Âï|ý¬|sàßéŸØþÓ>ÃöK/´K?—æX[Êÿ<¬Îrò9åŽ3�À—â�ííñÛãG�5?øËÇ?Û>Ô¼¯µÙdXAæyr¤©óÅ¸ÃÆ‡†ÆA"¿j>(þÞß~øïSðoŒ¼sý�âM7Êû]—öEüþ_™JŸ<P2¤ˆxcŒàà‚+òþqûNÿÑ3ÿÊþ™ÿÉ4å_?jO‰ß³_ößü+�Â9ýµä}¿ýÖëÎò|Ï+ý|O·lŸwÝÎp1û§ûüQñ?Æ�Ù;ÀÞ2ñ–§ý±âMOíßk½û<Pyž]ýÄIòDªƒ	g<’kòþqûNÿÑ3ÿÊþ™ÿÉ5úýûü.ñ?ÁÙ;ÀÞ
ñ–™ý�âM3íßk²ûDSù~eýÄ©óÄÌ‡)"ã8<‚(•ÿ‡\~Ì_ôL¿ò¿ªòM'ü:ãöbÿ¢gÿ•ýOÿ’kâ¿Ø+ö
+øíð[ö±ð7Œ¼eàoì
é¿nû]ïö½Œþ_™aq|‘NÎrò áN3“À&½ÿþ
+µû.|Ný¥?áWÂ¸ðÏü$_Ø¿ÚŸoÿOµµò|ï²y_ëåMÙò¤û¹ÆÞq‘�ÍoÛÛáw†>þÖ>9ðoƒtÏì
éŸaû%—Ú%ŸËó,-åžVg9yòÇÀà_@~ËŸµ'ÄÿÛGã·†~
|dñ7ü&?
üKö¯í]ì¶?iû=¬·PþúÖ(¦M³[Äÿ#ŒíÁÊ’Õ_²ßíIðÃö.øáŸƒ<MÿwÄ�
}«ûWEûÕ÷Ù¾Ñu-Ô?¾µŠX_t7?Èç°pÀ�ðüãþO³á—ýÄÿô×w@µ?eÏ†?³XÖÿá\xgþÏí¯#íÿé÷W^w“æy_ëå}¸ódû¸Îîs��Åø*?üŸgÄßû†é®Ò¾þÿ‚­~ËŸ¿iOøUßð®<3ÿ	ö/ö§ÛÿÓím|Ÿ;ìžWúùSv|©>îq·œdgàøuÇí;ÿDÏÿ+úgÿ$ÐÿGý§è¦åLÿäj?áèÿ´ïýÏü iŸü�^ÿû~Á_¾~Ö>ñ—Œ¼
ý�á½7íßk½þ×±ŸËó,."O’)ÙÎ^D)Ærx×éOÇ?Ú“á�ìØ4OøXþ&ÿ„sûkÏûúÕ×�äù~gúˆŸn<Øþö3»Œààù×ø¥ñKÄÿ<w©øËÆZŸöÇ‰5/+íw¿gŠ3Ë‰"O’%THÐp£8Éä“_jþËŸµ'ÄÿÛGã·†~
|dñ7ü&?
üKö¯í]ì¶?iû=¬·PþúÖ(¦M³[Äÿ#ŒíÁÊ’Ïÿ··Å|hý¬|sã/êÛÔþÃöKß³Ë™åØ[Äÿ$ª®0ñ¸åFq‘Á¿_ÿà¨ÿòbîÿ§KJùSöçÿ�lÂÿãÿëþ?¶ÿoÌSíŸdû?Ù¿ã÷Îòö}®ãý^ÝÛþláqö¯ìñGÄÿ?dïxËÆZŸöÇ‰5?·}®÷ìñAæyw÷'Éª$h8QœdòI¯ÂÏ�Ÿ²çÄïÚSûoþÇ†á#þÅò>ßþŸkkäùÞg•þ¾TÝŸ*O»œmçå>)|-ñ?Áê~
ñ–™ý�âM7Êû]—Ú"ŸËó"ISç‰™RD<1ÆpyPôýEPEPHii
~ÁQÿäû>&ÿÜ3ÿMv•ûQûR|ÿ†”øâo‡ÛðŽÿm}—þ&dûW“äÝE?ú­é»>Vß¼1»<ãñ_þ
+�ÿ'Ùñ7þáŸúk´£þ�ûNÿÑLÿÊ™ÿÈÔõOü8ÈÑlÿËSÿ»hÿ‡ÕlÿËSÿ»kåoøz?í;ÿE3ÿ(gÿ#QÿGý§è¦åLÿäjýSÿ‚£ŸøÁO‰Ÿ÷ÿÓ�¥|«ÿ1ëñ³þàŸû_|Qý½¾;|hð&§àßxçûgÃz—•ö»/ì‹<Ï.T•>x WxÐðÃ8ÁÈ$WÚŸðC¿?î	ÿ·ôú§�_ŠÿµükþSàO‰¾Â®ÿ„sûkì¿ñ3ÿ„ƒí^O“uÿê¾Ê›³åmûÃ³Î0jkùW œš{Ñ_¯ß°Wìð'ãOì�àoxËÀßÛ$Ô¾Ýö»ßí{ø<Ï.þâ$ù"�Pa#AÂŒã'’M}ÿFÿ“ø™ÿpÏý9ÚWÊŸðC>?ávgþ �íþ¼¯ö\ý©>'þÚ?¼3ðkã'‰¿á1øoâ_µjè¿`µ±ûOÙíeº‡÷Ö±E2mšÞ'ùgnT�}Söçÿ�lÂÿãÿëþO¶ÿoÌSíŸdû?Ù¿ã÷Îòö}®ãý^ÝÛþlápò·üþO¯âgýÃ?ôÙi_TÿÃóê‰ÿå×ÿÜUêß²ßì·ðÃöÑøáŸŒŸ<3ÿ	�Ä�ý«ûWZû}Õ�Ú~Ïu-¬?¹µ–(Sl6ñ'Èƒ;rrÄ“ù«ûü.ðÇÆ�ÚÇÀÞ
ñ–™ý±á½Oíßk²ûD°yž]…Ä©óÄÊãg<(íOø~oýQ?üºÿûŠ�ø~wýQ?üºÿûŠ¾ªÿ‡\~Ì_ôLÿò¿©ÿòM/ü:ãöbÿ¢eÿ•ýSÿ’hÊeÏø*Ïü4§Çoü8ÿ…]ÿçö×Ú¿âgÿ	Ú¼Ÿ&ÖYÿÕ}•7gÊÛ÷†7gœ`ýüyøÿ¸ÿ“ìøeÿq?ý5Ý×ßßðU¯Ú�âwì×ÿ
+»þÇ‰¿áþÚþÔûú­×�äý“Êÿ_íÇ›'ÝÆwsœµü—þSã¯‰¾#ÿÂÑÿ„sûkì¿ñ,ÿ„í^O“kë~Ô›³ånû£±Î2~ÿ‚\Éö|2ÿ¸Ÿþšîèÿ‡£þÓ¿ôS?ò�¦ò5ðK�ù>Ï†_÷ÿÓ]Ý~©þÜß·7ü1ü!?ñDÿÂcÿ	/Ûæ+ö³}ŸìÿôÆ]û¾Ñí�½óÇÊ¿ðüßú¢ùuÿ÷}ÿñÏö\øcûJ
þ?†á#þÅóþÁþŸukäùÞ_›þ¢TÝŸ*?½œmã9ü,ý½¾xcà¿ícãŸø7LþÇðÞ™ö²Y}¢Yü¿2ÂÞWùåfs—‘Ï,qœýq_*þÜÿ°Ïü6‡ü!?ñ[Âÿ×Ûæöï´ý£ìÿôÚ-›|�|îíŽ+?áèÿ´ïýÏü iŸü�_Á)j?‰ß´§ü-øXþ&ÿ„‹ûû/ìè¶¾O�ö¿7ýDI»>T{8ÛÆ2rùYûR|ÿ†køíâo‡Ûð‘bý›þ&dû/�çZÅ?ú­ï·nß¼s·<gïÿønøyGüc�ü!?ð®¿á4ÿ™—ûWûSìcÿOÿ�o&3Ù<¿õ‹·~îví?j|Qý‚~ühñÞ§ã/xûgÄš—•ö»ßí{ø<Ï.$‰>H§THÐp£8ÉÉ$Ñð»ö	øð_ÇzgŒ¼àoìoi¾oÙ/µïçòüÈž'ù%��å$qÊœg#@Ÿì3ûÿÃÿÂmÿ·ü&ð’ý‹þa?aû7ÙþÑÿMåß»íØÛß<y_íGÿ¥ÿ†”øëâoˆÿð´áþÚû7üK?áûW“äÚÅúßµ&ìù[¾èÆìsŒ“þ
+µûQüNýšÿáWÂ¸ñ7ü#¿Û_ÚŸoÿ@µºó¼Ÿ²y_ëâ}¸ódû¸Îîs��€áèÿ´ïýÏü iŸü�@¿ÔQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÙ
\ No newline at end of file
diff -x graphtree -Naru ./include/func.inc.php graphtree/include/func.inc.php
--- ./include/func.inc.php	2016-02-26 17:45:47.000000000 +0800
+++ graphtree/include/func.inc.php	2016-04-18 19:04:39.000000000 +0800
@@ -2293,3 +2293,46 @@
 
 	return imagecolorallocate($image, $red, $green, $blue);
 }
+	/*
+         * debug echo print_r var_dump or exit
+         */
+	function _ex($obj = null,$exit = true){
+		static $cnt = 1;
+		$type = gettype($obj);
+		switch($type){
+			case "boolean":
+				var_dump($obj);
+				echo ("Step ".$cnt." >> boolean -- ".date("m-d H:i:s")." <br>");
+				break;
+			case "integer":
+			case "double":
+			case "string":
+				echo ("Step ".$cnt." >> ".$obj." -- ".date("m-d H:i:s")." <br>");
+				break;
+			case "array":
+				print_r($obj);
+				echo "<br>";
+				echo ("Step ".$cnt." >> array count:".count($obj)." -- ".date("m-d H:i:s")." <br>");
+				break;
+			case "object":
+				var_dump($obj);
+				echo ("Step ".$cnt." >> object -- ".date("m-d H:i:s")." <br>");
+				break;
+			case "resource":
+				var_dump($obj);
+				echo ("Step ".$cnt." >> resource -- ".date("m-d H:i:s")." <br>");
+				break;
+			case "NULL":
+				var_dump($obj);
+				echo ("Step ".$cnt." >> NULL -- ".date("m-d H:i:s")." <br>");
+				break;
+			default:
+				break;
+		}
+
+		if($exit){
+			exit();
+		}
+
+		$cnt++;
+	}
\ No newline at end of file
diff -x graphtree -Naru ./include/menu.inc.php graphtree/include/menu.inc.php
--- ./include/menu.inc.php	2016-02-26 17:45:56.000000000 +0800
+++ graphtree/include/menu.inc.php	2016-04-18 19:04:39.000000000 +0800
@@ -22,408 +22,401 @@
 /**
  * NOTE - menu array format:
  * first level:
- *	'label' = main menu title.
- *	'default_page_id	= default page url from 'pages' then opened menu.
- *	'pages' = collection of pages which are displayed from this menu.
- *	these pages are saved a last visited submenu of main menu.
+ *    'label' = main menu title.
+ *    'default_page_id    = default page url from 'pages' then opened menu.
+ *    'pages' = collection of pages which are displayed from this menu.
+ *    these pages are saved a last visited submenu of main menu.
  *
  * second level (pages):
- *	'url' = real url for this page
- *	'label' =  submenu title, if missing, menu skipped, but remembered as last visited page.
- *	'sub_pages' = collection of pages for displaying but not remembered as last visited.
+ *    'url' = real url for this page
+ *    'label' =  submenu title, if missing, menu skipped, but remembered as last visited page.
+ *    'sub_pages' = collection of pages for displaying but not remembered as last visited.
  */
 function zbx_construct_menu(&$main_menu, &$sub_menus, &$page, $action = null) {
-	$zbx_menu = [
-		'view' => [
-			'label' => _('Monitoring'),
-			'user_type' => USER_TYPE_ZABBIX_USER,
-			'default_page_id' => 0,
-			'pages' => [
-				[
-					'url' => 'zabbix.php',
-					'action' => 'dashboard.view',
-					'active_if' => ['dashboard.view'],
-					'label' => _('Dashboard'),
-					'sub_pages' => ['dashconf.php']
-				],
-				[
-					'url' => 'overview.php',
-					'label' => _('Overview')
-				],
-				[
-					'url' => 'zabbix.php',
-					'action' => 'web.view',
-					'active_if' => ['web.view'],
-					'label' => _('Web'),
-					'sub_pages' => ['httpdetails.php']
-				],
-				[
-					'url' => 'latest.php',
-					'label' => _('Latest data'),
-					'sub_pages' => ['history.php', 'chart.php']
-				],
-				[
-					'url' => 'tr_status.php',
-					'active_if' => ['acknowledge.edit'],
-					'label' => _('Triggers'),
-					'sub_pages' => ['tr_comments.php', 'chart4.php', 'scripts_exec.php']
-				],
-				[
-					'url' => 'events.php',
-					'label' => _('Events'),
-					'sub_pages' => ['tr_events.php']
-				],
-				[
-					'url' => 'charts.php',
-					'label' => _('Graphs'),
-					'sub_pages' => ['chart2.php', 'chart3.php', 'chart6.php', 'chart7.php']
-				],
-				[
-					'url' => 'screens.php',
-					'label' => _('Screens'),
-					'sub_pages' => [
-						'screenconf.php',
-						'screenedit.php',
-						'screen.import.php',
-						'slides.php',
-						'slideconf.php'
-					]
-				],
-				[
-					'url' => 'zabbix.php',
-					'action' => 'map.view',
-					'active_if' => ['map.view'],
-					'label' => _('Maps'),
-					'sub_pages' => ['image.php', 'sysmaps.php', 'sysmap.php', 'map.php', 'map.import.php']
-				],
-				[
-					'url' => 'zabbix.php',
-					'action' => 'discovery.view',
-					'active_if' => ['discovery.view'],
-					'label' => _('Discovery'),
-					'user_type' => USER_TYPE_ZABBIX_ADMIN
-				],
-				[
-					'url' => 'srv_status.php',
-					'active_if' => ['report.services'],
-					'label' => _('IT services'),
-					'sub_pages' => ['chart5.php']
-				],
-				[
-					'url' => 'chart3.php'
-				],
-				[
-					'url' => 'imgstore.php'
-				],
-				[
-					'url' => 'search.php'
-				],
-				[
-					'url' => 'jsrpc.php'
-				]
-			]
-		],
-		'cm' => [
-			'label' => _('Inventory'),
-			'user_type' => USER_TYPE_ZABBIX_USER,
-			'default_page_id' => 0,
-			'pages' => [
-				[
-					'url' => 'hostinventoriesoverview.php',
-					'label' => _('Overview')
-				],
-				[
-					'url' => 'hostinventories.php',
-					'label' => _('Hosts')
-				]
-			]
-		],
-		'reports' => [
-			'label' => _('Reports'),
-			'user_type' => USER_TYPE_ZABBIX_USER,
-			'default_page_id' => 0,
-			'pages' => [
-				[
-					'url' => 'zabbix.php',
-					'action' => 'report.status',
-					'active_if' => ['report.status'],
-					'label' => _('Status of Zabbix'),
-					'user_type' => USER_TYPE_SUPER_ADMIN
-				],
-				[
-					'url' => 'report2.php',
-					'label' => _('Availability report')
-				],
-				[
-					'url' => 'toptriggers.php',
-					'label' => _('Triggers top 100')
-				],
-				[
-					'url' => 'auditlogs.php',
-					'label' => _('Audit'),
-					'user_type' => USER_TYPE_SUPER_ADMIN
-				],
-				[
-					'url' => 'auditacts.php',
-					'label' => _('Action log'),
-					'user_type' => USER_TYPE_SUPER_ADMIN
-				],
-				[
-					'url' => 'report4.php',
-					'label' => _('Notifications'),
-					'user_type' => USER_TYPE_ZABBIX_ADMIN
-				],
-				[
-					'url' => 'popup.php'
-				],
-				[
-					'url' => 'popup_right.php'
-				]
-			]
-		],
-		'config' => [
-			'label' => _('Configuration'),
-			'user_type' => USER_TYPE_ZABBIX_ADMIN,
-			'default_page_id' => 0,
-			'pages' => [
-				[
-					'url' => 'conf.import.php'
-				],
-				[
-					'url' => 'hostgroups.php',
-					'label' => _('Host groups')
-				],
-				[
-					'url' => 'templates.php',
-					'label' => _('Templates'),
-					'sub_pages' => [
-						'screenconf.php',
-						'screenedit.php'
-					]
-				],
-				[
-					'url' => 'hosts.php',
-					'label' => _('Hosts'),
-					'sub_pages' => [
-						'items.php',
-						'triggers.php',
-						'graphs.php',
-						'applications.php',
-						'tr_logform.php',
-						'tr_testexpr.php',
-						'popup_trexpr.php',
-						'host_discovery.php',
-						'disc_prototypes.php',
-						'trigger_prototypes.php',
-						'host_prototypes.php',
-						'httpconf.php',
-						'popup_httpstep.php'
-					]
-				],
-				[
-					'url' => 'maintenance.php',
-					'label' => _('Maintenance')
-				],
-				[
-					'url' => 'actionconf.php',
-					'label' => _('Actions')
-				],
-				[
-					'url' => 'discoveryconf.php',
-					'label' => _('Discovery')
-				],
-				[
-					'url' => 'services.php',
-					'label' => _('IT services')
-				]
-			]
-		],
-		'admin' => [
-			'label' => _('Administration'),
-			'user_type' => USER_TYPE_SUPER_ADMIN,
-			'default_page_id' => 0,
-			'pages' => [
-				[
-					'url' => 'adm.gui.php',
-					'label' => _('General'),
-					'sub_pages' => [
-						'adm.housekeeper.php',
-						'adm.images.php',
-						'adm.iconmapping.php',
-						'adm.regexps.php',
-						'adm.macros.php',
-						'adm.valuemapping.php',
-						'adm.workingtime.php',
-						'adm.triggerseverities.php',
-						'adm.triggerdisplayoptions.php',
-						'adm.other.php'
-					]
-				],
-				[
-					'url' => 'zabbix.php',
-					'action' => 'proxy.list',
-					'active_if' => ['proxy.edit', 'proxy.list'],
-					'label' => _('Proxies')
-				],
-				[
-					'url' => 'authentication.php',
-					'label' => _('Authentication')
-				],
-				[
-					'url' => 'usergrps.php',
-					'label' => _('User groups')
-				],
-				[
-					'url' => 'users.php',
-					'label' => _('Users'),
-					'sub_pages' => [
-						'popup_usrgrp.php',
-						'popup_media.php'
-					],
-				],
-				[
-					'url' => 'zabbix.php',
-					'action' => 'mediatype.list',
-					'active_if' => ['mediatype.edit', 'mediatype.list'],
-					'label' => _('Media types')
-				],
-				[
-					'url' => 'zabbix.php',
-					'action' => 'script.list',
-					'active_if' => ['script.edit', 'script.list'],
-					'label' => _('Scripts')
-				],
-				[
-					'url' => 'queue.php',
-					'label' => _('Queue')
-				]
-			]
-		],
-		'login' => [
-			'label' => _('Login'),
-			'user_type' => 0,
-			'default_page_id' => 0,
-			'pages' => [
-				[
-					'url' => 'index.php',
-					'sub_pages' => ['profile.php', 'popup_media.php']
-				]
-			]
-		]
-	];
-
-	$denied_page_requested = false;
-	$page_exists = false;
-	$deny = true;
-
-	foreach ($zbx_menu as $label => $menu) {
-		$show_menu = true;
-
-		if (isset($menu['user_type'])) {
-			$show_menu &= ($menu['user_type'] <= CWebUser::$data['type']);
-		}
-		if ($label == 'login') {
-			$show_menu = false;
-		}
-
-		$menu_class = null;
-		$sub_menus[$label] = [];
-
-		foreach ($menu['pages'] as $sub_page) {
-			$show_sub_menu = true;
-
-			// show check
-			if (!isset($sub_page['label'])) {
-				$show_sub_menu = false;
-			}
-			if (!isset($sub_page['user_type'])) {
-				$sub_page['user_type'] = $menu['user_type'];
-			}
-			if (CWebUser::$data['type'] < $sub_page['user_type']) {
-				$show_sub_menu = false;
-			}
-
-			$row = [
-				'menu_text' => array_key_exists('label', $sub_page) ? $sub_page['label'] : '',
-				'menu_url' => $sub_page['url'],
-				'menu_action' => array_key_exists('action', $sub_page) ? $sub_page['action'] : null,
-				'selected' => false
-			];
-
-			if ($action == null) {
-				$sub_menu_active = ($page['file'] == $sub_page['url']);
-
-				// Quick and dirty hack to display correct menu for templated screens.
-				if (array_key_exists('sub_pages', $sub_page)) {
-					if ((str_in_array('screenconf.php', $sub_page['sub_pages'])
-							|| str_in_array('screenedit.php', $sub_page['sub_pages']))
-								&& ($page['file'] === 'screenconf.php' || $page['file'] === 'screenedit.php')) {
-						if ($label === 'view') {
-							$sub_menu_active |= getRequest('templateid') ? false : true;
-						}
-						elseif ($label === 'config') {
-							$sub_menu_active |= getRequest('templateid') ? true : false;
-						}
-					}
-					elseif (str_in_array($page['file'], $sub_page['sub_pages'])) {
-						$sub_menu_active |= true;
-					}
-				}
-				else {
-					$sub_menu_active |= false;
-				}
-			}
-			else {
-				$sub_menu_active = array_key_exists('active_if', $sub_page) && str_in_array($action, $sub_page['active_if']);
-			}
-
-			if ($sub_menu_active) {
-				// permission check
-				$deny &= (CWebUser::$data['type'] < $menu['user_type'] || CWebUser::$data['type'] < $sub_page['user_type']);
-
-				$menu_class = 'selected';
-				$page_exists = true;
-				$page['menu'] = $label;
-				$row['selected'] = true;
-
-				if (!defined('ZBX_PAGE_NO_MENU')) {
-					CProfile::update('web.menu.'.$label.'.last', $sub_page['url'], PROFILE_TYPE_STR);
-				}
-			}
-
-			if ($show_sub_menu) {
-				$sub_menus[$label][] = $row;
-			}
-		}
-
-		if ($page_exists && $deny) {
-			$denied_page_requested = true;
-		}
-
-		if (!$show_menu) {
-			unset($sub_menus[$label]);
-			continue;
-		}
-
-		if ($sub_menus[$label][$menu['default_page_id']]['menu_action'] === null) {
-			$menu_url = $sub_menus[$label][$menu['default_page_id']]['menu_url'];
-		}
-		else {
-			$menu_url = $sub_menus[$label][$menu['default_page_id']]['menu_url'].'?action='.$sub_menus[$label][$menu['default_page_id']]['menu_action'];
-		}
-		$mmenu_entry = (new CListItem(
-			(new CLink($menu['label']))
-				->setAttribute('tabindex', 0)
-		))
-			->addClass($menu_class)
-			->setId($label);
-		$mmenu_entry->onClick('javascript: MMenu.mouseOver(\''.$label.'\');');
-		array_push($main_menu, $mmenu_entry);
-	}
-
-	if (!$page_exists && $page['type'] != PAGE_TYPE_XML && $page['type'] != PAGE_TYPE_CSV && $page['type'] != PAGE_TYPE_TEXT_FILE) {
-		$denied_page_requested = true;
-	}
+    $zbx_menu = [
+        'view'    => [
+            'label'           => _('Monitoring'),
+            'user_type'       => USER_TYPE_ZABBIX_USER,
+            'default_page_id' => 0,
+            'pages'           => [
+                [
+                    'url'       => 'zabbix.php',
+                    'action'    => 'dashboard.view',
+                    'active_if' => ['dashboard.view'],
+                    'label'     => _('Dashboard'),
+                    'sub_pages' => ['dashconf.php']
+                ],
+                [
+                    'url'   => 'overview.php',
+                    'label' => _('Overview')
+                ],
+                [
+                    'url'       => 'zabbix.php',
+                    'action'    => 'web.view',
+                    'active_if' => ['web.view'],
+                    'label'     => _('Web'),
+                    'sub_pages' => ['httpdetails.php']
+                ],
+                [
+                    'url'       => 'latest.php',
+                    'label'     => _('Latest data'),
+                    'sub_pages' => ['history.php', 'chart.php']
+                ],
+                [
+                    'url'       => 'tr_status.php',
+                    'active_if' => ['acknowledge.edit'],
+                    'label'     => _('Triggers'),
+                    'sub_pages' => ['tr_comments.php', 'chart4.php', 'scripts_exec.php']
+                ],
+                [
+                    'url'       => 'events.php',
+                    'label'     => _('Events'),
+                    'sub_pages' => ['tr_events.php']
+                ],
+                [
+                    'url'       => 'charts.php',
+                    'label'     => _('Graphs'),
+                    'sub_pages' => ['chart2.php', 'chart3.php', 'chart6.php', 'chart7.php']
+                ],
+                [
+                    'url'       => 'graphtrees.php',
+                    'label'     => _('Graphtrees'),
+                    'sub_pages' => ['graphtree.left.php', 'graphtree.right.php', "biggraph.php"]
+                ],
+                [
+                    'url'       => 'screens.php',
+                    'label'     => _('Screens'),
+                    'sub_pages' => [
+                        'screenconf.php',
+                        'screenedit.php',
+                        'screen.import.php',
+                        'slides.php',
+                        'slideconf.php'
+                    ]
+                ],
+                [
+                    'url'       => 'zabbix.php',
+                    'action'    => 'map.view',
+                    'active_if' => ['map.view'],
+                    'label'     => _('Maps'),
+                    'sub_pages' => ['image.php', 'sysmaps.php', 'sysmap.php', 'map.php', 'map.import.php']
+                ],
+                [
+                    'url'       => 'zabbix.php',
+                    'action'    => 'discovery.view',
+                    'active_if' => ['discovery.view'],
+                    'label'     => _('Discovery'),
+                    'user_type' => USER_TYPE_ZABBIX_ADMIN
+                ],
+                [
+                    'url'       => 'srv_status.php',
+                    'active_if' => ['report.services'],
+                    'label'     => _('IT services'),
+                    'sub_pages' => ['chart5.php']
+                ],
+                [
+                    'url' => 'chart3.php'
+                ],
+                [
+                    'url' => 'imgstore.php'
+                ],
+                [
+                    'url' => 'search.php'
+                ],
+                [
+                    'url' => 'jsrpc.php'
+                ]
+            ]
+        ],
+        'cm'      => [
+            'label'           => _('Inventory'),
+            'user_type'       => USER_TYPE_ZABBIX_USER,
+            'default_page_id' => 0,
+            'pages'           => [
+                [
+                    'url'   => 'hostinventoriesoverview.php',
+                    'label' => _('Overview')
+                ],
+                [
+                    'url'   => 'hostinventories.php',
+                    'label' => _('Hosts')
+                ]
+            ]
+        ],
+        'reports' => [
+            'label'           => _('Reports'),
+            'user_type'       => USER_TYPE_ZABBIX_USER,
+            'default_page_id' => 0,
+            'pages'           => [
+                [
+                    'url'       => 'zabbix.php',
+                    'action'    => 'report.status',
+                    'active_if' => ['report.status'],
+                    'label'     => _('Status of Zabbix'),
+                    'user_type' => USER_TYPE_SUPER_ADMIN
+                ],
+                [
+                    'url'   => 'report2.php',
+                    'label' => _('Availability report')
+                ],
+                [
+                    'url'   => 'toptriggers.php',
+                    'label' => _('Triggers top 100')
+                ],
+                [
+                    'url'       => 'auditlogs.php',
+                    'label'     => _('Audit'),
+                    'user_type' => USER_TYPE_SUPER_ADMIN
+                ],
+                [
+                    'url'       => 'auditacts.php',
+                    'label'     => _('Action log'),
+                    'user_type' => USER_TYPE_SUPER_ADMIN
+                ],
+                [
+                    'url'       => 'report4.php',
+                    'label'     => _('Notifications'),
+                    'user_type' => USER_TYPE_ZABBIX_ADMIN
+                ],
+                [
+                    'url' => 'popup.php'
+                ],
+                [
+                    'url' => 'popup_right.php'
+                ]
+            ]
+        ],
+        'config'  => [
+            'label'           => _('Configuration'),
+            'user_type'       => USER_TYPE_ZABBIX_ADMIN,
+            'default_page_id' => 0,
+            'pages'           => [
+                [
+                    'url' => 'conf.import.php'
+                ],
+                [
+                    'url'   => 'hostgroups.php',
+                    'label' => _('Host groups')
+                ],
+                [
+                    'url'       => 'templates.php',
+                    'label'     => _('Templates'),
+                    'sub_pages' => [
+                        'screenconf.php',
+                        'screenedit.php'
+                    ]
+                ],
+                [
+                    'url'       => 'hosts.php',
+                    'label'     => _('Hosts'),
+                    'sub_pages' => [
+                        'items.php',
+                        'triggers.php',
+                        'graphs.php',
+                        'applications.php',
+                        'tr_logform.php',
+                        'tr_testexpr.php',
+                        'popup_trexpr.php',
+                        'host_discovery.php',
+                        'disc_prototypes.php',
+                        'trigger_prototypes.php',
+                        'host_prototypes.php',
+                        'httpconf.php',
+                        'popup_httpstep.php'
+                    ]
+                ],
+                [
+                    'url'   => 'maintenance.php',
+                    'label' => _('Maintenance')
+                ],
+                [
+                    'url'   => 'actionconf.php',
+                    'label' => _('Actions')
+                ],
+                [
+                    'url'   => 'discoveryconf.php',
+                    'label' => _('Discovery')
+                ],
+                [
+                    'url'   => 'services.php',
+                    'label' => _('IT services')
+                ]
+            ]
+        ],
+        'admin'   => [
+            'label'           => _('Administration'),
+            'user_type'       => USER_TYPE_SUPER_ADMIN,
+            'default_page_id' => 0,
+            'pages'           => [
+                [
+                    'url'       => 'adm.gui.php',
+                    'label'     => _('General'),
+                    'sub_pages' => [
+                        'adm.housekeeper.php',
+                        'adm.images.php',
+                        'adm.iconmapping.php',
+                        'adm.regexps.php',
+                        'adm.macros.php',
+                        'adm.valuemapping.php',
+                        'adm.workingtime.php',
+                        'adm.triggerseverities.php',
+                        'adm.triggerdisplayoptions.php',
+                        'adm.other.php'
+                    ]
+                ],
+                [
+                    'url'       => 'zabbix.php',
+                    'action'    => 'proxy.list',
+                    'active_if' => ['proxy.edit', 'proxy.list'],
+                    'label'     => _('Proxies')
+                ],
+                [
+                    'url'   => 'authentication.php',
+                    'label' => _('Authentication')
+                ],
+                [
+                    'url'   => 'usergrps.php',
+                    'label' => _('User groups')
+                ],
+                [
+                    'url'       => 'users.php',
+                    'label'     => _('Users'),
+                    'sub_pages' => [
+                        'popup_usrgrp.php',
+                        'popup_media.php'
+                    ],
+                ],
+                [
+                    'url'       => 'zabbix.php',
+                    'action'    => 'mediatype.list',
+                    'active_if' => ['mediatype.edit', 'mediatype.list'],
+                    'label'     => _('Media types')
+                ],
+                [
+                    'url'       => 'zabbix.php',
+                    'action'    => 'script.list',
+                    'active_if' => ['script.edit', 'script.list'],
+                    'label'     => _('Scripts')
+                ],
+                [
+                    'url'   => 'queue.php',
+                    'label' => _('Queue')
+                ]
+            ]
+        ],
+        'login'   => [
+            'label'           => _('Login'),
+            'user_type'       => 0,
+            'default_page_id' => 0,
+            'pages'           => [
+                [
+                    'url'       => 'index.php',
+                    'sub_pages' => ['profile.php', 'popup_media.php']
+                ]
+            ]
+        ]
+    ];
+
+    $denied_page_requested = false;
+    $page_exists = false;
+    $deny = true;
+
+    foreach ($zbx_menu as $label => $menu) {
+        $show_menu = true;
+
+        if (isset($menu['user_type'])) {
+            $show_menu &= ($menu['user_type'] <= CWebUser::$data['type']);
+        }
+        if ($label == 'login') {
+            $show_menu = false;
+        }
+
+        $menu_class = null;
+        $sub_menus[$label] = [];
+
+        foreach ($menu['pages'] as $sub_page) {
+            $show_sub_menu = true;
+
+            // show check
+            if (!isset($sub_page['label'])) {
+                $show_sub_menu = false;
+            }
+            if (!isset($sub_page['user_type'])) {
+                $sub_page['user_type'] = $menu['user_type'];
+            }
+            if (CWebUser::$data['type'] < $sub_page['user_type']) {
+                $show_sub_menu = false;
+            }
+
+            $row = [
+                'menu_text'   => array_key_exists('label', $sub_page) ? $sub_page['label'] : '',
+                'menu_url'    => $sub_page['url'],
+                'menu_action' => array_key_exists('action', $sub_page) ? $sub_page['action'] : null,
+                'selected'    => false
+            ];
+
+            if ($action == null) {
+                $sub_menu_active = ($page['file'] == $sub_page['url']);
+
+                // Quick and dirty hack to display correct menu for templated screens.
+                if (array_key_exists('sub_pages', $sub_page)) {
+                    if ((str_in_array('screenconf.php', $sub_page['sub_pages']) || str_in_array('screenedit.php', $sub_page['sub_pages'])) && ($page['file'] === 'screenconf.php' || $page['file'] === 'screenedit.php')) {
+                        if ($label === 'view') {
+                            $sub_menu_active |= getRequest('templateid') ? false : true;
+                        } elseif ($label === 'config') {
+                            $sub_menu_active |= getRequest('templateid') ? true : false;
+                        }
+                    } elseif (str_in_array($page['file'], $sub_page['sub_pages'])) {
+                        $sub_menu_active |= true;
+                    }
+                } else {
+                    $sub_menu_active |= false;
+                }
+            } else {
+                $sub_menu_active = array_key_exists('active_if', $sub_page) && str_in_array($action, $sub_page['active_if']);
+            }
+
+            if ($sub_menu_active) {
+                // permission check
+                $deny &= (CWebUser::$data['type'] < $menu['user_type'] || CWebUser::$data['type'] < $sub_page['user_type']);
+
+                $menu_class = 'selected';
+                $page_exists = true;
+                $page['menu'] = $label;
+                $row['selected'] = true;
+
+                if (!defined('ZBX_PAGE_NO_MENU')) {
+                    CProfile::update('web.menu.' . $label . '.last', $sub_page['url'], PROFILE_TYPE_STR);
+                }
+            }
+
+            if ($show_sub_menu) {
+                $sub_menus[$label][] = $row;
+            }
+        }
+
+        if ($page_exists && $deny) {
+            $denied_page_requested = true;
+        }
+
+        if (!$show_menu) {
+            unset($sub_menus[$label]);
+            continue;
+        }
+
+        if ($sub_menus[$label][$menu['default_page_id']]['menu_action'] === null) {
+            $menu_url = $sub_menus[$label][$menu['default_page_id']]['menu_url'];
+        } else {
+            $menu_url = $sub_menus[$label][$menu['default_page_id']]['menu_url'] . '?action=' . $sub_menus[$label][$menu['default_page_id']]['menu_action'];
+        }
+        $mmenu_entry = (new CListItem((new CLink($menu['label']))->setAttribute('tabindex', 0)))->addClass($menu_class)->setId($label);
+        $mmenu_entry->onClick('javascript: MMenu.mouseOver(\'' . $label . '\');');
+        array_push($main_menu, $mmenu_entry);
+    }
+
+    if (!$page_exists && $page['type'] != PAGE_TYPE_XML && $page['type'] != PAGE_TYPE_CSV && $page['type'] != PAGE_TYPE_TEXT_FILE) {
+        $denied_page_requested = true;
+    }
 
-	return $denied_page_requested;
+    return $denied_page_requested;
 }
diff -x graphtree -Naru ./include/page_header.php graphtree/include/page_header.php
--- ./include/page_header.php	2016-02-26 17:45:47.000000000 +0800
+++ graphtree/include/page_header.php	2016-04-18 19:04:39.000000000 +0800
@@ -151,11 +151,21 @@
 			}
 		}
 	}
-	$pageHeader->addCssFile('styles/'.CHtml::encode($theme).'.css');
+
+    if(!defined('ZBX_PAGE_NO_THEME') || !ZBX_PAGE_NO_THEME){
+        $pageHeader->addCssFile('styles/'.CHtml::encode($theme).'.css');
+    }
 
 	if ($page['file'] == 'sysmap.php') {
 		$pageHeader->addCssFile('imgstore.php?css=1&output=css');
 	}
+
+	if(!empty($page['css']) && is_array($page['css'])){
+		foreach($page['css'] as $v){
+			$pageHeader->addCssFile('styles/' . $v);
+		}
+	}
+
 	$pageHeader->addJsFile('js/browsers.js');
 	$pageHeader->addJsBeforeScripts('var PHP_TZ_OFFSET = '.date('Z').';');
 
diff -x graphtree -Naru ./js/vendors/highlight.min.js graphtree/js/vendors/highlight.min.js
--- ./js/vendors/highlight.min.js	1970-01-01 08:00:00.000000000 +0800
+++ graphtree/js/vendors/highlight.min.js	2016-04-18 19:04:39.000000000 +0800
@@ -0,0 +1,34 @@
+/*
+
+Copyright 2006, Ivan Sagalaev.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+  list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice, this
+  list of conditions and the following disclaimer in the documentation and/or
+  other materials provided with the distribution.
+
+* Neither the name of highlight.js nor the names of its contributors may be used
+  to endorse or promote products derived from this software without specific
+  prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+var hljs=new function(){function m(p){return p.replace(/&/gm,"&amp;").replace(/</gm,"&lt;")}function c(r,q,p){return RegExp(q,"m"+(r.cI?"i":"")+(p?"g":""))}function j(r){for(var p=0;p<r.childNodes.length;p++){var q=r.childNodes[p];if(q.nodeName=="CODE"){return q}if(!(q.nodeType==3&&q.nodeValue.match(/\s+/))){break}}}function g(t,s){var r="";for(var q=0;q<t.childNodes.length;q++){if(t.childNodes[q].nodeType==3){var p=t.childNodes[q].nodeValue;if(s){p=p.replace(/\n/g,"")}r+=p}else{if(t.childNodes[q].nodeName=="BR"){r+="\n"}else{r+=g(t.childNodes[q])}}}if(/MSIE [678]/.test(navigator.userAgent)){r=r.replace(/\r/g,"\n")}return r}function a(s){var q=s.className.split(/\s+/);q=q.concat(s.parentNode.className.split(/\s+/));for(var p=0;p<q.length;p++){var r=q[p].replace(/^language-/,"");if(d[r]||r=="no-highlight"){return r}}}function b(p){var q=[];(function(s,t){for(var r=0;r<s.childNodes.length;r++){if(s.childNodes[r].nodeType==3){t+=s.childNodes[r].nodeValue.length}else{if(s.childNodes[r].nodeName=="BR"){t+=1}else{q.push({event:"start",offset:t,node:s.childNodes[r]});t=arguments.callee(s.childNodes[r],t);q.push({event:"stop",offset:t,node:s.childNodes[r]})}}}return t})(p,0);return q}function l(y,z,x){var r=0;var w="";var t=[];function u(){if(y.length&&z.length){if(y[0].offset!=z[0].offset){return(y[0].offset<z[0].offset)?y:z}else{return z[0].event=="start"?y:z}}else{return y.length?y:z}}function s(C){var D="<"+C.nodeName.toLowerCase();for(var A=0;A<C.attributes.length;A++){var B=C.attributes[A];D+=" "+B.nodeName.toLowerCase();if(B.nodeValue!=undefined&&B.nodeValue!=false&&B.nodeValue!=null){D+='="'+m(B.nodeValue)+'"'}}return D+">"}while(y.length||z.length){var v=u().splice(0,1)[0];w+=m(x.substr(r,v.offset-r));r=v.offset;if(v.event=="start"){w+=s(v.node);t.push(v.node)}else{if(v.event=="stop"){var q=t.length;do{q--;var p=t[q];w+=("</"+p.nodeName.toLowerCase()+">")}while(p!=v.node);t.splice(q,1);while(q<t.length){w+=s(t[q]);q++}}}}w+=x.substr(r);return w}function i(){function p(u,t,v){if(u.compiled){return}if(!v){u.bR=c(t,u.b?u.b:"\\B|\\b");if(!u.e&&!u.eW){u.e="\\B|\\b"}if(u.e){u.eR=c(t,u.e)}}if(u.i){u.iR=c(t,u.i)}if(u.r==undefined){u.r=1}if(u.k){u.lR=c(t,u.l||hljs.IR,true)}for(var s in u.k){if(!u.k.hasOwnProperty(s)){continue}if(u.k[s] instanceof Object){u.kG=u.k}else{u.kG={keyword:u.k}}break}if(!u.c){u.c=[]}u.compiled=true;for(var r=0;r<u.c.length;r++){p(u.c[r],t,false)}if(u.starts){p(u.starts,t,false)}}for(var q in d){if(!d.hasOwnProperty(q)){continue}p(d[q].dM,d[q],true)}}function e(J,D){if(!i.called){i();i.called=true}function z(r,M){for(var L=0;L<M.c.length;L++){if(M.c[L].bR.test(r)){return M.c[L]}}}function w(L,r){if(C[L].e&&C[L].eR.test(r)){return 1}if(C[L].eW){var M=w(L-1,r);return M?M+1:0}return 0}function x(r,L){return L.iR&&L.iR.test(r)}function A(O,N){var M=[];for(var L=0;L<O.c.length;L++){M.push(O.c[L].b)}var r=C.length-1;do{if(C[r].e){M.push(C[r].e)}r--}while(C[r+1].eW);if(O.i){M.push(O.i)}return c(N,"("+M.join("|")+")",true)}function s(M,L){var N=C[C.length-1];if(!N.t){N.t=A(N,H)}N.t.lastIndex=L;var r=N.t.exec(M);if(r){return[M.substr(L,r.index-L),r[0],false]}else{return[M.substr(L),"",true]}}function p(O,r){var L=H.cI?r[0].toLowerCase():r[0];for(var N in O.kG){if(!O.kG.hasOwnProperty(N)){continue}var M=O.kG[N].hasOwnProperty(L);if(M){return[N,M]}}return false}function F(M,O){if(!O.k){return m(M)}var N="";var P=0;O.lR.lastIndex=0;var L=O.lR.exec(M);while(L){N+=m(M.substr(P,L.index-P));var r=p(O,L);if(r){t+=r[1];N+='<span class="'+r[0]+'">'+m(L[0])+"</span>"}else{N+=m(L[0])}P=O.lR.lastIndex;L=O.lR.exec(M)}N+=m(M.substr(P,M.length-P));return N}function K(r,M){if(M.sL&&d[M.sL]){var L=e(M.sL,r);t+=L.keyword_count;return L.value}else{return F(r,M)}}function I(M,r){var L=M.cN?'<span class="'+M.cN+'">':"";if(M.rB){q+=L;M.buffer=""}else{if(M.eB){q+=m(r)+L;M.buffer=""}else{q+=L;M.buffer=r}}C.push(M);B+=M.r}function E(O,L,Q){var R=C[C.length-1];if(Q){q+=K(R.buffer+O,R);return false}var M=z(L,R);if(M){q+=K(R.buffer+O,R);I(M,L);return M.rB}var r=w(C.length-1,L);if(r){var N=R.cN?"</span>":"";if(R.rE){q+=K(R.buffer+O,R)+N}else{if(R.eE){q+=K(R.buffer+O,R)+N+m(L)}else{q+=K(R.buffer+O+L,R)+N}}while(r>1){N=C[C.length-2].cN?"</span>":"";q+=N;r--;C.length--}var P=C[C.length-1];C.length--;C[C.length-1].buffer="";if(P.starts){I(P.starts,"")}return R.rE}if(x(L,R)){throw"Illegal"}}var H=d[J];var C=[H.dM];var B=0;var t=0;var q="";try{var v=0;H.dM.buffer="";do{var y=s(D,v);var u=E(y[0],y[1],y[2]);v+=y[0].length;if(!u){v+=y[1].length}}while(!y[2]);if(C.length>1){throw"Illegal"}return{r:B,keyword_count:t,value:q}}catch(G){if(G=="Illegal"){return{r:0,keyword_count:0,value:m(D)}}else{throw G}}}function f(t){var r={keyword_count:0,r:0,value:m(t)};var q=r;for(var p in d){if(!d.hasOwnProperty(p)){continue}var s=e(p,t);s.language=p;if(s.keyword_count+s.r>q.keyword_count+q.r){q=s}if(s.keyword_count+s.r>r.keyword_count+r.r){q=r;r=s}}if(q.language){r.second_best=q}return r}function h(r,q,p){if(q){r=r.replace(/^((<[^>]+>|\t)+)/gm,function(t,w,v,u){return w.replace(/\t/g,q)})}if(p){r=r.replace(/\n/g,"<br>")}return r}function o(u,x,q){var y=g(u,q);var s=a(u);if(s=="no-highlight"){return}if(s){var w=e(s,y)}else{var w=f(y);s=w.language}var p=b(u);if(p.length){var r=document.createElement("pre");r.innerHTML=w.value;w.value=l(p,b(r),y)}w.value=h(w.value,x,q);var t=u.className;if(!t.match("(\\s|^)(language-)?"+s+"(\\s|$)")){t=t?(t+" "+s):s}if(/MSIE [678]/.test(navigator.userAgent)&&u.tagName=="CODE"&&u.parentNode.tagName=="PRE"){var r=u.parentNode;var v=document.createElement("div");v.innerHTML="<pre><code>"+w.value+"</code></pre>";u=v.firstChild.firstChild;v.firstChild.cN=r.cN;r.parentNode.replaceChild(v.firstChild,r)}else{u.innerHTML=w.value}u.className=t;u.result={language:s,kw:w.keyword_count,re:w.r};if(w.second_best){u.second_best={language:w.second_best.language,kw:w.second_best.keyword_count,re:w.second_best.r}}}function k(){if(k.called){return}k.called=true;var r=document.getElementsByTagName("pre");for(var p=0;p<r.length;p++){var q=j(r[p]);if(q){o(q,hljs.tabReplace)}}}function n(){if(window.addEventListener){window.addEventListener("DOMContentLoaded",k,false);window.addEventListener("load",k,false)}else{if(window.attachEvent){window.attachEvent("onload",k)}else{window.onload=k}}}var d={};this.LANGUAGES=d;this.highlight=e;this.highlightAuto=f;this.fixMarkup=h;this.highlightBlock=o;this.initHighlighting=k;this.initHighlightingOnLoad=n;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="\\b(0x[A-Za-z0-9]+|\\d+(\\.\\d+)?)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|\\.|-|-=|/|/=|:|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\.",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.inherit=function(p,s){var r={};for(var q in p){r[q]=p[q]}if(s){for(var q in s){r[q]=s[q]}}return r}}();hljs.LANGUAGES.javascript={dM:{k:{keyword:{"in":1,"if":1,"for":1,"while":1,"finally":1,"var":1,"new":1,"function":1,"do":1,"return":1,"void":1,"else":1,"break":1,"catch":1,"instanceof":1,"with":1,"throw":1,"case":1,"default":1,"try":1,"this":1,"switch":1,"continue":1,"typeof":1,"delete":1},literal:{"true":1,"false":1,"null":1}},c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM,hljs.CNM,{b:"("+hljs.RSR+"|case|return|throw)\\s*",k:{"return":1,"throw":1,"case":1},c:[hljs.CLCM,hljs.CBLCLM,{cN:"regexp",b:"/",e:"/[gim]*",c:[{b:"\\\\/"}]}],r:0},{cN:"function",b:"\\bfunction\\b",e:"{",k:{"function":1},c:[{cN:"title",b:"[A-Za-z$_][0-9A-Za-z$_]*"},{cN:"params",b:"\\(",e:"\\)",c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM]}]}]}};hljs.LANGUAGES.css=function(){var a={cN:"function",b:hljs.IR+"\\(",e:"\\)",c:[{eW:true,eE:true,c:[hljs.NM,hljs.ASM,hljs.QSM]}]};return{cI:true,dM:{i:"[=/|']",c:[hljs.CBLCLM,{cN:"id",b:"\\#[A-Za-z0-9_-]+"},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"pseudo",b:":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+"},{cN:"at_rule",b:"@(font-face|page)",l:"[a-z-]+",k:{"font-face":1,page:1}},{cN:"at_rule",b:"@",e:"[{;]",eE:true,k:{"import":1,page:1,media:1,charset:1},c:[a,hljs.ASM,hljs.QSM,hljs.NM]},{cN:"tag",b:hljs.IR,r:0},{cN:"rules",b:"{",e:"}",i:"[^\\s]",r:0,c:[hljs.CBLCLM,{cN:"rule",b:"[^\\s]",rB:true,e:";",eW:true,c:[{cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[a,hljs.NM,hljs.QSM,hljs.ASM,hljs.CBLCLM,{cN:"hexcolor",b:"\\#[0-9A-F]+"},{cN:"important",b:"!important"}]}}]}]}]}}}();hljs.LANGUAGES.xml=function(){var b="[A-Za-z0-9\\._:-]+";var a={eW:true,c:[{cN:"attribute",b:b,r:0},{b:'="',rB:true,e:'"',c:[{cN:"value",b:'"',eW:true}]},{b:"='",rB:true,e:"'",c:[{cN:"value",b:"'",eW:true}]},{b:"=",c:[{cN:"value",b:"[^\\s/>]+"}]}]};return{cI:true,dM:{c:[{cN:"pi",b:"<\\?",e:"\\?>",r:10},{cN:"doctype",b:"<!DOCTYPE",e:">",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"<!--",e:"-->",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"<style",e:">",k:{title:{style:1}},c:[a],starts:{cN:"css",e:"</style>",rE:true,sL:"css"}},{cN:"tag",b:"<script",e:">",k:{title:{script:1}},c:[a],starts:{cN:"javascript",e:"<\/script>",rE:true,sL:"javascript"}},{cN:"vbscript",b:"<%",e:"%>",sL:"vbscript"},{cN:"tag",b:"</?",e:"/?>",c:[{cN:"title",b:"[^ />]+"},a]}]}}}();
+d3.selectAll("code:not([class])").classed("javascript", 1);
+d3.selectAll("code").each(function() { hljs.highlightBlock(this); });
diff -x graphtree -Naru ./js/vendors/jquery.ztree.core-3.5.js graphtree/js/vendors/jquery.ztree.core-3.5.js
--- ./js/vendors/jquery.ztree.core-3.5.js	1970-01-01 08:00:00.000000000 +0800
+++ graphtree/js/vendors/jquery.ztree.core-3.5.js	2016-04-18 19:04:39.000000000 +0800
@@ -0,0 +1,1671 @@
+/*
+ * JQuery zTree core 3.5.13
+ * http://zTree.me/
+ *
+ * Copyright (c) 2010 Hunter.z
+ *
+ * Licensed same as jquery - MIT License
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * email: hunter.z@263.net
+ * Date: 2013-06-02
+ */
+(function($){
+	var settings = {}, roots = {}, caches = {},
+	//default consts of core
+	_consts = {
+		className: {
+			BUTTON: "button",
+			LEVEL: "level",
+			ICO_LOADING: "ico_loading",
+			SWITCH: "switch"
+		},
+		event: {
+			NODECREATED: "ztree_nodeCreated",
+			CLICK: "ztree_click",
+			EXPAND: "ztree_expand",
+			COLLAPSE: "ztree_collapse",
+			ASYNC_SUCCESS: "ztree_async_success",
+			ASYNC_ERROR: "ztree_async_error"
+		},
+		id: {
+			A: "_a",
+			ICON: "_ico",
+			SPAN: "_span",
+			SWITCH: "_switch",
+			UL: "_ul"
+		},
+		line: {
+			ROOT: "root",
+			ROOTS: "roots",
+			CENTER: "center",
+			BOTTOM: "bottom",
+			NOLINE: "noline",
+			LINE: "line"
+		},
+		folder: {
+			OPEN: "open",
+			CLOSE: "close",
+			DOCU: "docu"
+		},
+		node: {
+			CURSELECTED: "curSelectedNode"
+		}
+	},
+	//default setting of core
+	_setting = {
+		treeId: "",
+		treeObj: null,
+		view: {
+			addDiyDom: null,
+			autoCancelSelected: true,
+			dblClickExpand: true,
+			expandSpeed: "fast",
+			fontCss: {},
+			nameIsHTML: false,
+			selectedMulti: true,
+			showIcon: true,
+			showLine: true,
+			showTitle: true
+		},
+		data: {
+			key: {
+				children: "children",
+				name: "name",
+				title: "",
+				url: "url"
+			},
+			simpleData: {
+				enable: false,
+				idKey: "id",
+				pIdKey: "pId",
+				rootPId: null
+			},
+			keep: {
+				parent: false,
+				leaf: false
+			}
+		},
+		async: {
+			enable: false,
+			contentType: "application/x-www-form-urlencoded",
+			type: "post",
+			dataType: "text",
+			url: "",
+			autoParam: [],
+			otherParam: [],
+			dataFilter: null
+		},
+		callback: {
+			beforeAsync:null,
+			beforeClick:null,
+			beforeDblClick:null,
+			beforeRightClick:null,
+			beforeMouseDown:null,
+			beforeMouseUp:null,
+			beforeExpand:null,
+			beforeCollapse:null,
+			beforeRemove:null,
+
+			onAsyncError:null,
+			onAsyncSuccess:null,
+			onNodeCreated:null,
+			onClick:null,
+			onDblClick:null,
+			onRightClick:null,
+			onMouseDown:null,
+			onMouseUp:null,
+			onExpand:null,
+			onCollapse:null,
+			onRemove:null
+		}
+	},
+	//default root of core
+	//zTree use root to save full data
+	_initRoot = function (setting) {
+		var r = data.getRoot(setting);
+		if (!r) {
+			r = {};
+			data.setRoot(setting, r);
+		}
+		r[setting.data.key.children] = [];
+		r.expandTriggerFlag = false;
+		r.curSelectedList = [];
+		r.noSelection = true;
+		r.createdNodes = [];
+		r.zId = 0;
+		r._ver = (new Date()).getTime();
+	},
+	//default cache of core
+	_initCache = function(setting) {
+		var c = data.getCache(setting);
+		if (!c) {
+			c = {};
+			data.setCache(setting, c);
+		}
+		c.nodes = [];
+		c.doms = [];
+	},
+	//default bindEvent of core
+	_bindEvent = function(setting) {
+		var o = setting.treeObj,
+		c = consts.event;
+		o.bind(c.NODECREATED, function (event, treeId, node) {
+			tools.apply(setting.callback.onNodeCreated, [event, treeId, node]);
+		});
+
+		o.bind(c.CLICK, function (event, srcEvent, treeId, node, clickFlag) {
+			tools.apply(setting.callback.onClick, [srcEvent, treeId, node, clickFlag]);
+		});
+
+		o.bind(c.EXPAND, function (event, treeId, node) {
+			tools.apply(setting.callback.onExpand, [event, treeId, node]);
+		});
+
+		o.bind(c.COLLAPSE, function (event, treeId, node) {
+			tools.apply(setting.callback.onCollapse, [event, treeId, node]);
+		});
+
+		o.bind(c.ASYNC_SUCCESS, function (event, treeId, node, msg) {
+			tools.apply(setting.callback.onAsyncSuccess, [event, treeId, node, msg]);
+		});
+
+		o.bind(c.ASYNC_ERROR, function (event, treeId, node, XMLHttpRequest, textStatus, errorThrown) {
+			tools.apply(setting.callback.onAsyncError, [event, treeId, node, XMLHttpRequest, textStatus, errorThrown]);
+		});
+	},
+	_unbindEvent = function(setting) {
+		var o = setting.treeObj,
+		c = consts.event;
+		o.unbind(c.NODECREATED)
+		.unbind(c.CLICK)
+		.unbind(c.EXPAND)
+		.unbind(c.COLLAPSE)
+		.unbind(c.ASYNC_SUCCESS)
+		.unbind(c.ASYNC_ERROR);
+	},
+	//default event proxy of core
+	_eventProxy = function(event) {
+		var target = event.target,
+		setting = data.getSetting(event.data.treeId),
+		tId = "", node = null,
+		nodeEventType = "", treeEventType = "",
+		nodeEventCallback = null, treeEventCallback = null,
+		tmp = null;
+
+		if (tools.eqs(event.type, "mousedown")) {
+			treeEventType = "mousedown";
+		} else if (tools.eqs(event.type, "mouseup")) {
+			treeEventType = "mouseup";
+		} else if (tools.eqs(event.type, "contextmenu")) {
+			treeEventType = "contextmenu";
+		} else if (tools.eqs(event.type, "click")) {
+			if (tools.eqs(target.tagName, "span") && target.getAttribute("treeNode"+ consts.id.SWITCH) !== null) {
+				tId = tools.getNodeMainDom(target).id;
+				nodeEventType = "switchNode";
+			} else {
+				tmp = tools.getMDom(setting, target, [{tagName:"a", attrName:"treeNode"+consts.id.A}]);
+				if (tmp) {
+					tId = tools.getNodeMainDom(tmp).id;
+					nodeEventType = "clickNode";
+				}
+			}
+		} else if (tools.eqs(event.type, "dblclick")) {
+			treeEventType = "dblclick";
+			tmp = tools.getMDom(setting, target, [{tagName:"a", attrName:"treeNode"+consts.id.A}]);
+			if (tmp) {
+				tId = tools.getNodeMainDom(tmp).id;
+				nodeEventType = "switchNode";
+			}
+		}
+		if (treeEventType.length > 0 && tId.length == 0) {
+			tmp = tools.getMDom(setting, target, [{tagName:"a", attrName:"treeNode"+consts.id.A}]);
+			if (tmp) {tId = tools.getNodeMainDom(tmp).id;}
+		}
+		// event to node
+		if (tId.length>0) {
+			node = data.getNodeCache(setting, tId);
+			switch (nodeEventType) {
+				case "switchNode" :
+					if (!node.isParent) {
+						nodeEventType = "";
+					} else if (tools.eqs(event.type, "click")
+						|| (tools.eqs(event.type, "dblclick") && tools.apply(setting.view.dblClickExpand, [setting.treeId, node], setting.view.dblClickExpand))) {
+						nodeEventCallback = handler.onSwitchNode;
+					} else {
+						nodeEventType = "";
+					}
+					break;
+				case "clickNode" :
+					nodeEventCallback = handler.onClickNode;
+					break;
+			}
+		}
+		// event to zTree
+		switch (treeEventType) {
+			case "mousedown" :
+				treeEventCallback = handler.onZTreeMousedown;
+				break;
+			case "mouseup" :
+				treeEventCallback = handler.onZTreeMouseup;
+				break;
+			case "dblclick" :
+				treeEventCallback = handler.onZTreeDblclick;
+				break;
+			case "contextmenu" :
+				treeEventCallback = handler.onZTreeContextmenu;
+				break;
+		}
+		var proxyResult = {
+			stop: false,
+			node: node,
+			nodeEventType: nodeEventType,
+			nodeEventCallback: nodeEventCallback,
+			treeEventType: treeEventType,
+			treeEventCallback: treeEventCallback
+		};
+		return proxyResult
+	},
+	//default init node of core
+	_initNode = function(setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) {
+		if (!n) return;
+		var r = data.getRoot(setting),
+		childKey = setting.data.key.children;
+		n.level = level;
+		n.tId = setting.treeId + "_" + (++r.zId);
+		n.parentTId = parentNode ? parentNode.tId : null;
+		if (n[childKey] && n[childKey].length > 0) {
+			if (typeof n.open == "string") n.open = tools.eqs(n.open, "true");
+			n.open = !!n.open;
+			n.isParent = true;
+			n.zAsync = true;
+		} else {
+			n.open = false;
+			if (typeof n.isParent == "string") n.isParent = tools.eqs(n.isParent, "true");
+			n.isParent = !!n.isParent;
+			n.zAsync = !n.isParent;
+		}
+		n.isFirstNode = isFirstNode;
+		n.isLastNode = isLastNode;
+		n.getParentNode = function() {return data.getNodeCache(setting, n.parentTId);};
+		n.getPreNode = function() {return data.getPreNode(setting, n);};
+		n.getNextNode = function() {return data.getNextNode(setting, n);};
+		n.isAjaxing = false;
+		data.fixPIdKeyValue(setting, n);
+	},
+	_init = {
+		bind: [_bindEvent],
+		unbind: [_unbindEvent],
+		caches: [_initCache],
+		nodes: [_initNode],
+		proxys: [_eventProxy],
+		roots: [_initRoot],
+		beforeA: [],
+		afterA: [],
+		innerBeforeA: [],
+		innerAfterA: [],
+		zTreeTools: []
+	},
+	//method of operate data
+	data = {
+		addNodeCache: function(setting, node) {
+			data.getCache(setting).nodes[data.getNodeCacheId(node.tId)] = node;
+		},
+		getNodeCacheId: function(tId) {
+			return tId.substring(tId.lastIndexOf("_")+1);
+		},
+		addAfterA: function(afterA) {
+			_init.afterA.push(afterA);
+		},
+		addBeforeA: function(beforeA) {
+			_init.beforeA.push(beforeA);
+		},
+		addInnerAfterA: function(innerAfterA) {
+			_init.innerAfterA.push(innerAfterA);
+		},
+		addInnerBeforeA: function(innerBeforeA) {
+			_init.innerBeforeA.push(innerBeforeA);
+		},
+		addInitBind: function(bindEvent) {
+			_init.bind.push(bindEvent);
+		},
+		addInitUnBind: function(unbindEvent) {
+			_init.unbind.push(unbindEvent);
+		},
+		addInitCache: function(initCache) {
+			_init.caches.push(initCache);
+		},
+		addInitNode: function(initNode) {
+			_init.nodes.push(initNode);
+		},
+		addInitProxy: function(initProxy, isFirst) {
+			if (!!isFirst) {
+				_init.proxys.splice(0,0,initProxy);
+			} else {
+				_init.proxys.push(initProxy);
+			}
+		},
+		addInitRoot: function(initRoot) {
+			_init.roots.push(initRoot);
+		},
+		addNodesData: function(setting, parentNode, nodes) {
+			var childKey = setting.data.key.children;
+			if (!parentNode[childKey]) parentNode[childKey] = [];
+			if (parentNode[childKey].length > 0) {
+				parentNode[childKey][parentNode[childKey].length - 1].isLastNode = false;
+				view.setNodeLineIcos(setting, parentNode[childKey][parentNode[childKey].length - 1]);
+			}
+			parentNode.isParent = true;
+			parentNode[childKey] = parentNode[childKey].concat(nodes);
+		},
+		addSelectedNode: function(setting, node) {
+			var root = data.getRoot(setting);
+			if (!data.isSelectedNode(setting, node)) {
+				root.curSelectedList.push(node);
+			}
+		},
+		addCreatedNode: function(setting, node) {
+			if (!!setting.callback.onNodeCreated || !!setting.view.addDiyDom) {
+				var root = data.getRoot(setting);
+				root.createdNodes.push(node);
+			}
+		},
+		addZTreeTools: function(zTreeTools) {
+			_init.zTreeTools.push(zTreeTools);
+		},
+		exSetting: function(s) {
+			$.extend(true, _setting, s);
+		},
+		fixPIdKeyValue: function(setting, node) {
+			if (setting.data.simpleData.enable) {
+				node[setting.data.simpleData.pIdKey] = node.parentTId ? node.getParentNode()[setting.data.simpleData.idKey] : setting.data.simpleData.rootPId;
+			}
+		},
+		getAfterA: function(setting, node, array) {
+			for (var i=0, j=_init.afterA.length; i<j; i++) {
+				_init.afterA[i].apply(this, arguments);
+			}
+		},
+		getBeforeA: function(setting, node, array) {
+			for (var i=0, j=_init.beforeA.length; i<j; i++) {
+				_init.beforeA[i].apply(this, arguments);
+			}
+		},
+		getInnerAfterA: function(setting, node, array) {
+			for (var i=0, j=_init.innerAfterA.length; i<j; i++) {
+				_init.innerAfterA[i].apply(this, arguments);
+			}
+		},
+		getInnerBeforeA: function(setting, node, array) {
+			for (var i=0, j=_init.innerBeforeA.length; i<j; i++) {
+				_init.innerBeforeA[i].apply(this, arguments);
+			}
+		},
+		getCache: function(setting) {
+			return caches[setting.treeId];
+		},
+		getNextNode: function(setting, node) {
+			if (!node) return null;
+			var childKey = setting.data.key.children,
+			p = node.parentTId ? node.getParentNode() : data.getRoot(setting);
+			for (var i=0, l=p[childKey].length-1; i<=l; i++) {
+				if (p[childKey][i] === node) {
+					return (i==l ? null : p[childKey][i+1]);
+				}
+			}
+			return null;
+		},
+		getNodeByParam: function(setting, nodes, key, value) {
+			if (!nodes || !key) return null;
+			var childKey = setting.data.key.children;
+			for (var i = 0, l = nodes.length; i < l; i++) {
+				if (nodes[i][key] == value) {
+					return nodes[i];
+				}
+				var tmp = data.getNodeByParam(setting, nodes[i][childKey], key, value);
+				if (tmp) return tmp;
+			}
+			return null;
+		},
+		getNodeCache: function(setting, tId) {
+			if (!tId) return null;
+			var n = caches[setting.treeId].nodes[data.getNodeCacheId(tId)];
+			return n ? n : null;
+		},
+		getNodeName: function(setting, node) {
+			var nameKey = setting.data.key.name;
+			return "" + node[nameKey];
+		},
+		getNodeTitle: function(setting, node) {
+			var t = setting.data.key.title === "" ? setting.data.key.name : setting.data.key.title;
+			return "" + node[t];
+		},
+		getNodes: function(setting) {
+			return data.getRoot(setting)[setting.data.key.children];
+		},
+		getNodesByParam: function(setting, nodes, key, value) {
+			if (!nodes || !key) return [];
+			var childKey = setting.data.key.children,
+			result = [];
+			for (var i = 0, l = nodes.length; i < l; i++) {
+				if (nodes[i][key] == value) {
+					result.push(nodes[i]);
+				}
+				result = result.concat(data.getNodesByParam(setting, nodes[i][childKey], key, value));
+			}
+			return result;
+		},
+		getNodesByParamFuzzy: function(setting, nodes, key, value) {
+			if (!nodes || !key) return [];
+			var childKey = setting.data.key.children,
+			result = [];
+			value = value.toLowerCase();
+			for (var i = 0, l = nodes.length; i < l; i++) {
+				if (typeof nodes[i][key] == "string" && nodes[i][key].toLowerCase().indexOf(value)>-1) {
+					result.push(nodes[i]);
+				}
+				result = result.concat(data.getNodesByParamFuzzy(setting, nodes[i][childKey], key, value));
+			}
+			return result;
+		},
+		getNodesByFilter: function(setting, nodes, filter, isSingle, invokeParam) {
+			if (!nodes) return (isSingle ? null : []);
+			var childKey = setting.data.key.children,
+			result = isSingle ? null : [];
+			for (var i = 0, l = nodes.length; i < l; i++) {
+				if (tools.apply(filter, [nodes[i], invokeParam], false)) {
+					if (isSingle) {return nodes[i];}
+					result.push(nodes[i]);
+				}
+				var tmpResult = data.getNodesByFilter(setting, nodes[i][childKey], filter, isSingle, invokeParam);
+				if (isSingle && !!tmpResult) {return tmpResult;}
+				result = isSingle ? tmpResult : result.concat(tmpResult);
+			}
+			return result;
+		},
+		getPreNode: function(setting, node) {
+			if (!node) return null;
+			var childKey = setting.data.key.children,
+			p = node.parentTId ? node.getParentNode() : data.getRoot(setting);
+			for (var i=0, l=p[childKey].length; i<l; i++) {
+				if (p[childKey][i] === node) {
+					return (i==0 ? null : p[childKey][i-1]);
+				}
+			}
+			return null;
+		},
+		getRoot: function(setting) {
+			return setting ? roots[setting.treeId] : null;
+		},
+		getRoots: function() {
+			return roots;
+		},
+		getSetting: function(treeId) {
+			return settings[treeId];
+		},
+		getSettings: function() {
+			return settings;
+		},
+		getZTreeTools: function(treeId) {
+			var r = this.getRoot(this.getSetting(treeId));
+			return r ? r.treeTools : null;
+		},
+		initCache: function(setting) {
+			for (var i=0, j=_init.caches.length; i<j; i++) {
+				_init.caches[i].apply(this, arguments);
+			}
+		},
+		initNode: function(setting, level, node, parentNode, preNode, nextNode) {
+			for (var i=0, j=_init.nodes.length; i<j; i++) {
+				_init.nodes[i].apply(this, arguments);
+			}
+		},
+		initRoot: function(setting) {
+			for (var i=0, j=_init.roots.length; i<j; i++) {
+				_init.roots[i].apply(this, arguments);
+			}
+		},
+		isSelectedNode: function(setting, node) {
+			var root = data.getRoot(setting);
+			for (var i=0, j=root.curSelectedList.length; i<j; i++) {
+				if(node === root.curSelectedList[i]) return true;
+			}
+			return false;
+		},
+		removeNodeCache: function(setting, node) {
+			var childKey = setting.data.key.children;
+			if (node[childKey]) {
+				for (var i=0, l=node[childKey].length; i<l; i++) {
+					arguments.callee(setting, node[childKey][i]);
+				}
+			}
+			data.getCache(setting).nodes[data.getNodeCacheId(node.tId)] = null;
+		},
+		removeSelectedNode: function(setting, node) {
+			var root = data.getRoot(setting);
+			for (var i=0, j=root.curSelectedList.length; i<j; i++) {
+				if(node === root.curSelectedList[i] || !data.getNodeCache(setting, root.curSelectedList[i].tId)) {
+					root.curSelectedList.splice(i, 1);
+					i--;j--;
+				}
+			}
+		},
+		setCache: function(setting, cache) {
+			caches[setting.treeId] = cache;
+		},
+		setRoot: function(setting, root) {
+			roots[setting.treeId] = root;
+		},
+		setZTreeTools: function(setting, zTreeTools) {
+			for (var i=0, j=_init.zTreeTools.length; i<j; i++) {
+				_init.zTreeTools[i].apply(this, arguments);
+			}
+		},
+		transformToArrayFormat: function (setting, nodes) {
+			if (!nodes) return [];
+			var childKey = setting.data.key.children,
+			r = [];
+			if (tools.isArray(nodes)) {
+				for (var i=0, l=nodes.length; i<l; i++) {
+					r.push(nodes[i]);
+					if (nodes[i][childKey])
+						r = r.concat(data.transformToArrayFormat(setting, nodes[i][childKey]));
+				}
+			} else {
+				r.push(nodes);
+				if (nodes[childKey])
+					r = r.concat(data.transformToArrayFormat(setting, nodes[childKey]));
+			}
+			return r;
+		},
+		transformTozTreeFormat: function(setting, sNodes) {
+			var i,l,
+			key = setting.data.simpleData.idKey,
+			parentKey = setting.data.simpleData.pIdKey,
+			childKey = setting.data.key.children;
+			if (!key || key=="" || !sNodes) return [];
+
+			if (tools.isArray(sNodes)) {
+				var r = [];
+				var tmpMap = [];
+				for (i=0, l=sNodes.length; i<l; i++) {
+					tmpMap[sNodes[i][key]] = sNodes[i];
+				}
+				for (i=0, l=sNodes.length; i<l; i++) {
+					if (tmpMap[sNodes[i][parentKey]] && sNodes[i][key] != sNodes[i][parentKey]) {
+						if (!tmpMap[sNodes[i][parentKey]][childKey])
+							tmpMap[sNodes[i][parentKey]][childKey] = [];
+						tmpMap[sNodes[i][parentKey]][childKey].push(sNodes[i]);
+					} else {
+						r.push(sNodes[i]);
+					}
+				}
+				return r;
+			}else {
+				return [sNodes];
+			}
+		}
+	},
+	//method of event proxy
+	event = {
+		bindEvent: function(setting) {
+			for (var i=0, j=_init.bind.length; i<j; i++) {
+				_init.bind[i].apply(this, arguments);
+			}
+		},
+		unbindEvent: function(setting) {
+			for (var i=0, j=_init.unbind.length; i<j; i++) {
+				_init.unbind[i].apply(this, arguments);
+			}
+		},
+		bindTree: function(setting) {
+			var eventParam = {
+				treeId: setting.treeId
+			},
+			o = setting.treeObj;
+			// for can't select text
+			o.bind('selectstart', function(e){
+					var n = e.originalEvent.srcElement.nodeName.toLowerCase();
+					return (n === "input" || n === "textarea" );
+			}).css({
+				"-moz-user-select":"-moz-none"
+			});
+			o.bind('click', eventParam, event.proxy);
+			o.bind('dblclick', eventParam, event.proxy);
+			o.bind('mouseover', eventParam, event.proxy);
+			o.bind('mouseout', eventParam, event.proxy);
+			o.bind('mousedown', eventParam, event.proxy);
+			o.bind('mouseup', eventParam, event.proxy);
+			o.bind('contextmenu', eventParam, event.proxy);
+		},
+		unbindTree: function(setting) {
+			var o = setting.treeObj;
+			o.unbind('click', event.proxy)
+			.unbind('dblclick', event.proxy)
+			.unbind('mouseover', event.proxy)
+			.unbind('mouseout', event.proxy)
+			.unbind('mousedown', event.proxy)
+			.unbind('mouseup', event.proxy)
+			.unbind('contextmenu', event.proxy);
+		},
+		doProxy: function(e) {
+			var results = [];
+			for (var i=0, j=_init.proxys.length; i<j; i++) {
+				var proxyResult = _init.proxys[i].apply(this, arguments);
+				results.push(proxyResult);
+				if (proxyResult.stop) {
+					break;
+				}
+			}
+			return results;
+		},
+		proxy: function(e) {
+			var setting = data.getSetting(e.data.treeId);
+			if (!tools.uCanDo(setting, e)) return true;
+			var results = event.doProxy(e),
+			r = true, x = false;
+			for (var i=0, l=results.length; i<l; i++) {
+				var proxyResult = results[i];
+				if (proxyResult.nodeEventCallback) {
+					x = true;
+					r = proxyResult.nodeEventCallback.apply(proxyResult, [e, proxyResult.node]) && r;
+				}
+				if (proxyResult.treeEventCallback) {
+					x = true;
+					r = proxyResult.treeEventCallback.apply(proxyResult, [e, proxyResult.node]) && r;
+				}
+			}
+			return r;
+		}
+	},
+	//method of event handler
+	handler = {
+		onSwitchNode: function (event, node) {
+			var setting = data.getSetting(event.data.treeId);
+			if (node.open) {
+				if (tools.apply(setting.callback.beforeCollapse, [setting.treeId, node], true) == false) return true;
+				data.getRoot(setting).expandTriggerFlag = true;
+				view.switchNode(setting, node);
+			} else {
+				if (tools.apply(setting.callback.beforeExpand, [setting.treeId, node], true) == false) return true;
+				data.getRoot(setting).expandTriggerFlag = true;
+				view.switchNode(setting, node);
+			}
+			return true;
+		},
+		onClickNode: function (event, node) {
+			var setting = data.getSetting(event.data.treeId),
+			clickFlag = ( (setting.view.autoCancelSelected && event.ctrlKey) && data.isSelectedNode(setting, node)) ? 0 : (setting.view.autoCancelSelected && event.ctrlKey && setting.view.selectedMulti) ? 2 : 1;
+			if (tools.apply(setting.callback.beforeClick, [setting.treeId, node, clickFlag], true) == false) return true;
+			if (clickFlag === 0) {
+				view.cancelPreSelectedNode(setting, node);
+			} else {
+				view.selectNode(setting, node, clickFlag === 2);
+			}
+			setting.treeObj.trigger(consts.event.CLICK, [event, setting.treeId, node, clickFlag]);
+			return true;
+		},
+		onZTreeMousedown: function(event, node) {
+			var setting = data.getSetting(event.data.treeId);
+			if (tools.apply(setting.callback.beforeMouseDown, [setting.treeId, node], true)) {
+				tools.apply(setting.callback.onMouseDown, [event, setting.treeId, node]);
+			}
+			return true;
+		},
+		onZTreeMouseup: function(event, node) {
+			var setting = data.getSetting(event.data.treeId);
+			if (tools.apply(setting.callback.beforeMouseUp, [setting.treeId, node], true)) {
+				tools.apply(setting.callback.onMouseUp, [event, setting.treeId, node]);
+			}
+			return true;
+		},
+		onZTreeDblclick: function(event, node) {
+			var setting = data.getSetting(event.data.treeId);
+			if (tools.apply(setting.callback.beforeDblClick, [setting.treeId, node], true)) {
+				tools.apply(setting.callback.onDblClick, [event, setting.treeId, node]);
+			}
+			return true;
+		},
+		onZTreeContextmenu: function(event, node) {
+			var setting = data.getSetting(event.data.treeId);
+			if (tools.apply(setting.callback.beforeRightClick, [setting.treeId, node], true)) {
+				tools.apply(setting.callback.onRightClick, [event, setting.treeId, node]);
+			}
+			return (typeof setting.callback.onRightClick) != "function";
+		}
+	},
+	//method of tools for zTree
+	tools = {
+		apply: function(fun, param, defaultValue) {
+			if ((typeof fun) == "function") {
+				return fun.apply(zt, param?param:[]);
+			}
+			return defaultValue;
+		},
+		canAsync: function(setting, node) {
+			var childKey = setting.data.key.children;
+			return (setting.async.enable && node && node.isParent && !(node.zAsync || (node[childKey] && node[childKey].length > 0)));
+		},
+		clone: function (obj){
+			if (obj === null) return null;
+			var o = tools.isArray(obj) ? [] : {};
+			for(var i in obj){
+				o[i] = (obj[i] instanceof Date) ? new Date(obj[i].getTime()) : (typeof obj[i] === "object" ? arguments.callee(obj[i]) : obj[i]);
+			}
+			return o;
+		},
+		eqs: function(str1, str2) {
+			return str1.toLowerCase() === str2.toLowerCase();
+		},
+		isArray: function(arr) {
+			return Object.prototype.toString.apply(arr) === "[object Array]";
+		},
+		$: function(node, exp, setting) {
+			if (!!exp && typeof exp != "string") {
+				setting = exp;
+				exp = "";
+			}
+			if (typeof node == "string") {
+				return $(node, setting ? setting.treeObj.get(0).ownerDocument : null);
+			} else {
+				return $("#" + node.tId + exp, setting ? setting.treeObj : null);
+			}
+		},
+		getMDom: function (setting, curDom, targetExpr) {
+			if (!curDom) return null;
+			while (curDom && curDom.id !== setting.treeId) {
+				for (var i=0, l=targetExpr.length; curDom.tagName && i<l; i++) {
+					if (tools.eqs(curDom.tagName, targetExpr[i].tagName) && curDom.getAttribute(targetExpr[i].attrName) !== null) {
+						return curDom;
+					}
+				}
+				curDom = curDom.parentNode;
+			}
+			return null;
+		},
+		getNodeMainDom:function(target) {
+			return ($(target).parent("li").get(0) || $(target).parentsUntil("li").parent().get(0));
+		},
+		uCanDo: function(setting, e) {
+			return true;
+		}
+	},
+	//method of operate ztree dom
+	view = {
+		addNodes: function(setting, parentNode, newNodes, isSilent) {
+			if (setting.data.keep.leaf && parentNode && !parentNode.isParent) {
+				return;
+			}
+			if (!tools.isArray(newNodes)) {
+				newNodes = [newNodes];
+			}
+			if (setting.data.simpleData.enable) {
+				newNodes = data.transformTozTreeFormat(setting, newNodes);
+			}
+			if (parentNode) {
+				var target_switchObj = $$(parentNode, consts.id.SWITCH, setting),
+				target_icoObj = $$(parentNode, consts.id.ICON, setting),
+				target_ulObj = $$(parentNode, consts.id.UL, setting);
+
+				if (!parentNode.open) {
+					view.replaceSwitchClass(parentNode, target_switchObj, consts.folder.CLOSE);
+					view.replaceIcoClass(parentNode, target_icoObj, consts.folder.CLOSE);
+					parentNode.open = false;
+					target_ulObj.css({
+						"display": "none"
+					});
+				}
+
+				data.addNodesData(setting, parentNode, newNodes);
+				view.createNodes(setting, parentNode.level + 1, newNodes, parentNode);
+				if (!isSilent) {
+					view.expandCollapseParentNode(setting, parentNode, true);
+				}
+			} else {
+				data.addNodesData(setting, data.getRoot(setting), newNodes);
+				view.createNodes(setting, 0, newNodes, null);
+			}
+		},
+		appendNodes: function(setting, level, nodes, parentNode, initFlag, openFlag) {
+			if (!nodes) return [];
+			var html = [],
+			childKey = setting.data.key.children;
+			for (var i = 0, l = nodes.length; i < l; i++) {
+				var node = nodes[i];
+				if (initFlag) {
+					var tmpPNode = (parentNode) ? parentNode: data.getRoot(setting),
+					tmpPChild = tmpPNode[childKey],
+					isFirstNode = ((tmpPChild.length == nodes.length) && (i == 0)),
+					isLastNode = (i == (nodes.length - 1));
+					data.initNode(setting, level, node, parentNode, isFirstNode, isLastNode, openFlag);
+					data.addNodeCache(setting, node);
+				}
+
+				var childHtml = [];
+				if (node[childKey] && node[childKey].length > 0) {
+					//make child html first, because checkType
+					childHtml = view.appendNodes(setting, level + 1, node[childKey], node, initFlag, openFlag && node.open);
+				}
+				if (openFlag) {
+
+					view.makeDOMNodeMainBefore(html, setting, node);
+					view.makeDOMNodeLine(html, setting, node);
+					data.getBeforeA(setting, node, html);
+					view.makeDOMNodeNameBefore(html, setting, node);
+					data.getInnerBeforeA(setting, node, html);
+					view.makeDOMNodeIcon(html, setting, node);
+					data.getInnerAfterA(setting, node, html);
+					view.makeDOMNodeNameAfter(html, setting, node);
+					data.getAfterA(setting, node, html);
+					if (node.isParent && node.open) {
+						view.makeUlHtml(setting, node, html, childHtml.join(''));
+					}
+					view.makeDOMNodeMainAfter(html, setting, node);
+					data.addCreatedNode(setting, node);
+				}
+			}
+			return html;
+		},
+		appendParentULDom: function(setting, node) {
+			var html = [],
+			nObj = $$(node, setting);
+			if (!nObj.get(0) && !!node.parentTId) {
+				view.appendParentULDom(setting, node.getParentNode());
+				nObj = $$(node, setting);
+			}
+			var ulObj = $$(node, consts.id.UL, setting);
+			if (!ulObj.get(0)) {
+				var childKey = setting.data.key.children,
+				childHtml = view.appendNodes(setting, node.level+1, node[childKey], node, false, true);
+				view.makeUlHtml(setting, node, html, childHtml.join(''));
+				nObj.append(html.join(''));
+			}
+		},
+		asyncNode: function(setting, node, isSilent, callback) {
+			var i, l;
+			if (node && !node.isParent) {
+				tools.apply(callback);
+				return false;
+			} else if (node && node.isAjaxing) {
+				return false;
+			} else if (tools.apply(setting.callback.beforeAsync, [setting.treeId, node], true) == false) {
+				tools.apply(callback);
+				return false;
+			}
+			if (node) {
+				node.isAjaxing = true;
+				var icoObj = $$(node, consts.id.ICON, setting);
+				icoObj.attr({"style":"", "class":consts.className.BUTTON + " " + consts.className.ICO_LOADING});
+			}
+
+			var tmpParam = {};
+			for (i = 0, l = setting.async.autoParam.length; node && i < l; i++) {
+				var pKey = setting.async.autoParam[i].split("="), spKey = pKey;
+				if (pKey.length>1) {
+					spKey = pKey[1];
+					pKey = pKey[0];
+				}
+				tmpParam[spKey] = node[pKey];
+			}
+			if (tools.isArray(setting.async.otherParam)) {
+				for (i = 0, l = setting.async.otherParam.length; i < l; i += 2) {
+					tmpParam[setting.async.otherParam[i]] = setting.async.otherParam[i + 1];
+				}
+			} else {
+				for (var p in setting.async.otherParam) {
+					tmpParam[p] = setting.async.otherParam[p];
+				}
+			}
+
+			var _tmpV = data.getRoot(setting)._ver;
+			$.ajax({
+				contentType: setting.async.contentType,
+				type: setting.async.type,
+				url: tools.apply(setting.async.url, [setting.treeId, node], setting.async.url),
+				data: tmpParam,
+				dataType: setting.async.dataType,
+				success: function(msg) {
+					if (_tmpV != data.getRoot(setting)._ver) {
+						return;
+					}
+					var newNodes = [];
+					try {
+						if (!msg || msg.length == 0) {
+							newNodes = [];
+						} else if (typeof msg == "string") {
+							newNodes = eval("(" + msg + ")");
+						} else {
+							newNodes = msg;
+						}
+					} catch(err) {
+						newNodes = msg;
+					}
+
+					if (node) {
+						node.isAjaxing = null;
+						node.zAsync = true;
+					}
+					view.setNodeLineIcos(setting, node);
+					if (newNodes && newNodes !== "") {
+						newNodes = tools.apply(setting.async.dataFilter, [setting.treeId, node, newNodes], newNodes);
+						view.addNodes(setting, node, !!newNodes ? tools.clone(newNodes) : [], !!isSilent);
+					} else {
+						view.addNodes(setting, node, [], !!isSilent);
+					}
+					setting.treeObj.trigger(consts.event.ASYNC_SUCCESS, [setting.treeId, node, msg]);
+					tools.apply(callback);
+				},
+				error: function(XMLHttpRequest, textStatus, errorThrown) {
+					if (_tmpV != data.getRoot(setting)._ver) {
+						return;
+					}
+					if (node) node.isAjaxing = null;
+					view.setNodeLineIcos(setting, node);
+					setting.treeObj.trigger(consts.event.ASYNC_ERROR, [setting.treeId, node, XMLHttpRequest, textStatus, errorThrown]);
+				}
+			});
+			return true;
+		},
+		cancelPreSelectedNode: function (setting, node) {
+			var list = data.getRoot(setting).curSelectedList;
+			for (var i=0, j=list.length-1; j>=i; j--) {
+				if (!node || node === list[j]) {
+					$$(list[j], consts.id.A, setting).removeClass(consts.node.CURSELECTED);
+					if (node) {
+						data.removeSelectedNode(setting, node);
+						break;
+					}
+				}
+			}
+			if (!node) data.getRoot(setting).curSelectedList = [];
+		},
+		createNodeCallback: function(setting) {
+			if (!!setting.callback.onNodeCreated || !!setting.view.addDiyDom) {
+				var root = data.getRoot(setting);
+				while (root.createdNodes.length>0) {
+					var node = root.createdNodes.shift();
+					tools.apply(setting.view.addDiyDom, [setting.treeId, node]);
+					if (!!setting.callback.onNodeCreated) {
+						setting.treeObj.trigger(consts.event.NODECREATED, [setting.treeId, node]);
+					}
+				}
+			}
+		},
+		createNodes: function(setting, level, nodes, parentNode) {
+			if (!nodes || nodes.length == 0) return;
+			var root = data.getRoot(setting),
+			childKey = setting.data.key.children,
+			openFlag = !parentNode || parentNode.open || !!$$(parentNode[childKey][0], setting).get(0);
+			root.createdNodes = [];
+			var zTreeHtml = view.appendNodes(setting, level, nodes, parentNode, true, openFlag);
+			if (!parentNode) {
+				setting.treeObj.append(zTreeHtml.join(''));
+			} else {
+				var ulObj = $$(parentNode, consts.id.UL, setting);
+				if (ulObj.get(0)) {
+					ulObj.append(zTreeHtml.join(''));
+				}
+			}
+			view.createNodeCallback(setting);
+		},
+		destroy: function(setting) {
+			if (!setting) return;
+			data.initCache(setting);
+			data.initRoot(setting);
+			event.unbindTree(setting);
+			event.unbindEvent(setting);
+			setting.treeObj.empty();
+		},
+		expandCollapseNode: function(setting, node, expandFlag, animateFlag, callback) {
+			var root = data.getRoot(setting),
+			childKey = setting.data.key.children;
+			if (!node) {
+				tools.apply(callback, []);
+				return;
+			}
+			if (root.expandTriggerFlag) {
+				var _callback = callback;
+				callback = function(){
+					if (_callback) _callback();
+					if (node.open) {
+						setting.treeObj.trigger(consts.event.EXPAND, [setting.treeId, node]);
+					} else {
+						setting.treeObj.trigger(consts.event.COLLAPSE, [setting.treeId, node]);
+					}
+				};
+				root.expandTriggerFlag = false;
+			}
+			if (!node.open && node.isParent && ((!$$(node, consts.id.UL, setting).get(0)) || (node[childKey] && node[childKey].length>0 && !$$(node[childKey][0], setting).get(0)))) {
+				view.appendParentULDom(setting, node);
+				view.createNodeCallback(setting);
+			}
+			if (node.open == expandFlag) {
+				tools.apply(callback, []);
+				return;
+			}
+			var ulObj = $$(node, consts.id.UL, setting),
+			switchObj = $$(node, consts.id.SWITCH, setting),
+			icoObj = $$(node, consts.id.ICON, setting);
+
+			if (node.isParent) {
+				node.open = !node.open;
+				if (node.iconOpen && node.iconClose) {
+					icoObj.attr("style", view.makeNodeIcoStyle(setting, node));
+				}
+
+				if (node.open) {
+					view.replaceSwitchClass(node, switchObj, consts.folder.OPEN);
+					view.replaceIcoClass(node, icoObj, consts.folder.OPEN);
+					if (animateFlag == false || setting.view.expandSpeed == "") {
+						ulObj.show();
+						tools.apply(callback, []);
+					} else {
+						if (node[childKey] && node[childKey].length > 0) {
+							ulObj.slideDown(setting.view.expandSpeed, callback);
+						} else {
+							ulObj.show();
+							tools.apply(callback, []);
+						}
+					}
+				} else {
+					view.replaceSwitchClass(node, switchObj, consts.folder.CLOSE);
+					view.replaceIcoClass(node, icoObj, consts.folder.CLOSE);
+					if (animateFlag == false || setting.view.expandSpeed == "" || !(node[childKey] && node[childKey].length > 0)) {
+						ulObj.hide();
+						tools.apply(callback, []);
+					} else {
+						ulObj.slideUp(setting.view.expandSpeed, callback);
+					}
+				}
+			} else {
+				tools.apply(callback, []);
+			}
+		},
+		expandCollapseParentNode: function(setting, node, expandFlag, animateFlag, callback) {
+			if (!node) return;
+			if (!node.parentTId) {
+				view.expandCollapseNode(setting, node, expandFlag, animateFlag, callback);
+				return;
+			} else {
+				view.expandCollapseNode(setting, node, expandFlag, animateFlag);
+			}
+			if (node.parentTId) {
+				view.expandCollapseParentNode(setting, node.getParentNode(), expandFlag, animateFlag, callback);
+			}
+		},
+		expandCollapseSonNode: function(setting, node, expandFlag, animateFlag, callback) {
+			var root = data.getRoot(setting),
+			childKey = setting.data.key.children,
+			treeNodes = (node) ? node[childKey]: root[childKey],
+			selfAnimateSign = (node) ? false : animateFlag,
+			expandTriggerFlag = data.getRoot(setting).expandTriggerFlag;
+			data.getRoot(setting).expandTriggerFlag = false;
+			if (treeNodes) {
+				for (var i = 0, l = treeNodes.length; i < l; i++) {
+					if (treeNodes[i]) view.expandCollapseSonNode(setting, treeNodes[i], expandFlag, selfAnimateSign);
+				}
+			}
+			data.getRoot(setting).expandTriggerFlag = expandTriggerFlag;
+			view.expandCollapseNode(setting, node, expandFlag, animateFlag, callback );
+		},
+		makeDOMNodeIcon: function(html, setting, node) {
+			var nameStr = data.getNodeName(setting, node),
+			name = setting.view.nameIsHTML ? nameStr : nameStr.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
+			html.push("<span id='", node.tId, consts.id.ICON,
+				"' title='' treeNode", consts.id.ICON," class='", view.makeNodeIcoClass(setting, node),
+				"' style='", view.makeNodeIcoStyle(setting, node), "'></span><span id='", node.tId, consts.id.SPAN,
+				"'>",name,"</span>");
+		},
+		makeDOMNodeLine: function(html, setting, node) {
+			html.push("<span id='", node.tId, consts.id.SWITCH,	"' title='' class='", view.makeNodeLineClass(setting, node), "' treeNode", consts.id.SWITCH,"></span>");
+		},
+		makeDOMNodeMainAfter: function(html, setting, node) {
+			html.push("</li>");
+		},
+		makeDOMNodeMainBefore: function(html, setting, node) {
+			html.push("<li id='", node.tId, "' class='", consts.className.LEVEL, node.level,"' tabindex='0' hidefocus='true' treenode>");
+		},
+		makeDOMNodeNameAfter: function(html, setting, node) {
+			html.push("</a>");
+		},
+		makeDOMNodeNameBefore: function(html, setting, node) {
+			var title = data.getNodeTitle(setting, node),
+			url = view.makeNodeUrl(setting, node),
+			fontcss = view.makeNodeFontCss(setting, node),
+			fontStyle = [];
+			for (var f in fontcss) {
+				fontStyle.push(f, ":", fontcss[f], ";");
+			}
+			html.push("<a id='", node.tId, consts.id.A, "' class='", consts.className.LEVEL, node.level,"' treeNode", consts.id.A," onclick=\"", (node.click || ''),
+				"\" ", ((url != null && url.length > 0) ? "href='" + url + "'" : ""), " target='",view.makeNodeTarget(node),"' style='", fontStyle.join(''),
+				"'");
+			if (tools.apply(setting.view.showTitle, [setting.treeId, node], setting.view.showTitle) && title) {html.push("title='", title.replace(/'/g,"&#39;").replace(/</g,'&lt;').replace(/>/g,'&gt;'),"'");}
+			html.push(">");
+		},
+		makeNodeFontCss: function(setting, node) {
+			var fontCss = tools.apply(setting.view.fontCss, [setting.treeId, node], setting.view.fontCss);
+			return (fontCss && ((typeof fontCss) != "function")) ? fontCss : {};
+		},
+		makeNodeIcoClass: function(setting, node) {
+			var icoCss = ["ico"];
+			if (!node.isAjaxing) {
+				icoCss[0] = (node.iconSkin ? node.iconSkin + "_" : "") + icoCss[0];
+				if (node.isParent) {
+					icoCss.push(node.open ? consts.folder.OPEN : consts.folder.CLOSE);
+				} else {
+					icoCss.push(consts.folder.DOCU);
+				}
+			}
+			return consts.className.BUTTON + " " + icoCss.join('_');
+		},
+		makeNodeIcoStyle: function(setting, node) {
+			var icoStyle = [];
+			if (!node.isAjaxing) {
+				var icon = (node.isParent && node.iconOpen && node.iconClose) ? (node.open ? node.iconOpen : node.iconClose) : node.icon;
+				if (icon) icoStyle.push("background:url(", icon, ") 0 0 no-repeat;");
+				if (setting.view.showIcon == false || !tools.apply(setting.view.showIcon, [setting.treeId, node], true)) {
+					icoStyle.push("width:0px;height:0px;");
+				}
+			}
+			return icoStyle.join('');
+		},
+		makeNodeLineClass: function(setting, node) {
+			var lineClass = [];
+			if (setting.view.showLine) {
+				if (node.level == 0 && node.isFirstNode && node.isLastNode) {
+					lineClass.push(consts.line.ROOT);
+				} else if (node.level == 0 && node.isFirstNode) {
+					lineClass.push(consts.line.ROOTS);
+				} else if (node.isLastNode) {
+					lineClass.push(consts.line.BOTTOM);
+				} else {
+					lineClass.push(consts.line.CENTER);
+				}
+			} else {
+				lineClass.push(consts.line.NOLINE);
+			}
+			if (node.isParent) {
+				lineClass.push(node.open ? consts.folder.OPEN : consts.folder.CLOSE);
+			} else {
+				lineClass.push(consts.folder.DOCU);
+			}
+			return view.makeNodeLineClassEx(node) + lineClass.join('_');
+		},
+		makeNodeLineClassEx: function(node) {
+			return consts.className.BUTTON + " " + consts.className.LEVEL + node.level + " " + consts.className.SWITCH + " ";
+		},
+		makeNodeTarget: function(node) {
+			return (node.target || "_blank");
+		},
+		makeNodeUrl: function(setting, node) {
+			var urlKey = setting.data.key.url;
+			return node[urlKey] ? node[urlKey] : null;
+		},
+		makeUlHtml: function(setting, node, html, content) {
+			html.push("<ul id='", node.tId, consts.id.UL, "' class='", consts.className.LEVEL, node.level, " ", view.makeUlLineClass(setting, node), "' style='display:", (node.open ? "block": "none"),"'>");
+			html.push(content);
+			html.push("</ul>");
+		},
+		makeUlLineClass: function(setting, node) {
+			return ((setting.view.showLine && !node.isLastNode) ? consts.line.LINE : "");
+		},
+		removeChildNodes: function(setting, node) {
+			if (!node) return;
+			var childKey = setting.data.key.children,
+			nodes = node[childKey];
+			if (!nodes) return;
+
+			for (var i = 0, l = nodes.length; i < l; i++) {
+				data.removeNodeCache(setting, nodes[i]);
+			}
+			data.removeSelectedNode(setting);
+			delete node[childKey];
+
+			if (!setting.data.keep.parent) {
+				node.isParent = false;
+				node.open = false;
+				var tmp_switchObj = $$(node, consts.id.SWITCH, setting),
+				tmp_icoObj = $$(node, consts.id.ICON, setting);
+				view.replaceSwitchClass(node, tmp_switchObj, consts.folder.DOCU);
+				view.replaceIcoClass(node, tmp_icoObj, consts.folder.DOCU);
+				$$(node, consts.id.UL, setting).remove();
+			} else {
+				$$(node, consts.id.UL, setting).empty();
+			}
+		},
+		setFirstNode: function(setting, parentNode) {
+			var childKey = setting.data.key.children, childLength = parentNode[childKey].length;
+			if ( childLength > 0) {
+				parentNode[childKey][0].isFirstNode = true;
+			}
+		},
+		setLastNode: function(setting, parentNode) {
+			var childKey = setting.data.key.children, childLength = parentNode[childKey].length;
+			if ( childLength > 0) {
+				parentNode[childKey][childLength - 1].isLastNode = true;
+			}
+		},
+		removeNode: function(setting, node) {
+			var root = data.getRoot(setting),
+			childKey = setting.data.key.children,
+			parentNode = (node.parentTId) ? node.getParentNode() : root;
+
+			node.isFirstNode = false;
+			node.isLastNode = false;
+			node.getPreNode = function() {return null;};
+			node.getNextNode = function() {return null;};
+
+			if (!data.getNodeCache(setting, node.tId)) {
+				return;
+			}
+
+			$$(node, setting).remove();
+			data.removeNodeCache(setting, node);
+			data.removeSelectedNode(setting, node);
+
+			for (var i = 0, l = parentNode[childKey].length; i < l; i++) {
+				if (parentNode[childKey][i].tId == node.tId) {
+					parentNode[childKey].splice(i, 1);
+					break;
+				}
+			}
+			view.setFirstNode(setting, parentNode);
+			view.setLastNode(setting, parentNode);
+
+			var tmp_ulObj,tmp_switchObj,tmp_icoObj,
+			childLength = parentNode[childKey].length;
+
+			//repair nodes old parent
+			if (!setting.data.keep.parent && childLength == 0) {
+				//old parentNode has no child nodes
+				parentNode.isParent = false;
+				parentNode.open = false;
+				tmp_ulObj = $$(parentNode, consts.id.UL, setting);
+				tmp_switchObj = $$(parentNode, consts.id.SWITCH, setting);
+				tmp_icoObj = $$(parentNode, consts.id.ICON, setting);
+				view.replaceSwitchClass(parentNode, tmp_switchObj, consts.folder.DOCU);
+				view.replaceIcoClass(parentNode, tmp_icoObj, consts.folder.DOCU);
+				tmp_ulObj.css("display", "none");
+
+			} else if (setting.view.showLine && childLength > 0) {
+				//old parentNode has child nodes
+				var newLast = parentNode[childKey][childLength - 1];
+				tmp_ulObj = $$(newLast, consts.id.UL, setting);
+				tmp_switchObj = $$(newLast, consts.id.SWITCH, setting);
+				tmp_icoObj = $$(newLast, consts.id.ICON, setting);
+				if (parentNode == root) {
+					if (parentNode[childKey].length == 1) {
+						//node was root, and ztree has only one root after move node
+						view.replaceSwitchClass(newLast, tmp_switchObj, consts.line.ROOT);
+					} else {
+						var tmp_first_switchObj = $$(parentNode[childKey][0], consts.id.SWITCH, setting);
+						view.replaceSwitchClass(parentNode[childKey][0], tmp_first_switchObj, consts.line.ROOTS);
+						view.replaceSwitchClass(newLast, tmp_switchObj, consts.line.BOTTOM);
+					}
+				} else {
+					view.replaceSwitchClass(newLast, tmp_switchObj, consts.line.BOTTOM);
+				}
+				tmp_ulObj.removeClass(consts.line.LINE);
+			}
+		},
+		replaceIcoClass: function(node, obj, newName) {
+			if (!obj || node.isAjaxing) return;
+			var tmpName = obj.attr("class");
+			if (tmpName == undefined) return;
+			var tmpList = tmpName.split("_");
+			switch (newName) {
+				case consts.folder.OPEN:
+				case consts.folder.CLOSE:
+				case consts.folder.DOCU:
+					tmpList[tmpList.length-1] = newName;
+					break;
+			}
+			obj.attr("class", tmpList.join("_"));
+		},
+		replaceSwitchClass: function(node, obj, newName) {
+			if (!obj) return;
+			var tmpName = obj.attr("class");
+			if (tmpName == undefined) return;
+			var tmpList = tmpName.split("_");
+			switch (newName) {
+				case consts.line.ROOT:
+				case consts.line.ROOTS:
+				case consts.line.CENTER:
+				case consts.line.BOTTOM:
+				case consts.line.NOLINE:
+					tmpList[0] = view.makeNodeLineClassEx(node) + newName;
+					break;
+				case consts.folder.OPEN:
+				case consts.folder.CLOSE:
+				case consts.folder.DOCU:
+					tmpList[1] = newName;
+					break;
+			}
+			obj.attr("class", tmpList.join("_"));
+			if (newName !== consts.folder.DOCU) {
+				obj.removeAttr("disabled");
+			} else {
+				obj.attr("disabled", "disabled");
+			}
+		},
+		selectNode: function(setting, node, addFlag) {
+			if (!addFlag) {
+				view.cancelPreSelectedNode(setting);
+			}
+			$$(node, consts.id.A, setting).addClass(consts.node.CURSELECTED);
+			data.addSelectedNode(setting, node);
+		},
+		setNodeFontCss: function(setting, treeNode) {
+			var aObj = $$(treeNode, consts.id.A, setting),
+			fontCss = view.makeNodeFontCss(setting, treeNode);
+			if (fontCss) {
+				aObj.css(fontCss);
+			}
+		},
+		setNodeLineIcos: function(setting, node) {
+			if (!node) return;
+			var switchObj = $$(node, consts.id.SWITCH, setting),
+			ulObj = $$(node, consts.id.UL, setting),
+			icoObj = $$(node, consts.id.ICON, setting),
+			ulLine = view.makeUlLineClass(setting, node);
+			if (ulLine.length==0) {
+				ulObj.removeClass(consts.line.LINE);
+			} else {
+				ulObj.addClass(ulLine);
+			}
+			switchObj.attr("class", view.makeNodeLineClass(setting, node));
+			if (node.isParent) {
+				switchObj.removeAttr("disabled");
+			} else {
+				switchObj.attr("disabled", "disabled");
+			}
+			icoObj.removeAttr("style");
+			icoObj.attr("style", view.makeNodeIcoStyle(setting, node));
+			icoObj.attr("class", view.makeNodeIcoClass(setting, node));
+		},
+		setNodeName: function(setting, node) {
+			var title = data.getNodeTitle(setting, node),
+			nObj = $$(node, consts.id.SPAN, setting);
+			nObj.empty();
+			if (setting.view.nameIsHTML) {
+				nObj.html(data.getNodeName(setting, node));
+			} else {
+				nObj.text(data.getNodeName(setting, node));
+			}
+			if (tools.apply(setting.view.showTitle, [setting.treeId, node], setting.view.showTitle)) {
+				var aObj = $$(node, consts.id.A, setting);
+				aObj.attr("title", !title ? "" : title);
+			}
+		},
+		setNodeTarget: function(setting, node) {
+			var aObj = $$(node, consts.id.A, setting);
+			aObj.attr("target", view.makeNodeTarget(node));
+		},
+		setNodeUrl: function(setting, node) {
+			var aObj = $$(node, consts.id.A, setting),
+			url = view.makeNodeUrl(setting, node);
+			if (url == null || url.length == 0) {
+				aObj.removeAttr("href");
+			} else {
+				aObj.attr("href", url);
+			}
+		},
+		switchNode: function(setting, node) {
+			if (node.open || !tools.canAsync(setting, node)) {
+				view.expandCollapseNode(setting, node, !node.open);
+			} else if (setting.async.enable) {
+				if (!view.asyncNode(setting, node)) {
+					view.expandCollapseNode(setting, node, !node.open);
+					return;
+				}
+			} else if (node) {
+				view.expandCollapseNode(setting, node, !node.open);
+			}
+		}
+	};
+	// zTree defind
+	$.fn.zTree = {
+		consts : _consts,
+		_z : {
+			tools: tools,
+			view: view,
+			event: event,
+			data: data
+		},
+		getZTreeObj: function(treeId) {
+			var o = data.getZTreeTools(treeId);
+			return o ? o : null;
+		},
+		destroy: function(treeId) {
+			if (!!treeId && treeId.length > 0) {
+				view.destroy(data.getSetting(treeId));
+			} else {
+				for(var s in settings) {
+					view.destroy(settings[s]);
+				}
+			}
+		},
+		init: function(obj, zSetting, zNodes) {
+			var setting = tools.clone(_setting);
+			$.extend(true, setting, zSetting);
+			setting.treeId = obj.attr("id");
+			setting.treeObj = obj;
+			setting.treeObj.empty();
+			settings[setting.treeId] = setting;
+			//For some older browser,(e.g., ie6)
+			if(typeof document.body.style.maxHeight === "undefined") {
+				setting.view.expandSpeed = "";
+			}
+			data.initRoot(setting);
+			var root = data.getRoot(setting),
+			childKey = setting.data.key.children;
+			zNodes = zNodes ? tools.clone(tools.isArray(zNodes)? zNodes : [zNodes]) : [];
+			if (setting.data.simpleData.enable) {
+				root[childKey] = data.transformTozTreeFormat(setting, zNodes);
+			} else {
+				root[childKey] = zNodes;
+			}
+
+			data.initCache(setting);
+			event.unbindTree(setting);
+			event.bindTree(setting);
+			event.unbindEvent(setting);
+			event.bindEvent(setting);
+
+			var zTreeTools = {
+				setting : setting,
+				addNodes : function(parentNode, newNodes, isSilent) {
+					if (!newNodes) return null;
+					if (!parentNode) parentNode = null;
+					if (parentNode && !parentNode.isParent && setting.data.keep.leaf) return null;
+					var xNewNodes = tools.clone(tools.isArray(newNodes)? newNodes: [newNodes]);
+					function addCallback() {
+						view.addNodes(setting, parentNode, xNewNodes, (isSilent==true));
+					}
+
+					if (tools.canAsync(setting, parentNode)) {
+						view.asyncNode(setting, parentNode, isSilent, addCallback);
+					} else {
+						addCallback();
+					}
+					return xNewNodes;
+				},
+				cancelSelectedNode : function(node) {
+					view.cancelPreSelectedNode(setting, node);
+				},
+				destroy : function() {
+					view.destroy(setting);
+				},
+				expandAll : function(expandFlag) {
+					expandFlag = !!expandFlag;
+					view.expandCollapseSonNode(setting, null, expandFlag, true);
+					return expandFlag;
+				},
+				expandNode : function(node, expandFlag, sonSign, focus, callbackFlag) {
+					if (!node || !node.isParent) return null;
+					if (expandFlag !== true && expandFlag !== false) {
+						expandFlag = !node.open;
+					}
+					callbackFlag = !!callbackFlag;
+
+					if (callbackFlag && expandFlag && (tools.apply(setting.callback.beforeExpand, [setting.treeId, node], true) == false)) {
+						return null;
+					} else if (callbackFlag && !expandFlag && (tools.apply(setting.callback.beforeCollapse, [setting.treeId, node], true) == false)) {
+						return null;
+					}
+					if (expandFlag && node.parentTId) {
+						view.expandCollapseParentNode(setting, node.getParentNode(), expandFlag, false);
+					}
+					if (expandFlag === node.open && !sonSign) {
+						return null;
+					}
+
+					data.getRoot(setting).expandTriggerFlag = callbackFlag;
+					if (!tools.canAsync(setting, node) && sonSign) {
+						view.expandCollapseSonNode(setting, node, expandFlag, true, function() {
+							if (focus !== false) {try{$$(node, setting).focus().blur();}catch(e){}}
+						});
+					} else {
+						node.open = !expandFlag;
+						view.switchNode(this.setting, node);
+						if (focus !== false) {try{$$(node, setting).focus().blur();}catch(e){}}
+					}
+					return expandFlag;
+				},
+				getNodes : function() {
+					return data.getNodes(setting);
+				},
+				getNodeByParam : function(key, value, parentNode) {
+					if (!key) return null;
+					return data.getNodeByParam(setting, parentNode?parentNode[setting.data.key.children]:data.getNodes(setting), key, value);
+				},
+				getNodeByTId : function(tId) {
+					return data.getNodeCache(setting, tId);
+				},
+				getNodesByParam : function(key, value, parentNode) {
+					if (!key) return null;
+					return data.getNodesByParam(setting, parentNode?parentNode[setting.data.key.children]:data.getNodes(setting), key, value);
+				},
+				getNodesByParamFuzzy : function(key, value, parentNode) {
+					if (!key) return null;
+					return data.getNodesByParamFuzzy(setting, parentNode?parentNode[setting.data.key.children]:data.getNodes(setting), key, value);
+				},
+				getNodesByFilter: function(filter, isSingle, parentNode, invokeParam) {
+					isSingle = !!isSingle;
+					if (!filter || (typeof filter != "function")) return (isSingle ? null : []);
+					return data.getNodesByFilter(setting, parentNode?parentNode[setting.data.key.children]:data.getNodes(setting), filter, isSingle, invokeParam);
+				},
+				getNodeIndex : function(node) {
+					if (!node) return null;
+					var childKey = setting.data.key.children,
+					parentNode = (node.parentTId) ? node.getParentNode() : data.getRoot(setting);
+					for (var i=0, l = parentNode[childKey].length; i < l; i++) {
+						if (parentNode[childKey][i] == node) return i;
+					}
+					return -1;
+				},
+				getSelectedNodes : function() {
+					var r = [], list = data.getRoot(setting).curSelectedList;
+					for (var i=0, l=list.length; i<l; i++) {
+						r.push(list[i]);
+					}
+					return r;
+				},
+				isSelectedNode : function(node) {
+					return data.isSelectedNode(setting, node);
+				},
+				reAsyncChildNodes : function(parentNode, reloadType, isSilent) {
+					if (!this.setting.async.enable) return;
+					var isRoot = !parentNode;
+					if (isRoot) {
+						parentNode = data.getRoot(setting);
+					}
+					if (reloadType=="refresh") {
+						var childKey = this.setting.data.key.children;
+						for (var i = 0, l = parentNode[childKey] ? parentNode[childKey].length : 0; i < l; i++) {
+							data.removeNodeCache(setting, parentNode[childKey][i]);
+						}
+						data.removeSelectedNode(setting);
+						parentNode[childKey] = [];
+						if (isRoot) {
+							this.setting.treeObj.empty();
+						} else {
+							var ulObj = $$(parentNode, consts.id.UL, setting);
+							ulObj.empty();
+						}
+					}
+					view.asyncNode(this.setting, isRoot? null:parentNode, !!isSilent);
+				},
+				refresh : function() {
+					this.setting.treeObj.empty();
+					var root = data.getRoot(setting),
+					nodes = root[setting.data.key.children]
+					data.initRoot(setting);
+					root[setting.data.key.children] = nodes
+					data.initCache(setting);
+					view.createNodes(setting, 0, root[setting.data.key.children]);
+				},
+				removeChildNodes : function(node) {
+					if (!node) return null;
+					var childKey = setting.data.key.children,
+					nodes = node[childKey];
+					view.removeChildNodes(setting, node);
+					return nodes ? nodes : null;
+				},
+				removeNode : function(node, callbackFlag) {
+					if (!node) return;
+					callbackFlag = !!callbackFlag;
+					if (callbackFlag && tools.apply(setting.callback.beforeRemove, [setting.treeId, node], true) == false) return;
+					view.removeNode(setting, node);
+					if (callbackFlag) {
+						this.setting.treeObj.trigger(consts.event.REMOVE, [setting.treeId, node]);
+					}
+				},
+				selectNode : function(node, addFlag) {
+					if (!node) return;
+					if (tools.uCanDo(setting)) {
+						addFlag = setting.view.selectedMulti && addFlag;
+						if (node.parentTId) {
+							view.expandCollapseParentNode(setting, node.getParentNode(), true, false, function() {
+								try{$$(node, setting).focus().blur();}catch(e){}
+							});
+						} else {
+							try{$$(node, setting).focus().blur();}catch(e){}
+						}
+						view.selectNode(setting, node, addFlag);
+					}
+				},
+				transformTozTreeNodes : function(simpleNodes) {
+					return data.transformTozTreeFormat(setting, simpleNodes);
+				},
+				transformToArray : function(nodes) {
+					return data.transformToArrayFormat(setting, nodes);
+				},
+				updateNode : function(node, checkTypeFlag) {
+					if (!node) return;
+					var nObj = $$(node, setting);
+					if (nObj.get(0) && tools.uCanDo(setting)) {
+						view.setNodeName(setting, node);
+						view.setNodeTarget(setting, node);
+						view.setNodeUrl(setting, node);
+						view.setNodeLineIcos(setting, node);
+						view.setNodeFontCss(setting, node);
+					}
+				}
+			}
+			root.treeTools = zTreeTools;
+			data.setZTreeTools(setting, zTreeTools);
+
+			if (root[childKey] && root[childKey].length > 0) {
+				view.createNodes(setting, 0, root[childKey]);
+			} else if (setting.async.enable && setting.async.url && setting.async.url !== '') {
+				view.asyncNode(setting);
+			}
+			return zTreeTools;
+		}
+	};
+
+	var zt = $.fn.zTree,
+	$$ = tools.$,
+	consts = zt.consts;
+})(jQuery);
\ No newline at end of file
diff -x graphtree -Naru ./jsLoader.php graphtree/jsLoader.php
--- ./jsLoader.php	2016-02-26 17:45:58.000000000 +0800
+++ graphtree/jsLoader.php	2016-04-18 19:04:39.000000000 +0800
@@ -1,289 +1,304 @@
 <?php
-/*
-** Zabbix
-** Copyright (C) 2001-2016 Zabbix SIA
-**
-** This program is free software; you can redistribute it and/or modify
-** it under the terms of the GNU General Public License as published by
-** the Free Software Foundation; either version 2 of the License, or
-** (at your option) any later version.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-**
-** You should have received a copy of the GNU General Public License
-** along with this program; if not, write to the Free Software
-** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-**/
-
-
-// get language translations
-require_once dirname(__FILE__).'/include/gettextwrapper.inc.php';
-require_once dirname(__FILE__).'/include/js.inc.php';
-require_once dirname(__FILE__).'/include/locales.inc.php';
-
-// if we must provide language constants on language different from English
-if (isset($_GET['lang'])) {
-	if (function_exists('bindtextdomain')) {
-		// initializing gettext translations depending on language selected by user
-		$locales = zbx_locale_variants($_GET['lang']);
-		foreach ($locales as $locale) {
-			putenv('LC_ALL='.$locale);
-			putenv('LANG='.$locale);
-			putenv('LANGUAGE='.$locale);
-			if (setlocale(LC_ALL, $locale)) {
-				break;
-			}
-		}
-		bindtextdomain('frontend', 'locale');
-		bind_textdomain_codeset('frontend', 'UTF-8');
-		textdomain('frontend');
-	}
-	// numeric Locale to default
-	setlocale(LC_NUMERIC, ['C', 'POSIX', 'en', 'en_US', 'en_US.UTF-8', 'English_United States.1252', 'en_GB', 'en_GB.UTF-8']);
-}
-
-require_once dirname(__FILE__).'/include/translateDefines.inc.php';
-
-// available scripts 'scriptFileName' => 'path relative to js/'
-$availableJScripts = [
-	'common.js' => '',
-	'menupopup.js' => '',
-	'gtlc.js' => '',
-	'functions.js' => '',
-	'main.js' => '',
-	'dom.js' => '',
-	'servercheck.js' => '',
-	'flickerfreescreen.js' => '',
-	'multiselect.js' => '',
-	'chkbxrange.js' => '',
-	// vendors
-	'prototype.js' => 'vendors/',
-	'jquery.js' => 'vendors/',
-	'jquery-ui.js' => 'vendors/',
-	// classes
-	'class.bbcode.js' => '',
-	'class.calendar.js' => '',
-	'class.cdate.js' => '',
-	'class.cdebug.js' => '',
-	'class.cmap.js' => '',
-	'class.cmessages.js' => '',
-	'class.cookie.js' => '',
-	'class.cscreen.js' => '',
-	'class.csuggest.js' => '',
-	'class.cswitcher.js' => '',
-	'class.ctree.js' => '',
-	'class.curl.js' => '',
-	'class.rpc.js' => '',
-	'class.pmaster.js' => '',
-	'class.cviewswitcher.js' => '',
-	'init.js' => '',
-	// templates
-	'sysmap.tpl.js' => 'templates/',
-	// page-specific scripts
-	'items.js' => 'pages/',
-	'tr_logform.js' => 'pages/',
-];
-
-$tranStrings = [
-	'gtlc.js' => [
-		'S_ALL_S' => _('All'),
-		'S_ZOOM' => _('Zoom'),
-		'S_FIXED_SMALL' => _('fixed'),
-		'S_DYNAMIC_SMALL' => _('dynamic'),
-		'S_NOW_SMALL' => _('now'),
-		'S_YEAR_SHORT' => _x('y', 'year short'),
-		'S_MONTH_SHORT' => _x('m', 'month short'),
-		'S_DAY_SHORT' => _x('d', 'day short'),
-		'S_HOUR_SHORT' => _x('h', 'hour short'),
-		'S_MINUTE_SHORT' => _x('m', 'minute short'),
-		'S_DATE_FORMAT' => DATE_TIME_FORMAT
-	],
-	'functions.js' => [
-		'Cancel' => _('Cancel'),
-		'Execute' => _('Execute'),
-		'Execution confirmation' => _('Execution confirmation')
-	],
-	'tr_logform.js' => [
-		'S_REMOVE' => _('Remove')
-	],
-	'class.calendar.js' => [
-		'S_JANUARY' => _('January'),
-		'S_FEBRUARY' => _('February'),
-		'S_MARCH' => _('March'),
-		'S_APRIL' => _('April'),
-		'S_MAY' => _('May'),
-		'S_JUNE' => _('June'),
-		'S_JULY' => _('July'),
-		'S_AUGUST' => _('August'),
-		'S_SEPTEMBER' => _('September'),
-		'S_OCTOBER' => _('October'),
-		'S_NOVEMBER' => _('November'),
-		'S_DECEMBER' => _('December'),
-		'S_MONDAY_SHORT_BIG' => _x('M', 'Monday short'),
-		'S_TUESDAY_SHORT_BIG' => _x('T', 'Tuesday short'),
-		'S_WEDNESDAY_SHORT_BIG' => _x('W', 'Wednesday short'),
-		'S_THURSDAY_SHORT_BIG' => _x('T', 'Thursday short'),
-		'S_FRIDAY_SHORT_BIG' => _x('F', 'Friday short'),
-		'S_SATURDAY_SHORT_BIG' => _x('S', 'Saturday short'),
-		'S_SUNDAY_SHORT_BIG' => _x('S', 'Sunday short'),
-		'S_NOW' => _('Now'),
-		'S_DONE' => _('Done'),
-		'S_TIME' => _('Time')
-	],
-	'class.cmap.js' => [
-		'S_ON' => _('On'),
-		'S_OFF' => _('Off'),
-		'S_HIDDEN' => _('Hidden'),
-		'S_SHOWN' => _('Shown'),
-		'S_HOST' => _('Host'),
-		'S_MAP' => _('Map'),
-		'S_TRIGGER' => _('Trigger'),
-		'S_HOST_GROUP' => _('Host group'),
-		'S_IMAGE' => _('Image'),
-		'S_DEFAULT' => _('Default'),
-		'S_PLEASE_SELECT_TWO_ELEMENTS' => _('Please select two elements'),
-		'S_DOT' => _('Dot'),
-		'S_TWO_ELEMENTS_SHOULD_BE_SELECTED' => _('Two elements should be selected'),
-		'S_DELETE_SELECTED_ELEMENTS_Q' => _('Delete selected elements?'),
-		'S_NEW_ELEMENT' => _('New element'),
-		'S_INCORRECT_ELEMENT_MAP_LINK' => _('All links should have "Name" and "URL" specified'),
-		'S_EACH_URL_SHOULD_HAVE_UNIQUE' => _('Each URL should have a unique name. Please make sure there is only one URL named'),
-		'S_DELETE_LINKS_BETWEEN_SELECTED_ELEMENTS_Q' => _('Delete links between selected elements?'),
-		'S_NO_IMAGES' => 'You need to have at least one image uploaded to create map element. Images can be uploaded in Administration->General->Images section.',
-		'S_ICONMAP_IS_NOT_ENABLED' => _('Iconmap is not enabled'),
-		'Colour "%1$s" is not correct: expecting hexadecimal colour code (6 symbols).' => _('Colour "%1$s" is not correct: expecting hexadecimal colour code (6 symbols).')
-	],
-	'class.cmessages.js' => [
-		'S_MUTE' => _('Mute'),
-		'S_UNMUTE' => _('Unmute'),
-		'S_MESSAGES' => _('Messages'),
-		'S_CLEAR' => _('Clear'),
-		'S_SNOOZE' => _('Snooze')
-	],
-	'class.cookie.js' => [
-		'S_MAX_COOKIE_SIZE_REACHED' => _('We are sorry, the maximum possible number of elements to remember has been reached.')
-	],
-	'main.js' => [
-		'S_EXPAND' => _('Expand'),
-		'S_COLLAPSE' => _('Collapse'),
-	],
-	'multiselect.js' => [
-		'No matches found' => _('No matches found'),
-		'More matches found...' => _('More matches found...'),
-		'type here to search' => _('type here to search'),
-		'new' => _('new'),
-		'Select' => _('Select')
-	],
-	'menupopup.js' => [
-		'Acknowledge' => _('Acknowledge'),
-		'Add' => _('Add'),
-		'Configuration' => _('Configuration'),
-		'Create trigger' => _('Create trigger'),
-		'Delete service "%1$s"?' => _('Delete service "%1$s"?'),
-		'Do you wish to replace the conditional expression?' => _('Do you wish to replace the conditional expression?'),
-		'Edit trigger' => _('Edit trigger'),
-		'Events' => _('Events'),
-		'Favourite graphs' => _('Favourite graphs'),
-		'Favourite maps' => _('Favourite maps'),
-		'Favourite screens' => _('Favourite screens'),
-		'Favourite simple graphs' => _('Favourite simple graphs'),
-		'Favourite slide shows' => _('Favourite slide shows'),
-		'Insert expression' => _('Insert expression'),
-		'Trigger status "OK"' => _('Trigger status "OK"'),
-		'Trigger status "Problem"' => _('Trigger status "Problem"'),
-		'Item "%1$s"' => _('Item "%1$s"'),
-		'Go to' => _('Go to'),
-		'Graphs' => _('Graphs'),
-		'History' => _('History'),
-		'Host inventory' => _('Host inventory'),
-		'Host screens' => _('Host screens'),
-		'Latest data' => _('Latest data'),
-		'Latest values' => _('Latest values'),
-		'Last hour graph' => _('Last hour graph'),
-		'Last month graph' => _('Last month graph'),
-		'Last week graph' => _('Last week graph'),
-		'Refresh time' => _('Refresh time'),
-		'Refresh time multiplier' => _('Refresh time multiplier'),
-		'Remove' => _('Remove'),
-		'Remove all' => _('Remove all'),
-		'Scripts' => _('Scripts'),
-		'Submap' => _('Submap'),
-		'Trigger' => _('Trigger'),
-		'Triggers' => _('Triggers'),
-		'URL' => _('URL'),
-		'URLs' => _('URLs'),
-		'10 seconds' => _n('%1$s second', '%1$s seconds', 10),
-		'30 seconds' => _n('%1$s second', '%1$s seconds', 30),
-		'1 minute' => _n('%1$s minute', '%1$s minutes', 1),
-		'2 minutes' => _n('%1$s minute', '%1$s minutes', 2),
-		'10 minutes' => _n('%1$s minute', '%1$s minutes', 10),
-		'15 minutes' => _n('%1$s minute', '%1$s minutes', 15)
-	],
-	'items.js' => [
-		'To set a host interface select a single item type for all items' => _('To set a host interface select a single item type for all items'),
-		'No interface found' => _('No interface found')
-	]
-];
-
-if (empty($_GET['files'])) {
-	$files = [
-		'prototype.js',
-		'jquery.js',
-		'jquery-ui.js',
-		'common.js',
-		'class.cdebug.js',
-		'class.cdate.js',
-		'class.cookie.js',
-		'class.curl.js',
-		'class.rpc.js',
-		'class.bbcode.js',
-		'class.csuggest.js',
-		'main.js',
-		'chkbxrange.js',
-		'functions.js',
-		'menupopup.js',
-		'init.js'
-	];
-
-	// load frontend messaging only for some pages
-	if (isset($_GET['showGuiMessaging']) && $_GET['showGuiMessaging']) {
-		$files[] = 'class.cmessages.js';
-	}
-}
-else {
-	$files = $_GET['files'];
-}
-
-$js = 'if (typeof(locale) == "undefined") { var locale = {}; }'."\n";
-foreach ($files as $file) {
-	if (isset($tranStrings[$file])) {
-		foreach ($tranStrings[$file] as $origStr => $str) {
-			$js .= "locale['".$origStr."'] = ".zbx_jsvalue($str).";";
-		}
-	}
-}
-
-foreach ($files as $file) {
-	if (isset($availableJScripts[$file])) {
-		$js .= file_get_contents('js/'.$availableJScripts[$file].$file)."\n";
-	}
-}
-
-$jsLength = strlen($js);
-$etag = md5($jsLength);
-if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == $etag) {
-	header('HTTP/1.1 304 Not Modified');
-	header('ETag: '.$etag);
-	exit;
-}
-
-header('Content-type: text/javascript; charset=UTF-8');
-// breaks if "zlib.output_compression = On"
-// header('Content-length: '.$jsLength);
-header('Cache-Control: public, must-revalidate');
-header('ETag: '.$etag);
+    /*
+    ** Zabbix
+    ** Copyright (C) 2001-2016 Zabbix SIA
+    **
+    ** This program is free software; you can redistribute it and/or modify
+    ** it under the terms of the GNU General Public License as published by
+    ** the Free Software Foundation; either version 2 of the License, or
+    ** (at your option) any later version.
+    **
+    ** This program is distributed in the hope that it will be useful,
+    ** but WITHOUT ANY WARRANTY; without even the implied warranty of
+    ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+    ** GNU General Public License for more details.
+    **
+    ** You should have received a copy of the GNU General Public License
+    ** along with this program; if not, write to the Free Software
+    ** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+    **/
+
+
+    // get language translations
+    require_once dirname (__FILE__) . '/include/gettextwrapper.inc.php';
+    require_once dirname (__FILE__) . '/include/js.inc.php';
+    require_once dirname (__FILE__) . '/include/locales.inc.php';
+
+    // if we must provide language constants on language different from English
+    if (isset($_GET['lang'])) {
+        if (function_exists ('bindtextdomain')) {
+            // initializing gettext translations depending on language selected by user
+            $locales = zbx_locale_variants ($_GET['lang']);
+            foreach ($locales as $locale) {
+                putenv ('LC_ALL=' . $locale);
+                putenv ('LANG=' . $locale);
+                putenv ('LANGUAGE=' . $locale);
+                if (setlocale (LC_ALL, $locale)) {
+                    break;
+                }
+            }
+            bindtextdomain ('frontend', 'locale');
+            bind_textdomain_codeset ('frontend', 'UTF-8');
+            textdomain ('frontend');
+        }
+        // numeric Locale to default
+        setlocale (LC_NUMERIC, [
+            'C',
+            'POSIX',
+            'en',
+            'en_US',
+            'en_US.UTF-8',
+            'English_United States.1252',
+            'en_GB',
+            'en_GB.UTF-8'
+        ]);
+    }
+
+    require_once dirname (__FILE__) . '/include/translateDefines.inc.php';
+
+    // available scripts 'scriptFileName' => 'path relative to js/'
+    $availableJScripts = [
+        'common.js'                         => '',
+        'menupopup.js'                      => '',
+        'gtlc.js'                           => '',
+        'functions.js'                      => '',
+        'main.js'                           => '',
+        'dom.js'                            => '',
+        'servercheck.js'                    => '',
+        'flickerfreescreen.js'              => '',
+        'multiselect.js'                    => '',
+        'chkbxrange.js'                     => '',
+        // vendors
+        'prototype.js'                      => 'vendors/',
+        'jquery.js'                         => 'vendors/',
+        'jquery-ui.js'                      => 'vendors/',
+        'jquery.ztree.core-3.5.js'          => 'vendors/',
+        'd3.v2.js'                          => 'vendors/',
+        'cubism.v1.js'                      => 'vendors/',
+        'emcharts.js'                       => 'vendors/emcharts/',
+        'serial.js'                         => 'vendors/emcharts/',
+        'jquery.datetimepicker.full.min.js' => 'vendors/jquery-datetimepicker/',
+
+        // classes
+        'class.bbcode.js'                   => '',
+        'class.calendar.js'                 => '',
+        'class.cdate.js'                    => '',
+        'class.cdebug.js'                   => '',
+        'class.cmap.js'                     => '',
+        'class.cmessages.js'                => '',
+        'class.cookie.js'                   => '',
+        'class.cscreen.js'                  => '',
+        'class.csuggest.js'                 => '',
+        'class.cswitcher.js'                => '',
+        'class.ctree.js'                    => '',
+        'class.curl.js'                     => '',
+        'class.rpc.js'                      => '',
+        'class.pmaster.js'                  => '',
+        'class.cviewswitcher.js'            => '',
+        'init.js'                           => '',
+        // templates
+        'sysmap.tpl.js'                     => 'templates/',
+        // page-specific scripts
+        'items.js'                          => 'pages/',
+        'tr_logform.js'                     => 'pages/',
+    ];
+
+    $tranStrings = [
+        'gtlc.js'            => [
+            'S_ALL_S'         => _ ('All'),
+            'S_ZOOM'          => _ ('Zoom'),
+            'S_FIXED_SMALL'   => _ ('fixed'),
+            'S_DYNAMIC_SMALL' => _ ('dynamic'),
+            'S_NOW_SMALL'     => _ ('now'),
+            'S_YEAR_SHORT'    => _x ('y', 'year short'),
+            'S_MONTH_SHORT'   => _x ('m', 'month short'),
+            'S_DAY_SHORT'     => _x ('d', 'day short'),
+            'S_HOUR_SHORT'    => _x ('h', 'hour short'),
+            'S_MINUTE_SHORT'  => _x ('m', 'minute short'),
+            'S_DATE_FORMAT'   => DATE_TIME_FORMAT
+        ],
+        'functions.js'       => [
+            'Cancel'                 => _ ('Cancel'),
+            'Execute'                => _ ('Execute'),
+            'Execution confirmation' => _ ('Execution confirmation')
+        ],
+        'tr_logform.js'      => [
+            'S_REMOVE' => _ ('Remove')
+        ],
+        'class.calendar.js'  => [
+            'S_JANUARY'             => _ ('January'),
+            'S_FEBRUARY'            => _ ('February'),
+            'S_MARCH'               => _ ('March'),
+            'S_APRIL'               => _ ('April'),
+            'S_MAY'                 => _ ('May'),
+            'S_JUNE'                => _ ('June'),
+            'S_JULY'                => _ ('July'),
+            'S_AUGUST'              => _ ('August'),
+            'S_SEPTEMBER'           => _ ('September'),
+            'S_OCTOBER'             => _ ('October'),
+            'S_NOVEMBER'            => _ ('November'),
+            'S_DECEMBER'            => _ ('December'),
+            'S_MONDAY_SHORT_BIG'    => _x ('M', 'Monday short'),
+            'S_TUESDAY_SHORT_BIG'   => _x ('T', 'Tuesday short'),
+            'S_WEDNESDAY_SHORT_BIG' => _x ('W', 'Wednesday short'),
+            'S_THURSDAY_SHORT_BIG'  => _x ('T', 'Thursday short'),
+            'S_FRIDAY_SHORT_BIG'    => _x ('F', 'Friday short'),
+            'S_SATURDAY_SHORT_BIG'  => _x ('S', 'Saturday short'),
+            'S_SUNDAY_SHORT_BIG'    => _x ('S', 'Sunday short'),
+            'S_NOW'                 => _ ('Now'),
+            'S_DONE'                => _ ('Done'),
+            'S_TIME'                => _ ('Time')
+        ],
+        'class.cmap.js'      => [
+            'S_ON'                                                                         => _ ('On'),
+            'S_OFF'                                                                        => _ ('Off'),
+            'S_HIDDEN'                                                                     => _ ('Hidden'),
+            'S_SHOWN'                                                                      => _ ('Shown'),
+            'S_HOST'                                                                       => _ ('Host'),
+            'S_MAP'                                                                        => _ ('Map'),
+            'S_TRIGGER'                                                                    => _ ('Trigger'),
+            'S_HOST_GROUP'                                                                 => _ ('Host group'),
+            'S_IMAGE'                                                                      => _ ('Image'),
+            'S_DEFAULT'                                                                    => _ ('Default'),
+            'S_PLEASE_SELECT_TWO_ELEMENTS'                                                 => _ ('Please select two elements'),
+            'S_DOT'                                                                        => _ ('Dot'),
+            'S_TWO_ELEMENTS_SHOULD_BE_SELECTED'                                            => _ ('Two elements should be selected'),
+            'S_DELETE_SELECTED_ELEMENTS_Q'                                                 => _ ('Delete selected elements?'),
+            'S_NEW_ELEMENT'                                                                => _ ('New element'),
+            'S_INCORRECT_ELEMENT_MAP_LINK'                                                 => _ ('All links should have "Name" and "URL" specified'),
+            'S_EACH_URL_SHOULD_HAVE_UNIQUE'                                                => _ ('Each URL should have a unique name. Please make sure there is only one URL named'),
+            'S_DELETE_LINKS_BETWEEN_SELECTED_ELEMENTS_Q'                                   => _ ('Delete links between selected elements?'),
+            'S_NO_IMAGES'                                                                  => 'You need to have at least one image uploaded to create map element. Images can be uploaded in Administration->General->Images section.',
+            'S_ICONMAP_IS_NOT_ENABLED'                                                     => _ ('Iconmap is not enabled'),
+            'Colour "%1$s" is not correct: expecting hexadecimal colour code (6 symbols).' => _ ('Colour "%1$s" is not correct: expecting hexadecimal colour code (6 symbols).')
+        ],
+        'class.cmessages.js' => [
+            'S_MUTE'     => _ ('Mute'),
+            'S_UNMUTE'   => _ ('Unmute'),
+            'S_MESSAGES' => _ ('Messages'),
+            'S_CLEAR'    => _ ('Clear'),
+            'S_SNOOZE'   => _ ('Snooze')
+        ],
+        'class.cookie.js'    => [
+            'S_MAX_COOKIE_SIZE_REACHED' => _ ('We are sorry, the maximum possible number of elements to remember has been reached.')
+        ],
+        'main.js'            => [
+            'S_EXPAND'   => _ ('Expand'),
+            'S_COLLAPSE' => _ ('Collapse'),
+        ],
+        'multiselect.js'     => [
+            'No matches found'      => _ ('No matches found'),
+            'More matches found...' => _ ('More matches found...'),
+            'type here to search'   => _ ('type here to search'),
+            'new'                   => _ ('new'),
+            'Select'                => _ ('Select')
+        ],
+        'menupopup.js'       => [
+            'Acknowledge'                                        => _ ('Acknowledge'),
+            'Add'                                                => _ ('Add'),
+            'Configuration'                                      => _ ('Configuration'),
+            'Create trigger'                                     => _ ('Create trigger'),
+            'Delete service "%1$s"?'                             => _ ('Delete service "%1$s"?'),
+            'Do you wish to replace the conditional expression?' => _ ('Do you wish to replace the conditional expression?'),
+            'Edit trigger'                                       => _ ('Edit trigger'),
+            'Events'                                             => _ ('Events'),
+            'Favourite graphs'                                   => _ ('Favourite graphs'),
+            'Favourite maps'                                     => _ ('Favourite maps'),
+            'Favourite screens'                                  => _ ('Favourite screens'),
+            'Favourite simple graphs'                            => _ ('Favourite simple graphs'),
+            'Favourite slide shows'                              => _ ('Favourite slide shows'),
+            'Insert expression'                                  => _ ('Insert expression'),
+            'Trigger status "OK"'                                => _ ('Trigger status "OK"'),
+            'Trigger status "Problem"'                           => _ ('Trigger status "Problem"'),
+            'Item "%1$s"'                                        => _ ('Item "%1$s"'),
+            'Go to'                                              => _ ('Go to'),
+            'Graphs'                                             => _ ('Graphs'),
+            'History'                                            => _ ('History'),
+            'Host inventory'                                     => _ ('Host inventory'),
+            'Host screens'                                       => _ ('Host screens'),
+            'Latest data'                                        => _ ('Latest data'),
+            'Latest values'                                      => _ ('Latest values'),
+            'Last hour graph'                                    => _ ('Last hour graph'),
+            'Last month graph'                                   => _ ('Last month graph'),
+            'Last week graph'                                    => _ ('Last week graph'),
+            'Refresh time'                                       => _ ('Refresh time'),
+            'Refresh time multiplier'                            => _ ('Refresh time multiplier'),
+            'Remove'                                             => _ ('Remove'),
+            'Remove all'                                         => _ ('Remove all'),
+            'Scripts'                                            => _ ('Scripts'),
+            'Submap'                                             => _ ('Submap'),
+            'Trigger'                                            => _ ('Trigger'),
+            'Triggers'                                           => _ ('Triggers'),
+            'URL'                                                => _ ('URL'),
+            'URLs'                                               => _ ('URLs'),
+            '10 seconds'                                         => _n ('%1$s second', '%1$s seconds', 10),
+            '30 seconds'                                         => _n ('%1$s second', '%1$s seconds', 30),
+            '1 minute'                                           => _n ('%1$s minute', '%1$s minutes', 1),
+            '2 minutes'                                          => _n ('%1$s minute', '%1$s minutes', 2),
+            '10 minutes'                                         => _n ('%1$s minute', '%1$s minutes', 10),
+            '15 minutes'                                         => _n ('%1$s minute', '%1$s minutes', 15)
+        ],
+        'items.js'           => [
+            'To set a host interface select a single item type for all items' => _ ('To set a host interface select a single item type for all items'),
+            'No interface found'                                              => _ ('No interface found')
+        ]
+    ];
+
+    if (empty($_GET['files'])) {
+        $files = [
+            'prototype.js',
+            'jquery.js',
+            'jquery-ui.js',
+            'common.js',
+            'class.cdebug.js',
+            'class.cdate.js',
+            'class.cookie.js',
+            'class.curl.js',
+            'class.rpc.js',
+            'class.bbcode.js',
+            'class.csuggest.js',
+            'main.js',
+            'chkbxrange.js',
+            'functions.js',
+            'menupopup.js',
+            'init.js'
+        ];
+
+        // load frontend messaging only for some pages
+        if (isset($_GET['showGuiMessaging']) && $_GET['showGuiMessaging']) {
+            $files[] = 'class.cmessages.js';
+        }
+    } else {
+        $files = $_GET['files'];
+    }
+
+    $js = 'if (typeof(locale) == "undefined") { var locale = {}; }' . "\n";
+    foreach ($files as $file) {
+        if (isset($tranStrings[$file])) {
+            foreach ($tranStrings[$file] as $origStr => $str) {
+                $js .= "locale['" . $origStr . "'] = " . zbx_jsvalue ($str) . ";";
+            }
+        }
+    }
+
+    foreach ($files as $file) {
+        if (isset($availableJScripts[$file])) {
+            $js .= file_get_contents ('js/' . $availableJScripts[$file] . $file) . "\n";
+        }
+    }
+
+    $jsLength = strlen ($js);
+    $etag = md5 ($jsLength);
+    if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == $etag) {
+        header ('HTTP/1.1 304 Not Modified');
+        header ('ETag: ' . $etag);
+        exit;
+    }
+
+    header ('Content-type: text/javascript; charset=UTF-8');
+    // breaks if "zlib.output_compression = On"
+    // header('Content-length: '.$jsLength);
+    header ('Cache-Control: public, must-revalidate');
+    header ('ETag: ' . $etag);
 
-echo $js;
+    echo $js;
diff -x graphtree -Naru ./locale/lt/LC_MESSAGES/frontend.po graphtree/locale/lt/LC_MESSAGES/frontend.po
--- ./locale/lt/LC_MESSAGES/frontend.po	2016-02-26 17:45:56.000000000 +0800
+++ graphtree/locale/lt/LC_MESSAGES/frontend.po	2016-04-18 19:04:39.000000000 +0800
@@ -251,8 +251,8 @@
 msgid "Access denied!"
 msgstr "Prieiga uÅ¾drausta!"
 
-# 1 sekundei
-# 2-9 sekundÄ—ms
+# 1 sekundei
+# 2-9 sekundÄ—ms
 # 20-100 sekundÅ¾iÅ³ and e.t.c.
 #: include/classes/api/services/CUser.php:1069
 #, c-format
@@ -1104,8 +1104,8 @@
 msgid "Bitwise AND of last (most recent) T value and mask is NOT N"
 msgstr ""
 
-# female - mirksinti
-# male - mirksintis
+# female - mirksinti
+# male - mirksintis
 #: adm.triggerdisplayoptions.php:38 adm.triggerdisplayoptions.php:39
 #: adm.triggerdisplayoptions.php:40 adm.triggerdisplayoptions.php:41
 msgid "Blinking"
diff -x graphtree -Naru ./locale/lv/LC_MESSAGES/frontend.po graphtree/locale/lv/LC_MESSAGES/frontend.po
--- ./locale/lv/LC_MESSAGES/frontend.po	2016-02-26 17:45:57.000000000 +0800
+++ graphtree/locale/lv/LC_MESSAGES/frontend.po	2016-04-18 19:04:39.000000000 +0800
@@ -575,7 +575,7 @@
 msgid "Add to host group"
 msgstr "Pievienot resursdatoru grupai"
 
-# Pievienot resursdatoru grupÄ�m?
+# Pievienot resursdatoru grupÄ�m?
 #
 #: include/actions.inc.php:622
 msgid "Add to host groups"
diff -x graphtree -Naru ./locale/pt_BR/LC_MESSAGES/frontend.po graphtree/locale/pt_BR/LC_MESSAGES/frontend.po
--- ./locale/pt_BR/LC_MESSAGES/frontend.po	2016-02-26 17:45:56.000000000 +0800
+++ graphtree/locale/pt_BR/LC_MESSAGES/frontend.po	2016-04-18 19:04:39.000000000 +0800
@@ -8434,7 +8434,7 @@
 msgid "Item \"%1$s\" already exists on \"%2$s\", inherited from another template."
 msgstr "O item \"%1$s\" jÃ¡ existe em \"%2$s\", herdado de outro template."
 
-# Very similar string !
+# Very similar string !
 # api/classes/CItemGeneral.php:100
 #: include/classes/api/services/CItem.php:38
 #, c-format
@@ -8717,8 +8717,8 @@
 msgid "June"
 msgstr "Junho"
 
-# In another strings the standard is:
-# Keep XXXX for (in days) 
+# In another strings the standard is:
+# Keep XXXX for (in days) 
 # Maybe change to the standard?
 #: include/views/configuration.host.discovery.edit.php:244
 msgid "Keep lost resources period (in days)"
@@ -10304,7 +10304,7 @@
 msgid "No interface found"
 msgstr "Nenhuma interface encontrada"
 
-# very similary
+# very similary
 # include/views/configuration.item.edit.php:112 include/views/configuration.item.massupdate.php:77 include/views/js/configuration.item.edit.js.php:84
 #: include/classes/api/services/CItemGeneral.php:282
 msgid "No interface found."
@@ -10340,7 +10340,7 @@
 msgid "No item with itemid \"%1$s\"."
 msgstr "Nenhum item com o itemid \"%1$s\"."
 
-# very similary
+# very similary
 # include/items.inc.php:493
 #: include/items.inc.php:516
 #, c-format
@@ -13182,7 +13182,7 @@
 msgid "Show events not older than (in days)"
 msgstr "NÃ£o exibir eventos mais antigos que (em dias)"
 
-# very similar
+# very similar
 # adm.gui.php:34 include/views/administration.general.gui.edit.php:43
 #: include/profiles.inc.php:165
 #, c-format
@@ -15284,9 +15284,9 @@
 msgid "User group sharing is missing parameters: %1$s for map \"%2$s\"."
 msgstr "O grupo de usuÃ¡rios compartilhado possui parÃ¢metros ausentes: %1$s no mapa \"%2$s\"."
 
-# Oleksiy:
-# The original message is not beter like (double quotes on first parameter):
-# User group sharing is missing parameters: "%1$s" for screen "%2$s". 
+# Oleksiy:
+# The original message is not beter like (double quotes on first parameter):
+# User group sharing is missing parameters: "%1$s" for screen "%2$s". 
 # ?
 #: include/classes/api/services/CScreen.php:579
 #: include/classes/api/services/CScreen.php:915
diff -x graphtree -Naru ./styles/ztree/line_conn.gif graphtree/styles/ztree/line_conn.gif
--- ./styles/ztree/line_conn.gif	1970-01-01 08:00:00.000000000 +0800
+++ graphtree/styles/ztree/line_conn.gif	2016-04-18 19:04:39.000000000 +0800
@@ -0,0 +1 @@
+GIF89a	€ÌÌÌÿÿÿ!ù,	Œ�iP;
\ No newline at end of file
diff -x graphtree -Naru ./styles/ztree/loading.gif graphtree/styles/ztree/loading.gif
--- ./styles/ztree/loading.gif	1970-01-01 08:00:00.000000000 +0800
+++ graphtree/styles/ztree/loading.gif	2016-04-18 19:04:39.000000000 +0800
@@ -0,0 +1,13 @@
+GIF89a¢ÂØñ„±äs¦àÈÜóÏàôçðúÿÿÿ!ÿNETSCAPE2.0!ù
+,0hºEµ02ˆ\ Ó^��D”eô],ã´_ÙÊëU·ö«ê‹ù.ÏëFªà‚Çd!ù
+,hj°&ˆPHaŽë]	!ù
+,XTÖFƒ8£`æ	!ù
+,
+XTf4¤)Öj´ BÃ@!ù
+,
+hVTJƒ(æ”¨ ÂÍJ!ù
+,
+hjEµ†`.ˆë]	!ù
+,
+Ö"8£X!e’Aæ-	!ù
+,f!¡)Öj-¤42HÃE;
\ No newline at end of file
diff -x graphtree -Naru ./styles/ztree/zTreeStandard.gif graphtree/styles/ztree/zTreeStandard.gif
--- ./styles/ztree/zTreeStandard.gif	1970-01-01 08:00:00.000000000 +0800
+++ graphtree/styles/ztree/zTreeStandard.gif	2016-04-18 19:04:39.000000000 +0800
@@ -0,0 +1,33 @@
+GIF89a aæL«æÙ×Ñ¥¤£ä«Šüüû…Ùda·ë���sÏP÷ë•»ËØôôò·Ÿ_úÂTÊh2ÔÒÊõºGÌÌÌêˆLòà}¿¯Œ¨èÿãáÜù·9ú¦r^‚¢ÉÇ»ýÏ­! !ììêÓêÿj³JŒµÒ¹¹·¦ö‰ÍªGLi�ýØˆüõ«)Z„øš`9šÐäÓ9ôéMpÊþ—Ùþx˜µdÀ÷ìéãªÓêüÝœ­¿ÐÞÜ×°Ô®e®×iwoòíÜûæ¹OÅBääá’áÿ„ÙÿX¤Ï[¸2æôÿûÊgððî÷ïsïÑ‡äÄt”îrðîêf†¤ûâ­øø÷ÂåÂÿû·«´» Òžxƒ…›É”Þ”k…Åìß¸`‡ËòùîÃúñÎíÃaž�œýÁ˜þ¶„}ÖÿÂÙÿúóÙt�«s{©éÙq¸à§çíòª­©îØ”ìã§¶µ®’ºìvÀí…˜ªÄyOèË‚sŽ¡Û×¬§­¶‡�ËöúÿÑÒ¢äÀ¥ÑÍÁççèC¡Ö¶žèèåäêïŒ´{ûÑxîóíQ€ÿÿÿÿÿÿ!ù, aÿ€}‚ƒ„ƒ…ˆ‚‹b3'3bŒ•Ž�’”•›œ�žŸ ¡¢£¤ž}4¨4;xBB}‡©ª¬®°²‹
+}HM43H}
+›»½¿ÁÃ¥ÊËÌ¡rQQrŸa??aÖŒ§¨«­¯B²áµä°çºMã®�É
+ïñóÍûÍ9Dÿs€’ãC–
²`p §S˜DHQàGpâl•[Ð.>!8ÊÓžFX3úP"ir��”šøÉµ†‰Í›dºx’£aiªiXéáÄ£",.:õÑÜ%èTíXÇ!$Ô?Àšrô2+’q5t8é°µëÌ³ŸjÞ´ib�[·Iÿù	ªÐ�Ÿ»A78øö‡À‰FŒè@Xâk}´>½šØ‡[U9(¹zÏ%G%öþT«ƒ”§™eÎpAº´³�F›&�ºR°cË†]d‘ƒZ0ÜÕr× ¢ÂDlä.qŠ[^L«ª «Nnþç�å“œ¨~½ŽŽïÒ•hŸéÂñG`Xpñ©üùé×wz=»~í?Q²äÖí‡?-ZDÁa�! Ã]æ‡`§ÔõÑJdáA(‹$·85]fvàDdP<?.¼7‡z4°çI‰è¡¨â&E$ ãŒ4Êx_PäØ[Ž9þÄÈ_p×�~™Ô!^ö ÿ~ Y…LÊÌFÌÀ•W¯t…g|@x¥L. 7‡4ð"'aÂ‡¢™�LQã›	L±HP(Ôy—ÒÔéã"?$‘wiÄ‡P9“MÊŽdKÞ5R3h¸ä.+A*)„”~Á›vÊé&.,0Ç¨£>Àž§•„Jj©§~ºˆ›pÒ(çjhQ'
+wáê‡(h¡#‰À°ä‡°Så�è({(³îÌP¥=ôØ#í¡ÔžåB|sðg‚_™ß†»È¤«îºéŽ°ÈQ` �xÝ‰A0‹@±ü"E²JBHd³#ê(#»x¡À
+x!1}8±ÿÄôx²©(. 8Ç·˜ËHÇdzKGÈ� ËîÊîþQ‡ 0ï�¼à@ŒàÑ°ƒhìx’H!Bm#—D2I'Ig‚Ö.”2Ê+J}2Õ›¨¼òº-+1€ðÎ;o¼jP #J@±³�=WâÓp‹²q(ª­ÖÚ&u›v÷"kŒà÷ß€û½#P0
 
l²€Ü)ìP±”Ñ†`~ô~4=	_H?¢tLq—ÎÌ0 P<Ð8'¨ëñÁ6èá:8VT‘C2”PÂ{:¹ïÞûïÁÏpOP@OL\É.Í?}Æ�ÌMŠö£p�–b”€ÿbœí‰Ðð@4t`þRºóî;ðÂ7€NüÇÓ„ýî˜‘ÿ¸Aµ2à¿ùP€¦K GÑ‡Ý5¥ük`>Â>Ê2H’<¨¤}À 9’nÞE
+A±B™ 6HA
+lÐmâ…1œa
+ÑÞ�Ä<ï¦ò¤ Îà	2�–¸ÄýÝ +GLâÂ2'îm�Ìð@þ!�OÄ h¨€[€†Ä _ãËxÆ¥ôn9
€:z÷˜WD&Ž¢@	4ÈDÈ È€fô˜Îxæ��ÔÔ2Z¨±P¨e-9ñDì Fà’b´C1ÉJòàÿ“™lc|—¤§@@Ž‡ðt"£„SÊâD(A™xÊíÀR–ßépPK,Îä‘7iË[Ö—¾¤ <è†T |!À1“	€X³™ÏDÌïÕÊ ãwb¼9È=ð‘‰d€@"3@s~¨*PHg"©Ff/ô©�lî4ð`[¸K@ý° a“ýüg@ºÌ‚ôÀsÖƒ.@Î>D”•%ç�7Ë\à‰Xyð´Ä%�‚Ô—üÈ§>i³´`,`Á]dêl¡6`„Ka*S,³¦7Í©Eƒp)PÁ3£ tT2@xJ$ƒGMèT¨â@ªÿ *=é¶Ö|"o¥¹›È°Å²þƒ	¸O
+ZSš¶5¦-H#ÖÚÖš	®ríCý xJŠ6U¯ûãë8ýšÜ€‚Í*uqØÄ{ÍpO‹ä³"óL6\d0ÁZ6k"Äik}�hïò‚KŠ6®sm�h_àÖ’ö¨Õ+ã8XÂ"°´õkSuÑ‡ÃªóÒ[žoÜ­‚‚E¢rQ{Þ3®pU!³+…Mˆ0+Pá0À]´ë¼€
+>`„u±«Ýìn÷»áÕœ"Ô›‹Exî„îÆ	�°4´¤éc*“Èqß5…‹1ŠÕŒ¦0+
—¼ËO€€€Fðÿ2
�`;¥¥ó”†A%ªU™êSÜS•‡[µ1²
+ØF-«C
+¨@áŸú B
+p¶³ø’8†±ŒqÆÞ¢aÎò¥¯üÀ‰÷>m[êéV¹Ú3.“™SØÚºÀÐ5ØA
+-¾¤¤`¼O	VÆrŽ·Üå³õhNsš t¨9Ícˆs›v6¸!MðÂ	°§€:ßÙ
z†,
+GA2|ìdû…Úš@&²)îÑ#¸Ï‚
˜6@
+@ð:ÂUúÒ™ÞôëÎüf4³yÎ¤Vó–Àê16n�f­�& a€±žµj}kmYMXCÓ¯ƒÍ�˜J†2tÁí`ÿwld+»Ó©Vó©Q�…8�¡Ú¬æÀ\ÝˆÄz§Cšp‚•x;5`õj0îr+R`õª'â}š§¡O|í{'îö¹�‡¥ž6ªWÝêlk›Û3`CÀ=mq§Š
+O7×‚‡cøâ¦‹6>ð%hÛà—Ü`ŽÀ¶þÃÈÍ°nð@a	(GÂ»KaONØó xCÎwþËyÚà†7®CÒtÑ69:V]�7}Û¯Ô@É9>†� :R_B.›^õ«c|g¸à‡xà ðù&‘‰Tä"œH£+@F3‚cÍJ?Ó)Ôê9÷bêCÊÿ¾„ÿwzfÛ)7n÷Š°	gÀÔ¾£$e?ø@RàÎIJ"ó“Î¬€&—bj“wÜég¸”¼“WŠ¬O÷–^În‹]gPÙÏþ…/h ~ Íi*ÓšÊt&4±qÓS›à©?µ,ò@‚&žÍ‚'Aþ@}ë§›Õ5Èþö/7Æƒw!;ÖÏ.|!ENqü@# ‡“þè‹õïÐ3öÁùl†Ø§n€}¡lÐg(ç0Ö@¨€ÖÖ€
+`C·
+ 0vp°~@àø~•@ �q˜§ ÒR/S
+ÖSAuˆjá&gÓ–~ $�MPÿki@È5xƒ9Ø;Øƒ3·=æ÷	o ~è�g?BB$FB( ÅV*8S5Å±¥^>f4>ø^6Ô9¢“	x�¡�„Ø�L‚?â'Q(9‚B…Z£EZ­[re†üPsXÑUõ6o~xEo�†Lèîç„‹,ýò/~à/üRÈ²ãe^ÝU^èÕ…Cƒ‰‰ð…cø9EÖ‰ðµ’¥&”Õ	£"ãKè�\`ˆl¸û²ˆ$¸
30‹a	Öb/Ö`ÖÅ#?È#<Äƒ?¾Ê£'Ð<D={FÉHËøÍÈB„f"Êµ"Ìu�›àëWˆ†è~fP	:#ÿ‹DÂ/?@c.³bY†c16c‡@ŒÁ¸?÷c<Å¨nEðjþCVD°Xõ@@2 �üè�$"&%“hýu��ðjÈŠßHˆøi³6>cŽo³`veëHf^v»óflD
Tq†m·W0'`d@mm°WÀî&+é’êÖ3én�´a!Öa¤òa¨22@É* Æ½—”Jù$ð{•ð8‘#9ÚP9Žói˜jœ¶¼#m!Ae@€‡’R‚Ddà-ÀFEp EmÐrN°q –W¤HfJ.L¶hxÉ	; !ð—€)k°°²C;¶ÓiOÙlÉ¶ÿl‡Ð;x’¨Ô_ùq¨'–ƒä’ u! r0ëä<-×/š‚&Ãhí¡—ÄÆ÷¶>4Pú¶	üæoú6J%Pz§æJ‡@Nw™˜	KDRg!@S¶ôZÚ–œÛ&Ã†�Ó©‡¡0J{Ð|Ó6Nèà›áÄjW@NìDmà—Æù™¡I…"K`š3AosÙ‡]uE`möéE§Ce¸8dt;Àcr¥žÀ9MµQkp2©É¹–"Õ–³—pRÖ	
+c(~g^FsWw›T	r·Fv·Á# µ}Me“PE žI`4in-êÿ É“ú	
+(:häy z£¢B
+z¡´{•[¶XE nái[õpXW@`2ê�†ÅUJ`¿%h;Z	=J$=
+¤Àg|×dMÊW|È„|ÕÔiz[³ÕWº…�uvª[ä„ŒÃu{Fdt¶§}ú¥Š¡öI¦‹�P¥P…PùÇPÅ¨Õc=:˜0	~
+dH0_˜*¨ƒŠ¡Cb¨°S>•`/fS8¥S)èS3S-è©°
+Š(
+C_6Ux…D‚W©UW­Ê«À¬Â*¬0¬Æ
+l•`p2t0>� ¬Ìê¬±Ú	³
+!Öê5=±¿2‡ªåZDrZyÈÿ­«5$«…‡ÅJMñ{€®?ä”à-×A; >ÐŒð®¯óº>ö:­`ê“°Øš_#‰×•]”˜]—h°äÅ]{‰ëš–¡®©®pà”ý¶€²ýÆÛ±ë¯Œp¡ÙÁ_C°¸ú¸ˆc/vI¼a–eÝ³±ŠA±ê€0Ð`¿gÀ±º` ´DÛ±Gûž�øUOË	ÊBÐ)›_@Pcê˜cZ¶cŒ`cëøµî¸®Š¡:k=lOñ{ìªwQ&ð¶~ û0·@–EŠÙ·¨H­Pµ;0w0X«jÐÿi)fìÈe‰‘a¶‘�{6p¶h[¬d2˜kË¶™KK[´tð {;ÐBK¦;º`b�d‚�ÙøºÔjYJp&p# Q UiiWÙ`¢Ö» ¼Y©¹Bêº
+Àæ³l»È[¬
+ƒ¡Ï«ˆ2>Ëªbç”	ùÅ&+2YúÕ	`ŸwÀdpj ÚK8Œ™ÏÖ	ÆæÈæ¾Ž9˜¥t(ê:ÃÊò{¥·;0ºÿû £º~ÀäQ”Cb¶*|”Y«`pwÀ�³‰‘éÓoùö	µùÁŒ ÷Û(êŠ®¬üË$nKpërK·0À¬yÿÃ{&Üâdyi5‰ÖPU°Ÿ¥ Üd0~ ®¯pB +|A;´ j´H«´QÜ´¨I&‡Öš#Ãš‰¶ùÂžP* U€Ÿ9tt•ð³E5$êª,MìÄ‹²Dâ±7<·º<²ÒI.WC�~l"sQðÅQ°‡|
`�.` Ä!Jwl4ÂmìÆÅZÉrüøª¯ôÚ¯š¯; ¯�|ð	µóÙ	 !Ñ€I È_¼o**°Á‡z¤ $zmt¬ÆZ¬¼L¬Œ­Ð¬HË	ÂLÌ$‹6r ¢ŠŒ	�‹Ü¹Äe0Ë& eÄU`ß ÿMkz|hšMÉL²z¡u¢Y°Î’]à�ce<ÏCPÏC0Ïel‡ú¨µ¨’ú¡åì©¶‚<òê,/�ƒ*�L�ö¼õìÐ 8€‚<ESàª©Ð±ªXPP'<¢ÎørÑ#õ¼.-ÑCSæCW¾š…Z®
«!=Ò$ý?QÌ© /íÒ÷Ìð>tX‡wh®;
«ÀàÓ?m+€ÒŒð#àÒeìÒ#ð›0‰	«°àÕžJÈu"6·’#	áúFÆGíÕg\	¦‹0f³†Ö_jª,3óbÐ·¢Ià]Ôd ÿÑ+ðÕC°d:bëµ:æŽ|½£ k]ÕélÐZpÈ�Ö*ÐØ#ÀÐÕ÷¬h3¹cV¹•Í¥ˆ§Ü š�y¢ÓÌ ­ÐfPÔ*€Úžæ»W©iÅÛÚt	¸êñ·±û"p@´m+! Ý2ZÍŸÄ)ÔI`�ñ;¿ï«ÜË€\'"»Ø¾gBupÐ<ÇCaË}Á	BÂÿFÞåm�áû½¤¸ß3A¨ Äø
7"”©Àv4p@îKuy—ÙdKæ	R�R 
+0³6þàä‘šˆ¶š¿–h)
+Jpývò
â¾ÈZÌÿ_Õ¹>¿ž—âÀ7¯ì>e¯0þ4¯�Q;‡0wž$zÎ;ÀàXÀàfð—f åN˜Eî¯Ç”¨^ÞÏôäIûÞ²Æ€�!ðÜ½åžš<ðVoÕ®J ¾×g /îæzØÔåÊ<F•€¶Op×&åcpO°Ô‚>­ÇÔT`é,®6 ˜‹ðOðèÎèO Ö“>­•6¿+Ö3Äé‹°à m
^êÓºôº>Ç´ê�@­gc°è.!ðá²^¡•¶éžÐXPr‹þOprXàÉÃ>ëuÀêaé`px¾èèí•­jîàŒ@ÞèÞÐ(ìç¾î‹;
\ No newline at end of file
diff -x graphtree -Naru ./styles/ztree/zTreeStandard.png graphtree/styles/ztree/zTreeStandard.png
--- ./styles/ztree/zTreeStandard.png	1970-01-01 08:00:00.000000000 +0800
+++ graphtree/styles/ztree/zTreeStandard.png	2016-04-18 19:04:39.000000000 +0800
@@ -0,0 +1,41 @@
+‰PNG
+
+
IHDR aQ{ª<tEXtSoftwareAdobe ImageReadyqÉe<+GIDATxÚì}	|TÕõÿ™}’É¾²AØDkXT@i�RÐÑÚZ)¸´ZýU­KÿŠÚOµˆ,íO‹[©J‘EvD¶@@v’@B2YI&Ûì3oÞïžûæMÞ¼y3L&DæðyÌÌ»÷{g2ó�sï9÷ûÎÈÒî{�…vZÅ—�¥ßÿÿBÂ	×ZÙ§K`ó¡ópä\ŒÏÊ€Y‡ÂÃûAÏ¸H™¿qBÅu[×3%þ÷Í;zNÈår÷¡…BI(•Ü-žúó÷=}CÅ¡í>~‘}âíÏ`êˆÞ�;:^ýéX8]Z{ò`ÉÊÍ°æÅÙi£ú�)T\·IÛ©§Ç
+ªÉñ9æ�c¼ûÜr|NŽ5ä°ó³—ó€d²¶·ûÁm·ã³Ü³ž1X–å,‰°MÊÚ‹C­Ù¸þôó;`ÂÐ4îŽa½aÊÈ~�;nüc[}�B2…Š»•Í¤ßÁÚNJ¶iâG€.íž`ß‡'drÅêôÑ“ ®Ï €¸î¬¡~’árÑ¤Šãû—³.f¡›ˆ’FÈ÷„B¦X�•–½“ûAL|,=ßÔÐ8éJuÉ¤sú£ËIŸ…„„k¼<`°$ÂÛ`È§R©èã‘_�†3÷ŸòÂáô‰LL"áóMÊîKo±ßáU¿eqZ
w«Ðr5†�‘lk.-[S/V38àûàb\‹ÃcâVdÎ~”| €¹vþþ%OûôÿyâÞ…›Ö®67”r…üCñó¶d-ŽÐD­˜>š8¾(,`„jhäH¯�~ñ _¯LØyüóÕ¤¯rÃ½çèòö�OìÉxb”J•ù¸>Þ8\»áôé�D|ÿÉ#úÃ¬	Ch)N-áW¿‚-U[ÁÆÚ%q·º¹'°.é#,!š‹?ƒºã¯³Â£õÊVáú]­P©8òYW+`ç{KaúÆZÏ±óÿ¿@Û°öuOÕ^Ó®R¡\q÷ˆ9`Ö5C£½,öV8rì=ð>žÃ6ìƒ}ÝS5çƒ%Ÿ4pçÞ» oÆ!Š’OHRÞ0pÀµ[0Ï7sü`X·ë$Ì�’íƒ;h<ŸÛþf¥	–]xìv;Ìü°®³lÓ�slÞ…r¿íã†ô‚ÙwdÉ:{Æi–±K/ðÃ´��5Üç|í©CÙ{&½ow2‹úŒ½“¬ ñ*®^(é¨m|à¾?r�7¾Fé’’=.Û·ˆ<ð,ê�v×¢Ûúä€MÛ
+­æ2Çï¿�=@oÿÚú4÷\äŸ\+‡!)£áäå#t%ï¥‚!Ÿ/9}£¶O„ï~|Ü‹|æ�÷ÁaÔŠ�C0Ï‡Ñí“Ù(‰[W±L„|f³¬6¼{ìX0ô\g’æÍ…¹ÀÄ8�à$DpØmàtØÈ—ÁÝZ„Äéôq§
\Nk»^;bÄC±i}ZêïŽÁ¸ØFú`ß²üoPNÆè—MÖ°¹¬PTRÀ5¸ã›3§èí ~ƒ�u6ö•—å=ä!`°ä�Çñæ�|B’£V®õ|Ç
+¸‹î�ø9ðö…e`%RKsüiì›’¸Î4!itÑP_[AIã°YCGH¾`ÆÁ¾í% b<^R!¥$Ë&W]™Ï�àY—áôŽÏÿÏ§$t‚26…b„ãÉ”²Q*�Œæpãñ|¼ñ�—V>
+pBLXÅxž+XòÉdbr8ô|B“OˆÃ|Ýž“eA=ß–Ã´¿nFÚømÿgAnTÂŸrÞ„yCçIâ:•€ÒÐ)ÆMþq(ãÉÌ8<Ûs	HS;Ø¬f°Y¸ƒ7¼¿ûË
ôÀûÒÇe±’)ßå¿ùl6™�,~_+¶Ùˆ'µ[í˜ƒqx,ù„ùoœœF»þÈ'Äa²xÇñb8|^ðùö�,�MÏÒþR8�JG×|g;�e?‘ÚHIÜµìÄ‰l0·’¾ÛóÅÄõ �SÒûCïþY”@þÆ¿Ö8	Iéí§SÖii×!œ‚Ívçy³ÉD<®å,ôh[ÛY<�mÃ¨›,y,Œë¢ù,7ÄJÈý|ÑlzðÆ?¶Ò/ƒ’™CÉ{²ö’O
+w-ò¡aj“Å˜¯C<F­Rä[·ã&•=;¡â®e£F�’s+eè¡øiIS|á½/ô0í‡÷|ÁŽÓÑ)¸¦É¼¹©FŸ¶æâ™\É¯×÷ì�éO¹½!	ò´1Ð\£§¯\d�ys}cM¶&Z-ö&‚¸¼žÏnç^ŸŒø»M"Ô7×PŒ 
Ó~òu‡IâŸçŽƒ§Þÿ
+^^³¾=}™¸föŸ*…ß}°~µì3˜?}ˆ“É¡â‚ñ€¡˜x­Æ“¦½S°xÚmÏ8|ÒžCèo(ZY_�Lx€F‡ªßä"d>®~kmÃ>Ø1Â×°ó÷e+/6œ‚H&ÔF^·ƒvá‰)ôÀûxÛ°öEŒÇŠ·É‚µPq<™0YŒù:L™`ÔÊïé.yxª_*îZ0’æÂ©ÃÒà”Jæ‡�Æ’/˜q¥aax#±oÃ™
+ÃÊ£»^K;X•Mu _zçdÔá Š#�G|è�îì‹¯¡¡öBÓ§”_ËJ™
ª*h²×ƒÝÅ}1Õr-Ä¨ ^‘§*öEõŠ¸÷C6ô€¡�°«äËó—³W/mn×kO0z�yZÆï�ø ?bÕÌŒWÆõKZ7 4Ñ±d}/£9A'#[“—NA^Ií²_o-[zò©1F‰½àˆ‰KS_I¿¤oÌPÐi¢T2š”;d`´5AiÓy¨8Ñ°ìÐ+•KI#rOv£Ô0ë×ýS>5÷'z²-¨j9_ã‡fÀ½nUËžmÿÕÌx�äW»[
s}Å„€øžéÈÑ÷­»RŸ’=)=V×Ûõ�¦ÒóÕÍû^Ú[ùWò°—|„€¬=cŒz±Ç3‰"'E§†Ó1ZªÌ¥u[÷�x»Î3§Ep‹*>&C¢§‘„ä-dUL’d1	†ÜVîÖ‰íVè³,½�P!âÐ’2s˜	¿~f�Š‚GF)áÃû´�wé2l>p	–¬T` asÿQ>BÜëEÜ£·ÒÇ¶w
Ø‘i¸«ŽÓCB¡G"D,$D{ ’¸/²`so7ã¶2¶“~�æz:9
+	ÑÈu’c€@QÓ&F’D,#Êñ„ˆC­ß¼þöx:Ü5�ñà&÷·Áä>V˜9ˆ�~öéù5L(¸ÎZvåq‚5¡'c—SrÜGÐ&ZÆµkŽ€n•;‡ƒ\¡E„ïÎHØ¹'É‡-úøÁ		EýÇ{áxUO"Üp†ñÖÊÖó l>	S2j¡å’j˜öâº=``»ú”ðaÐzÀc³¯ËJ.Îy0J"z>$‘Ë.Ê s8í«¤ýÄj1×n8}ò$²ÄÝ¬LÅåÃ¢G�324¥+`rïjøñ-í�¢1®:b:1æÁºâßÑm¹éOBlÉ›>¸[Ý^O= B.[=)3¥ÅA'åƒúF˜T¤7LÚ_X±œq±õ€¡ŒÁí‘¹§Ï€:@—D¸ïÆ¡FJŠÅm(zã0p¸w˜’âœšTù<¤–kÀ5œârû_¥ý¥pH>¡æ«Ò¯$q�™ì
+ã 0.k„äá´ °àšã¹X×â˜píê§~4†Œ#ùH>øZO�çéé9lÃ>Ø7Ø1Šš¹ïûƒ�_KÚ¦$mò8š.Ø>Ñ‡|¸3"ÆaÔ:®·FtpA’ož*nÅå$7ÐþR8TÃ4`¨a¤p·º¼z@•B±âÑ;3ÁÀ�À²`Ë=ìøišçX¿WOÛ°ö‘Ðß¸å‹G3	ü�Áy@wàPˆ$ïAó‡Û¤Ô0b¦Lò.Y¸çk•öRŠúsTá¥†âpÚ­©¬�ºÚ«ÐÒÜÏ�|^w«{@>-uðz@ña¬>Ô†wØM�d1W-a�th¯r}ð1¶aì‹¯× Ãæä0vB8<×ûƒó€î¨5 �ÉéíÝ¸@j1óu›Ï8)™ËæCjÅÕo)nkq¢—Fˆ“RÃHánuØÑ­8Ôöéu­(@ÅŠ`z·xßÇ>Ø1Â× ƒÇáíÑ“z¡¥ÆPz<™Ópo×…n�uúz@ŠãÔ0Ã¾Ìö$ˆq˜,Æ|¦L0jÅ€×n8}¢CÉ,•ðMYl.Mƒ—j!Žù÷ÐÜÿr¸“OIânÕ�›á4k«?	á‘‰ÐRr%¨×¬ŠM\”—A®PŽR©•ÐÔà'ëXm.x:O�ô Þ1%^I1Âqý��xž|üxâ1¸(Ø�¯ó¤ZøÀ�x=Ü$r1ÞP„+ê}°‡ïˆãU-4_ç�Ó¨UeºJýçžéI´þBš¤¦½¸Îò\7Zm®=
+‘i	 Oú57^<r³ÑGh'¬1××F.ŒçôÕÜ¶oZr<
+QÉ­°>z@©1ÌÔ�†µ½fòX<†;èN‹ÈÇOŸ±Œ(ŽKÿ‚æõ0e‚QkN²…¬Ý¢èô‰I$¥†	×Yy·©ˆÖÄáZî Dõêôó¨"#Áj¨öš‚�VóyÈe£‚Êb÷–QYÈbŽ÷`?ÛÑ
+‘j9!‘\VËEoH��xÄ}zO¤ç±xJ@ñ6Y°*Ž'“GÕrè<<¹Ã½§{ÏP:}Š=Øúuÿô,9xÜ÷Â·e�Ó/îvãölû¯l}áQÚqþÃ:uív#ÑÚ„l¸Z¸ŽDº1 ós½¶Ã•ÐPÒà¥†1j6ëë›²#Â¢¡ÁHÖ“Ôƒq„i04{îãkŠ×‚¾¾™b¼¼±hÎ"=‚Ú9›mðù¬É1ºÕ0nx­[1îåÕÛØW¾�z>±¡4ë“¼FœZ;uœÚs³r(†ˆ„ø ÿ^C¹šªõ0töNAž”œóÞÎªÙÙPXïƒÅA•Í[ç¶Mí³¾¨†¸0d&¨`Ó©28úÛé)¬¹¶ÚãüŒáµN$ß©1”¡ªZBÅ	<LÍý	õd»‰'Ë+q{²65
+á\RžìzªanfEtTÚ�P~th#‚×b_†,á,u
†’3oìR+_›20ôrêL¸ç_zÚN¦Ì�
+Ò¢”°ë‚°/b¼çjé1ÌîéÇèág:¿ž›,Œ©�þ“‰¹ŒJª_ÞXêé§ŽÁ<#âÈÓâòÂ¡%eæ°¹Ï~SG¤Â”¡=à±»û‚¾Æùg`ÙÚmðÖSs˜ÚÂ£2ñŒ¸—Aq¹·ØÇò¸`¦àŽ¬o´":,¦ŸŒatì¥¼üöH 2q˜çÑ˜U'íù¿ñŽãéU³}Ü’ì´8ÈŒ×�ÏP	89ÊÀ	³¶ž«"7oYÙò_¿ƒáˆÃ«6ÌµÈ'ó÷1I�/=§·»
 ê˜Þ‡|ÿúz?¼ðãáÐ3VEÂs;Ô×]�J3‡'ÃØþ=à‹½yðÀ]ãX!	CÅuÖ°+(¢‡ä®¾ùG!ÅÒ2€Oõ�½õLtÆ�Iº¤tºMeªÓ—6_>¿¯òã—„Z¾ë6†²]ä“` &AK¾T2*Üs49¼È÷èîGaíÝkI³ÌkÚ�ùÜðü¬á!ƒÆÆ&ò¦;¨¤Ÿ/4�$ÑÚÝY©ðêª/`ãÛOáT/ã±.ˆHŠj›jÎÊúà:Ëb~S$Ò¦ íßç81â�¨–�x±BB’+$µ|bÏw=ÆP¶‡|2Ñç‰äë=:Ããé*ŽW@ú˜^òy¸-X-Ò/Ù©�«„FCØˆB.²zÅ#!1fŒ@úÁÜ)£½pÎÂ’Â¡Ú¢§{Â¸-×·g0³&ˆm‘yá:Ëbr8˜<ß÷5N¨&”UÁB6$=`GÆPrÜ	Ž|>W¹±ÜãG÷þÖN]+I>~|Þö�Àaò�`±X=žÏkHò¯Ì2™L0,#¶çqDâ¢2c)ù„j˜gû?™ÉC ¹ºÉ×™kÀ®0ÎŠoZÙÖº:¿í
à÷¿¹bcceüû+ÚFóÜoom?Þ:¬š|¢·Ås%’n™n§­õ"N¿´]€Ë/-ƒS3 �¼i�R@NBÂ´¤8[ZåƒC“ª
ó÷Ùûànõ½`ÃÀKóúyfþ`T6Xáoä½ÚUA–:�,OB)¥¶Ÿ„µ[èKÀä“ù0Ð›]Rä«>V.S[RhL¿¨®3�VÎ]7ì�„ØVÕÐ
+ÙR|phRµa¤p·ºd�Ü,"¬ÁÃÒ­1¼¤’{ü-“
+Ì–bJB©u±¸¶ß¦íë¼ÚÃ•10{Â£>µý¼¾¬kqœ.|Å£S2�Q‘Ÿƒxßf÷RÍ­¼­O¬ÝW¸Ú`2+å2y[}À É'š‚eî?=ŸÐ|È'B&dÂéŠÐjÃ@¡ð½x�-Z­Î_1À²žãÌÕFèßßK
3$}(«Œ>¸[Þ:¼—1<ùr‡á¶5 wÑ!Ð—TCAA�”çó©í·~ÆI¯ãoÓöIÖöN»ÒK>ñ;ãlq‚ž”„w¯õK>!nBV?øö\4Z×¹«(x/ÂÂÂÀè”Á¾3å0aØ@œ£Š¬	ÙpÍ÷Ñì�`HG>[…ÅŒÇ¹^;*7bÆa÷x>Ôá!ùLÄûÉ?{`Ü;y°dZnnnö]êØ]‹°^_ÛÏfkË=b]?þ m¤öEŒè5HêQÈkêC!�cšOžïZäCûfÇfå«�ß‡‹®‚E¦†è˜J8”ók4ˆŽŽ&.<Ž—6ÂîÆþ){•…ú¼:¨9Xu‡k€­e$q·¼´Û‰§ã>t$¼"¥Å
+IV"=‡% ”	kûY±†‹³-ïxôÐAzœ<zŠ¶aZÛ/H= ’õ€B} XÈ0ò	qN#’°’/ùø/LmáIåÌ;FÀªmçáT…\šèÙ3äáQp®ÊÛQSÆdÁÕâS:AÔ*îÖö€Äc¡‡q¸ù…ä³:¸ƒ¶#9]x+M@am?›•¬§Í�ž6~
+þxÚÚ†}Ta*Om?‰y= ùÜQó‡oHBþ1ÞbµZ¤o“k¡â(™.�R¬_ú­Œð•¨2Â?˜A+#H�(TÜ-ëâ™p½‡$äÉGwWÜ
+8üì�wíˆß½hwm?2‡€B°óò‡ÒŸŠÜ%Wf—¯íçµ›ãGSˆÆë%õ€â�	ÖBÅñ6ÿáøµ�á¥“R—Oâ>®P¸ Ø×½&îûˆ^»L�h»
Ìnn‰É‡çùs˜®‘$WÛ/ßT+ã½÷lr˜½‡)ÂÁâl«íçYGÐ¢Ð³[%¥ü¾Õ0rUFHBÞ:C
Ó^ë*5¢]î !ùðœË)MÀ@µýª/·}1R{úÔöóx8?zÀ9›ë½"%õ€�V¦Tøîà"¢-5^8$Ö†™¸ˆ«
³`¤–Ïƒc%e°í`1¼¼J«^˜g#ý$Õ0ßájÃ<Bpøâ¾75LW¨í"Q°ÃéK>ÏÔÈpë@S0Öé‹û4êÕqÓ¡`ÄÏO°äí…³÷ÓÚ~y
;¹Ú~‚8¸èÝÅ+cÒv¾:;;êÉŽzÀ™ÿ©öz^S˜ a`SA=ÅÀtNm$ß…èñží’Á•ÿñ‚!‰>Ý¼Vÿ"îìÇ€ÓÖB¾¡vÈéí„ñéV˜1Ð	ë7|óç=æ£†	×Yk·®P#šÁ(˜õ&ÎÁ´!ö”ªí·øøÝ>µýz*ûøÔök›[;¨äIôñöFw..Ö'9ý`¿í’µaêíFØžo&}Ô„ƒ±’j™àº`TµÜN<ß*B¢Û	‰L6,²>`
K…¥´¶‹06µ††u‹ßÝûW<ãQÃq—‰`ˆmËõÅ«î€.XØ^E4ýóÝž�·N}D¥YþÆfÞ‚Çaj…ÞZwM¢b‘ñððp©&û¾ß•¿3q)£±ŽÚMkû¥iÈß¡Ôö37Áñ¦Ý|m¿wÄA^‡õ€¼¸',QÉWñÐ{L|@5Œ¸6Ì�Éôy!‘™�¯Q=LfØŒä'ë	ZBÄØæ¯	™ô0k@<ƒ5^FxáŠ‘|šXo5L|ò-c;½pÁzÀ›µFôožš%%%T¼Ètº^Ð¯ŸßKUM\ÑÈÊOG½XLm?É1B×º§O)ÏçÑJÕ†aŒŠøkªa@ Ç€×|™>Ñó!ùšš�ä
´`‚“¼Qa Tö•­îîk€¾@‰$Ä¡çó§†±ëe^¸Î´®P#:55UFŽŽþ)!ÕöyÁÐõ€üÚ-Ðž°Tmp=’Ö€jamíbÀ�k7œvÑó™MV0-ôùð¹Ãc{ƒ“,lF&5Á³»®øàÐüªaD¸Î´® ˆî0ó:PÛ�·ëù€#àž°Tm:µVÃ¹ô!DZP•IÏcª£VpÍ‡Ó®Ì­sà¿rÓez]ñwÕ:7´·ÍŸFŒë,ë*ŠèeË–a<š+ÕF¦Ü{çÌ™pÜ5êº£Ý€:@‰Ú02L\ºÕ0þ¤X9Ú*/æù0e‚Q+aÄâ´Ë=7™‚I¨f,$/Ì»JS wê¼æícïrj˜´¡ÖPæƒë,ëBŠèÜ%K–Ü+ÕðùçŸãÁ^‹„n»�õÝ©–€{ÂµabìWapýÎÀj‰Ú0›Ï+àP±4Îˆ!Gœ¼‚¼ØpHT×@‚q'D0åp¢RÛ.'Ãí‚Ú0<.½îD5—{©aÂ.CJùÜÝù(	æC¬íw=Æðª
ãIµ*³!\?\Œ³‘æù
+RçzM»Ôó©}qX¹`åóóXÌ×±ä�hG+KÓ5J°Â‰*
|^ØþúìØûõ&9&”}p$ÚÅ€ÃÁÆu[	ýxB/-*høe!Ê©î�FÏE©8-ß;O¯ ^ìï¢€$ä1äîÍ¼Õ†‰¶TÃ�+ÿ€!¥k[óÀa’xþ¼ŸÃÓ[Rà�{ãà;=JWœ©&kšC)ðÜ¾,xè¡ÅPWtLáŽÐ:„û!›{æïû¼'RõILG^Ó‡çÚ[PXïã9©1:©6Læ5±µ…Çd˜,Æ|¦L0jÍ!�ÃL²v{žLŸÄƒy*#ˆqß~øº¼ñÐyXÂ×†™6^UTèö|sÄËq/-!Ý™BÁ5ÜC¸
+©X%aXfÔ99-ß7²2¯ß��†ãëò&ã{WÃ�cr¦y^;æê¤òuüô™t7Hìë^75Ì­bx!y�µ0ÕreÓJ˜dØoÞ’ýèWŽ[¶�®ÃÄµý„õüxÃsOç¹ÚUP\Ð3iŠë’¸ÝS!�,Tœ�TI=3X³¹¬VÍ})UÐju	µ5e^ç1íÁ	ˆþƒ  D^�>.ÿjÔço‡qž—LÇ>y§?O à­å“_JËç•@¼¦ÐtHÕŒKhck[uSéŸl(*h+Ç*.­×à#­-
ãš›ëA§‹†ˆÈ8WÏž©òššJ—Ýf–ãùè˜ldT|ž¾¼`|Gq?$ò·ü‡H>Ã‰�0î§OSW5f›hï­åê÷øº~ü¹öÔ×äM²>`°$’û©C'…ãfÖsÉ Ð�D(AŠ�Mv¦¥÷Vòé ´´ÞôV_Qîlm­Wb¿ë�û¡ßk†a<äÓoYM'wsä3TA¥ÁUùû¡Ñl_ïñN’õ=t�û¿â4}ròy¶¯> w]@Þ$õ€Á’�þ^Hä““W‹�K‹ÏÀÀÌ‘^8œ>ÑS	Häcié½”z=8
UJì�_èPq�õ�wE4?Í"ñ¸Ò¹ÛšAË©½>ä«l29gÍþ…ìr+¥åã/á5}|m?±–�·ŽŒ¡lùÄžŒþ~ë¢Ž¿ubòq}¼q¸vÃéÓ‰<dJë¥´ÛL´¿šÁhl“©…¬-��˜‰=R}p�e]EÍ{?$–4ÁË*+Î¿ëèu×L`Z<ä+¶ik¬ùú*Z: å»cxmòIPu5ed}6È‡|Br{""8àÚÍ³ÀÔšpWKKƒ\
+g4¶�vù ì`³¡ººŒPŒëLë
+Šh4ü¬ðÒVµZM5§õàG~
+_ö3°Dµ‚3Ÿ„ž}FCI­â$ÀF/9U—¨,ù|	Ø6µêË‹ oÿa^ä’•ãƒÃ7‡`ÞX`TKâÌ¦Vò�w’ÃJ+~
+×B\§°(¢�Fã7Ë–-ó:7¬Ð½áa·¿g.…Ûä$ŸÓéÜãg˜[0Xò‰	ˆ8á†ƒùT*µS&µò�C Ã~¤¿\
+‡Ä³Ï‡äÃJ£
“Äu¦uEôÒ¥K±ÌZþÜ‡¯k�Äûýï_.·m~òý�/Ï‡ò¨&ÉôØ�®,ùd2¹�ëÇh×ŸçãÉ'Äa¾S&Á|ÀØûKá“é´Ë“/99C×™v£ÑO‡Á+NóÎÓ5¢!ï>Xüéç=¿Wë†ª€qÙ/±o;ù<‘¨­äíK—>&¸„/§Rµv ÏQÈÕë€¡wqk¼ëƒ%Ÿ¸��Ã(£Ý‹…ßI’OˆÃd1F³˜2Á¨Õß«Ô—;M¦fett‚$×{üš/®S=à
TD#	Ý	?ºó/Wkao¼švÛ?Jßö»øÂíØjaá+„çys,òyGB&‹#uQiÿ¦4êç8æ¨ZÃõ‘*°Ða=`(äã�„×"ÝË­)“a²óu˜2Á¨UŠD--õJ�&œöïÕ»È¸Î´¥ˆvsŽ‹€íötÆfþ}ìˆá�h{¤„�}¬_ÏÛ>.¡»—^˜x8õÁ§W¹:ÆR]¡×-øBXzhäJåÜØ¤é·»±îý¹àdN‘óÁ|«B«
+ù:‚Ã�
+Lc¾S&µ
+w4Ðƒ!‰°_sS]‡q�a7R�Ébyo]„…¬‹YÓ?kaâð1 Mê_­]tr~Z¤*LwOÊŒ¹‰º¨pÈxð	(ÿâ£·Le#•‘1¯HçqF“â³Z�Z5=<:‡~xxßa³ý‘´Ù
µ> % p›¬=*Žß&ã÷t1e‚Q+¸vÃé=˜˜D¡â:Ãn¤"š–ÙP(t2`Ÿ‰LÍx<uÜ] À¥à•3�>í'ÀÚÌG
1Y#É”CÞŸ¨È˜÷+¨Øñåï-—‹,ëzÙíIµ„ÂƒÉm,çOX3™¼úFÅJ–+Œô¹ð¾ÍvbiÃè5œòØFr‹Åù<‘¤�×b'zÀü/%ÝŒöÀà8Ù+·'ÏŠÐ(7õ~à	PW`U+ÂˆOEÖp÷mf>˜�þXKæ—¦ÂùæÚåJu:YÖ�ß#¿Q–®f‰·eœ­Œ\¡ÓÄô˜œ Õq¿~c5™¦ºoê]ŒÉ¦PF*dÀ€ÍRa777Ü7t*K’£>8ö›)Y}Þë×'ªÒ«72�J¹rF´i’I\\rù*ì;wù·'žû¾²ûã¼ùìËÂF09˜š5÷ö¦Ÿb€5è%ÐXKHgãt,ÍÊè"ÀQ­‡†½_c6î’GÅQråŸçø	²Ø¤Œc4ºAÄµUë¬Ål	0ŽÎµi{(zôš™$S&�\–
+6STþ¹	±C§òkR_= oB=!šX(ïþ8oJcw”´œybËå%¥>„VC#È"ã€uØ¹0ÕŒ…ÜN8’0,Ï�‚†Û>T†G>OÎÐ
Ú—Þ†â];ÏÛ³<ÏP½••³F`™
+B¾óÄÖq¹�ç°
û`_Ä ÖHÔ”ªè·>`·Ý|F¢MëŽ’æ·~Vönkë[·ÍœLK#™Híx·».7¹•câN
µ¶�\¥Z+Si
+�åÈQÛögßtý+1¶ªä·�|²ä±Ç‡ß•<LéÂÂç·—.SD‚\£CùÎ�ÿ~zÇ{Ÿ8–]m„cNÆû"u_= €”&P¬ìö€7¡=12²{ê N«ˆì—‘˜‘•�š<2óZèÞ8kÇ;¬œü×�„˜='ÜCHÅl!äF<,!’­Î6ïw¼~á|i©Ja§ÓÄ%§É�÷ñ¶aì‹l�¹õ€Ôû¢ö�?xCm çœÓIÈh‘ÖvÛÍaSzGÂÄ´Èäd�óí»'Ž|˜‰‰SM)%›ËABM­Ž~°2–DX/¶¾ÇL„°Á£+þõ×½äÌ LñáX9#Èƒ>¿{4Ñ‰:µÑDü§,–L“¿ìXœˆœËè«S¯ø“Aóç5E—Ž¶Unó«ô­è«ìö€7¡=¾¥¥¾±“ûÅ=cgƒÉb«¡†î‹ãïòÉt1@B.Y�²4S@E„%¥™^ÉYºwöëù½ðä£ v²ºÉ‘ñczªµÉ„$= ©ú²¼�ç°
û`_Ä Ö“Ž{wñÊü²zªõÓ‘ðÆfw€ÅÊÕÄ[<ð¶aìKõ€Ý¼9ÍäpÁ/·”ÕüïÙæoØ‚Ã ×Å‚,<òqjÓƒÕÁSud½ÓõÄ'ƒKUÿYi!ôÄþŽóÖË$@&Ë´¤Hé‘‘«
ï£µ›j!ÿÞš÷ÿ\²¼�ç°
û`_Ä¼õ²àñzÀzè£$” –³d¶eè�÷ñ¶I×ì¶Ù�PG3.¶yÑÖË‹Ì­_®\œ;v²6u ™/M 76AéÉ£®³åõç~9L–u;8[ îÌqh-/Y%S*ŸãÇ+«p/ÔJu‹ÚRüß–�Û
{>ü¤ñ“pÄ¶-ßVmYüÈ–G¦Ïˆ›j³´¨É²R�/ ‰ÚÃ‡røë÷{ÁÝ’Ý u4^íéwß6üÒß-.r!k
+kÍßrá™-Å¯©¶ž²2;?[ SŒ©oµBý™#[å*ÍJÜ¿çíþ…ž»eZ¥å±!%ƒNÁé’J(¾ó6®áøYøï_þ·ñÜ7‡_(ƒ"«ÊxP‰w²þ^p·uÈn�:Ixå¾­}Üì8þ§_±á-õöë-éZqGõÃM–MoÜ7º¡:"úmâ’ÌÂ�¯Ò6g‹Þè\A)’V¾æ¶=	²´Êø6)ëØïw[Ç	xƒÔÑ„PŒ;±üÏ9OÍÀTÇCþžkñâÅôªœä9Ý×•8Ý•R©¤z@Òv¨�urê'9•ááõ'¼u¼>`·uØ‚QG‡2oÂq:cÿž×uâÅMäþÈÄÄDª¬©©™CÎÅv¾Ïõ´n^'FÝÞqü©£=AÉÇ…þ†A©V?Àˆ×«œZÞc×¬Û£!D›;zôhªüúë¯ç¢âÔÖï[wæzyÀ.P/Z`‹>áˆ¶ÈMÆkš €€V­VOÏÈÈ�á�÷ñ/:î&`µÀêèÐÆñUGKz:Vâ€B3Àç&!Yïi	©°2Ô]ä˜FO ÞoVjjj2®ñðÀûxÛ°öEb»§à.b7P½è½™ ](i&ñA‰;xu^&üqC!_Ïo±Èë
+ÿ"..N�Á‡Õje4ÄÛÐÀ]{Ž÷I€ò®�˜V«U 4ö––¼ðét7»€ÝHut1áÉ…ñ¦‰¬^œ�	ooò%aee¥3"""–¬÷b’’’èZ�FâyíÀP§Ó)²³³“H?ú[Îµµµ°}ûö&Äv{Àn3!X«Ù;U�ø—3áÙÏ
+½Ê²íÞ½»˜L³ÏšÍæ…&LÈÁßAïæYï!!£¢¢è�‰Ÿ>}š=|øðÑÒÒÒÕû÷ï/î&`·�…Ä&&3ã·]§V@J ùÀanù‡—w4™ìÄ›ý‹LÃ%—.]Z2cÆŒ{zõê¥ÄTŒÍý+œH<@¾ûî;'é»ãÐ¡CËa�‘iÙÞMÀnƒ4!a´÷¥›­vª[¹Dqf¢Öì+„ÖÊÒ//¼:ó)xÒ+’e	‘l„ˆ
+
+
+,}ûö�––6�¬irš�Ž1I}ñâÅRÒçuÒ÷øõŒ†»	x›µéêúwvÂ|©¶ÝÖ"4røçùÉù¨À§®þÌWBBŒ?^“˜˜¨ÆÈ—ÀïóU·°-77WsäÈ¨¯¯Çõc7èvú¹;QNðÎ´Âó„hg²{ªàÍ]�ÉG‚;v,j¥R9¹OŸ>=1ÐÀí¹¢¢"ê
¤ÄŠ[ØF¢ßÉcÆŒÉW«ÕöcÇŽuð‡nnR•JyÆ7wÁü@äC›6m¦^°¬[Jddd.ñrZ@Ž=Z“ŸŸ¿ûo73''§'¶ÅÆÆæ¶¶¶b!¤2Äv°ÛyFÔý™ü‘­©©‰_ç©É:OM¼ZË¹sçö8pàâ©�¬ý¶”——?’••5•DÈjœð9ÃëòZ»/Lÿ[\\§à�ÄË
ª®®>ÝØØXÜ»7÷c�W®\âùú'''¿zõj	NPaC#`2%w°Û:ðáûÖîÁ‘®ý„Aˆ¸ÍB_ît°Ûn¨ýŸi†v"­vA‹IEND®B`‚
\ No newline at end of file
diff -x graphtree -Naru ./styles/ztree/zTreeStyle.css graphtree/styles/ztree/zTreeStyle.css
--- ./styles/ztree/zTreeStyle.css	1970-01-01 08:00:00.000000000 +0800
+++ graphtree/styles/ztree/zTreeStyle.css	2016-04-18 19:04:39.000000000 +0800
@@ -0,0 +1,108 @@
+/*-------------------------------------
+zTree Style
+
+version:	3.4
+author:		Hunter.z
+email:		hunter.z@263.net
+website:	http://code.google.com/p/jquerytree/
+
+-------------------------------------*/
+
+.ztree * {padding:0; margin:0; font-size:10px; font-family: Verdana, Arial, Helvetica, AppleGothic, sans-serif}
+.ztree {margin:0; padding:1px; color:#333}
+.ztree li{padding:0; margin:0 0; list-style:none; line-height:14px; text-align:left; white-space:nowrap; outline:0}
+.ztree li ul{ margin:0; padding:0 0 0 12px}
+.ztree li ul.line{ background:url(line_conn.gif) 0 0 repeat-y;}
+
+.ztree li a {padding:1px 3px 0 0; margin:0; cursor:pointer; height:17px; color:#333; background-color: transparent;
+	text-decoration:none; vertical-align:top; display: inline-block}
+.ztree li a:hover {text-decoration:underline}
+.ztree li a.curSelectedNode {padding-top:0px; background-color:#FFE6B0; color:black; height:16px; border:1px #FFB951 solid; opacity:0.8;}
+.ztree li a.curSelectedNode_Edit {padding-top:0px; background-color:#FFE6B0; color:black; height:16px; border:1px #FFB951 solid; opacity:0.8;}
+.ztree li a.tmpTargetNode_inner {padding-top:0px; background-color:#316AC5; color:white; height:16px; border:1px #316AC5 solid;
+	opacity:0.8; filter:alpha(opacity=80)}
+.ztree li a.tmpTargetNode_prev {}
+.ztree li a.tmpTargetNode_next {}
+.ztree li a input.rename {height:14px; width:80px; padding:0; margin:0;
+	font-size:12px; border:1px #7EC4CC solid; *border:0px}
+.ztree li span {line-height:16px; margin-right:2px}
+.ztree li span.button {line-height:0; margin:0; width:16px; height:16px; display: inline-block; vertical-align:middle;
+	border:0 none; cursor: pointer;outline:none;
+	background-color:transparent; background-repeat:no-repeat; background-attachment: scroll;
+	background-image:url("zTreeStandard.png"); *background-image:url("zTreeStandard.gif")}
+
+.ztree li span.button.chk {width:13px; height:13px; margin:0 3px 0 0; cursor: auto}
+.ztree li span.button.chk.checkbox_false_full {background-position:0 0}
+.ztree li span.button.chk.checkbox_false_full_focus {background-position:0 -14px}
+.ztree li span.button.chk.checkbox_false_part {background-position:0 -28px}
+.ztree li span.button.chk.checkbox_false_part_focus {background-position:0 -42px}
+.ztree li span.button.chk.checkbox_false_disable {background-position:0 -56px}
+.ztree li span.button.chk.checkbox_true_full {background-position:-14px 0}
+.ztree li span.button.chk.checkbox_true_full_focus {background-position:-14px -14px}
+.ztree li span.button.chk.checkbox_true_part {background-position:-14px -28px}
+.ztree li span.button.chk.checkbox_true_part_focus {background-position:-14px -42px}
+.ztree li span.button.chk.checkbox_true_disable {background-position:-14px -56px}
+.ztree li span.button.chk.radio_false_full {background-position:-28px 0}
+.ztree li span.button.chk.radio_false_full_focus {background-position:-28px -14px}
+.ztree li span.button.chk.radio_false_part {background-position:-28px -28px}
+.ztree li span.button.chk.radio_false_part_focus {background-position:-28px -42px}
+.ztree li span.button.chk.radio_false_disable {background-position:-28px -56px}
+.ztree li span.button.chk.radio_true_full {background-position:-42px 0}
+.ztree li span.button.chk.radio_true_full_focus {background-position:-42px -14px}
+.ztree li span.button.chk.radio_true_part {background-position:-42px -28px}
+.ztree li span.button.chk.radio_true_part_focus {background-position:-42px -42px}
+.ztree li span.button.chk.radio_true_disable {background-position:-42px -56px}
+
+.ztree li span.button.switch {width:14px; height:18px}
+.ztree li span.button.root_open{background-position:-92px -54px}
+.ztree li span.button.root_close{background-position:-74px -54px}
+.ztree li span.button.roots_open{background-position:-92px 0}
+.ztree li span.button.roots_close{background-position:-74px 0}
+.ztree li span.button.center_open{background-position:-92px -18px}
+.ztree li span.button.center_close{background-position:-74px -18px}
+.ztree li span.button.bottom_open{background-position:-92px -36px}
+.ztree li span.button.bottom_close{background-position:-74px -36px}
+.ztree li span.button.noline_open{background-position:-92px -72px}
+.ztree li span.button.noline_close{background-position:-74px -72px}
+.ztree li span.button.root_docu{ background:none;}
+.ztree li span.button.roots_docu{background-position:-56px 0}
+.ztree li span.button.center_docu{background-position:-56px -18px}
+.ztree li span.button.bottom_docu{background-position:-56px -36px}
+.ztree li span.button.noline_docu{ background:none;}
+
+.ztree li span.button.ico_open{margin-right:2px; background-position:-110px -16px; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.ico_close{margin-right:2px; background-position:-110px 0; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.ico_docu{margin-right:2px; background-position:-110px -32px; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.edit {margin-right:2px; background-position:-110px -48px; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.remove {margin-right:2px; background-position:-110px -64px; vertical-align:top; *vertical-align:middle}
+
+.ztree li span.button.ico_loading{margin-right:2px; background:url(loading.gif) no-repeat scroll 0 0 transparent; vertical-align:top; *vertical-align:middle}
+
+ul.tmpTargetzTree {background-color:#FFE6B0; opacity:0.8; filter:alpha(opacity=80)}
+
+span.tmpzTreeMove_arrow {width:16px; height:16px; display: inline-block; padding:0; margin:2px 0 0 1px; border:0 none; position:absolute;
+	background-color:transparent; background-repeat:no-repeat; background-attachment: scroll;
+	background-position:-110px -80px; background-image:url("zTreeStandard.png"); *background-image:url("zTreeStandard.gif")}
+
+ul.ztree.zTreeDragUL {margin:0; padding:0; position:absolute; width:auto; height:auto;overflow:hidden; background-color:#cfcfcf; border:1px #00B83F dotted; opacity:0.8; filter:alpha(opacity=80)}
+.zTreeMask {z-index:10000; background-color:#cfcfcf; opacity:0.0; filter:alpha(opacity=0); position:absolute}
+.ztree li span.button.add {margin-left:2px; margin-right: -1px; background-position:-144px 0; vertical-align:top; *vertical-align:middle}
+/*
+div#rMenu {position:absolute; visibility:hidden; top:0; background-color: #555;text-align: left;padding: 2px;}
+div#rMenu ul li{
+	margin: 1px 0;
+	padding: 0 5px;
+	cursor: pointer;
+	list-style: none outside none;
+	background-color: #DFDFDF;
+}
+*/
+
+/* level style*/
+/*.ztree li span.button.level0 {
+	display:none;
+}
+.ztree li ul.level0 {
+	padding:0;
+	background:none;
+}*/
\ No newline at end of file
