优化界面,增加自动插入,原始图像遮挡旋钮,post请求当天日期。
This commit is contained in:
parent
812cfd725f
commit
3a9d6c5e7e
@ -20,6 +20,49 @@ namespace HisenceYoloDetection
|
|||||||
{
|
{
|
||||||
public static class CheckDiffSciHelper
|
public static class CheckDiffSciHelper
|
||||||
{
|
{
|
||||||
|
public static Mat ProcessImage(Mat image, Rect fillRect)
|
||||||
|
{
|
||||||
|
// 获取图像尺寸
|
||||||
|
int width = image.Width;
|
||||||
|
int height = image.Height;
|
||||||
|
|
||||||
|
// 定义左下角 30x30 矩形框
|
||||||
|
int rectSize = 30;
|
||||||
|
int rectX = 0;
|
||||||
|
int rectY = height - rectSize; // 确保是左下角
|
||||||
|
|
||||||
|
// 防止越界
|
||||||
|
if (rectY < 0 || rectX < 0 || rectSize > width || rectSize > height)
|
||||||
|
{
|
||||||
|
Console.WriteLine("图像尺寸不足以获取指定区域");
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
Rect roi = new Rect(rectX, rectY, rectSize, rectSize);
|
||||||
|
Mat roiMat = new Mat(image, roi);
|
||||||
|
|
||||||
|
// 计算平均颜色值
|
||||||
|
Scalar meanColor = Cv2.Mean(roiMat);
|
||||||
|
Vec3b fillColor = new Vec3b((byte)meanColor.Val0, (byte)meanColor.Val1, (byte)meanColor.Val2);
|
||||||
|
|
||||||
|
// 防止越界
|
||||||
|
if (fillRect.X < 0 || fillRect.Y < 0 || fillRect.X + fillRect.Width > width || fillRect.Y + fillRect.Height > height)
|
||||||
|
{
|
||||||
|
Console.WriteLine("填充区域超出图像范围");
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 填充指定区域
|
||||||
|
for (int y = fillRect.Y; y < fillRect.Y + fillRect.Height; y++)
|
||||||
|
{
|
||||||
|
for (int x = fillRect.X; x < fillRect.X + fillRect.Width; x++)
|
||||||
|
{
|
||||||
|
image.Set<Vec3b>(y, x, fillColor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return image;
|
||||||
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -37,6 +80,7 @@ namespace HisenceYoloDetection
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// Cv2.Resize(img1, img1, new Size(550, 270));
|
// Cv2.Resize(img1, img1, new Size(550, 270));
|
||||||
|
img1 = ProcessImage(img1, sqlrect);
|
||||||
Mat gimg1 = new Mat();
|
Mat gimg1 = new Mat();
|
||||||
Cv2.CvtColor(img1, gimg1, ColorConversionCodes.BGR2GRAY);
|
Cv2.CvtColor(img1, gimg1, ColorConversionCodes.BGR2GRAY);
|
||||||
Mat thr1 = new Mat();
|
Mat thr1 = new Mat();
|
||||||
@ -61,7 +105,7 @@ namespace HisenceYoloDetection
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// Cv2.Resize(img2, img2, new Size(550, 270));
|
// Cv2.Resize(img2, img2, new Size(550, 270));
|
||||||
|
img2 = ProcessImage(img2, detrect);
|
||||||
Rect bottomleftRect= new Rect(0,img1.Height-30,30,30);
|
Rect bottomleftRect= new Rect(0,img1.Height-30,30,30);
|
||||||
Scalar avgColor1 = Cv2.Mean(new Mat(img1,bottomleftRect));
|
Scalar avgColor1 = Cv2.Mean(new Mat(img1,bottomleftRect));
|
||||||
Mat gimg2 = new Mat();
|
Mat gimg2 = new Mat();
|
||||||
|
617
HisenceYoloDetection/MainForm.Designer.cs
generated
617
HisenceYoloDetection/MainForm.Designer.cs
generated
File diff suppressed because it is too large
Load Diff
@ -1211,200 +1211,8 @@ namespace HisenceYoloDetection
|
|||||||
// }
|
// }
|
||||||
//});
|
//});
|
||||||
}
|
}
|
||||||
/// <summary>
|
|
||||||
/// 监听洗衣机545是否触发后面对射传感器 相机
|
|
||||||
/// </summary>
|
|
||||||
public void TrigerCamera1()
|
|
||||||
{
|
|
||||||
//开启一个线程监听PLC得值
|
|
||||||
Task.Run(() =>
|
|
||||||
{
|
|
||||||
int iNum1 = 0;
|
|
||||||
int iNum0 = 0;
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
// myResetEvent.Set();
|
|
||||||
PLC545 = true;
|
|
||||||
int m_iCureent545 = melsecPLCTCPDriver.ReadInt("545");
|
|
||||||
////int m_iCureent545 = CMPLC.SLMPReadD(545);
|
|
||||||
if (m_iCureent545 != 1)
|
|
||||||
{
|
|
||||||
iNum0++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
iNum0 = 0;
|
|
||||||
}
|
|
||||||
if (iNum0 >= 5)
|
|
||||||
{
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
m_iCureent545 = melsecPLCTCPDriver.ReadInt("545");
|
|
||||||
if (m_iCureent545 == 1)
|
|
||||||
{
|
|
||||||
iNum1++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
iNum1 = 0;
|
|
||||||
}
|
|
||||||
if (iNum1 >= 5)
|
|
||||||
{
|
|
||||||
//Console.WriteLine("第二次采集图像");
|
|
||||||
//Cam1.Snapshot();
|
|
||||||
//Cam2.Snapshot();
|
|
||||||
//IfCam1Triger = false;
|
|
||||||
//IfCam2Triger = false;
|
|
||||||
|
|
||||||
iNum0 = 0;
|
|
||||||
iNum1 = 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Thread.Sleep(100);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// 获取基恩士读码器的型号
|
|
||||||
/// </summary>
|
|
||||||
public void OnGetBar()
|
|
||||||
{
|
|
||||||
Task.Run(() =>
|
|
||||||
{
|
|
||||||
int iNum0 = 0;
|
|
||||||
int iNum1 = 0;
|
|
||||||
|
|
||||||
// const char pCR[4] = { 0x4C, 0x4F, 0x4E, 0x0D };开启
|
|
||||||
//const char pOFF[5] = { 0x4C, 0x4F, 0x46, 0x46, 0x0D };关闭
|
|
||||||
Thread.CurrentThread.Priority = ThreadPriority.Highest;
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
//545触发时为0
|
|
||||||
// myResetEvent.Set();
|
|
||||||
PLC545 = true;
|
|
||||||
int m_iCureent545 = melsecPLCTCPDriver.ReadInt("545");
|
|
||||||
|
|
||||||
if (m_iCureent545 != 1)
|
|
||||||
{
|
|
||||||
iNum0++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
iNum0 = 0;
|
|
||||||
}
|
|
||||||
if (iNum0 >= 1)
|
|
||||||
{
|
|
||||||
//接受条码指令
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
bTriger = false;
|
|
||||||
//读到544一直是1持续两s 拍照
|
|
||||||
m_iCureent545 = melsecPLCTCPDriver.ReadInt("545");
|
|
||||||
if (m_iCureent545 == 1)
|
|
||||||
{
|
|
||||||
iNum1++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
iNum1 = 0;
|
|
||||||
}
|
|
||||||
if (iNum1 >= 2)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (bBar)
|
|
||||||
{
|
|
||||||
_runHandleBefore.WaitOne();
|
|
||||||
//这里改成和海信的对接需求
|
|
||||||
#if false
|
|
||||||
{
|
|
||||||
// Oldm_sKEYENCEBar= m_sKEYENCEBar;
|
|
||||||
//获取请求
|
|
||||||
//报警地址
|
|
||||||
string url = "https://inner-apisix.hisense.com/mes-plus/api/Fcc/GetWorkOrderBOMlnfo?user_key=k7gzo1fsfcami7n5hmpxtybyluf9xeue";
|
|
||||||
// string url = "https://echo.hoppscotch.io";
|
|
||||||
string PostUrl = url;
|
|
||||||
DateTime dt = DateTime.Now;
|
|
||||||
|
|
||||||
string starttime = string.Format("{0:yyyy_mm_dd}", dt); //17 17 2017 2017
|
|
||||||
|
|
||||||
string startTime = starttime;
|
|
||||||
string EndTime = starttime;
|
|
||||||
string lineBody = "ZZ-P";//线体
|
|
||||||
string MaterialDescripts = "制冷器";
|
|
||||||
string MaterialDescripts2 = "工艺管";
|
|
||||||
JObject patientinfo = new JObject();
|
|
||||||
JArray ids = new JArray();
|
|
||||||
ids.Add(MaterialDescripts);
|
|
||||||
ids.Add(MaterialDescripts2);
|
|
||||||
patientinfo["startTime"] = startTime;
|
|
||||||
patientinfo["EndTime"] = EndTime;
|
|
||||||
patientinfo["lineBody"] = lineBody;
|
|
||||||
patientinfo["MaterialDescripts"] = ids;
|
|
||||||
string sendData = JsonConvert.SerializeObject(patientinfo);
|
|
||||||
//eg: 发送Url需要的格式:sendData={"ids":[123],"Name":小黑}
|
|
||||||
string resultData = Post(sendData, PostUrl);
|
|
||||||
resultData = "{\r\n\t\"Result\": [],\r\n\t\"success\": false,\r\n\t\"ReturnMsg\": \"参数-starttime 不正确!\"\r\n}";
|
|
||||||
JObject jo = (JObject)JsonConvert.DeserializeObject(resultData);
|
|
||||||
string sucessIf = jo["success"].ToString();
|
|
||||||
if (sucessIf.ToLower() == "true")
|
|
||||||
{
|
|
||||||
string ProductType = jo["ProductType"].ToString();
|
|
||||||
string FinalDefIo = jo["FinalDefIo"].ToString();
|
|
||||||
//WEBAPI得到条码
|
|
||||||
xKNow = GetModeFromBar(ProductType);//从数据库中查询到这个条码的四轴的值
|
|
||||||
//解析字段
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
// if(Oldm_sKEYENCEBar!= m_sKEYENCEBar)
|
|
||||||
|
|
||||||
xKNow = GetModeFromBar("VWJ070541V0WW824F120223");//从数据库中查询到这个条码的四轴的值
|
|
||||||
|
|
||||||
|
|
||||||
if (xKNow == null)
|
|
||||||
{
|
|
||||||
myLog("数据库没有条码匹配" + m_sKEYENCEBar, DateTime.Now);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
//if(xKNow.OcrBar!= Old_xKNow.OcrBar)
|
|
||||||
//{
|
|
||||||
|
|
||||||
//}
|
|
||||||
if (Regex.IsMatch(xKNow.MoveX.ToString(), @"^[0-9]+$") && Regex.IsMatch(xKNow.MoveY.ToString(), @"^[0-9]+$") && Regex.IsMatch(xKNow.MoveZ.ToString(), @"^[0-9]+$"))
|
|
||||||
{
|
|
||||||
// Old_xKNow = xKNow;
|
|
||||||
myLog("型号匹配成功" + xKNow.OcrBar, DateTime.Now);
|
|
||||||
|
|
||||||
//MoveToP(xKNow.MoveX, xKNow.MoveY, xKNow.MoveZ);// PLC控制电机移动四轴
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Thread.Sleep(2);
|
|
||||||
bBar = false;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
Thread.Sleep(10);
|
|
||||||
|
|
||||||
|
|
||||||
});
|
|
||||||
}
|
|
||||||
#region 显示结果
|
#region 显示结果
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 显示结果
|
/// 显示结果
|
||||||
@ -1494,19 +1302,21 @@ namespace HisenceYoloDetection
|
|||||||
//这里改成和海信的对接需求
|
//这里改成和海信的对接需求
|
||||||
string OcrBar = "";
|
string OcrBar = "";
|
||||||
string FinalDefIDToFind = m_sKEYENCEBar;// 目标 FinalDefID
|
string FinalDefIDToFind = m_sKEYENCEBar;// 目标 FinalDefID
|
||||||
|
OcrBar = FormBarType(FinalDefIDToFind);
|
||||||
this.Invoke(new Action(() =>
|
this.Invoke(new Action(() =>
|
||||||
{
|
{
|
||||||
|
|
||||||
ScannerBox.Text = FinalDefIDToFind;
|
ScannerBox.Text = FinalDefIDToFind;
|
||||||
|
textBox3.Text = OcrBar;
|
||||||
|
|
||||||
}));
|
}));
|
||||||
myLog("扫码器结果" + m_sKEYENCEBar, DateTime.Now);
|
myLog("扫码器结果" + m_sKEYENCEBar, DateTime.Now);
|
||||||
#if false
|
//#if false
|
||||||
//是否给Pos请求加上时间超时
|
//是否给Pos请求加上时间超时
|
||||||
OcrBar = FormBarType(FinalDefIDToFind);
|
|
||||||
#else
|
//#else
|
||||||
OcrBar = "OZ.洗衣机.WF3G7014-NVW001CZA.WSG374A.白";
|
// OcrBar = "OZ.洗衣机.WF3G7014-NVW001CZA.WSG374A.白";
|
||||||
#endif
|
//#endif
|
||||||
// if(Oldm_sKEYENCEBar!= m_sKEYENCEBar)
|
// if(Oldm_sKEYENCEBar!= m_sKEYENCEBar)
|
||||||
|
|
||||||
|
|
||||||
@ -1826,7 +1636,8 @@ namespace HisenceYoloDetection
|
|||||||
{
|
{
|
||||||
myLog("未匹配成功" + xKNow.OcrBar, DateTime.Now);
|
myLog("未匹配成功" + xKNow.OcrBar, DateTime.Now);
|
||||||
myLog("开始插入模板", DateTime.Now);
|
myLog("开始插入模板", DateTime.Now);
|
||||||
//Insert_auto();
|
Insert_auto(true, Cam1ImgOne, m_sKEYENCEBar, 8974, 0, 0);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
string IOcrBAr = xKNow.OcrBar;
|
string IOcrBAr = xKNow.OcrBar;
|
||||||
@ -2713,12 +2524,23 @@ namespace HisenceYoloDetection
|
|||||||
string jsonData = @"
|
string jsonData = @"
|
||||||
{
|
{
|
||||||
""StartTime"": ""2024-07-1"",
|
""StartTime"": ""2024-07-1"",
|
||||||
""EndTime"": ""2024-07-22"",
|
""EndTime"": ""2024-07-20"",
|
||||||
""LineBody"": ""BZ-PC""
|
""LineBody"": ""BZ-PC""
|
||||||
}";
|
}";
|
||||||
|
// 获取当天日期
|
||||||
|
string currentDate = DateTime.Now.ToString("yyyy-MM-dd");
|
||||||
|
|
||||||
|
// 解析JSON字符串为JObject
|
||||||
|
JObject jsonObject = JObject.Parse(jsonData);
|
||||||
|
|
||||||
|
// 更新EndTime字段
|
||||||
|
jsonObject["EndTime"] = currentDate;
|
||||||
|
|
||||||
|
// 将JObject转回JSON字符串
|
||||||
|
string updatedJsonData = jsonObject.ToString();
|
||||||
|
|
||||||
|
|
||||||
string postData = "inputvalue=" + Uri.EscapeDataString(jsonData);
|
string postData = "inputvalue=" + Uri.EscapeDataString(updatedJsonData);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -2747,8 +2569,6 @@ namespace HisenceYoloDetection
|
|||||||
}
|
}
|
||||||
public void Insert_auto(bool ifwhiteBan, Mat img, string SNtext, int MoveX, int MoveY, int MoveZ)
|
public void Insert_auto(bool ifwhiteBan, Mat img, string SNtext, int MoveX, int MoveY, int MoveZ)
|
||||||
{
|
{
|
||||||
// PaddleOcrModel IpaddleOcrModel = new PaddleOcrModel();
|
|
||||||
// IpaddleOcrModel.Load(ModelChangePath, "CPU");
|
|
||||||
|
|
||||||
|
|
||||||
string IOcrBAr = FormBarType(SNtext);
|
string IOcrBAr = FormBarType(SNtext);
|
||||||
@ -2762,20 +2582,9 @@ namespace HisenceYoloDetection
|
|||||||
sw.Flush();
|
sw.Flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//将所有的块裁剪 识别字符对比字符串
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//进行推理
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//从第一次拍照全图范围内目标检测然后进行OCR识别
|
//从第一次拍照全图范围内目标检测然后进行OCR识别
|
||||||
MLRequest CamOneI = new MLRequest();
|
MLRequest CamOneI = new MLRequest();
|
||||||
CamOneI.currentMat = Cv2.ImRead(Cam1OnePath);
|
CamOneI.currentMat = img;
|
||||||
CamOneI.ResizeWidth = 640;
|
CamOneI.ResizeWidth = 640;
|
||||||
CamOneI.ResizeHeight = 640;
|
CamOneI.ResizeHeight = 640;
|
||||||
CamOneI.Score = 0.3f;
|
CamOneI.Score = 0.3f;
|
||||||
@ -2803,19 +2612,11 @@ namespace HisenceYoloDetection
|
|||||||
|
|
||||||
|
|
||||||
InsertXKHisenceWordData(xkWord);//往关键字表中插入一条数据
|
InsertXKHisenceWordData(xkWord);//往关键字表中插入一条数据
|
||||||
//文本区域
|
|
||||||
//List<string> bingji = strMatListOne.Union(strMatListTwo).ToList();//并(全)集
|
|
||||||
//List<string> Fuzzybingji = strMatFuzzyListOne.Union(strMatFuzzyListTwo).ToList();//并(全)集
|
|
||||||
string OcrTextone = strMatListOne.Join("##");
|
string OcrTextone = strMatListOne.Join("##");
|
||||||
string OcrTextTwo = strMatFuzzyListOne.Join("##");
|
string OcrTextTwo = strMatFuzzyListOne.Join("##");
|
||||||
|
|
||||||
//string OcrTextinsert = "";
|
|
||||||
//List<string> bingji = strMatListListOne.Union(strMatListListTwo).ToList();//并(全)集
|
|
||||||
//for (int j = 0; j < bingji.Count; j++)
|
|
||||||
//{
|
|
||||||
// string jdetial = bingji[j];
|
|
||||||
// OcrTextinsert += jdetial + "##";
|
|
||||||
//}
|
|
||||||
string detstr = "";
|
string detstr = "";
|
||||||
|
|
||||||
//找到识别区域
|
//找到识别区域
|
||||||
@ -2841,14 +2642,7 @@ namespace HisenceYoloDetection
|
|||||||
|
|
||||||
DateTime dt2 = DateTime.Now;
|
DateTime dt2 = DateTime.Now;
|
||||||
XKHisence xK = new XKHisence("1", IOcrBAr, MoveX, MoveY, MoveZ, detstr, OcrTextone, MoveX, MoveY, MoveZ, ModelChangePath, "", OcrTextTwo);
|
XKHisence xK = new XKHisence("1", IOcrBAr, MoveX, MoveY, MoveZ, detstr, OcrTextone, MoveX, MoveY, MoveZ, ModelChangePath, "", OcrTextTwo);
|
||||||
//string log="D:\\Hisence\\detImages\\" + dt2.Year.ToString() + dt2.Month.ToString() + dt2.Day.ToString() + dt2.Hour.ToString() + dt2.Minute.ToString() + dt2.Millisecond.ToString() + "2result.log";
|
|
||||||
// using (StreamWriter sw=new StreamWriter(log, true))
|
|
||||||
// {
|
|
||||||
// // sw.WriteLine(xK.OcrBar+"\n");
|
|
||||||
// sw.WriteLine(xK.OcrText);
|
|
||||||
// sw.WriteLine(xK.FuzzyOcrText);
|
|
||||||
// }
|
|
||||||
//IpaddleOcrModel.FreeModel();
|
|
||||||
|
|
||||||
string sql = "insert into XK_Hisence VALUES('" + xK.Type + "','" + xK.OcrBar + "'," + xK.MoveX + "," + xK.MoveY + "," + xK.MoveZ + ",'" + xK.Detect + "','" + xK.OcrText + "'," + xK.MoveTwoX + "," + xK.MoveTwoY + "," + xK.MoveTwoZ + ",'" + xK.OcrParm + "','" + xK.Language + "','" + xK.FuzzyOcrText + "')";
|
string sql = "insert into XK_Hisence VALUES('" + xK.Type + "','" + xK.OcrBar + "'," + xK.MoveX + "," + xK.MoveY + "," + xK.MoveZ + ",'" + xK.Detect + "','" + xK.OcrText + "'," + xK.MoveTwoX + "," + xK.MoveTwoY + "," + xK.MoveTwoZ + ",'" + xK.OcrParm + "','" + xK.Language + "','" + xK.FuzzyOcrText + "')";
|
||||||
int i = SQLiteHelper.ExecuteSql(sql);
|
int i = SQLiteHelper.ExecuteSql(sql);
|
||||||
@ -3946,5 +3740,30 @@ namespace HisenceYoloDetection
|
|||||||
melsecPLCTCPDriver.WriteInt(YellowLightingAdress, 0);
|
melsecPLCTCPDriver.WriteInt(YellowLightingAdress, 0);
|
||||||
melsecPLCTCPDriver.WriteInt(GreenLightingAdress, 0);
|
melsecPLCTCPDriver.WriteInt(GreenLightingAdress, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void label24_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void label25_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void label18_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void canvas2_Load(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user