Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
K
kicad-source-mirror
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
Elphel
kicad-source-mirror
Commits
b9eca945
Commit
b9eca945
authored
Aug 05, 2010
by
Dick Hollenbeck
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Change Node() to node(), changed top level element from <netlist> to <export>, version 'D'
parent
22ddf0ad
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
54 additions
and
46 deletions
+54
-46
netform.cpp
eeschema/netform.cpp
+54
-46
No files found.
eeschema/netform.cpp
View file @
b9eca945
...
@@ -104,9 +104,11 @@ class EXPORT_HELP
...
@@ -104,9 +104,11 @@ class EXPORT_HELP
/// Used for "multi parts per package" components, avoids processing a lib component more than once.
/// Used for "multi parts per package" components, avoids processing a lib component more than once.
UNIQUE_STRINGS
m_ReferencesAlreadyFound
;
UNIQUE_STRINGS
m_ReferencesAlreadyFound
;
std
::
set
<
LIB_COMPONENT
*>
m_LibParts
;
///< unique library parts used
// share a code generated std::set<void*> to reduce code volume
std
::
set
<
CMP_LIBRARY
*>
m_Libraries
;
///< unique libraries used
std
::
set
<
void
*>
m_LibParts
;
///< unique library parts used
std
::
set
<
void
*>
m_Libraries
;
///< unique libraries used
/**
/**
...
@@ -538,13 +540,16 @@ SCH_COMPONENT* EXPORT_HELP::findNextComponentAndCreatPinList(
...
@@ -538,13 +540,16 @@ SCH_COMPONENT* EXPORT_HELP::findNextComponentAndCreatPinList(
/**
/**
* Function
N
ode
* Function
n
ode
* is a convenience function that creates a new wxXmlNode with an optional textual child.
* is a convenience function that creates a new wxXmlNode with an optional textual child.
* It also provides some insulation from a possible change in XML library. Compiler
* may or may not decide to inline this, its choice.
*
* @param aName is the name to associate with a new node of type wxXML_ELEMENT_NODE.
* @param aName is the name to associate with a new node of type wxXML_ELEMENT_NODE.
* @param aContent is optional, and if given is the text to include in a child
* @param aContent is optional, and if given is the text to include in a child
* of the returned node, and has type wxXML_TEXT_NODE.
* of the returned node, and has type wxXML_TEXT_NODE.
*/
*/
static
wxXmlNode
*
N
ode
(
const
wxString
&
aName
,
const
wxString
&
aTextualContent
=
wxEmptyString
)
static
wxXmlNode
*
n
ode
(
const
wxString
&
aName
,
const
wxString
&
aTextualContent
=
wxEmptyString
)
{
{
wxXmlNode
*
n
=
new
wxXmlNode
(
0
,
wxXML_ELEMENT_NODE
,
aName
);
wxXmlNode
*
n
=
new
wxXmlNode
(
0
,
wxXML_ELEMENT_NODE
,
aName
);
...
@@ -557,18 +562,18 @@ static wxXmlNode* Node( const wxString& aName, const wxString& aTextualContent =
...
@@ -557,18 +562,18 @@ static wxXmlNode* Node( const wxString& aName, const wxString& aTextualContent =
wxXmlNode
*
EXPORT_HELP
::
makeGenericDesignHeader
()
wxXmlNode
*
EXPORT_HELP
::
makeGenericDesignHeader
()
{
{
wxXmlNode
*
xdesign
=
N
ode
(
wxT
(
"design"
)
);
wxXmlNode
*
xdesign
=
n
ode
(
wxT
(
"design"
)
);
char
date
[
128
];
char
date
[
128
];
DateAndTime
(
date
);
DateAndTime
(
date
);
// the root sheet is a special sheet, call it source
// the root sheet is a special sheet, call it source
xdesign
->
AddChild
(
N
ode
(
wxT
(
"source"
),
g_RootSheet
->
m_AssociatedScreen
->
m_FileName
)
);
xdesign
->
AddChild
(
n
ode
(
wxT
(
"source"
),
g_RootSheet
->
m_AssociatedScreen
->
m_FileName
)
);
xdesign
->
AddChild
(
N
ode
(
wxT
(
"date"
),
CONV_FROM_UTF8
(
date
))
);
xdesign
->
AddChild
(
n
ode
(
wxT
(
"date"
),
CONV_FROM_UTF8
(
date
))
);
// which eeschema tool
// which eeschema tool
xdesign
->
AddChild
(
N
ode
(
wxT
(
"tool"
),
wxGetApp
().
GetAppName
()
+
wxChar
(
' '
)
+
GetBuildVersion
()
)
);
xdesign
->
AddChild
(
n
ode
(
wxT
(
"tool"
),
wxGetApp
().
GetAppName
()
+
wxChar
(
' '
)
+
GetBuildVersion
()
)
);
/* @todo might do a list of schematic pages
/* @todo might do a list of schematic pages
...
@@ -582,11 +587,12 @@ wxXmlNode* EXPORT_HELP::makeGenericDesignHeader()
...
@@ -582,11 +587,12 @@ wxXmlNode* EXPORT_HELP::makeGenericDesignHeader()
</comments>
</comments>
<pagesize/>
<pagesize/>
</page>
</page>
:
and a sheet hierarchy report here
and a sheet hierarchy report here
<sheets>
<sheets>
<sheet name="sheetname1" page="pagenameA">
<sheet name="sheetname1" page="pagenameA">
<sheet name="sheetname2" page="pagenameB"/>
<sheet name="sheetname2" page="pagenameB"/>
use recursion to output?
</sheet>
</sheet>
</sheets>
</sheets>
*/
*/
...
@@ -597,15 +603,16 @@ wxXmlNode* EXPORT_HELP::makeGenericDesignHeader()
...
@@ -597,15 +603,16 @@ wxXmlNode* EXPORT_HELP::makeGenericDesignHeader()
wxXmlNode
*
EXPORT_HELP
::
makeGenericLibraries
()
wxXmlNode
*
EXPORT_HELP
::
makeGenericLibraries
()
{
{
wxXmlNode
*
xlibs
=
N
ode
(
wxT
(
"libraries"
)
);
// auto_ptr
wxXmlNode
*
xlibs
=
n
ode
(
wxT
(
"libraries"
)
);
// auto_ptr
for
(
std
::
set
<
CMP_LIBRARY
*>::
iterator
it
=
m_Libraries
.
begin
();
it
!=
m_Libraries
.
end
();
++
it
)
for
(
std
::
set
<
void
*>::
iterator
it
=
m_Libraries
.
begin
();
it
!=
m_Libraries
.
end
();
++
it
)
{
{
wxXmlNode
*
xlibrary
;
CMP_LIBRARY
*
lib
=
(
CMP_LIBRARY
*
)
*
it
;
wxXmlNode
*
xlibrary
;
xlibs
->
AddChild
(
xlibrary
=
N
ode
(
wxT
(
"library"
)
)
);
xlibs
->
AddChild
(
xlibrary
=
n
ode
(
wxT
(
"library"
)
)
);
xlibrary
->
AddProperty
(
wxT
(
"logical"
),
(
*
it
)
->
GetLogicalName
()
);
xlibrary
->
AddProperty
(
wxT
(
"logical"
),
lib
->
GetLogicalName
()
);
xlibrary
->
AddChild
(
Node
(
wxT
(
"uri"
),
(
*
it
)
->
GetFullFileName
()
)
);
xlibrary
->
AddChild
(
node
(
wxT
(
"uri"
),
lib
->
GetFullFileName
()
)
);
// @todo: add more fun stuff here
// @todo: add more fun stuff here
}
}
...
@@ -616,7 +623,7 @@ wxXmlNode* EXPORT_HELP::makeGenericLibraries()
...
@@ -616,7 +623,7 @@ wxXmlNode* EXPORT_HELP::makeGenericLibraries()
wxXmlNode
*
EXPORT_HELP
::
makeGenericLibParts
()
wxXmlNode
*
EXPORT_HELP
::
makeGenericLibParts
()
{
{
wxXmlNode
*
xlibparts
=
N
ode
(
wxT
(
"libparts"
)
);
// auto_ptr
wxXmlNode
*
xlibparts
=
n
ode
(
wxT
(
"libparts"
)
);
// auto_ptr
wxString
sLibpart
=
wxT
(
"libpart"
);
wxString
sLibpart
=
wxT
(
"libpart"
);
wxString
sLib
=
wxT
(
"lib"
);
wxString
sLib
=
wxT
(
"lib"
);
wxString
sPart
=
wxT
(
"part"
);
wxString
sPart
=
wxT
(
"part"
);
...
@@ -635,23 +642,24 @@ wxXmlNode* EXPORT_HELP::makeGenericLibParts()
...
@@ -635,23 +642,24 @@ wxXmlNode* EXPORT_HELP::makeGenericLibParts()
m_Libraries
.
clear
();
m_Libraries
.
clear
();
for
(
std
::
set
<
LIB_COMPONENT
*>::
iterator
it
=
m_LibParts
.
begin
();
it
!=
m_LibParts
.
end
();
++
it
)
for
(
std
::
set
<
void
*>::
iterator
it
=
m_LibParts
.
begin
();
it
!=
m_LibParts
.
end
();
++
it
)
{
{
CMP_LIBRARY
*
library
=
(
*
it
)
->
GetLibrary
();
LIB_COMPONENT
*
lcomp
=
(
LIB_COMPONENT
*
)
*
it
;
CMP_LIBRARY
*
library
=
lcomp
->
GetLibrary
();
m_Libraries
.
insert
(
library
);
// inserts component's library iff unique
m_Libraries
.
insert
(
library
);
// inserts component's library iff unique
wxXmlNode
*
xlibpart
;
wxXmlNode
*
xlibpart
;
xlibparts
->
AddChild
(
xlibpart
=
N
ode
(
sLibpart
)
);
xlibparts
->
AddChild
(
xlibpart
=
n
ode
(
sLibpart
)
);
xlibpart
->
AddProperty
(
sLib
,
library
->
GetLogicalName
()
);
xlibpart
->
AddProperty
(
sLib
,
library
->
GetLogicalName
()
);
xlibpart
->
AddProperty
(
sPart
,
(
*
it
)
->
GetName
()
);
xlibpart
->
AddProperty
(
sPart
,
lcomp
->
GetName
()
);
//----- show the important properties -------------------------
//----- show the important properties -------------------------
if
(
!
(
*
it
)
->
GetDescription
().
IsEmpty
()
)
if
(
!
lcomp
->
GetDescription
().
IsEmpty
()
)
xlibpart
->
AddChild
(
Node
(
sDescr
,
(
*
it
)
->
GetDescription
()
)
);
xlibpart
->
AddChild
(
node
(
sDescr
,
lcomp
->
GetDescription
()
)
);
if
(
!
(
*
it
)
->
GetDocFileName
().
IsEmpty
()
)
if
(
!
lcomp
->
GetDocFileName
().
IsEmpty
()
)
xlibpart
->
AddChild
(
Node
(
sDocs
,
(
*
it
)
->
GetDocFileName
()
)
);
xlibpart
->
AddChild
(
node
(
sDocs
,
lcomp
->
GetDocFileName
()
)
);
// @todo show the footprints here.
// @todo show the footprints here.
// (*it)->m_FootprintList
// (*it)->m_FootprintList
...
@@ -659,24 +667,24 @@ wxXmlNode* EXPORT_HELP::makeGenericLibParts()
...
@@ -659,24 +667,24 @@ wxXmlNode* EXPORT_HELP::makeGenericLibParts()
//----- show the fields here ----------------------------------
//----- show the fields here ----------------------------------
fieldList
.
clear
();
fieldList
.
clear
();
(
*
it
)
->
GetFields
(
fieldList
);
lcomp
->
GetFields
(
fieldList
);
wxXmlNode
*
xfields
;
wxXmlNode
*
xfields
;
xlibpart
->
AddChild
(
xfields
=
N
ode
(
sFields
)
);
xlibpart
->
AddChild
(
xfields
=
n
ode
(
sFields
)
);
for
(
unsigned
i
=
0
;
i
<
fieldList
.
size
();
++
i
)
for
(
unsigned
i
=
0
;
i
<
fieldList
.
size
();
++
i
)
{
{
if
(
!
fieldList
[
i
].
m_Text
.
IsEmpty
()
)
if
(
!
fieldList
[
i
].
m_Text
.
IsEmpty
()
)
{
{
wxXmlNode
*
xfield
;
wxXmlNode
*
xfield
;
xfields
->
AddChild
(
xfield
=
N
ode
(
sField
,
fieldList
[
i
].
m_Text
)
);
xfields
->
AddChild
(
xfield
=
n
ode
(
sField
,
fieldList
[
i
].
m_Text
)
);
xfield
->
AddProperty
(
sName
,
fieldList
[
i
].
m_Name
);
xfield
->
AddProperty
(
sName
,
fieldList
[
i
].
m_Name
);
}
}
}
}
//----- show the pins here ------------------------------------
//----- show the pins here ------------------------------------
pinList
.
clear
();
pinList
.
clear
();
(
*
it
)
->
GetPins
(
pinList
,
0
,
0
);
lcomp
->
GetPins
(
pinList
,
0
,
0
);
// sort the pin list here?
// sort the pin list here?
...
@@ -684,12 +692,12 @@ wxXmlNode* EXPORT_HELP::makeGenericLibParts()
...
@@ -684,12 +692,12 @@ wxXmlNode* EXPORT_HELP::makeGenericLibParts()
{
{
wxXmlNode
*
pins
;
wxXmlNode
*
pins
;
xlibpart
->
AddChild
(
pins
=
N
ode
(
sPins
)
);
xlibpart
->
AddChild
(
pins
=
n
ode
(
sPins
)
);
for
(
unsigned
i
=
0
;
i
<
pinList
.
size
();
++
i
)
for
(
unsigned
i
=
0
;
i
<
pinList
.
size
();
++
i
)
{
{
wxXmlNode
*
pin
;
wxXmlNode
*
pin
;
pins
->
AddChild
(
pin
=
N
ode
(
sPin
)
);
pins
->
AddChild
(
pin
=
n
ode
(
sPin
)
);
pin
->
AddProperty
(
sNum
,
pinList
[
i
]
->
GetNumber
()
);
pin
->
AddProperty
(
sNum
,
pinList
[
i
]
->
GetNumber
()
);
// caution: construction work site here, drive slowly
// caution: construction work site here, drive slowly
...
@@ -703,7 +711,7 @@ wxXmlNode* EXPORT_HELP::makeGenericLibParts()
...
@@ -703,7 +711,7 @@ wxXmlNode* EXPORT_HELP::makeGenericLibParts()
wxXmlNode
*
EXPORT_HELP
::
makeGenericListOfNets
()
wxXmlNode
*
EXPORT_HELP
::
makeGenericListOfNets
()
{
{
wxXmlNode
*
xnets
=
N
ode
(
wxT
(
"nets"
)
);
// auto_ptr if exceptions ever get used.
wxXmlNode
*
xnets
=
n
ode
(
wxT
(
"nets"
)
);
// auto_ptr if exceptions ever get used.
wxString
netCodeTxt
;
wxString
netCodeTxt
;
wxString
netName
;
wxString
netName
;
wxString
ref
;
wxString
ref
;
...
@@ -771,14 +779,14 @@ wxXmlNode* EXPORT_HELP::makeGenericListOfNets()
...
@@ -771,14 +779,14 @@ wxXmlNode* EXPORT_HELP::makeGenericListOfNets()
if
(
++
sameNetcodeCount
==
1
)
if
(
++
sameNetcodeCount
==
1
)
{
{
xnets
->
AddChild
(
xnet
=
N
ode
(
sNet
)
);
xnets
->
AddChild
(
xnet
=
n
ode
(
sNet
)
);
netCodeTxt
.
Printf
(
sFmtd
,
netCode
);
netCodeTxt
.
Printf
(
sFmtd
,
netCode
);
xnet
->
AddProperty
(
sCode
,
netCodeTxt
);
xnet
->
AddProperty
(
sCode
,
netCodeTxt
);
xnet
->
AddProperty
(
sName
,
netName
);
xnet
->
AddProperty
(
sName
,
netName
);
}
}
wxXmlNode
*
xnode
;
wxXmlNode
*
xnode
;
xnet
->
AddChild
(
xnode
=
N
ode
(
sNode
)
);
xnet
->
AddChild
(
xnode
=
n
ode
(
sNode
)
);
xnode
->
AddProperty
(
sRef
,
ref
);
xnode
->
AddProperty
(
sRef
,
ref
);
xnode
->
AddProperty
(
sPin
,
nitem
->
GetPinNumText
()
);
xnode
->
AddProperty
(
sPin
,
nitem
->
GetPinNumText
()
);
}
}
...
@@ -830,13 +838,13 @@ bool EXPORT_HELP::Write_GENERIC_NetList( WinEDA_SchematicFrame* frame, const wxS
...
@@ -830,13 +838,13 @@ bool EXPORT_HELP::Write_GENERIC_NetList( WinEDA_SchematicFrame* frame, const wxS
m_ReferencesAlreadyFound
.
Clear
();
m_ReferencesAlreadyFound
.
Clear
();
xdoc
.
SetRoot
(
xroot
=
Node
(
wxT
(
"netlis
t"
)
)
);
xdoc
.
SetRoot
(
xroot
=
node
(
wxT
(
"expor
t"
)
)
);
xroot
->
AddProperty
(
wxT
(
"version"
),
wxT
(
"
C
"
)
);
xroot
->
AddProperty
(
wxT
(
"version"
),
wxT
(
"
D
"
)
);
// add the "design" header
// add the "design" header
xroot
->
AddChild
(
makeGenericDesignHeader
()
);
xroot
->
AddChild
(
makeGenericDesignHeader
()
);
xroot
->
AddChild
(
xcomps
=
N
ode
(
wxT
(
"components"
)
)
);
xroot
->
AddChild
(
xcomps
=
n
ode
(
wxT
(
"components"
)
)
);
SCH_SHEET_LIST
sheetList
;
SCH_SHEET_LIST
sheetList
;
...
@@ -860,16 +868,16 @@ bool EXPORT_HELP::Write_GENERIC_NetList( WinEDA_SchematicFrame* frame, const wxS
...
@@ -860,16 +868,16 @@ bool EXPORT_HELP::Write_GENERIC_NetList( WinEDA_SchematicFrame* frame, const wxS
// under XSL processing systems which do sequential searching within
// under XSL processing systems which do sequential searching within
// an element.
// an element.
xcomps
->
AddChild
(
xcomp
=
N
ode
(
sComponent
)
);
xcomps
->
AddChild
(
xcomp
=
n
ode
(
sComponent
)
);
xcomp
->
AddProperty
(
sRef
,
comp
->
GetRef
(
path
)
);
xcomp
->
AddProperty
(
sRef
,
comp
->
GetRef
(
path
)
);
xcomp
->
AddChild
(
N
ode
(
sValue
,
comp
->
GetField
(
VALUE
)
->
m_Text
)
);
xcomp
->
AddChild
(
n
ode
(
sValue
,
comp
->
GetField
(
VALUE
)
->
m_Text
)
);
if
(
!
comp
->
GetField
(
FOOTPRINT
)
->
m_Text
.
IsEmpty
()
)
if
(
!
comp
->
GetField
(
FOOTPRINT
)
->
m_Text
.
IsEmpty
()
)
xcomp
->
AddChild
(
N
ode
(
sFootprint
,
comp
->
GetField
(
FOOTPRINT
)
->
m_Text
)
);
xcomp
->
AddChild
(
n
ode
(
sFootprint
,
comp
->
GetField
(
FOOTPRINT
)
->
m_Text
)
);
if
(
!
comp
->
GetField
(
DATASHEET
)
->
m_Text
.
IsEmpty
()
)
if
(
!
comp
->
GetField
(
DATASHEET
)
->
m_Text
.
IsEmpty
()
)
xcomp
->
AddChild
(
N
ode
(
sDatasheet
,
comp
->
GetField
(
DATASHEET
)
->
m_Text
)
);
xcomp
->
AddChild
(
n
ode
(
sDatasheet
,
comp
->
GetField
(
DATASHEET
)
->
m_Text
)
);
// Export all user defined fields within the component,
// Export all user defined fields within the component,
// which start at field index MANDATORY_FIELDS. Only output the <fields>
// which start at field index MANDATORY_FIELDS. Only output the <fields>
...
@@ -877,7 +885,7 @@ bool EXPORT_HELP::Write_GENERIC_NetList( WinEDA_SchematicFrame* frame, const wxS
...
@@ -877,7 +885,7 @@ bool EXPORT_HELP::Write_GENERIC_NetList( WinEDA_SchematicFrame* frame, const wxS
if
(
comp
->
GetFieldCount
()
>
MANDATORY_FIELDS
)
if
(
comp
->
GetFieldCount
()
>
MANDATORY_FIELDS
)
{
{
wxXmlNode
*
xfields
;
wxXmlNode
*
xfields
;
xcomp
->
AddChild
(
xfields
=
N
ode
(
sFields
)
);
xcomp
->
AddChild
(
xfields
=
n
ode
(
sFields
)
);
for
(
int
fldNdx
=
MANDATORY_FIELDS
;
fldNdx
<
comp
->
GetFieldCount
();
++
fldNdx
)
for
(
int
fldNdx
=
MANDATORY_FIELDS
;
fldNdx
<
comp
->
GetFieldCount
();
++
fldNdx
)
{
{
...
@@ -887,14 +895,14 @@ bool EXPORT_HELP::Write_GENERIC_NetList( WinEDA_SchematicFrame* frame, const wxS
...
@@ -887,14 +895,14 @@ bool EXPORT_HELP::Write_GENERIC_NetList( WinEDA_SchematicFrame* frame, const wxS
if
(
!
f
->
m_Text
.
IsEmpty
()
)
if
(
!
f
->
m_Text
.
IsEmpty
()
)
{
{
wxXmlNode
*
xfield
;
wxXmlNode
*
xfield
;
xfields
->
AddChild
(
xfield
=
N
ode
(
sField
,
f
->
m_Text
)
);
xfields
->
AddChild
(
xfield
=
n
ode
(
sField
,
f
->
m_Text
)
);
xfield
->
AddProperty
(
sName
,
f
->
m_Name
);
xfield
->
AddProperty
(
sName
,
f
->
m_Name
);
}
}
}
}
}
}
wxXmlNode
*
xlibsource
;
wxXmlNode
*
xlibsource
;
xcomp
->
AddChild
(
xlibsource
=
N
ode
(
sLibSource
)
);
xcomp
->
AddChild
(
xlibsource
=
n
ode
(
sLibSource
)
);
// "logical" library name, which is in anticipation of a better search
// "logical" library name, which is in anticipation of a better search
// algorithm for parts based on "logical_lib.part" and where logical_lib
// algorithm for parts based on "logical_lib.part" and where logical_lib
...
@@ -905,12 +913,12 @@ bool EXPORT_HELP::Write_GENERIC_NetList( WinEDA_SchematicFrame* frame, const wxS
...
@@ -905,12 +913,12 @@ bool EXPORT_HELP::Write_GENERIC_NetList( WinEDA_SchematicFrame* frame, const wxS
xlibsource
->
AddProperty
(
sPart
,
comp
->
m_ChipName
);
xlibsource
->
AddProperty
(
sPart
,
comp
->
m_ChipName
);
wxXmlNode
*
xsheetpath
;
wxXmlNode
*
xsheetpath
;
xcomp
->
AddChild
(
xsheetpath
=
Node
(
sSheetPath
)
);
xcomp
->
AddChild
(
xsheetpath
=
node
(
sSheetPath
)
);
xsheetpath
->
AddProperty
(
sTStamps
,
path
->
Path
()
);
xsheetpath
->
AddProperty
(
sNames
,
path
->
PathHumanReadable
()
);
xsheetpath
->
AddProperty
(
sNames
,
path
->
PathHumanReadable
()
);
xsheetpath
->
AddProperty
(
sTStamps
,
path
->
Path
()
);
timeStamp
.
Printf
(
sTSFmt
,
comp
->
m_TimeStamp
);
timeStamp
.
Printf
(
sTSFmt
,
comp
->
m_TimeStamp
);
xcomp
->
AddChild
(
N
ode
(
sTStamp
,
timeStamp
)
);
xcomp
->
AddChild
(
n
ode
(
sTStamp
,
timeStamp
)
);
}
}
}
}
...
...
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