##// END OF EJS Templates
stringutil: drop escapedata() in favor of escapestr()...
Yuya Nishihara -
r37338:a67fd1fe default
parent child Browse files
Show More
@@ -2964,9 +2964,9 b' def debugwireproto(ui, repo, path=None, '
2964 del args['PUSHFILE']
2964 del args['PUSHFILE']
2965 res, output = peer._callpush(command, fh,
2965 res, output = peer._callpush(command, fh,
2966 **pycompat.strkwargs(args))
2966 **pycompat.strkwargs(args))
2967 ui.status(_('result: %s\n') % stringutil.escapedata(res))
2967 ui.status(_('result: %s\n') % stringutil.escapestr(res))
2968 ui.status(_('remote output: %s\n') %
2968 ui.status(_('remote output: %s\n') %
2969 stringutil.escapedata(output))
2969 stringutil.escapestr(output))
2970 else:
2970 else:
2971 res = peer._call(command, **pycompat.strkwargs(args))
2971 res = peer._call(command, **pycompat.strkwargs(args))
2972 ui.status(_('response: %s\n') % stringutil.pprint(res))
2972 ui.status(_('response: %s\n') % stringutil.pprint(res))
@@ -2984,7 +2984,7 b' def debugwireproto(ui, repo, path=None, '
2984 len(batchedcommands))
2984 len(batchedcommands))
2985 for i, chunk in enumerate(peer._submitbatch(batchedcommands)):
2985 for i, chunk in enumerate(peer._submitbatch(batchedcommands)):
2986 ui.status(_('response #%d: %s\n') %
2986 ui.status(_('response #%d: %s\n') %
2987 (i, stringutil.escapedata(chunk)))
2987 (i, stringutil.escapestr(chunk)))
2988
2988
2989 batchedcommands = None
2989 batchedcommands = None
2990
2990
@@ -748,10 +748,10 b' class baseproxyobserver(object):'
748 # Simple case writes all data on a single line.
748 # Simple case writes all data on a single line.
749 if b'\n' not in data:
749 if b'\n' not in data:
750 if self.logdataapis:
750 if self.logdataapis:
751 self.fh.write(': %s\n' % stringutil.escapedata(data))
751 self.fh.write(': %s\n' % stringutil.escapestr(data))
752 else:
752 else:
753 self.fh.write('%s> %s\n'
753 self.fh.write('%s> %s\n'
754 % (self.name, stringutil.escapedata(data)))
754 % (self.name, stringutil.escapestr(data)))
755 self.fh.flush()
755 self.fh.flush()
756 return
756 return
757
757
@@ -762,7 +762,7 b' class baseproxyobserver(object):'
762 lines = data.splitlines(True)
762 lines = data.splitlines(True)
763 for line in lines:
763 for line in lines:
764 self.fh.write('%s> %s\n'
764 self.fh.write('%s> %s\n'
765 % (self.name, stringutil.escapedata(line)))
765 % (self.name, stringutil.escapestr(line)))
766 self.fh.flush()
766 self.fh.flush()
767
767
768 class fileobjectobserver(baseproxyobserver):
768 class fileobjectobserver(baseproxyobserver):
@@ -3845,7 +3845,6 b" gui = _deprecatedfunc(procutil.gui, '4.6"
3845 hgcmd = _deprecatedfunc(procutil.hgcmd, '4.6')
3845 hgcmd = _deprecatedfunc(procutil.hgcmd, '4.6')
3846 rundetached = _deprecatedfunc(procutil.rundetached, '4.6')
3846 rundetached = _deprecatedfunc(procutil.rundetached, '4.6')
3847
3847
3848 escapedata = _deprecatedfunc(stringutil.escapedata, '4.6')
3849 binary = _deprecatedfunc(stringutil.binary, '4.6')
3848 binary = _deprecatedfunc(stringutil.binary, '4.6')
3850 stringmatcher = _deprecatedfunc(stringutil.stringmatcher, '4.6')
3849 stringmatcher = _deprecatedfunc(stringutil.stringmatcher, '4.6')
3851 shortuser = _deprecatedfunc(stringutil.shortuser, '4.6')
3850 shortuser = _deprecatedfunc(stringutil.shortuser, '4.6')
@@ -23,24 +23,10 b' from .. import ('
23 pycompat,
23 pycompat,
24 )
24 )
25
25
26 _DATA_ESCAPE_MAP = {pycompat.bytechr(i): br'\x%02x' % i for i in range(256)}
27 _DATA_ESCAPE_MAP.update({
28 b'\\': b'\\\\',
29 b'\r': br'\r',
30 b'\n': br'\n',
31 })
32 _DATA_ESCAPE_RE = remod.compile(br'[\x00-\x08\x0a-\x1f\\\x7f-\xff]')
33
34 def escapedata(s):
35 if isinstance(s, bytearray):
36 s = bytes(s)
37
38 return _DATA_ESCAPE_RE.sub(lambda m: _DATA_ESCAPE_MAP[m.group(0)], s)
39
40 def pprint(o):
26 def pprint(o):
41 """Pretty print an object."""
27 """Pretty print an object."""
42 if isinstance(o, (bytes, bytearray)):
28 if isinstance(o, (bytes, bytearray)):
43 return "b'%s'" % escapedata(o)
29 return "b'%s'" % escapestr(o)
44 elif isinstance(o, list):
30 elif isinstance(o, list):
45 return '[%s]' % (b', '.join(pprint(a) for a in o))
31 return '[%s]' % (b', '.join(pprint(a) for a in o))
46 elif isinstance(o, dict):
32 elif isinstance(o, dict):
@@ -393,7 +393,7 b' Command frames can be reflected via debu'
393 s> content-length: 47\r\n
393 s> content-length: 47\r\n
394 s> host: $LOCALIP:$HGPORT\r\n (glob)
394 s> host: $LOCALIP:$HGPORT\r\n (glob)
395 s> \r\n
395 s> \r\n
396 s> '\x00\x00\x01\x00\x01\x01\x11\xa2Dargs\xa2CfooDval1Dbar1CvalDnameHcommand1
396 s> \'\x00\x00\x01\x00\x01\x01\x11\xa2Dargs\xa2CfooDval1Dbar1CvalDnameHcommand1
397 s> makefile('rb', None)
397 s> makefile('rb', None)
398 s> HTTP/1.1 200 OK\r\n
398 s> HTTP/1.1 200 OK\r\n
399 s> Server: testing stub value\r\n
399 s> Server: testing stub value\r\n
@@ -504,9 +504,9 b' Interleaved requests to "multirequest" a'
504 s> Transfer-Encoding: chunked\r\n
504 s> Transfer-Encoding: chunked\r\n
505 s> \r\n
505 s> \r\n
506 s> 26\r\n
506 s> 26\r\n
507 s> \x1e\x00\x00\x03\x00\x02\x01Bbookmarks \n
507 s> \x1e\x00\x00\x03\x00\x02\x01Bbookmarks\t\n
508 s> namespaces \n
508 s> namespaces\t\n
509 s> phases
509 s> phases\t
510 s> \r\n
510 s> \r\n
511 s> 8\r\n
511 s> 8\r\n
512 s> \x00\x00\x00\x01\x00\x02\x00B
512 s> \x00\x00\x00\x01\x00\x02\x00B
@@ -206,10 +206,10 b' Test listkeys for listing namespaces'
206 s> Content-Type: application/mercurial-0.1\r\n
206 s> Content-Type: application/mercurial-0.1\r\n
207 s> Content-Length: 30\r\n
207 s> Content-Length: 30\r\n
208 s> \r\n
208 s> \r\n
209 s> bookmarks \n
209 s> bookmarks\t\n
210 s> namespaces \n
210 s> namespaces\t\n
211 s> phases
211 s> phases\t
212 response: b'bookmarks \nnamespaces \nphases '
212 response: b'bookmarks\t\nnamespaces\t\nphases\t'
213
213
214 Same thing, but with "httprequest" command
214 Same thing, but with "httprequest" command
215
215
@@ -232,8 +232,8 b' Same thing, but with "httprequest" comma'
232 s> Content-Type: application/mercurial-0.1\r\n
232 s> Content-Type: application/mercurial-0.1\r\n
233 s> Content-Length: 30\r\n
233 s> Content-Length: 30\r\n
234 s> \r\n
234 s> \r\n
235 s> bookmarks \n
235 s> bookmarks\t\n
236 s> namespaces \n
236 s> namespaces\t\n
237 s> phases
237 s> phases\t
238
238
239 $ killdaemons.py
239 $ killdaemons.py
@@ -1342,10 +1342,10 b' Test listkeys for listing namespaces'
1342 o> bufferedreadline() -> 3:
1342 o> bufferedreadline() -> 3:
1343 o> 30\n
1343 o> 30\n
1344 o> bufferedread(30) -> 30:
1344 o> bufferedread(30) -> 30:
1345 o> bookmarks \n
1345 o> bookmarks\t\n
1346 o> namespaces \n
1346 o> namespaces\t\n
1347 o> phases
1347 o> phases\t
1348 response: b'bookmarks \nnamespaces \nphases '
1348 response: b'bookmarks\t\nnamespaces\t\nphases\t'
1349
1349
1350 testing ssh2
1350 testing ssh2
1351 creating ssh peer from handshake results
1351 creating ssh peer from handshake results
@@ -1373,10 +1373,10 b' Test listkeys for listing namespaces'
1373 o> bufferedreadline() -> 3:
1373 o> bufferedreadline() -> 3:
1374 o> 30\n
1374 o> 30\n
1375 o> bufferedread(30) -> 30:
1375 o> bufferedread(30) -> 30:
1376 o> bookmarks \n
1376 o> bookmarks\t\n
1377 o> namespaces \n
1377 o> namespaces\t\n
1378 o> phases
1378 o> phases\t
1379 response: b'bookmarks \nnamespaces \nphases '
1379 response: b'bookmarks\t\nnamespaces\t\nphases\t'
1380
1380
1381 $ cd ..
1381 $ cd ..
1382
1382
@@ -1482,8 +1482,8 b' With a single bookmark set'
1482 i> flush() -> None
1482 i> flush() -> None
1483 o> bufferedreadline() -> 3:
1483 o> bufferedreadline() -> 3:
1484 o> 46\n
1484 o> 46\n
1485 o> bufferedread(46) -> 46: bookA 68986213bd4485ea51533535e3fc9e78007a711f
1485 o> bufferedread(46) -> 46: bookA\t68986213bd4485ea51533535e3fc9e78007a711f
1486 response: b'bookA 68986213bd4485ea51533535e3fc9e78007a711f'
1486 response: b'bookA\t68986213bd4485ea51533535e3fc9e78007a711f'
1487
1487
1488 testing ssh2
1488 testing ssh2
1489 creating ssh peer from handshake results
1489 creating ssh peer from handshake results
@@ -1510,8 +1510,8 b' With a single bookmark set'
1510 i> flush() -> None
1510 i> flush() -> None
1511 o> bufferedreadline() -> 3:
1511 o> bufferedreadline() -> 3:
1512 o> 46\n
1512 o> 46\n
1513 o> bufferedread(46) -> 46: bookA 68986213bd4485ea51533535e3fc9e78007a711f
1513 o> bufferedread(46) -> 46: bookA\t68986213bd4485ea51533535e3fc9e78007a711f
1514 response: b'bookA 68986213bd4485ea51533535e3fc9e78007a711f'
1514 response: b'bookA\t68986213bd4485ea51533535e3fc9e78007a711f'
1515
1515
1516 With multiple bookmarks set
1516 With multiple bookmarks set
1517
1517
@@ -1546,9 +1546,9 b' With multiple bookmarks set'
1546 o> bufferedreadline() -> 3:
1546 o> bufferedreadline() -> 3:
1547 o> 93\n
1547 o> 93\n
1548 o> bufferedread(93) -> 93:
1548 o> bufferedread(93) -> 93:
1549 o> bookA 68986213bd4485ea51533535e3fc9e78007a711f\n
1549 o> bookA\t68986213bd4485ea51533535e3fc9e78007a711f\n
1550 o> bookB 1880f3755e2e52e3199e0ee5638128b08642f34d
1550 o> bookB\t1880f3755e2e52e3199e0ee5638128b08642f34d
1551 response: b'bookA 68986213bd4485ea51533535e3fc9e78007a711f\nbookB 1880f3755e2e52e3199e0ee5638128b08642f34d'
1551 response: b'bookA\t68986213bd4485ea51533535e3fc9e78007a711f\nbookB\t1880f3755e2e52e3199e0ee5638128b08642f34d'
1552
1552
1553 testing ssh2
1553 testing ssh2
1554 creating ssh peer from handshake results
1554 creating ssh peer from handshake results
@@ -1576,9 +1576,9 b' With multiple bookmarks set'
1576 o> bufferedreadline() -> 3:
1576 o> bufferedreadline() -> 3:
1577 o> 93\n
1577 o> 93\n
1578 o> bufferedread(93) -> 93:
1578 o> bufferedread(93) -> 93:
1579 o> bookA 68986213bd4485ea51533535e3fc9e78007a711f\n
1579 o> bookA\t68986213bd4485ea51533535e3fc9e78007a711f\n
1580 o> bookB 1880f3755e2e52e3199e0ee5638128b08642f34d
1580 o> bookB\t1880f3755e2e52e3199e0ee5638128b08642f34d
1581 response: b'bookA 68986213bd4485ea51533535e3fc9e78007a711f\nbookB 1880f3755e2e52e3199e0ee5638128b08642f34d'
1581 response: b'bookA\t68986213bd4485ea51533535e3fc9e78007a711f\nbookB\t1880f3755e2e52e3199e0ee5638128b08642f34d'
1582
1582
1583 Test pushkey for bookmarks
1583 Test pushkey for bookmarks
1584
1584
@@ -1706,8 +1706,8 b' Phases on empty repo'
1706 i> flush() -> None
1706 i> flush() -> None
1707 o> bufferedreadline() -> 3:
1707 o> bufferedreadline() -> 3:
1708 o> 15\n
1708 o> 15\n
1709 o> bufferedread(15) -> 15: publishing True
1709 o> bufferedread(15) -> 15: publishing\tTrue
1710 response: b'publishing True'
1710 response: b'publishing\tTrue'
1711
1711
1712 testing ssh2
1712 testing ssh2
1713 creating ssh peer from handshake results
1713 creating ssh peer from handshake results
@@ -1734,8 +1734,8 b' Phases on empty repo'
1734 i> flush() -> None
1734 i> flush() -> None
1735 o> bufferedreadline() -> 3:
1735 o> bufferedreadline() -> 3:
1736 o> 15\n
1736 o> 15\n
1737 o> bufferedread(15) -> 15: publishing True
1737 o> bufferedread(15) -> 15: publishing\tTrue
1738 response: b'publishing True'
1738 response: b'publishing\tTrue'
1739
1739
1740 Create some commits
1740 Create some commits
1741
1741
@@ -1786,10 +1786,10 b' Two draft heads'
1786 o> bufferedreadline() -> 4:
1786 o> bufferedreadline() -> 4:
1787 o> 101\n
1787 o> 101\n
1788 o> bufferedread(101) -> 101:
1788 o> bufferedread(101) -> 101:
1789 o> 20b8a89289d80036e6c4e87c2083e3bea1586637 1\n
1789 o> 20b8a89289d80036e6c4e87c2083e3bea1586637\t1\n
1790 o> c4750011d906c18ea2f0527419cbc1a544435150 1\n
1790 o> c4750011d906c18ea2f0527419cbc1a544435150\t1\n
1791 o> publishing True
1791 o> publishing\tTrue
1792 response: b'20b8a89289d80036e6c4e87c2083e3bea1586637 1\nc4750011d906c18ea2f0527419cbc1a544435150 1\npublishing True'
1792 response: b'20b8a89289d80036e6c4e87c2083e3bea1586637\t1\nc4750011d906c18ea2f0527419cbc1a544435150\t1\npublishing\tTrue'
1793
1793
1794 testing ssh2
1794 testing ssh2
1795 creating ssh peer from handshake results
1795 creating ssh peer from handshake results
@@ -1817,10 +1817,10 b' Two draft heads'
1817 o> bufferedreadline() -> 4:
1817 o> bufferedreadline() -> 4:
1818 o> 101\n
1818 o> 101\n
1819 o> bufferedread(101) -> 101:
1819 o> bufferedread(101) -> 101:
1820 o> 20b8a89289d80036e6c4e87c2083e3bea1586637 1\n
1820 o> 20b8a89289d80036e6c4e87c2083e3bea1586637\t1\n
1821 o> c4750011d906c18ea2f0527419cbc1a544435150 1\n
1821 o> c4750011d906c18ea2f0527419cbc1a544435150\t1\n
1822 o> publishing True
1822 o> publishing\tTrue
1823 response: b'20b8a89289d80036e6c4e87c2083e3bea1586637 1\nc4750011d906c18ea2f0527419cbc1a544435150 1\npublishing True'
1823 response: b'20b8a89289d80036e6c4e87c2083e3bea1586637\t1\nc4750011d906c18ea2f0527419cbc1a544435150\t1\npublishing\tTrue'
1824
1824
1825 Single draft head
1825 Single draft head
1826
1826
@@ -1855,9 +1855,9 b' Single draft head'
1855 o> bufferedreadline() -> 3:
1855 o> bufferedreadline() -> 3:
1856 o> 58\n
1856 o> 58\n
1857 o> bufferedread(58) -> 58:
1857 o> bufferedread(58) -> 58:
1858 o> c4750011d906c18ea2f0527419cbc1a544435150 1\n
1858 o> c4750011d906c18ea2f0527419cbc1a544435150\t1\n
1859 o> publishing True
1859 o> publishing\tTrue
1860 response: b'c4750011d906c18ea2f0527419cbc1a544435150 1\npublishing True'
1860 response: b'c4750011d906c18ea2f0527419cbc1a544435150\t1\npublishing\tTrue'
1861
1861
1862 testing ssh2
1862 testing ssh2
1863 creating ssh peer from handshake results
1863 creating ssh peer from handshake results
@@ -1885,9 +1885,9 b' Single draft head'
1885 o> bufferedreadline() -> 3:
1885 o> bufferedreadline() -> 3:
1886 o> 58\n
1886 o> 58\n
1887 o> bufferedread(58) -> 58:
1887 o> bufferedread(58) -> 58:
1888 o> c4750011d906c18ea2f0527419cbc1a544435150 1\n
1888 o> c4750011d906c18ea2f0527419cbc1a544435150\t1\n
1889 o> publishing True
1889 o> publishing\tTrue
1890 response: b'c4750011d906c18ea2f0527419cbc1a544435150 1\npublishing True'
1890 response: b'c4750011d906c18ea2f0527419cbc1a544435150\t1\npublishing\tTrue'
1891
1891
1892 All public heads
1892 All public heads
1893
1893
@@ -1921,8 +1921,8 b' All public heads'
1921 i> flush() -> None
1921 i> flush() -> None
1922 o> bufferedreadline() -> 3:
1922 o> bufferedreadline() -> 3:
1923 o> 15\n
1923 o> 15\n
1924 o> bufferedread(15) -> 15: publishing True
1924 o> bufferedread(15) -> 15: publishing\tTrue
1925 response: b'publishing True'
1925 response: b'publishing\tTrue'
1926
1926
1927 testing ssh2
1927 testing ssh2
1928 creating ssh peer from handshake results
1928 creating ssh peer from handshake results
@@ -1949,8 +1949,8 b' All public heads'
1949 i> flush() -> None
1949 i> flush() -> None
1950 o> bufferedreadline() -> 3:
1950 o> bufferedreadline() -> 3:
1951 o> 15\n
1951 o> 15\n
1952 o> bufferedread(15) -> 15: publishing True
1952 o> bufferedread(15) -> 15: publishing\tTrue
1953 response: b'publishing True'
1953 response: b'publishing\tTrue'
1954
1954
1955 Setting public phase via pushkey
1955 Setting public phase via pushkey
1956
1956
@@ -2099,13 +2099,13 b' Test batching of requests'
2099 o> 278\n
2099 o> 278\n
2100 o> bufferedread(278) -> 278:
2100 o> bufferedread(278) -> 278:
2101 o> bfebe6bd38eebc6f8202e419c1171268987ea6a6 4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\n
2101 o> bfebe6bd38eebc6f8202e419c1171268987ea6a6 4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\n
2102 o> ;bookA 4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\n
2102 o> ;bookA\t4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\n
2103 o> bookB bfebe6bd38eebc6f8202e419c1171268987ea6a6;4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab 1\n
2103 o> bookB\tbfebe6bd38eebc6f8202e419c1171268987ea6a6;4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\t1\n
2104 o> bfebe6bd38eebc6f8202e419c1171268987ea6a6 1\n
2104 o> bfebe6bd38eebc6f8202e419c1171268987ea6a6\t1\n
2105 o> publishing True
2105 o> publishing\tTrue
2106 response #0: bfebe6bd38eebc6f8202e419c1171268987ea6a6 4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\n
2106 response #0: bfebe6bd38eebc6f8202e419c1171268987ea6a6 4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\n
2107 response #1: bookA 4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\nbookB bfebe6bd38eebc6f8202e419c1171268987ea6a6
2107 response #1: bookA\t4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\nbookB\tbfebe6bd38eebc6f8202e419c1171268987ea6a6
2108 response #2: 4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab 1\nbfebe6bd38eebc6f8202e419c1171268987ea6a6 1\npublishing True
2108 response #2: 4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\t1\nbfebe6bd38eebc6f8202e419c1171268987ea6a6\t1\npublishing\tTrue
2109
2109
2110 testing ssh2
2110 testing ssh2
2111 creating ssh peer from handshake results
2111 creating ssh peer from handshake results
@@ -2136,10 +2136,10 b' Test batching of requests'
2136 o> 278\n
2136 o> 278\n
2137 o> bufferedread(278) -> 278:
2137 o> bufferedread(278) -> 278:
2138 o> bfebe6bd38eebc6f8202e419c1171268987ea6a6 4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\n
2138 o> bfebe6bd38eebc6f8202e419c1171268987ea6a6 4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\n
2139 o> ;bookA 4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\n
2139 o> ;bookA\t4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\n
2140 o> bookB bfebe6bd38eebc6f8202e419c1171268987ea6a6;4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab 1\n
2140 o> bookB\tbfebe6bd38eebc6f8202e419c1171268987ea6a6;4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\t1\n
2141 o> bfebe6bd38eebc6f8202e419c1171268987ea6a6 1\n
2141 o> bfebe6bd38eebc6f8202e419c1171268987ea6a6\t1\n
2142 o> publishing True
2142 o> publishing\tTrue
2143 response #0: bfebe6bd38eebc6f8202e419c1171268987ea6a6 4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\n
2143 response #0: bfebe6bd38eebc6f8202e419c1171268987ea6a6 4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\n
2144 response #1: bookA 4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\nbookB bfebe6bd38eebc6f8202e419c1171268987ea6a6
2144 response #1: bookA\t4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\nbookB\tbfebe6bd38eebc6f8202e419c1171268987ea6a6
2145 response #2: 4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab 1\nbfebe6bd38eebc6f8202e419c1171268987ea6a6 1\npublishing True
2145 response #2: 4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\t1\nbfebe6bd38eebc6f8202e419c1171268987ea6a6\t1\npublishing\tTrue
General Comments 0
You need to be logged in to leave comments. Login now