Commit 4def8c92 authored by Pavel Vainerman's avatar Pavel Vainerman

[python]: module refactoring

parent 33108cc9
......@@ -621,7 +621,7 @@ AC_CONFIG_FILES([Makefile
testsuite/Makefile
wrappers/Makefile
wrappers/python/lib/Makefile
wrappers/python/lib/pyUniSet/Makefile
wrappers/python/lib/lib/Makefile
wrappers/python/netdata-plugin/Makefile
wrappers/python/Makefile])
......
if ENABLE_PYTHON
SUBDIRS=pyUniSet
SUBDIRS=lib
#lib_LTLIBRARIES = libUniSet2Python.la
#libUniSet2Python_la_SOURCES =
......
......@@ -3,7 +3,7 @@
import sys
from .pyUniSet.pyUConnector import *
from .lib.UConnector import *
def is_id(str_id):
......
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from .pyUniSet.pyUniSet import *
from .lib.UniSet import *
class UInterface():
......
......@@ -5,7 +5,7 @@ import sys
from .UInterface import *
from .UGlobal import *
from .pyUniSet.pyUModbus import *
from .lib.UModbus import *
class UInterfaceModbus(UInterface):
......
......@@ -3,7 +3,7 @@
from .UInterface import *
from .UGlobal import *
from .pyUniSet.pyUConnector import *
from .lib.UConnector import *
class UInterfaceUniSet(UInterface):
......
......@@ -22,8 +22,9 @@ import urllib.request, urllib.parse, urllib.error
UHTTP_API_VERSION = 'v0'
class UHTTPError:
class UHTTPError(BaseException):
def __init__(self, err=''):
BaseException.__init__(self)
self.message = err
......
......@@ -3,8 +3,8 @@
__all__ = ["UGlobal", "UInterface", "UInterfaceModbus", "UInterfaceUniSet", "UniSetHTTP", "UniXML"]
from .pyUniSet.pyUniSet import *
from .pyUniSet.pyUModbus import *
from .pyUniSet.pyUConnector import *
from .lib.UniSet import *
from .lib.UModbus import *
from .lib.UConnector import *
from .pyUniSet.pyUExceptions import *
from .lib.UExceptions import *
if ENABLE_PYTHON
SWIG=swig
#python_SCRIPTS = pyUniSet.py pyUConnector.py pyUModbus.py pyUExceptions.py
pydir=$(pkgpythondir)/lib
py_DATA = __init__.py UniSet.py UConnector.py UModbus.py UExceptions.py
BUILD_SRCDIR=$(srcdir)/../../../core
BUILD_SRC=UModbus.cc UConnector.cc UProxyObject.cc
UniSet.py: UInterface_wrap.cxx _UniSet.la
UConnector.py: UConnector_wrap.cxx _UConnector.la
UModbus.py: _UModbus.la UModbus_wrap.cxx
UExceptions.py: _UExceptions.la
pyexec_LTLIBRARIES = _UConnector.la _UModbus.la _UExceptions.la _UniSet.la
_UniSet_la_SOURCES = PyUInterface.cc UInterface_wrap.cxx UProxyObject.cc
_UniSet_la_CXXFLAGS = -I$(BUILD_SRCDIR) $(UNISET_CFLAGS) $(UNISET_EXT_CFLAGS) $(PYTHON_CFLAGS)
_UniSet_la_LDFLAGS = -module -avoid-version
_UniSet_la_LIBADD = $(UNISET_LIBS) $(UNISET_EXT_LIBS) $(PYTHON_LIBS)
UInterface_wrap.cxx: UInterface.i UProxyObject.i PyUInterface.h $(BUILD_SRCDIR)/UProxyObject.h
$(SWIG) -python -py3 -c++ -outcurrentdir -I$(BUILD_SRCDIR) UInterface.i
#PyUObject_wrap.cxx: UObject.i PyUObject.h
# swig -python -c++ -classic UObject.i
_UConnector_la_SOURCES = UConnector.cc UConnector_wrap.cxx
_UConnector_la_CXXFLAGS = -I$(BUILD_SRCDIR) $(UNISET_CFLAGS) $(PYTHON_CFLAGS)
_UConnector_la_LDFLAGS = -module -avoid-version
_UConnector_la_LIBADD = $(UNISET_LIBS) $(PYTHON_LIBS)
UConnector_wrap.cxx: UConnector.i $(BUILD_SRCDIR)/UConnector.h
$(SWIG) -python -py3 -c++ -outcurrentdir -I$(BUILD_SRCDIR) UConnector.i
_UModbus_la_SOURCES = UModbus.cc UModbus_wrap.cxx
_UModbus_la_CXXFLAGS = -I$(BUILD_SRCDIR) $(UNISET_CFLAGS) $(UNISET_EXT_CFLAGS) $(POCO_CFLAGS) $(PYTHON_CFLAGS)
_UModbus_la_LDFLAGS = -module -avoid-version
_UModbus_la_LIBADD = $(UNISET_LIBS) $(UNISET_EXT_LIBS) $(POCO_LIBS) $(PYTHON_LIBS)
UModbus_wrap.cxx: UInterface.i $(BUILD_SRCDIR)/UModbus.h
$(SWIG) -python -py3 -c++ -outcurrentdir -I$(BUILD_SRCDIR) UModbus.i
_UExceptions_la_SOURCES = UExceptions_wrap.cxx
_UExceptions_la_CXXFLAGS = -I$(BUILD_SRCDIR) $(UNISET_CFLAGS) $(UNISET_EXT_CFLAGS) $(PYTHON_CFLAGS)
_UExceptions_la_LDFLAGS = -module -avoid-version
_UExceptions_la_LIBADD = $(UNISET_LIBS) $(UNISET_EXT_LIBS) $(PYTHON_LIBS)
UExceptions_wrap.cxx: UExceptions.i $(BUILD_SRCDIR)/UExceptions.h
$(SWIG) -python -py3 -c++ -outcurrentdir -I$(BUILD_SRCDIR) UExceptions.i
# Специальное правило для удаления сгенерированного кода
# для дальнейшей перегенерации
clean-gen:
rm -rf *.py* *_wrap.cxx
$(BUILD_SRC):
ln -sf $(BUILD_SRCDIR)/$@
all-local: $(BUILD_SRC)
include $(top_builddir)/include.mk
endif
......@@ -5,7 +5,7 @@
***********************************************************/
%include <std_string.i>
%module pyUConnector
%module UConnector
%{
#include "UConnector.h"
%}
......
......@@ -2754,16 +2754,16 @@ static swig_module_info swig_module = {swig_types, 5, 0, 0, 0, 0};
/*-----------------------------------------------
@(target):= _pyUConnector.so
@(target):= _UConnector.so
------------------------------------------------*/
#if PY_VERSION_HEX >= 0x03000000
# define SWIG_init PyInit__pyUConnector
# define SWIG_init PyInit__UConnector
#else
# define SWIG_init init_pyUConnector
# define SWIG_init init_UConnector
#endif
#define SWIG_name "_pyUConnector"
#define SWIG_name "_UConnector"
#define SWIGVERSION 0x030012
#define SWIG_VERSION SWIGVERSION
......
......@@ -5,7 +5,7 @@
***********************************************************/
%include <std_string.i>
%module pyUExceptions
%module UExceptions
%{
#include "UExceptions.h"
%}
......
......@@ -10,12 +10,12 @@ if _swig_python_version_info >= (2, 7, 0):
import importlib
pkg_parts = __name__.rpartition('.')
pkg = pkg_parts[0] if pkg_parts[1] == '.' else pkg_parts[2]
mname = '.'.join((pkg, '_pyUExceptions')).lstrip('.')
mname = '.'.join((pkg, '_UExceptions')).lstrip('.')
try:
return importlib.import_module(mname)
except ImportError:
return importlib.import_module('_pyUExceptions')
_pyUExceptions = swig_import_helper()
return importlib.import_module('_UExceptions')
_UExceptions = swig_import_helper()
del swig_import_helper
elif _swig_python_version_info >= (2, 6, 0):
def swig_import_helper():
......@@ -23,17 +23,17 @@ elif _swig_python_version_info >= (2, 6, 0):
import imp
fp = None
try:
fp, pathname, description = imp.find_module('_pyUExceptions', [dirname(__file__)])
fp, pathname, description = imp.find_module('_UExceptions', [dirname(__file__)])
except ImportError:
import _pyUExceptions
return _pyUExceptions
import _UExceptions
return _UExceptions
try:
_mod = imp.load_module('_pyUExceptions', fp, pathname, description)
_mod = imp.load_module('_UExceptions', fp, pathname, description)
finally:
if fp is not None:
fp.close()
return _mod
_pyUExceptions = swig_import_helper()
_UExceptions = swig_import_helper()
del swig_import_helper
else:
raise RuntimeError('Python 2.6 or later required')
......@@ -99,22 +99,22 @@ class UException(BaseException, _object):
__repr__ = _swig_repr
def __init__(self, *args):
BaseException.__init__(self, *args)
this = _pyUExceptions.new_UException(*args)
BaseException.__init__(self, args)
this = _UExceptions.new_UException(*args)
try:
self.this.append(this)
except __builtin__.Exception:
self.this = this
__swig_destroy__ = _pyUExceptions.delete_UException
__swig_destroy__ = _UExceptions.delete_UException
__del__ = lambda self: None
def getError(self) -> "std::string const":
return _pyUExceptions.UException_getError(self)
__swig_setmethods__["err"] = _pyUExceptions.UException_err_set
__swig_getmethods__["err"] = _pyUExceptions.UException_err_get
return _UExceptions.UException_getError(self)
__swig_setmethods__["err"] = _UExceptions.UException_err_set
__swig_getmethods__["err"] = _UExceptions.UException_err_get
if _newclass:
err = property(_pyUExceptions.UException_err_get, _pyUExceptions.UException_err_set)
UException_swigregister = _pyUExceptions.UException_swigregister
err = property(_UExceptions.UException_err_get, _UExceptions.UException_err_set)
UException_swigregister = _UExceptions.UException_swigregister
UException_swigregister(UException)
class UTimeOut(UException):
......@@ -129,14 +129,14 @@ class UTimeOut(UException):
__repr__ = _swig_repr
def __init__(self, *args):
this = _pyUExceptions.new_UTimeOut(*args)
this = _UExceptions.new_UTimeOut(*args)
try:
self.this.append(this)
except __builtin__.Exception:
self.this = this
__swig_destroy__ = _pyUExceptions.delete_UTimeOut
__swig_destroy__ = _UExceptions.delete_UTimeOut
__del__ = lambda self: None
UTimeOut_swigregister = _pyUExceptions.UTimeOut_swigregister
UTimeOut_swigregister = _UExceptions.UTimeOut_swigregister
UTimeOut_swigregister(UTimeOut)
class USysError(UException):
......@@ -151,14 +151,14 @@ class USysError(UException):
__repr__ = _swig_repr
def __init__(self, *args):
this = _pyUExceptions.new_USysError(*args)
this = _UExceptions.new_USysError(*args)
try:
self.this.append(this)
except __builtin__.Exception:
self.this = this
__swig_destroy__ = _pyUExceptions.delete_USysError
__swig_destroy__ = _UExceptions.delete_USysError
__del__ = lambda self: None
USysError_swigregister = _pyUExceptions.USysError_swigregister
USysError_swigregister = _UExceptions.USysError_swigregister
USysError_swigregister(USysError)
class UValidateError(UException):
......@@ -173,14 +173,14 @@ class UValidateError(UException):
__repr__ = _swig_repr
def __init__(self, *args):
this = _pyUExceptions.new_UValidateError(*args)
this = _UExceptions.new_UValidateError(*args)
try:
self.this.append(this)
except __builtin__.Exception:
self.this = this
__swig_destroy__ = _pyUExceptions.delete_UValidateError
__swig_destroy__ = _UExceptions.delete_UValidateError
__del__ = lambda self: None
UValidateError_swigregister = _pyUExceptions.UValidateError_swigregister
UValidateError_swigregister = _UExceptions.UValidateError_swigregister
UValidateError_swigregister(UValidateError)
# This file is compatible with both classic and new-style classes.
......
......@@ -2754,16 +2754,16 @@ static swig_module_info swig_module = {swig_types, 5, 0, 0, 0, 0};
/*-----------------------------------------------
@(target):= _pyUExceptions.so
@(target):= _UExceptions.so
------------------------------------------------*/
#if PY_VERSION_HEX >= 0x03000000
# define SWIG_init PyInit__pyUExceptions
# define SWIG_init PyInit__UExceptions
#else
# define SWIG_init init_pyUExceptions
# define SWIG_init init_UExceptions
#endif
#define SWIG_name "_pyUExceptions"
#define SWIG_name "_UExceptions"
#define SWIGVERSION 0x030012
#define SWIG_VERSION SWIGVERSION
......
......@@ -4,7 +4,7 @@
* swig -python UInterface.i
***********************************************************/
%module pyUniSet
%module UniSet
%include "std_string.i"
......
......@@ -2758,16 +2758,16 @@ static swig_module_info swig_module = {swig_types, 9, 0, 0, 0, 0};
/*-----------------------------------------------
@(target):= _pyUniSet.so
@(target):= _UniSet.so
------------------------------------------------*/
#if PY_VERSION_HEX >= 0x03000000
# define SWIG_init PyInit__pyUniSet
# define SWIG_init PyInit__UniSet
#else
# define SWIG_init init_pyUniSet
# define SWIG_init init_UniSet
#endif
#define SWIG_name "_pyUniSet"
#define SWIG_name "_UniSet"
#define SWIGVERSION 0x030012
#define SWIG_VERSION SWIGVERSION
......
......@@ -5,7 +5,7 @@
***********************************************************/
%include <std_string.i>
%module pyUModbus
%module UModbus
%{
#include "UModbus.h"
%}
......
......@@ -10,12 +10,12 @@ if _swig_python_version_info >= (2, 7, 0):
import importlib
pkg_parts = __name__.rpartition('.')
pkg = pkg_parts[0] if pkg_parts[1] == '.' else pkg_parts[2]
mname = '.'.join((pkg, '_pyUModbus')).lstrip('.')
mname = '.'.join((pkg, '_UModbus')).lstrip('.')
try:
return importlib.import_module(mname)
except ImportError:
return importlib.import_module('_pyUModbus')
_pyUModbus = swig_import_helper()
return importlib.import_module('_UModbus')
_UModbus = swig_import_helper()
del swig_import_helper
elif _swig_python_version_info >= (2, 6, 0):
def swig_import_helper():
......@@ -23,17 +23,17 @@ elif _swig_python_version_info >= (2, 6, 0):
import imp
fp = None
try:
fp, pathname, description = imp.find_module('_pyUModbus', [dirname(__file__)])
fp, pathname, description = imp.find_module('_UModbus', [dirname(__file__)])
except ImportError:
import _pyUModbus
return _pyUModbus
import _UModbus
return _UModbus
try:
_mod = imp.load_module('_pyUModbus', fp, pathname, description)
_mod = imp.load_module('_UModbus', fp, pathname, description)
finally:
if fp is not None:
fp.close()
return _mod
_pyUModbus = swig_import_helper()
_UModbus = swig_import_helper()
del swig_import_helper
else:
raise RuntimeError('Python 2.6 or later required')
......@@ -99,53 +99,53 @@ class UModbus(_object):
__repr__ = _swig_repr
def __init__(self):
this = _pyUModbus.new_UModbus()
this = _UModbus.new_UModbus()
try:
self.this.append(this)
except __builtin__.Exception:
self.this = this
__swig_destroy__ = _pyUModbus.delete_UModbus
__swig_destroy__ = _UModbus.delete_UModbus
__del__ = lambda self: None
def getUIType(self) -> "std::string":
return _pyUModbus.UModbus_getUIType(self)
return _UModbus.UModbus_getUIType(self)
def isWriteFunction(self, mbfunc: 'int') -> "bool":
return _pyUModbus.UModbus_isWriteFunction(self, mbfunc)
return _UModbus.UModbus_isWriteFunction(self, mbfunc)
def prepare(self, ip: 'std::string const &', port: 'int') -> "void":
return _pyUModbus.UModbus_prepare(self, ip, port)
return _UModbus.UModbus_prepare(self, ip, port)
def connect(self, ip: 'std::string const &', port: 'int') -> "void":
return _pyUModbus.UModbus_connect(self, ip, port)
return _UModbus.UModbus_connect(self, ip, port)
def conn_port(self) -> "int":
return _pyUModbus.UModbus_conn_port(self)
return _UModbus.UModbus_conn_port(self)
def conn_ip(self) -> "std::string":
return _pyUModbus.UModbus_conn_ip(self)
return _UModbus.UModbus_conn_ip(self)
def isConnection(self) -> "bool":
return _pyUModbus.UModbus_isConnection(self)
return _UModbus.UModbus_isConnection(self)
def setTimeout(self, msec: 'int') -> "void":
return _pyUModbus.UModbus_setTimeout(self, msec)
return _UModbus.UModbus_setTimeout(self, msec)
def mbread(self, *args) -> "long":
return _pyUModbus.UModbus_mbread(self, *args)
return _UModbus.UModbus_mbread(self, *args)
def getWord(self, addr: 'int', mbreg: 'int', mbfunc: 'int'=0x4) -> "long":
return _pyUModbus.UModbus_getWord(self, addr, mbreg, mbfunc)
return _UModbus.UModbus_getWord(self, addr, mbreg, mbfunc)
def getByte(self, addr: 'int', mbreg: 'int', mbfunc: 'int'=0x4) -> "long":
return _pyUModbus.UModbus_getByte(self, addr, mbreg, mbfunc)
return _UModbus.UModbus_getByte(self, addr, mbreg, mbfunc)
def getBit(self, addr: 'int', mbreg: 'int', mbfunc: 'int'=0x2) -> "bool":
return _pyUModbus.UModbus_getBit(self, addr, mbreg, mbfunc)
return _UModbus.UModbus_getBit(self, addr, mbreg, mbfunc)
def mbwrite(self, *args) -> "void":
return _pyUModbus.UModbus_mbwrite(self, *args)
UModbus_swigregister = _pyUModbus.UModbus_swigregister
return _UModbus.UModbus_mbwrite(self, *args)
UModbus_swigregister = _UModbus.UModbus_swigregister
UModbus_swigregister(UModbus)
# This file is compatible with both classic and new-style classes.
......
......@@ -2751,16 +2751,16 @@ static swig_module_info swig_module = {swig_types, 2, 0, 0, 0, 0};
/*-----------------------------------------------
@(target):= _pyUModbus.so
@(target):= _UModbus.so
------------------------------------------------*/
#if PY_VERSION_HEX >= 0x03000000
# define SWIG_init PyInit__pyUModbus
# define SWIG_init PyInit__UModbus
#else
# define SWIG_init init_pyUModbus
# define SWIG_init init_UModbus
#endif
#define SWIG_name "_pyUModbus"
#define SWIG_name "_UModbus"
#define SWIGVERSION 0x030012
#define SWIG_VERSION SWIGVERSION
......
......@@ -4,7 +4,7 @@
* swig -python UInterface.i
***********************************************************/
%module pyUniSet
%module UniSet
%include <std_string.i>
......
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
__all__ = ["pyUniSet", "pyUModbus", "pyUConnector", "pyUExceptions"]
__all__ = ["UniSet", "UModbus", "UConnector", "UExceptions"]
if ENABLE_PYTHON
SWIG=swig
#python_SCRIPTS = pyUniSet.py pyUConnector.py pyUModbus.py pyUExceptions.py
pydir=$(pkgpythondir)/pyUniSet
py_DATA = __init__.py pyUniSet.py pyUConnector.py pyUModbus.py pyUExceptions.py
BUILD_SRCDIR=$(srcdir)/../../../core
BUILD_SRC=UModbus.cc UConnector.cc UProxyObject.cc
pyUniSet.py: UInterface_wrap.cxx _pyUniSet.la
pyUConnector.py: UConnector_wrap.cxx _pyUConnector.la
pyUModbus.py: _pyUModbus.la UModbus_wrap.cxx
pyUExceptions.py: _pyUExceptions.la
pyexec_LTLIBRARIES = _pyUConnector.la _pyUModbus.la _pyUExceptions.la _pyUniSet.la
_pyUniSet_la_SOURCES = PyUInterface.cc UInterface_wrap.cxx UProxyObject.cc
_pyUniSet_la_CXXFLAGS = -I$(BUILD_SRCDIR) $(UNISET_CFLAGS) $(UNISET_EXT_CFLAGS) $(PYTHON_CFLAGS)
_pyUniSet_la_LDFLAGS = -module -avoid-version
_pyUniSet_la_LIBADD = $(UNISET_LIBS) $(UNISET_EXT_LIBS) $(PYTHON_LIBS)
UInterface_wrap.cxx: UInterface.i UProxyObject.i PyUInterface.h $(BUILD_SRCDIR)/UProxyObject.h
$(SWIG) -python -py3 -c++ -outcurrentdir -I$(BUILD_SRCDIR) UInterface.i
#PyUObject_wrap.cxx: UObject.i PyUObject.h
# swig -python -c++ -classic UObject.i
_pyUConnector_la_SOURCES = UConnector.cc UConnector_wrap.cxx
_pyUConnector_la_CXXFLAGS = -I$(BUILD_SRCDIR) $(UNISET_CFLAGS) $(PYTHON_CFLAGS)
_pyUConnector_la_LDFLAGS = -module -avoid-version
_pyUConnector_la_LIBADD = $(UNISET_LIBS) $(PYTHON_LIBS)
UConnector_wrap.cxx: UConnector.i $(BUILD_SRCDIR)/UConnector.h
$(SWIG) -python -py3 -c++ -outcurrentdir -I$(BUILD_SRCDIR) UConnector.i
_pyUModbus_la_SOURCES = UModbus.cc UModbus_wrap.cxx
_pyUModbus_la_CXXFLAGS = -I$(BUILD_SRCDIR) $(UNISET_CFLAGS) $(UNISET_EXT_CFLAGS) $(POCO_CFLAGS) $(PYTHON_CFLAGS)
_pyUModbus_la_LDFLAGS = -module -avoid-version
_pyUModbus_la_LIBADD = $(UNISET_LIBS) $(UNISET_EXT_LIBS) $(POCO_LIBS) $(PYTHON_LIBS)
UModbus_wrap.cxx: UInterface.i $(BUILD_SRCDIR)/UModbus.h
$(SWIG) -python -py3 -c++ -outcurrentdir -I$(BUILD_SRCDIR) UModbus.i
_pyUExceptions_la_SOURCES = UExceptions_wrap.cxx
_pyUExceptions_la_CXXFLAGS = -I$(BUILD_SRCDIR) $(UNISET_CFLAGS) $(UNISET_EXT_CFLAGS) $(PYTHON_CFLAGS)
_pyUExceptions_la_LDFLAGS = -module -avoid-version
_pyUExceptions_la_LIBADD = $(UNISET_LIBS) $(UNISET_EXT_LIBS) $(PYTHON_LIBS)
UExceptions_wrap.cxx: UExceptions.i $(BUILD_SRCDIR)/UExceptions.h
$(SWIG) -python -py3 -c++ -outcurrentdir -I$(BUILD_SRCDIR) UExceptions.i
# Специальное правило для удаления сгенерированного кода
# для дальнейшей перегенерации
clean-gen:
rm -rf *.py* *_wrap.cxx
$(BUILD_SRC):
ln -sf $(BUILD_SRCDIR)/$@
all-local: $(BUILD_SRC)
include $(top_builddir)/include.mk
endif
......@@ -30,7 +30,7 @@ import os
import sys
import uniset2
from uniset2 import UniXML
from uniset2.lib import UniXML
from subprocess import Popen, PIPE
sys.path.append("./python_modules")
......
......@@ -5,10 +5,11 @@ import sys
import time
sys.path.append('../../')
sys.path.append('../../lib/pyUniSet/')
sys.path.append('../../lib/pyUniSet/.libs')
sys.path.append('../../lib/lib/')
sys.path.append('../../lib/lib/.libs')
from lib import *
from UniSet import *
from UConnector import *
def myfunc( act ):
act['test'] = 'test'
......
......@@ -4,10 +4,10 @@
import sys
sys.path.append('../../')
sys.path.append('../../lib/pyUniSet/')
sys.path.append('../../lib/pyUniSet/.libs')
sys.path.append('../../lib/lib/')
sys.path.append('../../lib/lib/.libs')
from lib import *
from UniSet import *
if __name__ == "__main__":
......
......@@ -4,10 +4,11 @@
import sys
sys.path.append('../../')
sys.path.append('../../lib/pyUniSet/')
sys.path.append('../../lib/pyUniSet/.libs')
sys.path.append('../../lib/lib/')
sys.path.append('../../lib/lib/.libs')
from lib import *
from UniSet import *
from UModbus import *
if __name__ == "__main__":
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment