From 98c6df4546b9a2cf2993b0170f8789fd444c0e15 Mon Sep 17 00:00:00 2001 From: iMoHax Date: Thu, 28 Aug 2014 17:21:37 +0400 Subject: [PATCH] add update from EMDN button --- client/src/main/java/ru/trader/Main.java | 1 + client/src/main/java/ru/trader/World.java | 11 ++ .../controllers/VendorEditorController.java | 18 +++ .../main/java/ru/trader/model/ItemModel.java | 2 + client/src/main/resources/view/vEditor.fxml | 1 + utils/src/main/java/ru/trader/emdn/EMDN.java | 99 ++++++++++--- .../main/java/ru/trader/emdn/ItemData.java | 69 +++++++++ .../src/main/java/ru/trader/emdn/Market.java | 19 +++ .../src/main/java/ru/trader/emdn/Station.java | 37 +++++ .../test/java/ru/trader/emdn/EMDNEmul.java | 136 ++++++++++++++++++ .../test/java/ru/trader/emdn/EMDNTest.java | 111 ++++---------- utils/src/test/resources/log4j.properties | 1 - 12 files changed, 396 insertions(+), 109 deletions(-) create mode 100644 utils/src/main/java/ru/trader/emdn/ItemData.java create mode 100644 utils/src/main/java/ru/trader/emdn/Market.java create mode 100644 utils/src/main/java/ru/trader/emdn/Station.java create mode 100644 utils/src/test/java/ru/trader/emdn/EMDNEmul.java diff --git a/client/src/main/java/ru/trader/Main.java b/client/src/main/java/ru/trader/Main.java index 7d2db58..a8e1a92 100644 --- a/client/src/main/java/ru/trader/Main.java +++ b/client/src/main/java/ru/trader/Main.java @@ -69,6 +69,7 @@ public class Main extends Application { if (res == Dialog.Actions.YES) World.save(); else if (res == Dialog.Actions.CANCEL) we.consume(); } + World.shutdown(); Screeners.closeAll(); } catch (FileNotFoundException | UnsupportedEncodingException | XMLStreamException e) { LOG.error("Ошибка при сохранении",e); diff --git a/client/src/main/java/ru/trader/World.java b/client/src/main/java/ru/trader/World.java index 74c05f1..f5d56a2 100644 --- a/client/src/main/java/ru/trader/World.java +++ b/client/src/main/java/ru/trader/World.java @@ -3,6 +3,8 @@ package ru.trader; import org.xml.sax.SAXException; import ru.trader.core.Market; import ru.trader.core.SimpleMarket; +import ru.trader.emdn.EMDN; +import ru.trader.emdn.Station; import ru.trader.model.ModelFabrica; import ru.trader.store.Store; import ru.trader.store.XSSFImporter; @@ -17,12 +19,14 @@ import java.io.UnsupportedEncodingException; public class World { private static Market world; private static final String STORE_FILE="world.xml"; + private final static EMDN emdn = new EMDN("tcp://firehose.elite-market-data.net:9050", true); static { try { File file = new File(STORE_FILE); if (file.exists()) world = Store.loadFromFile(file); else world = new SimpleMarket(); + emdn.start(); } catch (ParserConfigurationException | SAXException | IOException e) { throw new RuntimeException(e); } @@ -44,4 +48,11 @@ public class World { return world; } + public static Station getEMDN(String name){ + return emdn.getVendor(name); + } + + public static void shutdown(){ + emdn.shutdown(); + } } diff --git a/client/src/main/java/ru/trader/controllers/VendorEditorController.java b/client/src/main/java/ru/trader/controllers/VendorEditorController.java index 1a69727..9cb1968 100644 --- a/client/src/main/java/ru/trader/controllers/VendorEditorController.java +++ b/client/src/main/java/ru/trader/controllers/VendorEditorController.java @@ -15,7 +15,10 @@ import org.controlsfx.control.action.Action; import org.controlsfx.dialog.Dialog; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import ru.trader.World; import ru.trader.core.OFFER_TYPE; +import ru.trader.emdn.ItemData; +import ru.trader.emdn.Station; import ru.trader.model.*; import ru.trader.model.support.BindingsHelper; import ru.trader.view.support.Localization; @@ -221,6 +224,21 @@ public class VendorEditorController { } } + public void updateFromEMDN(){ + Station emdnData = World.getEMDN(vendor.getName()); + LOG.debug("Update from EMDN"); + if (emdnData == null) return; + for (FakeOffer offer : items.getItems()) { + ItemData data = emdnData.getData(offer.item.getId()); + LOG.debug("Update item {} to {}", offer.item.getName(), data); + if (data != null){ + offer.setBprice(data.getBuy()); + offer.setSprice(data.getSell()); + } + } + } + + public class FakeOffer { private final ItemModel item; private DoubleProperty sprice; diff --git a/client/src/main/java/ru/trader/model/ItemModel.java b/client/src/main/java/ru/trader/model/ItemModel.java index 8bbe17d..a2fcad2 100644 --- a/client/src/main/java/ru/trader/model/ItemModel.java +++ b/client/src/main/java/ru/trader/model/ItemModel.java @@ -20,6 +20,8 @@ public class ItemModel{ public String getName() {return name != null ? name.get() : item.getName();} + public String getId() {return item.getName();} + public void setName(String value) { LOG.info("Change name of item {} to {}", item, name); market.updateName(this, value); diff --git a/client/src/main/resources/view/vEditor.fxml b/client/src/main/resources/view/vEditor.fxml index 822ed0a..76897bf 100644 --- a/client/src/main/resources/view/vEditor.fxml +++ b/client/src/main/resources/view/vEditor.fxml @@ -26,6 +26,7 @@ + diff --git a/utils/src/main/java/ru/trader/emdn/EMDN.java b/utils/src/main/java/ru/trader/emdn/EMDN.java index 08a4579..67163ea 100644 --- a/utils/src/main/java/ru/trader/emdn/EMDN.java +++ b/utils/src/main/java/ru/trader/emdn/EMDN.java @@ -6,6 +6,9 @@ import org.zeromq.ZMQ; import org.zeromq.ZMQException; import java.io.UnsupportedEncodingException; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; import java.util.zip.DataFormatException; import java.util.zip.Inflater; @@ -13,35 +16,80 @@ public class EMDN { private final static Logger LOG = LoggerFactory.getLogger(EMDN.class); private final String subServer; + private final Market cache = new Market(); + private ZMQ.Context context = null; + private ZMQ.Socket subscriber = null; + private ScheduledExecutorService executor; + private boolean clear; - public EMDN(String subServer) { + public EMDN(String subServer, boolean clearOnShutdown) { this.subServer = subServer; + clear = clearOnShutdown; + } + + private void init(){ + context = ZMQ.context(1); + subscriber = context.socket(ZMQ.SUB); + } + + public void start(){ + if (subscriber!=null) shutdown(); + init(); + LOG.info("Connect to server {}", subServer); + subscriber.connect(subServer); + LOG.trace("Subscribe"); + subscriber.subscribe(new byte[0]); + executor = Executors.newSingleThreadScheduledExecutor(); + executor.scheduleWithFixedDelay(() -> { + try { + byte[] receivedData = subscriber.recv(0); + LOG.trace("Received data: {}", receivedData); + if (receivedData == null) return; + //receivedData = decompress(receivedData); + String market_csv = new String(receivedData, "UTF-8"); + parseCSV(market_csv); + } catch (ZMQException | UnsupportedEncodingException ex) { + if (!executor.isShutdown()) + LOG.error("Error on get data from EMDN", ex); + } + }, 0, 1, TimeUnit.MILLISECONDS); + } + + public void shutdown() { + if (subscriber!=null){ + LOG.info("Shutdown EMDN client"); + executor.shutdown(); + subscriber.close(); + context.term(); + } + subscriber = null; + context = null; + if (clear) + cache.clear(); } - public void getData(){ - ZMQ.Context context = ZMQ.context(1); - try (ZMQ.Socket socket = context.socket(ZMQ.SUB)) { - socket.setReceiveTimeOut(10000); - LOG.debug("Connect to server {}", subServer); - socket.connect(subServer); - - LOG.trace("Subscribe"); - socket.subscribe(new byte[0]); - for (int i = 0; i < 5; i++) { - try { - byte[] receivedData = socket.recv(0); - LOG.trace("Recived data: {}", receivedData); - if (receivedData == null) continue; - //receivedData = decompress(receivedData); - String market_json = new String(receivedData, "UTF-8"); - LOG.trace("JSON: {}", market_json); - } catch (ZMQException | UnsupportedEncodingException ex) { - LOG.error("Error on get data from EMDN", ex); - } - } + private void parseCSV(String csv) { + LOG.debug("Parse csv: {}", csv); + if (csv.isEmpty()) return; + String[] flds = csv.split(","); + // buyPrice,sellPrice,demand,demandLevel,stationStock,stationStockLevel,categoryName,itemName,stationName,timestamp + ItemData item = new ItemData(flds[7]); + item.setBuy(Double.valueOf(flds[0]), Long.valueOf(flds[4])); + item.setSell(Double.valueOf(flds[1]), Long.valueOf(flds[2])); + LOG.trace("Item: {}", item); + String stName = flds[8].split("\\(")[0].trim(); + LOG.trace("Station: {}", stName); + Station station = cache.getVendor(stName); + if (station != null){ + LOG.trace("Is old, update"); + station.update(item); + } else { + LOG.trace("Is new, create"); + station = new Station(stName); + station.update(item); + cache.addVendor(station); } - context.term(); } private byte[] decompress(byte[] input){ @@ -61,4 +109,9 @@ public class EMDN { System.arraycopy(decompressed, 0, res, 0, decompressedLength); return res; } + + public Station getVendor(String name){ + return cache.getVendor(name); + } + } diff --git a/utils/src/main/java/ru/trader/emdn/ItemData.java b/utils/src/main/java/ru/trader/emdn/ItemData.java new file mode 100644 index 0000000..7508a73 --- /dev/null +++ b/utils/src/main/java/ru/trader/emdn/ItemData.java @@ -0,0 +1,69 @@ +package ru.trader.emdn; + +public class ItemData { + private final String name; + private double buy; + private double sell; + private long demand; + private long stock; + + + public ItemData(String name) { + this.name = name; + } + + public void setSell(double price, long count){ + sell = price; + demand = count; + } + + public void setBuy(double price, long count){ + buy = price; + stock = count; + } + + public double getBuy() { + return buy; + } + + public double getSell() { + return sell; + } + + public long getDemand() { + return demand; + } + + public long getStock() { + return stock; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ItemData)) return false; + ItemData itemData = (ItemData) o; + return !(name != null ? !name.equals(itemData.name) : itemData.name != null); + } + + @Override + public int hashCode() { + return name != null ? name.hashCode() : 0; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("{"); + sb.append(name); + sb.append(" buy=").append(buy); + sb.append(" (").append(stock).append(")"); + sb.append(" sell=").append(sell); + sb.append(" (").append(demand).append(")"); + sb.append('}'); + return sb.toString(); + } +} diff --git a/utils/src/main/java/ru/trader/emdn/Market.java b/utils/src/main/java/ru/trader/emdn/Market.java new file mode 100644 index 0000000..71cf9d9 --- /dev/null +++ b/utils/src/main/java/ru/trader/emdn/Market.java @@ -0,0 +1,19 @@ +package ru.trader.emdn; + +import java.util.concurrent.ConcurrentHashMap; + +public class Market { + private final ConcurrentHashMap vendors = new ConcurrentHashMap<>(40, 0.9f, 1); + + public Station getVendor(String name){ + return vendors.get(name); + } + + public void addVendor(Station vendor){ + vendors.put(vendor.getName(), vendor); + } + + public void clear(){ + vendors.clear(); + } +} diff --git a/utils/src/main/java/ru/trader/emdn/Station.java b/utils/src/main/java/ru/trader/emdn/Station.java new file mode 100644 index 0000000..ab6d369 --- /dev/null +++ b/utils/src/main/java/ru/trader/emdn/Station.java @@ -0,0 +1,37 @@ +package ru.trader.emdn; + +import java.util.concurrent.ConcurrentHashMap; + +public class Station { + private final String name; + private final ConcurrentHashMap items = new ConcurrentHashMap<>(15, 0.9f, 1); + + public Station(String name) { + this.name = name; + } + + public ItemData getData(String name){ + return items.get(name); + } + + void update(ItemData item){ + items.put(item.getName(), item); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Station)) return false; + Station station = (Station) o; + return name.equals(station.name); + } + + @Override + public int hashCode() { + return name.hashCode(); + } + + public String getName() { + return name; + } +} diff --git a/utils/src/test/java/ru/trader/emdn/EMDNEmul.java b/utils/src/test/java/ru/trader/emdn/EMDNEmul.java new file mode 100644 index 0000000..8666847 --- /dev/null +++ b/utils/src/test/java/ru/trader/emdn/EMDNEmul.java @@ -0,0 +1,136 @@ +package ru.trader.emdn; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.zeromq.ZMQ; + +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +public class EMDNEmul { + private final static Logger LOG = LoggerFactory.getLogger(EMDNEmul.class); + + private ZMQ.Context context = null; + private ZMQ.Socket publisher = null; + private ScheduledExecutorService executor; + private final String bindAddress; + + private final static byte[][] messages = new byte[][]{ + {49, 56, 52, 44, 49, 54, 54, 44, 48, 44, 48, 44, 49, 55, 49, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 102, 114, 117, 105, 116, 97, 110, 100, 118, 101, 103, 101, 116, 97, 98, 108, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 55, 55, 49, 48, 48, 48}, + {56, 55, 44, 55, 52, 44, 48, 44, 48, 44, 55, 51, 51, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 103, 114, 97, 105, 110, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 55, 57, 49, 48, 48, 48}, + {49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 97, 110, 105, 109, 97, 108, 109, 101, 97, 116, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 48, 51, 48, 48, 48}, + {48, 44, 54, 52, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 102, 111, 111, 100, 115, 44, 102, 105, 115, 104, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 49, 53, 48, 48, 48}, + {49, 50, 57, 55, 44, 49, 50, 52, 51, 44, 48, 44, 48, 44, 49, 49, 44, 49, 44, 102, 111, 111, 100, 115, 44, 116, 101, 97, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 51, 52, 48, 48, 48}, + {49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 54, 44, 49, 44, 102, 111, 111, 100, 115, 44, 99, 111, 102, 102, 101, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 52, 54, 48, 48, 48}, + {53, 56, 44, 52, 54, 44, 48, 44, 48, 44, 49, 56, 56, 48, 51, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 108, 101, 97, 116, 104, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 53, 55, 48, 48, 48}, + {50, 53, 54, 44, 50, 51, 55, 44, 48, 44, 48, 44, 49, 48, 49, 56, 57, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 110, 97, 116, 117, 114, 97, 108, 102, 97, 98, 114, 105, 99, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 54, 57, 48, 48, 48}, + {48, 44, 53, 54, 44, 54, 55, 48, 56, 51, 44, 49, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 104, 121, 100, 114, 111, 103, 101, 110, 102, 117, 101, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 56, 57, 48, 48, 48}, + {55, 51, 44, 54, 50, 44, 48, 44, 48, 44, 49, 55, 49, 55, 44, 49, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 109, 105, 110, 101, 114, 97, 108, 111, 105, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 48, 48, 48, 48, 48}, + {48, 44, 49, 57, 57, 44, 53, 51, 56, 48, 56, 44, 50, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 112, 101, 115, 116, 105, 99, 105, 100, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 49, 50, 48, 48, 48}, + {48, 44, 57, 52, 55, 44, 49, 52, 51, 51, 44, 49, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 97, 103, 114, 105, 99, 117, 108, 116, 117, 114, 97, 108, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 50, 51, 48, 48, 48}, + {48, 44, 55, 49, 49, 53, 44, 49, 48, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 101, 114, 102, 111, 114, 109, 97, 110, 99, 101, 101, 110, 104, 97, 110, 99, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 51, 52, 48, 48, 48}, + {48, 44, 51, 48, 54, 44, 49, 55, 51, 56, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 98, 97, 115, 105, 99, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 52, 54, 48, 48, 48}, + {48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 116, 111, 98, 97, 99, 99, 111, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 53, 55, 48, 48, 48}, + {48, 44, 49, 52, 51, 44, 49, 56, 56, 48, 52, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 98, 101, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 54, 57, 48, 48, 48}, + {48, 44, 50, 53, 54, 44, 48, 44, 48, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 119, 105, 110, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 56, 49, 48, 48, 48}, + {48, 44, 54, 53, 57, 44, 49, 57, 56, 54, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 108, 105, 113, 117, 111, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 48, 49, 48, 48, 48}, + {48, 44, 50, 51, 49, 56, 44, 49, 54, 52, 55, 50, 44, 50, 44, 48, 44, 48, 44, 109, 97, 99, 104, 105, 110, 101, 114, 121, 44, 99, 114, 111, 112, 104, 97, 114, 118, 101, 115, 116, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 49, 52, 48, 48, 48}, + {48, 44, 50, 56, 57, 44, 49, 50, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 97, 110, 105, 109, 97, 108, 109, 111, 110, 105, 116, 111, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 50, 54, 48, 48, 48}, + {48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 116, 101, 114, 114, 97, 105, 110, 101, 110, 114, 105, 99, 104, 109, 101, 110, 116, 115, 121, 115, 116, 101, 109, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 51, 55, 48, 48, 48}, + {48, 44, 52, 52, 57, 49, 44, 50, 56, 49, 50, 44, 50, 44, 48, 44, 48, 44, 119, 101, 97, 112, 111, 110, 115, 44, 112, 101, 114, 115, 111, 110, 97, 108, 119, 101, 97, 112, 111, 110, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 52, 57, 48, 48, 48}, + {48, 44, 53, 53, 48, 44, 54, 50, 49, 54, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 100, 111, 109, 101, 115, 116, 105, 99, 97, 112, 112, 108, 105, 97, 110, 99, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 54, 48, 48, 48, 48}, + {48, 44, 55, 48, 56, 52, 44, 53, 50, 55, 51, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 111, 110, 115, 117, 109, 101, 114, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 55, 50, 48, 48, 48}, + {48, 44, 50, 53, 50, 44, 48, 44, 49, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 108, 111, 116, 104, 105, 110, 103, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 56, 53, 48, 48, 48}, + {48, 44, 54, 56, 44, 51, 48, 49, 54, 49, 44, 50, 44, 48, 44, 48, 44, 119, 97, 115, 116, 101, 44, 98, 105, 111, 119, 97, 115, 116, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 57, 54, 48, 48, 48}, + {48, 44, 55, 49, 49, 53, 44, 55, 50, 55, 48, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 114, 111, 103, 101, 110, 105, 116, 111, 114, 99, 101, 108, 108, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 49, 48, 56, 48, 48, 48}, + {49, 56, 52, 44, 49, 54, 54, 44, 48, 44, 48, 44, 49, 55, 49, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 102, 114, 117, 105, 116, 97, 110, 100, 118, 101, 103, 101, 116, 97, 98, 108, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 54, 52, 57, 48, 48, 48}, + {56, 55, 44, 55, 52, 44, 48, 44, 48, 44, 55, 51, 51, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 103, 114, 97, 105, 110, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 54, 54, 54, 48, 48, 48}, + {49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 97, 110, 105, 109, 97, 108, 109, 101, 97, 116, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 54, 55, 52, 48, 48, 48}, + {48, 44, 54, 52, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 102, 111, 111, 100, 115, 44, 102, 105, 115, 104, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 54, 56, 48, 48, 48, 48}, + {49, 50, 57, 55, 44, 49, 50, 52, 51, 44, 48, 44, 48, 44, 49, 49, 44, 49, 44, 102, 111, 111, 100, 115, 44, 116, 101, 97, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 54, 57, 54, 48, 48, 48}, + {49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 54, 44, 49, 44, 102, 111, 111, 100, 115, 44, 99, 111, 102, 102, 101, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 48, 51, 48, 48, 48}, + {53, 56, 44, 52, 54, 44, 48, 44, 48, 44, 49, 56, 56, 48, 51, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 108, 101, 97, 116, 104, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 49, 48, 48, 48, 48}, + {50, 53, 54, 44, 50, 51, 55, 44, 48, 44, 48, 44, 49, 48, 49, 56, 57, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 110, 97, 116, 117, 114, 97, 108, 102, 97, 98, 114, 105, 99, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 49, 54, 48, 48, 48}, + {48, 44, 53, 54, 44, 54, 55, 48, 56, 51, 44, 49, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 104, 121, 100, 114, 111, 103, 101, 110, 102, 117, 101, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 51, 49, 48, 48, 48}, + {55, 51, 44, 54, 50, 44, 48, 44, 48, 44, 49, 55, 49, 55, 44, 49, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 109, 105, 110, 101, 114, 97, 108, 111, 105, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 51, 56, 48, 48, 48}, + {48, 44, 49, 57, 57, 44, 53, 51, 56, 48, 56, 44, 50, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 112, 101, 115, 116, 105, 99, 105, 100, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 52, 53, 48, 48, 48}, + {48, 44, 57, 52, 55, 44, 49, 52, 51, 51, 44, 49, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 97, 103, 114, 105, 99, 117, 108, 116, 117, 114, 97, 108, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 53, 49, 48, 48, 48}, + {48, 44, 55, 49, 49, 53, 44, 49, 48, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 101, 114, 102, 111, 114, 109, 97, 110, 99, 101, 101, 110, 104, 97, 110, 99, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 53, 56, 48, 48, 48}, + {48, 44, 51, 48, 54, 44, 49, 55, 51, 56, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 98, 97, 115, 105, 99, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 54, 52, 48, 48, 48}, + {48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 116, 111, 98, 97, 99, 99, 111, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 55, 48, 48, 48, 48}, + {48, 44, 49, 52, 51, 44, 49, 56, 56, 48, 52, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 98, 101, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 55, 54, 48, 48, 48}, + {48, 44, 50, 53, 54, 44, 48, 44, 48, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 119, 105, 110, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 56, 50, 48, 48, 48}, + {48, 44, 54, 53, 57, 44, 49, 57, 56, 54, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 108, 105, 113, 117, 111, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 57, 54, 48, 48, 48}, + {48, 44, 50, 51, 49, 56, 44, 49, 54, 52, 55, 50, 44, 50, 44, 48, 44, 48, 44, 109, 97, 99, 104, 105, 110, 101, 114, 121, 44, 99, 114, 111, 112, 104, 97, 114, 118, 101, 115, 116, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 48, 50, 48, 48, 48}, + {48, 44, 50, 56, 57, 44, 49, 50, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 97, 110, 105, 109, 97, 108, 109, 111, 110, 105, 116, 111, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 48, 57, 48, 48, 48}, + {48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 116, 101, 114, 114, 97, 105, 110, 101, 110, 114, 105, 99, 104, 109, 101, 110, 116, 115, 121, 115, 116, 101, 109, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 49, 54, 48, 48, 48}, + {48, 44, 52, 52, 57, 49, 44, 50, 56, 49, 50, 44, 50, 44, 48, 44, 48, 44, 119, 101, 97, 112, 111, 110, 115, 44, 112, 101, 114, 115, 111, 110, 97, 108, 119, 101, 97, 112, 111, 110, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 50, 51, 48, 48, 48}, + {48, 44, 53, 53, 48, 44, 54, 50, 49, 54, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 100, 111, 109, 101, 115, 116, 105, 99, 97, 112, 112, 108, 105, 97, 110, 99, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 51, 48, 48, 48, 48}, + {48, 44, 55, 48, 56, 52, 44, 53, 50, 55, 51, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 111, 110, 115, 117, 109, 101, 114, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 51, 54, 48, 48, 48}, + {48, 44, 50, 53, 50, 44, 48, 44, 49, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 108, 111, 116, 104, 105, 110, 103, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 52, 50, 48, 48, 48}, + {48, 44, 54, 56, 44, 51, 48, 49, 54, 49, 44, 50, 44, 48, 44, 48, 44, 119, 97, 115, 116, 101, 44, 98, 105, 111, 119, 97, 115, 116, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 52, 56, 48, 48, 48}, + {48, 44, 55, 49, 49, 53, 44, 55, 50, 55, 48, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 114, 111, 103, 101, 110, 105, 116, 111, 114, 99, 101, 108, 108, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 53, 52, 48, 48, 48}, + {49, 56, 52, 44, 49, 54, 54, 44, 48, 44, 48, 44, 49, 55, 49, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 102, 114, 117, 105, 116, 97, 110, 100, 118, 101, 103, 101, 116, 97, 98, 108, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 49, 55, 52, 48, 48, 48}, + {56, 55, 44, 55, 52, 44, 48, 44, 48, 44, 55, 51, 51, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 103, 114, 97, 105, 110, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 49, 57, 52, 48, 48, 48}, + {49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 97, 110, 105, 109, 97, 108, 109, 101, 97, 116, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 48, 54, 48, 48, 48}, + {48, 44, 54, 52, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 102, 111, 111, 100, 115, 44, 102, 105, 115, 104, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 49, 56, 48, 48, 48}, + {49, 50, 57, 55, 44, 49, 50, 52, 51, 44, 48, 44, 48, 44, 49, 49, 44, 49, 44, 102, 111, 111, 100, 115, 44, 116, 101, 97, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 51, 57, 48, 48, 48}, + {49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 54, 44, 49, 44, 102, 111, 111, 100, 115, 44, 99, 111, 102, 102, 101, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 53, 50, 48, 48, 48}, + {53, 56, 44, 52, 54, 44, 48, 44, 48, 44, 49, 56, 56, 48, 51, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 108, 101, 97, 116, 104, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 54, 52, 48, 48, 48}, + {50, 53, 54, 44, 50, 51, 55, 44, 48, 44, 48, 44, 49, 48, 49, 56, 57, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 110, 97, 116, 117, 114, 97, 108, 102, 97, 98, 114, 105, 99, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 55, 54, 48, 48, 48}, + {48, 44, 53, 54, 44, 54, 55, 48, 56, 51, 44, 49, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 104, 121, 100, 114, 111, 103, 101, 110, 102, 117, 101, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 57, 54, 48, 48, 48}, + {55, 51, 44, 54, 50, 44, 48, 44, 48, 44, 49, 55, 49, 55, 44, 49, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 109, 105, 110, 101, 114, 97, 108, 111, 105, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 48, 56, 48, 48, 48}, + {48, 44, 49, 57, 57, 44, 53, 51, 56, 48, 56, 44, 50, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 112, 101, 115, 116, 105, 99, 105, 100, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 50, 48, 48, 48, 48}, + {48, 44, 57, 52, 55, 44, 49, 52, 51, 51, 44, 49, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 97, 103, 114, 105, 99, 117, 108, 116, 117, 114, 97, 108, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 51, 49, 48, 48, 48}, + {48, 44, 55, 49, 49, 53, 44, 49, 48, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 101, 114, 102, 111, 114, 109, 97, 110, 99, 101, 101, 110, 104, 97, 110, 99, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 52, 51, 48, 48, 48}, + {48, 44, 51, 48, 54, 44, 49, 55, 51, 56, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 98, 97, 115, 105, 99, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 53, 52, 48, 48, 48}, + {48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 116, 111, 98, 97, 99, 99, 111, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 54, 54, 48, 48, 48}, + {48, 44, 49, 52, 51, 44, 49, 56, 56, 48, 52, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 98, 101, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 55, 55, 48, 48, 48}, + {48, 44, 50, 53, 54, 44, 48, 44, 48, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 119, 105, 110, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 56, 57, 48, 48, 48}, + {48, 44, 54, 53, 57, 44, 49, 57, 56, 54, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 108, 105, 113, 117, 111, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 49, 49, 48, 48, 48}, + {48, 44, 50, 51, 49, 56, 44, 49, 54, 52, 55, 50, 44, 50, 44, 48, 44, 48, 44, 109, 97, 99, 104, 105, 110, 101, 114, 121, 44, 99, 114, 111, 112, 104, 97, 114, 118, 101, 115, 116, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 50, 53, 48, 48, 48}, + {48, 44, 50, 56, 57, 44, 49, 50, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 97, 110, 105, 109, 97, 108, 109, 111, 110, 105, 116, 111, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 51, 55, 48, 48, 48}, + {48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 116, 101, 114, 114, 97, 105, 110, 101, 110, 114, 105, 99, 104, 109, 101, 110, 116, 115, 121, 115, 116, 101, 109, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 52, 57, 48, 48, 48}, + {48, 44, 52, 52, 57, 49, 44, 50, 56, 49, 50, 44, 50, 44, 48, 44, 48, 44, 119, 101, 97, 112, 111, 110, 115, 44, 112, 101, 114, 115, 111, 110, 97, 108, 119, 101, 97, 112, 111, 110, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 54, 48, 48, 48, 48}, + {48, 44, 53, 53, 48, 44, 54, 50, 49, 54, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 100, 111, 109, 101, 115, 116, 105, 99, 97, 112, 112, 108, 105, 97, 110, 99, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 55, 50, 48, 48, 48}, + {48, 44, 55, 48, 56, 52, 44, 53, 50, 55, 51, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 111, 110, 115, 117, 109, 101, 114, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 56, 50, 48, 48, 48}, + {48, 44, 50, 53, 50, 44, 48, 44, 49, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 108, 111, 116, 104, 105, 110, 103, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 57, 52, 48, 48, 48}, + {48, 44, 54, 56, 44, 51, 48, 49, 54, 49, 44, 50, 44, 48, 44, 48, 44, 119, 97, 115, 116, 101, 44, 98, 105, 111, 119, 97, 115, 116, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 53, 48, 53, 48, 48, 48}, + {48, 44, 55, 49, 49, 53, 44, 55, 50, 55, 48, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 114, 111, 103, 101, 110, 105, 116, 111, 114, 99, 101, 108, 108, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 53, 49, 54, 48, 48, 48} + }; + + public EMDNEmul(String bindAddress) { + this.bindAddress = bindAddress; + } + + public void start(){ + if (publisher != null) shutdown(); + context = ZMQ.context(1); + publisher = context.socket(ZMQ.PUB); + + LOG.debug("Start EMDN emul server, address {}", bindAddress); + publisher.bind(bindAddress); + + executor = Executors.newSingleThreadScheduledExecutor(); + executor.scheduleAtFixedRate(()->{ + for (byte[] message : messages) { + LOG.trace("Publish message: {}", message); + publisher.send(message); + } + LOG.trace("Sleep... "); + }, 1, 5, TimeUnit.SECONDS); + } + + public void shutdown(){ + if (publisher!=null){ + LOG.debug("Shutdown EMDN emul server"); + executor.shutdown(); + publisher.close(); + context.term(); + } + publisher = null; + context = null; + } + +} diff --git a/utils/src/test/java/ru/trader/emdn/EMDNTest.java b/utils/src/test/java/ru/trader/emdn/EMDNTest.java index 9ab03b5..359ad42 100644 --- a/utils/src/test/java/ru/trader/emdn/EMDNTest.java +++ b/utils/src/test/java/ru/trader/emdn/EMDNTest.java @@ -1,98 +1,39 @@ package ru.trader.emdn; +import org.junit.After; import org.junit.Assert; +import org.junit.Before; import org.junit.Test; public class EMDNTest extends Assert { - private final static EMDN markettool = new EMDN("tcp://firehose.elite-market-data.net:9050"); -/* Example dates -[49, 56, 52, 44, 49, 54, 54, 44, 48, 44, 48, 44, 49, 55, 49, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 102, 114, 117, 105, 116, 97, 110, 100, 118, 101, 103, 101, 116, 97, 98, 108, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 55, 55, 49, 48, 48, 48] -[56, 55, 44, 55, 52, 44, 48, 44, 48, 44, 55, 51, 51, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 103, 114, 97, 105, 110, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 55, 57, 49, 48, 48, 48] -[49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 97, 110, 105, 109, 97, 108, 109, 101, 97, 116, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 48, 51, 48, 48, 48] -[48, 44, 54, 52, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 102, 111, 111, 100, 115, 44, 102, 105, 115, 104, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 49, 53, 48, 48, 48] -[49, 50, 57, 55, 44, 49, 50, 52, 51, 44, 48, 44, 48, 44, 49, 49, 44, 49, 44, 102, 111, 111, 100, 115, 44, 116, 101, 97, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 51, 52, 48, 48, 48] -[49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 54, 44, 49, 44, 102, 111, 111, 100, 115, 44, 99, 111, 102, 102, 101, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 52, 54, 48, 48, 48] -[53, 56, 44, 52, 54, 44, 48, 44, 48, 44, 49, 56, 56, 48, 51, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 108, 101, 97, 116, 104, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 53, 55, 48, 48, 48] -[50, 53, 54, 44, 50, 51, 55, 44, 48, 44, 48, 44, 49, 48, 49, 56, 57, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 110, 97, 116, 117, 114, 97, 108, 102, 97, 98, 114, 105, 99, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 54, 57, 48, 48, 48] -[48, 44, 53, 54, 44, 54, 55, 48, 56, 51, 44, 49, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 104, 121, 100, 114, 111, 103, 101, 110, 102, 117, 101, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 56, 57, 48, 48, 48] -[55, 51, 44, 54, 50, 44, 48, 44, 48, 44, 49, 55, 49, 55, 44, 49, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 109, 105, 110, 101, 114, 97, 108, 111, 105, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 48, 48, 48, 48, 48] -[48, 44, 49, 57, 57, 44, 53, 51, 56, 48, 56, 44, 50, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 112, 101, 115, 116, 105, 99, 105, 100, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 49, 50, 48, 48, 48] -[48, 44, 57, 52, 55, 44, 49, 52, 51, 51, 44, 49, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 97, 103, 114, 105, 99, 117, 108, 116, 117, 114, 97, 108, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 50, 51, 48, 48, 48] -[48, 44, 55, 49, 49, 53, 44, 49, 48, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 101, 114, 102, 111, 114, 109, 97, 110, 99, 101, 101, 110, 104, 97, 110, 99, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 51, 52, 48, 48, 48] -[48, 44, 51, 48, 54, 44, 49, 55, 51, 56, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 98, 97, 115, 105, 99, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 52, 54, 48, 48, 48] -[48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 116, 111, 98, 97, 99, 99, 111, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 53, 55, 48, 48, 48] -[48, 44, 49, 52, 51, 44, 49, 56, 56, 48, 52, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 98, 101, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 54, 57, 48, 48, 48] -[48, 44, 50, 53, 54, 44, 48, 44, 48, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 119, 105, 110, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 56, 49, 48, 48, 48] -[48, 44, 54, 53, 57, 44, 49, 57, 56, 54, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 108, 105, 113, 117, 111, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 48, 49, 48, 48, 48] -[48, 44, 50, 51, 49, 56, 44, 49, 54, 52, 55, 50, 44, 50, 44, 48, 44, 48, 44, 109, 97, 99, 104, 105, 110, 101, 114, 121, 44, 99, 114, 111, 112, 104, 97, 114, 118, 101, 115, 116, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 49, 52, 48, 48, 48] -[48, 44, 50, 56, 57, 44, 49, 50, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 97, 110, 105, 109, 97, 108, 109, 111, 110, 105, 116, 111, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 50, 54, 48, 48, 48] -[48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 116, 101, 114, 114, 97, 105, 110, 101, 110, 114, 105, 99, 104, 109, 101, 110, 116, 115, 121, 115, 116, 101, 109, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 51, 55, 48, 48, 48] -[48, 44, 52, 52, 57, 49, 44, 50, 56, 49, 50, 44, 50, 44, 48, 44, 48, 44, 119, 101, 97, 112, 111, 110, 115, 44, 112, 101, 114, 115, 111, 110, 97, 108, 119, 101, 97, 112, 111, 110, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 52, 57, 48, 48, 48] -[48, 44, 53, 53, 48, 44, 54, 50, 49, 54, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 100, 111, 109, 101, 115, 116, 105, 99, 97, 112, 112, 108, 105, 97, 110, 99, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 54, 48, 48, 48, 48] -[48, 44, 55, 48, 56, 52, 44, 53, 50, 55, 51, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 111, 110, 115, 117, 109, 101, 114, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 55, 50, 48, 48, 48] -[48, 44, 50, 53, 50, 44, 48, 44, 49, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 108, 111, 116, 104, 105, 110, 103, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 56, 53, 48, 48, 48] -[48, 44, 54, 56, 44, 51, 48, 49, 54, 49, 44, 50, 44, 48, 44, 48, 44, 119, 97, 115, 116, 101, 44, 98, 105, 111, 119, 97, 115, 116, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 57, 54, 48, 48, 48] -[48, 44, 55, 49, 49, 53, 44, 55, 50, 55, 48, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 114, 111, 103, 101, 110, 105, 116, 111, 114, 99, 101, 108, 108, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 49, 48, 56, 48, 48, 48] -[49, 56, 52, 44, 49, 54, 54, 44, 48, 44, 48, 44, 49, 55, 49, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 102, 114, 117, 105, 116, 97, 110, 100, 118, 101, 103, 101, 116, 97, 98, 108, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 54, 52, 57, 48, 48, 48] -[56, 55, 44, 55, 52, 44, 48, 44, 48, 44, 55, 51, 51, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 103, 114, 97, 105, 110, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 54, 54, 54, 48, 48, 48] -[49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 97, 110, 105, 109, 97, 108, 109, 101, 97, 116, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 54, 55, 52, 48, 48, 48] -[48, 44, 54, 52, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 102, 111, 111, 100, 115, 44, 102, 105, 115, 104, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 54, 56, 48, 48, 48, 48] -[49, 50, 57, 55, 44, 49, 50, 52, 51, 44, 48, 44, 48, 44, 49, 49, 44, 49, 44, 102, 111, 111, 100, 115, 44, 116, 101, 97, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 54, 57, 54, 48, 48, 48] -[49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 54, 44, 49, 44, 102, 111, 111, 100, 115, 44, 99, 111, 102, 102, 101, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 48, 51, 48, 48, 48] -[53, 56, 44, 52, 54, 44, 48, 44, 48, 44, 49, 56, 56, 48, 51, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 108, 101, 97, 116, 104, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 49, 48, 48, 48, 48] -[50, 53, 54, 44, 50, 51, 55, 44, 48, 44, 48, 44, 49, 48, 49, 56, 57, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 110, 97, 116, 117, 114, 97, 108, 102, 97, 98, 114, 105, 99, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 49, 54, 48, 48, 48] -[48, 44, 53, 54, 44, 54, 55, 48, 56, 51, 44, 49, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 104, 121, 100, 114, 111, 103, 101, 110, 102, 117, 101, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 51, 49, 48, 48, 48] -[55, 51, 44, 54, 50, 44, 48, 44, 48, 44, 49, 55, 49, 55, 44, 49, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 109, 105, 110, 101, 114, 97, 108, 111, 105, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 51, 56, 48, 48, 48] -[48, 44, 49, 57, 57, 44, 53, 51, 56, 48, 56, 44, 50, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 112, 101, 115, 116, 105, 99, 105, 100, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 52, 53, 48, 48, 48] -[48, 44, 57, 52, 55, 44, 49, 52, 51, 51, 44, 49, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 97, 103, 114, 105, 99, 117, 108, 116, 117, 114, 97, 108, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 53, 49, 48, 48, 48] -[48, 44, 55, 49, 49, 53, 44, 49, 48, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 101, 114, 102, 111, 114, 109, 97, 110, 99, 101, 101, 110, 104, 97, 110, 99, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 53, 56, 48, 48, 48] -[48, 44, 51, 48, 54, 44, 49, 55, 51, 56, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 98, 97, 115, 105, 99, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 54, 52, 48, 48, 48] -[48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 116, 111, 98, 97, 99, 99, 111, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 55, 48, 48, 48, 48] -[48, 44, 49, 52, 51, 44, 49, 56, 56, 48, 52, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 98, 101, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 55, 54, 48, 48, 48] -[48, 44, 50, 53, 54, 44, 48, 44, 48, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 119, 105, 110, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 56, 50, 48, 48, 48] -[48, 44, 54, 53, 57, 44, 49, 57, 56, 54, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 108, 105, 113, 117, 111, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 57, 54, 48, 48, 48] -[48, 44, 50, 51, 49, 56, 44, 49, 54, 52, 55, 50, 44, 50, 44, 48, 44, 48, 44, 109, 97, 99, 104, 105, 110, 101, 114, 121, 44, 99, 114, 111, 112, 104, 97, 114, 118, 101, 115, 116, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 48, 50, 48, 48, 48] -[48, 44, 50, 56, 57, 44, 49, 50, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 97, 110, 105, 109, 97, 108, 109, 111, 110, 105, 116, 111, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 48, 57, 48, 48, 48] -[48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 116, 101, 114, 114, 97, 105, 110, 101, 110, 114, 105, 99, 104, 109, 101, 110, 116, 115, 121, 115, 116, 101, 109, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 49, 54, 48, 48, 48] -[48, 44, 52, 52, 57, 49, 44, 50, 56, 49, 50, 44, 50, 44, 48, 44, 48, 44, 119, 101, 97, 112, 111, 110, 115, 44, 112, 101, 114, 115, 111, 110, 97, 108, 119, 101, 97, 112, 111, 110, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 50, 51, 48, 48, 48] -[48, 44, 53, 53, 48, 44, 54, 50, 49, 54, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 100, 111, 109, 101, 115, 116, 105, 99, 97, 112, 112, 108, 105, 97, 110, 99, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 51, 48, 48, 48, 48] -[48, 44, 55, 48, 56, 52, 44, 53, 50, 55, 51, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 111, 110, 115, 117, 109, 101, 114, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 51, 54, 48, 48, 48] -[48, 44, 50, 53, 50, 44, 48, 44, 49, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 108, 111, 116, 104, 105, 110, 103, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 52, 50, 48, 48, 48] -[48, 44, 54, 56, 44, 51, 48, 49, 54, 49, 44, 50, 44, 48, 44, 48, 44, 119, 97, 115, 116, 101, 44, 98, 105, 111, 119, 97, 115, 116, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 52, 56, 48, 48, 48] -[48, 44, 55, 49, 49, 53, 44, 55, 50, 55, 48, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 114, 111, 103, 101, 110, 105, 116, 111, 114, 99, 101, 108, 108, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 53, 52, 48, 48, 48] -[49, 56, 52, 44, 49, 54, 54, 44, 48, 44, 48, 44, 49, 55, 49, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 102, 114, 117, 105, 116, 97, 110, 100, 118, 101, 103, 101, 116, 97, 98, 108, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 49, 55, 52, 48, 48, 48] -[56, 55, 44, 55, 52, 44, 48, 44, 48, 44, 55, 51, 51, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 103, 114, 97, 105, 110, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 49, 57, 52, 48, 48, 48] -[49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 97, 110, 105, 109, 97, 108, 109, 101, 97, 116, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 48, 54, 48, 48, 48] -[48, 44, 54, 52, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 102, 111, 111, 100, 115, 44, 102, 105, 115, 104, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 49, 56, 48, 48, 48] -[49, 50, 57, 55, 44, 49, 50, 52, 51, 44, 48, 44, 48, 44, 49, 49, 44, 49, 44, 102, 111, 111, 100, 115, 44, 116, 101, 97, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 51, 57, 48, 48, 48] -[49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 54, 44, 49, 44, 102, 111, 111, 100, 115, 44, 99, 111, 102, 102, 101, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 53, 50, 48, 48, 48] -[53, 56, 44, 52, 54, 44, 48, 44, 48, 44, 49, 56, 56, 48, 51, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 108, 101, 97, 116, 104, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 54, 52, 48, 48, 48] -[50, 53, 54, 44, 50, 51, 55, 44, 48, 44, 48, 44, 49, 48, 49, 56, 57, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 110, 97, 116, 117, 114, 97, 108, 102, 97, 98, 114, 105, 99, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 55, 54, 48, 48, 48] -[48, 44, 53, 54, 44, 54, 55, 48, 56, 51, 44, 49, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 104, 121, 100, 114, 111, 103, 101, 110, 102, 117, 101, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 57, 54, 48, 48, 48] -[55, 51, 44, 54, 50, 44, 48, 44, 48, 44, 49, 55, 49, 55, 44, 49, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 109, 105, 110, 101, 114, 97, 108, 111, 105, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 48, 56, 48, 48, 48] -[48, 44, 49, 57, 57, 44, 53, 51, 56, 48, 56, 44, 50, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 112, 101, 115, 116, 105, 99, 105, 100, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 50, 48, 48, 48, 48] -[48, 44, 57, 52, 55, 44, 49, 52, 51, 51, 44, 49, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 97, 103, 114, 105, 99, 117, 108, 116, 117, 114, 97, 108, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 51, 49, 48, 48, 48] -[48, 44, 55, 49, 49, 53, 44, 49, 48, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 101, 114, 102, 111, 114, 109, 97, 110, 99, 101, 101, 110, 104, 97, 110, 99, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 52, 51, 48, 48, 48] -[48, 44, 51, 48, 54, 44, 49, 55, 51, 56, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 98, 97, 115, 105, 99, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 53, 52, 48, 48, 48] -[48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 116, 111, 98, 97, 99, 99, 111, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 54, 54, 48, 48, 48] -[48, 44, 49, 52, 51, 44, 49, 56, 56, 48, 52, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 98, 101, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 55, 55, 48, 48, 48] -[48, 44, 50, 53, 54, 44, 48, 44, 48, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 119, 105, 110, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 56, 57, 48, 48, 48] -[48, 44, 54, 53, 57, 44, 49, 57, 56, 54, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 108, 105, 113, 117, 111, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 49, 49, 48, 48, 48] -[48, 44, 50, 51, 49, 56, 44, 49, 54, 52, 55, 50, 44, 50, 44, 48, 44, 48, 44, 109, 97, 99, 104, 105, 110, 101, 114, 121, 44, 99, 114, 111, 112, 104, 97, 114, 118, 101, 115, 116, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 50, 53, 48, 48, 48] -[48, 44, 50, 56, 57, 44, 49, 50, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 97, 110, 105, 109, 97, 108, 109, 111, 110, 105, 116, 111, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 51, 55, 48, 48, 48] -[48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 116, 101, 114, 114, 97, 105, 110, 101, 110, 114, 105, 99, 104, 109, 101, 110, 116, 115, 121, 115, 116, 101, 109, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 52, 57, 48, 48, 48] -[48, 44, 52, 52, 57, 49, 44, 50, 56, 49, 50, 44, 50, 44, 48, 44, 48, 44, 119, 101, 97, 112, 111, 110, 115, 44, 112, 101, 114, 115, 111, 110, 97, 108, 119, 101, 97, 112, 111, 110, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 54, 48, 48, 48, 48] -[48, 44, 53, 53, 48, 44, 54, 50, 49, 54, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 100, 111, 109, 101, 115, 116, 105, 99, 97, 112, 112, 108, 105, 97, 110, 99, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 55, 50, 48, 48, 48] -[48, 44, 55, 48, 56, 52, 44, 53, 50, 55, 51, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 111, 110, 115, 117, 109, 101, 114, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 56, 50, 48, 48, 48] -[48, 44, 50, 53, 50, 44, 48, 44, 49, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 108, 111, 116, 104, 105, 110, 103, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 57, 52, 48, 48, 48] -[48, 44, 54, 56, 44, 51, 48, 49, 54, 49, 44, 50, 44, 48, 44, 48, 44, 119, 97, 115, 116, 101, 44, 98, 105, 111, 119, 97, 115, 116, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 53, 48, 53, 48, 48, 48] -[48, 44, 55, 49, 49, 53, 44, 55, 50, 55, 48, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 114, 111, 103, 101, 110, 105, 116, 111, 114, 99, 101, 108, 108, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 53, 49, 54, 48, 48, 48] + private final static EMDN markettool = new EMDN("tcp://localhost:9050", true); + + private final static EMDNEmul server = new EMDNEmul("tcp://localhost:9050"); + @Before + public void setUp() throws Exception { + server.start(); + markettool.start(); + } - */ @Test public void testGetData() throws Exception { - markettool.getData(); + // wait submit + Thread.sleep(4000); + Station station = markettool.getVendor("Eranin"); + assertNotNull(station); + ItemData itemData = station.getData("cropharvesters"); + assertNotNull(itemData); + assertEquals(0,itemData.getBuy(), 0.0001); + assertEquals(0,itemData.getStock()); + assertEquals(2318,itemData.getSell(), 0.0001); + assertEquals(16472,itemData.getDemand()); + } + + @After + public void tearDown() throws Exception { + markettool.shutdown(); + server.shutdown(); } } diff --git a/utils/src/test/resources/log4j.properties b/utils/src/test/resources/log4j.properties index 6e9f687..1d4c1a4 100644 --- a/utils/src/test/resources/log4j.properties +++ b/utils/src/test/resources/log4j.properties @@ -6,4 +6,3 @@ log4j.appender.stdout.layout.ConversionPattern=%p: %d{dd.MM.yyyy HH:mm:ss} (%F:% log4j.logger.ru.trader.emdn.EMDN = TRACE -log4j.logger.org.zeromq = TRACE \ No newline at end of file