You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@inlong.apache.org by do...@apache.org on 2021/06/30 02:56:28 UTC

[incubator-inlong] branch INLONG-613 updated: [INLONG-640] Adjust the main frame of the InLong project

This is an automated email from the ASF dual-hosted git repository.

dockerzhang pushed a commit to branch INLONG-613
in repository https://gitbox.apache.org/repos/asf/incubator-inlong.git


The following commit(s) were added to refs/heads/INLONG-613 by this push:
     new 02d753b  [INLONG-640] Adjust the main frame of the InLong project
02d753b is described below

commit 02d753b27b9755d7b46970a0d4a70fc4bb34ab63
Author: gosonzhang <go...@tencent.com>
AuthorDate: Wed Jun 30 10:43:07 2021 +0800

    [INLONG-640] Adjust the main frame of the InLong project
---
 .asf.yaml                                          |     6 +-
 .gitignore                                         |    46 +-
 .gitmodules                                        |     4 +-
 .travis.yml                                        |     2 +-
 CHANGES.md                                         |   642 +-
 DISCLAIMER-WIP                                     |     4 +-
 LICENSE                                            |    44 +-
 NOTICE                                             |     2 +-
 README.md                                          |    34 +-
 bin/broker.cmd                                     |    28 -
 bin/env.cmd                                        |    31 -
 bin/env.sh                                         |    66 -
 bin/groupAdmin.sh                                  |    43 -
 bin/indexReBuilder.sh                              |    56 -
 bin/master.cmd                                     |    28 -
 bin/tubemq-broker-admin.sh                         |    40 -
 bin/tubemq-consumer-test.sh                        |    40 -
 bin/tubemq-producer-test.sh                        |    40 -
 bin/tubemq.sh                                      |   178 -
 codestyle/checkstyle.xml                           |   717 +-
 codestyle/suppressions.xml                         |    30 +-
 conf/broker.ini                                    |    59 -
 conf/log4j.properties                              |    46 -
 conf/master.ini                                    |    92 -
 conf/master.log4j.properties                       |    25 -
 conf/tools.log4j.properties                        |    24 -
 pom.xml                                            |   651 +-
 .../css/dataTables.bootstrap.css                   |   214 -
 .../css/dataTables.bootstrap.min.css               |     1 -
 .../css/dataTables.foundation.css                  |   136 -
 .../css/dataTables.foundation.min.css              |     1 -
 .../DataTables-1.10.11/css/dataTables.jqueryui.css |   572 -
 .../css/dataTables.jqueryui.min.css                |     1 -
 .../DataTables-1.10.11/css/jquery.dataTables.css   |   539 -
 .../css/jquery.dataTables.min.css                  |     1 -
 .../css/jquery.dataTables_themeroller.css          |   494 -
 .../DataTables-1.10.11/images/sort_asc.png         |   Bin 160 -> 0 bytes
 .../images/sort_asc_disabled.png                   |   Bin 148 -> 0 bytes
 .../DataTables-1.10.11/images/sort_both.png        |   Bin 201 -> 0 bytes
 .../DataTables-1.10.11/images/sort_desc.png        |   Bin 158 -> 0 bytes
 .../images/sort_desc_disabled.png                  |   Bin 146 -> 0 bytes
 .../DataTables-1.10.11/js/dataTables.bootstrap.js  |   179 -
 .../js/dataTables.bootstrap.min.js                 |     8 -
 .../DataTables-1.10.11/js/dataTables.foundation.js |   171 -
 .../js/dataTables.foundation.min.js                |     8 -
 .../DataTables-1.10.11/js/dataTables.jqueryui.js   |   158 -
 .../js/dataTables.jqueryui.min.js                  |     9 -
 .../DataTables-1.10.11/js/jquery.dataTables.js     | 14545 -----------
 .../DataTables-1.10.11/js/jquery.dataTables.min.js |   166 -
 resources/assets/lib/DataTables/datatables.css     |   430 -
 resources/assets/lib/DataTables/datatables.js      | 25730 -------------------
 resources/assets/lib/DataTables/datatables.min.css |    15 -
 resources/assets/lib/DataTables/datatables.min.js  |   187 -
 .../lib/DataTables/jQuery-1.12.0/jquery-1.12.0.js  | 11170 --------
 .../DataTables/jQuery-1.12.0/jquery-1.12.0.min.js  |     5 -
 resources/assets/lib/jquery.min.js                 |     6 -
 resources/assets/public/css/fonts/icon.svg         |    44 -
 resources/assets/public/css/ie.css                 |     7 -
 resources/assets/public/css/ie.css.map             |     9 -
 resources/assets/public/css/style.css              |  1431 --
 resources/assets/public/css/style.css.map          |    17 -
 resources/assets/public/img/base-s2db5071204.png   |   Bin 2355 -> 0 bytes
 resources/assets/public/img/base.png               |   Bin 2355 -> 0 bytes
 resources/assets/public/img/logo.png               |   Bin 2665 -> 0 bytes
 resources/assets/scripts/brokerDetail.js           |   355 -
 resources/assets/scripts/brokerList.js             |   356 -
 resources/assets/scripts/clusters.js               |    80 -
 resources/assets/scripts/common/helper.js          |   316 -
 resources/assets/scripts/common/module.js          |  1367 -
 resources/assets/scripts/subscribe.js              |   117 -
 resources/assets/scripts/subscribeDetail.js        |   130 -
 resources/assets/scripts/topicDetail.js            |   471 -
 resources/assets/scripts/topicList.js              |   250 -
 resources/templates/control/slidebar.vm            |    42 -
 resources/templates/layout/default.vm              |    51 -
 resources/templates/layout/master.vm               |    17 -
 resources/templates/layout/tubeweb.vm              |    51 -
 resources/templates/layout/webapi.vm               |    17 -
 resources/templates/macro.vm                       |    85 -
 .../templates/screen/cluster/clusterManage.vm      |    82 -
 resources/templates/screen/config/brokerDetail.vm  |   198 -
 resources/templates/screen/config/brokerList.vm    |   124 -
 resources/templates/screen/config/topicDetail.vm   |   137 -
 resources/templates/screen/config/topicList.vm     |    81 -
 .../templates/screen/consume/consumeGroupList.vm   |    77 -
 resources/templates/screen/consume/detail.vm       |    71 -
 resources/templates/screen/index.vm                |    17 -
 resources/templates/screen/master.vm               |    17 -
 resources/templates/screen/tubeweb.vm              |    77 -
 resources/templates/screen/webapi.vm               |    17 -
 resources/velocity.properties                      |   221 -
 .../tubemq-client-cpp/.clang-format                |    25 -
 .../tubemq-client-cpp/CMakeLists.txt               |    44 -
 tubemq-client-twins/tubemq-client-cpp/README.md    |    41 -
 .../tubemq-client-cpp/build_linux.sh               |    26 -
 .../tubemq-client-cpp/conf/client.conf             |    27 -
 .../tubemq-client-cpp/example/CMakeLists.txt       |    33 -
 .../tubemq-client-cpp/example/README.md            |    22 -
 .../example/consumer/CMakeLists.txt                |    22 -
 .../example/consumer/test_consumer.cc              |   147 -
 .../example/consumer/test_multithread_pull.cc      |   178 -
 .../include/tubemq/tubemq_atomic.h                 |    96 -
 .../include/tubemq/tubemq_client.h                 |    69 -
 .../include/tubemq/tubemq_config.h                 |   205 -
 .../include/tubemq/tubemq_errcode.h                |   117 -
 .../include/tubemq/tubemq_message.h                |    78 -
 .../include/tubemq/tubemq_return.h                 |   113 -
 .../tubemq-client-cpp/proto/BrokerService.proto    |   136 -
 .../tubemq-client-cpp/proto/CMakeLists.txt         |    26 -
 .../tubemq-client-cpp/proto/MasterService.proto    |   192 -
 .../tubemq-client-cpp/proto/RPC.proto              |    62 -
 .../tubemq-client-cpp/proto/readme.md              |    20 -
 .../tubemq-client-cpp/release/release_linux.sh     |    59 -
 .../tubemq-client-cpp/src/CMakeLists.txt           |    29 -
 tubemq-client-twins/tubemq-client-cpp/src/any.h    |   141 -
 .../tubemq-client-cpp/src/baseconsumer.cc          |  1514 --
 .../tubemq-client-cpp/src/baseconsumer.h           |   142 -
 tubemq-client-twins/tubemq-client-cpp/src/buffer.h |   339 -
 .../tubemq-client-cpp/src/client_connection.cc     |   298 -
 .../tubemq-client-cpp/src/client_connection.h      |   101 -
 .../tubemq-client-cpp/src/client_service.cc        |   310 -
 .../tubemq-client-cpp/src/client_service.h         |   125 -
 .../tubemq-client-cpp/src/client_subinfo.cc        |   133 -
 .../tubemq-client-cpp/src/client_subinfo.h         |    79 -
 .../tubemq-client-cpp/src/codec_protocol.h         |    58 -
 .../tubemq-client-cpp/src/connection.cc            |    25 -
 .../tubemq-client-cpp/src/connection.h             |   120 -
 .../tubemq-client-cpp/src/connection_pool.h        |   133 -
 .../tubemq-client-cpp/src/const_config.h           |   134 -
 .../tubemq-client-cpp/src/const_rpc.h              |    91 -
 .../tubemq-client-cpp/src/executor_pool.cc         |    86 -
 .../tubemq-client-cpp/src/executor_pool.h          |    95 -
 .../tubemq-client-cpp/src/file_ini.cc              |   154 -
 .../tubemq-client-cpp/src/file_ini.h               |    51 -
 .../tubemq-client-cpp/src/flowctrl_def.cc          |   785 -
 .../tubemq-client-cpp/src/flowctrl_def.h           |   144 -
 tubemq-client-twins/tubemq-client-cpp/src/future.h |   143 -
 .../tubemq-client-cpp/src/logger.cc                |    80 -
 tubemq-client-twins/tubemq-client-cpp/src/logger.h |   118 -
 .../tubemq-client-cpp/src/meta_info.cc             |   580 -
 .../tubemq-client-cpp/src/meta_info.h              |   188 -
 .../tubemq-client-cpp/src/noncopyable.h            |    37 -
 .../tubemq-client-cpp/src/rmt_data_cache.cc        |   661 -
 .../tubemq-client-cpp/src/rmt_data_cache.h         |   166 -
 .../tubemq-client-cpp/src/singleton.h              |    62 -
 .../tubemq-client-cpp/src/thread_pool.h            |    69 -
 .../tubemq-client-cpp/src/transport.h              |    60 -
 .../tubemq-client-cpp/src/tubemq_client.cc         |   176 -
 .../tubemq-client-cpp/src/tubemq_codec.h           |   296 -
 .../tubemq-client-cpp/src/tubemq_config.cc         |   706 -
 .../tubemq-client-cpp/src/tubemq_message.cc        |   229 -
 .../tubemq-client-cpp/src/tubemq_return.cc         |   180 -
 .../tubemq-client-cpp/src/tubemq_transport.h       |    58 -
 .../tubemq-client-cpp/src/unique_seq_id.h          |    41 -
 tubemq-client-twins/tubemq-client-cpp/src/utils.cc |   523 -
 tubemq-client-twins/tubemq-client-cpp/src/utils.h  |    71 -
 .../tubemq-client-cpp/src/version.h                |    33 -
 .../tubemq-client-cpp/tests/CMakeLists.txt         |    34 -
 .../tubemq-client-cpp/tests/README.md              |    22 -
 .../tests/executor_pool/CMakeLists.txt             |    21 -
 .../tubemq-client-cpp/tests/executor_pool/main.cc  |    58 -
 .../tubemq-client-cpp/tests/log/CMakeLists.txt     |    21 -
 .../tubemq-client-cpp/tests/log/main.cc            |    62 -
 .../tests/thread_pool/CMakeLists.txt               |    21 -
 .../tubemq-client-cpp/tests/thread_pool/main.cc    |    36 -
 .../tubemq-client-cpp/third_party/CMakeLists.txt   |    43 -
 .../tubemq-client-cpp/third_party/README.md        |    23 -
 .../tubemq-client-python/.appveyor.yml             |    44 -
 tubemq-client-twins/tubemq-client-python/README.md |    60 -
 .../tubemq-client-python/__init__.py               |    18 -
 .../tubemq-client-python/conda.recipe/meta.yaml    |    53 -
 .../tubemq-client-python/requirements.txt          |    20 -
 tubemq-client-twins/tubemq-client-python/setup.py  |    81 -
 .../tubemq-client-python/src/cpp/tubemq_client.cc  |    40 -
 .../tubemq-client-python/src/cpp/tubemq_config.cc  |    49 -
 .../tubemq-client-python/src/cpp/tubemq_errcode.cc |    58 -
 .../tubemq-client-python/src/cpp/tubemq_message.cc |    52 -
 .../tubemq-client-python/src/cpp/tubemq_return.cc  |    46 -
 .../src/python/example/test_consumer.py            |    53 -
 .../src/python/tubemq/__init__.py                  |    20 -
 .../src/python/tubemq/client.conf                  |    26 -
 .../src/python/tubemq/client.py                    |    91 -
 tubemq-client/pom.xml                              |   158 -
 tubemq-client/src/main/assembly/assembly.xml       |    46 -
 .../org/apache/tubemq/client/common/PeerInfo.java  |    69 -
 .../tubemq/client/common/TClientConstants.java     |    40 -
 .../tubemq/client/config/ConsumerConfig.java       |   276 -
 .../tubemq/client/config/TubeClientConfig.java     |   593 -
 .../client/config/TubeClientConfigUtils.java       |    59 -
 .../client/consumer/BaseMessageConsumer.java       |  1769 --
 .../tubemq/client/consumer/ClientSubInfo.java      |   171 -
 .../tubemq/client/consumer/ConsumeOffsetInfo.java  |    84 -
 .../tubemq/client/consumer/ConsumePosition.java    |    49 -
 .../tubemq/client/consumer/ConsumerResult.java     |   106 -
 .../client/consumer/ConsumerSamplePrint.java       |    74 -
 .../tubemq/client/consumer/FetchContext.java       |   108 -
 .../tubemq/client/consumer/MessageConsumer.java    |    84 -
 .../client/consumer/MessageFetchManager.java       |   227 -
 .../tubemq/client/consumer/MessageListener.java    |    34 -
 .../tubemq/client/consumer/MessageV2Listener.java  |    34 -
 .../tubemq/client/consumer/PartitionExt.java       |   308 -
 .../client/consumer/PartitionSelectResult.java     |    82 -
 .../client/consumer/PullMessageConsumer.java       |    42 -
 .../client/consumer/PushMessageConsumer.java       |    35 -
 .../tubemq/client/consumer/RmtDataCache.java       |   926 -
 .../client/consumer/SimplePullMessageConsumer.java |   244 -
 .../client/consumer/SimplePushMessageConsumer.java |   303 -
 .../tubemq/client/consumer/TopicProcessor.java     |    55 -
 .../client/exception/TubeClientException.java      |    45 -
 .../tubemq/client/factory/InnerSessionFactory.java |    32 -
 .../client/factory/MessageSessionFactory.java      |    43 -
 .../client/factory/TubeBaseSessionFactory.java     |   199 -
 .../client/factory/TubeMultiSessionFactory.java    |    88 -
 .../client/factory/TubeSingleSessionFactory.java   |   109 -
 .../tubemq/client/producer/AllowedSetting.java     |    61 -
 .../tubemq/client/producer/MessageProducer.java    |    44 -
 .../client/producer/MessageSentCallback.java       |    27 -
 .../tubemq/client/producer/MessageSentResult.java  |    88 -
 .../tubemq/client/producer/PartitionRouter.java    |    29 -
 .../tubemq/client/producer/ProducerManager.java    |   738 -
 .../client/producer/RoundRobinPartitionRouter.java |    62 -
 .../client/producer/SimpleMessageProducer.java     |   417 -
 .../producer/qltystats/BrokerRcvQltyStats.java     |    40 -
 .../producer/qltystats/BrokerStatsDltTuple.java    |    56 -
 .../producer/qltystats/BrokerStatsItemSet.java     |   109 -
 .../qltystats/DefaultBrokerRcvQltyStats.java       |   466 -
 tubemq-client/src/saveClientVersion.cmd            |    34 -
 tubemq-client/src/saveClientVersion.sh             |    38 -
 .../client/consumer/MessageFetchManagerTest.java   |    57 -
 .../tubemq/client/consumer/PartitionExtTest.java   |    80 -
 .../tubemq/client/consumer/RmtDataCacheTest.java   |    76 -
 .../client/factory/TubeBaseSessionFactoryTest.java |    79 -
 .../factory/TubeMultiSessionFactoryTest.java       |    48 -
 .../factory/TubeSingleSessionFactoryTest.java      |    46 -
 .../producer/RoundRobinPartitionRouterTest.java    |    53 -
 .../qltystats/DefaultBrokerRcvQltyStatsTest.java   |    71 -
 tubemq-client/src/test/resources/log4j.properties  |    23 -
 tubemq-connectors/pom.xml                          |    77 -
 tubemq-connectors/tubemq-connector-flink/pom.xml   |   105 -
 .../org/apache/flink/connectors/tubemq/Tubemq.java |   163 -
 .../flink/connectors/tubemq/TubemqOptions.java     |    62 -
 .../connectors/tubemq/TubemqSinkFunction.java      |   181 -
 .../connectors/tubemq/TubemqSourceFunction.java    |   356 -
 .../flink/connectors/tubemq/TubemqTableSink.java   |   139 -
 .../flink/connectors/tubemq/TubemqTableSource.java |   226 -
 .../tubemq/TubemqTableSourceSinkFactory.java       |   251 -
 .../flink/connectors/tubemq/TubemqValidator.java   |    78 -
 .../org.apache.flink.table.factories.TableFactory  |    16 -
 .../apache/flink/connectors/tubemq/TubemqTest.java |   102 -
 .../src/test/resources/log4j.properties            |    23 -
 tubemq-connectors/tubemq-connector-flume/README.md |    21 -
 tubemq-connectors/tubemq-connector-flume/pom.xml   |    63 -
 .../apache/flume/sink/tubemq/ConfigOptions.java    |    65 -
 .../org/apache/flume/sink/tubemq/EventStat.java    |    63 -
 .../apache/flume/sink/tubemq/TubeSinkCounter.java  |    54 -
 .../org/apache/flume/sink/tubemq/TubemqSink.java   |   424 -
 .../apache/flume/sink/tubemq/TestTubemqSink.java   |   110 -
 .../src/test/resources/log4j.properties            |    23 -
 tubemq-connectors/tubemq-connector-spark/pom.xml   |    72 -
 .../tubemq/connector/spark/ConsumerConf.scala      |   159 -
 .../connector/spark/JavaTubeMQProvider.scala       |    53 -
 .../tubemq/connector/spark/ProducerConf.scala      |    76 -
 .../tubemq/connector/spark/TubeMQConsumer.scala    |   112 -
 .../tubemq/connector/spark/TubeMQFunctions.scala   |   115 -
 .../tubemq/connector/spark/TubeMQProducer.scala    |   119 -
 .../tubemq/connector/spark/TubeMQProvider.scala    |    79 -
 tubemq-core/pom.xml                                |   133 -
 .../java/org/apache/tubemq/corebase/Message.java   |   364 -
 .../org/apache/tubemq/corebase/MessageExt.java     |    26 -
 .../org/apache/tubemq/corebase/Shutdownable.java   |    23 -
 .../org/apache/tubemq/corebase/TBaseConstants.java |    82 -
 .../apache/tubemq/corebase/TErrCodeConstants.java  |    53 -
 .../org/apache/tubemq/corebase/TokenConstants.java |    42 -
 .../aaaclient/ClientAuthenticateHandler.java       |    28 -
 .../aaaclient/SimpleClientAuthenticateHandler.java |    62 -
 .../tubemq/corebase/balance/ConsumerEvent.java     |    85 -
 .../tubemq/corebase/balance/EventStatus.java       |    69 -
 .../apache/tubemq/corebase/balance/EventType.java  |    76 -
 .../apache/tubemq/corebase/cluster/BrokerInfo.java |   238 -
 .../tubemq/corebase/cluster/ConsumerInfo.java      |   166 -
 .../apache/tubemq/corebase/cluster/MasterInfo.java |   158 -
 .../tubemq/corebase/cluster/NodeAddrInfo.java      |   102 -
 .../apache/tubemq/corebase/cluster/Partition.java  |   236 -
 .../tubemq/corebase/cluster/ProducerInfo.java      |    97 -
 .../tubemq/corebase/cluster/SubscribeInfo.java     |   122 -
 .../apache/tubemq/corebase/cluster/TopicInfo.java  |   161 -
 .../apache/tubemq/corebase/config/TLSConfig.java   |   145 -
 .../corebase/daemon/AbstractDaemonService.java     |    82 -
 .../org/apache/tubemq/corebase/daemon/Service.java |    27 -
 .../corebase/exception/AddressException.java       |    38 -
 .../tubemq/corebase/policies/FlowCtrlItem.java     |   183 -
 .../tubemq/corebase/policies/FlowCtrlResult.java   |    38 -
 .../corebase/policies/FlowCtrlRuleHandler.java     |   651 -
 .../tubemq/corebase/policies/SSDCtrlResult.java    |    35 -
 .../tubemq/corebase/utils/AbstractSamplePrint.java |    54 -
 .../apache/tubemq/corebase/utils/AddressUtils.java |   276 -
 .../org/apache/tubemq/corebase/utils/CheckSum.java |    33 -
 .../tubemq/corebase/utils/ConcurrentHashSet.java   |    79 -
 .../tubemq/corebase/utils/DataConverterUtil.java   |   241 -
 .../tubemq/corebase/utils/MessageFlagUtils.java    |    36 -
 .../apache/tubemq/corebase/utils/MixedUtils.java   |   105 -
 .../org/apache/tubemq/corebase/utils/RegexDef.java |    60 -
 .../tubemq/corebase/utils/ServiceStatusHolder.java |   170 -
 .../tubemq/corebase/utils/SettingValidUtils.java   |    38 -
 .../apache/tubemq/corebase/utils/TStringUtils.java |   199 -
 .../apache/tubemq/corebase/utils/ThreadUtils.java  |   128 -
 .../org/apache/tubemq/corebase/utils/Tuple2.java   |    72 -
 .../org/apache/tubemq/corebase/utils/Tuple3.java   |    60 -
 .../tubemq/corerpc/AbstractServiceInvoker.java     |    96 -
 .../apache/tubemq/corerpc/RemoteConErrStats.java   |    63 -
 .../org/apache/tubemq/corerpc/RequestWrapper.java  |   116 -
 .../org/apache/tubemq/corerpc/ResponseWrapper.java |   175 -
 .../java/org/apache/tubemq/corerpc/RpcConfig.java  |    86 -
 .../org/apache/tubemq/corerpc/RpcConstants.java    |   134 -
 .../org/apache/tubemq/corerpc/RpcDataPack.java     |    53 -
 .../apache/tubemq/corerpc/RpcServiceFactory.java   |   595 -
 .../tubemq/corerpc/RpcServiceFailoverInvoker.java  |   152 -
 .../apache/tubemq/corerpc/RpcServiceInvoker.java   |    83 -
 .../corerpc/benchemark/DefaultSimpleService.java   |    27 -
 .../benchemark/RcpService4BenchmarkClient.java     |    81 -
 .../benchemark/RpcService4BenchmarkServer.java     |    41 -
 .../tubemq/corerpc/benchemark/SimpleService.java   |    24 -
 .../apache/tubemq/corerpc/client/CallFuture.java   |   166 -
 .../org/apache/tubemq/corerpc/client/Callback.java |    40 -
 .../org/apache/tubemq/corerpc/client/Client.java   |    44 -
 .../tubemq/corerpc/client/ClientFactory.java       |    34 -
 .../apache/tubemq/corerpc/codec/PbEnDecoder.java   |   303 -
 .../org/apache/tubemq/corerpc/codec/Protocol.txt   |    19 -
 .../corerpc/exception/ClientClosedException.java   |    36 -
 .../corerpc/exception/LocalConnException.java      |    40 -
 .../tubemq/corerpc/exception/NetworkException.java |    41 -
 .../corerpc/exception/OverflowException.java       |    41 -
 .../tubemq/corerpc/exception/RemoteException.java  |    39 -
 .../corerpc/exception/ServerNotReadyException.java |    29 -
 .../exception/ServiceStoppingException.java        |    32 -
 .../tubemq/corerpc/exception/StandbyException.java |    40 -
 .../exception/UnknownProtocolException.java        |    41 -
 .../corerpc/netty/ByteBufferInputStream.java       |   105 -
 .../corerpc/netty/ByteBufferOutputStream.java      |   118 -
 .../apache/tubemq/corerpc/netty/NettyClient.java   |   428 -
 .../tubemq/corerpc/netty/NettyClientFactory.java   |   319 -
 .../tubemq/corerpc/netty/NettyProtocolDecoder.java |   158 -
 .../tubemq/corerpc/netty/NettyProtocolEncoder.java |    62 -
 .../tubemq/corerpc/netty/NettyRequestContext.java  |   162 -
 .../tubemq/corerpc/netty/NettyRpcServer.java       |   400 -
 .../tubemq/corerpc/netty/ReadTimeoutHandler.java   |   245 -
 .../apache/tubemq/corerpc/protocol/Protocol.java   |    34 -
 .../tubemq/corerpc/protocol/ProtocolFactory.java   |    46 -
 .../tubemq/corerpc/protocol/RpcProtocol.java       |   180 -
 .../tubemq/corerpc/server/RequestContext.java      |    34 -
 .../apache/tubemq/corerpc/server/RpcServer.java    |    27 -
 .../tubemq/corerpc/server/ServiceRpcServer.java    |    33 -
 .../tubemq/corerpc/service/BrokerReadService.java  |    37 -
 .../tubemq/corerpc/service/BrokerWriteService.java |    36 -
 .../tubemq/corerpc/service/MasterService.java      |    52 -
 .../org/apache/tubemq/corerpc/utils/MixUtils.java  |    74 -
 .../tubemq/corerpc/utils/TSSLEngineUtil.java       |    89 -
 tubemq-core/src/main/proto/BrokerService.proto     |   142 -
 tubemq-core/src/main/proto/MasterService.proto     |   432 -
 tubemq-core/src/main/proto/RPC.proto               |    62 -
 .../corebase/policies/TestFlowCtrlRuleHandler.java |    86 -
 .../tubemq/corebase/utils/AddressUtilsTest.java    |    30 -
 .../corebase/utils/ConcurrentHashSetTest.java      |    49 -
 .../corerpc/codec/DataConverterUtilTest.java       |    74 -
 .../tubemq/corerpc/codec/PbEnDecoderTest.java      |    47 -
 .../corerpc/netty/NettyProtocolEncoderTest.java    |    57 -
 .../tubemq/corerpc/utils/TSSLEngineUtilTest.java   |    54 -
 tubemq-core/src/test/resources/log4j.properties    |    23 -
 tubemq-core/src/test/resources/tubeServer.keystore |   Bin 4018 -> 0 bytes
 .../test/resources/tubeServerTrustStore.keystore   |   Bin 969 -> 0 bytes
 tubemq-docker/README.md                            |     8 -
 tubemq-docker/pom.xml                              |    73 -
 tubemq-docker/tubemq-all/Dockerfile                |    38 -
 tubemq-docker/tubemq-all/README.md                 |    15 -
 tubemq-docker/tubemq-all/pom.xml                   |   103 -
 tubemq-docker/tubemq-all/tubemq.sh                 |    55 -
 tubemq-docker/tubemq-build/Dockerfile              |    37 -
 tubemq-docker/tubemq-build/README.md               |    10 -
 tubemq-docker/tubemq-build/pom.xml                 |    72 -
 tubemq-docker/tubemq-build/settings.xml            |   113 -
 tubemq-docker/tubemq-cpp/Dockerfile                |    32 -
 tubemq-docker/tubemq-cpp/README.md                 |    13 -
 tubemq-docker/tubemq-cpp/pom.xml                   |    72 -
 tubemq-docker/tubemq-k8s/.helmignore               |    21 -
 tubemq-docker/tubemq-k8s/Chart.yaml                |    31 -
 tubemq-docker/tubemq-k8s/README.md                 |    50 -
 tubemq-docker/tubemq-k8s/templates/_broker.tpl     |    34 -
 tubemq-docker/tubemq-k8s/templates/_helpers.yaml   |    76 -
 tubemq-docker/tubemq-k8s/templates/_master.tpl     |    34 -
 tubemq-docker/tubemq-k8s/templates/_zookeeper.tpl  |    34 -
 .../tubemq-k8s/templates/broker-configmap.yaml     |    75 -
 .../tubemq-k8s/templates/broker-ini-configmap.yaml |    49 -
 tubemq-docker/tubemq-k8s/templates/broker-pdb.yaml |    35 -
 .../tubemq-k8s/templates/broker-service.yaml       |    39 -
 .../tubemq-k8s/templates/broker-statefulset.yaml   |   159 -
 .../tubemq-k8s/templates/master-configmap.yaml     |    55 -
 .../tubemq-k8s/templates/master-ini-configmap.yaml |    55 -
 tubemq-docker/tubemq-k8s/templates/master-pdb.yaml |    35 -
 .../tubemq-k8s/templates/master-service.yaml       |    42 -
 .../tubemq-k8s/templates/master-statefulset.yaml   |   161 -
 .../tubemq-k8s/templates/zookeeper-configmap.yaml  |    55 -
 .../tubemq-k8s/templates/zookeeper-pdb.yaml        |    35 -
 .../tubemq-k8s/templates/zookeeper-service.yaml    |    41 -
 .../templates/zookeeper-statefulset.yaml           |   143 -
 tubemq-docker/tubemq-k8s/values.yaml               |   158 -
 tubemq-example/pom.xml                             |    70 -
 tubemq-example/src/main/assembly/assembly.xml      |    46 -
 .../tubemq/example/MAMessageProducerExample.java   |   250 -
 .../tubemq/example/MessageConsumerExample.java     |   154 -
 .../tubemq/example/MessageProducerExample.java     |   204 -
 .../tubemq/example/MessagePullConsumerExample.java |   153 -
 .../example/MessagePullSetConsumerExample.java     |   190 -
 .../org/apache/tubemq/example/MsgRecvStats.java    |    84 -
 tubemq-server/pom.xml                              |   240 -
 tubemq-server/src/main/assembly/assembly.xml       |    55 -
 .../main/java/org/apache/tubemq/server/Server.java |    27 -
 .../java/org/apache/tubemq/server/Stoppable.java   |    25 -
 .../apache/tubemq/server/broker/BrokerConfig.java  |   457 -
 .../tubemq/server/broker/BrokerServiceServer.java  |  1267 -
 .../apache/tubemq/server/broker/TubeBroker.java    |   637 -
 .../broker/exception/OffsetStoreException.java     |    47 -
 .../server/broker/exception/StartupException.java  |    46 -
 .../server/broker/metadata/BrokerDefMetadata.java  |   189 -
 .../broker/metadata/BrokerMetadataManager.java     |   349 -
 .../broker/metadata/ClusterConfigHolder.java       |    81 -
 .../server/broker/metadata/MetadataManager.java    |    85 -
 .../server/broker/metadata/TopicMetadata.java      |   482 -
 .../server/broker/msgstore/MessageStore.java       |   751 -
 .../broker/msgstore/MessageStoreManager.java       |   786 -
 .../server/broker/msgstore/StoreService.java       |    44 -
 .../server/broker/msgstore/disk/FileSegment.java   |   479 -
 .../broker/msgstore/disk/FileSegmentList.java      |   302 -
 .../broker/msgstore/disk/GetMessageResult.java     |   184 -
 .../broker/msgstore/disk/MsgFileStatisInfo.java    |   180 -
 .../server/broker/msgstore/disk/MsgFileStore.java  |   592 -
 .../server/broker/msgstore/disk/Segment.java       |    67 -
 .../server/broker/msgstore/disk/SegmentList.java   |    55 -
 .../server/broker/msgstore/disk/SegmentType.java   |    25 -
 .../broker/msgstore/mem/GetCacheMsgResult.java     |    58 -
 .../broker/msgstore/mem/MsgMemStatisInfo.java      |   263 -
 .../server/broker/msgstore/mem/MsgMemStore.java    |   333 -
 .../server/broker/nodeinfo/ConsumerNodeInfo.java   |   262 -
 .../server/broker/offset/DefaultOffsetManager.java |   714 -
 .../tubemq/server/broker/offset/OffsetService.java |    79 -
 .../tubemq/server/broker/stats/CountItem.java      |    55 -
 .../tubemq/server/broker/stats/CountService.java   |    30 -
 .../server/broker/stats/GroupCountService.java     |   147 -
 .../server/broker/utils/BrokerSamplePrint.java     |    83 -
 .../tubemq/server/broker/utils/DataStoreUtils.java |   201 -
 .../server/broker/utils/DiskSamplePrint.java       |   120 -
 .../server/broker/utils/GroupOffsetInfo.java       |    85 -
 .../server/broker/utils/TopicPubStoreInfo.java     |    55 -
 .../server/broker/web/AbstractWebHandler.java      |    92 -
 .../server/broker/web/BrokerAdminServlet.java      |  1210 -
 .../apache/tubemq/server/broker/web/WebServer.java |    57 -
 .../tubemq/server/common/TServerConstants.java     |    50 -
 .../tubemq/server/common/TStatusConstants.java     |    48 -
 .../common/aaaserver/CertificateBrokerHandler.java |    51 -
 .../common/aaaserver/CertificateMasterHandler.java |    39 -
 .../server/common/aaaserver/CertifiedResult.java   |    58 -
 .../aaaserver/SimpleCertificateBrokerHandler.java  |   205 -
 .../aaaserver/SimpleCertificateMasterHandler.java  |   176 -
 .../common/exception/HeartbeatException.java       |    39 -
 .../common/exception/IllegalConfigException.java   |    39 -
 .../tubemq/server/common/fielddef/CliArgDef.java   |   131 -
 .../tubemq/server/common/fielddef/WebFieldDef.java |   276 -
 .../server/common/fielddef/WebFieldType.java       |    64 -
 .../common/fileconfig/AbstractFileConfig.java      |   337 -
 .../common/fileconfig/MasterReplicationConfig.java |   141 -
 .../tubemq/server/common/fileconfig/ZKConfig.java  |   103 -
 .../server/common/heartbeat/HeartbeatManager.java  |   300 -
 .../server/common/heartbeat/TimeoutInfo.java       |    55 -
 .../server/common/heartbeat/TimeoutListener.java   |    23 -
 .../server/common/offsetstorage/OffsetStorage.java |    45 -
 .../common/offsetstorage/OffsetStorageInfo.java    |   157 -
 .../common/offsetstorage/ZkOffsetStorage.java      |   374 -
 .../common/offsetstorage/zookeeper/Abortable.java  |    40 -
 .../zookeeper/RecoverableZooKeeper.java            |   575 -
 .../offsetstorage/zookeeper/RetryCounter.java      |    69 -
 .../zookeeper/RetryCounterFactory.java             |    39 -
 .../common/offsetstorage/zookeeper/ZKUtil.java     |   515 -
 .../zookeeper/ZooKeeperConnectionException.java    |    53 -
 .../offsetstorage/zookeeper/ZooKeeperListener.java |    82 -
 .../offsetstorage/zookeeper/ZooKeeperWatcher.java  |   441 -
 .../server/common/paramcheck/PBParameterUtils.java |   614 -
 .../server/common/paramcheck/ParamCheckResult.java |    59 -
 .../tubemq/server/common/utils/AppendResult.java   |    64 -
 .../apache/tubemq/server/common/utils/Bytes.java   |   275 -
 .../tubemq/server/common/utils/FileUtil.java       |    72 -
 .../tubemq/server/common/utils/HasThread.java      |    94 -
 .../tubemq/server/common/utils/HashedBytes.java    |    62 -
 .../tubemq/server/common/utils/HttpUtils.java      |   112 -
 .../tubemq/server/common/utils/IdWorker.java       |    65 -
 .../tubemq/server/common/utils/ProcessResult.java  |    63 -
 .../apache/tubemq/server/common/utils/RowLock.java |   126 -
 .../apache/tubemq/server/common/utils/Sleeper.java |   113 -
 .../server/common/utils/WebParameterUtils.java     |  1472 --
 .../server/common/utils/WritableComparator.java    |    82 -
 .../server/common/webbase/WebMethodMapper.java     |    84 -
 .../apache/tubemq/server/master/MasterConfig.java  |   625 -
 .../org/apache/tubemq/server/master/TMaster.java   |  2554 --
 .../server/master/balance/DefaultLoadBalancer.java |   738 -
 .../tubemq/server/master/balance/LoadBalancer.java |    71 -
 .../server/master/bdbstore/BdbStoreService.java    |   113 -
 .../master/bdbstore/DefaultBdbStoreService.java    |  1560 --
 .../server/master/bdbstore/MasterGroupStatus.java  |    72 -
 .../server/master/bdbstore/MasterNodeInfo.java     |    79 -
 .../bdbstore/bdbentitys/BdbBlackGroupEntity.java   |   122 -
 .../bdbstore/bdbentitys/BdbBrokerConfEntity.java   |   491 -
 .../bdbentitys/BdbClusterSettingEntity.java        |   340 -
 .../bdbentitys/BdbConsumeGroupSettingEntity.java   |   151 -
 .../bdbentitys/BdbConsumerGroupEntity.java         |   121 -
 .../bdbentitys/BdbGroupFilterCondEntity.java       |   139 -
 .../bdbentitys/BdbGroupFlowCtrlEntity.java         |   245 -
 .../bdbentitys/BdbTopicAuthControlEntity.java      |   123 -
 .../bdbstore/bdbentitys/BdbTopicConfEntity.java    |   433 -
 .../nodemanage/nodebroker/BrokerConfManager.java   |  2082 --
 .../nodemanage/nodebroker/BrokerInfoHolder.java    |   400 -
 .../nodebroker/BrokerSyncStatusInfo.java           |   825 -
 .../nodemanage/nodebroker/TargetValidResult.java   |    32 -
 .../nodemanage/nodebroker/TopicPSInfoManager.java  |   352 -
 .../nodemanage/nodeconsumer/ConsumerBandInfo.java  |   496 -
 .../nodeconsumer/ConsumerEventManager.java         |   269 -
 .../nodeconsumer/ConsumerInfoHolder.java           |   480 -
 .../nodemanage/nodeconsumer/NodeRebInfo.java       |    99 -
 .../nodemanage/nodeconsumer/RebProcessInfo.java    |    45 -
 .../nodeproducer/ProducerInfoHolder.java           |    61 -
 .../server/master/utils/BdbStoreSamplePrint.java   |    99 -
 .../apache/tubemq/server/master/utils/Chore.java   |   127 -
 .../master/utils/SimpleVisitTokenManager.java      |    86 -
 .../server/master/web/MasterStatusCheckFilter.java |    78 -
 .../tubemq/server/master/web/UserAuthFilter.java   |    49 -
 .../apache/tubemq/server/master/web/WebServer.java |   115 -
 .../server/master/web/action/layout/Default.java   |    29 -
 .../server/master/web/action/screen/Master.java    |   329 -
 .../server/master/web/action/screen/Tubeweb.java   |    48 -
 .../server/master/web/action/screen/Webapi.java    |   133 -
 .../web/action/screen/cluster/ClusterManager.java  |    63 -
 .../web/action/screen/config/BrokerDetail.java     |    36 -
 .../web/action/screen/config/BrokerList.java       |   124 -
 .../web/action/screen/config/TopicDetail.java      |    36 -
 .../master/web/action/screen/config/TopicList.java |    36 -
 .../master/web/action/screen/consume/Detail.java   |    36 -
 .../server/master/web/common/BaseResult.java       |   603 -
 .../master/web/common/BrokerQueryResult.java       |    24 -
 .../master/web/common/ClusterQueryResult.java      |    24 -
 .../server/master/web/common/QueryResult.java      |   105 -
 .../master/web/handler/AbstractWebHandler.java     |    56 -
 .../web/handler/WebAdminFlowRuleHandler.java       |   520 -
 .../web/handler/WebAdminGroupCtrlHandler.java      |  1553 --
 .../web/handler/WebAdminTopicAuthHandler.java      |   410 -
 .../web/handler/WebBrokerDefConfHandler.java       |  1665 --
 .../web/handler/WebBrokerTopicConfHandler.java     |  1548 --
 .../master/web/handler/WebMasterInfoHandler.java   |   329 -
 .../master/web/handler/WebOtherInfoHandler.java    |   335 -
 .../tubemq/server/master/web/model/BrokerVO.java   |   106 -
 .../server/master/web/model/ClusterGroupVO.java    |    73 -
 .../server/master/web/model/ClusterNodeVO.java     |    80 -
 .../tubemq/server/master/web/simplemvc/Action.java |    24 -
 .../server/master/web/simplemvc/Context.java       |    38 -
 .../server/master/web/simplemvc/ControlTool.java   |    49 -
 .../server/master/web/simplemvc/MappedContext.java |    72 -
 .../web/simplemvc/MultipartHttpServletRequest.java |    80 -
 .../master/web/simplemvc/RequestContext.java       |   138 -
 .../master/web/simplemvc/RequestDispatcher.java    |   293 -
 .../master/web/simplemvc/TemplateEngine.java       |    32 -
 .../web/simplemvc/VelocityTemplateEngine.java      |    70 -
 .../server/master/web/simplemvc/WebApiServlet.java |   174 -
 .../server/master/web/simplemvc/WebFilter.java     |    54 -
 .../web/simplemvc/conf/ConfigFileParser.java       |   158 -
 .../master/web/simplemvc/conf/WebConfig.java       |   153 -
 .../exception/InvalidConfigException.java          |    38 -
 .../exception/TemplateNotFoundException.java       |    38 -
 .../apache/tubemq/server/tools/BdbGroupAdmin.java  |   108 -
 .../apache/tubemq/server/tools/BrokerStartup.java  |    48 -
 .../org/apache/tubemq/server/tools/CliUtils.java   |    72 -
 .../apache/tubemq/server/tools/MasterStartup.java  |    49 -
 .../tubemq/server/tools/StoreRepairAdmin.java      |   417 -
 .../tubemq/server/tools/cli/CliAbstractBase.java   |    76 -
 .../tubemq/server/tools/cli/CliBrokerAdmin.java    |   113 -
 .../tubemq/server/tools/cli/CliConsumer.java       |   395 -
 .../tubemq/server/tools/cli/CliProducer.java       |   373 -
 tubemq-server/src/saveServerVersion.cmd            |    33 -
 tubemq-server/src/saveServerVersion.sh             |    36 -
 .../broker/metadata/BrokerMetadataManagerTest.java |    74 -
 .../broker/msgstore/disk/FileSegmentListTest.java  |    86 -
 .../broker/msgstore/disk/FileSegmentTest.java      |    84 -
 .../broker/msgstore/mem/MsgMemStoreTest.java       |    58 -
 .../server/broker/stats/GroupCountServiceTest.java |    39 -
 .../server/broker/utils/DataStoreUtilsTest.java    |    39 -
 .../tubemq/server/common/HeartbeatManagerTest.java |    88 -
 .../tubemq/server/common/PBParameterTest.java      |    69 -
 .../tubemq/server/common/WebParameterTest.java     |    66 -
 .../tubemq/server/master/MasterConfigTest.java     |   107 -
 .../nodebroker/BrokerInfoHolderTest.java           |    46 -
 .../nodebroker/TopicPSInfoManagerTest.java         |    78 -
 .../nodeconsumer/ConsumerEventManagerTest.java     |    56 -
 tubemq-server/src/test/resources/log4j.properties  |    23 -
 tubemq-server/src/test/resources/master-normal.ini |    90 -
 .../resources/master-replication-compatibility.ini |    83 -
 .../test/resources/master-replication-optional.ini |    90 -
 tubemq-server/src/test/resources/master.ini        |    91 -
 602 files changed, 982 insertions(+), 148246 deletions(-)

diff --git a/.asf.yaml b/.asf.yaml
index c75147b..de710ce 100644
--- a/.asf.yaml
+++ b/.asf.yaml
@@ -4,16 +4,16 @@
 # 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
-# <p>
+#
 # http://www.apache.org/licenses/LICENSE-2.0
-# <p>
+#
 # 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.
 
-# This file controls the integration of TubeMQ project with ASF infrastructure. Refer to
+# This file controls the integration of InLong project with ASF infrastructure. Refer to
 # https://cwiki.apache.org/confluence/display/INFRA/.asf.yaml+features+for+git+repositories for
 # details. Be careful when changing the contents of this file since it may affect many developers
 # of the project and make sure to discuss the changes with dev@ before committing.
diff --git a/.gitignore b/.gitignore
index eb1eb2b..f7cd11f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,13 +1,49 @@
-.idea/
-target/
-*.iml
-/.metadata/
+# Common
 *.class
 !.github/
 !.gitignore
 !.gitkeep
 !.travis.yml
+
+# Eclipse
+.classpath
+.project
+.settings/
+.recommenders/
+.factorypath
+/.metadata/
+
+# Intellij
+.idea/
+*.iml
+*.iws
+
+# NetBeans
+nb-configuration.xml
+
+# Mac
+**/.DS_Store
+.java-version
+
+# VisualStudioCode artifacts
+.vscode/
+
+# Maven
+log/
+target/
+dist/
+
+# Python
 venv/
 eggs/
 wheels/
-tubemq-client-twins/tubemq-client-cpp/build/
\ No newline at end of file
+*.pyc
+
+# C/C++
+inlong-tubemq/tubemq-client-twins/tubemq-client-cpp/build/
+
+# Gradle
+.gradle
+
+# Log
+*.log
\ No newline at end of file
diff --git a/.gitmodules b/.gitmodules
index 417049c..9793f02 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,4 +1,4 @@
-[submodule "tubemq-client-twins/tubemq-client-cpp/third_party/rapidjson"]
-	path = tubemq-client-twins/tubemq-client-cpp/third_party/rapidjson
+[submodule "inlong-tubemq/tubemq-client-twins/tubemq-client-cpp/third_party/rapidjson"]
+	path = inlong-tubemq/tubemq-client-twins/tubemq-client-cpp/third_party/rapidjson
 	url = https://github.com/Tencent/rapidjson.git
 	tag = v1.1.0
diff --git a/.travis.yml b/.travis.yml
index 9e4e758..9af1111 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -23,7 +23,7 @@ jdk:
   - openjdk8
 
 before_cache:
-  - rm -rf $HOME/.m2/repository/org/apache/tubemq/
+  - rm -rf $HOME/.m2/repository/org/apache/inlong/
 
 cache:
   directories:
diff --git a/CHANGES.md b/CHANGES.md
index 12d3903..f145f46 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,4 +1,4 @@
-# TubeMQ Changelog
+# InLong Changelog
 
 <!---
 # Licensed to the Apache Software Foundation (ASF) under one
@@ -26,87 +26,87 @@
 ### IMPROVEMENTS:
 | JIRA  | Summary  | Priority |
 | :---- | :------- | :------- |
-| [TUBEMQ-430](https://issues.apache.org/jira/browse/TUBEMQ-430) | Optimizing the implementation of HTTP API for broke  | Major |
-| [TUBEMQ-445](https://issues.apache.org/jira/browse/TUBEMQ-445) | Adjust the status check default sleep interval of pullConsumeReadyChkSliceMs  | Major |
-| [TUBEMQ-448](https://issues.apache.org/jira/browse/TUBEMQ-448) | Add Committer and PPMC operation process  | Major |
-| [TUBEMQ-449](https://issues.apache.org/jira/browse/TUBEMQ-449) | Adjust Example implementation  | Major |
-| [TUBEMQ-452](https://issues.apache.org/jira/browse/TUBEMQ-452) | Optimize rebalance performance | Major |
-| [TUBEMQ-467](https://issues.apache.org/jira/browse/TUBEMQ-467) | Add WEB APIs of Master and Broker | Major |
-| [TUBEMQ-489](https://issues.apache.org/jira/browse/TUBEMQ-489) | Add the maximum message length parameter setting | Major |
-| [TUBEMQ-495](https://issues.apache.org/jira/browse/TUBEMQ-495) | Code implementation adjustment based on SpotBugs check | Major |
-| [TUBEMQ-511](https://issues.apache.org/jira/browse/TUBEMQ-511) | Replace the conditional operator (?:) with mid()  | Major |
-| [TUBEMQ-512](https://issues.apache.org/jira/browse/TUBEMQ-512) | Add package length control based on Topic  | Major |
-| [TUBEMQ-515](https://issues.apache.org/jira/browse/TUBEMQ-515) | Add cluster Topic view web api  | Major |
+| [INLONG-430](https://issues.apache.org/jira/browse/INLONG-430) | Optimizing the implementation of HTTP API for broke  | Major |
+| [INLONG-445](https://issues.apache.org/jira/browse/INLONG-445) | Adjust the status check default sleep interval of pullConsumeReadyChkSliceMs  | Major |
+| [INLONG-448](https://issues.apache.org/jira/browse/INLONG-448) | Add Committer and PPMC operation process  | Major |
+| [INLONG-449](https://issues.apache.org/jira/browse/INLONG-449) | Adjust Example implementation  | Major |
+| [INLONG-452](https://issues.apache.org/jira/browse/INLONG-452) | Optimize rebalance performance | Major |
+| [INLONG-467](https://issues.apache.org/jira/browse/INLONG-467) | Add WEB APIs of Master and Broker | Major |
+| [INLONG-489](https://issues.apache.org/jira/browse/INLONG-489) | Add the maximum message length parameter setting | Major |
+| [INLONG-495](https://issues.apache.org/jira/browse/INLONG-495) | Code implementation adjustment based on SpotBugs check | Major |
+| [INLONG-511](https://issues.apache.org/jira/browse/INLONG-511) | Replace the conditional operator (?:) with mid()  | Major |
+| [INLONG-512](https://issues.apache.org/jira/browse/INLONG-512) | Add package length control based on Topic  | Major |
+| [INLONG-515](https://issues.apache.org/jira/browse/INLONG-515) | Add cluster Topic view web api  | Major |
 
 ### BUG FIXES:
 | JIRA  | Summary  | Priority |
 | :---- | :------- | :------- |
-| [TUBEMQ-437](https://issues.apache.org/jira/browse/TUBEMQ-437) | Fix tubemq table source sink factory instance creating problem | Major |
-| [TUBEMQ-441](https://issues.apache.org/jira/browse/TUBEMQ-441) | An error occurred when using the Tubemq class to create a sink table | Major |
-| [TUBEMQ-442](https://issues.apache.org/jira/browse/TUBEMQ-442) | Modifying the jvm parameters when the broker starts does not take effect  | Major    |
-| [TUBEMQ-443](https://issues.apache.org/jira/browse/TUBEMQ-443) | TubemqSourceFunction class prints too many logs problem | Major |
-| [TUBEMQ-446](https://issues.apache.org/jira/browse/TUBEMQ-446) | Small bugs fix that do not affect the main logics | Major |
-| [TUBEMQ-450](https://issues.apache.org/jira/browse/TUBEMQ-450) | TubeClientException: Generate producer id failed  | Major |
-| [TUBEMQ-453](https://issues.apache.org/jira/browse/TUBEMQ-453) | TubemqSourceFunction class prints too many logs problem | Major |
-| [TUBEMQ-506](https://issues.apache.org/jira/browse/TUBEMQ-506) | cmakelist error | Major |
-| [TUBEMQ-510](https://issues.apache.org/jira/browse/TUBEMQ-510) | Found a bug in MessageProducerExample class | Major |
-| [TUBEMQ-518](https://issues.apache.org/jira/browse/TUBEMQ-518) | fix parameter pass error | Major |
-| [TUBEMQ-526](https://issues.apache.org/jira/browse/TUBEMQ-526) | Adjust the packaging script and version check list, remove the "-WIP" tag | Major |
-| [TUBEMQ-555](https://issues.apache.org/jira/browse/TUBEMQ-555) | short session data can only be written to a specific partition | Major |
-| [TUBEMQ-556](https://issues.apache.org/jira/browse/TUBEMQ-556) | Index value is bigger than the actual number of records | Low |
+| [INLONG-437](https://issues.apache.org/jira/browse/INLONG-437) | Fix tubemq table source sink factory instance creating problem | Major |
+| [INLONG-441](https://issues.apache.org/jira/browse/INLONG-441) | An error occurred when using the Tubemq class to create a sink table | Major |
+| [INLONG-442](https://issues.apache.org/jira/browse/INLONG-442) | Modifying the jvm parameters when the broker starts does not take effect  | Major    |
+| [INLONG-443](https://issues.apache.org/jira/browse/INLONG-443) | TubemqSourceFunction class prints too many logs problem | Major |
+| [INLONG-446](https://issues.apache.org/jira/browse/INLONG-446) | Small bugs fix that do not affect the main logics | Major |
+| [INLONG-450](https://issues.apache.org/jira/browse/INLONG-450) | TubeClientException: Generate producer id failed  | Major |
+| [INLONG-453](https://issues.apache.org/jira/browse/INLONG-453) | TubemqSourceFunction class prints too many logs problem | Major |
+| [INLONG-506](https://issues.apache.org/jira/browse/INLONG-506) | cmakelist error | Major |
+| [INLONG-510](https://issues.apache.org/jira/browse/INLONG-510) | Found a bug in MessageProducerExample class | Major |
+| [INLONG-518](https://issues.apache.org/jira/browse/INLONG-518) | fix parameter pass error | Major |
+| [INLONG-526](https://issues.apache.org/jira/browse/INLONG-526) | Adjust the packaging script and version check list, remove the "-WIP" tag | Major |
+| [INLONG-555](https://issues.apache.org/jira/browse/INLONG-555) | short session data can only be written to a specific partition | Major |
+| [INLONG-556](https://issues.apache.org/jira/browse/INLONG-556) | Index value is bigger than the actual number of records | Low |
 
 
 ### TASK:
 | JIRA | Summary | Priority |
 |:---- |:---- | :--- |
-| [TUBEMQ-505](https://issues.apache.org/jira/browse/TUBEMQ-505) | Remove the "WIP" label of the DISCLAIMER file  | Major |
-| [TUBEMQ-543](https://issues.apache.org/jira/browse/TUBEMQ-543) | Modify the LICENSE statement of multiple files and others  | Major |
-| [TUBEMQ-557](https://issues.apache.org/jira/browse/TUBEMQ-557) | Handle the issues mentioned in the 0.8.0-RC2 review  | Major |
-| [TUBEMQ-562](https://issues.apache.org/jira/browse/TUBEMQ-562) | Update project contents according to the 0.8.0-RC3 review  | Major |
+| [INLONG-505](https://issues.apache.org/jira/browse/INLONG-505) | Remove the "WIP" label of the DISCLAIMER file  | Major |
+| [INLONG-543](https://issues.apache.org/jira/browse/INLONG-543) | Modify the LICENSE statement of multiple files and others  | Major |
+| [INLONG-557](https://issues.apache.org/jira/browse/INLONG-557) | Handle the issues mentioned in the 0.8.0-RC2 review  | Major |
+| [INLONG-562](https://issues.apache.org/jira/browse/INLONG-562) | Update project contents according to the 0.8.0-RC3 review  | Major |
 
 ### SUB-TASK:
 | JIRA  | Summary  | Priority |
 | :---- | :------- | :------- |
-| [TUBEMQ-428](https://issues.apache.org/jira/browse/TUBEMQ-433) | Bumped version to 0.8.0-SNAPSHOT | Major |
-| [TUBEMQ-433](https://issues.apache.org/jira/browse/TUBEMQ-433) | add tubemq perf-consumer/producer scripts | Major |
-| [TUBEMQ-434](https://issues.apache.org/jira/browse/TUBEMQ-434) | Adjust Broker API mapping | Major |
-| [TUBEMQ-435](https://issues.apache.org/jira/browse/TUBEMQ-435) | Create Web field Mapping | Major |
-| [TUBEMQ-436](https://issues.apache.org/jira/browse/TUBEMQ-436) | Adjust Broker's HTTP API implementation | Major |
-| [TUBEMQ-439](https://issues.apache.org/jira/browse/TUBEMQ-439) | Add Cli field Scheme definition | Major |
-| [TUBEMQ-440](https://issues.apache.org/jira/browse/TUBEMQ-440) | Add feature package tube-manager to zip  | Major |
-| [TUBEMQ-444](https://issues.apache.org/jira/browse/TUBEMQ-444) | Add consume and produce Cli commands | Major |
-| [TUBEMQ-447](https://issues.apache.org/jira/browse/TUBEMQ-447) | Add Broker-Admin Cli | Major |
-| [TUBEMQ-451](https://issues.apache.org/jira/browse/TUBEMQ-451) | Replace ConsumeTupleInfo with Tuple2  | Major    |
-| [TUBEMQ-457](https://issues.apache.org/jira/browse/TUBEMQ-457) | There is no need to return StringBuilder in Master.java | Major |
-| [TUBEMQ-463](https://issues.apache.org/jira/browse/TUBEMQ-463) | Adjust Master rebalance process implementation  | Major |
-| [TUBEMQ-464](https://issues.apache.org/jira/browse/TUBEMQ-464) | Add parameter rebalanceParallel in master.ini | Major |
-| [TUBEMQ-470](https://issues.apache.org/jira/browse/TUBEMQ-470) | Add query API of TopicName and BrokerId collection  | Major |
-| [TUBEMQ-471](https://issues.apache.org/jira/browse/TUBEMQ-471) | Add query API Introduction of TopicName and BrokerId collection | Major |
-| [TUBEMQ-472](https://issues.apache.org/jira/browse/TUBEMQ-472) | Adjust Broker's AbstractWebHandler class implementation  | Major |
-| [TUBEMQ-475](https://issues.apache.org/jira/browse/TUBEMQ-475) | add the offset clone api of the consume group  | Major |
-| [TUBEMQ-482](https://issues.apache.org/jira/browse/TUBEMQ-482) | Add offset query api  | Major |
-| [TUBEMQ-484](https://issues.apache.org/jira/browse/TUBEMQ-484) | Add query API for topic publication information  | Major |
-| [TUBEMQ-485](https://issues.apache.org/jira/browse/TUBEMQ-485) | Add the batch setting API of consume group offset  | Major |
-| [TUBEMQ-486](https://issues.apache.org/jira/browse/TUBEMQ-486) | Add the delete API of consumer group offset  | Major |
-| [TUBEMQ-494](https://issues.apache.org/jira/browse/TUBEMQ-494) | Update API interface instruction document | Major |
-| [TUBEMQ-499](https://issues.apache.org/jira/browse/TUBEMQ-499) | Add configure store  | Major |
-| [TUBEMQ-500](https://issues.apache.org/jira/browse/TUBEMQ-500) | Add setting operate API  | Major |
-| [TUBEMQ-501](https://issues.apache.org/jira/browse/TUBEMQ-501) | Adjust max message size check logic  | Major |
-| [TUBEMQ-502](https://issues.apache.org/jira/browse/TUBEMQ-502) | Add setting API interface document  | Major |
-| [TUBEMQ-504](https://issues.apache.org/jira/browse/TUBEMQ-504) | Adjust the WebMethodMapper class interfaces  | Major |
-| [TUBEMQ-508](https://issues.apache.org/jira/browse/TUBEMQ-508) | Optimize Broker's PB parameter check processing logic  | Major |
-| [TUBEMQ-509](https://issues.apache.org/jira/browse/TUBEMQ-509) | Adjust the packet length check when data is loaded  | Major |
-| [TUBEMQ-522](https://issues.apache.org/jira/browse/TUBEMQ-522) | Add admin_query_cluster_topic_view API document  | Major |
-| [TUBEMQ-544](https://issues.apache.org/jira/browse/TUBEMQ-544) | Adjust the LICENSE statement in the client.conf files of Python and C/C++ SDK | Major |
-| [TUBEMQ-546](https://issues.apache.org/jira/browse/TUBEMQ-546) | Restore the original license header of the referenced external source files | Major |
-| [TUBEMQ-547](https://issues.apache.org/jira/browse/TUBEMQ-547) | Recode the implementation of the *Startup.java classes in the Tool package | Major |
-| [TUBEMQ-548](https://issues.apache.org/jira/browse/TUBEMQ-548) | Handle the LICENSE authorization of font files in the resources | Major |
-| [TUBEMQ-549](https://issues.apache.org/jira/browse/TUBEMQ-549) | Handling the problem of compilation failure | Major |
-| [TUBEMQ-550](https://issues.apache.org/jira/browse/TUBEMQ-550) | Adjust LICENSE file content | Major |
-| [TUBEMQ-551](https://issues.apache.org/jira/browse/TUBEMQ-551) | Adjust NOTICE file content | Major |
-| [TUBEMQ-558](https://issues.apache.org/jira/browse/TUBEMQ-558) | Adjust the LICENSE of the file header | Major |
-| [TUBEMQ-559](https://issues.apache.org/jira/browse/TUBEMQ-559) | Update the LICENSE file according to the 0.8.0-RC2 review | Major |
-| [TUBEMQ-560](https://issues.apache.org/jira/browse/TUBEMQ-560) | Remove unprepared modules | Major |
+| [INLONG-428](https://issues.apache.org/jira/browse/INLONG-433) | Bumped version to 0.8.0-SNAPSHOT | Major |
+| [INLONG-433](https://issues.apache.org/jira/browse/INLONG-433) | add tubemq perf-consumer/producer scripts | Major |
+| [INLONG-434](https://issues.apache.org/jira/browse/INLONG-434) | Adjust Broker API mapping | Major |
+| [INLONG-435](https://issues.apache.org/jira/browse/INLONG-435) | Create Web field Mapping | Major |
+| [INLONG-436](https://issues.apache.org/jira/browse/INLONG-436) | Adjust Broker's HTTP API implementation | Major |
+| [INLONG-439](https://issues.apache.org/jira/browse/INLONG-439) | Add Cli field Scheme definition | Major |
+| [INLONG-440](https://issues.apache.org/jira/browse/INLONG-440) | Add feature package tube-manager to zip  | Major |
+| [INLONG-444](https://issues.apache.org/jira/browse/INLONG-444) | Add consume and produce Cli commands | Major |
+| [INLONG-447](https://issues.apache.org/jira/browse/INLONG-447) | Add Broker-Admin Cli | Major |
+| [INLONG-451](https://issues.apache.org/jira/browse/INLONG-451) | Replace ConsumeTupleInfo with Tuple2  | Major    |
+| [INLONG-457](https://issues.apache.org/jira/browse/INLONG-457) | There is no need to return StringBuilder in Master.java | Major |
+| [INLONG-463](https://issues.apache.org/jira/browse/INLONG-463) | Adjust Master rebalance process implementation  | Major |
+| [INLONG-464](https://issues.apache.org/jira/browse/INLONG-464) | Add parameter rebalanceParallel in master.ini | Major |
+| [INLONG-470](https://issues.apache.org/jira/browse/INLONG-470) | Add query API of TopicName and BrokerId collection  | Major |
+| [INLONG-471](https://issues.apache.org/jira/browse/INLONG-471) | Add query API Introduction of TopicName and BrokerId collection | Major |
+| [INLONG-472](https://issues.apache.org/jira/browse/INLONG-472) | Adjust Broker's AbstractWebHandler class implementation  | Major |
+| [INLONG-475](https://issues.apache.org/jira/browse/INLONG-475) | add the offset clone api of the consume group  | Major |
+| [INLONG-482](https://issues.apache.org/jira/browse/INLONG-482) | Add offset query api  | Major |
+| [INLONG-484](https://issues.apache.org/jira/browse/INLONG-484) | Add query API for topic publication information  | Major |
+| [INLONG-485](https://issues.apache.org/jira/browse/INLONG-485) | Add the batch setting API of consume group offset  | Major |
+| [INLONG-486](https://issues.apache.org/jira/browse/INLONG-486) | Add the delete API of consumer group offset  | Major |
+| [INLONG-494](https://issues.apache.org/jira/browse/INLONG-494) | Update API interface instruction document | Major |
+| [INLONG-499](https://issues.apache.org/jira/browse/INLONG-499) | Add configure store  | Major |
+| [INLONG-500](https://issues.apache.org/jira/browse/INLONG-500) | Add setting operate API  | Major |
+| [INLONG-501](https://issues.apache.org/jira/browse/INLONG-501) | Adjust max message size check logic  | Major |
+| [INLONG-502](https://issues.apache.org/jira/browse/INLONG-502) | Add setting API interface document  | Major |
+| [INLONG-504](https://issues.apache.org/jira/browse/INLONG-504) | Adjust the WebMethodMapper class interfaces  | Major |
+| [INLONG-508](https://issues.apache.org/jira/browse/INLONG-508) | Optimize Broker's PB parameter check processing logic  | Major |
+| [INLONG-509](https://issues.apache.org/jira/browse/INLONG-509) | Adjust the packet length check when data is loaded  | Major |
+| [INLONG-522](https://issues.apache.org/jira/browse/INLONG-522) | Add admin_query_cluster_topic_view API document  | Major |
+| [INLONG-544](https://issues.apache.org/jira/browse/INLONG-544) | Adjust the LICENSE statement in the client.conf files of Python and C/C++ SDK | Major |
+| [INLONG-546](https://issues.apache.org/jira/browse/INLONG-546) | Restore the original license header of the referenced external source files | Major |
+| [INLONG-547](https://issues.apache.org/jira/browse/INLONG-547) | Recode the implementation of the *Startup.java classes in the Tool package | Major |
+| [INLONG-548](https://issues.apache.org/jira/browse/INLONG-548) | Handle the LICENSE authorization of font files in the resources | Major |
+| [INLONG-549](https://issues.apache.org/jira/browse/INLONG-549) | Handling the problem of compilation failure | Major |
+| [INLONG-550](https://issues.apache.org/jira/browse/INLONG-550) | Adjust LICENSE file content | Major |
+| [INLONG-551](https://issues.apache.org/jira/browse/INLONG-551) | Adjust NOTICE file content | Major |
+| [INLONG-558](https://issues.apache.org/jira/browse/INLONG-558) | Adjust the LICENSE of the file header | Major |
+| [INLONG-559](https://issues.apache.org/jira/browse/INLONG-559) | Update the LICENSE file according to the 0.8.0-RC2 review | Major |
+| [INLONG-560](https://issues.apache.org/jira/browse/INLONG-560) | Remove unprepared modules | Major |
 
 
 ## Release 0.7.0-incubating - Released (as of 2020-11-25)
@@ -115,66 +115,66 @@
 
 | JIRA  | Summary  | Priority |
 | :---- | :------- | :------- |
-| [TUBEMQ-162](https://issues.apache.org/jira/browse/TUBEMQ-162) | Python SDK support in TubeMQ | High |
-| [TUBEMQ-336](https://issues.apache.org/jira/browse/TUBEMQ-336) | Propose web portal to manage tube cluster Phase-I | Major |
-| [TUBEMQ-390](https://issues.apache.org/jira/browse/TUBEMQ-390)   | support build C++ SDK with docker image | Normal |
+| [INLONG-162](https://issues.apache.org/jira/browse/INLONG-162) | Python SDK support in TubeMQ | High |
+| [INLONG-336](https://issues.apache.org/jira/browse/INLONG-336) | Propose web portal to manage tube cluster Phase-I | Major |
+| [INLONG-390](https://issues.apache.org/jira/browse/INLONG-390)   | support build C++ SDK with docker image | Normal |
 
 ### IMPROVEMENTS:
 
 | JIRA  | Summary  | Priority |
 | :---- | :------- | :------- |
-| [TUBEMQ-369](https://issues.apache.org/jira/browse/TUBEMQ-369) | hope to add an option in the compilation script (like `make lib` etc...)                 | Major    |
-| [TUBEMQ-373](https://issues.apache.org/jira/browse/TUBEMQ-373) | Reduce the redundant code of Utils::Split functions             | Major    |
-| [TUBEMQ-374](https://issues.apache.org/jira/browse/TUBEMQ-374) | Adjust some coding style issues     | Major    |
-| [TUBEMQ-375](https://issues.apache.org/jira/browse/TUBEMQ-375) | Add a section to the README file about how to compile the project| Major    |
-| [TUBEMQ-385](https://issues.apache.org/jira/browse/TUBEMQ-385) | update docker images     | Major    |
-| [TUBEMQ-393](https://issues.apache.org/jira/browse/TUBEMQ-393) | Optimize the mapping code of WEB API     | Major    |
-| [TUBEMQ-406](https://issues.apache.org/jira/browse/TUBEMQ-406) | test_consumer.py works for both Python 2 and 3   | Minor |
-| [TUBEMQ-410](https://issues.apache.org/jira/browse/TUBEMQ-410) | install python package and simplify test_consumer.py    | Major    |
-| [TUBEMQ-416](https://issues.apache.org/jira/browse/TUBEMQ-416) | support consume from specified position   | Major    |
-| [TUBEMQ-417](https://issues.apache.org/jira/browse/TUBEMQ-417) | C++ Client support parse message from binary data for Python SDK    | Major    |
-| [TUBEMQ-419](https://issues.apache.org/jira/browse/TUBEMQ-419) | SetMaxPartCheckPeriodMs() negative number, getMessage() still  | Major    |
+| [INLONG-369](https://issues.apache.org/jira/browse/INLONG-369) | hope to add an option in the compilation script (like `make lib` etc...)                 | Major    |
+| [INLONG-373](https://issues.apache.org/jira/browse/INLONG-373) | Reduce the redundant code of Utils::Split functions             | Major    |
+| [INLONG-374](https://issues.apache.org/jira/browse/INLONG-374) | Adjust some coding style issues     | Major    |
+| [INLONG-375](https://issues.apache.org/jira/browse/INLONG-375) | Add a section to the README file about how to compile the project| Major    |
+| [INLONG-385](https://issues.apache.org/jira/browse/INLONG-385) | update docker images     | Major    |
+| [INLONG-393](https://issues.apache.org/jira/browse/INLONG-393) | Optimize the mapping code of WEB API     | Major    |
+| [INLONG-406](https://issues.apache.org/jira/browse/INLONG-406) | test_consumer.py works for both Python 2 and 3   | Minor |
+| [INLONG-410](https://issues.apache.org/jira/browse/INLONG-410) | install python package and simplify test_consumer.py    | Major    |
+| [INLONG-416](https://issues.apache.org/jira/browse/INLONG-416) | support consume from specified position   | Major    |
+| [INLONG-417](https://issues.apache.org/jira/browse/INLONG-417) | C++ Client support parse message from binary data for Python SDK    | Major    |
+| [INLONG-419](https://issues.apache.org/jira/browse/INLONG-419) | SetMaxPartCheckPeriodMs() negative number, getMessage() still  | Major    |
 
 ### BUG FIXES:
 
 | JIRA                                                         | Summary                                                      | Priority |
 | :----------------------------------------------------------- | :----------------------------------------------------------- | :------- |
-| [TUBEMQ-365](https://issues.apache.org/jira/browse/TUBEMQ-365) | Whether the consumption setting is wrong after the processRequest exception | Major    |
-| [TUBEMQ-370](https://issues.apache.org/jira/browse/TUBEMQ-370) | Calling GetCurConsumedInfo API always returns failure      | Major    |
-| [TUBEMQ-376](https://issues.apache.org/jira/browse/TUBEMQ-376) | Move pullrequests_status notifications commits mail list | Major    |
-| [TUBEMQ-366](https://issues.apache.org/jira/browse/TUBEMQ-366) | Found a nullpointerexception bug in broker | Normal |
-| [TUBEMQ-379](https://issues.apache.org/jira/browse/TUBEMQ-379) | Modify the memory cache size default to 3M | Normal |
-| [TUBEMQ-380](https://issues.apache.org/jira/browse/TUBEMQ-380) | Cpp client link error when gcc optimization is disabled   | Major    |
-| [TUBEMQ-405](https://issues.apache.org/jira/browse/TUBEMQ-405) | python sdk install files lack of the whole cpp configuration | Major |
-| [TUBEMQ-401](https://issues.apache.org/jira/browse/TUBEMQ-401) | python sdk readme bug | Minor |
-| [TUBEMQ-407](https://issues.apache.org/jira/browse/TUBEMQ-407) | Fix some content in README.md | Trivial |
-| [TUBEMQ-418](https://issues.apache.org/jira/browse/TUBEMQ-418) | C++ SDK function SetMaxPartCheckPeriodMs() can't work | Major |
+| [INLONG-365](https://issues.apache.org/jira/browse/INLONG-365) | Whether the consumption setting is wrong after the processRequest exception | Major    |
+| [INLONG-370](https://issues.apache.org/jira/browse/INLONG-370) | Calling GetCurConsumedInfo API always returns failure      | Major    |
+| [INLONG-376](https://issues.apache.org/jira/browse/INLONG-376) | Move pullrequests_status notifications commits mail list | Major    |
+| [INLONG-366](https://issues.apache.org/jira/browse/INLONG-366) | Found a nullpointerexception bug in broker | Normal |
+| [INLONG-379](https://issues.apache.org/jira/browse/INLONG-379) | Modify the memory cache size default to 3M | Normal |
+| [INLONG-380](https://issues.apache.org/jira/browse/INLONG-380) | Cpp client link error when gcc optimization is disabled   | Major    |
+| [INLONG-405](https://issues.apache.org/jira/browse/INLONG-405) | python sdk install files lack of the whole cpp configuration | Major |
+| [INLONG-401](https://issues.apache.org/jira/browse/INLONG-401) | python sdk readme bug | Minor |
+| [INLONG-407](https://issues.apache.org/jira/browse/INLONG-407) | Fix some content in README.md | Trivial |
+| [INLONG-418](https://issues.apache.org/jira/browse/INLONG-418) | C++ SDK function SetMaxPartCheckPeriodMs() can't work | Major |
 
 ### SUB-TASK:
 
 | JIRA  | Summary  | Priority |
 | :---- | :------- | :------- |
-| [TUBEMQ-276](https://issues.apache.org/jira/browse/TUBEMQ-276) | add python client encode/decode protobuf message for TubeMQ RPC Protocol                                 | Major    |
-| [TUBEMQ-338](https://issues.apache.org/jira/browse/TUBEMQ-338) | web pages for tubemq manager                                     | Major    |
-| [TUBEMQ-341](https://issues.apache.org/jira/browse/TUBEMQ-341) | open independent sub-project for tubemq                                | Major    |
-| [TUBEMQ-342](https://issues.apache.org/jira/browse/TUBEMQ-342) | abstract backend threads for routine management                              | Major    |
-| [TUBEMQ-346](https://issues.apache.org/jira/browse/TUBEMQ-346) | remove chinese comments                                          | Minor |
-| [TUBEMQ-355](https://issues.apache.org/jira/browse/TUBEMQ-355) | Add business entity for topic manager                            | Major    |
-| [TUBEMQ-361](https://issues.apache.org/jira/browse/TUBEMQ-361) | create topic when getting request             | Major    |
-| [TUBEMQ-364](https://issues.apache.org/jira/browse/TUBEMQ-364) | uniform response format for exception state                              | Major    |
-| [TUBEMQ-383](https://issues.apache.org/jira/browse/TUBEMQ-383) | document about Installation/API Reference/Example                                   | Major    |
-| [TUBEMQ-387](https://issues.apache.org/jira/browse/TUBEMQ-387) | add manager web pages                                       | Major    |
-| [TUBEMQ-392](https://issues.apache.org/jira/browse/TUBEMQ-392) | add query rest api for clusters| Major    |
-| [TUBEMQ-394](https://issues.apache.org/jira/browse/TUBEMQ-394) | Creating Mapper class from web api to inner handler | Major    |
-| [TUBEMQ-395](https://issues.apache.org/jira/browse/TUBEMQ-395) | Create Abstract WebHandler class                            | Major    |
-| [TUBEMQ-396](https://issues.apache.org/jira/browse/TUBEMQ-396) | Adjust the WebXXXHandler classes implementation  | Major    |
-| [TUBEMQ-397](https://issues.apache.org/jira/browse/TUBEMQ-397) | Add master info and other info web handler   | Major    |
-| [TUBEMQ-398](https://issues.apache.org/jira/browse/TUBEMQ-398) | reinit project for using pybind11                            | Major    |
-| [TUBEMQ-399](https://issues.apache.org/jira/browse/TUBEMQ-399) | expose C++ SDK method by Pybind11                                         | Major    |
-| [TUBEMQ-400](https://issues.apache.org/jira/browse/TUBEMQ-400) | add example for consume message by bypind11                                 | Major    |
-| [TUBEMQ-402](https://issues.apache.org/jira/browse/TUBEMQ-402) | add modify rest api for clusters                           | Major    |
-| [TUBEMQ-412](https://issues.apache.org/jira/browse/TUBEMQ-402) | tube manager start stop scrrpts                           | Major    |
-| [TUBEMQ-415](https://issues.apache.org/jira/browse/TUBEMQ-415) | exclude apache license for front end code  | Major    |
+| [INLONG-276](https://issues.apache.org/jira/browse/INLONG-276) | add python client encode/decode protobuf message for TubeMQ RPC Protocol                                 | Major    |
+| [INLONG-338](https://issues.apache.org/jira/browse/INLONG-338) | web pages for tubemq manager                                     | Major    |
+| [INLONG-341](https://issues.apache.org/jira/browse/INLONG-341) | open independent sub-project for tubemq                                | Major    |
+| [INLONG-342](https://issues.apache.org/jira/browse/INLONG-342) | abstract backend threads for routine management                              | Major    |
+| [INLONG-346](https://issues.apache.org/jira/browse/INLONG-346) | remove chinese comments                                          | Minor |
+| [INLONG-355](https://issues.apache.org/jira/browse/INLONG-355) | Add business entity for topic manager                            | Major    |
+| [INLONG-361](https://issues.apache.org/jira/browse/INLONG-361) | create topic when getting request             | Major    |
+| [INLONG-364](https://issues.apache.org/jira/browse/INLONG-364) | uniform response format for exception state                              | Major    |
+| [INLONG-383](https://issues.apache.org/jira/browse/INLONG-383) | document about Installation/API Reference/Example                                   | Major    |
+| [INLONG-387](https://issues.apache.org/jira/browse/INLONG-387) | add manager web pages                                       | Major    |
+| [INLONG-392](https://issues.apache.org/jira/browse/INLONG-392) | add query rest api for clusters| Major    |
+| [INLONG-394](https://issues.apache.org/jira/browse/INLONG-394) | Creating Mapper class from web api to inner handler | Major    |
+| [INLONG-395](https://issues.apache.org/jira/browse/INLONG-395) | Create Abstract WebHandler class                            | Major    |
+| [INLONG-396](https://issues.apache.org/jira/browse/INLONG-396) | Adjust the WebXXXHandler classes implementation  | Major    |
+| [INLONG-397](https://issues.apache.org/jira/browse/INLONG-397) | Add master info and other info web handler   | Major    |
+| [INLONG-398](https://issues.apache.org/jira/browse/INLONG-398) | reinit project for using pybind11                            | Major    |
+| [INLONG-399](https://issues.apache.org/jira/browse/INLONG-399) | expose C++ SDK method by Pybind11                                         | Major    |
+| [INLONG-400](https://issues.apache.org/jira/browse/INLONG-400) | add example for consume message by bypind11                                 | Major    |
+| [INLONG-402](https://issues.apache.org/jira/browse/INLONG-402) | add modify rest api for clusters                           | Major    |
+| [INLONG-412](https://issues.apache.org/jira/browse/INLONG-402) | tube manager start stop scrrpts                           | Major    |
+| [INLONG-415](https://issues.apache.org/jira/browse/INLONG-415) | exclude apache license for front end code  | Major    |
 
 ## Release 0.6.0-incubating - Released (as of 2020-09-25)
 
@@ -182,204 +182,204 @@
 
 | JIRA  | Summary  | Priority |
 | :---- | :------- | :------- |
-| [TUBEMQ-319](https://issues.apache.org/jira/browse/TUBEMQ-319) | In the pull mode, consumers support the  suspension of consumption for a certain partition | Major    |
-| [TUBEMQ-3](https://issues.apache.org/jira/browse/TUBEMQ-3)   | C++ SDK support in TubeMQ                                    | Normal   |
+| [INLONG-319](https://issues.apache.org/jira/browse/INLONG-319) | In the pull mode, consumers support the  suspension of consumption for a certain partition | Major    |
+| [INLONG-3](https://issues.apache.org/jira/browse/INLONG-3)   | C++ SDK support in TubeMQ                                    | Normal   |
 
 ### IMPROVEMENTS:
 
 | JIRA  | Summary  | Priority |
 | :---- | :------- | :------- |
-| [TUBEMQ-311](https://issues.apache.org/jira/browse/TUBEMQ-311) | Feedback more production information                 | Major    |
-| [TUBEMQ-312](https://issues.apache.org/jira/browse/TUBEMQ-312) | Feedback more consumption information                | Major    |
-| [TUBEMQ-325](https://issues.apache.org/jira/browse/TUBEMQ-325) | Add 406 ~ 408 error code to pullSelect call          | Major    |
-| [TUBEMQ-345](https://issues.apache.org/jira/browse/TUBEMQ-345) | Optimize the call logic of getMessage() in Pull mode | Major    |
-| [TUBEMQ-352](https://issues.apache.org/jira/browse/TUBEMQ-352) | Set the parameters of the example at startup         | Major    |
-| [TUBEMQ-353](https://issues.apache.org/jira/browse/TUBEMQ-353) | Update LICENSE about C/C++ SDK's code reference      | Major    |
-| [TUBEMQ-356](https://issues.apache.org/jira/browse/TUBEMQ-356) | C++ SDK Codec decode add requestid                   | Major    |
-| [TUBEMQ-327](https://issues.apache.org/jira/browse/TUBEMQ-327) | Fix the concurrency problem in the example           | Normal   |
+| [INLONG-311](https://issues.apache.org/jira/browse/INLONG-311) | Feedback more production information                 | Major    |
+| [INLONG-312](https://issues.apache.org/jira/browse/INLONG-312) | Feedback more consumption information                | Major    |
+| [INLONG-325](https://issues.apache.org/jira/browse/INLONG-325) | Add 406 ~ 408 error code to pullSelect call          | Major    |
+| [INLONG-345](https://issues.apache.org/jira/browse/INLONG-345) | Optimize the call logic of getMessage() in Pull mode | Major    |
+| [INLONG-352](https://issues.apache.org/jira/browse/INLONG-352) | Set the parameters of the example at startup         | Major    |
+| [INLONG-353](https://issues.apache.org/jira/browse/INLONG-353) | Update LICENSE about C/C++ SDK's code reference      | Major    |
+| [INLONG-356](https://issues.apache.org/jira/browse/INLONG-356) | C++ SDK Codec decode add requestid                   | Major    |
+| [INLONG-327](https://issues.apache.org/jira/browse/INLONG-327) | Fix the concurrency problem in the example           | Normal   |
 
 ### BUG FIXES:
 
 | JIRA                                                         | Summary                                                      | Priority |
 | :----------------------------------------------------------- | :----------------------------------------------------------- | :------- |
-| [TUBEMQ-316](https://issues.apache.org/jira/browse/TUBEMQ-316) | Where the port the port is aleady used, the  process throw the exception, but not exit | Major    |
-| [TUBEMQ-317](https://issues.apache.org/jira/browse/TUBEMQ-317) | The Store Manager throws java.lang.NullPointerException      | Major    |
-| [TUBEMQ-320](https://issues.apache.org/jira/browse/TUBEMQ-320) | Request for static web contents would get responses with no content | Major    |
-| [TUBEMQ-354](https://issues.apache.org/jira/browse/TUBEMQ-354) | Found a dns translate bug in C/C++ sdk                       | Major    |
-| [TUBEMQ-306](https://issues.apache.org/jira/browse/TUBEMQ-306) | Raise Nullpointer Exception when create tubemq instance      | Low      |
-| [TUBEMQ-359](https://issues.apache.org/jira/browse/TUBEMQ-359) | TubeMQ consume speed dropped to 0 in some partitions, it is a very serious bug | Blocker  |
+| [INLONG-316](https://issues.apache.org/jira/browse/INLONG-316) | Where the port the port is aleady used, the  process throw the exception, but not exit | Major    |
+| [INLONG-317](https://issues.apache.org/jira/browse/INLONG-317) | The Store Manager throws java.lang.NullPointerException      | Major    |
+| [INLONG-320](https://issues.apache.org/jira/browse/INLONG-320) | Request for static web contents would get responses with no content | Major    |
+| [INLONG-354](https://issues.apache.org/jira/browse/INLONG-354) | Found a dns translate bug in C/C++ sdk                       | Major    |
+| [INLONG-306](https://issues.apache.org/jira/browse/INLONG-306) | Raise Nullpointer Exception when create tubemq instance      | Low      |
+| [INLONG-359](https://issues.apache.org/jira/browse/INLONG-359) | TubeMQ consume speed dropped to 0 in some partitions, it is a very serious bug | Blocker  |
 
 ### SUB-TASK:
 
 | JIRA  | Summary  | Priority |
 | :---- | :------- | :------- |
-| [TUBEMQ-250](https://issues.apache.org/jira/browse/TUBEMQ-250) | Create C/C++ configure files                                 | Major    |
-| [TUBEMQ-251](https://issues.apache.org/jira/browse/TUBEMQ-251) | Create C/C++ Codec utils                                     | Major    |
-| [TUBEMQ-252](https://issues.apache.org/jira/browse/TUBEMQ-252) | Create C/C++ Metadata classes                                | Major    |
-| [TUBEMQ-262](https://issues.apache.org/jira/browse/TUBEMQ-262) | Create C++ flow control handler                              | Major    |
-| [TUBEMQ-263](https://issues.apache.org/jira/browse/TUBEMQ-263) | Create C/C++ ini file read utils                             | Major    |
-| [TUBEMQ-266](https://issues.apache.org/jira/browse/TUBEMQ-266) | [TUBEMQ-266] Add Tencent/rapidjson as submodule              | Major    |
-| [TUBEMQ-267](https://issues.apache.org/jira/browse/TUBEMQ-267) | Create C/C++ Message class                                   | Major    |
-| [TUBEMQ-269](https://issues.apache.org/jira/browse/TUBEMQ-269) | Create C/C++ RmtDataCache class                              | Major    |
-| [TUBEMQ-272](https://issues.apache.org/jira/browse/TUBEMQ-272) | Unified C/C++ files's code style                             | Major    |
-| [TUBEMQ-274](https://issues.apache.org/jira/browse/TUBEMQ-274) | Support CMake compilation                                    | Major    |
-| [TUBEMQ-275](https://issues.apache.org/jira/browse/TUBEMQ-275) | Thread Pool & Timer                                          | Major    |
-| [TUBEMQ-280](https://issues.apache.org/jira/browse/TUBEMQ-280) | Create C/C++ subscribe info class                            | Major    |
-| [TUBEMQ-281](https://issues.apache.org/jira/browse/TUBEMQ-281) | atomic_def.h use C++11 stdlib class                          | Major    |
-| [TUBEMQ-282](https://issues.apache.org/jira/browse/TUBEMQ-282) | Create C/C++ return result class                             | Major    |
-| [TUBEMQ-283](https://issues.apache.org/jira/browse/TUBEMQ-283) | Adjust C/C++ some file names: add "tubemq_" prefix           | Major    |
-| [TUBEMQ-285](https://issues.apache.org/jira/browse/TUBEMQ-285) | Replace C/C++ pthread's mutex to std::mutex                  | Major    |
-| [TUBEMQ-286](https://issues.apache.org/jira/browse/TUBEMQ-286) | Create C/C++ SDK's manager class                             | Major    |
-| [TUBEMQ-287](https://issues.apache.org/jira/browse/TUBEMQ-287) | C++ SDK io buffer                                            | Major    |
-| [TUBEMQ-288](https://issues.apache.org/jira/browse/TUBEMQ-288) | C++ SDK Codec interface                                      | Major    |
-| [TUBEMQ-289](https://issues.apache.org/jira/browse/TUBEMQ-289) | C++ SDK Codec TubeMQ proto support                           | Major    |
-| [TUBEMQ-290](https://issues.apache.org/jira/browse/TUBEMQ-290) | C++ SDK TCP Connect                                          | Major    |
-| [TUBEMQ-291](https://issues.apache.org/jira/browse/TUBEMQ-291) | C++ SDK Connect Pool                                         | Major    |
-| [TUBEMQ-293](https://issues.apache.org/jira/browse/TUBEMQ-293) | C++ SDK Create Future class                                  | Major    |
-| [TUBEMQ-296](https://issues.apache.org/jira/browse/TUBEMQ-296) | Adjust the version information of all pom.xml                | Major    |
-| [TUBEMQ-300](https://issues.apache.org/jira/browse/TUBEMQ-300) | Update LICENSE                                               | Major    |
-| [TUBEMQ-308](https://issues.apache.org/jira/browse/TUBEMQ-308) | Upgrade Jetty 6 (mortbay) => Jetty 9 (eclipse)               | Major    |
-| [TUBEMQ-309](https://issues.apache.org/jira/browse/TUBEMQ-309) | Add POST support to WebAPI                                   | Major    |
-| [TUBEMQ-326](https://issues.apache.org/jira/browse/TUBEMQ-326) | [website] Added 405 ~ 408 error code definition              | Major    |
-| [TUBEMQ-347](https://issues.apache.org/jira/browse/TUBEMQ-347) | C++ SDK Create client API                                    | Major    |
-| [TUBEMQ-348](https://issues.apache.org/jira/browse/TUBEMQ-348) | C++SDK Client handler detail                                 | Major    |
-| [TUBEMQ-349](https://issues.apache.org/jira/browse/TUBEMQ-349) | C++ SDK Create Thread Pool                                   | Major    |
-| [TUBEMQ-350](https://issues.apache.org/jira/browse/TUBEMQ-350) | C++ SDK client code adj                                      | Major    |
-| [TUBEMQ-351](https://issues.apache.org/jira/browse/TUBEMQ-351) | C++ SDK example&tests                                        | Major    |
-| [TUBEMQ-358](https://issues.apache.org/jira/browse/TUBEMQ-358) | Adjust tubemq-manager, remove it from master, and develop with TUBEMQ-336  branch | Major    |
-| [TUBEMQ-268](https://issues.apache.org/jira/browse/TUBEMQ-268) | C++ SDK log module                                           | Normal   |
-| [TUBEMQ-292](https://issues.apache.org/jira/browse/TUBEMQ-292) | C++ SDK singleton & executor_pool optimization               | Normal   |
-| [TUBEMQ-270](https://issues.apache.org/jira/browse/TUBEMQ-270) | this point c++ SDK class                                     | Minor    |
-| [TUBEMQ-271](https://issues.apache.org/jira/browse/TUBEMQ-271) | C++ SDK copy constructor and  assignment constructor         | Minor    |
-| [TUBEMQ-273](https://issues.apache.org/jira/browse/TUBEMQ-273) | C++ SDK dir name change inc -> include/tubemq/               | Minor    |
+| [INLONG-250](https://issues.apache.org/jira/browse/INLONG-250) | Create C/C++ configure files                                 | Major    |
+| [INLONG-251](https://issues.apache.org/jira/browse/INLONG-251) | Create C/C++ Codec utils                                     | Major    |
+| [INLONG-252](https://issues.apache.org/jira/browse/INLONG-252) | Create C/C++ Metadata classes                                | Major    |
+| [INLONG-262](https://issues.apache.org/jira/browse/INLONG-262) | Create C++ flow control handler                              | Major    |
+| [INLONG-263](https://issues.apache.org/jira/browse/INLONG-263) | Create C/C++ ini file read utils                             | Major    |
+| [INLONG-266](https://issues.apache.org/jira/browse/INLONG-266) | [INLONG-266] Add Tencent/rapidjson as submodule              | Major    |
+| [INLONG-267](https://issues.apache.org/jira/browse/INLONG-267) | Create C/C++ Message class                                   | Major    |
+| [INLONG-269](https://issues.apache.org/jira/browse/INLONG-269) | Create C/C++ RmtDataCache class                              | Major    |
+| [INLONG-272](https://issues.apache.org/jira/browse/INLONG-272) | Unified C/C++ files's code style                             | Major    |
+| [INLONG-274](https://issues.apache.org/jira/browse/INLONG-274) | Support CMake compilation                                    | Major    |
+| [INLONG-275](https://issues.apache.org/jira/browse/INLONG-275) | Thread Pool & Timer                                          | Major    |
+| [INLONG-280](https://issues.apache.org/jira/browse/INLONG-280) | Create C/C++ subscribe info class                            | Major    |
+| [INLONG-281](https://issues.apache.org/jira/browse/INLONG-281) | atomic_def.h use C++11 stdlib class                          | Major    |
+| [INLONG-282](https://issues.apache.org/jira/browse/INLONG-282) | Create C/C++ return result class                             | Major    |
+| [INLONG-283](https://issues.apache.org/jira/browse/INLONG-283) | Adjust C/C++ some file names: add "tubemq_" prefix           | Major    |
+| [INLONG-285](https://issues.apache.org/jira/browse/INLONG-285) | Replace C/C++ pthread's mutex to std::mutex                  | Major    |
+| [INLONG-286](https://issues.apache.org/jira/browse/INLONG-286) | Create C/C++ SDK's manager class                             | Major    |
+| [INLONG-287](https://issues.apache.org/jira/browse/INLONG-287) | C++ SDK io buffer                                            | Major    |
+| [INLONG-288](https://issues.apache.org/jira/browse/INLONG-288) | C++ SDK Codec interface                                      | Major    |
+| [INLONG-289](https://issues.apache.org/jira/browse/INLONG-289) | C++ SDK Codec TubeMQ proto support                           | Major    |
+| [INLONG-290](https://issues.apache.org/jira/browse/INLONG-290) | C++ SDK TCP Connect                                          | Major    |
+| [INLONG-291](https://issues.apache.org/jira/browse/INLONG-291) | C++ SDK Connect Pool                                         | Major    |
+| [INLONG-293](https://issues.apache.org/jira/browse/INLONG-293) | C++ SDK Create Future class                                  | Major    |
+| [INLONG-296](https://issues.apache.org/jira/browse/INLONG-296) | Adjust the version information of all pom.xml                | Major    |
+| [INLONG-300](https://issues.apache.org/jira/browse/INLONG-300) | Update LICENSE                                               | Major    |
+| [INLONG-308](https://issues.apache.org/jira/browse/INLONG-308) | Upgrade Jetty 6 (mortbay) => Jetty 9 (eclipse)               | Major    |
+| [INLONG-309](https://issues.apache.org/jira/browse/INLONG-309) | Add POST support to WebAPI                                   | Major    |
+| [INLONG-326](https://issues.apache.org/jira/browse/INLONG-326) | [website] Added 405 ~ 408 error code definition              | Major    |
+| [INLONG-347](https://issues.apache.org/jira/browse/INLONG-347) | C++ SDK Create client API                                    | Major    |
+| [INLONG-348](https://issues.apache.org/jira/browse/INLONG-348) | C++SDK Client handler detail                                 | Major    |
+| [INLONG-349](https://issues.apache.org/jira/browse/INLONG-349) | C++ SDK Create Thread Pool                                   | Major    |
+| [INLONG-350](https://issues.apache.org/jira/browse/INLONG-350) | C++ SDK client code adj                                      | Major    |
+| [INLONG-351](https://issues.apache.org/jira/browse/INLONG-351) | C++ SDK example&tests                                        | Major    |
+| [INLONG-358](https://issues.apache.org/jira/browse/INLONG-358) | Adjust tubemq-manager, remove it from master, and develop with INLONG-336  branch | Major    |
+| [INLONG-268](https://issues.apache.org/jira/browse/INLONG-268) | C++ SDK log module                                           | Normal   |
+| [INLONG-292](https://issues.apache.org/jira/browse/INLONG-292) | C++ SDK singleton & executor_pool optimization               | Normal   |
+| [INLONG-270](https://issues.apache.org/jira/browse/INLONG-270) | this point c++ SDK class                                     | Minor    |
+| [INLONG-271](https://issues.apache.org/jira/browse/INLONG-271) | C++ SDK copy constructor and  assignment constructor         | Minor    |
+| [INLONG-273](https://issues.apache.org/jira/browse/INLONG-273) | C++ SDK dir name change inc -> include/tubemq/               | Minor    |
 
 ## Release 0.5.0-incubating - released (as of 2020-07-22)
 
 ### NEW FEATURES:
 | JIRA | Summary | Priority |
 |:---- |:---- | :--- |
-|[TUBEMQ-122](https://issues.apache.org/jira/browse/TUBEMQ-122) | Increase JAVA version collection of SDK environment |  Major|
-|[TUBEMQ-163](https://issues.apache.org/jira/browse/TUBEMQ-163) | Flume sink for TubeMQ |  Major|
-|[TUBEMQ-197](https://issues.apache.org/jira/browse/TUBEMQ-197) | Support TubeMQ connector for Apache Flink |  Major|
-|[TUBEMQ-238](https://issues.apache.org/jira/browse/TUBEMQ-238) | Support TubeMQ connector for Apache Spark Streaming |  Major|
-|[TUBEMQ-239](https://issues.apache.org/jira/browse/TUBEMQ-239) | support deployment on kubernetes |  Major|
+|[INLONG-122](https://issues.apache.org/jira/browse/INLONG-122) | Increase JAVA version collection of SDK environment |  Major|
+|[INLONG-163](https://issues.apache.org/jira/browse/INLONG-163) | Flume sink for TubeMQ |  Major|
+|[INLONG-197](https://issues.apache.org/jira/browse/INLONG-197) | Support TubeMQ connector for Apache Flink |  Major|
+|[INLONG-238](https://issues.apache.org/jira/browse/INLONG-238) | Support TubeMQ connector for Apache Spark Streaming |  Major|
+|[INLONG-239](https://issues.apache.org/jira/browse/INLONG-239) | support deployment on kubernetes |  Major|
 
 ### IMPROVEMENTS:
 | JIRA | Summary | Priority |
 |:---- |:---- | :--- |
-| [TUBEMQ-46](https://issues.apache.org/jira/browse/TUBEMQ-46) | Correct some spelling issues |	Low|
-| [TUBEMQ-53](https://issues.apache.org/jira/browse/TUBEMQ-53) | fix some typos |	Low|
-| [TUBEMQ-55](https://issues.apache.org/jira/browse/TUBEMQ-55) | fix some typos |	Low|
-| [TUBEMQ-57](https://issues.apache.org/jira/browse/TUBEMQ-57) | fix some typos & todo |	Low|
-| [TUBEMQ-58](https://issues.apache.org/jira/browse/TUBEMQ-58) | fix some typos |	Low|
-| [TUBEMQ-60](https://issues.apache.org/jira/browse/TUBEMQ-60) | Remove unnecessary synchronized & using IllegalArgumentException instead of IllegalStateException |	Low|
-| [TUBEMQ-61](https://issues.apache.org/jira/browse/TUBEMQ-61) | minor update & fix some typos |	Low|
-| [TUBEMQ-64](https://issues.apache.org/jira/browse/TUBEMQ-64) | minor update & fix some typos |	Low|
-| [TUBEMQ-67](https://issues.apache.org/jira/browse/TUBEMQ-67) | remove synchronized & fix some typos |	Low|
-| [TUBEMQ-71](https://issues.apache.org/jira/browse/TUBEMQ-71) | using IllegalArgumentException & fix some typos |	Low|
-| [TUBEMQ-73](https://issues.apache.org/jira/browse/TUBEMQ-73) | remove duplicate codes & some minor updates |	Normal|
-| [TUBEMQ-74](https://issues.apache.org/jira/browse/TUBEMQ-74) | minor updates for DefaultBdbStoreService |	Low|
-| [TUBEMQ-75](https://issues.apache.org/jira/browse/TUBEMQ-75) | remove unused Logger |	Major|
-| [TUBEMQ-76](https://issues.apache.org/jira/browse/TUBEMQ-76) | rename the classes |	Low|
-| [TUBEMQ-77](https://issues.apache.org/jira/browse/TUBEMQ-77) | fix typo |	Low|
-| [TUBEMQ-79](https://issues.apache.org/jira/browse/TUBEMQ-79) | fix typo |	Major|
-| [TUBEMQ-80](https://issues.apache.org/jira/browse/TUBEMQ-80) | Fix some typos |	Low|
-| [TUBEMQ-82](https://issues.apache.org/jira/browse/TUBEMQ-82) | Fix some typos & update comments |	Low|
-| [TUBEMQ-83](https://issues.apache.org/jira/browse/TUBEMQ-83) | Fix some typos |	Low|
-| [TUBEMQ-87](https://issues.apache.org/jira/browse/TUBEMQ-87) | Minor updates |	Low|
-| [TUBEMQ-89](https://issues.apache.org/jira/browse/TUBEMQ-89) | Minor updates |	Low|
-| [TUBEMQ-90](https://issues.apache.org/jira/browse/TUBEMQ-90) | Remove unused codes in TubeBroker |	Normal|
-| [TUBEMQ-91](https://issues.apache.org/jira/browse/TUBEMQ-91) | replace explicit type with <> |	Low|
-| [TUBEMQ-93](https://issues.apache.org/jira/browse/TUBEMQ-93) | Substitute the parameterized type for client module & missed server module |	Low|
-| [TUBEMQ-94](https://issues.apache.org/jira/browse/TUBEMQ-94) | Substitute the parameterized type for core module |	Low|
-| [TUBEMQ-95](https://issues.apache.org/jira/browse/TUBEMQ-95) | Substitute the parameterized type for server module |	Low|
-| [TUBEMQ-96](https://issues.apache.org/jira/browse/TUBEMQ-96) | Fix typo & use IllegalArgumentException |	Low|
-| [TUBEMQ-98](https://issues.apache.org/jira/browse/TUBEMQ-98) | Fix typo & Simplify 'instanceof' judgment |	Low|
-| [TUBEMQ-100](https://issues.apache.org/jira/browse/TUBEMQ-100) | Fix typos & remove unused codes |	Low|
-| [TUBEMQ-101](https://issues.apache.org/jira/browse/TUBEMQ-101) | Optimize code & Fix type |	Low|
-| [TUBEMQ-103](https://issues.apache.org/jira/browse/TUBEMQ-103) | Substitute Chinese comments with English |	Normal|
-| [TUBEMQ-108](https://issues.apache.org/jira/browse/TUBEMQ-108) | About maven jdk version configuration problem |	Minor|
-| [TUBEMQ-127](https://issues.apache.org/jira/browse/TUBEMQ-127) | Fixed a bug & minor changes |	Low|
-| [TUBEMQ-128](https://issues.apache.org/jira/browse/TUBEMQ-128) | Shorten the log clearup check cycle |	Major|
-| [TUBEMQ-138](https://issues.apache.org/jira/browse/TUBEMQ-138) | Optimize core module test case code |	Low|
-| [TUBEMQ-141](https://issues.apache.org/jira/browse/TUBEMQ-141) | Remove the requirement to provide localHostIP |	Major|
-| [TUBEMQ-152](https://issues.apache.org/jira/browse/TUBEMQ-152) | Modify the master.ini file's annotations |	Normal|
-| [TUBEMQ-154](https://issues.apache.org/jira/browse/TUBEMQ-154) | Modify the wrong comment & Minor changes for example module |	Low|
-| [TUBEMQ-155](https://issues.apache.org/jira/browse/TUBEMQ-155) | Use enum class for consume position |	Normal|
-| [TUBEMQ-156](https://issues.apache.org/jira/browse/TUBEMQ-156) | Update for README.md |	Normal|
-| [TUBEMQ-166](https://issues.apache.org/jira/browse/TUBEMQ-166) | Hide `bdbStore` configs in master.ini |	Major|
-| [TUBEMQ-167](https://issues.apache.org/jira/browse/TUBEMQ-167) | Change to relative paths in default configs |	Trivial|
-| [TUBEMQ-168](https://issues.apache.org/jira/browse/TUBEMQ-168) | Example module: remove localhost IP configuration parameters |	Minor|
-| [TUBEMQ-170](https://issues.apache.org/jira/browse/TUBEMQ-170) | improve build/deployment/configuration for quick start |	Major|
-| [TUBEMQ-196](https://issues.apache.org/jira/browse/TUBEMQ-196) | use log to print exception |	Low|
-| [TUBEMQ-201](https://issues.apache.org/jira/browse/TUBEMQ-201) | [Website] Adjust user guide & fix demo example |	Major|
-| [TUBEMQ-202](https://issues.apache.org/jira/browse/TUBEMQ-202) | Add protobuf protocol syntax declaration |	Major|
-| [TUBEMQ-213](https://issues.apache.org/jira/browse/TUBEMQ-213) | Optimize code & Minor changes |	Low|
-| [TUBEMQ-216](https://issues.apache.org/jira/browse/TUBEMQ-216) | use ThreadUtil.sleep replace Thread.sleep |	Low|
-| [TUBEMQ-222](https://issues.apache.org/jira/browse/TUBEMQ-222) | Optimize code: Unnecessary boxing/unboxing conversion |	Normal|
-| [TUBEMQ-224](https://issues.apache.org/jira/browse/TUBEMQ-224) | Fixed: Unnecessary conversion to string inspection for server module |	Low|
-| [TUBEMQ-226](https://issues.apache.org/jira/browse/TUBEMQ-226) | Add Windows startup scripts |	High|
-| [TUBEMQ-227](https://issues.apache.org/jira/browse/TUBEMQ-227) | remove build guide in docker-build readme |	Major|
-| [TUBEMQ-232](https://issues.apache.org/jira/browse/TUBEMQ-232) | TubeBroker#register2Master, reconnect and wait |	Low|
-| [TUBEMQ-234](https://issues.apache.org/jira/browse/TUBEMQ-234) | Add .asf.yaml to change notifications |	Major|
-| [TUBEMQ-235](https://issues.apache.org/jira/browse/TUBEMQ-235) | Add code coverage supporting for pull request created. |	Normal|
-| [TUBEMQ-237](https://issues.apache.org/jira/browse/TUBEMQ-237) | add maven module build for docker image |	Major|
+| [INLONG-46](https://issues.apache.org/jira/browse/INLONG-46) | Correct some spelling issues |	Low|
+| [INLONG-53](https://issues.apache.org/jira/browse/INLONG-53) | fix some typos |	Low|
+| [INLONG-55](https://issues.apache.org/jira/browse/INLONG-55) | fix some typos |	Low|
+| [INLONG-57](https://issues.apache.org/jira/browse/INLONG-57) | fix some typos & todo |	Low|
+| [INLONG-58](https://issues.apache.org/jira/browse/INLONG-58) | fix some typos |	Low|
+| [INLONG-60](https://issues.apache.org/jira/browse/INLONG-60) | Remove unnecessary synchronized & using IllegalArgumentException instead of IllegalStateException |	Low|
+| [INLONG-61](https://issues.apache.org/jira/browse/INLONG-61) | minor update & fix some typos |	Low|
+| [INLONG-64](https://issues.apache.org/jira/browse/INLONG-64) | minor update & fix some typos |	Low|
+| [INLONG-67](https://issues.apache.org/jira/browse/INLONG-67) | remove synchronized & fix some typos |	Low|
+| [INLONG-71](https://issues.apache.org/jira/browse/INLONG-71) | using IllegalArgumentException & fix some typos |	Low|
+| [INLONG-73](https://issues.apache.org/jira/browse/INLONG-73) | remove duplicate codes & some minor updates |	Normal|
+| [INLONG-74](https://issues.apache.org/jira/browse/INLONG-74) | minor updates for DefaultBdbStoreService |	Low|
+| [INLONG-75](https://issues.apache.org/jira/browse/INLONG-75) | remove unused Logger |	Major|
+| [INLONG-76](https://issues.apache.org/jira/browse/INLONG-76) | rename the classes |	Low|
+| [INLONG-77](https://issues.apache.org/jira/browse/INLONG-77) | fix typo |	Low|
+| [INLONG-79](https://issues.apache.org/jira/browse/INLONG-79) | fix typo |	Major|
+| [INLONG-80](https://issues.apache.org/jira/browse/INLONG-80) | Fix some typos |	Low|
+| [INLONG-82](https://issues.apache.org/jira/browse/INLONG-82) | Fix some typos & update comments |	Low|
+| [INLONG-83](https://issues.apache.org/jira/browse/INLONG-83) | Fix some typos |	Low|
+| [INLONG-87](https://issues.apache.org/jira/browse/INLONG-87) | Minor updates |	Low|
+| [INLONG-89](https://issues.apache.org/jira/browse/INLONG-89) | Minor updates |	Low|
+| [INLONG-90](https://issues.apache.org/jira/browse/INLONG-90) | Remove unused codes in TubeBroker |	Normal|
+| [INLONG-91](https://issues.apache.org/jira/browse/INLONG-91) | replace explicit type with <> |	Low|
+| [INLONG-93](https://issues.apache.org/jira/browse/INLONG-93) | Substitute the parameterized type for client module & missed server module |	Low|
+| [INLONG-94](https://issues.apache.org/jira/browse/INLONG-94) | Substitute the parameterized type for core module |	Low|
+| [INLONG-95](https://issues.apache.org/jira/browse/INLONG-95) | Substitute the parameterized type for server module |	Low|
+| [INLONG-96](https://issues.apache.org/jira/browse/INLONG-96) | Fix typo & use IllegalArgumentException |	Low|
+| [INLONG-98](https://issues.apache.org/jira/browse/INLONG-98) | Fix typo & Simplify 'instanceof' judgment |	Low|
+| [INLONG-100](https://issues.apache.org/jira/browse/INLONG-100) | Fix typos & remove unused codes |	Low|
+| [INLONG-101](https://issues.apache.org/jira/browse/INLONG-101) | Optimize code & Fix type |	Low|
+| [INLONG-103](https://issues.apache.org/jira/browse/INLONG-103) | Substitute Chinese comments with English |	Normal|
+| [INLONG-108](https://issues.apache.org/jira/browse/INLONG-108) | About maven jdk version configuration problem |	Minor|
+| [INLONG-127](https://issues.apache.org/jira/browse/INLONG-127) | Fixed a bug & minor changes |	Low|
+| [INLONG-128](https://issues.apache.org/jira/browse/INLONG-128) | Shorten the log clearup check cycle |	Major|
+| [INLONG-138](https://issues.apache.org/jira/browse/INLONG-138) | Optimize core module test case code |	Low|
+| [INLONG-141](https://issues.apache.org/jira/browse/INLONG-141) | Remove the requirement to provide localHostIP |	Major|
+| [INLONG-152](https://issues.apache.org/jira/browse/INLONG-152) | Modify the master.ini file's annotations |	Normal|
+| [INLONG-154](https://issues.apache.org/jira/browse/INLONG-154) | Modify the wrong comment & Minor changes for example module |	Low|
+| [INLONG-155](https://issues.apache.org/jira/browse/INLONG-155) | Use enum class for consume position |	Normal|
+| [INLONG-156](https://issues.apache.org/jira/browse/INLONG-156) | Update for README.md |	Normal|
+| [INLONG-166](https://issues.apache.org/jira/browse/INLONG-166) | Hide `bdbStore` configs in master.ini |	Major|
+| [INLONG-167](https://issues.apache.org/jira/browse/INLONG-167) | Change to relative paths in default configs |	Trivial|
+| [INLONG-168](https://issues.apache.org/jira/browse/INLONG-168) | Example module: remove localhost IP configuration parameters |	Minor|
+| [INLONG-170](https://issues.apache.org/jira/browse/INLONG-170) | improve build/deployment/configuration for quick start |	Major|
+| [INLONG-196](https://issues.apache.org/jira/browse/INLONG-196) | use log to print exception |	Low|
+| [INLONG-201](https://issues.apache.org/jira/browse/INLONG-201) | [Website] Adjust user guide & fix demo example |	Major|
+| [INLONG-202](https://issues.apache.org/jira/browse/INLONG-202) | Add protobuf protocol syntax declaration |	Major|
+| [INLONG-213](https://issues.apache.org/jira/browse/INLONG-213) | Optimize code & Minor changes |	Low|
+| [INLONG-216](https://issues.apache.org/jira/browse/INLONG-216) | use ThreadUtil.sleep replace Thread.sleep |	Low|
+| [INLONG-222](https://issues.apache.org/jira/browse/INLONG-222) | Optimize code: Unnecessary boxing/unboxing conversion |	Normal|
+| [INLONG-224](https://issues.apache.org/jira/browse/INLONG-224) | Fixed: Unnecessary conversion to string inspection for server module |	Low|
+| [INLONG-226](https://issues.apache.org/jira/browse/INLONG-226) | Add Windows startup scripts |	High|
+| [INLONG-227](https://issues.apache.org/jira/browse/INLONG-227) | remove build guide in docker-build readme |	Major|
+| [INLONG-232](https://issues.apache.org/jira/browse/INLONG-232) | TubeBroker#register2Master, reconnect and wait |	Low|
+| [INLONG-234](https://issues.apache.org/jira/browse/INLONG-234) | Add .asf.yaml to change notifications |	Major|
+| [INLONG-235](https://issues.apache.org/jira/browse/INLONG-235) | Add code coverage supporting for pull request created. |	Normal|
+| [INLONG-237](https://issues.apache.org/jira/browse/INLONG-237) | add maven module build for docker image |	Major|
 
 ### BUG FIXES:
 | JIRA | Summary | Priority |
 |:---- |:---- | :--- |
-| [TUBEMQ-47](https://issues.apache.org/jira/browse/TUBEMQ-47) | Fix some typos |	Major|
-| [TUBEMQ-102](https://issues.apache.org/jira/browse/TUBEMQ-102) | Fix question [TUBEMQ-101] [Optimize code] |	Major|
-| [TUBEMQ-121](https://issues.apache.org/jira/browse/TUBEMQ-121) | Fix compilation alarm |	Major|
-| [TUBEMQ-139](https://issues.apache.org/jira/browse/TUBEMQ-139) | a bug in the equals method of the TubeClientConfig class |	Major|
-| [TUBEMQ-157](https://issues.apache.org/jira/browse/TUBEMQ-157) | Optimize Broker disk anomaly check |	Normal|
-| [TUBEMQ-158](https://issues.apache.org/jira/browse/TUBEMQ-158) | nextWithAuthInfo2B status should be managed independently according to Broker |	Normal|
-| [TUBEMQ-159](https://issues.apache.org/jira/browse/TUBEMQ-159) | Fix some typos |	Normal|
-| [TUBEMQ-165](https://issues.apache.org/jira/browse/TUBEMQ-165) | Remove unnecessary fiiles |	Major|
-| [TUBEMQ-205](https://issues.apache.org/jira/browse/TUBEMQ-205) | Duplicate dependency of jetty in tuber-server pom file |	Minor|
-| [TUBEMQ-206](https://issues.apache.org/jira/browse/TUBEMQ-206) | There are some residual files after executed unit tests |	Major|
-| [TUBEMQ-210](https://issues.apache.org/jira/browse/TUBEMQ-210) | Add log4j properties file for unit tests |	Minor|
-| [TUBEMQ-217](https://issues.apache.org/jira/browse/TUBEMQ-217) | UPdate the je download path |	Major|
-| [TUBEMQ-218](https://issues.apache.org/jira/browse/TUBEMQ-218) | build failed: Too many files with unapproved license |	Major|
-| [TUBEMQ-230](https://issues.apache.org/jira/browse/TUBEMQ-230) | TubeMQ run mvn test failed with openjdk version 13.0.2 |	Major|
-| [TUBEMQ-236](https://issues.apache.org/jira/browse/TUBEMQ-236) | Can't get dependencies from the maven repository |	Major|
-| [TUBEMQ-253](https://issues.apache.org/jira/browse/TUBEMQ-253) | tube-consumer fetch-worker cpu used too high |	Major|
-| [TUBEMQ-254](https://issues.apache.org/jira/browse/TUBEMQ-254) | support using different mapping port for standalone mode |	Major|
-| [TUBEMQ-265](https://issues.apache.org/jira/browse/TUBEMQ-265) | Unexpected broker disappearance in broker list after updating default broker metadata |	Major|
+| [INLONG-47](https://issues.apache.org/jira/browse/INLONG-47) | Fix some typos |	Major|
+| [INLONG-102](https://issues.apache.org/jira/browse/INLONG-102) | Fix question [INLONG-101] [Optimize code] |	Major|
+| [INLONG-121](https://issues.apache.org/jira/browse/INLONG-121) | Fix compilation alarm |	Major|
+| [INLONG-139](https://issues.apache.org/jira/browse/INLONG-139) | a bug in the equals method of the TubeClientConfig class |	Major|
+| [INLONG-157](https://issues.apache.org/jira/browse/INLONG-157) | Optimize Broker disk anomaly check |	Normal|
+| [INLONG-158](https://issues.apache.org/jira/browse/INLONG-158) | nextWithAuthInfo2B status should be managed independently according to Broker |	Normal|
+| [INLONG-159](https://issues.apache.org/jira/browse/INLONG-159) | Fix some typos |	Normal|
+| [INLONG-165](https://issues.apache.org/jira/browse/INLONG-165) | Remove unnecessary fiiles |	Major|
+| [INLONG-205](https://issues.apache.org/jira/browse/INLONG-205) | Duplicate dependency of jetty in tuber-server pom file |	Minor|
+| [INLONG-206](https://issues.apache.org/jira/browse/INLONG-206) | There are some residual files after executed unit tests |	Major|
+| [INLONG-210](https://issues.apache.org/jira/browse/INLONG-210) | Add log4j properties file for unit tests |	Minor|
+| [INLONG-217](https://issues.apache.org/jira/browse/INLONG-217) | UPdate the je download path |	Major|
+| [INLONG-218](https://issues.apache.org/jira/browse/INLONG-218) | build failed: Too many files with unapproved license |	Major|
+| [INLONG-230](https://issues.apache.org/jira/browse/INLONG-230) | TubeMQ run mvn test failed with openjdk version 13.0.2 |	Major|
+| [INLONG-236](https://issues.apache.org/jira/browse/INLONG-236) | Can't get dependencies from the maven repository |	Major|
+| [INLONG-253](https://issues.apache.org/jira/browse/INLONG-253) | tube-consumer fetch-worker cpu used too high |	Major|
+| [INLONG-254](https://issues.apache.org/jira/browse/INLONG-254) | support using different mapping port for standalone mode |	Major|
+| [INLONG-265](https://issues.apache.org/jira/browse/INLONG-265) | Unexpected broker disappearance in broker list after updating default broker metadata |	Major|
 
 ### TASK:
 | JIRA | Summary | Priority |
 |:---- |:---- | :--- |
-|[TUBEMQ-193](https://issues.apache.org/jira/browse/TUBEMQ-193)  | Update project document content |  Major |
+|[INLONG-193](https://issues.apache.org/jira/browse/INLONG-193)  | Update project document content |  Major |
 
 ### SUB-TASK:
 | JIRA | Summary | Priority |
 |:---- |:---- | :--- |
-|[TUBEMQ-123](https://issues.apache.org/jira/browse/TUBEMQ-123) | Batch flush data to disk |  Major |
-|[TUBEMQ-126](https://issues.apache.org/jira/browse/TUBEMQ-126) | Increase the unflushed data bytes control |  Major |
-|[TUBEMQ-140](https://issues.apache.org/jira/browse/TUBEMQ-140) | Remove the SSD auxiliary consumption function |  Major |
-|[TUBEMQ-160](https://issues.apache.org/jira/browse/TUBEMQ-160) | Improve the protocol between Broker and Master |  Major |
-|[TUBEMQ-169](https://issues.apache.org/jira/browse/TUBEMQ-169) | support build with docker image |  Major |
-|[TUBEMQ-171](https://issues.apache.org/jira/browse/TUBEMQ-171) | master and broker support config hostname with “localhost” or "127.0.0.1" or dns address |  Major |
-|[TUBEMQ-172](https://issues.apache.org/jira/browse/TUBEMQ-172) | simplify start/stop script |  Major |
-|[TUBEMQ-173](https://issues.apache.org/jira/browse/TUBEMQ-173) | change jvm memory parameters for default deployment |  Major |
-|[TUBEMQ-174](https://issues.apache.org/jira/browse/TUBEMQ-174) | hange defaule accessing url of web gui to http://your-master-ip:8080 |  Major |
-|[TUBEMQ-178](https://issues.apache.org/jira/browse/TUBEMQ-178) | change default IPs configuration to localhost |  Major |
-|[TUBEMQ-188](https://issues.apache.org/jira/browse/TUBEMQ-188) | the example for demo topic catch exception |  Major |
-|[TUBEMQ-194](https://issues.apache.org/jira/browse/TUBEMQ-194) | [website]Remove SSD auxiliary storage introduction |  Major |
-|[TUBEMQ-195](https://issues.apache.org/jira/browse/TUBEMQ-195) | [website] Adjust the content of the Chinese part of the document |  Major |
-|[TUBEMQ-198](https://issues.apache.org/jira/browse/TUBEMQ-198) | Support TubeMQ source for flink |  Major |
-|[TUBEMQ-199](https://issues.apache.org/jira/browse/TUBEMQ-199) | Support TubeMQ sink for flink |  Major |
-|[TUBEMQ-204](https://issues.apache.org/jira/browse/TUBEMQ-204) | Remove document address guideline |  Major |
-|[TUBEMQ-221](https://issues.apache.org/jira/browse/TUBEMQ-221) | make quick start doc more easy for reading |  Major |
-|[TUBEMQ-240](https://issues.apache.org/jira/browse/TUBEMQ-240) | add status command for broker/master script |  Major |
-|[TUBEMQ-241](https://issues.apache.org/jira/browse/TUBEMQ-241) | add helm chart for tubemq |  Major |
-|[TUBEMQ-242](https://issues.apache.org/jira/browse/TUBEMQ-242) | Support Table interface for TubeMQ flink connector |  Major |
-|[TUBEMQ-244](https://issues.apache.org/jira/browse/TUBEMQ-244) | tubemq web support access using proxy IP |  Major |
-|[TUBEMQ-246](https://issues.apache.org/jira/browse/TUBEMQ-246) | support register broker using hostname |  Major |
-|[TUBEMQ-295](https://issues.apache.org/jira/browse/TUBEMQ-295) | Modify CHANGES.md to add 0.5.0 version release modification |  Major |
-|[TUBEMQ-299](https://issues.apache.org/jira/browse/TUBEMQ-299) | Fix RAT check warnning |  Major |
-|[TUBEMQ-300](https://issues.apache.org/jira/browse/TUBEMQ-300) | Update LICENSE |  Major |
+|[INLONG-123](https://issues.apache.org/jira/browse/INLONG-123) | Batch flush data to disk |  Major |
+|[INLONG-126](https://issues.apache.org/jira/browse/INLONG-126) | Increase the unflushed data bytes control |  Major |
+|[INLONG-140](https://issues.apache.org/jira/browse/INLONG-140) | Remove the SSD auxiliary consumption function |  Major |
+|[INLONG-160](https://issues.apache.org/jira/browse/INLONG-160) | Improve the protocol between Broker and Master |  Major |
+|[INLONG-169](https://issues.apache.org/jira/browse/INLONG-169) | support build with docker image |  Major |
+|[INLONG-171](https://issues.apache.org/jira/browse/INLONG-171) | master and broker support config hostname with “localhost” or "127.0.0.1" or dns address |  Major |
+|[INLONG-172](https://issues.apache.org/jira/browse/INLONG-172) | simplify start/stop script |  Major |
+|[INLONG-173](https://issues.apache.org/jira/browse/INLONG-173) | change jvm memory parameters for default deployment |  Major |
+|[INLONG-174](https://issues.apache.org/jira/browse/INLONG-174) | hange defaule accessing url of web gui to http://your-master-ip:8080 |  Major |
+|[INLONG-178](https://issues.apache.org/jira/browse/INLONG-178) | change default IPs configuration to localhost |  Major |
+|[INLONG-188](https://issues.apache.org/jira/browse/INLONG-188) | the example for demo topic catch exception |  Major |
+|[INLONG-194](https://issues.apache.org/jira/browse/INLONG-194) | [website]Remove SSD auxiliary storage introduction |  Major |
+|[INLONG-195](https://issues.apache.org/jira/browse/INLONG-195) | [website] Adjust the content of the Chinese part of the document |  Major |
+|[INLONG-198](https://issues.apache.org/jira/browse/INLONG-198) | Support TubeMQ source for flink |  Major |
+|[INLONG-199](https://issues.apache.org/jira/browse/INLONG-199) | Support TubeMQ sink for flink |  Major |
+|[INLONG-204](https://issues.apache.org/jira/browse/INLONG-204) | Remove document address guideline |  Major |
+|[INLONG-221](https://issues.apache.org/jira/browse/INLONG-221) | make quick start doc more easy for reading |  Major |
+|[INLONG-240](https://issues.apache.org/jira/browse/INLONG-240) | add status command for broker/master script |  Major |
+|[INLONG-241](https://issues.apache.org/jira/browse/INLONG-241) | add helm chart for tubemq |  Major |
+|[INLONG-242](https://issues.apache.org/jira/browse/INLONG-242) | Support Table interface for TubeMQ flink connector |  Major |
+|[INLONG-244](https://issues.apache.org/jira/browse/INLONG-244) | tubemq web support access using proxy IP |  Major |
+|[INLONG-246](https://issues.apache.org/jira/browse/INLONG-246) | support register broker using hostname |  Major |
+|[INLONG-295](https://issues.apache.org/jira/browse/INLONG-295) | Modify CHANGES.md to add 0.5.0 version release modification |  Major |
+|[INLONG-299](https://issues.apache.org/jira/browse/INLONG-299) | Fix RAT check warnning |  Major |
+|[INLONG-300](https://issues.apache.org/jira/browse/INLONG-300) | Update LICENSE |  Major |
 
 
 
@@ -389,65 +389,65 @@
 
 | JIRA | Summary | Priority |
 |:---- |:---- | :--- |
-|[TUBEMQ-42](https://issues.apache.org/jira/browse/TUBEMQ-42) | Add peer information about message received	Major	New Feature |  Major|
+|[INLONG-42](https://issues.apache.org/jira/browse/INLONG-42) | Add peer information about message received	Major	New Feature |  Major|
 
 ### IMPROVEMENTS:
 | JIRA | Summary | Priority |
 |:---- |:---- | :--- |
-| [TUBEMQ-16](https://issues.apache.org/jira/browse/TUBEMQ-16) |Correct BdbStoreService#isPrimaryNodeActived to BdbStoreService#isPrimaryNodeActive|	Low|
-| [TUBEMQ-18](https://issues.apache.org/jira/browse/TUBEMQ-18) |Correct TMaster#idGenerater to TMaster#idGenerator|	Low|
-| [TUBEMQ-19](https://issues.apache.org/jira/browse/TUBEMQ-19) |Correct parameter names to fit in camel case|	Low|
-| [TUBEMQ-20](https://issues.apache.org/jira/browse/TUBEMQ-20) |Correct DefaultLoadBalancer#balance parameter	| Low|
-| [TUBEMQ-21](https://issues.apache.org/jira/browse/TUBEMQ-21) |Change version number from x.y-SNAPSHOT to x.y.z-incubating-SNAPSHOT|	Normal|
-| [TUBEMQ-22](https://issues.apache.org/jira/browse/TUBEMQ-22) |Correct ClientSubInfo#getTopicProcesser -> ClientSubInfo#getTopicProcessor|	Low|
-| [TUBEMQ-23](https://issues.apache.org/jira/browse/TUBEMQ-23) |Improve project README content introduction|	Major|
-| [TUBEMQ-24](https://issues.apache.org/jira/browse/TUBEMQ-24) |Add NOTICE and adjust LICENSE	| Major|
-| [TUBEMQ-26](https://issues.apache.org/jira/browse/TUBEMQ-26) |correct spelling (difftime-> diffTime)	|Low|
-| [TUBEMQ-27](https://issues.apache.org/jira/browse/TUBEMQ-27) |replace StringBuffer with StringBuilder |	Major|
-| [TUBEMQ-28](https://issues.apache.org/jira/browse/TUBEMQ-28) |ignore path error	|Major|
-| [TUBEMQ-29](https://issues.apache.org/jira/browse/TUBEMQ-29) |Change the package name to org.apache.tubemq.""	|Major|
-| [TUBEMQ-33](https://issues.apache.org/jira/browse/TUBEMQ-33) |refactor enum implement from annoymouse inner class	| Major|
-| [TUBEMQ-38](https://issues.apache.org/jira/browse/TUBEMQ-38) |Add Broker's running status check	| Major||
-| [TUBEMQ-39](https://issues.apache.org/jira/browse/TUBEMQ-39) |Optimize the loadMessageStores() logic	| Nor|mal|
-| [TUBEMQ-40](https://issues.apache.org/jira/browse/TUBEMQ-40) |Optimize message disk store classes's logic	| Major|
-| [TUBEMQ-43](https://issues.apache.org/jira/browse/TUBEMQ-43) |Add DeletePolicy's value check	| Major|
-| [TUBEMQ-44](https://issues.apache.org/jira/browse/TUBEMQ-44) |Remove unnecessary synchronized definition of shutdown () function	| Normal|
-| [TUBEMQ-49](https://issues.apache.org/jira/browse/TUBEMQ-49) |setTimeoutTime change to updTimeoutTime	| Major|
-| [TUBEMQ-50](https://issues.apache.org/jira/browse/TUBEMQ-50) |Replace fastjson to gson	| Major|
-| [TUBEMQ-7](https://issues.apache.org/jira/browse/TUBEMQ-7) | Using StringBuilder instead of StringBuffer in BaseResult	| Low|
-| [TUBEMQ-9](https://issues.apache.org/jira/browse/TUBEMQ-9) | Remove some unnecessary code	| Minor |
+| [INLONG-16](https://issues.apache.org/jira/browse/INLONG-16) |Correct BdbStoreService#isPrimaryNodeActived to BdbStoreService#isPrimaryNodeActive|	Low|
+| [INLONG-18](https://issues.apache.org/jira/browse/INLONG-18) |Correct TMaster#idGenerater to TMaster#idGenerator|	Low|
+| [INLONG-19](https://issues.apache.org/jira/browse/INLONG-19) |Correct parameter names to fit in camel case|	Low|
+| [INLONG-20](https://issues.apache.org/jira/browse/INLONG-20) |Correct DefaultLoadBalancer#balance parameter	| Low|
+| [INLONG-21](https://issues.apache.org/jira/browse/INLONG-21) |Change version number from x.y-SNAPSHOT to x.y.z-incubating-SNAPSHOT|	Normal|
+| [INLONG-22](https://issues.apache.org/jira/browse/INLONG-22) |Correct ClientSubInfo#getTopicProcesser -> ClientSubInfo#getTopicProcessor|	Low|
+| [INLONG-23](https://issues.apache.org/jira/browse/INLONG-23) |Improve project README content introduction|	Major|
+| [INLONG-24](https://issues.apache.org/jira/browse/INLONG-24) |Add NOTICE and adjust LICENSE	| Major|
+| [INLONG-26](https://issues.apache.org/jira/browse/INLONG-26) |correct spelling (difftime-> diffTime)	|Low|
+| [INLONG-27](https://issues.apache.org/jira/browse/INLONG-27) |replace StringBuffer with StringBuilder |	Major|
+| [INLONG-28](https://issues.apache.org/jira/browse/INLONG-28) |ignore path error	|Major|
+| [INLONG-29](https://issues.apache.org/jira/browse/INLONG-29) |Change the package name to org.apache.tubemq.""	|Major|
+| [INLONG-33](https://issues.apache.org/jira/browse/INLONG-33) |refactor enum implement from annoymouse inner class	| Major|
+| [INLONG-38](https://issues.apache.org/jira/browse/INLONG-38) |Add Broker's running status check	| Major||
+| [INLONG-39](https://issues.apache.org/jira/browse/INLONG-39) |Optimize the loadMessageStores() logic	| Nor|mal|
+| [INLONG-40](https://issues.apache.org/jira/browse/INLONG-40) |Optimize message disk store classes's logic	| Major|
+| [INLONG-43](https://issues.apache.org/jira/browse/INLONG-43) |Add DeletePolicy's value check	| Major|
+| [INLONG-44](https://issues.apache.org/jira/browse/INLONG-44) |Remove unnecessary synchronized definition of shutdown () function	| Normal|
+| [INLONG-49](https://issues.apache.org/jira/browse/INLONG-49) |setTimeoutTime change to updTimeoutTime	| Major|
+| [INLONG-50](https://issues.apache.org/jira/browse/INLONG-50) |Replace fastjson to gson	| Major|
+| [INLONG-7](https://issues.apache.org/jira/browse/INLONG-7) | Using StringBuilder instead of StringBuffer in BaseResult	| Low|
+| [INLONG-9](https://issues.apache.org/jira/browse/INLONG-9) | Remove some unnecessary code	| Minor |
 
 ### BUG FIXES:
 | JIRA | Summary | Priority |
 |:---- |:---- | :--- |
-| [TUBEMQ-10](https://issues.apache.org/jira/browse/TUBEMQ-10) |Fix Javadoc error|Low|
-| [TUBEMQ-14](https://issues.apache.org/jira/browse/TUBEMQ-14) |Some compilation errors|Major|
-| [TUBEMQ-15](https://issues.apache.org/jira/browse/TUBEMQ-15) |Correct typo in http_access_API_definition.md|Low|
-| [TUBEMQ-32](https://issues.apache.org/jira/browse/TUBEMQ-32) |File path not match with package name in tubemq-client module|Major|
-| [TUBEMQ-35](https://issues.apache.org/jira/browse/TUBEMQ-35) |check illegal package's field value|Normal|
-| [TUBEMQ-36](https://issues.apache.org/jira/browse/TUBEMQ-36) |Remove unnecessary removefirst() function printing|Normal|
-| [TUBEMQ-37](https://issues.apache.org/jira/browse/TUBEMQ-37) |Offset is set to 0 when Broker goes offline|Major|
-| [TUBEMQ-45](https://issues.apache.org/jira/browse/TUBEMQ-45) |Check groupName with checkHostName function|Major|
-| [TUBEMQ-48](https://issues.apache.org/jira/browse/TUBEMQ-48) |No timeout when setting consumer timeout|Major|
-| [TUBEMQ-59](https://issues.apache.org/jira/browse/TUBEMQ-59) |Null pointer exception is thrown while constructing ConsumerConfig with MasterInfo|Normal|
-| [TUBEMQ-62](https://issues.apache.org/jira/browse/TUBEMQ-62) |consumed and set consumerConfig.setConsumeModel (0) for the first time|Major|
-| [TUBEMQ-66](https://issues.apache.org/jira/browse/TUBEMQ-66) |TubeSingleSessionFactory shutdown bug|Normal|
-| [TUBEMQ-85](https://issues.apache.org/jira/browse/TUBEMQ-85) |There is NPE when creating PullConsumer with TubeSingleSessionFactory|Major|
-| [TUBEMQ-88](https://issues.apache.org/jira/browse/TUBEMQ-88) |Broker does not take effect after the deletePolicy value is changed|Major|
-| [TUBEMQ-149](https://issues.apache.org/jira/browse/TUBEMQ-149) |Some of the consumers stop consuming their corresponding partitions and never release the partition to others|Major|
-| [TUBEMQ-153](https://issues.apache.org/jira/browse/TUBEMQ-153) |update copyright notices year to 2020|  Major |
-| [TUBEMQ-165](https://issues.apache.org/jira/browse/TUBEMQ-165) |Remove unnecessary fiiles|  Major |
+| [INLONG-10](https://issues.apache.org/jira/browse/INLONG-10) |Fix Javadoc error|Low|
+| [INLONG-14](https://issues.apache.org/jira/browse/INLONG-14) |Some compilation errors|Major|
+| [INLONG-15](https://issues.apache.org/jira/browse/INLONG-15) |Correct typo in http_access_API_definition.md|Low|
+| [INLONG-32](https://issues.apache.org/jira/browse/INLONG-32) |File path not match with package name in tubemq-client module|Major|
+| [INLONG-35](https://issues.apache.org/jira/browse/INLONG-35) |check illegal package's field value|Normal|
+| [INLONG-36](https://issues.apache.org/jira/browse/INLONG-36) |Remove unnecessary removefirst() function printing|Normal|
+| [INLONG-37](https://issues.apache.org/jira/browse/INLONG-37) |Offset is set to 0 when Broker goes offline|Major|
+| [INLONG-45](https://issues.apache.org/jira/browse/INLONG-45) |Check groupName with checkHostName function|Major|
+| [INLONG-48](https://issues.apache.org/jira/browse/INLONG-48) |No timeout when setting consumer timeout|Major|
+| [INLONG-59](https://issues.apache.org/jira/browse/INLONG-59) |Null pointer exception is thrown while constructing ConsumerConfig with MasterInfo|Normal|
+| [INLONG-62](https://issues.apache.org/jira/browse/INLONG-62) |consumed and set consumerConfig.setConsumeModel (0) for the first time|Major|
+| [INLONG-66](https://issues.apache.org/jira/browse/INLONG-66) |TubeSingleSessionFactory shutdown bug|Normal|
+| [INLONG-85](https://issues.apache.org/jira/browse/INLONG-85) |There is NPE when creating PullConsumer with TubeSingleSessionFactory|Major|
+| [INLONG-88](https://issues.apache.org/jira/browse/INLONG-88) |Broker does not take effect after the deletePolicy value is changed|Major|
+| [INLONG-149](https://issues.apache.org/jira/browse/INLONG-149) |Some of the consumers stop consuming their corresponding partitions and never release the partition to others|Major|
+| [INLONG-153](https://issues.apache.org/jira/browse/INLONG-153) |update copyright notices year to 2020|  Major |
+| [INLONG-165](https://issues.apache.org/jira/browse/INLONG-165) |Remove unnecessary fiiles|  Major |
 
 ### TASK:
 | JIRA | Summary | Priority |
 |:---- |:---- | :--- |
-|[TUBEMQ-12](https://issues.apache.org/jira/browse/TUBEMQ-12)  |Change to use Apache License V2   |  Major |
+|[INLONG-12](https://issues.apache.org/jira/browse/INLONG-12)  |Change to use Apache License V2   |  Major |
 
 ### SUB-TASK:
 | JIRA | Summary | Priority |
 |:---- |:---- | :--- |
-|[TUBEMQ-130](https://issues.apache.org/jira/browse/TUBEMQ-130) |Generate CHANGES.md and DISCLAIMER-WIP   |  Major |
-|[TUBEMQ-133](https://issues.apache.org/jira/browse/TUBEMQ-133) |Add Apache parent pom |  Major |
-|[TUBEMQ-134](https://issues.apache.org/jira/browse/TUBEMQ-134) |add maven-source-plugin for generate source jar|  Major |
-|[TUBEMQ-135](https://issues.apache.org/jira/browse/TUBEMQ-135) |Refactoring all pom.xml|  Major |
-|[TUBEMQ-136](https://issues.apache.org/jira/browse/TUBEMQ-136) |Add LICENSE/NOTICE/DISCLAIMER-WIP to binary package|  Major |
+|[INLONG-130](https://issues.apache.org/jira/browse/INLONG-130) |Generate CHANGES.md and DISCLAIMER-WIP   |  Major |
+|[INLONG-133](https://issues.apache.org/jira/browse/INLONG-133) |Add Apache parent pom |  Major |
+|[INLONG-134](https://issues.apache.org/jira/browse/INLONG-134) |add maven-source-plugin for generate source jar|  Major |
+|[INLONG-135](https://issues.apache.org/jira/browse/INLONG-135) |Refactoring all pom.xml|  Major |
+|[INLONG-136](https://issues.apache.org/jira/browse/INLONG-136) |Add LICENSE/NOTICE/DISCLAIMER-WIP to binary package|  Major |
diff --git a/DISCLAIMER-WIP b/DISCLAIMER-WIP
index 6c72cf3..d777daa 100644
--- a/DISCLAIMER-WIP
+++ b/DISCLAIMER-WIP
@@ -1,4 +1,4 @@
-Apache TubeMQ is an effort undergoing incubation at The Apache Software Foundation (ASF),
+Apache InLong is an effort undergoing incubation at The Apache Software Foundation (ASF),
 sponsored by the Apache Incubator. Incubation is required of all newly accepted projects
 until a further review indicates that the infrastructure, communications, and decision
 making process have stabilized in a manner consistent with other successful ASF projects.
@@ -15,4 +15,4 @@ is likely to be incomplete):
 If you are planning to incorporate this work into your product/project, please be aware that
 you will need to conduct a thorough licensing review to determine the overall implications of
 including this work. For the current status of this project through the Apache Incubator
-visit: https://incubator.apache.org/projects/tubemq.html
\ No newline at end of file
+visit: https://incubator.apache.org/projects/inlong.html
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
index a883d4c..5ae2686 100644
--- a/LICENSE
+++ b/LICENSE
@@ -210,7 +210,7 @@
 1.1 Third party MIT license licenses
 =========
 
-1.1.1 resources/assets/lib/jquery.min.js
+1.1.1 inlong-tubemq/resources/assets/lib/jquery.min.js
  Source  : jquery 1.11.3
  License : https://github.com/jquery/jquery/blob/1.11.3/MIT-LICENSE.txt
 | Copyright 2014 jQuery Foundation and other contributors
@@ -237,7 +237,7 @@
 
 ----
 
-1.1.2 resources/assets/lib/DataTables/*
+1.1.2 inlong-tubemq/resources/assets/lib/DataTables/*
  Source  : datatables  1.10.7
  License : https://github.com/DataTables/DataTables/blob/1.10.7/license.txt
 | Copyright (c) 2008-2013 SpryMedia Limited
@@ -263,8 +263,8 @@
 
 ----
 
-1.1.3 resources/assets/public/css/style.css
-      resources/assets/public/css/ie.css
+1.1.3 inlong-tubemq/resources/assets/public/css/style.css
+      inlong-tubemq/resources/assets/public/css/ie.css
  Source  : Compass
  License :  https://github.com/Compass/compass/blob/stable/LICENSE.markdown
  | Copyright (c) 2009-2014 Christopher M. Eppstein
@@ -285,8 +285,8 @@
 1.2 Third party BSD 3-Clause license
 =========
 
-1.2.1 tubemq-client-twins/tubemq-client-cpp/src/any.h
-      tubemq-client-twins/tubemq-client-cpp/src/buffer.h
+1.2.1 inlong-tubemq/tubemq-client-twins/tubemq-client-cpp/src/any.h
+      inlong-tubemq/tubemq-client-twins/tubemq-client-cpp/src/buffer.h
  Source  : https://github.com/Qihoo360/evpp/blob/master/evpp/any.h version c5038a6
            https://github.com/Qihoo360/evpp/blob/master/evpp/buffer.h version b2535d7
  License : https://github.com/Qihoo360/evpp/blob/master/LICENSE
@@ -326,28 +326,32 @@
 1.3 Third party Apache 2.0 Licenses
 =========
 
-1.3.1 tubemq-server/src/main/java/org/apache/tubemq/server/common/utils/Bytes.java
-      tubemq-server/src/main/java/org/apache/tubemq/server/common/utils/HashedBytes.java
-      tubemq-server/src/main/java/org/apache/tubemq/server/common/utils/HasThread.java
-      tubemq-server/src/main/java/org/apache/tubemq/server/common/offsetstorage/zookeeper/RecoverableZooKeeper.java
-      tubemq-server/src/main/java/org/apache/tubemq/server/common/offsetstorage/zookeeper/ZooKeeperWatcher.java
-      tubemq-server/src/main/java/org/apache/tubemq/server/common/offsetstorage/zookeeper/ZooKeeperListener.java
-      tubemq-core/src/main/java/org/apache/tubemq/corebase/utils/ThreadUtils.java
-      tubemq-server/src/main/java/org/apache/tubemq/server/common/offsetstorage/zookeeper/ZooKeeperConnectionException.java
-      tubemq-server/src/main/java/org/apache/tubemq/server/master/utils/Chore.java
-      tubemq-server/src/main/java/org/apache/tubemq/server/common/offsetstorage/zookeeper/ZKUtil.java
-      tubemq-server/src/main/java/org/apache/tubemq/server/common/utils/RowLock.java
+1.3.1 inlong-tubemq/tubemq-server/src/main/java/org/apache/tubemq/server/common/utils/Bytes.java
+      inlong-tubemq/tubemq-server/src/main/java/org/apache/tubemq/server/common/utils/HashedBytes.java
+      inlong-tubemq/tubemq-server/src/main/java/org/apache/tubemq/server/common/utils/HasThread.java
+      inlong-tubemq/tubemq-server/src/main/java/org/apache/tubemq/server/common/offsetstorage/zookeeper/RecoverableZooKeeper.java
+      inlong-tubemq/tubemq-server/src/main/java/org/apache/tubemq/server/common/offsetstorage/zookeeper/ZooKeeperWatcher.java
+      inlong-tubemq/tubemq-server/src/main/java/org/apache/tubemq/server/common/offsetstorage/zookeeper/ZooKeeperListener.java
+      inlong-tubemq/tubemq-core/src/main/java/org/apache/tubemq/corebase/utils/ThreadUtils.java
+      inlong-tubemq/tubemq-server/src/main/java/org/apache/tubemq/server/common/offsetstorage/zookeeper/ZooKeeperConnectionException.java
+      inlong-tubemq/tubemq-server/src/main/java/org/apache/tubemq/server/master/utils/Chore.java
+      inlong-tubemq/tubemq-server/src/main/java/org/apache/tubemq/server/common/offsetstorage/zookeeper/ZKUtil.java
+      inlong-tubemq/tubemq-server/src/main/java/org/apache/tubemq/server/common/utils/RowLock.java
  Source  : hbase 0.94.27 (Please note that the software have been modified.)
  License : https://github.com/apache/hbase/blob/rel/0.94.27/LICENSE.txt
 
-1.3.2 tubemq-core/src/main/java/org/apache/tubemq/corerpc/netty/ByteBufferInputStream.java
-      tubemq-core/src/main/java/org/apache/tubemq/corerpc/netty/ByteBufferOutputStream.java
+1.3.2 inlong-tubemq/tubemq-core/src/main/java/org/apache/tubemq/corerpc/netty/ByteBufferInputStream.java
+      inlong-tubemq/tubemq-core/src/main/java/org/apache/tubemq/corerpc/netty/ByteBufferOutputStream.java
  Source  : Apache Avro 1.7.6
  License : https://github.com/apache/avro/blob/release-1.7.6/LICENSE.txt
 
-1.3.3 tubemq-client-twins/tubemq-client-cpp/src/future.h
+1.3.3 inlong-tubemq/tubemq-client-twins/tubemq-client-cpp/src/future.h
  Source  : Apache Pulsar
  License : https://github.com/apache/pulsar/blob/master/LICENSE
+ 
+1.3.4 codestyle/checkstyle.xml  
+ Source  :checkstyle 8.44 (Modified from src/main/resources/google_checks.xml)
+ License : https://github.com/checkstyle/checkstyle/blob/master/LICENSE.apache20
 
 ----
 
diff --git a/NOTICE b/NOTICE
index e451d38..bfe7504 100644
--- a/NOTICE
+++ b/NOTICE
@@ -1,4 +1,4 @@
-Apache TubeMQ
+Apache InLong
 Copyright 2019-2021 The Apache Software Foundation.
 
 This product includes software developed at
diff --git a/README.md b/README.md
index b7f8c68..65d36c7 100644
--- a/README.md
+++ b/README.md
@@ -1,21 +1,19 @@
-# Apache TubeMQ
-[![Build Status](https://travis-ci.org/apache/incubator-tubemq.svg?branch=master)](https://travis-ci.org/apache/incubator-tubemq)
-[![CodeCov](https://codecov.io/gh/apache/incubator-tubemq/branch/master/graph/badge.svg)](https://codecov.io/gh/apache/incubator-tubemq)
-[![Maven Central](https://maven-badges.herokuapp.com/maven-central/org.apache.tubemq/tubemq/badge.svg)](http://search.maven.org/#search%7Cga%7C1%7Corg.apache.tubemq)
-[![GitHub release](https://img.shields.io/badge/release-download-orange.svg)](https://tubemq.apache.org/en-us/docs/download/download.html)
+# Apache InLong
+[![Build Status](https://travis-ci.org/apache/incubator-inlong.svg?branch=master)](https://travis-ci.org/apache/incubator-inlong)
+[![CodeCov](https://codecov.io/gh/apache/incubator-inlong/branch/master/graph/badge.svg)](https://codecov.io/gh/apache/incubator-inlong)
+[![Maven Central](https://maven-badges.herokuapp.com/maven-central/org.apache.inlong/inlong/badge.svg)](http://search.maven.org/#search%7Cga%7C1%7Corg.apache.inlong)
+[![GitHub release](https://img.shields.io/badge/release-download-orange.svg)](https://inlong.apache.org/en-us/docs/download/download.html)
 [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html)
 
-[Apache TubeMQ](https://tubemq.apache.org)(incubating) is a trillion-records-scale distributed messaging queue (MQ) system, focuses on data transmission and storage under massive data. Compared to many open source MQ projects, TubeMQ has unique advantages in terms of stability, performance, and low cost.
+[Apache InLong](https://inlong.apache.org)(incubating) is a one-stop data streaming platform that provides automatic, secure, distributed, and efficient data publishing and subscription capabilities. This platform helps you easily build stream-based data applications.
 
 It offers a variety of features:
 
-* Pluggable transport protocols, such as TCP, SSL
-* Support big-data and streaming ecosystem integration
-* Message retroactivity by time or offset
-* Efficient pull and push consumption model
-* Flexible distributed scale-out deployment architecture
-* Feature-rich administrative dashboard for configuration
-* Authentication and authorization
+* Ease of Use
+* Stability & Reliability
+* Comprehensive Features
+* Service Integration
+* Scalability
 
 
 ## Contact us
@@ -24,19 +22,19 @@ It offers a variety of features:
 
     | Name                                                                          | Scope                           |                                                                 |                                                                     |                                                                              |
     |:------------------------------------------------------------------------------|:--------------------------------|:----------------------------------------------------------------|:--------------------------------------------------------------------|:-----------------------------------------------------------------------------|
-    | [dev@tubemq.apache.org](mailto:dev@tubemq.apache.org)     | Development-related discussions | [Subscribe](mailto:dev-subscribe@tubemq.apache.org)   | [Unsubscribe](mailto:dev-unsubscribe@tubemq.apache.org)   | [Archives](http://mail-archives.apache.org/mod_mbox/tubemq-dev/)   |
+    | [dev@inlong.apache.org](mailto:dev@inlong.apache.org)     | Development-related discussions | [Subscribe](mailto:dev-subscribe@inlong.apache.org)   | [Unsubscribe](mailto:dev-unsubscribe@inlong.apache.org)   | [Archives](http://mail-archives.apache.org/mod_mbox/inlong-dev/)   |
 
-- Home page: https://tubemq.apache.org
-- Issues: https://issues.apache.org/jira/browse/TubeMQ
+- Home page: https://inlong.apache.org
+- Issues: https://issues.apache.org/jira/browse/InLong
 
 
 ## Contributing
 
-We always welcome new contributions, whether for trivial cleanups, new features or other material rewards, more details see [here](https://tubemq.apache.org/en-us/docs/development/how-to-contribute.html).
+We always welcome new contributions, whether for trivial cleanups, new features or other material rewards, more details see [here](https://inlong.apache.org/en-us/docs/development/how-to-contribute.html).
 
 
 
-## Build TubeMQ
+## Build InLong
 
 ### Prerequisites
 
diff --git a/bin/broker.cmd b/bin/broker.cmd
deleted file mode 100644
index b53dbbc..0000000
--- a/bin/broker.cmd
+++ /dev/null
@@ -1,28 +0,0 @@
-REM Licensed to the Apache Software Foundation (ASF) under one or more
-REM contributor license agreements.  See the NOTICE file distributed with
-REM this work for additional information regarding copyright ownership.
-REM The ASF licenses this file to You under the Apache License, Version 2.0
-REM (the "License"); you may not use this file except in compliance with
-REM the License.  You may obtain a copy of the License at
-REM <p>
-REM http://www.apache.org/licenses/LICENSE-2.0
-REM <p>
-REM Unless required by applicable law or agreed to in writing, software
-REM distributed under the License is distributed on an "AS IS" BASIS,
-REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-REM See the License for the specific language governing permissions and
-REM limitations under the License.
-
-REM Windows Startup Script for Broker Node
-REM please do not change any command or variable in this script, check out
-REM env.cmd for details.
-
-setlocal
-call "%~dp0env.cmd"
-
-set BROKERMAIN=org.apache.tubemq.server.tools.BrokerStartup
-set BROKERCFG=%~dp0../conf/broker.ini
-
-echo on
-call %JAVA% %BROKER_JVM_OPTS% %GENERIC_ARGS% "%BROKERMAIN%" -f "%BROKERCFG%"
-endlocal
\ No newline at end of file
diff --git a/bin/env.cmd b/bin/env.cmd
deleted file mode 100644
index df52f5d..0000000
--- a/bin/env.cmd
+++ /dev/null
@@ -1,31 +0,0 @@
-REM Licensed to the Apache Software Foundation (ASF) under one or more
-REM contributor license agreements.  See the NOTICE file distributed with
-REM this work for additional information regarding copyright ownership.
-REM The ASF licenses this file to You under the Apache License, Version 2.0
-REM (the "License"); you may not use this file except in compliance with
-REM the License.  You may obtain a copy of the License at
-REM <p>
-REM http://www.apache.org/licenses/LICENSE-2.0
-REM <p>
-REM Unless required by applicable law or agreed to in writing, software
-REM distributed under the License is distributed on an "AS IS" BASIS,
-REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-REM See the License for the specific language governing permissions and
-REM limitations under the License.
-
-REM Windows Startup Script about Environment Settings
-REM Java runtime evironment could be specified here.
-
-set BASE_DIR=%~dp0..
-set CLASSPATH=%BASE_DIR%\lib\*;%BASE_DIR%\tubemq-server\target\*;%CLASSPATH%
-set GENERIC_ARGS="-Dtubemq.home=%BASE_DIR%" -cp "%CLASSPATH%" "-Dlog4j.configuration=file:%BASE_DIR%\conf\master.log4j.properties"
-
-REM If there's no system-wide JAVA_HOME or there's need to run on specific Java,
-REM please uncomment the following JAVA_HOME line, and specify the java home path.
-REM set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_241
-
-set JAVA="%JAVA_HOME%\bin\java"
-
-REM One may add extra Java runtime flags in addition to each role: Master or Broker
-set MASTER_JVM_OPTS=-Xmx1g -Xms256m -server
-set BROKER_JVM_OPTS=-Xmx1g -Xms512m -server
\ No newline at end of file
diff --git a/bin/env.sh b/bin/env.sh
deleted file mode 100644
index 4364993..0000000
--- a/bin/env.sh
+++ /dev/null
@@ -1,66 +0,0 @@
-#!/bin/bash
-
-#
-# 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.
-#
-
-#Config your java home
-#JAVA_HOME=/opt/jdk/
-
-if [ -z "$JAVA_HOME" ]; then
-  export JAVA=`which java`
-else
-  export JAVA="$JAVA_HOME/bin/java"
-fi
-
-tubemq_home=$BASE_DIR
-export CLASSPATH=$CLASSPATH:$BASE_DIR/conf:$(ls $BASE_DIR/lib/*.jar | tr '\n' :)
-
-#Master jvm args
-if [ -z "$MASTER_JVM_SIZE" ]; then
-  MASTER_JVM_SIZE="-Xmx10g -Xms6g"
-fi
-MASTER_JVM_ARGS="$MASTER_JVM_SIZE -server -Dtubemq.home=$tubemq_home -cp $CLASSPATH "
-#Broker jvm args
-if [ -z "$BROKER_JVM_SIZE" ]; then
-  BROKER_JVM_SIZE="-Xmx16g -Xms8g"
-fi
-BROKER_JVM_ARGS="$BROKER_JVM_SIZE -server -Dtubemq.home=$tubemq_home -cp $CLASSPATH "
-#Tools jvm args,you don't have to modify this at all.
-TOOLS_JVM_ARGS="-Xmx512m -Xms512m -Dtubemq.home=$tubemq_home -cp $CLASSPATH "
-#Tool repair jvm args
-TOOL_REPAIR_JVM_ARGS="-Xmx24g -Xms8g -Dtubemq.home=$tubemq_home -cp $CLASSPATH "
-
-if [ -z "$MASTER_ARGS" ]; then
-  export MASTER_ARGS="$MASTER_JVM_ARGS -Dlog4j.configuration=file:$BASE_DIR/conf/master.log4j.properties"
-fi
-
-if [ -z "$BROKER_ARGS" ]; then
-  export BROKER_ARGS="$BROKER_JVM_ARGS -Dlog4j.configuration=file:$BASE_DIR/conf/log4j.properties"
-fi
-
-if [ -z "$TOOLS_ARGS" ]; then
-  export TOOLS_ARGS="$TOOLS_JVM_ARGS -Dlog4j.configuration=file:$BASE_DIR/conf/tools.log4j.properties"
-fi
-
-if [ -z "$TOOL_REPAIR_ARGS" ]; then
-  export TOOL_REPAIR_ARGS="$TOOL_REPAIR_JVM_ARGS -Dlog4j.configuration=file:$BASE_DIR/conf/tools.log4j.properties"
-fi
-
-
-
-
-
diff --git a/bin/groupAdmin.sh b/bin/groupAdmin.sh
deleted file mode 100644
index a05cfa1..0000000
--- a/bin/groupAdmin.sh
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/bin/bash
-
-#
-# 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.
-#
-
-#project directory
-if [ -z "$BASE_DIR" ] ; then
-  PRG="$0"
-
-  # need this for relative symlinks
-  while [ -h "$PRG" ] ; do
-    ls=`ls -ld "$PRG"`
-    link=`expr "$ls" : '.*-> \(.*\)$'`
-    if expr "$link" : '/.*' > /dev/null; then
-      PRG="$link"
-    else
-      PRG="`dirname "$PRG"`/$link"
-    fi
-  done
-  BASE_DIR=`dirname "$PRG"`/..
-
-  # make it fully qualified
-  BASE_DIR=`cd "$BASE_DIR" && pwd`
-  #echo "TubeMQ master is at $BASE_DIR"
-fi
-source $BASE_DIR/bin/env.sh
-nohup $JAVA $TOOLS_ARGS  org.apache.tubemq.server.tools.BdbGroupAdmin $1 $2 $3 2>&1 &
-
-
diff --git a/bin/indexReBuilder.sh b/bin/indexReBuilder.sh
deleted file mode 100644
index 41a8396..0000000
--- a/bin/indexReBuilder.sh
+++ /dev/null
@@ -1,56 +0,0 @@
-#!/bin/bash
-
-#
-# 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.
-#
-
-#project directory
-if [ -z "$BASE_DIR" ] ; then
-  PRG="$0"
-
-  # need this for relative symlinks
-  while [ -h "$PRG" ] ; do
-    ls=`ls -ld "$PRG"`
-    link=`expr "$ls" : '.*-> \(.*\)$'`
-    if expr "$link" : '/.*' > /dev/null; then
-      PRG="$link"
-    else
-      PRG="`dirname "$PRG"`/$link"
-    fi
-  done
-  BASE_DIR=`dirname "$PRG"`/..
-
-  # make it fully qualified
-  BASE_DIR=`cd "$BASE_DIR" && pwd`
-  #echo "TubeMQ broker is at $BASE_DIR"
-fi
-source $BASE_DIR/bin/env.sh
-
-AS_USER=`whoami`
-LOG_DIR="$BASE_DIR/logs"
-LOG_FILE="$LOG_DIR/indexRepair.log"
-touch $LOG_FILE
-mkdir -p $LOG_DIR
-
-chown -R $AS_USER $LOG_DIR
-
-echo "Starting index file(s) repair..."
-
-nohup $JAVA $TOOL_REPAIR_ARGS  org.apache.tubemq.server.tools.StoreRepairAdmin $1 $2 2>&1 >>$LOG_FILE  &
-
-
-
-
diff --git a/bin/master.cmd b/bin/master.cmd
deleted file mode 100644
index b1446b0..0000000
--- a/bin/master.cmd
+++ /dev/null
@@ -1,28 +0,0 @@
-REM Licensed to the Apache Software Foundation (ASF) under one or more
-REM contributor license agreements.  See the NOTICE file distributed with
-REM this work for additional information regarding copyright ownership.
-REM The ASF licenses this file to You under the Apache License, Version 2.0
-REM (the "License"); you may not use this file except in compliance with
-REM the License.  You may obtain a copy of the License at
-REM <p>
-REM http://www.apache.org/licenses/LICENSE-2.0
-REM <p>
-REM Unless required by applicable law or agreed to in writing, software
-REM distributed under the License is distributed on an "AS IS" BASIS,
-REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-REM See the License for the specific language governing permissions and
-REM limitations under the License.
-
-REM Windows Startup Script for Master Node
-REM please do not change any command or variable in this script, check out
-REM env.cmd for details.
-
-setlocal
-call "%~dp0env.cmd"
-
-set MASTERMAIN=org.apache.tubemq.server.tools.MasterStartup
-set MASTERCFG=%~dp0..\conf\master.ini
-
-echo on
-call %JAVA% %MASTER_JVM_OPTS% %GENERIC_ARGS% "%MASTERMAIN%" -f "%MASTERCFG%"
-endlocal
\ No newline at end of file
diff --git a/bin/tubemq-broker-admin.sh b/bin/tubemq-broker-admin.sh
deleted file mode 100644
index b1cedf5..0000000
--- a/bin/tubemq-broker-admin.sh
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/bin/bash
-
-#
-# 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.
-#
-
-if [ -z "$BASE_DIR" ] ; then
-  PRG="$0"
-
-  # need this for relative symlinks
-  while [ -h "$PRG" ] ; do
-    ls=`ls -ld "$PRG"`
-    link=`expr "$ls" : '.*-> \(.*\)$'`
-    if expr "$link" : '/.*' > /dev/null; then
-      PRG="$link"
-    else
-      PRG="`dirname "$PRG"`/$link"
-    fi
-  done
-  BASE_DIR=`dirname "$PRG"`/..
-
-  # make it fully qualified
-  BASE_DIR=`cd "$BASE_DIR" && pwd`
-  #echo "TubeMQ master is at $BASE_DIR"
-fi
-source $BASE_DIR/bin/env.sh
-$JAVA $TOOLS_ARGS org.apache.tubemq.server.tools.cli.CliBrokerAdmin $@
diff --git a/bin/tubemq-consumer-test.sh b/bin/tubemq-consumer-test.sh
deleted file mode 100644
index 23292fb..0000000
--- a/bin/tubemq-consumer-test.sh
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/bin/bash
-
-#
-# 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.
-#
-
-if [ -z "$BASE_DIR" ] ; then
-  PRG="$0"
-
-  # need this for relative symlinks
-  while [ -h "$PRG" ] ; do
-    ls=`ls -ld "$PRG"`
-    link=`expr "$ls" : '.*-> \(.*\)$'`
-    if expr "$link" : '/.*' > /dev/null; then
-      PRG="$link"
-    else
-      PRG="`dirname "$PRG"`/$link"
-    fi
-  done
-  BASE_DIR=`dirname "$PRG"`/..
-
-  # make it fully qualified
-  BASE_DIR=`cd "$BASE_DIR" && pwd`
-  #echo "TubeMQ master is at $BASE_DIR"
-fi
-source $BASE_DIR/bin/env.sh
-$JAVA $TOOLS_ARGS org.apache.tubemq.server.tools.cli.CliConsumer $@
diff --git a/bin/tubemq-producer-test.sh b/bin/tubemq-producer-test.sh
deleted file mode 100644
index 0f96033..0000000
--- a/bin/tubemq-producer-test.sh
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/bin/bash
-
-#
-# 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.
-#
-
-if [ -z "$BASE_DIR" ] ; then
-  PRG="$0"
-
-  # need this for relative symlinks
-  while [ -h "$PRG" ] ; do
-    ls=`ls -ld "$PRG"`
-    link=`expr "$ls" : '.*-> \(.*\)$'`
-    if expr "$link" : '/.*' > /dev/null; then
-      PRG="$link"
-    else
-      PRG="`dirname "$PRG"`/$link"
-    fi
-  done
-  BASE_DIR=`dirname "$PRG"`/..
-
-  # make it fully qualified
-  BASE_DIR=`cd "$BASE_DIR" && pwd`
-  #echo "TubeMQ master is at $BASE_DIR"
-fi
-source $BASE_DIR/bin/env.sh
-$JAVA $TOOLS_ARGS org.apache.tubemq.server.tools.cli.CliProducer $@
diff --git a/bin/tubemq.sh b/bin/tubemq.sh
deleted file mode 100644
index 3f37541..0000000
--- a/bin/tubemq.sh
+++ /dev/null
@@ -1,178 +0,0 @@
-#!/bin/bash
-
-#
-# 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.
-#
-
-# project directory
-if [ -z "$BASE_DIR" ] ; then
-  PRG="$0"
-
-  # need this for relative symlinks
-  while [ -h "$PRG" ] ; do
-    ls=`ls -ld "$PRG"`
-    link=`expr "$ls" : '.*-> \(.*\)$'`
-    if expr "$link" : '/.*' > /dev/null; then
-      PRG="$link"
-    else
-      PRG="`dirname "$PRG"`/$link"
-    fi
-  done
-  BASE_DIR=`dirname "$PRG"`/..
-
-  # make it fully qualified
-  BASE_DIR=`cd "$BASE_DIR" && pwd`
-fi
-
-# load environmental variables
-source $BASE_DIR/bin/env.sh
-
-AS_USER=`whoami`
-LOG_DIR="$BASE_DIR/logs"
-PID_DIR="$BASE_DIR/logs"
-
-# check service running status
-function running(){
-  if [ -f "$PID_FILE" ]; then
-    pid=$(cat "$PID_FILE")
-    process=`ps aux | grep " $pid "|grep "\-Dtubemq\.home=$BASE_DIR" | grep -v grep`;
-    if [ "$process" == "" ]; then
-      return 1;
-    else
-      return 0;
-    fi
-  else
-    return 1
-  fi
-}
-
-# start the specified service
-function start_server() {
-  if running; then
-    echo "TubeMQ $SERVICE is running."
-    exit 1
-  fi
-
-  mkdir -p $PID_DIR
-  touch $LOG_FILE
-  mkdir -p $LOG_DIR
-  chown -R $AS_USER $PID_DIR
-  chown -R $AS_USER $LOG_DIR
-
-  config_files="-f $BASE_DIR/conf/$SERVICE.ini"
-
-  echo "Starting TubeMQ $SERVICE server..."
-  pushd .
-    cd $BASE_DIR
-    #echo "$JAVA $SERVICE_ARGS $SERVICE_CLASS $config_files"
-    sleep 1
-    nohup $JAVA $SERVICE_ARGS $SERVICE_CLASS $config_files 2>&1 >>$LOG_FILE &
-    echo $! > $PID_FILE
-    chmod 755 $PID_FILE
-  popd
-}
-
-# status of the specified service
-function status_server() {
-  if running; then
-    echo "TubeMQ $SERVICE is running."
-    exit 0
-  else
-    echo "TubeMQ $SERVICE is not running."
-    exit 1
-  fi
-}
-
-# stop the specified service
-function stop_server() {
-  if ! running; then
-    echo "TubeMQ $SERVICE is not running."
-    exit 1
-  fi
-  count=0
-  pid=$(cat $PID_FILE)
-  while running;
-  do
-    let count=$count+1
-    echo "Stopping TubeMQ $SERVICE $count times"
-    if [ $count -gt 10 ]; then
-      echo "kill -9 $pid"
-      kill -9 $pid
-    else
-      kill $pid
-    fi
-    sleep 6;
-  done
-  echo "Stop TubeMQ $SERVICE successfully."
-  rm $PID_FILE
-}
-
-# display usage
-function help() {
-  echo "Usage: tubemq {master|broker} {status|start|stop|restart}" >&2
-  echo "       status:      start the master/broker server"
-  echo "       start:      start the master/broker server"
-  echo "       stop:       stop the master/broker server"
-  echo "       restart:    restart the master/broker server"
-}
-
-# if less than two arguments supplied
-if [ $# -lt 2 ]; then
-  help;
-  exit 1;
-fi
-
-SERVICE=$1
-COMMAND=$2
-shift 2
-
-case $SERVICE in
-  master)
-    SERVICE_CLASS="org.apache.tubemq.server.tools.MasterStartup"
-    SERVICE_ARGS=$MASTER_ARGS
-    ;;
-  broker)
-    SERVICE_CLASS="org.apache.tubemq.server.tools.BrokerStartup"
-    SERVICE_ARGS=$BROKER_ARGS
-    ;;
-  *)
-    help;
-    exit 1;
-    ;;
-esac
-
-LOG_FILE="$LOG_DIR/$SERVICE.log"
-PID_FILE="$PID_DIR/.$SERVICE.run.pid"
-
-case $COMMAND in
-  status)
-    status_server $@;
-    ;;
-  start)
-    start_server $@;
-    ;;
-  stop)
-    stop_server $@;
-    ;;
-  restart)
-    $0 $SERVICE stop $@
-    $0 $SERVICE start $@
-    ;;
-  *)
-    help;
-    exit 1;
-    ;;
-esac
diff --git a/codestyle/checkstyle.xml b/codestyle/checkstyle.xml
index 3d30c02..b478134 100644
--- a/codestyle/checkstyle.xml
+++ b/codestyle/checkstyle.xml
@@ -1,418 +1,413 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-// 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.
--->
+<?xml version="1.0"?>
 <!DOCTYPE module PUBLIC
-        "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
-        "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
+          "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
+          "https://checkstyle.org/dtds/configuration_1_3.dtd">
 
-<!-- This is a checkstyle configuration file. For descriptions of
-what the following rules do, please see the checkstyle configuration
-page at http://checkstyle.sourceforge.net/config.html -->
+<!--
+    Checkstyle configuration that checks the Google coding conventions from Google Java Style
+    that can be found at https://google.github.io/styleguide/javaguide.html
 
-<module name="Checker">
+    Checkstyle is very configurable. Be sure to read the documentation at
+    http://checkstyle.org (or in your downloaded distribution).
 
-    <module name="FileTabCharacter">
-        <!-- Checks that there are no tab characters in the file. -->
-    </module>
+    To completely disable a check, just comment it out or delete it from the file.
+    To suppress certain violations please review suppression filters.
 
-    <module name="RegexpSingleline">
-        <!-- Checks that TODOs don't have stuff in parenthesis, e.g., username. -->
-        <property name="format" value="((//.*)|(\*.*))TODO\(" />
-        <property name="message" value="TODO comments must not include usernames." />
-        <property name="severity" value="error" />
-    </module>
+    Authors: Max Vetrenko, Ruslan Diachenko, Roman Ivanov.
+ -->
 
-    <module name="RegexpSingleline">
-        <property name="format" value="\s+$"/>
-        <property name="message" value="Trailing whitespace"/>
-        <property name="severity" value="error"/>
-    </module>
+<module name = "Checker">
+    <property name="charset" value="UTF-8"/>
+    <property name="localeCountry" value="ZH"/>
+    <property name="localeLanguage" value="zh"/>
 
-    <module name="RegexpSingleline">
-        <property name="format" value="Throwables.propagate\("/>
-        <property name="message" value="Throwables.propagate is deprecated"/>
-        <property name="severity" value="error"/>
-    </module>
+    <property name="severity" value="error"/>
 
-    <!-- Prevent *Tests.java as tools may not pick them up -->
-    <module name="RegexpOnFilename">
-        <property name="fileNamePattern" value=".*Tests\.java$" />
+    <property name="fileExtensions" value="java, properties, xml"/>
+    <!-- Excludes all 'module-info.java' files              -->
+    <!-- See https://checkstyle.org/config_filefilters.html -->
+    <module name="BeforeExecutionExclusionFileFilter">
+        <property name="fileNamePattern" value="module\-info\.java$"/>
     </module>
-
+    <!-- https://checkstyle.org/config_filters.html#SuppressionFilter -->
     <module name="SuppressionFilter">
-        <property name="file" value="${checkstyle.suppressions.file}" default="suppressions.xml" />
+        <property name="file" value="${org.checkstyle.google.suppressionfilter.config}"
+                  default="checkstyle-suppressions.xml" />
+        <property name="optional" value="true"/>
     </module>
-
-    <!-- Allow use of comment to suppress javadocstyle -->
-    <module name="SuppressionCommentFilter">
-        <property name="offCommentFormat" value="CHECKSTYLE.OFF\: ([\w\|]+)"/>
-        <property name="onCommentFormat" value="CHECKSTYLE.ON\: ([\w\|]+)"/>
-        <property name="checkFormat" value="$1"/>
+    <!-- new add -->
+    <module name="SuppressWarningsFilter" />
+    <!-- Checks for whitespace                               -->
+    <!-- See http://checkstyle.org/config_whitespace.html -->
+    <module name="FileTabCharacter">
+        <property name="eachLine" value="true"/>
+    </module>
+    <module name="LineLength">
+        <property name="fileExtensions" value="java"/>
+        <property name="max" value="120"/>
+        <property name="ignorePattern" value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
+    </module>
+    <!-- new add -->
+    <module name="FileLength">
+            <property name="max" value="3000"/>
     </module>
-
-    <!-- All Java AST specific tests live under TreeWalker module. -->
     <module name="TreeWalker">
-
-        <!-- Check indentation. More configuration
-             see also https://checkstyle.org/config_misc.html#Indentation
-        -->
-        <module name="Indentation"/>
-
-        <module name="TodoComment">
-            <!-- Checks that disallowed strings are not used in comments.  -->
-            <property name="format" value="(FIXME)|(XXX)|(@author)" />
-        </module>
-
-        <!--
-
-        IMPORT CHECKS
-
-        -->
-
-        <module name="RedundantImport">
-            <!-- Checks for redundant import statements. -->
-            <property name="severity" value="error"/>
-            <message key="import.redundancy"
-                     value="Redundant import {0}."/>
-        </module>
-
-        <module name="ImportOrder">
-            <property name="severity" value="error"/>
-            <!-- This ensures that static imports go first. -->
-            <property name="option" value="top"/>
-            <property name="sortStaticImportsAlphabetically" value="true"/>
-            <property name="tokens" value="STATIC_IMPORT, IMPORT"/>
-            <message key="import.ordering"
-                     value="Import {0} appears after other imports that it should precede"/>
+        <!-- new add -->
+        <module name="SuppressWarningsHolder" />
+        <!-- new add -->
+        <module name="SuppressionCommentFilter"/>
+
+        <module name="OuterTypeFilename"/>
+        <module name="IllegalTokenText">
+            <property name="tokens" value="STRING_LITERAL, CHAR_LITERAL"/>
+            <property name="format"
+             value="\\u00(09|0(a|A)|0(c|C)|0(d|D)|22|27|5(C|c))|\\(0(10|11|12|14|15|42|47)|134)"/>
+            <property name="message"
+             value="Consider using special escape sequence instead of octal value or Unicode escaped value."/>
+        </module>
+        <module name="AvoidEscapedUnicodeCharacters">
+            <property name="allowEscapesForControlCharacters" value="true"/>
+            <property name="allowByTailComment" value="true"/>
+            <property name="allowNonPrintableEscapes" value="true"/>
+        </module>
+        <module name="AvoidStarImport"/>
+        <module name="OneTopLevelClass"/>
+        <module name="NoLineWrap">
+            <property name="tokens" value="PACKAGE_DEF, IMPORT, STATIC_IMPORT"/>
+        </module>
+        <module name="EmptyBlock">
+            <property name="option" value="TEXT"/>
+            <property name="tokens"
+             value="LITERAL_TRY, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_SWITCH"/>
         </module>
-
-        <module name="AvoidStarImport">
-            <property name="severity" value="error"/>
+        <module name="NeedBraces">
+            <property name="tokens"
+             value="LITERAL_DO, LITERAL_ELSE, LITERAL_FOR, LITERAL_IF, LITERAL_WHILE"/>
         </module>
-
-        <module name="IllegalImport">
-            <property name="illegalPkgs" value="autovalue.shaded, avro.shaded, bk-shade, com.google.api.client.repackaged, com.google.appengine.repackaged, io.netty.util.internal"/>
+        <module name="LeftCurly">
+            <property name="tokens"
+             value="ANNOTATION_DEF, CLASS_DEF, CTOR_DEF, ENUM_CONSTANT_DEF, ENUM_DEF,
+                    INTERFACE_DEF, LAMBDA, LITERAL_CASE, LITERAL_CATCH, LITERAL_DEFAULT,
+                    LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY, LITERAL_FOR, LITERAL_IF,
+                    LITERAL_SWITCH, LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE, METHOD_DEF,
+                    OBJBLOCK, STATIC_INIT"/>
         </module>
-
-        <module name="RedundantModifier">
-            <!-- Checks for redundant modifiers on various symbol definitions.
-              See: http://checkstyle.sourceforge.net/config_modifier.html#RedundantModifier
-            -->
-            <property name="tokens" value="VARIABLE_DEF, ANNOTATION_FIELD_DEF, INTERFACE_DEF, CLASS_DEF, ENUM_DEF"/>
+        <module name="RightCurly">
+            <property name="id" value="RightCurlySame"/>
+            <property name="tokens"
+             value="LITERAL_TRY, LITERAL_CATCH, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE,
+                    LITERAL_DO"/>
         </module>
-
-        <!--
-             Require static importing from Preconditions.
-        -->
-        <module name="RegexpSinglelineJava">
-            <property name="format" value="^import com.google.common.base.Preconditions;$"/>
-            <property name="message" value="Static import functions from Guava Preconditions"/>
+        <module name="RightCurly">
+            <property name="id" value="RightCurlyAlone"/>
+            <property name="option" value="alone"/>
+            <property name="tokens"
+             value="CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, STATIC_INIT,
+                    INSTANCE_INIT, ANNOTATION_DEF, ENUM_DEF"/>
         </module>
-
-        <module name="UnusedImports">
-            <property name="severity" value="error"/>
-            <property name="processJavadoc" value="true"/>
-            <message key="import.unused"
-                     value="Unused import: {0}."/>
+        <module name="WhitespaceAround">
+            <property name="allowEmptyConstructors" value="true"/>
+            <property name="allowEmptyLambdas" value="true"/>
+            <property name="allowEmptyMethods" value="true"/>
+            <property name="allowEmptyTypes" value="true"/>
+            <property name="allowEmptyLoops" value="true"/>
+            <property name="tokens"
+             value="ASSIGN, BAND, BAND_ASSIGN, BOR, BOR_ASSIGN, BSR, BSR_ASSIGN, BXOR,
+                    BXOR_ASSIGN, COLON, DIV, DIV_ASSIGN, DO_WHILE, EQUAL, GE, GT, LAMBDA, LAND,
+                    LCURLY, LE, LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY,
+                    LITERAL_FOR, LITERAL_IF, LITERAL_RETURN, LITERAL_SWITCH, LITERAL_SYNCHRONIZED,
+                     LITERAL_TRY, LITERAL_WHILE, LOR, LT, MINUS, MINUS_ASSIGN, MOD, MOD_ASSIGN,
+                     NOT_EQUAL, PLUS, PLUS_ASSIGN, QUESTION, RCURLY, SL, SLIST, SL_ASSIGN, SR,
+                     SR_ASSIGN, STAR, STAR_ASSIGN, LITERAL_ASSERT, TYPE_EXTENSION_AND"/>
+            <message key="ws.notFollowed"
+             value="WhitespaceAround: ''{0}'' is not followed by whitespace. Empty blocks may only be represented as '{}' when not part of a multi-block statement (4.1.3)"/>
+            <message key="ws.notPreceded"
+             value="WhitespaceAround: ''{0}'' is not preceded with whitespace."/>
+        </module>
+        <module name="OneStatementPerLine"/>
+        <module name="MultipleVariableDeclarations"/>
+        <module name="ArrayTypeStyle"/>
+<!--        <module name="MissingSwitchDefault"/>-->
+        <module name="FallThrough"/>
+        <module name="UpperEll"/>
+        <module name="ModifierOrder"/>
+        <module name="EmptyLineSeparator">
+            <property name="tokens"
+             value="PACKAGE_DEF, IMPORT, STATIC_IMPORT, CLASS_DEF, INTERFACE_DEF, ENUM_DEF,
+                    STATIC_INIT, INSTANCE_INIT, METHOD_DEF, CTOR_DEF, VARIABLE_DEF"/>
+            <property name="allowNoEmptyLineBetweenFields" value="true"/>
+        </module>
+        <module name="SeparatorWrap">
+            <property name="id" value="SeparatorWrapDot"/>
+            <property name="tokens" value="DOT"/>
+            <property name="option" value="nl"/>
+        </module>
+        <module name="SeparatorWrap">
+            <property name="id" value="SeparatorWrapComma"/>
+            <property name="tokens" value="COMMA"/>
+            <property name="option" value="EOL"/>
+        </module>
+        <module name="SeparatorWrap">
+            <!-- ELLIPSIS is EOL until https://github.com/google/styleguide/issues/258 -->
+            <property name="id" value="SeparatorWrapEllipsis"/>
+            <property name="tokens" value="ELLIPSIS"/>
+            <property name="option" value="EOL"/>
+        </module>
+        <module name="SeparatorWrap">
+            <!-- ARRAY_DECLARATOR is EOL until https://github.com/google/styleguide/issues/259 -->
+            <property name="id" value="SeparatorWrapArrayDeclarator"/>
+            <property name="tokens" value="ARRAY_DECLARATOR"/>
+            <property name="option" value="EOL"/>
+        </module>
+        <module name="SeparatorWrap">
+            <property name="id" value="SeparatorWrapMethodRef"/>
+            <property name="tokens" value="METHOD_REF"/>
+            <property name="option" value="nl"/>
         </module>
-
-<!--        TODO We ignore JAVADOC related checker _for now_ and -->
-<!--        it is hopefully we enable this section -->
-<!--        once our documentation is formally completed. -->
-
-<!--        &lt;!&ndash;-->
-
-<!--        JAVADOC CHECKS-->
-
-<!--        &ndash;&gt;-->
-
-<!--        &lt;!&ndash; Checks for Javadoc comments.                     &ndash;&gt;-->
-<!--        &lt;!&ndash; See http://checkstyle.sf.net/config_javadoc.html &ndash;&gt;-->
-<!--        <module name="JavadocMethod">-->
-<!--            <property name="scope" value="protected"/>-->
-<!--            <property name="severity" value="error"/>-->
-<!--            <property name="allowMissingJavadoc" value="true"/>-->
-<!--            <property name="allowMissingParamTags" value="true"/>-->
-<!--            <property name="allowMissingReturnTag" value="true"/>-->
-<!--            <property name="allowMissingThrowsTags" value="true"/>-->
-<!--            <property name="allowThrowsTagsForSubclasses" value="true"/>-->
-<!--            <property name="allowUndeclaredRTE" value="true"/>-->
-<!--        </module>-->
-
-<!--        &lt;!&ndash; Check that paragraph tags are used correctly in Javadoc. &ndash;&gt;-->
-<!--        <module name="JavadocParagraph"/>-->
-
-<!--        <module name="JavadocType">-->
-<!--            <property name="scope" value="protected"/>-->
-<!--            <property name="severity" value="error"/>-->
-<!--            <property name="allowMissingParamTags" value="true"/>-->
-<!--        </module>-->
-
-<!--        <module name="JavadocStyle">-->
-<!--            <property name="severity" value="error"/>-->
-<!--            <property name="checkHtml" value="true"/>-->
-<!--        </module>-->
-
-        <!--
-
-        NAMING CHECKS
-
-        -->
-
-        <!-- Adhere to generally accepted naming conventions -->
-
         <module name="PackageName">
-            <!-- Validates identifiers for package names against the
-              supplied expression. -->
-            <!-- Here the default checkstyle rule restricts package name parts to
-              seven characters, this is not in line with common practice at Google.
-            -->
-            <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]{1,})*$"/>
-            <property name="severity" value="error"/>
-        </module>
-
-        <module name="TypeNameCheck">
-            <!-- Validates static, final fields against the
-            expression "^[A-Z][a-zA-Z0-9]*$". -->
-            <metadata name="altname" value="TypeName"/>
-            <property name="severity" value="error"/>
-        </module>
-
-        <module name="ConstantNameCheck">
-            <!-- Validates non-private, static, final fields against the supplied
-            public/package final fields "^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$". -->
-            <metadata name="altname" value="ConstantName"/>
-            <property name="applyToPublic" value="true"/>
-            <property name="applyToProtected" value="true"/>
-            <property name="applyToPackage" value="true"/>
-            <property name="applyToPrivate" value="false"/>
-            <property name="format" value="^([A-Z][A-Za-z0-9_]*|FLAG_.*)$"/>
+            <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
             <message key="name.invalidPattern"
-                     value="Variable ''{0}'' should be in ALL_CAPS (if it is a constant) or be private (otherwise)."/>
-            <property name="severity" value="error"/>
+             value="Package name ''{0}'' must match pattern ''{1}''."/>
         </module>
-
-        <module name="StaticVariableNameCheck">
-            <!-- Validates static, non-final fields against the supplied
-            expression "^[a-z][a-zA-Z0-9]*_?$". -->
-            <metadata name="altname" value="StaticVariableName"/>
-            <property name="applyToPublic" value="true"/>
-            <property name="applyToProtected" value="true"/>
-            <property name="applyToPackage" value="true"/>
-            <property name="applyToPrivate" value="true"/>
-            <property name="format" value="^[a-z][a-zA-Z0-9]*_?$"/>
-            <property name="severity" value="error"/>
+        <module name="TypeName">
+            <property name="tokens" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, ANNOTATION_DEF"/>
+            <message key="name.invalidPattern"
+             value="Type name ''{0}'' must match pattern ''{1}''."/>
         </module>
-
-        <module name="MemberNameCheck">
-            <!-- Validates non-static members against the supplied expression. -->
-            <metadata name="altname" value="MemberName"/>
-            <property name="applyToPublic" value="true"/>
-            <property name="applyToProtected" value="true"/>
-            <property name="applyToPackage" value="true"/>
-            <property name="applyToPrivate" value="true"/>
+        <module name="MemberName">
+            <!--
+            <property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/>
+            -->
             <property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
-            <property name="severity" value="error"/>
+            <message key="name.invalidPattern"
+             value="Member name ''{0}'' must match pattern ''{1}''."/>
         </module>
-
-        <module name="MethodNameCheck">
-            <!-- Validates identifiers for method names. -->
-            <metadata name="altname" value="MethodName"/>
+        <module name="ParameterName">
+            <!--
+            <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
+            -->
             <property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
-            <property name="severity" value="error"/>
+            <message key="name.invalidPattern"
+             value="Parameter name ''{0}'' must match pattern ''{1}''."/>
         </module>
-
-        <module name="ParameterName">
-            <!-- Validates identifiers for method parameters against the
-              expression "^[a-z][a-zA-Z0-9]*$". -->
-            <property name="severity" value="error"/>
+        <module name="LambdaParameterName">
+            <!--
+            <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
+            -->
+            <property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
+            <message key="name.invalidPattern"
+                     value="Lambda parameter name ''{0}'' must match pattern ''{1}''."/>
         </module>
-
-        <module name="LocalFinalVariableName">
-            <!-- Validates identifiers for local final variables against the
-              expression "^[a-z][a-zA-Z0-9]*$". -->
-            <property name="severity" value="error"/>
+        <module name="CatchParameterName">
+            <!--
+            <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
+            -->
+            <property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
+            <message key="name.invalidPattern"
+             value="Catch parameter name ''{0}'' must match pattern ''{1}''."/>
         </module>
-
         <module name="LocalVariableName">
-            <!-- Validates identifiers for local variables against the
-              expression "^[a-z][a-zA-Z0-9]*$". -->
-            <property name="severity" value="error"/>
+            <!--
+            <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
+            -->
+            <property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
+            <message key="name.invalidPattern"
+             value="Local variable name ''{0}'' must match pattern ''{1}''."/>
         </module>
-
         <module name="ClassTypeParameterName">
-            <property name="format" value="^(([A-Z][0-9]*)|([A-Z][a-z][a-zA-Z]*))$"/>
-            <property name="severity" value="error"/>
+            <!-- new add -->
+            <!--
+            <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
+            -->
+            <property name="format" value="^[A-Z][a-zA-Z0-9]*$"/>
+            <message key="name.invalidPattern"
+             value="Class type name ''{0}'' must match pattern ''{1}''."/>
         </module>
-
         <module name="MethodTypeParameterName">
-            <property name="format" value="^(([A-Z][0-9]*)|([A-Z][a-z][a-zA-Z]*T))$"/>
-            <property name="severity" value="error"/>
+            <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
+            <message key="name.invalidPattern"
+             value="Method type name ''{0}'' must match pattern ''{1}''."/>
         </module>
-
         <module name="InterfaceTypeParameterName">
-            <property name="format" value="^(([A-Z][0-9]*)|([A-Z][a-z][a-zA-Z]*T))$"/>
-            <property name="severity" value="error"/>
-        </module>
-
-        <!--
-
-        LENGTH and CODING CHECKS
-
-        -->
-
-        <module name="LineLength">
-            <!-- Checks if a line is too long. -->
-            <property name="max" value="120"/>
-            <property name="severity" value="error"/>
-
+            <!-- new add -->
             <!--
-              The default ignore pattern exempts the following elements:
-                - import statements
-                - long URLs inside comments
+            <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
             -->
-
-            <property name="ignorePattern"
-                      value="^(package .*;\s*)|(import .*;\s*)|( *\* .*https?://.*)$"/>
-        </module>
-
-        <module name="LeftCurly">
-            <!-- Checks for placement of the left curly brace ('{'). -->
-            <property name="severity" value="error"/>
-        </module>
-
-        <module name="RightCurly">
-            <!-- Checks right curlies on CATCH, ELSE, and TRY blocks are on
-            the same line. e.g., the following example is fine:
-            <pre>
-              if {
-                ...
-              } else
-            </pre>
-            -->
-            <!-- This next example is not fine:
-            <pre>
-              if {
-                ...
-              }
-              else
-            </pre>
+            <property name="format" value="^[A-Z][a-zA-Z0-9]*$"/>
+            <message key="name.invalidPattern"
+             value="Interface type name ''{0}'' must match pattern ''{1}''."/>
+        </module>
+        <module name="NoFinalizer"/>
+        <module name="GenericWhitespace">
+            <message key="ws.followed"
+             value="GenericWhitespace ''{0}'' is followed by whitespace."/>
+            <message key="ws.preceded"
+             value="GenericWhitespace ''{0}'' is preceded with whitespace."/>
+            <message key="ws.illegalFollow"
+             value="GenericWhitespace ''{0}'' should followed by whitespace."/>
+            <message key="ws.notPreceded"
+             value="GenericWhitespace ''{0}'' is not preceded with whitespace."/>
+        </module>
+        <module name="Indentation">
+            <!--
+            <property name="basicOffset" value="4"/>
+            <property name="braceAdjustment" value="0"/>
+            <property name="caseIndent" value="4"/>
+            <property name="throwsIndent" value="4"/>
+            <property name="lineWrappingIndentation" value="4"/>
+            <property name="arrayInitIndent" value="4"/>
             -->
-            <property name="option" value="same"/>
-            <property name="severity" value="error"/>
-        </module>
-
-        <!-- Checks for braces around if and else blocks -->
-        <module name="NeedBraces">
-            <property name="severity" value="error"/>
-            <property name="tokens" value="LITERAL_IF, LITERAL_ELSE, LITERAL_FOR, LITERAL_WHILE, LITERAL_DO"/>
+            <!-- new add, because checkstyle does not fix some indentation scenes,
+                			choose to block the rules first
+							https://github.com/checkstyle/checkstyle/issues/3342
+             -->
+
+            <property name="severity" value="ignore"/>
+
+            <property name="basicOffset" value="4"/>
+            <property name="braceAdjustment" value="0"/>
+            <property name="caseIndent" value="4"/>
+            <property name="throwsIndent" value="8"/>
+            <property name="lineWrappingIndentation" value="8"/>
+            <property name="arrayInitIndent" value="4"/>
+        </module>
+        <module name="AbbreviationAsWordInName">
+            <!-- new add -->
+            <property name="severity" value="ignore"/>
+            <property name="ignoreFinal" value="false"/>
+            <property name="allowedAbbreviationLength" value="1"/>
+            <property name="tokens"
+             value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, ANNOTATION_DEF, ANNOTATION_FIELD_DEF,
+                    PARAMETER_DEF, VARIABLE_DEF, METHOD_DEF"/>
         </module>
-
-        <module name="UpperEll">
-            <!-- Checks that long constants are defined with an upper ell.-->
-            <property name="severity" value="error"/>
+        <!--
+        <module name="DeclarationOrder">
+        -->
+        <module name="OverloadMethodsDeclarationOrder"/>
+        <module name="VariableDeclarationUsageDistance"/>
+        <module name="CustomImportOrder">
+             <!-- new add -->
+            <property name="severity" value="ignore"/>
+            <property name="sortImportsInGroupAlphabetically" value="true"/>
+            <property name="separateLineBetweenGroups" value="true"/>
+            <property name="customImportOrderRules" value="STATIC###THIRD_PARTY_PACKAGE"/>
+            <property name="tokens" value="IMPORT, STATIC_IMPORT, PACKAGE_DEF"/>
+        </module>
+        <module name="MethodParamPad">
+            <property name="tokens"
+             value="CTOR_DEF, LITERAL_NEW, METHOD_CALL, METHOD_DEF,
+                    SUPER_CTOR_CALL, ENUM_CONSTANT_DEF"/>
         </module>
-
-        <module name="FallThrough">
-            <!-- Warn about falling through to the next case statement.  Similar to
-            javac -Xlint:fallthrough, but the check is suppressed if a single-line comment
-            on the last non-blank line preceding the fallen-into case contains 'fall through' (or
-            some other variants that we don't publicized to promote consistency).
-            -->
-            <property name="reliefPattern"
-                      value="fall through|Fall through|fallthru|Fallthru|falls through|Falls through|fallthrough|Fallthrough|No break|NO break|no break|continue on"/>
-            <property name="severity" value="error"/>
+        <module name="NoWhitespaceBefore">
+            <property name="tokens"
+             value="COMMA, SEMI, POST_INC, POST_DEC, DOT, ELLIPSIS, METHOD_REF"/>
+            <property name="allowLineBreaks" value="true"/>
         </module>
-
-        <!-- Checks for over-complicated boolean expressions. -->
-        <module name="SimplifyBooleanExpression"/>
-
-        <!-- Detects empty statements (standalone ";" semicolon). -->
-        <module name="EmptyStatement"/>
-
-        <!--
-
-        MODIFIERS CHECKS
-
+        <module name="ParenPad">
+            <property name="tokens"
+             value="ANNOTATION, ANNOTATION_FIELD_DEF, CTOR_CALL, CTOR_DEF, DOT, ENUM_CONSTANT_DEF,
+                    EXPR, LITERAL_CATCH, LITERAL_DO, LITERAL_FOR, LITERAL_IF, LITERAL_NEW,
+                    LITERAL_SWITCH, LITERAL_SYNCHRONIZED, LITERAL_WHILE, METHOD_CALL,
+                    METHOD_DEF, QUESTION, RESOURCE_SPECIFICATION, SUPER_CTOR_CALL, LAMBDA"/>
+        </module>
+        <module name="OperatorWrap">
+            <property name="option" value="NL"/>
+            <property name="tokens"
+             value="BAND, BOR, BSR, BXOR, DIV, EQUAL, GE, GT, LAND, LE, LITERAL_INSTANCEOF, LOR,
+                    LT, MINUS, MOD, NOT_EQUAL, PLUS, QUESTION, SL, SR, STAR, METHOD_REF "/>
+        </module>
+        <module name="AnnotationLocation">
+            <property name="id" value="AnnotationLocationMostCases"/>
+            <property name="tokens"
+             value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF"/>
+        </module>
+        <module name="AnnotationLocation">
+            <property name="id" value="AnnotationLocationVariables"/>
+            <property name="tokens" value="VARIABLE_DEF"/>
+            <property name="allowSamelineMultipleAnnotations" value="true"/>
+        </module>
+        <module name="NonEmptyAtclauseDescription">
+            <!-- new add -->
+            <property name="severity" value="ignore"/>
+        </module>
+        <module name="InvalidJavadocPosition">
+            <property name="severity" value="info"/>
+        </module>
+        <!-- new add
+        <module name="JavadocTagContinuationIndentation"/>
+         -->
+        <module name="SummaryJavadoc">
+            <property name="severity" value="info"/>
+            <property name="forbiddenSummaryFragments"
+             value="^@return the *|^This method returns |^A [{]@code [a-zA-Z0-9]+[}]( is a )"/>
+             <!--
+              <property name="period" value="."/>
+             -->
+             <property name="period" value=""/>
+        </module>
+         <!-- new add
+        <module name="JavadocParagraph" />
         -->
-
-        <module name="ModifierOrder">
-            <!-- Warn if modifier order is inconsistent with JLS3 8.1.1, 8.3.1, and
-                 8.4.3.  The prescribed order is:
-                 public, protected, private, abstract, static, final, transient, volatile,
-                 synchronized, native, strictfp
-              -->
-            <property name="severity" value="error"/>
+        <!-- new add
+        <module name="AtclauseOrder">
+            <property name="tagOrder" value="@param, @return, @throws, @deprecated"/>
+            <property name="target"
+             value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF, VARIABLE_DEF"/>
         </module>
-
-
-        <!--
-
-        WHITESPACE CHECKS
-
         -->
-
-        <module name="WhitespaceAround">
-            <!-- Checks that various tokens are surrounded by whitespace.
-                 This includes most binary operators and keywords followed
-                 by regular or curly braces.
+        <module name="JavadocMethod">
+            <property name="severity" value="info"/>
+            <property name="scope" value="public"/>
+            <property name="allowMissingParamTags" value="true"/>
+            <property name="allowMissingReturnTag" value="true"/>
+            <property name="allowedAnnotations" value="Override, Test"/>
+            <property name="tokens" value="METHOD_DEF, CTOR_DEF, ANNOTATION_FIELD_DEF"/>
+        </module>
+        <module name="MissingJavadocMethod">
+            <property name="severity" value="info"/>
+            <property name="scope" value="public"/>
+            <!--
+            <property name="minLineCount" value="2"/>
             -->
-            <property name="tokens" value="ASSIGN, BAND, BAND_ASSIGN, BOR,
-        BOR_ASSIGN, BSR, BSR_ASSIGN, BXOR, BXOR_ASSIGN, COLON, DIV, DIV_ASSIGN,
-        EQUAL, GE, GT, LAND, LE, LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE,
-        LITERAL_FINALLY, LITERAL_FOR, LITERAL_IF, LITERAL_RETURN,
-        LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE, LOR, LT, MINUS,
-        MINUS_ASSIGN, MOD, MOD_ASSIGN, NOT_EQUAL, PLUS, PLUS_ASSIGN, QUESTION,
-        SL, SL_ASSIGN, SR_ASSIGN, STAR, STAR_ASSIGN"/>
-            <property name="severity" value="error"/>
+            <property name="minLineCount" value="15"/>
+            <property name="allowedAnnotations" value="Override, Test"/>
+            <property name="tokens" value="METHOD_DEF, CTOR_DEF, ANNOTATION_FIELD_DEF"/>
         </module>
-
-        <module name="WhitespaceAfter">
-            <!-- Checks that commas, semicolons and typecasts are followed by
-                 whitespace.
+        <module name="MethodName">
+            <!--
+            <property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9_]*$"/>
             -->
-            <property name="tokens" value="COMMA, SEMI, TYPECAST"/>
+            <property name="format" value="^[a-z][a-zA-Z0-9_]*$"/>
+            <message key="name.invalidPattern"
+             value="Method name ''{0}'' must match pattern ''{1}''."/>
         </module>
+        <!-- new add -->
+        <module name="ConstantName">
+          <property name="applyToProtected" value="false"/>
+          <property name="applyToPackage" value="false"/>
+            <property name="applyToPrivate" value="false"/>
+         </module>
 
-        <module name="NoWhitespaceAfter">
-            <!-- Checks that there is no whitespace after various unary operators.
-                 Linebreaks are allowed.
-            -->
-            <property name="tokens" value="BNOT, DEC, DOT, INC, LNOT, UNARY_MINUS,
-        UNARY_PLUS"/>
-            <property name="allowLineBreaks" value="true"/>
-            <property name="severity" value="error"/>
+        <module name="SingleLineJavadoc">
+            <property name="severity" value="info"/>
+            <property name="ignoreInlineTags" value="true"/>
         </module>
-
-        <module name="NoWhitespaceBefore">
-            <!-- Checks that there is no whitespace before various unary operators.
-                 Linebreaks are allowed.
-            -->
-            <property name="tokens" value="SEMI, DOT, POST_DEC, POST_INC"/>
-            <property name="allowLineBreaks" value="true"/>
-            <property name="severity" value="error"/>
+        <module name="EmptyCatchBlock">
+            <property name="exceptionVariableName" value="expected"/>
         </module>
-
-        <module name="ParenPad">
-            <!-- Checks that there is no whitespace before close parens or after
-                 open parens.
+        <module name="CommentsIndentation">
+            <!--
+            <property name="tokens" value="SINGLE_LINE_COMMENT, BLOCK_COMMENT_BEGIN"/>
             -->
-            <property name="severity" value="error"/>
+            <property name="tokens" value="BLOCK_COMMENT_BEGIN"/>
         </module>
 
+
+        <!-- https://checkstyle.org/config_filters.html#SuppressionXpathFilter -->
+        <module name="SuppressionXpathFilter">
+            <property name="file" value="${org.checkstyle.google.suppressionxpathfilter.config}"
+                      default="checkstyle-xpath-suppressions.xml" />
+            <property name="optional" value="true"/>
+        </module>
     </module>
 </module>
diff --git a/codestyle/suppressions.xml b/codestyle/suppressions.xml
index c48abb7..c7f7a86 100644
--- a/codestyle/suppressions.xml
+++ b/codestyle/suppressions.xml
@@ -1,20 +1,20 @@
 <?xml version="1.0"?>
 <!--
-// 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.
--->
+  ~ 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.
+  -->
 <!DOCTYPE suppressions PUBLIC
         "-//Puppy Crawl//DTD Suppressions 1.1//EN"
         "http://www.puppycrawl.com/dtds/suppressions_1_1.dtd">
diff --git a/conf/broker.ini b/conf/broker.ini
deleted file mode 100644
index 61ee967..0000000
--- a/conf/broker.ini
+++ /dev/null
@@ -1,59 +0,0 @@
-;
-; 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.
-;
-
-[broker]
-; unique id of broker server, required; when set to 0, TubeMQ will retrieve
-; localhost IP, convert to int and set as brokerID
-brokerId=1
-; hostname of broker server, required
-hostName=127.0.0.1
-; port that broker server listens to, optional; default is 8123
-port=8123
-webPort=8081
-; address list of master HA servers
-masterAddressList=127.0.0.1:8000
-; path to message files
-primaryPath=var/stage/metadata_1
-; maximum size of single data file; default is 512M
-maxSegmentSize=1073741824
-; maximum size of single index file; default is 18M
-maxIndexSegmentSize=22020096
-; maximum buffer size that transferred to client; default is 512K
-transferSize= 524288
-; boolean flag on whether load message stores in parallel on bootstrap
-loadMessageStoresInParallel=true
-; timeout of consumer heartbeat, optional; default is 30s
-consumerRegTimeoutMs=35000
-
-
-[zookeeper]
-; root path of TubeMQ znodes on ZK
-zkNodeRoot=/tubemq
-; connect string of ZK servers
-zkServerAddr=localhost:2181
-; timeout of ZK heartbeat; default is 30000ms
-zkSessionTimeoutMs=30000
-; timeout of ZK connection; default is 30000ms
-zkConnectionTimeoutMs=30000
-; sync time on ZK; default is 5000ms
-zkSyncTimeMs=5000
-; interval to commits data on ZK; default is 5000ms
-zkCommitPeriodMs=5000
-; maximum retry times when commits data on ZK fails
-zkCommitFailRetries=10
-
-
diff --git a/conf/log4j.properties b/conf/log4j.properties
deleted file mode 100644
index 2f53338..0000000
--- a/conf/log4j.properties
+++ /dev/null
@@ -1,46 +0,0 @@
-#
-# 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.
-#
-
-log4j.rootLogger=INFO, ServerDailyRollingFile
-log4j.appender.ServerDailyRollingFile=org.apache.log4j.DailyRollingFileAppender
-log4j.appender.ServerDailyRollingFile.DatePattern='.'yyyy-MM-dd
-log4j.appender.ServerDailyRollingFile.File=${tubemq.home}/logs/broker.log
-log4j.appender.ServerDailyRollingFile.layout=org.apache.log4j.PatternLayout
-log4j.appender.ServerDailyRollingFile.layout.ConversionPattern=[%p] %d{yyyy-MM-dd HH:mm:ss,SSS} [%c{1}]  %m%n
-log4j.appender.ServerDailyRollingFile.Append=true
-log4j.logger.PutCounterGroup=INFO,PutCounterGroup
-log4j.additivity.PutCounterGroup=false
-log4j.appender.PutCounterGroup=org.apache.log4j.RollingFileAppender
-log4j.appender.PutCounterGroup.MaxFileSize=200MB
-log4j.appender.PutCounterGroup.MaxBackupIndex=20
-log4j.appender.PutCounterGroup.BufferedIO=false
-log4j.appender.PutCounterGroup.BufferSize=8192
-log4j.appender.PutCounterGroup.File=${tubemq.home}/logs/put_transfer.log
-log4j.appender.PutCounterGroup.layout=org.apache.log4j.PatternLayout
-log4j.appender.PutCounterGroup.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %m%n
-log4j.appender.PutCounterGroup.Append=true
-log4j.logger.GetCounterGroup=INFO,GetCounterGroup
-log4j.additivity.GetCounterGroup=false
-log4j.appender.GetCounterGroup=org.apache.log4j.RollingFileAppender
-log4j.appender.GetCounterGroup.MaxFileSize=200MB
-log4j.appender.GetCounterGroup.MaxBackupIndex=20
-log4j.appender.GetCounterGroup.BufferedIO=false
-log4j.appender.GetCounterGroup.BufferSize=8192
-log4j.appender.GetCounterGroup.File=${tubemq.home}/logs/get_transfer.log
-log4j.appender.GetCounterGroup.layout=org.apache.log4j.PatternLayout
-log4j.appender.GetCounterGroup.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %m%n
-log4j.appender.GetCounterGroup.Append=true
diff --git a/conf/master.ini b/conf/master.ini
deleted file mode 100644
index 936a596..0000000
--- a/conf/master.ini
+++ /dev/null
@@ -1,92 +0,0 @@
-;
-; 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.
-;
-
-[master]
-; host address of master, required; must be configured at network card, enabled
-hostName=127.0.0.1
-; port that master listens to, optional; default is 8715
-port=8000
-; port that master web console listens to
-webPort=8080
-; interval of re-balance, optional; default is 30000ms
-consumerBalancePeriodMs=30000
-; delay of first re-balance after master start; turn up when cluster grown
-firstBalanceDelayAfterStartMs=60000
-; timeout of consumer heartbeat, optional; default is 30000ms
-consumerHeartbeatTimeoutMs=30000
-; timeout of producer heartbeat, optional; default is 45000ms
-producerHeartbeatTimeoutMs=45000
-; timeout of broker heartbeat, optional; default is 25000ms
-brokerHeartbeatTimeoutMs=25000
-; configure modify authorization_token
-confModAuthToken=abc
-webResourcePath=resources
-; configure useWebProxy
-useWebProxy=false
-
-; meta data path; can be absolute, or relative to TubeMQ base directory ($BASE_DIR)
-;   optional, default is "var/meta_data"
-;   should be the same to `[bdbStore].bdbEnvHome` if upgrade from version prior 0.5.0
-;metaDataPath=var/meta_data
-
-
-[zookeeper]
-; root path of TubeMQ znodes on ZK
-zkNodeRoot=/tubemq
-; connect string of ZK servers
-zkServerAddr=localhost:2181
-; timeout of ZK heartbeat; default is 30000ms
-zkSessionTimeoutMs=30000
-; timeout of ZK connection; default is 30000ms
-zkConnectionTimeoutMs=30000
-; sync time on ZK; default is 5000ms
-zkSyncTimeMs=5000
-; interval to commits data on ZK; default is 5000ms
-zkCommitPeriodMs=5000
-
-
-[replication]
-; name of replication group, optional; default is `tubemqMasterGroup`
-;repGroupName=tubemqMasterGroup
-; name of current node; MUST BE DIFFERENT for every node in the same group
-repNodeName=tubemqMasterGroupNode1
-; port for node to communicate to other nodes in replication group, optional; default is 9001
-;repNodePort=9001
-; helperHost(and port) for node to join master cluster, optional; default is 127.0.0.1:9001
-;repHelperHost=127.0.0.1:9001
-
-; meta data disk sync policy
-;   the overall durability is a function of metaLocalSyncPolicy plus the repReplicaAckPolicy used by the master,
-;     and the metaReplicaSyncPolicy in effect at each Replica
-;   see https://docs.oracle.com/cd/E17277_02/html/java/com/sleepycat/je/Durability.html for detail
-;   1 for SYNC, will write and synchronously flush the log to disk upon transaction commit
-;   2 for NO_SYNC, do not synchronously flush the log upon transaction commit (if application or system fails, data may lost)
-;   3 for WRITE_NO_SYNC, synchronously written to the OS's file system buffers upon transaction commit, but the data is not
-;     actually forced to disk(if the system fails,data may lost)
-; sync policy for "local", optional; default is 1(SYNC)
-;metaLocalSyncPolicy=1
-; sync policy for "replica", optional; default is 3(WRITE_NO_SYNC)
-;metaReplicaSyncPolicy=3
-
-; replication acknowledge policy, optional; default is 1(SIMPLE_MAJORITY)
-;   1 for SIMPLE_MAJORITY
-;   2 for ALL
-;   3 for NONE
-;repReplicaAckPolicy=1
-
-; interval for node status check task, optional; default is 10000(ms)
-;repStatusCheckTimeoutMs=10000
diff --git a/conf/master.log4j.properties b/conf/master.log4j.properties
deleted file mode 100644
index 0f21c5b..0000000
--- a/conf/master.log4j.properties
+++ /dev/null
@@ -1,25 +0,0 @@
-#
-# 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.
-#
-
-log4j.rootLogger=INFO, MasterDailyRollingFile
-log4j.appender.MasterDailyRollingFile=org.apache.log4j.DailyRollingFileAppender
-log4j.appender.MasterDailyRollingFile.DatePattern='.'yyyy-MM-dd
-log4j.appender.MasterDailyRollingFile.File=${tubemq.home}/logs/master.log
-log4j.appender.MasterDailyRollingFile.layout=org.apache.log4j.PatternLayout
-log4j.appender.MasterDailyRollingFile.layout.ConversionPattern=[%p] %d{yyyy-MM-dd HH:mm:ss,SSS} [%c{1}]  %m%n
-log4j.appender.MasterDailyRollingFile.Append=true
-
diff --git a/conf/tools.log4j.properties b/conf/tools.log4j.properties
deleted file mode 100644
index bb49f22..0000000
--- a/conf/tools.log4j.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-#
-# 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.
-#
-
-log4j.rootLogger=INFO, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=[%d] %p %m (%c)%n
-
-
-
diff --git a/pom.xml b/pom.xml
index e332196..eb52161 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,472 +1,221 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-// 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.
+    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.
 -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <packaging>pom</packaging>
+  <parent>
+    <groupId>org.apache</groupId>
+    <artifactId>apache</artifactId>
+    <version>23</version>
+  </parent>
+
+  <groupId>org.apache.inlong</groupId>
+  <artifactId>inlong</artifactId>
+  <version>0.9.0-incubating-SNAPSHOT</version>
+  <name>Apache InLong</name>
 
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xmlns="http://maven.apache.org/POM/4.0.0"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
+  <description>InLong is a one-stop data streaming platform that provides automatic,
+    ecure, distributed, and efficient data publishing and subscription capabilities.
+    This platform helps you easily build stream-based data applications.</description>
+  <url>https://github.com/apache/incubator-inlong</url>
 
-    <parent>
-        <groupId>org.apache</groupId>
-        <artifactId>apache</artifactId>
-        <version>19</version>
-    </parent>
+  <organization>
+    <name>Apache Software Foundation</name>
+    <url>http://www.apache.org/</url>
+  </organization>
+  <inceptionYear>2013</inceptionYear>
 
-    <groupId>org.apache.tubemq</groupId>
-    <artifactId>tubemq</artifactId>
-    <inceptionYear>2013</inceptionYear>
-    <version>0.9.0-incubating-SNAPSHOT</version>
-    <packaging>pom</packaging>
-    <name>Apache TubeMQ</name>
+  <developers>
+    <developer>
+      <organization>Apache InLong(incubating) developers</organization>
+      <organizationUrl>http://inlong.apache.org/</organizationUrl>
+    </developer>
+  </developers>
 
-    <licenses>
-        <license>
-            <name>The Apache Software License, Version 2.0</name>
-            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
-            <distribution>repo</distribution>
-        </license>
-    </licenses>
+  <licenses>
+    <license>
+      <name>Apache License, Version 2.0</name>
+      <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+      <distribution>repo</distribution>
+    </license>
+  </licenses>
 
-    <scm>
-        <connection>scm:git:git@github.com:apache/incubator-tubemq.git</connection>
-        <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/incubator-tubemq.git</developerConnection>
-        <url>scm:git:git@github.com:apache/incubator-tubemq.git</url>
-        <tag>HEAD</tag>
-    </scm>
+  <scm>
+    <url>https://github.com/apache/incubator-inlong</url>
+    <connection>scm:git:https://github.com/apache/incubator-inlong.git</connection>
+    <developerConnection>scm:git:ssh://git@github.com:apache/incubator-inlong.git</developerConnection>
+  </scm>
 
-    <issueManagement>
-        <system>JIRA</system>
-        <url>https://issues.apache.org/jira/browse/TubeMQ</url>
-    </issueManagement>
+  <ciManagement>
+    <system>GitHub Actions</system>
+    <url>https://github.com/apache/incubator-inlong/actions</url>
+  </ciManagement>
+
+  <issueManagement>
+    <system>Github</system>
+    <url>https://github.com/apache/incubator-inlong/issues</url>
+  </issueManagement>
 
     <mailingLists>
         <mailingList>
-            <name>TubeMQ Developer List</name>
-            <post>dev@tubemq.apache.org</post>
-            <subscribe>dev-subscribe@tubemq.apache.org</subscribe>
-            <unsubscribe>dev-unsubscribe@tubemq.apache.org</unsubscribe>
+            <name>InLong Developer List</name>
+            <post>dev@inlong.apache.org</post>
+            <subscribe>dev-subscribe@inlong.apache.org</subscribe>
+            <unsubscribe>dev-unsubscribe@inlong.apache.org</unsubscribe>
         </mailingList>
     </mailingLists>
 
-    <modules>
-        <module>tubemq-core</module>
-        <module>tubemq-client</module>
-        <module>tubemq-server</module>
-        <module>tubemq-example</module>
-        <module>tubemq-connectors</module>
-    </modules>
-
-    <properties>
-        <junit.version>4.11</junit.version>
-        <mockito.version>2.18.0</mockito.version>
-        <powermock.version>2.0.4</powermock.version>
-        <exec.maven.version>1.6.0</exec.maven.version>
-        <build.helper.maven.version>3.0.0</build.helper.maven.version>
-        <checkstyle.version>6.19</checkstyle.version>
-        <protobuf.version>2.5.0</protobuf.version>
-        <je.version>7.3.7</je.version>
-        <gson.version>2.8.5</gson.version>
-        <docker.organization>apachetubemq</docker.organization>
-        <dockerfile-maven.version>1.4.13</dockerfile-maven.version>
-        <spring.boot.version>2.3.3.RELEASE</spring.boot.version>
-        <mysql.java.version>8.0.21</mysql.java.version>
-    </properties>
+  <modules>
+  </modules>
 
-    <repositories>
-        <repository>
-            <id>berkeleydb-je</id>
-            <name>berkeleydb-je</name>
-            <url>https://download.oracle.com/maven/</url>
-            <releases>
-                <enabled>true</enabled>
-            </releases>
-            <snapshots>
-                <enabled>false</enabled>
-            </snapshots>
-        </repository>
-    </repositories>
+  <properties>
+    <maven.compiler.source>1.8</maven.compiler.source>
+    <maven.compiler.target>1.8</maven.compiler.target>
+    <checkstyle.version>6.19</checkstyle.version>
+    <project.build.encoding>UTF-8</project.build.encoding>
+    <plugin.compile.version>3.8.1</plugin.compile.version>
+    <docker.organization>apacheinlong</docker.organization>
+  </properties>
 
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.1</version>
-                <configuration>
-                    <!--
-                    // Note:
-                    // The client and core modules use jdk1.7,
-                    // and the server module uses 1.8.
-                    // Therefore, the project uses jdk1.7 uniformly,
-                    // but the server module is specified separately for version 1.8
-                    -->
-                    <source>1.7</source>
-                    <target>1.7</target>
-                    <encoding>UTF-8</encoding>
-                    <showDeprecation>true</showDeprecation>
-                    <showWarnings>true</showWarnings>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.jacoco</groupId>
-                <artifactId>jacoco-maven-plugin</artifactId>
-                <version>0.8.5</version>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>prepare-agent</goal>
-                        </goals>
-                    </execution>
-                    <!-- attached to Maven test phase -->
-                    <execution>
-                        <id>report</id>
-                        <phase>test</phase>
-                        <goals>
-                            <goal>report</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <!-- Make a jar and put the sources in the jar.
-            In the parent pom, so submodules will do the right thing. -->
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-source-plugin</artifactId>
-                <version>3.0.1</version>
-                <executions>
-                    <execution>
-                        <id>attach-sources</id>
-                        <phase>prepare-package</phase>
-                        <goals>
-                            <goal>jar-no-fork</goal>
-                        </goals>
-                    </execution>
-                </executions>
-                <configuration>
-                    <includePom>true</includePom>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-surefire-plugin</artifactId>
-                <version>2.22.2</version>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>build-helper-maven-plugin</artifactId>
-                <version>${build.helper.maven.version}</version>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>exec-maven-plugin</artifactId>
-                <version>${exec.maven.version}</version>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-checkstyle-plugin</artifactId>
-                <version>2.16</version>
-                <dependencies>
-                    <dependency>
-                        <groupId>com.puppycrawl.tools</groupId>
-                        <artifactId>checkstyle</artifactId>
-                        <version>${checkstyle.version}</version>
-                    </dependency>
-                </dependencies>
-                <configuration>
-                    <configLocation>codestyle/checkstyle.xml</configLocation>
-                    <suppressionsLocation>codestyle/suppressions.xml</suppressionsLocation>
-                    <encoding>UTF-8</encoding>
-                    <consoleOutput>true</consoleOutput>
-                    <failOnViolation>true</failOnViolation>
-                    <includeResources>false</includeResources>
-                    <includeTestResources>false</includeTestResources>
-                    <includeTestSourceDirectory>true</includeTestSourceDirectory>
-                </configuration>
-                <executions>
-                    <execution>
-                        <id>checkstyle</id>
-                        <phase>validate</phase>
-                        <goals>
-                            <goal>check</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.rat</groupId>
-                <artifactId>apache-rat-plugin</artifactId>
-                <version>0.13</version>
-                <inherited>false</inherited>
-                <executions>
-                    <execution>
-                        <phase>verify</phase>
-                        <goals>
-                            <goal>check</goal>
-                        </goals>
-                    </execution>
-                </executions>
-                <configuration>
-                    <consoleOutput>true</consoleOutput>
-                    <excludeSubProjects>false</excludeSubProjects>
-                    <numUnapprovedLicenses>0</numUnapprovedLicenses>
-                    <licenses>
-                        <license implementation="org.apache.rat.analysis.license.SimplePatternBasedLicense">
-                            <licenseFamilyCategory>AL2</licenseFamilyCategory>
-                            <licenseFamilyName>Apache License 2.0</licenseFamilyName>
-                            <notes/>
-                            <patterns>
-                                <pattern>Licensed to the Apache Software Foundation (ASF) under one </pattern>
-                            </patterns>
-                        </license>
-                    </licenses>
-                    <licenseFamilies>
-                        <licenseFamily implementation="org.apache.rat.license.SimpleLicenseFamily">
-                            <familyName>Apache License 2.0</familyName>
-                        </licenseFamily>
-                    </licenseFamilies>
-                    <excludes>
-                        <exclude>LICENSE</exclude>
-                        <exclude>NOTICE</exclude>
-                        <exclude>**/.*/**</exclude>
-                        <exclude>**/*.log</exclude>
-                        <exclude>**/README.md</exclude>
-                        <!-- Github -->
-                        <exclude>**/.github/**</exclude>
-                        <!-- Intellij IDEA -->
-                        <exclude>**/*.iml</exclude>
-                        <exclude>**/.idea/**</exclude>
-                        <!-- Generated content -->
-                        <exclude>**/logs/**</exclude>
-                        <exclude>**/out/**</exclude>
-                        <exclude>**/target/**</exclude>
-                        <!-- Binaries -->
-                        <exclude>**/tubemq-core/src/test/resource/**</exclude>
-                        <!-- Document -->
-                        <exclude>**/docs/**</exclude>
-                        <!-- Front-end -->
-                        <exclude>resources/assets/lib/**</exclude>
-                        <exclude>resources/assets/public/**</exclude>
-                        <exclude>DISCLAIMER-WIP</exclude>
-                        <!-- copy or modify files from other projects -->
-                        <exclude>**/tubemq-client-twins/tubemq-client-cpp/src/any.h</exclude>
-                        <exclude>**/tubemq-client-twins/tubemq-client-cpp/src/buffer.h</exclude>
-                        <exclude>**/tubemq-client-twins/tubemq-client-cpp/third_party/**</exclude>
-                    </excludes>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-    <dependencyManagement>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <encoding>${project.build.encoding}</encoding>
+          <source>${maven.compiler.source}</source>
+          <target>${maven.compiler.target}</target>
+        </configuration>
+        <version>${plugin.compile.version}</version>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-checkstyle-plugin</artifactId>
+        <version>3.1.1</version>
         <dependencies>
-            <dependency>
-                <groupId>org.apache.tubemq</groupId>
-                <artifactId>tubemq-core</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.tubemq</groupId>
-                <artifactId>tubemq-client</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.tubemq</groupId>
-                <artifactId>tubemq-example</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.slf4j</groupId>
-                <artifactId>slf4j-api</artifactId>
-                <version>1.6.2</version>
-            </dependency>
-            <dependency>
-                <groupId>org.slf4j</groupId>
-                <artifactId>slf4j-log4j12</artifactId>
-                <version>1.6.2</version>
-            </dependency>
-            <dependency>
-                <groupId>io.netty</groupId>
-                <artifactId>netty</artifactId>
-                <version>3.8.0.Final</version>
-            </dependency>
-            <dependency>
-                <groupId>com.google.protobuf</groupId>
-                <artifactId>protobuf-java</artifactId>
-                <version>${protobuf.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>commons-cli</groupId>
-                <artifactId>commons-cli</artifactId>
-                <version>1.4</version>
-            </dependency>
-            <dependency>
-                <groupId>commons-codec</groupId>
-                <artifactId>commons-codec</artifactId>
-                <version>1.10</version>
-            </dependency>
-            <dependency>
-                <groupId>commons-lang</groupId>
-                <artifactId>commons-lang</artifactId>
-                <version>2.6</version>
-            </dependency>
-            <dependency>
-                <groupId>com.sleepycat</groupId>
-                <artifactId>je</artifactId>
-                <version>${je.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.google.code.gson</groupId>
-                <artifactId>gson</artifactId>
-                <version>${gson.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.httpcomponents</groupId>
-                <artifactId>httpclient</artifactId>
-                <version>4.5.2</version>
-            </dependency>
-            <dependency>
-                <groupId>commons-io</groupId>
-                <artifactId>commons-io</artifactId>
-                <version>2.1</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.zookeeper</groupId>
-                <artifactId>zookeeper</artifactId>
-                <version>3.4.3</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>com.sun.jmx</groupId>
-                        <artifactId>jmxri</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>com.sun.jdmk</groupId>
-                        <artifactId>jmxtools</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>javax.jms</groupId>
-                        <artifactId>jms</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.jboss.netty</groupId>
-                        <artifactId>netty</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>com.google.guava</groupId>
-                <artifactId>guava</artifactId>
-                <version>13.0</version>
-            </dependency>
-            <dependency>
-                <groupId>javax.servlet</groupId>
-                <artifactId>javax.servlet-api</artifactId>
-                <version>4.0.1</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.velocity</groupId>
-                <artifactId>velocity-tools</artifactId>
-                <version>2.0</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.apache.struts</groupId>
-                        <artifactId>struts-taglib</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.struts</groupId>
-                        <artifactId>struts-tiles</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.struts</groupId>
-                        <artifactId>struts-core</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-core</artifactId>
-                <version>4.1.6.RELEASE</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-context</artifactId>
-                <version>4.1.6.RELEASE</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-jdbc</artifactId>
-                <version>4.1.6.RELEASE</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-orm</artifactId>
-                <version>4.1.6.RELEASE</version>
-            </dependency>
-            <dependency>
-                <groupId>org.mortbay.jetty</groupId>
-                <artifactId>jetty</artifactId>
-                <version>6.1.26</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.mortbay.jetty</groupId>
-                        <artifactId>jsp-2.1</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.mortbay.jetty</groupId>
-                        <artifactId>jsp-api-2.1</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.mortbay.jetty</groupId>
-                        <artifactId>servlet-api</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.velocity</groupId>
-                <artifactId>velocity</artifactId>
-                <version>1.7</version>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-server</artifactId>
-                <version>9.4.31.v20200723</version>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-servlet</artifactId>
-                <version>9.4.31.v20200723</version>
-            </dependency>
-            <dependency>
-                <groupId>org.ini4j</groupId>
-                <artifactId>ini4j</artifactId>
-                <version>0.5.1</version>
-            </dependency>
-            <dependency>
-                <groupId>org.easymock</groupId>
-                <artifactId>easymock</artifactId>
-                <version>2.5.2</version>
-                <scope>test</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.easymock</groupId>
-                <artifactId>easymockclassextension</artifactId>
-                <version>2.5.2</version>
-                <scope>test</scope>
-            </dependency>
+          <dependency>
+            <groupId>com.puppycrawl.tools</groupId>
+            <artifactId>checkstyle</artifactId>
+            <version>8.29</version>
+          </dependency>
         </dependencies>
-    </dependencyManagement>
+        <configuration>
+          <configLocation>codestyle/checkstyle.xml</configLocation>
+          <suppressionsLocation>codestyle/suppressions.xml</suppressionsLocation>
+          <encoding>UTF-8</encoding>
+          <consoleOutput>true</consoleOutput>
+          <failOnViolation>true</failOnViolation>
+          <includeResources>false</includeResources>
+          <includeTestResources>false</includeTestResources>
+          <includeTestSourceDirectory>true</includeTestSourceDirectory>
+        </configuration>
+        <executions>
+          <execution>
+            <id>checkstyle</id>
+            <phase>validate</phase>
+            <goals>
+              <goal>check</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>license-maven-plugin</artifactId>
+        <version>2.0.0</version>
+        <configuration>
+          <!-- here add configures -->
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.rat</groupId>
+        <artifactId>apache-rat-plugin</artifactId>
+        <version>0.13</version>
+        <inherited>false</inherited>
+        <executions>
+          <execution>
+            <phase>verify</phase>
+            <goals>
+              <goal>check</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <consoleOutput>true</consoleOutput>
+          <excludeSubProjects>false</excludeSubProjects>
+          <numUnapprovedLicenses>0</numUnapprovedLicenses>
+          <licenses>
+            <license implementation="org.apache.rat.analysis.license.SimplePatternBasedLicense">
+              <licenseFamilyCategory>AL2</licenseFamilyCategory>
+              <licenseFamilyName>Apache License 2.0</licenseFamilyName>
+              <notes/>
+              <patterns>
+                <pattern>Licensed to the Apache Software Foundation (ASF) under one </pattern>
+              </patterns>
+            </license>
+          </licenses>
+          <licenseFamilies>
+            <licenseFamily implementation="org.apache.rat.license.SimpleLicenseFamily">
+              <familyName>Apache License 2.0</familyName>
+            </licenseFamily>
+          </licenseFamilies>
+          <excludes>
+            <exclude>LICENSE</exclude>
+            <exclude>NOTICE</exclude>
+			<exclude>/codestyle/checkstyle.xml</exclude>
+            <exclude>**/.*/**</exclude>
+            <exclude>**/*.log</exclude>
+            <exclude>**/*.json</exclude>
+            <exclude>**/*.txt</exclude>
+            <exclude>**/*.md</exclude>
+            <exclude>**/*.csv</exclude>
+            <!-- Github -->
+            <exclude>**/.github/**</exclude>
+            <!-- Intellij IDEA -->
+            <exclude>**/*.iml</exclude>
+            <exclude>**/.idea/**</exclude>
+            <!-- Generated content -->
+            <exclude>**/logs/**</exclude>
+            <exclude>**/out/**</exclude>
+            <exclude>**/target/**</exclude>
+            <!-- Binaries -->
+            <exclude>**/tubemq-core/src/test/resource/**</exclude>
+            <!-- Document -->
+            <exclude>**/docs/**</exclude>
+            <!-- Front-end -->
+            <exclude>**/inlong-tubemq/resources/assets/lib/**</exclude>
+            <exclude>**/inlong-tubemq/resources/assets/public/**</exclude>
+            <exclude>DISCLAIMER-WIP</exclude>
+            <!-- copy or modify files from other projects -->
+            <exclude>**/inlong-tubemq/tubemq-client-twins/tubemq-client-cpp/src/any.h</exclude>
+            <exclude>**/inlong-tubemq/tubemq-client-twins/tubemq-client-cpp/src/buffer.h</exclude>
+            <exclude>**/inlong-tubemq/tubemq-client-twins/tubemq-client-cpp/third_party/**</exclude>
+          </excludes>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+  <repositories>
+  </repositories>
 
 </project>
diff --git a/resources/assets/lib/DataTables/DataTables-1.10.11/css/dataTables.bootstrap.css b/resources/assets/lib/DataTables/DataTables-1.10.11/css/dataTables.bootstrap.css
deleted file mode 100644
index d87427c..0000000
--- a/resources/assets/lib/DataTables/DataTables-1.10.11/css/dataTables.bootstrap.css
+++ /dev/null
@@ -1,214 +0,0 @@
-table.dataTable {
-    clear: both;
-    margin-top: 6px !important;
-    margin-bottom: 6px !important;
-    max-width: none !important;
-}
-
-table.dataTable td,
-table.dataTable th {
-    -webkit-box-sizing: content-box;
-    -moz-box-sizing: content-box;
-    box-sizing: content-box;
-}
-
-table.dataTable td.dataTables_empty,
-table.dataTable th.dataTables_empty {
-    text-align: center;
-}
-
-table.dataTable.nowrap th,
-table.dataTable.nowrap td {
-    white-space: nowrap;
-}
-
-div.dataTables_wrapper div.dataTables_length label {
-    font-weight: normal;
-    text-align: left;
-    white-space: nowrap;
-}
-
-div.dataTables_wrapper div.dataTables_length select {
-    width: 75px;
-    display: inline-block;
-}
-
-div.dataTables_wrapper div.dataTables_filter {
-    text-align: right;
-}
-
-div.dataTables_wrapper div.dataTables_filter label {
-    font-weight: normal;
-    white-space: nowrap;
-    text-align: left;
-}
-
-div.dataTables_wrapper div.dataTables_filter input {
-    margin-left: 0.5em;
-    display: inline-block;
-    width: auto;
-}
-
-div.dataTables_wrapper div.dataTables_info {
-    padding-top: 8px;
-    white-space: nowrap;
-}
-
-div.dataTables_wrapper div.dataTables_paginate {
-    margin: 0;
-    white-space: nowrap;
-    text-align: right;
-}
-
-div.dataTables_wrapper div.dataTables_paginate ul.pagination {
-    margin: 2px 0;
-    white-space: nowrap;
-}
-
-div.dataTables_wrapper div.dataTables_processing {
-    position: absolute;
-    top: 50%;
-    left: 50%;
-    width: 200px;
-    margin-left: -100px;
-    margin-top: -26px;
-    text-align: center;
-    padding: 1em 0;
-}
-
-table.dataTable thead > tr > th.sorting_asc, table.dataTable thead > tr > th.sorting_desc, table.dataTable thead > tr > th.sorting,
-table.dataTable thead > tr > td.sorting_asc,
-table.dataTable thead > tr > td.sorting_desc,
-table.dataTable thead > tr > td.sorting {
-    padding-right: 30px;
-}
-
-table.dataTable thead > tr > th:active,
-table.dataTable thead > tr > td:active {
-    outline: none;
-}
-
-table.dataTable thead .sorting,
-table.dataTable thead .sorting_asc,
-table.dataTable thead .sorting_desc,
-table.dataTable thead .sorting_asc_disabled,
-table.dataTable thead .sorting_desc_disabled {
-    cursor: pointer;
-    position: relative;
-}
-
-table.dataTable thead .sorting:after,
-table.dataTable thead .sorting_asc:after,
-table.dataTable thead .sorting_desc:after,
-table.dataTable thead .sorting_asc_disabled:after,
-table.dataTable thead .sorting_desc_disabled:after {
-    position: absolute;
-    bottom: 8px;
-    right: 8px;
-    display: block;
-    font-family: 'Glyphicons Halflings';
-    opacity: 0.5;
-}
-
-table.dataTable thead .sorting:after {
-    opacity: 0.2;
-    content: "\e150";
-    /* sort */
-}
-
-table.dataTable thead .sorting_asc:after {
-    content: "\e155";
-    /* sort-by-attributes */
-}
-
-table.dataTable thead .sorting_desc:after {
-    content: "\e156";
-    /* sort-by-attributes-alt */
-}
-
-table.dataTable thead .sorting_asc_disabled:after,
-table.dataTable thead .sorting_desc_disabled:after {
-    color: #eee;
-}
-
-div.dataTables_scrollHead table.dataTable {
-    margin-bottom: 0 !important;
-}
-
-div.dataTables_scrollBody table {
-    border-top: none;
-    margin-top: 0 !important;
-    margin-bottom: 0 !important;
-}
-
-div.dataTables_scrollBody table thead .sorting:after,
-div.dataTables_scrollBody table thead .sorting_asc:after,
-div.dataTables_scrollBody table thead .sorting_desc:after {
-    display: none;
-}
-
-div.dataTables_scrollBody table tbody tr:first-child th,
-div.dataTables_scrollBody table tbody tr:first-child td {
-    border-top: none;
-}
-
-div.dataTables_scrollFoot table {
-    margin-top: 0 !important;
-    border-top: none;
-}
-
-@media screen and (max-width: 767px) {
-    div.dataTables_wrapper div.dataTables_length,
-    div.dataTables_wrapper div.dataTables_filter,
-    div.dataTables_wrapper div.dataTables_info,
-    div.dataTables_wrapper div.dataTables_paginate {
-        text-align: center;
-    }
-}
-
-table.dataTable.table-condensed > thead > tr > th {
-    padding-right: 20px;
-}
-
-table.dataTable.table-condensed .sorting:after,
-table.dataTable.table-condensed .sorting_asc:after,
-table.dataTable.table-condensed .sorting_desc:after {
-    top: 6px;
-    right: 6px;
-}
-
-table.table-bordered.dataTable {
-    border-collapse: separate !important;
-}
-
-table.table-bordered.dataTable th,
-table.table-bordered.dataTable td {
-    border-left-width: 0;
-}
-
-table.table-bordered.dataTable th:last-child, table.table-bordered.dataTable th:last-child,
-table.table-bordered.dataTable td:last-child,
-table.table-bordered.dataTable td:last-child {
-    border-right-width: 0;
-}
-
-table.table-bordered.dataTable tbody th,
-table.table-bordered.dataTable tbody td {
-    border-bottom-width: 0;
-}
-
-div.dataTables_scrollHead table.table-bordered {
-    border-bottom-width: 0;
-}
-
-div.table-responsive > div.dataTables_wrapper > div.row {
-    margin: 0;
-}
-
-div.table-responsive > div.dataTables_wrapper > div.row > div[class^="col-"]:first-child {
-    padding-left: 0;
-}
-
-div.table-responsive > div.dataTables_wrapper > div.row > div[class^="col-"]:last-child {
-    padding-right: 0;
-}
diff --git a/resources/assets/lib/DataTables/DataTables-1.10.11/css/dataTables.bootstrap.min.css b/resources/assets/lib/DataTables/DataTables-1.10.11/css/dataTables.bootstrap.min.css
deleted file mode 100644
index 745f299..0000000
--- a/resources/assets/lib/DataTables/DataTables-1.10.11/css/dataTables.bootstrap.min.css
+++ /dev/null
@@ -1 +0,0 @@
-table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowra [...]
diff --git a/resources/assets/lib/DataTables/DataTables-1.10.11/css/dataTables.foundation.css b/resources/assets/lib/DataTables/DataTables-1.10.11/css/dataTables.foundation.css
deleted file mode 100644
index b695755..0000000
--- a/resources/assets/lib/DataTables/DataTables-1.10.11/css/dataTables.foundation.css
+++ /dev/null
@@ -1,136 +0,0 @@
-table.dataTable {
-    clear: both;
-    margin: 0.5em 0 !important;
-    max-width: none !important;
-    width: 100%;
-}
-
-table.dataTable td,
-table.dataTable th {
-    -webkit-box-sizing: content-box;
-    -moz-box-sizing: content-box;
-    box-sizing: content-box;
-}
-
-table.dataTable td.dataTables_empty,
-table.dataTable th.dataTables_empty {
-    text-align: center;
-}
-
-table.dataTable.nowrap th, table.dataTable.nowrap td {
-    white-space: nowrap;
-}
-
-div.dataTables_wrapper {
-    position: relative;
-}
-
-div.dataTables_wrapper div.dataTables_length label {
-    float: left;
-    text-align: left;
-    margin-bottom: 0;
-}
-
-div.dataTables_wrapper div.dataTables_length select {
-    width: 75px;
-    margin-bottom: 0;
-}
-
-div.dataTables_wrapper div.dataTables_filter label {
-    float: right;
-    margin-bottom: 0;
-}
-
-div.dataTables_wrapper div.dataTables_filter input {
-    display: inline-block !important;
-    width: auto !important;
-    margin-bottom: 0;
-    margin-left: 0.5em;
-}
-
-div.dataTables_wrapper div.dataTables_info {
-    padding-top: 2px;
-}
-
-div.dataTables_wrapper div.dataTables_paginate {
-    float: right;
-    margin: 0;
-}
-
-div.dataTables_wrapper div.dataTables_processing {
-    position: absolute;
-    top: 50%;
-    left: 50%;
-    width: 200px;
-    margin-left: -100px;
-    margin-top: -26px;
-    text-align: center;
-    padding: 1rem 0;
-}
-
-table.dataTable thead > tr > th.sorting_asc, table.dataTable thead > tr > th.sorting_desc, table.dataTable thead > tr > th.sorting,
-table.dataTable thead > tr > td.sorting_asc,
-table.dataTable thead > tr > td.sorting_desc,
-table.dataTable thead > tr > td.sorting {
-    padding-right: 1.5rem;
-}
-
-table.dataTable thead > tr > th:active,
-table.dataTable thead > tr > td:active {
-    outline: none;
-}
-
-table.dataTable thead .sorting,
-table.dataTable thead .sorting_asc,
-table.dataTable thead .sorting_desc {
-    cursor: pointer;
-}
-
-table.dataTable thead .sorting,
-table.dataTable thead .sorting_asc,
-table.dataTable thead .sorting_desc,
-table.dataTable thead .sorting_asc_disabled,
-table.dataTable thead .sorting_desc_disabled {
-    background-repeat: no-repeat;
-    background-position: center right;
-}
-
-table.dataTable thead .sorting {
-    background-image: url("../images/sort_both.png");
-}
-
-table.dataTable thead .sorting_asc {
-    background-image: url("../images/sort_asc.png");
-}
-
-table.dataTable thead .sorting_desc {
-    background-image: url("../images/sort_desc.png");
-}
-
-table.dataTable thead .sorting_asc_disabled {
-    background-image: url("../images/sort_asc_disabled.png");
-}
-
-table.dataTable thead .sorting_desc_disabled {
-    background-image: url("../images/sort_desc_disabled.png");
-}
-
-div.dataTables_scrollHead table {
-    margin-bottom: 0 !important;
-}
-
-div.dataTables_scrollBody table {
-    border-top: none;
-    margin-top: 0 !important;
-    margin-bottom: 0 !important;
-}
-
-div.dataTables_scrollBody table tbody tr:first-child th,
-div.dataTables_scrollBody table tbody tr:first-child td {
-    border-top: none;
-}
-
-div.dataTables_scrollFoot table {
-    margin-top: 0 !important;
-    border-top: none;
-}
diff --git a/resources/assets/lib/DataTables/DataTables-1.10.11/css/dataTables.foundation.min.css b/resources/assets/lib/DataTables/DataTables-1.10.11/css/dataTables.foundation.min.css
deleted file mode 100644
index b44d08d..0000000
--- a/resources/assets/lib/DataTables/DataTables-1.10.11/css/dataTables.foundation.min.css
+++ /dev/null
@@ -1 +0,0 @@
-table.dataTable{clear:both;margin:0.5em 0 !important;max-width:none !important;width:100%}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper{position:relative}div.dataTables_wrapper div.dataTables_length label{float:left;text-align:left;ma [...]
diff --git a/resources/assets/lib/DataTables/DataTables-1.10.11/css/dataTables.jqueryui.css b/resources/assets/lib/DataTables/DataTables-1.10.11/css/dataTables.jqueryui.css
deleted file mode 100644
index 885c3b9..0000000
--- a/resources/assets/lib/DataTables/DataTables-1.10.11/css/dataTables.jqueryui.css
+++ /dev/null
@@ -1,572 +0,0 @@
-/*
- * Table styles
- */
-table.dataTable {
-    width: 100%;
-    margin: 0 auto;
-    clear: both;
-    border-collapse: separate;
-    border-spacing: 0;
-    /*
-     * Header and footer styles
-     */
-    /*
-     * Body styles
-     */
-}
-
-table.dataTable thead th,
-table.dataTable tfoot th {
-    font-weight: bold;
-}
-
-table.dataTable thead th,
-table.dataTable thead td {
-    padding: 10px 18px;
-}
-
-table.dataTable thead th:active,
-table.dataTable thead td:active {
-    outline: none;
-}
-
-table.dataTable tfoot th,
-table.dataTable tfoot td {
-    padding: 10px 18px 6px 18px;
-}
-
-table.dataTable tbody tr {
-    background-color: #ffffff;
-}
-
-table.dataTable tbody tr.selected {
-    background-color: #B0BED9;
-}
-
-table.dataTable tbody th,
-table.dataTable tbody td {
-    padding: 8px 10px;
-}
-
-table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td {
-    border-top: 1px solid #ddd;
-}
-
-table.dataTable.row-border tbody tr:first-child th,
-table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th,
-table.dataTable.display tbody tr:first-child td {
-    border-top: none;
-}
-
-table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td {
-    border-top: 1px solid #ddd;
-    border-right: 1px solid #ddd;
-}
-
-table.dataTable.cell-border tbody tr th:first-child,
-table.dataTable.cell-border tbody tr td:first-child {
-    border-left: 1px solid #ddd;
-}
-
-table.dataTable.cell-border tbody tr:first-child th,
-table.dataTable.cell-border tbody tr:first-child td {
-    border-top: none;
-}
-
-table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd {
-    background-color: #f9f9f9;
-}
-
-table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected {
-    background-color: #acbad4;
-}
-
-table.dataTable.hover tbody tr:hover, table.dataTable.display tbody tr:hover {
-    background-color: #f6f6f6;
-}
-
-table.dataTable.hover tbody tr:hover.selected, table.dataTable.display tbody tr:hover.selected {
-    background-color: #aab7d1;
-}
-
-table.dataTable.order-column tbody tr > .sorting_1,
-table.dataTable.order-column tbody tr > .sorting_2,
-table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1,
-table.dataTable.display tbody tr > .sorting_2,
-table.dataTable.display tbody tr > .sorting_3 {
-    background-color: #fafafa;
-}
-
-table.dataTable.order-column tbody tr.selected > .sorting_1,
-table.dataTable.order-column tbody tr.selected > .sorting_2,
-table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1,
-table.dataTable.display tbody tr.selected > .sorting_2,
-table.dataTable.display tbody tr.selected > .sorting_3 {
-    background-color: #acbad5;
-}
-
-table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 {
-    background-color: #f1f1f1;
-}
-
-table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 {
-    background-color: #f3f3f3;
-}
-
-table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 {
-    background-color: whitesmoke;
-}
-
-table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 {
-    background-color: #a6b4cd;
-}
-
-table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 {
-    background-color: #a8b5cf;
-}
-
-table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 {
-    background-color: #a9b7d1;
-}
-
-table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 {
-    background-color: #fafafa;
-}
-
-table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 {
-    background-color: #fcfcfc;
-}
-
-table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 {
-    background-color: #fefefe;
-}
-
-table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 {
-    background-color: #acbad5;
-}
-
-table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 {
-    background-color: #aebcd6;
-}
-
-table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 {
-    background-color: #afbdd8;
-}
-
-table.dataTable.display tbody tr:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1 {
-    background-color: #eaeaea;
-}
-
-table.dataTable.display tbody tr:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2 {
-    background-color: #ececec;
-}
-
-table.dataTable.display tbody tr:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3 {
-    background-color: #efefef;
-}
-
-table.dataTable.display tbody tr:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1 {
-    background-color: #a2aec7;
-}
-
-table.dataTable.display tbody tr:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2 {
-    background-color: #a3b0c9;
-}
-
-table.dataTable.display tbody tr:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3 {
-    background-color: #a5b2cb;
-}
-
-table.dataTable.no-footer {
-    border-bottom: 1px solid #111;
-}
-
-table.dataTable.nowrap th, table.dataTable.nowrap td {
-    white-space: nowrap;
-}
-
-table.dataTable.compact thead th,
-table.dataTable.compact thead td {
-    padding: 4px 17px 4px 4px;
-}
-
-table.dataTable.compact tfoot th,
-table.dataTable.compact tfoot td {
-    padding: 4px;
-}
-
-table.dataTable.compact tbody th,
-table.dataTable.compact tbody td {
-    padding: 4px;
-}
-
-table.dataTable th.dt-left,
-table.dataTable td.dt-left {
-    text-align: left;
-}
-
-table.dataTable th.dt-center,
-table.dataTable td.dt-center,
-table.dataTable td.dataTables_empty {
-    text-align: center;
-}
-
-table.dataTable th.dt-right,
-table.dataTable td.dt-right {
-    text-align: right;
-}
-
-table.dataTable th.dt-justify,
-table.dataTable td.dt-justify {
-    text-align: justify;
-}
-
-table.dataTable th.dt-nowrap,
-table.dataTable td.dt-nowrap {
-    white-space: nowrap;
-}
-
-table.dataTable thead th.dt-head-left,
-table.dataTable thead td.dt-head-left,
-table.dataTable tfoot th.dt-head-left,
-table.dataTable tfoot td.dt-head-left {
-    text-align: left;
-}
-
-table.dataTable thead th.dt-head-center,
-table.dataTable thead td.dt-head-center,
-table.dataTable tfoot th.dt-head-center,
-table.dataTable tfoot td.dt-head-center {
-    text-align: center;
-}
-
-table.dataTable thead th.dt-head-right,
-table.dataTable thead td.dt-head-right,
-table.dataTable tfoot th.dt-head-right,
-table.dataTable tfoot td.dt-head-right {
-    text-align: right;
-}
-
-table.dataTable thead th.dt-head-justify,
-table.dataTable thead td.dt-head-justify,
-table.dataTable tfoot th.dt-head-justify,
-table.dataTable tfoot td.dt-head-justify {
-    text-align: justify;
-}
-
-table.dataTable thead th.dt-head-nowrap,
-table.dataTable thead td.dt-head-nowrap,
-table.dataTable tfoot th.dt-head-nowrap,
-table.dataTable tfoot td.dt-head-nowrap {
-    white-space: nowrap;
-}
-
-table.dataTable tbody th.dt-body-left,
-table.dataTable tbody td.dt-body-left {
-    text-align: left;
-}
-
-table.dataTable tbody th.dt-body-center,
-table.dataTable tbody td.dt-body-center {
-    text-align: center;
-}
-
-table.dataTable tbody th.dt-body-right,
-table.dataTable tbody td.dt-body-right {
-    text-align: right;
-}
-
-table.dataTable tbody th.dt-body-justify,
-table.dataTable tbody td.dt-body-justify {
-    text-align: justify;
-}
-
-table.dataTable tbody th.dt-body-nowrap,
-table.dataTable tbody td.dt-body-nowrap {
-    white-space: nowrap;
-}
-
-table.dataTable,
-table.dataTable th,
-table.dataTable td {
-    -webkit-box-sizing: content-box;
-    -moz-box-sizing: content-box;
-    box-sizing: content-box;
-}
-
-/*
- * Control feature layout
- */
-.dataTables_wrapper {
-    position: relative;
-    clear: both;
-    *zoom: 1;
-    zoom: 1;
-}
-
-.dataTables_wrapper .dataTables_length {
-    float: left;
-}
-
-.dataTables_wrapper .dataTables_filter {
-    float: right;
-    text-align: right;
-}
-
-.dataTables_wrapper .dataTables_filter input {
-    margin-left: 0.5em;
-}
-
-.dataTables_wrapper .dataTables_info {
-    clear: both;
-    float: left;
-    padding-top: 0.755em;
-}
-
-.dataTables_wrapper .dataTables_paginate {
-    float: right;
-    text-align: right;
-    padding-top: 0.25em;
-}
-
-.dataTables_wrapper .dataTables_paginate .paginate_button {
-    box-sizing: border-box;
-    display: inline-block;
-    min-width: 1.5em;
-    padding: 0.5em 1em;
-    margin-left: 2px;
-    text-align: center;
-    text-decoration: none !important;
-    cursor: pointer;
-    *cursor: hand;
-    color: #333 !important;
-    border: 1px solid transparent;
-    border-radius: 2px;
-}
-
-.dataTables_wrapper .dataTables_paginate .paginate_button.current, .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover {
-    color: #333 !important;
-    border: 1px solid #979797;
-    background-color: white;
-    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, #dcdcdc));
-    /* Chrome,Safari4+ */
-    background: -webkit-linear-gradient(top, white 0%, #dcdcdc 100%);
-    /* Chrome10+,Safari5.1+ */
-    background: -moz-linear-gradient(top, white 0%, #dcdcdc 100%);
-    /* FF3.6+ */
-    background: -ms-linear-gradient(top, white 0%, #dcdcdc 100%);
-    /* IE10+ */
-    background: -o-linear-gradient(top, white 0%, #dcdcdc 100%);
-    /* Opera 11.10+ */
-    background: linear-gradient(to bottom, white 0%, #dcdcdc 100%);
-    /* W3C */
-}
-
-.dataTables_wrapper .dataTables_paginate .paginate_button.disabled, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active {
-    cursor: default;
-    color: #666 !important;
-    border: 1px solid transparent;
-    background: transparent;
-    box-shadow: none;
-}
-
-.dataTables_wrapper .dataTables_paginate .paginate_button:hover {
-    color: white !important;
-    border: 1px solid #111;
-    background-color: #585858;
-    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));
-    /* Chrome,Safari4+ */
-    background: -webkit-linear-gradient(top, #585858 0%, #111 100%);
-    /* Chrome10+,Safari5.1+ */
-    background: -moz-linear-gradient(top, #585858 0%, #111 100%);
-    /* FF3.6+ */
-    background: -ms-linear-gradient(top, #585858 0%, #111 100%);
-    /* IE10+ */
-    background: -o-linear-gradient(top, #585858 0%, #111 100%);
-    /* Opera 11.10+ */
-    background: linear-gradient(to bottom, #585858 0%, #111 100%);
-    /* W3C */
-}
-
-.dataTables_wrapper .dataTables_paginate .paginate_button:active {
-    outline: none;
-    background-color: #2b2b2b;
-    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));
-    /* Chrome,Safari4+ */
-    background: -webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
-    /* Chrome10+,Safari5.1+ */
-    background: -moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
-    /* FF3.6+ */
-    background: -ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
-    /* IE10+ */
-    background: -o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
-    /* Opera 11.10+ */
-    background: linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);
-    /* W3C */
-    box-shadow: inset 0 0 3px #111;
-}
-
-.dataTables_wrapper .dataTables_paginate .ellipsis {
-    padding: 0 1em;
-}
-
-.dataTables_wrapper .dataTables_processing {
-    position: absolute;
-    top: 50%;
-    left: 50%;
-    width: 100%;
-    height: 40px;
-    margin-left: -50%;
-    margin-top: -25px;
-    padding-top: 20px;
-    text-align: center;
-    font-size: 1.2em;
-    background-color: white;
-    background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0)));
-    background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
-    background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
-    background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
-    background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
-    background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
-}
-
-.dataTables_wrapper .dataTables_length,
-.dataTables_wrapper .dataTables_filter,
-.dataTables_wrapper .dataTables_info,
-.dataTables_wrapper .dataTables_processing,
-.dataTables_wrapper .dataTables_paginate {
-    color: #333;
-}
-
-.dataTables_wrapper .dataTables_scroll {
-    clear: both;
-}
-
-.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody {
-    *margin-top: -1px;
-    -webkit-overflow-scrolling: touch;
-}
-
-.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td {
-    vertical-align: middle;
-}
-
-.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th > div.dataTables_sizing,
-.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td > div.dataTables_sizing {
-    height: 0;
-    overflow: hidden;
-    margin: 0 !important;
-    padding: 0 !important;
-}
-
-.dataTables_wrapper.no-footer .dataTables_scrollBody {
-    border-bottom: 1px solid #111;
-}
-
-.dataTables_wrapper.no-footer div.dataTables_scrollHead table,
-.dataTables_wrapper.no-footer div.dataTables_scrollBody table {
-    border-bottom: none;
-}
-
-.dataTables_wrapper:after {
-    visibility: hidden;
-    display: block;
-    content: "";
-    clear: both;
-    height: 0;
-}
-
-@media screen and (max-width: 767px) {
-    .dataTables_wrapper .dataTables_info,
-    .dataTables_wrapper .dataTables_paginate {
-        float: none;
-        text-align: center;
-    }
-
-    .dataTables_wrapper .dataTables_paginate {
-        margin-top: 0.5em;
-    }
-}
-
-@media screen and (max-width: 640px) {
-    .dataTables_wrapper .dataTables_length,
-    .dataTables_wrapper .dataTables_filter {
-        float: none;
-        text-align: center;
-    }
-
-    .dataTables_wrapper .dataTables_filter {
-        margin-top: 0.5em;
-    }
-}
-
-table.dataTable thead th div.DataTables_sort_wrapper {
-    position: relative;
-}
-
-table.dataTable thead th div.DataTables_sort_wrapper span {
-    position: absolute;
-    top: 50%;
-    margin-top: -8px;
-    right: -18px;
-}
-
-table.dataTable thead th.ui-state-default,
-table.dataTable tfoot th.ui-state-default {
-    border-left-width: 0;
-}
-
-table.dataTable thead th.ui-state-default:first-child,
-table.dataTable tfoot th.ui-state-default:first-child {
-    border-left-width: 1px;
-}
-
-/*
- * Control feature layout
- */
-.dataTables_wrapper .dataTables_paginate .fg-button {
-    box-sizing: border-box;
-    display: inline-block;
-    min-width: 1.5em;
-    padding: 0.5em;
-    margin-left: 2px;
-    text-align: center;
-    text-decoration: none !important;
-    cursor: pointer;
-    *cursor: hand;
-    border: 1px solid transparent;
-}
-
-.dataTables_wrapper .dataTables_paginate .fg-button:active {
-    outline: none;
-}
-
-.dataTables_wrapper .dataTables_paginate .fg-button:first-child {
-    border-top-left-radius: 3px;
-    border-bottom-left-radius: 3px;
-}
-
-.dataTables_wrapper .dataTables_paginate .fg-button:last-child {
-    border-top-right-radius: 3px;
-    border-bottom-right-radius: 3px;
-}
-
-.dataTables_wrapper .ui-widget-header {
-    font-weight: normal;
-}
-
-.dataTables_wrapper .ui-toolbar {
-    padding: 8px;
-}
-
-.dataTables_wrapper.no-footer .dataTables_scrollBody {
-    border-bottom: none;
-}
-
-.dataTables_wrapper .dataTables_length,
-.dataTables_wrapper .dataTables_filter,
-.dataTables_wrapper .dataTables_info,
-.dataTables_wrapper .dataTables_processing,
-.dataTables_wrapper .dataTables_paginate {
-    color: inherit;
-}
diff --git a/resources/assets/lib/DataTables/DataTables-1.10.11/css/dataTables.jqueryui.min.css b/resources/assets/lib/DataTables/DataTables-1.10.11/css/dataTables.jqueryui.min.css
deleted file mode 100644
index 9e026e7..0000000
--- a/resources/assets/lib/DataTables/DataTables-1.10.11/css/dataTables.jqueryui.min.css
+++ /dev/null
@@ -1 +0,0 @@
-table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px}table.dataTable tbody tr{background-color:#ffffff}table.dataTable tbody tr.selected{background-color:#B0BED9} [...]
diff --git a/resources/assets/lib/DataTables/DataTables-1.10.11/css/jquery.dataTables.css b/resources/assets/lib/DataTables/DataTables-1.10.11/css/jquery.dataTables.css
deleted file mode 100644
index c41899a..0000000
--- a/resources/assets/lib/DataTables/DataTables-1.10.11/css/jquery.dataTables.css
+++ /dev/null
@@ -1,539 +0,0 @@
-/*
- * Table styles
- */
-table.dataTable {
-    width: 100%;
-    margin: 0 auto;
-    clear: both;
-    border-collapse: separate;
-    border-spacing: 0;
-    /*
-     * Header and footer styles
-     */
-    /*
-     * Body styles
-     */
-}
-
-table.dataTable thead th,
-table.dataTable tfoot th {
-    font-weight: bold;
-}
-
-table.dataTable thead th,
-table.dataTable thead td {
-    padding: 10px 18px;
-    border-bottom: 1px solid #111;
-}
-
-table.dataTable thead th:active,
-table.dataTable thead td:active {
-    outline: none;
-}
-
-table.dataTable tfoot th,
-table.dataTable tfoot td {
-    padding: 10px 18px 6px 18px;
-    border-top: 1px solid #111;
-}
-
-table.dataTable thead .sorting,
-table.dataTable thead .sorting_asc,
-table.dataTable thead .sorting_desc {
-    cursor: pointer;
-    *cursor: hand;
-}
-
-table.dataTable thead .sorting,
-table.dataTable thead .sorting_asc,
-table.dataTable thead .sorting_desc,
-table.dataTable thead .sorting_asc_disabled,
-table.dataTable thead .sorting_desc_disabled {
-    background-repeat: no-repeat;
-    background-position: center right;
-}
-
-table.dataTable thead .sorting {
-    background-image: url("../images/sort_both.png");
-}
-
-table.dataTable thead .sorting_asc {
-    background-image: url("../images/sort_asc.png");
-}
-
-table.dataTable thead .sorting_desc {
-    background-image: url("../images/sort_desc.png");
-}
-
-table.dataTable thead .sorting_asc_disabled {
-    background-image: url("../images/sort_asc_disabled.png");
-}
-
-table.dataTable thead .sorting_desc_disabled {
-    background-image: url("../images/sort_desc_disabled.png");
-}
-
-table.dataTable tbody tr {
-    background-color: #ffffff;
-}
-
-table.dataTable tbody tr.selected {
-    background-color: #B0BED9;
-}
-
-table.dataTable tbody th,
-table.dataTable tbody td {
-    padding: 8px 10px;
-}
-
-table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td {
-    border-top: 1px solid #ddd;
-}
-
-table.dataTable.row-border tbody tr:first-child th,
-table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th,
-table.dataTable.display tbody tr:first-child td {
-    border-top: none;
-}
-
-table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td {
-    border-top: 1px solid #ddd;
-    border-right: 1px solid #ddd;
-}
-
-table.dataTable.cell-border tbody tr th:first-child,
-table.dataTable.cell-border tbody tr td:first-child {
-    border-left: 1px solid #ddd;
-}
-
-table.dataTable.cell-border tbody tr:first-child th,
-table.dataTable.cell-border tbody tr:first-child td {
-    border-top: none;
-}
-
-table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd {
-    background-color: #f9f9f9;
-}
-
-table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected {
-    background-color: #acbad4;
-}
-
-table.dataTable.hover tbody tr:hover, table.dataTable.display tbody tr:hover {
-    background-color: #f6f6f6;
-}
-
-table.dataTable.hover tbody tr:hover.selected, table.dataTable.display tbody tr:hover.selected {
-    background-color: #aab7d1;
-}
-
-table.dataTable.order-column tbody tr > .sorting_1,
-table.dataTable.order-column tbody tr > .sorting_2,
-table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1,
-table.dataTable.display tbody tr > .sorting_2,
-table.dataTable.display tbody tr > .sorting_3 {
-    background-color: #fafafa;
-}
-
-table.dataTable.order-column tbody tr.selected > .sorting_1,
-table.dataTable.order-column tbody tr.selected > .sorting_2,
-table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1,
-table.dataTable.display tbody tr.selected > .sorting_2,
-table.dataTable.display tbody tr.selected > .sorting_3 {
-    background-color: #acbad5;
-}
-
-table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 {
-    background-color: #f1f1f1;
-}
-
-table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 {
-    background-color: #f3f3f3;
-}
-
-table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 {
-    background-color: whitesmoke;
-}
-
-table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 {
-    background-color: #a6b4cd;
-}
-
-table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 {
-    background-color: #a8b5cf;
-}
-
-table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 {
-    background-color: #a9b7d1;
-}
-
-table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 {
-    background-color: #fafafa;
-}
-
-table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 {
-    background-color: #fcfcfc;
-}
-
-table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 {
-    background-color: #fefefe;
-}
-
-table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 {
-    background-color: #acbad5;
-}
-
-table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 {
-    background-color: #aebcd6;
-}
-
-table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 {
-    background-color: #afbdd8;
-}
-
-table.dataTable.display tbody tr:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1 {
-    background-color: #eaeaea;
-}
-
-table.dataTable.display tbody tr:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2 {
-    background-color: #ececec;
-}
-
-table.dataTable.display tbody tr:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3 {
-    background-color: #efefef;
-}
-
-table.dataTable.display tbody tr:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1 {
-    background-color: #a2aec7;
-}
-
-table.dataTable.display tbody tr:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2 {
-    background-color: #a3b0c9;
-}
-
-table.dataTable.display tbody tr:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3 {
-    background-color: #a5b2cb;
-}
-
-table.dataTable.no-footer {
-    border-bottom: 1px solid #111;
-}
-
-table.dataTable.nowrap th, table.dataTable.nowrap td {
-    white-space: nowrap;
-}
-
-table.dataTable.compact thead th,
-table.dataTable.compact thead td {
-    padding: 4px 17px 4px 4px;
-}
-
-table.dataTable.compact tfoot th,
-table.dataTable.compact tfoot td {
-    padding: 4px;
-}
-
-table.dataTable.compact tbody th,
-table.dataTable.compact tbody td {
-    padding: 4px;
-}
-
-table.dataTable th.dt-left,
-table.dataTable td.dt-left {
-    text-align: left;
-}
-
-table.dataTable th.dt-center,
-table.dataTable td.dt-center,
-table.dataTable td.dataTables_empty {
-    text-align: center;
-}
-
-table.dataTable th.dt-right,
-table.dataTable td.dt-right {
-    text-align: right;
-}
-
-table.dataTable th.dt-justify,
-table.dataTable td.dt-justify {
-    text-align: justify;
-}
-
-table.dataTable th.dt-nowrap,
-table.dataTable td.dt-nowrap {
-    white-space: nowrap;
-}
-
-table.dataTable thead th.dt-head-left,
-table.dataTable thead td.dt-head-left,
-table.dataTable tfoot th.dt-head-left,
-table.dataTable tfoot td.dt-head-left {
-    text-align: left;
-}
-
-table.dataTable thead th.dt-head-center,
-table.dataTable thead td.dt-head-center,
-table.dataTable tfoot th.dt-head-center,
-table.dataTable tfoot td.dt-head-center {
-    text-align: center;
-}
-
-table.dataTable thead th.dt-head-right,
-table.dataTable thead td.dt-head-right,
-table.dataTable tfoot th.dt-head-right,
-table.dataTable tfoot td.dt-head-right {
-    text-align: right;
-}
-
-table.dataTable thead th.dt-head-justify,
-table.dataTable thead td.dt-head-justify,
-table.dataTable tfoot th.dt-head-justify,
-table.dataTable tfoot td.dt-head-justify {
-    text-align: justify;
-}
-
-table.dataTable thead th.dt-head-nowrap,
-table.dataTable thead td.dt-head-nowrap,
-table.dataTable tfoot th.dt-head-nowrap,
-table.dataTable tfoot td.dt-head-nowrap {
-    white-space: nowrap;
-}
-
-table.dataTable tbody th.dt-body-left,
-table.dataTable tbody td.dt-body-left {
-    text-align: left;
-}
-
-table.dataTable tbody th.dt-body-center,
-table.dataTable tbody td.dt-body-center {
-    text-align: center;
-}
-
-table.dataTable tbody th.dt-body-right,
-table.dataTable tbody td.dt-body-right {
-    text-align: right;
-}
-
-table.dataTable tbody th.dt-body-justify,
-table.dataTable tbody td.dt-body-justify {
-    text-align: justify;
-}
-
-table.dataTable tbody th.dt-body-nowrap,
-table.dataTable tbody td.dt-body-nowrap {
-    white-space: nowrap;
-}
-
-table.dataTable,
-table.dataTable th,
-table.dataTable td {
-    -webkit-box-sizing: content-box;
-    -moz-box-sizing: content-box;
-    box-sizing: content-box;
-}
-
-/*
- * Control feature layout
- */
-.dataTables_wrapper {
-    position: relative;
-    clear: both;
-    *zoom: 1;
-    zoom: 1;
-}
-
-.dataTables_wrapper .dataTables_length {
-    float: left;
-}
-
-.dataTables_wrapper .dataTables_filter {
-    float: right;
-    text-align: right;
-}
-
-.dataTables_wrapper .dataTables_filter input {
-    margin-left: 0.5em;
-}
-
-.dataTables_wrapper .dataTables_info {
-    clear: both;
-    float: left;
-    padding-top: 0.755em;
-}
-
-.dataTables_wrapper .dataTables_paginate {
-    float: right;
-    text-align: right;
-    padding-top: 0.25em;
-}
-
-.dataTables_wrapper .dataTables_paginate .paginate_button {
-    box-sizing: border-box;
-    display: inline-block;
-    min-width: 1.5em;
-    padding: 0.5em 1em;
-    margin-left: 2px;
-    text-align: center;
-    text-decoration: none !important;
-    cursor: pointer;
-    *cursor: hand;
-    color: #333 !important;
-    border: 1px solid transparent;
-    border-radius: 2px;
-}
-
-.dataTables_wrapper .dataTables_paginate .paginate_button.current, .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover {
-    color: #333 !important;
-    border: 1px solid #979797;
-    background-color: white;
-    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, #dcdcdc));
-    /* Chrome,Safari4+ */
-    background: -webkit-linear-gradient(top, white 0%, #dcdcdc 100%);
-    /* Chrome10+,Safari5.1+ */
-    background: -moz-linear-gradient(top, white 0%, #dcdcdc 100%);
-    /* FF3.6+ */
-    background: -ms-linear-gradient(top, white 0%, #dcdcdc 100%);
-    /* IE10+ */
-    background: -o-linear-gradient(top, white 0%, #dcdcdc 100%);
-    /* Opera 11.10+ */
-    background: linear-gradient(to bottom, white 0%, #dcdcdc 100%);
-    /* W3C */
-}
-
-.dataTables_wrapper .dataTables_paginate .paginate_button.disabled, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active {
-    cursor: default;
-    color: #666 !important;
-    border: 1px solid transparent;
-    background: transparent;
-    box-shadow: none;
-}
-
-.dataTables_wrapper .dataTables_paginate .paginate_button:hover {
-    color: white !important;
-    border: 1px solid #111;
-    background-color: #585858;
-    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));
-    /* Chrome,Safari4+ */
-    background: -webkit-linear-gradient(top, #585858 0%, #111 100%);
-    /* Chrome10+,Safari5.1+ */
-    background: -moz-linear-gradient(top, #585858 0%, #111 100%);
-    /* FF3.6+ */
-    background: -ms-linear-gradient(top, #585858 0%, #111 100%);
-    /* IE10+ */
-    background: -o-linear-gradient(top, #585858 0%, #111 100%);
-    /* Opera 11.10+ */
-    background: linear-gradient(to bottom, #585858 0%, #111 100%);
-    /* W3C */
-}
-
-.dataTables_wrapper .dataTables_paginate .paginate_button:active {
-    outline: none;
-    background-color: #2b2b2b;
-    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));
-    /* Chrome,Safari4+ */
-    background: -webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
-    /* Chrome10+,Safari5.1+ */
-    background: -moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
-    /* FF3.6+ */
-    background: -ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
-    /* IE10+ */
-    background: -o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
-    /* Opera 11.10+ */
-    background: linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);
-    /* W3C */
-    box-shadow: inset 0 0 3px #111;
-}
-
-.dataTables_wrapper .dataTables_paginate .ellipsis {
-    padding: 0 1em;
-}
-
-.dataTables_wrapper .dataTables_processing {
-    position: absolute;
-    top: 50%;
-    left: 50%;
-    width: 100%;
-    height: 40px;
-    margin-left: -50%;
-    margin-top: -25px;
-    padding-top: 20px;
-    text-align: center;
-    font-size: 1.2em;
-    background-color: white;
-    background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0)));
-    background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
-    background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
-    background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
-    background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
-    background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
-}
-
-.dataTables_wrapper .dataTables_length,
-.dataTables_wrapper .dataTables_filter,
-.dataTables_wrapper .dataTables_info,
-.dataTables_wrapper .dataTables_processing,
-.dataTables_wrapper .dataTables_paginate {
-    color: #333;
-}
-
-.dataTables_wrapper .dataTables_scroll {
-    clear: both;
-}
-
-.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody {
-    *margin-top: -1px;
-    -webkit-overflow-scrolling: touch;
-}
-
-.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td {
-    vertical-align: middle;
-}
-
-.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th > div.dataTables_sizing,
-.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td > div.dataTables_sizing {
-    height: 0;
-    overflow: hidden;
-    margin: 0 !important;
-    padding: 0 !important;
-}
-
-.dataTables_wrapper.no-footer .dataTables_scrollBody {
-    border-bottom: 1px solid #111;
-}
-
-.dataTables_wrapper.no-footer div.dataTables_scrollHead table,
-.dataTables_wrapper.no-footer div.dataTables_scrollBody table {
-    border-bottom: none;
-}
-
-.dataTables_wrapper:after {
-    visibility: hidden;
-    display: block;
-    content: "";
-    clear: both;
-    height: 0;
-}
-
-@media screen and (max-width: 767px) {
-    .dataTables_wrapper .dataTables_info,
-    .dataTables_wrapper .dataTables_paginate {
-        float: none;
-        text-align: center;
-    }
-
-    .dataTables_wrapper .dataTables_paginate {
-        margin-top: 0.5em;
-    }
-}
-
-@media screen and (max-width: 640px) {
-    .dataTables_wrapper .dataTables_length,
-    .dataTables_wrapper .dataTables_filter {
-        float: none;
-        text-align: center;
-    }
-
-    .dataTables_wrapper .dataTables_filter {
-        margin-top: 0.5em;
-    }
-}
diff --git a/resources/assets/lib/DataTables/DataTables-1.10.11/css/jquery.dataTables.min.css b/resources/assets/lib/DataTables/DataTables-1.10.11/css/jquery.dataTables.min.css
deleted file mode 100644
index 9ec6ca3..0000000
--- a/resources/assets/lib/DataTables/DataTables-1.10.11/css/jquery.dataTables.min.css
+++ /dev/null
@@ -1 +0,0 @@
-table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #111}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111}table.dataTable thead .sorting,table.dataTable thead . [...]
diff --git a/resources/assets/lib/DataTables/DataTables-1.10.11/css/jquery.dataTables_themeroller.css b/resources/assets/lib/DataTables/DataTables-1.10.11/css/jquery.dataTables_themeroller.css
deleted file mode 100644
index da0218a..0000000
--- a/resources/assets/lib/DataTables/DataTables-1.10.11/css/jquery.dataTables_themeroller.css
+++ /dev/null
@@ -1,494 +0,0 @@
-/*
- * Table styles
- */
-table.dataTable {
-    width: 100%;
-    margin: 0 auto;
-    clear: both;
-    border-collapse: separate;
-    border-spacing: 0;
-    /*
-     * Header and footer styles
-     */
-    /*
-     * Body styles
-     */
-}
-
-table.dataTable thead th,
-table.dataTable thead td,
-table.dataTable tfoot th,
-table.dataTable tfoot td {
-    padding: 4px 10px;
-}
-
-table.dataTable thead th,
-table.dataTable tfoot th {
-    font-weight: bold;
-}
-
-table.dataTable thead th:active,
-table.dataTable thead td:active {
-    outline: none;
-}
-
-table.dataTable thead .sorting_asc,
-table.dataTable thead .sorting_desc,
-table.dataTable thead .sorting {
-    cursor: pointer;
-    *cursor: hand;
-}
-
-table.dataTable thead th div.DataTables_sort_wrapper {
-    position: relative;
-    padding-right: 10px;
-}
-
-table.dataTable thead th div.DataTables_sort_wrapper span {
-    position: absolute;
-    top: 50%;
-    margin-top: -8px;
-    right: -5px;
-}
-
-table.dataTable thead th.ui-state-default {
-    border-right-width: 0;
-}
-
-table.dataTable thead th.ui-state-default:last-child {
-    border-right-width: 1px;
-}
-
-table.dataTable tbody tr {
-    background-color: #ffffff;
-}
-
-table.dataTable tbody tr.selected {
-    background-color: #B0BED9;
-}
-
-table.dataTable tbody th,
-table.dataTable tbody td {
-    padding: 8px 10px;
-}
-
-table.dataTable th.center,
-table.dataTable td.center,
-table.dataTable td.dataTables_empty {
-    text-align: center;
-}
-
-table.dataTable th.right,
-table.dataTable td.right {
-    text-align: right;
-}
-
-table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td {
-    border-top: 1px solid #ddd;
-}
-
-table.dataTable.row-border tbody tr:first-child th,
-table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th,
-table.dataTable.display tbody tr:first-child td {
-    border-top: none;
-}
-
-table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td {
-    border-top: 1px solid #ddd;
-    border-right: 1px solid #ddd;
-}
-
-table.dataTable.cell-border tbody tr th:first-child,
-table.dataTable.cell-border tbody tr td:first-child {
-    border-left: 1px solid #ddd;
-}
-
-table.dataTable.cell-border tbody tr:first-child th,
-table.dataTable.cell-border tbody tr:first-child td {
-    border-top: none;
-}
-
-table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd {
-    background-color: #f9f9f9;
-}
-
-table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected {
-    background-color: #abb9d3;
-}
-
-table.dataTable.hover tbody tr:hover,
-table.dataTable.hover tbody tr.odd:hover,
-table.dataTable.hover tbody tr.even:hover, table.dataTable.display tbody tr:hover,
-table.dataTable.display tbody tr.odd:hover,
-table.dataTable.display tbody tr.even:hover {
-    background-color: whitesmoke;
-}
-
-table.dataTable.hover tbody tr:hover.selected,
-table.dataTable.hover tbody tr.odd:hover.selected,
-table.dataTable.hover tbody tr.even:hover.selected, table.dataTable.display tbody tr:hover.selected,
-table.dataTable.display tbody tr.odd:hover.selected,
-table.dataTable.display tbody tr.even:hover.selected {
-    background-color: #a9b7d1;
-}
-
-table.dataTable.order-column tbody tr > .sorting_1,
-table.dataTable.order-column tbody tr > .sorting_2,
-table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1,
-table.dataTable.display tbody tr > .sorting_2,
-table.dataTable.display tbody tr > .sorting_3 {
-    background-color: #f9f9f9;
-}
-
-table.dataTable.order-column tbody tr.selected > .sorting_1,
-table.dataTable.order-column tbody tr.selected > .sorting_2,
-table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1,
-table.dataTable.display tbody tr.selected > .sorting_2,
-table.dataTable.display tbody tr.selected > .sorting_3 {
-    background-color: #acbad4;
-}
-
-table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 {
-    background-color: #f1f1f1;
-}
-
-table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 {
-    background-color: #f3f3f3;
-}
-
-table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 {
-    background-color: whitesmoke;
-}
-
-table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 {
-    background-color: #a6b3cd;
-}
-
-table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 {
-    background-color: #a7b5ce;
-}
-
-table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 {
-    background-color: #a9b6d0;
-}
-
-table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 {
-    background-color: #f9f9f9;
-}
-
-table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 {
-    background-color: #fbfbfb;
-}
-
-table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 {
-    background-color: #fdfdfd;
-}
-
-table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 {
-    background-color: #acbad4;
-}
-
-table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 {
-    background-color: #adbbd6;
-}
-
-table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 {
-    background-color: #afbdd8;
-}
-
-table.dataTable.display tbody tr:hover > .sorting_1,
-table.dataTable.display tbody tr.odd:hover > .sorting_1,
-table.dataTable.display tbody tr.even:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1,
-table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_1,
-table.dataTable.order-column.hover tbody tr.even:hover > .sorting_1 {
-    background-color: #eaeaea;
-}
-
-table.dataTable.display tbody tr:hover > .sorting_2,
-table.dataTable.display tbody tr.odd:hover > .sorting_2,
-table.dataTable.display tbody tr.even:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2,
-table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_2,
-table.dataTable.order-column.hover tbody tr.even:hover > .sorting_2 {
-    background-color: #ebebeb;
-}
-
-table.dataTable.display tbody tr:hover > .sorting_3,
-table.dataTable.display tbody tr.odd:hover > .sorting_3,
-table.dataTable.display tbody tr.even:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3,
-table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_3,
-table.dataTable.order-column.hover tbody tr.even:hover > .sorting_3 {
-    background-color: #eeeeee;
-}
-
-table.dataTable.display tbody tr:hover.selected > .sorting_1,
-table.dataTable.display tbody tr.odd:hover.selected > .sorting_1,
-table.dataTable.display tbody tr.even:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1,
-table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_1,
-table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_1 {
-    background-color: #a1aec7;
-}
-
-table.dataTable.display tbody tr:hover.selected > .sorting_2,
-table.dataTable.display tbody tr.odd:hover.selected > .sorting_2,
-table.dataTable.display tbody tr.even:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2,
-table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_2,
-table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_2 {
-    background-color: #a2afc8;
-}
-
-table.dataTable.display tbody tr:hover.selected > .sorting_3,
-table.dataTable.display tbody tr.odd:hover.selected > .sorting_3,
-table.dataTable.display tbody tr.even:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3,
-table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_3,
-table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_3 {
-    background-color: #a4b2cb;
-}
-
-table.dataTable.nowrap th, table.dataTable.nowrap td {
-    white-space: nowrap;
-}
-
-table.dataTable.compact thead th,
-table.dataTable.compact thead td {
-    padding: 5px 9px;
-}
-
-table.dataTable.compact tfoot th,
-table.dataTable.compact tfoot td {
-    padding: 5px 9px 3px 9px;
-}
-
-table.dataTable.compact tbody th,
-table.dataTable.compact tbody td {
-    padding: 4px 5px;
-}
-
-table.dataTable th.dt-left,
-table.dataTable td.dt-left {
-    text-align: left;
-}
-
-table.dataTable th.dt-center,
-table.dataTable td.dt-center,
-table.dataTable td.dataTables_empty {
-    text-align: center;
-}
-
-table.dataTable th.dt-right,
-table.dataTable td.dt-right {
-    text-align: right;
-}
-
-table.dataTable th.dt-justify,
-table.dataTable td.dt-justify {
-    text-align: justify;
-}
-
-table.dataTable th.dt-nowrap,
-table.dataTable td.dt-nowrap {
-    white-space: nowrap;
-}
-
-table.dataTable thead th.dt-head-left,
-table.dataTable thead td.dt-head-left,
-table.dataTable tfoot th.dt-head-left,
-table.dataTable tfoot td.dt-head-left {
-    text-align: left;
-}
-
-table.dataTable thead th.dt-head-center,
-table.dataTable thead td.dt-head-center,
-table.dataTable tfoot th.dt-head-center,
-table.dataTable tfoot td.dt-head-center {
-    text-align: center;
-}
-
-table.dataTable thead th.dt-head-right,
-table.dataTable thead td.dt-head-right,
-table.dataTable tfoot th.dt-head-right,
-table.dataTable tfoot td.dt-head-right {
-    text-align: right;
-}
-
-table.dataTable thead th.dt-head-justify,
-table.dataTable thead td.dt-head-justify,
-table.dataTable tfoot th.dt-head-justify,
-table.dataTable tfoot td.dt-head-justify {
-    text-align: justify;
-}
-
-table.dataTable thead th.dt-head-nowrap,
-table.dataTable thead td.dt-head-nowrap,
-table.dataTable tfoot th.dt-head-nowrap,
-table.dataTable tfoot td.dt-head-nowrap {
-    white-space: nowrap;
-}
-
-table.dataTable tbody th.dt-body-left,
-table.dataTable tbody td.dt-body-left {
-    text-align: left;
-}
-
-table.dataTable tbody th.dt-body-center,
-table.dataTable tbody td.dt-body-center {
-    text-align: center;
-}
-
-table.dataTable tbody th.dt-body-right,
-table.dataTable tbody td.dt-body-right {
-    text-align: right;
-}
-
-table.dataTable tbody th.dt-body-justify,
-table.dataTable tbody td.dt-body-justify {
-    text-align: justify;
-}
-
-table.dataTable tbody th.dt-body-nowrap,
-table.dataTable tbody td.dt-body-nowrap {
-    white-space: nowrap;
-}
-
-table.dataTable,
-table.dataTable th,
-table.dataTable td {
-    -webkit-box-sizing: content-box;
-    -moz-box-sizing: content-box;
-    box-sizing: content-box;
-}
-
-/*
- * Control feature layout
- */
-.dataTables_wrapper {
-    position: relative;
-    clear: both;
-    *zoom: 1;
-    zoom: 1;
-}
-
-.dataTables_wrapper .dataTables_length {
-    float: left;
-}
-
-.dataTables_wrapper .dataTables_filter {
-    float: right;
-    text-align: right;
-}
-
-.dataTables_wrapper .dataTables_filter input {
-    margin-left: 0.5em;
-}
-
-.dataTables_wrapper .dataTables_info {
-    clear: both;
-    float: left;
-    padding-top: 0.55em;
-}
-
-.dataTables_wrapper .dataTables_paginate {
-    float: right;
-    text-align: right;
-}
-
-.dataTables_wrapper .dataTables_paginate .fg-button {
-    box-sizing: border-box;
-    display: inline-block;
-    min-width: 1.5em;
-    padding: 0.5em;
-    margin-left: 2px;
-    text-align: center;
-    text-decoration: none !important;
-    cursor: pointer;
-    *cursor: hand;
-    color: #333 !important;
-    border: 1px solid transparent;
-}
-
-.dataTables_wrapper .dataTables_paginate .fg-button:active {
-    outline: none;
-}
-
-.dataTables_wrapper .dataTables_paginate .fg-button:first-child {
-    border-top-left-radius: 3px;
-    border-bottom-left-radius: 3px;
-}
-
-.dataTables_wrapper .dataTables_paginate .fg-button:last-child {
-    border-top-right-radius: 3px;
-    border-bottom-right-radius: 3px;
-}
-
-.dataTables_wrapper .dataTables_processing {
-    position: absolute;
-    top: 50%;
-    left: 50%;
-    width: 100%;
-    height: 40px;
-    margin-left: -50%;
-    margin-top: -25px;
-    padding-top: 20px;
-    text-align: center;
-    font-size: 1.2em;
-    background-color: white;
-    background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0)));
-    /* Chrome,Safari4+ */
-    background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
-    /* Chrome10+,Safari5.1+ */
-    background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
-    /* FF3.6+ */
-    background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
-    /* IE10+ */
-    background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
-    /* Opera 11.10+ */
-    background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
-    /* W3C */
-}
-
-.dataTables_wrapper .dataTables_length,
-.dataTables_wrapper .dataTables_filter,
-.dataTables_wrapper .dataTables_info,
-.dataTables_wrapper .dataTables_processing,
-.dataTables_wrapper .dataTables_paginate {
-    color: #333;
-}
-
-.dataTables_wrapper .dataTables_scroll {
-    clear: both;
-}
-
-.dataTables_wrapper .dataTables_scrollBody {
-    *margin-top: -1px;
-    -webkit-overflow-scrolling: touch;
-}
-
-.dataTables_wrapper .ui-widget-header {
-    font-weight: normal;
-}
-
-.dataTables_wrapper .ui-toolbar {
-    padding: 8px;
-}
-
-.dataTables_wrapper:after {
-    visibility: hidden;
-    display: block;
-    content: "";
-    clear: both;
-    height: 0;
-}
-
-@media screen and (max-width: 767px) {
-    .dataTables_wrapper .dataTables_length,
-    .dataTables_wrapper .dataTables_filter,
-    .dataTables_wrapper .dataTables_info,
-    .dataTables_wrapper .dataTables_paginate {
-        float: none;
-        text-align: center;
-    }
-
-    .dataTables_wrapper .dataTables_filter,
-    .dataTables_wrapper .dataTables_paginate {
-        margin-top: 0.5em;
-    }
-}
diff --git a/resources/assets/lib/DataTables/DataTables-1.10.11/images/sort_asc.png b/resources/assets/lib/DataTables/DataTables-1.10.11/images/sort_asc.png
deleted file mode 100644
index e1ba61a..0000000
Binary files a/resources/assets/lib/DataTables/DataTables-1.10.11/images/sort_asc.png and /dev/null differ
diff --git a/resources/assets/lib/DataTables/DataTables-1.10.11/images/sort_asc_disabled.png b/resources/assets/lib/DataTables/DataTables-1.10.11/images/sort_asc_disabled.png
deleted file mode 100644
index fb11dfe..0000000
Binary files a/resources/assets/lib/DataTables/DataTables-1.10.11/images/sort_asc_disabled.png and /dev/null differ
diff --git a/resources/assets/lib/DataTables/DataTables-1.10.11/images/sort_both.png b/resources/assets/lib/DataTables/DataTables-1.10.11/images/sort_both.png
deleted file mode 100644
index af5bc7c..0000000
Binary files a/resources/assets/lib/DataTables/DataTables-1.10.11/images/sort_both.png and /dev/null differ
diff --git a/resources/assets/lib/DataTables/DataTables-1.10.11/images/sort_desc.png b/resources/assets/lib/DataTables/DataTables-1.10.11/images/sort_desc.png
deleted file mode 100644
index 0e156de..0000000
Binary files a/resources/assets/lib/DataTables/DataTables-1.10.11/images/sort_desc.png and /dev/null differ
diff --git a/resources/assets/lib/DataTables/DataTables-1.10.11/images/sort_desc_disabled.png b/resources/assets/lib/DataTables/DataTables-1.10.11/images/sort_desc_disabled.png
deleted file mode 100644
index c9fdd8a..0000000
Binary files a/resources/assets/lib/DataTables/DataTables-1.10.11/images/sort_desc_disabled.png and /dev/null differ
diff --git a/resources/assets/lib/DataTables/DataTables-1.10.11/js/dataTables.bootstrap.js b/resources/assets/lib/DataTables/DataTables-1.10.11/js/dataTables.bootstrap.js
deleted file mode 100644
index a46f5d8..0000000
--- a/resources/assets/lib/DataTables/DataTables-1.10.11/js/dataTables.bootstrap.js
+++ /dev/null
@@ -1,179 +0,0 @@
-/*! DataTables Bootstrap 3 integration
- * ©2011-2015 SpryMedia Ltd - datatables.net/license
- */
-
-/**
- * DataTables integration for Bootstrap 3. This requires Bootstrap 3 and
- * DataTables 1.10 or newer.
- *
- * This file sets the defaults and adds options to DataTables to style its
- * controls using Bootstrap. See http://datatables.net/manual/styling/bootstrap
- * for further information.
- */
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        // AMD
-        define(['jquery', 'datatables.net'], function ($) {
-            return factory($, window, document);
-        });
-    }
-    else if (typeof exports === 'object') {
-        // CommonJS
-        module.exports = function (root, $) {
-            if (!root) {
-                root = window;
-            }
-
-            if (!$ || !$.fn.dataTable) {
-                // Require DataTables, which attaches to jQuery, including
-                // jQuery if needed and have a $ property so we can access the
-                // jQuery object that is used
-                $ = require('datatables.net')(root, $).$;
-            }
-
-            return factory($, root, root.document);
-        };
-    }
-    else {
-        // Browser
-        factory(jQuery, window, document);
-    }
-}(function ($, window, document, undefined) {
-    'use strict';
-    var DataTable = $.fn.dataTable;
-
-    /* Set the defaults for DataTables initialisation */
-    $.extend(true, DataTable.defaults, {
-        dom: "<'row'<'col-sm-6'l><'col-sm-6'f>>" +
-             "<'row'<'col-sm-12'tr>>" +
-             "<'row'<'col-sm-5'i><'col-sm-7'p>>",
-        renderer: 'bootstrap'
-    });
-
-    /* Default class modification */
-    $.extend(DataTable.ext.classes, {
-        sWrapper: "dataTables_wrapper form-inline dt-bootstrap",
-        sFilterInput: "form-control input-sm",
-        sLengthSelect: "form-control input-sm",
-        sProcessing: "dataTables_processing panel panel-default"
-    });
-
-    /* Bootstrap paging button renderer */
-    DataTable.ext.renderer.pageButton.bootstrap =
-        function (settings, host, idx, buttons, page, pages) {
-            var api = new DataTable.Api(settings);
-            var classes = settings.oClasses;
-            var lang = settings.oLanguage.oPaginate;
-            var aria = settings.oLanguage.oAria.paginate || {};
-            var btnDisplay, btnClass, counter = 0;
-
-            var attach = function (container, buttons) {
-                var i, ien, node, button;
-                var clickHandler = function (e) {
-                    e.preventDefault();
-                    if (!$(e.currentTarget).hasClass('disabled') && api.page() != e.data.action) {
-                        api.page(e.data.action).draw('page');
-                    }
-                };
-
-                for (i = 0, ien = buttons.length; i < ien; i++) {
-                    button = buttons[i];
-
-                    if ($.isArray(button)) {
-                        attach(container, button);
-                    }
-                    else {
-                        btnDisplay = '';
-                        btnClass = '';
-
-                        switch (button) {
-                            case 'ellipsis':
-                                btnDisplay = '&#x2026;';
-                                btnClass = 'disabled';
-                                break;
-
-                            case 'first':
-                                btnDisplay = lang.sFirst;
-                                btnClass = button + (page > 0 ?
-                                                     '' : ' disabled');
-                                break;
-
-                            case 'previous':
-                                btnDisplay = lang.sPrevious;
-                                btnClass = button + (page > 0 ?
-                                                     '' : ' disabled');
-                                break;
-
-                            case 'next':
-                                btnDisplay = lang.sNext;
-                                btnClass = button + (page < pages - 1 ?
-                                                     '' : ' disabled');
-                                break;
-
-                            case 'last':
-                                btnDisplay = lang.sLast;
-                                btnClass = button + (page < pages - 1 ?
-                                                     '' : ' disabled');
-                                break;
-
-                            default:
-                                btnDisplay = button + 1;
-                                btnClass = page === button ?
-                                           'active' : '';
-                                break;
-                        }
-
-                        if (btnDisplay) {
-                            node = $('<li>', {
-                                'class': classes.sPageButton + ' ' + btnClass,
-                                'id': idx === 0 && typeof button === 'string' ?
-                                      settings.sTableId + '_' + button :
-                                      null
-                            })
-                                .append($('<a>', {
-                                            'href': '#',
-                                            'aria-controls': settings.sTableId,
-                                            'aria-label': aria[button],
-                                            'data-dt-idx': counter,
-                                            'tabindex': settings.iTabIndex
-                                        })
-                                            .html(btnDisplay)
-                                )
-                                .appendTo(container);
-
-                            settings.oApi._fnBindAction(
-                                node, {action: button}, clickHandler
-                            );
-
-                            counter++;
-                        }
-                    }
-                }
-            };
-
-            // IE9 throws an 'unknown error' if document.activeElement is used
-            // inside an iframe or frame. 
-            var activeEl;
-
-            try {
-                // Because this approach is destroying and recreating the paging
-                // elements, focus is lost on the select button which is bad for
-                // accessibility. So we want to restore focus once the draw has
-                // completed
-                activeEl = $(host).find(document.activeElement).data('dt-idx');
-            }
-            catch (e) {
-            }
-
-            attach(
-                $(host).empty().html('<ul class="pagination"/>').children('ul'),
-                buttons
-            );
-
-            if (activeEl) {
-                $(host).find('[data-dt-idx=' + activeEl + ']').focus();
-            }
-        };
-
-    return DataTable;
-}));
\ No newline at end of file
diff --git a/resources/assets/lib/DataTables/DataTables-1.10.11/js/dataTables.bootstrap.min.js b/resources/assets/lib/DataTables/DataTables-1.10.11/js/dataTables.bootstrap.min.js
deleted file mode 100644
index 2d824c8..0000000
--- a/resources/assets/lib/DataTables/DataTables-1.10.11/js/dataTables.bootstrap.min.js
+++ /dev/null
@@ -1,8 +0,0 @@
-/*!
- DataTables Bootstrap 3 integration
- ©2011-2015 SpryMedia Ltd - datatables.net/license
-*/
-(function(b){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(a){return b(a,window,document)}):"object"===typeof exports?module.exports=function(a,d){a||(a=window);if(!d||!d.fn.dataTable)d=require("datatables.net")(a,d).$;return b(d,a,a.document)}:b(jQuery,window,document)})(function(b,a,d){var f=b.fn.dataTable;b.extend(!0,f.defaults,{dom:"<'row'<'col-sm-6'l><'col-sm-6'f>><'row'<'col-sm-12'tr>><'row'<'col-sm-5'i><'col-sm-7'p>>",renderer:"bootstrap"});b.e [...]
-{sWrapper:"dataTables_wrapper form-inline dt-bootstrap",sFilterInput:"form-control input-sm",sLengthSelect:"form-control input-sm",sProcessing:"dataTables_processing panel panel-default"});f.ext.renderer.pageButton.bootstrap=function(a,h,r,m,j,n){var o=new f.Api(a),s=a.oClasses,k=a.oLanguage.oPaginate,t=a.oLanguage.oAria.paginate||{},e,g,p=0,q=function(d,f){var l,h,i,c,m=function(a){a.preventDefault();!b(a.currentTarget).hasClass("disabled")&&o.page()!=a.data.action&&o.page(a.data.action [...]
-l=0;for(h=f.length;l<h;l++)if(c=f[l],b.isArray(c))q(d,c);else{g=e="";switch(c){case "ellipsis":e="&#x2026;";g="disabled";break;case "first":e=k.sFirst;g=c+(0<j?"":" disabled");break;case "previous":e=k.sPrevious;g=c+(0<j?"":" disabled");break;case "next":e=k.sNext;g=c+(j<n-1?"":" disabled");break;case "last":e=k.sLast;g=c+(j<n-1?"":" disabled");break;default:e=c+1,g=j===c?"active":""}e&&(i=b("<li>",{"class":s.sPageButton+" "+g,id:0===r&&"string"===typeof c?a.sTableId+"_"+c:null}).append( [...]
-"aria-controls":a.sTableId,"aria-label":t[c],"data-dt-idx":p,tabindex:a.iTabIndex}).html(e)).appendTo(d),a.oApi._fnBindAction(i,{action:c},m),p++)}},i;try{i=b(h).find(d.activeElement).data("dt-idx")}catch(u){}q(b(h).empty().html('<ul class="pagination"/>').children("ul"),m);i&&b(h).find("[data-dt-idx="+i+"]").focus()};return f});
diff --git a/resources/assets/lib/DataTables/DataTables-1.10.11/js/dataTables.foundation.js b/resources/assets/lib/DataTables/DataTables-1.10.11/js/dataTables.foundation.js
deleted file mode 100644
index c14730d..0000000
--- a/resources/assets/lib/DataTables/DataTables-1.10.11/js/dataTables.foundation.js
+++ /dev/null
@@ -1,171 +0,0 @@
-/*! DataTables Foundation integration
- * ©2011-2015 SpryMedia Ltd - datatables.net/license
- */
-
-/**
- * DataTables integration for Foundation. This requires Foundation 5 and
- * DataTables 1.10 or newer.
- *
- * This file sets the defaults and adds options to DataTables to style its
- * controls using Foundation. See http://datatables.net/manual/styling/foundation
- * for further information.
- */
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        // AMD
-        define(['jquery', 'datatables.net'], function ($) {
-            return factory($, window, document);
-        });
-    }
-    else if (typeof exports === 'object') {
-        // CommonJS
-        module.exports = function (root, $) {
-            if (!root) {
-                root = window;
-            }
-
-            if (!$ || !$.fn.dataTable) {
-                $ = require('datatables.net')(root, $).$;
-            }
-
-            return factory($, root, root.document);
-        };
-    }
-    else {
-        // Browser
-        factory(jQuery, window, document);
-    }
-}(function ($, window, document, undefined) {
-    'use strict';
-    var DataTable = $.fn.dataTable;
-
-// Detect Foundation 5 / 6 as they have different element and class requirements
-    var meta = $('<meta class="foundation-mq"/>').appendTo('head');
-    DataTable.ext.foundationVersion = meta.css('font-family').match(/small|medium|large/) ? 6 : 5;
-    meta.remove();
-
-    $.extend(DataTable.ext.classes, {
-        sWrapper: "dataTables_wrapper dt-foundation",
-        sProcessing: "dataTables_processing panel"
-    });
-
-    /* Set the defaults for DataTables initialisation */
-    $.extend(true, DataTable.defaults, {
-        dom: "<'row'<'small-6 columns'l><'small-6 columns'f>r>" +
-             "t" +
-             "<'row'<'small-6 columns'i><'small-6 columns'p>>",
-        renderer: 'foundation'
-    });
-
-    /* Page button renderer */
-    DataTable.ext.renderer.pageButton.foundation =
-        function (settings, host, idx, buttons, page, pages) {
-            var api = new DataTable.Api(settings);
-            var classes = settings.oClasses;
-            var lang = settings.oLanguage.oPaginate;
-            var aria = settings.oLanguage.oAria.paginate || {};
-            var btnDisplay, btnClass;
-            var tag;
-            var v5 = DataTable.ext.foundationVersion === 5;
-
-            var attach = function (container, buttons) {
-                var i, ien, node, button;
-                var clickHandler = function (e) {
-                    e.preventDefault();
-                    if (!$(e.currentTarget).hasClass('unavailable') && api.page()
-                                                                       != e.data.action) {
-                        api.page(e.data.action).draw('page');
-                    }
-                };
-
-                for (i = 0, ien = buttons.length; i < ien; i++) {
-                    button = buttons[i];
-
-                    if ($.isArray(button)) {
-                        attach(container, button);
-                    }
-                    else {
-                        btnDisplay = '';
-                        btnClass = '';
-                        tag = null;
-
-                        switch (button) {
-                            case 'ellipsis':
-                                btnDisplay = '&#x2026;';
-                                btnClass = 'unavailable disabled';
-                                tag = null;
-                                break;
-
-                            case 'first':
-                                btnDisplay = lang.sFirst;
-                                btnClass = button + (page > 0 ?
-                                                     '' : ' unavailable disabled');
-                                tag = page > 0 ? 'a' : null;
-                                break;
-
-                            case 'previous':
-                                btnDisplay = lang.sPrevious;
-                                btnClass = button + (page > 0 ?
-                                                     '' : ' unavailable disabled');
-                                tag = page > 0 ? 'a' : null;
-                                break;
-
-                            case 'next':
-                                btnDisplay = lang.sNext;
-                                btnClass = button + (page < pages - 1 ?
-                                                     '' : ' unavailable disabled');
-                                tag = page < pages - 1 ? 'a' : null;
-                                break;
-
-                            case 'last':
-                                btnDisplay = lang.sLast;
-                                btnClass = button + (page < pages - 1 ?
-                                                     '' : ' unavailable disabled');
-                                tag = page < pages - 1 ? 'a' : null;
-                                break;
-
-                            default:
-                                btnDisplay = button + 1;
-                                btnClass = page === button ?
-                                           'current' : '';
-                                tag = page === button ?
-                                      null : 'a';
-                                break;
-                        }
-
-                        if (v5) {
-                            tag = 'a';
-                        }
-
-                        if (btnDisplay) {
-                            node = $('<li>', {
-                                'class': classes.sPageButton + ' ' + btnClass,
-                                'aria-controls': settings.sTableId,
-                                'aria-label': aria[button],
-                                'tabindex': settings.iTabIndex,
-                                'id': idx === 0 && typeof button === 'string' ?
-                                      settings.sTableId + '_' + button :
-                                      null
-                            })
-                                .append(tag ?
-                                        $('<' + tag + '/>', {'href': '#'}).html(btnDisplay) :
-                                        btnDisplay
-                                )
-                                .appendTo(container);
-
-                            settings.oApi._fnBindAction(
-                                node, {action: button}, clickHandler
-                            );
-                        }
-                    }
-                }
-            };
-
-            attach(
-                $(host).empty().html('<ul class="pagination"/>').children('ul'),
-                buttons
-            );
-        };
-
-    return DataTable;
-}));
diff --git a/resources/assets/lib/DataTables/DataTables-1.10.11/js/dataTables.foundation.min.js b/resources/assets/lib/DataTables/DataTables-1.10.11/js/dataTables.foundation.min.js
deleted file mode 100644
index 58c7b03..0000000
--- a/resources/assets/lib/DataTables/DataTables-1.10.11/js/dataTables.foundation.min.js
+++ /dev/null
@@ -1,8 +0,0 @@
-/*!
- DataTables Foundation integration
- ©2011-2015 SpryMedia Ltd - datatables.net/license
-*/
-(function(d){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(a){return d(a,window,document)}):"object"===typeof exports?module.exports=function(a,b){a||(a=window);if(!b||!b.fn.dataTable)b=require("datatables.net")(a,b).$;return d(b,a,a.document)}:d(jQuery,window,document)})(function(d){var a=d.fn.dataTable,b=d('<meta class="foundation-mq"/>').appendTo("head");a.ext.foundationVersion=b.css("font-family").match(/small|medium|large/)?6:5;b.remove();d.exten [...]
-{sWrapper:"dataTables_wrapper dt-foundation",sProcessing:"dataTables_processing panel"});d.extend(!0,a.defaults,{dom:"<'row'<'small-6 columns'l><'small-6 columns'f>r>t<'row'<'small-6 columns'i><'small-6 columns'p>>",renderer:"foundation"});a.ext.renderer.pageButton.foundation=function(b,l,r,s,e,i){var m=new a.Api(b),t=b.oClasses,j=b.oLanguage.oPaginate,u=b.oLanguage.oAria.paginate||{},f,h,g,v=5===a.ext.foundationVersion,q=function(a,n){var k,o,p,c,l=function(a){a.preventDefault();!d(a.cu [...]
-m.page()!=a.data.action&&m.page(a.data.action).draw("page")};k=0;for(o=n.length;k<o;k++)if(c=n[k],d.isArray(c))q(a,c);else{h=f="";g=null;switch(c){case "ellipsis":f="&#x2026;";h="unavailable disabled";g=null;break;case "first":f=j.sFirst;h=c+(0<e?"":" unavailable disabled");g=0<e?"a":null;break;case "previous":f=j.sPrevious;h=c+(0<e?"":" unavailable disabled");g=0<e?"a":null;break;case "next":f=j.sNext;h=c+(e<i-1?"":" unavailable disabled");g=e<i-1?"a":null;break;case "last":f=j.sLast;h= [...]
-"":" unavailable disabled");g=e<i-1?"a":null;break;default:f=c+1,h=e===c?"current":"",g=e===c?null:"a"}v&&(g="a");f&&(p=d("<li>",{"class":t.sPageButton+" "+h,"aria-controls":b.sTableId,"aria-label":u[c],tabindex:b.iTabIndex,id:0===r&&"string"===typeof c?b.sTableId+"_"+c:null}).append(g?d("<"+g+"/>",{href:"#"}).html(f):f).appendTo(a),b.oApi._fnBindAction(p,{action:c},l))}};q(d(l).empty().html('<ul class="pagination"/>').children("ul"),s)};return a});
diff --git a/resources/assets/lib/DataTables/DataTables-1.10.11/js/dataTables.jqueryui.js b/resources/assets/lib/DataTables/DataTables-1.10.11/js/dataTables.jqueryui.js
deleted file mode 100644
index 7c10bf0..0000000
--- a/resources/assets/lib/DataTables/DataTables-1.10.11/js/dataTables.jqueryui.js
+++ /dev/null
@@ -1,158 +0,0 @@
-/*! DataTables jQuery UI integration
- * ©2011-2014 SpryMedia Ltd - datatables.net/license
- */
-
-/**
- * DataTables integration for jQuery UI. This requires jQuery UI and
- * DataTables 1.10 or newer.
- *
- * This file sets the defaults and adds options to DataTables to style its
- * controls using jQuery UI. See http://datatables.net/manual/styling/jqueryui
- * for further information.
- */
-(function (factory) {
-    if (typeof define === 'function' && define.amd) {
-        // AMD
-        define(['jquery', 'datatables.net'], function ($) {
-            return factory($, window, document);
-        });
-    }
-    else if (typeof exports === 'object') {
-        // CommonJS
-        module.exports = function (root, $) {
-            if (!root) {
-                root = window;
-            }
-
-            if (!$ || !$.fn.dataTable) {
-                $ = require('datatables.net')(root, $).$;
-            }
-
-            return factory($, root, root.document);
-        };
-    }
-    else {
-        // Browser
-        factory(jQuery, window, document);
-    }
-}(function ($, window, document, undefined) {
-    'use strict';
-    var DataTable = $.fn.dataTable;
-
-    var sort_prefix = 'css_right ui-icon ui-icon-';
-    var toolbar_prefix = 'fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix ui-corner-';
-
-    /* Set the defaults for DataTables initialisation */
-    $.extend(true, DataTable.defaults, {
-        dom: '<"' + toolbar_prefix + 'tl ui-corner-tr"lfr>' +
-             't' +
-             '<"' + toolbar_prefix + 'bl ui-corner-br"ip>',
-        renderer: 'jqueryui'
-    });
-
-    $.extend(DataTable.ext.classes, {
-        "sWrapper": "dataTables_wrapper dt-jqueryui",
-
-        /* Full numbers paging buttons */
-        "sPageButton": "fg-button ui-button ui-state-default",
-        "sPageButtonActive": "ui-state-disabled",
-        "sPageButtonDisabled": "ui-state-disabled",
-
-        /* Features */
-        "sPaging": "dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi " +
-                   "ui-buttonset-multi paging_", /* Note that the type is postfixed */
-
-        /* Sorting */
-        "sSortAsc": "ui-state-default sorting_asc",
-        "sSortDesc": "ui-state-default sorting_desc",
-        "sSortable": "ui-state-default sorting",
-        "sSortableAsc": "ui-state-default sorting_asc_disabled",
-        "sSortableDesc": "ui-state-default sorting_desc_disabled",
-        "sSortableNone": "ui-state-default sorting_disabled",
-        "sSortIcon": "DataTables_sort_icon",
-
-        /* Scrolling */
-        "sScrollHead": "dataTables_scrollHead " + "ui-state-default",
-        "sScrollFoot": "dataTables_scrollFoot " + "ui-state-default",
-
-        /* Misc */
-        "sHeaderTH": "ui-state-default",
-        "sFooterTH": "ui-state-default"
-    });
-
-    DataTable.ext.renderer.header.jqueryui = function (settings, cell, column, classes) {
-        // Calculate what the unsorted class should be
-        var noSortAppliedClass = sort_prefix + 'carat-2-n-s';
-        var asc = $.inArray('asc', column.asSorting) !== -1;
-        var desc = $.inArray('desc', column.asSorting) !== -1;
-
-        if (!column.bSortable || (!asc && !desc)) {
-            noSortAppliedClass = '';
-        }
-        else if (asc && !desc) {
-            noSortAppliedClass = sort_prefix + 'carat-1-n';
-        }
-        else if (!asc && desc) {
-            noSortAppliedClass = sort_prefix + 'carat-1-s';
-        }
-
-        // Setup the DOM structure
-        $('<div/>')
-            .addClass('DataTables_sort_wrapper')
-            .append(cell.contents())
-            .append($('<span/>')
-                        .addClass(classes.sSortIcon + ' ' + noSortAppliedClass)
-            )
-            .appendTo(cell);
-
-        // Attach a sort listener to update on sort
-        $(settings.nTable).on('order.dt', function (e, ctx, sorting, columns) {
-            if (settings !== ctx) {
-                return;
-            }
-
-            var colIdx = column.idx;
-
-            cell
-                .removeClass(classes.sSortAsc + " " + classes.sSortDesc)
-                .addClass(columns[colIdx] == 'asc' ?
-                          classes.sSortAsc : columns[colIdx] == 'desc' ?
-                                             classes.sSortDesc :
-                                             column.sSortingClass
-                );
-
-            cell
-                .find('span.' + classes.sSortIcon)
-                .removeClass(
-                    sort_prefix + 'triangle-1-n' + " " +
-                    sort_prefix + 'triangle-1-s' + " " +
-                    sort_prefix + 'carat-2-n-s' + " " +
-                    sort_prefix + 'carat-1-n' + " " +
-                    sort_prefix + 'carat-1-s'
-                )
-                .addClass(columns[colIdx] == 'asc' ?
-                          sort_prefix + 'triangle-1-n' : columns[colIdx] == 'desc' ?
-                                                         sort_prefix + 'triangle-1-s' :
-                                                         noSortAppliedClass
-                );
-        });
-    };
-
-    /*
-     * TableTools jQuery UI compatibility
-     * Required TableTools 2.1+
-     */
-    if (DataTable.TableTools) {
-        $.extend(true, DataTable.TableTools.classes, {
-            "container": "DTTT_container ui-buttonset ui-buttonset-multi",
-            "buttons": {
-                "normal": "DTTT_button ui-button ui-state-default"
-            },
-            "collection": {
-                "container": "DTTT_collection ui-buttonset ui-buttonset-multi"
-            }
-        });
-    }
-
-    return DataTable;
-}));
diff --git a/resources/assets/lib/DataTables/DataTables-1.10.11/js/dataTables.jqueryui.min.js b/resources/assets/lib/DataTables/DataTables-1.10.11/js/dataTables.jqueryui.min.js
deleted file mode 100644
index 782d10f..0000000
--- a/resources/assets/lib/DataTables/DataTables-1.10.11/js/dataTables.jqueryui.min.js
+++ /dev/null
@@ -1,9 +0,0 @@
-/*!
- DataTables jQuery UI integration
- ©2011-2014 SpryMedia Ltd - datatables.net/license
-*/
-(function(a){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(b){return a(b,window,document)}):"object"===typeof exports?module.exports=function(b,d){b||(b=window);if(!d||!d.fn.dataTable)d=require("datatables.net")(b,d).$;return a(d,b,b.document)}:a(jQuery,window,document)})(function(a){var b=a.fn.dataTable;a.extend(!0,b.defaults,{dom:'<"fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix ui-corner-tl ui-corner-tr"lfr>t<"fg-toolbar ui-toolbar ui-wi [...]
-renderer:"jqueryui"});a.extend(b.ext.classes,{sWrapper:"dataTables_wrapper dt-jqueryui",sPageButton:"fg-button ui-button ui-state-default",sPageButtonActive:"ui-state-disabled",sPageButtonDisabled:"ui-state-disabled",sPaging:"dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi ui-buttonset-multi paging_",sSortAsc:"ui-state-default sorting_asc",sSortDesc:"ui-state-default sorting_desc",sSortable:"ui-state-default sorting",sSortableAsc:"ui-state-default sorting_asc_disabled",s [...]
-sSortableNone:"ui-state-default sorting_disabled",sSortIcon:"DataTables_sort_icon",sScrollHead:"dataTables_scrollHead ui-state-default",sScrollFoot:"dataTables_scrollFoot ui-state-default",sHeaderTH:"ui-state-default",sFooterTH:"ui-state-default"});b.ext.renderer.header.jqueryui=function(b,h,e,c){var f="css_right ui-icon ui-icon-carat-2-n-s",g=-1!==a.inArray("asc",e.asSorting),i=-1!==a.inArray("desc",e.asSorting);!e.bSortable||!g&&!i?f="":g&&!i?f="css_right ui-icon ui-icon-carat-1-n":!g& [...]
-a("<div/>").addClass("DataTables_sort_wrapper").append(h.contents()).append(a("<span/>").addClass(c.sSortIcon+" "+f)).appendTo(h);a(b.nTable).on("order.dt",function(a,g,i,j){b===g&&(a=e.idx,h.removeClass(c.sSortAsc+" "+c.sSortDesc).addClass("asc"==j[a]?c.sSortAsc:"desc"==j[a]?c.sSortDesc:e.sSortingClass),h.find("span."+c.sSortIcon).removeClass("css_right ui-icon ui-icon-triangle-1-n css_right ui-icon ui-icon-triangle-1-s css_right ui-icon ui-icon-carat-2-n-s css_right ui-icon ui-icon-car [...]
-j[a]?"css_right ui-icon ui-icon-triangle-1-n":"desc"==j[a]?"css_right ui-icon ui-icon-triangle-1-s":f))})};b.TableTools&&a.extend(!0,b.TableTools.classes,{container:"DTTT_container ui-buttonset ui-buttonset-multi",buttons:{normal:"DTTT_button ui-button ui-state-default"},collection:{container:"DTTT_collection ui-buttonset ui-buttonset-multi"}});return b});
diff --git a/resources/assets/lib/DataTables/DataTables-1.10.11/js/jquery.dataTables.js b/resources/assets/lib/DataTables/DataTables-1.10.11/js/jquery.dataTables.js
deleted file mode 100644
index 63feebb..0000000
--- a/resources/assets/lib/DataTables/DataTables-1.10.11/js/jquery.dataTables.js
+++ /dev/null
@@ -1,14545 +0,0 @@
-/*! DataTables 1.10.11
- * ©2008-2015 SpryMedia Ltd - datatables.net/license
- */
-
-/**
- * @summary     DataTables
- * @description Paginate, search and order HTML tables
- * @version     1.10.11
- * @file        jquery.dataTables.js
- * @author      SpryMedia Ltd (www.sprymedia.co.uk)
- * @contact     www.sprymedia.co.uk/contact
- * @copyright   Copyright 2008-2015 SpryMedia Ltd.
- *
- * This source file is free software, available under the following license:
- *   MIT license - http://datatables.net/license
- *
- * This source file 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 license files for details.
- *
- * For details please refer to: http://www.datatables.net
- */
-
-/*jslint evil: true, undef: true, browser: true */
-/*globals $,require,jQuery,define,_selector_run,_selector_opts,_selector_first,_selector_row_indexes,_ext,_Api,_api_register,_api_registerPlural,_re_new_lines,_re_html,_re_formatted_numeric,_re_escape_regex,_empty,_intVal,_numToDecimal,_isNumber,_isHtml,_htmlNumeric,_pluck,_pluck_order,_range,_stripHtml,_unique,_fnBuildAjax,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnAjaxDataSrc,_fnAddColumn,_fnColumnOptions,_fnAdjustColumnSizing,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_ [...]
-
-(function (factory) {
-    "use strict";
-
-    if (typeof define === 'function' && define.amd) {
-        // AMD
-        define(['jquery'], function ($) {
-            return factory($, window, document);
-        });
-    }
-    else if (typeof exports === 'object') {
-        // CommonJS
-        module.exports = function (root, $) {
-            if (!root) {
-                // CommonJS environments without a window global must pass a
-                // root. This will give an error otherwise
-                root = window;
-            }
-
-            if (!$) {
-                $ = typeof window !== 'undefined' ? // jQuery's factory checks for a global window
-                    require('jquery') :
-                    require('jquery')(root);
-            }
-
-            return factory($, root, root.document);
-        };
-    }
-    else {
-        // Browser
-        factory(jQuery, window, document);
-    }
-}
-(function ($, window, document, undefined) {
-    "use strict";
-
-    /**
-     * DataTables is a plug-in for the jQuery Javascript library. It is a highly
-     * flexible tool, based upon the foundations of progressive enhancement,
-     * which will add advanced interaction controls to any HTML table. For a
-     * full list of features please refer to
-     * [DataTables.net](href="http://datatables.net).
-     *
-     * Note that the `DataTable` object is not a global variable but is aliased
-     * to `jQuery.fn.DataTable` and `jQuery.fn.dataTable` through which it may
-     * be  accessed.
-     *
-     *  @class
-     *  @param {object} [init={}] Configuration object for DataTables. Options
-     *    are defined by {@link DataTable.defaults}
-     *  @requires jQuery 1.7+
-     *
-     *  @example
-     *    // Basic initialisation
-     *    $(document).ready( function {
-	 *      $('#example').dataTable();
-	 *    } );
-     *
-     *  @example
-     *    // Initialisation with configuration options - in this case, disable
-     *    // pagination and sorting.
-     *    $(document).ready( function {
-	 *      $('#example').dataTable( {
-	 *        "paginate": false,
-	 *        "sort": false
-	 *      } );
-	 *    } );
-     */
-    var DataTable;
-
-    /*
-     * It is useful to have variables which are scoped locally so only the
-     * DataTables functions can access them and they don't leak into global space.
-     * At the same time these functions are often useful over multiple files in the
-     * core and API, so we list, or at least document, all variables which are used
-     * by DataTables as private variables here. This also ensures that there is no
-     * clashing of variable names and that they can easily referenced for reuse.
-     */
-
-    // Defined else where
-    //  _selector_run
-    //  _selector_opts
-    //  _selector_first
-    //  _selector_row_indexes
-
-    var _ext; // DataTable.ext
-    var _Api; // DataTable.Api
-    var _api_register; // DataTable.Api.register
-    var _api_registerPlural; // DataTable.Api.registerPlural
-
-    var _re_dic = {};
-    var _re_new_lines = /[\r\n]/g;
-    var _re_html = /<.*?>/g;
-    var _re_date_start = /^[\w\+\-]/;
-    var _re_date_end = /[\w\+\-]$/;
-
-    // Escape regular expression special characters
-    var _re_escape_regex = new RegExp('(\\' + ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']',
-                                               '{', '}', '\\', '$', '^', '-'].join('|\\')
-                                      + ')', 'g');
-
-    // http://en.wikipedia.org/wiki/Foreign_exchange_market
-    // - \u20BD - Russian ruble.
-    // - \u20a9 - South Korean Won
-    // - \u20BA - Turkish Lira
-    // - \u20B9 - Indian Rupee
-    // - R - Brazil (R$) and South Africa
-    // - fr - Swiss Franc
-    // - kr - Swedish krona, Norwegian krone and Danish krone
-    // - \u2009 is thin space and \u202F is narrow no-break space, both used in many
-    //   standards as thousands separators.
-    var _re_formatted_numeric = /[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfk]/gi;
-
-    var _empty = function (d) {
-        return !d || d === true || d === '-' ? true : false;
-    };
-
-    var _intVal = function (s) {
-        var integer = parseInt(s, 10);
-        return !isNaN(integer) && isFinite(s) ? integer : null;
-    };
-
-    // Convert from a formatted number with characters other than `.` as the
-    // decimal place, to a Javascript number
-    var _numToDecimal = function (num, decimalPoint) {
-        // Cache created regular expressions for speed as this function is called often
-        if (!_re_dic[decimalPoint]) {
-            _re_dic[decimalPoint] = new RegExp(_fnEscapeRegex(decimalPoint), 'g');
-        }
-        return typeof num === 'string' && decimalPoint !== '.' ?
-               num.replace(/\./g, '').replace(_re_dic[decimalPoint], '.') :
-               num;
-    };
-
-    var _isNumber = function (d, decimalPoint, formatted) {
-        var strType = typeof d === 'string';
-
-        // If empty return immediately so there must be a number if it is a
-        // formatted string (this stops the string "k", or "kr", etc being detected
-        // as a formatted number for currency
-        if (_empty(d)) {
-            return true;
-        }
-
-        if (decimalPoint && strType) {
-            d = _numToDecimal(d, decimalPoint);
-        }
-
-        if (formatted && strType) {
-            d = d.replace(_re_formatted_numeric, '');
-        }
-
-        return !isNaN(parseFloat(d)) && isFinite(d);
-    };
-
-    // A string without HTML in it can be considered to be HTML still
-    var _isHtml = function (d) {
-        return _empty(d) || typeof d === 'string';
-    };
-
-    var _htmlNumeric = function (d, decimalPoint, formatted) {
-        if (_empty(d)) {
-            return true;
-        }
-
-        var html = _isHtml(d);
-        return !html ?
-               null :
-               _isNumber(_stripHtml(d), decimalPoint, formatted) ?
-               true :
-               null;
-    };
-
-    var _pluck = function (a, prop, prop2) {
-        var out = [];
-        var i = 0, ien = a.length;
-
-        // Could have the test in the loop for slightly smaller code, but speed
-        // is essential here
-        if (prop2 !== undefined) {
-            for (; i < ien; i++) {
-                if (a[i] && a[i][prop]) {
-                    out.push(a[i][prop][prop2]);
-                }
-            }
-        }
-        else {
-            for (; i < ien; i++) {
-                if (a[i]) {
-                    out.push(a[i][prop]);
-                }
-            }
-        }
-
-        return out;
-    };
-
-    // Basically the same as _pluck, but rather than looping over `a` we use `order`
-    // as the indexes to pick from `a`
-    var _pluck_order = function (a, order, prop, prop2) {
-        var out = [];
-        var i = 0, ien = order.length;
-
-        // Could have the test in the loop for slightly smaller code, but speed
-        // is essential here
-        if (prop2 !== undefined) {
-            for (; i < ien; i++) {
-                if (a[order[i]][prop]) {
-                    out.push(a[order[i]][prop][prop2]);
-                }
-            }
-        }
-        else {
-            for (; i < ien; i++) {
-                out.push(a[order[i]][prop]);
-            }
-        }
-
-        return out;
-    };
-
-    var _range = function (len, start) {
-        var out = [];
-        var end;
-
-        if (start === undefined) {
-            start = 0;
-            end = len;
-        }
-        else {
-            end = start;
-            start = len;
-        }
-
-        for (var i = start; i < end; i++) {
-            out.push(i);
-        }
-
-        return out;
-    };
-
-    var _removeEmpty = function (a) {
-        var out = [];
-
-        for (var i = 0, ien = a.length; i < ien; i++) {
-            if (a[i]) { // careful - will remove all falsy values!
-                out.push(a[i]);
-            }
-        }
-
-        return out;
-    };
-
-    var _stripHtml = function (d) {
-        return d.replace(_re_html, '');
-    };
-
-    /**
-     * Find the unique elements in a source array.
-     *
-     * @param  {array} src Source array
-     * @return {array} Array of unique items
-     * @ignore
-     */
-    var _unique = function (src) {
-        // A faster unique method is to use object keys to identify used values,
-        // but this doesn't work with arrays or objects, which we must also
-        // consider. See jsperf.com/compare-array-unique-versions/4 for more
-        // information.
-        var
-            out = [],
-            val,
-            i, ien = src.length,
-            j, k = 0;
-
-        again: for (i = 0; i < ien; i++) {
-            val = src[i];
-
-            for (j = 0; j < k; j++) {
-                if (out[j] === val) {
-                    continue again;
-                }
-            }
-
-            out.push(val);
-            k++;
-        }
-
-        return out;
-    };
-
-    /**
-     * Create a mapping object that allows camel case parameters to be looked up
-     * for their Hungarian counterparts. The mapping is stored in a private
-     * parameter called `_hungarianMap` which can be accessed on the source object.
-     *  @param {object} o
-     *  @memberof DataTable#oApi
-     */
-    function _fnHungarianMap(o) {
-        var
-            hungarian = 'a aa ai ao as b fn i m o s ',
-            match,
-            newKey,
-            map = {};
-
-        $.each(o, function (key, val) {
-            match = key.match(/^([^A-Z]+?)([A-Z])/);
-
-            if (match && hungarian.indexOf(match[1] + ' ') !== -1) {
-                newKey = key.replace(match[0], match[2].toLowerCase());
-                map[newKey] = key;
-
-                if (match[1] === 'o') {
-                    _fnHungarianMap(o[key]);
-                }
-            }
-        });
-
-        o._hungarianMap = map;
-    }
-
-    /**
-     * Convert from camel case parameters to Hungarian, based on a Hungarian map
-     * created by _fnHungarianMap.
-     *  @param {object} src The model object which holds all parameters that can be
-     *    mapped.
-     *  @param {object} user The object to convert from camel case to Hungarian.
-     *  @param {boolean} force When set to `true`, properties which already have a
-     *    Hungarian value in the `user` object will be overwritten. Otherwise they
-     *    won't be.
-     *  @memberof DataTable#oApi
-     */
-    function _fnCamelToHungarian(src, user, force) {
-        if (!src._hungarianMap) {
-            _fnHungarianMap(src);
-        }
-
-        var hungarianKey;
-
-        $.each(user, function (key, val) {
-            hungarianKey = src._hungarianMap[key];
-
-            if (hungarianKey !== undefined && (force || user[hungarianKey] === undefined)) {
-                // For objects, we need to buzz down into the object to copy parameters
-                if (hungarianKey.charAt(0) === 'o') {
-                    // Copy the camelCase options over to the hungarian
-                    if (!user[hungarianKey]) {
-                        user[hungarianKey] = {};
-                    }
-                    $.extend(true, user[hungarianKey], user[key]);
-
-                    _fnCamelToHungarian(src[hungarianKey], user[hungarianKey], force);
-                }
-                else {
-                    user[hungarianKey] = user[key];
-                }
-            }
-        });
-    }
-
-    /**
-     * Language compatibility - when certain options are given, and others aren't, we
-     * need to duplicate the values over, in order to provide backwards compatibility
-     * with older language files.
-     *  @param {object} oSettings dataTables settings object
-     *  @memberof DataTable#oApi
-     */
-    function _fnLanguageCompat(lang) {
-        var defaults = DataTable.defaults.oLanguage;
-        var zeroRecords = lang.sZeroRecords;
-
-        /* Backwards compatibility - if there is no sEmptyTable given, then use the same as
-         * sZeroRecords - assuming that is given.
-         */
-        if (!lang.sEmptyTable && zeroRecords &&
-            defaults.sEmptyTable === "No data available in table") {
-            _fnMap(lang, lang, 'sZeroRecords', 'sEmptyTable');
-        }
-
-        /* Likewise with loading records */
-        if (!lang.sLoadingRecords && zeroRecords &&
-            defaults.sLoadingRecords === "Loading...") {
-            _fnMap(lang, lang, 'sZeroRecords', 'sLoadingRecords');
-        }
-
-        // Old parameter name of the thousands separator mapped onto the new
-        if (lang.sInfoThousands) {
-            lang.sThousands = lang.sInfoThousands;
-        }
-
-        var decimal = lang.sDecimal;
-        if (decimal) {
-            _addNumericSort(decimal);
-        }
-    }
-
-    /**
-     * Map one parameter onto another
-     *  @param {object} o Object to map
-     *  @param {*} knew The new parameter name
-     *  @param {*} old The old parameter name
-     */
-    var _fnCompatMap = function (o, knew, old) {
-        if (o[knew] !== undefined) {
-            o[old] = o[knew];
-        }
-    };
-
-    /**
-     * Provide backwards compatibility for the main DT options. Note that the new
-     * options are mapped onto the old parameters, so this is an external interface
-     * change only.
-     *  @param {object} init Object to map
-     */
-    function _fnCompatOpts(init) {
-        _fnCompatMap(init, 'ordering', 'bSort');
-        _fnCompatMap(init, 'orderMulti', 'bSortMulti');
-        _fnCompatMap(init, 'orderClasses', 'bSortClasses');
-        _fnCompatMap(init, 'orderCellsTop', 'bSortCellsTop');
-        _fnCompatMap(init, 'order', 'aaSorting');
-        _fnCompatMap(init, 'orderFixed', 'aaSortingFixed');
-        _fnCompatMap(init, 'paging', 'bPaginate');
-        _fnCompatMap(init, 'pagingType', 'sPaginationType');
-        _fnCompatMap(init, 'pageLength', 'iDisplayLength');
-        _fnCompatMap(init, 'searching', 'bFilter');
-
-        // Boolean initialisation of x-scrolling
-        if (typeof init.sScrollX === 'boolean') {
-            init.sScrollX = init.sScrollX ? '100%' : '';
-        }
-        if (typeof init.scrollX === 'boolean') {
-            init.scrollX = init.scrollX ? '100%' : '';
-        }
-
-        // Column search objects are in an array, so it needs to be converted
-        // element by element
-        var searchCols = init.aoSearchCols;
-
-        if (searchCols) {
-            for (var i = 0, ien = searchCols.length; i < ien; i++) {
-                if (searchCols[i]) {
-                    _fnCamelToHungarian(DataTable.models.oSearch, searchCols[i]);
-                }
-            }
-        }
-    }
-
-    /**
-     * Provide backwards compatibility for column options. Note that the new options
-     * are mapped onto the old parameters, so this is an external interface change
-     * only.
-     *  @param {object} init Object to map
-     */
-    function _fnCompatCols(init) {
-        _fnCompatMap(init, 'orderable', 'bSortable');
-        _fnCompatMap(init, 'orderData', 'aDataSort');
-        _fnCompatMap(init, 'orderSequence', 'asSorting');
-        _fnCompatMap(init, 'orderDataType', 'sortDataType');
-
-        // orderData can be given as an integer
-        var dataSort = init.aDataSort;
-        if (dataSort && !$.isArray(dataSort)) {
-            init.aDataSort = [dataSort];
-        }
-    }
-
-    /**
-     * Browser feature detection for capabilities, quirks
-     *  @param {object} settings dataTables settings object
-     *  @memberof DataTable#oApi
-     */
-    function _fnBrowserDetect(settings) {
-        // We don't need to do this every time DataTables is constructed, the values
-        // calculated are specific to the browser and OS configuration which we
-        // don't expect to change between initialisations
-        if (!DataTable.__browser) {
-            var browser = {};
-            DataTable.__browser = browser;
-
-            // Scrolling feature / quirks detection
-            var n = $('<div/>')
-                .css({
-                         position: 'fixed',
-                         top: 0,
-                         left: 0,
-                         height: 1,
-                         width: 1,
-                         overflow: 'hidden'
-                     })
-                .append(
-                    $('<div/>')
-                        .css({
-                                 position: 'absolute',
-                                 top: 1,
-                                 left: 1,
-                                 width: 100,
-                                 overflow: 'scroll'
-                             })
-                        .append(
-                            $('<div/>')
-                                .css({
-                                         width: '100%',
-                                         height: 10
-                                     })
-                        )
-                )
-                .appendTo('body');
-
-            var outer = n.children();
-            var inner = outer.children();
-
-            // Numbers below, in order, are:
-            // inner.offsetWidth, inner.clientWidth, outer.offsetWidth, outer.clientWidth
-            //
-            // IE6 XP:                           100 100 100  83
-            // IE7 Vista:                        100 100 100  83
-            // IE 8+ Windows:                     83  83 100  83
-            // Evergreen Windows:                 83  83 100  83
-            // Evergreen Mac with scrollbars:     85  85 100  85
-            // Evergreen Mac without scrollbars: 100 100 100 100
-
-            // Get scrollbar width
-            browser.barWidth = outer[0].offsetWidth - outer[0].clientWidth;
-
-            // IE6/7 will oversize a width 100% element inside a scrolling element, to
-            // include the width of the scrollbar, while other browsers ensure the inner
-            // element is contained without forcing scrolling
-            browser.bScrollOversize = inner[0].offsetWidth === 100 && outer[0].clientWidth !== 100;
-
-            // In rtl text layout, some browsers (most, but not all) will place the
-            // scrollbar on the left, rather than the right.
-            browser.bScrollbarLeft = Math.round(inner.offset().left) !== 1;
-
-            // IE8- don't provide height and width for getBoundingClientRect
-            browser.bBounding = n[0].getBoundingClientRect().width ? true : false;
-
-            n.remove();
-        }
-
-        $.extend(settings.oBrowser, DataTable.__browser);
-        settings.oScroll.iBarWidth = DataTable.__browser.barWidth;
-    }
-
-    /**
-     * Array.prototype reduce[Right] method, used for browsers which don't support
-     * JS 1.6. Done this way to reduce code size, since we iterate either way
-     *  @param {object} settings dataTables settings object
-     *  @memberof DataTable#oApi
-     */
-    function _fnReduce(that, fn, init, start, end, inc) {
-        var
-            i = start,
-            value,
-            isSet = false;
-
-        if (init !== undefined) {
-            value = init;
-            isSet = true;
-        }
-
-        while (i !== end) {
-            if (!that.hasOwnProperty(i)) {
-                continue;
-            }
-
-            value = isSet ?
-                    fn(value, that[i], i, that) :
-                    that[i];
-
-            isSet = true;
-            i += inc;
-        }
-
-        return value;
-    }
-
-    /**
-     * Add a column to the list used for the table with default values
-     *  @param {object} oSettings dataTables settings object
-     *  @param {node} nTh The th element for this column
-     *  @memberof DataTable#oApi
-     */
-    function _fnAddColumn(oSettings, nTh) {
-        // Add column to aoColumns array
-        var oDefaults = DataTable.defaults.column;
-        var iCol = oSettings.aoColumns.length;
-        var oCol = $.extend({}, DataTable.models.oColumn, oDefaults, {
-            "nTh": nTh ? nTh : document.createElement('th'),
-            "sTitle": oDefaults.sTitle ? oDefaults.sTitle : nTh ? nTh.innerHTML : '',
-            "aDataSort": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol],
-            "mData": oDefaults.mData ? oDefaults.mData : iCol,
-            idx: iCol
-        });
-        oSettings.aoColumns.push(oCol);
-
-        // Add search object for column specific search. Note that the `searchCols[ iCol ]`
-        // passed into extend can be undefined. This allows the user to give a default
-        // with only some of the parameters defined, and also not give a default
-        var searchCols = oSettings.aoPreSearchCols;
-        searchCols[iCol] = $.extend({}, DataTable.models.oSearch, searchCols[iCol]);
-
-        // Use the default column options function to initialise classes etc
-        _fnColumnOptions(oSettings, iCol, $(nTh).data());
-    }
-
-    /**
-     * Apply options for a column
-     *  @param {object} oSettings dataTables settings object
-     *  @param {int} iCol column index to consider
-     *  @param {object} oOptions object with sType, bVisible and bSearchable etc
-     *  @memberof DataTable#oApi
-     */
-    function _fnColumnOptions(oSettings, iCol, oOptions) {
-        var oCol = oSettings.aoColumns[iCol];
-        var oClasses = oSettings.oClasses;
-        var th = $(oCol.nTh);
-
-        // Try to get width information from the DOM. We can't get it from CSS
-        // as we'd need to parse the CSS stylesheet. `width` option can override
-        if (!oCol.sWidthOrig) {
-            // Width attribute
-            oCol.sWidthOrig = th.attr('width') || null;
-
-            // Style attribute
-            var t = (th.attr('style') || '').match(/width:\s*(\d+[pxem%]+)/);
-            if (t) {
-                oCol.sWidthOrig = t[1];
-            }
-        }
-
-        /* User specified column options */
-        if (oOptions !== undefined && oOptions !== null) {
-            // Backwards compatibility
-            _fnCompatCols(oOptions);
-
-            // Map camel case parameters to their Hungarian counterparts
-            _fnCamelToHungarian(DataTable.defaults.column, oOptions);
-
-            /* Backwards compatibility for mDataProp */
-            if (oOptions.mDataProp !== undefined && !oOptions.mData) {
-                oOptions.mData = oOptions.mDataProp;
-            }
-
-            if (oOptions.sType) {
-                oCol._sManualType = oOptions.sType;
-            }
-
-            // `class` is a reserved word in Javascript, so we need to provide
-            // the ability to use a valid name for the camel case input
-            if (oOptions.className && !oOptions.sClass) {
-                oOptions.sClass = oOptions.className;
-            }
-
-            $.extend(oCol, oOptions);
-            _fnMap(oCol, oOptions, "sWidth", "sWidthOrig");
-
-            /* iDataSort to be applied (backwards compatibility), but aDataSort will take
-             * priority if defined
-             */
-            if (oOptions.iDataSort !== undefined) {
-                oCol.aDataSort = [oOptions.iDataSort];
-            }
-            _fnMap(oCol, oOptions, "aDataSort");
-        }
-
-        /* Cache the data get and set functions for speed */
-        var mDataSrc = oCol.mData;
-        var mData = _fnGetObjectDataFn(mDataSrc);
-        var mRender = oCol.mRender ? _fnGetObjectDataFn(oCol.mRender) : null;
-
-        var attrTest = function (src) {
-            return typeof src === 'string' && src.indexOf('@') !== -1;
-        };
-        oCol._bAttrSrc = $.isPlainObject(mDataSrc) && (
-                attrTest(mDataSrc.sort) || attrTest(mDataSrc.type) || attrTest(mDataSrc.filter)
-            );
-        oCol._setter = null;
-
-        oCol.fnGetData = function (rowData, type, meta) {
-            var innerData = mData(rowData, type, undefined, meta);
-
-            return mRender && type ?
-                   mRender(innerData, type, rowData, meta) :
-                   innerData;
-        };
-        oCol.fnSetData = function (rowData, val, meta) {
-            return _fnSetObjectDataFn(mDataSrc)(rowData, val, meta);
-        };
-
-        // Indicate if DataTables should read DOM data as an object or array
-        // Used in _fnGetRowElements
-        if (typeof mDataSrc !== 'number') {
-            oSettings._rowReadObject = true;
-        }
-
-        /* Feature sorting overrides column specific when off */
-        if (!oSettings.oFeatures.bSort) {
-            oCol.bSortable = false;
-            th.addClass(oClasses.sSortableNone); // Have to add class here as order event isn't
-                                                 // called
-        }
-
-        /* Check that the class assignment is correct for sorting */
-        var bAsc = $.inArray('asc', oCol.asSorting) !== -1;
-        var bDesc = $.inArray('desc', oCol.asSorting) !== -1;
-        if (!oCol.bSortable || (!bAsc && !bDesc)) {
-            oCol.sSortingClass = oClasses.sSortableNone;
-            oCol.sSortingClassJUI = "";
-        }
-        else if (bAsc && !bDesc) {
-            oCol.sSortingClass = oClasses.sSortableAsc;
-            oCol.sSortingClassJUI = oClasses.sSortJUIAscAllowed;
-        }
-        else if (!bAsc && bDesc) {
-            oCol.sSortingClass = oClasses.sSortableDesc;
-            oCol.sSortingClassJUI = oClasses.sSortJUIDescAllowed;
-        }
-        else {
-            oCol.sSortingClass = oClasses.sSortable;
-            oCol.sSortingClassJUI = oClasses.sSortJUI;
-        }
-    }
-
-    /**
-     * Adjust the table column widths for new data. Note: you would probably want to
-     * do a redraw after calling this function!
-     *  @param {object} settings dataTables settings object
-     *  @memberof DataTable#oApi
-     */
-    function _fnAdjustColumnSizing(settings) {
-        /* Not interested in doing column width calculation if auto-width is disabled */
-        if (settings.oFeatures.bAutoWidth !== false) {
-            var columns = settings.aoColumns;
-
-            _fnCalculateColumnWidths(settings);
-            for (var i = 0, iLen = columns.length; i < iLen; i++) {
-                columns[i].nTh.style.width = columns[i].sWidth;
-            }
-        }
-
-        var scroll = settings.oScroll;
-        if (scroll.sY !== '' || scroll.sX !== '') {
-            _fnScrollDraw(settings);
-        }
-
-        _fnCallbackFire(settings, null, 'column-sizing', [settings]);
-    }
-
-    /**
-     * Covert the index of a visible column to the index in the data array (take account
-     * of hidden columns)
-     *  @param {object} oSettings dataTables settings object
-     *  @param {int} iMatch Visible column index to lookup
-     *  @returns {int} i the data index
-     *  @memberof DataTable#oApi
-     */
-    function _fnVisibleToColumnIndex(oSettings, iMatch) {
-        var aiVis = _fnGetColumns(oSettings, 'bVisible');
-
-        return typeof aiVis[iMatch] === 'number' ?
-               aiVis[iMatch] :
-               null;
-    }
-
-    /**
-     * Covert the index of an index in the data array and convert it to the visible
-     *   column index (take account of hidden columns)
-     *  @param {int} iMatch Column index to lookup
-     *  @param {object} oSettings dataTables settings object
-     *  @returns {int} i the data index
-     *  @memberof DataTable#oApi
-     */
-    function _fnColumnIndexToVisible(oSettings, iMatch) {
-        var aiVis = _fnGetColumns(oSettings, 'bVisible');
-        var iPos = $.inArray(iMatch, aiVis);
-
-        return iPos !== -1 ? iPos : null;
-    }
-
-    /**
-     * Get the number of visible columns
-     *  @param {object} oSettings dataTables settings object
-     *  @returns {int} i the number of visible columns
-     *  @memberof DataTable#oApi
-     */
-    function _fnVisbleColumns(oSettings) {
-        return $(_pluck(oSettings.aoColumns, 'nTh')).filter(':visible').length;
-    }
-
-    /**
-     * Get an array of column indexes that match a given property
-     *  @param {object} oSettings dataTables settings object
-     *  @param {string} sParam Parameter in aoColumns to look for - typically
-     *    bVisible or bSearchable
-     *  @returns {array} Array of indexes with matched properties
-     *  @memberof DataTable#oApi
-     */
-    function _fnGetColumns(oSettings, sParam) {
-        var a = [];
-
-        $.map(oSettings.aoColumns, function (val, i) {
-            if (val[sParam]) {
-                a.push(i);
-            }
-        });
-
-        return a;
-    }
-
-    /**
-     * Calculate the 'type' of a column
-     *  @param {object} settings dataTables settings object
-     *  @memberof DataTable#oApi
-     */
-    function _fnColumnTypes(settings) {
-        var columns = settings.aoColumns;
-        var data = settings.aoData;
-        var types = DataTable.ext.type.detect;
-        var i, ien, j, jen, k, ken;
-        var col, cell, detectedType, cache;
-
-        // For each column, spin over the 
-        for (i = 0, ien = columns.length; i < ien; i++) {
-            col = columns[i];
-            cache = [];
-
-            if (!col.sType && col._sManualType) {
-                col.sType = col._sManualType;
-            }
-            else if (!col.sType) {
-                for (j = 0, jen = types.length; j < jen; j++) {
-                    for (k = 0, ken = data.length; k < ken; k++) {
-                        // Use a cache array so we only need to get the type data
-                        // from the formatter once (when using multiple detectors)
-                        if (cache[k] === undefined) {
-                            cache[k] = _fnGetCellData(settings, k, i, 'type');
-                        }
-
-                        detectedType = types[j](cache[k], settings);
-
-                        // If null, then this type can't apply to this column, so
-                        // rather than testing all cells, break out. There is an
-                        // exception for the last type which is `html`. We need to
-                        // scan all rows since it is possible to mix string and HTML
-                        // types
-                        if (!detectedType && j !== types.length - 1) {
-                            break;
-                        }
-
-                        // Only a single match is needed for html type since it is
-                        // bottom of the pile and very similar to string
-                        if (detectedType === 'html') {
-                            break;
-                        }
-                    }
-
-                    // Type is valid for all data points in the column - use this
-                    // type
-                    if (detectedType) {
-                        col.sType = detectedType;
-                        break;
-                    }
-                }
-
-                // Fall back - if no type was detected, always use string
-                if (!col.sType) {
-                    col.sType = 'string';
-                }
-            }
-        }
-    }
-
-    /**
-     * Take the column definitions and static columns arrays and calculate how
-     * they relate to column indexes. The callback function will then apply the
-     * definition found for a column to a suitable configuration object.
-     *  @param {object} oSettings dataTables settings object
-     *  @param {array} aoColDefs The aoColumnDefs array that is to be applied
-     *  @param {array} aoCols The aoColumns array that defines columns individually
-     *  @param {function} fn Callback function - takes two parameters, the calculated
-     *    column index and the definition for that column.
-     *  @memberof DataTable#oApi
-     */
-    function _fnApplyColumnDefs(oSettings, aoColDefs, aoCols, fn) {
-        var i, iLen, j, jLen, k, kLen, def;
-        var columns = oSettings.aoColumns;
-
-        // Column definitions with aTargets
-        if (aoColDefs) {
-            /* Loop over the definitions array - loop in reverse so first instance has priority */
-            for (i = aoColDefs.length - 1; i >= 0; i--) {
-                def = aoColDefs[i];
-
-                /* Each definition can target multiple columns, as it is an array */
-                var aTargets = def.targets !== undefined ?
-                               def.targets :
-                               def.aTargets;
-
-                if (!$.isArray(aTargets)) {
-                    aTargets = [aTargets];
-                }
-
-                for (j = 0, jLen = aTargets.length; j < jLen; j++) {
-                    if (typeof aTargets[j] === 'number' && aTargets[j] >= 0) {
-                        /* Add columns that we don't yet know about */
-                        while (columns.length <= aTargets[j]) {
-                            _fnAddColumn(oSettings);
-                        }
-
-                        /* Integer, basic index */
-                        fn(aTargets[j], def);
-                    }
-                    else if (typeof aTargets[j] === 'number' && aTargets[j] < 0) {
-                        /* Negative integer, right to left column counting */
-                        fn(columns.length + aTargets[j], def);
-                    }
-                    else if (typeof aTargets[j] === 'string') {
-                        /* Class name matching on TH element */
-                        for (k = 0, kLen = columns.length; k < kLen; k++) {
-                            if (aTargets[j] == "_all" ||
-                                $(columns[k].nTh).hasClass(aTargets[j])) {
-                                fn(k, def);
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        // Statically defined columns array
-        if (aoCols) {
-            for (i = 0, iLen = aoCols.length; i < iLen; i++) {
-                fn(i, aoCols[i]);
-            }
-        }
-    }
-
-    /**
-     * Add a data array to the table, creating DOM node etc. This is the parallel to
-     * _fnGatherData, but for adding rows from a Javascript source, rather than a
-     * DOM source.
-     *  @param {object} oSettings dataTables settings object
-     *  @param {array} aData data array to be added
-     *  @param {node} [nTr] TR element to add to the table - optional. If not given,
-     *    DataTables will create a row automatically
-     *  @param {array} [anTds] Array of TD|TH elements for the row - must be given
-     *    if nTr is.
-     *  @returns {int} >=0 if successful (index of new aoData entry), -1 if failed
-     *  @memberof DataTable#oApi
-     */
-    function _fnAddData(oSettings, aDataIn, nTr, anTds) {
-        /* Create the object for storing information about this new row */
-        var iRow = oSettings.aoData.length;
-        var oData = $.extend(true, {}, DataTable.models.oRow, {
-            src: nTr ? 'dom' : 'data',
-            idx: iRow
-        });
-
-        oData._aData = aDataIn;
-        oSettings.aoData.push(oData);
-
-        /* Create the cells */
-        var nTd, sThisType;
-        var columns = oSettings.aoColumns;
-
-        // Invalidate the column types as the new data needs to be revalidated
-        for (var i = 0, iLen = columns.length; i < iLen; i++) {
-            columns[i].sType = null;
-        }
-
-        /* Add to the display array */
-        oSettings.aiDisplayMaster.push(iRow);
-
-        var id = oSettings.rowIdFn(aDataIn);
-        if (id !== undefined) {
-            oSettings.aIds[id] = oData;
-        }
-
-        /* Create the DOM information, or register it if already present */
-        if (nTr || !oSettings.oFeatures.bDeferRender) {
-            _fnCreateTr(oSettings, iRow, nTr, anTds);
-        }
-
-        return iRow;
-    }
-
-    /**
-     * Add one or more TR elements to the table. Generally we'd expect to
-     * use this for reading data from a DOM sourced table, but it could be
-     * used for an TR element. Note that if a TR is given, it is used (i.e.
-     * it is not cloned).
-     *  @param {object} settings dataTables settings object
-     *  @param {array|node|jQuery} trs The TR element(s) to add to the table
-     *  @returns {array} Array of indexes for the added rows
-     *  @memberof DataTable#oApi
-     */
-    function _fnAddTr(settings, trs) {
-        var row;
-
-        // Allow an individual node to be passed in
-        if (!(trs instanceof $)) {
-            trs = $(trs);
-        }
-
-        return trs.map(function (i, el) {
-            row = _fnGetRowElements(settings, el);
-            return _fnAddData(settings, row.data, el, row.cells);
-        });
-    }
-
-    /**
-     * Take a TR element and convert it to an index in aoData
-     *  @param {object} oSettings dataTables settings object
-     *  @param {node} n the TR element to find
-     *  @returns {int} index if the node is found, null if not
-     *  @memberof DataTable#oApi
-     */
-    function _fnNodeToDataIndex(oSettings, n) {
-        return (n._DT_RowIndex !== undefined) ? n._DT_RowIndex : null;
-    }
-
-    /**
-     * Take a TD element and convert it into a column data index (not the visible index)
-     *  @param {object} oSettings dataTables settings object
-     *  @param {int} iRow The row number the TD/TH can be found in
-     *  @param {node} n The TD/TH element to find
-     *  @returns {int} index if the node is found, -1 if not
-     *  @memberof DataTable#oApi
-     */
-    function _fnNodeToColumnIndex(oSettings, iRow, n) {
-        return $.inArray(n, oSettings.aoData[iRow].anCells);
-    }
-
-    /**
-     * Get the data for a given cell from the internal cache, taking into account data mapping
-     *  @param {object} settings dataTables settings object
-     *  @param {int} rowIdx aoData row id
-     *  @param {int} colIdx Column index
-     *  @param {string} type data get type ('display', 'type' 'filter' 'sort')
-     *  @returns {*} Cell data
-     *  @memberof DataTable#oApi
-     */
-    function _fnGetCellData(settings, rowIdx, colIdx, type) {
-        var draw = settings.iDraw;
-        var col = settings.aoColumns[colIdx];
-        var rowData = settings.aoData[rowIdx]._aData;
-        var defaultContent = col.sDefaultContent;
-        var cellData = col.fnGetData(rowData, type, {
-            settings: settings,
-            row: rowIdx,
-            col: colIdx
-        });
-
-        if (cellData === undefined) {
-            if (settings.iDrawError != draw && defaultContent === null) {
-                _fnLog(settings, 0, "Requested unknown parameter " +
-                                    (typeof col.mData == 'function' ? '{function}' : "'" + col.mData
-                                    + "'") +
-                                    " for row " + rowIdx + ", column " + colIdx, 4);
-                settings.iDrawError = draw;
-            }
-            return defaultContent;
-        }
-
-        // When the data source is null and a specific data type is requested (i.e.
-        // not the original data), we can use default column data
-        if ((cellData === rowData || cellData === null) && defaultContent !== null && type
-                                                                                      !== undefined) {
-            cellData = defaultContent;
-        }
-        else if (typeof cellData === 'function') {
-            // If the data source is a function, then we run it and use the return,
-            // executing in the scope of the data object (for instances)
-            return cellData.call(rowData);
-        }
-
-        if (cellData === null && type == 'display') {
-            return '';
-        }
-        return cellData;
-    }
-
-    /**
-     * Set the value for a specific cell, into the internal data cache
-     *  @param {object} settings dataTables settings object
-     *  @param {int} rowIdx aoData row id
-     *  @param {int} colIdx Column index
-     *  @param {*} val Value to set
-     *  @memberof DataTable#oApi
-     */
-    function _fnSetCellData(settings, rowIdx, colIdx, val) {
-        var col = settings.aoColumns[colIdx];
-        var rowData = settings.aoData[rowIdx]._aData;
-
-        col.fnSetData(rowData, val, {
-            settings: settings,
-            row: rowIdx,
-            col: colIdx
-        });
-    }
-
-    // Private variable that is used to match action syntax in the data property object
-    var __reArray = /\[.*?\]$/;
-    var __reFn = /\(\)$/;
-
-    /**
-     * Split string on periods, taking into account escaped periods
-     * @param  {string} str String to split
-     * @return {array} Split string
-     */
-    function _fnSplitObjNotation(str) {
-        return $.map(str.match(/(\\.|[^\.])+/g) || [''], function (s) {
-            return s.replace(/\\./g, '.');
-        });
-    }
-
-    /**
-     * Return a function that can be used to get data from a source object, taking
-     * into account the ability to use nested objects as a source
-     *  @param {string|int|function} mSource The data source for the object
-     *  @returns {function} Data get function
-     *  @memberof DataTable#oApi
-     */
-    function _fnGetObjectDataFn(mSource) {
-        if ($.isPlainObject(mSource)) {
-            /* Build an object of get functions, and wrap them in a single call */
-            var o = {};
-            $.each(mSource, function (key, val) {
-                if (val) {
-                    o[key] = _fnGetObjectDataFn(val);
-                }
-            });
-
-            return function (data, type, row, meta) {
-                var t = o[type] || o._;
-                return t !== undefined ?
-                       t(data, type, row, meta) :
-                       data;
-            };
-        }
-        else if (mSource === null) {
-            /* Give an empty string for rendering / sorting etc */
-            return function (data) { // type, row and meta also passed, but not used
-                return data;
-            };
-        }
-        else if (typeof mSource === 'function') {
-            return function (data, type, row, meta) {
-                return mSource(data, type, row, meta);
-            };
-        }
-        else if (typeof mSource === 'string' && (mSource.indexOf('.') !== -1 ||
-                                                 mSource.indexOf('[') !== -1 || mSource.indexOf('(')
-                                                                                !== -1)) {
-            /* If there is a . in the source string then the data source is in a
-             * nested object so we loop over the data for each level to get the next
-             * level down. On each loop we test for undefined, and if found immediately
-             * return. This allows entire objects to be missing and sDefaultContent to
-             * be used if defined, rather than throwing an error
-             */
-            var fetchData = function (data, type, src) {
-                var arrayNotation, funcNotation, out, innerSrc;
-
-                if (src !== "") {
-                    var a = _fnSplitObjNotation(src);
-
-                    for (var i = 0, iLen = a.length; i < iLen; i++) {
-                        // Check if we are dealing with special notation
-                        arrayNotation = a[i].match(__reArray);
-                        funcNotation = a[i].match(__reFn);
-
-                        if (arrayNotation) {
-                            // Array notation
-                            a[i] = a[i].replace(__reArray, '');
-
-                            // Condition allows simply [] to be passed in
-                            if (a[i] !== "") {
-                                data = data[a[i]];
-                            }
-                            out = [];
-
-                            // Get the remainder of the nested object to get
-                            a.splice(0, i + 1);
-                            innerSrc = a.join('.');
-
-                            // Traverse each entry in the array getting the properties requested
-                            if ($.isArray(data)) {
-                                for (var j = 0, jLen = data.length; j < jLen; j++) {
-                                    out.push(fetchData(data[j], type, innerSrc));
-                                }
-                            }
-
-                            // If a string is given in between the array notation indicators, that
-                            // is used to join the strings together, otherwise an array is returned
-                            var join = arrayNotation[0].substring(1, arrayNotation[0].length - 1);
-                            data = (join === "") ? out : out.join(join);
-
-                            // The inner call to fetchData has already traversed through the
-                            // remainder of the source requested, so we exit from the loop
-                            break;
-                        }
-                        else if (funcNotation) {
-                            // Function call
-                            a[i] = a[i].replace(__reFn, '');
-                            data = data[a[i]]();
-                            continue;
-                        }
-
-                        if (data === null || data[a[i]] === undefined) {
-                            return undefined;
-                        }
-                        data = data[a[i]];
-                    }
-                }
-
-                return data;
-            };
-
-            return function (data, type) { // row and meta also passed, but not used
-                return fetchData(data, type, mSource);
-            };
-        }
-        else {
-            /* Array or flat object mapping */
-            return function (data, type) { // row and meta also passed, but not used
-                return data[mSource];
-            };
-        }
-    }
-
-    /**
-     * Return a function that can be used to set data from a source object, taking
-     * into account the ability to use nested objects as a source
-     *  @param {string|int|function} mSource The data source for the object
-     *  @returns {function} Data set function
-     *  @memberof DataTable#oApi
-     */
-    function _fnSetObjectDataFn(mSource) {
-        if ($.isPlainObject(mSource)) {
-            /* Unlike get, only the underscore (global) option is used for for
-             * setting data since we don't know the type here. This is why an object
-             * option is not documented for `mData` (which is read/write), but it is
-             * for `mRender` which is read only.
-             */
-            return _fnSetObjectDataFn(mSource._);
-        }
-        else if (mSource === null) {
-            /* Nothing to do when the data source is null */
-            return function () {
-            };
-        }
-        else if (typeof mSource === 'function') {
-            return function (data, val, meta) {
-                mSource(data, 'set', val, meta);
-            };
-        }
-        else if (typeof mSource === 'string' && (mSource.indexOf('.') !== -1 ||
-                                                 mSource.indexOf('[') !== -1 || mSource.indexOf('(')
-                                                                                !== -1)) {
-            /* Like the get, we need to get data from a nested object */
-            var setData = function (data, val, src) {
-                var a = _fnSplitObjNotation(src), b;
-                var aLast = a[a.length - 1];
-                var arrayNotation, funcNotation, o, innerSrc;
-
-                for (var i = 0, iLen = a.length - 1; i < iLen; i++) {
-                    // Check if we are dealing with an array notation request
-                    arrayNotation = a[i].match(__reArray);
-                    funcNotation = a[i].match(__reFn);
-
-                    if (arrayNotation) {
-                        a[i] = a[i].replace(__reArray, '');
-                        data[a[i]] = [];
-
-                        // Get the remainder of the nested object to set so we can recurse
-                        b = a.slice();
-                        b.splice(0, i + 1);
-                        innerSrc = b.join('.');
-
-                        // Traverse each entry in the array setting the properties requested
-                        if ($.isArray(val)) {
-                            for (var j = 0, jLen = val.length; j < jLen; j++) {
-                                o = {};
-                                setData(o, val[j], innerSrc);
-                                data[a[i]].push(o);
-                            }
-                        }
-                        else {
-                            // We've been asked to save data to an array, but it
-                            // isn't array data to be saved. Best that can be done
-                            // is to just save the value.
-                            data[a[i]] = val;
-                        }
-
-                        // The inner call to setData has already traversed through the remainder
-                        // of the source and has set the data, thus we can exit here
-                        return;
-                    }
-                    else if (funcNotation) {
-                        // Function call
-                        a[i] = a[i].replace(__reFn, '');
-                        data = data[a[i]](val);
-                    }
-
-                    // If the nested object doesn't currently exist - since we are
-                    // trying to set the value - create it
-                    if (data[a[i]] === null || data[a[i]] === undefined) {
-                        data[a[i]] = {};
-                    }
-                    data = data[a[i]];
-                }
-
-                // Last item in the input - i.e, the actual set
-                if (aLast.match(__reFn)) {
-                    // Function call
-                    data = data[aLast.replace(__reFn, '')](val);
-                }
-                else {
-                    // If array notation is used, we just want to strip it and use the property name
-                    // and assign the value. If it isn't used, then we get the result we want anyway
-                    data[aLast.replace(__reArray, '')] = val;
-                }
-            };
-
-            return function (data, val) { // meta is also passed in, but not used
-                return setData(data, val, mSource);
-            };
-        }
-        else {
-            /* Array or flat object mapping */
-            return function (data, val) { // meta is also passed in, but not used
-                data[mSource] = val;
-            };
-        }
-    }
-
-    /**
-     * Return an array with the full table data
-     *  @param {object} oSettings dataTables settings object
-     *  @returns array {array} aData Master data array
-     *  @memberof DataTable#oApi
-     */
-    function _fnGetDataMaster(settings) {
-        return _pluck(settings.aoData, '_aData');
-    }
-
-    /**
-     * Nuke the table
-     *  @param {object} oSettings dataTables settings object
-     *  @memberof DataTable#oApi
-     */
-    function _fnClearTable(settings) {
-        settings.aoData.length = 0;
-        settings.aiDisplayMaster.length = 0;
-        settings.aiDisplay.length = 0;
-        settings.aIds = {};
-    }
-
-    /**
-     * Take an array of integers (index array) and remove a target integer (value - not
-     * the key!)
-     *  @param {array} a Index array to target
-     *  @param {int} iTarget value to find
-     *  @memberof DataTable#oApi
-     */
-    function _fnDeleteIndex(a, iTarget, splice) {
-        var iTargetIndex = -1;
-
-        for (var i = 0, iLen = a.length; i < iLen; i++) {
-            if (a[i] == iTarget) {
-                iTargetIndex = i;
-            }
-            else if (a[i] > iTarget) {
-                a[i]--;
-            }
-        }
-
-        if (iTargetIndex != -1 && splice === undefined) {
-            a.splice(iTargetIndex, 1);
-        }
-    }
-
-    /**
-     * Mark cached data as invalid such that a re-read of the data will occur when
-     * the cached data is next requested. Also update from the data source object.
-     *
-     * @param {object} settings DataTables settings object
-     * @param {int}    rowIdx   Row index to invalidate
-     * @param {string} [src]    Source to invalidate from: undefined, 'auto', 'dom'
-     *     or 'data'
-     * @param {int}    [colIdx] Column index to invalidate. If undefined the whole
-     *     row will be invalidated
-     * @memberof DataTable#oApi
-     *
-     * @todo For the modularisation of v1.11 this will need to become a callback, so
-     *   the sort and filter methods can subscribe to it. That will required
-     *   initialisation options for sorting, which is why it is not already baked in
-     */
-    function _fnInvalidate(settings, rowIdx, src, colIdx) {
-        var row = settings.aoData[rowIdx];
-        var i, ien;
-        var cellWrite = function (cell, col) {
-            // This is very frustrating, but in IE if you just write directly
-            // to innerHTML, and elements that are overwritten are GC'ed,
-            // even if there is a reference to them elsewhere
-            while (cell.childNodes.length) {
-                cell.removeChild(cell.firstChild);
-            }
-
-            cell.innerHTML = _fnGetCellData(settings, rowIdx, col, 'display');
-        };
-
-        // Are we reading last data from DOM or the data object?
-        if (src === 'dom' || ((!src || src === 'auto') && row.src === 'dom')) {
-            // Read the data from the DOM
-            row._aData = _fnGetRowElements(
-                settings, row, colIdx, colIdx === undefined ? undefined : row._aData
-            )
-                .data;
-        }
-        else {
-            // Reading from data object, update the DOM
-            var cells = row.anCells;
-
-            if (cells) {
-                if (colIdx !== undefined) {
-                    cellWrite(cells[colIdx], colIdx);
-                }
-                else {
-                    for (i = 0, ien = cells.length; i < ien; i++) {
-                        cellWrite(cells[i], i);
-                    }
-                }
-            }
-        }
-
-        // For both row and cell invalidation, the cached data for sorting and
-        // filtering is nulled out
-        row._aSortData = null;
-        row._aFilterData = null;
-
-        // Invalidate the type for a specific column (if given) or all columns since
-        // the data might have changed
-        var cols = settings.aoColumns;
-        if (colIdx !== undefined) {
-            cols[colIdx].sType = null;
-        }
-        else {
-            for (i = 0, ien = cols.length; i < ien; i++) {
-                cols[i].sType = null;
-            }
-
-            // Update DataTables special `DT_*` attributes for the row
-            _fnRowAttributes(settings, row);
-        }
-    }
-
-    /**
-     * Build a data source object from an HTML row, reading the contents of the
-     * cells that are in the row.
-     *
-     * @param {object} settings DataTables settings object
-     * @param {node|object} TR element from which to read data or existing row
-     *   object from which to re-read the data from the cells
-     * @param {int} [colIdx] Optional column index
-     * @param {array|object} [d] Data source object. If `colIdx` is given then this
-     *   parameter should also be given and will be used to write the data into.
-     *   Only the column in question will be written
-     * @returns {object} Object with two parameters: `data` the data read, in
-     *   document order, and `cells` and array of nodes (they can be useful to the
-     *   caller, so rather than needing a second traversal to get them, just return
-     *   them from here).
-     * @memberof DataTable#oApi
-     */
-    function _fnGetRowElements(settings, row, colIdx, d) {
-        var
-            tds = [],
-            td = row.firstChild,
-            name, col, o, i = 0, contents,
-            columns = settings.aoColumns,
-            objectRead = settings._rowReadObject;
-
-        // Allow the data object to be passed in, or construct
-        d = d !== undefined ?
-            d :
-            objectRead ?
-            {} :
-                [];
-
-        var attr = function (str, td) {
-            if (typeof str === 'string') {
-                var idx = str.indexOf('@');
-
-                if (idx !== -1) {
-                    var attr = str.substring(idx + 1);
-                    var setter = _fnSetObjectDataFn(str);
-                    setter(d, td.getAttribute(attr));
-                }
-            }
-        };
-
-        // Read data from a cell and store into the data object
-        var cellProcess = function (cell) {
-            if (colIdx === undefined || colIdx === i) {
-                col = columns[i];
-                contents = $.trim(cell.innerHTML);
-
-                if (col && col._bAttrSrc) {
-                    var setter = _fnSetObjectDataFn(col.mData._);
-                    setter(d, contents);
-
-                    attr(col.mData.sort, cell);
-                    attr(col.mData.type, cell);
-                    attr(col.mData.filter, cell);
-                }
-                else {
-                    // Depending on the `data` option for the columns the data can
-                    // be read to either an object or an array.
-                    if (objectRead) {
-                        if (!col._setter) {
-                            // Cache the setter function
-                            col._setter = _fnSetObjectDataFn(col.mData);
-                        }
-                        col._setter(d, contents);
-                    }
-                    else {
-                        d[i] = contents;
-                    }
-                }
-            }
-
-            i++;
-        };
-
-        if (td) {
-            // `tr` element was passed in
-            while (td) {
-                name = td.nodeName.toUpperCase();
-
-                if (name == "TD" || name == "TH") {
-                    cellProcess(td);
-                    tds.push(td);
-                }
-
-                td = td.nextSibling;
-            }
-        }
-        else {
-            // Existing row object passed in
-            tds = row.anCells;
-
-            for (var j = 0, jen = tds.length; j < jen; j++) {
-                cellProcess(tds[j]);
-            }
-        }
-
-        // Read the ID from the DOM if present
-        var rowNode = row.firstChild ? row : row.nTr;
-
-        if (rowNode) {
-            var id = rowNode.getAttribute('id');
-
-            if (id) {
-                _fnSetObjectDataFn(settings.rowId)(d, id);
-            }
-        }
-
-        return {
-            data: d,
-            cells: tds
-        };
-    }
-
-    /**
-     * Create a new TR element (and it's TD children) for a row
-     *  @param {object} oSettings dataTables settings object
-     *  @param {int} iRow Row to consider
-     *  @param {node} [nTrIn] TR element to add to the table - optional. If not given,
-     *    DataTables will create a row automatically
-     *  @param {array} [anTds] Array of TD|TH elements for the row - must be given
-     *    if nTr is.
-     *  @memberof DataTable#oApi
-     */
-    function _fnCreateTr(oSettings, iRow, nTrIn, anTds) {
-        var
-            row = oSettings.aoData[iRow],
-            rowData = row._aData,
-            cells = [],
-            nTr, nTd, oCol,
-            i, iLen;
-
-        if (row.nTr === null) {
-            nTr = nTrIn || document.createElement('tr');
-
-            row.nTr = nTr;
-            row.anCells = cells;
-
-            /* Use a private property on the node to allow reserve mapping from the node
-             * to the aoData array for fast look up
-             */
-            nTr._DT_RowIndex = iRow;
-
-            /* Special parameters can be given by the data source to be used on the row */
-            _fnRowAttributes(oSettings, row);
-
-            /* Process each column */
-            for (i = 0, iLen = oSettings.aoColumns.length; i < iLen; i++) {
-                oCol = oSettings.aoColumns[i];
-
-                nTd = nTrIn ? anTds[i] : document.createElement(oCol.sCellType);
-                nTd._DT_CellIndex = {
-                    row: iRow,
-                    column: i
-                };
-
-                cells.push(nTd);
-
-                // Need to create the HTML if new, or if a rendering function is defined
-                if ((!nTrIn || oCol.mRender || oCol.mData !== i) &&
-                    (!$.isPlainObject(oCol.mData) || oCol.mData._ !== i + '.display')
-                ) {
-                    nTd.innerHTML = _fnGetCellData(oSettings, iRow, i, 'display');
-                }
-
-                /* Add user defined class */
-                if (oCol.sClass) {
-                    nTd.className += ' ' + oCol.sClass;
-                }
-
-                // Visibility - add or remove as required
-                if (oCol.bVisible && !nTrIn) {
-                    nTr.appendChild(nTd);
-                }
-                else if (!oCol.bVisible && nTrIn) {
-                    nTd.parentNode.removeChild(nTd);
-                }
-
-                if (oCol.fnCreatedCell) {
-                    oCol.fnCreatedCell.call(oSettings.oInstance,
-                                            nTd, _fnGetCellData(oSettings, iRow, i), rowData, iRow,
-                                            i
-                    );
-                }
-            }
-
-            _fnCallbackFire(oSettings, 'aoRowCreatedCallback', null, [nTr, rowData, iRow]);
-        }
-
-        // Remove once webkit bug 131819 and Chromium bug 365619 have been resolved
-        // and deployed
-        row.nTr.setAttribute('role', 'row');
-    }
-
-    /**
-     * Add attributes to a row based on the special `DT_*` parameters in a data
-     * source object.
-     *  @param {object} settings DataTables settings object
-     *  @param {object} DataTables row object for the row to be modified
-     *  @memberof DataTable#oApi
-     */
-    function _fnRowAttributes(settings, row) {
-        var tr = row.nTr;
-        var data = row._aData;
-
-        if (tr) {
-            var id = settings.rowIdFn(data);
-
-            if (id) {
-                tr.id = id;
-            }
-
-            if (data.DT_RowClass) {
-                // Remove any classes added by DT_RowClass before
-                var a = data.DT_RowClass.split(' ');
-                row.__rowc = row.__rowc ?
-                             _unique(row.__rowc.concat(a)) :
-                             a;
-
-                $(tr)
-                    .removeClass(row.__rowc.join(' '))
-                    .addClass(data.DT_RowClass);
-            }
-
-            if (data.DT_RowAttr) {
-                $(tr).attr(data.DT_RowAttr);
-            }
-
-            if (data.DT_RowData) {
-                $(tr).data(data.DT_RowData);
-            }
-        }
-    }
-
-    /**
-     * Create the HTML header for the table
-     *  @param {object} oSettings dataTables settings object
-     *  @memberof DataTable#oApi
-     */
-    function _fnBuildHead(oSettings) {
-        var i, ien, cell, row, column;
-        var thead = oSettings.nTHead;
-        var tfoot = oSettings.nTFoot;
-        var createHeader = $('th, td', thead).length === 0;
-        var classes = oSettings.oClasses;
-        var columns = oSettings.aoColumns;
-
-        if (createHeader) {
-            row = $('<tr/>').appendTo(thead);
-        }
-
-        for (i = 0, ien = columns.length; i < ien; i++) {
-            column = columns[i];
-            cell = $(column.nTh).addClass(column.sClass);
-
-            if (createHeader) {
-                cell.appendTo(row);
-            }
-
-            // 1.11 move into sorting
-            if (oSettings.oFeatures.bSort) {
-                cell.addClass(column.sSortingClass);
-
-                if (column.bSortable !== false) {
-                    cell
-                        .attr('tabindex', oSettings.iTabIndex)
-                        .attr('aria-controls', oSettings.sTableId);
-
-                    _fnSortAttachListener(oSettings, column.nTh, i);
-                }
-            }
-
-            if (column.sTitle != cell[0].innerHTML) {
-                cell.html(column.sTitle);
-            }
-
-            _fnRenderer(oSettings, 'header')(
-                oSettings, cell, column, classes
-            );
-        }
-
-        if (createHeader) {
-            _fnDetectHeader(oSettings.aoHeader, thead);
-        }
-
-        /* ARIA role for the rows */
-        $(thead).find('>tr').attr('role', 'row');
-
-        /* Deal with the footer - add classes if required */
-        $(thead).find('>tr>th, >tr>td').addClass(classes.sHeaderTH);
-        $(tfoot).find('>tr>th, >tr>td').addClass(classes.sFooterTH);
-
-        // Cache the footer cells. Note that we only take the cells from the first
-        // row in the footer. If there is more than one row the user wants to
-        // interact with, they need to use the table().foot() method. Note also this
-        // allows cells to be used for multiple columns using colspan
-        if (tfoot !== null) {
-            var cells = oSettings.aoFooter[0];
-
-            for (i = 0, ien = cells.length; i < ien; i++) {
-                column = columns[i];
-                column.nTf = cells[i].cell;
-
-                if (column.sClass) {
-                    $(column.nTf).addClass(column.sClass);
-                }
-            }
-        }
-    }
-
-    /**
-     * Draw the header (or footer) element based on the column visibility states. The
-     * methodology here is to use the layout array from _fnDetectHeader, modified for
-     * the instantaneous column visibility, to construct the new layout. The grid is
-     * traversed over cell at a time in a rows x columns grid fashion, although each
-     * cell insert can cover multiple elements in the grid - which is tracks using the
-     * aApplied array. Cell inserts in the grid will only occur where there isn't
-     * already a cell in that position.
-     *  @param {object} oSettings dataTables settings object
-     *  @param array {objects} aoSource Layout array from _fnDetectHeader
-     *  @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc,
-     *  @memberof DataTable#oApi
-     */
-    function _fnDrawHead(oSettings, aoSource, bIncludeHidden) {
-        var i, iLen, j, jLen, k, kLen, n, nLocalTr;
-        var aoLocal = [];
-        var aApplied = [];
-        var iColumns = oSettings.aoColumns.length;
-        var iRowspan, iColspan;
-
-        if (!aoSource) {
-            return;
-        }
-
-        if (bIncludeHidden === undefined) {
-            bIncludeHidden = false;
-        }
-
-        /* Make a copy of the master layout array, but without the visible columns in it */
-        for (i = 0, iLen = aoSource.length; i < iLen; i++) {
-            aoLocal[i] = aoSource[i].slice();
-            aoLocal[i].nTr = aoSource[i].nTr;
-
-            /* Remove any columns which are currently hidden */
-            for (j = iColumns - 1; j >= 0; j--) {
-                if (!oSettings.aoColumns[j].bVisible && !bIncludeHidden) {
-                    aoLocal[i].splice(j, 1);
-                }
-            }
-
-            /* Prep the applied array - it needs an element for each row */
-            aApplied.push([]);
-        }
-
-        for (i = 0, iLen = aoLocal.length; i < iLen; i++) {
-            nLocalTr = aoLocal[i].nTr;
-
-            /* All cells are going to be replaced, so empty out the row */
-            if (nLocalTr) {
-                while ((n = nLocalTr.firstChild)) {
-                    nLocalTr.removeChild(n);
-                }
-            }
-
-            for (j = 0, jLen = aoLocal[i].length; j < jLen; j++) {
-                iRowspan = 1;
-                iColspan = 1;
-
-                /* Check to see if there is already a cell (row/colspan) covering our target
-                 * insert point. If there is, then there is nothing to do.
-                 */
-                if (aApplied[i][j] === undefined) {
-                    nLocalTr.appendChild(aoLocal[i][j].cell);
-                    aApplied[i][j] = 1;
-
-                    /* Expand the cell to cover as many rows as needed */
-                    while (aoLocal[i + iRowspan] !== undefined &&
-                           aoLocal[i][j].cell == aoLocal[i + iRowspan][j].cell) {
-                        aApplied[i + iRowspan][j] = 1;
-                        iRowspan++;
-                    }
-
-                    /* Expand the cell to cover as many columns as needed */
-                    while (aoLocal[i][j + iColspan] !== undefined &&
-                           aoLocal[i][j].cell == aoLocal[i][j + iColspan].cell) {
-                        /* Must update the applied array over the rows for the columns */
-                        for (k = 0; k < iRowspan; k++) {
-                            aApplied[i + k][j + iColspan] = 1;
-                        }
-                        iColspan++;
-                    }
-
-                    /* Do the actual expansion in the DOM */
-                    $(aoLocal[i][j].cell)
-                        .attr('rowspan', iRowspan)
-                        .attr('colspan', iColspan);
-                }
-            }
-        }
-    }
-
-    /**
-     * Insert the required TR nodes into the table for display
-     *  @param {object} oSettings dataTables settings object
-     *  @memberof DataTable#oApi
-     */
-    function _fnDraw(oSettings) {
-        /* Provide a pre-callback function which can be used to cancel the draw is false is returned */
-        var aPreDraw = _fnCallbackFire(oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings]);
-        if ($.inArray(false, aPreDraw) !== -1) {
-            _fnProcessingDisplay(oSettings, false);
-            return;
-        }
-
-        var i, iLen, n;
-        var anRows = [];
-        var iRowCount = 0;
-        var asStripeClasses = oSettings.asStripeClasses;
-        var iStripes = asStripeClasses.length;
-        var iOpenRows = oSettings.aoOpenRows.length;
-        var oLang = oSettings.oLanguage;
-        var iInitDisplayStart = oSettings.iInitDisplayStart;
-        var bServerSide = _fnDataSource(oSettings) == 'ssp';
-        var aiDisplay = oSettings.aiDisplay;
-
-        oSettings.bDrawing = true;
-
-        /* Check and see if we have an initial draw position from state saving */
-        if (iInitDisplayStart !== undefined && iInitDisplayStart !== -1) {
-            oSettings._iDisplayStart = bServerSide ?
-                                       iInitDisplayStart :
-                                       iInitDisplayStart >= oSettings.fnRecordsDisplay() ?
-                                       0 :
-                                       iInitDisplayStart;
-
-            oSettings.iInitDisplayStart = -1;
-        }
-
-        var iDisplayStart = oSettings._iDisplayStart;
-        var iDisplayEnd = oSettings.fnDisplayEnd();
-
-        /* Server-side processing draw intercept */
-        if (oSettings.bDeferLoading) {
-            oSettings.bDeferLoading = false;
-            oSettings.iDraw++;
-            _fnProcessingDisplay(oSettings, false);
-        }
-        else if (!bServerSide) {
-            oSettings.iDraw++;
-        }
-        else if (!oSettings.bDestroying && !_fnAjaxUpdate(oSettings)) {
-            return;
-        }
-
-        if (aiDisplay.length !== 0) {
-            var iStart = bServerSide ? 0 : iDisplayStart;
-            var iEnd = bServerSide ? oSettings.aoData.length : iDisplayEnd;
-
-            for (var j = iStart; j < iEnd; j++) {
-                var iDataIndex = aiDisplay[j];
-                var aoData = oSettings.aoData[iDataIndex];
-                if (aoData.nTr === null) {
-                    _fnCreateTr(oSettings, iDataIndex);
-                }
-
-                var nRow = aoData.nTr;
-
-                /* Remove the old striping classes and then add the new one */
-                if (iStripes !== 0) {
-                    var sStripe = asStripeClasses[iRowCount % iStripes];
-                    if (aoData._sRowStripe != sStripe) {
-                        $(nRow).removeClass(aoData._sRowStripe).addClass(sStripe);
-                        aoData._sRowStripe = sStripe;
-                    }
-                }
-
-                // Row callback functions - might want to manipulate the row
-                // iRowCount and j are not currently documented. Are they at all
-                // useful?
-                _fnCallbackFire(oSettings, 'aoRowCallback', null,
-                                [nRow, aoData._aData, iRowCount, j]);
-
-                anRows.push(nRow);
-                iRowCount++;
-            }
-        }
-        else {
-            /* Table is empty - create a row with an empty message in it */
-            var sZero = oLang.sZeroRecords;
-            if (oSettings.iDraw == 1 && _fnDataSource(oSettings) == 'ajax') {
-                sZero = oLang.sLoadingRecords;
-            }
-            else if (oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0) {
-                sZero = oLang.sEmptyTable;
-            }
-
-            anRows[0] = $('<tr/>', {'class': iStripes ? asStripeClasses[0] : ''})
-                .append($('<td />', {
-                    'valign': 'top',
-                    'colSpan': _fnVisbleColumns(oSettings),
-                    'class': oSettings.oClasses.sRowEmpty
-                }).html(sZero))[0];
-        }
-
-        /* Header and footer callbacks */
-        _fnCallbackFire(oSettings, 'aoHeaderCallback', 'header',
-                        [$(oSettings.nTHead).children('tr')[0],
-                         _fnGetDataMaster(oSettings), iDisplayStart, iDisplayEnd, aiDisplay]);
-
-        _fnCallbackFire(oSettings, 'aoFooterCallback', 'footer',
-                        [$(oSettings.nTFoot).children('tr')[0],
-                         _fnGetDataMaster(oSettings), iDisplayStart, iDisplayEnd, aiDisplay]);
-
-        var body = $(oSettings.nTBody);
-
-        body.children().detach();
-        body.append($(anRows));
-
-        /* Call all required callback functions for the end of a draw */
-        _fnCallbackFire(oSettings, 'aoDrawCallback', 'draw', [oSettings]);
-
-        /* Draw is complete, sorting and filtering must be as well */
-        oSettings.bSorted = false;
-        oSettings.bFiltered = false;
-        oSettings.bDrawing = false;
-    }
-
-    /**
-     * Redraw the table - taking account of the various features which are enabled
-     *  @param {object} oSettings dataTables settings object
-     *  @param {boolean} [holdPosition] Keep the current paging position. By default
-     *    the paging is reset to the first page
-     *  @memberof DataTable#oApi
-     */
-    function _fnReDraw(settings, holdPosition) {
-        var
-            features = settings.oFeatures,
-            sort = features.bSort,
-            filter = features.bFilter;
-
-        if (sort) {
-            _fnSort(settings);
-        }
-
-        if (filter) {
-            _fnFilterComplete(settings, settings.oPreviousSearch);
-        }
-        else {
-            // No filtering, so we want to just use the display master
-            settings.aiDisplay = settings.aiDisplayMaster.slice();
-        }
-
-        if (holdPosition !== true) {
-            settings._iDisplayStart = 0;
-        }
-
-        // Let any modules know about the draw hold position state (used by
-        // scrolling internally)
-        settings._drawHold = holdPosition;
-
-        _fnDraw(settings);
-
-        settings._drawHold = false;
-    }
-
-    /**
-     * Add the options to the page HTML for the table
-     *  @param {object} oSettings dataTables settings object
-     *  @memberof DataTable#oApi
-     */
-    function _fnAddOptionsHtml(oSettings) {
-        var classes = oSettings.oClasses;
-        var table = $(oSettings.nTable);
-        var holding = $('<div/>').insertBefore(table); // Holding element for speed
-        var features = oSettings.oFeatures;
-
-        // All DataTables are wrapped in a div
-        var insert = $('<div/>', {
-            id: oSettings.sTableId + '_wrapper',
-            'class': classes.sWrapper + (oSettings.nTFoot ? '' : ' ' + classes.sNoFooter)
-        });
-
-        oSettings.nHolding = holding[0];
-        oSettings.nTableWrapper = insert[0];
-        oSettings.nTableReinsertBefore = oSettings.nTable.nextSibling;
-
-        /* Loop over the user set positioning and place the elements as needed */
-        var aDom = oSettings.sDom.split('');
-        var featureNode, cOption, nNewNode, cNext, sAttr, j;
-        for (var i = 0; i < aDom.length; i++) {
-            featureNode = null;
-            cOption = aDom[i];
-
-            if (cOption == '<') {
-                /* New container div */
-                nNewNode = $('<div/>')[0];
-
-                /* Check to see if we should append an id and/or a class name to the container */
-                cNext = aDom[i + 1];
-                if (cNext == "'" || cNext == '"') {
-                    sAttr = "";
-                    j = 2;
-                    while (aDom[i + j] != cNext) {
-                        sAttr += aDom[i + j];
-                        j++;
-                    }
-
-                    /* Replace jQuery UI constants @todo depreciated */
-                    if (sAttr == "H") {
-                        sAttr = classes.sJUIHeader;
-                    }
-                    else if (sAttr == "F") {
-                        sAttr = classes.sJUIFooter;
-                    }
-
-                    /* The attribute can be in the format of "#id.class", "#id" or "class" This logic
-                     * breaks the string into parts and applies them as needed
-                     */
-                    if (sAttr.indexOf('.') != -1) {
-                        var aSplit = sAttr.split('.');
-                        nNewNode.id = aSplit[0].substr(1, aSplit[0].length - 1);
-                        nNewNode.className = aSplit[1];
-                    }
-                    else if (sAttr.charAt(0) == "#") {
-                        nNewNode.id = sAttr.substr(1, sAttr.length - 1);
-                    }
-                    else {
-                        nNewNode.className = sAttr;
-                    }
-
-                    i += j;
-                    /* Move along the position array */
-                }
-
-                insert.append(nNewNode);
-                insert = $(nNewNode);
-            }
-            else if (cOption == '>') {
-                /* End container div */
-                insert = insert.parent();
-            }
-            // @todo Move options into their own plugins?
-            else if (cOption == 'l' && features.bPaginate && features.bLengthChange) {
-                /* Length */
-                featureNode = _fnFeatureHtmlLength(oSettings);
-            }
-            else if (cOption == 'f' && features.bFilter) {
-                /* Filter */
-                featureNode = _fnFeatureHtmlFilter(oSettings);
-            }
-            else if (cOption == 'r' && features.bProcessing) {
-                /* pRocessing */
-                featureNode = _fnFeatureHtmlProcessing(oSettings);
-            }
-            else if (cOption == 't') {
-                /* Table */
-                featureNode = _fnFeatureHtmlTable(oSettings);
-            }
-            else if (cOption == 'i' && features.bInfo) {
-                /* Info */
-                featureNode = _fnFeatureHtmlInfo(oSettings);
-            }
-            else if (cOption == 'p' && features.bPaginate) {
-                /* Pagination */
-                featureNode = _fnFeatureHtmlPaginate(oSettings);
-            }
-            else if (DataTable.ext.feature.length !== 0) {
-                /* Plug-in features */
-                var aoFeatures = DataTable.ext.feature;
-                for (var k = 0, kLen = aoFeatures.length; k < kLen; k++) {
-                    if (cOption == aoFeatures[k].cFeature) {
-                        featureNode = aoFeatures[k].fnInit(oSettings);
-                        break;
-                    }
-                }
-            }
-
-            /* Add to the 2D features array */
-            if (featureNode) {
-                var aanFeatures = oSettings.aanFeatures;
-
-                if (!aanFeatures[cOption]) {
-                    aanFeatures[cOption] = [];
-                }
-
-                aanFeatures[cOption].push(featureNode);
-                insert.append(featureNode);
-            }
-        }
-
-        /* Built our DOM structure - replace the holding div with what we want */
-        holding.replaceWith(insert);
-        oSettings.nHolding = null;
-    }
-
-    /**
-     * Use the DOM source to create up an array of header cells. The idea here is to
-     * create a layout grid (array) of rows x columns, which contains a reference
-     * to the cell that that point in the grid (regardless of col/rowspan), such that
-     * any column / row could be removed and the new grid constructed
-     *  @param array {object} aLayout Array to store the calculated layout in
-     *  @param {node} nThead The header/footer element for the table
-     *  @memberof DataTable#oApi
-     */
-    function _fnDetectHeader(aLayout, nThead) {
-        var nTrs = $(nThead).children('tr');
-        var nTr, nCell;
-        var i, k, l, iLen, jLen, iColShifted, iColumn, iColspan, iRowspan;
-        var bUnique;
-        var fnShiftCol = function (a, i, j) {
-            var k = a[i];
-            while (k[j]) {
-                j++;
-            }
-            return j;
-        };
-
-        aLayout.splice(0, aLayout.length);
-
-        /* We know how many rows there are in the layout - so prep it */
-        for (i = 0, iLen = nTrs.length; i < iLen; i++) {
-            aLayout.push([]);
-        }
-
-        /* Calculate a layout array */
-        for (i = 0, iLen = nTrs.length; i < iLen; i++) {
-            nTr = nTrs[i];
-            iColumn = 0;
-
-            /* For every cell in the row... */
-            nCell = nTr.firstChild;
-            while (nCell) {
-                if (nCell.nodeName.toUpperCase() == "TD" ||
-                    nCell.nodeName.toUpperCase() == "TH") {
-                    /* Get the col and rowspan attributes from the DOM and sanitise them */
-                    iColspan = nCell.getAttribute('colspan') * 1;
-                    iRowspan = nCell.getAttribute('rowspan') * 1;
-                    iColspan = (!iColspan || iColspan === 0 || iColspan === 1) ? 1 : iColspan;
-                    iRowspan = (!iRowspan || iRowspan === 0 || iRowspan === 1) ? 1 : iRowspan;
-
-                    /* There might be colspan cells already in this row, so shift our target
-                     * accordingly
-                     */
-                    iColShifted = fnShiftCol(aLayout, i, iColumn);
-
-                    /* Cache calculation for unique columns */
-                    bUnique = iColspan === 1 ? true : false;
-
-                    /* If there is col / rowspan, copy the information into the layout grid */
-                    for (l = 0; l < iColspan; l++) {
-                        for (k = 0; k < iRowspan; k++) {
-                            aLayout[i + k][iColShifted + l] = {
-                                "cell": nCell,
-                                "unique": bUnique
-                            };
-                            aLayout[i + k].nTr = nTr;
-                        }
-                    }
-                }
-                nCell = nCell.nextSibling;
-            }
-        }
-    }
-
-    /**
-     * Get an array of unique th elements, one for each column
-     *  @param {object} oSettings dataTables settings object
-     *  @param {node} nHeader automatically detect the layout from this node - optional
-     *  @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional
-     *  @returns array {node} aReturn list of unique th's
-     *  @memberof DataTable#oApi
-     */
-    function _fnGetUniqueThs(oSettings, nHeader, aLayout) {
-        var aReturn = [];
-        if (!aLayout) {
-            aLayout = oSettings.aoHeader;
-            if (nHeader) {
-                aLayout = [];
-                _fnDetectHeader(aLayout, nHeader);
-            }
-        }
-
-        for (var i = 0, iLen = aLayout.length; i < iLen; i++) {
-            for (var j = 0, jLen = aLayout[i].length; j < jLen; j++) {
-                if (aLayout[i][j].unique &&
-                    (!aReturn[j] || !oSettings.bSortCellsTop)) {
-                    aReturn[j] = aLayout[i][j].cell;
-                }
-            }
-        }
-
-        return aReturn;
-    }
-
-    /**
-     * Create an Ajax call based on the table's settings, taking into account that
-     * parameters can have multiple forms, and backwards compatibility.
-     *
-     * @param {object} oSettings dataTables settings object
-     * @param {array} data Data to send to the server, required by
-     *     DataTables - may be augmented by developer callbacks
-     * @param {function} fn Callback function to run when data is obtained
-     */
-    function _fnBuildAjax(oSettings, data, fn) {
-        // Compatibility with 1.9-, allow fnServerData and event to manipulate
-        _fnCallbackFire(oSettings, 'aoServerParams', 'serverParams', [data]);
-
-        // Convert to object based for 1.10+ if using the old array scheme which can
-        // come from server-side processing or serverParams
-        if (data && $.isArray(data)) {
-            var tmp = {};
-            var rbracket = /(.*?)\[\]$/;
-
-            $.each(data, function (key, val) {
-                var match = val.name.match(rbracket);
-
-                if (match) {
-                    // Support for arrays
-                    var name = match[0];
-
-                    if (!tmp[name]) {
-                        tmp[name] = [];
-                    }
-                    tmp[name].push(val.value);
-                }
-                else {
-                    tmp[val.name] = val.value;
-                }
-            });
-            data = tmp;
-        }
-
-        var ajaxData;
-        var ajax = oSettings.ajax;
-        var instance = oSettings.oInstance;
-        var callback = function (json) {
-            _fnCallbackFire(oSettings, null, 'xhr', [oSettings, json, oSettings.jqXHR]);
-            fn(json);
-        };
-
-        if ($.isPlainObject(ajax) && ajax.data) {
-            ajaxData = ajax.data;
-
-            var newData = $.isFunction(ajaxData) ?
-                          ajaxData(data, oSettings) :  // fn can manipulate data or return
-                          ajaxData;                      // an object object or array to merge
-
-            // If the function returned something, use that alone
-            data = $.isFunction(ajaxData) && newData ?
-                   newData :
-                   $.extend(true, data, newData);
-
-            // Remove the data property as we've resolved it already and don't want
-            // jQuery to do it again (it is restored at the end of the function)
-            delete ajax.data;
-        }
-
-        var baseAjax = {
-            "data": data,
-            "success": function (json) {
-                var error = json.error || json.sError;
-                if (error) {
-                    _fnLog(oSettings, 0, error);
-                }
-
-                oSettings.json = json;
-                callback(json);
-            },
-            "dataType": "json",
-            "cache": false,
-            "type": oSettings.sServerMethod,
-            "error": function (xhr, error, thrown) {
-                var ret = _fnCallbackFire(oSettings, null, 'xhr',
-                                          [oSettings, null, oSettings.jqXHR]);
-
-                if ($.inArray(true, ret) === -1) {
-                    if (error == "parsererror") {
-                        _fnLog(oSettings, 0, 'Invalid JSON response', 1);
-                    }
-                    else if (xhr.readyState === 4) {
-                        _fnLog(oSettings, 0, 'Ajax error', 7);
-                    }
-                }
-
-                _fnProcessingDisplay(oSettings, false);
-            }
-        };
-
-        // Store the data submitted for the API
-        oSettings.oAjaxData = data;
-
-        // Allow plug-ins and external processes to modify the data
-        _fnCallbackFire(oSettings, null, 'preXhr', [oSettings, data]);
-
-        if (oSettings.fnServerData) {
-            // DataTables 1.9- compatibility
-            oSettings.fnServerData.call(instance,
-                                        oSettings.sAjaxSource,
-                                        $.map(data, function (val, key) { // Need to convert back to 1.9 trad format
-                                            return {name: key, value: val};
-                                        }),
-                                        callback,
-                                        oSettings
-            );
-        }
-        else if (oSettings.sAjaxSource || typeof ajax === 'string') {
-            // DataTables 1.9- compatibility
-            oSettings.jqXHR = $.ajax($.extend(baseAjax, {
-                url: ajax || oSettings.sAjaxSource
-            }));
-        }
-        else if ($.isFunction(ajax)) {
-            // Is a function - let the caller define what needs to be done
-            oSettings.jqXHR = ajax.call(instance, data, callback, oSettings);
-        }
-        else {
-            // Object to extend the base settings
-            oSettings.jqXHR = $.ajax($.extend(baseAjax, ajax));
-
-            // Restore for next time around
-            ajax.data = ajaxData;
-        }
-    }
-
-    /**
-     * Update the table using an Ajax call
-     *  @param {object} settings dataTables settings object
-     *  @returns {boolean} Block the table drawing or not
-     *  @memberof DataTable#oApi
-     */
-    function _fnAjaxUpdate(settings) {
-        if (settings.bAjaxDataGet) {
-            settings.iDraw++;
-            _fnProcessingDisplay(settings, true);
-
-            _fnBuildAjax(
-                settings,
-                _fnAjaxParameters(settings),
-                function (json) {
-                    _fnAjaxUpdateDraw(settings, json);
-                }
-            );
-
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * Build up the parameters in an object needed for a server-side processing
-     * request. Note that this is basically done twice, is different ways - a modern
-     * method which is used by default in DataTables 1.10 which uses objects and
-     * arrays, or the 1.9- method with is name / value pairs. 1.9 method is used if
-     * the sAjaxSource option is used in the initialisation, or the legacyAjax
-     * option is set.
-     *  @param {object} oSettings dataTables settings object
-     *  @returns {bool} block the table drawing or not
-     *  @memberof DataTable#oApi
-     */
-    function _fnAjaxParameters(settings) {
-        var
-            columns = settings.aoColumns,
-            columnCount = columns.length,
-            features = settings.oFeatures,
-            preSearch = settings.oPreviousSearch,
-            preColSearch = settings.aoPreSearchCols,
-            i, data = [], dataProp, column, columnSearch,
-            sort = _fnSortFlatten(settings),
-            displayStart = settings._iDisplayStart,
-            displayLength = features.bPaginate !== false ?
-                            settings._iDisplayLength :
-                            -1;
-
-        var param = function (name, value) {
-            data.push({'name': name, 'value': value});
-        };
-
-        // DataTables 1.9- compatible method
-        param('sEcho', settings.iDraw);
-        param('iColumns', columnCount);
-        param('sColumns', _pluck(columns, 'sName').join(','));
-        param('iDisplayStart', displayStart);
-        param('iDisplayLength', displayLength);
-
-        // DataTables 1.10+ method
-        var d = {
-            draw: settings.iDraw,
-            columns: [],
-            order: [],
-            start: displayStart,
-            length: displayLength,
-            search: {
-                value: preSearch.sSearch,
-                regex: preSearch.bRegex
-            }
-        };
-
-        for (i = 0; i < columnCount; i++) {
-            column = columns[i];
-            columnSearch = preColSearch[i];
-            dataProp = typeof column.mData == "function" ? 'function' : column.mData;
-
-            d.columns.push({
-                               data: dataProp,
-                               name: column.sName,
-                               searchable: column.bSearchable,
-                               orderable: column.bSortable,
-                               search: {
-                                   value: columnSearch.sSearch,
-                                   regex: columnSearch.bRegex
-                               }
-                           });
-
-            param("mDataProp_" + i, dataProp);
-
-            if (features.bFilter) {
-                param('sSearch_' + i, columnSearch.sSearch);
-                param('bRegex_' + i, columnSearch.bRegex);
-                param('bSearchable_' + i, column.bSearchable);
-            }
-
-            if (features.bSort) {
-                param('bSortable_' + i, column.bSortable);
-            }
-        }
-
-        if (features.bFilter) {
-            param('sSearch', preSearch.sSearch);
-            param('bRegex', preSearch.bRegex);
-        }
-
-        if (features.bSort) {
-            $.each(sort, function (i, val) {
-                d.order.push({column: val.col, dir: val.dir});
-
-                param('iSortCol_' + i, val.col);
-                param('sSortDir_' + i, val.dir);
-            });
-
-            param('iSortingCols', sort.length);
-        }
-
-        // If the legacy.ajax parameter is null, then we automatically decide which
-        // form to use, based on sAjaxSource
-        var legacy = DataTable.ext.legacy.ajax;
-        if (legacy === null) {
-            return settings.sAjaxSource ? data : d;
-        }
-
-        // Otherwise, if legacy has been specified then we use that to decide on the
-        // form
-        return legacy ? data : d;
-    }
-
-    /**
-     * Data the data from the server (nuking the old) and redraw the table
-     *  @param {object} oSettings dataTables settings object
-     *  @param {object} json json data return from the server.
-     *  @param {string} json.sEcho Tracking flag for DataTables to match requests
-     *  @param {int} json.iTotalRecords Number of records in the data set, not accounting for
-     *     filtering
-     *  @param {int} json.iTotalDisplayRecords Number of records in the data set, accounting for
-     *     filtering
-     *  @param {array} json.aaData The data to display on this page
-     *  @param {string} [json.sColumns] Column ordering (sName, comma separated)
-     *  @memberof DataTable#oApi
-     */
-    function _fnAjaxUpdateDraw(settings, json) {
-        // v1.10 uses camelCase variables, while 1.9 uses Hungarian notation.
-        // Support both
-        var compat = function (old, modern) {
-            return json[old] !== undefined ? json[old] : json[modern];
-        };
-
-        var data = _fnAjaxDataSrc(settings, json);
-        var draw = compat('sEcho', 'draw');
-        var recordsTotal = compat('iTotalRecords', 'recordsTotal');
-        var recordsFiltered = compat('iTotalDisplayRecords', 'recordsFiltered');
-
-        if (draw) {
-            // Protect against out of sequence returns
-            if (draw * 1 < settings.iDraw) {
-                return;
-            }
-            settings.iDraw = draw * 1;
-        }
-
-        _fnClearTable(settings);
-        settings._iRecordsTotal = parseInt(recordsTotal, 10);
-        settings._iRecordsDisplay = parseInt(recordsFiltered, 10);
-
-        for (var i = 0, ien = data.length; i < ien; i++) {
-            _fnAddData(settings, data[i]);
-        }
-        settings.aiDisplay = settings.aiDisplayMaster.slice();
-
-        settings.bAjaxDataGet = false;
-        _fnDraw(settings);
-
-        if (!settings._bInitComplete) {
-            _fnInitComplete(settings, json);
-        }
-
-        settings.bAjaxDataGet = true;
-        _fnProcessingDisplay(settings, false);
-    }
-
-    /**
-     * Get the data from the JSON data source to use for drawing a table. Using
-     * `_fnGetObjectDataFn` allows the data to be sourced from a property of the
-     * source object, or from a processing function.
-     *  @param {object} oSettings dataTables settings object
-     *  @param  {object} json Data source object / array from the server
-     *  @return {array} Array of data to use
-     */
-    function _fnAjaxDataSrc(oSettings, json) {
-        var dataSrc = $.isPlainObject(oSettings.ajax) && oSettings.ajax.dataSrc !== undefined ?
-                      oSettings.ajax.dataSrc :
-                      oSettings.sAjaxDataProp; // Compatibility with 1.9-.
-
-        // Compatibility with 1.9-. In order to read from aaData, check if the
-        // default has been changed, if not, check for aaData
-        if (dataSrc === 'data') {
-            return json.aaData || json[dataSrc];
-        }
-
-        return dataSrc !== "" ?
-               _fnGetObjectDataFn(dataSrc)(json) :
-               json;
-    }
-
-    /**
-     * Generate the node required for filtering text
-     *  @returns {node} Filter control element
-     *  @param {object} oSettings dataTables settings object
-     *  @memberof DataTable#oApi
-     */
-    function _fnFeatureHtmlFilter(settings) {
-        var classes = settings.oClasses;
-        var tableId = settings.sTableId;
-        var language = settings.oLanguage;
-        var previousSearch = settings.oPreviousSearch;
-        var features = settings.aanFeatures;
-        var input = '<input type="search" class="' + classes.sFilterInput + '"/>';
-
-        var str = language.sSearch;
-        str = str.match(/_INPUT_/) ?
-              str.replace('_INPUT_', input) :
-              str + input;
-
-        var filter = $('<div/>', {
-            'id': !features.f ? tableId + '_filter' : null,
-            'class': classes.sFilter
-        })
-            .append($('<label/>').append(str));
-
-        var searchFn = function () {
-            /* Update all other filter input elements for the new display */
-            var n = features.f;
-            var val = !this.value ? "" : this.value; // mental IE8 fix :-(
-
-            /* Now do the filter */
-            if (val != previousSearch.sSearch) {
-                _fnFilterComplete(settings, {
-                    "sSearch": val,
-                    "bRegex": previousSearch.bRegex,
-                    "bSmart": previousSearch.bSmart,
-                    "bCaseInsensitive": previousSearch.bCaseInsensitive
-                });
-
-                // Need to redraw, without resorting
-                settings._iDisplayStart = 0;
-                _fnDraw(settings);
-            }
-        };
-
-        var searchDelay = settings.searchDelay !== null ?
-                          settings.searchDelay :
-                          _fnDataSource(settings) === 'ssp' ?
-                          400 :
-                          0;
-
-        var jqFilter = $('input', filter)
-            .val(previousSearch.sSearch)
-            .attr('placeholder', language.sSearchPlaceholder)
-            .bind(
-                'keyup.DT search.DT input.DT paste.DT cut.DT',
-                searchDelay ?
-                _fnThrottle(searchFn, searchDelay) :
-                searchFn
-            )
-            .bind('keypress.DT', function (e) {
-                /* Prevent form submission */
-                if (e.keyCode == 13) {
-                    return false;
-                }
-            })
-            .attr('aria-controls', tableId);
-
-        // Update the input elements whenever the table is filtered
-        $(settings.nTable).on('search.dt.DT', function (ev, s) {
-            if (settings === s) {
-                // IE9 throws an 'unknown error' if document.activeElement is used
-                // inside an iframe or frame...
-                try {
-                    if (jqFilter[0] !== document.activeElement) {
-                        jqFilter.val(previousSearch.sSearch);
-                    }
-                }
-                catch (e) {
-                }
-            }
-        });
-
-        return filter[0];
-    }
-
-    /**
-     * Filter the table using both the global filter and column based filtering
-     *  @param {object} oSettings dataTables settings object
-     *  @param {object} oSearch search information
-     *  @param {int} [iForce] force a research of the master array (1) or not (undefined or 0)
-     *  @memberof DataTable#oApi
-     */
-    function _fnFilterComplete(oSettings, oInput, iForce) {
-        var oPrevSearch = oSettings.oPreviousSearch;
-        var aoPrevSearch = oSettings.aoPreSearchCols;
-        var fnSaveFilter = function (oFilter) {
-            /* Save the filtering values */
-            oPrevSearch.sSearch = oFilter.sSearch;
-            oPrevSearch.bRegex = oFilter.bRegex;
-            oPrevSearch.bSmart = oFilter.bSmart;
-            oPrevSearch.bCaseInsensitive = oFilter.bCaseInsensitive;
-        };
-        var fnRegex = function (o) {
-            // Backwards compatibility with the bEscapeRegex option
-            return o.bEscapeRegex !== undefined ? !o.bEscapeRegex : o.bRegex;
-        };
-
-        // Resolve any column types that are unknown due to addition or invalidation
-        // @todo As per sort - can this be moved into an event handler?
-        _fnColumnTypes(oSettings);
-
-        /* In server-side processing all filtering is done by the server, so no point hanging around here */
-        if (_fnDataSource(oSettings) != 'ssp') {
-            /* Global filter */
-            _fnFilter(oSettings, oInput.sSearch, iForce, fnRegex(oInput), oInput.bSmart,
-                      oInput.bCaseInsensitive);
-            fnSaveFilter(oInput);
-
-            /* Now do the individual column filter */
-            for (var i = 0; i < aoPrevSearch.length; i++) {
-                _fnFilterColumn(oSettings, aoPrevSearch[i].sSearch, i, fnRegex(aoPrevSearch[i]),
-                                aoPrevSearch[i].bSmart, aoPrevSearch[i].bCaseInsensitive);
-            }
-
-            /* Custom filtering */
-            _fnFilterCustom(oSettings);
-        }
-        else {
-            fnSaveFilter(oInput);
-        }
-
-        /* Tell the draw function we have been filtering */
-        oSettings.bFiltered = true;
-        _fnCallbackFire(oSettings, null, 'search', [oSettings]);
-    }
-
-    /**
-     * Apply custom filtering functions
-     *  @param {object} oSettings dataTables settings object
-     *  @memberof DataTable#oApi
-     */
-    function _fnFilterCustom(settings) {
-        var filters = DataTable.ext.search;
-        var displayRows = settings.aiDisplay;
-        var row, rowIdx;
-
-        for (var i = 0, ien = filters.length; i < ien; i++) {
-            var rows = [];
-
-            // Loop over each row and see if it should be included
-            for (var j = 0, jen = displayRows.length; j < jen; j++) {
-                rowIdx = displayRows[j];
-                row = settings.aoData[rowIdx];
-
-                if (filters[i](settings, row._aFilterData, rowIdx, row._aData, j)) {
-                    rows.push(rowIdx);
-                }
-            }
-
-            // So the array reference doesn't break set the results into the
-            // existing array
-            displayRows.length = 0;
-            $.merge(displayRows, rows);
-        }
-    }
-
-    /**
-     * Filter the table on a per-column basis
-     *  @param {object} oSettings dataTables settings object
-     *  @param {string} sInput string to filter on
-     *  @param {int} iColumn column to filter
-     *  @param {bool} bRegex treat search string as a regular expression or not
-     *  @param {bool} bSmart use smart filtering or not
-     *  @param {bool} bCaseInsensitive Do case insenstive matching or not
-     *  @memberof DataTable#oApi
-     */
-    function _fnFilterColumn(settings, searchStr, colIdx, regex, smart, caseInsensitive) {
-        if (searchStr === '') {
-            return;
-        }
-
-        var data;
-        var display = settings.aiDisplay;
-        var rpSearch = _fnFilterCreateSearch(searchStr, regex, smart, caseInsensitive);
-
-        for (var i = display.length - 1; i >= 0; i--) {
-            data = settings.aoData[display[i]]._aFilterData[colIdx];
-
-            if (!rpSearch.test(data)) {
-                display.splice(i, 1);
-            }
-        }
-    }
-
-    /**
-     * Filter the data table based on user input and draw the table
-     *  @param {object} settings dataTables settings object
-     *  @param {string} input string to filter on
-     *  @param {int} force optional - force a research of the master array (1) or not (undefined or
-     *     0)
-     *  @param {bool} regex treat as a regular expression or not
-     *  @param {bool} smart perform smart filtering or not
-     *  @param {bool} caseInsensitive Do case insenstive matching or not
-     *  @memberof DataTable#oApi
-     */
-    function _fnFilter(settings, input, force, regex, smart, caseInsensitive) {
-        var rpSearch = _fnFilterCreateSearch(input, regex, smart, caseInsensitive);
-        var prevSearch = settings.oPreviousSearch.sSearch;
-        var displayMaster = settings.aiDisplayMaster;
-        var display, invalidated, i;
-
-        // Need to take account of custom filtering functions - always filter
-        if (DataTable.ext.search.length !== 0) {
-            force = true;
-        }
-
-        // Check if any of the rows were invalidated
-        invalidated = _fnFilterData(settings);
-
-        // If the input is blank - we just want the full data set
-        if (input.length <= 0) {
-            settings.aiDisplay = displayMaster.slice();
-        }
-        else {
-            // New search - start from the master array
-            if (invalidated ||
-                force ||
-                prevSearch.length > input.length ||
-                input.indexOf(prevSearch) !== 0 ||
-                settings.bSorted // On resort, the display master needs to be
-                                 // re-filtered since indexes will have changed
-            ) {
-                settings.aiDisplay = displayMaster.slice();
-            }
-
-            // Search the display array
-            display = settings.aiDisplay;
-
-            for (i = display.length - 1; i >= 0; i--) {
-                if (!rpSearch.test(settings.aoData[display[i]]._sFilterRow)) {
-                    display.splice(i, 1);
-                }
-            }
-        }
-    }
-
-    /**
-     * Build a regular expression object suitable for searching a table
-     *  @param {string} sSearch string to search for
-     *  @param {bool} bRegex treat as a regular expression or not
-     *  @param {bool} bSmart perform smart filtering or not
-     *  @param {bool} bCaseInsensitive Do case insensitive matching or not
-     *  @returns {RegExp} constructed object
-     *  @memberof DataTable#oApi
-     */
-    function _fnFilterCreateSearch(search, regex, smart, caseInsensitive) {
-        search = regex ?
-                 search :
-                 _fnEscapeRegex(search);
-
-        if (smart) {
-            /* For smart filtering we want to allow the search to work regardless of
-             * word order. We also want double quoted text to be preserved, so word
-             * order is important - a la google. So this is what we want to
-             * generate:
-             * 
-             * ^(?=.*?\bone\b)(?=.*?\btwo three\b)(?=.*?\bfour\b).*$
-             */
-            var a = $.map(search.match(/"[^"]+"|[^ ]+/g) || [''], function (word) {
-                if (word.charAt(0) === '"') {
-                    var m = word.match(/^"(.*)"$/);
-                    word = m ? m[1] : word;
-                }
-
-                return word.replace('"', '');
-            });
-
-            search = '^(?=.*?' + a.join(')(?=.*?') + ').*$';
-        }
-
-        return new RegExp(search, caseInsensitive ? 'i' : '');
-    }
-
-    /**
-     * Escape a string such that it can be used in a regular expression
-     *  @param {string} sVal string to escape
-     *  @returns {string} escaped string
-     *  @memberof DataTable#oApi
-     */
-    function _fnEscapeRegex(sVal) {
-        return sVal.replace(_re_escape_regex, '\\$1');
-    }
-
-    var __filter_div = $('<div>')[0];
-    var __filter_div_textContent = __filter_div.textContent !== undefined;
-
-    // Update the filtering data for each row if needed (by invalidation or first run)
-    function _fnFilterData(settings) {
-        var columns = settings.aoColumns;
-        var column;
-        var i, j, ien, jen, filterData, cellData, row;
-        var fomatters = DataTable.ext.type.search;
-        var wasInvalidated = false;
-
-        for (i = 0, ien = settings.aoData.length; i < ien; i++) {
-            row = settings.aoData[i];
-
-            if (!row._aFilterData) {
-                filterData = [];
-
-                for (j = 0, jen = columns.length; j < jen; j++) {
-                    column = columns[j];
-
-                    if (column.bSearchable) {
-                        cellData = _fnGetCellData(settings, i, j, 'filter');
-
-                        if (fomatters[column.sType]) {
-                            cellData = fomatters[column.sType](cellData);
-                        }
-
-                        // Search in DataTables 1.10 is string based. In 1.11 this
-                        // should be altered to also allow strict type checking.
-                        if (cellData === null) {
-                            cellData = '';
-                        }
-
-                        if (typeof cellData !== 'string' && cellData.toString) {
-                            cellData = cellData.toString();
-                        }
-                    }
-                    else {
-                        cellData = '';
-                    }
-
-                    // If it looks like there is an HTML entity in the string,
-                    // attempt to decode it so sorting works as expected. Note that
-                    // we could use a single line of jQuery to do this, but the DOM
-                    // method used here is much faster http://jsperf.com/html-decode
-                    if (cellData.indexOf && cellData.indexOf('&') !== -1) {
-                        __filter_div.innerHTML = cellData;
-                        cellData = __filter_div_textContent ?
-                                   __filter_div.textContent :
-                                   __filter_div.innerText;
-                    }
-
-                    if (cellData.replace) {
-                        cellData = cellData.replace(/[\r\n]/g, '');
-                    }
-
-                    filterData.push(cellData);
-                }
-
-                row._aFilterData = filterData;
-                row._sFilterRow = filterData.join('  ');
-                wasInvalidated = true;
-            }
-        }
-
-        return wasInvalidated;
-    }
-
-    /**
-     * Convert from the internal Hungarian notation to camelCase for external
-     * interaction
-     *  @param {object} obj Object to convert
-     *  @returns {object} Inverted object
-     *  @memberof DataTable#oApi
-     */
-    function _fnSearchToCamel(obj) {
-        return {
-            search: obj.sSearch,
-            smart: obj.bSmart,
-            regex: obj.bRegex,
-            caseInsensitive: obj.bCaseInsensitive
-        };
-    }
-
-    /**
-     * Convert from camelCase notation to the internal Hungarian. We could use the
-     * Hungarian convert function here, but this is cleaner
-     *  @param {object} obj Object to convert
-     *  @returns {object} Inverted object
-     *  @memberof DataTable#oApi
-     */
-    function _fnSearchToHung(obj) {
-        return {
-            sSearch: obj.search,
-            bSmart: obj.smart,
-            bRegex: obj.regex,
-            bCaseInsensitive: obj.caseInsensitive
-        };
-    }
-
-    /**
-     * Generate the node required for the info display
-     *  @param {object} oSettings dataTables settings object
-     *  @returns {node} Information element
-     *  @memberof DataTable#oApi
-     */
-    function _fnFeatureHtmlInfo(settings) {
-        var
-            tid = settings.sTableId,
-            nodes = settings.aanFeatures.i,
-            n = $('<div/>', {
-                'class': settings.oClasses.sInfo,
-                'id': !nodes ? tid + '_info' : null
-            });
-
-        if (!nodes) {
-            // Update display on each draw
-            settings.aoDrawCallback.push({
-                                             "fn": _fnUpdateInfo,
-                                             "sName": "information"
-                                         });
-
-            n
-                .attr('role', 'status')
-                .attr('aria-live', 'polite');
-
-            // Table is described by our info div
-            $(settings.nTable).attr('aria-describedby', tid + '_info');
-        }
-
-        return n[0];
-    }
-
-    /**
-     * Update the information elements in the display
-     *  @param {object} settings dataTables settings object
-     *  @memberof DataTable#oApi
-     */
-    function _fnUpdateInfo(settings) {
-        /* Show information about the table */
-        var nodes = settings.aanFeatures.i;
-        if (nodes.length === 0) {
-            return;
-        }
-
-        var
-            lang = settings.oLanguage,
-            start = settings._iDisplayStart + 1,
-            end = settings.fnDisplayEnd(),
-            max = settings.fnRecordsTotal(),
-            total = settings.fnRecordsDisplay(),
-            out = total ?
-                  lang.sInfo :
-                  lang.sInfoEmpty;
-
-        if (total !== max) {
-            /* Record set after filtering */
-            out += ' ' + lang.sInfoFiltered;
-        }
-
-        // Convert the macros
-        out += lang.sInfoPostFix;
-        out = _fnInfoMacros(settings, out);
-
-        var callback = lang.fnInfoCallback;
-        if (callback !== null) {
-            out = callback.call(settings.oInstance,
-                                settings, start, end, max, total, out
-            );
-        }
-
-        $(nodes).html(out);
-    }
-
-    function _fnInfoMacros(settings, str) {
-        // When infinite scrolling, we are always starting at 1. _iDisplayStart is used only
-        // internally
-        var
-            formatter = settings.fnFormatNumber,
-            start = settings._iDisplayStart + 1,
-            len = settings._iDisplayLength,
-            vis = settings.fnRecordsDisplay(),
-            all = len === -1;
-
-        return str.replace(/_START_/g, formatter.call(settings, start))
-            .replace(/_END_/g, formatter.call(settings, settings.fnDisplayEnd()))
-            .replace(/_MAX_/g, formatter.call(settings, settings.fnRecordsTotal()))
-            .replace(/_TOTAL_/g, formatter.call(settings, vis))
-            .replace(/_PAGE_/g, formatter.call(settings, all ? 1 : Math.ceil(start / len)))
-            .replace(/_PAGES_/g, formatter.call(settings, all ? 1 : Math.ceil(vis / len)));
-    }
-
-    /**
-     * Draw the table for the first time, adding all required features
-     *  @param {object} settings dataTables settings object
-     *  @memberof DataTable#oApi
-     */
-    function _fnInitialise(settings) {
-        var i, iLen, iAjaxStart = settings.iInitDisplayStart;
-        var columns = settings.aoColumns, column;
-        var features = settings.oFeatures;
-        var deferLoading = settings.bDeferLoading; // value modified by the draw
-
-        /* Ensure that the table data is fully initialised */
-        if (!settings.bInitialised) {
-            setTimeout(function () {
-                _fnInitialise(settings);
-            }, 200);
-            return;
-        }
-
-        /* Show the display HTML options */
-        _fnAddOptionsHtml(settings);
-
-        /* Build and draw the header / footer for the table */
-        _fnBuildHead(settings);
-        _fnDrawHead(settings, settings.aoHeader);
-        _fnDrawHead(settings, settings.aoFooter);
-
-        /* Okay to show that something is going on now */
-        _fnProcessingDisplay(settings, true);
-
-        /* Calculate sizes for columns */
-        if (features.bAutoWidth) {
-            _fnCalculateColumnWidths(settings);
-        }
-
-        for (i = 0, iLen = columns.length; i < iLen; i++) {
-            column = columns[i];
-
-            if (column.sWidth) {
-                column.nTh.style.width = _fnStringToCss(column.sWidth);
-            }
-        }
-
-        _fnCallbackFire(settings, null, 'preInit', [settings]);
-
-        // If there is default sorting required - let's do it. The sort function
-        // will do the drawing for us. Otherwise we draw the table regardless of the
-        // Ajax source - this allows the table to look initialised for Ajax sourcing
-        // data (show 'loading' message possibly)
-        _fnReDraw(settings);
-
-        // Server-side processing init complete is done by _fnAjaxUpdateDraw
-        var dataSrc = _fnDataSource(settings);
-        if (dataSrc != 'ssp' || deferLoading) {
-            // if there is an ajax source load the data
-            if (dataSrc == 'ajax') {
-                _fnBuildAjax(settings, [], function (json) {
-                    var aData = _fnAjaxDataSrc(settings, json);
-
-                    // Got the data - add it to the table
-                    for (i = 0; i < aData.length; i++) {
-                        _fnAddData(settings, aData[i]);
-                    }
-
-                    // Reset the init display for cookie saving. We've already done
-                    // a filter, and therefore cleared it before. So we need to make
-                    // it appear 'fresh'
-                    settings.iInitDisplayStart = iAjaxStart;
-
-                    _fnReDraw(settings);
-
-                    _fnProcessingDisplay(settings, false);
-                    _fnInitComplete(settings, json);
-                }, settings);
-            }
-            else {
-                _fnProcessingDisplay(settings, false);
-                _fnInitComplete(settings);
-            }
-        }
-    }
-
-    /**
-     * Draw the table for the first time, adding all required features
-     *  @param {object} oSettings dataTables settings object
-     *  @param {object} [json] JSON from the server that completed the table, if using Ajax source
-     *    with client-side processing (optional)
-     *  @memberof DataTable#oApi
-     */
-    function _fnInitComplete(settings, json) {
-        settings._bInitComplete = true;
-
-        // When data was added after the initialisation (data or Ajax) we need to
-        // calculate the column sizing
-        if (json || settings.oInit.aaData) {
-            _fnAdjustColumnSizing(settings);
-        }
-
-        _fnCallbackFire(settings, null, 'plugin-init', [settings, json]);
-        _fnCallbackFire(settings, 'aoInitComplete', 'init', [settings, json]);
-    }
-
-    function _fnLengthChange(settings, val) {
-        var len = parseInt(val, 10);
-        settings._iDisplayLength = len;
-
-        _fnLengthOverflow(settings);
-
-        // Fire length change event
-        _fnCallbackFire(settings, null, 'length', [settings, len]);
-    }
-
-    /**
-     * Generate the node required for user display length changing
-     *  @param {object} settings dataTables settings object
-     *  @returns {node} Display length feature node
-     *  @memberof DataTable#oApi
-     */
-    function _fnFeatureHtmlLength(settings) {
-        var
-            classes = settings.oClasses,
-            tableId = settings.sTableId,
-            menu = settings.aLengthMenu,
-            d2 = $.isArray(menu[0]),
-            lengths = d2 ? menu[0] : menu,
-            language = d2 ? menu[1] : menu;
-
-        var select = $('<select/>', {
-            'name': tableId + '_length',
-            'aria-controls': tableId,
-            'class': classes.sLengthSelect
-        });
-
-        for (var i = 0, ien = lengths.length; i < ien; i++) {
-            select[0][i] = new Option(language[i], lengths[i]);
-        }
-
-        var div = $('<div><label/></div>').addClass(classes.sLength);
-        if (!settings.aanFeatures.l) {
-            div[0].id = tableId + '_length';
-        }
-
-        div.children().append(
-            settings.oLanguage.sLengthMenu.replace('_MENU_', select[0].outerHTML)
-        );
-
-        // Can't use `select` variable as user might provide their own and the
-        // reference is broken by the use of outerHTML
-        $('select', div)
-            .val(settings._iDisplayLength)
-            .bind('change.DT', function (e) {
-                _fnLengthChange(settings, $(this).val());
-                _fnDraw(settings);
-            });
-
-        // Update node value whenever anything changes the table's length
-        $(settings.nTable).bind('length.dt.DT', function (e, s, len) {
-            if (settings === s) {
-                $('select', div).val(len);
-            }
-        });
-
-        return div[0];
-    }
-
-    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-     * Note that most of the paging logic is done in
-     * DataTable.ext.pager
-     */
-
-    /**
-     * Generate the node required for default pagination
-     *  @param {object} oSettings dataTables settings object
-     *  @returns {node} Pagination feature node
-     *  @memberof DataTable#oApi
-     */
-    function _fnFeatureHtmlPaginate(settings) {
-        var
-            type = settings.sPaginationType,
-            plugin = DataTable.ext.pager[type],
-            modern = typeof plugin === 'function',
-            redraw = function (settings) {
-                _fnDraw(settings);
-            },
-            node = $('<div/>').addClass(settings.oClasses.sPaging + type)[0],
-            features = settings.aanFeatures;
-
-        if (!modern) {
-            plugin.fnInit(settings, node, redraw);
-        }
-
-        /* Add a draw callback for the pagination on first instance, to update the paging display */
-        if (!features.p) {
-            node.id = settings.sTableId + '_paginate';
-
-            settings.aoDrawCallback.push({
-                                             "fn": function (settings) {
-                                                 if (modern) {
-                                                     var
-                                                         start = settings._iDisplayStart,
-                                                         len = settings._iDisplayLength,
-                                                         visRecords = settings.fnRecordsDisplay(),
-                                                         all = len === -1,
-                                                         page = all ? 0 : Math.ceil(start / len),
-                                                         pages = all ? 1 : Math.ceil(
-                                                             visRecords / len),
-                                                         buttons = plugin(page, pages),
-                                                         i, ien;
-
-                                                     for (i = 0, ien = features.p.length; i < ien;
-                                                          i++) {
-                                                         _fnRenderer(settings, 'pageButton')(
-                                                             settings, features.p[i], i, buttons,
-                                                             page, pages
-                                                         );
-                                                     }
-                                                 }
-                                                 else {
-                                                     plugin.fnUpdate(settings, redraw);
-                                                 }
-                                             },
-                                             "sName": "pagination"
-                                         });
-        }
-
-        return node;
-    }
-
-    /**
-     * Alter the display settings to change the page
-     *  @param {object} settings DataTables settings object
-     *  @param {string|int} action Paging action to take: "first", "previous",
-     *    "next" or "last" or page number to jump to (integer)
-     *  @param [bool] redraw Automatically draw the update or not
-     *  @returns {bool} true page has changed, false - no change
-     *  @memberof DataTable#oApi
-     */
-    function _fnPageChange(settings, action, redraw) {
-        var
-            start = settings._iDisplayStart,
-            len = settings._iDisplayLength,
-            records = settings.fnRecordsDisplay();
-
-        if (records === 0 || len === -1) {
-            start = 0;
... 143802 lines suppressed ...