Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
E
Education
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
黄奎
Education
Commits
28f73626
Commit
28f73626
authored
Jan 20, 2021
by
黄奎
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
新增验证
parent
0c4f1611
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
301 additions
and
155 deletions
+301
-155
AnalysisQuestionTypeModule.cs
Edu.Module.Question/AnalysisQuestionTypeModule.cs
+8
-1
QuestionModule.cs
Edu.Module.Question/QuestionModule.cs
+0
-1
QuestionController.cs
Edu.WebApi/Controllers/Course/QuestionController.cs
+293
-153
No files found.
Edu.Module.Question/AnalysisQuestionTypeModule.cs
View file @
28f73626
...
...
@@ -154,7 +154,14 @@ namespace Edu.Module.Question
break
;
//共用选择题
case
"sharing-choose"
:
if
(!
string
.
IsNullOrEmpty
(
data
))
{
obj
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
List
<
matchingItem
>>>(
data
);
}
else
{
obj
=
null
;
}
break
;
//其它题
case
"other"
:
...
...
Edu.Module.Question/QuestionModule.cs
View file @
28f73626
...
...
@@ -163,7 +163,6 @@ namespace Edu.Module.Question
var
extModel
=
questionRepository
.
GetEntity
<
RB_Question_ViewModel
>(
QuestionId
);
if
(
extModel
!=
null
)
{
extModel
.
QuestionContentObj
=
ParsingQuestionModule
(
extModel
.
QuestionTypeKey
,
extModel
.
QuestionContent
);
if
(!
string
.
IsNullOrEmpty
(
extModel
.
Knowledge
))
{
...
...
Edu.WebApi/Controllers/Course/QuestionController.cs
View file @
28f73626
...
...
@@ -64,7 +64,6 @@ namespace Edu.WebApi.Controllers.Course
}
catch
{
}
try
{
...
...
@@ -76,7 +75,6 @@ namespace Edu.WebApi.Controllers.Course
}
catch
{
}
var
list
=
questionModule
.
GetQuestionPageListModule
(
pageModel
.
PageIndex
,
pageModel
.
PageSize
,
out
long
rowsCount
,
query
);
List
<
object
>
resultList
=
new
List
<
object
>();
...
...
@@ -171,36 +169,66 @@ namespace Edu.WebApi.Controllers.Course
return
ApiResult
.
Failed
(
message
:
"请填写问题题干!"
);
}
if
(
extModel
.
QuestionTypeKey
==
"single"
||
extModel
.
QuestionTypeKey
==
"multiple"
)
//单选、多选、单选(数字)题
if
(
extModel
.
QuestionTypeKey
==
"single"
||
extModel
.
QuestionTypeKey
==
"multiple"
||
extModel
.
QuestionTypeKey
==
"single-number"
)
{
var
optionItems
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
optionItem
>>(
extModel
.
QuestionContent
);
if
(
optionItems
!=
null
&&
optionItems
.
Count
>
0
)
string
message
=
CheckChoose
(
optionItems
);
if
(!
string
.
IsNullOrEmpty
(
message
))
{
if
(
optionItems
.
Where
(
qitem
=>
string
.
IsNullOrEmpty
(
qitem
.
Content
)).
Count
()
>
0
)
return
ApiResult
.
Failed
(
message
:
message
);
}
}
//填空题
else
if
(
extModel
.
QuestionTypeKey
==
"fill-in"
)
{
var
fillInList
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
fillInItem
>>(
extModel
.
QuestionContent
);
string
fillMessage
=
CheckFillIn
(
fillInList
);
if
(!
string
.
IsNullOrEmpty
(
fillMessage
))
{
return
ApiResult
.
Failed
(
message
:
"选项不能为空!"
);
return
ApiResult
.
Failed
(
message
:
fillMessage
);
}
//判断选项是否重复
if
(
optionItems
.
GroupBy
(
qitem
=>
new
{
qitem
.
Content
}).
Where
(
qitem
=>
qitem
.
Count
()
>
1
).
Count
()
>
0
)
}
//简答题
else
if
(
extModel
.
QuestionTypeKey
==
"short-answer"
)
{
return
ApiResult
.
Failed
(
message
:
"选项不能相同!"
);
string
shortMessage
=
CheckShortAnswer
(
extModel
.
Answer
);
if
(!
string
.
IsNullOrEmpty
(
shortMessage
))
{
return
ApiResult
.
Failed
(
message
:
shortMessage
);
}
}
//名词解释
else
if
(
extModel
.
QuestionTypeKey
==
"noun-explanation"
)
{
if
(
string
.
IsNullOrEmpty
(
extModel
.
Answer
))
{
return
ApiResult
.
Failed
(
message
:
"请设置正确的选项
!"
);
return
ApiResult
.
Failed
(
message
:
"请填写名词解释答案
!"
);
}
}
else
//论述题
else
if
(
extModel
.
QuestionTypeKey
==
"essay-question"
)
{
if
(
string
.
IsNullOrEmpty
(
extModel
.
Answer
))
{
return
ApiResult
.
Failed
(
message
:
"请
添加选择题选项
!"
);
return
ApiResult
.
Failed
(
message
:
"请
填写论述题答案
!"
);
}
}
else
if
(
extModel
.
QuestionTypeKey
==
"fill-in"
)
//计算题
else
if
(
extModel
.
QuestionTypeKey
==
"calculation"
)
{
var
fillInList
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
fillInItem
>>(
extModel
.
QuestionContent
);
if
(
fillInList
!=
null
&&
fillInList
.
Count
>
0
)
if
(
string
.
IsNullOrEmpty
(
extModel
.
Answer
))
{
if
(
fillInList
.
Where
(
qitem
=>
string
.
IsNullOrEmpty
(
qitem
.
Content
)).
Count
()
>
0
)
return
ApiResult
.
Failed
(
message
:
"请填写计算题答案!"
);
}
}
//分录题、资料题
else
if
(
extModel
.
QuestionTypeKey
==
"entry-problem"
||
extModel
.
QuestionTypeKey
==
"data-question"
)
{
var
entryList
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
fillInItem
>>(
extModel
.
QuestionContent
);
if
(
entryList
!=
null
&&
entryList
.
Count
>
0
)
{
if
(
entryList
.
Where
(
qitem
=>
string
.
IsNullOrEmpty
(
qitem
.
Content
)).
Count
()
>
0
)
{
return
ApiResult
.
Failed
(
message
:
"请输入答案!"
);
}
...
...
@@ -210,76 +238,123 @@ namespace Edu.WebApi.Controllers.Course
return
ApiResult
.
Failed
(
message
:
"请添加答案!"
);
}
}
var
obj
=
new
object
();
switch
(
extModel
.
QuestionTypeKey
)
//排序题
else
if
(
extModel
.
QuestionTypeKey
==
"sorting-problem"
)
{
//填空题
case
"fill-in"
:
break
;
//判断题
case
"judge"
:
obj
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
optionItem
>>(
extModel
.
QuestionContent
);
break
;
//简答题
case
"short-answer"
:
obj
=
extModel
.
QuestionContent
;
break
;
//名词解释
case
"noun-explanation"
:
obj
=
extModel
.
QuestionContent
;
break
;
//论述题
case
"essay-question"
:
obj
=
extModel
.
QuestionContent
;
break
;
//计算题
case
"calculation"
:
obj
=
extModel
.
QuestionContent
;
break
;
//分录题
case
"entry-problem"
:
obj
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
fillInItem
>>(
extModel
.
QuestionContent
);
break
;
//资料题
case
"data-question"
:
obj
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
fillInItem
>>(
extModel
.
QuestionContent
);
break
;
var
sortList
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
List
<
matchingItem
>>>(
extModel
.
QuestionContent
);
if
(
sortList
!=
null
&&
sortList
.
Count
>
0
)
{
if
(
sortList
[
0
].
Where
(
qitem
=>
string
.
IsNullOrEmpty
(
qitem
.
Content
)).
Count
()
>
0
)
{
return
ApiResult
.
Failed
(
message
:
"请输入选项内容!"
);
}
}
else
{
return
ApiResult
.
Failed
(
message
:
"请添加选项!"
);
}
}
//连线题
case
"matching"
:
obj
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
List
<
matchingItem
>>>(
extModel
.
QuestionContent
);
break
;
//排序题
case
"sorting-problem"
:
obj
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
List
<
matchingItem
>>>(
extModel
.
QuestionContent
);
break
;
else
if
(
extModel
.
QuestionTypeKey
==
"matching"
)
{
var
matchList
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
List
<
matchingItem
>>>(
extModel
.
QuestionContent
);
if
(
matchList
!=
null
&&
matchList
.
Count
>
0
)
{
if
(
matchList
[
0
].
Where
(
qitem
=>
string
.
IsNullOrEmpty
(
qitem
.
Content
)).
Count
()
>
0
)
{
return
ApiResult
.
Failed
(
message
:
"第一组选项内容不能为空!"
);
}
if
(
matchList
[
1
].
Where
(
qitem
=>
string
.
IsNullOrEmpty
(
qitem
.
Content
)).
Count
()
>
0
)
{
return
ApiResult
.
Failed
(
message
:
"第二组选项内容不能为空!"
);
}
}
else
{
return
ApiResult
.
Failed
(
message
:
"请添加选项!"
);
}
}
//完型填空
case
"cloze"
:
obj
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
List
<
optionItem
>>>(
extModel
.
QuestionContent
);
break
;
//阅读理解
case
"reading-comprehensio"
:
else
if
(
extModel
.
QuestionTypeKey
==
"cloze"
)
{
var
clozeList
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
List
<
optionItem
>>>(
extModel
.
QuestionContent
);
if
(
clozeList
!=
null
&&
clozeList
.
Count
>
0
)
{
int
index
=
1
;
foreach
(
var
subList
in
clozeList
)
{
if
(
subList
.
Where
(
qitem
=>
string
.
IsNullOrEmpty
(
qitem
.
Content
)).
Count
()
>
0
)
{
return
ApiResult
.
Failed
(
message
:
string
.
Format
(
"第{0}小题选项内容不能为空!"
,
index
));
}
if
(!(
subList
.
Where
(
qitem
=>
qitem
.
IsAnswer
==
true
).
Count
()
>
0
))
{
return
ApiResult
.
Failed
(
message
:
string
.
Format
(
"请设置第{0}小题选项的正确答案!"
,
index
));
}
index
++;
}
}
else
{
return
ApiResult
.
Failed
(
message
:
"请添加小题!"
);
}
}
//口语题
else
if
(
extModel
.
QuestionTypeKey
==
"spoken"
)
{
if
(
string
.
IsNullOrEmpty
(
extModel
.
Answer
))
{
return
ApiResult
.
Failed
(
message
:
"请填写口语题答案!"
);
}
}
//其它题
else
if
(
extModel
.
QuestionTypeKey
==
"other"
)
{
if
(
string
.
IsNullOrEmpty
(
extModel
.
Answer
))
{
return
ApiResult
.
Failed
(
message
:
"请填写其它题答案!"
);
}
}
//阅读理解和听力题
else
if
(
extModel
.
QuestionTypeKey
==
"reading-comprehensio"
||
extModel
.
QuestionTypeKey
==
"listening"
)
{
var
readingList
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
readingComprehensioItem
>>(
extModel
.
QuestionContent
);
if
(
readingList
!=
null
&&
readingList
.
Count
>
0
)
{
foreach
(
var
item
in
readingList
)
{
if
(
string
.
IsNullOrEmpty
(
item
.
SubTitle
))
{
return
ApiResult
.
Failed
(
message
:
"请填写题干!"
);
}
switch
(
item
.
QuestionKey
)
{
//单选题
case
"single"
:
item
.
SubAnwser
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
optionItem
>>(
item
.
SubAnwser
.
ToString
());
var
singleAnwser
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
optionItem
>>(
item
.
SubAnwser
.
ToString
());
string
singleMessage
=
CheckChoose
(
singleAnwser
);
if
(!
string
.
IsNullOrEmpty
(
singleMessage
))
{
return
ApiResult
.
Failed
(
message
:
singleMessage
);
}
break
;
//多选题
case
"multiple"
:
item
.
SubAnwser
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
optionItem
>>(
item
.
SubAnwser
.
ToString
());
var
multipleAnwser
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
optionItem
>>(
item
.
SubAnwser
.
ToString
());
string
multipleMessage
=
CheckChoose
(
multipleAnwser
);
if
(!
string
.
IsNullOrEmpty
(
multipleMessage
))
{
return
ApiResult
.
Failed
(
message
:
multipleMessage
);
}
break
;
//填空题
case
"fill-in"
:
item
.
SubAnwser
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
fillInItem
>>(
item
.
SubAnwser
.
ToString
());
var
r_fillInList
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
fillInItem
>>(
item
.
SubAnwser
.
ToString
());
string
r_fillMessage
=
CheckFillIn
(
r_fillInList
);
if
(!
string
.
IsNullOrEmpty
(
r_fillMessage
))
{
return
ApiResult
.
Failed
(
message
:
r_fillMessage
);
}
break
;
//判断题
case
"judge"
:
...
...
@@ -287,63 +362,55 @@ namespace Edu.WebApi.Controllers.Course
break
;
//简答题
case
"short-answer"
:
item
.
SubAnwser
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
fillInItem
>>(
item
.
SubAnwser
.
ToString
());
var
shortAnswer
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
fillInItem
>>(
item
.
SubAnwser
.
ToString
());
string
r_shortMessage
=
CheckShortAnswer
(
shortAnswer
[
0
].
Content
);
if
(!
string
.
IsNullOrEmpty
(
r_shortMessage
))
{
return
ApiResult
.
Failed
(
message
:
r_shortMessage
);
}
break
;
}
}
}
obj
=
readingList
;
break
;
//口语题
case
"spoken"
:
obj
=
extModel
.
QuestionContent
;
break
;
//听力题
case
"listening"
:
var
listenList
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
readingComprehensioItem
>>(
extModel
.
QuestionContent
);
if
(
listenList
!=
null
&&
listenList
.
Count
>
0
)
else
{
foreach
(
var
item
in
listenList
)
return
ApiResult
.
Failed
(
message
:
"请添加小题!"
);
}
}
//共用选择题
else
if
(
extModel
.
QuestionTypeKey
==
"sharing-choose"
)
{
switch
(
item
.
QuestionKey
)
var
shareList
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
List
<
matchingItem
>>>(
extModel
.
QuestionContent
);
if
(
shareList
!=
null
&&
shareList
.
Count
==
2
)
{
//单选题
case
"single"
:
item
.
SubAnwser
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
optionItem
>>(
item
.
SubAnwser
.
ToString
());
break
;
//多选题
case
"multiple"
:
item
.
SubAnwser
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
optionItem
>>(
item
.
SubAnwser
.
ToString
());
break
;
//填空题
case
"fill-in"
:
item
.
SubAnwser
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
fillInItem
>>(
item
.
SubAnwser
.
ToString
());
break
;
//判断题
case
"judge"
:
item
.
SubAnwser
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
optionItem
>>(
item
.
SubAnwser
.
ToString
());
break
;
//简答题
case
"short-answer"
:
item
.
SubAnwser
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
fillInItem
>>(
item
.
SubAnwser
.
ToString
());
break
;
if
(
shareList
[
0
].
Where
(
qitem
=>
string
.
IsNullOrEmpty
(
qitem
.
Content
)).
Count
()
>
0
)
{
return
ApiResult
.
Failed
(
message
:
string
.
Format
(
"选项内容不能为空!"
));
}
//判断选项是否重复
if
(
shareList
[
0
].
GroupBy
(
qitem
=>
new
{
qitem
.
Content
}).
Where
(
qitem
=>
qitem
.
Count
()
>
1
).
Count
()
>
0
)
{
return
ApiResult
.
Failed
(
message
:
string
.
Format
(
"选项内容不能相同!"
));
}
if
(
shareList
[
1
].
Where
(
qitem
=>
string
.
IsNullOrEmpty
(
qitem
.
Content
)).
Count
()
>
0
)
{
return
ApiResult
.
Failed
(
message
:
string
.
Format
(
"题干不能为空!"
));
}
//判断题干是否重复
if
(
shareList
[
1
].
GroupBy
(
qitem
=>
new
{
qitem
.
Content
}).
Where
(
qitem
=>
qitem
.
Count
()
>
1
).
Count
()
>
0
)
{
return
ApiResult
.
Failed
(
message
:
string
.
Format
(
"题干不能相同!"
));
}
//判断题干是否设置正确选项
if
(
shareList
[
1
].
Where
(
qitem
=>
string
.
IsNullOrEmpty
(
qitem
.
Name
)).
Count
()
>
0
)
{
return
ApiResult
.
Failed
(
message
:
string
.
Format
(
"请设置题干的正确选项!"
));
}
}
else
{
return
ApiResult
.
Failed
(
message
:
"请添加选项!"
);
}
obj
=
listenList
;
break
;
//共用选择题
case
"sharing-choose"
:
obj
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
List
<
matchingItem
>>>(
extModel
.
QuestionContent
);
break
;
//其它题
case
"other"
:
obj
=
extModel
.
QuestionContent
;
break
;
//单选题(数字)
case
"single-number"
:
obj
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
optionItem
>>(
extModel
.
QuestionContent
);
break
;
}
extModel
.
CreateTime
=
DateTime
.
Now
;
extModel
.
CreateBy
=
base
.
UserInfo
.
Id
;
...
...
@@ -354,19 +421,71 @@ namespace Edu.WebApi.Controllers.Course
}
/// <summary>
///
批量添加修改问题
///
选择题验证
/// </summary>
/// <param name="optionItems"></param>
/// <returns></returns>
[
HttpPost
]
public
ApiResult
SetQuestionBeatch
()
private
string
CheckChoose
(
List
<
optionItem
>
optionItems
)
{
bool
flag
=
false
;
var
list
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
RB_Question_ViewModel
>>(
RequestParm
.
Msg
.
ToString
());
if
(
list
!=
null
&&
list
.
Count
>
0
)
string
message
=
""
;
if
(
optionItems
!=
null
&&
optionItems
.
Count
>
0
)
{
flag
=
questionModule
.
SetQuestionBatchModule
(
list
);
if
(
optionItems
.
Where
(
qitem
=>
string
.
IsNullOrEmpty
(
qitem
.
Content
)).
Count
()
>
0
)
{
message
=
"选项不能为空!"
;
}
//判断选项是否重复
if
(
optionItems
.
GroupBy
(
qitem
=>
new
{
qitem
.
Content
}).
Where
(
qitem
=>
qitem
.
Count
()
>
1
).
Count
()
>
0
)
{
message
=
"选项不能相同!"
;
}
if
(!(
optionItems
.
Where
(
qitem
=>
qitem
.
IsAnswer
==
true
).
Count
()
>
0
))
{
message
=
"请设置正确的选项!"
;
}
}
else
{
message
=
"请添加选择题选项!"
;
}
return
message
;
}
/// <summary>
/// 验证填空题
/// </summary>
/// <param name="fillInList"></param>
/// <returns></returns>
private
string
CheckFillIn
(
List
<
fillInItem
>
fillInList
)
{
string
message
=
""
;
if
(
fillInList
!=
null
&&
fillInList
.
Count
>
0
)
{
if
(
fillInList
.
Where
(
qitem
=>
string
.
IsNullOrEmpty
(
qitem
.
Content
)).
Count
()
>
0
)
{
message
=
"请输入答案!"
;
}
return
flag
?
ApiResult
.
Success
()
:
ApiResult
.
Failed
();
}
else
{
message
=
"请添加答案!"
;
}
return
message
;
}
/// <summary>
/// 验证简答题
/// </summary>
/// <param name="answer"></param>
/// <returns></returns>
private
string
CheckShortAnswer
(
string
answer
)
{
string
message
=
""
;
if
(
string
.
IsNullOrEmpty
(
answer
))
{
message
=
"请填写简答题答案!"
;
}
return
message
;
}
/// <summary>
...
...
@@ -381,6 +500,24 @@ namespace Edu.WebApi.Controllers.Course
return
ApiResult
.
Success
(
data
:
extModel
);
}
/// <summary>
/// 批量添加修改问题
/// </summary>
/// <returns></returns>
[
HttpPost
]
public
ApiResult
SetQuestionBeatch
()
{
bool
flag
=
false
;
var
list
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
List
<
RB_Question_ViewModel
>>(
RequestParm
.
Msg
.
ToString
());
if
(
list
!=
null
&&
list
.
Count
>
0
)
{
flag
=
questionModule
.
SetQuestionBatchModule
(
list
);
}
return
flag
?
ApiResult
.
Success
()
:
ApiResult
.
Failed
();
}
/// <summary>
/// 删除课程问题
/// </summary>
...
...
@@ -486,6 +623,7 @@ namespace Edu.WebApi.Controllers.Course
}
#
endregion
#
region
问题导入
/// <summary>
/// 导入Excel问题
/// </summary>
...
...
@@ -1067,5 +1205,7 @@ namespace Edu.WebApi.Controllers.Course
model
.
QuestionTypeKey
=
tempModel
?.
Key
??
""
;
}
}
#
endregion
}
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment