import cn.hutool.json.JSONUtil; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.google.common.primitives.Bytes; import com.huifu.adapay.core.exception.BaseAdaPayException; import com.huifu.adapay.model.Payment; import com.huifu.adapay.model.Refund; import com.jsowell.JsowellApplication; import com.jsowell.adapay.config.AbstractAdapayConfig; import com.jsowell.adapay.dto.QueryAcctFlowDTO; import com.jsowell.adapay.dto.QueryPaymentConfirmDTO; import com.jsowell.adapay.dto.SettleAccountDTO; import com.jsowell.adapay.factory.AdapayConfigFactory; import com.jsowell.adapay.response.QueryPaymentConfirmDetailResponse; import com.jsowell.adapay.service.AdapayService; import com.jsowell.adapay.vo.DrawCashDetailVO; import com.jsowell.common.constant.CacheConstants; import com.jsowell.common.constant.Constants; import com.jsowell.common.core.domain.entity.SysDictData; import com.jsowell.common.core.domain.ykc.LoginRequestData; import com.jsowell.common.core.domain.ykc.TransactionRecordsData; import com.jsowell.common.core.redis.RedisCache; import com.jsowell.common.enums.AcquirerEnum; import com.jsowell.common.enums.DelFlagEnum; import com.jsowell.common.enums.ykc.*; import com.jsowell.common.exception.BusinessException; import com.jsowell.common.util.*; import com.jsowell.common.util.Cp56Time2a.Cp56Time2aUtil; import com.jsowell.common.util.http.HttpUtils; import com.jsowell.common.util.id.IdUtils; import com.jsowell.common.util.id.SnowflakeIdWorker; import com.jsowell.common.util.ip.AddressUtils; import com.jsowell.netty.handler.HeartbeatRequestHandler; import com.jsowell.netty.handler.TransactionRecordsRequestHandler; import com.jsowell.netty.service.yunkuaichong.YKCBusinessService; import com.jsowell.pile.domain.*; import com.jsowell.pile.domain.ykcCommond.IssueQRCodeCommand; import com.jsowell.pile.domain.ykcCommond.ProofreadTimeCommand; import com.jsowell.pile.dto.*; import com.jsowell.pile.dto.amap.GetStationInfoDTO; import com.jsowell.pile.dto.lutongyunting.BindCouponDTO; import com.jsowell.pile.mapper.MemberBasicInfoMapper; import com.jsowell.pile.mapper.PileBillingTemplateMapper; import com.jsowell.pile.service.*; import com.jsowell.pile.transaction.dto.OrderTransactionDTO; import com.jsowell.pile.transaction.service.TransactionService; import com.jsowell.pile.util.SnUtils; import com.jsowell.pile.vo.base.PileInfoVO; import com.jsowell.pile.vo.uniapp.MemberVO; import com.jsowell.pile.vo.uniapp.PileConnectorDetailVO; import com.jsowell.pile.vo.web.BalanceDeductionAmountVO; import com.jsowell.pile.vo.web.BillingTemplateVO; import com.jsowell.pile.vo.web.OrderListVO; import com.jsowell.pile.vo.web.PileDetailVO; import com.jsowell.service.MemberService; import com.jsowell.service.OrderService; import com.jsowell.service.PileService; import com.jsowell.thirdparty.amap.service.AMapService; import com.jsowell.thirdparty.lianlian.dto.CommonParamsDTO; import com.jsowell.thirdparty.lianlian.service.LianLianService; import com.jsowell.thirdparty.lianlian.util.Cryptos; import com.jsowell.thirdparty.lianlian.util.Encodes; import com.jsowell.thirdparty.lianlian.util.GBSignUtils; import com.jsowell.thirdparty.lutongyunting.service.LTYTService; import com.jsowell.wxpay.common.WeChatPayParameter; import com.jsowell.wxpay.dto.AppletTemplateMessageSendDTO; import com.jsowell.wxpay.response.WechatPayRefundRequest; import com.jsowell.wxpay.service.WxAppletRemoteService; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.RandomStringUtils; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.util.StopWatch; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.nio.charset.StandardCharsets; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; @ActiveProfiles("dev") @SpringBootTest(classes = JsowellApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @RunWith(SpringRunner.class) public class SpringBootTestController { private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Autowired private SnUtils snUtils; @Autowired private PileService pileService; @Autowired private YKCPushCommandService ykcPushCommandService; @Autowired private IAdapayMemberAccountService adapayMemberAccountService; @Autowired private IPileMsgRecordService pileMsgRecordService; @Autowired private IPileStationInfoService pileStationInfoService; @Autowired private YKCPushCommandService ykcPushBusinessService; @Autowired private HeartbeatRequestHandler heartbeatRequestHandler; @Autowired private YKCBusinessService ykcBusinessService; @Autowired private PileBillingTemplateMapper pileBillingTemplateMapper; @Autowired private PileRemoteService pileRemoteService; @Autowired private MemberService memberService; @Autowired private OrderService orderService; @Autowired private IPileBillingTemplateService pileBillingTemplateService; @Autowired private MemberBasicInfoMapper memberBasicInfoMapper; @Autowired private SimCardService simCardService; @Autowired private IPileBasicInfoService pileBasicInfoService; @Autowired private WechatPayService wechatPayService; @Autowired private IOrderBasicInfoService orderBasicInfoService; @Autowired private WxpayCallbackRecordService wxpayCallbackRecordService; @Autowired private WxAppletRemoteService wxAppletRemoteService; @Autowired private RedisCache redisCache; @Autowired private IPileAuthCardService pileAuthCardService; @Autowired private LianLianService lianLianService; @Autowired private IMemberTransactionRecordService memberTransactionRecordService; @Autowired private IMemberPlateNumberRelationService memberPlateNumberRelationService; static final String MAC_KEY = "53TtFpc4gdVZbF3x"; static final String ALGORITHM_MAC = "HmacMD5"; @Autowired private AdapayCallbackRecordService adapayCallbackRecordService; @Autowired private IAdapayRefundRecordService adapayRefundRecordService; @Autowired private AdapayService adapayService; @Autowired private AMapService aMapService; @Autowired private IPileConnectorInfoService pileConnectorInfoService; @Autowired private TransactionRecordsRequestHandler transactionRecordsRequestHandler; @Autowired private IMemberBasicInfoService memberBasicInfoService; @Autowired private ClearingWithdrawInfoService clearingWithdrawInfoService; @Autowired private OrderPileOccupyService orderPileOccupyService; @Autowired private LTYTService ltytService; @Autowired private IPileMerchantInfoService pileMerchantInfoService; @Autowired private MemberAdapayRecordService memberAdapayRecordService; @Autowired private TransactionService transactionService; @Autowired private OrderPayRecordService orderPayRecordService; /** * 单元测试,测试订单流程 */ @Test public void testTheOrderProcess() throws Exception { // 生成订单 // OrderBasicInfo orderBasicInfo = generateAnOrder(); // System.out.println(orderBasicInfo); // // 支付订单 // int a = payOrder(orderBasicInfo); // System.out.println(a); // 结算订单 OrderBasicInfo orderBasicInfo = orderBasicInfoService.getOrderInfoByOrderCode("C46006767636"); settleOrder(orderBasicInfo); // 订单退款 BigDecimal payAmount = orderBasicInfo.getPayAmount(); BigDecimal settleAmount = orderBasicInfo.getSettleAmount(); BigDecimal refundAmt = payAmount.subtract(settleAmount); // 延时分账的,可以部分解冻 memberAdapayRecordService.updateRefundAmountFromFreezeAmount("1234", refundAmt); // 实时分账,全部解冻 // memberAdapayRecordService.unfreezeAmountAndUpdateSpendAmount("test01", payAmount, refundAmt); } // 生成订单 private OrderBasicInfo generateAnOrder() throws ParseException { GenerateOrderDTO dto = new GenerateOrderDTO(); PileConnectorDetailVO vo = new PileConnectorDetailVO(); vo.setStationId("2"); dto.setPileConnector(vo); dto.setMemberId("1"); dto.setStartMode("1"); dto.setPayMode("4"); dto.setPileSn("88000000000001"); dto.setConnectorCode("01"); dto.setChargeAmount(new BigDecimal("10")); // 查询充电桩的计费模板 BillingTemplateVO billingTemplateVO = pileBillingTemplateService.selectBillingTemplateDetailByPileSn(dto.getPileSn()); dto.setBillingTemplate(billingTemplateVO); OrderBasicInfo orderBasicInfo = orderBasicInfoService.saveOrder2Database(dto); return orderBasicInfo; } // 支付订单 private int payOrder(OrderBasicInfo orderBasicInfo) throws Exception { // PayOrderDTO dto = new PayOrderDTO(); // dto.setMemberId(orderBasicInfo.getMemberId()); // dto.setOrderCode(orderBasicInfo.getOrderCode()); // dto.setStartMode(orderBasicInfo.getStartMode()); // dto.setPayMode(orderBasicInfo.getPayMode()); // dto.setPayAmount(orderBasicInfo.getPayAmount()); // // Map map = orderBasicInfoService.payOrder(dto); // return map; String paymentId = "1234"; BigDecimal amount = orderBasicInfo.getPayAmount(); String orderCode = orderBasicInfo.getOrderCode(); JSONObject json = new JSONObject(); json.put("paymentId", paymentId); json.put("amount", amount); // 记录订单支付流水 OrderPayRecord orderPayRecord = OrderPayRecord.builder() .orderCode(orderCode) .payMode(OrderPayRecordEnum.WECHATPAY_PAYMENT.getValue()) .payAmount(amount) .acquirer(AcquirerEnum.ADAPAY.getValue()) .deductionRecord(json.toJSONString()) .createBy(null) .delFlag(DelFlagEnum.NORMAL.getValue()) .build(); orderPayRecordService.batchInsert(Lists.newArrayList(orderPayRecord)); // 更新冻结金额 支付成功后全部冻结 memberAdapayRecordService.updateFreezeAmount(paymentId, amount); // 支付订单成功 PayOrderSuccessCallbackDTO callbackDTO = PayOrderSuccessCallbackDTO.builder() .orderCode(orderCode) .payAmount(amount) .payMode(OrderPayModeEnum.PAYMENT_OF_WECHATPAY.getValue()) .acquirer(AcquirerEnum.ADAPAY.getValue()) .build(); // 订单支付成功 支付回调 // orderBasicInfoService.payOrderSuccessCallback(callbackDTO); OrderBasicInfo orderInfo = orderBasicInfoService.getOrderInfoByOrderCode(callbackDTO.getOrderCode()); // 修改订单 orderInfo.setPayMode(callbackDTO.getPayMode()); orderInfo.setPayStatus(Constants.ONE); orderInfo.setPayAmount(callbackDTO.getPayAmount()); orderInfo.setPayTime(new Date()); orderInfo.setChargeStartTime(new Date()); orderInfo.setOrderStatus(OrderStatusEnum.IN_THE_CHARGING.getValue()); return orderBasicInfoService.updateOrderBasicInfo(orderInfo); } // 结算订单 private void settleOrder(OrderBasicInfo orderBasicInfo) { TransactionRecordsData data = TransactionRecordsData.builder() .transactionCode(orderBasicInfo.getTransactionCode()) .pileSn(orderBasicInfo.getPileSn()) .connectorCode(orderBasicInfo.getConnectorCode()) .startTime("2023-03-10 17:10:24") .endTime("2023-03-10 17:10:46") .sharpPrice("1.10000") .sharpUsedElectricity("2.0000") .sharpAmount("2.2000") .peakPrice("1.20000") .peakUsedElectricity("0") .peakAmount("0") .flatPrice("1.30000") .flatUsedElectricity("0") .flatAmount("0") .valleyPrice("1.40000") .valleyUsedElectricity("0") .valleyAmount("0") .totalElectricity("2") .consumptionAmount("5.3000") .vinCode("\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000") .transactionIdentifier("01") .transactionTime("2023-03-10 17:10:46") .stopReasonMsg("结束充电,APP远程停止") .logicCard("0") .createTime(new Date()) .build(); // orderBasicInfoService.settleOrder(data, orderBasicInfo); // 获取更新数据后的orderBasicInfo对象 orderBasicInfoService.returnUpdateOrderBasicInfo(orderBasicInfo, data); // 获取更新数据后的orderDetail对象/更新订单详情 查询订单详情 修改订单数据 OrderDetail orderDetail = orderBasicInfoService.returnUpdateOrderDetail(orderBasicInfo, data); // 更新数据库 OrderTransactionDTO dto = new OrderTransactionDTO(); dto.setOrderBasicInfo(orderBasicInfo); dto.setOrderDetail(orderDetail); transactionService.doUpdateOrder(dto); } /** * 测试多笔支付情况,解冻部分金额 */ @Test public void calculateUnfreezeAmountTest() { BigDecimal orderAmount = new BigDecimal("0.99"); List payRecordList = Lists.newArrayList(); // 第一笔支付记录 JSONObject jsonObject = new JSONObject(); jsonObject.put("paymentId", "002212023083114213410543206907226374144"); jsonObject.put("amount", "0.98"); OrderPayRecord build = OrderPayRecord.builder() .payAmount(new BigDecimal("0.98")) .deductionRecord(jsonObject.toJSONString()) .build(); payRecordList.add(build); // 第二笔支付记录 JSONObject jsonObject2 = new JSONObject(); jsonObject2.put("paymentId", "002212023083114410510543211818773135360"); jsonObject2.put("amount", "1.00"); OrderPayRecord build2 = OrderPayRecord.builder() .payAmount(new BigDecimal("1.00")) .deductionRecord(jsonObject2.toJSONString()) .build(); payRecordList.add(build2); // 第三笔支付记录 // JSONObject jsonObject3 = new JSONObject(); // jsonObject3.put("paymentId", "3"); // jsonObject3.put("amount", "10"); // OrderPayRecord build3 = OrderPayRecord.builder() // .payAmount(new BigDecimal("10")) // .deductionRecord(jsonObject3.toJSONString()) // .build(); // payRecordList.add(build3); List> maps = orderBasicInfoService.calculateUnfreezeAmount(orderAmount, payRecordList); System.out.println(maps); } @Test public void unfreezeAmountAndUpdateSpendAmountTest() { String paymentId = "123"; memberAdapayRecordService.updateRefundAmount(paymentId, new BigDecimal("5")); // memberAdapayRecordService.updateRefundAmountFromFreezeAmount(paymentId, new BigDecimal("20")); // BigDecimal unfreezeAmount = new BigDecimal("32"); // BigDecimal spendAmount = new BigDecimal("10"); // memberAdapayRecordService.unfreezeAmountAndUpdateSpendAmount(paymentId, unfreezeAmount, spendAmount); // memberAdapayRecordService.updateRefundAmountFromFreezeAmount(paymentId, new BigDecimal("2")); } @Test public void getFirstLevelMerchantByMerchantIdTest() { String merchantId = "13"; PileMerchantInfo merchantInfo = pileMerchantInfoService.getFirstLevelMerchantByMerchantId(merchantId); System.out.println(JSON.toJSONString(merchantInfo)); } @Test public void queryPaymentInfoTest() throws BaseAdaPayException { String wechatAppId = "wxbb3e0d474569481d"; String paymentId = "002212023082514501110541039779091623936"; // 在完成初始化设置情况下,调用查询方法,获取 Payment 查询结果 Map response = Payment.query(paymentId, wechatAppId); System.out.println(response); } /** * 手动变更银行卡信息 */ @Test public void createSettleAccountRequestTest() throws BaseAdaPayException { SettleAccountDTO dto = new SettleAccountDTO(); dto.setCardId("31050180460000002469"); dto.setCardName("上海擎昆物业管理有限公司"); dto.setTelNo("18021373333"); dto.setBankCode("01050000"); dto.setBankAcctType("1"); dto.setProvCode("0031"); dto.setAreaCode("3100"); String adapayMemberId = "ACM80899105"; String wechatAppId = "wxbb3e0d474569481d"; adapayService.createSettleAccountRequest(dto, adapayMemberId, wechatAppId); } @Test public void createDeleteSettleAccountRequestTest() throws BaseAdaPayException { String adapayMemberId = "ACM69424215"; String settleAccountId = "0498291998695360"; String wechatAppId = "wxbb3e0d474569481d"; adapayService.createDeleteSettleAccountRequest(adapayMemberId, settleAccountId, wechatAppId); } @Test public void queryDrawcashDetailTest() throws BaseAdaPayException { String orderNo = "drawcash_1692339516947"; String wechatAppId = "wxbb3e0d474569481d"; DrawCashDetailVO drawCashDetailVO = adapayService.queryDrawCashDetail(orderNo, wechatAppId); System.out.println(drawCashDetailVO); } @Test public void queryPaymentConfirmListTest() { QueryPaymentConfirmDTO dto = new QueryPaymentConfirmDTO(); dto.setWechatAppId("wxbb3e0d474569481d"); dto.setPaymentId("002212023081712452810538109291674042368"); QueryPaymentConfirmDetailResponse queryPaymentConfirmDetailResponse = adapayService.queryPaymentConfirmList(dto); System.out.println(queryPaymentConfirmDetailResponse); } @Test public void queryAcctFlowListTest() { QueryAcctFlowDTO dto = new QueryAcctFlowDTO(); try { dto.setPageNo(1); dto.setPageSize(100); dto.setAcctType("01"); dto.setWechatAppId("wxbb3e0d474569481d"); dto.setAdapayMemberId("ACM69424215"); dto.setBeginDate("20230823"); dto.setEndDate("20230823"); adapayService.queryAcctFlowList(dto); } catch (BaseAdaPayException e) { throw new RuntimeException(e); } } @Test public void testCalculateTheBalanceDeductionAmount() { String memberId = "123456"; BigDecimal amount = new BigDecimal("20"); List resultList = Lists.newArrayList(); // 查询会员的余额充值记录 按照充值时间正序 List memberAdapayRecords = Lists.newArrayList(); memberAdapayRecords.add(MemberAdapayRecord.builder().paymentId("1").balanceAmt(new BigDecimal("50")).build()); memberAdapayRecords.add(MemberAdapayRecord.builder().paymentId("2").balanceAmt(new BigDecimal("60")).build()); memberAdapayRecords.add(MemberAdapayRecord.builder().paymentId("3").balanceAmt(new BigDecimal("10")).build()); // 定义一个临时金额等于消费金额 BigDecimal tempAmount = new BigDecimal(amount.toString()); for (MemberAdapayRecord memberAdapayRecord : memberAdapayRecords) { // 该笔支付剩余金额 取出一笔判断是否剩余金额够支付订单消费吗 BigDecimal balanceAmt = memberAdapayRecord.getBalanceAmt(); // 该笔支付扣除金额 BigDecimal deductionAmount; // 获取延时分账模式 延时分账的使用撤销方法退款,实时分账的使用退款方法 // AdapayCallbackRecord callbackRecord = adapayCallbackRecordService.selectByPaymentId(memberAdapayRecord.getPaymentId()); // String payMode = null; // if (callbackRecord != null) { // JSONObject expendJsonObject = JSON.parseObject(callbackRecord.getExpend()); // payMode = expendJsonObject.getString("payMode"); // } // 消费金额 - 剩余金额 tempAmount = tempAmount.subtract(balanceAmt); if (tempAmount.compareTo(BigDecimal.ZERO) >= 0) { // 计算以后,大于等于0,说明这笔支付剩余金额需要扣完 deductionAmount = balanceAmt; BalanceDeductionAmountVO build = BalanceDeductionAmountVO.builder() .memberId(memberId) .paymentId(memberAdapayRecord.getPaymentId()) .deductionAmount(deductionAmount) .build(); resultList.add(build); } else { // 如果小于0,则说明剩余的钱用不完,扣除金额等于消费金额,并结束循环 deductionAmount = balanceAmt.add(tempAmount); BalanceDeductionAmountVO build = BalanceDeductionAmountVO.builder() .memberId(memberId) .paymentId(memberAdapayRecord.getPaymentId()) .deductionAmount(deductionAmount) .build(); resultList.add(build); break; } } System.out.println(JSON.toJSONString(resultList)); } @Test public void testGenerateOccupyPileOrder() { String memberId = "67569684"; String pileSn = "88230000000135"; String connectorCode = "01"; GenerateOccupyOrderDTO dto = new GenerateOccupyOrderDTO(); dto.setMemberId(memberId); dto.setPileSn(pileSn); dto.setConnectorCode(connectorCode); orderPileOccupyService.generateOccupyPileOrder(dto); } @Test public void testStopOccupyPileOrder() { String wechatAppId = "54135135"; AbstractAdapayConfig config = AdapayConfigFactory.getConfig(wechatAppId); System.out.println(JSON.toJSONString(config)); String wechatAppId2 = "wxbb3e0d474569481d"; AbstractAdapayConfig config2 = AdapayConfigFactory.getConfig(wechatAppId2); System.out.println(JSON.toJSONString(config2)); } @Test public void testCreateConfirmReverse() throws BaseAdaPayException { String wechatAppId = "wxbb3e0d474569481d"; List list = Lists.newArrayList(); list.add("002212023083011562610542807991444230144"); for (String s : list) { // 查询支付确认id QueryPaymentConfirmDTO dto = new QueryPaymentConfirmDTO(); dto.setPaymentId(s); dto.setWechatAppId(wechatAppId); QueryPaymentConfirmDetailResponse response = adapayService.queryPaymentConfirmList(dto); if (response != null) { List confirms = response.getPaymentConfirms(); // System.out.println("支付id:" + s + ", 确认信息:" + JSON.toJSONString(confirms)); if (CollectionUtils.isEmpty(confirms)) { for (QueryPaymentConfirmDetailResponse.PaymentConfirmInfo confirm : confirms) { adapayService.createConfirmReverse(confirm.getId(), wechatAppId); } } } } } @Test public void queryCreateConfirmReverse() throws BaseAdaPayException { String wechatAppId = "wxbb3e0d474569481d"; List list = getList(); List resultList = Lists.newArrayList(); for (String s : list) { // 查询支付确认id QueryPaymentConfirmDTO dto = new QueryPaymentConfirmDTO(); dto.setPaymentId(s); dto.setWechatAppId(wechatAppId); QueryPaymentConfirmDetailResponse response = adapayService.queryPaymentConfirmList(dto); if (response != null) { List confirms = response.getPaymentConfirms(); // System.out.println("支付id:" + s + ", 确认信息:" + JSON.toJSONString(confirms)); if (CollectionUtils.isEmpty(confirms)) { // for (QueryPaymentConfirmDetailResponse.PaymentConfirmInfo confirm : confirms) { // adapayService.createConfirmReverse(confirm.getId(), wechatAppId); // } // System.out.println("=================未分账:" + s); resultList.add(s); } } } System.out.println("=================未分账:" + JSON.toJSONString(resultList)); } public List getList() { List list = Lists.newArrayList(); list.add("002212023082122593710539713398952996864"); list.add("002212023082123024110539714169830891520"); list.add("002212023082123142910539717140601888768"); list.add("002212023082123372510539722909052194816"); list.add("002212023082123470710539725351044243456"); list.add("002212023082123484410539725760516747264"); list.add("002212023082123574110539728009334247424"); list.add("002212023082200021910539729177292292096"); list.add("002212023082200101610539731176126074880"); list.add("002212023082200113610539731511562485760"); list.add("002212023082200194110539733549149569024"); list.add("002212023082200261310539735191135604736"); list.add("002212023082200425410539739389283454976"); list.add("002212023082200532910539742053588074496"); list.add("002212023082201174510539748159895711744"); list.add("002212023082201261910539750318006927360"); list.add("002212023082201321710539751819814522880"); list.add("002212023082201591410539758600068890624"); list.add("002212023082202101110539761353808310272"); list.add("002212023082202351810539767674794455040"); list.add("002212023082203055410539775379049992192"); list.add("002212023082203133810539777324513398784"); list.add("002212023082203214310539779359409344512"); list.add("002212023082203321810539782020471762944"); list.add("002212023082203360010539782952068624384"); list.add("002212023082203441210539785015010078720"); list.add("002212023082204434210539799990398775296"); list.add("002212023082206050110539820452093546496"); list.add("002212023082206364410539828435137515520"); list.add("002212023082206442410539830366131351552"); list.add("002212023082207035110539835258732883968"); list.add("002212023082207074910539836256041463808"); list.add("002212023082207333510539842743787339776"); list.add("002212023082207425310539845083050700800"); list.add("002212023082207562610539848491559272448"); list.add("002212023082208304610539857132314525696"); list.add("002212023082208562810539863600890277888"); list.add("002212023082208571410539863792269492224"); list.add("002212023082209004110539864660699435008"); list.add("002212023082209132610539867871295729664"); list.add("002212023082209144410539868196664668160"); list.add("002212023082209155810539868509287116800"); list.add("002212023082209165110539868731240763392"); list.add("002212023082209191710539869342785646592"); list.add("002212023082209425610539875293097197568"); list.add("002212023082209480710539876596501463040"); list.add("002212023082209524110539877745632575488"); list.add("002212023082210115910539882604954046464"); list.add("002212023082210140210539883119700148224"); list.add("002212023082210250010539885882464194560"); list.add("002212023082210404410539889838334595072"); list.add("002212023082210495310539892143265460224"); list.add("002212023082211084110539896874732539904"); list.add("002212023082211482710539906883408670720"); list.add("002212023082211501110539907318932615168"); list.add("002212023082211574210539909209038409728"); list.add("002212023082212061110539911342672998400"); list.add("002212023082212173610539914216333893632"); list.add("002212023082212234010539915743088791552"); list.add("002212023082212292410539917187655970816"); list.add("002212023082213010710539925167233642496"); list.add("002212023082213092510539927256017031168"); list.add("002212023082213272510539931787460362240"); list.add("002212023082213471310539936770370613248"); list.add("002212023082213490110539937221754114048"); list.add("002212023082213515110539937937901268992"); list.add("002212023082213540610539938503931875328"); list.add("002212023082213581310539939539301511168"); list.add("002212023082213595010539939946231664640"); list.add("002212023082214160610539944039725568000"); list.add("002212023082214220710539945550819774464"); list.add("002212023082214300510539947557195153409"); list.add("002212023082214373010539949424960524288"); list.add("002212023082214382810539949667861200896"); list.add("002212023082214565710539954318165315584"); list.add("002212023082215002510539955192153657344"); list.add("002212023082215011610539955404439719936"); list.add("002212023082215045010539956301032140800"); list.add("002212023082215195110539960080360091648"); list.add("002212023082215251410539961437065035776"); list.add("002212023082215344810539963845132587008"); list.add("002212023082215374710539964595083952128"); list.add("002212023082215431010539965947703627776"); list.add("002212023082215475110539967127934636032"); list.add("002212023082215510510539967942821072896"); list.add("002212023082215592510539970040406396928"); list.add("002212023082216004810539970389333430272"); list.add("002212023082216104710539972901704716288"); list.add("002212023082216122010539973290429767680"); list.add("002212023082216131110539973503752093696"); list.add("002212023082216171610539974531894312960"); list.add("002212023082216335010539978698548592640"); list.add("002212023082216385910539979994410762240"); list.add("002212023082216501110539982814144872448"); list.add("002212023082216532010539983607666851840"); list.add("002212023082217040110539986295140368384"); list.add("002212023082217041710539986362796965888"); list.add("002212023082217055610539986776841179136"); list.add("002212023082217113110539988182371831808"); list.add("002212023082217231310539991126552530944"); list.add("002212023082217260910539991867724496896"); list.add("002212023082217270710539992110564442112"); list.add("002212023082217422410539995954179489792"); list.add("002212023082217450310539996621220626432"); list.add("002212023082217501010539997909783719936"); list.add("002212023082218103210540003033714151424"); list.add("002212023082218140610540003931906682880"); list.add("002212023082218254010540006843846746112"); list.add("002212023082218322710540008551997046784"); list.add("002212023082218372210540009789619073024"); list.add("002212023082218412310540010798147080192"); list.add("002212023082218442010540011542187528192"); list.add("002212023082218493610540012867469594624"); list.add("002212023082218592510540015339366404096"); list.add("002212023082219055110540016957270884352"); list.add("002212023082219105410540018227752357888"); list.add("002212023082219131710540018828729012224"); list.add("002212023082219164610540019704228556800"); list.add("002212023082219232310540021368787632128"); list.add("002212023082219384810540025250569670656"); list.add("002212023082219463510540027206972981248"); list.add("002212023082220034710540031534464491520"); list.add("002212023082220205910540035865085984768"); list.add("002212023082220330310540038900521172992"); list.add("002212023082221031210540046489453428736"); list.add("002212023082221135510540049186222059520"); list.add("002212023082221261310540052281828327424"); list.add("002212023082221335310540054210822291456"); list.add("002212023082221372010540055077896568832"); list.add("002212023082221440810540056788037525504"); list.add("002212023082221535710540059261011746816"); list.add("002212023082222075210540062764186546176"); list.add("002212023082222110710540063579692240896"); list.add("002212023082222111010540063594733015040"); list.add("002212023082222295610540068313862164480"); list.add("002212023082222374610540070286296678400"); list.add("002212023082222375810540070337241493504"); list.add("002212023082222422510540071456056377344"); list.add("002212023082222441210540071905909784576"); list.add("002212023082223062210540077482797268992"); list.add("002212023082223130410540079169399930880"); list.add("002212023082223454810540087407167188992"); list.add("002212023082300105110540093714048036864"); list.add("002212023082300231210540096821220589568"); list.add("002212023082300500110540103567441387520"); list.add("002212023082300502210540103655764422656"); list.add("002212023082300540510540104592244072448"); list.add("002212023082300545510540104801652469760"); list.add("002212023082300552810540104939250307072"); list.add("002212023082300555010540105033538404352"); list.add("002212023082301030510540106858521411584"); list.add("002212023082301154110540110027049832448"); list.add("002212023082301402010540116232310280192"); list.add("002212023082302034910540122140094926848"); list.add("002212023082302070410540122960534065152"); list.add("002212023082302584710540135976118439936"); list.add("002212023082303040010540137286738276352"); list.add("002212023082303113510540139196941258752"); list.add("002212023082303135210540139770240643072"); list.add("002212023082303181410540140868287660032"); list.add("002212023082303264210540142998798827520"); list.add("002212023082303311810540144158174244864"); list.add("002212023082305011210540166780886339584"); list.add("002212023082305492010540178895801847808"); list.add("002212023082306165110540185820000989184"); list.add("002212023082306311310540189435313074176"); list.add("002212023082307110210540199456680103936"); list.add("002212023082307284210540203900019130368"); list.add("002212023082308044510540212971706298368"); list.add("002212023082308390810540221628127371264"); list.add("002212023082308453910540223264743211008"); list.add("002212023082309002410540226976857440256"); list.add("002212023082309355810540235927791767552"); list.add("002212023082309415110540237407599034368"); list.add("002212023082309491910540239289421811712"); list.add("002212023082309501210540239511228760064"); list.add("002212023082310211710540247334108049408"); list.add("002212023082310260410540248536285106176"); list.add("002212023082310504310540254741864742912"); list.add("002212023082310510410540254829003034624"); list.add("002212023082311002110540257165868175360"); list.add("002212023082311130810540260381821652992"); list.add("002212023082311415110540267607832674304"); list.add("002212023082312013110540272559194263552"); list.add("002212023082312104010540274859419185152"); list.add("002212023082312144610540275894099013632"); list.add("002212023082312165810540276444265512960"); list.add("002212023082312271310540279026154024960"); list.add("002212023082312460910540283790828400640"); list.add("002212023082312465610540283987930271744"); list.add("002212023082313003610540287428291907584"); list.add("002212023082313035010540288241828810752"); list.add("002212023082313050910540288570673659904"); list.add("002212023082313081810540289363426832384"); list.add("002212023082313224810540293011724193792"); list.add("002212023082313293110540294704613572608"); list.add("002212023082313382510540296942093258752"); list.add("002212023082313444310540298528233373696"); list.add("002212023082313464410540299037026971648"); list.add("002212023082314031910540303208861728768"); list.add("002212023082314044710540303578906066944"); list.add("002212023082314431010540313239304720384"); list.add("002212023082314440510540313469279551488"); list.add("002212023082314515410540315434770649088"); list.add("002212023082314534010540315878721228800"); list.add("002212023082314535510540315944957399040"); list.add("002212023082314543610540316117350789120"); list.add("002212023082314544710540316161480232960"); list.add("002212023082315045810540318725931053056"); list.add("002212023082315171910540321834196701184"); list.add("002212023082315260210540324026228297728"); list.add("002212023082315345910540326276310859776"); list.add("002212023082315371610540326851329699840"); list.add("002212023082315392910540327411599007744"); list.add("002212023082315472410540329402146009088"); list.add("002212023082315483510540329700354584576"); list.add("002212023082315505810540330300375748608"); list.add("002212023082315560610540331594334498816"); list.add("002212023082316084010540334755069718528"); list.add("002212023082316132310540335941837697024"); list.add("002212023082316143110540336225979019264"); list.add("002212023082316150710540336378614112256"); list.add("002212023082316273410540339509233610752"); list.add("002212023082316345910540341379056578560"); list.add("002212023082316364910540341838363398144"); list.add("002212023082316423210540343276393353216"); list.add("002212023082316534510540346101941944320"); list.add("002212023082317024410540348360540893184"); list.add("002212023082317030810540348463733723136"); list.add("002212023082317143910540351358277271552"); list.add("002212023082317204710540352902300094464"); list.add("002212023082317394710540357684117032960"); list.add("002212023082317452310540359093882269696"); list.add("002212023082317533210540361144904093696"); list.add("002212023082317554810540361716218875904"); list.add("002212023082318095010540365246300487680"); list.add("002212023082318164210540366974241488896"); list.add("002212023082318201910540367883730341888"); list.add("002212023082318290610540370095818043392"); list.add("002212023082318372410540372184538529792"); list.add("002212023082318483110540374983789064192"); list.add("002212023082318545610540376599114977281"); list.add("002212023082319085810540380129298497536"); list.add("002212023082319105610540380624605458432"); list.add("002212023082319113010540380766621384704"); list.add("002212023082319353110540386811953205248"); list.add("002212023082320103710540395645090152448"); list.add("002212023082320231010540398802976264192"); list.add("002212023082320401610540403105904103424"); list.add("002212023082320445610540404279069298688"); list.add("002212023082320504910540405760125612032"); list.add("002212023082321221210540413659689615360"); list.add("002212023082321290110540415374566510592"); list.add("002212023082321303510540415769279877120"); list.add("002212023082321310310540415884343394304"); list.add("002212023082321383110540417762808553472"); list.add("002212023082321423210540418775404695552"); list.add("002212023082321575310540422636449808384"); list.add("002212023082322424110540433913690030080"); list.add("002212023082322472810540435114803777536"); list.add("002212023082322480310540435261440471040"); list.add("002212023082322565010540437472735461376"); list.add("002212023082322574710540437710480494592"); list.add("002212023082323100110540440791374811136"); list.add("002212023082323104110540440958546018304"); list.add("002212023082323123410540441434699485184"); list.add("002212023082323142610540441901752012800"); list.add("002212023082323204110540443477107429376"); list.add("002212023082323325310540446543702196224"); list.add("002212023082400262710540460024614682624"); list.add("002212023082400283910540460578351247360"); list.add("002212023082400355010540462386804051968"); list.add("002212023082400384110540463104650887168"); list.add("002212023082400425610540464175978565632"); list.add("002212023082400581910540468045184483328"); list.add("002212023082401110010540471238958419968"); list.add("002212023082401231410540474316404572160"); list.add("002212023082401363110540477661047607296"); list.add("002212023082401574310540482993852317696"); list.add("002212023082402012110540483909985579008"); list.add("002212023082402014910540484026867306496"); list.add("002212023082402050310540484837930270720"); list.add("002212023082402504110540496322268299264"); list.add("002212023082402505510540496380994617344"); list.add("002212023082403101210540501235740602368"); list.add("002212023082403152410540502544745775104"); list.add("002212023082403555810540512753106092032"); list.add("002212023082406184210540548670889840640"); list.add("002212023082406362710540553139987304448"); list.add("002212023082406480210540556055386599424"); list.add("002212023082406563710540558215600328704"); list.add("002212023082407015010540559525790679040"); list.add("002212023082407212910540564473850724352"); list.add("002212023082407425610540569869112913920"); list.add("002212023082407532810540572520432193536"); list.add("002212023082408041810540575249364934656"); list.add("002212023082408195010540579158548361216"); list.add("002212023082408294010540581631680561152"); list.add("002212023082408345110540582934792556544"); list.add("002212023082409062910540590896171495424"); list.add("002212023082410111010540607174171611137"); list.add("002212023082410120610540607411819008000"); list.add("002212023082410191410540609203115839488"); list.add("002212023082410331410540612728692400128"); list.add("002212023082410353110540613302673395712"); list.add("002212023082410494810540616897573048320"); list.add("002212023082410504310540617128387096576"); list.add("002212023082411055310540620943836594176"); list.add("002212023082411154010540623406814613504"); list.add("002212023082411183010540624119747674112"); list.add("002212023082411204110540624669585330176"); list.add("002212023082411285210540626729196892160"); list.add("002212023082411531010540632842672689152"); list.add("002212023082412085410540636803011522560"); list.add("002212023082412221610540640168371859456"); list.add("002212023082412342010540643203816001536"); list.add("002212023082412584710540649358305099776"); list.add("002212023082413123110540652812401631232"); list.add("002212023082413355110540658687069642752"); list.add("002212023082413494810540662196345933824"); list.add("002212023082413553010540663629457145856"); list.add("002212023082414045710540666010344423424"); list.add("002212023082414063210540666405108477952"); list.add("002212023082414120710540667811302363136"); list.add("002212023082414164710540668986362073088"); list.add("002212023082414565710540679093217038336"); list.add("002212023082415125210540683102276628480"); list.add("002212023082415144610540683579100479488"); list.add("002212023082415172410540684239942434816"); list.add("002212023082415282110540686994692472832"); list.add("002212023082415293110540687289872961536"); list.add("002212023082415364810540689124561670144"); list.add("002212023082415375210540689392038330368"); list.add("002212023082415400510540689948966379520"); list.add("002212023082415453810540691346797903872"); list.add("002212023082415491610540692260848992256"); list.add("002212023082415495810540692434993274880"); list.add("002212023082416003910540695127329419264"); list.add("002212023082416215010540700457061072896"); list.add("002212023082416242210540701092521594880"); list.add("002212023082416530010540708301318111232"); list.add("002212023082416542610540708661279080448"); list.add("002212023082416585310540709781760622592"); list.add("002212023082416594310540709989820035072"); list.add("002212023082417361510540719185852026880"); list.add("002212023082418074010540727089666904064"); list.add("002212023082418090110540727431379701760"); list.add("002212023082418195010540730152325369856"); list.add("002212023082418210210540730453938745344"); list.add("002212023082418281010540732248632897536"); list.add("002212023082419413610540750728586313728"); list.add("002212023082419430510540751100395991040"); list.add("002212023082419434710540751279814758400"); list.add("002212023082419573810540754762623369216"); list.add("002212023082420014010540755777460387840"); list.add("002212023082420053910540756782588461056"); list.add("002212023082420110910540758167340077056"); list.add("002212023082420131910540758711152562176"); list.add("002212023082420175610540759872602820608"); list.add("002212023082420183310540760029683507200"); list.add("002212023082420234910540761351887335424"); list.add("002212023082420241510540761462071902208"); list.add("002212023082420484110540767612045615104"); list.add("002212023082420491710540767762494148608"); list.add("002212023082420531010540768737901690880"); list.add("002212023082421032110540771303875072000"); list.add("002212023082421250710540776780965949440"); list.add("002212023082421290910540777794687283200"); list.add("002212023082421343010540779141528829952"); list.add("002212023082421490810540782822410571776"); list.add("002212023082421494310540782969359712256"); list.add("002212023082421513810540783451579011072"); list.add("002212023082421515510540783526177558528"); list.add("002212023082421523510540783690421784576"); list.add("002212023082422001710540785630021517312"); list.add("002212023082422070510540787340758388736"); list.add("002212023082422135510540789061886840832"); list.add("002212023082422203910540790756555718656"); list.add("002212023082422343310540794251522441216"); list.add("002212023082422350110540794370244366336"); list.add("002212023082422362110540794704623845376"); list.add("002212023082422423210540796263478669312"); list.add("002212023082423115110540803638787555328"); list.add("002212023082423270210540807459334336512"); list.add("002212023082423415010540811187143852032"); list.add("002212023082423564210540814926126960640"); list.add("002212023082500041510540816828419616768"); list.add("002212023082500131810540819103825518592"); list.add("002212023082500135910540819275868372992"); list.add("002212023082500262010540822382985760768"); list.add("002212023082500531510540829156709072896"); list.add("002212023082501124110540834049456070656"); list.add("002212023082501212510540836247341518848"); list.add("002212023082501212710540836255113596928"); list.add("002212023082501252510540837254351966208"); list.add("002212023082502255410540852473278742528"); list.add("002212023082502432910540856898810990592"); list.add("002212023082502472810540857903229325312"); list.add("002212023082502533810540859453269098496"); list.add("002212023082503063210540862698454929408"); list.add("002212023082503102210540863665614401536"); list.add("002212023082503344910540869819062009856"); list.add("002212023082503433610540872027448356864"); list.add("002212023082503561810540875224113053696"); list.add("002212023082504003610540876305970855936"); list.add("002212023082506114210540909297878511616"); list.add("002212023082507174410540925915435204608"); list.add("002212023082507212110540926827538845696"); list.add("002212023082507334110540929931228557312"); list.add("002212023082507440710540932556002230272"); list.add("002212023082507532510540934898244046848"); list.add("002212023082508482710540948744585269248"); list.add("002212023082509030810540952442871021568"); list.add("002212023082509205010540956897124700160"); list.add("002212023082509263210540958331183104000"); list.add("002212023082509500910540964273040838656"); list.add("002212023082509510010540964486789185536"); list.add("002212023082510041010540967802933530624"); list.add("002212023082510120410540969787384213504"); list.add("002212023082510231110540972587291406336"); list.add("002212023082510255410540973271532605440"); list.add("002212023082510314610540974748159078400"); list.add("002212023082510400610540976846091218944"); list.add("002212023082511025310540982576886857728"); list.add("002212023082511122210540984963444133888"); list.add("002212023082511132210540985216232341504"); list.add("002212023082511212610540987244232650752"); list.add("002212023082511212510540987241182449664"); list.add("002212023082511345810540990652049326080"); list.add("002212023082511403310540992057293135872"); list.add("002212023082512185610541001716439703552"); list.add("002212023082512224010541002655720353792"); list.add("002212023082512312710541004865182289920"); list.add("002212023082512340910541005546307342336"); list.add("002212023082513022710541012665586434048"); list.add("002212023082513371810541021436596518912"); list.add("002212023082513401510541022181432012800"); list.add("002212023082513443810541023282434068480"); list.add("002212023082513500110541024638516408320"); list.add("002212023082513501010541024677808205824"); list.add("002212023082513510510541024905512243200"); list.add("002212023082514170110541031432135655424"); list.add("002212023082514272010541034028517740544"); list.add("002212023082514330010541035455299469312"); list.add("002212023082514441210541038273663643648"); list.add("002212023082514470410541038995305496576"); list.add("002212023082514520310541040248138395648"); list.add("002212023082514582610541041857928085504"); list.add("002212023082515014710541042698304802816"); list.add("002212023082515014910541042708208254976"); list.add("002212023082515022910541042876196507648"); list.add("002212023082515054410541043691036495872"); list.add("002212023082515080010541044263122817024"); list.add("002212023082515152610541046133618790400"); list.add("002212023082515183010541046906792071168"); list.add("002212023082515194110541047203891924992"); list.add("002212023082515225610541048019830329344"); list.add("002212023082515262510541048896852606976"); list.add("002212023082515305710541050040126427136"); list.add("002212023082515372610541051672318332928"); list.add("002212023082515381010541051856402235392"); list.add("002212023082515444510541053510717030400"); list.add("002212023082515512110541055172669648896"); list.add("002212023082515520410541055352084463616"); list.add("002212023082515552810541056207769350144"); list.add("002212023082516173710541061784187191296"); list.add("002212023082516180710541061908622626816"); list.add("002212023082516192310541062228436156416"); list.add("002212023082516243910541063553458032640"); list.add("002212023082516273810541064303411003392"); list.add("002212023082516295310541064869377626112"); list.add("002212023082516443010541068549438738432"); list.add("002212023082516492110541069768148107264"); list.add("002212023082516572410541071795058282496"); list.add("002212023082517041710541073527473422336"); list.add("002212023082517091010541074757186215936"); list.add("002212023082517162410541076578028470272"); list.add("002212023082517320210541080512516739072"); list.add("002212023082517324710541080698379907072"); list.add("002212023082517352010541081339846967296"); list.add("002212023082517354810541081458421522432"); list.add("002212023082517393310541082402738126848"); list.add("002212023082517585510541087275756617728"); list.add("002212023082518114810541090518414376960"); list.add("002212023082518163210541091709573152768"); list.add("002212023082518171310541091881816440832"); list.add("002212023082518190910541092368019959808"); list.add("002212023082518253810541093997842976768"); list.add("002212023082519244910541108893595566080"); list.add("002212023082519324510541110890694070272"); list.add("002212023082520140110541121273545195520"); list.add("002212023082520304510541125486995300352"); list.add("002212023082520483710541129984299040768"); list.add("002212023082520501410541130388215709696"); list.add("002212023082520531410541131145803649024"); list.add("002212023082520564110541132012240224256"); list.add("002212023082521022210541133444328210432"); list.add("002212023082521030810541133636876292096"); list.add("002212023082521043010541133979402784768"); list.add("002212023082521140810541136403963498496"); list.add("002212023082521281310541139949496582144"); list.add("002212023082521355110541141867819061248"); list.add("002212023082521373710541142313278881792"); list.add("002212023082521435810541143912039919616"); list.add("002212023082522131810541151293971517440"); list.add("002212023082522173810541152385719488512"); list.add("002212023082522234110541153908205797376"); list.add("002212023082522332910541156374189887488"); list.add("002212023082522345410541156731206283264"); list.add("002212023082522382110541157596358397952"); list.add("002212023082522494610541160469003407360"); list.add("002212023082522542710541161649284747264"); list.add("002212023082523141410541166630046334976"); list.add("002212023082523312310541170942995587072"); list.add("002212023082523444310541174300812787712"); list.add("002212023082600055110541179617482178560"); list.add("002212023082600105410541180886813954048"); list.add("002212023082600144210541181843518619648"); list.add("002212023082600182510541182778203222016"); list.add("002212023082600233610541184085369913344"); list.add("002212023082600251010541184480885125120"); list.add("002212023082600483910541190389332258816"); list.add("002212023082601100010541195762647093248"); list.add("002212023082601303210541200928163856384"); list.add("002212023082602410310541218674380451840"); list.add("002212023082602430810541219199575490560"); list.add("002212023082602453610541219821559123968"); list.add("002212023082603074410541225388222861312"); list.add("002212023082603312510541231350775275520"); list.add("002212023082603375910541233002671570944"); list.add("002212023082605025610541254382004723712"); list.add("002212023082605425810541264456703586304"); list.add("002212023082605530110541266983676727296"); list.add("002212023082605582410541268340599730176"); list.add("002212023082606160010541272768315121664"); list.add("002212023082606235910541274778441134080"); list.add("002212023082607142710541287478409719808"); list.add("002212023082607173410541288261653516288"); list.add("002212023082607371910541293232062894080"); list.add("002212023082607485910541296170382839808"); list.add("002212023082607571710541298258723106816"); list.add("002212023082607573610541298336719851520"); list.add("002212023082608493010541311400602423296"); list.add("002212023082609134210541317488322527232"); list.add("002212023082609280610541321111157231616"); list.add("002212023082609300510541321610841444352"); list.add("002212023082609442910541325234988011520"); list.add("002212023082609483310541326259078365184"); list.add("002212023082609584110541328808757874688"); list.add("002212023082610135110541332624274001920"); list.add("002212023082610154610541333107110916096"); list.add("002212023082610163110541333298651254784"); list.add("002212023082610215910541334674006790144"); list.add("002212023082610281710541336258115526656"); list.add("002212023082610345810541337941499461632"); list.add("002212023082610424210541339887518081024"); list.add("002212023082610445510541340444059303936"); list.add("002212023082610523810541342386237132800"); list.add("002212023082610552510541343086567116800"); list.add("002212023082611182410541348870032764928"); list.add("002212023082611435110541355275975053312"); list.add("002212023082611463910541355980826497024"); list.add("002212023082611490110541356574744670208"); list.add("002212023082612071210541361150395600896"); list.add("002212023082612071110541361146200485888"); list.add("002212023082612104910541362062612910080"); list.add("002212023082612140210541362869698363392"); list.add("002212023082612245410541365607546654720"); list.add("002212023082612404810541369608107642880"); list.add("002212023082612414810541369859820376064"); list.add("002212023082612442110541370500358856704"); list.add("002212023082612511310541372229624082432"); list.add("002212023082613014710541374886185779200"); list.add("002212023082613112710541377322024062976"); list.add("002212023082613132910541377832584638464"); list.add("002212023082613160410541378480441470976"); list.add("002212023082613351810541383320858832896"); list.add("002212023082613400810541384540249313280"); list.add("002212023082613540910541388067408629760"); list.add("002212023082613555210541388498644221952"); list.add("002212023082614010710541389819981410304"); list.add("002212023082614035610541390526517915648"); list.add("002212023082614100010541392054035050496"); list.add("002212023082614124910541392764890505216"); list.add("002212023082614141910541393142374563840"); list.add("002212023082614292010541396921016975360"); list.add("002212023082614592510541404492333887488"); list.add("002212023082615022010541405224303837184"); list.add("002212023082615024610541405332885979136"); list.add("002212023082615063810541406305209532416"); list.add("002212023082615181810541409241704677376"); list.add("002212023082615193510541409564632961024"); list.add("002212023082615204610541409862277304320"); list.add("002212023082615213110541410051021762560"); list.add("002212023082615360310541413711432306688"); list.add("002212023082615361910541413776143339520"); list.add("002212023082615432710541415572939640832"); list.add("002212023082615472410541416565166587904"); list.add("002212023082615514410541417655439032320"); list.add("002212023082615545610541418460580929536"); list.add("002212023082616005910541419984812867584"); list.add("002212023082616074110541421669150605312"); list.add("002212023082616121310541422813579034624"); list.add("002212023082616184210541424442396454912"); list.add("002212023082616224010541425441451376640"); list.add("002212023082616230610541425548872429568"); list.add("002212023082616313510541427684432564224"); list.add("002212023082616422610541430415340404736"); list.add("002212023082616513010541432696568623104"); list.add("002212023082616535210541433293064355840"); list.add("002212023082616563010541433957556961280"); list.add("002212023082617071910541436679914688512"); list.add("002212023082617145810541438605012389888"); list.add("002212023082617160410541438881778884608"); list.add("002212023082617173810541439274104573952"); list.add("002212023082617202510541439974767218688"); list.add("002212023082617402410541445005454360576"); list.add("002212023082617405810541445147283607552"); list.add("002212023082618023810541450597622272000"); list.add("002212023082618070110541451702754766848"); list.add("002212023082618155710541453950464540672"); list.add("002212023082618234910541455930692890624"); list.add("002212023082618305510541457715140067328"); list.add("002212023082618315110541457953114198016"); list.add("002212023082618572810541464400312815616"); list.add("002212023082619011610541465353369604096"); list.add("002212023082619033910541465956055666688"); list.add("002212023082619115810541468048198041600"); list.add("002212023082619195910541470064425873408"); list.add("002212023082619241310541471131592445952"); list.add("002212023082619373710541474500478423040"); list.add("002212023082619420310541475616259723264"); list.add("002212023082619441510541476171062460416"); list.add("002212023082619534610541478565555884032"); list.add("002212023082620013610541480538623627264"); list.add("002212023082620041010541481183691304960"); list.add("002212023082620072010541481982597783552"); list.add("002212023082620113710541483060573286400"); list.add("002212023082620122910541483275807457280"); list.add("002212023082620410110541490455899688960"); list.add("002212023082620462110541491801047592960"); list.add("002212023082621014510541495675765821440"); list.add("002212023082621104410541497936659533824"); list.add("002212023082621111110541498051402645504"); list.add("002212023082621140010541498757694685184"); list.add("002212023082621304710541502982856003584"); list.add("002212023082621475310541507284623609856"); list.add("002212023082621500110541507823531642880"); list.add("002212023082621530610541508596991160320"); list.add("002212023082621550710541509105953173504"); list.add("002212023082622015410541510811718533120"); list.add("002212023082622041710541511413704409088"); list.add("002212023082622044210541511518754852864"); list.add("002212023082622082210541512441299513344"); list.add("002212023082622145910541514105656258560"); list.add("002212023082622193310541515253608271872"); list.add("002212023082622234810541516323700858880"); list.add("002212023082622272010541517213282758656"); list.add("002212023082622292410541517735057838080"); list.add("002212023082622334410541518822883704832"); list.add("002212023082622350810541519176708407296"); list.add("002212023082622425610541521138557222912"); list.add("002212023082622584910541525137984770048"); list.add("002212023082623103410541528091696365568"); list.add("002212023082623142310541529052317667328"); list.add("002212023082623201210541530517954252800"); list.add("002212023082623215210541530938341928960"); list.add("002212023082623423110541536134021926912"); list.add("002212023082623515910541538517575086080"); list.add("002212023082623593410541540426292285440"); list.add("002212023082700022610541541144451272704"); list.add("002212023082700243610541546724343406592"); list.add("002212023082700250110541546830576738304"); list.add("002212023082700291510541547893814906880"); list.add("002212023082700294910541548036190523392"); list.add("002212023082700540710541554151427035136"); list.add("002212023082700582910541555252810665984"); list.add("002212023082701183410541560304549277696"); list.add("002212023082701293910541563093531643904"); list.add("002212023082702071110541572538876133376"); list.add("002212023082702273910541577689218924544"); list.add("002212023082702301010541578326147432448"); list.add("002212023082702373210541580176367304704"); list.add("002212023082703230010541591619784245248"); list.add("002212023082703245410541592100021796864"); list.add("002212023082704365810541610233320361984"); list.add("002212023082705244410541622254578741248"); list.add("002212023082706350010541639937951547392"); list.add("002212023082706475110541643172307779584"); list.add("002212023082707004410541646415322566656"); list.add("002212023082707215710541651751991676928"); list.add("002212023082707363510541655437424033792"); list.add("002212023082707454010541657721039732736"); list.add("002212023082707543810541659976831172608"); list.add("002212023082708480010541673407932104704"); list.add("002212023082708541910541674999366471680"); list.add("002212023082709203610541681612615680000"); list.add("002212023082709574310541690954699751424"); list.add("002212023082710190310541696323883257856"); list.add("002212023082710223610541697215764254720"); list.add("002212023082710315810541699573172572160"); list.add("002212023082710344310541700264073199616"); list.add("002212023082710344610541700276818796544"); list.add("002212023082711022810541707248951808000"); list.add("002212023082711425410541717422218072064"); list.add("002212023082711444710541717897258565632"); list.add("002212023082711534110541720138546929664"); list.add("002212023082711562410541720819780972544"); list.add("002212023082712113810541724656160288768"); list.add("002212023082712185110541726470554353664"); list.add("002212023082712353610541730687123439616"); list.add("002212023082712482010541733892605267968"); list.add("002212023082712511610541734627640074240"); list.add("002212023082712525510541735044376150016"); list.add("002212023082712564910541736026619838464"); list.add("002212023082712583210541736458796122112"); list.add("002212023082713122410541739946087874560"); list.add("002212023082713141110541740394618355712"); list.add("002212023082713162810541740971485450240"); list.add("002212023082713183010541741482952962048"); list.add("002212023082713210810541742146255568896"); list.add("002212023082713241810541742942386380800"); list.add("002212023082713253410541743260203896832"); list.add("002212023082713262110541743457143947264"); list.add("002212023082713344910541745587138146304"); list.add("002212023082713360810541745920975384576"); list.add("002212023082713415710541747384564207616"); list.add("002212023082713490810541749191894528000"); list.add("002212023082714000510541751948567896064"); list.add("002212023082714132510541755303839154176"); list.add("002212023082714164710541756151222579200"); list.add("002212023082714224210541757638135496704"); list.add("002212023082714313410541759869287727104"); list.add("002212023082714321010541760022920888320"); list.add("002212023082714404610541762184045412352"); list.add("002212023082714520010541765011747278848"); list.add("002212023082714575410541766498788651008"); list.add("002212023082715134310541770477737914368"); list.add("002212023082715140310541770562506391552"); list.add("002212023082715205610541772293264359424"); list.add("002212023082715230910541772852911923200"); list.add("002212023082715262310541773666804056064"); list.add("002212023082715281710541774142062243840"); list.add("002212023082715304910541774783175610368"); list.add("002212023082715313210541774961230053376"); list.add("002212023082715332110541775417415872512"); list.add("002212023082715390110541776846346534912"); list.add("002212023082716070810541783921494654976"); list.add("002212023082716214610541787603645775872"); list.add("002212023082716320310541790189009424384"); list.add("002212023082716454310541793631229890560"); list.add("002212023082717070110541798992367923200"); list.add("002212023082717085610541799473050963968"); list.add("002212023082717123910541800406791147520"); list.add("002212023082717240410541803280619196416"); list.add("002212023082717325210541805494033252352"); list.add("002212023082717342810541805897815871488"); list.add("002212023082717391810541807112972849152"); list.add("002212023082717421410541807853215862784"); list.add("002212023082717491610541809624443092992"); list.add("002212023082717524010541810478208438272"); list.add("002212023082718064810541814034214309888"); list.add("002212023082718185610541817090282348544"); list.add("002212023082718213610541817759758979072"); list.add("002212023082718270710541819149502689280"); list.add("002212023082718304110541820045410217984"); list.add("002212023082718351910541821209997643776"); list.add("002212023082718475710541824393230925824"); list.add("002212023082718482310541824500867629056"); list.add("002212023082718505510541825136739999744"); list.add("002212023082719003910541827587857526784"); list.add("002212023082719311510541835287873114112"); list.add("002212023082719402110541837579598598144"); list.add("002212023082719414110541837914005090304"); list.add("002212023082719445910541838746064179200"); list.add("002212023082719542810541841131843514368"); list.add("002212023082719552010541841346938056704"); list.add("002212023082719590310541842285876899840"); list.add("002212023082720010110541842778804707328"); list.add("002212023082720315510541850553373593600"); list.add("002212023082720413410541852982823800832"); list.add("002212023082721005910541857870040522752"); list.add("002212023082721032710541858491227852800"); list.add("002212023082721115310541860611788263424"); list.add("002212023082721211210541862960037167104"); list.add("002212023082721275510541864646623932416"); list.add("002212023082721362110541866768716681216"); list.add("002212023082721380410541867203112534016"); list.add("002212023082721384710541867384818970624"); list.add("002212023082721402910541867811667689472"); list.add("002212023082721435210541868663334662144"); list.add("002212023082721523710541870866282729472"); list.add("002212023082721595310541872694988365824"); list.add("002212023082722035210541873697410068480"); list.add("002212023082722090710541875017067331584"); list.add("002212023082722094010541875156864458752"); list.add("002212023082722094010541875153847078912"); list.add("002212023082722105510541875468496875520"); list.add("002212023082722120210541875750386716672"); list.add("002212023082722213410541878149161517056"); list.add("002212023082722290610541880045282152448"); list.add("002212023082722334710541881222971412480"); list.add("002212023082722581110541887364910563328"); list.add("002212023082723011110541888118979313664"); list.add("002212023082723123610541890991415021568"); list.add("002212023082723143710541891500196511744"); list.add("002212023082723213810541893266215456768"); list.add("002212023082723235010541893818248220672"); list.add("002212023082723255010541894321707307008"); list.add("002212023082723295410541895348326219776"); list.add("002212023082723320710541895902621675520"); list.add("002212023082723362210541896972271661056"); list.add("002212023082723503410541900549338583040"); list.add("002212023082723533510541901308394455040"); list.add("002212023082723595110541902883289460736"); list.add("002212023082800043110541904057278812160"); list.add("002212023082800101110541905485646888960"); list.add("002212023082800151310541906750961504256"); list.add("002212023082800181910541907531977240576"); list.add("002212023082800281110541910012558327808"); list.add("002212023082800333110541911355413942272"); list.add("002212023082801315910541926067617443840"); list.add("002212023082801321710541926147163406336"); list.add("002212023082802232310541939003593371648"); list.add("002212023082802265110541939876207329280"); list.add("002212023082803031310541949027348983808"); list.add("002212023082803084510541950420460392448"); list.add("002212023082805554310541992440437067776"); list.add("002212023082806192410541998399252516864"); list.add("002212023082806204910541998758018830336"); list.add("002212023082806411310542003890949345280"); list.add("002212023082806451710542004913910730752"); list.add("002212023082807073710542010533255737344"); list.add("002212023082807152310542012488895057920"); list.add("002212023082807302510542016274436448256"); list.add("002212023082807303910542016331202351104"); list.add("002212023082807533610542022106350944256"); list.add("002212023082808011210542024018231726080"); list.add("002212023082808215610542029235018776576"); list.add("002212023082808390510542033554817933312"); list.add("002212023082808451910542035120738779136"); list.add("002212023082809130910542042124090265600"); list.add("002212023082809284510542046053440225280"); list.add("002212023082809583310542053549306695680"); list.add("002212023082810304110542061638937817088"); list.add("002212023082811031610542069838020775936"); list.add("002212023082811113010542071907881218048"); list.add("002212023082811165910542073290508808192"); list.add("002212023082811280910542076098368843776"); list.add("002212023082811553110542082987629105152"); list.add("002212023082811583910542083776863956992"); list.add("002212023082812193710542089052559413248"); list.add("002212023082812314210542092093547675648"); list.add("002212023082812345310542092893166567424"); list.add("002212023082812401010542094222747930624"); list.add("002212023082812455110542095654511595520"); list.add("002212023082812552010542098042119680000"); list.add("002212023082812554110542098127096922112"); list.add("002212023082813002510542099319972614144"); list.add("002212023082813045410542100448651931648"); list.add("002212023082813130210542102493441740800"); list.add("002212023082813415810542109774169026560"); list.add("002212023082813430510542110058275995648"); list.add("002212023082813463910542110955357786112"); list.add("002212023082814040810542115355201470464"); list.add("002212023082814052310542115667096014848"); list.add("002212023082814100310542116841748877312"); list.add("002212023082814180810542118879023493120"); list.add("002212023082814392610542124235939041280"); list.add("002212023082814493910542126809139183616"); list.add("002212023082814524310542127580405579776"); list.add("002212023082814570510542128677617586176"); list.add("002212023082815024610542130111784062976"); list.add("002212023082815085910542131675350511616"); list.add("002212023082815100610542131956946472960"); list.add("002212023082815142010542133020248395776"); list.add("002212023082815411810542139808809811968"); list.add("002212023082815413610542139884386832384"); list.add("002212023082815563410542143650050682880"); list.add("002212023082815570910542143797806125056"); list.add("002212023082816030610542145295328899072"); list.add("002212023082816075710542146514698469376"); list.add("002212023082816112110542147368748564480"); list.add("002212023082816113310542147418265530368"); list.add("002212023082816142410542148136935247872"); list.add("002212023082816184210542149218902102016"); list.add("002212023082816190610542149318475436032"); list.add("002212023082816210510542149817250795520"); list.add("002212023082816231110542150346012528640"); list.add("002212023082816295910542152059637186560"); list.add("002212023082816590110542159366766276608"); list.add("002212023082817032510542160474217721856"); list.add("002212023082817145510542163364523692032"); list.add("002212023082817174610542164085818150912"); list.add("002212023082817183610542164294935265280"); list.add("002212023082817474310542171619165622272"); list.add("002212023082817474410542171623963906048"); list.add("002212023082817513010542172575138885632"); list.add("002212023082817551610542173522674995200"); list.add("002212023082817572910542174078525657088"); list.add("002212023082818254710542181200897028096"); list.add("002212023082818343710542183423196426240"); list.add("002212023082819233810542195759496577024"); list.add("002212023082819425510542200611350171648"); list.add("002212023082819460110542201391084568576"); list.add("002212023082819514410542202828990599168"); list.add("002212023082819580110542204412318957568"); list.add("002212023082820053110542206297650647040"); list.add("002212023082820133810542208342458707968"); list.add("002212023082820201610542210010501656576"); list.add("002212023082820201510542210006406389760"); list.add("002212023082820371210542214273597607936"); list.add("002212023082821164610542224230401769472"); list.add("002212023082821292310542227404140331008"); list.add("002212023082821313510542227958406623232"); list.add("002212023082821325010542228273036541952"); list.add("002212023082821353110542228948155908096"); list.add("002212023082821375510542229551086465024"); list.add("002212023082822014610542235552756051968"); list.add("002212023082822075210542237088203558912"); list.add("002212023082822291710542242478958219264"); list.add("002212023082822380210542244682429026304"); list.add("002212023082822420410542245697751240704"); list.add("002212023082822473010542247065206173696"); list.add("002212023082822474810542247140848844800"); list.add("002212023082822502410542247792193474560"); list.add("002212023082822531310542248502411554816"); list.add("002212023082822560310542249217363693568"); list.add("002212023082823102210542252816541663232"); list.add("002212023082823163210542254371659468800"); list.add("002212023082823243610542256398754103296"); list.add("002212023082823300010542257758463574016"); list.add("002212023082823321210542258312262602752"); list.add("002212023082823344310542258948368228352"); list.add("002212023082823450310542261545962991616"); list.add("002212023082823495910542262786693083136"); list.add("002212023082900125210542268546454118400"); list.add("002212023082901045210542281633541279744"); list.add("002212023082901085210542282639359127552"); list.add("002212023082901183710542285093280043008"); list.add("002212023082901403810542290632740622336"); list.add("002212023082902172410542299886648725504"); list.add("002212023082902210610542300816673501184"); list.add("002212023082902230410542301313036267520"); list.add("002212023082902271510542302364941602816"); list.add("002212023082902321410542303620174692352"); list.add("002212023082902415310542306046703665152"); list.add("002212023082903040310542311628388585472"); list.add("002212023082903154010542314549608775680"); list.add("002212023082903161610542314702204350464"); list.add("002212023082903522810542323813329301504"); list.add("002212023082904021910542326291596734464"); list.add("002212023082904481210542337837940494336"); list.add("002212023082905391510542350685484867584"); list.add("002212023082905562510542355003124989952"); list.add("002212023082906363210542365101113626624"); list.add("002212023082906493110542368366405607424"); list.add("002212023082907113010542373898392219648"); list.add("002212023082907512210542383931114811392"); list.add("002212023082908072110542387954380099584"); list.add("002212023082908470410542397950516154368"); list.add("002212023082909044310542402392694239232"); list.add("002212023082909130610542404500761767936"); list.add("002212023082909213910542406654566232064"); list.add("002212023082909214710542406687183384576"); list.add("002212023082909215410542406716512550912"); list.add("002212023082909252010542407581386592256"); list.add("002212023082909525410542414517917347840"); list.add("002212023082909554910542415251405266944"); list.add("002212023082910014510542416743138844672"); list.add("002212023082910031310542417112409387008"); list.add("002212023082910135710542419813000298496"); list.add("002212023082910144110542419998290890752"); list.add("002212023082910251110542422643516964864"); list.add("002212023082910422110542426963530317824"); list.add("002212023082911021110542431951306264576"); list.add("002212023082911294010542438867703267328"); list.add("002212023082911362110542440552575262720"); list.add("002212023082912151010542450318339919872"); list.add("002212023082912201710542451605923676160"); list.add("002212023082912231510542452352863072256"); list.add("002212023082912251710542452866592059392"); list.add("002212023082912363710542455719816085504"); list.add("002212023082912390710542456347196751872"); list.add("002212023082913160110542465631748517888"); list.add("002212023082913212710542467002099580928"); list.add("002212023082913224610542467331620237312"); list.add("002212023082913232410542467492856614912"); list.add("002212023082913292610542469008661303296"); list.add("002212023082913324010542469823255728128"); list.add("002212023082913373210542471046887526400"); list.add("002212023082913554910542475648802471936"); list.add("002212023082914000610542476725980037120"); list.add("002212023082914031510542477519953219584"); list.add("002212023082914072010542478546531069952"); list.add("002212023082914100310542479229980524544"); list.add("002212023082914142710542480340327641088"); list.add("002212023082914165210542480947963224064"); list.add("002212023082914333210542485140208013312"); list.add("002212023082914380410542486280550821888"); list.add("002212023082914474910542488736399699968"); list.add("002212023082914482710542488896629526528"); list.add("002212023082914523310542489925837205504"); list.add("002212023082914532810542490158464483328"); list.add("002212023082915011510542492114503925760"); list.add("002212023082915132710542495185904664576"); list.add("002212023082915355210542500828656603136"); list.add("002212023082915380410542501379524153344"); list.add("002212023082916033310542507793852321792"); list.add("002212023082916053810542508320644042752"); list.add("002212023082916164410542511111665168384"); list.add("002212023082916260710542513472734416896"); list.add("002212023082916412610542517328046522368"); list.add("002212023082916494710542519430773919744"); list.add("002212023082916572710542521359978299392"); list.add("002212023082917004710542522199675392000"); list.add("002212023082917050910542523296648572928"); list.add("002212023082917193310542526920638873600"); list.add("002212023082917214910542527490424090624"); list.add("002212023082917371510542531376193462272"); list.add("002212023082917375410542531539814887424"); list.add("002212023082917434710542533019390349312"); list.add("002212023082917455010542533535928864768"); list.add("002212023082918062710542538722252677120"); list.add("002212023082918103610542539769525141504"); list.add("002212023082918145410542540850744541184"); list.add("002212023082918323810542545311606550528"); list.add("002212023082919200710542557262305312768"); list.add("002212023082919240310542558251234283520"); list.add("002212023082919501110542564827631759360"); list.add("002212023082920050710542568588133072896"); list.add("002212023082920063110542568937255153664"); list.add("002212023082920181010542571870744784896"); list.add("002212023082920182310542571926689398784"); list.add("002212023082920203910542572496029999104"); list.add("002212023082920224610542573030361776128"); list.add("002212023082920284010542574513986043904"); list.add("002212023082920310010542575101089845248"); list.add("002212023082920325510542575582885167104"); list.add("002212023082920334910542575807629520896"); list.add("002212023082920435410542578346411593728"); list.add("002212023082921122610542585525469229056"); list.add("002212023082921292210542589788161355776"); list.add("002212023082921510610542595257485832192"); list.add("002212023082921535510542595968001130496"); list.add("002212023082921545710542596229162520576"); list.add("002212023082921583410542597139164028928"); list.add("002212023082921584910542597202099384320"); list.add("002212023082921590210542597255073443840"); list.add("002212023082922002510542597601141272576"); list.add("002212023082922184910542602234568105984"); list.add("002212023082922215010542602994425188352"); list.add("002212023082922222010542603117328117760"); list.add("002212023082922240310542603551272402944"); list.add("002212023082922252410542603888906653696"); list.add("002212023082922375710542607047037911040"); list.add("002212023082922422410542608167179030528"); list.add("002212023082923113310542615502370803712"); list.add("002212023082923123110542615748292014080"); list.add("002212023082923211910542617963282628608"); list.add("002212023082923225210542618352347267072"); list.add("002212023082923235310542618608662786048"); list.add("002212023082923355710542621646478131200"); list.add("002212023082923395610542622646542786560"); list.add("002212023082923405710542622902465658880"); list.add("002212023083000060410542629222200012800"); list.add("002212023083000114210542630641173942272"); list.add("002212023083000420210542638274804527104"); list.add("002212023083000595110542642757759307776"); list.add("002212023083001204010542647999427932160"); list.add("002212023083002103110542660542759796736"); list.add("002212023083003045210542674220190191616"); list.add("002212023083003125110542676230492749824"); list.add("002212023083003201010542678069127753728"); list.add("002212023083003213610542678430328188928"); list.add("002212023083003543610542686737314676736"); list.add("002212023083005092410542705561869529088"); list.add("002212023083006013810542718704509595648"); list.add("002212023083006474910542730328971579392"); list.add("002212023083007084710542735604625686528"); list.add("002212023083007212610542738788787699712"); list.add("002212023083008185510542753253390303232"); list.add("002212023083008222010542754115020804096"); list.add("002212023083008231110542754325181751296"); list.add("002212023083008510410542761342246567936"); list.add("002212023083009342110542772236358090752"); list.add("002212023083009485710542775909057376256"); list.add("002212023083009583810542778349513359360"); list.add("002212023083010122710542781826394411008"); list.add("002212023083010224010542784396528373760"); list.add("002212023083010404410542788944042545152"); list.add("002212023083010435010542789722824228864"); list.add("002212023083011192810542798690609364992"); list.add("002212023083011312210542801683617693696"); list.add("002212023083011324910542802051125628928"); list.add("002212023083011351110542802644744949760"); list.add("002212023083011360010542802850748284928"); list.add("002212023083011442810542804983737823232"); list.add("002212023083011445210542805083078692864"); list.add("002212023083011535410542807355591127040"); list.add("002212023083012274210542815861275176960"); list.add("002212023083012473910542820882950279168"); list.add("002212023083012554710542822929485697024"); list.add("002212023083013111210542826809174953984"); list.add("002212023083013144710542827712146911232"); list.add("002212023083013173710542828423778762752"); list.add("002212023083013320710542832071153209344"); list.add("002212023083013323910542832207357263872"); list.add("002212023083013435510542835043593371648"); list.add("002212023083013523610542837226933125120"); list.add("002212023083013553910542837994364321792"); list.add("002212023083014080010542841103149076480"); list.add("002212023083014210710542844405388308480"); list.add("002212023083014362210542848242142720000"); list.add("002212023083014492110542851509570400256"); list.add("002212023083015060610542855723395334144"); list.add("002212023083015221510542859787107979264"); list.add("002212023083015394010542864170987806720"); list.add("002212023083015412410542864609757966336"); list.add("002212023083015483510542866416958799872"); list.add("002212023083015504510542866963122778112"); list.add("002212023083016010310542869553813803008"); list.add("002212023083016052010542870629308321792"); list.add("002212023083016140310542872823761485824"); list.add("002212023083017014410542884822577905664"); list.add("002212023083017102710542887019237441536"); list.add("002212023083017110510542887176762023936"); list.add("002212023083017181410542888975754428416"); list.add("002212023083017203910542889583728807936"); list.add("002212023083017231310542890232885432320"); list.add("002212023083017410010542894707228033024"); list.add("002212023083017441510542895525422075904"); list.add("002212023083017454510542895900449669120"); list.add("002212023083017561210542898533220810752"); list.add("002212023083017561410542898540757274624"); list.add("002212023083018012310542899834629279744"); list.add("002212023083018092410542901854714613760"); list.add("002212023083018311510542907350570565632"); list.add("002212023083018313310542907428278792192"); list.add("002212023083019001810542914662568812544"); list.add("002212023083019030410542915358092349440"); list.add("002212023083019142510542918216947851264"); list.add("002212023083019145410542918336048156672"); list.add("002212023083019304910542922341801590784"); list.add("002212023083019330910542922930800312320"); list.add("002212023083019453610542926061918408704"); list.add("002212023083019593810542929594046107648"); list.add("002212023083020102110542932289559216128"); list.add("002212023083020140110542933215295029248"); list.add("002212023083020293410542937128456413184"); list.add("002212023083020342010542938329124683776"); list.add("002212023083020384310542939429439004672"); list.add("002212023083020573210542944165566771200"); list.add("002212023083021142910542948432925208576"); list.add("002212023083021150210542948568499113984"); list.add("002212023083021180710542949344631078912"); list.add("002212023083021413910542955268924395520"); list.add("002212023083021415810542955349111377920"); list.add("002212023083021445710542956100387500032"); list.add("002212023083021545010542958584347222016"); list.add("002212023083021595910542959880664006656"); list.add("002212023083022002910542960006660874240"); list.add("002212023083022115310542962877656616960"); list.add("002212023083022155710542963900770172928"); list.add("002212023083022350610542968717318967296"); list.add("002212023083022454810542971413031456768"); list.add("002212023083022480510542971986893156352"); list.add("002212023083022544010542973643499225088"); list.add("002212023083022583810542974642851835904"); list.add("002212023083023041310542976045078433792"); list.add("002212023083023083310542977138172809216"); list.add("002212023083023122710542978118007803904"); list.add("002212023083023141610542978575317057536"); list.add("002212023083023270310542981791209148416"); list.add("002212023083023423710542985708775854080"); list.add("002212023083100171310542994418043899904"); list.add("002212023083102005510543020515630944256"); list.add("002212023083102062610543021903302668288"); list.add("002212023083102075310543022269475389440"); list.add("002212023083102301610543027899742306304"); list.add("002212023083102355710543029329113272320"); list.add("002212023083102583910543035041987506176"); list.add("002212023083103071010543037185069924352"); list.add("002212023083103184510543040102203174912"); list.add("002212023083103203310543040554547695616"); list.add("002212023083103212310543040764616192000"); list.add("002212023083103374810543044897602686976"); list.add("002212023083103484810543047663899947008"); list.add("002212023083106520910543093807263666176"); list.add("002212023083107011510543096094519975936"); list.add("002212023083107360710543104869778214912"); list.add("002212023083107462910543107478595035136"); list.add("002212023083107492810543108231674122240"); list.add("002212023083107552510543109726616174592"); list.add("002212023083108400310543120961597177856"); list.add("002212023083109124710543129197158350848"); list.add("002212023083109191710543130834144870400"); list.add("002212023083109245110543132233904574464"); list.add("002212023083109315410543134008243142656"); list.add("002212023083109353210543134921429782528"); list.add("002212023083110070510543142863927414784"); list.add("002212023083110072410543142940159168512"); list.add("002212023083110114610543144039741820928"); list.add("002212023083110131510543144412468367360"); list.add("002212023083110132010543144435361157120"); list.add("002212023083110150610543144880826998784"); list.add("002212023083111041710543157259130880000"); list.add("002212023083111115210543159163698798592"); list.add("002212023083111313410543164123025674240"); list.add("002212023083111350310543164998272483328"); list.add("002212023083111354310543165168271818752"); list.add("002212023083111492810543168628674080768"); list.add("002212023083112032310543172129927090176"); list.add("002212023083112184910543176015816679424"); list.add("002212023083112401610543181412467634176"); list.add("002212023083112415010543181807805595648"); list.add("002212023083113024710543187077932593152"); list.add("002212023083113041110543187432055287808"); list.add("002212023083113371710543195761432219648"); list.add("002212023083113411310543196751621181440"); list.add("002212023083113494210543198886296125440"); list.add("002212023083114003410543201619999997952"); list.add("002212023083114135310543204970874601472"); list.add("002212023083114155010543205461773615104"); list.add("002212023083114165010543205712122163200"); list.add("002212023083114222610543207124444008448"); list.add("002212023083114315710543209519995326464"); list.add("002212023083114365910543210783236227072"); list.add("002212023083114414910543212000561483776"); list.add("002212023083114434110543212471430303744"); list.add("002212023083114510910543214351422308352"); list.add("002212023083115141610543220165843337216"); list.add("002212023083115190110543221363900743680"); list.add("002212023083115205910543221857356238848"); list.add("002212023083115353110543225516172922880"); list.add("002212023083115425910543227392723009536"); list.add("002212023083115452610543228010023251968"); list.add("002212023083115524610543229857746432000"); list.add("002212023083115583910543231336953073664"); list.add("002212023083116020710543232208470261760"); list.add("002212023083116022010543232265849303040"); list.add("002212023083116034110543232602529316864"); list.add("002212023083116064410543233370402926592"); list.add("002212023083116131010543234989857624064"); list.add("002212023083116135310543235172048633856"); list.add("002212023083116172610543236063416332288"); list.add("002212023083116173510543236101087326208"); list.add("002212023083116235110543237677306413056"); list.add("002212023083116441810543242823365898240"); list.add("002212023083116510510543244533474938880"); list.add("002212023083116563410543245911442247680"); list.add("002212023083116591510543246589570940928"); list.add("002212023083116592310543246620435955712"); list.add("002212023083117120310543249807715504128"); list.add("002212023083117152910543250672490135552"); list.add("002212023083117184310543251486817275904"); list.add("002212023083117241610543252883829469184"); list.add("002212023083117370510543256108994945024"); list.add("002212023083117445010543258060081348608"); list.add("002212023083117493810543259266458705920"); list.add("002212023083118055110543263345981624320"); list.add("002212023083118065710543263623518478336"); list.add("002212023083118072810543263755555000320"); list.add("002212023083118211210543267209433600000"); list.add("002212023083118213610543267310974636032"); list.add("002212023083118425210543272663976087552"); list.add("002212023083118462210543273544850178048"); list.add("002212023083118554910543275922538123264"); list.add("002212023083118562310543276063027056640"); list.add("002212023083119145410543280723918016512"); list.add("002212023083119253310543283404125401088"); list.add("002212023083119313210543284910109511680"); list.add("002212023083119393510543286936740196352"); list.add("002212023083119561610543291134570614784"); list.add("002212023083120000710543292102200811520"); list.add("002212023083120113810543295004419391488"); list.add("002212023083120150310543295864292904960"); list.add("002212023083120190310543296866828701696"); list.add("002212023083120273110543298999284158464"); list.add("002212023083120455510543303629392424960"); list.add("002212023083120504010543304825218519040"); list.add("002212023083120590610543306946361970688"); list.add("002212023083121011610543307491161829376"); list.add("002212023083121013310543307563306307584"); list.add("002212023083121062710543308797833404416"); list.add("002212023083121111510543310005929881600"); list.add("002212023083121115410543310169319690240"); list.add("002212023083121361210543316284165459968"); list.add("002212023083121381010543316779769364480"); list.add("002212023083121395710543317225960235008"); list.add("002212023083121495410543319733288439808"); list.add("002212023083121531010543320555236159488"); list.add("002212023083122024110543322947614920704"); list.add("002212023083122164210543326474600992768"); list.add("002212023083122253010543328690369691648"); list.add("002212023083122271710543329141267476480"); list.add("002212023083123073710543339291363930112"); list.add("002212023083123131610543340711349907456"); list.add("002212023083123293710543344824888295424"); list.add("002212023083123360110543346436926443520"); list.add("002212023083123421910543348022112178176"); list.add("002212023083123431510543348258886709248"); list.add("002212023083123575610543351951576371200"); list.add("002212023090100095010543354946089250816"); list.add("002212023090100313010543360399213842432"); list.add("002212023090100432210543363386206027776"); list.add("002212023090100585810543367310474727424"); list.add("002212023090101052010543368915265130496"); list.add("002212023090101532210543381002684588032"); list.add("002212023090102340510543391247107608576"); list.add("002212023090102581710543397340434984960"); list.add("002212023090103052710543399141609930752"); list.add("002212023090103071610543399599209140224"); list.add("002212023090103505210543410573650276352"); list.add("002212023090103581210543412418709655552"); list.add("002212023090104395210543422902819221504"); list.add("002212023090106174210543447525800640512"); list.add("002212023090106181410543447658803818496"); list.add("002212023090106215310543448578327564288"); list.add("002212023090107352410543467076500160512"); list.add("002212023090108273710543480218408837120"); list.add("002212023090108403410543483477144862720"); list.add("002212023090109030210543489132200857600"); list.add("002212023090109064710543490073991270400"); list.add("002212023090109173410543492790690910208"); list.add("002212023090109251110543494706523148288"); list.add("002212023090109262710543495026238164992"); list.add("002212023090109273210543495295241314304"); list.add("002212023090109325410543496648756137984"); list.add("002212023090109330610543496696956669952"); list.add("002212023090109382810543498050051792896"); list.add("002212023090109484710543500645830250496"); list.add("002212023090109511310543501255838130176"); list.add("002212023090110105510543506214524915712"); list.add("002212023090110193610543508400265392128"); list.add("002212023090110243110543509638354415616"); list.add("002212023090110315510543511497917456384"); list.add("002212023090110472410543515394956718080"); list.add("002212023090111103410543521227795955712"); list.add("002212023090111305710543526357884530688"); list.add("002212023090112352610543542582868279296"); list.add("002212023090112391110543543527712387072"); list.add("002212023090113032210543549614350389248"); list.add("002212023090113191010543553587741560832"); list.add("002212023090113201610543553864960471040"); list.add("002212023090113251510543555120429068288"); list.add("002212023090113355010543557783789260800"); list.add("002212023090113372210543558171628240896"); list.add("002212023090113403210543558967912583168"); list.add("002212023090113583610543563514671394816"); list.add("002212023090114070510543565646398062592"); list.add("002212023090114333010543572295095406592"); list.add("002212023090114365710543573163003670528"); list.add("002212023090114433810543574848240377856"); list.add("002212023090114465410543575669136261120"); list.add("002212023090114473710543575848848830464"); list.add("002212023090114475910543575941385392128"); list.add("002212023090115075710543580964650582016"); list.add("002212023090115121010543582025402646528"); list.add("002212023090115212710543584364311838720"); list.add("002212023090115243310543585141413924864"); list.add("002212023090115384610543588721518411776"); list.add("002212023090115395410543589005773721600"); list.add("002212023090115441310543590091294212096"); list.add("002212023090115443510543590184338870272"); list.add("002212023090115520710543592082411483136"); list.add("002212023090115562110543593145976455168"); list.add("002212023090116180910543598631521116160"); list.add("002212023090116223110543599730500165632"); list.add("002212023090116230110543599858892005376"); list.add("002212023090116374610543603567303487488"); list.add("002212023090116414110543604554608271360"); list.add("002212023090116463210543605776523259904"); list.add("002212023090116491410543606456276246528"); list.add("002212023090117113010543612057243217920"); list.add("002212023090117114510543612120699863040"); list.add("002212023090117190710543613976920162304"); list.add("002212023090117200510543614216620371968"); list.add("002212023090117345710543617961285672960"); list.add("002212023090117365710543618463296933888"); list.add("002212023090117444410543620421610958848"); list.add("002212023090117514310543622177756667904"); list.add("002212023090117561810543623333829308416"); list.add("002212023090118225010543630010290647040"); list.add("002212023090118400210543634337141325824"); list.add("002212023090118421710543634903384879104"); list.add("002212023090118470210543636100961783808"); list.add("002212023090118533410543637744341585920"); list.add("002212023090119124110543642555550134272"); list.add("002212023090119241810543645479836569600"); list.add("002212023090119263710543646061055766528"); list.add("002212023090119422010543650017037615104"); list.add("002212023090119435410543650412536029184"); list.add("002212023090119491310543651747594862592"); list.add("002212023090119541210543653001402273792"); list.add("002212023090120141610543658050925649920"); list.add("002212023090120290210543661767641370624"); list.add("002212023090120292010543661844547076096"); list.add("002212023090120335210543662983874457600"); list.add("002212023090120335510543662998148370432"); list.add("002212023090120530910543667839785361408"); list.add("002212023090120572910543668929259098112"); list.add("002212023090121004010543669730102759424"); list.add("002212023090121030910543670352810893312"); list.add("002212023090121032310543670414094209024"); list.add("002212023090121032810543670433925459968"); list.add("002212023090121310810543677398813003776"); list.add("002212023090121424510543680322578436096"); list.add("002212023090121483910543681806038528000"); list.add("002212023090121494310543682075069575168"); list.add("002212023090122061410543686231884722176"); list.add("002212023090122130910543687971576582144"); list.add("002212023090122170010543688939038695424"); list.add("002212023090122295010543692170888581120"); list.add("002212023090122450910543696025871585280"); list.add("002212023090123005610543699994640142336"); list.add("002212023090123105410543702503199969280"); list.add("002212023090123141310543703336853565440"); list.add("002212023090123152510543703640161484800"); list.add("002212023090123185910543704538530295808"); list.add("002212023090123283810543706964867805184"); list.add("002212023090123293210543707193463300096"); list.add("002212023090123293810543707219733217280"); list.add("002212023090123313610543707714958884864"); list.add("002212023090123362810543708939321368576"); list.add("002212023090123372210543709162993750016"); list.add("002212023090123405110543710043336855552"); list.add("002212023090123463510543711483946815488"); list.add("002212023090123494210543712270502981632"); list.add("002212023090200350710543723697358565376"); list.add("002212023090200424910543725635901050880"); list.add("002212023090201053410543731360610865152"); list.add("002212023090201233610543735899986980864"); list.add("002212023090201483710543742195457871872"); list.add("002212023090202214410543750527292493824"); list.add("002212023090202274110543752027931639808"); list.add("002212023090202493910543757553559531520"); list.add("002212023090202544310543758831300661248"); list.add("002212023090203184710543764886067970048"); list.add("002212023090203324810543768411920527360"); list.add("002212023090203374010543769638694256640"); list.add("002212023090204481310543787391159652352"); list.add("002212023090206434810543816481840697344"); list.add("002212023090207142010543824165267107840"); list.add("002212023090207171210543824886472400896"); list.add("002212023090207305310543828329463648256"); list.add("002212023090207403410543830764365008896"); list.add("002212023090208471910543847564598439936"); list.add("002212023090209125810543854020644855808"); list.add("002212023090209395510543860799338835968"); list.add("002212023090209440410543861844900864000"); list.add("002212023090210011810543866183777615872"); list.add("002212023090210004810543866057650622464"); list.add("002212023090210122210543868969749282816"); list.add("002212023090210180210543870393338003456"); list.add("002212023090210243810543872053124853760"); list.add("002212023090210290810543873185609281536"); list.add("002212023090210365210543875134937477120"); list.add("002212023090210432610543876783992496128"); list.add("002212023090210435610543876911319904256"); list.add("002212023090210531410543879253623144448"); list.add("002212023090211055610543882449473789952"); list.add("002212023090211064710543882662073880576"); list.add("002212023090211160910543885020748451840"); list.add("002212023090211165210543885201640370176"); list.add("002212023090211290810543888286534209536"); list.add("002212023090211313410543888898952900608"); list.add("002212023090211440810543892062744051712"); list.add("002212023090211473810543892940840751104"); list.add("002212023090211552310543894890626633728"); list.add("002212023090212055910543897559177125888"); list.add("002212023090212090710543898348015865856"); list.add("002212023090212415510543906602095063040"); list.add("002212023090213140110543914681361223680"); list.add("002212023090213262810543917816146395136"); list.add("002212023090214000410543926271353257984"); list.add("002212023090214155310543930249372786688"); list.add("002212023090214162410543930380520284160"); list.add("002212023090214162710543930395053477888"); list.add("002212023090214172410543930632196292608"); list.add("002212023090214423810543936983650918400"); list.add("002212023090214451510543937642465464320"); list.add("002212023090214485110543938546624991232"); list.add("002212023090214571510543940662288846848"); list.add("002212023090214585110543941064092049408"); list.add("002212023090214581510543940912489852928"); list.add("002212023090215021910543941935224745984"); list.add("002212023090215050410543942629794639872"); list.add("002212023090215140710543944904097263616"); list.add("002212023090215153010543945254384562176"); list.add("002212023090215180310543945897074511872"); list.add("002212023090215181110543945928624955392"); list.add("002212023090215181910543945963857108992"); list.add("002212023090215214310543946818231078912"); list.add("002212023090215270110543948151039676416"); list.add("002212023090215270810543948181017427968"); list.add("002212023090215275210543948364300124160"); list.add("002212023090215385210543951133515558912"); list.add("002212023090215401910543951498461974528"); list.add("002212023090215464710543953124528910336"); list.add("002212023090215571710543955770592677888"); list.add("002212023090216001410543956513305784320"); list.add("002212023090216030110543957212440195072"); list.add("002212023090216242410543962592765792256"); list.add("002212023090216260810543963031134298112"); list.add("002212023090216455610543968011491348480"); list.add("002212023090217211810543976913926483968"); list.add("002212023090217274510543978534640836608"); list.add("002212023090217311610543979421533319168"); list.add("002212023090217402710543981731794407424"); list.add("002212023090217551710543985466553012224"); list.add("002212023090218023610543987305388019712"); list.add("002212023090218091110543988962515587072"); list.add("002212023090218132310543990021602512896"); list.add("002212023090218234910543992646887636992"); list.add("002212023090218463910543998389747249152"); list.add("002212023090218583410544001389692026880"); list.add("002212023090219083510544003912235585536"); list.add("002212023090219114910544004726483869696"); list.add("002212023090219211510544007096727101440"); list.add("002212023090219295510544009279308685312"); list.add("002212023090219324210544009982126346240"); list.add("002212023090219421410544012378089029632"); list.add("002212023090219432210544012663856062464"); list.add("002212023090219455810544013320332832768"); list.add("002212023090219524310544015017845477376"); list.add("002212023090220002910544016973734449152"); list.add("002212023090220055110544018323016638464"); list.add("002212023090220071910544018692273963008"); list.add("002212023090220073310544018752051826688"); list.add("002212023090220110510544019641543061504"); list.add("002212023090220181510544021441182281728"); list.add("002212023090220234210544022814360326144"); list.add("002212023090220235410544022864158658560"); list.add("002212023090220301210544024450647150592"); list.add("002212023090220470310544028689407569920"); list.add("002212023090221105110544034680151232512"); list.add("002212023090221190210544036739744952320"); list.add("002212023090221200610544037009577275392"); list.add("002212023090221214910544037439667720192"); list.add("002212023090221265810544038735346274304"); list.add("002212023090221322210544040096495951872"); list.add("002212023090221341110544040551148556288"); list.add("002212023090221343310544040646050439168"); list.add("002212023090221394710544041963285086208"); list.add("002212023090221464510544043715161329664"); list.add("002212023090221523210544045172376367104"); list.add("002212023090221575110544046508975386624"); list.add("002212023090222032510544047908835942400"); list.add("002212023090222124910544050275724525568"); list.add("002212023090222152010544050907518472192"); list.add("002212023090222160010544051075639398400"); list.add("002212023090222261610544053659273850880"); list.add("002212023090222263710544053747192303616"); list.add("002212023090222285210544054314901131264"); list.add("002212023090222375610544056597164544000"); list.add("002212023090222440710544058152820375552"); list.add("002212023090222460510544058646459604992"); list.add("002212023090222523810544060296246317056"); list.add("002212023090223020410544062669962334208"); list.add("002212023090223023410544062795952001024"); list.add("002212023090223091610544064482329513984"); list.add("002212023090223135310544065644264968192"); list.add("002212023090223185810544066920574865408"); list.add("002212023090223205410544067409551130624"); list.add("002212023090223214310544067614536208384"); list.add("002212023090223280810544069229123317760"); list.add("002212023090223364310544071388336648192"); list.add("002212023090223395410544072189381767168"); list.add("002212023090223423110544072847273328640"); list.add("002212023090300035310544078225818734592"); list.add("002212023090300290210544084554859171840"); list.add("002212023090300303910544084963809718272"); list.add("002212023090300332110544085643144359936"); list.add("002212023090301042410544093456885248000"); list.add("002212023090301270910544099180245553152"); list.add("002212023090301432810544103286601646080"); list.add("002212023090301450010544103673391321088"); list.add("002212023090301585310544107168264605696"); list.add("002212023090302042910544108577372209152"); list.add("002212023090302442110544118609501454336"); list.add("002212023090302592710544122408695345152"); list.add("002212023090303002510544122650645356544"); list.add("002212023090303151410544126382146551808"); list.add("002212023090303475110544134588306452480"); list.add("002212023090304060810544139190606598144"); list.add("002212023090304384710544147406011559936"); list.add("002212023090304400510544147734663651328"); list.add("002212023090307061410544184514444365824"); list.add("002212023090307225610544188716755050496"); list.add("002212023090307382010544192593352183808"); list.add("002212023090308314810544206048697114624"); list.add("002212023090308373910544207519292223488"); list.add("002212023090308390310544207869667602432"); list.add("002212023090308440610544209144410402816"); list.add("002212023090308493910544210541340372992"); list.add("002212023090309003510544213289831522304"); list.add("002212023090309184510544217862855294976"); list.add("002212023090309245710544219421332058112"); list.add("002212023090309422410544223816027983872"); list.add("002212023090309483310544225363073757184"); list.add("002212023090309503910544225888480890880"); list.add("002212023090309592610544228099371954176"); list.add("002212023090310024510544228934847950848"); list.add("002212023090310101010544230800378810368"); list.add("002212023090310130110544231517547982848"); list.add("002212023090310152110544232105941630976"); list.add("002212023090310222010544233863724105728"); list.add("002212023090310264710544234985253105664"); list.add("002212023090310265210544235003329015808"); list.add("002212023090310340110544236803544682496"); list.add("002212023090310431510544239126038806528"); list.add("002212023090310590710544243120128757760"); list.add("002212023090311015710544243832586469376"); list.add("002212023090311052510544244708149841920"); list.add("002212023090311285610544250624572149760"); list.add("002212023090311460310544254930980835328"); list.add("002212023090311520410544256444789706752"); list.add("002212023090312021810544259023237419008"); list.add("002212023090312110810544261245027995648"); list.add("002212023090312111510544261275362365440"); list.add("002212023090312150410544262235447521280"); list.add("002212023090312221010544264020957618176"); list.add("002212023090312423910544269173583872000"); list.add("002212023090312493510544270920612962304"); list.add("002212023090312495610544271010190712832"); list.add("002212023090312564310544272716327161856"); list.add("002212023090312580710544273067394330624"); list.add("002212023090313141610544277133277376512"); list.add("002212023090313374210544283029640736768"); list.add("002212023090313415910544284107610583040"); list.add("002212023090313460110544285123807932416"); list.add("002212023090313462210544285210507014144"); list.add("002212023090314065610544290386881966080"); list.add("002212023090314140010544292165399445504"); list.add("002212023090314172610544293026896826368"); list.add("002212023090314282210544295780253663232"); list.add("002212023090314311510544296505012547584"); list.add("002212023090314423310544299351496183808"); list.add("002212023090314465010544300425989611520"); list.add("002212023090314552610544302592330780672"); list.add("002212023090314562310544302830750380032"); list.add("002212023090314595210544303708578091008"); list.add("002212023090315130110544307016731258880"); list.add("002212023090315231410544309589258661888"); list.add("002212023090315294310544311217438875648"); list.add("002212023090315383510544313449521975296"); list.add("002212023090315384810544313504285949952"); list.add("002212023090315494310544316251396497408"); list.add("002212023090316020410544319362114641920"); list.add("002212023090316212810544324242729304064"); list.add("002212023090316223510544324524567277568"); list.add("002212023090316244110544325050881126400"); list.add("002212023090316395410544328881035407360"); list.add("002212023090316443110544330043538923520"); list.add("002212023090316484110544331092510011392"); list.add("002212023090316521510544331990263103488"); list.add("002212023090317060310544335463532040192"); list.add("002212023090317114010544336877132296192"); list.add("002212023090317164210544338143343828992"); list.add("002212023090317200710544339000646160384"); list.add("002212023090317253310544340369443778560"); list.add("002212023090317265910544340729017536512"); list.add("002212023090317444710544345211542986752"); list.add("002212023090317542310544347627545264128"); list.add("002212023090317592710544348902875430912"); list.add("002212023090318102410544351656858570752"); list.add("002212023090318120410544352075689254912"); list.add("002212023090318265310544355805325824000"); list.add("002212023090318315810544357084821614592"); list.add("002212023090318363810544358257652158464"); list.add("002212023090318381010544358643018203136"); list.add("002212023090318422010544359693076533248"); list.add("002212023090319032310544364989243518976"); list.add("002212023090319242710544370290315198464"); list.add("002212023090319274010544371100228382720"); list.add("002212023090319532910544377597148291072"); list.add("002212023090320242710544385392674402304"); list.add("002212023090321223810544400032660742144"); list.add("002212023090321281910544401463754158080"); list.add("002212023090321334810544402843736985600"); list.add("002212023090321371810544403725546549248"); list.add("002212023090321373510544403797964025856"); list.add("002212023090321403710544404561098289152"); list.add("002212023090321474310544406345568874496"); list.add("002212023090321515810544407415052103680"); list.add("002212023090321544110544408099627827200"); list.add("002212023090321550610544408203692703744"); list.add("002212023090321592010544409271151382528"); list.add("002212023090322051210544410746084454400"); list.add("002212023090322255610544415962114166784"); list.add("002212023090322261810544416054943965184"); list.add("002212023090322373410544418890709696512"); list.add("002212023090323180310544429077468532736"); list.add("002212023090323221910544430151626514432"); list.add("002212023090323394410544434537643593728"); list.add("002212023090323444310544435790750703616"); list.add("002212023090323460610544436137542684672"); list.add("002212023090323470310544436379165515776"); list.add("002212023090400001410544439694543912960"); list.add("002212023090400234610544445618674331648"); list.add("002212023090400461610544451278192267264"); list.add("002212023090400551310544453531300376576"); list.add("002212023090400564010544453895183822848"); list.add("002212023090400571110544454025060515840"); list.add("002212023090401072610544456605941526528"); list.add("002212023090401432210544465648548827136"); list.add("002212023090402260510544476398450139136"); list.add("002212023090402352410544478745012162560"); list.add("002212023090403072710544486811393818624"); list.add("002212023090403284910544492186803621888"); list.add("002212023090403572410544499381047623680"); list.add("002212023090404180710544504592834187264"); list.add("002212023090405523710544528376412721152"); list.add("002212023090406373110544539675642359808"); list.add("002212023090406543910544543987718127616"); list.add("002212023090407243110544551502719713280"); list.add("002212023090407333210544553773737136128"); list.add("002212023090408173910544564876054986752"); list.add("002212023090408233910544566382216970240"); list.add("002212023090408243510544566619250384896"); list.add("002212023090408504810544573216521576448"); list.add("002212023090408532310544573866381258752"); list.add("002212023090408552310544574371532136448"); list.add("002212023090408563110544574655537770496"); list.add("002212023090409022610544576143264866304"); list.add("002212023090409254710544582018532761600"); list.add("002212023090409340510544584108731498496"); list.add("002212023090409434110544586524191641600"); list.add("002212023090409444010544586773329182720"); list.add("002212023090409474810544587559824019456"); list.add("002212023090410041810544591714886189056"); list.add("002212023090410223210544596301443133440"); list.add("002212023090410582910544605348971274240"); list.add("002212023090411045310544606961411141632"); list.add("002212023090411545910544619567276781568"); list.add("002212023090412032610544621693555814400"); list.add("002212023090412185410544625588261343232"); list.add("002212023090412294410544628312881221632"); list.add("002212023090412302210544628472243802112"); list.add("002212023090412394610544630838868074496"); list.add("002212023090412430910544631687309004800"); list.add("002212023090412512010544633746790830080"); list.add("002212023090413284110544643147417276416"); list.add("002212023090413295510544643457002106880"); list.add("002212023090413310610544643757718999040"); list.add("002212023090413521210544649067236028416"); list.add("002212023090414051310544652342334083072"); list.add("002212023090414081810544653116212498432"); list.add("002212023090414234910544657022159261696"); list.add("002212023090414244010544657238559842304"); list.add("002212023090414294410544658510662815744"); list.add("002212023090414302310544658677007519744"); list.add("002212023090414365510544660318163849216"); list.add("002212023090414543610544664771341012992"); list.add("002212023090415003210544666263300362240"); list.add("002212023090415032210544666975987437568"); list.add("002212023090415041310544667189431349248"); list.add("002212023090415081610544668210377682944"); list.add("002212023090415164510544670343910494208"); list.add("002212023090415420610544676725385297920"); list.add("002212023090415435810544677194566717440"); list.add("002212023090415444010544677368070111232"); list.add("002212023090416012410544681578617999360"); list.add("002212023090416014210544681655428939776"); list.add("002212023090416025110544681945852678144"); list.add("002212023090416115110544684210606264320"); list.add("002212023090416163210544685387259600896"); list.add("002212023090416223310544686903059304448"); list.add("002212023090416404810544691494632783872"); list.add("002212023090416455810544692795399700480"); list.add("002212023090416481210544693358209904640"); list.add("002212023090416493010544693683423653888"); list.add("002212023090417091210544698643723288576"); list.add("002212023090417140010544699850004226048"); list.add("002212023090417160010544700352528875520"); list.add("002212023090417174910544700810876440576"); list.add("002212023090417212710544701725573754880"); list.add("002212023090417242610544702477076365312"); list.add("002212023090417264610544703063160750080"); list.add("002212023090417321010544704423057260544"); list.add("002212023090417394410544706325207568384"); list.add("002212023090417440710544707430215479296"); list.add("002212023090417443710544707554765406208"); list.add("002212023090418033510544712330486317056"); list.add("002212023090418150710544715230318276608"); list.add("002212023090418503010544724136856485888"); list.add("002212023090419082410544728638641528832"); list.add("002212023090419205810544731801636556800"); list.add("002212023090419414810544737044336312320"); list.add("002212023090419544310544740295741505536"); list.add("002212023090420024410544742313783676928"); list.add("002212023090420043010544742757491118080"); list.add("002212023090420140610544745174889758720"); list.add("002212023090420271410544748481758646272"); list.add("002212023090420322210544749770987110400"); list.add("002212023090420324110544749852293582848"); list.add("002212023090420474710544753650583072768"); list.add("002212023090420495210544754173752102912"); list.add("002212023090421144210544760423247646720"); list.add("002212023090421193010544761632387190784"); list.add("002212023090421432010544767631702683648"); list.add("002212023090421440610544767822335447040"); list.add("002212023090421452510544768154342227968"); list.add("002212023090421462110544768388755980288"); list.add("002212023090421464110544768472318988288"); list.add("002212023090421481210544768856492822528"); list.add("002212023090422063710544773491336400896"); list.add("002212023090422065510544773564064968704"); list.add("002212023090422094710544774285978562560"); list.add("002212023090422131810544775170567041024"); list.add("002212023090422182410544776453772652544"); list.add("002212023090422235710544777850880364544"); list.add("002212023090422261510544778430256013312"); list.add("002212023090422530610544785186242301952"); list.add("002212023090423051210544788233053638656"); list.add("002212023090423061810544788511539298304"); list.add("002212023090423081510544789000458473472"); list.add("002212023090423134910544790400795774976"); list.add("002212023090423233410544792855305617408"); list.add("002212023090423290610544794249262223360"); list.add("002212023090423412010544797325272571904"); list.add("002212023090423442110544798083656548352"); list.add("002212023090423585110544801736560840704"); list.add("002212023090500132310544805391129219072"); list.add("002212023090500182910544806675939176448"); list.add("002212023090500340910544810618599006208"); list.add("002212023090500362110544811170337902592"); list.add("002212023090500411910544812419985805312"); list.add("002212023090500471710544813921360924672"); list.add("002212023090500523410544815251516420096"); list.add("002212023090501130310544820407266672640"); list.add("002212023090501300410544824691534393344"); list.add("002212023090501441710544828267722014720"); list.add("002212023090502160610544836273842966528"); list.add("002212023090503020210544847834772635648"); list.add("002212023090503060210544848842985857024"); list.add("002212023090503174410544851786195259392"); list.add("002212023090503330410544855643294818304"); list.add("002212023090504153710544866352634654720"); list.add("002212023090504422110544873080374788096"); list.add("002212023090505022510544878127866580992"); list.add("002212023090506395610544902671169179648"); list.add("002212023090507201010544912797166305280"); list.add("002212023090507340410544916295208165376"); list.add("002212023090507392710544917649508069376"); list.add("002212023090507502310544920398822924288"); list.add("002212023090508525510544936138693808128"); list.add("002212023090508525910544936152708370432"); list.add("002212023090509125810544941183444668416"); list.add("002212023090509171310544942252688535552"); list.add("002212023090509233710544943862951604224"); list.add("002212023090509511110544950800718106624"); list.add("002212023090509522010544951091826159616"); list.add("002212023090510015710544953508503609344"); list.add("002212023090511183310544972785284829184"); list.add("002212023090511251510544974472175177728"); list.add("002212023090511281310544975218718674944"); list.add("002212023090511330410544976439616008192"); list.add("002212023090511342910544976798274973696"); list.add("002212023090511350010544976925624881152"); list.add("002212023090511451510544979505341853696"); list.add("002212023090511543010544981832179511296"); list.add("002212023090511560110544982214513946624"); list.add("002212023090511564310544982390367608832"); list.add("002212023090512105010544985945627791360"); list.add("002212023090512184210544987924345810944"); list.add("002212023090512223010544988879919796224"); list.add("002212023090512241610544989326111731712"); list.add("002212023090512450910544994581351260160"); list.add("002212023090513045010544999535530012672"); list.add("002212023090513094510545000770646695936"); list.add("002212023090513140910545001879655215104"); list.add("002212023090513444510545009577648291840"); list.add("002212023090513482310545010492503289856"); list.add("002212023090513544410545012090895470592"); list.add("002212023090514323410545021612318621696"); list.add("002212023090514403110545023614028484608"); list.add("002212023090514430410545024255048134656"); list.add("002212023090514443210545024624999747584"); list.add("002212023090514481710545025567908716544"); list.add("002212023090514482810545025616081219584"); list.add("002212023090514491210545025799202123776"); list.add("002212023090514570810545027793513984000"); list.add("002212023090515000710545028546920058880"); list.add("002212023090515052110545029862169636864"); list.add("002212023090515202510545033655558967296"); list.add("002212023090515243210545034691656572928"); list.add("002212023090515311210545036366543745024"); list.add("002212023090515335210545037040841097216"); list.add("002212023090515485210545040815680249856"); list.add("002212023090515544510545042295741079552"); list.add("002212023090516111510545046448726179840"); list.add("002212023090516160910545047680385183744"); list.add("002212023090516183910545048309843722240"); list.add("002212023090516370410545052943975735296"); list.add("002212023090516395110545053645851652096"); list.add("002212023090516402310545053777932603392"); list.add("002212023090516464310545055373267365888"); list.add("002212023090516531210545057002777063424"); list.add("002212023090517065810545060467238612992"); list.add("002212023090517112210545061574108876800"); list.add("002212023090517141010545062278798831616"); list.add("002212023090517223910545064416764448768"); list.add("002212023090517262710545065373139841024"); list.add("002212023090517315610545066753025331200"); list.add("002212023090517320810545066800358219776"); list.add("002212023090517405010545068991944876032"); list.add("002212023090517422510545069389523292160"); list.add("002212023090517464410545070476795600896"); list.add("002212023090518005910545074061040791552"); list.add("002212023090518045810545075065001734144"); list.add("002212023090518063410545075468242120704"); list.add("002212023090519092410545091279600644096"); list.add("002212023090519161610545093009297477632"); list.add("002212023090519294910545096417801015296"); list.add("002212023090519433410545099879788675072"); list.add("002212023090519502910545101620768690176"); list.add("002212023090519545510545102735548305408"); list.add("002212023090520000310545104025800269824"); list.add("002212023090520013310545104403366432768"); list.add("002212023090520123210545107167656927232"); list.add("002212023090520205010545109257376862209"); list.add("002212023090520302210545111656422281216"); list.add("002212023090520321610545112136248832000"); list.add("002212023090520424710545114782702039040"); list.add("002212023090520505410545116822583214080"); list.add("002212023090520505510545116826200408064"); list.add("002212023090521113610545122030897205248"); list.add("002212023090521130210545122392462962688"); list.add("002212023090521151510545122952488841216"); list.add("002212023090521212610545124509460787200"); list.add("002212023090521230510545124921520640000"); list.add("002212023090521233910545125065079250944"); list.add("002212023090521253210545125540304891904"); list.add("002212023090521291510545126475269533696"); list.add("002212023090521503110545131827995893760"); list.add("002212023090522012010545134547778916352"); list.add("002212023090522092910545136601156128768"); list.add("002212023090522321210545142314444099584"); list.add("002212023090522380010545143776922165248"); list.add("002212023090522394610545144221796036608"); list.add("002212023090522411410545144588238802944"); list.add("002212023090522512010545147132621049856"); list.add("002212023090523155910545153335974301696"); list.add("002212023090523172210545153683155083264"); return list; } @Test public void testClearingWithdraw() { // 保存提现记录 ClearingWithdrawInfo record = new ClearingWithdrawInfo(); record.setWithdrawCode("132321354"); record.setWithdrawStatus(Constants.ZERO); Date now = new Date(); record.setApplicationTime(now); record.setCreateTime(now); record.setDelFlag(DelFlagEnum.NORMAL.getValue()); clearingWithdrawInfoService.insertOrUpdate(record); } @Test public void testGetPileTypeNum() { Long stationId = 1L; pileConnectorInfoService.getPileTypeNum(stationId); } @Test public void testUpdateStatus() { String pileConnectorCode = "8800000000012601"; String status = "0"; pileConnectorInfoService.updateConnectorStatus(pileConnectorCode, status); } @Test public void testRedisSet() { String redisKey = "push_station_connector"; redisCache.setCacheSet(redisKey, Sets.newHashSet("1")); redisCache.setCacheSet(redisKey, Sets.newHashSet("3")); redisCache.setCacheSet(redisKey, Sets.newHashSet("5")); redisCache.setCacheSet(redisKey, Sets.newHashSet("1")); redisCache.setCacheSet(redisKey, Sets.newHashSet("1")); redisCache.setCacheSet(redisKey, Sets.newHashSet("7")); redisCache.setCacheSet(redisKey, Sets.newHashSet("3")); Set cacheSet = redisCache.getCacheSet(redisKey); System.out.println(cacheSet); } @Test public void testSettleOrder() { Map returnAmountMap = Maps.newHashMap(); returnAmountMap.put("returnPrincipal", new BigDecimal("16.8700")); // 更新会员钱包 BigDecimal returnPrincipal = returnAmountMap.get("returnPrincipal"); // if (returnPrincipal != null && principalPayRecord != null) { // principalPayRecord.setRefundAmount(returnPrincipal); // updatePayRecordList.add(principalPayRecord); // } BigDecimal returnGift = returnAmountMap.get("returnGift"); System.out.println(returnPrincipal); // if (returnGift != null && giftPayRecord != null) { // giftPayRecord.setRefundAmount(returnGift); // updatePayRecordList.add(giftPayRecord); // // 支付的赠送金额-退回的赠送金额 = 实际使用赠送金额消费的部分 // virtualAmount = giftPay.subtract(returnGift); // } // UpdateMemberBalanceDTO updateMemberBalanceDTO = UpdateMemberBalanceDTO.builder() // .memberId(orderBasicInfo.getMemberId()) // .type(MemberWalletEnum.TYPE_IN.getValue()) // 进账 // .subType(MemberWalletEnum.SUBTYPE_ORDER_SETTLEMENT_REFUND.getValue()) // 订单结算退款 // .updatePrincipalBalance(returnPrincipal) // .updateGiftBalance(returnGift) // .relatedOrderCode(orderBasicInfo.getOrderCode()) // .build(); // memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO); } @Test public void testVin() { String vinCode = "tango"; MemberPlateNumberRelation memberPlateInfoByVinCode = memberPlateNumberRelationService.getMemberPlateInfoByVinCode(vinCode); System.out.println(memberPlateInfoByVinCode); } @Test public void testParking() throws UnsupportedEncodingException { // GetTokenDTO dto = new GetTokenDTO(); // dto.setAppId("I2qa3hdr116100dc"); // dto.setSecretKey("2qa3hdr13754a8e"); // String token = ltytService.getToken(dto); // System.out.println(token); BindCouponDTO dto = new BindCouponDTO(); dto.setAppId("I2qa3hdr116100dc"); dto.setSecretKey("2qa3hdr13754a8e"); dto.setMerchantId("3prv98bm8db70a9"); dto.setCouponId("3prvd0q7a4817bf"); dto.setPlateNumber("贵A12345"); dto.setPlateColor(1); String s = ltytService.bindCoupon(dto); System.out.println(s); } @Test public void testUpdateConnectorStatus() { String pileConnectorCode = "8800000000000101"; String status = PileConnectorStatusEnum.FREE.getValue(); pileConnectorInfoService.updateConnectorStatus(pileConnectorCode, status); } @Test public void testOrder() throws Exception { // 通过vin码查询数据库绑定用户信息 MemberPlateNumberRelation plateInfo = memberPlateNumberRelationService.getMemberPlateInfoByVinCode("LNBSCC4H1LT107646"); GenerateOrderDTO dto = new GenerateOrderDTO(); dto.setMemberPlateNumberRelation(plateInfo); dto.setPileSn("88000000000126"); dto.setConnectorCode("01"); dto.setStartMode(StartModeEnum.VIN_CODE.getValue()); dto.setMemberId(plateInfo.getMemberId()); // 通过memberId获取账户余额 MemberVO memberVO = memberBasicInfoService.queryMemberInfoByMemberId(dto.getMemberId()); if (memberVO == null) { throw new BusinessException(ReturnCodeEnum.CODE_GET_MEMBER_ACCOUNT_AMOUNT_ERROR); } BigDecimal totalAccountAmount = memberVO.getTotalAccountAmount(); if (totalAccountAmount.compareTo(BigDecimal.ZERO) <= 0) { throw new BusinessException(ReturnCodeEnum.CODE_BALANCE_IS_INSUFFICIENT); } dto.setChargeAmount(totalAccountAmount); // 充电金额 dto.setPayMode(OrderPayModeEnum.PAYMENT_OF_BALANCE.getValue()); // 1-余额支付 OrderBasicInfo basicInfo = orderBasicInfoService.generateOrder(dto); // 支付订单 PayOrderDTO payOrderDTO = new PayOrderDTO(); payOrderDTO.setOrderCode(basicInfo.getOrderCode()); payOrderDTO.setPayAmount(totalAccountAmount); payOrderDTO.setPayMode(dto.getPayMode()); payOrderDTO.setMemberId(dto.getMemberId()); // payOrderDTO.setCode(); // payOrderDTO.setLockValue(); // payOrderDTO.setOrderBasicInfo(basicInfo); Map map = orderBasicInfoService.payOrder(payOrderDTO); System.out.println(map); } @Test public void testTransactionRecord() { // 获取消息体 String msg = "8823000000123302230707215317078588230000001233020000341507071763023615070717b02a0200a00f0000000000003016000090dc010000000000000000000000000020c50100000000000000000000000000888a0100000000000000000000000000b0220749005032074900a00f000000000000e01500004c4e425343433448314c543130373634360563023615070717450000000000000000"; byte[] msgBody = BytesUtil.str2Bcd(msg); int startIndex = 0; int length = 16; // 交易流水号 byte[] orderCodeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String transactionCode = BytesUtil.bcd2Str(orderCodeByteArr); // 桩编码 startIndex += length; length = 7; byte[] pileSnByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String pileSn = BytesUtil.bcd2Str(pileSnByteArr); // 枪号 startIndex += length; length = 1; byte[] connectorCodeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String connectorCode = BytesUtil.bcd2Str(connectorCodeByteArr); // 开始时间 CP56Time2a 格式 startIndex += length; length = 7; byte[] startTimeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); // String binary = BytesUtil.binary(startTimeByteArr, 16); Date startDate = Cp56Time2aUtil.byte2Hdate(startTimeByteArr); String startTime = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, startDate); // 结束时间 CP56Time2a 格式 startIndex += length; byte[] endTimeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); Date endDate = Cp56Time2aUtil.byte2Hdate(endTimeByteArr); String endTime = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, endDate); // 尖单价 精确到小数点后五位(尖电费+尖服务费,见费率帧) startIndex += length; length = 4; byte[] sharpPriceByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String sharpPrice = YKCUtils.convertDecimalPoint(sharpPriceByteArr, 5); // 尖电量 精确到小数点后四位 startIndex += length; length = 4; byte[] sharpUsedElectricityByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String sharpUsedElectricity = YKCUtils.convertDecimalPoint(sharpUsedElectricityByteArr, 4); // 计损尖电量 startIndex += length; byte[] sharpPlanLossElectricityByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String sharpPlanLossElectricity = YKCUtils.convertDecimalPoint(sharpPlanLossElectricityByteArr, 4); // 尖金额 startIndex += length; byte[] sharpAmountByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String sharpAmount = YKCUtils.convertDecimalPoint(sharpAmountByteArr, 4); // 峰单价 精确到小数点后五位(峰电费+峰服务费) startIndex += length; byte[] peakPriceByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String peakPrice = YKCUtils.convertDecimalPoint(peakPriceByteArr, 5); // 峰电量 startIndex += length; byte[] peakUsedElectricityByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String peakUsedElectricity = YKCUtils.convertDecimalPoint(peakUsedElectricityByteArr, 4); // 计损峰电量 startIndex += length; byte[] peakPlanLossElectricityByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String peakPlanLossElectricity = YKCUtils.convertDecimalPoint(peakPlanLossElectricityByteArr, 4); // 峰金额 startIndex += length; byte[] peakAmountByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String peakAmount = YKCUtils.convertDecimalPoint(peakAmountByteArr, 4); // 平单价 精确到小数点后五位(平电费+平服务费) startIndex += length; byte[] flatPriceByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String flatPrice = YKCUtils.convertDecimalPoint(flatPriceByteArr, 5); // 平电量 startIndex += length; byte[] flatUsedElectricityByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String flatUsedElectricity = YKCUtils.convertDecimalPoint(flatUsedElectricityByteArr, 4); // 计损平电量 startIndex += length; byte[] flatPlanLossElectricityByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String flatPlanLossElectricity = YKCUtils.convertDecimalPoint(flatPlanLossElectricityByteArr, 4); // 平金额 startIndex += length; byte[] flatAmountByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String flatAmount = YKCUtils.convertDecimalPoint(flatAmountByteArr, 4); // 谷单价 精确到小数点后五位(谷电费+谷 服务费) startIndex += length; byte[] valleyPriceByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String valleyPrice = YKCUtils.convertDecimalPoint(valleyPriceByteArr, 5); // 谷电量 startIndex += length; byte[] valleyUsedElectricityByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String valleyUsedElectricity = YKCUtils.convertDecimalPoint(valleyUsedElectricityByteArr, 4); // 计损谷电量 startIndex += length; byte[] valleyPlanLossElectricityByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String valleyPlanLossElectricity = YKCUtils.convertDecimalPoint(valleyPlanLossElectricityByteArr, 4); // 谷金额 startIndex += length; byte[] valleyAmountByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String valleyAmount = YKCUtils.convertDecimalPoint(valleyAmountByteArr, 4); // 电表总起值 startIndex += length; length = 5; byte[] ammeterTotalStartByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String ammeterTotalStart = YKCUtils.convertDecimalPoint(ammeterTotalStartByteArr, 4); // 电表总止值 startIndex += length; byte[] ammeterTotalEndByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String ammeterTotalEnd = YKCUtils.convertDecimalPoint(ammeterTotalEndByteArr, 4); // 总电量 startIndex += length; length = 4; byte[] totalElectricityByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String totalElectricity = YKCUtils.convertDecimalPoint(totalElectricityByteArr, 4); // 计损总电量 startIndex += length; byte[] planLossTotalElectricityByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String planLossTotalElectricity = YKCUtils.convertDecimalPoint(planLossTotalElectricityByteArr, 4); // 消费金额 精确到小数点后四位,包含电费、 服务费 startIndex += length; byte[] consumptionAmountByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String consumptionAmount = YKCUtils.convertDecimalPoint(consumptionAmountByteArr, 4); // VIN 码 VIN 码,此处 VIN 码和充电时 VIN 码不同, 正序直接上传, 无需补 0 和反序 startIndex += length; length = 17; byte[] vinCodeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String vinCode = BytesUtil.ascii2Str(vinCodeByteArr); /** * 交易标识 * 0x01: app 启动 * 0x02:卡启动 * 0x04:离线卡启动 * 0x05: vin 码启动充电 */ startIndex += length; length = 1; byte[] transactionIdentifierByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String transactionIdentifier = BytesUtil.bcd2Str(transactionIdentifierByteArr); // 交易时间 CP56Time2a 格式 startIndex += length; length = 7; byte[] transactionTimeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); Date transactionDate = Cp56Time2aUtil.byte2Hdate(transactionTimeByteArr); String transactionTime = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, transactionDate); // 停止原因 startIndex += length; length = 1; byte[] stopReasonByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String stopReason = BytesUtil.bin2HexStr(stopReasonByteArr); String stopReasonMsg = YKCChargingStopReasonEnum.getMsgByCode(Integer.parseInt(stopReason, 16)); // 物理卡号 不足 8 位补 0 startIndex += length; length = 8; byte[] cardNumByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); // byte[] logicCardNum = BytesUtil.checkLengthAndBehindAppendZero(cardNumByteArr, 16); String logicCard = BytesUtil.binary(cardNumByteArr, 16); // log.info("桩号:{}发送交易记录物理卡号:{}", pileSn, logicCard); // // log.info("[===交易记录===]交易流水号:{}, 桩编号:{}, 枪号:{}, 开始时间:{}, 结束时间:{}, 尖单价:{}, 尖电量:{}, 计损尖电量:{}, 尖金额:{}, " + // "峰单价:{}, 峰电量:{}, 计损峰电量:{}, 峰金额:{}, 平单价:{}, 平电量:{}, 计损平电量:{}, 平金额:{}, " + // "谷单价:{}, 谷电量:{}, 计损谷电量:{}, 谷金额:{}, 电表总起值:{}, 电表总止值:{}, 总电量:{}, 计损总电量:{}, 消费金额:{}, " + // "电动汽车唯一标识:{}, 交易标识:{}, 交易日期、时间:{}, 停止原因码:{}, 停止原因描述:{}, 物理卡号:{}", // transactionCode, pileSn, connectorCode, startTime, endTime, sharpPrice, sharpUsedElectricity, sharpPlanLossElectricity, sharpAmount, // peakPrice, peakUsedElectricity, peakPlanLossElectricity, peakAmount, flatPrice, flatUsedElectricity, flatPlanLossElectricity, flatAmount, // valleyPrice, valleyUsedElectricity, valleyPlanLossElectricity, valleyAmount, ammeterTotalStart, ammeterTotalEnd, totalElectricity, planLossTotalElectricity, // consumptionAmount, vinCode, transactionIdentifier, transactionTime, stopReason, stopReasonMsg, logicCard); // 交易记录封装到对象里 TransactionRecordsData data = TransactionRecordsData.builder() // .orderCode(transactionCode) .transactionCode(transactionCode) .pileSn(pileSn) .connectorCode(connectorCode) .startTime(startTime) .endTime(endTime) .sharpPrice(sharpPrice) .sharpUsedElectricity(sharpUsedElectricity) .sharpPlanLossElectricity(sharpPlanLossElectricity) .sharpAmount(sharpAmount) .peakPrice(peakPrice) .peakUsedElectricity(peakUsedElectricity) .peakPlanLossElectricity(peakPlanLossElectricity) .peakAmount(peakAmount) .flatPrice(flatPrice) .flatUsedElectricity(flatUsedElectricity) .flatPlanLossElectricity(flatPlanLossElectricity) .flatAmount(flatAmount) .valleyPrice(valleyPrice) .valleyUsedElectricity(valleyUsedElectricity) .valleyPlanLossElectricity(valleyPlanLossElectricity) .valleyAmount(valleyAmount) .ammeterTotalStart(ammeterTotalStart) .ammeterTotalEnd(ammeterTotalEnd) .totalElectricity(totalElectricity) .planLossTotalElectricity(planLossTotalElectricity) .consumptionAmount(consumptionAmount) .vinCode(vinCode) .transactionIdentifier(transactionIdentifier) .transactionTime(transactionTime) .stopReasonMsg(stopReasonMsg) .logicCard(logicCard) .build(); // boolean flag = !StringUtils.equals("0000000000000000", "a511101970000000"); // System.out.println(flag); // 处理订单加锁 String lockKey = "settle_order_" + transactionCode; String uuid = IdUtils.fastUUID(); try { // redis锁 Boolean isLock = redisCache.lock(lockKey, uuid, 1500); if (isLock) { // transactionRecordsRequestHandler.processOrder(data); } } catch (Exception e) { System.out.println("处理订单发生异常: " + e); } finally { if (uuid.equals(redisCache.getCacheObject(lockKey).toString())) { redisCache.unLock(lockKey); } } } @Test public void testFault() { StringBuffer sb = new StringBuffer("0100"); String lowOrder = sb.substring(0, 2); String highOrder = sb.substring(2, 4); // String hardwareFault = highOrder + lowOrder; byte[] hardwareFaultByteArr = BytesUtil.str2Bcd(highOrder + lowOrder); String binStr = BytesUtil.bytes2BinStr(hardwareFaultByteArr); // log.info("binStr:{}", binStr); // 0000 0000 0000 0001 int faultCode = 0; for (int i = 0; i < binStr.length(); i++) { if (binStr.charAt(i) == '1') { faultCode = 15 - i; break; } } String faultReason = YKCPileFaultReasonEnum.getValueByCode(faultCode); System.out.println(faultReason); } @Test public void testQueryCorpMember() { List accountList = adapayMemberAccountService.selectAdapayMemberAccountList(new AdapayMemberAccount()); if (CollectionUtils.isNotEmpty(accountList)) { Long[] ids = accountList.stream().map(AdapayMemberAccount::getId).toArray(Long[]::new); adapayMemberAccountService.deleteAdapayMemberAccountByIds(ids); } // try { // Map map = adapayMemberService.selectAdapayMember("5"); // // String adapayMemberId = "ACM29562569"; // AdapayCorpMemberVO adapayCorpMemberVO = adapayMemberService.queryCorpAdapayMemberInfo(adapayMemberId); // System.out.println(adapayCorpMemberVO); // // // } catch (BaseAdaPayException e) { // throw new RuntimeException(e); // } } @Test public void testGetPileListByStationIdList() { // List stationIdList = Lists.newArrayList("2"); // Map> pileListByStationIdList = aMapService.getPileListByStationIdList(stationIdList); // System.out.println(pileListByStationIdList); GetStationInfoDTO dto = new GetStationInfoDTO(); dto.setType("page"); aMapService.getStationInfosV2(dto); } @Test public void testMultiSave() { String prefix = "test_multi_save:"; Map redisMap = Maps.newHashMap(); for (int i = 0; i < 1000; i++) { redisMap.put(prefix + i, PileInfoVO.builder().pileSn(i + "").build()); } redisCache.multiSave(redisMap, 60); } @Test public void testBillingTemplate() { pileBillingTemplateService.queryStationBillingTemplateListForUniApp("2"); } @Test public void testQueryAdapayMemberInfo() { String adapayMemberId = "AM25703321"; String settleAccountId = "0489089447022976"; try { // adapayMemberService.queryAdapayMemberInfo(adapayMemberId); adapayService.queryAdapaySettleAccount(adapayMemberId, settleAccountId, ""); } catch (BaseAdaPayException e) { throw new RuntimeException(e); } } @Test public void testSaveAdapayCallbackRecord() throws JsonProcessingException { String data = "{\n" + " \"object\": \"refund\",\n" + " \"status\": \"succeeded\",\n" + " \"prod_mode\": \"true\",\n" + " \"id\": \"0022120230531111946980509821471137853440\",\n" + " \"refund_order_no\": \"823725974557265920\",\n" + " \"payment_id\": \"002212023053110524210509814658135928832\",\n" + " \"payment_order_no\": \"C27262970851\",\n" + " \"refund_amt\": \"7.82\",\n" + " \"fee_amt\": \"0.04\",\n" + " \"channel_no\": \"2023053121R064uj\",\n" + " \"created_time\": \"1685503187000\",\n" + " \"succeed_time\": \"1685503199000\",\n" + " \"app_id\": \"app_d0c80cb1-ffc8-48cb-a030-fe9bec823aaa\",\n" + " \"reason\": \"\",\n" + " \"notify_url\": \"https://api.jsowellcloud.com/uniapp/pay/adapayRefundCallback\"\n" + "}"; JSONObject jsonObject = JSON.parseObject(data); ObjectMapper mapper = new ObjectMapper(); mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); AdapayRefundRecord adapayRefundRecord = mapper.readValue(jsonObject.toJSONString(), AdapayRefundRecord.class); adapayRefundRecord.setRefundId(jsonObject.getString("id")); // 保存到数据库 adapayRefundRecordService.insertAdapayRefundRecord(adapayRefundRecord); } @Test public void testQueryCallback() { AdapayCallbackRecord aaaa = adapayCallbackRecordService.selectByOrderCode("aaaa"); System.out.println(aaaa); } @Test public void testAdapayRefund() { // 创建汇付退款对象 在完成初始化设置情况下,调用方法,获取 Refund对象 try { String id = "002212023052710075810508353847861903360"; String refundAmount = "0.01"; Map refundParams = Maps.newHashMap(); refundParams.put("refund_amt", AdapayUtil.formatAmount(refundAmount)); refundParams.put("refund_order_no", SnowflakeIdWorker.getSnowflakeId()); refundParams.put("notify_url", "https://api.jsowellcloud.com/uniapp/pay/adapayRefundCallback"); Map response = Refund.create(id, refundParams); System.out.println(JSON.toJSONString(response)); // if (response != null && !response.isEmpty()) { // JSONObject jsonObject = JSONObject.parseObject(response.get("expend").toString()); // JSONObject pay_info = jsonObject.getJSONObject("pay_info"); // Map resultMap = JSONObject.parseObject(pay_info.toJSONString(), new TypeReference>() {}); // } } catch (Exception e) { System.out.println(e); } } @Test public void testSaveCallback() throws JsonProcessingException { String data = "{\"app_id\":\"app_d0c80cb1-ffc8-48cb-a030-fe9bec823aaa\",\"created_time\":\"20230530132956\",\"description\":\"{\\\"orderCode\\\":\\\"C29505932783\\\",\\\"type\\\":\\\"order\\\"}\",\"end_time\":\"20230530133027\",\"expend\":{\"bank_type\":\"OTHERS\",\"open_id\":\"o8jhot6PJF93EPhNISsXi28dKdS8\",\"sub_open_id\":\"o4REX5MprZfTaLnVNxfdOY-wnwGI\"},\"fee_amt\":\"0.11\",\"id\":\"002212023053013295610509491838664794112\",\"order_no\":\"C29505932783\",\"out_trans_id\":\"4200001855202305308670391485\",\"party_order_id\":\"02212305304859640306711\",\"pay_amt\":\"20.00\",\"pay_channel\":\"wx_lite\",\"real_amt\":\"20.00\",\"share_eq\":\"Y\",\"status\":\"succeeded\",\"wx_user_id\":\"\"}"; JSONObject jsonObject = JSON.parseObject(data); ObjectMapper mapper = new ObjectMapper(); mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE); AdapayCallbackRecord adapayCallbackRecord = mapper.readValue(jsonObject.toJSONString(), AdapayCallbackRecord.class); adapayCallbackRecord.setExpend(jsonObject.getString("expend")); adapayCallbackRecord.setPaymentId(jsonObject.getString("id")); adapayCallbackRecordService.saveAdapayCallbackRecord(adapayCallbackRecord); } @Test public void testAMap() throws Exception { String pileConnectorCode = "8800000000012601"; // String s = aMapService.pushChargingDeviceDynamics(pileConnectorCode); GetStationInfoDTO dto = new GetStationInfoDTO(); dto.setType("page"); aMapService.getStationInfos(dto); } @Test public void testVinCode() { String msg = "880000000000210203000000000000000000000000000000000000000000000000004C5257594743454B584D43303437313434"; // 获取消息体 byte[] msgBody = BytesUtil.str2Bcd(msg); int startIndex = 0; int length = 7; // 桩编码 byte[] pileSnByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String pileSn = BytesUtil.binary(pileSnByteArr, 16); // 保存时间 // saveLastTime(pileSn); // 枪号 startIndex += length; length = 1; byte[] connectorNumByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String connectorCode = BytesUtil.bcd2Str(connectorNumByteArr); // 启动方式 // 0x01 表示通过刷卡启动充电 // 0x02 表求通过帐号启动充电 (暂不支持) // 0x03 表示vin码启动充电 startIndex += length; byte[] startModeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String startMode = BytesUtil.bcd2Str(startModeByteArr); // 是否需要密码 0x00 不需要 0x01 需要 startIndex += length; byte[] needPasswordFlagByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String needPasswordFlag = BytesUtil.bcd2Str(needPasswordFlagByteArr); // 物理卡号 不足 8 位补 0 startIndex += length; length = 8; byte[] cardNumByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String physicsCard = BytesUtil.binary(cardNumByteArr, 16); // 输入密码 对用户输入的密码进行16 位MD5 加密,采用小写上传 startIndex += length; length = 16; byte[] inputPasswordByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); // VIN码 startIndex += length; length = 17; byte[] vinCodeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String vinCode = BytesUtil.ascii2Str(vinCodeByteArr); System.out.println("桩号:" + pileSn + "申请充电VIN码:" + vinCode); /** * 刷卡启动充电 */ String logicCard = ""; byte[] authenticationFlagByteArr = Constants.zeroByteArray; // 鉴权成功标识 byte[] accountBalanceByteArr = Constants.zeroByteArray; // 账户余额 String transactionCode = ""; try { /** * VIN码启动充电 */ if (StringUtils.equals("03", startMode)) { // 通过vin码查询数据库绑定用户信息 MemberPlateNumberRelation plateInfo = memberPlateNumberRelationService.getMemberPlateInfoByVinCode(vinCode); if (plateInfo == null) { throw new BusinessException("", "未查到绑定用户信息"); } if (!StringUtils.equals("1", plateInfo.getVinStatus())) { // 1- 正常使用 throw new BusinessException("", "vin状态不正确"); } // vin码生成订单 vin启动充电 GenerateOrderDTO dto = new GenerateOrderDTO(); dto.setMemberPlateNumberRelation(plateInfo); dto.setPileSn(pileSn); dto.setConnectorCode(connectorCode); dto.setStartMode(StartModeEnum.VIN_CODE.getValue()); Map map = orderBasicInfoService.generateOrderByCard(dto); if (map != null) { transactionCode = (String) map.get("transactionCode"); accountBalanceByteArr = YKCUtils.getPriceByte(String.valueOf(map.get("accountBalance")), 2); // 鉴权成功标识 0x00 失败 0x01 成功 authenticationFlagByteArr = Constants.oneByteArray; } else { throw new BusinessException("", "生成vin订单失败"); } } } catch (BusinessException e) { e.printStackTrace(); System.out.println("1"); // log.error("VIN码启动充电鉴权 error:{}, {}", e.getCode(), e.getMessage()); } catch (Exception e) { e.printStackTrace(); System.out.println("2"); transactionCode = "00000000000000000000000000000000"; accountBalanceByteArr = BytesUtil.checkLengthAndBehindAppendZero(accountBalanceByteArr, 8); authenticationFlagByteArr = Constants.zeroByteArray; // log.error("VIN码启动充电鉴权 error", e); } byte[] serialNumByteArr = BytesUtil.str2Bcd(transactionCode); byte[] defeatReasonByteArr = Constants.zeroByteArray; // 不足位数的值补零 // cardNumByteArr = BytesUtil.checkLengthAndBehindAppendZero(cardNumByteArr, 16); // serialNumByteArr = BytesUtil.checkLengthAndBehindAppendZero(serialNumByteArr, 32); // pileSnByteArr = BytesUtil.checkLengthAndBehindAppendZero(pileSnByteArr, 14); // accountBalanceByteArr = BytesUtil.checkLengthAndBehindAppendZero(accountBalanceByteArr, 8); // 拼装消息体 byte[] msgBodyByteArr = Bytes.concat(serialNumByteArr, pileSnByteArr, connectorNumByteArr, cardNumByteArr, accountBalanceByteArr, authenticationFlagByteArr, defeatReasonByteArr); String s = BytesUtil.bin2HexStr(msgBodyByteArr); System.out.println(s); } @Test public void testGenerateLianlianToken() throws UnsupportedEncodingException { String OperatorID = "425010765"; String OperatorSecret = "123123123123aaaa"; // 1234567890abcdef //请求dataX Map data = new HashMap<>(); data.put("OperatorID", OperatorID); data.put("OperatorSecret", OperatorSecret); String dataJson = JSONUtil.toJsonStr(data); //加密 byte[] encryptText = Cryptos.aesEncrypt(dataJson.getBytes(StandardCharsets.UTF_8), OperatorSecret.getBytes(), OperatorSecret.getBytes()); String strData = Encodes.encodeBase64(encryptText); Map request = new LinkedHashMap<>(); request.put("OperatorID", OperatorID); request.put("Data", strData); request.put("TimeStamp", System.currentTimeMillis() + ""); request.put("Seq", "0001"); //生成签名 String sig = GBSignUtils.sign(request, OperatorSecret); request.put("Sig", sig); String tokenRequest = JSONUtil.toJsonStr(request); CommonParamsDTO dto = JSONObject.parseObject(tokenRequest, CommonParamsDTO.class); lianLianService.generateToken(dto); } @Test public void testupdateElecAmount() { // orderBasicInfoService.updateElecAmount(); } @Test public void testSelectSomeStatusCardInfo() { PileAuthCard pileAuthCard = pileAuthCardService.selectCardInfoByLogicCard("1111111111111111"); System.out.println(pileAuthCard); } @Test public void testLianLian() throws UnsupportedEncodingException { // 获取令牌 // LianLianGetTokenDTO dto = new LianLianGetTokenDTO(); // dto.setOperatorId("MA1JLFUU8"); // dto.setOperatorSecret("Nh62XxlIR5OjAzFj"); // String token = lianLianService.getToken("", "MA1JLFUU8", "fGwLsxW1HdzLw7jp"); // System.out.println("token:" + token); String operatorId = "425010765"; String operatorSecret = "3DSBTWHVIC6KVCKI"; // 请求data // Map data = new HashMap<>(); // data.put("OperatorID", operatorId); // data.put("OperatorSecret", operatorSecret); // String dataJson = JSONUtil.toJsonStr(data); JSONObject json = new JSONObject(); // json.put("StationIDs", com.google.common.collect.Lists.newArrayList("1", "2")); json.put("LastQueryTime", "2023-05-29 10:00:00"); json.put("PageNo", 1); json.put("PageSize", 10); String dataJson = JSONObject.toJSONString(json); // 加密 byte[] encryptText = Cryptos.aesEncrypt(dataJson.getBytes(StandardCharsets.UTF_8), operatorSecret.getBytes(), operatorSecret.getBytes()); String strData = Encodes.encodeBase64(encryptText); String timeStamp = DateUtils.parseDateToStr(DateUtils.YYYYMMDDHHMMSS, new Date()); Map request = new LinkedHashMap<>(); request.put("OperatorID", operatorId); request.put("Data", strData); request.put("TimeStamp", timeStamp); request.put("Seq", "0001"); // 生成签名 String sig = GBSignUtils.sign(request, operatorSecret); request.put("Sig", sig); JSONObject jsonObject = new JSONObject(request); System.out.println(jsonObject); // CommonParamsDTO dto = new CommonParamsDTO(); // dto.setOperatorID(operatorId); // dto.setData(strData); // dto.setTimeStamp(timeStamp); // dto.setSeq("0001"); // dto.setSig(sig); // Map map = lianLianService.generateToken(dto); QueryStationInfoDTO dto = new QueryStationInfoDTO(); dto.setOperatorId(operatorId); Map map = lianLianService.query_stations_info(dto); // String data1 = map.get("Data"); // 解密data // String data1 = "JudlP17tnYuQc2zwOzmjJAb9hgghIymefG5v3ZzSOlPDh5+bJHIedsYzKMD56tHlmlg6Cb7vG+o6KjMSSpn1fyqBH3UVaEFF7uEc+lOuEc9c1vUzq20vBQ7N3EpDKqVBKjZbOezMsKYaCX7Br8XTsCYT8VCQui/np3cn+phi3VC+0s1coNxBX7xoEDZ7iuPjPoSWL7g3J0uOw2SoGaIdBQG3eTxaZJ5L+vBmuDF0pEXgazTMnuKml1mx1QHkig2F7h/ILT0VEKVXWMmmogYgiBk5ItO0DyzRl+ASb184gOhYGo82GJmWRiXrAXmceCiSNvTGg6aL26imIGKkJNfOx9/9mTqjGvy6kzxvWJ29PBU="; // byte[] plainText = Cryptos.aesDecrypt(Encodes.decodeBase64(data1), // operatorSecret.getBytes(), operatorSecret.getBytes()); // String dataStr = new String(plainText, "UTF-8"); // Map resultMap = (Map) JSON.parse(dataStr); // // String token = resultMap.get("AccessToken"); // // System.out.println("解密后token:" + token); // LianLianPushStationInfoDTO dto1 = LianLianPushStationInfoDTO.builder() // .OperatorID("MA1JLFUU8") // .DataSecret("HVicnbRZbhPdIdpF") // .DataSecretIV("JNvcjSOn1vhrE11M") // .SigSecret("53TtFpc4gdVZbF3x") // // .token(token) // .stationId(2L) // // .build(); // lianLianService.pushStationInfo(dto1); // 推送订单状态 // lianLianService.pushConnectorStatus("8800000000000101", "1"); // 推送订单信息 // lianLianService.pushOrderInfo("C27680791529"); // 推送启动充电结果 // lianLianService.pushStartChargeResult("C27680791529"); // 推送充电状态 // lianLianService.pushChargeStatus("C27680791529"); // 推送停止充电结果 // lianLianService.pushStopChargeResult("C27680791529"); // 推送充电订单信息 // lianLianService.pushChargeOrderInfo("C27680791529"); // 推送订单结算信息 // lianLianService.pushOrderSettlementInfo("C27680791529"); // 查询订单结算信息 // lianLianService.queryOrderSettlementInfo("C27680791529"); // 推送订单对账结果信息 // lianLianService.pushOrderReconciliationInfo("C27680791529"); // 测试生成、解密令牌 // long ttlMillis = 60 * 60 * 24 * 1000; // String token = JWTUtils.createToken(operatorId, operatorSecret, ttlMillis); // System.out.println(JWTUtils.checkThirdPartyToken(token)); JSONObject jsonObject1 = new JSONObject(map); jsonObject1.put("OperatorID", "425010765"); jsonObject1.put("Data", "Ntu99RpveEOm2VUNq6RpD7OuOPXRbNxMOPmaBl67nkLk0nD/VmhipdSpq/Qfswhe1o55YMT+3Z7e6xe3fiJA3cZcvetxOEUF6sjvKLRq2rU="); jsonObject1.put("TimeStamp", "20230530090132"); jsonObject1.put("Seq", "0001"); jsonObject1.put("Sig", "1568D2D35B245A0205B33D0EF92E7981"); String jsonString = JSONObject.toJSONString(jsonObject1); String result = HttpUtils.sendPostContentType("http://localhost:8080/LianLian/v1/query_stations_info", jsonString, "application/json"); JSONObject object = JSONObject.parseObject(result); String data1 = (String) object.get("data"); // 解密data byte[] plainText = Cryptos.aesDecrypt(Encodes.decodeBase64(data1), operatorSecret.getBytes(), operatorSecret.getBytes()); String dataStr = new String(plainText, "UTF-8"); Map resultMap = (Map) JSON.parse(dataStr); } @Test public void testRefundForBalance() { BigDecimal refundAmount = new BigDecimal("2"); // 退款金额 元转分 123 int refundTotalCents = refundAmount.multiply(new BigDecimal(100)).intValue(); // 查询用户充值余额订单 过滤掉已经退款的充值订单 refundableOrder List recordList = Lists.newArrayList(); // recordList.add(RefundableWxPayOrderData.builder().outTradeNo("1").transactionId("1").payerAmount(new BigDecimal("1000")).refundableAmount(new BigDecimal("0")).build()); // recordList.add(RefundableWxPayOrderData.builder().outTradeNo("2").transactionId("2").payerAmount(new BigDecimal("1000")).refundableAmount(new BigDecimal("0")).build()); recordList.add(RefundableWxPayOrderData.builder().outTradeNo("3").transactionId("3").payerAmount(new BigDecimal("500")).refundableAmount(new BigDecimal("300")).build()); // 也许需要多笔支付订单才够退款 List requestList = com.google.common.collect.Lists.newArrayList(); WechatPayRefundRequest request; for (RefundableWxPayOrderData record : recordList) { int refundableTotal = record.getRefundableAmount().intValue(); // 该笔支付订单的可退金额,单位分 int payerTotal = record.getPayerAmount().intValue(); // 该笔支付订单的支付金额,单位分 // 用户申请退款金额-可退金额 refundTotalCents = refundTotalCents - refundableTotal; // 123 - 100 request = new WechatPayRefundRequest(); request.setTransaction_id(record.getTransactionId()); // 微信支付单号 request.setOut_trade_no(record.getOutTradeNo()); // 商户订单号 request.setOut_refund_no(SnowflakeIdWorker.getSnowflakeId()); // 商户退款单号 request.setNotify_url(WeChatPayParameter.refundNotifyUrl); // 回调接口 request.setReason("用户余额退款"); request.setFunds_account("AVAILABLE"); if (refundTotalCents > 0) { // 如果大于0说明,这笔单退完也不够 WechatPayRefundRequest.Amount amount = new WechatPayRefundRequest.Amount(); amount.setRefund(refundableTotal); // 退款金额 amount.setTotal(payerTotal); // 原订单金额 request.setAmount(amount); requestList.add(request); } else { // 如果小于0,这笔单退一部分 // 生成退款单号 WechatPayRefundRequest.Amount amount = new WechatPayRefundRequest.Amount(); // 部分退 int i = refundableTotal + refundTotalCents; amount.setRefund(i); // 退款金额 amount.setTotal(payerTotal); // 原订单金额 request.setAmount(amount); requestList.add(request); break; } } System.out.println(requestList); } @Test public void testCloseStartFailedOrder() { String startTime = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, DateUtils.addDays(new Date(), -2)); String endTime = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, new Date()); orderBasicInfoService.closeStartFailedOrder(startTime, endTime); } @Test public void testRedisSaveRealTimeData() { String pileSn = "88000000000001"; String connectorCode = "01"; String orderCode = "88000000000001012211161342359448"; String pileConnectorCode = pileSn + connectorCode; String redisKey = CacheConstants.PILE_REAL_TIME_MONITOR_DATA + pileConnectorCode + "_" + orderCode; // for (int i = 0; i < 10; i++) { // try { // Thread.sleep(10000); // } catch (InterruptedException e) { // e.printStackTrace(); // } // Date now = new Date(); // redisCache.hset(redisKey, DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:00", now), i + ":" + DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", now)); // } orderBasicInfoService.getChargingRealTimeData(orderCode); } @Test public void testuniformMessageSend() { AppletTemplateMessageSendDTO appletTemplateMessageSendDTO = new AppletTemplateMessageSendDTO(); // String openId = wxAppletRemoteService.getOpenIdByCode("0537u2100jTXsP1Y0Y300j426t47u210"); // System.out.println("openId:" + openId); appletTemplateMessageSendDTO.setTouser("o4REX5MprZfTaLnVNxfdOY-wnwGI"); // openid String templateId = "UyBPbADlZfsCj89rh_xvfZGlxTW5J5KURpZtt9CNFrY"; appletTemplateMessageSendDTO.setTemplate_id(templateId); // appletTemplateMessageSendDTO.setPage("跳转的页面"); Map map = new HashMap<>(); map.put("amount17", ImmutableMap.of("value", "¥100")); // 结束时间 map.put("time3", ImmutableMap.of("value", "2022-12-30")); // 结束时间 map.put("thing7", ImmutableMap.of("value", "thing7")); // 结束原因 // map.put("thing5", ImmutableMap.of("value", "thing5")); // 结束原因 // map.put("time2", ImmutableMap.of("value", "time2")); // 结束原因 appletTemplateMessageSendDTO.setData(map); wxAppletRemoteService.uniformMessageSend(appletTemplateMessageSendDTO); } @Test public void testWeChatRefund() { ApplyRefundDTO dto = new ApplyRefundDTO(); dto.setRefundType("2"); dto.setMemberId("82100864"); dto.setRefundAmount(new BigDecimal("1.23")); orderBasicInfoService.weChatRefund(dto); } @Test public void testSelectBalanceRechargeRecord() { List list = wxpayCallbackRecordService.queryBalanceRechargeRecordOfTheLatestYear("82100864"); System.out.println(list); } @Test public void testSelectOrderBasicInfoList() { QueryOrderDTO orderBasicInfo = new QueryOrderDTO(); orderBasicInfo.setPileSn("88000000000001"); orderBasicInfo.setOrderStatus(OrderStatusEnum.IN_THE_CHARGING.getValue()); List orderListVOS = orderBasicInfoService.selectOrderBasicInfoList(orderBasicInfo); System.out.println(orderListVOS); for (OrderListVO orderListVO : orderListVOS) { if (StringUtils.equals(orderListVO.getOrderStatus(), OrderStatusEnum.IN_THE_CHARGING.getValue())) { // 修改数据库订单状态 OrderBasicInfo info = OrderBasicInfo.builder() .id(Long.parseLong(orderListVO.getId())) .orderStatus(OrderStatusEnum.ABNORMAL.getValue()) .build(); orderBasicInfoService.updateOrderBasicInfo(info); } } } @Test public void testWechatRefund() throws JsonProcessingException { WechatPayRefundRequest request = new WechatPayRefundRequest(); request.setTransaction_id("4200001656202212302746036536"); // 微信支付单号 request.setOut_trade_no("768677222373363712"); // 商户订单号 // 生成退款单号 request.setOut_refund_no(SnowflakeIdWorker.getSnowflakeId()); // 商户退款单号 request.setNotify_url(WeChatPayParameter.refundNotifyUrl); // 回调接口 WechatPayRefundRequest.Amount amount = new WechatPayRefundRequest.Amount(); amount.setRefund(10 * 100); // 退款金额 amount.setTotal(10 * 100); // 原订单金额 request.setAmount(amount); request.setReason("结算退款"); request.setFunds_account("AVAILABLE"); wechatPayService.ApplyForWechatPayRefundV3(request); // 退款方法 } @Test public void testUpdatePileSimInfo() { String pileSn = "88000000000001"; String iccid = "89860402102091089943"; pileBasicInfoService.updatePileSimInfo(pileSn, iccid); } @Test public void testPay() { String code = "081zIoGa11GamE0iVVIa1aaJ4G0zIoGE"; String openId = memberService.getOpenIdByCode(code); Map pay = null; try { WeixinPayDTO dto = new WeixinPayDTO(); dto.setOpenId(openId); dto.setAmount("0.01"); pay = orderService.weixinPayV3(dto); } catch (Exception e) { e.printStackTrace(); } System.out.println(JSONObject.toJSONString(pay)); } @Test public void testMemberRegisterAndLogin() throws BaseAdaPayException { } @Test public void testMemberBasicInfoMapper() { // String memberId = "21772870"; // BigDecimal principalBalance = new BigDecimal("-10"); // BigDecimal giftBalance = new BigDecimal("-110"); // Integer version = 2; // int i = memberBasicInfoMapper.updateMemberBalance(memberId, principalBalance, giftBalance, version); // if (i == 1) { // System.out.println("更新余额成功"); // } else { // System.out.println("更新余额失败"); // } Map refundParams = new HashMap<>(2); refundParams.put("payment_id", "002212023071011321210524320114191904768"); // refundParams.put("refund_id", refund_id); // refundParams.put("refund_order_no", refund_order_no); try { Map refund = Refund.query(refundParams); System.out.println(refund); } catch (BaseAdaPayException e) { throw new RuntimeException(e); } } @Test public void testGenerateBillingTemplateMsgBody() { String pileSn = "88000000000001"; // 根据桩号查询计费模板 BillingTemplateVO billingTemplateVO = pileBillingTemplateService.selectBillingTemplateDetailByPileSn(pileSn); byte[] messageBody = pileBillingTemplateService.generateBillingTemplateMsgBody(pileSn, billingTemplateVO); System.out.println(BytesUtil.binary(messageBody, 16)); } @Test public void testAnalysisPileParameter() { BasicPileDTO dto = new BasicPileDTO(); // 3个都不传的情况 try { System.out.println("3个都不传的情况"); dto.setPileSn(""); dto.setConnectorCode(""); dto.setPileConnectorCode(""); // orderService.analysisPileParameter(dto); System.out.println("数据正确"); } catch (BusinessException e) { System.out.println(e.getMessage()); } System.out.println(); // 只传sn的情况 try { System.out.println("只传sn的情况"); dto.setConnectorCode(""); dto.setPileConnectorCode(""); dto.setPileSn("88000000000001"); // orderService.analysisPileParameter(dto); System.out.println("数据正确"); } catch (BusinessException e) { System.out.println(e.getMessage()); } System.out.println(); // try { System.out.println("只穿枪口号的情况"); dto.setConnectorCode("01"); dto.setPileConnectorCode(""); dto.setPileSn(""); // orderService.analysisPileParameter(dto); System.out.println("数据正确"); } catch (BusinessException e) { System.out.println(e.getMessage()); } System.out.println(); // 只传充电桩枪口编号的情况 try { System.out.println("只传充电桩枪口编号的情况"); dto.setPileConnectorCode("8800000000000101"); dto.setConnectorCode(""); dto.setPileSn(""); // orderService.analysisPileParameter(dto); System.out.println("数据正确"); } catch (BusinessException e) { System.out.println(e.getMessage()); } try { System.out.println(); System.out.println("传充电桩枪sn+枪口号的情况"); dto.setPileConnectorCode(""); dto.setConnectorCode("01"); dto.setPileSn("88000000000001"); // orderService.analysisPileParameter(dto); System.out.println("数据正确"); } catch (BusinessException e) { System.out.println(e.getMessage()); } } @Test public void testImportBillingTemplate() { ImportBillingTemplateDTO dto = new ImportBillingTemplateDTO(); dto.setBillingTemplateId("1"); // 查询公共计费模板是否存在 PileBillingTemplate pileBillingTemplate = pileBillingTemplateMapper.selectPileBillingTemplateById(Long.valueOf(dto.getBillingTemplateId())); if (pileBillingTemplate == null) { } List billingDetailList = pileBillingTemplate.getPileBillingDetailList(); } @Test public void testProcess() { // 62 68 String msgString = "680da300000388000000000001010020d06840a40000130000000000000000000000000000000088000000000001010202000000000000000000000000000000000000000000000000000000000000000000001516"; byte[] msg = BytesUtil.str2Bcd(msgString); boolean b = YKCUtils.checkMsg(msg); // ykcBusinessService.process(msg, null); } @Test public void testHeartbeat() { // heartbeatRequestHandler.updateStatus("88000000000001", "01", "0"); // heartbeatRequestHandler.updateStatus("88000000000001", "02", "0"); } @Test public void testPush() { byte[] msg = new byte[]{}; String pileSn = "88000000000001"; // ykcPushBusinessService.push(msg, pileSn, YKCFrameTypeCode.READ_REAL_TIME_MONITOR_DATA_CODE); } @Test public void TestMapUtils() { String address = "淀山湖镇黄浦江南路278号"; String areaCode = "320000,320500,320583"; Map longitudeAndLatitude = AddressUtils.getLongitudeAndLatitude(areaCode, address); System.out.println(longitudeAndLatitude); } @Test public void testCreatePile() { BatchCreatePileDTO dto = BatchCreatePileDTO.builder() .merchantId("1") .stationId("1") .softwareProtocol("1") // .connectorNum(1) // .num(10) // .productionDate(new Date()) .build(); pileService.batchCreatePile(dto); } @Test public void testGetIncre() { StopWatch stopWatch = new StopWatch(); // 生成100个 stopWatch.start("生成100个sn号"); List list2 = snUtils.generateSN(1); stopWatch.stop(); System.out.println(list2); System.out.println(stopWatch.getLastTaskTimeMillis()); } @Test public void testDict() { // String dictValue = DictUtils.getDictValue("query_pile_info", "url"); // String station_type = DictUtils.getDictLabel("station_type", "1"); // System.out.println(station_type); // System.out.println("123"); List adapay_station = DictUtils.getDictCache("adapay_station"); List stationIdList = com.google.common.collect.Lists.newArrayList(); if (CollectionUtils.isNotEmpty(adapay_station)) { for (SysDictData sysDictData : adapay_station) { stationIdList.add(sysDictData.getDictValue()); } } System.out.println(stationIdList); } @Test public void testSelectByMerchantId() { List list = pileStationInfoService.selectStationListByMerchantId(Long.valueOf(Constants.ONE)); System.out.println(list); } @Test public void testStr2Bcd() { String logicCardNum = "00000000"; byte[] logicCardNumByteArr = BytesUtil.str2Bcd(logicCardNum); System.out.println(Arrays.toString(logicCardNumByteArr)); } @Test public void testBigDecimalMultiply() { BigDecimal a = new BigDecimal("216.5"); BigDecimal b = new BigDecimal("11.5"); BigDecimal result = a.multiply(b).setScale(2, BigDecimal.ROUND_HALF_UP); System.out.println(result); } @Test public void testRemoteUpdate() { ArrayList list = new ArrayList<>(); list.add("88000000000001"); // pileRemoteService.updateFirmware(list); } @Test public void testGetUserPhoneNum() { String code = "0e5394cfa4eb41c6181ed257f2368a86dfe4ebdac0a4fac85df63657637e6cc3"; wxAppletRemoteService.getMobileNumberByCode(code); } @Test public void testDistance() { QueryStationDTO dto = new QueryStationDTO(); dto.setStationLat("123.2222"); dto.setStationLng("55.6232"); // pileStationInfoService.uniAppQueryStationInfos(dto); } /** * 生成英文字母随机数 RandomStringUtils.randomAlphabetic(10); * 生成数字随机数 RandomStringUtils.randomNumeric(10); * 字母+数字结合 RandomStringUtils.randomAlphanumeric(10); */ @Test public void Test() throws ParseException { /*String s = RandomStringUtils.randomAlphanumeric(32); System.out.println(s); // PuLe4Tyyg1jSFNPhF5d2Ts9ejRn6E8KQ String str = "JS160829"; System.out.println(Md5Utils.hash(str).toUpperCase(Locale.ROOT)); */ String s = RandomStringUtils.randomAlphanumeric(43).toUpperCase(Locale.ROOT); System.out.println(s); Date startTimeDate = sdf.parse("2022-11-26 10:44:11"); Date endTimeDate = sdf.parse("2022-11-27 12:45:11"); System.out.println(DateUtils.getDatePoor(endTimeDate, startTimeDate)); // 1天2小时1分钟 /*String stra = "sp_mchid=1632405339&sub_mchid=1632405339&out_trade_no=1217752501201407033233368318&sp_appid=wxbb3e0d474569481d&sub_appid=wxbb3e0d474569481d" + "bbac689f4654b209de4d6944808ec80b"; System.out.println(Md5Utils.hash(stra).toUpperCase(Locale.ROOT));*/ } @Test public void testSimCard() throws ParseException { ArrayList list = Lists.newArrayList(); Collections.addAll(list, "898607B9102090253556", "898607B9102090253560"); // String s = list.toString().replaceAll("(?:\\[|null|\\]| +)", ""); // System.out.println(s); // List simCardVOList = simCardService.selectSimCardInfoByIccId(list); // System.out.println(simCardVOList.toString()); // simCardService.XunZhongSimRenewal(list, 12); // System.out.println(s); // SimCardVO simCardVO = simCardService.searchByLoop("898607B9102090253556"); // // System.out.println(simCardVO.toString()); simCardService.WuLianSimRenew(list, 1); } @Test public void testRefund() { OrderBasicInfo orderInfo = orderBasicInfoService.getOrderInfoByOrderCode("88000000000001012212171045412218"); orderInfo.setReason("充电异常中止,急停开入"); TransactionRecordsData data = TransactionRecordsData.builder() .transactionCode("88000000000001012212171045412218") .consumptionAmount(String.valueOf(0.00)) .stopReasonMsg(orderInfo.getReason()) .totalElectricity("0") .sharpUsedElectricity("0") .peakUsedElectricity("0") .flatUsedElectricity("0") .valleyUsedElectricity("0") .build(); // orderBasicInfoService.settleOrder(data, orderInfo); } @Test public void testLoginHandler() { String msg = "8800000000001001010f63362d333000000000898604b319227036282200"; byte[] msgBody = BytesUtil.str2Bcd(msg); int startIndex = 0; int length = 7; // 桩编码 byte[] pileSnByte = BytesUtil.copyBytes(msgBody, startIndex, length); String pileSn = BytesUtil.binary(pileSnByte, 16); // log.info("桩号:{}", pileSn); // 桩类型 0 表示直流桩, 1 表示交流桩 startIndex += length; length = 1; byte[] pileTypeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String pileType = BytesUtil.bcd2Str(pileTypeByteArr); // 充电枪数量 startIndex += length; byte[] connectorNumByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String connectorNum = BytesUtil.bcd2Str(connectorNumByteArr); // 通信协议版本 版本号乘 10,v1.0 表示 0x0A startIndex += length; byte[] communicationVersionByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); // int i = Integer.parseInt(BytesUtil.bcd2Str(communicationVersionByteArr)); // 0F --> 15 BigDecimal bigDecimal = new BigDecimal(BytesUtil.bcd2Str(communicationVersionByteArr)); BigDecimal communicationVersionTemp = bigDecimal.divide(new BigDecimal(10)); String communicationVersion = "v" + communicationVersionTemp; // 程序版本 startIndex += length; length = 8; byte[] programVersionByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String programVersion = BytesUtil.bcd2Str(programVersionByteArr); // 网络连接类型 0x00 SIM 卡 0x01 LAN 0x02 WAN 0x03 其他 startIndex += length; length = 1; byte[] internetConnectionTypeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String internetConnection = BytesUtil.bcd2Str(internetConnectionTypeByteArr); // sim卡 startIndex += length; length = 10; byte[] simCardNumByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String iccid = BytesUtil.bin2HexStr(simCardNumByteArr); // 运营商 0x00 移动 0x02 电信 0x03 联通 0x04 其他 startIndex += length; length = 1; byte[] businessTypeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); String business = BytesUtil.bcd2Str(businessTypeByteArr); LoginRequestData loginRequestData = LoginRequestData.builder() .pileSn(pileSn) .pileType(pileType) .connectorNum(connectorNum) .communicationVersion(communicationVersion) .programVersion(programVersion) .internetConnection(internetConnection) .iccid(iccid) .business(business) .build(); // 结果(默认 0x01:登录失败) byte[] flag = Constants.oneByteArray; // 通过桩编码SN查询数据库,如果有数据,则登录成功,否则登录失败 QueryPileDTO dto = new QueryPileDTO(); dto.setPileSn(pileSn); List list = pileBasicInfoService.queryPileInfos(dto); if (CollectionUtils.isNotEmpty(list)) { flag = Constants.zeroByteArray; // 登录成功,保存桩号和channel的关系 // PileChannelEntity.put(pileSn, channel); // 更改桩和该桩下的枪口状态分别为 在线、空闲 // pileBasicInfoService.updatePileStatus(pileSn, PileStatusEnum.ON_LINE.getValue()); // pileConnectorInfoService.updateConnectorStatusByPileSn(pileSn, PileConnectorDataBaseStatusEnum.FREE.getValue()); // 对时 ProofreadTimeCommand command = ProofreadTimeCommand.builder().pileSn(pileSn).build(); ykcPushCommandService.pushProofreadTimeCommand(command); // 公共方法修改状态 pileBasicInfoService.updateStatus(BytesUtil.bcd2Str(new byte[]{0x01}), pileSn, null, null, null); // 下发二维码 IssueQRCodeCommand issueQRCodeCommand = IssueQRCodeCommand.builder().pileSn(pileSn).build(); ykcPushCommandService.pushIssueQRCodeCommand(issueQRCodeCommand); } // 充电桩使用的sim卡,把信息存库 if (StringUtils.equals("00", internetConnection)) { try { pileBasicInfoService.updatePileSimInfo(pileSn, iccid); } catch (Exception e) { // log.error("更新充电桩sim卡信息失败", e); System.out.println(e.getMessage()); } } // 保存报文 String jsonMsg = JSONObject.toJSONString(loginRequestData); // pileMsgRecordService.save(pileSn, pileSn, type, jsonMsg, ykcDataProtocol.getHEXString()); // // 消息体 // byte[] messageBody = Bytes.concat(pileSnByte, flag); // return getResult(ykcDataProtocol, messageBody); } @Test public void testGetMemberToken() { String memberId = JWTUtils.getMemberId("eyJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2NzY1MTY5MzgsImV4cCI6MTY3OTEwODkzOH0.4MwhZIOpnCfQloR7zEm2hwPOh2yyI2qxbBbTcv_SnZ4"); System.out.println(memberId); } }