You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rocketmq.apache.org by yu...@apache.org on 2017/06/15 02:53:16 UTC

[46/51] [partial] incubator-rocketmq-externals git commit: Release rocketmq-console 1.0.0 version

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/src/i18n/en.js
----------------------------------------------------------------------
diff --git a/rocketmq-console/src/main/resources/static/src/i18n/en.js b/rocketmq-console/src/main/resources/static/src/i18n/en.js
new file mode 100644
index 0000000..651456f
--- /dev/null
+++ b/rocketmq-console/src/main/resources/static/src/i18n/en.js
@@ -0,0 +1,80 @@
+var en = {
+    "TITLE": "RocketMq-Console-Ng",
+    "CLOSE": "Close",
+    "NO": "NO.",
+    "ADDRESS": "Address",
+    "VERSION": "Version",
+    "PRO_MSG_TPS": "Produce Massage TPS",
+    "CUS_MSG_TPS": "Consumer Massage TPS",
+    "YESTERDAY_PRO_COUNT": "Yesterday Produce Count",
+    "YESTERDAY_CUS_COUNT": "Yesterday Consume Count",
+    "TODAY_PRO_COUNT": "Today Produce Count",
+    "TODAY_CUS_COUNT": "Today Consume Count",
+    "INSTANCE": "Instance",
+    "SPLIT": "Broker",
+    "CLUSTER": "Cluster",
+    "CLUSTER_DETAIL": "Cluster Detail",
+    "TOPIC": "Topic",
+    "SUBSCRIPTION_GROUP":"SubscriptionGroup",
+    "PRODUCER_GROUP":"ProducerGroup",
+    "CONSUMER":"Consumer",
+    "PRODUCER":"Producer",
+    "MESSAGE":"Message",
+    "COMMIT": "Commit",
+    "OPERATION": "Operation",
+    "ADD": "Add",
+    "UPDATE": "Update",
+    "STATUS": "Status",
+    "ROUTER": "Router",
+    "MANAGE": "Manage",
+    "CONFIG": "Config",
+    "SEND_MSG": "Send Massage",
+    "RESET_CUS_OFFSET": "Reset Consumer Offset",
+    "DELETE": "Delete",
+    "CHANGE_LANG": "ChangeLanguage",
+    "BROKER": "Broker",
+    "NORMAL": "NORMAL",
+    "RETRY": "RETRY",
+    "DLQ": "DLQ",
+    "QUANTITY":"Quantity",
+    "TYPE":"Type",
+    "MODE":"Mode",
+    "DELAY":"Delay",
+    "DASHBOARD":"Dashboard",
+    "CONSUME_DETAIL":"CONSUME DETAIL",
+    "CLIENT":"CLIENT",
+    "LAST_CONSUME_TIME":"LastConsumeTime",
+    "TIME":"Time",
+    "RESET":"RESET",
+    "DATE":"Date",
+    "NO_DATA":"NO DATA",
+    "SEARCH":"Search",
+    "BEGIN":"Begin",
+    "END":"End",
+    "TOPIC_CHANGE":"Topic Change",
+    "SEND":"Send",
+    "SUBSCRIPTION_CHANGE":"Subscription Change",
+	"QUEUE":"Queue",
+    "MIN_OFFSET":"minOffset",
+    "MAX_OFFSET":"maxOffset",
+    "LAST_UPDATE_TIME_STAMP":"lastUpdateTimeStamp",
+    "QUEUE_DATAS":"queueDatas",
+    "READ_QUEUE_NUMS":"readQueueNums",
+    "WRITE_QUEUE_NUMS":"writeQueueNums",
+    "PERM":"perm",
+    "TAG":"Tag",
+    "KEY":"Key",
+    "MESSAGE_BODY":"Message Body",
+    "TOPIC_NAME":"topicName",
+    "ORDER":"order",
+    "CONSUMER_CLIENT":"consumerClient",
+    "BROKER_OFFSET":"brokerOffset",
+    "CONSUMER_OFFSET":"consumerOffset",
+    "DIFF_TOTAL":"diffTotal",
+    "LAST_TIME_STAMP":"lastTimeStamp",
+    "RESET_OFFSET":"resetOffset",
+    "CLUSTER_NAME":"clusterName",
+    "OPS":"OPS",
+    "AUTO_REFRESH":"AUTO_REFRESH",
+    "REFRESH":"REFRESH"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/src/i18n/zh.js
----------------------------------------------------------------------
diff --git a/rocketmq-console/src/main/resources/static/src/i18n/zh.js b/rocketmq-console/src/main/resources/static/src/i18n/zh.js
new file mode 100644
index 0000000..6cf39f0
--- /dev/null
+++ b/rocketmq-console/src/main/resources/static/src/i18n/zh.js
@@ -0,0 +1,80 @@
+var zh = {
+    "TITLE": "RocketMq控制台",
+    "CLOSE": "关闭",
+    "NO": "编号",
+    "ADDRESS": "地址",
+    "VERSION": "版本",
+    "PRO_MSG_TPS": "生产消息TPS",
+    "CUS_MSG_TPS": "消费消息TPS",
+    "YESTERDAY_PRO_COUNT": "昨日生产总数",
+    "YESTERDAY_CUS_COUNT": "昨日消费总数",
+    "TODAY_PRO_COUNT": "今天生产总数",
+    "TODAY_CUS_COUNT": "今天消费总数",
+    "INSTANCE": "实例",
+    "SPLIT": "分片",
+    "CLUSTER": "集群",
+    "CLUSTER_DETAIL": "集群详情",
+    "COMMIT": "提交",
+    "TOPIC": "主题",
+    "SUBSCRIPTION_GROUP":"订阅组",
+    "PRODUCER_GROUP":"生产组",
+    "CONSUMER":"消费者",
+    "PRODUCER":"生产者",
+    "MESSAGE":"消息",
+    "OPERATION": "操作",
+    "ADD": "新增",
+    "UPDATE": "更新",
+    "STATUS": "状态",
+    "ROUTER": "路由",
+    "MANAGE": "管理",
+    "CONFIG": "配置",
+    "SEND_MSG": "发送消息",
+    "RESET_CUS_OFFSET": "重置消费位点",
+    "DELETE": "删除",
+    "CHANGE_LANG": "更换语言",
+    "BROKER": "Broker",
+    "NORMAL": "普通",
+    "RETRY": "重试",
+    "DLQ": "死信",
+    "QUANTITY":"数量",
+    "TYPE":"类型",
+    "MODE":"模式",
+    "DELAY":"延迟",
+    "DASHBOARD":"驾驶舱",
+    "CONSUME_DETAIL":"消费详情",
+    "CLIENT":"终端",
+    "LAST_CONSUME_TIME":"最后消费时间",
+    "TIME":"时间点",
+    "RESET":"重置",
+    "DATE":"日期",
+    "NO_DATA":"暂无数据",
+    "SEARCH":"搜索",
+    "BEGIN":"开始",
+    "END":"结束",
+    "TOPIC_CHANGE":"修改主题",
+    "SEND":"发送",
+    "SUBSCRIPTION_CHANGE":"修改订阅",
+    "QUEUE":"队列",
+	"MIN_OFFSET":"最小位点",
+	"MAX_OFFSET":"最大位点",
+	"LAST_UPDATE_TIME_STAMP":"上次更新时间",
+    "QUEUE_DATAS":"队列信息",
+    "READ_QUEUE_NUMS":"读队列数量",
+    "WRITE_QUEUE_NUMS":"写队列数量",
+    "PERM":"perm",
+    "TAG":"标签",
+    "KEY":"值",
+    "MESSAGE_BODY":"消息主体",
+    "TOPIC_NAME":"主题名",
+    "ORDER":"顺序",
+    "CONSUMER_CLIENT":"消费者终端",
+    "BROKER_OFFSET":"代理者位点",
+    "CONSUMER_OFFSET":"消费者位点",
+    "DIFF_TOTAL":"差值",
+    "LAST_TIME_STAMP":"上次时间",
+    "RESET_OFFSET":"重置位点",
+    "CLUSTER_NAME":"集群名",
+    "OPS":"运维",
+    "AUTO_REFRESH":"自动刷新",
+    "REFRESH":"刷新"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/src/message.js
----------------------------------------------------------------------
diff --git a/rocketmq-console/src/main/resources/static/src/message.js b/rocketmq-console/src/main/resources/static/src/message.js
new file mode 100644
index 0000000..fca286c
--- /dev/null
+++ b/rocketmq-console/src/main/resources/static/src/message.js
@@ -0,0 +1,200 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var module = app;
+
+module.controller('messageController', ['$scope', 'ngDialog', '$http','Notification',function ($scope, ngDialog, $http,Notification) {
+    $scope.allTopicList = [];
+    $scope.selectedTopic =[];
+    $scope.key ="";
+    $scope.messageId ="";
+    $scope.queryMessageByTopicResult=[];
+    $scope.queryMessageByTopicAndKeyResult=[];
+    $scope.queryMessageByMessageIdResult={};
+    $http({
+        method: "GET",
+        url: "topic/list.query"
+    }).success(function (resp) {
+        if(resp.status ==0){
+            $scope.allTopicList = resp.data.topicList.sort();
+            console.log($scope.allTopicList);
+        }else {
+            Notification.error({message: resp.errMsg, delay: 2000});
+        }
+    });
+    $scope.timepickerBegin = moment().subtract(1, 'hour').format('YYYY-MM-DD HH:mm');
+    $scope.timepickerEnd = moment().add(1,'hour').format('YYYY-MM-DD HH:mm');
+    $scope.timepickerOptions ={format: 'YYYY-MM-DD HH:mm', showClear: true};
+
+    $scope.paginationConf = {
+        currentPage: 1,
+        totalItems: 0,
+        itemsPerPage: 20,
+        pagesLength: 15,
+        perPageOptions: [10],
+        rememberPerPage: 'perPageItems',
+        onChange: function () {
+            $scope.changeShowMessageList(this.currentPage,this.totalItems);
+        }
+    };
+
+
+    $scope.queryMessageByTopic = function () {
+        console.log($scope.selectedTopic);
+        console.log($scope.timepickerBegin)
+        console.log($scope.timepickerEnd)
+        $http({
+            method: "GET",
+            url: "message/queryMessageByTopic.query",
+            params: {
+                topic: $scope.selectedTopic,
+                begin: $scope.timepickerBegin.valueOf(),
+                end: $scope.timepickerEnd.valueOf()
+
+            }
+        }).success(function (resp) {
+            if (resp.status == 0) {
+                console.log(resp);
+                $scope.queryMessageByTopicResult = resp.data;
+                $scope.changeShowMessageList(1,$scope.queryMessageByTopicResult.length);
+                // todo
+                // console.log($scope.queryMessageByTopicResult);
+            }else {
+                Notification.error({message: resp.errMsg, delay: 2000});
+            }
+        });
+    };
+
+    $scope.queryMessageByTopicAndKey = function () {
+        console.log($scope.selectedTopic);
+        console.log($scope.key);
+        $http({
+            method: "GET",
+            url: "message/queryMessageByTopicAndKey.query",
+            params: {
+                topic: $scope.selectedTopic,
+                key:$scope.key
+            }
+        }).success(function (resp) {
+            if (resp.status == 0) {
+                console.log(resp);
+                $scope.queryMessageByTopicAndKeyResult = resp.data;
+                console.log($scope.queryMessageByTopicAndKeyResult);
+            }else {
+                Notification.error({message: resp.errMsg, delay: 2000});
+            }
+        });
+    };
+
+    $scope.queryMessageByBrokerAndOffset = function (storeHost,commitLogOffset) {
+        $http({
+            method: "GET",
+            url: "message/viewMessageByBrokerAndOffset.query",
+            params: {
+                brokerHost: storeHost.address,
+                port:storeHost.port,
+                offset: commitLogOffset
+            }
+        }).success(function (resp) {
+            if (resp.status == 0) {
+                console.log(resp);
+                ngDialog.open({
+                    template: 'messageDetailViewDialog',
+                    controller: 'messageDetailViewDialogController',
+                    data: resp.data
+                });
+            } else {
+                Notification.error({message: resp.errMsg, delay: 2000});
+            }
+        });
+    };
+
+    $scope.queryMessageByMessageId = function (messageId,topic) {
+        $http({
+            method: "GET",
+            url: "message/viewMessage.query",
+            params: {
+                msgId: messageId,
+                topic:topic
+            }
+        }).success(function (resp) {
+            if (resp.status == 0) {
+                console.log(resp);
+                ngDialog.open({
+                    template: 'messageDetailViewDialog',
+                    controller: 'messageDetailViewDialogController',
+                    data:resp.data
+                });
+            }else {
+                Notification.error({message: resp.errMsg, delay: 2000});
+            }
+        });
+    };
+
+
+    $scope.changeShowMessageList = function (currentPage,totalItem) {
+        var perPage = $scope.paginationConf.itemsPerPage;
+        var from = (currentPage - 1) * perPage;
+        var to = (from + perPage)>totalItem?totalItem:from + perPage;
+        $scope.messageShowList = $scope.queryMessageByTopicResult.slice(from, to);
+        $scope.paginationConf.totalItems = totalItem ;
+    };
+}]);
+
+module.controller('messageDetailViewDialogController',['$scope', 'ngDialog', '$http','Notification', function ($scope, ngDialog, $http,Notification) {
+
+        $scope.resendMessage = function (msgId,topic,consumerGroup) {
+            $http({
+                method: "POST",
+                url: "message/consumeMessageDirectly.do",
+                params: {
+                    msgId: msgId,
+                    consumerGroup:consumerGroup,
+                    topic:topic
+                }
+            }).success(function (resp) {
+                if (resp.status == 0) {
+                    ngDialog.open({
+                        template: 'operationResultDialog',
+                        data:{
+                            result:resp.data
+                        }
+                    });
+                }
+                else {
+                    ngDialog.open({
+                        template: 'operationResultDialog',
+                        data:{
+                            result:resp.errMsg
+                        }
+                    });
+                }
+            });
+        };
+        $scope.showExceptionDesc = function (errmsg) {
+            if(errmsg == null){
+                errmsg = "Don't have Exception"
+            }
+            ngDialog.open({
+                template: 'operationResultDialog',
+                data:{
+                    result:errmsg
+                }
+            });
+        };
+    }]
+);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/src/ops.js
----------------------------------------------------------------------
diff --git a/rocketmq-console/src/main/resources/static/src/ops.js b/rocketmq-console/src/main/resources/static/src/ops.js
new file mode 100644
index 0000000..312e41f
--- /dev/null
+++ b/rocketmq-console/src/main/resources/static/src/ops.js
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+app.controller('opsController', ['$scope','$location','$http','Notification','remoteApi','tools', function ($scope,$location,$http,Notification,remoteApi,tools) {
+    $scope.namesvrAddrList = [];
+    $scope.useVIPChannel = true;
+    $http({
+        method: "GET",
+        url: "ops/homePage.query"
+    }).success(function (resp) {
+        if (resp.status == 0) {
+            $scope.namesvrAddrList = resp.data.namesvrAddrList;
+            $scope.useVIPChannel = resp.data.useVIPChannel
+        }else{
+            Notification.error({message: resp.errMsg, delay: 2000});
+        }
+    });
+
+    $scope.updateNameSvrAddr = function () {
+        $http({
+            method: "POST",
+            url: "ops/updateNameSvrAddr.do",
+            params:{nameSvrAddrList:$scope.namesvrAddrList.join(";")}
+        }).success(function (resp) {
+            if (resp.status == 0) {
+                Notification.info({message: "SUCCESS", delay: 2000});
+            }else{
+                Notification.error({message: resp.errMsg, delay: 2000});
+            }
+        });
+    };
+    $scope.updateIsVIPChannel = function () {
+        $http({
+            method: "POST",
+            url: "ops/updateIsVIPChannel.do",
+            params:{useVIPChannel:$scope.useVIPChannel}
+        }).success(function (resp) {
+            if (resp.status == 0) {
+                Notification.info({message: "SUCCESS", delay: 2000});
+            }else{
+                Notification.error({message: resp.errMsg, delay: 2000});
+            }
+        });
+    }
+}]);

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/src/producer.js
----------------------------------------------------------------------
diff --git a/rocketmq-console/src/main/resources/static/src/producer.js b/rocketmq-console/src/main/resources/static/src/producer.js
new file mode 100644
index 0000000..3c039ad
--- /dev/null
+++ b/rocketmq-console/src/main/resources/static/src/producer.js
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var module = app;
+module.controller('producerController', ['$scope', '$http','Notification',function ($scope, $http,Notification) {
+    $scope.selectedTopic=[];
+    $scope.producerGroup="";
+    $http({
+        method: "GET",
+        url: "topic/list.query"
+    }).success(function (resp) {
+        if(resp.status ==0){
+            $scope.allTopicList = resp.data.topicList.sort();
+            console.log($scope.allTopicList);
+        }else {
+            Notification.error({message: resp.errMsg, delay: 2000});
+        }
+    });
+    $scope.queryClientByTopicAndGroup = function () {
+        $http({
+            method: "GET",
+            url: "producer/producerConnection.query",
+            params:{
+                topic:$scope.selectedTopic,
+                producerGroup:$scope.producerGroup
+            }
+        }).success(function (resp) {
+            if(resp.status ==0){
+                $scope.connectionList = resp.data.connectionSet;
+            }else {
+                Notification.error({message: resp.errMsg, delay: 2000});
+            }
+        });
+    }
+} ]);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/src/remoteApi/remoteApi.js
----------------------------------------------------------------------
diff --git a/rocketmq-console/src/main/resources/static/src/remoteApi/remoteApi.js b/rocketmq-console/src/main/resources/static/src/remoteApi/remoteApi.js
new file mode 100644
index 0000000..1189771
--- /dev/null
+++ b/rocketmq-console/src/main/resources/static/src/remoteApi/remoteApi.js
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+app.service('remoteApi', ['$http','tools', function ($http,tools) {
+    var queryTopic = function(callback){
+        $http({
+            method: "GET",
+            url: "topic/list.query"
+        }).success(callback);
+    }
+
+    var queryClusterList = function(callback){
+        $http({
+            method: "GET",
+            url: "cluster/list.query"
+        }).success(callback);
+    }
+
+    var queryBrokerHisData = function(date,callback){
+        var url = 'dashboard/broker.query';
+        var data = {date:date};
+        var setting = {
+            type: "GET",
+            data:data,
+            timeout:15000,//data is too large,so master set time out is long enough
+            success:callback
+        }
+        $.ajax(url,setting)
+    }
+
+    var queryTopicHisData = function(date,topicName,callback){
+        var url =  'dashboard/topic.query';
+        var data = {date:date,topicName:topicName};
+        var setting = {
+            type: "GET",
+            data:data,
+            timeout:15000,//data is too large,so master set time out is long enough
+            success:callback
+        }
+        $.ajax(url,setting)
+    }
+
+    var queryTopicCurrentData = function(callback){
+        var url = 'dashboard/topicCurrent';
+        var setting = {
+            type: "GET",
+            timeout:15000,//data is too large,so master set time out is long enough
+            success:callback
+        }
+        $.ajax(url,setting)
+    }
+
+
+    return {
+        queryTopic:queryTopic,
+        queryClusterList:queryClusterList,
+        queryBrokerHisData:queryBrokerHisData,
+        queryTopicHisData:queryTopicHisData,
+        queryTopicCurrentData:queryTopicCurrentData
+    }
+}])
+

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/src/tools/tools.js
----------------------------------------------------------------------
diff --git a/rocketmq-console/src/main/resources/static/src/tools/tools.js b/rocketmq-console/src/main/resources/static/src/tools/tools.js
new file mode 100644
index 0000000..9ab5ae7
--- /dev/null
+++ b/rocketmq-console/src/main/resources/static/src/tools/tools.js
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+app.service('tools', ['$http', function ($http) {
+
+    var ctx = "";
+    var dashboardRefreshTime = 5000; // todo improve. when data size is large,request is too slow
+
+    var generateBrokerMap = function (brokerServer, clusterAddrTable, brokerAddrTable) {
+        var map = {};
+        $.each(brokerServer, function (brokerName, brokerStatusList) { // broker
+            $.each(clusterAddrTable, function (clusterName, brokerNameList) { //clusterAddrTable
+                if (angular.isUndefined(map[clusterName])) {
+                    map[clusterName] = [];
+                }
+                $.each(brokerNameList, function (listIndex, clusterBrokerName) {
+                    if (clusterBrokerName == brokerName) {
+                        $.each(brokerStatusList, function (index, brokerStatus) {
+                            brokerStatus.split = brokerName;
+                            brokerStatus.index = index;
+                            brokerStatus.address = brokerAddrTable[clusterBrokerName].brokerAddrs[index];
+                            brokerStatus.brokerName = brokerAddrTable[clusterBrokerName].brokerName;
+                            map[clusterName].push(brokerStatus);
+                        })
+                    }
+                })
+            })
+        });
+        return map;
+    };
+
+    var fastSort = function (arrayToSort, propertyToSortWith, sortDirection) {
+        // temporary holder of position and sort-value
+        var map = arrayToSort.map(function (e, i) {
+            if (typeof e[propertyToSortWith] === 'string') {
+                return { index: i, value: e[propertyToSortWith].toLowerCase() };
+            }
+            else {
+                return { index: i, value: e[propertyToSortWith] };
+            }
+
+        })
+
+        // sorting the map containing the reduced values
+        map.sort(function (a, b) {
+            if (sortDirection === "ascending") {
+                return +(a.value > b.value) || +(a.value === b.value) - 1;
+            }
+            else {
+                return +(a.value < b.value) || +(a.value === b.value) - 1;
+            }
+
+        });
+
+        // container for the resulting order
+        var result = map.map(function (e) {
+            return arrayToSort[e.index];
+        });
+        return result;
+    };
+
+    return {
+        generateBrokerMap:generateBrokerMap,
+        fastSort:fastSort,
+        ctx:ctx,
+        dashboardRefreshTime:dashboardRefreshTime
+    }
+}])
+
+
+

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/src/topic.js
----------------------------------------------------------------------
diff --git a/rocketmq-console/src/main/resources/static/src/topic.js b/rocketmq-console/src/main/resources/static/src/topic.js
new file mode 100644
index 0000000..047fbe2
--- /dev/null
+++ b/rocketmq-console/src/main/resources/static/src/topic.js
@@ -0,0 +1,406 @@
+/**
+ * Created by tcrow on 2017/1/12 0012.
+ */
+var module = app;
+
+module.directive('ngConfirmClick', [
+    function(){
+        return {
+            link: function (scope, element, attr) {
+                var msg = attr.ngConfirmClick || "Are you sure?";
+                var clickAction = attr.confirmedClick;
+                element.bind('click',function (event) {
+                    if ( window.confirm(msg) ) {
+                        scope.$eval(clickAction)
+                    }
+                });
+            }
+        };
+    }]);
+module.controller('topicController', ['$scope', 'ngDialog', '$http','Notification',function ($scope, ngDialog, $http,Notification) {
+    $scope.paginationConf = {
+        currentPage: 1,
+        totalItems: 0,
+        itemsPerPage: 10,
+        pagesLength: 15,
+        perPageOptions: [10],
+        rememberPerPage: 'perPageItems',
+        onChange: function () {
+            $scope.showTopicList(this.currentPage,this.totalItems);
+
+        }
+    };
+    $scope.filterNormal = true
+    $scope.filterRetry = false
+    $scope.filterDLQ = false
+    $scope.allTopicList = [];
+    $scope.topicShowList = [];
+    $http({
+        method: "GET",
+        url: "topic/list.query"
+    }).success(function (resp) {
+        if(resp.status ==0){
+            $scope.allTopicList = resp.data.topicList.sort();
+            console.log($scope.allTopicList);
+            console.log(JSON.stringify(resp));
+            $scope.showTopicList(1,$scope.allTopicList.length);
+
+        }else {
+            Notification.error({message: resp.errMsg, delay: 5000});
+        }
+
+    });
+    $scope.filterStr="";
+    $scope.$watch('filterStr', function() {
+        $scope.filterList(1);
+    });
+    $scope.$watch('filterNormal', function() {
+        $scope.filterList(1);
+    });
+    $scope.$watch('filterRetry', function() {
+        $scope.filterList(1);
+    });
+    $scope.$watch('filterDLQ', function() {
+        $scope.filterList(1);
+    });
+    $scope.filterList = function (currentPage) {
+        var lowExceptStr =  $scope.filterStr.toLowerCase();
+        var canShowList = [];
+
+        $scope.allTopicList.forEach(function(element) {
+            if($scope.filterByType(element)){
+                if (element.toLowerCase().indexOf(lowExceptStr) != -1){
+                    canShowList.push(element);
+                }
+            }
+        });
+        $scope.paginationConf.totalItems =canShowList.length;
+        var perPage = $scope.paginationConf.itemsPerPage;
+        var from = (currentPage - 1) * perPage;
+        var to = (from + perPage)>canShowList.length?canShowList.length:from + perPage;
+        $scope.topicShowList = canShowList.slice(from, to);
+    };
+
+    $scope.filterByType = function(str){
+            if($scope.filterRetry){
+                if(str.startsWith("%R")){
+                    return true
+                }
+            }
+            if($scope.filterDLQ){
+                if(str.startsWith("%D")){
+                    return true
+                }
+            }
+            if($scope.filterNormal){
+                if(str.startsWith("%") == false){
+                    return true
+                }
+            }
+        return false;
+    };
+
+    $scope.showTopicList = function (currentPage,totalItem) {
+        if($scope.filterStr != ""){
+            $scope.filterList(currentPage);
+            return;
+        }
+        var perPage = $scope.paginationConf.itemsPerPage;
+        var from = (currentPage - 1) * perPage;
+        var to = (from + perPage)>totalItem?totalItem:from + perPage;
+        console.log($scope.allTopicList);
+        console.log(from)
+        console.log(to)
+        $scope.topicShowList = $scope.allTopicList.slice(from, to);
+        $scope.paginationConf.totalItems = totalItem ;
+        console.log($scope.topicShowList)
+        console.log($scope.paginationConf.totalItems)
+        $scope.filterList(currentPage);
+    };
+    $scope.deleteTopic= function (topic) {
+        $http({
+            method: "POST",
+            url: "topic/deleteTopic.do",
+            params:{
+                topic:topic
+            }
+        }).success(function (resp) {
+            if(resp.status ==0){
+                Notification.info({message: "delete success!", delay: 2000});
+            }else {
+                Notification.error({message: resp.errMsg, delay: 2000});
+            }
+        });
+    };
+    $scope.statsView = function (topic) {
+        $http({
+            method: "GET",
+            url: "topic/stats.query",
+            params: {topic: topic}
+        }).success(function (resp) {
+            if (resp.status == 0) {
+                console.log(JSON.stringify(resp));
+                ngDialog.open({
+                    template: 'statsViewDialog',
+                    trapFocus:false,
+                    data:{
+                        topic:topic,
+                        statsData:resp.data
+                    }
+                });
+            }else {
+                Notification.error({message: resp.errMsg, delay: 2000});
+            }
+        })
+    };
+    $scope.routerView = function (topic) {
+        $http({
+            method: "GET",
+            url: "topic/route.query",
+            params: {topic: topic}
+        }).success(function (resp) {
+            if (resp.status == 0) {
+                console.log(JSON.stringify(resp));
+                ngDialog.open({
+                    template: 'routerViewDialog',
+                    controller: 'routerViewDialogController',
+                    trapFocus:false,
+                    data:{
+                        topic:topic,
+                        routeData:resp.data
+                    }
+                });
+            }else {
+                Notification.error({message: resp.errMsg, delay: 2000});
+            }
+        })
+    };
+
+
+    $scope.consumerView = function (topic) {
+        $http({
+            method: "GET",
+            url: "topic/queryConsumerByTopic.query",
+            params: {topic: topic}
+        }).success(function (resp) {
+            if (resp.status == 0) {
+                console.log(JSON.stringify(resp));
+                ngDialog.open({
+                    template: 'consumerViewDialog',
+                    data:{
+                        topic:topic,
+                        consumerData:resp.data,
+                        consumerGroupCount:Object.keys(resp.data).length
+                    }
+                });
+            }else {
+                Notification.error({message: resp.errMsg, delay: 2000});
+            }
+        })
+    };
+    $scope.openDeleteTopicDialog = function (topic) {
+        ngDialog.open({
+            template: 'deleteTopicDialog',
+            controller: 'deleteTopicDialogController',
+            data:{
+                topic:topic,
+                consumerData:"asd"
+            }
+        });
+    };
+
+    $scope.openConsumerResetOffsetDialog = function (topic) {
+
+        $http({
+            method: "GET",
+            url: "topic/queryTopicConsumerInfo.query",
+            params:{
+                topic:topic
+            }
+        }).success(function (resp) {
+            if(resp.status ==0){
+                if(resp.data.groupList == null){
+                    Notification.error({message: "don't have consume group!", delay: 2000});
+                    return
+                }
+                ngDialog.open({
+                    template: 'consumerResetOffsetDialog',
+                    controller: 'consumerResetOffsetDialogController',
+                    data:{
+                        topic: topic,
+                        selectedConsumerGroup:[],
+                        allConsumerGroupList:resp.data.groupList
+                    }
+                });
+            }else {
+                Notification.error({message: resp.errMsg, delay: 2000});
+            }
+        });
+
+    };
+
+
+    $scope.openSendTopicMessageDialog = function (topic) {
+        ngDialog.open({
+            template: 'sendTopicMessageDialog',
+            controller: 'sendTopicMessageDialogController',
+            data: {
+                topic: topic
+            }
+        });
+    };
+
+    $scope.openUpdateDialog = function (topic) {
+        $http({
+            method: "GET",
+            url: "topic/examineTopicConfig.query",
+            params:{
+                topic:topic
+            }
+        }).success(function (resp) {
+            if(resp.status ==0){
+                $scope.openCreateOrUpdateDialog(resp.data);
+            }else {
+                Notification.error({message: resp.errMsg, delay: 2000});
+            }
+        });
+    };
+
+    $scope.openCreateOrUpdateDialog = function (request) {
+        var bIsUpdate = true;
+
+        if(request == null){
+            request = [{
+                writeQueueNums:16,
+                readQueueNums:16,
+                perm:6,
+                order:false,
+                topicName:"",
+                brokerNameList:[]
+            }];
+            bIsUpdate = false;
+        }
+        $http({
+            method: "GET",
+            url: "cluster/list.query"
+        }).success(function (resp) {
+            if(resp.status ==0){
+                console.log(resp);
+                ngDialog.open({
+                    template: 'topicModifyDialog',
+                    controller: 'topicModifyDialogController',
+                    data:{
+                        topicRequestList:request,
+                        allClusterNameList:Object.keys(resp.data.clusterInfo.clusterAddrTable),
+                        allBrokerNameList:Object.keys(resp.data.brokerServer),
+                        bIsUpdate:bIsUpdate
+                    }
+                });
+            }
+        });
+    }
+
+    $scope.openAddDialog = function () {
+        $scope.openCreateOrUpdateDialog(null);
+    }
+
+}]);
+
+module.controller('topicModifyDialogController', ['$scope', 'ngDialog', '$http','Notification',function ($scope, ngDialog, $http,Notification) {
+        $scope.postTopicRequest = function (topicRequestItem) {
+            console.log(topicRequestItem);
+            var request = JSON.parse(JSON.stringify(topicRequestItem));
+            console.log(request);
+            $http({
+                method: "POST",
+                url: "topic/createOrUpdate.do",
+                data:request
+            }).success(function (resp) {
+                if(resp.status ==0){
+                    Notification.info({message: "success!", delay: 2000});
+                }else {
+                    Notification.error({message: resp.errMsg, delay: 2000});
+                }
+            });
+        }
+    }]
+);
+module.controller('consumerResetOffsetDialogController',['$scope', 'ngDialog', '$http','Notification', function ($scope, ngDialog, $http,Notification) {
+        $scope.timepicker = {};
+        $scope.timepicker.date = moment().format('YYYY-MM-DD HH:mm');
+        $scope.timepicker.options = {format: 'YYYY-MM-DD HH:mm', showClear: true};
+        $scope.resetOffset = function () {
+            console.log($scope.timepicker.date);
+            console.log($scope.timepicker.date.valueOf());
+            console.log($scope.ngDialogData.selectedConsumerGroup);
+            $http({
+                method: "POST",
+                url: "consumer/resetOffset.do",
+                data: {
+                    resetTime: $scope.timepicker.date.valueOf(),
+                    consumerGroupList: $scope.ngDialogData.selectedConsumerGroup,
+                    topic:$scope.ngDialogData.topic,
+                    force:true
+                }
+            }).success(function (resp) {
+                if(resp.status ==0){
+                    ngDialog.open({
+                        template: 'resetOffsetResultDialog',
+                        data:{
+                            result:resp.data
+                        }
+                    });
+                }else {
+                    Notification.error({message: resp.errMsg, delay: 2000});
+                }
+            })
+        }
+    }]
+);
+
+module.controller('sendTopicMessageDialogController', ['$scope', 'ngDialog', '$http','Notification',function ($scope, ngDialog, $http,Notification) {
+        $scope.sendTopicMessage = {
+            topic: $scope.ngDialogData.topic,
+            key: "key",
+            tag:"tag",
+            messageBody:"messageBody"
+        };
+        $scope.send = function () {
+            $http({
+                method: "POST",
+                url: "topic/sendTopicMessage.do",
+                data: $scope.sendTopicMessage
+            }).success(function (resp) {
+                if(resp.status ==0){
+                    ngDialog.open({
+                        template: 'sendResultDialog',
+                        data:{
+                            result:resp.data
+                        }
+                    });
+                }else {
+                    Notification.error({message: resp.errMsg, delay: 2000});
+                }
+            })
+        }
+    }]
+
+);
+
+module.controller('routerViewDialogController', ['$scope', 'ngDialog', '$http','Notification',function ($scope, ngDialog, $http,Notification) {
+        $scope.deleteTopicByBroker = function (broker) {
+            $http({
+                method: "POST",
+                url: "topic/deleteTopicByBroker.do",
+                params: {brokerName:broker.brokerName,topic:$scope.ngDialogData.topic}
+            }).success(function (resp) {
+                if(resp.status ==0){
+                    Notification.info({message: "delete success", delay: 2000});
+                }else {
+                    Notification.error({message: resp.errMsg, delay: 2000});
+                }
+            })
+        };
+    }]
+
+);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/style/animate.css
----------------------------------------------------------------------
diff --git a/rocketmq-console/src/main/resources/static/style/animate.css b/rocketmq-console/src/main/resources/static/style/animate.css
new file mode 100644
index 0000000..e3f0d0e
--- /dev/null
+++ b/rocketmq-console/src/main/resources/static/style/animate.css
@@ -0,0 +1,32 @@
+.view {
+}
+
+.view .ng-enter {
+    overflow-y: auto;
+}
+
+.view .ng-leave {
+    opacity: 0;
+    -webkit-transition: opacity .2s linear;
+    transition: opacity 0.2s linear;
+}
+
+.ng-hide-add {
+    transform: rotateZ(0);
+    transform-origin: right;
+    transition: all 0.2s ease-in-out;
+}
+
+.ng-hide-add.ng-hide-add-active {
+    transform: rotateZ(-135deg);
+}
+
+.ng-hide-remove {
+    transform: rotateY(90deg);
+    transform-origin: left;
+    transition: all 0.2s ease;
+}
+
+.ng-hide-remove.ng-hide-remove-active {
+    transform: rotateY(0);
+}

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/style/app.css
----------------------------------------------------------------------
diff --git a/rocketmq-console/src/main/resources/static/style/app.css b/rocketmq-console/src/main/resources/static/style/app.css
new file mode 100644
index 0000000..1941c11
--- /dev/null
+++ b/rocketmq-console/src/main/resources/static/style/app.css
@@ -0,0 +1,274 @@
+/* Write your styles */
+.scrollTo {
+    position: fixed;
+    right: 50px;
+    bottom: 70px;
+    z-index: 999;
+}
+
+/*.icon_u_c{background:url(/app/img/icon_user_center.png) no-repeat left top;}*/
+.icon {
+     float: left;
+     width: 24px;
+     height: 24px;
+     display: inline-block;
+     margin: 10px 18px 0 5px;
+}
+.icon_alipay {
+    background:url("/style/img/alipay.png") no-repeat left top;
+    height:100px;
+    width: 100px;
+    margin-top: -40px;
+}
+
+.icon_alipay_active {
+    background:url("/style/img/alipay_active.png") no-repeat left top;
+    height:100px;
+    width: 100px;
+    margin-top: -40px;
+}
+
+.icon_weipay {
+    background:url("/style/img/weipay.png") no-repeat left top;
+    height:100px;
+    width: 100px;
+    margin-top: -40px;
+}
+
+.icon_weipay_active {
+    background:url("/style/img/weipay_active.png") no-repeat left top;
+    height:100px;
+    width: 100px;
+    margin-top: -40px;
+}
+
+.round {
+    background:#5bc0de;
+    -moz-border-radius: 5px;
+    -webkit-border-radius: 5px;
+    border-radius:5px;
+    color: #FFFFFF;
+}
+
+
+/* ANIMATIONS
+============================================================================= */
+
+/* leaving animations ----------------------------------------- */
+/* rotate and fall */
+@keyframes rotateFall {
+    0%     { transform: rotateZ(0deg); }
+    20%   { transform: rotateZ(10deg); animation-timing-function: ease-out; }
+    40%   { transform: rotateZ(17deg); }
+    60%   { transform: rotateZ(16deg); }
+    100%   { transform: translateY(100%) rotateZ(17deg); }
+}
+
+/* slide in from the bottom */
+@keyframes slideOutLeft {
+    to     { transform: translateX(-100%); }
+}
+
+/*!* rotate out newspaper *!*/
+@keyframes rotateOutNewspaper {
+    to     { transform: translateZ(-3000px) rotateZ(360deg); opacity: 0; }
+}
+
+/* entering animations --------------------------------------- */
+/* scale up */
+@keyframes scaleUp {
+    from   { opacity: 0.3; -webkit-transform: scale(0.8); }
+}
+
+/* slide in from the right */
+@keyframes slideInRight {
+    from   { transform:translateX(100%); }
+    to     { transform: translateX(0); }
+}
+
+/* slide in from the bottom */
+@keyframes slideInUp {
+    from   { transform:translateY(100%); }
+    to     { transform: translateY(0); }
+}
+
+.ng-enter       { animation: scaleUp 0.5s both ease-in; z-index: 8888; }
+.ng-leave       { animation: slideOutLeft 0.2s both ease-in; z-index: 9999; }
+
+
+
+
+.managerList {
+    list-style:none;
+    position: relative;
+    width: 100%;
+    margin-left: 20px;
+}
+
+.managerList > li {
+    width: 95%;
+    margin-top:10px;
+}
+
+.managerList ul {
+    list-style-type:none;
+    float:left;
+    padding: 0;
+}
+
+.managerList li {
+    list-style-type:none;
+    float:left;
+    padding: 0;
+}
+
+.managerList .head {
+    width: 90%;
+}
+
+.managerList .footer {
+    width: 90%;
+    margin-top: 10px;
+    margin-left: 50px;
+}
+
+.managerList .checkbox {
+    width: 50px;
+}
+
+.managerList .liCheck {
+    width: 50px;
+}
+
+.managerList .liContent {
+    width: 90%;
+}
+
+.managerList .preview {
+    width: 50%;
+    margin-left: 50px;
+    margin-top: 10px;
+}
+
+.managerList .logo {
+    margin-top: 9px;
+    width: 50px;
+}
+
+.managerList .content{
+    width: 50%;
+}
+
+.managerList .content ul{
+    width: 90%;
+}
+
+.managerList .butt{
+    /*width: 20%;*/
+}
+
+.badgeCustomer {
+    background-color:#f44336;
+    margin-top:23px;
+}
+
+.chatPanel {
+    width: 90%;
+    float: left;
+    border: 1px solid #d4d4d4;
+    border-radius: 2px;
+    padding: 20px;
+    position: relative;
+    -webkit-box-shadow: 0 1px 6px rgba(0, 0, 0, 0.175);
+    box-shadow: 0 1px 6px rgba(0, 0, 0, 0.175);
+    float: right;
+}
+
+.chatPanel:after{
+    position: absolute;
+    top: 27px;
+    right: -14px;
+    display: inline-block;
+    border-top: 14px solid transparent;
+    border-left: 14px solid #fff;
+    border-right: 0 solid #fff;
+    border-bottom: 14px solid transparent;
+    content: " ";
+}
+
+.chatPanel:before{
+    position: absolute;
+    top: 26px;
+    right: -15px;
+    display: inline-block;
+    border-top: 15px solid transparent;
+    border-left: 15px solid #ccc;
+    border-right: 0 solid #ccc;
+    border-bottom: 15px solid transparent;
+    content: " ";
+}
+
+.chatPanel-left {
+    float: left;
+}
+.chatPanel-left:before {
+    border-left-width: 0;
+    border-right-width: 15px;
+    left: -15px;
+    right: auto;
+}
+.chatPanel-left:after {
+    border-left-width: 0;
+    border-right-width: 14px;
+    left: -14px;
+    right: auto;
+}
+
+.xxs-avatar {
+    width: 10px;
+    height: 10px;
+}
+
+
+.xs-avatar {
+    width: 50px;
+    height: 50px;
+}
+
+.md-avatar {
+    width: 70px;
+    height: 70px;
+}
+
+.lg-avatar {
+    width: 100px;
+    height: 100px;
+}
+
+.text-truncate {
+    word-wrap: normal;
+    /* for IE */
+    text-overflow: ellipsis;
+    white-space: nowrap;
+    overflow: hidden;
+}
+
+.text-yellow {
+    color:#FFCC66;
+}
+
+.label-xl{
+    font-size:150%;
+}
+
+.pointer {
+    cursor: pointer;
+}
+
+.limit_height{
+    height: 600px;overflow-y:auto;overflow-x:hidden;
+}
+
+.table.text-middle>tbody>tr>td,.table.text-middle>tbody>tr>th{
+    vertical-align: middle;
+}

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/style/btn.css
----------------------------------------------------------------------
diff --git a/rocketmq-console/src/main/resources/static/style/btn.css b/rocketmq-console/src/main/resources/static/style/btn.css
new file mode 100644
index 0000000..29d4186
--- /dev/null
+++ b/rocketmq-console/src/main/resources/static/style/btn.css
@@ -0,0 +1,752 @@
+
+.btn,
+.navbar .navbar-nav > li > a.btn {
+    border: none;
+    border-radius: 3px;
+    position: relative;
+    padding: 12px 30px;
+    margin: 10px 1px;
+    font-size: 12px;
+    font-weight: 400;
+    text-transform: uppercase;
+    letter-spacing: 0;
+    will-change: box-shadow, transform;
+    transition: box-shadow 0.2s cubic-bezier(0.4, 0, 1, 1), background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1);
+}
+.btn::-moz-focus-inner,
+.navbar .navbar-nav > li > a.btn::-moz-focus-inner {
+    border: 0;
+}
+.btn, .btn.btn-default,
+.navbar .navbar-nav > li > a.btn,
+.navbar .navbar-nav > li > a.btn.btn-default {
+    box-shadow: 0 2px 2px 0 rgba(153, 153, 153, 0.14), 0 3px 1px -2px rgba(153, 153, 153, 0.2), 0 1px 5px 0 rgba(153, 153, 153, 0.12);
+}
+.btn, .btn:hover, .btn:focus, .btn:active, .btn.active, .btn:active:focus, .btn:active:hover, .btn.active:focus, .btn.active:hover, .open > .btn.dropdown-toggle, .open > .btn.dropdown-toggle:focus, .open > .btn.dropdown-toggle:hover, .btn.btn-default, .btn.btn-default:hover, .btn.btn-default:focus, .btn.btn-default:active, .btn.btn-default.active, .btn.btn-default:active:focus, .btn.btn-default:active:hover, .btn.btn-default.active:focus, .btn.btn-default.active:hover, .open > .btn.btn-default.dropdown-toggle, .open > .btn.btn-default.dropdown-toggle:focus, .open > .btn.btn-default.dropdown-toggle:hover,
+.navbar .navbar-nav > li > a.btn,
+.navbar .navbar-nav > li > a.btn:hover,
+.navbar .navbar-nav > li > a.btn:focus,
+.navbar .navbar-nav > li > a.btn:active,
+.navbar .navbar-nav > li > a.btn.active,
+.navbar .navbar-nav > li > a.btn:active:focus,
+.navbar .navbar-nav > li > a.btn:active:hover,
+.navbar .navbar-nav > li > a.btn.active:focus,
+.navbar .navbar-nav > li > a.btn.active:hover, .open >
+.navbar .navbar-nav > li > a.btn.dropdown-toggle, .open >
+.navbar .navbar-nav > li > a.btn.dropdown-toggle:focus, .open >
+.navbar .navbar-nav > li > a.btn.dropdown-toggle:hover,
+.navbar .navbar-nav > li > a.btn.btn-default,
+.navbar .navbar-nav > li > a.btn.btn-default:hover,
+.navbar .navbar-nav > li > a.btn.btn-default:focus,
+.navbar .navbar-nav > li > a.btn.btn-default:active,
+.navbar .navbar-nav > li > a.btn.btn-default.active,
+.navbar .navbar-nav > li > a.btn.btn-default:active:focus,
+.navbar .navbar-nav > li > a.btn.btn-default:active:hover,
+.navbar .navbar-nav > li > a.btn.btn-default.active:focus,
+.navbar .navbar-nav > li > a.btn.btn-default.active:hover, .open >
+.navbar .navbar-nav > li > a.btn.btn-default.dropdown-toggle, .open >
+.navbar .navbar-nav > li > a.btn.btn-default.dropdown-toggle:focus, .open >
+.navbar .navbar-nav > li > a.btn.btn-default.dropdown-toggle:hover {
+    background-color: #999999;
+    color: #FFFFFF;
+}
+.btn:focus, .btn:active, .btn:hover, .btn.btn-default:focus, .btn.btn-default:active, .btn.btn-default:hover,
+.navbar .navbar-nav > li > a.btn:focus,
+.navbar .navbar-nav > li > a.btn:active,
+.navbar .navbar-nav > li > a.btn:hover,
+.navbar .navbar-nav > li > a.btn.btn-default:focus,
+.navbar .navbar-nav > li > a.btn.btn-default:active,
+.navbar .navbar-nav > li > a.btn.btn-default:hover {
+    box-shadow: 0 14px 26px -12px rgba(153, 153, 153, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(153, 153, 153, 0.2);
+}
+.btn.disabled, .btn.disabled:hover, .btn.disabled:focus, .btn.disabled.focus, .btn.disabled:active, .btn.disabled.active, .btn:disabled, .btn:disabled:hover, .btn:disabled:focus, .btn:disabled.focus, .btn:disabled:active, .btn:disabled.active, .btn[disabled], .btn[disabled]:hover, .btn[disabled]:focus, .btn[disabled].focus, .btn[disabled]:active, .btn[disabled].active, fieldset[disabled] .btn, fieldset[disabled] .btn:hover, fieldset[disabled] .btn:focus, fieldset[disabled] .btn.focus, fieldset[disabled] .btn:active, fieldset[disabled] .btn.active, .btn.btn-default.disabled, .btn.btn-default.disabled:hover, .btn.btn-default.disabled:focus, .btn.btn-default.disabled.focus, .btn.btn-default.disabled:active, .btn.btn-default.disabled.active, .btn.btn-default:disabled, .btn.btn-default:disabled:hover, .btn.btn-default:disabled:focus, .btn.btn-default:disabled.focus, .btn.btn-default:disabled:active, .btn.btn-default:disabled.active, .btn.btn-default[disabled], .btn.btn-default[disabled]:
 hover, .btn.btn-default[disabled]:focus, .btn.btn-default[disabled].focus, .btn.btn-default[disabled]:active, .btn.btn-default[disabled].active, fieldset[disabled] .btn.btn-default, fieldset[disabled] .btn.btn-default:hover, fieldset[disabled] .btn.btn-default:focus, fieldset[disabled] .btn.btn-default.focus, fieldset[disabled] .btn.btn-default:active, fieldset[disabled] .btn.btn-default.active,
+.navbar .navbar-nav > li > a.btn.disabled,
+.navbar .navbar-nav > li > a.btn.disabled:hover,
+.navbar .navbar-nav > li > a.btn.disabled:focus,
+.navbar .navbar-nav > li > a.btn.disabled.focus,
+.navbar .navbar-nav > li > a.btn.disabled:active,
+.navbar .navbar-nav > li > a.btn.disabled.active,
+.navbar .navbar-nav > li > a.btn:disabled,
+.navbar .navbar-nav > li > a.btn:disabled:hover,
+.navbar .navbar-nav > li > a.btn:disabled:focus,
+.navbar .navbar-nav > li > a.btn:disabled.focus,
+.navbar .navbar-nav > li > a.btn:disabled:active,
+.navbar .navbar-nav > li > a.btn:disabled.active,
+.navbar .navbar-nav > li > a.btn[disabled],
+.navbar .navbar-nav > li > a.btn[disabled]:hover,
+.navbar .navbar-nav > li > a.btn[disabled]:focus,
+.navbar .navbar-nav > li > a.btn[disabled].focus,
+.navbar .navbar-nav > li > a.btn[disabled]:active,
+.navbar .navbar-nav > li > a.btn[disabled].active, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn:hover, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn:focus, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.focus, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn:active, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.active,
+.navbar .navbar-nav > li > a.btn.btn-default.disabled,
+.navbar .navbar-nav > li > a.btn.btn-default.disabled:hover,
+.navbar .navbar-nav > li > a.btn.btn-default.disabled:focus,
+.navbar .navbar-nav > li > a.btn.btn-default.disabled.focus,
+.navbar .navbar-nav > li > a.btn.btn-default.disabled:active,
+.navbar .navbar-nav > li > a.btn.btn-default.disabled.active,
+.navbar .navbar-nav > li > a.btn.btn-default:disabled,
+.navbar .navbar-nav > li > a.btn.btn-default:disabled:hover,
+.navbar .navbar-nav > li > a.btn.btn-default:disabled:focus,
+.navbar .navbar-nav > li > a.btn.btn-default:disabled.focus,
+.navbar .navbar-nav > li > a.btn.btn-default:disabled:active,
+.navbar .navbar-nav > li > a.btn.btn-default:disabled.active,
+.navbar .navbar-nav > li > a.btn.btn-default[disabled],
+.navbar .navbar-nav > li > a.btn.btn-default[disabled]:hover,
+.navbar .navbar-nav > li > a.btn.btn-default[disabled]:focus,
+.navbar .navbar-nav > li > a.btn.btn-default[disabled].focus,
+.navbar .navbar-nav > li > a.btn.btn-default[disabled]:active,
+.navbar .navbar-nav > li > a.btn.btn-default[disabled].active, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-default, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-default:hover, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-default:focus, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-default.focus, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-default:active, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-default.active {
+    box-shadow: none;
+}
+.btn.btn-simple, .btn.btn-default.btn-simple,
+.navbar .navbar-nav > li > a.btn.btn-simple,
+.navbar .navbar-nav > li > a.btn.btn-default.btn-simple {
+    background-color: transparent;
+    color: #999999;
+    box-shadow: none;
+}
+.btn.btn-simple:hover, .btn.btn-simple:focus, .btn.btn-simple:active, .btn.btn-default.btn-simple:hover, .btn.btn-default.btn-simple:focus, .btn.btn-default.btn-simple:active,
+.navbar .navbar-nav > li > a.btn.btn-simple:hover,
+.navbar .navbar-nav > li > a.btn.btn-simple:focus,
+.navbar .navbar-nav > li > a.btn.btn-simple:active,
+.navbar .navbar-nav > li > a.btn.btn-default.btn-simple:hover,
+.navbar .navbar-nav > li > a.btn.btn-default.btn-simple:focus,
+.navbar .navbar-nav > li > a.btn.btn-default.btn-simple:active {
+    background-color: transparent;
+    color: #999999;
+}
+.btn.btn-primary,
+.navbar .navbar-nav > li > a.btn.btn-primary {
+    box-shadow: 0 2px 2px 0 rgba(156, 39, 176, 0.14), 0 3px 1px -2px rgba(156, 39, 176, 0.2), 0 1px 5px 0 rgba(156, 39, 176, 0.12);
+}
+.btn.btn-primary, .btn.btn-primary:hover, .btn.btn-primary:focus, .btn.btn-primary:active, .btn.btn-primary.active, .btn.btn-primary:active:focus, .btn.btn-primary:active:hover, .btn.btn-primary.active:focus, .btn.btn-primary.active:hover, .open > .btn.btn-primary.dropdown-toggle, .open > .btn.btn-primary.dropdown-toggle:focus, .open > .btn.btn-primary.dropdown-toggle:hover,
+.navbar .navbar-nav > li > a.btn.btn-primary,
+.navbar .navbar-nav > li > a.btn.btn-primary:hover,
+.navbar .navbar-nav > li > a.btn.btn-primary:focus,
+.navbar .navbar-nav > li > a.btn.btn-primary:active,
+.navbar .navbar-nav > li > a.btn.btn-primary.active,
+.navbar .navbar-nav > li > a.btn.btn-primary:active:focus,
+.navbar .navbar-nav > li > a.btn.btn-primary:active:hover,
+.navbar .navbar-nav > li > a.btn.btn-primary.active:focus,
+.navbar .navbar-nav > li > a.btn.btn-primary.active:hover, .open >
+.navbar .navbar-nav > li > a.btn.btn-primary.dropdown-toggle, .open >
+.navbar .navbar-nav > li > a.btn.btn-primary.dropdown-toggle:focus, .open >
+.navbar .navbar-nav > li > a.btn.btn-primary.dropdown-toggle:hover {
+    background-color: #9c27b0;
+    color: #FFFFFF;
+}
+.btn.btn-primary:focus, .btn.btn-primary:active, .btn.btn-primary:hover,
+.navbar .navbar-nav > li > a.btn.btn-primary:focus,
+.navbar .navbar-nav > li > a.btn.btn-primary:active,
+.navbar .navbar-nav > li > a.btn.btn-primary:hover {
+    box-shadow: 0 14px 26px -12px rgba(156, 39, 176, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(156, 39, 176, 0.2);
+}
+.btn.btn-primary.disabled, .btn.btn-primary.disabled:hover, .btn.btn-primary.disabled:focus, .btn.btn-primary.disabled.focus, .btn.btn-primary.disabled:active, .btn.btn-primary.disabled.active, .btn.btn-primary:disabled, .btn.btn-primary:disabled:hover, .btn.btn-primary:disabled:focus, .btn.btn-primary:disabled.focus, .btn.btn-primary:disabled:active, .btn.btn-primary:disabled.active, .btn.btn-primary[disabled], .btn.btn-primary[disabled]:hover, .btn.btn-primary[disabled]:focus, .btn.btn-primary[disabled].focus, .btn.btn-primary[disabled]:active, .btn.btn-primary[disabled].active, fieldset[disabled] .btn.btn-primary, fieldset[disabled] .btn.btn-primary:hover, fieldset[disabled] .btn.btn-primary:focus, fieldset[disabled] .btn.btn-primary.focus, fieldset[disabled] .btn.btn-primary:active, fieldset[disabled] .btn.btn-primary.active,
+.navbar .navbar-nav > li > a.btn.btn-primary.disabled,
+.navbar .navbar-nav > li > a.btn.btn-primary.disabled:hover,
+.navbar .navbar-nav > li > a.btn.btn-primary.disabled:focus,
+.navbar .navbar-nav > li > a.btn.btn-primary.disabled.focus,
+.navbar .navbar-nav > li > a.btn.btn-primary.disabled:active,
+.navbar .navbar-nav > li > a.btn.btn-primary.disabled.active,
+.navbar .navbar-nav > li > a.btn.btn-primary:disabled,
+.navbar .navbar-nav > li > a.btn.btn-primary:disabled:hover,
+.navbar .navbar-nav > li > a.btn.btn-primary:disabled:focus,
+.navbar .navbar-nav > li > a.btn.btn-primary:disabled.focus,
+.navbar .navbar-nav > li > a.btn.btn-primary:disabled:active,
+.navbar .navbar-nav > li > a.btn.btn-primary:disabled.active,
+.navbar .navbar-nav > li > a.btn.btn-primary[disabled],
+.navbar .navbar-nav > li > a.btn.btn-primary[disabled]:hover,
+.navbar .navbar-nav > li > a.btn.btn-primary[disabled]:focus,
+.navbar .navbar-nav > li > a.btn.btn-primary[disabled].focus,
+.navbar .navbar-nav > li > a.btn.btn-primary[disabled]:active,
+.navbar .navbar-nav > li > a.btn.btn-primary[disabled].active, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-primary, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-primary:hover, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-primary:focus, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-primary.focus, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-primary:active, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-primary.active {
+    box-shadow: none;
+}
+.btn.btn-primary.btn-simple,
+.navbar .navbar-nav > li > a.btn.btn-primary.btn-simple {
+    background-color: transparent;
+    color: #9c27b0;
+    box-shadow: none;
+}
+.btn.btn-primary.btn-simple:hover, .btn.btn-primary.btn-simple:focus, .btn.btn-primary.btn-simple:active,
+.navbar .navbar-nav > li > a.btn.btn-primary.btn-simple:hover,
+.navbar .navbar-nav > li > a.btn.btn-primary.btn-simple:focus,
+.navbar .navbar-nav > li > a.btn.btn-primary.btn-simple:active {
+    background-color: transparent;
+    color: #9c27b0;
+}
+.btn.btn-info,
+.navbar .navbar-nav > li > a.btn.btn-info {
+    box-shadow: 0 2px 2px 0 rgba(0, 188, 212, 0.14), 0 3px 1px -2px rgba(0, 188, 212, 0.2), 0 1px 5px 0 rgba(0, 188, 212, 0.12);
+}
+.btn.btn-info, .btn.btn-info:hover, .btn.btn-info:focus, .btn.btn-info:active, .btn.btn-info.active, .btn.btn-info:active:focus, .btn.btn-info:active:hover, .btn.btn-info.active:focus, .btn.btn-info.active:hover, .open > .btn.btn-info.dropdown-toggle, .open > .btn.btn-info.dropdown-toggle:focus, .open > .btn.btn-info.dropdown-toggle:hover,
+.navbar .navbar-nav > li > a.btn.btn-info,
+.navbar .navbar-nav > li > a.btn.btn-info:hover,
+.navbar .navbar-nav > li > a.btn.btn-info:focus,
+.navbar .navbar-nav > li > a.btn.btn-info:active,
+.navbar .navbar-nav > li > a.btn.btn-info.active,
+.navbar .navbar-nav > li > a.btn.btn-info:active:focus,
+.navbar .navbar-nav > li > a.btn.btn-info:active:hover,
+.navbar .navbar-nav > li > a.btn.btn-info.active:focus,
+.navbar .navbar-nav > li > a.btn.btn-info.active:hover, .open >
+.navbar .navbar-nav > li > a.btn.btn-info.dropdown-toggle, .open >
+.navbar .navbar-nav > li > a.btn.btn-info.dropdown-toggle:focus, .open >
+.navbar .navbar-nav > li > a.btn.btn-info.dropdown-toggle:hover {
+    background-color: #00bcd4;
+    color: #FFFFFF;
+}
+.btn.btn-info:focus, .btn.btn-info:active, .btn.btn-info:hover,
+.navbar .navbar-nav > li > a.btn.btn-info:focus,
+.navbar .navbar-nav > li > a.btn.btn-info:active,
+.navbar .navbar-nav > li > a.btn.btn-info:hover {
+    box-shadow: 0 14px 26px -12px rgba(0, 188, 212, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 188, 212, 0.2);
+}
+.btn.btn-info.disabled, .btn.btn-info.disabled:hover, .btn.btn-info.disabled:focus, .btn.btn-info.disabled.focus, .btn.btn-info.disabled:active, .btn.btn-info.disabled.active, .btn.btn-info:disabled, .btn.btn-info:disabled:hover, .btn.btn-info:disabled:focus, .btn.btn-info:disabled.focus, .btn.btn-info:disabled:active, .btn.btn-info:disabled.active, .btn.btn-info[disabled], .btn.btn-info[disabled]:hover, .btn.btn-info[disabled]:focus, .btn.btn-info[disabled].focus, .btn.btn-info[disabled]:active, .btn.btn-info[disabled].active, fieldset[disabled] .btn.btn-info, fieldset[disabled] .btn.btn-info:hover, fieldset[disabled] .btn.btn-info:focus, fieldset[disabled] .btn.btn-info.focus, fieldset[disabled] .btn.btn-info:active, fieldset[disabled] .btn.btn-info.active,
+.navbar .navbar-nav > li > a.btn.btn-info.disabled,
+.navbar .navbar-nav > li > a.btn.btn-info.disabled:hover,
+.navbar .navbar-nav > li > a.btn.btn-info.disabled:focus,
+.navbar .navbar-nav > li > a.btn.btn-info.disabled.focus,
+.navbar .navbar-nav > li > a.btn.btn-info.disabled:active,
+.navbar .navbar-nav > li > a.btn.btn-info.disabled.active,
+.navbar .navbar-nav > li > a.btn.btn-info:disabled,
+.navbar .navbar-nav > li > a.btn.btn-info:disabled:hover,
+.navbar .navbar-nav > li > a.btn.btn-info:disabled:focus,
+.navbar .navbar-nav > li > a.btn.btn-info:disabled.focus,
+.navbar .navbar-nav > li > a.btn.btn-info:disabled:active,
+.navbar .navbar-nav > li > a.btn.btn-info:disabled.active,
+.navbar .navbar-nav > li > a.btn.btn-info[disabled],
+.navbar .navbar-nav > li > a.btn.btn-info[disabled]:hover,
+.navbar .navbar-nav > li > a.btn.btn-info[disabled]:focus,
+.navbar .navbar-nav > li > a.btn.btn-info[disabled].focus,
+.navbar .navbar-nav > li > a.btn.btn-info[disabled]:active,
+.navbar .navbar-nav > li > a.btn.btn-info[disabled].active, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-info, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-info:hover, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-info:focus, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-info.focus, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-info:active, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-info.active {
+    box-shadow: none;
+}
+.btn.btn-info.btn-simple,
+.navbar .navbar-nav > li > a.btn.btn-info.btn-simple {
+    background-color: transparent;
+    color: #00bcd4;
+    box-shadow: none;
+}
+.btn.btn-info.btn-simple:hover, .btn.btn-info.btn-simple:focus, .btn.btn-info.btn-simple:active,
+.navbar .navbar-nav > li > a.btn.btn-info.btn-simple:hover,
+.navbar .navbar-nav > li > a.btn.btn-info.btn-simple:focus,
+.navbar .navbar-nav > li > a.btn.btn-info.btn-simple:active {
+    background-color: transparent;
+    color: #00bcd4;
+}
+.btn.btn-success,
+.navbar .navbar-nav > li > a.btn.btn-success {
+    box-shadow: 0 2px 2px 0 rgba(76, 175, 80, 0.14), 0 3px 1px -2px rgba(76, 175, 80, 0.2), 0 1px 5px 0 rgba(76, 175, 80, 0.12);
+}
+.btn.btn-success, .btn.btn-success:hover, .btn.btn-success:focus, .btn.btn-success:active, .btn.btn-success.active, .btn.btn-success:active:focus, .btn.btn-success:active:hover, .btn.btn-success.active:focus, .btn.btn-success.active:hover, .open > .btn.btn-success.dropdown-toggle, .open > .btn.btn-success.dropdown-toggle:focus, .open > .btn.btn-success.dropdown-toggle:hover,
+.navbar .navbar-nav > li > a.btn.btn-success,
+.navbar .navbar-nav > li > a.btn.btn-success:hover,
+.navbar .navbar-nav > li > a.btn.btn-success:focus,
+.navbar .navbar-nav > li > a.btn.btn-success:active,
+.navbar .navbar-nav > li > a.btn.btn-success.active,
+.navbar .navbar-nav > li > a.btn.btn-success:active:focus,
+.navbar .navbar-nav > li > a.btn.btn-success:active:hover,
+.navbar .navbar-nav > li > a.btn.btn-success.active:focus,
+.navbar .navbar-nav > li > a.btn.btn-success.active:hover, .open >
+.navbar .navbar-nav > li > a.btn.btn-success.dropdown-toggle, .open >
+.navbar .navbar-nav > li > a.btn.btn-success.dropdown-toggle:focus, .open >
+.navbar .navbar-nav > li > a.btn.btn-success.dropdown-toggle:hover {
+    background-color: #4caf50;
+    color: #FFFFFF;
+}
+.btn.btn-success:focus, .btn.btn-success:active, .btn.btn-success:hover,
+.navbar .navbar-nav > li > a.btn.btn-success:focus,
+.navbar .navbar-nav > li > a.btn.btn-success:active,
+.navbar .navbar-nav > li > a.btn.btn-success:hover {
+    box-shadow: 0 14px 26px -12px rgba(76, 175, 80, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(76, 175, 80, 0.2);
+}
+.btn.btn-success.disabled, .btn.btn-success.disabled:hover, .btn.btn-success.disabled:focus, .btn.btn-success.disabled.focus, .btn.btn-success.disabled:active, .btn.btn-success.disabled.active, .btn.btn-success:disabled, .btn.btn-success:disabled:hover, .btn.btn-success:disabled:focus, .btn.btn-success:disabled.focus, .btn.btn-success:disabled:active, .btn.btn-success:disabled.active, .btn.btn-success[disabled], .btn.btn-success[disabled]:hover, .btn.btn-success[disabled]:focus, .btn.btn-success[disabled].focus, .btn.btn-success[disabled]:active, .btn.btn-success[disabled].active, fieldset[disabled] .btn.btn-success, fieldset[disabled] .btn.btn-success:hover, fieldset[disabled] .btn.btn-success:focus, fieldset[disabled] .btn.btn-success.focus, fieldset[disabled] .btn.btn-success:active, fieldset[disabled] .btn.btn-success.active,
+.navbar .navbar-nav > li > a.btn.btn-success.disabled,
+.navbar .navbar-nav > li > a.btn.btn-success.disabled:hover,
+.navbar .navbar-nav > li > a.btn.btn-success.disabled:focus,
+.navbar .navbar-nav > li > a.btn.btn-success.disabled.focus,
+.navbar .navbar-nav > li > a.btn.btn-success.disabled:active,
+.navbar .navbar-nav > li > a.btn.btn-success.disabled.active,
+.navbar .navbar-nav > li > a.btn.btn-success:disabled,
+.navbar .navbar-nav > li > a.btn.btn-success:disabled:hover,
+.navbar .navbar-nav > li > a.btn.btn-success:disabled:focus,
+.navbar .navbar-nav > li > a.btn.btn-success:disabled.focus,
+.navbar .navbar-nav > li > a.btn.btn-success:disabled:active,
+.navbar .navbar-nav > li > a.btn.btn-success:disabled.active,
+.navbar .navbar-nav > li > a.btn.btn-success[disabled],
+.navbar .navbar-nav > li > a.btn.btn-success[disabled]:hover,
+.navbar .navbar-nav > li > a.btn.btn-success[disabled]:focus,
+.navbar .navbar-nav > li > a.btn.btn-success[disabled].focus,
+.navbar .navbar-nav > li > a.btn.btn-success[disabled]:active,
+.navbar .navbar-nav > li > a.btn.btn-success[disabled].active, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-success, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-success:hover, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-success:focus, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-success.focus, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-success:active, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-success.active {
+    box-shadow: none;
+}
+.btn.btn-success.btn-simple,
+.navbar .navbar-nav > li > a.btn.btn-success.btn-simple {
+    background-color: transparent;
+    color: #4caf50;
+    box-shadow: none;
+}
+.btn.btn-success.btn-simple:hover, .btn.btn-success.btn-simple:focus, .btn.btn-success.btn-simple:active,
+.navbar .navbar-nav > li > a.btn.btn-success.btn-simple:hover,
+.navbar .navbar-nav > li > a.btn.btn-success.btn-simple:focus,
+.navbar .navbar-nav > li > a.btn.btn-success.btn-simple:active {
+    background-color: transparent;
+    color: #4caf50;
+}
+.btn.btn-warning,
+.navbar .navbar-nav > li > a.btn.btn-warning {
+    box-shadow: 0 2px 2px 0 rgba(255, 152, 0, 0.14), 0 3px 1px -2px rgba(255, 152, 0, 0.2), 0 1px 5px 0 rgba(255, 152, 0, 0.12);
+}
+.btn.btn-warning, .btn.btn-warning:hover, .btn.btn-warning:focus, .btn.btn-warning:active, .btn.btn-warning.active, .btn.btn-warning:active:focus, .btn.btn-warning:active:hover, .btn.btn-warning.active:focus, .btn.btn-warning.active:hover, .open > .btn.btn-warning.dropdown-toggle, .open > .btn.btn-warning.dropdown-toggle:focus, .open > .btn.btn-warning.dropdown-toggle:hover,
+.navbar .navbar-nav > li > a.btn.btn-warning,
+.navbar .navbar-nav > li > a.btn.btn-warning:hover,
+.navbar .navbar-nav > li > a.btn.btn-warning:focus,
+.navbar .navbar-nav > li > a.btn.btn-warning:active,
+.navbar .navbar-nav > li > a.btn.btn-warning.active,
+.navbar .navbar-nav > li > a.btn.btn-warning:active:focus,
+.navbar .navbar-nav > li > a.btn.btn-warning:active:hover,
+.navbar .navbar-nav > li > a.btn.btn-warning.active:focus,
+.navbar .navbar-nav > li > a.btn.btn-warning.active:hover, .open >
+.navbar .navbar-nav > li > a.btn.btn-warning.dropdown-toggle, .open >
+.navbar .navbar-nav > li > a.btn.btn-warning.dropdown-toggle:focus, .open >
+.navbar .navbar-nav > li > a.btn.btn-warning.dropdown-toggle:hover {
+    background-color: #ff9800;
+    color: #FFFFFF;
+}
+.btn.btn-warning:focus, .btn.btn-warning:active, .btn.btn-warning:hover,
+.navbar .navbar-nav > li > a.btn.btn-warning:focus,
+.navbar .navbar-nav > li > a.btn.btn-warning:active,
+.navbar .navbar-nav > li > a.btn.btn-warning:hover {
+    box-shadow: 0 14px 26px -12px rgba(255, 152, 0, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(255, 152, 0, 0.2);
+}
+.btn.btn-warning.disabled, .btn.btn-warning.disabled:hover, .btn.btn-warning.disabled:focus, .btn.btn-warning.disabled.focus, .btn.btn-warning.disabled:active, .btn.btn-warning.disabled.active, .btn.btn-warning:disabled, .btn.btn-warning:disabled:hover, .btn.btn-warning:disabled:focus, .btn.btn-warning:disabled.focus, .btn.btn-warning:disabled:active, .btn.btn-warning:disabled.active, .btn.btn-warning[disabled], .btn.btn-warning[disabled]:hover, .btn.btn-warning[disabled]:focus, .btn.btn-warning[disabled].focus, .btn.btn-warning[disabled]:active, .btn.btn-warning[disabled].active, fieldset[disabled] .btn.btn-warning, fieldset[disabled] .btn.btn-warning:hover, fieldset[disabled] .btn.btn-warning:focus, fieldset[disabled] .btn.btn-warning.focus, fieldset[disabled] .btn.btn-warning:active, fieldset[disabled] .btn.btn-warning.active,
+.navbar .navbar-nav > li > a.btn.btn-warning.disabled,
+.navbar .navbar-nav > li > a.btn.btn-warning.disabled:hover,
+.navbar .navbar-nav > li > a.btn.btn-warning.disabled:focus,
+.navbar .navbar-nav > li > a.btn.btn-warning.disabled.focus,
+.navbar .navbar-nav > li > a.btn.btn-warning.disabled:active,
+.navbar .navbar-nav > li > a.btn.btn-warning.disabled.active,
+.navbar .navbar-nav > li > a.btn.btn-warning:disabled,
+.navbar .navbar-nav > li > a.btn.btn-warning:disabled:hover,
+.navbar .navbar-nav > li > a.btn.btn-warning:disabled:focus,
+.navbar .navbar-nav > li > a.btn.btn-warning:disabled.focus,
+.navbar .navbar-nav > li > a.btn.btn-warning:disabled:active,
+.navbar .navbar-nav > li > a.btn.btn-warning:disabled.active,
+.navbar .navbar-nav > li > a.btn.btn-warning[disabled],
+.navbar .navbar-nav > li > a.btn.btn-warning[disabled]:hover,
+.navbar .navbar-nav > li > a.btn.btn-warning[disabled]:focus,
+.navbar .navbar-nav > li > a.btn.btn-warning[disabled].focus,
+.navbar .navbar-nav > li > a.btn.btn-warning[disabled]:active,
+.navbar .navbar-nav > li > a.btn.btn-warning[disabled].active, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-warning, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-warning:hover, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-warning:focus, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-warning.focus, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-warning:active, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-warning.active {
+    box-shadow: none;
+}
+.btn.btn-warning.btn-simple,
+.navbar .navbar-nav > li > a.btn.btn-warning.btn-simple {
+    background-color: transparent;
+    color: #ff9800;
+    box-shadow: none;
+}
+.btn.btn-warning.btn-simple:hover, .btn.btn-warning.btn-simple:focus, .btn.btn-warning.btn-simple:active,
+.navbar .navbar-nav > li > a.btn.btn-warning.btn-simple:hover,
+.navbar .navbar-nav > li > a.btn.btn-warning.btn-simple:focus,
+.navbar .navbar-nav > li > a.btn.btn-warning.btn-simple:active {
+    background-color: transparent;
+    color: #ff9800;
+}
+.btn.btn-danger,
+.navbar .navbar-nav > li > a.btn.btn-danger {
+    box-shadow: 0 2px 2px 0 rgba(244, 67, 54, 0.14), 0 3px 1px -2px rgba(244, 67, 54, 0.2), 0 1px 5px 0 rgba(244, 67, 54, 0.12);
+}
+.btn.btn-danger, .btn.btn-danger:hover, .btn.btn-danger:focus, .btn.btn-danger:active, .btn.btn-danger.active, .btn.btn-danger:active:focus, .btn.btn-danger:active:hover, .btn.btn-danger.active:focus, .btn.btn-danger.active:hover, .open > .btn.btn-danger.dropdown-toggle, .open > .btn.btn-danger.dropdown-toggle:focus, .open > .btn.btn-danger.dropdown-toggle:hover,
+.navbar .navbar-nav > li > a.btn.btn-danger,
+.navbar .navbar-nav > li > a.btn.btn-danger:hover,
+.navbar .navbar-nav > li > a.btn.btn-danger:focus,
+.navbar .navbar-nav > li > a.btn.btn-danger:active,
+.navbar .navbar-nav > li > a.btn.btn-danger.active,
+.navbar .navbar-nav > li > a.btn.btn-danger:active:focus,
+.navbar .navbar-nav > li > a.btn.btn-danger:active:hover,
+.navbar .navbar-nav > li > a.btn.btn-danger.active:focus,
+.navbar .navbar-nav > li > a.btn.btn-danger.active:hover, .open >
+.navbar .navbar-nav > li > a.btn.btn-danger.dropdown-toggle, .open >
+.navbar .navbar-nav > li > a.btn.btn-danger.dropdown-toggle:focus, .open >
+.navbar .navbar-nav > li > a.btn.btn-danger.dropdown-toggle:hover {
+    background-color: #f44336;
+    color: #FFFFFF;
+}
+.btn.btn-danger:focus, .btn.btn-danger:active, .btn.btn-danger:hover,
+.navbar .navbar-nav > li > a.btn.btn-danger:focus,
+.navbar .navbar-nav > li > a.btn.btn-danger:active,
+.navbar .navbar-nav > li > a.btn.btn-danger:hover {
+    box-shadow: 0 14px 26px -12px rgba(244, 67, 54, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(244, 67, 54, 0.2);
+}
+.btn.btn-danger.disabled, .btn.btn-danger.disabled:hover, .btn.btn-danger.disabled:focus, .btn.btn-danger.disabled.focus, .btn.btn-danger.disabled:active, .btn.btn-danger.disabled.active, .btn.btn-danger:disabled, .btn.btn-danger:disabled:hover, .btn.btn-danger:disabled:focus, .btn.btn-danger:disabled.focus, .btn.btn-danger:disabled:active, .btn.btn-danger:disabled.active, .btn.btn-danger[disabled], .btn.btn-danger[disabled]:hover, .btn.btn-danger[disabled]:focus, .btn.btn-danger[disabled].focus, .btn.btn-danger[disabled]:active, .btn.btn-danger[disabled].active, fieldset[disabled] .btn.btn-danger, fieldset[disabled] .btn.btn-danger:hover, fieldset[disabled] .btn.btn-danger:focus, fieldset[disabled] .btn.btn-danger.focus, fieldset[disabled] .btn.btn-danger:active, fieldset[disabled] .btn.btn-danger.active,
+.navbar .navbar-nav > li > a.btn.btn-danger.disabled,
+.navbar .navbar-nav > li > a.btn.btn-danger.disabled:hover,
+.navbar .navbar-nav > li > a.btn.btn-danger.disabled:focus,
+.navbar .navbar-nav > li > a.btn.btn-danger.disabled.focus,
+.navbar .navbar-nav > li > a.btn.btn-danger.disabled:active,
+.navbar .navbar-nav > li > a.btn.btn-danger.disabled.active,
+.navbar .navbar-nav > li > a.btn.btn-danger:disabled,
+.navbar .navbar-nav > li > a.btn.btn-danger:disabled:hover,
+.navbar .navbar-nav > li > a.btn.btn-danger:disabled:focus,
+.navbar .navbar-nav > li > a.btn.btn-danger:disabled.focus,
+.navbar .navbar-nav > li > a.btn.btn-danger:disabled:active,
+.navbar .navbar-nav > li > a.btn.btn-danger:disabled.active,
+.navbar .navbar-nav > li > a.btn.btn-danger[disabled],
+.navbar .navbar-nav > li > a.btn.btn-danger[disabled]:hover,
+.navbar .navbar-nav > li > a.btn.btn-danger[disabled]:focus,
+.navbar .navbar-nav > li > a.btn.btn-danger[disabled].focus,
+.navbar .navbar-nav > li > a.btn.btn-danger[disabled]:active,
+.navbar .navbar-nav > li > a.btn.btn-danger[disabled].active, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-danger, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-danger:hover, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-danger:focus, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-danger.focus, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-danger:active, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-danger.active {
+    box-shadow: none;
+}
+.btn.btn-danger.btn-simple,
+.navbar .navbar-nav > li > a.btn.btn-danger.btn-simple {
+    background-color: transparent;
+    color: #f44336;
+    box-shadow: none;
+}
+.btn.btn-danger.btn-simple:hover, .btn.btn-danger.btn-simple:focus, .btn.btn-danger.btn-simple:active,
+.navbar .navbar-nav > li > a.btn.btn-danger.btn-simple:hover,
+.navbar .navbar-nav > li > a.btn.btn-danger.btn-simple:focus,
+.navbar .navbar-nav > li > a.btn.btn-danger.btn-simple:active {
+    background-color: transparent;
+    color: #f44336;
+}
+.btn.btn-white, .btn.btn-white:focus, .btn.btn-white:hover,
+.navbar .navbar-nav > li > a.btn.btn-white,
+.navbar .navbar-nav > li > a.btn.btn-white:focus,
+.navbar .navbar-nav > li > a.btn.btn-white:hover {
+    background-color: #FFFFFF;
+    color: #999999;
+}
+.btn.btn-white.btn-simple,
+.navbar .navbar-nav > li > a.btn.btn-white.btn-simple {
+    color: #FFFFFF;
+    background: transparent;
+    box-shadow: none;
+}
+.btn.btn-facebook,
+.navbar .navbar-nav > li > a.btn.btn-facebook {
+    background-color: #3b5998;
+    color: #fff;
+    box-shadow: 0 2px 2px 0 rgba(59, 89, 152, 0.14), 0 3px 1px -2px rgba(59, 89, 152, 0.2), 0 1px 5px 0 rgba(59, 89, 152, 0.12);
+}
+.btn.btn-facebook:focus, .btn.btn-facebook:active, .btn.btn-facebook:hover,
+.navbar .navbar-nav > li > a.btn.btn-facebook:focus,
+.navbar .navbar-nav > li > a.btn.btn-facebook:active,
+.navbar .navbar-nav > li > a.btn.btn-facebook:hover {
+    background-color: #3b5998;
+    color: #fff;
+    box-shadow: 0 14px 26px -12px rgba(59, 89, 152, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(59, 89, 152, 0.2);
+}
+.btn.btn-facebook.btn-simple,
+.navbar .navbar-nav > li > a.btn.btn-facebook.btn-simple {
+    color: #3b5998;
+    background-color: transparent;
+    box-shadow: none;
+}
+.btn.btn-twitter,
+.navbar .navbar-nav > li > a.btn.btn-twitter {
+    background-color: #55acee;
+    color: #fff;
+    box-shadow: 0 2px 2px 0 rgba(85, 172, 238, 0.14), 0 3px 1px -2px rgba(85, 172, 238, 0.2), 0 1px 5px 0 rgba(85, 172, 238, 0.12);
+}
+.btn.btn-twitter:focus, .btn.btn-twitter:active, .btn.btn-twitter:hover,
+.navbar .navbar-nav > li > a.btn.btn-twitter:focus,
+.navbar .navbar-nav > li > a.btn.btn-twitter:active,
+.navbar .navbar-nav > li > a.btn.btn-twitter:hover {
+    background-color: #55acee;
+    color: #fff;
+    box-shadow: 0 14px 26px -12px rgba(85, 172, 238, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(85, 172, 238, 0.2);
+}
+.btn.btn-twitter.btn-simple,
+.navbar .navbar-nav > li > a.btn.btn-twitter.btn-simple {
+    color: #55acee;
+    background-color: transparent;
+    box-shadow: none;
+}
+.btn.btn-pinterest,
+.navbar .navbar-nav > li > a.btn.btn-pinterest {
+    background-color: #cc2127;
+    color: #fff;
+    box-shadow: 0 2px 2px 0 rgba(204, 33, 39, 0.14), 0 3px 1px -2px rgba(204, 33, 39, 0.2), 0 1px 5px 0 rgba(204, 33, 39, 0.12);
+}
+.btn.btn-pinterest:focus, .btn.btn-pinterest:active, .btn.btn-pinterest:hover,
+.navbar .navbar-nav > li > a.btn.btn-pinterest:focus,
+.navbar .navbar-nav > li > a.btn.btn-pinterest:active,
+.navbar .navbar-nav > li > a.btn.btn-pinterest:hover {
+    background-color: #cc2127;
+    color: #fff;
+    box-shadow: 0 14px 26px -12px rgba(204, 33, 39, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(204, 33, 39, 0.2);
+}
+.btn.btn-pinterest.btn-simple,
+.navbar .navbar-nav > li > a.btn.btn-pinterest.btn-simple {
+    color: #cc2127;
+    background-color: transparent;
+    box-shadow: none;
+}
+.btn.btn-google,
+.navbar .navbar-nav > li > a.btn.btn-google {
+    background-color: #dd4b39;
+    color: #fff;
+    box-shadow: 0 2px 2px 0 rgba(221, 75, 57, 0.14), 0 3px 1px -2px rgba(221, 75, 57, 0.2), 0 1px 5px 0 rgba(221, 75, 57, 0.12);
+}
+.btn.btn-google:focus, .btn.btn-google:active, .btn.btn-google:hover,
+.navbar .navbar-nav > li > a.btn.btn-google:focus,
+.navbar .navbar-nav > li > a.btn.btn-google:active,
+.navbar .navbar-nav > li > a.btn.btn-google:hover {
+    background-color: #dd4b39;
+    color: #fff;
+    box-shadow: 0 14px 26px -12px rgba(221, 75, 57, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(221, 75, 57, 0.2);
+}
+.btn.btn-google.btn-simple,
+.navbar .navbar-nav > li > a.btn.btn-google.btn-simple {
+    color: #dd4b39;
+    background-color: transparent;
+    box-shadow: none;
+}
+.btn.btn-instagram,
+.navbar .navbar-nav > li > a.btn.btn-instagram {
+    background-color: #125688;
+    color: #fff;
+    box-shadow: 0 2px 2px 0 rgba(18, 86, 136, 0.14), 0 3px 1px -2px rgba(18, 86, 136, 0.2), 0 1px 5px 0 rgba(18, 86, 136, 0.12);
+}
+.btn.btn-instagram:focus, .btn.btn-instagram:active, .btn.btn-instagram:hover,
+.navbar .navbar-nav > li > a.btn.btn-instagram:focus,
+.navbar .navbar-nav > li > a.btn.btn-instagram:active,
+.navbar .navbar-nav > li > a.btn.btn-instagram:hover {
+    background-color: #125688;
+    color: #fff;
+    box-shadow: 0 14px 26px -12px rgba(18, 86, 136, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(18, 86, 136, 0.2);
+}
+.btn.btn-instagram.btn-simple,
+.navbar .navbar-nav > li > a.btn.btn-instagram.btn-simple {
+    color: #125688;
+    background-color: transparent;
+    box-shadow: none;
+}
+.btn:focus, .btn:active, .btn:active:focus,
+.navbar .navbar-nav > li > a.btn:focus,
+.navbar .navbar-nav > li > a.btn:active,
+.navbar .navbar-nav > li > a.btn:active:focus {
+    outline: 0;
+}
+.btn.btn-round,
+.navbar .navbar-nav > li > a.btn.btn-round {
+    border-radius: 30px;
+}
+.btn:not(.btn-just-icon):not(.btn-fab) .fa,
+.navbar .navbar-nav > li > a.btn:not(.btn-just-icon):not(.btn-fab) .fa {
+    font-size: 18px;
+    margin-top: -2px;
+    position: relative;
+    top: 2px;
+}
+.btn.btn-fab,
+.navbar .navbar-nav > li > a.btn.btn-fab {
+    border-radius: 50%;
+    font-size: 24px;
+    height: 56px;
+    margin: auto;
+    min-width: 56px;
+    width: 56px;
+    padding: 0;
+    overflow: hidden;
+    position: relative;
+    line-height: normal;
+}
+.btn.btn-fab .ripple-container,
+.navbar .navbar-nav > li > a.btn.btn-fab .ripple-container {
+    border-radius: 50%;
+}
+.btn.btn-fab.btn-fab-mini, .btn-group-sm .btn.btn-fab,
+.navbar .navbar-nav > li > a.btn.btn-fab.btn-fab-mini, .btn-group-sm
+.navbar .navbar-nav > li > a.btn.btn-fab {
+    height: 40px;
+    min-width: 40px;
+    width: 40px;
+}
+.btn.btn-fab.btn-fab-mini.material-icons, .btn-group-sm .btn.btn-fab.material-icons,
+.navbar .navbar-nav > li > a.btn.btn-fab.btn-fab-mini.material-icons, .btn-group-sm
+.navbar .navbar-nav > li > a.btn.btn-fab.material-icons {
+    top: -3.5px;
+    left: -3.5px;
+}
+.btn.btn-fab.btn-fab-mini .material-icons, .btn-group-sm .btn.btn-fab .material-icons,
+.navbar .navbar-nav > li > a.btn.btn-fab.btn-fab-mini .material-icons, .btn-group-sm
+.navbar .navbar-nav > li > a.btn.btn-fab .material-icons {
+    font-size: 17px;
+}
+.btn.btn-fab i.material-icons,
+.navbar .navbar-nav > li > a.btn.btn-fab i.material-icons {
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-12px, -12px);
+    line-height: 24px;
+    width: 24px;
+    font-size: 24px;
+}
+.btn.btn-lg, .btn-group-lg .btn,
+.navbar .navbar-nav > li > a.btn.btn-lg, .btn-group-lg
+.navbar .navbar-nav > li > a.btn {
+    font-size: 14px;
+    padding: 18px 36px;
+}
+.btn.btn-sm, .btn-group-sm .btn,
+.navbar .navbar-nav > li > a.btn.btn-sm, .btn-group-sm
+.navbar .navbar-nav > li > a.btn {
+    padding: 5px 20px;
+    font-size: 11px;
+}
+.btn.btn-xs, .btn-group-xs .btn,
+.navbar .navbar-nav > li > a.btn.btn-xs, .btn-group-xs
+.navbar .navbar-nav > li > a.btn {
+    padding: 4px 15px;
+    font-size: 10px;
+}
+.btn.btn-just-icon,
+.navbar .navbar-nav > li > a.btn.btn-just-icon {
+    font-size: 20px;
+    padding: 12px 12px;
+    line-height: 1em;
+}
+.btn.btn-just-icon i,
+.navbar .navbar-nav > li > a.btn.btn-just-icon i {
+    width: 20px;
+}
+.btn.btn-just-icon.btn-lg,
+.navbar .navbar-nav > li > a.btn.btn-just-icon.btn-lg {
+    font-size: 22px;
+    padding: 13px 18px;
+}
+
+.btn .material-icons {
+    vertical-align: middle;
+    font-size: 17px;
+    top: -1px;
+    position: relative;
+}
+
+.navbar .navbar-nav > li > a.btn {
+    margin-top: 2px;
+    margin-bottom: 2px;
+}
+.navbar .navbar-nav > li > a.btn.btn-fab {
+    margin: 5px 2px;
+}
+.navbar .navbar-nav > li > a:not(.btn) .material-icons {
+    margin-top: -3px;
+    top: 0px;
+    position: relative;
+    margin-right: 3px;
+}
+.navbar .navbar-nav > li > .profile-photo {
+    margin: 5px 2px;
+}
+
+.navbar-default:not(.navbar-transparent) .navbar-nav > li > a.btn.btn-white.btn-simple {
+    color: #555555;
+}
+
+.btn-group,
+.btn-group-vertical {
+    position: relative;
+    margin: 10px 1px;
+}
+.btn-group.open > .dropdown-toggle.btn, .btn-group.open > .dropdown-toggle.btn.btn-default,
+.btn-group-vertical.open > .dropdown-toggle.btn,
+.btn-group-vertical.open > .dropdown-toggle.btn.btn-default {
+    background-color: #FFFFFF;
+}
+.btn-group.open > .dropdown-toggle.btn.btn-inverse,
+.btn-group-vertical.open > .dropdown-toggle.btn.btn-inverse {
+    background-color: #212121;
+}
+.btn-group.open > .dropdown-toggle.btn.btn-primary,
+.btn-group-vertical.open > .dropdown-toggle.btn.btn-primary {
+    background-color: #9c27b0;
+}
+.btn-group.open > .dropdown-toggle.btn.btn-success,
+.btn-group-vertical.open > .dropdown-toggle.btn.btn-success {
+    background-color: #4caf50;
+}
+.btn-group.open > .dropdown-toggle.btn.btn-info,
+.btn-group-vertical.open > .dropdown-toggle.btn.btn-info {
+    background-color: #00bcd4;
+}
+.btn-group.open > .dropdown-toggle.btn.btn-warning,
+.btn-group-vertical.open > .dropdown-toggle.btn.btn-warning {
+    background-color: #ff9800;
+}
+.btn-group.open > .dropdown-toggle.btn.btn-danger,
+.btn-group-vertical.open > .dropdown-toggle.btn.btn-danger {
+    background-color: #f44336;
+}
+.btn-group.open > .dropdown-toggle.btn.btn-rose,
+.btn-group-vertical.open > .dropdown-toggle.btn.btn-rose {
+    background-color: #e91e63;
+}
+.btn-group .dropdown-menu,
+.btn-group-vertical .dropdown-menu {
+    border-radius: 0 0 3px 3px;
+}
+.btn-group.btn-group-raised,
+.btn-group-vertical.btn-group-raised {
+    box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
+}
+.btn-group .btn + .btn,
+.btn-group .btn,
+.btn-group .btn:active,
+.btn-group .btn-group,
+.btn-group-vertical .btn + .btn,
+.btn-group-vertical .btn,
+.btn-group-vertical .btn:active,
+.btn-group-vertical .btn-group {
+    margin: 0;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/style/img/alipay.png
----------------------------------------------------------------------
diff --git a/rocketmq-console/src/main/resources/static/style/img/alipay.png b/rocketmq-console/src/main/resources/static/style/img/alipay.png
new file mode 100644
index 0000000..8d72f26
Binary files /dev/null and b/rocketmq-console/src/main/resources/static/style/img/alipay.png differ