From eaaefc6334bbd41ecedb0bb14aa20902b0364f06 Mon Sep 17 00:00:00 2001 From: luoyang Date: Thu, 2 Apr 2020 14:42:36 +0800 Subject: [PATCH 1/8] fix pom.xml --- pom.xml | 2 +- .../manage/mappers/payment/TransactionMapper.xml | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 0a506a47f..6d3f361c9 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ 4.0.0 manage - 1.4.25 + 1.4.26 UTF-8 1.8.0 diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.xml index 3c67c1566..64d543bf5 100644 --- a/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.xml +++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.xml @@ -561,9 +561,15 @@ + maxlength="1000"> + +
+ +
+ + + + + + +
From d8655ef3e60208950e3a6fe64d61d61e16a8bac4 Mon Sep 17 00:00:00 2001 From: dulingling Date: Fri, 3 Apr 2020 16:12:10 +0800 Subject: [PATCH 5/8] =?UTF-8?q?Upd:=E5=95=86=E6=88=B7=E7=9A=84ext=5Fparams?= =?UTF-8?q?=E5=9C=A8=E5=95=86=E6=88=B7=E6=94=AF=E4=BB=98=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E4=B8=AD=E5=81=9A=E9=9D=A2=E6=9D=BF/=20=20=20=20=20enable=5Fpr?= =?UTF-8?q?esettle=20=E5=9C=A8=E6=B8=85=E7=AE=97=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E4=B8=AD=E6=B7=BB=E5=8A=A0=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../core/impls/ClientManagerImpl.java | 20 ++++++++++++------- .../templates/partner_payment_info.html | 3 +-- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index b27108e1d..f712fd758 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ 4.0.0 manage - 1.4.28 + 1.4.29 UTF-8 1.8.0 diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java index e04a0300c..11f9b0fd3 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java @@ -407,7 +407,14 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid // donothing } - client.putAll(clientConfigService.find(client.getIntValue("client_id"))); + JSONObject clientConfig = clientConfigService.find(client.getIntValue("client_id")); + if(client.containsKey("enable_presettle")){ + clientConfig.put("enable_presettle",client.getBoolean("enable_presettle")); + } + if(client.containsKey("ext_params")){ + clientConfig.put("ext_params",client.getString("ext_params")); + } + client.putAll(clientConfig); client.put("unsubscribe", mailUnsubMapper.findOneByClientMoniker(clientMoniker) == null ? false : true); client.put("show_all_permission", true); int role = manager != null ? manager.getIntValue("role") : 0; @@ -3444,12 +3451,12 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } @Override - public void setClientPreSettle(JSONObject account, String clientMoniker, boolean presettle) { + public void setClientPreSettle(JSONObject manager, String clientMoniker, boolean presettle) { JSONObject client = getClientInfoByMoniker(clientMoniker); if (client == null) { throw new InvalidShortIdException(); } - clientModifySupport.processClientConfigModify(new SwitchPermissionModify(account, clientMoniker, "enable_presettle", presettle)); + clientModifySupport.processClientModify( new SwitchAllowSurchargeCreditModify(manager, clientMoniker, "enable_presettle", presettle)); } @Override @@ -6795,15 +6802,14 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid if (client == null) { throw new InvalidShortIdException(); } - JSONObject clientConfig = clientConfigMapper.find(client.getInteger("client_id")); - JSONObject extParmas = JSONObject.parseObject(clientConfig.getString("ext_params")); + JSONObject extParmas = JSONObject.parseObject(client.getString("ext_params")); if("true".equals(params.getString("value"))||"false".equals(params.getString("value"))){ extParmas.put(params.getString("key"),params.getBoolean("value")); }else{ extParmas.put(params.getString("key"),params.getString("value")); } - clientConfig.put("ext_params",extParmas.toString()); - clientConfigMapper.update(clientConfig); + client.put("ext_params",extParmas.toString()); + clientMapper.update(client); } } diff --git a/src/main/ui/static/payment/partner/templates/partner_payment_info.html b/src/main/ui/static/payment/partner/templates/partner_payment_info.html index 3944afdee..c42607419 100644 --- a/src/main/ui/static/payment/partner/templates/partner_payment_info.html +++ b/src/main/ui/static/payment/partner/templates/partner_payment_info.html @@ -594,11 +594,10 @@
-
+
Ext Config
-
From 917eadf0f17a65cde02f069b8770131540f5f744 Mon Sep 17 00:00:00 2001 From: dulingling Date: Fri, 3 Apr 2020 17:53:44 +0800 Subject: [PATCH 6/8] =?UTF-8?q?Upd:=E4=BF=AE=E5=A4=8D=E9=83=A8=E5=88=86?= =?UTF-8?q?=E5=95=86=E6=88=B7=E4=B8=8B=E8=BD=BD=E6=96=87=E4=BB=B6=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E6=9F=A5=E7=9C=8B=E8=AE=A2=E5=8D=95=E5=A4=87=E6=B3=A8?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../management/clearing/core/impl/CleanServiceImpl.java | 2 +- .../manage/tradelog/core/impls/TradeLogServiceImpl.java | 4 ++-- .../ui/static/payment/tradelog/templates/balance_report.html | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index f712fd758..b9e26810d 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ 4.0.0 manage - 1.4.29 + 1.4.30 UTF-8 1.8.0 diff --git a/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/impl/CleanServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/impl/CleanServiceImpl.java index 7cd89a462..5eac63bed 100644 --- a/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/impl/CleanServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/impl/CleanServiceImpl.java @@ -1110,7 +1110,7 @@ public class CleanServiceImpl implements CleanService, ManagerTodoNoticeProvider settle.getBigDecimal("settle_amount").setScale(2, BigDecimal.ROUND_DOWN).toPlainString() : "-" + settle.getBigDecimal("settle_amount").setScale(2, BigDecimal.ROUND_DOWN).toPlainString()); cell.setCellStyle(!"Credit".equals(settle.getString("transaction_type")) ? analysisStyle2 : null); - row.createCell(15, Cell.CELL_TYPE_STRING).setCellValue(settle.getString("order_detail")); + row.createCell(15, Cell.CELL_TYPE_STRING).setCellValue(settle.containsKey("order_detail")?settle.getString("order_detail"):settle.getString("remark")); String clientDevId = StringUtils.defaultString(settle.getString("dev_id"), "-"); JSONObject device = clientDeviceMapper.find(settle.getString("dev_id")); String clientDevRemark = "-"; diff --git a/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java index 64a28bfde..fcc6e4a94 100644 --- a/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java @@ -853,7 +853,7 @@ public class TradeLogServiceImpl implements TradeLogService { row.createCell(17, Cell.CELL_TYPE_STRING).setCellValue(data.getString("trans_type")); row.createCell(18, Cell.CELL_TYPE_STRING).setCellValue(data.getString("clear_status")); row.createCell(19, Cell.CELL_TYPE_STRING).setCellValue(data.getString("gateway")); - row.createCell(20, Cell.CELL_TYPE_STRING).setCellValue(data.getString("order_detail")); + row.createCell(20, Cell.CELL_TYPE_STRING).setCellValue(data.containsKey("order_detail")&&!"".equals(data.getString("order_detail"))?data.getString("order_detail"):data.getString("remark")); row.createCell(21, Cell.CELL_TYPE_STRING).setCellValue(data.getString("dev_id")); } @@ -958,7 +958,7 @@ public class TradeLogServiceImpl implements TradeLogService { String credit = dataItem.getString("transaction_type").equals("Credit") ? dataItem.getBigDecimal("clearing_amount").toString() : "-"; HSSFRichTextString text3 = new HSSFRichTextString(credit); - HSSFRichTextString text4 = new HSSFRichTextString(dataItem.getString("order_detail")); + HSSFRichTextString text4 = new HSSFRichTextString(dataItem.containsKey("order_detail")?dataItem.getString("order_detail"):dataItem.getString("remark")); cell0.setCellValue(text0); cell1.setCellValue(text1); cell2.setCellValue(text2); diff --git a/src/main/ui/static/payment/tradelog/templates/balance_report.html b/src/main/ui/static/payment/tradelog/templates/balance_report.html index 344e0591c..0cb9a5e59 100644 --- a/src/main/ui/static/payment/tradelog/templates/balance_report.html +++ b/src/main/ui/static/payment/tradelog/templates/balance_report.html @@ -586,7 +586,7 @@ -

- + From 65e5378d1c0823544b06190eead3f83f0e3d44ec Mon Sep 17 00:00:00 2001 From: luoyang Date: Tue, 7 Apr 2020 10:33:53 +0800 Subject: [PATCH 7/8] =?UTF-8?q?fix=20transaction=20=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E9=80=89=E6=8B=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-dev.properties | 16 ++++++++-------- src/main/ui/static/payment/tradelog/transflow.js | 9 ++++++--- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 1cf8273d3..9ace52739 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -2,15 +2,15 @@ spring.datasource.type = com.zaxxer.hikari.HikariDataSource #数据源master -spring.datasource.master.schema-name=royalpay_production -spring.datasource.master.host=119.28.3.196:3310 +spring.datasource.master.schema-name=royalpay_dev +spring.datasource.master.host=127.0.0.1:3306 spring.datasource.master.jdbc-url=jdbc:mysql://${spring.datasource.master.host}/${spring.datasource.master.schema-name}?useUnicode=true&characterEncoding=utf8&useSSL=false -spring.datasource.master.username=readonly -spring.datasource.master.password=read0nly +spring.datasource.master.username=root +spring.datasource.master.password=root #数据源salve -spring.datasource.slave.schema-name=royalpay_production -spring.datasource.slave.host=119.28.3.196:3310 +spring.datasource.slave.schema-name=royalpay_dev +spring.datasource.slave.host=127.0.0.1:3306 spring.datasource.slave.jdbc-url=jdbc:mysql://${spring.datasource.slave.host}/${spring.datasource.slave.schema-name}?useUnicode=true&characterEncoding=utf8&useSSL=false -spring.datasource.slave.username=readonly -spring.datasource.slave.password=read0nly +spring.datasource.slave.username=root +spring.datasource.slave.password=root diff --git a/src/main/ui/static/payment/tradelog/transflow.js b/src/main/ui/static/payment/tradelog/transflow.js index 07e9d43e2..f58a24060 100644 --- a/src/main/ui/static/payment/tradelog/transflow.js +++ b/src/main/ui/static/payment/tradelog/transflow.js @@ -34,7 +34,8 @@ define(['angular', 'uiBootstrap', 'uiRouter'], function (angular) { $scope.today = new Date(); $scope.chooseToday = function () { - $scope.params.datefrom = $scope.params.dateto = new Date(); + $scope.params.datefrom = new Date(); + $scope.params.dateto = new Date(); $scope.loadTradeLogs(1); }; $scope.chooseYesterday = function () { @@ -269,14 +270,16 @@ define(['angular', 'uiBootstrap', 'uiRouter'], function (angular) { // var day = new Date(); // day.setDate(day.getDate() - 7); // $scope.params.datefrom = day; - $scope.params.datefrom = $scope.params.dateto = new Date(); + $scope.params.datefrom = new Date(); + $scope.params.dateto = new Date(); $scope.chooseClient('all'); }else { // $scope.params.dateto = new Date(); // var day = new Date(); // day.setDate(day.getDate() - 7); // $scope.params.datefrom = day; - $scope.params.datefrom = $scope.params.dateto = new Date(); + $scope.params.datefrom = new Date(); + $scope.params.dateto = new Date(); $scope.chooseClient('all'); } From e32ff20b4069b38ccf144a35c46b20663c310f25 Mon Sep 17 00:00:00 2001 From: luoyang Date: Tue, 7 Apr 2020 14:59:01 +0800 Subject: [PATCH 8/8] =?UTF-8?q?add=20=E5=A2=9E=E5=80=BC=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E4=BA=A4=E6=98=93=E6=B5=81=E6=B0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../clearing/core/impl/CleanServiceImpl.java | 4 ---- .../manage/mappers/system/ClientIncrementalMapper.java | 3 --- .../tradelog/core/impls/TradeLogServiceImpl.java | 3 --- .../payment/manage/mappers/payment/OrderMapper.xml | 2 ++ .../manage/mappers/payment/TransactionMapper.xml | 4 +++- .../templates/partner_incremental_service_info.html | 10 ++++++++-- src/main/ui/static/menu/templates/main_menu.html | 10 ++++++++++ .../tradelog/templates/incremental_trade_logs.html | 10 ++++++++-- .../templates/partner_incremental_trade_logs.html | 10 ++++++++-- 10 files changed, 40 insertions(+), 18 deletions(-) diff --git a/pom.xml b/pom.xml index b9e26810d..c7269bb24 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ 4.0.0 manage - 1.4.30 + 1.4.31 UTF-8 1.8.0 diff --git a/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/impl/CleanServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/impl/CleanServiceImpl.java index 5eac63bed..5d48e8e1c 100644 --- a/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/impl/CleanServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/impl/CleanServiceImpl.java @@ -851,10 +851,6 @@ public class CleanServiceImpl implements CleanService, ManagerTodoNoticeProvider } List transactions = transactionMapper.listTransactionsOfClearingOrder(clearClient.getIntValue("clear_detail_id"), new PageBounds(Order.formString("order_id.asc"))); - - for (JSONObject transaction : transactions) { - transaction.put("rate_value", StringUtils.defaultString(clientIncrementalMapper.findByChannelAndClientId(transaction.getIntValue("client_id"), transaction.getString("source")), "0")); - } String timezone_client = client.getString("timezone"); if (timezone_client != null) { transactions.parallelStream().forEach(p -> { diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientIncrementalMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientIncrementalMapper.java index 0e237c899..b9f662bc0 100644 --- a/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientIncrementalMapper.java +++ b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientIncrementalMapper.java @@ -48,9 +48,6 @@ public interface ClientIncrementalMapper { @AutoSql(type = SqlType.UPDATE) void update(JSONObject saveIncrementalService); - @AutoSql(type = SqlType.SELECT) - String findByChannelAndClientId(@Param("client_id") int clientId,@Param("channel") String channel); - @AutoSql(type = SqlType.SELECT) List find(@Param("client_id") int clientId); } diff --git a/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java index fcc6e4a94..aeb24fa8c 100644 --- a/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java @@ -270,9 +270,6 @@ public class TradeLogServiceImpl implements TradeLogService { }}); } PageList logs = orderMapper.listIncrementalOrders(params, new PageBounds(query.getPage(), query.getLimit(), Order.formString("create_time.desc"))); - for (JSONObject log : logs) { - log.put("rate_value", clientIncrementalMapper.findByChannelAndClientId(log.getIntValue("client_id"), log.getString("source"))); - } JSONObject result = PageListUtils.buildPageListResult(logs); JSONObject analysis = orderMapper.analysisOrders(params); result.put("analysis", analysis); diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/OrderMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/OrderMapper.xml index 6aa7d2669..c009f4864 100644 --- a/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/OrderMapper.xml +++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/OrderMapper.xml @@ -292,6 +292,7 @@ + ,ifnull(sci.incremental_rate_value,0) as rate_value FROM ( select oo.order_id,oo.client_id,oo.total_amount,oo.display_amount, oo.customer_payment_amount,oo.coupon_payment_amount,oo.currency, @@ -366,6 +367,7 @@ ON t.order_id = o.order_id AND t.refund_id IS NULL AND t.transaction_type = 'Credit' + LEFT JOIN sys_client_incremental sci on sci.client_id = o.client_id diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.xml index d233cad01..d8785a7d8 100644 --- a/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.xml +++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.xml @@ -1154,10 +1154,12 @@ r.client_refund_id, o.order_detail, o.dev_id, - o.source + o.source, + ifnull(sci.incremental_rate_value,0) as rate_value FROM pmt_transactions t LEFT JOIN pmt_orders o ON o.order_id = t.order_id LEFT JOIN pmt_refunds r ON r.refund_id = t.refund_id + LEFT JOIN sys_client_incremental sci on sci.client_id = t.client_id WHERE t.channel != 'Settlement' AND t.clearing_order = #{clearing_order} ]]> diff --git a/src/main/ui/static/incrementalService/templates/partner_incremental_service_info.html b/src/main/ui/static/incrementalService/templates/partner_incremental_service_info.html index 678a51955..6ef529447 100644 --- a/src/main/ui/static/incrementalService/templates/partner_incremental_service_info.html +++ b/src/main/ui/static/incrementalService/templates/partner_incremental_service_info.html @@ -380,8 +380,14 @@ {{(trade.surcharge_rate * 100 - trade.rate_value)| number : 2}}% {{(trade.total_surcharge-trade.incremental_surcharge) | number : 2 | currency:trade.currency}} - {{trade.source}}:{{(trade.rate_value) | number : 2}}% - {{trade.source}}:{{trade.incremental_surcharge | currency:trade.currency}}{{0.00 | currency:trade.currency}} + + {{trade.source}}:{{(trade.rate_value) | number : 2}}% + {{trade.source}}:0.00% + + {{trade.source}}: + {{trade.incremental_surcharge | currency:trade.currency}} + {{0.00 | currency:trade.currency}} + diff --git a/src/main/ui/static/menu/templates/main_menu.html b/src/main/ui/static/menu/templates/main_menu.html index 8f636098e..e00505534 100644 --- a/src/main/ui/static/menu/templates/main_menu.html +++ b/src/main/ui/static/menu/templates/main_menu.html @@ -143,6 +143,16 @@
+
diff --git a/src/main/ui/static/payment/tradelog/templates/incremental_trade_logs.html b/src/main/ui/static/payment/tradelog/templates/incremental_trade_logs.html index af1b126c8..da3881451 100644 --- a/src/main/ui/static/payment/tradelog/templates/incremental_trade_logs.html +++ b/src/main/ui/static/payment/tradelog/templates/incremental_trade_logs.html @@ -397,8 +397,14 @@ {{(trade.surcharge_rate * 100 - trade.rate_value)| number : 2}}% {{(trade.total_surcharge-trade.incremental_surcharge) | number : 2 | currency:trade.currency}} - {{trade.source}}:{{(trade.rate_value) | number : 2}}% - {{trade.source}}:{{trade.incremental_surcharge | currency:trade.currency}} + + {{trade.source}}:{{(trade.rate_value) | number : 2}}% + {{trade.source}}:0.00% + + + {{trade.source}}:{{trade.incremental_surcharge | currency:trade.currency}} + {{0.00 | currency:trade.currency}} + diff --git a/src/main/ui/static/payment/tradelog/templates/partner_incremental_trade_logs.html b/src/main/ui/static/payment/tradelog/templates/partner_incremental_trade_logs.html index 3f596ccd8..bcbf4d146 100644 --- a/src/main/ui/static/payment/tradelog/templates/partner_incremental_trade_logs.html +++ b/src/main/ui/static/payment/tradelog/templates/partner_incremental_trade_logs.html @@ -350,8 +350,14 @@ {{(trade.surcharge_rate * 100 - trade.rate_value)| number : 2}}% {{(trade.total_surcharge-trade.incremental_surcharge) | number : 2 | currency:trade.currency}} - {{trade.source}}:{{(trade.rate_value) | number : 2}}% - {{trade.source}}:{{trade.incremental_surcharge | currency:trade.currency}}{{0.00 | currency:trade.currency}} + + {{trade.source}}:{{(trade.rate_value) | number : 2}}% + {{trade.source}}:0.00% + + {{trade.source}}: + {{trade.incremental_surcharge | currency:trade.currency}} + {{0.00 | currency:trade.currency}} +