提交 030bf377 编写于 作者: V Vlad Ilyushchenko

PG: tests for edge cases and protocol violation in Parse message. Support for...

PG: tests for edge cases and protocol violation in Parse message. Support for Text values in numeric parameters.
上级 1a633e81
......@@ -57,4 +57,24 @@ public class DefaultWireParserConfiguration implements WireParserConfiguration {
// BLOBs must fit inside send buffer together with other column values
return 512 * 1024;
}
@Override
public int getCharacterStoreCapacity() {
return 4096;
}
@Override
public int getCharacterStorePoolCapacity() {
return 64;
}
@Override
public int getFactoryCacheColumnCount() {
return 16;
}
@Override
public int getFactoryCacheRowCount() {
return 16;
}
}
......@@ -85,18 +85,22 @@ public class WireParser implements Closeable {
private final long sendBufferLimit;
private final int recvBufferSize;
private final int sendBufferSize;
// todo: thread local
private final SqlCompiler compiler;
private final ResponseAsciiSink responseAsciiSink = new ResponseAsciiSink();
private final int idleSendCountBeforeGivingUp;
private final int idleRecvCountBeforeGivingUp;
private final AssociativeCache<RecordCursorFactory> factoryCache = new AssociativeCache<>(16, 16);
// todo: thread local
private final AssociativeCache<RecordCursorFactory> factoryCache;
// todo: thread local
private final DirectByteCharSequence dbcs = new DirectByteCharSequence();
// todo: thread local
private final BindVariableService bindVariableService = new BindVariableService();
private final int maxBlobSizeOnQuery;
private final ArrayColumnTypes parameterTypes = new ArrayColumnTypes();
private final IntList parameterFormatCodes = new IntList();
// todo: config man
private final CharacterStore characterStore = new CharacterStore(4096, 16);
// todo: this is thread local
private final CharacterStore characterStore;
private RecordCursor currentCursor = null;
private int sendCurrentCursorTail = TAIL_NONE;
private long sendBufferPtr;
......@@ -121,6 +125,14 @@ public class WireParser implements Closeable {
this.idleRecvCountBeforeGivingUp = configuration.getIdleRecvCountBeforeGivingUp();
this.dumpNetworkTraffic = configuration.getDumpNetworkTraffic();
this.maxBlobSizeOnQuery = configuration.getMaxBlobSizeOnQuery();
this.characterStore = new CharacterStore(
configuration.getCharacterStoreCapacity(),
configuration.getCharacterStorePoolCapacity()
);
this.factoryCache = new AssociativeCache<>(
configuration.getFactoryCacheColumnCount(),
configuration.getFactoryCacheRowCount()
);
LOG.info()
.$("init [recvBufferSize=").$(recvBufferSize)
.$(", sendBufferSize=").$(sendBufferSize)
......@@ -201,6 +213,178 @@ public class WireParser implements Closeable {
}
}
private void bindVariables(long lo, long msgLimit, short parameterCount) throws BadProtocolException, SqlException {
// do we have enough data for all codes?
if (lo + Short.BYTES * parameterCount > msgLimit) {
LOG.error().$("invalid format code count [value=").$(parameterCount).$(']').$();
throw BadProtocolException.INSTANCE;
}
parameterFormatCodes.clear();
for (int j = 0; j < parameterCount; j++) {
final short code = NetworkByteOrderUtils.getShort(lo + j * Short.BYTES);
if (code != 1 && code != 0) {
LOG.error().$("unsupported code [index=").$(j).$(", code=").$(code).$(']').$();
throw BadProtocolException.INSTANCE;
}
parameterFormatCodes.add(code);
LOG.debug().$("parameter format code ").$(code).$();
}
lo += parameterCount * Short.BYTES;
if (lo + Short.BYTES > msgLimit) {
LOG.error().$("could not read parameter value count").$();
throw BadProtocolException.INSTANCE;
}
parameterCount = NetworkByteOrderUtils.getShort(lo);
if (parameterCount != parameterTypes.getColumnCount()) {
LOG.error()
.$("parameter count from parse message does not match parameter value count [valueCount=").$(parameterCount)
.$(", typeCount=").$(parameterTypes.getColumnCount())
.$(']').$();
throw BadProtocolException.INSTANCE;
}
lo += Short.BYTES;
characterStore.clear();
for (int j = 0; j < parameterCount; j++) {
if (lo + Integer.BYTES > msgLimit) {
LOG.error().$("could not read parameter value length [index=").$(j).$(']').$();
throw BadProtocolException.INSTANCE;
}
int valueLen = NetworkByteOrderUtils.getInt(lo);
lo += Integer.BYTES;
if (valueLen == -1) {
// this is null we have already defaulted parameters to
continue;
}
if (lo + valueLen > msgLimit) {
LOG.error()
.$("value length is outside of buffer [parameterIndex=").$(j)
.$(", valueLen=").$(valueLen)
.$(", messageRemaining=").$(msgLimit - lo)
.$(']').$();
throw BadProtocolException.INSTANCE;
}
switch (parameterTypes.getColumnType(j)) {
case PG_INT2: // byte
// postgres sends 'byte' as two-byte short
if (this.parameterFormatCodes.getQuick(j) == 1) {
ensureData(lo, Short.BYTES, msgLimit, j);
bindVariableService.setByte(j, (byte) NetworkByteOrderUtils.getShort(lo));
} else {
ensureData(lo, valueLen, msgLimit, j);
try {
bindVariableService.setByte(j, (byte) Numbers.parseInt(dbcs.of(lo, lo + valueLen)));
} catch (NumericException e) {
e.printStackTrace();
}
}
break;
case PG_FLOAT4: // float
if (this.parameterFormatCodes.getQuick(j) == 1) {
ensureData(lo, Float.BYTES, msgLimit, j);
bindVariableService.setFloat(j, Float.intBitsToFloat(NetworkByteOrderUtils.getInt(lo)));
} else {
ensureData(lo, valueLen, msgLimit, j);
try {
bindVariableService.setFloat(j, Numbers.parseFloat(dbcs.of(lo, lo + valueLen)));
} catch (NumericException e) {
e.printStackTrace();
}
}
break;
case PG_FLOAT8: // double
if (this.parameterFormatCodes.getQuick(j) == 1) {
ensureData(lo, Double.BYTES, msgLimit, j);
bindVariableService.setDouble(j, Double.longBitsToDouble(NetworkByteOrderUtils.getLong(lo)));
} else {
ensureData(lo, valueLen, msgLimit, j);
try {
bindVariableService.setDouble(j, Numbers.parseDouble(dbcs.of(lo, lo + valueLen)));
} catch (NumericException e) {
e.printStackTrace();
}
}
break;
case PG_INT8: // LONG
if (this.parameterFormatCodes.getQuick(j) == 1) {
ensureData(lo, Long.BYTES, msgLimit, j);
bindVariableService.setLong(j, NetworkByteOrderUtils.getLong(lo));
} else {
ensureData(lo, valueLen, msgLimit, j);
try {
bindVariableService.setLong(j, Numbers.parseLong(dbcs.of(lo, lo + valueLen)));
} catch (NumericException e) {
e.printStackTrace();
}
}
break;
case PG_INT4: // INT
if (this.parameterFormatCodes.getQuick(j) == 1) {
ensureData(lo, Integer.BYTES, msgLimit, j);
bindVariableService.setInt(j, NetworkByteOrderUtils.getInt(lo));
} else {
ensureData(lo, valueLen, msgLimit, j);
try {
bindVariableService.setInt(j, Numbers.parseInt(dbcs.of(lo, lo + valueLen)));
} catch (NumericException e) {
e.printStackTrace();
}
}
break;
case PG_BOOL:
if (valueLen != 4 && valueLen != 5) {
throw BadProtocolException.INSTANCE;
}
bindVariableService.setBoolean(j, valueLen == 4);
break;
case PG_VARCHAR:
CharacterStoreEntry e = characterStore.newEntry();
if (Chars.utf8Decode(lo, lo + valueLen, e)) {
bindVariableService.setStr(j, characterStore.toImmutable());
} else {
LOG.error().$("invalid UTF8 bytes [index=").$(j).$(']').$();
throw BadProtocolException.INSTANCE;
}
break;
case PG_UNSPECIFIED:
case PG_TIMESTAMP:
case PG_TIMESTAMPZ:
// this could be either Date or Timestamp
dbcs.of(lo, lo + valueLen);
try {
bindVariableService.setDate(j, PG_DATE_Z_FORMAT.parse(dbcs, DateLocaleFactory.INSTANCE.getDefaultDateLocale()));
} catch (NumericException ex) {
try {
bindVariableService.setDate(j, PG_DATE_TIME_Z_FORMAT.parse(dbcs, DateLocaleFactory.INSTANCE.getDefaultDateLocale()));
} catch (NumericException exc) {
throw SqlException.$(0, "unknown date query parameter [value=").put(dbcs).put(", index=").put(j).put(']');
}
}
break;
case PG_DATE:
// by default statement.setDate() will send type as UNSPECIFIED
// when one calls statement.setNull(Types.DATE) postgres sends PG_DATE, go figure
// todo: attempt for force postgress JDBC to send date as binary when value is not null
break;
default:
LOG.error()
.$("invalid BIND column type [parameterIndex=").$(j)
.$(", type=").$(parameterTypes.getColumnType(j))
.$(']').$();
throw BadProtocolException.INSTANCE;
}
lo += valueLen;
}
}
private void clearRecvBuffer() {
recvBufferWriteOffset = 0;
recvBufferReadOffset = 0;
......@@ -267,14 +451,18 @@ public class WireParser implements Closeable {
}
}
private void ensureLength(int index, int expectedLen, int actualLen, String type) throws BadProtocolException {
if (actualLen != expectedLen) {
LOG.error().$("bad ").$(type).$(" [index=").$(index).$(", len=").$(actualLen).$(']').$();
private void ensureData(long lo, int required, long msgLimit, int j) throws BadProtocolException {
if (lo + required > msgLimit) {
LOG.info().$("not enough bytes for parameter [index=").$(j).$(']').$();
throw BadProtocolException.INSTANCE;
}
}
private long getStringLength(long x, long limit) {
return Unsafe.getUnsafe().getByte(x) == 0 ? x : getStringLengthTedious(x, limit);
}
private long getStringLengthTedious(long x, long limit) {
// calculate length
for (long i = x; i < limit; i++) {
if (Unsafe.getUnsafe().getByte(i) == 0) {
......@@ -306,21 +494,24 @@ public class WireParser implements Closeable {
return;
}
// todo: validate protocol
final byte type = Unsafe.getUnsafe().getByte(address);
LOG.info().$("got msg '").$((char) type).$('\'').$();
LOG.debug().$("received msg [type=").$((char) type).$(']').$();
final int msgLen = NetworkByteOrderUtils.getInt(address + 1);
assert msgLen > 0;
if (msgLen < 1) {
LOG.error().$("invalid message length [type=").$(type).$(", msgLen=").$(msgLen).$(']').$();
throw BadProtocolException.INSTANCE;
}
// msgLen does not take into account type byte
if (msgLen > remaining - 1) {
// When this happens we need to shift our receive buffer left
// to fit this message. Outer function will do that if we
// just exit.
return;
}
// we have enough to read entire message
recvBufferReadOffset += msgLen + 1;
long msgLimit = address + msgLen + 1;
long lo = address + PREFIXED_MESSAGE_HEADER_LEN; // 8 is offset where name value pairs begin
......@@ -348,72 +539,52 @@ public class WireParser implements Closeable {
// possibly more, check QueryExecutionImpl.processResults() in PG driver for more info
hi = getStringLength(lo, msgLimit);
assert hi >= lo;
LOG.info().$("prepared statement name: ").$(dbcs.of(lo, hi)).$();
if (hi == -1) {
// we did not find 0 within message limit
LOG.error().$("bad prepared statement name length [msgType='P']").$();
throw BadProtocolException.INSTANCE;
}
lo = hi + 1;
hi = getStringLength(lo, msgLimit);
assert hi >= lo;
if (hi == -1) {
// we did not find 0 within message limit
LOG.error().$("bad query text length").$();
throw BadProtocolException.INSTANCE;
}
dbcs.of(lo, hi);
LOG.info().$("parse [q=`").$(dbcs).$("`]").$();
LOG.info().$("parse [q=`").$(dbcs.of(lo, hi)).$("`]").$();
lo = hi + 1;
short pc = NetworkByteOrderUtils.getShort(lo);
if (pc < 0 || lo + Short.BYTES + pc * Integer.BYTES > msgLimit) {
LOG.error().$("invalid PARSE msg [parameterCount=").$(pc).$(']').$();
if (lo + Short.BYTES > msgLimit) {
LOG.error().$("could not read parameter count").$();
throw BadProtocolException.INSTANCE;
}
LOG.info().$("params [count=").$(pc).$(']').$();
lo += Short.BYTES;
bindVariableService.clear();
parameterTypes.reset();
for (int j = 0; j < pc; j++) {
LOG.info().$("param [type=").$(NetworkByteOrderUtils.getInt(lo + j * Integer.BYTES)).$(']').$();
int pgType = NetworkByteOrderUtils.getInt(lo + j * Integer.BYTES);
switch (pgType) {
case PG_FLOAT8: // FLOAT8 - double
bindVariableService.setDouble(j, Double.NaN);
break;
case PG_INT4: // INT
bindVariableService.setInt(j, Numbers.INT_NaN);
break;
case PG_INT8:
bindVariableService.setLong(j, Numbers.LONG_NaN);
break;
case PG_FLOAT4:
bindVariableService.setFloat(j, Float.NaN);
break;
case PG_INT2:
bindVariableService.setByte(j, (byte) 0);
break;
case PG_BOOL:
bindVariableService.setBoolean(j, false);
break;
case PG_VARCHAR:
bindVariableService.setStr(j, null);
break;
case PG_UNSPECIFIED:
case PG_DATE:
case PG_TIMESTAMP:
case PG_TIMESTAMPZ:
// postgres JDBC driver does not seem to send
// microseconds with its text timestamp
// on top of this parameters such as setDate, setTimestamp
// cause driver to send UNSPECIFIED type
// QuestDB has to know types to resolve function linkage
// at compile time rather than at runtime.
bindVariableService.setDate(j, Numbers.LONG_NaN);
break;
default:
throw SqlException.$(0, "unsupported parameter [type=").put(pgType).put(", index=").put(j).put(']');
short parameterCount = NetworkByteOrderUtils.getShort(lo);
if (parameterCount > 0) {
if (lo + Short.BYTES + parameterCount * Integer.BYTES > msgLimit) {
LOG.error()
.$("could not read parameters [parameterCount=").$(parameterCount)
.$(", offset=").$(lo - address)
.$(", remaining=").$(msgLimit - lo)
.$(']').$();
throw BadProtocolException.INSTANCE;
}
parameterTypes.add(pgType);
LOG.debug().$("params [count=").$(parameterCount).$(']').$();
lo += Short.BYTES;
bindVariableService.clear();
parameterTypes.reset();
setupBindVariables(lo, parameterCount);
} else if (parameterCount < 0) {
LOG.error()
.$("invalid parameter count [parameterCount=").$(parameterCount)
.$(", offset=").$(lo - address)
.$(']').$();
throw BadProtocolException.INSTANCE;
}
parseQuery(dbcs);
......@@ -437,119 +608,37 @@ public class WireParser implements Closeable {
break;
case 'B': // bind
hi = getStringLength(lo, msgLimit);
assert hi >= lo;
dbcs.of(lo, hi);
LOG.info().$("portal [name=").$(dbcs).$(']').$();
if (hi == -1) {
// we did not find 0 within message limit
LOG.error().$("bad portal name length [msgType='B']").$();
throw BadProtocolException.INSTANCE;
}
lo = hi + 1;
hi = getStringLength(lo, msgLimit);
assert hi >= lo;
dbcs.of(lo, hi);
LOG.info().$("statement [name=").$(dbcs).$(']').$();
if (hi == -1) {
// we did not find 0 within message limit
LOG.error().$("bad prepared statement name length [msgType='B']").$();
throw BadProtocolException.INSTANCE;
}
lo = hi + 1;
short c = NetworkByteOrderUtils.getShort(lo);
LOG.info().$("c = ").$(c).$();
lo += Short.BYTES;
parameterFormatCodes.clear();
for (int j = 0; j < c; j++) {
short code = NetworkByteOrderUtils.getShort(lo + j * Short.BYTES);
if (code != 0 && code != 1) {
throw BadProtocolException.INSTANCE;
}
parameterFormatCodes.add(code);
LOG.debug().$("parameter format code ").$(code).$();
if (lo + Short.BYTES > msgLimit) {
LOG.error().$("could not read parameter format code count").$();
throw BadProtocolException.INSTANCE;
}
lo += c * Short.BYTES;
short pv = NetworkByteOrderUtils.getShort(lo);
lo += Short.BYTES;
LOG.info().$("param value count = ").$(pv).$();
assert pv == c;
assert pv == parameterTypes.getColumnCount();
characterStore.clear();
for (int j = 0; j < pv; j++) {
int valueLen = NetworkByteOrderUtils.getInt(lo);
if (valueLen == -1) {
// this is null we have already defaulted parameters to
lo += Integer.BYTES;
continue;
}
if (lo + Integer.BYTES + valueLen > msgLimit) {
LOG.error().$("value length is outside of buffer [parameterIndex=").$(j).$(", valueLen=").$(valueLen).$(", messageRemaining=").$(msgLimit - lo).$(']').$();
throw BadProtocolException.INSTANCE;
}
switch (parameterTypes.getColumnType(j)) {
case PG_INT2: // byte
// postgres sends 'byte' as two-byte short
bindVariableService.setByte(j, (byte) NetworkByteOrderUtils.getShort(lo + Integer.BYTES));
break;
case PG_FLOAT4: // float
bindVariableService.setFloat(j, Float.intBitsToFloat(NetworkByteOrderUtils.getInt(lo + Integer.BYTES)));
break;
case PG_FLOAT8: // double
bindVariableService.setDouble(j, Double.longBitsToDouble(NetworkByteOrderUtils.getLong(lo + Integer.BYTES)));
break;
case PG_INT8: // LONG
bindVariableService.setLong(j, NetworkByteOrderUtils.getLong(lo + Integer.BYTES));
break;
case PG_INT4: // INT
bindVariableService.setInt(j, NetworkByteOrderUtils.getInt(lo + Integer.BYTES));
break;
case PG_BOOL:
if (valueLen != 4 && valueLen != 5) {
throw BadProtocolException.INSTANCE;
}
bindVariableService.setBoolean(j, valueLen == 4);
break;
case PG_VARCHAR:
CharacterStoreEntry e = characterStore.newEntry();
if (Chars.utf8Decode(lo + Integer.BYTES, lo + Integer.BYTES + valueLen, e)) {
bindVariableService.setStr(j, characterStore.toImmutable());
} else {
LOG.error().$("invalid UTF8 bytes [index=").$(j).$(']').$();
throw BadProtocolException.INSTANCE;
}
break;
case PG_UNSPECIFIED:
case PG_TIMESTAMP:
case PG_TIMESTAMPZ:
// this could be either Date or Timestamp
assert hi != -1;
dbcs.of(lo + Integer.BYTES, lo + Integer.BYTES + valueLen);
try {
bindVariableService.setDate(j, PG_DATE_Z_FORMAT.parse(dbcs, DateLocaleFactory.INSTANCE.getDefaultDateLocale()));
} catch (NumericException ex) {
try {
bindVariableService.setDate(j, PG_DATE_TIME_Z_FORMAT.parse(dbcs, DateLocaleFactory.INSTANCE.getDefaultDateLocale()));
} catch (NumericException exc) {
throw SqlException.$(0, "unknown date query parameter [value=").put(dbcs).put(", index=").put(j).put(']');
}
}
LOG.error().$("timestamp: ").$(dbcs).$();
break;
case PG_DATE:
// by default statement.setDate() will send type as UNSPECIFIED
// when one calls statement.setNull(Types.DATE) postgres sends PG_DATE, go figure
// todo: attempt for force postgress JDBC to send date as binary when value is not null
break;
default:
LOG.error()
.$("invalid BIND column type [parameterIndex=").$(j)
.$(", type=").$(parameterTypes.getColumnType(j))
.$(']').$();
throw BadProtocolException.INSTANCE;
}
lo += Integer.BYTES + valueLen;
parameterCount = NetworkByteOrderUtils.getShort(lo);
if (parameterCount != parameterTypes.getColumnCount()) {
LOG.error()
.$("parameter count from parse message does not match format code count [fmtCodeCount=").$(parameterCount)
.$(", typeCount=").$(parameterTypes.getColumnCount())
.$(']').$();
throw BadProtocolException.INSTANCE;
}
if (parameterCount > 0) {
lo += Short.BYTES;
bindVariables(lo, msgLimit, parameterCount);
}
break;
case 'E': // execute
......@@ -570,8 +659,8 @@ public class WireParser implements Closeable {
}
break;
default:
LOG.error().$("unknown message").$();
assert false;
LOG.error().$("unknown message [type=").$(type).$(']').$();
throw BadProtocolException.INSTANCE;
}
}
......@@ -618,7 +707,7 @@ public class WireParser implements Closeable {
private void prepareLoginOk() {
responseAsciiSink.put(MESSAGE_TYPE_LOGIN_RESPONSE);
responseAsciiSink.putNetworkInt(8); // length of this message
responseAsciiSink.putNetworkInt(Integer.BYTES * 2); // length of this message
responseAsciiSink.putNetworkInt(0); // response code
}
......@@ -637,7 +726,7 @@ public class WireParser implements Closeable {
private void prepareReadyForQuery() {
responseAsciiSink.put(MESSAGE_TYPE_READY_FOR_QUERY);
responseAsciiSink.putNetworkInt(5);
responseAsciiSink.putNetworkInt(Integer.BYTES + Byte.BYTES);
responseAsciiSink.put('I');
}
......@@ -768,7 +857,7 @@ public class WireParser implements Closeable {
private void sendClearTextPasswordChallenge(long fd) throws PeerDisconnectedException, PeerIsSlowToReadException {
responseAsciiSink.reset();
responseAsciiSink.put(MESSAGE_TYPE_LOGIN_RESPONSE);
responseAsciiSink.putNetworkInt(8);
responseAsciiSink.putNetworkInt(Integer.BYTES * 2);
responseAsciiSink.putNetworkInt(3);
send(fd);
}
......@@ -969,6 +1058,50 @@ public class WireParser implements Closeable {
responseAsciiSink.putLen(b);
}
private void setupBindVariables(long lo, short pc) throws SqlException {
for (int j = 0; j < pc; j++) {
int pgType = NetworkByteOrderUtils.getInt(lo + j * Integer.BYTES);
switch (pgType) {
case PG_FLOAT8: // FLOAT8 - double
bindVariableService.setDouble(j, Double.NaN);
break;
case PG_INT4: // INT
bindVariableService.setInt(j, Numbers.INT_NaN);
break;
case PG_INT8:
bindVariableService.setLong(j, Numbers.LONG_NaN);
break;
case PG_FLOAT4:
bindVariableService.setFloat(j, Float.NaN);
break;
case PG_INT2:
bindVariableService.setByte(j, (byte) 0);
break;
case PG_BOOL:
bindVariableService.setBoolean(j, false);
break;
case PG_VARCHAR:
bindVariableService.setStr(j, null);
break;
case PG_UNSPECIFIED:
case PG_DATE:
case PG_TIMESTAMP:
case PG_TIMESTAMPZ:
// postgres JDBC driver does not seem to send
// microseconds with its text timestamp
// on top of this parameters such as setDate, setTimestamp
// cause driver to send UNSPECIFIED type
// QuestDB has to know types to resolve function linkage
// at compile time rather than at runtime.
bindVariableService.setDate(j, Numbers.LONG_NaN);
break;
default:
throw SqlException.$(0, "unsupported parameter [type=").put(pgType).put(", index=").put(j).put(']');
}
parameterTypes.add(pgType);
}
}
private class ResponseAsciiSink extends AbstractCharSink {
private long bookmarkPtr = -1;
......
......@@ -26,10 +26,18 @@ package com.questdb.cutlass.pgwire;
import com.questdb.network.NetworkFacade;
public interface WireParserConfiguration {
int getCharacterStoreCapacity();
int getCharacterStorePoolCapacity();
default boolean getDumpNetworkTraffic() {
return false;
}
int getFactoryCacheColumnCount();
int getFactoryCacheRowCount();
int getIdleRecvCountBeforeGivingUp();
NetworkFacade getNetworkFacade();
......
......@@ -28,13 +28,11 @@ import com.questdb.griffin.engine.functions.rnd.SharedRandom;
import com.questdb.log.Log;
import com.questdb.log.LogFactory;
import com.questdb.network.*;
import com.questdb.std.Chars;
import com.questdb.std.Numbers;
import com.questdb.std.Rnd;
import com.questdb.std.Unsafe;
import com.questdb.std.*;
import com.questdb.std.str.CharSink;
import com.questdb.std.str.StringSink;
import com.questdb.test.tools.TestUtils;
import org.jetbrains.annotations.NotNull;
import org.junit.Assert;
import org.junit.Test;
import org.postgresql.util.PGTimestamp;
......@@ -57,6 +55,206 @@ public class WireParserTest extends AbstractGriffinTest {
private static final Log LOG = LogFactory.getLog(WireParserTest.class);
@Test
public void testAllParamsHex() throws Exception {
final String script = ">0000006900030000757365720078797a006461746162617365006e6162755f61707000636c69656e745f656e636f64696e67005554463800446174655374796c650049534f0054696d655a6f6e6500474d540065787472615f666c6f61745f64696769747300320000\n" +
"<520000000800000003\n" +
">70000000076f6800\n" +
"<520000000800000000530000001154696d655a6f6e6500474d5400530000001d6170706c69636174696f6e5f6e616d65005175657374444200530000001e7365727665725f76657273696f6e5f6e756d00313030303030005300000019696e74656765725f6461746574696d6573006f6e005a0000000549\n" +
">5000000022005345542065787472615f666c6f61745f646967697473203d2033000000420000000c0000000000000000450000000900000000015300000004\n" +
"<31000000045a0000000549\n" +
">500000003700534554206170706c69636174696f6e5f6e616d65203d2027506f737467726553514c204a4442432044726976657227000000420000000c0000000000000000450000000900000000015300000004\n" +
"<31000000045a0000000549\n" +
">50000000cd0073656c65637420782c24312c24322c24332c24342c24352c24362c24372c24382c24392c2431302c2431312c2431322c2431332c2431342c2431352c2431362c2431372c2431382c2431392c2432302c2432312c2432322066726f6d206c6f6e675f73657175656e63652835290000160000001700000014000002bc000002bd0000001500000010000004130000041300000000000000000000001700000014000002bc000002bd000000150000001000000413000004130000043a000000000000045a000004a0420000012c0000001600010001000100010001000000000000000000000001000100010001000100000000000000010000000000000016000000040000000400000008000000000000007b0000000440adc28f000000083fe22c27a63736ce00000002005b00000004545255450000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b20000000e313937302d30312d3031202b30300000001a313937302d30382d32302031313a33333a32302e3033332b3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001a313937302d30312d30312030303a30353a30302e3031312b30300000001a313937302d30312d30312030303a30383a32302e3032332b3030000044000000065000450000000900000000005300000004\n" +
"<54000001f500177800000000000000000000140000000000000000243100000000000000000000170000000000000000243200000000000000000000140000000000000000243300000000000000000002bc0000000000000000243400000000000000000002bd00000000000000002435000000000000000000001500000000000000002436000000000000000000001000000000000000002437000000000000000000041300000000000000002438000000000000000000041300000000000000002439000000000000000000045a0000000000000000243130000000000000000000045a0000000000000000243131000000000000000000001700000000000000002431320000000000000000000014000000000000000024313300000000000000000002bc000000000000000024313400000000000000000002bd000000000000000024313500000000000000000000150000000000000000243136000000000000000000001000000000000000002431370000000000000000000413000000000000000024313800000000000000000004130000000000000000243139000000000000000000045a0000000000000000243230000000000000000000045a0000000000000000243231000000000000000000045a0000000000000000243232000000000000000000045a0000000000000000\n" +
"<44000000f40017000000013100000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013200000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013300000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013400000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013500000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e303233\n" +
"<430000000f53454c45435420302030005a0000000549\n" +
">50000000cd0073656c65637420782c24312c24322c24332c24342c24352c24362c24372c24382c24392c2431302c2431312c2431322c2431332c2431342c2431352c2431362c2431372c2431382c2431392c2432302c2432312c2432322066726f6d206c6f6e675f73657175656e63652835290000160000001700000014000002bc000002bd0000001500000010000004130000041300000000000000000000001700000014000002bc000002bd000000150000001000000413000004130000043a000000000000045a000004a0420000012c0000001600010001000100010001000000000000000000000001000100010001000100000000000000010000000000000016000000040000000400000008000000000000007b0000000440adc28f000000083fe22c27a63736ce00000002005b00000004545255450000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b20000000e313937302d30312d3031202b30300000001a313937302d30382d32302031313a33333a32302e3033332b3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001a313937302d30312d30312030303a30353a30302e3031312b30300000001a313937302d30312d30312030303a30383a32302e3032332b3030000044000000065000450000000900000000005300000004\n" +
"<54000001f500177800000000000000000000140000000000000000243100000000000000000000170000000000000000243200000000000000000000140000000000000000243300000000000000000002bc0000000000000000243400000000000000000002bd00000000000000002435000000000000000000001500000000000000002436000000000000000000001000000000000000002437000000000000000000041300000000000000002438000000000000000000041300000000000000002439000000000000000000045a0000000000000000243130000000000000000000045a0000000000000000243131000000000000000000001700000000000000002431320000000000000000000014000000000000000024313300000000000000000002bc000000000000000024313400000000000000000002bd000000000000000024313500000000000000000000150000000000000000243136000000000000000000001000000000000000002431370000000000000000000413000000000000000024313800000000000000000004130000000000000000243139000000000000000000045a0000000000000000243230000000000000000000045a0000000000000000243231000000000000000000045a0000000000000000243232000000000000000000045a0000000000000000\n" +
"<44000000f40017000000013100000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013200000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013300000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013400000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013500000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e303233\n" +
"<430000000f53454c45435420302030005a0000000549\n" +
">50000000cd0073656c65637420782c24312c24322c24332c24342c24352c24362c24372c24382c24392c2431302c2431312c2431322c2431332c2431342c2431352c2431362c2431372c2431382c2431392c2432302c2432312c2432322066726f6d206c6f6e675f73657175656e63652835290000160000001700000014000002bc000002bd0000001500000010000004130000041300000000000000000000001700000014000002bc000002bd000000150000001000000413000004130000043a000000000000045a000004a0420000012c0000001600010001000100010001000000000000000000000001000100010001000100000000000000010000000000000016000000040000000400000008000000000000007b0000000440adc28f000000083fe22c27a63736ce00000002005b00000004545255450000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b20000000e313937302d30312d3031202b30300000001a313937302d30382d32302031313a33333a32302e3033332b3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001a313937302d30312d30312030303a30353a30302e3031312b30300000001a313937302d30312d30312030303a30383a32302e3032332b3030000044000000065000450000000900000000005300000004\n" +
"<54000001f500177800000000000000000000140000000000000000243100000000000000000000170000000000000000243200000000000000000000140000000000000000243300000000000000000002bc0000000000000000243400000000000000000002bd00000000000000002435000000000000000000001500000000000000002436000000000000000000001000000000000000002437000000000000000000041300000000000000002438000000000000000000041300000000000000002439000000000000000000045a0000000000000000243130000000000000000000045a0000000000000000243131000000000000000000001700000000000000002431320000000000000000000014000000000000000024313300000000000000000002bc000000000000000024313400000000000000000002bd000000000000000024313500000000000000000000150000000000000000243136000000000000000000001000000000000000002431370000000000000000000413000000000000000024313800000000000000000004130000000000000000243139000000000000000000045a0000000000000000243230000000000000000000045a0000000000000000243231000000000000000000045a0000000000000000243232000000000000000000045a0000000000000000\n" +
"<44000000f40017000000013100000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013200000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013300000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013400000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013500000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e303233\n" +
"<430000000f53454c45435420302030005a0000000549\n" +
">50000000cd0073656c65637420782c24312c24322c24332c24342c24352c24362c24372c24382c24392c2431302c2431312c2431322c2431332c2431342c2431352c2431362c2431372c2431382c2431392c2432302c2432312c2432322066726f6d206c6f6e675f73657175656e63652835290000160000001700000014000002bc000002bd0000001500000010000004130000041300000000000000000000001700000014000002bc000002bd000000150000001000000413000004130000043a000000000000045a000004a0420000012c0000001600010001000100010001000000000000000000000001000100010001000100000000000000010000000000000016000000040000000400000008000000000000007b0000000440adc28f000000083fe22c27a63736ce00000002005b00000004545255450000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b20000000e313937302d30312d3031202b30300000001a313937302d30382d32302031313a33333a32302e3033332b3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001a313937302d30312d30312030303a30353a30302e3031312b30300000001a313937302d30312d30312030303a30383a32302e3032332b3030000044000000065000450000000900000000005300000004\n" +
"<54000001f500177800000000000000000000140000000000000000243100000000000000000000170000000000000000243200000000000000000000140000000000000000243300000000000000000002bc0000000000000000243400000000000000000002bd00000000000000002435000000000000000000001500000000000000002436000000000000000000001000000000000000002437000000000000000000041300000000000000002438000000000000000000041300000000000000002439000000000000000000045a0000000000000000243130000000000000000000045a0000000000000000243131000000000000000000001700000000000000002431320000000000000000000014000000000000000024313300000000000000000002bc000000000000000024313400000000000000000002bd000000000000000024313500000000000000000000150000000000000000243136000000000000000000001000000000000000002431370000000000000000000413000000000000000024313800000000000000000004130000000000000000243139000000000000000000045a0000000000000000243230000000000000000000045a0000000000000000243231000000000000000000045a0000000000000000243232000000000000000000045a0000000000000000\n" +
"<44000000f40017000000013100000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013200000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013300000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013400000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013500000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e303233\n" +
"<430000000f53454c45435420302030005a0000000549\n" +
">50000000d0535f310073656c65637420782c24312c24322c24332c24342c24352c24362c24372c24382c24392c2431302c2431312c2431322c2431332c2431342c2431352c2431362c2431372c2431382c2431392c2432302c2432312c2432322066726f6d206c6f6e675f73657175656e63652835290000160000001700000014000002bc000002bd0000001500000010000004130000041300000000000000000000001700000014000002bc000002bd000000150000001000000413000004130000043a000000000000045a000004a0440000000953535f3100420000012f00535f3100001600010001000100010001000000000000000000000001000100010001000100000000000000010000000000000016000000040000000400000008000000000000007b0000000440adc28f000000083fe22c27a63736ce00000002005b00000004545255450000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b20000000e313937302d30312d3031202b30300000001a313937302d30382d32302031313a33333a32302e3033332b3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001a313937302d30312d30312030303a30353a30302e3031312b30300000001a313937302d30312d30312030303a30383a32302e3032332b30300000450000000900000000005300000004\n" +
"<54000001f500177800000000000000000000140000000000000000243100000000000000000000170000000000000000243200000000000000000000140000000000000000243300000000000000000002bc0000000000000000243400000000000000000002bd00000000000000002435000000000000000000001500000000000000002436000000000000000000001000000000000000002437000000000000000000041300000000000000002438000000000000000000041300000000000000002439000000000000000000045a0000000000000000243130000000000000000000045a0000000000000000243131000000000000000000001700000000000000002431320000000000000000000014000000000000000024313300000000000000000002bc000000000000000024313400000000000000000002bd000000000000000024313500000000000000000000150000000000000000243136000000000000000000001000000000000000002431370000000000000000000413000000000000000024313800000000000000000004130000000000000000243139000000000000000000045a0000000000000000243230000000000000000000045a0000000000000000243231000000000000000000045a0000000000000000243232000000000000000000045a0000000000000000\n" +
"<44000000f40017000000013100000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013200000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013300000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013400000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013500000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e303233\n" +
"<430000000f53454c45435420302030005a0000000549\n" +
">430000000953535f310050000000d0535f320073656c65637420782c24312c24322c24332c24342c24352c24362c24372c24382c24392c2431302c2431312c2431322c2431332c2431342c2431352c2431362c2431372c2431382c2431392c2432302c2432312c2432322066726f6d206c6f6e675f73657175656e63652835290000160000001700000014000002bc000002bd0000001500000010000004130000041300000000000000000000001700000014000002bc000002bd000000150000001000000413000004130000043a000000000000045a000004a0440000000953535f3200420000012f00535f3200001600010001000100010001000000000000000000000001000100010001000100000000000000010000000000000016000000040000000400000008000000000000007b0000000440adc28f000000083fe22c27a63736ce00000002005b00000004545255450000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b20000000e313937302d30312d3031202b30300000001a313937302d30382d32302031313a33333a32302e3033332b3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001a313937302d30312d30312030303a30353a30302e3031312b30300000001a313937302d30312d30312030303a30383a32302e3032332b30300000450000000900000000005300000004\n" +
"<3300000004\n" +
"<54000001f500177800000000000000000000140000000000000000243100000000000000000000170000000000000000243200000000000000000000140000000000000000243300000000000000000002bc0000000000000000243400000000000000000002bd00000000000000002435000000000000000000001500000000000000002436000000000000000000001000000000000000002437000000000000000000041300000000000000002438000000000000000000041300000000000000002439000000000000000000045a0000000000000000243130000000000000000000045a0000000000000000243131000000000000000000001700000000000000002431320000000000000000000014000000000000000024313300000000000000000002bc000000000000000024313400000000000000000002bd000000000000000024313500000000000000000000150000000000000000243136000000000000000000001000000000000000002431370000000000000000000413000000000000000024313800000000000000000004130000000000000000243139000000000000000000045a0000000000000000243230000000000000000000045a0000000000000000243231000000000000000000045a0000000000000000243232000000000000000000045a0000000000000000\n" +
"<44000000f40017000000013100000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013200000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013300000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013400000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013500000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e303233\n" +
"<430000000f53454c45435420302030005a0000000549\n" +
">430000000953535f320050000000d0535f330073656c65637420782c24312c24322c24332c24342c24352c24362c24372c24382c24392c2431302c2431312c2431322c2431332c2431342c2431352c2431362c2431372c2431382c2431392c2432302c2432312c2432322066726f6d206c6f6e675f73657175656e63652835290000160000001700000014000002bc000002bd0000001500000010000004130000041300000000000000000000001700000014000002bc000002bd000000150000001000000413000004130000043a000000000000045a000004a0440000000953535f3300420000012f00535f3300001600010001000100010001000000000000000000000001000100010001000100000000000000010000000000000016000000040000000400000008000000000000007b0000000440adc28f000000083fe22c27a63736ce00000002005b00000004545255450000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b20000000e313937302d30312d3031202b30300000001a313937302d30382d32302031313a33333a32302e3033332b3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001a313937302d30312d30312030303a30353a30302e3031312b30300000001a313937302d30312d30312030303a30383a32302e3032332b30300000450000000900000000005300000004\n" +
"<3300000004\n" +
"<54000001f500177800000000000000000000140000000000000000243100000000000000000000170000000000000000243200000000000000000000140000000000000000243300000000000000000002bc0000000000000000243400000000000000000002bd00000000000000002435000000000000000000001500000000000000002436000000000000000000001000000000000000002437000000000000000000041300000000000000002438000000000000000000041300000000000000002439000000000000000000045a0000000000000000243130000000000000000000045a0000000000000000243131000000000000000000001700000000000000002431320000000000000000000014000000000000000024313300000000000000000002bc000000000000000024313400000000000000000002bd000000000000000024313500000000000000000000150000000000000000243136000000000000000000001000000000000000002431370000000000000000000413000000000000000024313800000000000000000004130000000000000000243139000000000000000000045a0000000000000000243230000000000000000000045a0000000000000000243231000000000000000000045a0000000000000000243232000000000000000000045a0000000000000000\n" +
"<44000000f40017000000013100000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013200000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013300000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013400000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013500000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e303233\n" +
"<430000000f53454c45435420302030005a0000000549\n" +
">430000000953535f330050000000d0535f340073656c65637420782c24312c24322c24332c24342c24352c24362c24372c24382c24392c2431302c2431312c2431322c2431332c2431342c2431352c2431362c2431372c2431382c2431392c2432302c2432312c2432322066726f6d206c6f6e675f73657175656e63652835290000160000001700000014000002bc000002bd0000001500000010000004130000041300000000000000000000001700000014000002bc000002bd000000150000001000000413000004130000043a000000000000045a000004a0440000000953535f3400420000012f00535f3400001600010001000100010001000000000000000000000001000100010001000100000000000000010000000000000016000000040000000400000008000000000000007b0000000440adc28f000000083fe22c27a63736ce00000002005b00000004545255450000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b20000000e313937302d30312d3031202b30300000001a313937302d30382d32302031313a33333a32302e3033332b3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001a313937302d30312d30312030303a30353a30302e3031312b30300000001a313937302d30312d30312030303a30383a32302e3032332b30300000450000000900000000005300000004\n" +
"<3300000004\n" +
"<54000001f500177800000000000000000000140000000000000000243100000000000000000000170000000000000000243200000000000000000000140000000000000000243300000000000000000002bc0000000000000000243400000000000000000002bd00000000000000002435000000000000000000001500000000000000002436000000000000000000001000000000000000002437000000000000000000041300000000000000002438000000000000000000041300000000000000002439000000000000000000045a0000000000000000243130000000000000000000045a0000000000000000243131000000000000000000001700000000000000002431320000000000000000000014000000000000000024313300000000000000000002bc000000000000000024313400000000000000000002bd000000000000000024313500000000000000000000150000000000000000243136000000000000000000001000000000000000002431370000000000000000000413000000000000000024313800000000000000000004130000000000000000243139000000000000000000045a0000000000000000243230000000000000000000045a0000000000000000243231000000000000000000045a0000000000000000243232000000000000000000045a0000000000000000\n" +
"<44000000f40017000000013100000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013200000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013300000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013400000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013500000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e303233\n" +
"<430000000f53454c45435420302030005a0000000549\n" +
">430000000953535f340050000000d0535f350073656c65637420782c24312c24322c24332c24342c24352c24362c24372c24382c24392c2431302c2431312c2431322c2431332c2431342c2431352c2431362c2431372c2431382c2431392c2432302c2432312c2432322066726f6d206c6f6e675f73657175656e63652835290000160000001700000014000002bc000002bd0000001500000010000004130000041300000000000000000000001700000014000002bc000002bd000000150000001000000413000004130000043a000000000000045a000004a0440000000953535f3500420000012f00535f3500001600010001000100010001000000000000000000000001000100010001000100000000000000010000000000000016000000040000000400000008000000000000007b0000000440adc28f000000083fe22c27a63736ce00000002005b00000004545255450000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b20000000e313937302d30312d3031202b30300000001a313937302d30382d32302031313a33333a32302e3033332b3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001a313937302d30312d30312030303a30353a30302e3031312b30300000001a313937302d30312d30312030303a30383a32302e3032332b30300000450000000900000000005300000004\n" +
"<3300000004\n" +
"<54000001f500177800000000000000000000140000000000000000243100000000000000000000170000000000000000243200000000000000000000140000000000000000243300000000000000000002bc0000000000000000243400000000000000000002bd00000000000000002435000000000000000000001500000000000000002436000000000000000000001000000000000000002437000000000000000000041300000000000000002438000000000000000000041300000000000000002439000000000000000000045a0000000000000000243130000000000000000000045a0000000000000000243131000000000000000000001700000000000000002431320000000000000000000014000000000000000024313300000000000000000002bc000000000000000024313400000000000000000002bd000000000000000024313500000000000000000000150000000000000000243136000000000000000000001000000000000000002431370000000000000000000413000000000000000024313800000000000000000004130000000000000000243139000000000000000000045a0000000000000000243230000000000000000000045a0000000000000000243231000000000000000000045a0000000000000000243232000000000000000000045a0000000000000000\n" +
"<44000000f40017000000013100000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013200000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013300000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013400000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013500000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e303233\n" +
"<430000000f53454c45435420302030005a0000000549\n" +
">430000000953535f350050000000d0535f360073656c65637420782c24312c24322c24332c24342c24352c24362c24372c24382c24392c2431302c2431312c2431322c2431332c2431342c2431352c2431362c2431372c2431382c2431392c2432302c2432312c2432322066726f6d206c6f6e675f73657175656e63652835290000160000001700000014000002bc000002bd0000001500000010000004130000041300000000000000000000001700000014000002bc000002bd000000150000001000000413000004130000043a000000000000045a000004a0440000000953535f3600420000012f00535f3600001600010001000100010001000000000000000000000001000100010001000100000000000000010000000000000016000000040000000400000008000000000000007b0000000440adc28f000000083fe22c27a63736ce00000002005b00000004545255450000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b20000000e313937302d30312d3031202b30300000001a313937302d30382d32302031313a33333a32302e3033332b3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001a313937302d30312d30312030303a30353a30302e3031312b30300000001a313937302d30312d30312030303a30383a32302e3032332b30300000450000000900000000005300000004\n" +
"<3300000004\n" +
"<54000001f500177800000000000000000000140000000000000000243100000000000000000000170000000000000000243200000000000000000000140000000000000000243300000000000000000002bc0000000000000000243400000000000000000002bd00000000000000002435000000000000000000001500000000000000002436000000000000000000001000000000000000002437000000000000000000041300000000000000002438000000000000000000041300000000000000002439000000000000000000045a0000000000000000243130000000000000000000045a0000000000000000243131000000000000000000001700000000000000002431320000000000000000000014000000000000000024313300000000000000000002bc000000000000000024313400000000000000000002bd000000000000000024313500000000000000000000150000000000000000243136000000000000000000001000000000000000002431370000000000000000000413000000000000000024313800000000000000000004130000000000000000243139000000000000000000045a0000000000000000243230000000000000000000045a0000000000000000243231000000000000000000045a0000000000000000243232000000000000000000045a0000000000000000\n" +
"<44000000f40017000000013100000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013200000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013300000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013400000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013500000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e303233\n" +
"<430000000f53454c45435420302030005a0000000549\n" +
">5800000004\n";
assertHexScript(
getFragmentedSendFacade(),
NetworkFacadeImpl.INSTANCE,
script,
new DefaultWireParserConfiguration() {
@Override
public boolean getDumpNetworkTraffic() {
return true;
}
}
);
}
@Test
public void testBadMessageLength() throws Exception {
final String script =
">0000006900030000757365720078797a006461746162617365006e6162755f61707000636c69656e745f656e636f64696e67005554463800446174655374796c650049534f0054696d655a6f6e6500474d540065787472615f666c6f61745f64696769747300320000\n" +
"<520000000800000003\n" +
">70000000006f6800\n" +
"<!!";
assertHexScript(
getFragmentedSendFacade(),
NetworkFacadeImpl.INSTANCE,
script,
new DefaultWireParserConfiguration()
);
}
@Test
public void testHexFragmentedSend() throws Exception {
// this is a HEX encoded bytes of the same script as 'testSimple' sends using postgres jdbc driver
String script = ">0000007300030000757365720078797a006461746162617365006e6162755f61707000636c69656e745f656e636f64696e67005554463800446174655374796c650049534f0054696d655a6f6e65004575726f70652f4c6f6e646f6e0065787472615f666c6f61745f64696769747300320000\n" +
"<520000000800000003\n" +
">70000000076f6800\n" +
"<520000000800000000530000001154696d655a6f6e6500474d5400530000001d6170706c69636174696f6e5f6e616d65005175657374444200530000001e7365727665725f76657273696f6e5f6e756d00313030303030005300000019696e74656765725f6461746574696d6573006f6e005a0000000549\n" +
">5000000022005345542065787472615f666c6f61745f646967697473203d2033000000420000000c0000000000000000450000000900000000015300000004\n" +
"<31000000045a0000000549\n" +
">500000003700534554206170706c69636174696f6e5f6e616d65203d2027506f737467726553514c204a4442432044726976657227000000420000000c0000000000000000450000000900000000015300000004\n" +
"<31000000045a0000000549\n" +
">50000001a20073656c65637420726e645f73747228342c342c342920732c20726e645f696e7428302c203235362c20342920692c20726e645f646f75626c6528342920642c2074696d657374616d705f73657175656e636528746f5f74696d657374616d702830292c31303030302920742c20726e645f666c6f617428342920662c20726e645f73686f72742829205f73686f72742c20726e645f6c6f6e6728302c2031303030303030302c203529206c2c20726e645f74696d657374616d7028746f5f74696d657374616d70282732303135272c277979797927292c746f5f74696d657374616d70282732303136272c277979797927292c3229207473322c20726e645f6279746528302c313237292062622c20726e645f626f6f6c65616e282920622c20726e645f73796d626f6c28342c342c342c32292c20726e645f6461746528746f5f64617465282732303135272c20277979797927292c20746f5f64617465282732303136272c20277979797927292c2032292c726e645f62696e2831302c32302c32292066726f6d206c6f6e675f73657175656e636528353029000000420000000c000000000000000044000000065000450000000900000000005300000004\n" +
"<5400000128000d730000000000000000000413000000000000000069000000000000000000001700000000000000006400000000000000000002bd000000000000000074000000000000000000045a00000000000000006600000000000000000002bc00000000000000005f73686f7274000000000000000000001500000000000000006c00000000000000000000140000000000000000747332000000000000000000045a00000000000000006262000000000000000000001500000000000000006200000000000000000000100000000000000000726e645f73796d626f6c00000000000000000004130000000000000000726e645f64617465000000000000000000045a0000000000000000726e645f62696e00000000000000000000110000000000000001\n" +
"<4400000099000dffffffff00000002353700000005302e3632350000001a313937302d30312d30312030303a30303a30302e30303030303000000005302e343632000000052d313539330000000733343235323332ffffffff000000033132310000000166000000045045484e00000017323031352d30332d31372030343a32353a35322e3736350000000e19c49594365349b4597e3b08a11e44000000bb000d00000004585953420000000331343200000005302e3537390000001a313937302d30312d30312030303a30303a30302e30313030303000000005302e39363900000005323030383800000007313531373439300000001a323031352d30312d31372032303a34313a31392e343830363835000000033130300000000174000000045045484e00000017323031352d30362d32302030313a31303a35382e35393900000011795f8b812b934d1a8e78b5b91153d0fb6444000000b4000d000000044f5a5a560000000332313900000005302e3136340000001a313937302d30312d30312030303a30303a30302e30323030303000000005302e363539000000062d313233303300000007393438393530380000001a323031352d30382d31332031373a31303a31392e37353235323100000001360000000166ffffffff00000017323031352d30352d32302030313a34383a33372e3431380000000f2b4d5ff64690c3b3598ee5612f640e44000000a4000d000000044f4c595800000002333000000005302e3731330000001a313937302d30312d30312030303a30303a30302e30333030303000000005302e363535000000043636313000000007363530343432380000001a323031352d30382d30382030303a34323a32342e353435363339000000033132330000000166ffffffff00000017323031352d30312d30332031333a35333a30332e313635ffffffff440000009f000d000000045449514200000002343200000005302e3638310000001a313937302d30312d30312030303a30303a30302e30343030303000000005302e363236000000052d3136303500000007383831343038360000001a323031352d30372d32382031353a30383a35332e34363234393500000002323800000001740000000443505357ffffffff0000000e3ba6dc3b7d2be392fe6938e1779a44000000a2000d000000044c544f560000000331333700000005302e3736330000001a313937302d30312d30312030303a30303a30302e30353030303000000005302e3838320000000439303534ffffffff0000001a323031352d30342d32302030353a30393a30332e353830353734000000033130360000000166000000045045484e00000017323031352d30312d30392030363a35373a31372e353132ffffffff44000000a0000d000000045a494d4e00000003313235ffffffff0000001a313937302d30312d30312030303a30303a30302e303630303030ffffffff00000005313135323400000007383333353236310000001a323031352d31302d32362030323a31303a35302e363838333934000000033131310000000174000000045045484e00000017323031352d30382d32312031353a34363a33322e363234ffffffff4400000093000d000000044f504a4f0000000331363800000005302e3130350000001a313937302d30312d30312030303a30303a30302e30373030303000000005302e353335000000052d3539323000000007373038303730340000001a323031352d30372d31312030393a31353a33382e3334323731370000000331303300000001660000000456544a57ffffffffffffffff44000000a9000d00000004474c554f0000000331343500000005302e3533390000001a313937302d30312d30312030303a30303a30302e30383030303000000005302e37363700000005313432343200000007323439393932320000001a323031352d31312d30322030393a30313a33312e3331323830340000000238340000000166000000045045484e00000017323031352d31312d31342031373a33373a33362e303433ffffffff44000000b6000d000000045a5651450000000331303300000005302e3637330000001a313937302d30312d30312030303a30303a30302e303930303030ffffffff00000005313337323700000007373837353834360000001a323031352d31322d31322031333a31363a32362e3133343536320000000232320000000174000000045045484e00000017323031352d30312d32302030343a35303a33342e30393800000012143380c9eba3677a1a79e435e43adc5c65ff440000009a000d000000044c4947590000000331393900000005302e3238340000001a313937302d30312d30312030303a30303a30302e313030303030ffffffff00000005333034323600000007333231353536320000001a323031352d30382d32312031343a35353a30372e30353537323200000002313100000001660000000456544a57ffffffff0000000dff703ac78ab314cd470b0c3912440000009a000d000000044d514e5400000002343300000005302e3538360000001a313937302d30312d30312030303a30303a30302e31313030303000000005302e333335000000053237303139ffffffffffffffff0000000232370000000174000000045045484e00000017323031352d30372d31322031323a35393a34372e3636350000001326fb2e42faf56e8f80e354b807b13257ff9aef44000000bb000d00000004575743430000000332313300000005302e3736370000001a313937302d30312d30312030303a30303a30302e31323030303000000005302e35383000000005313336343000000007343132313932330000001a323031352d30382d30362030323a32373a33302e3436393736320000000237330000000166000000045045484e00000017323031352d30342d33302030383a31383a31302e3435330000001271a7d5af11963708dd98ef54882aa2ade7d444000000a2000d00000004564647500000000331323000000005302e3834300000001a313937302d30312d30312030303a30303a30302e31333030303000000005302e373733000000043732323300000007373234313432330000001a323031352d31322d31382030373a33323a31382e34353630323500000002343300000001660000000456544a57ffffffff00000011244e44a80dfe27ec53135db215e7b8356744000000a9000d00000004524d44470000000331333400000005302e3131300000001a313937302d30312d30312030303a30303a30302e31343030303000000005302e30343300000005323132323700000007373135353730380000001a323031352d30372d30332030343a31323a34352e3737343238310000000234320000000174000000044350535700000017323031352d30322d32342031323a31303a34332e313939ffffffff44000000a5000d0000000457464f5100000003323535ffffffff0000001a313937302d30312d30312030303a30303a30302e31353030303000000005302e31313600000005333135363900000007363638383237370000001a323031352d30352d31392030333a33303a34352e373739393939000000033132360000000174000000045045484e00000017323031352d31322d30392030393a35373a31372e303738ffffffff440000008b000d000000044d58444b00000002353600000005312e3030300000001a313937302d30312d30312030303a30303a30302e31363030303000000005302e353233000000062d33323337320000000736383834313332ffffffff0000000235380000000166ffffffff00000017323031352d30312d32302030363a31383a31382e353833ffffffff44000000ae000d00000004584d4b4a0000000331333900000005302e3834310000001a313937302d30312d30312030303a30303a30302e31373030303000000005302e333036000000053235383536ffffffff0000001a323031352d30352d31382030333a35303a32322e373331343337000000013200000001740000000456544a5700000017323031352d30362d32352031303a34353a30312e3031340000000d007cfb0119caf2bf845a6f383544000000af000d0000000456494844ffffffffffffffff0000001a313937302d30312d30312030303a30303a30302e31383030303000000005302e35353000000005323232383000000007393130393834320000001a323031352d30312d32352031333a35313a33382e3237303538330000000239340000000166000000044350535700000017323031352d31302d32372030323a35323a31392e3933350000000e2d16f389a38364ded6fdc45bc4e944000000b0000d0000000457504e58ffffffff00000005302e3934370000001a313937302d30312d30312030303a30303a30302e31393030303000000005302e343135000000062d3137393333000000063637343236310000001a323031352d30332d30342031353a34333a31352e3231333638360000000234330000000174000000044859525800000017323031352d31322d31382032313a32383a32352e3332350000000ab34c0e8ff10cc560b7d144000000b0000d0000000459504f5600000002333600000005302e3637340000001a313937302d30312d30312030303a30303a30302e32303030303000000005302e303331000000052d3538383800000007313337353432330000001a323031352d31322d31302032303a35303a33352e38363636313400000001330000000174ffffffff00000017323031352d30372d32332032303a31373a30342e3233360000000dd4abbe30fa8dac3d98a0ad9a5d44000000b9000d000000044e55484effffffff00000005302e3639340000001a313937302d30312d30312030303a30303a30302e32313030303000000005302e333339000000062d323532323600000007333532343734380000001a323031352d30352d30372030343a30373a31382e31353239363800000002333900000001740000000456544a5700000017323031352d30342d30342031353a32333a33342e31333000000012b8bef8a146872892a39be3cbc2648ab035d8440000008e000d00000004424f53450000000332343000000005302e3036300000001a313937302d30312d30312030303a30303a30302e32323030303000000005302e33373900000005323339303400000007393036393333390000001a323031352d30332d32312030333a34323a34322e3634333138360000000238340000000174ffffffffffffffffffffffff44000000b8000d00000004494e4b470000000331323400000005302e3836320000001a313937302d30312d30312030303a30303a30302e32333030303000000005302e343034000000062d333033383300000007373233333534320000001a323031352d30372d32312031363a34323a34372e3031323134380000000239390000000166ffffffff00000017323031352d30382d32372031373a32353a33352e3330380000001287fc9283fc88f3322770c801b0dcc93a5b7e44000000a4000d000000044655584300000002353200000005302e3734330000001a313937302d30312d30312030303a30303a30302e323430303030ffffffff000000062d313437323900000007313034323036340000001a323031352d30382d32312030323a31303a35382e3934393637340000000232380000000174000000044350535700000017323031352d30382d32392032303a31353a35312e383335ffffffff44000000b1000d00000004554e595100000002373100000005302e3434320000001a313937302d30312d30312030303a30303a30302e32353030303000000005302e353339000000062d3232363131ffffffff0000001a323031352d31322d32332031383a34313a34322e3331393835390000000239380000000174000000045045484e00000017323031352d30312d32362030303a35353a35302e3230320000000f28ed9799d877333fb267da984747bf44000000a3000d000000044b424d51ffffffff00000005302e3238300000001a313937302d30312d30312030303a30303a30302e323630303030ffffffff000000053132323430ffffffff0000001a323031352d30382d31362030313a30323a35352e3736363632320000000232310000000166ffffffff00000017323031352d30352d31392030303a34373a31382e3639380000000d6ade4604d381e7a21622353b1c4400000091000d000000044a534f4c00000003323433ffffffff0000001a313937302d30312d30312030303a30303a30302e32373030303000000005302e303638000000062d3137343638ffffffffffffffff0000000232300000000174ffffffff00000017323031352d30362d31392031303a33383a35342e343833000000113de02d0486e7ca29980769ca5bd6cf0969440000007f000d00000004484e535300000003313530ffffffff0000001a313937302d30312d30312030303a30303a30302e32383030303000000005302e3134380000000531343834310000000735393932343433ffffffff0000000232350000000166000000045045484effffffff0000000c14d6fcee032281b806c406af44000000b4000d00000004505a50420000000331303100000005302e3036320000001a313937302d30312d30312030303a30303a30302e323930303030ffffffff00000005313232333700000007393837383137390000001a323031352d30392d30332032323a31333a31382e38353234363500000002373900000001660000000456544a5700000017323031352d31322d31372031353a31323a35342e3935380000001012613a9aad982e7552ad62878845b99d44000000b6000d000000044f594e4e00000002323500000005302e3333390000001a313937302d30312d30312030303a30303a30302e33303030303000000005302e36323800000005323234313200000007343733363337380000001a323031352d31302d31302031323a31393a34322e353238323234000000033130360000000174000000044350535700000017323031352d30372d30312030303a32333a34392e3738390000000d54133fffb67ecd0427669489db4400000076000dffffffff0000000331313700000005302e3536340000001a313937302d30312d30312030303a30303a30302e333130303030ffffffff000000052d353630340000000736333533303138ffffffff0000000238340000000166ffffffffffffffff0000000b2bad2507db6244336e008e440000008b000d00000004485652490000000332333300000005302e3232340000001a313937302d30312d30312030303a30303a30302e33323030303000000005302e3432350000000531303436390000000731373135323133ffffffff0000000238360000000166ffffffff00000017323031352d30322d30322030353a34383a31372e333733ffffffff44000000a9000d000000044f59544f00000002393600000005302e3734310000001a313937302d30312d30312030303a30303a30302e33333030303000000005302e353238000000062d313232333900000007333439393632300000001a323031352d30322d30372032323a33353a30332e3231323236380000000231370000000166000000045045484e00000017323031352d30332d32392031323a35353a31312e363832ffffffff4400000098000d000000044c46435900000002363300000005302e3732320000001a313937302d30312d30312030303a30303a30302e333430303030ffffffff0000000532333334340000000739353233393832ffffffff000000033132330000000166000000044350535700000017323031352d30352d31382030343a33353a32372e3232380000000e05e5c04eccd6e37b34cd1535bba444000000b4000d0000000447484c580000000331343800000005302e3330360000001a313937302d30312d30312030303a30303a30302e33353030303000000005302e363336000000062d333134353700000007323332323333370000001a323031352d31302d32322031323a30363a30352e3534343730310000000239310000000174000000044859525800000017323031352d30352d32312030393a33333a31382e3135380000000a571d91723004b702cb0344000000a4000d000000045954535a00000003313233ffffffff0000001a313937302d30312d30312030303a30303a30302e33363030303000000005302e35313900000005323235333400000007343434363233360000001a323031352d30372d32372030373a32333a33372e3233333731310000000235330000000166000000044350535700000017323031352d30312d31332030343a33373a31302e303336ffffffff44000000a3000d0000000453574c5500000003323531ffffffff0000001a313937302d30312d30312030303a30303a30302e33373030303000000005302e313739000000043737333400000007343038323437350000001a323031352d31302d32312031383a32343a33342e3430303334350000000236390000000166000000045045484e00000017323031352d30342d30312031343a33333a34322e303035ffffffff44000000b1000d0000000454514a4c00000003323435ffffffff0000001a313937302d30312d30312030303a30303a30302e33383030303000000005302e3836350000000439353136000000063932393334300000001a323031352d30352d32382030343a31383a31382e36343035363700000002363900000001660000000456544a5700000017323031352d30362d31322032303a31323a32382e3838310000000f6c3e51d7ebb10771321faf404e8c47440000009e000d000000045245494a000000023934ffffffff0000001a313937302d30312d30312030303a30303a30302e33393030303000000005302e313330000000062d3239393234ffffffff0000001a323031352d30332d32302032323a31343a34362e323034373138000000033131330000000174000000044859525800000017323031352d31322d31392031333a35383a34312e383139ffffffff44000000b5000d000000044844485100000002393400000005302e3732330000001a313937302d30312d30312030303a30303a30302e34303030303000000005302e373330000000053139393730000000063635343133310000001a323031352d30312d31302032323a35363a30382e3438303435300000000238340000000174ffffffff00000017323031352d30332d30352031373a31343a34382e323735000000124f566b65a45338e9cdc1a7ee8675ada52d4944000000a9000d00000004554d455500000002343000000005302e3030380000001a313937302d30312d30312030303a30303a30302e34313030303000000005302e383035000000062d313136323300000007343539393836320000001a323031352d31312d32302030343a30323a34342e3333353934370000000237360000000166000000045045484e00000017323031352d30352d31372031373a33333a32302e393232ffffffff44000000ad000d00000004594a494800000003313834ffffffff0000001a313937302d30312d30312030303a30303a30302e34323030303000000005302e33383300000005313736313400000007333130313637310000001a323031352d30312d32382031323a30353a34362e363833303031000000033130350000000174ffffffff00000017323031352d31322d30372031393a32343a33362e3833380000000cec69cd73bb9bc595db6191ce4400000096000d000000044359584700000002323700000005302e3239320000001a313937302d30312d30312030303a30303a30302e34333030303000000005302e393533000000043339343400000006323439313635ffffffff0000000236370000000174ffffffff00000017323031352d30332d30322030383a31393a34342e3536360000000e0148153e0c7f3f8fe4b5ab34212944000000a6000d000000044d5254470000000331343300000005302e3032360000001a313937302d30312d30312030303a30303a30302e34343030303000000005302e393433000000062d323733323000000007313636373834320000001a323031352d30312d32342031393a35363a31352e3937333130390000000231310000000166ffffffff00000017323031352d30312d32342030373a31353a30322e373732ffffffff44000000b7000d00000004444f4e500000000332343600000005302e3635340000001a313937302d30312d30312030303a30303a30302e34353030303000000005302e35353600000005323734373700000007343136303031380000001a323031352d31322d31342030333a34303a30352e3931313833390000000232300000000174000000045045484e00000017323031352d31302d32392031343a33353a31302e3136370000000e079201f56aa131cdcbc2a2b48e9944000000b6000d00000004495158530000000332333200000005302e3233310000001a313937302d30312d30312030303a30303a30302e34363030303000000005302e303439000000062d313831313300000007343030353232380000001a323031352d30362d31312031333a30303a30372e32343831383800000001380000000174000000044350535700000017323031352d30382d31362031313a30393a32342e3331310000000dfa1f9224b1b8676508b7f8410044000000b1000dffffffff00000003313738ffffffff0000001a313937302d30312d30312030303a30303a30302e34373030303000000005302e393033000000062d313436323600000007323933343537300000001a323031352d30342d30342030383a35313a35342e3036383135340000000238380000000174ffffffff00000017323031352d30372d30312030343a33323a32332e30383300000014843625632b6361431c477db646babb98ca08bea444000000a4000d000000044855575a00000002393400000005302e3131300000001a313937302d30312d30312030303a30303a30302e34383030303000000005302e343230000000052d3337333600000007353638373531340000001a323031352d30312d30322031373a31383a30352e3632373633330000000237340000000166ffffffff00000017323031352d30332d32392030363a33393a31312e363432ffffffff440000009d000d000000045352454400000002363600000005302e3131330000001a313937302d30312d30312030303a30303a30302e34393030303000000005302e303630000000062d313035343300000007333636393337370000001a323031352d31302d32322030323a35333a30322e3338313335310000000237370000000174000000045045484effffffff0000000b7c3fd6883a93ef24a5e2bc\n" +
"<430000000f53454c45435420302030005a0000000549\n" +
">5800000004\n";
assertHexScript(
getFragmentedSendFacade(),
NetworkFacadeImpl.INSTANCE,
script,
new DefaultWireParserConfiguration()
);
}
@Test
public void testParseMessageBadQueryTerminator() throws Exception {
final String script = ">0000006900030000757365720078797a006461746162617365006e6162755f61707000636c69656e745f656e636f64696e67005554463800446174655374796c650049534f0054696d655a6f6e6500474d540065787472615f666c6f61745f64696769747300320000\n" +
"<520000000800000003\n" +
">70000000076f6800\n" +
"<520000000800000000530000001154696d655a6f6e6500474d5400530000001d6170706c69636174696f6e5f6e616d65005175657374444200530000001e7365727665725f76657273696f6e5f6e756d00313030303030005300000019696e74656765725f6461746574696d6573006f6e005a0000000549\n" +
">5000000022005345542065787472615f666c6f61745f646967697473203d203308899889988998\n" +
"<!!";
assertHexScript(
getFragmentedSendFacade(),
NetworkFacadeImpl.INSTANCE,
script,
new DefaultWireParserConfiguration() {
@Override
public boolean getDumpNetworkTraffic() {
return true;
}
}
);
}
@Test
public void testParseMessageBadStatementTerminator() throws Exception {
final String script = ">0000006900030000757365720078797a006461746162617365006e6162755f61707000636c69656e745f656e636f64696e67005554463800446174655374796c650049534f0054696d655a6f6e6500474d540065787472615f666c6f61745f64696769747300320000\n" +
"<520000000800000003\n" +
">70000000076f6800\n" +
"<520000000800000000530000001154696d655a6f6e6500474d5400530000001d6170706c69636174696f6e5f6e616d65005175657374444200530000001e7365727665725f76657273696f6e5f6e756d00313030303030005300000019696e74656765725f6461746574696d6573006f6e005a0000000549\n" +
">5000000022555345542065787472615f666c6f61745f646967697473203d2033555555425555550c5555555555555555455555550955555555015355555504\n" +
"<!!";
assertHexScript(
NetworkFacadeImpl.INSTANCE,
NetworkFacadeImpl.INSTANCE,
script,
new DefaultWireParserConfiguration() {
@Override
public boolean getDumpNetworkTraffic() {
return true;
}
}
);
}
@Test
public void testParseMessageNegativeParameterCount() throws Exception {
final String script = ">0000006900030000757365720078797a006461746162617365006e6162755f61707000636c69656e745f656e636f64696e67005554463800446174655374796c650049534f0054696d655a6f6e6500474d540065787472615f666c6f61745f64696769747300320000\n" +
"<520000000800000003\n" +
">70000000076f6800\n" +
"<520000000800000000530000001154696d655a6f6e6500474d5400530000001d6170706c69636174696f6e5f6e616d65005175657374444200530000001e7365727665725f76657273696f6e5f6e756d00313030303030005300000019696e74656765725f6461746574696d6573006f6e005a0000000549\n" +
">5000000022005345542065787472615f666c6f61745f646967697473203d2033000000420000000c0000000000000000450000000900000000015300000004\n" +
"<31000000045a0000000549\n" +
">500000003700534554206170706c69636174696f6e5f6e616d65203d2027506f737467726553514c204a4442432044726976657227000000420000000c0000000000000000450000000900000000015300000004\n" +
"<31000000045a0000000549\n" +
">50000000cd0073656c65637420782c24312c24322c24332c24342c24352c24362c24372c24382c24392c2431302c2431312c2431322c2431332c2431342c2431352c2431362c2431372c2431382c2431392c2432302c2432312c2432322066726f6d206c6f6e675f73657175656e636528352900fefe0000001700000014000002bc000002bd0000001500000010000004130000041300000000000000000000001700000014000002bc000002bd000000150000001000000413000004130000043a000000000000045a000004a0420000012c0000001600010001000100010001000000000000000000000001000100010001000100000000000000010000000000000016000000040000000400000008000000000000007b0000000440adc28f000000083fe22c27a63736ce00000002005b00000004545255450000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b20000000e313937302d30312d3031202b30300000001a313937302d30382d32302031313a33333a32302e3033332b3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001a313937302d30312d30312030303a30353a30302e3031312b30300000001a313937302d30312d30312030303a30383a32302e3032332b3030000044000000065000450000000900000000005300000004\n" +
"<!!";
assertHexScript(
NetworkFacadeImpl.INSTANCE,
NetworkFacadeImpl.INSTANCE,
script,
new DefaultWireParserConfiguration() {
@Override
public boolean getDumpNetworkTraffic() {
return true;
}
}
);
}
@Test
public void testParseMessageTruncatedAtParameter() throws Exception {
final String script = ">0000006900030000757365720078797a006461746162617365006e6162755f61707000636c69656e745f656e636f64696e67005554463800446174655374796c650049534f0054696d655a6f6e6500474d540065787472615f666c6f61745f64696769747300320000\n" +
"<520000000800000003\n" +
">70000000076f6800\n" +
"<520000000800000000530000001154696d655a6f6e6500474d5400530000001d6170706c69636174696f6e5f6e616d65005175657374444200530000001e7365727665725f76657273696f6e5f6e756d00313030303030005300000019696e74656765725f6461746574696d6573006f6e005a0000000549\n" +
">5000000022005345542065787472615f666c6f61745f646967697473203d2033000000420000000c0000000000000000450000000900000000015300000004\n" +
"<31000000045a0000000549\n" +
">500000003700534554206170706c69636174696f6e5f6e616d65203d2027506f737467726553514c204a4442432044726976657227000000420000000c0000000000000000450000000900000000015300000004\n" +
"<31000000045a0000000549\n" +
">50000000cd0073656c65637420782c24312c24322c24332c24342c24352c24362c24372c24382c24392c2431302c2431312c2431322c2431332c2431342c2431352c2431362c2431372c2431382c2431392c2432302c2432312c2432322066726f6d206c6f6e675f73657175656e63652835290000260000001700000014000002bc000002bd0000001500000010000004130000041300000000000000000000001700000014000002bc000002bd000000150000001000000413000004130000043a000000000000045a000004a0420000012c0000001600010001000100010001000000000000000000000001000100010001000100000000000000010000000000000016000000040000000400000008000000000000007b0000000440adc28f000000083fe22c27a63736ce00000002005b00000004545255450000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b20000000e313937302d30312d3031202b30300000001a313937302d30382d32302031313a33333a32302e3033332b3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001a313937302d30312d30312030303a30353a30302e3031312b30300000001a313937302d30312d30312030303a30383a32302e3032332b3030000044000000065000450000000900000000005300000004\n" +
"<!!";
assertHexScript(
NetworkFacadeImpl.INSTANCE,
NetworkFacadeImpl.INSTANCE,
script,
new DefaultWireParserConfiguration() {
@Override
public boolean getDumpNetworkTraffic() {
return true;
}
}
);
}
@Test
public void testBlobOverLimit() throws Exception {
TestUtils.assertMemoryLeak(() -> {
......@@ -142,44 +340,29 @@ public class WireParserTest extends AbstractGriffinTest {
}
@Test
public void testHexFragmentedSend() throws Exception {
final NetworkFacade nf = new NetworkFacadeImpl() {
@Override
public int send(long fd, long buffer, int bufferLen) {
int total = 0;
for (int i = 0; i < bufferLen; i++) {
int n = super.send(fd, buffer + i, 1);
if (n < 0) {
return n;
}
total += n;
}
return total;
}
};
// this is a HEX encoded bytes of the same script as 'testSimple' sends using postgres jdbc driver
String script = ">0000007300030000757365720078797a006461746162617365006e6162755f61707000636c69656e745f656e636f64696e67005554463800446174655374796c650049534f0054696d655a6f6e65004575726f70652f4c6f6e646f6e0065787472615f666c6f61745f64696769747300320000\n" +
public void testParseMessageTruncatedAtParameterCount() throws Exception {
final String script = ">0000006900030000757365720078797a006461746162617365006e6162755f61707000636c69656e745f656e636f64696e67005554463800446174655374796c650049534f0054696d655a6f6e6500474d540065787472615f666c6f61745f64696769747300320000\n" +
"<520000000800000003\n" +
">70000000076f6800\n" +
"<520000000800000000530000001154696d655a6f6e6500474d5400530000001d6170706c69636174696f6e5f6e616d65005175657374444200530000001e7365727665725f76657273696f6e5f6e756d00313030303030005300000019696e74656765725f6461746574696d6573006f6e005a0000000549\n" +
">5000000022005345542065787472615f666c6f61745f646967697473203d2033000000420000000c0000000000000000450000000900000000015300000004\n" +
"<31000000045a0000000549\n" +
">420000000c00000000000000004500000009000000000153000000044500000009000000000153000000045300000004500000003700534554206170706c69636174696f6e5f6e616d65203d2027506f737467726553514c204a4442432044726976657227000000420000000c0000000000000000450000000900000000015300000004\n" +
">500000003700534554206170706c69636174696f6e5f6e616d65203d2027506f737467726553514c204a4442432044726976657227000000420000000c0000000000000000450000000900000000015300000004\n" +
"<31000000045a0000000549\n" +
">420000000c0000000000000000450000000900000000015300000004\n" +
">450000000900000000015300000004\n" +
">5300000004\n" +
">50000001a20073656c65637420726e645f73747228342c342c342920732c20726e645f696e7428302c203235362c20342920692c20726e645f646f75626c6528342920642c2074696d657374616d705f73657175656e636528746f5f74696d657374616d702830292c31303030302920742c20726e645f666c6f617428342920662c20726e645f73686f72742829205f73686f72742c20726e645f6c6f6e6728302c2031303030303030302c203529206c2c20726e645f74696d657374616d7028746f5f74696d657374616d70282732303135272c277979797927292c746f5f74696d657374616d70282732303136272c277979797927292c3229207473322c20726e645f6279746528302c313237292062622c20726e645f626f6f6c65616e282920622c20726e645f73796d626f6c28342c342c342c32292c20726e645f6461746528746f5f64617465282732303135272c20277979797927292c20746f5f64617465282732303136272c20277979797927292c2032292c726e645f62696e2831302c32302c32292066726f6d206c6f6e675f73657175656e636528353029000000420000000c000000000000000044000000065000450000000900000000005300000004\n" +
"<5400000128000d730000000000000000000413000000000000000069000000000000000000001700000000000000006400000000000000000002bd00000000000000007400000000000000000004a000000000000000006600000000000000000002bc00000000000000005f73686f7274000000000000000000001500000000000000006c0000000000000000000014000000000000000074733200000000000000000004a000000000000000006262000000000000000000001500000000000000006200000000000000000000100000000000000000726e645f73796d626f6c00000000000000000004130000000000000000726e645f64617465000000000000000000043a0000000000000000726e645f62696e00000000000000000000110000000000000001\n" +
"<440000008c000dffffffff00000002353700000005302e3632350000001a313937302d30312d30312030303a30303a30302e30303030303000000005302e343632000000052d313539330000000733343235323332ffffffff000000033132310000000166000000045045484e0000000a323031352d30332d31370000000e19c49594365349b4597e3b08a11e44000000ae000d00000004585953420000000331343200000005302e3537390000001a313937302d30312d30312030303a30303a30302e30313030303000000005302e39363900000005323030383800000007313531373439300000001a323031352d30312d31372032303a34313a31392e343830363835000000033130300000000174000000045045484e0000000a323031352d30362d323000000011795f8b812b934d1a8e78b5b91153d0fb6444000000a7000d000000044f5a5a560000000332313900000005302e3136340000001a313937302d30312d30312030303a30303a30302e30323030303000000005302e363539000000062d313233303300000007393438393530380000001a323031352d30382d31332031373a31303a31392e37353235323100000001360000000166ffffffff0000000a323031352d30352d32300000000f2b4d5ff64690c3b3598ee5612f640e4400000097000d000000044f4c595800000002333000000005302e3731330000001a313937302d30312d30312030303a30303a30302e30333030303000000005302e363535000000043636313000000007363530343432380000001a323031352d30382d30382030303a34323a32342e353435363339000000033132330000000166ffffffff0000000a323031352d30312d3033ffffffff440000009f000d000000045449514200000002343200000005302e3638310000001a313937302d30312d30312030303a30303a30302e30343030303000000005302e363236000000052d3136303500000007383831343038360000001a323031352d30372d32382031353a30383a35332e34363234393500000002323800000001740000000443505357ffffffff0000000e3ba6dc3b7d2be392fe6938e1779a4400000095000d000000044c544f560000000331333700000005302e3736330000001a313937302d30312d30312030303a30303a30302e30353030303000000005302e3838320000000439303534ffffffff0000001a323031352d30342d32302030353a30393a30332e353830353734000000033130360000000166000000045045484e0000000a323031352d30312d3039ffffffff4400000093000d000000045a494d4e00000003313235ffffffff0000001a313937302d30312d30312030303a30303a30302e303630303030ffffffff00000005313135323400000007383333353236310000001a323031352d31302d32362030323a31303a35302e363838333934000000033131310000000174000000045045484e0000000a323031352d30382d3231ffffffff4400000093000d000000044f504a4f0000000331363800000005302e3130350000001a313937302d30312d30312030303a30303a30302e30373030303000000005302e353335000000052d3539323000000007373038303730340000001a323031352d30372d31312030393a31353a33382e3334323731370000000331303300000001660000000456544a57ffffffffffffffff440000009c000d00000004474c554f0000000331343500000005302e3533390000001a313937302d30312d30312030303a30303a30302e30383030303000000005302e37363700000005313432343200000007323439393932320000001a323031352d31312d30322030393a30313a33312e3331323830340000000238340000000166000000045045484e0000000a323031352d31312d3134ffffffff44000000a9000d000000045a5651450000000331303300000005302e3637330000001a313937302d30312d30312030303a30303a30302e303930303030ffffffff00000005313337323700000007373837353834360000001a323031352d31322d31322031333a31363a32362e3133343536320000000232320000000174000000045045484e0000000a323031352d30312d323000000012143380c9eba3677a1a79e435e43adc5c65ff440000009a000d000000044c4947590000000331393900000005302e3238340000001a313937302d30312d30312030303a30303a30302e313030303030ffffffff00000005333034323600000007333231353536320000001a323031352d30382d32312031343a35353a30372e30353537323200000002313100000001660000000456544a57ffffffff0000000dff703ac78ab314cd470b0c3912440000008d000d000000044d514e5400000002343300000005302e3538360000001a313937302d30312d30312030303a30303a30302e31313030303000000005302e333335000000053237303139ffffffffffffffff0000000232370000000174000000045045484e0000000a323031352d30372d31320000001326fb2e42faf56e8f80e354b807b13257ff9aef44000000ae000d00000004575743430000000332313300000005302e3736370000001a313937302d30312d30312030303a30303a30302e31323030303000000005302e35383000000005313336343000000007343132313932330000001a323031352d30382d30362030323a32373a33302e3436393736320000000237330000000166000000045045484e0000000a323031352d30342d33300000001271a7d5af11963708dd98ef54882aa2ade7d444000000a2000d00000004564647500000000331323000000005302e3834300000001a313937302d30312d30312030303a30303a30302e31333030303000000005302e373733000000043732323300000007373234313432330000001a323031352d31322d31382030373a33323a31382e34353630323500000002343300000001660000000456544a57ffffffff00000011244e44a80dfe27ec53135db215e7b83567440000009c000d00000004524d44470000000331333400000005302e3131300000001a313937302d30312d30312030303a30303a30302e31343030303000000005302e30343300000005323132323700000007373135353730380000001a323031352d30372d30332030343a31323a34352e373734323831000000023432000000017400000004435053570000000a323031352d30322d3234ffffffff4400000098000d0000000457464f5100000003323535ffffffff0000001a313937302d30312d30312030303a30303a30302e31353030303000000005302e31313600000005333135363900000007363638383237370000001a323031352d30352d31392030333a33303a34352e373739393939000000033132360000000174000000045045484e0000000a323031352d31322d3039ffffffff440000007e000d000000044d58444b00000002353600000005312e3030300000001a313937302d30312d30312030303a30303a30302e31363030303000000005302e353233000000062d33323337320000000736383834313332ffffffff0000000235380000000166ffffffff0000000a323031352d30312d3230ffffffff44000000a1000d00000004584d4b4a0000000331333900000005302e3834310000001a313937302d30312d30312030303a30303a30302e31373030303000000005302e333036000000053235383536ffffffff0000001a323031352d30352d31382030333a35303a32322e373331343337000000013200000001740000000456544a570000000a323031352d30362d32350000000d007cfb0119caf2bf845a6f383544000000a2000d0000000456494844ffffffffffffffff0000001a313937302d30312d30312030303a30303a30302e31383030303000000005302e35353000000005323232383000000007393130393834320000001a323031352d30312d32352031333a35313a33382e323730353833000000023934000000016600000004435053570000000a323031352d31302d32370000000e2d16f389a38364ded6fdc45bc4e944000000a3000d0000000457504e58ffffffff00000005302e3934370000001a313937302d30312d30312030303a30303a30302e31393030303000000005302e343135000000062d3137393333000000063637343236310000001a323031352d30332d30342031353a34333a31352e323133363836000000023433000000017400000004485952580000000a323031352d31322d31380000000ab34c0e8ff10cc560b7d144000000a3000d0000000459504f5600000002333600000005302e3637340000001a313937302d30312d30312030303a30303a30302e32303030303000000005302e303331000000052d3538383800000007313337353432330000001a323031352d31322d31302032303a35303a33352e38363636313400000001330000000174ffffffff0000000a323031352d30372d32330000000dd4abbe30fa8dac3d98a0ad9a5d44000000ac000d000000044e55484effffffff00000005302e3639340000001a313937302d30312d30312030303a30303a30302e32313030303000000005302e333339000000062d323532323600000007333532343734380000001a323031352d30352d30372030343a30373a31382e31353239363800000002333900000001740000000456544a570000000a323031352d30342d303400000012b8bef8a146872892a39be3cbc2648ab035d8440000008e000d00000004424f53450000000332343000000005302e3036300000001a313937302d30312d30312030303a30303a30302e32323030303000000005302e33373900000005323339303400000007393036393333390000001a323031352d30332d32312030333a34323a34322e3634333138360000000238340000000174ffffffffffffffffffffffff44000000ab000d00000004494e4b470000000331323400000005302e3836320000001a313937302d30312d30312030303a30303a30302e32333030303000000005302e343034000000062d333033383300000007373233333534320000001a323031352d30372d32312031363a34323a34372e3031323134380000000239390000000166ffffffff0000000a323031352d30382d32370000001287fc9283fc88f3322770c801b0dcc93a5b7e4400000097000d000000044655584300000002353200000005302e3734330000001a313937302d30312d30312030303a30303a30302e323430303030ffffffff000000062d313437323900000007313034323036340000001a323031352d30382d32312030323a31303a35382e393439363734000000023238000000017400000004435053570000000a323031352d30382d3239ffffffff44000000a4000d00000004554e595100000002373100000005302e3434320000001a313937302d30312d30312030303a30303a30302e32353030303000000005302e353339000000062d3232363131ffffffff0000001a323031352d31322d32332031383a34313a34322e3331393835390000000239380000000174000000045045484e0000000a323031352d30312d32360000000f28ed9799d877333fb267da984747bf4400000096000d000000044b424d51ffffffff00000005302e3238300000001a313937302d30312d30312030303a30303a30302e323630303030ffffffff000000053132323430ffffffff0000001a323031352d30382d31362030313a30323a35352e3736363632320000000232310000000166ffffffff0000000a323031352d30352d31390000000d6ade4604d381e7a21622353b1c4400000084000d000000044a534f4c00000003323433ffffffff0000001a313937302d30312d30312030303a30303a30302e32373030303000000005302e303638000000062d3137343638ffffffffffffffff0000000232300000000174ffffffff0000000a323031352d30362d3139000000113de02d0486e7ca29980769ca5bd6cf0969440000007f000d00000004484e535300000003313530ffffffff0000001a313937302d30312d30312030303a30303a30302e32383030303000000005302e3134380000000531343834310000000735393932343433ffffffff0000000232350000000166000000045045484effffffff0000000c14d6fcee032281b806c406af44000000a7000d00000004505a50420000000331303100000005302e3036320000001a313937302d30312d30312030303a30303a30302e323930303030ffffffff00000005313232333700000007393837383137390000001a323031352d30392d30332032323a31333a31382e38353234363500000002373900000001660000000456544a570000000a323031352d31322d31370000001012613a9aad982e7552ad62878845b99d44000000a9000d000000044f594e4e00000002323500000005302e3333390000001a313937302d30312d30312030303a30303a30302e33303030303000000005302e36323800000005323234313200000007343733363337380000001a323031352d31302d31302031323a31393a34322e35323832323400000003313036000000017400000004435053570000000a323031352d30372d30310000000d54133fffb67ecd0427669489db4400000076000dffffffff0000000331313700000005302e3536340000001a313937302d30312d30312030303a30303a30302e333130303030ffffffff000000052d353630340000000736333533303138ffffffff0000000238340000000166ffffffffffffffff0000000b2bad2507db6244336e008e440000007e000d00000004485652490000000332333300000005302e3232340000001a313937302d30312d30312030303a30303a30302e33323030303000000005302e3432350000000531303436390000000731373135323133ffffffff0000000238360000000166ffffffff0000000a323031352d30322d3032ffffffff440000009c000d000000044f59544f00000002393600000005302e3734310000001a313937302d30312d30312030303a30303a30302e33333030303000000005302e353238000000062d313232333900000007333439393632300000001a323031352d30322d30372032323a33353a30332e3231323236380000000231370000000166000000045045484e0000000a323031352d30332d3239ffffffff440000008b000d000000044c46435900000002363300000005302e3732320000001a313937302d30312d30312030303a30303a30302e333430303030ffffffff0000000532333334340000000739353233393832ffffffff00000003313233000000016600000004435053570000000a323031352d30352d31380000000e05e5c04eccd6e37b34cd1535bba444000000a7000d0000000447484c580000000331343800000005302e3330360000001a313937302d30312d30312030303a30303a30302e33353030303000000005302e363336000000062d333134353700000007323332323333370000001a323031352d31302d32322031323a30363a30352e353434373031000000023931000000017400000004485952580000000a323031352d30352d32310000000a571d91723004b702cb034400000097000d000000045954535a00000003313233ffffffff0000001a313937302d30312d30312030303a30303a30302e33363030303000000005302e35313900000005323235333400000007343434363233360000001a323031352d30372d32372030373a32333a33372e323333373131000000023533000000016600000004435053570000000a323031352d30312d3133ffffffff4400000096000d0000000453574c5500000003323531ffffffff0000001a313937302d30312d30312030303a30303a30302e33373030303000000005302e313739000000043737333400000007343038323437350000001a323031352d31302d32312031383a32343a33342e3430303334350000000236390000000166000000045045484e0000000a323031352d30342d3031ffffffff44000000a4000d0000000454514a4c00000003323435ffffffff0000001a313937302d30312d30312030303a30303a30302e33383030303000000005302e3836350000000439353136000000063932393334300000001a323031352d30352d32382030343a31383a31382e36343035363700000002363900000001660000000456544a570000000a323031352d30362d31320000000f6c3e51d7ebb10771321faf404e8c474400000091000d000000045245494a000000023934ffffffff0000001a313937302d30312d30312030303a30303a30302e33393030303000000005302e313330000000062d3239393234ffffffff0000001a323031352d30332d32302032323a31343a34362e32303437313800000003313133000000017400000004485952580000000a323031352d31322d3139ffffffff44000000a8000d000000044844485100000002393400000005302e3732330000001a313937302d30312d30312030303a30303a30302e34303030303000000005302e373330000000053139393730000000063635343133310000001a323031352d30312d31302032323a35363a30382e3438303435300000000238340000000174ffffffff0000000a323031352d30332d3035000000124f566b65a45338e9cdc1a7ee8675ada52d49440000009c000d00000004554d455500000002343000000005302e3030380000001a313937302d30312d30312030303a30303a30302e34313030303000000005302e383035000000062d313136323300000007343539393836320000001a323031352d31312d32302030343a30323a34342e3333353934370000000237360000000166000000045045484e0000000a323031352d30352d3137ffffffff44000000a0000d00000004594a494800000003313834ffffffff0000001a313937302d30312d30312030303a30303a30302e34323030303000000005302e33383300000005313736313400000007333130313637310000001a323031352d30312d32382031323a30353a34362e363833303031000000033130350000000174ffffffff0000000a323031352d31322d30370000000cec69cd73bb9bc595db6191ce4400000089000d000000044359584700000002323700000005302e3239320000001a313937302d30312d30312030303a30303a30302e34333030303000000005302e393533000000043339343400000006323439313635ffffffff0000000236370000000174ffffffff0000000a323031352d30332d30320000000e0148153e0c7f3f8fe4b5ab3421294400000099000d000000044d5254470000000331343300000005302e3032360000001a313937302d30312d30312030303a30303a30302e34343030303000000005302e393433000000062d323733323000000007313636373834320000001a323031352d30312d32342031393a35363a31352e3937333130390000000231310000000166ffffffff0000000a323031352d30312d3234ffffffff44000000aa000d00000004444f4e500000000332343600000005302e3635340000001a313937302d30312d30312030303a30303a30302e34353030303000000005302e35353600000005323734373700000007343136303031380000001a323031352d31322d31342030333a34303a30352e3931313833390000000232300000000174000000045045484e0000000a323031352d31302d32390000000e079201f56aa131cdcbc2a2b48e9944000000a9000d00000004495158530000000332333200000005302e3233310000001a313937302d30312d30312030303a30303a30302e34363030303000000005302e303439000000062d313831313300000007343030353232380000001a323031352d30362d31312031333a30303a30372e3234383138380000000138000000017400000004435053570000000a323031352d30382d31360000000dfa1f9224b1b8676508b7f8410044000000a4000dffffffff00000003313738ffffffff0000001a313937302d30312d30312030303a30303a30302e34373030303000000005302e393033000000062d313436323600000007323933343537300000001a323031352d30342d30342030383a35313a35342e3036383135340000000238380000000174ffffffff0000000a323031352d30372d303100000014843625632b6361431c477db646babb98ca08bea44400000097000d000000044855575a00000002393400000005302e3131300000001a313937302d30312d30312030303a30303a30302e34383030303000000005302e343230000000052d3337333600000007353638373531340000001a323031352d30312d30322031373a31383a30352e3632373633330000000237340000000166ffffffff0000000a323031352d30332d3239ffffffff440000009d000d000000045352454400000002363600000005302e3131330000001a313937302d30312d30312030303a30303a30302e34393030303000000005302e303630000000062d313035343300000007333636393337370000001a323031352d31302d32322030323a35333a30322e3338313335310000000237370000000174000000045045484effffffff0000000b7c3fd6883a93ef24a5e2bc\n" +
"<430000000f53454c45435420302030005a0000000549\n" +
">420000000c000000000000000044000000065000450000000900000000005300000004440000000650004500000009000000000053000000044500000009000000000053000000045300000004\n" +
"<5400000128000d730000000000000000000413000000000000000069000000000000000000001700000000000000006400000000000000000002bd00000000000000007400000000000000000004a000000000000000006600000000000000000002bc00000000000000005f73686f7274000000000000000000001500000000000000006c0000000000000000000014000000000000000074733200000000000000000004a000000000000000006262000000000000000000001500000000000000006200000000000000000000100000000000000000726e645f73796d626f6c00000000000000000004130000000000000000726e645f64617465000000000000000000043a0000000000000000726e645f62696e00000000000000000000110000000000000001\n" +
"<44000000a8000d0000000450574c5a00000002393100000005302e3530340000001a313937302d30312d30312030303a30303a30302e303030303030ffffffff000000052d3739383500000007343233343632310000001a323031352d30312d32362031323a31373a31302e363535353938000000033130360000000166000000045045484e0000000a323031352d31322d3036000000112a4e91c5e439b2dd0da7bbd57172ba9cac440000008f000d00000004594c58470000000331313400000005302e3739320000001a313937302d30312d30312030303a30303a30302e303130303030ffffffff0000000531383230300000000737363830303832ffffffff000000023530000000017400000004435053570000000a323031352d30352d31330000001252bb50c9024d40ef1fb817f741ffc1a75cc34400000092000d00000004424b5850ffffffff00000005302e3735360000001a313937302d30312d30312030303a30303a30302e30323030303000000005302e393030000000062d3136393636ffffffff0000001a323031352d30372d30382030343a30393a30372e3132373837340000000135000000017400000004485952580000000a323031352d31302d3132ffffffff4400000096000d00000004485844420000000332333900000005302e3433340000001a313937302d30312d30312030303a30303a30302e30333030303000000005302e323335000000053235363238ffffffff0000001a323031352d30392d32302031383a30313a35362e37313437363800000003313134000000017400000004485952580000000a323031352d31312d3039ffffffff440000009d000d0000000454534c4f0000000331353800000005302e3035380000001a313937302d30312d30312030303a30303a30302e30343030303000000005302e333933000000062d313736363900000007373435393639300000001a323031352d31302d30372030303a32393a35372e353439393139000000023333000000016600000004485952580000000a323031352d30342d3038ffffffff4400000090000d00000004484a5558000000013800000005302e3137360000001a313937302d30312d30312030303a30303a30302e30353030303000000005302e31353500000005323530353700000007383334313835310000001a323031352d30322d30382030333a33333a34342e35353434373300000002383300000001660000000456544a57ffffffffffffffff44000000ab000d00000004535444540000000331303600000005302e3231390000001a313937302d30312d30312030303a30303a30302e30363030303000000005302e37373700000005323238383300000007353136383237310000001a323031352d31322d32392030353a30303a33392e3139373135310000000331323500000001740000000456544a570000000a323031352d30392d32350000000e66ca8556e244dbb8e993fcd9cb994400000090000d000000044d43495900000002323600000005302e3138390000001a313937302d30312d30312030303a30303a30302e30373030303000000005302e373535000000062d3231363334ffffffff0000001a323031352d31312d31342031373a34313a31382e38393931363900000001320000000174ffffffff0000000a323031352d30372d3134ffffffff440000009b000d000000044b53514400000002353100000005302e3238360000001a313937302d30312d30312030303a30303a30302e30383030303000000005302e323837000000053139313433ffffffff0000001a323031352d30372d31362030383a33363a35372e373737393837000000033132300000000174ffffffff0000000a323031352d30342d30360000000a84d512fb719934038208440000009d000d000000044a4a46470000000332313100000005302e3832320000001a313937302d30312d30312030303a30303a30302e30393030303000000005302e323735000000062d313831353700000007393639323732300000001a323031352d30352d32332030383a34303a33332e3431393237370000000231320000000174000000045045484e0000000a323031352d30372d3036ffffffff44000000a7000d0000000449584d490000000331313200000005302e3334370000001a313937302d30312d30312030303a30303a30302e31303030303000000005302e363537000000062d313930313700000007393630313134370000001a323031352d31302d30342030363a32323a31322e383039353930000000023737000000017400000004435053570000000a323031352d30342d32300000000a1a275b4d0f33f470bb5744000000a4000d0000000445464a420000000331393900000005302e3537360000001a313937302d30312d30312030303a30303a30302e31313030303000000005302e343330000000043530353900000007353031303134340000001a323031352d30332d30392031373a33343a34372e3631393630320000000233320000000174ffffffff0000000a323031352d30342d31350000000d003aea50240bc51a5a8d8550394400000097000d000000044a46424b0000000331333900000005302e3236350000001a313937302d30312d30312030303a30303a30302e31323030303000000005302e313832000000043332353500000007333732343636300000001a323031352d31322d31302031353a35363a32352e3535383733350000000239350000000174ffffffff0000000a323031352d30362d3131ffffffff440000009f000d000000044d44524e0000000331303600000005302e3136340000001a313937302d30312d30312030303a30303a30302e31333030303000000005302e343734000000062d3138383439000000063638343236390000001a323031352d31322d32382032303a35383a32362e30333732343400000002313900000001660000000448595258ffffffff0000000d39dc8c6c6bac60aabcf427617844000000a3000d000000045650474800000002343200000005302e3530330000001a313937302d30312d30312030303a30303a30302e31343030303000000005302e323033000000062d313537323000000007353837303336380000001a323031352d30352d32392030373a30363a33302e3337373730360000000234340000000174ffffffff0000000a323031352d30372d30310000000bd989264fe4513785e1e46e440000008d000d000000044f54485300000002373400000005302e3232340000001a313937302d30312d30312030303a30303a30302e31353030303000000005302e31313600000004393832310000000733393533393634ffffffff000000023132000000017400000004435053570000000a323031352d30322d30320000000d593e98c98e5fbd124072694ec244000000a3000d000000044e4746440000000134ffffffff0000001a313937302d30312d30312030303a30303a30302e31363030303000000005302e32363600000005313731353400000007323532343534320000001a323031352d30322d32322030393a33353a30362e36363236333500000001380000000174ffffffff0000000a323031352d31312d303200000013983fb81e53a335588dca1dd0b2eb543f32825b4400000091000d000000045151444f00000002313000000005302e3635330000001a313937302d30312d30312030303a30303a30302e31373030303000000005302e323533000000052d3132313200000007333437363834330000001a323031352d30312d32352032333a31393a34352e32343533373200000002343300000001660000000448595258ffffffffffffffff44000000aa000d00000004534f42520000000331333200000005302e3932350000001a313937302d30312d30312030303a30303a30302e31383030303000000005302e343334000000042d38343600000007333632383332300000001a323031352d30372d32372031373a32393a32342e303037373235000000023335000000016600000004435053570000000a323031352d30322d30370000000f66a1f432e1d00dbf2e91a04aa8bc1c44000000ab000d00000004554452450000000331303700000005302e3939370000001a313937302d30312d30312030303a30303a30302e31393030303000000005302e38353700000005313633383200000007343932313737350000001a323031352d30332d30382031303a35313a32322e303139353234000000023830000000016600000004485952580000000a323031352d31302d33300000000f671cfdeba385e53d2184bbb19b5da544000000aa000d0000000457424e450000000331323700000005302e3534350000001a313937302d30312d30312030303a30303a30302e32303030303000000005302e34303300000005313232353100000007383033333232330000001a323031352d30362d31362032313a30363a33312e3735303434310000000236300000000174ffffffff0000000a323031352d31322d303500000012c555ef19d90f612db25ad879a0b0ac6093f1440000007a000dffffffff0000000331393400000005302e3435330000001a313937302d30312d30312030303a30303a30302e323130303030ffffffff000000062d32363936380000000738373030363431ffffffff0000000234300000000174000000045045484e0000000a323031352d31322d3037ffffffff440000009e000d0000000447445450ffffffff00000005302e3232370000001a313937302d30312d30312030303a30303a30302e32323030303000000005302e343436000000062d333030393000000007323736323737390000001a323031352d31322d31322030333a35383a35302e38373830313500000002313100000001660000000456544a57ffffffff0000000e6b531e18079d752a1131d2fbde75440000008f000d00000004575a434a0000000332343400000005302e3937350000001a313937302d30312d30312030303a30303a30302e32333030303000000005302e3232320000000532353836360000000731343830363238ffffffff000000023330000000016600000004485952580000000a323031352d30312d32310000000d4b9d2a9fc1f84f032a59d613dd44000000ae000d000000044f5854500000000331393200000005302e3935370000001a313937302d30312d30312030303a30303a30302e32343030303000000005302e30393400000005323330363000000007333431303232300000001a323031352d30322d32352031373a32313a34342e393532383735000000023137000000017400000004485952580000000a323031352d31312d323300000012fcbb7bd33f08bfbfc083960994535679ebcd44000000a2000d000000044b5859440000000331353100000005302e3430300000001a313937302d30312d30312030303a30303a30302e32353030303000000005302e373534000000062d313833373000000007383236323230360000001a323031352d30342d31392031323a33373a30392e3538383935370000000231390000000166ffffffffffffffff0000001329b39aab7e35973ea15a97c402793839c148ef44000000ad000d00000004574d53520000000331393800000005302e3236350000001a313937302d30312d30312030303a30303a30302e32363030303000000005302e33333100000005313935303100000007373630303133310000001a323031352d31322d30382031363a34383a32352e333633353233000000033132330000000174ffffffff0000000a323031352d30382d303300000014d1df4c3da99136abd2ce1b77497791c2b8f4e7c94400000097000dffffffff0000000331333400000005302e3136320000001a313937302d30312d30312030303a30303a30302e32373030303000000005302e35323300000005323037373100000007323738343235380000001a323031352d31312d31372031353a31343a32312e31323236343700000001310000000174000000045045484e0000000a323031352d31322d3038ffffffff44000000a7000d00000004434c47450000000332343000000005302e3639330000001a313937302d30312d30312030303a30303a30302e32383030303000000005302e35353400000005313839393700000007313239353535300000001a323031352d30332d31322031353a34343a33372e3139353039370000000234310000000166000000045045484e0000000a323031352d30352d30390000000bf6eeea3fc2953f27ede8c044000000b0000d000000045843464f0000000332333100000005302e3335330000001a313937302d30312d30312030303a30303a30302e32393030303000000005302e39353400000005333133333100000007383239343437380000001a323031352d31302d32382032323a35313a31392e36383232313700000003313134000000016600000004485952580000000a323031352d30342d3031000000131e60f2343a5e725d5a66734923034956bd02aa44000000a1000d0000000459515953000000013600000005302e3034350000001a313937302d30312d30312030303a30303a30302e33303030303000000005302e37333200000005333139313700000007343636313037350000001a323031352d30362d31372030333a34333a33322e333937323233000000033131350000000166ffffffff0000000a323031352d31322d31320000000a60a87e6ca44f9dab2b61440000009d000d000000044b4a4b4e0000000332323100000005302e3639330000001a313937302d30312d30312030303a30303a30302e33313030303000000005302e393832000000062d333234373900000007313538373835320000001a323031352d30392d30342031303a33393a35332e36313236343200000002323300000001740000000456544a570000000a323031352d31322d3236ffffffff4400000095000d00000004485a4d440000000332333600000005302e3233310000001a313937302d30312d30312030303a30303a30302e33323030303000000005302e323835000000053237393932ffffffff0000001a323031352d30382d31382031343a32323a30352e383334313532000000023231000000017400000004485952580000000a323031352d30342d3036ffffffff4400000093000dffffffff00000003323139ffffffff0000001a313937302d30312d30312030303a30303a30302e33333030303000000005302e373138000000052d3236393700000007383132303236360000001a323031352d31312d30382031383a31373a33322e3336323935330000000235390000000166000000045045484effffffff0000000a40f24f2981d070ecd5f344000000a4000d00000004585a4d4d0000000332343600000005302e3436300000001a313937302d30312d30312030303a30303a30302e33343030303000000005302e3937320000000438323635000000063936333230390000001a323031352d30312d32322031343a35363a34352e343936303139000000033132360000000174ffffffff0000000a323031352d30322d31390000000d2738e2f83774df3ad8e1e6ba4a44000000a8000d000000044355465700000002363700000005302e3837310000001a313937302d30312d30312030303a30303a30302e33353030303000000005302e3233350000000331323500000007383037343433360000001a323031352d30392d32392030353a31303a35332e343037303834000000023937000000017400000004485952580000000a323031352d30312d30340000000f568acf3f12ab0f4ddf7eb106d30b1a44000000a8000d000000045642575a0000000332333800000005302e3832310000001a313937302d30312d30312030303a30303a30302e33363030303000000005302e30393200000005323634383700000007323535393938320000001a323031352d30372d33302030323a35343a33302e3836353137340000000235320000000166000000045045484e0000000a323031352d30312d30350000000cfb04dc12a5f0054cebaf228c4400000089000dffffffff0000000331393000000005302e3834320000001a313937302d30312d30312030303a30303a30302e33373030303000000005302e363537000000062d313831333100000006333034323135ffffffff0000000236380000000174000000045045484e0000000a323031352d30362d30380000000b40808e49636de05a311bea4400000098000d00000004454d50500000000332333600000005302e3537350000001a313937302d30312d30312030303a30303a30302e333830303030ffffffff000000062d323939353600000007363033333235390000001a323031352d30372d31362031353a35303a35372e36333133313700000002353300000001740000000456544a570000000a323031352d30352d3137ffffffff4400000094000d000000045a4b585000000002343000000005302e3235320000001a313937302d30312d30312030303a30303a30302e33393030303000000005302e303133000000053332363530ffffffff0000001a323031352d30372d31362031333a31333a34392e353038343632000000023933000000017400000004485952580000000a323031352d30392d3232ffffffff44000000a5000d00000004464d4453000000013500000005302e3631370000001a313937302d30312d30312030303a30303a30302e34303030303000000005302e31313200000005313039303900000007323734363639360000001a323031352d30382d32322032313a32333a31352e3436383933300000000237380000000174000000045045484e0000000a323031352d30352d30330000000b48f5da38103592256a3b964400000092000d00000004495456580000000331393700000005302e3939370000001a313937302d30312d30312030303a30303a30302e34313030303000000005302e393438000000052d3638353100000007353334343533330000001a323031352d30362d32382032323a32373a32322e39303431353700000002353900000001740000000456544a57ffffffffffffffff44000000a4000dffffffff00000002383100000005302e3331380000001a313937302d30312d30312030303a30303a30302e34323030303000000005302e34373600000005313333313400000007383232353535320000001a323031352d30312d31332030333a34333a32352e33313539303800000001370000000166000000045045484e0000000a323031352d30372d31330000000e68d74fc2ca1ad35d9f47589c57204400000098000d00000004544c594d00000002363100000005302e3735380000001a313937302d30312d30312030303a30303a30302e34333030303000000005302e303139000000062d323531363000000007383832303338360000001a323031352d30342d31362031373a35343a32332e3631343634360000000235380000000174ffffffff0000000a323031352d31302d3138ffffffff4400000087000d00000004514d494f000000023634ffffffff0000001a313937302d30312d30312030303a30303a30302e34343030303000000005302e343131000000062d31393730340000000738323130383932ffffffff0000000233340000000166ffffffff0000000a323031352d30372d31330000000efb08dddaaad2d5bab2d190e1692b4400000092000d000000044246435500000002313400000005302e3332390000001a313937302d30312d30312030303a30303a30302e34353030303000000005302e323631000000062d31363631390000000738373733323737ffffffff0000000231370000000174000000045045484e0000000a323031352d30322d323700000010489e307c3fb023e5f9a90b86ebce31ff440000009c000d00000004524a495900000002313400000005302e3539320000001a313937302d30312d30312030303a30303a30302e34363030303000000005302e363936000000062d323932373900000007363430393031330000001a323031352d31302d33302031333a34393a33362e323031353135000000023836000000016600000004435053570000000a323031352d30312d3035ffffffff440000009e000d000000044a4e4c560000000332303600000005302e3736360000001a313937302d30312d30312030303a30303a30302e34373030303000000005302e343830000000062d313630373700000007313937313433320000001a323031352d30392d31342031353a32343a32342e35393635303700000003313235000000016600000004485952580000000a323031352d30382d3039ffffffff44000000a8000d000000044858584e0000000331373300000005302e3737320000001a313937302d30312d30312030303a30303a30302e343830303030ffffffff00000005313535303400000007313434303033340000001a323031352d30372d30352032323a31323a35352e363633313439000000033131380000000174000000045045484e0000000a323031352d30362d313500000010870211f5bb0cc5754c7697120eed2c174400000082000d000000045358514500000002383600000005302e3335360000001a313937302d30312d30312030303a30303a30302e34393030303000000005302e343238000000062d31303232310000000732353634363235ffffffff0000000238390000000166000000045045484e0000000a323031352d31302d3038ffffffff\n" +
"<430000000f53454c45435420302030005a0000000549\n" +
"<5400000128000d730000000000000000000413000000000000000069000000000000000000001700000000000000006400000000000000000002bd00000000000000007400000000000000000004a000000000000000006600000000000000000002bc00000000000000005f73686f7274000000000000000000001500000000000000006c0000000000000000000014000000000000000074733200000000000000000004a000000000000000006262000000000000000000001500000000000000006200000000000000000000100000000000000000726e645f73796d626f6c00000000000000000004130000000000000000726e645f64617465000000000000000000043a0000000000000000726e645f62696e00000000000000000000110000000000000001\n";
assertHexScript(nf, NetworkFacadeImpl.INSTANCE, script, new DefaultWireParserConfiguration());
// II
">50000000740073656c65637420782c24312c24322c24332c24342c24352c24362c24372c24382c24392c2431302c2431312c2431322c2431332c2431342c2431352c2431362c2431372c2431382c2431392c2432302c2432312c2432322066726f6d206c6f6e675f73657175656e63652835290000160000001700000014000002bc000002bd0000001500000010000004130000041300000000000000000000001700000014000002bc000002bd000000150000001000000413000004130000043a000000000000045a000004a0420000012c0000001600010001000100010001000000000000000000000001000100010001000100000000000000010000000000000016000000040000000400000008000000000000007b0000000440adc28f000000083fe22c27a63736ce00000002005b00000004545255450000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b20000000e313937302d30312d3031202b30300000001a313937302d30382d32302031313a33333a32302e3033332b3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001a313937302d30312d30312030303a30353a30302e3031312b30300000001a313937302d30312d30312030303a30383a32302e3032332b3030000044000000065000450000000900000000005300000004\n" +
"<!!";
assertHexScript(
NetworkFacadeImpl.INSTANCE,
NetworkFacadeImpl.INSTANCE,
script,
new DefaultWireParserConfiguration() {
@Override
public boolean getDumpNetworkTraffic() {
return true;
}
}
);
}
@Test
......@@ -244,11 +427,6 @@ public class WireParserTest extends AbstractGriffinTest {
startBasicServer(
NetworkFacadeImpl.INSTANCE,
new DefaultWireParserConfiguration() {
@Override
public boolean getDumpNetworkTraffic() {
return true;
}
@Override
public int getSendBufferSize() {
return 512;
......@@ -433,12 +611,7 @@ public class WireParserTest extends AbstractGriffinTest {
try {
startBasicServer(
NetworkFacadeImpl.INSTANCE,
new DefaultWireParserConfiguration() {
@Override
public boolean getDumpNetworkTraffic() {
return true;
}
},
new DefaultWireParserConfiguration(),
haltLatch,
running
);
......@@ -474,12 +647,7 @@ public class WireParserTest extends AbstractGriffinTest {
@Test
public void testPreparedStatementHex() throws Exception {
assertPreparedStatementHex(NetworkFacadeImpl.INSTANCE, new DefaultWireParserConfiguration() {
@Override
public boolean getDumpNetworkTraffic() {
return true;
}
});
assertPreparedStatementHex(NetworkFacadeImpl.INSTANCE, new DefaultWireParserConfiguration());
}
@Test
......@@ -672,6 +840,84 @@ public class WireParserTest extends AbstractGriffinTest {
});
}
@Test
public void testPreparedStatementTextParams() throws Exception {
TestUtils.assertMemoryLeak(() -> {
final CountDownLatch haltLatch = new CountDownLatch(1);
final AtomicBoolean running = new AtomicBoolean(true);
try {
startBasicServer(
NetworkFacadeImpl.INSTANCE,
new DefaultWireParserConfiguration() {
@Override
public boolean getDumpNetworkTraffic() {
return true;
}
},
haltLatch,
running
);
Properties properties = new Properties();
properties.setProperty("user", "xyz");
properties.setProperty("password", "oh");
properties.setProperty("sslmode", "disable");
properties.setProperty("binaryTransfer", "false");
TimeZone.setDefault(TimeZone.getTimeZone("EDT"));
final Connection connection = DriverManager.getConnection("jdbc:postgresql://127.0.0.1:9120/nabu_app", properties);
PreparedStatement statement = connection.prepareStatement("select x,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? from long_sequence(5)");
statement.setInt(1, 4);
statement.setLong(2, 123L);
statement.setFloat(3, 5.43f);
statement.setDouble(4, 0.56789);
statement.setByte(5, (byte) 91);
statement.setBoolean(6, true);
statement.setString(7, "hello");
// this is to test UTF8 behaviour
statement.setString(8, "группа туристов");
statement.setDate(9, new Date(100L));
statement.setTimestamp(10, new Timestamp(20000000033L));
// nulls
statement.setNull(11, Types.INTEGER);
statement.setNull(12, Types.BIGINT);
statement.setNull(13, Types.REAL);
statement.setNull(14, Types.DOUBLE);
statement.setNull(15, Types.SMALLINT);
statement.setNull(16, Types.BOOLEAN);
statement.setNull(17, Types.VARCHAR);
statement.setString(18, null);
statement.setNull(19, Types.DATE);
statement.setNull(20, Types.TIMESTAMP);
// when someone uses postgress type extensions, which alter driver behaviour
// we should handle this gracefully
statement.setTimestamp(21, new PGTimestamp(300011));
statement.setTimestamp(22, new PGTimestamp(500023, new GregorianCalendar()));
final String expected = "x[BIGINT],$1[INTEGER],$2[BIGINT],$3[DOUBLE],$4[DOUBLE],$5[SMALLINT],$6[BIT],$7[VARCHAR],$8[VARCHAR],$9[TIMESTAMP],$10[TIMESTAMP],$11[INTEGER],$12[BIGINT],$13[REAL],$14[DOUBLE],$15[SMALLINT],$16[BIT],$17[VARCHAR],$18[VARCHAR],$19[TIMESTAMP],$20[TIMESTAMP],$21[TIMESTAMP],$22[TIMESTAMP]\n" +
"1,4,123,5.43000000,0.56800000,91,true,hello,группа туристов,1970-01-01 00:00:00.0,1970-08-20 11:33:20.033,null,null,null,null,0,false,null,null,null,null,1970-01-01 00:05:00.011,1970-01-01 00:08:20.023\n" +
"2,4,123,5.43000000,0.56800000,91,true,hello,группа туристов,1970-01-01 00:00:00.0,1970-08-20 11:33:20.033,null,null,null,null,0,false,null,null,null,null,1970-01-01 00:05:00.011,1970-01-01 00:08:20.023\n" +
"3,4,123,5.43000000,0.56800000,91,true,hello,группа туристов,1970-01-01 00:00:00.0,1970-08-20 11:33:20.033,null,null,null,null,0,false,null,null,null,null,1970-01-01 00:05:00.011,1970-01-01 00:08:20.023\n" +
"4,4,123,5.43000000,0.56800000,91,true,hello,группа туристов,1970-01-01 00:00:00.0,1970-08-20 11:33:20.033,null,null,null,null,0,false,null,null,null,null,1970-01-01 00:05:00.011,1970-01-01 00:08:20.023\n" +
"5,4,123,5.43000000,0.56800000,91,true,hello,группа туристов,1970-01-01 00:00:00.0,1970-08-20 11:33:20.033,null,null,null,null,0,false,null,null,null,null,1970-01-01 00:05:00.011,1970-01-01 00:08:20.023\n";
StringSink sink = new StringSink();
for (int i = 0; i < 10; i++) {
sink.clear();
ResultSet rs = statement.executeQuery();
assertResultSet(expected, sink, rs);
rs.close();
}
connection.close();
} finally {
running.set(false);
haltLatch.await();
}
});
}
@Test
public void testSimple() throws Exception {
TestUtils.assertMemoryLeak(() -> {
......@@ -679,7 +925,12 @@ public class WireParserTest extends AbstractGriffinTest {
final AtomicBoolean running = new AtomicBoolean(true);
try {
startBasicServer(NetworkFacadeImpl.INSTANCE,
new DefaultWireParserConfiguration(),
new DefaultWireParserConfiguration() {
@Override
public boolean getDumpNetworkTraffic() {
return true;
}
},
haltLatch,
running
);
......@@ -791,20 +1042,13 @@ public class WireParserTest extends AbstractGriffinTest {
"<520000000800000000530000001154696d655a6f6e6500474d5400530000001d6170706c69636174696f6e5f6e616d65005175657374444200530000001e7365727665725f76657273696f6e5f6e756d00313030303030005300000019696e74656765725f6461746574696d6573006f6e005a0000000549\n" +
">5000000022005345542065787472615f666c6f61745f646967697473203d2033000000420000000c0000000000000000450000000900000000015300000004\n" +
"<31000000045a0000000549\n" +
">420000000c00000000000000004500000009000000000153000000044500000009000000000153000000045300000004500000003700534554206170706c69636174696f6e5f6e616d65203d2027506f737467726553514c204a4442432044726976657227000000420000000c0000000000000000450000000900000000015300000004\n" +
">500000003700534554206170706c69636174696f6e5f6e616d65203d2027506f737467726553514c204a4442432044726976657227000000420000000c0000000000000000450000000900000000015300000004\n" +
"<31000000045a0000000549\n" +
">420000000c0000000000000000450000000900000000015300000004\n" +
">450000000900000000015300000004\n" +
">5300000004\n" +
">50000001a20073656c65637420726e645f73747228342c342c342920732c20726e645f696e7428302c203235362c20342920692c20726e645f646f75626c6528342920642c2074696d657374616d705f73657175656e636528746f5f74696d657374616d702830292c31303030302920742c20726e645f666c6f617428342920662c20726e645f73686f72742829205f73686f72742c20726e645f6c6f6e6728302c2031303030303030302c203529206c2c20726e645f74696d657374616d7028746f5f74696d657374616d70282732303135272c277979797927292c746f5f74696d657374616d70282732303136272c277979797927292c3229207473322c20726e645f6279746528302c313237292062622c20726e645f626f6f6c65616e282920622c20726e645f73796d626f6c28342c342c342c32292c20726e645f6461746528746f5f64617465282732303135272c20277979797927292c20746f5f64617465282732303136272c20277979797927292c2032292c726e645f62696e2831302c32302c32292066726f6d206c6f6e675f73657175656e636528353029000000420000000c000000000000000044000000065000450000000900000000005300000004\n" +
"<5400000128000d730000000000000000000413000000000000000069000000000000000000001700000000000000006400000000000000000002bd00000000000000007400000000000000000004a000000000000000006600000000000000000002bc00000000000000005f73686f7274000000000000000000001500000000000000006c0000000000000000000014000000000000000074733200000000000000000004a000000000000000006262000000000000000000001500000000000000006200000000000000000000100000000000000000726e645f73796d626f6c00000000000000000004130000000000000000726e645f64617465000000000000000000043a0000000000000000726e645f62696e00000000000000000000110000000000000001\n" +
"<440000008c000dffffffff00000002353700000005302e3632350000001a313937302d30312d30312030303a30303a30302e30303030303000000005302e343632000000052d313539330000000733343235323332ffffffff000000033132310000000166000000045045484e0000000a323031352d30332d31370000000e19c49594365349b4597e3b08a11e44000000ae000d00000004585953420000000331343200000005302e3537390000001a313937302d30312d30312030303a30303a30302e30313030303000000005302e39363900000005323030383800000007313531373439300000001a323031352d30312d31372032303a34313a31392e343830363835000000033130300000000174000000045045484e0000000a323031352d30362d323000000011795f8b812b934d1a8e78b5b91153d0fb6444000000a7000d000000044f5a5a560000000332313900000005302e3136340000001a313937302d30312d30312030303a30303a30302e30323030303000000005302e363539000000062d313233303300000007393438393530380000001a323031352d30382d31332031373a31303a31392e37353235323100000001360000000166ffffffff0000000a323031352d30352d32300000000f2b4d5ff64690c3b3598ee5612f640e4400000097000d000000044f4c595800000002333000000005302e3731330000001a313937302d30312d30312030303a30303a30302e30333030303000000005302e363535000000043636313000000007363530343432380000001a323031352d30382d30382030303a34323a32342e353435363339000000033132330000000166ffffffff0000000a323031352d30312d3033ffffffff440000009f000d000000045449514200000002343200000005302e3638310000001a313937302d30312d30312030303a30303a30302e30343030303000000005302e363236000000052d3136303500000007383831343038360000001a323031352d30372d32382031353a30383a35332e34363234393500000002323800000001740000000443505357ffffffff0000000e3ba6dc3b7d2be392fe6938e1779a4400000095000d000000044c544f560000000331333700000005302e3736330000001a313937302d30312d30312030303a30303a30302e30353030303000000005302e3838320000000439303534ffffffff0000001a323031352d30342d32302030353a30393a30332e353830353734000000033130360000000166000000045045484e0000000a323031352d30312d3039ffffffff4400000093000d000000045a494d4e00000003313235ffffffff0000001a313937302d30312d30312030303a30303a30302e303630303030ffffffff00000005313135323400000007383333353236310000001a323031352d31302d32362030323a31303a35302e363838333934000000033131310000000174000000045045484e0000000a323031352d30382d3231ffffffff4400000093000d000000044f504a4f0000000331363800000005302e3130350000001a313937302d30312d30312030303a30303a30302e30373030303000000005302e353335000000052d3539323000000007373038303730340000001a323031352d30372d31312030393a31353a33382e3334323731370000000331303300000001660000000456544a57ffffffffffffffff440000009c000d00000004474c554f0000000331343500000005302e3533390000001a313937302d30312d30312030303a30303a30302e30383030303000000005302e37363700000005313432343200000007323439393932320000001a323031352d31312d30322030393a30313a33312e3331323830340000000238340000000166000000045045484e0000000a323031352d31312d3134ffffffff44000000a9000d000000045a5651450000000331303300000005302e3637330000001a313937302d30312d30312030303a30303a30302e303930303030ffffffff00000005313337323700000007373837353834360000001a323031352d31322d31322031333a31363a32362e3133343536320000000232320000000174000000045045484e0000000a323031352d30312d323000000012143380c9eba3677a1a79e435e43adc5c65ff440000009a000d000000044c4947590000000331393900000005302e3238340000001a313937302d30312d30312030303a30303a30302e313030303030ffffffff00000005333034323600000007333231353536320000001a323031352d30382d32312031343a35353a30372e30353537323200000002313100000001660000000456544a57ffffffff0000000dff703ac78ab314cd470b0c3912440000008d000d000000044d514e5400000002343300000005302e3538360000001a313937302d30312d30312030303a30303a30302e31313030303000000005302e333335000000053237303139ffffffffffffffff0000000232370000000174000000045045484e0000000a323031352d30372d31320000001326fb2e42faf56e8f80e354b807b13257ff9aef44000000ae000d00000004575743430000000332313300000005302e3736370000001a313937302d30312d30312030303a30303a30302e31323030303000000005302e35383000000005313336343000000007343132313932330000001a323031352d30382d30362030323a32373a33302e3436393736320000000237330000000166000000045045484e0000000a323031352d30342d33300000001271a7d5af11963708dd98ef54882aa2ade7d444000000a2000d00000004564647500000000331323000000005302e3834300000001a313937302d30312d30312030303a30303a30302e31333030303000000005302e373733000000043732323300000007373234313432330000001a323031352d31322d31382030373a33323a31382e34353630323500000002343300000001660000000456544a57ffffffff00000011244e44a80dfe27ec53135db215e7b83567440000009c000d00000004524d44470000000331333400000005302e3131300000001a313937302d30312d30312030303a30303a30302e31343030303000000005302e30343300000005323132323700000007373135353730380000001a323031352d30372d30332030343a31323a34352e373734323831000000023432000000017400000004435053570000000a323031352d30322d3234ffffffff4400000098000d0000000457464f5100000003323535ffffffff0000001a313937302d30312d30312030303a30303a30302e31353030303000000005302e31313600000005333135363900000007363638383237370000001a323031352d30352d31392030333a33303a34352e373739393939000000033132360000000174000000045045484e0000000a323031352d31322d3039ffffffff440000007e000d000000044d58444b00000002353600000005312e3030300000001a313937302d30312d30312030303a30303a30302e31363030303000000005302e353233000000062d33323337320000000736383834313332ffffffff0000000235380000000166ffffffff0000000a323031352d30312d3230ffffffff44000000a1000d00000004584d4b4a0000000331333900000005302e3834310000001a313937302d30312d30312030303a30303a30302e31373030303000000005302e333036000000053235383536ffffffff0000001a323031352d30352d31382030333a35303a32322e373331343337000000013200000001740000000456544a570000000a323031352d30362d32350000000d007cfb0119caf2bf845a6f383544000000a2000d0000000456494844ffffffffffffffff0000001a313937302d30312d30312030303a30303a30302e31383030303000000005302e35353000000005323232383000000007393130393834320000001a323031352d30312d32352031333a35313a33382e323730353833000000023934000000016600000004435053570000000a323031352d31302d32370000000e2d16f389a38364ded6fdc45bc4e944000000a3000d0000000457504e58ffffffff00000005302e3934370000001a313937302d30312d30312030303a30303a30302e31393030303000000005302e343135000000062d3137393333000000063637343236310000001a323031352d30332d30342031353a34333a31352e323133363836000000023433000000017400000004485952580000000a323031352d31322d31380000000ab34c0e8ff10cc560b7d144000000a3000d0000000459504f5600000002333600000005302e3637340000001a313937302d30312d30312030303a30303a30302e32303030303000000005302e303331000000052d3538383800000007313337353432330000001a323031352d31322d31302032303a35303a33352e38363636313400000001330000000174ffffffff0000000a323031352d30372d32330000000dd4abbe30fa8dac3d98a0ad9a5d44000000ac000d000000044e55484effffffff00000005302e3639340000001a313937302d30312d30312030303a30303a30302e32313030303000000005302e333339000000062d323532323600000007333532343734380000001a323031352d30352d30372030343a30373a31382e31353239363800000002333900000001740000000456544a570000000a323031352d30342d303400000012b8bef8a146872892a39be3cbc2648ab035d8440000008e000d00000004424f53450000000332343000000005302e3036300000001a313937302d30312d30312030303a30303a30302e32323030303000000005302e33373900000005323339303400000007393036393333390000001a323031352d30332d32312030333a34323a34322e3634333138360000000238340000000174ffffffffffffffffffffffff44000000ab000d00000004494e4b470000000331323400000005302e3836320000001a313937302d30312d30312030303a30303a30302e32333030303000000005302e343034000000062d333033383300000007373233333534320000001a323031352d30372d32312031363a34323a34372e3031323134380000000239390000000166ffffffff0000000a323031352d30382d32370000001287fc9283fc88f3322770c801b0dcc93a5b7e4400000097000d000000044655584300000002353200000005302e3734330000001a313937302d30312d30312030303a30303a30302e323430303030ffffffff000000062d313437323900000007313034323036340000001a323031352d30382d32312030323a31303a35382e393439363734000000023238000000017400000004435053570000000a323031352d30382d3239ffffffff44000000a4000d00000004554e595100000002373100000005302e3434320000001a313937302d30312d30312030303a30303a30302e32353030303000000005302e353339000000062d3232363131ffffffff0000001a323031352d31322d32332031383a34313a34322e3331393835390000000239380000000174000000045045484e0000000a323031352d30312d32360000000f28ed9799d877333fb267da984747bf4400000096000d000000044b424d51ffffffff00000005302e3238300000001a313937302d30312d30312030303a30303a30302e323630303030ffffffff000000053132323430ffffffff0000001a323031352d30382d31362030313a30323a35352e3736363632320000000232310000000166ffffffff0000000a323031352d30352d31390000000d6ade4604d381e7a21622353b1c4400000084000d000000044a534f4c00000003323433ffffffff0000001a313937302d30312d30312030303a30303a30302e32373030303000000005302e303638000000062d3137343638ffffffffffffffff0000000232300000000174ffffffff0000000a323031352d30362d3139000000113de02d0486e7ca29980769ca5bd6cf0969440000007f000d00000004484e535300000003313530ffffffff0000001a313937302d30312d30312030303a30303a30302e32383030303000000005302e3134380000000531343834310000000735393932343433ffffffff0000000232350000000166000000045045484effffffff0000000c14d6fcee032281b806c406af44000000a7000d00000004505a50420000000331303100000005302e3036320000001a313937302d30312d30312030303a30303a30302e323930303030ffffffff00000005313232333700000007393837383137390000001a323031352d30392d30332032323a31333a31382e38353234363500000002373900000001660000000456544a570000000a323031352d31322d31370000001012613a9aad982e7552ad62878845b99d44000000a9000d000000044f594e4e00000002323500000005302e3333390000001a313937302d30312d30312030303a30303a30302e33303030303000000005302e36323800000005323234313200000007343733363337380000001a323031352d31302d31302031323a31393a34322e35323832323400000003313036000000017400000004435053570000000a323031352d30372d30310000000d54133fffb67ecd0427669489db4400000076000dffffffff0000000331313700000005302e3536340000001a313937302d30312d30312030303a30303a30302e333130303030ffffffff000000052d353630340000000736333533303138ffffffff0000000238340000000166ffffffffffffffff0000000b2bad2507db6244336e008e440000007e000d00000004485652490000000332333300000005302e3232340000001a313937302d30312d30312030303a30303a30302e33323030303000000005302e3432350000000531303436390000000731373135323133ffffffff0000000238360000000166ffffffff0000000a323031352d30322d3032ffffffff440000009c000d000000044f59544f00000002393600000005302e3734310000001a313937302d30312d30312030303a30303a30302e33333030303000000005302e353238000000062d313232333900000007333439393632300000001a323031352d30322d30372032323a33353a30332e3231323236380000000231370000000166000000045045484e0000000a323031352d30332d3239ffffffff440000008b000d000000044c46435900000002363300000005302e3732320000001a313937302d30312d30312030303a30303a30302e333430303030ffffffff0000000532333334340000000739353233393832ffffffff00000003313233000000016600000004435053570000000a323031352d30352d31380000000e05e5c04eccd6e37b34cd1535bba444000000a7000d0000000447484c580000000331343800000005302e3330360000001a313937302d30312d30312030303a30303a30302e33353030303000000005302e363336000000062d333134353700000007323332323333370000001a323031352d31302d32322031323a30363a30352e353434373031000000023931000000017400000004485952580000000a323031352d30352d32310000000a571d91723004b702cb034400000097000d000000045954535a00000003313233ffffffff0000001a313937302d30312d30312030303a30303a30302e33363030303000000005302e35313900000005323235333400000007343434363233360000001a323031352d30372d32372030373a32333a33372e323333373131000000023533000000016600000004435053570000000a323031352d30312d3133ffffffff4400000096000d0000000453574c5500000003323531ffffffff0000001a313937302d30312d30312030303a30303a30302e33373030303000000005302e313739000000043737333400000007343038323437350000001a323031352d31302d32312031383a32343a33342e3430303334350000000236390000000166000000045045484e0000000a323031352d30342d3031ffffffff44000000a4000d0000000454514a4c00000003323435ffffffff0000001a313937302d30312d30312030303a30303a30302e33383030303000000005302e3836350000000439353136000000063932393334300000001a323031352d30352d32382030343a31383a31382e36343035363700000002363900000001660000000456544a570000000a323031352d30362d31320000000f6c3e51d7ebb10771321faf404e8c474400000091000d000000045245494a000000023934ffffffff0000001a313937302d30312d30312030303a30303a30302e33393030303000000005302e313330000000062d3239393234ffffffff0000001a323031352d30332d32302032323a31343a34362e32303437313800000003313133000000017400000004485952580000000a323031352d31322d3139ffffffff44000000a8000d000000044844485100000002393400000005302e3732330000001a313937302d30312d30312030303a30303a30302e34303030303000000005302e373330000000053139393730000000063635343133310000001a323031352d30312d31302032323a35363a30382e3438303435300000000238340000000174ffffffff0000000a323031352d30332d3035000000124f566b65a45338e9cdc1a7ee8675ada52d49440000009c000d00000004554d455500000002343000000005302e3030380000001a313937302d30312d30312030303a30303a30302e34313030303000000005302e383035000000062d313136323300000007343539393836320000001a323031352d31312d32302030343a30323a34342e3333353934370000000237360000000166000000045045484e0000000a323031352d30352d3137ffffffff44000000a0000d00000004594a494800000003313834ffffffff0000001a313937302d30312d30312030303a30303a30302e34323030303000000005302e33383300000005313736313400000007333130313637310000001a323031352d30312d32382031323a30353a34362e363833303031000000033130350000000174ffffffff0000000a323031352d31322d30370000000cec69cd73bb9bc595db6191ce4400000089000d000000044359584700000002323700000005302e3239320000001a313937302d30312d30312030303a30303a30302e34333030303000000005302e393533000000043339343400000006323439313635ffffffff0000000236370000000174ffffffff0000000a323031352d30332d30320000000e0148153e0c7f3f8fe4b5ab3421294400000099000d000000044d5254470000000331343300000005302e3032360000001a313937302d30312d30312030303a30303a30302e34343030303000000005302e393433000000062d323733323000000007313636373834320000001a323031352d30312d32342031393a35363a31352e3937333130390000000231310000000166ffffffff0000000a323031352d30312d3234ffffffff44000000aa000d00000004444f4e500000000332343600000005302e3635340000001a313937302d30312d30312030303a30303a30302e34353030303000000005302e35353600000005323734373700000007343136303031380000001a323031352d31322d31342030333a34303a30352e3931313833390000000232300000000174000000045045484e0000000a323031352d31302d32390000000e079201f56aa131cdcbc2a2b48e9944000000a9000d00000004495158530000000332333200000005302e3233310000001a313937302d30312d30312030303a30303a30302e34363030303000000005302e303439000000062d313831313300000007343030353232380000001a323031352d30362d31312031333a30303a30372e3234383138380000000138000000017400000004435053570000000a323031352d30382d31360000000dfa1f9224b1b8676508b7f8410044000000a4000dffffffff00000003313738ffffffff0000001a313937302d30312d30312030303a30303a30302e34373030303000000005302e393033000000062d313436323600000007323933343537300000001a323031352d30342d30342030383a35313a35342e3036383135340000000238380000000174ffffffff0000000a323031352d30372d303100000014843625632b6361431c477db646babb98ca08bea44400000097000d000000044855575a00000002393400000005302e3131300000001a313937302d30312d30312030303a30303a30302e34383030303000000005302e343230000000052d3337333600000007353638373531340000001a323031352d30312d30322031373a31383a30352e3632373633330000000237340000000166ffffffff0000000a323031352d30332d3239ffffffff440000009d000d000000045352454400000002363600000005302e3131330000001a313937302d30312d30312030303a30303a30302e34393030303000000005302e303630000000062d313035343300000007333636393337370000001a323031352d31302d32322030323a35333a30322e3338313335310000000237370000000174000000045045484effffffff0000000b7c3fd6883a93ef24a5e2bc\n" +
"<5400000128000d730000000000000000000413000000000000000069000000000000000000001700000000000000006400000000000000000002bd000000000000000074000000000000000000045a00000000000000006600000000000000000002bc00000000000000005f73686f7274000000000000000000001500000000000000006c00000000000000000000140000000000000000747332000000000000000000045a00000000000000006262000000000000000000001500000000000000006200000000000000000000100000000000000000726e645f73796d626f6c00000000000000000004130000000000000000726e645f64617465000000000000000000045a0000000000000000726e645f62696e00000000000000000000110000000000000001\n" +
"<4400000099000dffffffff00000002353700000005302e3632350000001a313937302d30312d30312030303a30303a30302e30303030303000000005302e343632000000052d313539330000000733343235323332ffffffff000000033132310000000166000000045045484e00000017323031352d30332d31372030343a32353a35322e3736350000000e19c49594365349b4597e3b08a11e44000000bb000d00000004585953420000000331343200000005302e3537390000001a313937302d30312d30312030303a30303a30302e30313030303000000005302e39363900000005323030383800000007313531373439300000001a323031352d30312d31372032303a34313a31392e343830363835000000033130300000000174000000045045484e00000017323031352d30362d32302030313a31303a35382e35393900000011795f8b812b934d1a8e78b5b91153d0fb6444000000b4000d000000044f5a5a560000000332313900000005302e3136340000001a313937302d30312d30312030303a30303a30302e30323030303000000005302e363539000000062d313233303300000007393438393530380000001a323031352d30382d31332031373a31303a31392e37353235323100000001360000000166ffffffff00000017323031352d30352d32302030313a34383a33372e3431380000000f2b4d5ff64690c3b3598ee5612f640e44000000a4000d000000044f4c595800000002333000000005302e3731330000001a313937302d30312d30312030303a30303a30302e30333030303000000005302e363535000000043636313000000007363530343432380000001a323031352d30382d30382030303a34323a32342e353435363339000000033132330000000166ffffffff00000017323031352d30312d30332031333a35333a30332e313635ffffffff440000009f000d000000045449514200000002343200000005302e3638310000001a313937302d30312d30312030303a30303a30302e30343030303000000005302e363236000000052d3136303500000007383831343038360000001a323031352d30372d32382031353a30383a35332e34363234393500000002323800000001740000000443505357ffffffff0000000e3ba6dc3b7d2be392fe6938e1779a44000000a2000d000000044c544f560000000331333700000005302e3736330000001a313937302d30312d30312030303a30303a30302e30353030303000000005302e3838320000000439303534ffffffff0000001a323031352d30342d32302030353a30393a30332e353830353734000000033130360000000166000000045045484e00000017323031352d30312d30392030363a35373a31372e353132ffffffff44000000a0000d000000045a494d4e00000003313235ffffffff0000001a313937302d30312d30312030303a30303a30302e303630303030ffffffff00000005313135323400000007383333353236310000001a323031352d31302d32362030323a31303a35302e363838333934000000033131310000000174000000045045484e00000017323031352d30382d32312031353a34363a33322e363234ffffffff4400000093000d000000044f504a4f0000000331363800000005302e3130350000001a313937302d30312d30312030303a30303a30302e30373030303000000005302e353335000000052d3539323000000007373038303730340000001a323031352d30372d31312030393a31353a33382e3334323731370000000331303300000001660000000456544a57ffffffffffffffff44000000a9000d00000004474c554f0000000331343500000005302e3533390000001a313937302d30312d30312030303a30303a30302e30383030303000000005302e37363700000005313432343200000007323439393932320000001a323031352d31312d30322030393a30313a33312e3331323830340000000238340000000166000000045045484e00000017323031352d31312d31342031373a33373a33362e303433ffffffff44000000b6000d000000045a5651450000000331303300000005302e3637330000001a313937302d30312d30312030303a30303a30302e303930303030ffffffff00000005313337323700000007373837353834360000001a323031352d31322d31322031333a31363a32362e3133343536320000000232320000000174000000045045484e00000017323031352d30312d32302030343a35303a33342e30393800000012143380c9eba3677a1a79e435e43adc5c65ff440000009a000d000000044c4947590000000331393900000005302e3238340000001a313937302d30312d30312030303a30303a30302e313030303030ffffffff00000005333034323600000007333231353536320000001a323031352d30382d32312031343a35353a30372e30353537323200000002313100000001660000000456544a57ffffffff0000000dff703ac78ab314cd470b0c3912440000009a000d000000044d514e5400000002343300000005302e3538360000001a313937302d30312d30312030303a30303a30302e31313030303000000005302e333335000000053237303139ffffffffffffffff0000000232370000000174000000045045484e00000017323031352d30372d31322031323a35393a34372e3636350000001326fb2e42faf56e8f80e354b807b13257ff9aef44000000bb000d00000004575743430000000332313300000005302e3736370000001a313937302d30312d30312030303a30303a30302e31323030303000000005302e35383000000005313336343000000007343132313932330000001a323031352d30382d30362030323a32373a33302e3436393736320000000237330000000166000000045045484e00000017323031352d30342d33302030383a31383a31302e3435330000001271a7d5af11963708dd98ef54882aa2ade7d444000000a2000d00000004564647500000000331323000000005302e3834300000001a313937302d30312d30312030303a30303a30302e31333030303000000005302e373733000000043732323300000007373234313432330000001a323031352d31322d31382030373a33323a31382e34353630323500000002343300000001660000000456544a57ffffffff00000011244e44a80dfe27ec53135db215e7b8356744000000a9000d00000004524d44470000000331333400000005302e3131300000001a313937302d30312d30312030303a30303a30302e31343030303000000005302e30343300000005323132323700000007373135353730380000001a323031352d30372d30332030343a31323a34352e3737343238310000000234320000000174000000044350535700000017323031352d30322d32342031323a31303a34332e313939ffffffff44000000a5000d0000000457464f5100000003323535ffffffff0000001a313937302d30312d30312030303a30303a30302e31353030303000000005302e31313600000005333135363900000007363638383237370000001a323031352d30352d31392030333a33303a34352e373739393939000000033132360000000174000000045045484e00000017323031352d31322d30392030393a35373a31372e303738ffffffff440000008b000d000000044d58444b00000002353600000005312e3030300000001a313937302d30312d30312030303a30303a30302e31363030303000000005302e353233000000062d33323337320000000736383834313332ffffffff0000000235380000000166ffffffff00000017323031352d30312d32302030363a31383a31382e353833ffffffff44000000ae000d00000004584d4b4a0000000331333900000005302e3834310000001a313937302d30312d30312030303a30303a30302e31373030303000000005302e333036000000053235383536ffffffff0000001a323031352d30352d31382030333a35303a32322e373331343337000000013200000001740000000456544a5700000017323031352d30362d32352031303a34353a30312e3031340000000d007cfb0119caf2bf845a6f383544000000af000d0000000456494844ffffffffffffffff0000001a313937302d30312d30312030303a30303a30302e31383030303000000005302e35353000000005323232383000000007393130393834320000001a323031352d30312d32352031333a35313a33382e3237303538330000000239340000000166000000044350535700000017323031352d31302d32372030323a35323a31392e3933350000000e2d16f389a38364ded6fdc45bc4e944000000b0000d0000000457504e58ffffffff00000005302e3934370000001a313937302d30312d30312030303a30303a30302e31393030303000000005302e343135000000062d3137393333000000063637343236310000001a323031352d30332d30342031353a34333a31352e3231333638360000000234330000000174000000044859525800000017323031352d31322d31382032313a32383a32352e3332350000000ab34c0e8ff10cc560b7d144000000b0000d0000000459504f5600000002333600000005302e3637340000001a313937302d30312d30312030303a30303a30302e32303030303000000005302e303331000000052d3538383800000007313337353432330000001a323031352d31322d31302032303a35303a33352e38363636313400000001330000000174ffffffff00000017323031352d30372d32332032303a31373a30342e3233360000000dd4abbe30fa8dac3d98a0ad9a5d44000000b9000d000000044e55484effffffff00000005302e3639340000001a313937302d30312d30312030303a30303a30302e32313030303000000005302e333339000000062d323532323600000007333532343734380000001a323031352d30352d30372030343a30373a31382e31353239363800000002333900000001740000000456544a5700000017323031352d30342d30342031353a32333a33342e31333000000012b8bef8a146872892a39be3cbc2648ab035d8440000008e000d00000004424f53450000000332343000000005302e3036300000001a313937302d30312d30312030303a30303a30302e32323030303000000005302e33373900000005323339303400000007393036393333390000001a323031352d30332d32312030333a34323a34322e3634333138360000000238340000000174ffffffffffffffffffffffff44000000b8000d00000004494e4b470000000331323400000005302e3836320000001a313937302d30312d30312030303a30303a30302e32333030303000000005302e343034000000062d333033383300000007373233333534320000001a323031352d30372d32312031363a34323a34372e3031323134380000000239390000000166ffffffff00000017323031352d30382d32372031373a32353a33352e3330380000001287fc9283fc88f3322770c801b0dcc93a5b7e44000000a4000d000000044655584300000002353200000005302e3734330000001a313937302d30312d30312030303a30303a30302e323430303030ffffffff000000062d313437323900000007313034323036340000001a323031352d30382d32312030323a31303a35382e3934393637340000000232380000000174000000044350535700000017323031352d30382d32392032303a31353a35312e383335ffffffff44000000b1000d00000004554e595100000002373100000005302e3434320000001a313937302d30312d30312030303a30303a30302e32353030303000000005302e353339000000062d3232363131ffffffff0000001a323031352d31322d32332031383a34313a34322e3331393835390000000239380000000174000000045045484e00000017323031352d30312d32362030303a35353a35302e3230320000000f28ed9799d877333fb267da984747bf44000000a3000d000000044b424d51ffffffff00000005302e3238300000001a313937302d30312d30312030303a30303a30302e323630303030ffffffff000000053132323430ffffffff0000001a323031352d30382d31362030313a30323a35352e3736363632320000000232310000000166ffffffff00000017323031352d30352d31392030303a34373a31382e3639380000000d6ade4604d381e7a21622353b1c4400000091000d000000044a534f4c00000003323433ffffffff0000001a313937302d30312d30312030303a30303a30302e32373030303000000005302e303638000000062d3137343638ffffffffffffffff0000000232300000000174ffffffff00000017323031352d30362d31392031303a33383a35342e343833000000113de02d0486e7ca29980769ca5bd6cf0969440000007f000d00000004484e535300000003313530ffffffff0000001a313937302d30312d30312030303a30303a30302e32383030303000000005302e3134380000000531343834310000000735393932343433ffffffff0000000232350000000166000000045045484effffffff0000000c14d6fcee032281b806c406af44000000b4000d00000004505a50420000000331303100000005302e3036320000001a313937302d30312d30312030303a30303a30302e323930303030ffffffff00000005313232333700000007393837383137390000001a323031352d30392d30332032323a31333a31382e38353234363500000002373900000001660000000456544a5700000017323031352d31322d31372031353a31323a35342e3935380000001012613a9aad982e7552ad62878845b99d44000000b6000d000000044f594e4e00000002323500000005302e3333390000001a313937302d30312d30312030303a30303a30302e33303030303000000005302e36323800000005323234313200000007343733363337380000001a323031352d31302d31302031323a31393a34322e353238323234000000033130360000000174000000044350535700000017323031352d30372d30312030303a32333a34392e3738390000000d54133fffb67ecd0427669489db4400000076000dffffffff0000000331313700000005302e3536340000001a313937302d30312d30312030303a30303a30302e333130303030ffffffff000000052d353630340000000736333533303138ffffffff0000000238340000000166ffffffffffffffff0000000b2bad2507db6244336e008e440000008b000d00000004485652490000000332333300000005302e3232340000001a313937302d30312d30312030303a30303a30302e33323030303000000005302e3432350000000531303436390000000731373135323133ffffffff0000000238360000000166ffffffff00000017323031352d30322d30322030353a34383a31372e333733ffffffff44000000a9000d000000044f59544f00000002393600000005302e3734310000001a313937302d30312d30312030303a30303a30302e33333030303000000005302e353238000000062d313232333900000007333439393632300000001a323031352d30322d30372032323a33353a30332e3231323236380000000231370000000166000000045045484e00000017323031352d30332d32392031323a35353a31312e363832ffffffff4400000098000d000000044c46435900000002363300000005302e3732320000001a313937302d30312d30312030303a30303a30302e333430303030ffffffff0000000532333334340000000739353233393832ffffffff000000033132330000000166000000044350535700000017323031352d30352d31382030343a33353a32372e3232380000000e05e5c04eccd6e37b34cd1535bba444000000b4000d0000000447484c580000000331343800000005302e3330360000001a313937302d30312d30312030303a30303a30302e33353030303000000005302e363336000000062d333134353700000007323332323333370000001a323031352d31302d32322031323a30363a30352e3534343730310000000239310000000174000000044859525800000017323031352d30352d32312030393a33333a31382e3135380000000a571d91723004b702cb0344000000a4000d000000045954535a00000003313233ffffffff0000001a313937302d30312d30312030303a30303a30302e33363030303000000005302e35313900000005323235333400000007343434363233360000001a323031352d30372d32372030373a32333a33372e3233333731310000000235330000000166000000044350535700000017323031352d30312d31332030343a33373a31302e303336ffffffff44000000a3000d0000000453574c5500000003323531ffffffff0000001a313937302d30312d30312030303a30303a30302e33373030303000000005302e313739000000043737333400000007343038323437350000001a323031352d31302d32312031383a32343a33342e3430303334350000000236390000000166000000045045484e00000017323031352d30342d30312031343a33333a34322e303035ffffffff44000000b1000d0000000454514a4c00000003323435ffffffff0000001a313937302d30312d30312030303a30303a30302e33383030303000000005302e3836350000000439353136000000063932393334300000001a323031352d30352d32382030343a31383a31382e36343035363700000002363900000001660000000456544a5700000017323031352d30362d31322032303a31323a32382e3838310000000f6c3e51d7ebb10771321faf404e8c47440000009e000d000000045245494a000000023934ffffffff0000001a313937302d30312d30312030303a30303a30302e33393030303000000005302e313330000000062d3239393234ffffffff0000001a323031352d30332d32302032323a31343a34362e323034373138000000033131330000000174000000044859525800000017323031352d31322d31392031333a35383a34312e383139ffffffff44000000b5000d000000044844485100000002393400000005302e3732330000001a313937302d30312d30312030303a30303a30302e34303030303000000005302e373330000000053139393730000000063635343133310000001a323031352d30312d31302032323a35363a30382e3438303435300000000238340000000174ffffffff00000017323031352d30332d30352031373a31343a34382e323735000000124f566b65a45338e9cdc1a7ee8675ada52d4944000000a9000d00000004554d455500000002343000000005302e3030380000001a313937302d30312d30312030303a30303a30302e34313030303000000005302e383035000000062d313136323300000007343539393836320000001a323031352d31312d32302030343a30323a34342e3333353934370000000237360000000166000000045045484e00000017323031352d30352d31372031373a33333a32302e393232ffffffff44000000ad000d00000004594a494800000003313834ffffffff0000001a313937302d30312d30312030303a30303a30302e34323030303000000005302e33383300000005313736313400000007333130313637310000001a323031352d30312d32382031323a30353a34362e363833303031000000033130350000000174ffffffff00000017323031352d31322d30372031393a32343a33362e3833380000000cec69cd73bb9bc595db6191ce4400000096000d000000044359584700000002323700000005302e3239320000001a313937302d30312d30312030303a30303a30302e34333030303000000005302e393533000000043339343400000006323439313635ffffffff0000000236370000000174ffffffff00000017323031352d30332d30322030383a31393a34342e3536360000000e0148153e0c7f3f8fe4b5ab34212944000000a6000d000000044d5254470000000331343300000005302e3032360000001a313937302d30312d30312030303a30303a30302e34343030303000000005302e393433000000062d323733323000000007313636373834320000001a323031352d30312d32342031393a35363a31352e3937333130390000000231310000000166ffffffff00000017323031352d30312d32342030373a31353a30322e373732ffffffff44000000b7000d00000004444f4e500000000332343600000005302e3635340000001a313937302d30312d30312030303a30303a30302e34353030303000000005302e35353600000005323734373700000007343136303031380000001a323031352d31322d31342030333a34303a30352e3931313833390000000232300000000174000000045045484e00000017323031352d31302d32392031343a33353a31302e3136370000000e079201f56aa131cdcbc2a2b48e9944000000b6000d00000004495158530000000332333200000005302e3233310000001a313937302d30312d30312030303a30303a30302e34363030303000000005302e303439000000062d313831313300000007343030353232380000001a323031352d30362d31312031333a30303a30372e32343831383800000001380000000174000000044350535700000017323031352d30382d31362031313a30393a32342e3331310000000dfa1f9224b1b8676508b7f8410044000000b1000dffffffff00000003313738ffffffff0000001a313937302d30312d30312030303a30303a30302e34373030303000000005302e393033000000062d313436323600000007323933343537300000001a323031352d30342d30342030383a35313a35342e3036383135340000000238380000000174ffffffff00000017323031352d30372d30312030343a33323a32332e30383300000014843625632b6361431c477db646babb98ca08bea444000000a4000d000000044855575a00000002393400000005302e3131300000001a313937302d30312d30312030303a30303a30302e34383030303000000005302e343230000000052d3337333600000007353638373531340000001a323031352d30312d30322031373a31383a30352e3632373633330000000237340000000166ffffffff00000017323031352d30332d32392030363a33393a31312e363432ffffffff440000009d000d000000045352454400000002363600000005302e3131330000001a313937302d30312d30312030303a30303a30302e34393030303000000005302e303630000000062d313035343300000007333636393337370000001a323031352d31302d32322030323a35333a30322e3338313335310000000237370000000174000000045045484effffffff0000000b7c3fd6883a93ef24a5e2bc\n" +
"<430000000f53454c45435420302030005a0000000549\n" +
">420000000c000000000000000044000000065000450000000900000000005300000004440000000650004500000009000000000053000000044500000009000000000053000000045300000004\n" +
"<5400000128000d730000000000000000000413000000000000000069000000000000000000001700000000000000006400000000000000000002bd00000000000000007400000000000000000004a000000000000000006600000000000000000002bc00000000000000005f73686f7274000000000000000000001500000000000000006c0000000000000000000014000000000000000074733200000000000000000004a000000000000000006262000000000000000000001500000000000000006200000000000000000000100000000000000000726e645f73796d626f6c00000000000000000004130000000000000000726e645f64617465000000000000000000043a0000000000000000726e645f62696e00000000000000000000110000000000000001\n" +
"<44000000a8000d0000000450574c5a00000002393100000005302e3530340000001a313937302d30312d30312030303a30303a30302e303030303030ffffffff000000052d3739383500000007343233343632310000001a323031352d30312d32362031323a31373a31302e363535353938000000033130360000000166000000045045484e0000000a323031352d31322d3036000000112a4e91c5e439b2dd0da7bbd57172ba9cac440000008f000d00000004594c58470000000331313400000005302e3739320000001a313937302d30312d30312030303a30303a30302e303130303030ffffffff0000000531383230300000000737363830303832ffffffff000000023530000000017400000004435053570000000a323031352d30352d31330000001252bb50c9024d40ef1fb817f741ffc1a75cc34400000092000d00000004424b5850ffffffff00000005302e3735360000001a313937302d30312d30312030303a30303a30302e30323030303000000005302e393030000000062d3136393636ffffffff0000001a323031352d30372d30382030343a30393a30372e3132373837340000000135000000017400000004485952580000000a323031352d31302d3132ffffffff4400000096000d00000004485844420000000332333900000005302e3433340000001a313937302d30312d30312030303a30303a30302e30333030303000000005302e323335000000053235363238ffffffff0000001a323031352d30392d32302031383a30313a35362e37313437363800000003313134000000017400000004485952580000000a323031352d31312d3039ffffffff440000009d000d0000000454534c4f0000000331353800000005302e3035380000001a313937302d30312d30312030303a30303a30302e30343030303000000005302e333933000000062d313736363900000007373435393639300000001a323031352d31302d30372030303a32393a35372e353439393139000000023333000000016600000004485952580000000a323031352d30342d3038ffffffff4400000090000d00000004484a5558000000013800000005302e3137360000001a313937302d30312d30312030303a30303a30302e30353030303000000005302e31353500000005323530353700000007383334313835310000001a323031352d30322d30382030333a33333a34342e35353434373300000002383300000001660000000456544a57ffffffffffffffff44000000ab000d00000004535444540000000331303600000005302e3231390000001a313937302d30312d30312030303a30303a30302e30363030303000000005302e37373700000005323238383300000007353136383237310000001a323031352d31322d32392030353a30303a33392e3139373135310000000331323500000001740000000456544a570000000a323031352d30392d32350000000e66ca8556e244dbb8e993fcd9cb994400000090000d000000044d43495900000002323600000005302e3138390000001a313937302d30312d30312030303a30303a30302e30373030303000000005302e373535000000062d3231363334ffffffff0000001a323031352d31312d31342031373a34313a31382e38393931363900000001320000000174ffffffff0000000a323031352d30372d3134ffffffff440000009b000d000000044b53514400000002353100000005302e3238360000001a313937302d30312d30312030303a30303a30302e30383030303000000005302e323837000000053139313433ffffffff0000001a323031352d30372d31362030383a33363a35372e373737393837000000033132300000000174ffffffff0000000a323031352d30342d30360000000a84d512fb719934038208440000009d000d000000044a4a46470000000332313100000005302e3832320000001a313937302d30312d30312030303a30303a30302e30393030303000000005302e323735000000062d313831353700000007393639323732300000001a323031352d30352d32332030383a34303a33332e3431393237370000000231320000000174000000045045484e0000000a323031352d30372d3036ffffffff44000000a7000d0000000449584d490000000331313200000005302e3334370000001a313937302d30312d30312030303a30303a30302e31303030303000000005302e363537000000062d313930313700000007393630313134370000001a323031352d31302d30342030363a32323a31322e383039353930000000023737000000017400000004435053570000000a323031352d30342d32300000000a1a275b4d0f33f470bb5744000000a4000d0000000445464a420000000331393900000005302e3537360000001a313937302d30312d30312030303a30303a30302e31313030303000000005302e343330000000043530353900000007353031303134340000001a323031352d30332d30392031373a33343a34372e3631393630320000000233320000000174ffffffff0000000a323031352d30342d31350000000d003aea50240bc51a5a8d8550394400000097000d000000044a46424b0000000331333900000005302e3236350000001a313937302d30312d30312030303a30303a30302e31323030303000000005302e313832000000043332353500000007333732343636300000001a323031352d31322d31302031353a35363a32352e3535383733350000000239350000000174ffffffff0000000a323031352d30362d3131ffffffff440000009f000d000000044d44524e0000000331303600000005302e3136340000001a313937302d30312d30312030303a30303a30302e31333030303000000005302e343734000000062d3138383439000000063638343236390000001a323031352d31322d32382032303a35383a32362e30333732343400000002313900000001660000000448595258ffffffff0000000d39dc8c6c6bac60aabcf427617844000000a3000d000000045650474800000002343200000005302e3530330000001a313937302d30312d30312030303a30303a30302e31343030303000000005302e323033000000062d313537323000000007353837303336380000001a323031352d30352d32392030373a30363a33302e3337373730360000000234340000000174ffffffff0000000a323031352d30372d30310000000bd989264fe4513785e1e46e440000008d000d000000044f54485300000002373400000005302e3232340000001a313937302d30312d30312030303a30303a30302e31353030303000000005302e31313600000004393832310000000733393533393634ffffffff000000023132000000017400000004435053570000000a323031352d30322d30320000000d593e98c98e5fbd124072694ec244000000a3000d000000044e4746440000000134ffffffff0000001a313937302d30312d30312030303a30303a30302e31363030303000000005302e32363600000005313731353400000007323532343534320000001a323031352d30322d32322030393a33353a30362e36363236333500000001380000000174ffffffff0000000a323031352d31312d303200000013983fb81e53a335588dca1dd0b2eb543f32825b4400000091000d000000045151444f00000002313000000005302e3635330000001a313937302d30312d30312030303a30303a30302e31373030303000000005302e323533000000052d3132313200000007333437363834330000001a323031352d30312d32352032333a31393a34352e32343533373200000002343300000001660000000448595258ffffffffffffffff44000000aa000d00000004534f42520000000331333200000005302e3932350000001a313937302d30312d30312030303a30303a30302e31383030303000000005302e343334000000042d38343600000007333632383332300000001a323031352d30372d32372031373a32393a32342e303037373235000000023335000000016600000004435053570000000a323031352d30322d30370000000f66a1f432e1d00dbf2e91a04aa8bc1c44000000ab000d00000004554452450000000331303700000005302e3939370000001a313937302d30312d30312030303a30303a30302e31393030303000000005302e38353700000005313633383200000007343932313737350000001a323031352d30332d30382031303a35313a32322e303139353234000000023830000000016600000004485952580000000a323031352d31302d33300000000f671cfdeba385e53d2184bbb19b5da544000000aa000d0000000457424e450000000331323700000005302e3534350000001a313937302d30312d30312030303a30303a30302e32303030303000000005302e34303300000005313232353100000007383033333232330000001a323031352d30362d31362032313a30363a33312e3735303434310000000236300000000174ffffffff0000000a323031352d31322d303500000012c555ef19d90f612db25ad879a0b0ac6093f1440000007a000dffffffff0000000331393400000005302e3435330000001a313937302d30312d30312030303a30303a30302e323130303030ffffffff000000062d32363936380000000738373030363431ffffffff0000000234300000000174000000045045484e0000000a323031352d31322d3037ffffffff440000009e000d0000000447445450ffffffff00000005302e3232370000001a313937302d30312d30312030303a30303a30302e32323030303000000005302e343436000000062d333030393000000007323736323737390000001a323031352d31322d31322030333a35383a35302e38373830313500000002313100000001660000000456544a57ffffffff0000000e6b531e18079d752a1131d2fbde75440000008f000d00000004575a434a0000000332343400000005302e3937350000001a313937302d30312d30312030303a30303a30302e32333030303000000005302e3232320000000532353836360000000731343830363238ffffffff000000023330000000016600000004485952580000000a323031352d30312d32310000000d4b9d2a9fc1f84f032a59d613dd44000000ae000d000000044f5854500000000331393200000005302e3935370000001a313937302d30312d30312030303a30303a30302e32343030303000000005302e30393400000005323330363000000007333431303232300000001a323031352d30322d32352031373a32313a34342e393532383735000000023137000000017400000004485952580000000a323031352d31312d323300000012fcbb7bd33f08bfbfc083960994535679ebcd44000000a2000d000000044b5859440000000331353100000005302e3430300000001a313937302d30312d30312030303a30303a30302e32353030303000000005302e373534000000062d313833373000000007383236323230360000001a323031352d30342d31392031323a33373a30392e3538383935370000000231390000000166ffffffffffffffff0000001329b39aab7e35973ea15a97c402793839c148ef44000000ad000d00000004574d53520000000331393800000005302e3236350000001a313937302d30312d30312030303a30303a30302e32363030303000000005302e33333100000005313935303100000007373630303133310000001a323031352d31322d30382031363a34383a32352e333633353233000000033132330000000174ffffffff0000000a323031352d30382d303300000014d1df4c3da99136abd2ce1b77497791c2b8f4e7c94400000097000dffffffff0000000331333400000005302e3136320000001a313937302d30312d30312030303a30303a30302e32373030303000000005302e35323300000005323037373100000007323738343235380000001a323031352d31312d31372031353a31343a32312e31323236343700000001310000000174000000045045484e0000000a323031352d31322d3038ffffffff44000000a7000d00000004434c47450000000332343000000005302e3639330000001a313937302d30312d30312030303a30303a30302e32383030303000000005302e35353400000005313839393700000007313239353535300000001a323031352d30332d31322031353a34343a33372e3139353039370000000234310000000166000000045045484e0000000a323031352d30352d30390000000bf6eeea3fc2953f27ede8c044000000b0000d000000045843464f0000000332333100000005302e3335330000001a313937302d30312d30312030303a30303a30302e32393030303000000005302e39353400000005333133333100000007383239343437380000001a323031352d31302d32382032323a35313a31392e36383232313700000003313134000000016600000004485952580000000a323031352d30342d3031000000131e60f2343a5e725d5a66734923034956bd02aa44000000a1000d0000000459515953000000013600000005302e3034350000001a313937302d30312d30312030303a30303a30302e33303030303000000005302e37333200000005333139313700000007343636313037350000001a323031352d30362d31372030333a34333a33322e333937323233000000033131350000000166ffffffff0000000a323031352d31322d31320000000a60a87e6ca44f9dab2b61440000009d000d000000044b4a4b4e0000000332323100000005302e3639330000001a313937302d30312d30312030303a30303a30302e33313030303000000005302e393832000000062d333234373900000007313538373835320000001a323031352d30392d30342031303a33393a35332e36313236343200000002323300000001740000000456544a570000000a323031352d31322d3236ffffffff4400000095000d00000004485a4d440000000332333600000005302e3233310000001a313937302d30312d30312030303a30303a30302e33323030303000000005302e323835000000053237393932ffffffff0000001a323031352d30382d31382031343a32323a30352e383334313532000000023231000000017400000004485952580000000a323031352d30342d3036ffffffff4400000093000dffffffff00000003323139ffffffff0000001a313937302d30312d30312030303a30303a30302e33333030303000000005302e373138000000052d3236393700000007383132303236360000001a323031352d31312d30382031383a31373a33322e3336323935330000000235390000000166000000045045484effffffff0000000a40f24f2981d070ecd5f344000000a4000d00000004585a4d4d0000000332343600000005302e3436300000001a313937302d30312d30312030303a30303a30302e33343030303000000005302e3937320000000438323635000000063936333230390000001a323031352d30312d32322031343a35363a34352e343936303139000000033132360000000174ffffffff0000000a323031352d30322d31390000000d2738e2f83774df3ad8e1e6ba4a44000000a8000d000000044355465700000002363700000005302e3837310000001a313937302d30312d30312030303a30303a30302e33353030303000000005302e3233350000000331323500000007383037343433360000001a323031352d30392d32392030353a31303a35332e343037303834000000023937000000017400000004485952580000000a323031352d30312d30340000000f568acf3f12ab0f4ddf7eb106d30b1a44000000a8000d000000045642575a0000000332333800000005302e3832310000001a313937302d30312d30312030303a30303a30302e33363030303000000005302e30393200000005323634383700000007323535393938320000001a323031352d30372d33302030323a35343a33302e3836353137340000000235320000000166000000045045484e0000000a323031352d30312d30350000000cfb04dc12a5f0054cebaf228c4400000089000dffffffff0000000331393000000005302e3834320000001a313937302d30312d30312030303a30303a30302e33373030303000000005302e363537000000062d313831333100000006333034323135ffffffff0000000236380000000174000000045045484e0000000a323031352d30362d30380000000b40808e49636de05a311bea4400000098000d00000004454d50500000000332333600000005302e3537350000001a313937302d30312d30312030303a30303a30302e333830303030ffffffff000000062d323939353600000007363033333235390000001a323031352d30372d31362031353a35303a35372e36333133313700000002353300000001740000000456544a570000000a323031352d30352d3137ffffffff4400000094000d000000045a4b585000000002343000000005302e3235320000001a313937302d30312d30312030303a30303a30302e33393030303000000005302e303133000000053332363530ffffffff0000001a323031352d30372d31362031333a31333a34392e353038343632000000023933000000017400000004485952580000000a323031352d30392d3232ffffffff44000000a5000d00000004464d4453000000013500000005302e3631370000001a313937302d30312d30312030303a30303a30302e34303030303000000005302e31313200000005313039303900000007323734363639360000001a323031352d30382d32322032313a32333a31352e3436383933300000000237380000000174000000045045484e0000000a323031352d30352d30330000000b48f5da38103592256a3b964400000092000d00000004495456580000000331393700000005302e3939370000001a313937302d30312d30312030303a30303a30302e34313030303000000005302e393438000000052d3638353100000007353334343533330000001a323031352d30362d32382032323a32373a32322e39303431353700000002353900000001740000000456544a57ffffffffffffffff44000000a4000dffffffff00000002383100000005302e3331380000001a313937302d30312d30312030303a30303a30302e34323030303000000005302e34373600000005313333313400000007383232353535320000001a323031352d30312d31332030333a34333a32352e33313539303800000001370000000166000000045045484e0000000a323031352d30372d31330000000e68d74fc2ca1ad35d9f47589c57204400000098000d00000004544c594d00000002363100000005302e3735380000001a313937302d30312d30312030303a30303a30302e34333030303000000005302e303139000000062d323531363000000007383832303338360000001a323031352d30342d31362031373a35343a32332e3631343634360000000235380000000174ffffffff0000000a323031352d31302d3138ffffffff4400000087000d00000004514d494f000000023634ffffffff0000001a313937302d30312d30312030303a30303a30302e34343030303000000005302e343131000000062d31393730340000000738323130383932ffffffff0000000233340000000166ffffffff0000000a323031352d30372d31330000000efb08dddaaad2d5bab2d190e1692b4400000092000d000000044246435500000002313400000005302e3332390000001a313937302d30312d30312030303a30303a30302e34353030303000000005302e323631000000062d31363631390000000738373733323737ffffffff0000000231370000000174000000045045484e0000000a323031352d30322d323700000010489e307c3fb023e5f9a90b86ebce31ff440000009c000d00000004524a495900000002313400000005302e3539320000001a313937302d30312d30312030303a30303a30302e34363030303000000005302e363936000000062d323932373900000007363430393031330000001a323031352d31302d33302031333a34393a33362e323031353135000000023836000000016600000004435053570000000a323031352d30312d3035ffffffff440000009e000d000000044a4e4c560000000332303600000005302e3736360000001a313937302d30312d30312030303a30303a30302e34373030303000000005302e343830000000062d313630373700000007313937313433320000001a323031352d30392d31342031353a32343a32342e35393635303700000003313235000000016600000004485952580000000a323031352d30382d3039ffffffff44000000a8000d000000044858584e0000000331373300000005302e3737320000001a313937302d30312d30312030303a30303a30302e343830303030ffffffff00000005313535303400000007313434303033340000001a323031352d30372d30352032323a31323a35352e363633313439000000033131380000000174000000045045484e0000000a323031352d30362d313500000010870211f5bb0cc5754c7697120eed2c174400000082000d000000045358514500000002383600000005302e3335360000001a313937302d30312d30312030303a30303a30302e34393030303000000005302e343238000000062d31303232310000000732353634363235ffffffff0000000238390000000166000000045045484e0000000a323031352d31302d3038ffffffff\n" +
"<430000000f53454c45435420302030005a0000000549\n" +
"<5400000128000d730000000000000000000413000000000000000069000000000000000000001700000000000000006400000000000000000002bd00000000000000007400000000000000000004a000000000000000006600000000000000000002bc00000000000000005f73686f7274000000000000000000001500000000000000006c0000000000000000000014000000000000000074733200000000000000000004a000000000000000006262000000000000000000001500000000000000006200000000000000000000100000000000000000726e645f73796d626f6c00000000000000000004130000000000000000726e645f64617465000000000000000000043a0000000000000000726e645f62696e00000000000000000000110000000000000001\n";
">5800000004\n";
assertHexScript(script);
}
......@@ -923,7 +1167,12 @@ public class WireParserTest extends AbstractGriffinTest {
}
private void assertHexScript(String script) throws Exception {
assertHexScript(NetworkFacadeImpl.INSTANCE, NetworkFacadeImpl.INSTANCE, script, new DefaultWireParserConfiguration());
assertHexScript(NetworkFacadeImpl.INSTANCE, NetworkFacadeImpl.INSTANCE, script, new DefaultWireParserConfiguration() {
@Override
public boolean getDumpNetworkTraffic() {
return true;
}
});
}
private void assertHexScript(
......@@ -953,6 +1202,7 @@ public class WireParserTest extends AbstractGriffinTest {
try {
long sendPtr = sendBuf;
boolean expectDisconnect = false;
int mode = 0;
int n = script.length();
......@@ -967,7 +1217,7 @@ public class WireParserTest extends AbstractGriffinTest {
// we were sending - lets wrap up and send
if (len > 0) {
int m = clientNf.send(clientFd, sendBuf, len);
Assert.assertEquals(len, m);
Assert.assertEquals("disc:" + expectDisconnect, len, m);
sendPtr = sendBuf;
}
} else {
......@@ -975,15 +1225,21 @@ public class WireParserTest extends AbstractGriffinTest {
// and this buffer will also drive the length of the message
if (len > 0) {
int m = clientNf.recv(clientFd, recvBuf, len);
Assert.assertEquals(len, m);
for (int j = 0; j < len; j++) {
Assert.assertEquals(
Unsafe.getUnsafe().getByte(sendBuf + j),
Unsafe.getUnsafe().getByte(recvBuf + j)
);
if (expectDisconnect) {
Assert.assertTrue(m < 0);
// force exit
i = n;
} else {
Assert.assertEquals(len, m);
for (int j = 0; j < len; j++) {
Assert.assertEquals(
Unsafe.getUnsafe().getByte(sendBuf + j),
Unsafe.getUnsafe().getByte(recvBuf + j)
);
}
// clear sendBuf
sendPtr = sendBuf;
}
// clear sendBuf
sendPtr = sendBuf;
}
}
......@@ -999,20 +1255,54 @@ public class WireParserTest extends AbstractGriffinTest {
continue;
default:
char c2 = script.charAt(i + 1);
byte b = (byte) ((Numbers.hexToDecimal(c1) << 4) | Numbers.hexToDecimal(c2));
Unsafe.getUnsafe().putByte(sendPtr++, b);
if (c1 == '!' && c2 == '!') {
expectDisconnect = true;
} else {
try {
byte b = (byte) ((Numbers.hexToDecimal(c1) << 4) | Numbers.hexToDecimal(c2));
Unsafe.getUnsafe().putByte(sendPtr++, b);
} catch (NumericException e) {
e.printStackTrace();
}
}
i += 2;
break;
}
}
// this we do final receive (or send) when we don't have
// any more script left to process
int len = (int) (sendPtr - sendBuf);
if (mode == 0) {
// we were sending - lets wrap up and send
if (len > 0) {
int m = clientNf.send(clientFd, sendBuf, len);
Assert.assertEquals(len, m);
}
} else {
// we meant to receive; sendBuf will contain expected bytes we have to receive
// and this buffer will also drive the length of the message
if (len > 0 || expectDisconnect) {
int m = clientNf.recv(clientFd, recvBuf, len);
if (expectDisconnect) {
Assert.assertTrue(m < 0);
} else {
Assert.assertEquals(len, m);
for (int j = 0; j < len; j++) {
Assert.assertEquals(
Unsafe.getUnsafe().getByte(sendBuf + j),
Unsafe.getUnsafe().getByte(recvBuf + j)
);
}
}
}
}
} finally {
Unsafe.free(sendBuf, N);
Unsafe.free(recvBuf, N);
clientNf.freeSockAddr(sockAddress);
clientNf.close(clientFd);
}
} catch (Throwable e) {
e.printStackTrace();
} finally {
running.set(false);
haltLatch.await();
......@@ -1216,6 +1506,24 @@ public class WireParserTest extends AbstractGriffinTest {
TestUtils.assertEquals(expected, sink);
}
@NotNull
private NetworkFacade getFragmentedSendFacade() {
return new NetworkFacadeImpl() {
@Override
public int send(long fd, long buffer, int bufferLen) {
int total = 0;
for (int i = 0; i < bufferLen; i++) {
int n = super.send(fd, buffer + i, 1);
if (n < 0) {
return n;
}
total += n;
}
return total;
}
};
}
private void startBasicServer(
NetworkFacade nf,
WireParserConfiguration configuration,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册