Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
G
galaxy-iOS
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
mobile-group
galaxy-iOS
Commits
a1a7bb9c
Commit
a1a7bb9c
authored
Sep 30, 2025
by
Steven杜宇
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
// 动态
parent
5edd3415
Changes
9
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
216 additions
and
12 deletions
+216
-12
project.pbxproj
galaxy/galaxy.xcodeproj/project.pbxproj
+24
-0
YHConnectListViewController.swift
...y(社区)/Connections(人脉)/C/YHConnectListViewController.swift
+1
-0
YHNameCardContainerViewController.swift
...的)/NameCard(名片)/C/YHNameCardContainerViewController.swift
+2
-1
YHNameCardDynamicViewController.swift
...(我的)/NameCard(名片)/C/YHNameCardDynamicViewController.swift
+28
-2
YHNewNameCardViewController.swift
...Mine(我的)/NameCard(名片)/C/YHNewNameCardViewController.swift
+1
-1
YHDynamicItem.swift
...asses/Modules/Mine(我的)/NameCard(名片)/M/YHDynamicItem.swift
+61
-0
YHNameCardDynamicCell.swift
...dules/Mine(我的)/NameCard(名片)/V/YHNameCardDynamicCell.swift
+22
-7
YHDynamicViewModel.swift
...Modules/Mine(我的)/NameCard(名片)/VM/YHDynamicViewModel.swift
+72
-0
YHAllApiName.swift
galaxy/galaxy/Classes/Tools/NetWork/YHAllApiName.swift
+5
-1
No files found.
galaxy/galaxy.xcodeproj/project.pbxproj
View file @
a1a7bb9c
...
...
@@ -1304,6 +1304,8 @@
04D8FFBA2DB0D95A00703C75
/* YHGalaxyNewsCell.swift in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
04D8FFB92DB0D95A00703C75
/* YHGalaxyNewsCell.swift */
;
};
04DFB6F02E8BA8D1008EC0EB
/* YHTagFlowLayout.swift in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
04DFB6EF2E8BA8D1008EC0EB
/* YHTagFlowLayout.swift */
;
};
04DFB6F22E8BAA1C008EC0EB
/* YHTagCollectionView.swift in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
04DFB6F12E8BAA1C008EC0EB
/* YHTagCollectionView.swift */
;
};
04DFB6F52E8BC896008EC0EB
/* YHDynamicViewModel.swift in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
04DFB6F42E8BC896008EC0EB
/* YHDynamicViewModel.swift */
;
};
04DFB6F72E8BC8C7008EC0EB
/* YHDynamicItem.swift in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
04DFB6F62E8BC8C7008EC0EB
/* YHDynamicItem.swift */
;
};
04E0D3C82E866A6300F1824B
/* YHCirclePhotoCell.swift in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
04E0D3C72E866A6300F1824B
/* YHCirclePhotoCell.swift */
;
};
04E0D3CA2E866A9800F1824B
/* YHCircleAddPhotoCell.swift in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
04E0D3C92E866A9800F1824B
/* YHCircleAddPhotoCell.swift */
;
};
04E0D3CC2E877D4D00F1824B
/* YHMediaUploadSheetView.swift in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
04E0D3CB2E877D4D00F1824B
/* YHMediaUploadSheetView.swift */
;
};
...
...
@@ -2678,6 +2680,8 @@
04D8FFB92DB0D95A00703C75
/* YHGalaxyNewsCell.swift */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.swift
;
path
=
YHGalaxyNewsCell.swift
;
sourceTree
=
"<group>"
;
};
04DFB6EF2E8BA8D1008EC0EB
/* YHTagFlowLayout.swift */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.swift
;
path
=
YHTagFlowLayout.swift
;
sourceTree
=
"<group>"
;
};
04DFB6F12E8BAA1C008EC0EB
/* YHTagCollectionView.swift */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.swift
;
path
=
YHTagCollectionView.swift
;
sourceTree
=
"<group>"
;
};
04DFB6F42E8BC896008EC0EB
/* YHDynamicViewModel.swift */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.swift
;
path
=
YHDynamicViewModel.swift
;
sourceTree
=
"<group>"
;
};
04DFB6F62E8BC8C7008EC0EB
/* YHDynamicItem.swift */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.swift
;
path
=
YHDynamicItem.swift
;
sourceTree
=
"<group>"
;
};
04E0D3C72E866A6300F1824B
/* YHCirclePhotoCell.swift */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.swift
;
path
=
YHCirclePhotoCell.swift
;
sourceTree
=
"<group>"
;
};
04E0D3C92E866A9800F1824B
/* YHCircleAddPhotoCell.swift */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.swift
;
path
=
YHCircleAddPhotoCell.swift
;
sourceTree
=
"<group>"
;
};
04E0D3CB2E877D4D00F1824B
/* YHMediaUploadSheetView.swift */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.swift
;
path
=
YHMediaUploadSheetView.swift
;
sourceTree
=
"<group>"
;
};
...
...
@@ -6945,6 +6949,8 @@
04B30B7C2E86371E004E4B12
/* NameCard(名片) */
=
{
isa
=
PBXGroup
;
children
=
(
04DFB6F82E8BC8D0008EC0EB
/* M */
,
04DFB6F32E8BC86F008EC0EB
/* VM */
,
04B30B7E2E863761004E4B12
/* V */
,
04B30B7D2E86374E004E4B12
/* C */
,
);
...
...
@@ -7172,6 +7178,22 @@
path
=
VM
;
sourceTree
=
"<group>"
;
};
04DFB6F32E8BC86F008EC0EB
/* VM */
=
{
isa
=
PBXGroup
;
children
=
(
04DFB6F42E8BC896008EC0EB
/* YHDynamicViewModel.swift */
,
);
path
=
VM
;
sourceTree
=
"<group>"
;
};
04DFB6F82E8BC8D0008EC0EB
/* M */
=
{
isa
=
PBXGroup
;
children
=
(
04DFB6F62E8BC8C7008EC0EB
/* YHDynamicItem.swift */
,
);
path
=
M
;
sourceTree
=
"<group>"
;
};
4758815B24BAF3CAA24EC6A8
/* Pods */
=
{
isa
=
PBXGroup
;
children
=
(
...
...
@@ -7748,6 +7770,7 @@
045C102A2D12CA5F00BD2DC0
/* YHEditViewModel.swift in Sources */
,
045C102B2D12CA5F00BD2DC0
/* YHAppVersionForceUpdateView.swift in Sources */
,
045C102C2D12CA5F00BD2DC0
/* YHMyPermissionCell.swift in Sources */
,
04DFB6F72E8BC8C7008EC0EB
/* YHDynamicItem.swift in Sources */
,
04AFEF3F2D5D8F8A0007A011
/* YHMyNewViewController.swift in Sources */
,
04D8FF6B2D94EADE00703C75
/* YHPlanItemView.swift in Sources */
,
045C102D2D12CA5F00BD2DC0
/* YHHKEventModel.swift in Sources */
,
...
...
@@ -7862,6 +7885,7 @@
045C10842D12CA5F00BD2DC0
/* YHResignAppointMember.swift in Sources */
,
045C10852D12CA5F00BD2DC0
/* YHResignAppointOptionResultCell.swift in Sources */
,
045C10862D12CA5F00BD2DC0
/* YHServiceItemCell.swift in Sources */
,
04DFB6F52E8BC896008EC0EB
/* YHDynamicViewModel.swift in Sources */
,
045C10872D12CA5F00BD2DC0
/* YHServiceOrderProgressTableViewCell.swift in Sources */
,
045C10882D12CA5F00BD2DC0
/* YHResignUploadTravelCardDetailModel.swift in Sources */
,
045C10892D12CA5F00BD2DC0
/* YHAppointHKResultModel.swift in Sources */
,
...
...
galaxy/galaxy/Classes/Modules/Community(社区)/Connections(人脉)/C/YHConnectListViewController.swift
View file @
a1a7bb9c
...
...
@@ -64,6 +64,7 @@ class YHConnectListViewController: YHBaseViewController {
func
reguestData
(
_
isFirstPage
:
Bool
)
{
self
.
viewModel
.
getList
(
isFirstPage
)
{
_
,
_
in
self
.
arr
.
removeAll
()
self
.
arr
.
append
(
contentsOf
:
(
self
.
viewModel
.
contacts
))
self
.
noDataView
.
isHidden
=
self
.
arr
.
count
>
0
self
.
tableView
.
reloadData
()
...
...
galaxy/galaxy/Classes/Modules/Mine(我的)/NameCard(名片)/C/YHNameCardContainerViewController.swift
View file @
a1a7bb9c
...
...
@@ -79,8 +79,9 @@ class YHNameCardContainerViewController: YHBaseViewController {
NotificationCenter
.
default
.
removeObserver
(
self
)
}
func
freshData
()
{
func
re
freshData
()
{
homePageVC
.
requestNameCardInfo
()
dynamicVC
.
requestList
(
true
)
}
func
requestNameCardInfo
()
{
...
...
galaxy/galaxy/Classes/Modules/Mine(我的)/NameCard(名片)/C/YHNameCardDynamicViewController.swift
View file @
a1a7bb9c
...
...
@@ -11,12 +11,13 @@ import JXSegmentedView
class
YHNameCardDynamicViewController
:
YHBaseViewController
{
var
arr
:
[
String
]
=
[
""
,
""
,
""
,
""
]
let
viewModel
:
YHDynamicViewModel
=
YHDynamicViewModel
()
var
arr
:
[
YHDynamicItem
]
=
[]
var
vcCanScroll
:
Bool
=
true
lazy
var
tableView
:
YHGestureTableView
=
{
let
tableView
=
YHGestureTableView
(
frame
:
.
zero
,
style
:
.
grouped
)
tableView
.
estimatedSectionHeaderHeight
=
1
00
tableView
.
estimatedSectionHeaderHeight
=
1
tableView
.
showsVerticalScrollIndicator
=
false
tableView
.
separatorStyle
=
.
none
tableView
.
delegate
=
self
...
...
@@ -24,6 +25,12 @@ class YHNameCardDynamicViewController: YHBaseViewController {
tableView
.
backgroundColor
=
.
clear
tableView
.
register
(
UITableViewCell
.
self
,
forCellReuseIdentifier
:
"UITableViewCell"
)
tableView
.
register
(
YHNameCardDynamicCell
.
self
,
forCellReuseIdentifier
:
YHNameCardDynamicCell
.
cellReuseIdentifier
)
tableView
.
es
.
addYHPullToRefresh
{
self
.
requestList
(
true
)
}
tableView
.
es
.
addInfiniteScrolling
{
self
.
requestList
(
false
)
}
return
tableView
}()
...
...
@@ -56,6 +63,21 @@ class YHNameCardDynamicViewController: YHBaseViewController {
make
.
width
.
equalTo
(
KScreenWidth
)
make
.
height
.
equalTo
(
149
)
}
requestList
(
true
)
}
func
requestList
(
_
firstPage
:
Bool
)
{
self
.
viewModel
.
getList
(
firstPage
)
{
_
,
_
in
self
.
arr
.
removeAll
()
self
.
arr
.
append
(
contentsOf
:
(
self
.
viewModel
.
dynamicArr
))
self
.
noDataView
.
isHidden
=
self
.
arr
.
count
>
0
self
.
tableView
.
reloadData
()
self
.
tableView
.
es
.
stopLoadingMore
()
self
.
tableView
.
es
.
stopPullToRefresh
()
if
!
self
.
viewModel
.
hasMore
{
self
.
tableView
.
es
.
noticeNoMoreData
()
}
}
}
func
addObserver
()
{
...
...
@@ -73,6 +95,10 @@ extension YHNameCardDynamicViewController: UITableViewDelegate, UITableViewDataS
func
tableView
(
_
tableView
:
UITableView
,
cellForRowAt
indexPath
:
IndexPath
)
->
UITableViewCell
{
guard
let
cell
=
tableView
.
dequeueReusableCell
(
withIdentifier
:
YHNameCardDynamicCell
.
cellReuseIdentifier
,
for
:
indexPath
)
as?
YHNameCardDynamicCell
else
{
return
UITableViewCell
()
}
if
0
<=
indexPath
.
row
,
indexPath
.
row
<
self
.
arr
.
count
{
let
model
=
self
.
arr
[
indexPath
.
row
]
cell
.
updateModel
(
model
)
}
return
cell
}
...
...
galaxy/galaxy/Classes/Modules/Mine(我的)/NameCard(名片)/C/YHNewNameCardViewController.swift
View file @
a1a7bb9c
...
...
@@ -445,7 +445,7 @@ class YHNewNameCardViewController: YHBaseViewController {
}
func
requestNameCardInfo
()
{
containerVC
.
freshData
()
containerVC
.
re
freshData
()
self
.
viewModel
.
getUserNameCardInfo
(
uid
:
self
.
userId
)
{
_
,
_
in
self
.
updateModel
()
...
...
galaxy/galaxy/Classes/Modules/Mine(我的)/NameCard(名片)/M/YHDynamicItem.swift
0 → 100644
View file @
a1a7bb9c
//
// YHDynamicListItem.swift
// galaxy
//
// Created by Dufet on 2025/9/30.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import
UIKit
import
SmartCodable
class
YHDynamicListModel
:
SmartCodable
{
var
total
:
Int
=
0
var
page
:
Int
=
0
var
pageSize
:
Int
=
0
var
list
:
[
YHDynamicItem
]
=
[]
required
init
()
{
}
}
class
YHResourceURLs
:
SmartCodable
{
var
name
:
String
=
""
var
url
:
String
=
""
var
type
:
Int
=
0
required
init
()
{
}
}
class
YHDynamicItem
:
SmartCodable
{
var
id
:
String
=
""
// 动态id
var
user_id
:
String
=
""
var
title
:
String
=
""
var
content
:
String
=
""
var
resource_urls
:
[
YHResourceURLs
]
=
[]
var
visibility
:
Int
=
0
// 0-未知 1-公开,2-好友可见,3-仅自己可见
var
audit_status
:
Int
=
0
// 0-未知 1-待审核,2-审核通过,3-不通过
var
ai_audit_status
:
Int
=
0
// 0-未知 1-待审核,2-审核通过,3-不通过
var
violation_reason
:
Int
=
0
// 违规原因 0-未知
var
status
:
Int
=
0
// 状态:0-未知 1-上架中 2-已下架
var
violation_remark
:
String
=
""
// 违规详情
var
ai_audit_remark
:
String
=
""
// ai审核依据
var
click_count
:
Int
=
0
var
like_count
:
Int
=
0
var
comment_count
:
Int
=
0
var
favorite_count
:
Int
=
0
var
nickname
:
String
=
""
var
avatar
:
String
=
""
var
position
:
String
=
""
var
release_time
:
String
=
""
var
format_release_time
:
String
=
""
var
is_self_posts
:
Int
=
0
// 是否是自己的动态
required
init
()
{
}
}
galaxy/galaxy/Classes/Modules/Mine(我的)/NameCard(名片)/V/YHNameCardDynamicCell.swift
View file @
a1a7bb9c
...
...
@@ -37,7 +37,6 @@ class YHNameCardDynamicCell: UITableViewCell {
label
.
font
=
UIFont
.
PFSC_B
(
ofSize
:
16
)
label
.
textColor
=
UIColor
.
brandGrayColor8
label
.
numberOfLines
=
2
label
.
text
=
"阿斯顿发水电费啦看手机代发拉卡手机打发啦刷卡机都发啦刷卡机都发啦刷卡机代发拉萨会计法阿斯顿发水电费啦看手机代发拉卡手机打发啦刷卡机都发啦刷卡机都发啦刷卡机代发拉萨会计法"
return
label
}()
...
...
@@ -46,31 +45,26 @@ class YHNameCardDynamicCell: UITableViewCell {
label
.
font
=
UIFont
.
PFSC_B
(
ofSize
:
16
)
label
.
textColor
=
UIColor
.
brandGrayColor8
label
.
numberOfLines
=
2
label
.
text
=
"阿斯顿发水电费啦看手机代发拉卡手机打发啦刷卡机都发啦刷卡机都发啦刷卡机代发拉萨会计法阿斯顿发水电费啦看手机代发拉卡手机打发啦刷卡机都发啦刷卡机都发啦刷卡机代发拉萨会计法"
return
label
}()
private
lazy
var
imgContentV
:
UIView
=
{
let
v
=
UIView
()
v
.
backgroundColor
=
.
red
return
v
}()
private
lazy
var
img1V
:
UIImageView
=
{
let
v
=
UIImageView
()
v
.
backgroundColor
=
.
green
return
v
}()
private
lazy
var
img2V
:
UIImageView
=
{
let
v
=
UIImageView
()
v
.
backgroundColor
=
.
blue
return
v
}()
private
lazy
var
img3V
:
UIImageView
=
{
let
v
=
UIImageView
()
v
.
backgroundColor
=
.
yellow
return
v
}()
...
...
@@ -90,7 +84,7 @@ class YHNameCardDynamicCell: UITableViewCell {
let
label
=
UILabel
()
label
.
numberOfLines
=
0
let
a
:
ASAttributedString
=
.
init
(
"审核不通过:"
,
.
font
(
UIFont
.
PFSC_M
(
ofSize
:
12
)),
.
foreground
(
UIColor
.
failColor
))
let
b
:
ASAttributedString
=
.
init
(
"
侵犯知识产权侵犯知识产权侵犯知识产权侵犯知识产权侵犯知识产权侵犯知识产权侵犯知识产权侵犯知识产权侵犯知识产权侵犯知识产权
"
,
.
font
(
UIFont
.
PFSC_R
(
ofSize
:
12
)),
.
foreground
(
UIColor
.
failColor
))
let
b
:
ASAttributedString
=
.
init
(
""
,
.
font
(
UIFont
.
PFSC_R
(
ofSize
:
12
)),
.
foreground
(
UIColor
.
failColor
))
label
.
attributed
.
text
=
a
+
b
return
label
}()
...
...
@@ -115,6 +109,27 @@ class YHNameCardDynamicCell: UITableViewCell {
setupUI
()
}
func
updateModel
(
_
model
:
YHDynamicItem
)
{
titleLabel
.
text
=
model
.
title
timeLabel
.
text
=
model
.
format_release_time
detailLabel
.
text
=
model
.
content
img1V
.
isHidden
=
model
.
resource_urls
.
count
<=
0
if
model
.
resource_urls
.
count
>
0
{
let
resource
=
model
.
resource_urls
[
0
]
img1V
.
sd_setImage
(
with
:
URL
(
string
:
resource
.
url
),
placeholderImage
:
UIImage
(
named
:
"global_default_image"
),
context
:
nil
)
}
img2V
.
isHidden
=
model
.
resource_urls
.
count
<=
1
if
model
.
resource_urls
.
count
>
1
{
let
resource
=
model
.
resource_urls
[
1
]
img2V
.
sd_setImage
(
with
:
URL
(
string
:
resource
.
url
),
placeholderImage
:
UIImage
(
named
:
"global_default_image"
),
context
:
nil
)
}
img3V
.
isHidden
=
model
.
resource_urls
.
count
<=
2
if
model
.
resource_urls
.
count
>
2
{
let
resource
=
model
.
resource_urls
[
2
]
img3V
.
sd_setImage
(
with
:
URL
(
string
:
resource
.
url
),
placeholderImage
:
UIImage
(
named
:
"global_default_image"
),
context
:
nil
)
}
}
func
setupUI
()
{
self
.
selectionStyle
=
.
none
...
...
galaxy/galaxy/Classes/Modules/Mine(我的)/NameCard(名片)/VM/YHDynamicViewModel.swift
0 → 100644
View file @
a1a7bb9c
//
// YHDynamicViewModel.swift
// galaxy
//
// Created by Dufet on 2025/9/30.
// Copyright © 2025 https://www.galaxy-immi.com. All rights reserved.
//
import
UIKit
class
YHDynamicViewModel
:
YHBaseViewModel
{
var
curPageIndex
:
Int
=
1
var
pageSize
=
10
var
totalCount
:
Int
=
0
var
dynamicArr
:
[
YHDynamicItem
]
=
[]
var
hasMore
:
Bool
=
true
func
getList
(
_
firstFlag
:
Bool
,
callBackBlock
:
@escaping
(
_
success
:
Bool
,
_
error
:
YHErrorModel
?)
->
Void
)
{
var
params
:
[
String
:
Any
]
=
[
"page"
:
curPageIndex
,
"page_size"
:
pageSize
]
if
firstFlag
{
curPageIndex
=
1
params
=
[
"page"
:
curPageIndex
,
"page_size"
:
pageSize
]
}
else
{
params
=
[
"page"
:
curPageIndex
+
1
,
"page_size"
:
pageSize
]
}
// source_type 0---全部用户评论列表 1-个人评论列表 2-他人评论列表
let
other_params
=
[
"source_type"
:
1
]
params
=
params
.
merging
(
other_params
)
{
(
_
,
new
)
in
new
}
let
strUrl
=
YHBaseUrlManager
.
shared
.
curURL
()
+
YHAllApiName
.
Dynamic
.
list
_
=
YHNetRequest
.
postRequest
(
url
:
strUrl
,
params
:
params
)
{
[
weak
self
]
json
,
_
in
guard
let
self
=
self
else
{
return
}
// 1. json字符串 转 对象
if
json
.
code
==
200
{
guard
let
dic
=
json
.
data
?
.
peel
as?
[
String
:
Any
],
let
result
=
YHDynamicListModel
.
deserialize
(
from
:
dic
)
else
{
callBackBlock
(
false
,
nil
)
return
}
if
firstFlag
{
self
.
totalCount
=
result
.
total
self
.
dynamicArr
.
removeAll
()
self
.
dynamicArr
=
result
.
list
}
else
{
self
.
dynamicArr
.
append
(
contentsOf
:
result
.
list
)
curPageIndex
+=
1
}
if
self
.
dynamicArr
.
count
>=
self
.
totalCount
{
self
.
hasMore
=
false
}
else
{
self
.
hasMore
=
true
}
callBackBlock
(
true
,
nil
)
}
else
{
let
error
:
YHErrorModel
=
YHErrorModel
(
errorCode
:
Int32
(
json
.
code
),
errorMsg
:
json
.
msg
)
callBackBlock
(
false
,
error
)
}
}
failBlock
:
{
err
in
callBackBlock
(
false
,
err
)
}
}
}
galaxy/galaxy/Classes/Tools/NetWork/YHAllApiName.swift
View file @
a1a7bb9c
...
...
@@ -779,8 +779,12 @@ class YHAllApiName {
static
let
getUsersig
=
"super-app/tencent/im/usersig"
}
//
//
人脉
struct
Contact
{
static
let
contactList
=
"super-app/business-card/list"
}
struct
Dynamic
{
static
let
list
=
"super-app/content/posts/list"
}
}
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