Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
3f91517e
Commit
3f91517e
authored
Oct 08, 1996
by
Fred Drake
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
(libsgmllib.tex): Revised documentation for SGML support.
parent
7e7e1638
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
152 additions
and
58 deletions
+152
-58
Doc/lib/libsgmllib.tex
Doc/lib/libsgmllib.tex
+76
-29
Doc/libsgmllib.tex
Doc/libsgmllib.tex
+76
-29
No files found.
Doc/lib/libsgmllib.tex
View file @
3f91517e
...
@@ -12,7 +12,7 @@ exists as a basis for the \code{htmllib} module.
...
@@ -12,7 +12,7 @@ exists as a basis for the \code{htmllib} module.
\stmodindex
{
htmllib
}
\stmodindex
{
htmllib
}
In particular, the parser is hardcoded to recognize the following
In particular, the parser is hardcoded to recognize the following
elemen
ts:
construc
ts:
\begin{itemize}
\begin{itemize}
...
@@ -22,13 +22,15 @@ Opening and closing tags of the form
...
@@ -22,13 +22,15 @@ Opening and closing tags of the form
``
\code
{
</
\var
{
tag
}
>
}
'', respectively.
``
\code
{
</
\var
{
tag
}
>
}
'', respectively.
\item
\item
C
haracter references of the form ``
\code
{
\&\#\var
{
name
}
;
}
''.
Numeric c
haracter references of the form ``
\code
{
\&\#\var
{
name
}
;
}
''.
\item
\item
Entity references of the form ``
\code
{
\&\var
{
name
}
;
}
''.
Entity references of the form ``
\code
{
\&\var
{
name
}
;
}
''.
\item
\item
SGML comments of the form ``
\code
{
<!--
\var
{
text
}
>
}
''.
SGML comments of the form ``
\code
{
<!--
\var
{
text
}
-->
}
''. Note that
spaces, tabs, and newlines are allowed between the trailing
``
\code
{
>
}
'' and the immediately preceeding ``
\code
{
--
}
''.
\end{itemize}
\end{itemize}
...
@@ -63,41 +65,83 @@ define additional processing at the end of the input, but the
...
@@ -63,41 +65,83 @@ define additional processing at the end of the input, but the
redefined version should always call
\code
{
SGMLParser.close()
}
.
redefined version should always call
\code
{
SGMLParser.close()
}
.
\end{funcdesc}
\end{funcdesc}
\begin{funcdesc}
{
handle
_
starttag
}{
tag
\,
method
\,
attributes
}
This method is called to handle start tags for which either a
\code
{
start
_
\var
{
tag
}
()
}
or
\code
{
do
_
\var
{
tag
}
()
}
method has been
defined. The
\code
{
tag
}
argument is the name of the tag converted to
lower case, and the
\code
{
method
}
argument is the bound method which
should be used to support semantic interpretation of the start tag.
The
\var
{
attributes
}
argument is a list of (
\var
{
name
}
,
\var
{
value
}
)
pairs containing the attributes found inside the tag's
\code
{
<>
}
brackets. The
\var
{
name
}
has been translated to lower case and double
quotes and backslashes in the
\var
{
value
}
have been interpreted. For
instance, for the tag
\code
{
<A HREF="http://www.cwi.nl/">
}
, this
method would be called as
\code
{
unknown
_
starttag('a', [('href',
'http://www.cwi.nl/')])
}
. The base implementation simply calls
\code
{
method
}
with
\code
{
attributes
}
as the only argument.
\end{funcdesc}
\begin{funcdesc}
{
handle
_
endtag
}{
tag
\,
method
}
This method is called to handle endtags for which an
\code
{
end
_
\var
{
tag
}
()
}
method has been defined. The
\code
{
tag
}
argument is the name of the tag converted to lower case, and the
\code
{
method
}
argument is the bound method which should be used to
support semantic interpretation of the end tag. If no
\code
{
end
_
\var
{
tag
}
()
}
method is defined for the closing element, this
handler is not called. The base implementation simply calls
\code
{
method
}
.
\end{funcdesc}
\begin{funcdesc}
{
handle
_
data
}{
data
}
This method is called to process arbitrary data. It is intended to be
overridden by a derived class; the base class implementation does
nothing.
\end{funcdesc}
\begin{funcdesc}
{
handle
_
charref
}{
ref
}
\begin{funcdesc}
{
handle
_
charref
}{
ref
}
This method is called to process a character reference of the form
This method is called to process a character reference of the form
``
\code
{
\&\#\var
{
ref
}
;
}
'' where
\var
{
ref
}
is a decimal number in the
``
\code
{
\&\#\var
{
ref
}
;
}
''. In the base implementation,
\var
{
ref
}
must
be a decimal number in the
range 0-255. It translates the character to
\ASCII
{}
and calls the
range 0-255. It translates the character to
\ASCII
{}
and calls the
method
\code
{
handle
_
data()
}
with the character as argument. If
method
\code
{
handle
_
data()
}
with the character as argument. If
\var
{
ref
}
is invalid or out of range, the method
\var
{
ref
}
is invalid or out of range, the method
\code
{
unknown
_
charref(
\var
{
ref
}
)
}
is called instead.
\code
{
unknown
_
charref(
\var
{
ref
}
)
}
is called to handle the error. A
subclass must override this method to provide support for named
character entities.
\end{funcdesc}
\end{funcdesc}
\begin{funcdesc}
{
handle
_
entityref
}{
ref
}
\begin{funcdesc}
{
handle
_
entityref
}{
ref
}
This method is called to process a
n
entity reference of the form
This method is called to process a
general
entity reference of the form
``
\code
{
\&\var
{
ref
}
;
}
'' where
\var
{
ref
}
is an
alphabetic
entity
``
\code
{
\&\var
{
ref
}
;
}
'' where
\var
{
ref
}
is an
general
entity
reference. It looks for
\var
{
ref
}
in the instance (or class)
reference. It looks for
\var
{
ref
}
in the instance (or class)
variable
\code
{
entitydefs
}
which should give the entity's translation.
variable
\code
{
entitydefs
}
which should be a mapping from entity names
to corresponding translations.
If a translation is found, it calls the method
\code
{
handle
_
data()
}
If a translation is found, it calls the method
\code
{
handle
_
data()
}
with the translation; otherwise, it calls the method
with the translation; otherwise, it calls the method
\code
{
unknown
_
entityref(
\var
{
ref
}
)
}
.
\code
{
unknown
_
entityref(
\var
{
ref
}
)
}
. The default
\code
{
entitydefs
}
defines translations for
\code
{
\&
amp;
}
,
\code
{
\&
apos
}
,
\code
{
\&
gt;
}
,
\code
{
\&
lt;
}
, and
\code
{
\&
quot;
}
.
\end{funcdesc}
\end{funcdesc}
\begin{funcdesc}
{
handle
_
data
}{
data
}
\begin{funcdesc}
{
handle
_
comment
}{
comment
}
This method is called to process arbitrary data. It is intended to be
This method is called when a comment is encountered. The
overridden by a derived class; the base class implementation does
\code
{
comment
}
argument is a string containing the text between the
nothing.
``
\code
{
<!--
}
'' and ``
\code
{
-->
}
'' delimiters, but not the delimiters
themselves. For example, the comment ``
\code
{
<!--text-->
}
'' will
cause this method to be called with the argument
\code
{
'text'
}
. The
default method does nothing.
\end{funcdesc}
\begin{funcdesc}
{
report
_
unbalanced
}{
tag
}
This method is called when an end tag is found which does not
correspond to any open element.
\end{funcdesc}
\end{funcdesc}
\begin{funcdesc}
{
unknown
_
starttag
}{
tag
\,
attributes
}
\begin{funcdesc}
{
unknown
_
starttag
}{
tag
\,
attributes
}
This method is called to process an unknown start tag. It is intended
This method is called to process an unknown start tag. It is intended
to be overridden by a derived class; the base class implementation
to be overridden by a derived class; the base class implementation
does nothing. The
\var
{
attributes
}
argument is a list of
does nothing.
(
\var
{
name
}
,
\var
{
value
}
) pairs containing the attributes found inside
the tag's
\code
{
<>
}
brackets. The
\var
{
name
}
has been translated to
lower case and double quotes and backslashes in the
\var
{
value
}
have
been interpreted. For instance, for the tag
\code
{
<A HREF="http://www.cwi.nl/">
}
, this method would be
called as
\code
{
unknown
_
starttag('a', [('href', 'http://www.cwi.nl/')])
}
.
\end{funcdesc}
\end{funcdesc}
\begin{funcdesc}
{
unknown
_
endtag
}{
tag
}
\begin{funcdesc}
{
unknown
_
endtag
}{
tag
}
...
@@ -107,9 +151,9 @@ does nothing.
...
@@ -107,9 +151,9 @@ does nothing.
\end{funcdesc}
\end{funcdesc}
\begin{funcdesc}
{
unknown
_
charref
}{
ref
}
\begin{funcdesc}
{
unknown
_
charref
}{
ref
}
This method is called to process
an unknown character reference. It
This method is called to process
unresolvable numeric character
is intended to be overridden by a derived class; the base class
references. It is intended to be overridden by a derived class; the
implementation does nothing.
base class
implementation does nothing.
\end{funcdesc}
\end{funcdesc}
\begin{funcdesc}
{
unknown
_
entityref
}{
ref
}
\begin{funcdesc}
{
unknown
_
entityref
}{
ref
}
...
@@ -127,22 +171,25 @@ case:
...
@@ -127,22 +171,25 @@ case:
\begin{funcdesc}
{
start
_
\var
{
tag
}}{
attributes
}
\begin{funcdesc}
{
start
_
\var
{
tag
}}{
attributes
}
This method is called to process an opening tag
\var
{
tag
}
. It has
This method is called to process an opening tag
\var
{
tag
}
. It has
preference over
\code
{
do
_
\var
{
tag
}
()
}
. The
\var
{
attributes
}
argument
preference over
\code
{
do
_
\var
{
tag
}
()
}
. The
\var
{
attributes
}
argument
has the same meaning as described for
\code
{
unknown
_
tag()
}
above.
has the same meaning as described for
\code
{
handle
_
start
tag()
}
above.
\end{funcdesc}
\end{funcdesc}
\begin{funcdesc}
{
do
_
\var
{
tag
}}{
attributes
}
\begin{funcdesc}
{
do
_
\var
{
tag
}}{
attributes
}
This method is called to process an opening tag
\var
{
tag
}
that does
This method is called to process an opening tag
\var
{
tag
}
that does
not come with a matching closing tag. The
\var
{
attributes
}
argument
not come with a matching closing tag. The
\var
{
attributes
}
argument
has the same meaning as described for
\code
{
unknown
_
tag()
}
above.
has the same meaning as described for
\code
{
handle
_
start
tag()
}
above.
\end{funcdesc}
\end{funcdesc}
\begin{funcdesc}
{
end
_
\var
{
tag
}}{}
\begin{funcdesc}
{
end
_
\var
{
tag
}}{}
This method is called to process a closing tag
\var
{
tag
}
.
This method is called to process a closing tag
\var
{
tag
}
.
\end{funcdesc}
\end{funcdesc}
Note that the parser maintains a stack of open
ing tag
s for which no
Note that the parser maintains a stack of open
element
s for which no
matching closing
tag has been found yet. Only tags processed by
end
tag has been found yet. Only tags processed by
\code
{
start
_
\var
{
tag
}
()
}
are pushed on this stack. Definition of a
\code
{
start
_
\var
{
tag
}
()
}
are pushed on this stack. Definition of a
n
\code
{
end
_
\var
{
tag
}
()
}
method is optional for these tags. For tags
\code
{
end
_
\var
{
tag
}
()
}
method is optional for these tags. For tags
processed by
\code
{
do
_
\var
{
tag
}
()
}
or by
\code
{
unknown
_
tag()
}
, no
processed by
\code
{
do
_
\var
{
tag
}
()
}
or by
\code
{
unknown
_
tag()
}
, no
\code
{
end
_
\var
{
tag
}
()
}
method must be defined.
\code
{
end
_
\var
{
tag
}
()
}
method must be defined; if defined, it will not
be used. If both
\code
{
start
_
\var
{
tag
}
()
}
and
\code
{
do
_
\var
{
tag
}
()
}
methods exist for a tag, the
\code
{
start
_
\var
{
tag
}
()
}
method takes
precedence.
Doc/libsgmllib.tex
View file @
3f91517e
...
@@ -12,7 +12,7 @@ exists as a basis for the \code{htmllib} module.
...
@@ -12,7 +12,7 @@ exists as a basis for the \code{htmllib} module.
\stmodindex
{
htmllib
}
\stmodindex
{
htmllib
}
In particular, the parser is hardcoded to recognize the following
In particular, the parser is hardcoded to recognize the following
elemen
ts:
construc
ts:
\begin{itemize}
\begin{itemize}
...
@@ -22,13 +22,15 @@ Opening and closing tags of the form
...
@@ -22,13 +22,15 @@ Opening and closing tags of the form
``
\code
{
</
\var
{
tag
}
>
}
'', respectively.
``
\code
{
</
\var
{
tag
}
>
}
'', respectively.
\item
\item
C
haracter references of the form ``
\code
{
\&\#\var
{
name
}
;
}
''.
Numeric c
haracter references of the form ``
\code
{
\&\#\var
{
name
}
;
}
''.
\item
\item
Entity references of the form ``
\code
{
\&\var
{
name
}
;
}
''.
Entity references of the form ``
\code
{
\&\var
{
name
}
;
}
''.
\item
\item
SGML comments of the form ``
\code
{
<!--
\var
{
text
}
>
}
''.
SGML comments of the form ``
\code
{
<!--
\var
{
text
}
-->
}
''. Note that
spaces, tabs, and newlines are allowed between the trailing
``
\code
{
>
}
'' and the immediately preceeding ``
\code
{
--
}
''.
\end{itemize}
\end{itemize}
...
@@ -63,41 +65,83 @@ define additional processing at the end of the input, but the
...
@@ -63,41 +65,83 @@ define additional processing at the end of the input, but the
redefined version should always call
\code
{
SGMLParser.close()
}
.
redefined version should always call
\code
{
SGMLParser.close()
}
.
\end{funcdesc}
\end{funcdesc}
\begin{funcdesc}
{
handle
_
starttag
}{
tag
\,
method
\,
attributes
}
This method is called to handle start tags for which either a
\code
{
start
_
\var
{
tag
}
()
}
or
\code
{
do
_
\var
{
tag
}
()
}
method has been
defined. The
\code
{
tag
}
argument is the name of the tag converted to
lower case, and the
\code
{
method
}
argument is the bound method which
should be used to support semantic interpretation of the start tag.
The
\var
{
attributes
}
argument is a list of (
\var
{
name
}
,
\var
{
value
}
)
pairs containing the attributes found inside the tag's
\code
{
<>
}
brackets. The
\var
{
name
}
has been translated to lower case and double
quotes and backslashes in the
\var
{
value
}
have been interpreted. For
instance, for the tag
\code
{
<A HREF="http://www.cwi.nl/">
}
, this
method would be called as
\code
{
unknown
_
starttag('a', [('href',
'http://www.cwi.nl/')])
}
. The base implementation simply calls
\code
{
method
}
with
\code
{
attributes
}
as the only argument.
\end{funcdesc}
\begin{funcdesc}
{
handle
_
endtag
}{
tag
\,
method
}
This method is called to handle endtags for which an
\code
{
end
_
\var
{
tag
}
()
}
method has been defined. The
\code
{
tag
}
argument is the name of the tag converted to lower case, and the
\code
{
method
}
argument is the bound method which should be used to
support semantic interpretation of the end tag. If no
\code
{
end
_
\var
{
tag
}
()
}
method is defined for the closing element, this
handler is not called. The base implementation simply calls
\code
{
method
}
.
\end{funcdesc}
\begin{funcdesc}
{
handle
_
data
}{
data
}
This method is called to process arbitrary data. It is intended to be
overridden by a derived class; the base class implementation does
nothing.
\end{funcdesc}
\begin{funcdesc}
{
handle
_
charref
}{
ref
}
\begin{funcdesc}
{
handle
_
charref
}{
ref
}
This method is called to process a character reference of the form
This method is called to process a character reference of the form
``
\code
{
\&\#\var
{
ref
}
;
}
'' where
\var
{
ref
}
is a decimal number in the
``
\code
{
\&\#\var
{
ref
}
;
}
''. In the base implementation,
\var
{
ref
}
must
be a decimal number in the
range 0-255. It translates the character to
\ASCII
{}
and calls the
range 0-255. It translates the character to
\ASCII
{}
and calls the
method
\code
{
handle
_
data()
}
with the character as argument. If
method
\code
{
handle
_
data()
}
with the character as argument. If
\var
{
ref
}
is invalid or out of range, the method
\var
{
ref
}
is invalid or out of range, the method
\code
{
unknown
_
charref(
\var
{
ref
}
)
}
is called instead.
\code
{
unknown
_
charref(
\var
{
ref
}
)
}
is called to handle the error. A
subclass must override this method to provide support for named
character entities.
\end{funcdesc}
\end{funcdesc}
\begin{funcdesc}
{
handle
_
entityref
}{
ref
}
\begin{funcdesc}
{
handle
_
entityref
}{
ref
}
This method is called to process a
n
entity reference of the form
This method is called to process a
general
entity reference of the form
``
\code
{
\&\var
{
ref
}
;
}
'' where
\var
{
ref
}
is an
alphabetic
entity
``
\code
{
\&\var
{
ref
}
;
}
'' where
\var
{
ref
}
is an
general
entity
reference. It looks for
\var
{
ref
}
in the instance (or class)
reference. It looks for
\var
{
ref
}
in the instance (or class)
variable
\code
{
entitydefs
}
which should give the entity's translation.
variable
\code
{
entitydefs
}
which should be a mapping from entity names
to corresponding translations.
If a translation is found, it calls the method
\code
{
handle
_
data()
}
If a translation is found, it calls the method
\code
{
handle
_
data()
}
with the translation; otherwise, it calls the method
with the translation; otherwise, it calls the method
\code
{
unknown
_
entityref(
\var
{
ref
}
)
}
.
\code
{
unknown
_
entityref(
\var
{
ref
}
)
}
. The default
\code
{
entitydefs
}
defines translations for
\code
{
\&
amp;
}
,
\code
{
\&
apos
}
,
\code
{
\&
gt;
}
,
\code
{
\&
lt;
}
, and
\code
{
\&
quot;
}
.
\end{funcdesc}
\end{funcdesc}
\begin{funcdesc}
{
handle
_
data
}{
data
}
\begin{funcdesc}
{
handle
_
comment
}{
comment
}
This method is called to process arbitrary data. It is intended to be
This method is called when a comment is encountered. The
overridden by a derived class; the base class implementation does
\code
{
comment
}
argument is a string containing the text between the
nothing.
``
\code
{
<!--
}
'' and ``
\code
{
-->
}
'' delimiters, but not the delimiters
themselves. For example, the comment ``
\code
{
<!--text-->
}
'' will
cause this method to be called with the argument
\code
{
'text'
}
. The
default method does nothing.
\end{funcdesc}
\begin{funcdesc}
{
report
_
unbalanced
}{
tag
}
This method is called when an end tag is found which does not
correspond to any open element.
\end{funcdesc}
\end{funcdesc}
\begin{funcdesc}
{
unknown
_
starttag
}{
tag
\,
attributes
}
\begin{funcdesc}
{
unknown
_
starttag
}{
tag
\,
attributes
}
This method is called to process an unknown start tag. It is intended
This method is called to process an unknown start tag. It is intended
to be overridden by a derived class; the base class implementation
to be overridden by a derived class; the base class implementation
does nothing. The
\var
{
attributes
}
argument is a list of
does nothing.
(
\var
{
name
}
,
\var
{
value
}
) pairs containing the attributes found inside
the tag's
\code
{
<>
}
brackets. The
\var
{
name
}
has been translated to
lower case and double quotes and backslashes in the
\var
{
value
}
have
been interpreted. For instance, for the tag
\code
{
<A HREF="http://www.cwi.nl/">
}
, this method would be
called as
\code
{
unknown
_
starttag('a', [('href', 'http://www.cwi.nl/')])
}
.
\end{funcdesc}
\end{funcdesc}
\begin{funcdesc}
{
unknown
_
endtag
}{
tag
}
\begin{funcdesc}
{
unknown
_
endtag
}{
tag
}
...
@@ -107,9 +151,9 @@ does nothing.
...
@@ -107,9 +151,9 @@ does nothing.
\end{funcdesc}
\end{funcdesc}
\begin{funcdesc}
{
unknown
_
charref
}{
ref
}
\begin{funcdesc}
{
unknown
_
charref
}{
ref
}
This method is called to process
an unknown character reference. It
This method is called to process
unresolvable numeric character
is intended to be overridden by a derived class; the base class
references. It is intended to be overridden by a derived class; the
implementation does nothing.
base class
implementation does nothing.
\end{funcdesc}
\end{funcdesc}
\begin{funcdesc}
{
unknown
_
entityref
}{
ref
}
\begin{funcdesc}
{
unknown
_
entityref
}{
ref
}
...
@@ -127,22 +171,25 @@ case:
...
@@ -127,22 +171,25 @@ case:
\begin{funcdesc}
{
start
_
\var
{
tag
}}{
attributes
}
\begin{funcdesc}
{
start
_
\var
{
tag
}}{
attributes
}
This method is called to process an opening tag
\var
{
tag
}
. It has
This method is called to process an opening tag
\var
{
tag
}
. It has
preference over
\code
{
do
_
\var
{
tag
}
()
}
. The
\var
{
attributes
}
argument
preference over
\code
{
do
_
\var
{
tag
}
()
}
. The
\var
{
attributes
}
argument
has the same meaning as described for
\code
{
unknown
_
tag()
}
above.
has the same meaning as described for
\code
{
handle
_
start
tag()
}
above.
\end{funcdesc}
\end{funcdesc}
\begin{funcdesc}
{
do
_
\var
{
tag
}}{
attributes
}
\begin{funcdesc}
{
do
_
\var
{
tag
}}{
attributes
}
This method is called to process an opening tag
\var
{
tag
}
that does
This method is called to process an opening tag
\var
{
tag
}
that does
not come with a matching closing tag. The
\var
{
attributes
}
argument
not come with a matching closing tag. The
\var
{
attributes
}
argument
has the same meaning as described for
\code
{
unknown
_
tag()
}
above.
has the same meaning as described for
\code
{
handle
_
start
tag()
}
above.
\end{funcdesc}
\end{funcdesc}
\begin{funcdesc}
{
end
_
\var
{
tag
}}{}
\begin{funcdesc}
{
end
_
\var
{
tag
}}{}
This method is called to process a closing tag
\var
{
tag
}
.
This method is called to process a closing tag
\var
{
tag
}
.
\end{funcdesc}
\end{funcdesc}
Note that the parser maintains a stack of open
ing tag
s for which no
Note that the parser maintains a stack of open
element
s for which no
matching closing
tag has been found yet. Only tags processed by
end
tag has been found yet. Only tags processed by
\code
{
start
_
\var
{
tag
}
()
}
are pushed on this stack. Definition of a
\code
{
start
_
\var
{
tag
}
()
}
are pushed on this stack. Definition of a
n
\code
{
end
_
\var
{
tag
}
()
}
method is optional for these tags. For tags
\code
{
end
_
\var
{
tag
}
()
}
method is optional for these tags. For tags
processed by
\code
{
do
_
\var
{
tag
}
()
}
or by
\code
{
unknown
_
tag()
}
, no
processed by
\code
{
do
_
\var
{
tag
}
()
}
or by
\code
{
unknown
_
tag()
}
, no
\code
{
end
_
\var
{
tag
}
()
}
method must be defined.
\code
{
end
_
\var
{
tag
}
()
}
method must be defined; if defined, it will not
be used. If both
\code
{
start
_
\var
{
tag
}
()
}
and
\code
{
do
_
\var
{
tag
}
()
}
methods exist for a tag, the
\code
{
start
_
\var
{
tag
}
()
}
method takes
precedence.
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