From 41cd6c8db40bceb08290828ae0d4fc5caeea7147 Mon Sep 17 00:00:00 2001
From: jiazx0107@163.com <jiazx0107@163.com>
Date: 星期六, 18 十一月 2023 15:58:25 +0800
Subject: [PATCH] 调整车牌识别配置
---
src/main/java/com/fzzy/gateway/hx2023/service/ApiInitService.java | 25 ++++
src/main/java/com/fzzy/gateway/entity/GateWayParam.java | 2
src/main/java/com/fzzy/gateway/data/BaseReqData.java | 19 +++
src/main/java/com/fzzy/gateway/controller/GatewayDeviceController.java | 61 ++++++---
src/main/java/com/fzzy/gateway/view/GatewayDevice.view.xml | 21 +++
src/main/java/com/fzzy/gateway/entity/GatewayDevice.java | 5
src/main/java/com/fzzy/gateway/view/GatewayDevice.js | 19 +++
src/main/java/com/fzzy/gateway/hx2023/service/ScGatewayTestServiceImpl.java | 4
src/main/java/com/fzzy/protocol/sdkhk/HkGatewaySyncLprImpl.java | 66 +++++++++++
/dev/null | 32 -----
src/main/java/com/fzzy/protocol/sdkhk/HKUtils.java | 25 ++++
src/main/java/com/fzzy/gateway/api/GatewaySyncLprService.java | 11 +
src/main/java/com/fzzy/gateway/GatewayRunner.java | 2
src/main/java/com/fzzy/gateway/hx2023/service/DeviceReportServiceImpl.java | 24 ++++
14 files changed, 260 insertions(+), 56 deletions(-)
diff --git a/src/main/java/com/fzzy/gateway/GatewayRunner.java b/src/main/java/com/fzzy/gateway/GatewayRunner.java
index a74979c..8f25135 100644
--- a/src/main/java/com/fzzy/gateway/GatewayRunner.java
+++ b/src/main/java/com/fzzy/gateway/GatewayRunner.java
@@ -40,6 +40,8 @@
//鏇存柊璁惧缂撳瓨
apiInitService.updateDeviceCache();
+ //鍒濆鍖栬溅鐗岃瘑鍒�
+ apiInitService.initAllLpr();
}
}
diff --git a/src/main/java/com/fzzy/gateway/api/GatewaySyncLprService.java b/src/main/java/com/fzzy/gateway/api/GatewaySyncLprService.java
index 16a1d33..914a170 100644
--- a/src/main/java/com/fzzy/gateway/api/GatewaySyncLprService.java
+++ b/src/main/java/com/fzzy/gateway/api/GatewaySyncLprService.java
@@ -2,6 +2,7 @@
import com.fzzy.gateway.data.BaseReqData;
+import com.fzzy.gateway.data.BaseResp;
import com.fzzy.gateway.hx2023.data.*;
/**
@@ -22,6 +23,14 @@
*
* @return
*/
- public LprData syncLpr(BaseReqData reqData);
+ public BaseResp syncLpr(BaseReqData reqData);
+
+
+ /**
+ * 杞︾墝璇嗗埆鑾峰彇
+ *
+ * @return
+ */
+ public BaseResp initLpr(BaseReqData reqData);
}
diff --git a/src/main/java/com/fzzy/gateway/controller/GatewayDeviceTestController.java b/src/main/java/com/fzzy/gateway/controller/GatewayDeviceController.java
similarity index 83%
rename from src/main/java/com/fzzy/gateway/controller/GatewayDeviceTestController.java
rename to src/main/java/com/fzzy/gateway/controller/GatewayDeviceController.java
index 605ee3a..0d6b52a 100644
--- a/src/main/java/com/fzzy/gateway/controller/GatewayDeviceTestController.java
+++ b/src/main/java/com/fzzy/gateway/controller/GatewayDeviceController.java
@@ -1,25 +1,15 @@
package com.fzzy.gateway.controller;
-import com.alibaba.fastjson2.JSONObject;
-import com.bstek.dorado.annotation.Expose;
import com.fzzy.api.data.GatewayDeviceType;
-import com.fzzy.api.utils.DateUtil;
-import com.fzzy.async.fzzy40.Fzzy40CommonService;
-import com.fzzy.async.fzzy40.entity.Fz40Grain;
import com.fzzy.gateway.GatewayUtils;
-import com.fzzy.gateway.api.GatewayDeviceReportService;
import com.fzzy.gateway.api.GatewayRemoteManager;
import com.fzzy.gateway.data.BaseResp;
import com.fzzy.gateway.data.BaseReqData;
-import com.fzzy.gateway.entity.GateWayTestParam;
+import com.fzzy.gateway.entity.GateWayParam;
import com.fzzy.gateway.entity.GatewayDevice;
-import com.fzzy.gateway.hx2023.ScConstant;
-import com.fzzy.gateway.hx2023.data.*;
import com.fzzy.gateway.service.GatewayDeviceService;
-import com.fzzy.mqtt.MqttGatewayService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.time.DateFormatUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@@ -36,8 +26,8 @@
*/
@Slf4j
@Controller
-@RequestMapping("/gateway/test")
-public class GatewayDeviceTestController {
+@RequestMapping("/gateway")
+public class GatewayDeviceController {
@Resource
private GatewayDeviceService gatewayDeviceService;
@@ -52,9 +42,9 @@
* @param param
* @return
*/
- @PostMapping("/deviceTest")
+ @PostMapping("/test/deviceTest")
public @ResponseBody
- String deviceTest(@RequestBody GateWayTestParam param) throws Exception {
+ String deviceTest(@RequestBody GateWayParam param) throws Exception {
if (StringUtils.isEmpty(param.getBizType())) {
return "ERROR:娌℃湁鑾峰彇鍒颁笟鍔$被鍨嬶紝鎵ц澶辫触";
@@ -79,7 +69,39 @@
return "SUCCESS";
}
- private String testGrain(GateWayTestParam param) {
+ /**
+ * 鍒濆鍖栬溅鐗岃瘑鍒�
+ *
+ * @param param
+ * @return
+ */
+ @PostMapping("/control/init-lpr")
+ public @ResponseBody
+ String initLpr(@RequestBody GateWayParam param) throws Exception {
+
+ List<GatewayDevice> list = gatewayDeviceService.listAll();
+
+ if (null == list || list.isEmpty()) {
+ return "ERROR:娌℃湁鑾峰彇鍒拌澶囦俊鎭�";
+ }
+
+ BaseReqData reqData;
+ int i = 1;
+ for (GatewayDevice device : list) {
+
+ if (!GatewayDeviceType.TYPE_02.getCode().equals(device.getType())) {
+ continue;
+ }
+ reqData = new BaseReqData(device);
+ reqData.setIndex(i);
+ gatewayRemoteManager.getSyncLprService(device.getSyncProtocol()).initLpr(reqData);
+ i++;
+ }
+
+ return "SUCCESS";
+ }
+
+ private String testGrain(GateWayParam param) {
String deviceId = param.getDeviceId();
GatewayDevice device = GatewayUtils.getCacheByDeviceId(deviceId);
@@ -116,7 +138,7 @@
* @param param
* @return
*/
- public String ajaxTestKafkaGrain(GateWayTestParam param) throws Exception {
+ public String ajaxTestKafkaGrain(GateWayParam param) throws Exception {
List<GatewayDevice> list = gatewayDeviceService.listAll();
if (null == list || list.isEmpty()) {
return "ERROR锛氫负鑾峰彇鍒扮郴缁熶腑璁惧閰嶇疆锛屽彇娑堟墽琛�";
@@ -148,10 +170,9 @@
* @param param
* @return
*/
- public String ajaxTestWeight(GateWayTestParam param) throws Exception {
+ public String ajaxTestWeight(GateWayParam param) throws Exception {
double weight = param.getWeight();
- String deviceId = param.getDeviceId();
List<GatewayDevice> list = gatewayDeviceService.listAll();
if (list == null || list.size() <= 0) {
@@ -189,7 +210,7 @@
*
* @return
*/
- public String ajaxTestLpr(GateWayTestParam param) throws Exception {
+ public String ajaxTestLpr(GateWayParam param) throws Exception {
String carNumber = param.getCarNumber();
diff --git a/src/main/java/com/fzzy/gateway/data/BaseReqData.java b/src/main/java/com/fzzy/gateway/data/BaseReqData.java
index fcc79fe..987d40a 100644
--- a/src/main/java/com/fzzy/gateway/data/BaseReqData.java
+++ b/src/main/java/com/fzzy/gateway/data/BaseReqData.java
@@ -31,4 +31,23 @@
private Date dayTime;
private String data;
+
+ private int index = 1;
+
+ public BaseReqData() {
+ }
+
+ public BaseReqData(GatewayDevice device) {
+ this.device = device;
+ this.productId = device.getProductId();
+ this.deviceId = device.getDeviceId();
+ this.deviceName = device.getDeviceName();
+ }
+
+ public BaseReqData(String productId, String deviceId, String deviceName, GatewayDevice device) {
+ this.productId = productId;
+ this.deviceId = deviceId;
+ this.deviceName = deviceName;
+ this.device = device;
+ }
}
diff --git a/src/main/java/com/fzzy/gateway/entity/GateWayTestParam.java b/src/main/java/com/fzzy/gateway/entity/GateWayParam.java
similarity index 93%
rename from src/main/java/com/fzzy/gateway/entity/GateWayTestParam.java
rename to src/main/java/com/fzzy/gateway/entity/GateWayParam.java
index 48c2ba5..4c0d4f4 100644
--- a/src/main/java/com/fzzy/gateway/entity/GateWayTestParam.java
+++ b/src/main/java/com/fzzy/gateway/entity/GateWayParam.java
@@ -6,7 +6,7 @@
import java.util.Date;
@Data
-public class GateWayTestParam {
+public class GateWayParam {
@PropertyDef(label = "寮�濮嬫椂闂�")
private Date start;
@PropertyDef(label = "鎴鏃堕棿")
diff --git a/src/main/java/com/fzzy/gateway/entity/GatewayDevice.java b/src/main/java/com/fzzy/gateway/entity/GatewayDevice.java
index 1e7320a..68c7daa 100644
--- a/src/main/java/com/fzzy/gateway/entity/GatewayDevice.java
+++ b/src/main/java/com/fzzy/gateway/entity/GatewayDevice.java
@@ -101,10 +101,13 @@
@PropertyDef(label = "缁勭粐缂栫爜")
private String orgId;
+ @Column(name = "POSITION_", length = 40)
+ @PropertyDef(label = "浣嶇疆")
+ private String position;
+
@Column(name = "REMARK_", length = 200)
@PropertyDef(label = "澶囨敞", description = "澶囨敞淇℃伅")
private String remark;
-
@Column(name = "CABLE_RULE_", length = 20)
@PropertyDef(label = "甯冪嚎瑙勫垯", description = "骞虫柟浠撹〃绀哄眰琛屽垪锛岀瓛浠撹〃绀烘瘡鍦堢殑鍒楁暟")
diff --git a/src/main/java/com/fzzy/gateway/hx2023/service/ApiInitService.java b/src/main/java/com/fzzy/gateway/hx2023/service/ApiInitService.java
index 75a354b..7f303e0 100644
--- a/src/main/java/com/fzzy/gateway/hx2023/service/ApiInitService.java
+++ b/src/main/java/com/fzzy/gateway/hx2023/service/ApiInitService.java
@@ -1,9 +1,12 @@
package com.fzzy.gateway.hx2023.service;
import com.bstek.dorado.annotation.Expose;
+import com.fzzy.api.data.GatewayDeviceType;
import com.fzzy.gateway.api.GatewayRemoteManager;
import com.fzzy.gateway.api.GatewayRemoteService;
+import com.fzzy.gateway.data.BaseReqData;
import com.fzzy.gateway.entity.GatewayConf;
+import com.fzzy.gateway.entity.GatewayDevice;
import com.fzzy.gateway.service.GatewayConfService;
@@ -52,4 +55,26 @@
public void updateDeviceCache() {
deviceService.flushCache();
}
+
+ public void initAllLpr() {
+ List<GatewayDevice> list = deviceService.listAll();
+
+ if (null == list || list.isEmpty()) {
+ return;
+ }
+
+ BaseReqData reqData;
+ int i = 1;
+ for (GatewayDevice device : list) {
+
+ if (!GatewayDeviceType.TYPE_02.getCode().equals(device.getType())) {
+ continue;
+ }
+
+ reqData = new BaseReqData(device);
+ reqData.setIndex(i);
+ gatewayRemoteManager.getSyncLprService(device.getSyncProtocol()).initLpr(reqData);
+ i++;
+ }
+ }
}
diff --git a/src/main/java/com/fzzy/gateway/hx2023/service/DeviceReportServiceImpl.java b/src/main/java/com/fzzy/gateway/hx2023/service/DeviceReportServiceImpl.java
index 56683c8..d71a7c5 100644
--- a/src/main/java/com/fzzy/gateway/hx2023/service/DeviceReportServiceImpl.java
+++ b/src/main/java/com/fzzy/gateway/hx2023/service/DeviceReportServiceImpl.java
@@ -7,6 +7,7 @@
import com.fzzy.gateway.data.BaseResp;
import com.fzzy.gateway.entity.GatewayDevice;
import com.fzzy.gateway.hx2023.ScConstant;
+import com.fzzy.gateway.hx2023.data.LprData;
import com.fzzy.gateway.hx2023.data.WebSocketPacket;
import com.fzzy.gateway.hx2023.data.WebSocketPacketHeader;
import com.fzzy.gateway.hx2023.data.WeightInfo;
@@ -94,6 +95,29 @@
String topic = ScConstant.TOPIC_MESSAGE_REPORT;
topic = topic.replace("${productId}", reqData.getProductId()).replace("${deviceId}", reqData.getDeviceId());
+ GatewayDevice device = reqData.getDevice();
+
+ if (null == reqData.getData()) {
+ WebSocketPacket packet = new WebSocketPacket();
+ WebSocketPacketHeader header = new WebSocketPacketHeader();
+ header.setDeviceName(reqData.getDeviceName());
+ header.setProductId(reqData.getProductId());
+
+ packet.setHeaders(header);
+ packet.setMessageType(ScConstant.MESSAGE_TYPE_REPORT_PROPERTY);
+ packet.setDeviceId(reqData.getDeviceId());
+ packet.setMessageId(System.currentTimeMillis() + "");
+ //璁剧疆淇℃伅涓讳綋
+ LprData lpr = new LprData();
+ lpr.setDeviceId(reqData.getDeviceId());
+ lpr.setCarNumber(reqData.getCarNumber());
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.put("carNumber", reqData.getCarNumber());
+ jsonObject.put("position", device.getPosition());
+ packet.setProperties(jsonObject);
+ packet.setTimestamp(System.currentTimeMillis());
+ }
+
publishService.publishMqttWithTopic(reqData.getData(), topic);
log.info("----------------------------鎺ㄩ�丮QTT杞︾墝璇嗗埆淇℃伅---------------------------");
diff --git a/src/main/java/com/fzzy/gateway/hx2023/service/HkGatewaySyncLprImpl.java b/src/main/java/com/fzzy/gateway/hx2023/service/HkGatewaySyncLprImpl.java
deleted file mode 100644
index 6024ead..0000000
--- a/src/main/java/com/fzzy/gateway/hx2023/service/HkGatewaySyncLprImpl.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.fzzy.gateway.hx2023.service;
-
-import com.fzzy.api.data.GatewayDeviceProtocol;
-import com.fzzy.gateway.api.GatewaySyncLprService;
-import com.fzzy.gateway.hx2023.data.LprData;
-import com.fzzy.gateway.data.BaseReqData;
-import lombok.Data;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-
-/**
- * 缃戝叧涓庤澶囦箣闂寸殑閫氳-娴峰悍SDK
- */
-@Slf4j
-@Data
-@Component
-public class HkGatewaySyncLprImpl implements GatewaySyncLprService {
-
-
- @Override
- public String getLprProtocol() {
- return GatewayDeviceProtocol.DEVICE_LPR_SDK_HK.getCode();
- }
-
- @Override
- public LprData syncLpr(BaseReqData reqData) {
-
-
-
- return null;
- }
-}
diff --git a/src/main/java/com/fzzy/gateway/hx2023/service/ScGatewayTestServiceImpl.java b/src/main/java/com/fzzy/gateway/hx2023/service/ScGatewayTestServiceImpl.java
index c9d3ec5..53966e1 100644
--- a/src/main/java/com/fzzy/gateway/hx2023/service/ScGatewayTestServiceImpl.java
+++ b/src/main/java/com/fzzy/gateway/hx2023/service/ScGatewayTestServiceImpl.java
@@ -235,6 +235,8 @@
public BaseResp testLpr(BaseReqData reqData) {
+ GatewayDevice device = reqData.getDevice();
+
WebSocketPacket packet = new WebSocketPacket();
WebSocketPacketHeader header = new WebSocketPacketHeader();
header.setDeviceName(reqData.getDeviceName());
@@ -250,7 +252,7 @@
lpr.setCarNumber(reqData.getCarNumber());
JSONObject jsonObject = new JSONObject();
jsonObject.put("carNumber", reqData.getCarNumber());
- jsonObject.put("position", "big");
+ jsonObject.put("position", device.getPosition());
packet.setProperties(jsonObject);
packet.setTimestamp(System.currentTimeMillis());
diff --git a/src/main/java/com/fzzy/gateway/view/GatewayDevice.js b/src/main/java/com/fzzy/gateway/view/GatewayDevice.js
index d8bb2b8..faff578 100644
--- a/src/main/java/com/fzzy/gateway/view/GatewayDevice.js
+++ b/src/main/java/com/fzzy/gateway/view/GatewayDevice.js
@@ -15,4 +15,23 @@
$alert(result);
}
})
+}
+
+/**
+*
+* @param param
+*/
+initLpr= function(param){
+ $.ajax({
+ type:"POST",
+ contentType:"application/json;charset=UTF-8",
+ url:"/gateway/control/initLpr",
+ data:JSON.stringify(param),
+ success:function(result){
+ $alert(result);
+ },
+ error:function(result){
+ $alert(result);
+ }
+ })
}
\ No newline at end of file
diff --git a/src/main/java/com/fzzy/gateway/view/GatewayDevice.view.xml b/src/main/java/com/fzzy/gateway/view/GatewayDevice.view.xml
index e9db492..54c02aa 100644
--- a/src/main/java/com/fzzy/gateway/view/GatewayDevice.view.xml
+++ b/src/main/java/com/fzzy/gateway/view/GatewayDevice.view.xml
@@ -112,6 +112,10 @@
<Property></Property>
<Property name="label">绛掍粨灞傝鍒�</Property>
</PropertyDef>
+ <PropertyDef name="position">
+ <Property/>
+ <Property name="label">浣嶇疆</Property>
+ </PropertyDef>
</DataType>
<DataType name="dtParam" parent="Map">
<PropertyDef name="start">
@@ -232,6 +236,18 @@
<ClientEvent name="onClick">view.get("#dialogLpr").show();
</ClientEvent>
<Property name="caption">杞︾墝璇嗗埆璋冭瘯</Property>
+ <Property name="iconClass">fa fa-wrench</Property>
+ <Property name="exClassName">toolbar-button-push</Property>
+ </ToolBarButton>
+ <Separator/>
+ <ToolBarButton>
+ <ClientEvent name="onClick">var data = view.get("#dsMain.data:#");
+var param = {
+ deviceId:data.get("deviceId"),
+ bizType:"initLpr"
+}
+initLpr(param);</ClientEvent>
+ <Property name="caption">杞︾墝璇嗗埆鍒濆鍖�</Property>
<Property name="iconClass">fa fa-wrench</Property>
<Property name="exClassName">toolbar-button-push</Property>
</ToolBarButton>
@@ -382,6 +398,11 @@
<Property name="property">httpUrl</Property>
<Editor/>
</AutoFormElement>
+ <AutoFormElement layoutConstraint="colSpan:2">
+ <Property name="name">position</Property>
+ <Property name="property">position</Property>
+ <Editor/>
+ </AutoFormElement>
<AutoFormElement layoutConstraint="colSpan:3">
<Property name="name">remark</Property>
<Property name="property">remark</Property>
diff --git a/src/main/java/com/fzzy/protocol/sdkhk/HKUtils.java b/src/main/java/com/fzzy/protocol/sdkhk/HKUtils.java
index da617ed..796d936 100644
--- a/src/main/java/com/fzzy/protocol/sdkhk/HKUtils.java
+++ b/src/main/java/com/fzzy/protocol/sdkhk/HKUtils.java
@@ -8,11 +8,18 @@
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
+import java.util.Map;
+
/**
* 宸ュ叿绫�
*/
@Component
public class HKUtils {
+
+ /**
+ * 璁惧鏄惁鍦ㄧ嚎锛宬ey = deviceId,value = Y銆丯
+ */
+ public static Map<String, String> contextOnlineMap = new HashMap<>();
//楠岃瘉鏄惁涓哄巻鍙叉暟鎹� 10鍒嗛挓
@@ -82,4 +89,22 @@
}
return base;
}
+
+
+ public static String getStatus(String deviceId) {
+
+ String status = contextOnlineMap.get(deviceId);
+
+ if (null == status) {
+ status = "N";
+ contextOnlineMap.put(deviceId, status);
+ }
+
+ return status;
+
+ }
+
+ public static void updateStatus(String deviceId, String status) {
+ contextOnlineMap.put(deviceId, status);
+ }
}
diff --git a/src/main/java/com/fzzy/protocol/sdkhk/HkGatewaySyncLprImpl.java b/src/main/java/com/fzzy/protocol/sdkhk/HkGatewaySyncLprImpl.java
new file mode 100644
index 0000000..29d535a
--- /dev/null
+++ b/src/main/java/com/fzzy/protocol/sdkhk/HkGatewaySyncLprImpl.java
@@ -0,0 +1,66 @@
+package com.fzzy.protocol.sdkhk;
+
+import com.fzzy.api.data.GatewayDeviceProtocol;
+import com.fzzy.gateway.api.GatewaySyncLprService;
+import com.fzzy.gateway.data.BaseReqData;
+import com.fzzy.gateway.data.BaseResp;
+import com.fzzy.gateway.entity.GatewayDevice;
+import com.fzzy.protocol.sdkhk.lpr.AlarmLpr;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 缃戝叧涓庤澶囦箣闂寸殑閫氳-娴峰悍SDK
+ */
+@Slf4j
+@Component
+public class HkGatewaySyncLprImpl implements GatewaySyncLprService {
+
+
+ private AlarmLpr alarmLpr = new AlarmLpr();
+
+ @Override
+ public String getLprProtocol() {
+ return GatewayDeviceProtocol.DEVICE_LPR_SDK_HK.getCode();
+ }
+
+ @Override
+ public BaseResp syncLpr(BaseReqData reqData) {
+ return new BaseResp(500, "绯荤粺涓嶆敮鎸佹墜鍔ㄨЕ鍙戣幏鍙�");
+ }
+
+ @Override
+ public BaseResp initLpr(BaseReqData reqData) {
+ try {
+ String msg = alarmLpr.initSdk();
+
+ log.info("--------鍒濆鍖朒K-SDK-------{}", msg);
+
+ Thread.sleep(500);
+
+ GatewayDevice device = reqData.getDevice();
+ //濡傛灉宸茬粡涓婄嚎鍏堢绾�
+ String status = HKUtils.getStatus(reqData.getDeviceId());
+ if ("Y".equals(status)) {
+ alarmLpr.logout(reqData.getIndex(), device.getIp(), device.getPort());
+ Thread.sleep(500);
+ }
+
+ //閲嶆柊鐧婚檰
+ msg = alarmLpr.login(reqData.getIndex(), device.getIp(), device.getPort(), device.getUserName(), device.getPassword());
+
+ if (HKUtils.RESULT_SUCCESS.equals(msg)) {
+ HKUtils.updateStatus(device.getDeviceId(), "Y");
+ }
+
+ } catch (Exception e) {
+ log.error("----------------鍒濆鍖栬溅鐗岃瘑鍒墽琛岃瘑鍒け璐�----------------------{}", e);
+ }
+
+ return new BaseResp();
+ }
+}
--
Gitblit v1.9.3