netemul-1.0/0000755000175000017500000000000011305026152012072 5ustar frostfrostnetemul-1.0/ipedit/0000755000175000017500000000000011305026151013347 5ustar frostfrostnetemul-1.0/ipedit/ipeditdesignerplugin.h0000644000175000017500000000153011265657773017766 0ustar frostfrost#ifndef IPEDITDESIGNERPLUGIN_H #define IPEDITDESIGNERPLUGIN_H #include class ipEditDesignerPlugin : public QObject, public QDesignerCustomWidgetInterface { Q_OBJECT Q_INTERFACES(QDesignerCustomWidgetInterface) public: ipEditDesignerPlugin(QObject *parent = 0); bool isContainer() const { return false; } bool isInitialized() const { return false; } QIcon icon() const { return QIcon(); } QString domXml() const; QString group() const { return "Input Widgets"; } QString includeFile() const { return "ipedit.h"; } QString name() const { return "ipEdit" ; } QString toolTip() const { return tr("The field for ip-address"); } QString whatsThis() const { return tr("The field for ip-address"); } QWidget* createWidget(QWidget *parent); }; #endif // IPEDITDESIGNERPLUGIN_H netemul-1.0/ipedit/ipedit.pro0000644000175000017500000000123211265657773015376 0ustar frostfrost#------------------------------------------------- # # Project created by QtCreator 2009-10-15T19:50:16 # #------------------------------------------------- CONFIG += designer plugin TARGET = $$qtLibraryTarget($$TARGET) TEMPLATE = lib QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/designer INCLUDEPATH += "../src" HEADERS = ../src/ipedit.h \ ipeditdesignerplugin.h SOURCES = ../src/ipedit.cpp \ ipeditdesignerplugin.cpp # install target.path = $$[QT_INSTALL_PLUGINS]/designer sources.files = $$SOURCES $$HEADERS *.pro sources.path = $$[QT_INSTALL_EXAMPLES]/designer/customwidgetplugin INSTALLS += target sources netemul-1.0/ipedit/ipeditdesignerplugin.cpp0000644000175000017500000000203311265702206020276 0ustar frostfrost#include "ipeditdesignerplugin.h" #include "ipedit.h" #include ipEditDesignerPlugin::ipEditDesignerPlugin(QObject *parent) : QObject(parent) { } QString ipEditDesignerPlugin::domXml() const { return "\n" " \n" " \n" " \n" " 0\n" " 0\n" " 380\n" " 35\n" " \n" " \n" " \n" " Ip address\n" " \n" " \n" " The field for ip-address.\n" " \n" " \n" "\n"; } QWidget* ipEditDesignerPlugin::createWidget(QWidget *parent) { return new ipEdit(parent,tr("Enter text: ")); } Q_EXPORT_PLUGIN2(ipeditdesignerplugin , ipEditDesignerPlugin ) netemul-1.0/netemul.pro0000644000175000017500000000670211303650571014300 0ustar frostfrostinclude(src/chips/chips.pri) include(src/programms/programms.pri) include(src/controls/controls.pri) include(src/devices/devices.pri) include(src/models/models.pri) include(src/dialogs/dialogs.pri) include(src/other/other.pri) include(src/graphics/graphics.pri) include(src/forms/forms.pri) include(src/tools/tools.pri) include(src/packets/packets.pri) include(src/states/states.pri) include(src/commands/commands.pri) include(src/delegats/delegats.pri) include(src/interfaces/interfaces.pri) TEMPLATE = app TARGET = netemul DEPENDPATH += . \ src \ ui \ src/chips INCLUDEPATH += . \ src \ src/chips \ src/controls \ src/programms \ src/devices \ src/models \ src/dialogs \ src/other \ src/graphics \ src/tools \ src/packets \ src/states \ src/commands \ src/delegats \ src/interfaces QT += script QMAKE_POST_LINK += cd ipedit && qmake && make && cd .. # Default translations path TRANSLATIONS_PATH = "translation" DOC_PATH = "doc" SCRIPT_PATH = "scripts" win32 { DESTDIR = ../trunk message("Static link ...") DEFINES += QT_NO_DEBUG_OUTPUT CONFIG += static } macx:message("You have MACX...") CONFIG += warn_on contains(QT_CONFIG, opengl) { message("OpenGL connected ...") QT += opengl } debug:contains(QT_CONFIG, scripttools) { message("Debugger connected ...") QT += scripttools } OBJECTS_DIR = build MOC_DIR = build UI_DIR = src # Input HEADERS += src/deviceport.h \ src/frame.h \ src/ipaddress.h \ src/ipedit.h \ src/macaddress.h \ src/mainwindow.h \ src/mycanvas.h SOURCES += src/deviceport.cpp \ src/frame.cpp \ src/ipaddress.cpp \ src/ipedit.cpp \ src/macaddress.cpp \ src/main.cpp \ src/mainwindow.cpp \ src/mycanvas.cpp RESOURCES += netemul.qrc TRANSLATIONS += translation/netemul_ru.ts \ translation/netemul_pt_BR.ts \ translation/netemul_es.ts unix { CONFIG += debug # Prefix: base instalation directory isEmpty( PREFIX ):PREFIX = /usr/local DEB_BUILD = $$system(echo \$DEB_BUILD_OPTIONS) contains(DEB_BUILD, nostrip):QMAKE_STRIP = : DEFINES += PREFIX=\\\"$${PREFIX}\\\" target.path = $${PREFIX}/bin INSTALLS = target # Default path for translations in *nix TRANSLATIONS_PATH = $${PREFIX}/share/netemul/translation/ # Translations translations.path = $${TRANSLATIONS_PATH} translations.files = ../translation/netemul_es.qm \ ../translation/netemul_pt_BR.qm \ ../translation/netemul_ru.qm \ ../translation/qt_es.qm \ ../translation/qt_pt.qm \ ../translation/qt_ru.qm INSTALLS += translations # Icons icons.path = $${PREFIX}/share/netemul/pixmap/ icons.files = ../images/NetEmul.png icons.files = ../images/NetEmul_32x32.png INSTALLS += icons # Desktop desktop.path = /usr/share/applications/ desktop.files = ./netemul.desktop INSTALLS += desktop # Docs$${PREFIX}/share/netemul/ docs.path = $${PREFIX}/share/netemul/ docs.files = ../doc INSTALLS += docs DOC_PATH = $${PREFIX}/share/netemul/doc/ # Scripts scripts.path = $${PREFIX}/share/netemul/ scripts.files = ../scripts INSTALLS += scripts SCRIPT_PATH = $${PREFIX}/share/netemul/scripts/ } # Let the variable be available for compiling DEFINES += DOC_PATH=\\\"$${DOC_PATH}\\\" DEFINES += SCRIPT_PATH=\\\"$${SCRIPT_PATH}\\\" DEFINES += TRANSLATIONS_PATH=\\\"$${TRANSLATIONS_PATH}\\\" netemul-1.0/scripts/0000755000175000017500000000000011305026150013557 5ustar frostfrostnetemul-1.0/scripts/dhcp.js0000644000175000017500000000164211261112237015041 0ustar frostfrostif (open) closeScene(); newScene(); var net1 = new Array(); var net2 = new Array(); var r1 = addRouter(7,1); r1.setSocketsCount(4); var r2 = addRouter(7,5); r2.setSocketsCount(4); var s1 = addSwitch(5,2); s1.setSocketsCount(8); var s2 = addSwitch(9,2); s2.setSocketsCount(8); addConnection(s1,r1,"LAN7","LAN1"); addConnection(s1,r2,"LAN8","LAN1"); addConnection(s2,r1,"LAN7","LAN2"); addConnection(s2,r2,"LAN8","LAN2"); for ( i = 0 ; i < 3; i++ ) { net1[i] = addComputer(3,i+1); addConnection( net1[i] , s1 , "eth0" , "LAN"+(i+1) ); net2[i] = addComputer(11,i+1); addConnection( net2[i] , s2 , "eth0" , "LAN"+(i+1) ); } r1.setIp("LAN1","192.168.1.125"); r1.setIp("LAN2","192.168.1.253"); r2.setIp("LAN1","192.168.1.126"); r2.setIp("LAN2","192.168.1.254"); r1.setMask("LAN1","255.255.255.128"); r1.setMask("LAN2","255.255.255.128"); r2.setMask("LAN1","255.255.255.128"); r2.setMask("LAN2","255.255.255.128"); true; netemul-1.0/scripts/checknet.js0000644000175000017500000000146211261112237015707 0ustar frostfrostvar result; var comps = computerList(); var sendPacket = 0; var receivePacket = 0; for ( i = 0 ; i < comps.length ; i++ ) { sendPacket += comps[i].receivePacketCount("eth0"); receivePacket += comps[i].sendPacketCount("eth0"); } print(sendPacket + " " + receivePacket); for ( i = 0 ; i < comps.length; i++ ) for ( j = 0 ; j < comps.length; j++ ) if ( i != j ) comps[i].sendMessage( comps[j].ipaddress("eth0") , 5 , 0); emulateTime(); var tempSend = 0; var tempReceive = 0; for ( i = 0 ; i < comps.length ; i++ ) { tempSend += comps[i].receivePacketCount("eth0"); tempReceive += comps[i].sendPacketCount("eth0"); } result = ( tempSend == sendPacket+(comps.length-1) *comps.length * 5 && tempReceive == receivePacket + (comps.length-1) * comps.length * 5 ); result; netemul-1.0/scripts/big.js0000644000175000017500000000411411261112237014661 0ustar frostfrostif ( open ) closeScene(); newScene(); var net = new Array(); var r = new Array(); var s = new Array(); var n = 1; var g = 30; var rg = 157; for ( i = 0 ; i < 2 ; i++ ) { net[i] = new Array(); net[i+2] = new Array(); s[i] = addSwitch(2 , i*3 +1); s[i+2] = addSwitch(10, i*3+1); r[i] = addRouter(4, i*3 + 1); r[i+2] = addRouter(8, i*3+1); s[i].setSocketsCount(8); s[i+2].setSocketsCount(8); r[i].setSocketsCount(8); r[i+2].setSocketsCount(8); addConnection(r[i] , r[i+2] , "LAN3" , "LAN3"); addConnection(s[i] , r[i] , "LAN8" , "LAN8" ); addConnection(s[i+2] , r[i+2] , "LAN8" , "LAN8"); for ( j = 0 ; j < 3 ; j++ ) { net[i][j] = addComputer(0,i*3 + j); net[i+2][j] = addComputer(12,i*3+j); addConnection(net[i][j] , s[i] , "eth0" , "LAN"+(j+1) ); addConnection(net[i+2][j] , s[i+2] , "eth0" , "LAN"+(j+1) ); net[i][j].setIp("eth0" , "192.168.1."+(n+j) ); net[i+2][j].setIp( "eth0" , "192.168.1."+(n+64+j) ); net[i][j].setMask("eth0" , "255.255.255.224"); net[i+2][j].setMask( "eth0" , "255.255.255.224"); net[i][j].setGateway( "192.168.1."+ (g+32*i) ); net[i+2][j].setGateway( "192.168.1."+ (g+64+32*i) ); } r[i].setIp( "LAN3" , "192.168.1."+rg); r[i+2].setIp( "LAN3" , "192.168.1."+(rg+1)); r[i].setMask( "LAN3" , "255.255.255.224"); r[i+2].setMask( "LAN3" , "255.255.255.224"); r[i].setIp( "LAN8" , "192.168.1."+ (g+32*i) ); r[i+2].setIp( "LAN8" , "192.168.1."+ (g+64+32*i) ); r[i].setMask( "LAN8" , "255.255.255.224"); r[i+2].setMask( "LAN8" , "255.255.255.224"); r[i].setMask( "LAN4" , "255.255.255.224"); r[i+2].setMask( "LAN4" , "255.255.255.224"); rg += 32; n += 32; } addConnection( r[0] , r[1] , "LAN4" , "LAN4"); addConnection( r[2] , r[3] , "LAN4" , "LAN4"); r[0].setIp( "LAN4" ,"192.168.1.221"); r[1].setIp( "LAN4" , "192.168.1.222"); r[2].setIp( "LAN4" , "192.168.1.253"); r[3].setIp( "LAN4" , "192.168.1.254"); for ( i = 0 ; i < 4 ; i++ ) r[i].router = true; saveScene("big.net"); closeScene(); openScene("big.net"); true; netemul-1.0/scripts/arp.js0000644000175000017500000003023111273136242014706 0ustar frostfrost/* Сейчас на меленьком примере, рассмотрим создание небольшого скрипта. Здесь будут применены не все команды, но их будет достаточно что бы написать свой скрипт. Подрузамевается что читающий имеет знания ActonScript или более знакомого для всех JavaScript. Если вы не знакомы с этим языком, вы можете ознакомится с ним в интернете. Язык обладает легким С подобным синтаксисом без строгой типизации и довольно легок в изучении. Если здесь вы не найдете нужной вам функции, можете посмотреть в исходниках программы. Все открытые слоты классов deviceImpl и myCanvas можно использовать в скриптах в соответсвующих для этого контекстах. Т.е. слоты myCanvas являются функциями самой сцены с устройствами и их можно применять напрямую. Слоты deviceImpl применяются к конкретным устройствам. Например: // Функция из класса myCanvas: myCanvas::emulateTime(); // Функция выполняется пока сеть нагружена работой и прекращается // как только сеть начинает бездействовать. в скрипте её можно писать просто: emulateTime(); Напротив если мы создаем устройство: var router = addRouter(5,5); router.setIp("LAN10", "192.168.1.2"); // Функция вызывается именно у этого устройства В дальнейшем если сценарии будут развиваться, они будут делать это в сторону объектной парадигмы, а не процедурной. Итак рассмотрим создание небольшой сети и проверки её работоспособности. Для начала проверим, а не открыта ли у нас другая сеть. Свойство open сцены принимает булево значение и показывает открыта сцена или нет. Если открыта мы её безмолвно закрываем( Ну что поделаешь это учебный скрипт и спрашивать сохранения нам сейчас не так важно. */ if ( open ) closeScene(); /* Теперь откроем новый файл. */ newScene(); /* Остановим симуляцию, теперь наша сцена стоит на паузе. */ stop(); /* Для начала создадим массив коммутаторов. Конечно здесь можно было создать два отдельных коммутатора, но что бы показать возможности я создал именно массив. */ var sw = new Array(); /* Функции сцены имеющие форму addX добавляют соответсвующий Х на сцену. в данном случае это switch. Параметрами функция ожидает координаты размещаемого устройства. Координаты соотевтствуют узлам сетки и начинаются с 0. Первая идет абсцисса, второй ордината. Функция setSocketsCount(int) задает количество портов(интерфейсов) у устройства. */ sw[0] = addSwitch(3,3); sw[0].setSocketsCount(8); /* Далее добавляем еще один коммутатор. Сейчас еще мало понятно что значат эти координаты, но стоит один раз попробывать, как уже свободно можно будет представлять как они расположены. */ sw[1] = addSwitch(7,3); sw[1].setSocketsCount(8); /* Добавляем мершрутизатор. Свойство router у маршрутизатора или компьютера указывает включена ли у них маршрутизация. */ var r = addRouter(5,3); r.router = true; r.setSocketsCount(8); /* addConnection( устройство начала , устройство конца , порт начала , порт конца ) - создает кабель соединяющий эти два устройства через указанные порты. */ addConnection(sw[0],r,"LAN8","LAN3"); addConnection(sw[1],r,"LAN8","LAN4"); /* Cейчас создадим новый массив, он будет содержать наши компьютеры. x и g мы будем использовать как вспомогательные переменные. */ var net = new Array(); var x = 1 , g = 126; /* Используем цикл for, мы будем создавать сеть состоящую из двух подсетей. На каждой итерации цикла мы добавляем новый вектор(создаем многомерный массив) Все наши компьютеры будут лежать в двухмерном массиве по 5 компьютеров в двух сетях. *Возможно начинающему трудно будет понять этот ход, но это сначала. */ for ( j = 0 ; j < 2 ; j++ ) { net[j] = new Array(); /* Во вложенном цикле создадим 5 компьютеров. И соединим их с соответсвующим коммутатором. При использовании строк мы можем пользоваться преимуществами ActionScript и использовать конкатенацию строки с числом. */ for ( i = 1 ; i <= 5 ; i++ ) { net[j][i-1] = addComputer(x,i); addConnection( net[j][i-1] , sw[j] , "eth0" , "LAN"+i ); /* Здесь мы приблизились к часто используемым функциям: setIp( имя интерфейса, ip-адрес ) - задает Ip адрес интерфейса. setMask( имя интерфейса, маска ) - задает маску интерфейса. setGateway( шлюз ) - задаает шлюз. Надо учесть что данные функции можно применять(пока) только в соответствующем контексте. Если сейчас попробовать присвоить ip-адрес скажем коммутатру, это приведет к безмолвному краху программы. На каждой итерации обоих циклов мы производим настройку наших компьютеров. Хотя пример является довольно надуманным, все же он показывает как можно сократить свою работу. */ net[j][i-1].setIp("eth0","192.168.1."+( i + j*128) ); net[j][i-1].setMask("eth0", "255.255.255.128"); net[j][i-1].setGateway("192.168.1."+g); } /* По пути производим настройку интерфейсов маршрутизатора. */ r.setMask("LAN"+(j+3) , "255.255.255.128"); r.setIp("LAN"+(j+3) , "192.168.1." + g ); /* И увеличиваем вспомогательные переменные. */ x += 8; g += 128; } /* Отправка данных в скриптах выглядит конечно не так как в gui, но смысл проиходящего понять можно. Функция sendMessage вызывается в контексте устройства, которое посылает данные(!ВНИМАНИЕ попытка отправить данные с коммутатора или того хуже концентратора может привести к непредсказуемым последмтвиям, позже будет более сильный механизм сдерживания) первым параметром указывается адрес интерфейса получателя(если когда нибудь будет dns) тут можно будет писать адрес узла. Далее мы указываем наш пока очень условный размер в килобайтах. И протокол отправки, но пока он только UDP(цифра 0 в параметре). */ net[0][0].sendMessage("192.168.1.133",50,0); /* Функция уже упоминалась во вступлении. Как и было рассказанно ранее, она выполняется пока сеть проявляет хоть какую то активность, даже если у одного из устройств не пуста очередь на отправку пакетов, она будет выполняться(!ОСТОРОЖНО да при неудачной модификации программы может уйти в бесконечный цикл, но зато хорошая проверка корректности). */ emulateTime(); /* Снимем сцену с паузы. */ play(); /* Проверяем результат сравнивая количество переданных пакетов от первого компьютера, первой сети(Напоминаю что отсчет массивов в С подобных языках всегда ведется с 0) и количество полученных пакетов у последнего компьютера второй сети. Результат сохраним в переменной result. Именно её ниже мы вернем из скрипта. Примечание: именно этому компьютеру мы посылали данные, точнее на адрес его интерфейса. */ result = ( net[0][0].sendPacketCount("eth0") == net[1][4].receivePacketCount("eth0") ); /* Добавляем текстовый комментарий на сцену. Параметры которых ждет конструктор комментария, также его координаты, note свойство текстовой записки это текст который она отображает. (возможность подвинуть объекты появится чуть-чуть позже) */ var text = addNote(4,6); text.note = "Our first easy script!"; /* Сохраним созданную нами сцену в файл. Также доступна функция openScene которая пытается загрузить сеть из файла, имя которого было переданно ей в качестве аргумента. */ saveScene("test/arp.net"); /* Последняя строчка скрипта станет его возвращаемым значением. Это значение возвращается в программу и приводится к типу bool, это значение указывает верно ли выполнился наш скрипт и в основном используется для проверки возможностей программы. */ result; /* В заключении хотелось бы отметить, что в скриптах не хватает еще множества полезных функций. Они могут быть добавлены если вы сообщите автору о том что их не хватает. Спасибо за внимание. */ netemul-1.0/scripts/hub.js0000644000175000017500000000133011261112237014673 0ustar frostfrostif ( open ) closeScene(); newScene(); var h1 = addHub(5,0); h1.setSocketsCount(4); var h2 = addHub(2,2); h2.setSocketsCount(8); var h3 = addHub(8,2); h3.setSocketsCount(8); addConnection(h1, h2 , "LAN3" , "LAN8"); addConnection(h1, h3 , "LAN4" , "LAN8"); var net = new Array(); for ( i = 0 ; i < 11 ; i++) { if ( i == 5 ) continue; net[i] = addComputer(i,5); if ( i < 5 ) addConnection( h2 , net[i] , "LAN" + (i+1) , "eth0" ); else addConnection( h3 , net[i] , "LAN" + (i-5) , "eth0" ); net[i].setIp( "eth0" , "192.168.1." + (i+1) ); net[i].setMask( "eth0" , "255.255.255.0"); } net[0].sendMessage("192.168.1.11",50,0); emulateTime(); net[10].sendMessage("192.168.1.1",50,0); emulateTime(); true; netemul-1.0/images/0000755000175000017500000000000011305026150013335 5ustar frostfrostnetemul-1.0/images/table_route.png0000644000175000017500000004701711236330204016362 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATx}wWu;U=f[ cˆ` =:$bC B =BBLa mlmٖeu};3;;Hz$ ݙv={%ޔ 0@)ƒ`_授@d"g+o 6n9Qa^ 5~0$̀D<"BA8m{!rnmO};6n&8Y -$ +q!La_\_) 4~"{zt//y}qlظtx}@yf;x݇~/̑AU&Sex̸FD_OX` 7Z9g{KvNQlOPDB8q"F32*idn&2Ø6St4o6l|g8o;⯬[ל%HZEQY 9;dKsذqPŸyEc_wIB7>3ޟe J)QT3>hTGTL"MHIm zwo6l|68i!+A<f~gv󝯸5WϾo0@fJlS6w?喣H~'ٰqȅf&A @r,5=&H)m MPRo~v@ ^ď!L8>>/7|QzGtUذq$ЪnhN{ߖD "$ " 3i7a0dĆـ'AID @"όgѳTgf$!}|:=y{$QS6n^ "'5nk3њ͙.ZQIGC\dS 1!cI `be4n0HL' 0@`b!bı`bI )<$=8(؈$yb1'KIPAs"$Add (Lj]΍;L7x_9*6n~4h.܊?\߫aXEvh>Hf`3$֋!'Z~1(]FD CE`aQ@#q&3A'< }4]@r8xt'ncL=i _t'^?#0 ذqsxL,/Z}S@ =H l Ԉ(!cdMBH ɠIi(j T> a3.0Kz(x%>< RlN>@h9s};v첕KOy{>v˥#8b DFU5mHG$]JȀ%&cRA @d ]=nd@"X!b"D^ QPIKӀ^ 8;d8wˮiuG"VL{I|ۃL[.}M<#0 ذqFrK77#ǭ=P܂ FdSɤaacAvm: ? PM;P9q,0DX<{q0ӕ9 |骈Ӏp`C7g۽21 gOA}HmIw$/哯sf 7? ROY]gw~|Ӥuoi0iw6LaSw#Y%EZKa- @ˊ74MbҞg! ՅHXfbpRxN}n9…8q"%+H{%~t{unR^W 82)t[:4[>uo38,W+Ol4.xɼ7ǰ2FT2dh>MBE*0Aa[Q5wWF"L M޾={0ëWάb^B`v'=Sc]Lw3ɽgT a7$D1]T." \V;x[;wlظI^ 5qcqCG|Q'[2ƤHlԒ%5|7F6%d! !"΋03) dދcf=9/γ8ǒ;/{)<Ϭad fQM,Q$3(ځ~Q) џ}d(̍-@޲||gO~c,6lܼ ?hη (Q ZKFBfecG手kp$:iį"2FFKbHQ"!G!RJ(XbqfF R_ ֐i$֦ C Kd,אP 5Cj,AJPQe@gfq~eg, ܰqs=iF/;y`B$po0w [Gs@d_~dI=8(ڿ_Y2P5ޔ(S Q:pM$#Dv0-&Tۖ~o@#H"'j421"4 0C n"9%lY <8yjyrwH)O@h\W?@xljG0#OҺaH!۳'7ŷn;Lt6lܼtк ىܭ# 2-iRbRm2Eu%:}@g3LfK5 )& ~ZDT!r/+XXb ^徢IG cT0$,S!N0'/94Mg|sqˇrڋ)7}3`#=&^C7LUi!%@S5e0 3ρcs@7"煗^ wsHH'Ɇ[Xd$xtfCTD&7=~Fw=/OGl ?}ß죟\Y܎u9?ܾlݥ':-JkL;l(xƄAdHN=ۓյjHƀ&ߛpw6Ҫt$v+D%K7-i,*J|xd9tYE!'$EW`p,HgάLgF{Vj%$Q~Zz?v g*nkՉŷm?*~$/[?p8w m?E3I QZk6f)l]$3nL B&_3q^"H`C7j %)P m`0k @{eL{03gtz=51:y!3apRRN}~nkh\w |H,o 5LҨl,2dar1HXEބ#"XD 9⅃ZR@"{9|f/?33µg!2ppRṌp)$$v 1WLܰO.~|H9 a5jf$JH KfJv@Rk՚MQ›r%< A Q-T¶"Ĥ@DR#x%!7ĐI,!5dRk(D/2hiyfEA*?p FWVeD?x (UwF $3%Ę%$]=6kiÒ``)¯UhWD$b9DButn&af`P̷1X YdN- ,KPJ HĚFjE,4EXTZT}LF~" ;WGCګz<*GG]`KA.%%aUIsekR \"_:E' D@5Psx}%Ĭu"p-~2j*M5bI>fO!e $DCiAίCPҗ<}3?` 7{Fhfl0R((:uLY"$r" %A 2Du+`X`b1fXCF#u- "' \bW }TEs"^26QJ2HL$6TAq p*떶qڛr [DPpqw> af u[9MaajF } @I[dA"; c#XH!cdV@F:%Ԯ&j'[1#uӒD͓@L+4BSd'>D^PPBf fp RZ3<^4D1x=Ӛnr=.~WLy# c"c]+ 1bcPpFB0/NB @MpB]@|q۬aU "8Q@#PBADD8"o>\0Οo#A בd 4?*6+͈##®d_gvPo=5$[6 &j('x=]9'!NxTBDD ' XI 8"0(H%q!5lb:hY[h( IKcyC?Y2BK`HFۧ&$1]"8K@}&7^!<#t+o(GPBA(oBD]1ưDA"Z+>,Q4.y:4hC.E&aHY7*Grgܕ~KbiSxܫN_nD)IfCӳ[!0Ðdw%%@*2)"U$IdW l55 Q?B\>4D&!P\LjqEC0w.^VN!@NJAK mm/:I/MmƱ wb{Q}Dju 7׃-۩tpf] IDAT+Z+ء)Y50AV{ ) tnũ;驫;}`ݭ W,~cHAAxgh  f[CX !!Iwb;C#\52c)Q&螆#UXHS;>{>z4C!?b XO@+н>0=utzs:l%_^eKj@Iľh2J#!912xR{z" >K)k ]KvߠΥK VDW]80"zX~"+3xy9bhˇ{tq{ڱI`r}+ǫ;(@`0G_r걼/uU[$dxh?`"6X+3!B[lϛ>u[Ffg<.z5/&.Vh y05`Oݺuk_@y'BG>MmV6̎,^}ѢVRҟ 2kϭKU {o '݇o2s1lںXcdt&& G9 7s 7 *vy 1hm>]iwkk:=ƞ,+`B@^}kށNt74Xb#5 :m>ywx >t8R˓?,jx)ѧG矰V عG v5Ր=7m6-{f%T [ܶL^qML/[=ݎmqh#z= ^@PLb(=YJ8/LWDH/wB! Xh0A(e1QO4[Eݦ@v 0}5<ȳ6>ʏwj}έyg>z3bfwn{#]Vg5ɛp]c?m墹x>tq=F=.j"jeHHP59!e2(֟dUZr'^.ϥ &@STma93g׳;GѻMy;<:q6Z2[0q^`׿!Y1Qww(7\ t~A]֙g[.ܴm$)~]@m-0x>k2?HJX%4! {@EEe!AV`n {) 'ݼEnbh-ٔ%H Tvۊ^ħ/|ۺaܖ Ws N[5NnY?y fae|=1˳& 4sbgމ'lN{^|JUokwܾmZ= ;'kȟ=¾X@>A  Y30?q@]&eKǛD2祗9ɲ,BfI~ĕJARx/| a!o-jf]9r/D|Un3˼T O[yk?_}gN8﬚ ߢe/MdMs-OBn`k9?=0(#KN&a"}UsS0ʈhRc`9 'YQHr л_fqNQ@LDif"#s/&{dkP38=7?Șݵ+ jR'`#qtb2e"{_ <fu]KہGV83Zfzv/N7nO:Y^C;w <,v HvZWB'0PcS{cMuzu\dzK(4[-5 6F&F#Pr~e\{~2oP87f(݃jD']7Y`#6e)a80sEW\"" t݂ ǡxR΅8ETOc0ɻP=*Xfg.VՀi4k<"%d-`:"\כF &,\iN } !z c)hE@ {/y^@tZڜL'@:C@?Jvw jiCh}AsksŃ,o%صD!r/999H20[~਴AKU\h "b3^^H'8a"w$RC" / ?${N|zLRN]K( /vMՑ @JY_i=B8v>yӃTRPĨހ0s_j@>NJ^9*\ڝ^4!9_Qf ˟8ۅLW:'!sחvB:[/ :n={K;8[?4Nѿ}q!/1c ػˆhMNP+vC;Œ b Ąӊ>F^xBzY.@兰/#t]|t yn~UW?D8<(,6kAesH{Kr+Fzww3W u\~b({sv{!T^UbǒO HHhL};dj0qN_(X=`?ty+n0=NſsYg:~~~.z|lo% ~A9gh{yHp97 3F; .<SZNo#Sjj.`c0*4a—m}ȫ 2kr B)4Y,#XP(˚V)fB (%}eu5)X ZB( ?◛:f} gfpa f`n- yn?kdɚ@5`eo31ym4*yZKJ#ܷ~"( t,`2jظ :gRbCfOQ#0!h4} Y@ w5/<\{7fGs.!]+WTZm#30'&\^qy?*uۋ^pqߗ ʨ8!"@7mhv1+(Xq6Hi6;`3wv*~U@ bfX|T5k|y {Ք tJv'sG׼7.  x:.P?X@Yؽ?f05o}ϜU40֮krྑ>_]3<ףN&_G bV=L`_4  .l79"Iw~q|̲罀9OǫzcnCjY ׼ON]=yDCL+*1`t;`dp1 ",/x6B]+n]./ƒh~T/Şv{5n7dwm er.xL-叹NZ>hhi}oϾ~.`a_›~헿;}Kom&Kܑsۡ@5~N|vwlGzqڪڱZ m^5(u m2/^O|/a)`EK=L # LQ/ Řj.&_}[0Crj|svjBy:D◂?}fn?}t 2 hac3`?T /3 _g瞼}zS`J4^aDKڀ{&}7P  8}A1#?s P|ca^xrnm[ׯތ0sR=}Xv&0-`oxg>2P^oHcNp: }H^kF>2Bb;w H^3AEQGI@*"qzy^Ϻ\pv2I3ٲE_|˫k4{e|_w-X}ϲq~o7ICu8f̼P M~'- 5 CADm32 B^A\g pF#&qhf|7Ȥcڡc 3_sv{w@ zմ+| &GA6YE6̞*X#8zTk&q쥇9$S U2 4ΕuW^@ @?IhJu5S֒}oU5H`Bǟ{ipq7oE_:[ U[ĭ|CqȫN/rŬ@(ǐRYA,V1Kw?EUG}>k5܋z~Jm %ABzO_vޥ/{P?',k㒧j6#7:cW  \==kK|ܯen>[ BDPQܓDov/w6 tIDAT/wH'w"̥]FJ.>,㰐> ;說;yH@ w)Y0RZ3-)KVXu AmR8Zn䥀Bܛsc!䅐59;;ۿ'sɀxSRuZBg긃W} 3{ZC Q[jbQ@ߙ*n<ΥzҗZE90=?ECJÒ2[d{MWHcn&ev;lfߦH Uzie@RՏ61OiCBaX>ykJ@Sj tKv.ԟ_})4*]M0LlٓJuґÔc@}.t1ձnR}̝X Vm,6VQl SnݿPxk]M _Y|bk5H =ҽ}a,iQ}rgt{[ٹlP霍 ;yȆ9Qn)enBf /r[Pf{pZDJiL֟{\ڀMu*T2fP=sAZZBhc@+BG6GS<* L+5x{s?lEf4%\C"|᥉zQ’i2U^AZΆn,~v0 )E+SPqѫZǬr%N_|gtGsYMaTC%BozS/z̰_ WR«5d텥?Q];5. uN&pRJ`:sqPn"GyD8CIb~#ӊ u<今 !TE%zԲ|_/1<z5t0l SVacWHL׶00URI6gqđ YJϬ+2o7qvzt[OCj`B4?28s?'ێPa7sh"/]|BJƆ%}?橄։x敲t]lP!S0[gtc.cLvVY`X53^Uqw'wzjO/ؑ㽾k` .kY^O]PVN5;9]"[#"v?m؋ " I҂T~o0@,ƎȻX~@T<^>g/-=XZ=7wW5+=.]Hev>TjxһGr>GjA}-_3mX'"uKw U 64ל2L7X/5%]S{W-\k~x!6Ńge3YDeg@H鈑 cYkޥQ=@|=) l/t6--HMb4oV¯yZIk.5xzPT$~C0p)<~mgd6MbL+(cѻl\5$m~G>Gl;X vå-(QJSyx?S+~v;` Y"${?%zwo`Ni҇rƋ_!PoO~c;jK{~ fj5gd `78ӘU< 6j+n5F![Q$$.hewׯd͢u+cb.? $`VQR仪L#e!D̢F T {Y|.4}wE 7N]\ VδTS)4(X , ey!_y$`4}jt U9AG T(~}$R<7;: 4S<0y@?|zԁ4uD_QF;ݨԀ4`?Bj?ep5:F~/zꂈ2Knq:1$>pi1ni=%v}^-T >d's -|mT;/uyS\6@ AoW[o1ϹGQ D9j #80dopuhu:~5ɣEgLاl+V(xz[_``+iD[), 7-Jϧ_UJg6lwB* a# TEqxrkGU+F)#S *8 3 qտ,G˃[K>; u׌ M^Tu .VcTsҲۈk}ʡςjzxݘNJ=w‘m) 姍8;7 Ք7~VZ>j#\|OO$?%۟?}G+s9Q+#V]Ȩ/_xCeOVI5$lҧw+jNfMfccX9!:;e{Ļ:dždP.8"lD:zh]`Ƅ}~ćGK'^sD%n#LRԯU5Zjr%|̜;t=ލ,7Ğc% Vz"VA@UYOhBͥ}ZZZ^?}g%oO7a'S0T[V׳_/?ژ߭6kZ(-Hic̘s!S$Wr̬r>쿓AzߠpvO @gs^:bg'B 5ϵ><Y; X-39.;:Q1p#0H`9"H/P8m 0}HIyTN(|6RTk ܂ЮڅU1DW[`t#'btηP~s716;Wi6"FCFCQ_h cי..+zu?~VuIENDB`netemul-1.0/images/router.png0000644000175000017500000004017311261705352015401 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxwmUϹ˱:nPDy0` 3&1g ?d,a,,FDf@BABVr:~^wꆳ揵Uիz^w :ַ[Ho7Vܸ> |^؟Wx|Uo/d,* /%4Yq:z+0^0`x>Vz\>J!V^9=oxWrJՎܞS0<Xd%ܐ? k.ՄU޳ȿ忱HS0\*Gӗ +{#Vʒc]HC4 [kh4NQIM~R"8 F1ȨU"^L26l _{n+v``VN`e`t%f`%m_.ՄWzԧyf>:=ԝ w)wrGzĀ4&3)h1&f #afTS9dphGN=}mOkn9ol+e5P`@MJ%WxϦ?~xg r50'_*0 @ 'fLM.tPTaPUT}USe3O_Ss ?`ݫ~wKb)(VVa<.|j♡^SCnxm2^1HHAHx_@\ @ uSh HvG[PhjFsc6wl;>5wgwMp~o>0UIIA VSuU?2=>3o|ó8Z#㢁p1X/7nB~{k{v3#;)^("1@cA$dA;&]@75.[zf 80{-[fƹO^1Ĵl’!iRCS؟onn/^WZ걲O剓2#UR*=Z/A !ei; 71&ObX|9h~Gggf0 X ʊ5%)RJHhUjbյW{o~kMFw5h{|lOAc/ mUP*!fTA$V55ڷO,\0 M`"\dhdx3/OLه~þXPMH)S# 4?&~75{~ K90Ewl\7_[wW "{QB%TR .|]T+Ve"9hAˮLpmξuFojˏlQUUj+tLSJZP4"F4)Uqj;_ߋ[i:н||Gn~l_"vfKi͌Xrjf.ܗϳϖ6߽Ulȍ;Gw&5%PUjr4H* %~4+$X~T#3w?W}p.ι/1q+e늟ToW?'{m嫿h gcv<<ۇqp^nH12s_rE_zujt !&g%ՂLB"IȶX?n.zU"ńPB"R!A{!@@$ PdJ}gy;~oOEwy4_r Xg h} ~_%~X{~7?s%N~tZnƭ3px WjL<ݼ_A.͜O/D(4 HX0bܶzM#i?;+3zIL j %QU&M9&%hI&4Mi$"Vgg>.%m\ + o:6(s;v}-[ |a<npx(=;R Uw۽~J'{toB>9 AuR8okX>~?jPMmR)'fTM"imMj (I _*&v~[n ,?yCGeoy^Us|Mf/xSÍu|Zn wìث~e8ֺ->_8b%`d&3WS_͗M~^{v:O?֟܍<9O鉣~VY1!K"&iADqƿ%,7_P/]]7iϛni?؛ΆCMW{2 >w=uȾtъ+0а3]_;c={='b> zx*>~ڑ)ڄ:!U- L ͌xZ9-P["H\MJ,&i-Hjc׿dXY9Okelg{-h򟋱+?hl96@B8~dMlӎ:0҄,n9Y&l&fd#5:&)5HM M#MJLI%i+꛰v=$[J?잮޴yA fTr'< aZV8W^:8c,Oy)3g4+s(C{ޠT]Nv>&/('WjQdY>R%[3 (B "{وM9}QZ^^^4AQa:|_+ 洀[XvxlF(5U)Tcu&/䩝́;GwGL9~TͥXKB97O*n>*Ih,9y LM b$x~SzpM~^zi/j dNlq}yvi6iQn)S|i-C^9$,^7"έu>zG}OotN?3ǶǎlmybO󇟸rҫUՎ*~翝޺{&sb/)e-ayYUΖqtv0.8{3U׷4zUM3Zd`롲g?O]9[-iGam߄:yw|߶x}͹|ӣpU7a|字: ,UXSOv<=7VN`Vs@G lYO* ΝAU@$F"Z_?pMujeoLn3U}7lNq7H,2=l_>"|`C{>Ɨvxjv*鳭kuy +]!84$YH_y۞ՋiȏT5[\"bҚ&Pc%p)8Q.)3IfNDAS߸}CO9{4F|gt0v PMo9Z?N_-g-J6 ['-QTHe@P}A@ Jr?t4IQ:Vf#NN|َ-vd['qT1{>qqfس7 Vr>gdFr[^xdcdcdl;/pE B>:|[+stf1p8 ggwz{*ߓ~g_ٴ9% |/~屏?{Ll`oG3?x7#u-O={;8\>V^[+jR@r.E$>Qs_;~jqvGb4l(v.E0p6^]2Ɍ& M B??nm[x'~PUfҗaosվ{wW1\hq{鳋d* ;7>?>}Oj*|hdTƉzr=zόű *P&]$2deFnd4c BE`'*$` ~Nn#^>pO:6\}&4bfwl M=Q_6XﲙsO.=T N4}3/&Y͈`u‘'|كBʖ%[ͫT#e[o;O#}CD 9Z(LH9IҪ_P.Tk춷 4  @* hAq~`gp|7524'!hĘd`T^ǞKApXp`RF >g^z/KFnS> @CF0tx .>ܤ\[Q~Kb܁Ҽӏnc Z||B6s6}m7jSkwl}}[O=>~; '}/h3hsm?Y8`u+2X)cvϡ_~G/K9+ ]A "FK'w\!ѣ& kӤ$'ek$FifLT%JfȄef=0#SsϢa*{ѧoHf=9mǟ~8?E5oIˬ6hlPB<,VJhGucv<517P($#~E&^|syLa`jW#_>7'sa1ޢY4#4fkEx[:2t3SDU3U=}Yyj % XF&zN`NC?W6U=qfW@M a`FJ"KU@DA  ;[E+V̢TI'ԌYxPV<AZw.OMfH ̔26j'lnτX=:g^VM^J AêD* qh@20p 5uKF995԰O힉w,&s, AaRlF@ 4JnRYV0_iuFj(=R'LŔP5* %rZO?I'0VPV "kwnM8۵4.LZ3=[k?{'&h:V*v ًLgG(l ۆ 6ZkJ[->  &^cT n4Qk.Y~U2YC2)R'y! 0[2anUh!U qqˮq8^r);s"27 \^hV s= L!꙳ ;QE(5`\I;=5uh8X:~t񧟹zxuq.3XotewQ $gDFI83Qr`d)4@H`0(#N5j@W:bH(?JOj}[ jed2G!|f:fHAHlԨLF4):SUtO(pX>ub۩\RĔoR^u='s+jƆҩ˖p 4paFHpfJ cݲ0Ls! hU\NTUR$JۢVSf$u:켰~ˀ(7 A&BIA !:"b\Sն-N'U6q  [Ξ]qjgq~ךj)G)@7,i:|Ne~~qw#efp8NUS "(䋪VmVbk_ͽ/D$MLH峤DMIU6MbJ AJQӴ;[eg45Yߒ@Sj=&kgҾ> \@Eͅ|kR a{KWry w=bГߒu@dxCjGU6~M2z (Q-~_if%|~'O$<虽Ep2jNN gwD|J}|Y. .f[e⬕l+@YpE* Nim5gTJ'p[ud /1%ڲ ,JS\&@q( fsB" =X _&1B  ;87Z`&X AZQY$ 2_d"3ꥄIF*Ъ B_(R-$?=3:' M{s /Kgm͹L*4p12B|6N#PlDM{ hlN@ZkYgI? Z % ƥ 1W Tj?|hBxGk9lf\%v|Ĥ(Qs^@ՆLEp)gӳrvYK6P.sk^[BZS4ܹBzw '^ c%XD]1JcQ@W[#ǏIcHN"uF%rRh2җ3Y5߬q Pd7۽hї oЛ:`Iͱ8Arf1C@ښz||Jy4&Qaəv⦚ TJ[3PD&Dr@+nk$ϯKRcٿbM6e\xC y*I#%_01 ιwSD^iwNTos|>Z+lT9's^ȟӲ7x_ Qd[ʬL\@iݴ5ކ/Z(`ѱ q@. .Oݜ Q;L0\hMt)&3dT<:,fY2l"+-]y(fN̼AJeM'Bܱ>լ@œC- /#`^QLJ60;_t %m2;/^c&ޗ:+2ʾ@ TZW`%hx2_ @e_?Q0IW& mT,H~C?,; 2xV0[-l+m[.L|wYm^ϭ[#dmhtV%$٪[ZϝM9VhC/%e'!El X9tbIV(,J;psfl ws1c2'cO PZ^3g]kl9%y-ܒ<@^'Y.bl ">U,E7"7l8!F(Sa#c\iUu[_"p RM@k<'ER_(zvV]8( 5-[ՠ s/3)b%|lO,}d]0p[@hx4ݛ?/ tK=-+.]۵0/An.uGhmx!iy$9aA޵|a.s]_4=}7hrY>`s]@ G(2I(D%7yDl ƶ7狖y)N]"}I\QՆz.x-lĤeiXw69glGϕ+t,q"=V_!0L 9 im*v܉Srﹴk 5s@~ p!PM( |[( &0J"[yKs+}rw(sNKbml3r >32 YyC,3?pNWH!cHbf"9KPL  > ;LM?ci֤/zbqR̀@ /<*A+gevAK`1>BG D AA0q u  D8$Ts#JSfh )tE" }ϏX%b`H* 4RTI " ɛ4!I KvdY$8JD`$)*"z9XLRX=Ea%<<3˧<3_LQ!V33,DbZi@SJ2 i*)uJ8cKjFAA%{ *PBh` ^(,xˁT1~  1b> h>Sk&|x Q3IMeZCRD6 *"%PUQy_x7s0"HILQC J5TBE%^D0 b PJĂ7i&Pm PxֹC=_,|< @`xyٶ? 01sDI2թjY-=ژcj[7geA2ڰMcm̈́oKqYg@@ boc=AJ*M6 EM24+h&a7rI I &j1QLЄ 1DQRDd!3f&ٷM!'nJ vܗ9--xUQ JWn*[TP[x)ۡ'H!aB#ARjHJøc/Y'Kc3Ǧ? R: QXR 9 \f<$ $0[!׭1iCv?,{lvA}{CfDYCPΪu%JЫM" Q.aSP_J QC-BI@fJ%óe 7ͺR=̧C.,=XzXח־Go3I$ PU@]% #EĘf U05LWЄ(=" m,M&Lg|uί:Y! 0%GXVB= u@ UQPEiwyi 6 ZLb/h>@3 J 0ƶ̫V쯤^f7~Aێs1KX=BhRQlg2xԼ:B:ũBp"ǷLy\/vs{ݮDy1 !P ۱*4iI;o"eЏyg)Hw{ˇ.|lBo*E֏ F;ڈYQ(u%o]ʱ/{"u^dcgU[٪G7^{!_9 9ae0UD]l5Z@ 6Z}krA0q܆}/~nkFabqԅqA :` 6)]iǥ?Ƕ]ӈlpX$/&/6|fE۶|ݣ5w__Wb٣MEJL4%6N`slݖ^&Ԟxཿx^ ._h $`2b@k LnB9!_*+22`hNb3ˀ2l*'-k6YpR|h]>&hԤlr4 }*Y ޥ٫nWO}9^0x)3H˚۹5PPD "R$@rh t;+o7WnyLsFyQM4j2)MMR)45$):DLHߢ.:kON;_.?^2@hMt p*B-EB$u^ 2kǚy `5yBh䕻`RT્Z繛l |Y97]̋N}YnVw^vO~oˋݦ׿q Z/2͛C5$ i^A26Z*bua2>k(|y97խֳ@)W N;Xt?WiM6Kf x 7C'ﴀjK]vȠ0iyvdA2+VH8[xl[D<ͬ<+IqK?OOpXv]zˮ~=͖%@{{I;gN M_njO}&eE Pқ e L;mu0͠p_6ɣu@e|ՠe'3~nR;AW쵴E4,M/{2(cMnC ;Xp[X7qH|z.d;^?1KW54] ,],ײ@i^$@魟[~cfR +#{hvfD\B=u4 {CxMVY/x`?'WvjtMwѬhdƿRτXɓ\iҸ854Ih% "rVBuBB<K%ymd|`= Y34C YM6C4f`VC0"90``"G{O?~RXUt//,GIENDB`netemul-1.0/images/clean.png0000644000175000017500000004523211261455471015150 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxieGu&3)ʪʬ̚%4OI` 6,@mVۘnny=OmAgpc0d(I5WV֐CyND# ͪR 9keUޛ|;;"n~,_=`hQ. @WI|G%K#ۿ|yn^r|?Nw3pz琐B@Ea?'Cw<2Ӗ9I^A/d#n}(u"_F" OobwZǗHv.&~Q^|#nC/`}m~gf,Oく j2ߩaw=`Z:.V0YW\ah0U_-~Mp=? x`Io3OGqh(/=U|kC:jYy;k5hAY&05b Zto>P0I 3?}4i\%X\ObkmJcǟ|( 76-Bzapx u>|> c%`dȺWb,Pf 0[Ysb 5X݀c ̍=?ѵmPū}n fo| hIg035unА^@?@q<{0>ps :πfV5MFRW_rwѵ<xߞfUuz<>$Ǯ> 9Śo!cHpҿ}{⏾񎗣o`~FTđ m5/N}rRV rZYcqv lAO\Weǿ(\{oͤ) 1lg ?qx ތ:΍(rWgt=iob?` Co ǓZu\Fl/wc>{XWJD+e΁,B$A&3Hk0Ikfybͬߴ1 ڪ̀ P 10q[_s Z3t}*ڐ$Pױ )z:x !U0gbX|Þ'/| ;W+I;a{G;qX#?ɠq=e@C'/N/7eP# ’=OzxX7nW`ҿyZBhSvp\YXНa<2)*/d _m<SbkGpɉ pHѵl5|co|{^y̬ Tqysؾ5U7JÃV3dSEW?:"n*HecyGGw\M̮Xo.8KdyM$ϤWGsϠ˄6CŜrSl;6ea㿳9ЪC>z.!~G5T6ÎrJ0 Sos{Z]AN g vxnQcpn{%1ӱAFAUzX3.9 QmqÀ7 ܼy/p+`EO7ne$@9Sݽ?[=WE  D%_8;:`Hg{Hz{lnn)Jò)%zz{ cMukCЬQD!fxdRN Pjo}a}}=g`t74{w I1:c3Ubd̬&k%y1ј׹1[ XCQm(?<&tBODL0v-]+hv3-^+z='oȹ1EOm%x{u >2[p.3.I5+Mi] N:I 33,űy֭Q}iC7 ls]P\}ʣ$}͈]:w{ 6X!T(9p/H?pbK \&1lck#0Ro|oHZk㮕RkVu-.HMʦ+=r|Z"pd|)!~DOִ)ɒoI[8РX+6[÷2.ztkF%(s ʪ::v*Zk`<šd&tC "DU(ؔ _5yDxq=4W֒>ȈBIsRfMayƑ+WdVFε 7[ sIR9?ӱؓHW@5ǚJBB&kDLV3GuKoe_䠣ZX܊1#궩Ğlϒ><3*a-6w]{{OrX;d$Hg{  CʴY p3M|ނ ^:H5dW'! If-<@Oɀ5՗.xd# YAJG-udURbO[I_{Wz3q%@n줍ȹEZt'Au1H5q4n[ӠkGMHfpZ!ȓ\)Dz"/.Y*"pt" +aǜ@k#伧TVV.>$ H! `'_?o޽imJ 6MJ^^,rƀZ{&"Dr%R<)OlVh% !+@NO0_f0jDۧ~+ˈ=Mq?K4lW`;7 _;'m%7K3րoG0u6֍~f?)H{qUH"C"ﹲ;xב9rsIGT/ 8y矇 +!M[gO{Ӽf ILό B"W]!rߑ9WspA| y_/B5oN"F?B[=r%bZҗOAt(Z?l KG/w?xEW8@:fK RO`י|:cᎇ$@ܣV`TQۣhKdj7Inw]o҅f)f JoEN' ĞVҗb`{G^{m͌܂KLюer$&˱2 M~Z`ܾjyɾ˵!Ds`# `Kw8pSI@8ii.,2ł^x>dW,L6j.6g/]t˻BVx^ı?قqQL6e{k۩ '|0/ ]ZV%X5.{sպLVMϫFBDA kkW4ׇ+sjM.[;|ivL]~ ~&GIL(&$jXk&I Gb). 943 D@ 8"@4O -*_{Ğ hebj]˝'sIHjׁdXd$[+04k5ɑ\A;$])HH0~o{<% 0K]u:zE߁DեcX  "#أg\N8x p`"o"^2bO>VnE,̏z87 f> qW MҾmXMؿ!ZL٬%$!\!fE198n>g2wQ 3$*P~B/ ѽV,o|ƴe(miƒ8z {֐uZҗd kRj7^"(!v{u*=ސ;|hʔvL $I! `01:T@F[]q`hC^GF詬:V 0@BԽ]bq),>5 ضۏ6dA*-j=@g4 */Or.9ji'b f8+ fr%'I$)0ܳr #{$wNU&Y^Y JX=m@jς$!d?ſ|_mcq'EV9ѱ|yk'Wڑ%=co,vIls\&@9sJnKHҧU7'g&d<Ȍ G<)D ~َ#||nN`Է@}L`fsX])^Ec8J50?$f/<eDfs9)}g4.u>A[/a{'r`cs!&W@`뚚t9l{Z} 0"G$aOu?:NGr/e\)WkX]h -kp qDy3l3Cףk}1Y7|6~}6ǤEY~츂}UJ ` M¤~ soR~:.LG;.dپDM;_v+nzL_çp*ję)/F˟E.ߋknpӝ 5f&iE+رz\_5NrK(,#hTgH퇷9zϾrS;W"!}I WH5. `+"ac:Zے3- L 5qРKa|At# ^}7H{:Tp~l'3]L\=ే!=`M{6fA~@Q[IA`*(vcO lճǷc·aB6bOsvQM!@+l͢ <̘=y|Zc^n"fup "#|$bl߹qoN؉h>fH@?Yy'Y68nZ ݽ{^!*, R to9gww]/3ULܤ~'}Gj:~B& ='_? Zu,Jן+oVL}Fi^еA "JR5]^ _c࠵i|ع IDATkQAlPa4ΞSX]pK.bT7|GJ[_"ӧ1y+?grseO3h!}uk|Vׁ;o??kB@qu ~⾴47BőO!;j~"ŝYX$+ O\k?}noóOD>J Ǟ>cOtuw`t0vBOoG"*6֭}/8 8u,&/"gN8srv򽷁R G>c듾 (JabhQ `myFҬBQK^ΐ;f_yzZ}f4 ȮU'5/&ݸ对-˘xO}[2Cd200::Юҋ-=ݨT;wg'Q!ZqC_݉W 2zN3#0>8ЩU lՙgĞ,C~6E֭ޔ,МىyN eI Abψ>FSqjDD$ $y^;O/ZP>ށWC@Ep^׏}g/'!}Ȓ38/cja '_84.hB yѽ%D2y~Rf5Xj,]< 5m ]{ +c~RG8{ כ[|6 @!ߜtuEހť;yӳF&$yb/> ǚCqbO8zXE2yWݴ+fz=W%&brD5޺~ $3뼰Ksb*5+ѳV3XjX,\?4:X7Rh\5L᚛O`q8s|U1Fs leV&(8/y΂v`羷y@tX:Br J3+.BE!:J n9ְXо)^;ŋ.<ևШԲ\Ⱨ1۽ ÃۚxBGChp&7oKZ67h!}qx !]z~}` ywJBB"FZQ!RwtG lڠɜ~ygyU*9|N;5mpRa2z7 ku| Օy耑5v%=J_ǭ/ǩgz#۱8g^8v 6 .&+ncllo!}~l ⾽G^8-C7֪ږm` VjZ0j=yOHWlf|p{6)sj_9@/%EڪZ3rg~.7 ѽ}xHtm E4B…*V)n⩇8cTkxc8z G&˼3lxKY;Ĥ/y !Q}NC@Pi*b]oW$k\IDXADoc:e.i⎬whԫkw ]>Vʄ*U) C4Vmǃpn()bn=Yҗ\cA$Ѝ3W@cҗ݂l;i(31KkjxN{= .Ch~KKxQxK2ށYcuq~.h:X;cq01P{1~_2i gec*3Pi"})w il[y-XdGi3W|nЎc` /i\.jDQŠ#smzngP*'LF50C{2OAE/ZNt2Ȇͫ, K[Hzp_ykYҗZ[S-CҚqK]hy[_Bg< +fMXF+ioY8\'!!b_CPl (`PvW]Y5=M/% D>6m,2lf oP\m7`$:{@rf`/KJ dk4{T/"FWvu xp޳gtŞvmG{;K=K/b63^:W`|#? /KՔIf4э8Yaf Q^B /߁l[>RܜVz ֟ZxBwIgr p{?q/2qxPs>'oKQ9Vg|:r;H=PQ :\χymC'vZ>]߇ l$eEa@-%yAGv=\JYCسνB/+6T 5O DYv?=ɆB^n0~8@"^ȇ(/N xrʒ /-╭ZpY&+) }'v6x][s9|7L{b0+ooon!ĶMV0r(Žsmհ`kb/OE ԫFP")^r~|m \Odbd!_4DБvt]4 0es{b/a `Y|x`oL$v9HYmXҗ?rV{GQ'u Sgkzx1Jy)H~ٕUUdv3VՒ}tbg#FzWY%{WRҷ^P03h"} FVVYT/Œ55(l^cyWkOHDieC& hl 6bCf^kbO3k߽Ņl_HĞ3\=qDֻQNcu$ $YVYG Gc^YY \ڸ+A3Ca\3`] )Ydrn(''b2z@lH~7FV8Yҗ/o{0y@W!h^yWNAz|hN{Z@ѨsAӹk\6S [dE&!qJd;6*%}wIםix^RuŞfҷ/7㕰}M 􁫀:oꀜ ѽDtH,$7,&% sN!LcW`s@)$\E^l8HNʒ8%}{bE?|_,9Ĥoǐ H'>0@M!5FQLrLLnO$:t/Zp6ՓȬ ֨ )Ɍ{iN3'zOΉĿ؃KO׳(7zbkw?0 ۶ sh/8: pav(\^DQQ~Z7H)c/|i&=> pu{amtMAnwy05@]0L?uS_џ@5 h:h? p 6Ap!}`f4jF_P"TIC* v=B $EAдZh9wIAjl$w¹ix{^Px~gɄ`=e=Yg>g?f`ȏB8]h`ճy[_6 00{ 4 ylT@绖d$d XaܿhnWSYC2<ؾ=]Nz+,% };Az$ۗVU?~/DuuаaBL6D90HMoTm "O"&TƠ@}{vKיQG=@f#)&Cϛسw.Co,& ],xzq|`D:+l?A2 f@:>145 c4$_AlfBGHtC8}z\ik8k0.xM<.{ H{s6%}-qzb &w][K/ql>>߇׍{>P *&Ԫ8{OO}#HUlO=k^FE T8q8@[ zd6u Y~0@T2VmFvbO 黌`S~}űؐ}^ kHB:3(/='X^Wu(u݊ʪhU} ^M[< 63FҨ,ZA#;ᣙ?(*u j9$J5*Uw'6*o7ze ]o^X/?!ZL/bjIc`׽Wm*lU4f+7!a(Wꨮ.C+ӓ8x _Q<&etÐ@Bu5-a^rwC쉯+ _e~.u\2 8`׋<Ŏ?|95$]F!'`)D/ d7 럹Ң:|5EsTRnMcL殁\:%^j*+\3>bOl߹~Rm两g!Uac3к '6o۽& wc b:Az{@JpAݿf2=P2ֿN/`J+++wZ{یc|Ra]܍ܳ' /~SIwEs?XYach q t/e:'h ہE n!Jg~j6-1}n $MIlvk=:晳~"T=ik*泋~5ɓo+2"❗?UovOF@rg+O'W8p 7Bx[!҉7oNHG5~c&TYҰ >! 3OZ1%^F $N`&0+\<:,-#|Ǯv=$dTKyчfA`7s1lo~jv+GqZ6Cc`ĩ?jz}rL g"mF4bo~/ qQ̾Ͼ}cIE 1ME $HD )TZ* DJ hU-%"Cy%q|q|{=É۟7oTKA-n@=|5v_"MK3z߯ _͆.z߈cGŚd|3-)5F9+9b>DeE9ĩCdABn>>@<9o{^`OTԾ[AE. 5kJ(7Z_}3v ~v7^ͣy3Q_~oW>oGgCrt 'k vG/s7VN)wv `T4BKrĨK9lL s4(40A|P~,*!g i۞OB2'SW]c@gC?WB3J͇7.{#N~KiZ@E\HWcGKscG~e<[6jJ@ TArN͘p,~L}Ra UTZ| B@G 2J-2}tv$zU <0cyb[&vUTп^eOR7NÅOms)%y[ݰ;c!L6C)KPN](1=ވUgO͖BUļ!nP㾀zA|S\d\m[4 zԉ-T5z޻/\I`+@Xdr$8p:Nx'*VB",nar14#z\䊪񇀚P./1b;+ $u3ZE?'wl?ot՜-^5kf4j/5|-qA|w]O~rfȦP 4ݡw ]t cqoY7~MFWtK\ҟ#L1i `w|tBk) J?,+AB5ާU @P@X#<oTOʾx-,S f#l׾b&~"H)~z(ߑ!-Ik% TX}%DS.>zh@j}ߴAuŠcA.]ƠlHgՏ?jmVYsЫ @PnoGQlTU! ۲8U&%jQHP>6o-!8/VkIENDB`netemul-1.0/images/fileload.png0000644000175000017500000003510711261455471015645 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxw$WuByv6f $d#AC2ƀq6`006 L02AaWvҮv9N{?'Otu9w D+xxxxxW౐͎.$cJ)H 1%1A DL)c,bs=]G[OS7p{9_LZĬDd`et0F1 }K__h1JQ!>TÈA!`l{uI 7m...Bd@ (1(+BEӖ=ɉ݃1A3(1?sTJv^;86ɓ[o[.@0Q,}RSZrYm912"JDDbE!&d>R(oAO>. sjB_DŽJ ?Z =O!ꪋ_Լ 33WAA$*[$ DOhUE(PFmKvK8u򽴸])WNx }ၳ\(?H=,Vԛg %#Ct;Q3ǎ|Nh~#/V;wc޸w#9]( 9t[rzͯv z -/*{n 8'XWTS)Jv7(Zt L܏BB#/37 gz'3N]OWSlq/ V"VFleu,gE_7Ks-]t/{%g>pԿ3}Bg~o?6}NI_*T=='zj'>5 [op# ":ocu.lvK{-krmnh5{ˎ#o_).[{ ;dOf[!F􁥶ʣ4,\ة%vgrzV+֜r\Ki%(0LUvKWׂQu|+JiTnḙMOs_R%T)柍 ܾk|Dɱ%c -J~#ki>?]P:v_65<*{rTkβ.eCSlu9:Ȅ|m'*J6^R[pWˡO8=R_f6 On1'M2q~jfzYI0SqV yV$W8RZ PdV/$\ Hĉ{{߼l2|Nb(J,kEkUN#onLcc-{pՖpOʘhnx}'Zʷo,F'&#!DBTmoox?giY"~\u_6.frKsVV;)\VA 1"&"}qLo^̻%^}{)9aUsgVdhmGPI[:c[FD ~V<-|aKk{j>X(+5#&Z[pjcpii ÷<ճr۝bomeʗHD*@o̹W39səS^|' XSWx"RvZq{.Ej0͡WW~@|e'0e- %{}) gF.Zw^?QNk40E?l[.)\e+zQDsC/`<|Z7ry)oi[9@M+K@ |.jy |8|jRÑ]?{[F3#"̜ LF IDNK")xkwKY$w,󖽢|O]qܭB5L<{VG\eӇ#KJN/1o?tZ-gEok( @~$A爀KS~6oPtY`$-ŜU9*XZiPuˤN4T'Ӥ{ G߱Te. Qvlu]E+=f)?pI43"eL|)E}Lbi HBOTHKk[ .]p,mY*\Иi$} i=u\%$k_΅դdXh!/:Z\Olmi1|!|I)?~u c> Qr`I}!p2 OHt8HKy9.wm-mkRd=|ɞ,9L'R05RPzRhD<^qvzhR1'J+-% RQbOH*N>G{Drէ_i2(Wr~plKKkciJ+MԕMz%NkS9|k߱hnp ,ѮZ[ݎv]K 7LڢEDBb7 "i[w% I# l?K)X J;\RF)vGi$}=M;@1ՙvU_X.W-t@ly)ZnV꺋9Hʏ))?"b""}B!u# i6kgA+v K+-h9ks1;7tܧeyAlIyQE{JV-gC)KKH\F{ۃ-Um&IRJAݒ>/~W׫dOAI*Y' *0È+GIgbkǧ}?ʒfq5YmT7x??md[YiZr[Nަ͔TꎛJUI)?gLOtxP\6~ZW;Ŷg;j_35,6Clq?>A뀏.PE`QߵnYNmK) #nd-*6K6nȹ9Ոh<[wL%94JIsirho|ߧZp|-+}_$CIC&MKO h+s:N+Tֺ-mRHzN?Uf EWx)+ e_蒳L}bvb}ߥ %{ ZY=|G6vJIo$}i&@&Gm.\|[<ūjѶS\~3~FNx֦R۠r7 " 2&L> K$h05>Qy: wm Y޶R=I]c^@: FkjE ޟB-sZ:x_=Xfh @AuL+@pUtؐ2S> 6 Jξ$Rx6K/&R=Vcj@sNpIr~0eװyrCݥbk'+A==d>ģ~y Fe;J_,!;J90G(OcW㣸n^}>oJTs2@<"7 윔_i:&ɇ-iQ;#=ב[w8]]]{=9Bpkއ'4rC3KI4I75rBחmqo7rB,YJY?#җ!Z6i;ګoO==PPo)yNU*K4(/VsYB2#r%2/"o P6VPmq*_j.-U "he~*&O H*7y@Pۊv0;n{"&۞ N܃+I\vKVu2Io)7L(h $MKٕgmcaNǶ+ PƠ3A2؝ȩZے}xhzꘆ&j3gͧ04" R4t([K3~6 )FSߏo~)u,>;V'dSQ#  hP*|KfR(m;K pG9}7GNbhe)ɞl 5,f8L<ܼCY?b%!Ԙ>r'u+;5hUf205d AMW?RHYxqI޽ L@0o (;?DFX=꾶B-!S)姻250ĘpPc~4/dVMevP}(:" .Inf3twY Rj"o G&L Ll@AmQ::{plEG)t\gɞL(?!#s7L^^p~^oD#;ԢMC,ǂ`j{oA¡cyp8$ @`0w-VO64审 MW<`V w (0lE@4hz.,+(3V_]'X7Q6QjL~ Q '޸vfoz~+BQ(1PH )c+X4KM]$57bWpnkU%)?I / _,A<1`%e\?>9CjԠrd:@GaۮCSKM4t0N,m #qzy唣 QHLhgd @/p **&@3-_:ѻ><^AlAȟP tc;l"}Vw{6p/+{ZZ+dO%#ED\I$mTfjLVU0 'SjxY]v0#E38^KEVbAan04JL0 #湭3xaU~~+cZgi9 T3AXdđju_[~R=b_tbg>&^!❲|`2oy 'f(D#UEGl*r~7RDƌs1Jk}5wނbwhMFVM>~_XSW=ziqW^~A:1doN`(o?̓9u6H_:K:JSɜy~%0]`t-֜d=}`~`:~zzPSkСAk "4F ~(ַ]ږ-l‘,FLEʳ`$ ա ~ёJqo! 49 V!r^͚-)ٓ&}sB=(|@<?qO0+1= f0PV"<@K}`i ;_8в!tu7xJhQ( wgz83@'CZpѹ6ɦ!gGR hU3m Z; 2u;Qu;2ɕL%zMyNQvc0=Pȑq]76cc;QF&JfYRrCsq38.LoXٗK-Z0ٓ!} DYOY2Ciҗf鸟-Bij 3!0mVE[l|hm-Γ=4r3>neo4ä k #Bt<óI_C Y t=ۿ!?հy(w`Qe,N{n>VM8<isі*I_dOc("V4ʠfɡ/,uaКЈ^=ЂoOF`Ț/5N\; d_ Ļ{5^d4P.I{LTvF9V+;&{2/%|ii@9,3+ACdsUZec,2螸Ǽ`Ws-D ~  ځ`Ux\rj֯wIqZnag.Hf~L FӝCCkLQ8܏QRs|״2ܿ/ 3BUg>APR^08"˷ën/ה5&{q06Z6~KN+S2KN=S(h?_Y;V l"۞{ 3k[z-zj?T>GSpz0#k}vK1LH_z֐]j=ucɐfq?Ec² ?AeA{oc=td~nf>++(]μ(zߢw9A,3/nhdƔ`-N]m$}s /QnGObnc^8_'*NpZ @ML5sCEwFwQɿ/c.eevo^& 9H;GU Ѝ]J)p?FVq_=޽cOmd)^GpJ^ڋЄ"b+SQ!;j;@G0 M5ZAAH|'ڌP,bz1>ZN<ێ<GlPSG_yVQP1ٓp퀝orO/Nsn2"o I sZք?FwqPcꁏbZ6d2_:~S?@k-(oB+sl:ڰmɱP>2mxCn5K$Ca8 EﱷW~(nAy3El8] <f dv;R?EԤ]/(<Q:Q@`^BC'` R%`RuWLz:h 6f&Phl!'`ǨCo"=xSI>([WqeFG<^<z-UP"ZL&#Cr>tsJ}"XG1U%I{-?}uB}56?ǐ=EX >ůpdQI23yLZs}K06~UqܗAuڒyws/ch=石bkvdXuQi6#yxOs|~D ^elgw:{;bρSZ/ _nzR/yZ T)|~ND) |%n>N|?{?{9O9〼o`[uzM-GD;١{O=/\bxGc*w,O 43d\ DR5KzHd39#vw]E ۾d>!E#@__/_~9mr]/G)U/\`Z(2nܸLYEs '%1@]hnq{;^[\QGF\} J*?ᆭS* Swi5N+)@)pO"Pܴ?/cSgZGW2~8r|ß[~x__~[ Pʙ^*={?30]e`NH txK{C姐LW-?8|*\ lDOgUw$Xd9Br;rNutÑS9uS?|Zɫ*}W}"BZ3ǏBdr(( ^ݶގˮ]hy1aş36|h8,/!ZYb i2\tѣԑ96}w;''G<% 01F^V;~Z'w;{qHk B 綜%ʲ20-]",O)RLnɮ=4 [S%ϳ/qlc 0iҗ~B 4i{2w7矩<e~7qAM}r$+^V'\&MJQiPS_E3rXl9/_z9Vuey:yB UnMxEOasRGBbKGD pHYs  tIME i ^IDATx]h[d6iezJZUT\Yԗ\|qѢ.*'V/n",E] XغVֶ($ۘmHjtr:sΜI"""""""""""""""""""""""""""""""" _ʁHkx<0 x:::zaЀܸqW^pK5kĻ!3n4> ̦g` b b b Oׯfz =qB!|>7nD]]IV :P]]@rRX ###Xf L&[k***:?u!@${ 㒩+%IQp8"Ebg$p86$E?BAQ}x#~ H%IZTHEJMMMR~0ogsxIZ*kK.ʕ+0Yvwwtڵk0Yʲ[WUCmEp8vطt$)iGMyy9t:]Bę3g{nڵ+c:;;c\ps݇&?6552QU=IMӮdUU, `$Iݔ:^\`c1yFKK Z[[Ӄ7o@BEcҥhjj•+W :-eee$GߏǏchhdzZ6UU!TUmt[nM@jD+ aѢEp\jٽ@KK ~?TUA8Fm;+1<O۷xIƿSU޽+󡺺۷oOR6~nj8pLHx>FQ" !H@cǎh4AhvqԱCNz=!<2qBe444d2OL=Y Ne˖l; &NhH L&LBL$Yjh L&rD&50`0p8- 2?fN؉ӗE]| TWۋI1xYL&e9g 4n[Qjs! 튢@fjUi3XdIε? p:3Kl6CQq=ğ>`6b @$ɫTgSYl a8\.z=l6,XPt2sB^pE{`0XOP[[OjahFA2ʕ+= 'n*XbE?Ub߿@MMM aXRسgOѷ߼yшs7,`Ý;wٙqWޞbCqHQ~X֢{:n߾sHu,5n ex%^~ (x~>3a< cUn7RJf9MIaCs&_()|w>sy_͛g.J76ዼHu 1Bœ,$;u1*XUfip\A tk>OT+?P\ ??_ff摖s<{}ܸS@qq|H6-\f^JA(˔$(O)rQOte27/j}}}YK0ɲ[7*Ӂ;_ q-pl hooxp[Yz$=YWR }9 ߠ0*:w/M2B %P9@GGG@&z1i"::U=L7tMhGsu/Y"mn)E %%EvbZgYTv0arP61mVŭ~*-w!~dgѼ]dLN@~(7sqGCl6zBG-HJJ"oS&I!DhD5HLNc:LXPDHwoT0FC ~}~k_; JLr='1-5*+kf##GFAqJtgFe?*0guo Jun"&08L5n쉤 "| IO׃7 S4>^jZ<#UUUB~9A猪1gXeHA* rz9 ;Fk:SL^1%&4STIPm6#"⸅NÜHL@ћ1r]"7B4 CRnvqoAD4><IENDB`netemul-1.0/images/interface.png0000644000175000017500000016176111226640740016030 0ustar frostfrostPNG  IHDR\rf IDATx[mKz1Ƽ>v\Lwb nHbG& '$_)({^p0!E HQ,EV"K vv7}{]mQU_jc͵>>Zskk}:Ёt@:Ёt@:Ёt@:Ёt@:Ёt@:Ёt@:Ёt@:Ёt@:Ёt@:Ёt@:Ёt@:Ёt@:Ёt@:Ёt@:Ёt@:Ёt@:Ёt@:Ёt@:Ёt@:Ёt@:Ч݀}!/|;M8'(mVoj||t||~v⢭F#Y.rW |J(׵8΁cJUZ1Dwрl]_ݺ})kh_޹gl6(˲}L?u3:Bl6;Um[c t(@k6,A)& PM۶#׵Ruݢ(#h{"ֶs94O! EQbZk޽V+fe\m-(R 5m0hpa)MYb}E {.J=ED~7m>UZ"RMSH ?':w)SH *S/A) mx)oŔ{/Ř"%WmV 5(0Z `Ja^R?  5 ܦ0JSUse3/Cgckm/nݺcO4I3S/)cΦ֣'j̝ۊg/>SNO9>>hF)((65Ex@Q#P 0,'J IbUkKDZk/<νisٛeUm/̋=tO!iZt Z\na+q-UQ3o0b:>r)JfSN5^ (&1eUQzeŀxG5QZRHcL0SJ̀/q궮ϛW߶y4N9N r4"{~~.,)$kUUMQ D4<}cLpްi 66VіA{*& jtLFKӚ;S^{^{b63TLш@(ZP7-Y 0J)0O&~D)1Mz,|s2~_~KDW 6mYUٙ? >7_+&fni_y5'"w>L?(,ˆHJ#y A g 2ThPU^ dݖ%4kF{,f㖓#1{i|ӓŔbb6a:bhJi6V!G^G{@%D,UUU*n?|QkM۶4M:b&J}}W7yҶzj2gV_'$>`ϼ0iۛ+mwfz~❻sZx't=9 cm'KpgPc@Q04(nܥCh jPtqEiLFɤe>~bqBs#X̷hF#ƣ)EUR# {xqcmZG( ʲ@C)Re܏5M0LyCDY3Ԍʚib60 xQrb2)9OFBCQUgF!)p^:Az\:Ndb3(3UJQJ}>B9"B݊O*L&"7LQȣfl^5uҗ<uY]sюd(xh ZCiM5̌3egt'Rxkf-olV~Y]߫M'''?Ƿ?}M6>6'Oq~Yd| HdlKwC=B̉h^(8E"U`a<q˚~nbs6+r^[ܪ?uMƢ4qaTlX9ˆa>.J3ON]&m5xV{рJp|̿LJ)5VJz5ifu]#ޣjqtDSgo曈jZSѬd:)shʲ( LQ=x IƛG tN47Ckh4b `䧀.(㓓z^>z٣/1|??՛S MQc 1fhx /&w:}̂:菱k%vlJ GJRW! hsjδn(_٢!}[ྈu|r;ژg+ȏ|/VY5( ϳK֛.?G})M,n4 a2>`<QJ 8օƂXM4 @Q'4gi=U\dC%+ՊgT>g[|}tvdP(GLgR:Ek-FUJ=|{;ֹo,UoEz^Jx4iL%IH:;=e4P邢*0( 6Tm\Embŏ?~_?c?{J(e i55_<_45-ڬ1ja)ZƣKyt=N* 拊#a1sLkGg12NLLF2.a ئa^ 4Pvʸ/#wUxTRzn5UL_[V˷ٹ[oX<m 9hh,CEXֶYl(_S #I,8+Ka>#t8NJ.u٬l66Mg*<}RJoٟUƘ_eؐl+<9Zl@hj#hhUxDS@2-Uyɨ|Qsz9{Ύ5vW^=c1+9:2L'9GGw½ ܶVKJ @@!ȴBģ=C?&%(i痎'O[=η}\X uKH"LWK녦[z6]N!42pȵtL/a8N4dnM[|SZ{&jiҶ-vŵ5b7`W8۠]~?g~safffke7{?πQ:URA\㣠i|>(c$l5OTt^)P6J6^%fiT5K6؊[xczKa6TfIU^1,Zg[N-gNJwƼ)G%bќtl8ڃ> 9%]#d#{\$EAUUhL3C@[״ 4τ+~_(_xu&V|ߎuj㜅[$ =  1.| "t6NiɾGS{hp;!iE3kӴmɦR7b> ?xx/I7mۋmaw͸'oگRD @(EՊ:0ޡ4G@H ߕ霁.3PG +ka[ͧt[ 0krͤL S8)N yi|b9{T3 :EY1*hS">`*M-KhJ)`2=/XlvDXmA[xƛSų x~YmJagp+:S;ɿ݀NIpC--|k@?su [ zk]¹Rt{dGw4{^~7; )4Ϟ?c)6$ZǬ7e@FTA ^(.֚T$ǢUKY4QdZ-8;zīwrDsΈ)'' |Lr q.qΓ^rosdv Zwth g'c-"8U4rɊ5{AU,[Z24>}df1[r4`1{ƴjX[Sb>b12VL'3  5J+ćaZ1 >H$#mۧIVQE[CA%&gjjgXm*h+lQQUdQ зok"51օoqH:*D;fU m l{IE۸ AJ7˿|z|t4t) v{JIz{,2_DNz*%)bf4SE93ԅ- fY_SKJ]3*dTYca> QSUqݡ, e (J)i6KD7T2({xbYg^$[jAk\^\MbU"]](LګےuP"c_{(wt4T Q4-Q`_/KpQu.2Ͱ{d'n6޾s]Qv Z*!-ܜqpX3 hƕSܔƞtquM -+Kb55ZՌ̒:. #yՠ[ow$B]<{z?Yj/t)'xQ:ټ_|Z]ߖKxl趿?gŘBvE]SiYEpT$~SS)"ءJ}˓K =WUFM€ l&KGђH!)a6x m3iϨ`-maFVԃK*uڒQib2,¨R|'S2D&EUP%,P79s"u'H?ߖ%wmO@ 8T_5yՄS30%rMFOږq-/aJl@F \4]?i˫+~`YU(R%ϟx.ߴg_IM ̮{mQ)M l˔rX xc^8'N-oj°żT+*0q3h9:3.(BcQ5a4 mBe]^OH-d!Qܻwoo|GZ^~ݫK+VU!EE9V?NhSZbL4%{pɎ;wzQUY2F1E1'Osq9Adq3mcu%%)kCdorWAϧp<ةN*)5EP6S6FccӸ6;B=+<7RqfRixG*WtBUM̏Ѧ9;N 4Zt&PZ.oeo}v̻c5=/*yzũ. ӈp1EjO#(['hJs:h۔ҙ? >,f&1E{ʢ٘`sNvX.boG9 cP, PXo(1<ӭh˒V"Mo3r(zaZEcàn,4gclSfyrζ#0s&ʧȾSz/x'X+ԍд"b4s\wOSbEb> ~ln&Lq-A4WXWa4JeXqsZ}ḳ^af֔FfT>b1{B ӱhV1nj'#N„-Sb]%}NfC4gxxw]ߩ"S*{;Yd saJ ;:a IDATrQ=XVl6.Ѿt#Ҙ/.Y)*[|)=e'35]YlzqYu/! nb Ƴ6[a[+U4ϕgBdcyl̲{(\0d> ^c}uN3wq5s5C@cxӥH7`lJ`0am3rE˛4| CfPH%2.;":EœMXn d -^yeNz{vmNBܵ3댽]*׿v@m#OC.a\]]r)|~"!/ HEH͇oΜ{xa'/S<(ߗiNM.Ap^:Xo=WKU̓oIǙx# zYV{': }ܺ+\sv|"]ˆiam*Ot>T46C)iHPaȭ'ET'Sap& /ව_4~f1揘@2s..5x2]vmsv,^!;r񘋅4]Bky߆B뭄ΣQ` ߴ=^@:L؃' O`qt&q{`B1jMBR HjVUPH"SPz]Hu@T6b}z0U Z]Dif3vjjFkc@Y`\κ{{{ <8F_t!M~4-l|:jJ]tEQ d++hbE7"0zK4JBQ2$GU&e˭#LQtvtN~\SaӼH_vT|0LsRa'w ՀҨ6Mɒ/F8$e&Jk}G [(=8zԉe7,:ss^yf1 G eX֞F\+y𹚙 &ս}N1ws}l_پ2FBYqcZH'!5MӅs2Ÿc]3zM9bRPET"()ӂkqCUVԔ0! aο_VU5R"`9lis?4~Ǧm€ IKnImnb=8_^U9orMdj/0/v} 3JQVKfF϶V}`5?lzL&-zAyvnpsryvjU״ Ä)*B ڳܨ ,2 =w{;iOJ bv/ðXj}]I@%T2y ^v`g[k{9*r֭3샡׃czKSc\ ]QXbXu]k \[ V֟ʐ(⹸t@1 7%Li;epC~A{zf@օʹۭ LҀѓZwgT:Lݣ<]ܞk߀R;.\ds>1q=U3i]bitПD?۰qdh_3*,N,wv{9|Z?PE 51\^\\9(4Rc dZ׍bG:ǽ`_bt\Q 39Vf+ljnBQS( j k{|V1zcPSԳSD%$MK+ӕRaQ=']1#UAd9uatMERzuBfq-,MZ5D{t_m-MknO>0iz빼l oWN^^jM'.r $[I7];}T7gҬV!30QA d9hB۞,tT20 |bim~}z꿏r4(ˊ&$YL@$U},P-6t׵0+,8I|䂣Z/ {_EA? ަz_L 6?{<,e Ycky#uψ 2wf8v!dxDmD#hbVfioa`3 ۿtޡϺa߮% z˙ Q5M[r] =/h\n;i*iWɛjJ=?fGO3"[&>A+Ǐk8kNzxw}1M?<{Yk -( hd8>1{UKFO{Cd@'dp|ܞ۝c3I@mCvXXxXHlVz,e`_/&b2<>iͽ~,:l`DOJOۗ$$jWh.LF%m9%*u+ _ j?}{79z[3`41L 4˕L$2&O#sKt j'`{\,qlXo4Wa6і?/m-٦COT nhWw^~Nwa>gTGI H:Aft~6lna* , + OO;\/ z'f-90p{d#X/\ʳ%M駫Pzvtm|HVNs{k ϠMK;&J1N4MZN8OBIp#縦)+}[%i1ً޸ }$Oy7c"Q 9-ޏb>,4Qq@׸ne3N2*i9{=S!9]mL f@U@qv׾ )]xyw n\z,Zҝ {x]VbF,Ο ^77jy$FN*68_GMLz_Q7SVfb]tv*g?v޾cӶ0zאGn{>mXoMXQUf*/51=%DM14TSɺlXz]@&tZ% 5md#d tD뜦nCjBF` v$Eไ^zW6Ќ m{uC γ[č"Ccb7 ;JŋЕuO[ݵ;BSvAv ib)]ص! nQN%J\} u}K>{:TWy6Ԝ/ FwqhEEKc^UbH|bAs$;'MBOz#g!常{¾~~dO%Q';w&$뚺Sj*<m'GP(%CBg)`7P/JX,q^şΑ9'P GZà~a,"g w69UX߮(5e#`b6 څa P _I|V!<0$!9*M"[DpSfضs*L #}ׯ'01́fЩO* e'6+gj4aVyt9owu4``oPTl#תBQ.9O"77!;4أG5e Ӏz}ޫ&Ajf1}-no6mZ+yK6,(TO5'#N5k}6=R2.Jv$1W;*\Qa ڳ(V`ԍabw%rV/ nb -x<<ƹ6˻.G9쿴I@ɖB(mv5WWW~"LJ*d3 rY{A*1ץK^ִvg"Z6MLSMАz[y?knxl2T1UkeXK <5HʢgݳaǨ QQOGP!-8 n56v-R\3/DHv~O`/YkR(3ҜzkAKC-7Drٳ0'!ϕ4dl'to`Tfu K_N+Y7UJt /snsZOL/c +>ڂQ*|F)s`L f563n Yc<5gṕAa_ !աRVلCZ(Ӡ2`.,L$_3v36KoMg.R.Y_ǏZQc=Sm9;[tU@rr$.Z@7+.,z$Z0Es x!]tw ʮ:HA$K>qqɓ'5뺳0ww>p&{ZIGfLΏсMf6 ^m46[Ͷ(Ase<mioQ 72iji"n}^KkvKP (N'&NE5Zګ߻n F~{A%ad~v[*ғ=OL*>zÝ<&K.Ub`G.ثZ1+fx|?j'isN&z|@?"vpA8uX0i$ShrrwP'>˻R$ ͬ'w ͦc4vL4.`f ͙=L4pzwmҶ->&J+edy4D8ZQ'mӢ(E)s%^R7 Q8>*X4 m&cp=8n(38Ci?Y;ұ[6cS 5UPd턒HuWpoN:yk^\=-Cb$E},l>jvɖ̩yԮdfA+t%2 `{^IoqNXۅnN&kV}[Yv[=r0E6 0@1|>3\]մ Z@P%&O)` D Z@w"1z6M8 6ƳުhVk(I{=]6`nyEJ7 "A̭ LGXoB9=4+ qQg@hWq!δ\P1j# S6,jTdivod > cjGeQqeLe@uL JCאLF e⧈iv)c=ѕ3tLw/|K@Jg~ '֙0/`kM 2F(W'T)]A1)U3KA_%\~s!uѾ{&D${AZk(H| .1(o ٥.+zu>zhmMq"(dpv YF Q^;wȫ)_4eT\.:*p` &J+(Gż)$F tﮧ9{a}!>&i6M fQk]zɈe *PuC975ڒ`Y.ӄ>msD<+x /"l6k!@Ϩj f@&ϰ^P|HF_JO۶a rpA19{]@aTׅൠHI7"Xy~^qfX''aN'iC]AvdXA\;&T4q@jflkEk5U"̒;[+zl$L_mwlw9*Ev?UV(Ԛq_Vij0cuG=AEHZRxK/FG`rzsr|Dkjiۖv;|Eu}(&Wc?1Z4QQ \J(Է"xʂŬd>+9hح(@o`e mLhA u4'(Ku{r ԭfBe0N(dtDn8I94y/68(٢{1 Xj!>N -E ?r:|~?xp>jXojbf2TS-ACwWcx5)%8X <-E~`Le5W-k`@TTH@caN㐨GIɦƜ,?.8 W9ɖ}zT|2( R;p %2.,ֶk IDAT/`40sm $HJyY;FCrct0"Pu4\G sG`|ahE@w{Ow.&j'y}.48&X4BS)M\1HE.l"*9IJJKOR)Oϴ?iMz5q:m ~21$7$ 9i s8$?@(oMTJSpԬۯqn&t$dYt -kp놳 mvj> Bdw_ݳFr|)58{.J1ymVh:i` .pzNj~?0?vKA`LPDxpl^W,K)A /tIRL%GeK#DQ yn^bj\֋*xe$.̷M<;W=u4q*R$toi)QU d @|x%^NT)E6$*ĐRB`bhO5\D*lZ2VqNN71>6rXoaÅDFߝvDzV)T1d@vzRusQ!%V#urժA~ߐD/2lO^JKo;O(km7Y۔ i 9u3پIzsꩮq=ilF%?P<_†mmͽ;cFmlg.[{: n^Z{4"i1aZ5pQBH<" ,P2l>+j}V$7g ;e%ɊK $z%s-dbeD'̓5;~3   AAhhő%[THYK,JJ*6)UVDYdEmdNU\DȢKI%23,omvݧo{ҷ9d7-CN@J?EY)G&NYQz= ,=dWLd8EK*-yTS4w kW$|$25h-gZ47@1?WX#8Tnkh4YP`8i4 P|QNw$tK*l 9~6w]霛֜j:qs-,@D縁XMpß2_80[ XqFm =  )5\\"uuP蓚|ii qIi14*|^[D:mZܖq|D[!v<lB1XloJH0yt#[wsS.AP`݀"ec=TD {o!) /ȴ:=3Z7 fp½U83t}i0,h˫& '?Fn@3TS=Q@)Z>ؗmID:=݃FáE=H 8+ΖO95hCtpvzBqOCޤ4U8 F 5aOe;yT  G4Djڝnx=jB@X2 FPTciDĹ \quO)cL!Ua(/`>.]/?ԣ*TK08t Z0k@|" 0`;C)Tb}));Zs:xKbLG_Kb܁`CB+1J,s-X6Sj ANCrX.R<-ABIWs*<].dO^Hf8Bj's2;Ec8a ˤ\g!iw v6fVޖgY-ٳ+i^!ό@aLԞ&Ba86(a0FyYn \!BRݟS& T3ň(jAx`L,ʉEYj ݔ05RNH/p?l2Bq޾ԚTw-DIgWexl3}ї 5XsZn |X @k5aIK_w^w Ndf ǂ?$BeX]UOkc 5֭-(gOVEuANf*E@<%>I/ ߙlX@5#<:X_D;!x(0C -DgRk0 j³b`CY۳RR+UFc8oQW;TBĭJMab,PUkKSS_\G)\iȻF@{Kt(D}(ET~ YΆB3Xk}娆N:~Q'hAP_ ~x$ n@<Q `%9 ihoT( 3@ oKSQƣFjH c؄т֬WPC_xlTƹL%d2 m㑏lg|)W0_ E&HȅMiC-|ğDB`lnI^z"K.U"E?AQmj$Ύ#u:I=|.Pdg(R#uEy{U 5'!}@)PKYv`gLrO)d>5{p[lpkÐ*`Y$SiA8S5ԀO`6L(+Ʉ$^"J|XD0*$&E1g1w<ыDzm^OpaypcF66JZMB> aD^g, t0x& q@> d R>q.D"v rIBWKzE}&T vX cT?0Yĭ]PNO"OuIjT31ET r5~bY1 Z!V$(E巍03ĄRA3QEJ߿.xa?gt:~}JP*ҺƮ Xڮƽmz pLXۨ_|p{Awd]r!ě@QhdA)/"9(tydLRbgK yEX,Rҡ,j M V)ٯZFP77̢>ϵo*4sx*pp0E6 0)-eYFFјm@At{ZOM% ]9a,'wb2 Dlo*7:}_|>,Zv0$9Y1H+HxOaF.!1%>9ht. PΧDS\M_+HS|9݂/nWlG5}*oa O{I ջaXj\.ip p"Y{ eTLq0`(W&CUY`rR)|f@LSqgC׃{,~s?5oHkY(Man2v|fxftW j&;2L.Ovr0XcT$؄Sxnód1CED oftDމ~PPh3F5:eRR~ag½V|큺N`dJݙa( hڅsYcqN\*m` v'ݎ{h[^^nhG<6 DcFQ3D4@3± R=Êb9j߄'#tZR: OfqĨH$3GV-XRčJ-9QEB_PKjAXBn\J5CDdWF01`g"›?,#I! rZUI !p&]=PHU$>Dvo~#mmm hfFՂq/` J'-B=W@AݎeB@@@d0Wa y Cj{0Ơ4RʝG.nR~NU$&RMDė DbL&A-Mt.ƧOJ A"rfFe(UagHkBd8AoTxY0nfTU.a~s>AkA~KhX;Me0Uu4v֡ncss+l)P %6ezӆ:xf@Mž&tKPAA~Q}`qrBXYI ni@TyfH\QاHnU WyqW]S)*ut$`MwB[^+R A1z`d0`L|)# L),Xy7 %L> ͠KƼEñCťKuMJް 4)H@`Hy/Æ c<'aJ!qz'#LOSyH GJRM,qX/ӔRpb$/"HjLcy5˧jB+#X[KO2Od}}o^{Nd$ S"Wh1&nF(0"7)8#{wwD2QuYsomL03 edS|CO' g\Q nZ.E_cBPS! o?D2,€l,ĒQbL/1PAhs5޹qc42릃RNaW]G?;=X஥̣2[#F@eK J F.`ÐqNBk la-]B_3)(v&u\ Xc4p:~U" #nC |Z+Ĥ5;}XԐ2`A CRb=Ҷj@)`^]2.quJ^aAȇ6A jק arB^o/aL&Z-BQ(0WXGZi:7,\ $So[:M" G;P{UbQcuU( `ipM%iM]vJ\+++#dsa]33`hHqxFw('a;6^XgGYK 7:?c0Eπ/+0h~Xe}P<PͽB Qm"DUG%RE{&b/А$qM7y5_X\(UuRctJ1֎$w1 ҩP|1&c<ȡ@Y:ƔRF\eHy IDATqA@mdGVծ}W2܁5e0+ɱGe4KF0LT'0;Ha*Mc`Ë&#"B,Zc8^ &zp* S6SSLy@ؤ@>.q6G4ؚ`H b)-ճ24>L&3ƖW I!R]RH_B]^ Tc Z+ `- :.\5ʲtb} V|50۵[KoCa{{.r+,VE(R/z8FP*k帋k!U%@@KӧHdA%%HWUQ}X%pnB-֡!fp%sꥵ9.@O;;c30:n1>BMS+2wyi \H)UU]R `7n܊Tu7zl9옉99"˰ Dl-@P)mĂ-jb4R'n wqb DSM`/u z h'SE[_[1yz J6EFa Jǥ^ߡ? 6$Fq <5Yd2'.6v10DFcd<.U)gaL;ssl8&v䙯ku&7=,RNr^VHz5shtZ8w26Xe0vL ZZFi4,{}xjXdx" ` 䞩Pp[X`cxMX*pq#a'x;Ԕq@~Ȱ\X1waBe fg-@jb4VkQ%J% 5[e wqlIB?ȧɄ8LY0OHkZ&  z JD}ǮVUk}&jepqQ"BE;n4.Hk|oJS̀OλR%ڧ4B{`8@X4iŖ_ʬ2S{CUouP}&3Ha AD<7"`}UDS@S(k+0n@=x\SJŝu%o1xO}u_r8wjL]#퀪vv򌘔 s24f@#%Pd,SO>k^k4`H|,;YkL(wE1)1iF[M&`)tM6DYs3y_Ot`2JR#Og)S8a W8"TUɱΨэJdsOZO]Ҝ}G͏?| cx_j^h0` @; ބMtLU$ڿ;C"c=I)B!'tB~3s^:p+h9("dY ƨJŀ쥳1HFğk~J[Nj/ߧ{5Kuߩx~+Db>F!%>|Z4a.X"9 k!TP1 .0W!Nh466X[{WQ 0?݋ x{[;s<.Npiq~v]l8 0i Eȕz" v Y[2PnRp0p1k^0/tرC,yv*X[ui𻼪 iI_}-~^2v-& Rj8 ɯ tv~`+ :ܡ_jTMaH{>a\k!afz@Q'[2cCݏu PjMkPFNu[t L ;fVDdDD( lnnߵI%.rqzK_z@8:VW9Rhw:fgf137ƻNVL|p 9{@BLQĶ`Q#5c,UC$6!pz Jk@t@҇JB\7j*qn7Nk(Ϥ\P]Y} MiwJu7QUAf)ѸPZ5ynm2@)bjY˩U 1kPSbccy#2OMuo5\%WUDɣ,+i7Մ??7)˻nF;ln1sǐ 3XZZ=w70X8=7mPasMc{a0`sjUP058xԐR4Cd$H\ D6jd^Ks!'DZh'C\8>ƂAP$1"%X(Q#F>@߁4ܝ4$s Zt;ZAY`"f^:u鹹w*Roٙv":Ȋ"LCZ03ZZv(ZŔӉHh蓯;(yբ,O=3nݰfkeK "?㻝si+^ eo@V` ._'B,}Ae^Oީɳ8:gƅe`e#nV'pW\gɢOFoU3ɹ >}/;)bAYEhz -kTŽI'j;|P.'$OGXcp-v3?e)I@W~c)|#?0>nwnf28tt+gQ-Hp/y"/@= ނBEyKu k?^\\Ǐ˓'OzhW5n_K[A0dGBfkm(:  P ; X iLL}||ڝ&xyxa>0vY 4h1cdqXFMJ*$h p_`k<) oba3[QH0#ihP/?J=)[ )II(bY.i.+;~'C᢮=m %H>.O~|)G>Zg3k[S_X=wRf܄0 |fi7zJЋh(RC̬.Yk_ſ^YY%T^gm{Wj~ϹAݺ =`ۏc*'EW-y$;/ȲEQaaq>GymF!7ꫫ82Ξ^=W`cXR2 [Z- 3}xpO™Z Ÿ&eF@5wKʤ;QN}%ˆ=B{8Nˆ=QHQNǦbd,fjL('L@HGAnkS܁{~3+3y,;h<::??P{QU-#-GpeYRMDz[rfklPS y8|mY hqī8q,;~>?vn4%rx؁G \cNAH;MՂK@P Q9d:G >‹^Qa`"AP$.8o#"M)p@U:^So"Z u5عjZx /BKy^n/{Ҿ,..< ?  `*V&ʋB\": ܟ_忿^eקzoQhDeL7{lwC(7dFX4]!g%Z'/~YLcG"M1!$G*+oSxsx˯Kc\\ia=V lȖ7>̎O)[5}!b (*o m՗^$1 ZjӇ YIJ㮢k0W8㐷,-R vh&m.//bUF)}/TrJB [(>gǩV6d'x.肙+gqJ)g>}迼B'Vi駟V< ;vЇ>o]o=tۭp0ʘhOßgo -^7<&p?D}βq~(YKD YԽn@~{HcABe V ~3>fg{ڡp0dX0ɗ.-/㑇~>& Ꮩ133xǏGeL$Ї~Mc/>iv7}o{#=C[Oӟ?Osn|=IO|@v~*8kPBQ!A$i&ҩ"2/ҽj43}Pc9`ʲ N XXwan(K3[8q`ŅGuj* Q0ȫ'[h5W:"ĝD;04wZh`j|#pFob~7ߡd2S!"zz9V"zR(!F׏ A$ kGđ2I@I2 ]@m)kUZG1M}^~B ݋`(,_6qMzngN+ot]u`FՀ5pmr hp0 6p<'_CY+o AL _M1Wow gڊ ow(Mܷ >Z˾\q pћٻ@M[\dr~_o.pׂ\s??*l8.wv- z"z[sDž@*jYk eS`~{TJ<$ AuJK ?|FfAlk_I1&x|u<3,fPtffuVկ%N`{@ y+(F`+5W|%&?1xNNj,Ž?~Pd|E? @a|.l=5o'?uuܮ{uikע$Zay3ZoZsf}f,vE  Seo LՊ(Zzff033yg11]o8|<3+{ަPh股0ALi xҝvb0 k-Ôy̏am$(>Rk IDAT^}YffZ:'?p?|߱,}bg_E,ڶÿ3+Y 6!oZιu( (/L!aJ)^jnC%513Ң 12jEPNL ln.\\/ aP5uPAi&&`M 7ӇvSH%{hCaqRW\e OڒRL{fi߾/?\|-Fׅ z ~ƿ_ZE..y*@ v e(LB\ (h O>水4} .M&:u^sx\eMV'ҁ/S?G;tAA_zp񌔉EVjc~9 #JD4ODsZŻ ۢ\EæD9F&a3`0Kxh{8p`>| ߋIp ӗj3/u!-G z yD[Z dSMZ|p:VZk 8]t63=<0v{Wז\zM9io$if׍n]kztgY:ޮz{sĒu`툨ü-Ck(To`mmǏ4=,.cq=}xmsڠP>llYA^ZZ±c\UUR  d w;XXʴ*ayӶ7p87Nm4/~~_0p|a=p]{[fg7b2X7_h<5O oXiCƚ 3\ (r;"]K}gx#m|QMf9\2x 6t"c%B6P#, N({ 2q~3sv WAovG aw xZ$:(o|?z9v.Ed2A9)C#n SjU"_OhG$W!-X%`w(QHQ H^itZlH"XgfxSYm[yfg;Ntߎ0@W'n1'L ej<sssw=?{nvqc2Z@4dY +-y 4t벁6T]V[~\-܏$*ӗ(N8 B`A3ɓ9N_q?mb7hu-z'2vv:Ոh2kFk1ᤊЖL ?~VUEj `_^?SRZXXȿ;чzzsn"B 휋e1 50:NKE0CcNT=tyQ`4:x hf0b'[[CKuX}כI)  !;^ESϣ~yӈxc<V^׾\jc:ۿ}-oyc7.nb,\ς);119 *@܁:?E1(@JAtsm}:VN(pYct:]nsX,oln2K=/t:jk}7G{]_b-;xoGa#~%IYi:w=2{| }Ft sE&B{k͵q(:裏رc~/^DdNs{o?{OtpFk3Bvpݓ6ЃfzA,Kzwb"1؆*Iۘ%& G~j缑*{!://~~~}QwC!Q,cll F c6,:S #x T0kvcUQ51jFKK5MӨqAÙ3g*D'NLS?nomL+]@㞲§lpǭb_|'6h2X{Sc>|ZDtWLYykOFcm{mon/I{}X\iBoho*1j4?}酵Bv :ߍ[~܏}`f'Ea7wW! B0uQO J+0??uiؿ:|!}={R/^ZۿO?icBe'j!Zh`\ags?870펵`p2ƥ:: aDDk,yNptsn=i$v|/.!L1Z{۷~?G? &{/@~twʼ}H=x袀cx+x.͟5ne|5 . o|^~l+Kϩ*K,n $A$Ef&SR d MTr0:N˲X>"ȝn 6 K,̴Mug|s;W~8ߠӷ|s)8gϞxvջȚ.ڥw|sG;ӍShxܡGqPgt 9O_rC^cv.; ,Ț2+H²/Av}u_s6?;vl-:vJ28"?\Ol.g~Գsn3Ʒu߾}tr-3,'ts^s v V V.d}QÓS ZG?y/ 0^@E е!xn(/G( &+pC4\Zؿ|5LMvZN&i؄@&jAvἇ(K<4ƄI={lb˿w0ǟ5|U`O}_?_ͣf?:n.o ^X"$%؍nCɉ(RUMTժ"hUj1jKC b ! `"0HՇs< o˹~x{t`.h2]!3OgiɃO?xIv@mWyӏPg羇.&ZbC,b UF ABp@PKᣆגW Q{D6K@p>ϊW~?=fxzLT34)SPDMiݝ)i7lyemnmdc4>ĖX]]s2cٳg>گ;֊ Wgffqb~72DDey( ؋uv۵+|a#(ZZ~ KVA)A""2Zjs9:OyQ`SacŇ-5m&['֙AkC. X(O`*4Ig8m7X^Z>w;koz$c=F"^"_/gO%'I=Bt lH6r #Ĵ۠Q[K %8^gNA*G 1/ A0>x7ޔ{lP"ІlڪTՆJDDLaU岶" zYQ8ɇGgֳ$曮}^z+FַXEWO<.&ńzkrWO?^;܋-cU'Ͻ劃^vW|J>JL b&&}dW̓Ϝ[oU(@Ս,2LbDBd W`+B ,U F#XDLOynA>@;#igs `6]0Ǯ;Vu Y?'='N/ZOް5Pz6?~/F]3 nvvJ0|CWɉ}3yEz2PHْBJ;k+GzMGB^BmJsq?A A^u7Zr3% Q4hQ 4QkUaU 7N|}?$kc^W4?p~?x﷪sre sbb88ԗ0?}/ڸG#>p׽oy ;va@`V0Di3g׿ZEƕϪC;,%@XM0" LiR$Ek% eKD+2DPP^xP|Y$H+9rfrPmOe߯ږ$hJyY>{M=qX SW?qϾ==q׃{eU~~7~-?g_Dႇ ANL)H@Շ]V[%:\Ew2Z@AĔ^ŰT3 &o_9:{tsvPmqZ"PE&QUD  [=q'o?TmNfYX-";Ǐ] #i-btJ<ձחq g/ڸ`.>"$ t9"#T8O̤*F{TCM-B AcXP5RUDlj82%0U!h]o9h0 04hmݧo9{2`b$BH A%c۱/^POBAkMOgu{^=L-&'˖\;qO0||m8QUjwƁ||3KҝҾd_ DK@mUnm%uPQkJ͏ȗ@W ] T=Vx{'++9w{[6"RwfL4ϰuj fd`؍@@P2`l2Ԫ K.Q e~{Fb}cpZ _Хz֦Z^u{x[gWZm;ޗ~HJ:_1!FW_ בGWyWRDPXGGB0̘leСSsX9uOlZk:L Pb b|< b"2>?ܘwW0^%Pu9vv|1@%TROc_t_ g*)_<6,Yc3)`f5#_^Lƪ5F @M"B$ @#T Dp>5A;-Q׋pV7[I,Mj@g?Muc9~nS'aUϠI,PC *-DV>2f Kh2eITvQc@ V1簹III_1-L5c IDAT3\wN=[a7c$@Odcf/uSJaבkS9ZEJР )͈~  iK 6q&_#AlB+ȘU#_xGANJijٲ`{{OSK xMNj;vϳ7پ* p!8a᲍pv)Xc5'[>}Yܢc^[k1l`-٪MX"eXIAP&* |>HU7}b07'Olй%oT!:ڻ^p|HƴmD!V=  p(f%XSFF )!1L J)o)C 䱑8HȠam"YX-dE8 ILH ]boa5lc[EرѹR B ~-#^~G_F/pi`o0k @AYxײlU1AE~DiJiP{yw=p=wo`WKh4p8Kj 7=j/)@G &vkq^~̲a hyf8XSc\bcOq4gϜ v'd͖1Db ;jPaO9M$C^PzeHd$#&rDfq/ 262 ٴnCyJW?l}Xm| ] rx ԡK9(0C_ }p(L@^P @A( @n*`Xф00Б(1`% 5#)\'0-MXng5,*X[𹏀PoWPRhF(L8mUj$: lo/>}oݷ(~~8zȉ5?7kV Ƅ/10|ǹx1VP}g1Uaʻa+p0952{a' =9zWf(1Djc>ÌlPQ=6alFP5El"YcZC!tp lc1l!U= wn>sg 69\6P),<}¡ (ok-:AP *LO&; eE 8 8E]| #)楅ank2W C,qvk~+J U`w_}(@<&%$Iz.bM($c & QLON%ЮwT;Mw:=}ĎgN~ *B5MKKu[ZE >ydإKVZ…@PPWw>tsC-xU q qZ !V1dQkY(Յ`Aِ1&03yk)Y5P2fI]VAp 2ky@zcbC8x|A!A!% )+'`%{vyŴPOp!KIaJb2lvA-AQ01DH)<}@` LE!D.|4#֚LHwQyjlMUn ti9'&5YȌX{ h9pkE)ȬESM-JѢYjc;Ai-j@T<(Cm":XE[b (Jpc66ǔI&Y 1( 1DbY-v,sR>efVB0P@MLLؤ D*[:0Vs3"uأ 0`Xk`apXd&E28E&fY`\Y(xPb}bulcz(9<{&vk֯/$S!R?X}!n.'w@j{i :|EƞEA?Ѝ~?q[VϞ&UP{j?6brr3y6 o +eIԺF>QU N&rAipT" 1& H(UUVVJ3 S~]94< 5C1`j *Ae+&1X$H6p)bMb8ml`zc@*'ShS"x@ Po M.v2|D+@7q6,60b_J^(l`SXZ/<\w J10BV7_|X^6MSqaGj|)p){2@dܞ`pܹ0vbF?^{}K^{/|[O=H+ Hg6ړ49?8xf0;f#ZMlְHrABD@>1FcaPKQa z_Y ij5D ߾g+倃mib re9˻`؍F5`&0b& RhP4&5'0o&0M-tMRX0[`GKrJP|(DN`RGc [T2 L2qIȄ@T4VamLmfz^z8}On  )[ [2'm>7˸0]wZ4Ŵńk=R983_1Mo[zAnus/6{(!LOcj~N/,N[4EjHYR^5KF@ q 0D>1þ83'!鹡}pC_G:ulI1Qx>S4*׎E 8; I R0!U@#hlQM1Om Цڜ!# !@ЇXCKb=P`Ppp%[P8<%sHA`r_c "0@TU e t2_u~(08 wW᷆@Pdw3~%P|νJup!0w sK#9cJEc_kzARPH%M^zM?tZkᾥZ{se y"FgB;3@,Nw:jZD,2=PF @`\(1`c!9([o}~s'QPN"RSM9vܦ(1Qm?edyd^0 H4E$hpi`ڴ`'0E-LRB4(A=j5lvݚxSj} ZaA`؀g20lb$l H9Ad-L)@PEa M4(EB"?蕀УhB88 8v $E@Ij`^2 @8^sg~[nw4~ۋy/ xcsb ߸sq/gWe\ Y@Ryfnn.;fn<$]{ݷOml\Ѭҙ쟝ѹ ONTYŽ*$QL4Lm2X.=wNe@"Ji n}Tlvη9Pc [3FA;̱"6p'c`Ip R E<63& LPmj # `zXm,mѣh6KP(JANcxK8kP\3ۀI E_x`p;@|*.,_ \ZYqgϺ{UƯ;?/Lx;/oN=429,f7z=Ь٤ɩiMOLd-Vٰe*Rx&d"T A.-QJQiV -1PlaܗPՔʈPԋl(C 6.3$dchE4 X4ncЎq41Oi@Nڏ}lh?f6j- c91"gd'HoXI{;Ϣm9rY K20x!>vn{Ox...VU+ljlUm?2=/%/>jQ/Zs|:@,5I>rXLwM57|\y5;3M<27{ S$:=̴u&t3D:](\oÿq󧟺jh =j}]ZS]Z;em }vj_g kLBLq<"03 5`8Ab)Cj4K @2MIjdaa  aKX.N%7whzje8[__?qg}{s*s`\4qWq_Wd|-9+{A]o/r||2775_?{+n;pFs ;[;i#Iuz鉎NNd%fHl"Dz绮OZ0ZHBmW7~8B%k`,W[oЕW_shrf te;`A^@i405 ½?} P x2CbiB]sFSxc̗@}hJ+׵3ѝ(Ab@ C`#ld !m@ 2NЦbp/]vaee95aj|UD67 r]lz>}ڹ+VεYC' ")xPXc\D6]Q, 3>sFYۋ%ԷAb5 ?~QZ_x!0~.mϑ_5A S q at+n؁4;G 5Ed087ڭ.83-PC|@P#Pka+053cXv #ۮ j~`g19#qJ`ؔR+C^PXqb) 6a8)k@2[`sMn[W/\*7抨b l6.}mNMv4MkUT@ w伣DbBmVs'?g>ɥ?E5Ɓ`Î㑈uf]?W/j_ YEB b =ڸN]]suGl$C\IIVMP(QՔJ,N g˾x`i4Z %xe7Go4 AY MA<,$g7rǮN,|P {9 *\n~qmeO>}޻}՞J Ʒ/zR_j|p OLLn[6%n60nr[o]@Ќ̨gE;ʤPV "%Cr]ucq__ YHL]y#_#O#gbR:csxL7 ^GG3>8`l6zp,wd6Co}M(⿪A42BME JA(E(%xC " Run}}'|#9{ /I̓/\~y*Ŗ%\x#/]oyrA&XRRK%% x 0Jˇ6 Uu|/Eza8P1J@KϣdxuUμvPFtilFw{ >UۘF6qʛ0vJlt` GjC@?  Swi4+L2V3A;=Ep)F.-^Up  B ޭϹ<nkkϞ?v{ciBkV 7ybԷ&l6`0 x-W˟)<*;l[>!H! y:RLy`܁85uSz:6v~ uFPԺiP esS e]bxM@?Ă*g{8@sAjiZȒ YFMBEI*kf0 U%@͘& fE@+o~(}T}fE$"D@ ȋIT@dDcgirNYcNY+\{‘CBP@i(@@ %50F(K}K9=v$v({̄ >#V|sAu.N꧎̊ M/|0qinTScufRc%]^9 ʁb[9 Q `˜fD#i#8[/SgcOH5Ddc2 }f;ݡkO,5^z/D.:{2 Bi&Ȏ(`PfC:/-TixG5 P_q6d9)`2{$y 򞃃Ƃ"eh3HC9Eo^t~  CDtIV6 2êQag*$0R/Fh&n^V)ѱ([A 袵t<sy߰y'`/1Q_adLMM ;}_~ނut^âC eC@l`;xZ?) 80``#ਃB-IJsPyd.:L,+ᰈ\*;gT+c[5R!&zm7"8Pv[oe鴈UmAdd]$jD=Q0p JPTwr h AP ~tOсaZISh9exZUo/_ׂ 𥌽L \bb~~WxՇkzڿzIƦq9 KsB v;?cяPҝ_Uթ.}h4FN&׎D * )%@/Q`ʅCbUf* a2\Qg_k\q])@)t>f"cy&+AxXFdlVo &6%%$5Q!QA[ibCefjlL(jA Ċmը(Hl)o9%8$ "j`H9QUff"URU"f2c&{}xL2^"xv<0eDY<IԖ9ʼn'pG:Ҹ5Ɨi]6wrmhbs06sQPˎu!%u-5!x} =6,DyMۃP %;矖@* p(o~pfhQRLb'*E@[Q`"H bS MqQqD_dAV`˲QEskǾwx9_á{;k}kuk y<1]B0=02 "\*6>$X)Q-2`H༄>wf6\?&e,YTȎB'c %Ibf2Sŋ8EcQyXE "QEh ,# i6Z.L\o'NG:_-s>o}7v-MvOdN \ Ij ^`,LqhgqK|r$9a418r.{+*p @tPI귶{_Wrzf2m\cO>ށS$v-ڕ}9ZḱBnE?pxanO*v+j˘{W`*[px#C}v=%(H?/GC_!'P R +p{A!.Wܱ.Y(*p$eփTx "xH0ł'J ! 3'S0E'.Rxc"R ̄HAD*H5dJ<߻w6 9w|ǫKǷlܛnVo?3yUX,FVk+`Xvٹ/[6>>gyоwYeufcf!sb ޺#s֖5Pj=Boq#I 1'فSfqlDwpO:Z8p%HX)T䁇176,Rj4QqLS -WXXV'‚9%"ꠛ'UfR3POg (l 3{cb6n:12|>jZ`@jp JT.lmہZ;n}+@譯[r4ghKoK%>c86{܁]іTs`pRFzVFfmoG"[\PG "Ff- jcP>~uՒ <8{ahx3Qދ(GTIL DaQeMΑR4U8PBut=0pHB =֬+@&ihWcP윷.x" 2DJd8LX#je޹hVTCꐔ!Ü8&B#Ya7=|/̙30*_G6\9M7S=g[f ˮ>WZ* C)À:Xiq} +ؾT^vt]@pB FX2eh6WQQTI=|B!xELcٮeր(Z' EdMaO0)$DUU%J☙٨H-^\. ~Í׵ n*̕(@Lꅁ=J%*^E CP%P' dfã*jqY0:C@*:어D]1m{ا9sf;!CuSW:VUw_}/x?~Щ{oa_T-%ٽ5לx$<^ sef>{?+cV;ڄ1 /\ih`2x*WX4mx̔&P*c4+&SX(yjYv1' WvP+"JlGIl(*7R)*!ɬe""NC)S)Cf2C! DªA-(V\.s~=fHQVE$`u~ƎZqn{݊`h٪UK/'hlľSΟm_ FC~qq,sx9[K%:|:8+ K.DA^Z'1*Sß}t:f$LO T憦(Fy;M~v]q,޻!+PfT*0QK%dETD9!tZ-}ZmGm"WJB(VfV,؄"*^s !΀zA۫ưT30(9#s>2^W8;罷*^ԺX{wi Q  D$"DDaXpHgON_?75zJ8L M _;<|oap47GP."'Bzx_x!736ֻY4Zmԛ*\Z)t\Fh>NH#c0N`Rĉ53aW,R@-aF9@-zUu^Ջw^3kɉSשׁQF 2eBx7Mt:Z*)gqDwȘvEKۆvO}j6yG1+d g9=;>HiX-%LMkI$@$I^igh~J}鉁Ҩa|tPoPkJMkG9JI+ IN vk#&"^E9rld8)RÜ: cBFDΰ&aD5x\7l$z+ujP5MV)b∮_ \e`%$oQF)[n5) *W*=7q4hbKo=i(CgPLЁo}??/G+?vɃ>33>99U2qn8lwhwliZ^($2P.bdr(B8V"XH|y" c&0gL!e`(c"GDK B؟^{qީV?Y})DQ[蔘}=o>TnW+na;#l>=s YQՐGl\r9߻G;^8cN?>871955044%ɸZjtҨnkB;ʹe b'1* T0X.iT|.C!OwHqxPP;"رd̜Q@zpODŗ>z駅fj@I!۵G޷t}'CO5E7wp-a=qA~3{,r…WO Xk7'*+O =T._pfFVf V[Skh Vt\ցRC9އ"0Q"xQJd%t62q 22tSXcX{g$6f6:,DxeXK'Szcܩz۱m&B# Lr̙a{zr8QѾkFqvEQ8=RiJmV+!|P6 K:fF\BiP zU cHEybȰg"̽01Qe"?+[W41 UԫEDr}_~g=~_`wUp78yxxz 6 _g-vxSO/{R2GRʵvWM6[hڱX RQFudL|ADE{Q]A{&(6 T"rOvu?v1VU*AZd\\ZNT={[ݴОo* ӶZv79~lq XZZm;oX{".kjL<19xG=gങXWiYRoJ5%*8jȣjR|82@@T%T8Hِb)fۙBT9jXhM x=}V#?6m9g}Zmۊql$x2~a_8x|OZEN͖.כXm4nT#B᪎TP-tRFk! LD.\_G[J(&aXjIdTx駯o?+m`7;wڶ[* ]wq'{@~fqlZP,L'/=0ȱG;ܾ}S{ʕLuJe ]ijaTAr PCD1*WR 0CF#*dBN>d dIDATeؖp7 Qqm=O( vT\Bn0tأ{̖gzt͌NL͛\nm]JE˵굚6kZ{tTFEA.Nt\y'W2#eGv]pkqoW~b?(=3SO~񩩹Pܓywҁ$A LS,B6?T?_Fn&,=1$>lfNel+a#rߓ聂4{駦gW劅1-eiq{e h,LH>vwo6VڄKWsKz^-R[Vq͜í:w1_ö%^E4F=6x[Mln'l7۝&kU}Ov}`K* p+ncF7J߰D2| nIKŧneúF9|7׃ÆiEtN_O=JxWv;]~IENDB`netemul-1.0/images/edit_add.png0000644000175000017500000003210011261705352015605 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATx}g$UwMSvcz4gF X ԫbvWa"2X +(`AZ#X"V; r# ==m̼{oͬz~=b&#*ޫ4Uy{|f*] _riG_#|yQ<—R<;@~BeC UP nD7Te*:~?^_SxѽP}ZU**t@T-T %A,a]C^w?_|^ իT, ! ..PuP(ms ?-/i8x8b%D# BՒ T.-P4Y¯T?>Io?+߼z O϶ >r<._ nQ& .>"..C7[/d- >W]8|h?7[ ȬT3y_E"Px?dn $P%ui(8IIZE:e^i9nx֕Czo~(wE_R <:NS(^G&淭\a?s ϹA']!OiMx_j \4ǎw0${g~8e 94/p6E_SV 툾l.(,*Tm7ST~ތYp_oP8|^r}x%X*'ʍ~3(92!"(3D hgTVAee㢒qaO]RVJ ;[ͪװ#0" "s".'wu8|~gM(2$0d.Et!dRK$ 6PT"nKð>֩{u":)&؞X٨άO*c8[u1bA PdO_4Jh8|v- UΌ\'ld9LnrA(. @*J*VHTUD bQV7&_NUg'JYj[eN@ҟO`s{mݖ2&|OwETUu_%ED`EeK9vz|Z>),+t&}gPIo]~ӿcNKm- 5x1Coh/2@! TUUV]JwAVU:WU}1Nάɤ뀮37 X8S;>rh|rO@y¼sw!K=RJRh-漰S~[Au qYAjpة Yk1)+968ZYIYY=3Kyx_ 5*qtxdJO/6OR&ύ97IIW̧Ŝ4Jez "|&5Yq&g2 hgR苸=>%* Å۷\>v/EpsL 3ċ}N[JZLK} %N*@Ҷ*kh=V(XfP1DZi:Rh-a߃G]4Pjjc ]W|L=He9%3'Z=ԼhCB;{Pj3ݎ׮* )esI~r6f)s?"pͥr }Λ[ ٠IuzusUը$(԰P@`eL>mHMP bo_]wgrcwb:X,c0@_)mvi_/uJ KZ@DbB,ޏ2@imMo( Jũ^x?݊ۮ{/ {?Q:Nw _i( +T;xjo!S(M5No̞v&15E_'{LNk7~/ٍVAl'sN.kesIoRB3›tz ܢ!.Cpo~Ê@B-"E?}md@j4-F{'xn[[r!ɯYJ3dӜf|~M})V:kh#FC<4~Eꪇ/X5U@XarSG~|w^9nʺ!s+lw`!nGX)B kOU]I4TJë 7iĺ{j0Q=Kk5PXor[oxOx>1< =d&0cs|_MKB>pp)!ؾ D@V~.*>K{شy]oM fϔ;Sgsش8}W';÷i\\z&z1&y/!mF ͈3 ~@ .B᳀DPbTuCk>>4Qeep̞hֶq˵O/yN㸣^_-?'ė% {iQBi]<^y;|uy7yxvbP<.'9s:! eX*ϔKk׍WܳzUa ^ݰ'W2bm5޴3e5%Q;88Oӟn,wzu7b?5ċ=\9 ^? G|:/fX SKf~0OA/^p/103y]iXaԈ_IpI6rb((~x!hk2ohmh'ut%0L~fBĥ0dH^w{,fPd=S(5Ly,3<3SN y̞yM# y-d,h;t&RT~c5BҺ)yٻW %yB^&/`B>-;𼧃v="W?"J !3S&NCYj0(N߳;|2{/d;jd(.\+ѿ3ɾ):&"N]Co-,j}_ZS1KScIzYb*گ ρi{*-sƄ0LR. (ۉكkhq Tز1%S74Bn\kWMӒV>*l3WUÜ=a,a6,5Lʸ@`|6(r`>&RXq$M &u!s=3;|~WKK@*WO^w9d'i)^Ì|I˾Ew"ׯ;VH,̠ ~Ʀ2,a2> J _2R,g)pr|&cZu4{꿈oFcH svO> D,!K)ɍ&aBg4SJ'rBU _ϧ8Mo)ppf󄨟%Ƥ)#!"( r䂟^c &=^|B7kD@5 . t}XybxnO)I Ev 1|_᪝f}b(eL%̘̰1L`M#%b8b"$ rϣg @fp HF{޺!IDFB %" 31.Ae̞ټ?M;'+vg s sM;|ma\!~j|*΅KԘAܰ S @ '0̔08ebP:v{M`n`c2DpPe"2LhÉ> cty-Um9/:c`RBJ)?t| 9!qߐTR& s?eS6 Qb !ī&C&)J$] Mp"I!fb0%l(1 3 !"qӛG 6#:fϔ0S<[EB$0+ 72j4.܅a^(MI7OW>LnF0(МN,D%)-I%~jԙ u_ M88},*% iYZ!(HR'hbR(€VwHflnLD}5YǞ+PKC=:[۩烿Lݪhk?x¿s L2-ܸL6  б}^Z(s }&<|&lkS VD ԂЯ2{:o&0{A*z2C&מ<{G3LlԳWQmno})գjm/2q#҆R-*j?z>2dњ5T~| s}ky!RHBqšNΡt,F3 {cEy0vJz;oZi~Gmy? ~\RBx1<6adʊ΄qV_߾ŏ|U f>N'QP퀚е׮(;|aƏ@/h9}@')==KIIie\XV6Fm:*$NBv,WH.I bAfO[od5Z=kwS>rt@v՗#SkV⮵c%ZۧF E.Pcm_NyXGd.]vY 0j%1{Z^w+*N}Qf%,VdR1)遐 z|Λit}(+5N|f~~H5_sk57ffokfOK m:lh~n0VWT*PUUX웴0 ' ҄3q]5_ 4KZ @y;Pyϱ3:@Q i3x6}3y}}u MjsnfOk{ޯ)eMqQز* ֍I" =+h\ֺ̭ka{Q |ZW) ;"EE5 f~q5>n>~u_/,M8zlP0{Z/K4 l;?X,ZW4?ؖ"c)K`<)u%cl +CT"r|לNd/vnX+bA@ =zє: $#L,A} PmЍ)}m(ͯhR%RUlj3&2:b(RC|彻z>QFĝxYwvw(X4fJW= @(a:ߏDkYdAM&P̞X۸}?EyPݘ}x?Fa N䐻âTƪ`K0 CU ~F{x{F}gMy(!xZ8)w 0f?xxlD5x3,p~֏l;4{Zv 9m@LmO !@7yҋ* )=OZ&K@ 1ދ0՛P* h3m2Ɔ|恼8v*=\{;quC\]0.JRZUE!~6Y͞٢ofOKEYw*r,gD_;9P5bȪjQ0jbI1I1H@kF0*CƹYy߽P҇.ʼI)qJwύ_άoxhbRhQTVRUUj+KbmHLoj#V3{"N?c@]נ^7UsRȊ`Lo;~}ɯz,}Ӽ}܂[Ii$1b㮺$VU7u Aib `El_۵! ow}'O>xrRPQ*b!֒ ANyޟ}hldxꞷS;;4{MH-(DPedS ф)r1ԛ??yFMsG|c_*RpCᩭL>o'˙f"? |UJdzA5iLMt@Kb Xv M .V!TB!)Ts~:Vp.@g"w%u>7[1{E_s` >D6[vKw >s LuyJ5qhoJnXV O =TKo4v }X5'V+[rE+hǶ͞iѷ-'k>z[8b:|`fIV˗Ķé!Mmcy^BomҷT<XwɘQT=Ӝ~W'! hUw q[?~Fr7;x ._%Qo~lyD>1>|;7 Ao*v|^Jo/Q,w/}DjR/},e8 LVI_Ls+% Uh}bk>̞֌v9ZeZh#Ԁhu\w x7ՖOJl kDgˆnMޔ3HD_qBYV=WLg^a< ށk8=m1G P-.ӠSE*-^t"r?*JF^wm]ghfO>$b=@{߁?þC'/*Tŷosk)ܰb+u.I?8笟-EayoH9t75Z녺9 :*{Ԣ8Լ_x_XSffǨJY8W_vGN}_z; P$MR;4{6M?Hfh?3mE;MW.?(=,> ~Wb;+bO4=`t&][5hӢǝht/{r݈ݮ>/'NWu4:(jFuGIq~UZlI}H[MҴFj>8Azf3_8ů݊ۮ>[mwbwETM ͫ.5 -6{Js>/t7cݿIfO$l7lR{:#8xKP]F!Lxޯhxp=7?Jҗr~5:)hN>&E_[pۦx]hiкy?x SE+u?GL|ug闝.eMoɘOG=Ӽß`yZ]'ϛk{-OrA[`gs=SP= h@S|bᆧ~ozꅊ||dVHh3}`y#cG[I'Kā N̞7(WU |`,76VqYMZ0- }4M8L4SM!m sޟyCo S`6 4!ϙB=E_el2"v )MvW, Z FD6= F]fSNFyޟ-{s=3:|]o2b=7gwٵ]>p 2@_|QvV6k~~7=2[<:|)?ULR_% mz}vh9Ym-יS왢u6+}׽o{ywˍ/xח+_l^ij[#Z}QpwRmlM~eg-ͷ_r-*U*3Eo":J}H@vY@&+oz}oU?z%:S a?R5Z}Qzʹi?̞ѦI X2{6ιgpWe?uwKl_a H1b/}>=&8g#;a zʯ6|cv 6i+}-tn*htwKy޶|^ ^=gڷVk8sC|?Kc(w{dwwvil;vv8$;^?0Y+ZH 'IKHs_K|*v|^\ ?vr|bt_&Ux?}>4p޿ާL>ww>}i-r-?rV*R-BdQZTk%0 V O'n;z?^xt|͠G(ˣx/< G#w4IENDB`netemul-1.0/images/ok.png0000644000175000017500000004062311261705352014472 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxymU]{sT^Izi6'8nH $$4 1!H;tH0H 8mɖ'YdIoN>soU=Փ޳>nչn~Ǧ8q<_/  s~|>kXt31;e Sfb5N',i0 ~O!~; [Ow/ Py Z}=07y}(fQ:6k8fĽC۶sp˭,_$#P?4B[5hB >yuXx]7;?r/h9ׁow BMasy SCTf\zif).H_]?ݣ- 0 K\u_$} Ù5G3կv A%o]?ݛw9T7ozB$h]a:׋QF.opy"r^ \s74I_#"}SEs Iu:vGL9[_x雮 =->|y.ҷP%MT1CP'fDUM5y3jZU{&qZUaT1% }//^;{q5[n=zB6*MʼnJ|ħ]psIъ,#eTT&Ei(Eh܋n7*l>JʏCtUnntAFbڙnBۋ˽̋ @̔JYF+ڤLRGEiIMtg4$Rji+Uy^qY}?n㠹yTyT83iy﷜[.k{9 D0QUC'j*e6)JMJMⅭQ\ŝD4AܛU-T( "|n][~jzI5TŋJq a)#]rIhg󘀉PS&V-66.m(;rRMҸ7[H3I0獠 0b-'^|RnwѼW1s7Z._|N&{IJЉUMԤ2dĨfF&Es[v3eYvU UƜTC <'_?yE^mdr+;-h׷.$˽81 W53dV@W:~ 6U%Hm =S].w-3A 6(23^zku'^#WUNP ;?J/ :AJN~]ZnI fuWLh)'LU |3FImk0gw3q<.56yسG߇()`3cqy| C3W*_G |$29Av]p"\kxxLZ"}^kT3M]kMϼI/GȽˮ[:7fKVBg J df)l1fF8O#1*`D33gTMhEH;8sasİf*`?7n=ljuSaN܋D?k\핖ZA\}TaM.0&UWy}UL13T P(";p3y=+[!:qnW3+#СlUĮ ?Ǯ$^W:/=^vܑO-gK½`Z^Yu=Ls|TmV )1Fʳ<}>)ldB-gdwؖAy}Yf45|+>տXM?2JP;^O-gK]=* Hfuotթ!}~% PAh}vH24|]*턏] 2M $SP>rK>?ǂ+aP 8~˅kuJ9 v 8Aǚ1 ӈ 75䛫67ϢQQSRysovs=^T2QA5oSK_kjN\q9.|հ`*.GO/s>ru9E ԆAT(M,Lo)ZϹOPW "`g#,5X{'?DEpܤʫgƌ ]88eu޲Y&]'FU"9xѽcS!?Jbģ:5h&gcQGjr9W{5KcQ{6|<+L$/B)RHg7}*c{IWSFgK7|Đ"]^9xjD8\ո2oH@ D)ʖ (04!M{7 o9ސ^GOg ?ZAzZ=:\ThT],j/Yjg*5s{;ǹk2 1[Ό$|҃L3.N<͟\.6M3/nÉ~> NVϜ;%q)'mB=o?&SM; ŋ;:/1S2hlm|AU?ZǗB~J§5I8X%NL5i7MBe-}-D$N2\;ɝoؓr ċsd2f5(p $E~I~qvQvqv-pA8N8TB0"?-L/yƙ];k_~!R omܑNC{~M*R7kɸV:%0 ! II0A2/{G2'q5Zm B.ǓbU&~V1G\!fؘRqRwqw(e( !jvXtB郙V^͢rH>.⃀yq:>\k]S..^C6d!}usGax'xARDDB]-RH׽ ϗ)S^Q wv}TBqyͱ|%7+*TjQ(jm@un Ή"睹TXѪggU5Pca;/&^mrH!$gGQ(-Jzi%JBLlsQݐWxr!/ Mgp=\25W+W^H'޿HyC,_iV#1eGi({Z! ޑ9\p/;c0P$bV<3#ƺvZ\@1:L ?L+t $+xh%LP"ƨE(%ϲ4 Cδ=Iߜ4SQ2bTV#x[-tg7j*wJXWTz꙽ F5˽wΜσHs"T6?J^9#K_rTJį?D˭v}r#.]K[䮟R!F%g|(&EP꾱|xi?4SB%O6~M/~+f=yvm˲x'r~v`*ΞWvVբME5*{Ė^kgwZe޹,8 f50ɷ`fdx<48NNt}+8JW2-Dh6 $W\LZ/-DZ8Ɂ=tڇzV{ELd61﹒pq+--.xJf<=i5&XL˹Sd&Ap̹vpL/83,Utk=|oGp #H_+Ka~+da̭>tx3kx_"s]2i$NjO`WAI\MR##XDlc|…I g;=U4@U=[n#OgIQxr YU$& 7#;1MW?1D\ˋkg>;5)URcwG 5eIt]}/2O9?s.A[$iHL1+1)0Np:QPAx8v ۏMLJ|#{*tqKܴo:UWOXбf87 [ww>Ux!ioe5#~=L<KLYs}'wK!Jyjk'&mQ)L:Bu6AVP Ɩ=ĞE@86Wz $d^j7_U/;&э[e=4M>@o1'1}"i3\1\]f9AP4kQS_ ؀s63bZ2gNسwޟ:zH]2rG\˛sZi#vMBV hlfx=<~_f~3vV_uO^{1;b,$6$jĨDQm`vn峝*}ő#[tKO nM4nP6qHnjЈVqjK$9grup˭ѷ*?TK -S t>#1q[OҩR@.QZ9*lA}x-Vyő\-'[>M"]D2D (]~r̫};Q[;E_GuYv,;ˮca/׌d9$ *,ރمB><_cC["];y/"yT_&|3zz:᭪OŞ&[4 K}y*͐d[3.o Iz*đK΋TR5p Gq(> @BU>(](YlJhL"j}ܹş||ґR#\eV)7P%]RZIty雩~; ;11]X>6Iً5@u^3& ҿ|  } uhzՔq߶"\:id-'ҧ@)|$2 kdqB8F w)u Q F|d@JJI霕VO\|\,X8x'x.#p=8 xf!c-tI$ > uĘ1Ø6G֓.7#},=s꽇 r@ΑF@=8QIth0wI *]kA&*^2H?Da|8NiIģVRB`V(u@pZ7/E!ތ(Ϝc滿r|82tֈ]5Sre?kj4I|EX`ۼ)C1 @Mߌ#}{H5R̀縔 ~Uާi+mӴTʲd2;b<ċ$!meWPGp?B'Wje5~M0`a-ђ(=Ox?KsB\s$?%UIC_JUaPPژBw(lR7(F؄FSJxچUJ}Iߞy'}v2U/8ê7ASv[xɚ F4dl0Z>2K3%exFiC mjq2@P)̕D?N]6MZq6oq9x)QUN?OHRd2#-h:vg|J =s%T(0/LpOҷZgWɖc4kn/"CpDtp]p~rޥy$u%1.mVѰ!LtBDCD\D2 <<׈:~ھU[=ۗհGi1 A!'dm0FSPT~V2SCM߯ CK6ERTR3F,go@p$1독*-wR2&x ɪ["sn%ёKxB#͓9@5ɾ \/uh$MU5=?ݦ"9;!#1f-6D}=[Ri{5Dܾl5:7pZͰ1-{҅d!p|بI3lmQU,aȎQt.+0+0-Q+B{fiA| d# XXy.mעm hu]\CtL?N"2П&}u+yy7 m&b C4b=yg C7=mMdͼ߬>ep1PYI1qmT-LCTMR4REתu|ZE8ĊRJkKϷ+Kn 󫸰J+d 6pBi=*"ċ!#1V( -bޤbkD }R_R 6% o0,_tC֑ˀ<\%&rr"e^ԙs 6)݄&I"D+q̯r7}gk18`[u"^ /aF|1C1Z&_W8릋!=>4= tNw~هI ~M`05LV?s?yll؀6)ns=&wm\e8K۩Yϑ`6+)}F3L8̵Q`8|̭5Z~}R}1iVRXM &"Ey-3Gvt n ooUy}q+ ^N^ K~YgO}%RE Iin zbDK vС;CXqӹJZc>8CQa\e1&FL4%ݵD\NK:t]t],Ѯ>՘T>31RE˳HyOBPt¨)X޾C#}\#Ӽf>Hp8{ fO=klnXm_PXvL,1iP[&u%JA&˧.Nl|۷.h=]wG8^d\e\A3PeP^3aPzZ~6B_2`vĞyҷSڐZO t?,SًB=ctϻo:?pNorB[')YI"ng~Ü&&LUkA9xw:x<CyWwrƌmĎ)[6a_jޥI"&}^o>bt@<.aѯyb.Ȩxa a3 90n2 QZLnOu+IDnjm0n23 ˇQaø,c.d\mCcw}iPoS?%} ι_!<#}uM.KI_m7yA=N›1{b.ҧ|՜"jD4gbuvV>偵D111[sh:ma$iini0wfi'ϩo;fUSI\-S1!c0*ӄK_;u|Ğh]`A/4_E^0ii/g?~/o|xe,dL.qJİ #w=\QhwO[8 5K]=1mƺQN[yW'ċM2Aoc$j.bv g_## )}^ 7}W ~]w udF50V5TA̙EUF=uaK#^z>k$>—[uq^Z/}r_ErDjZ u$9x- dq\']P3JQVv˳Xy)qV.D JQFY4q; S3u)ɝsbO^-fԘbdͳ{^ 636"+ӌ5MTLLr,^?-z]y%E-N]!OUMԷ)K71-E- H CV?n3"~jfQah"3u/uޟc`jD#jJXPTϷ?"L^%wIxVq|S9X,-ƮKziIӠY!tu ~m>TAIIo'!oi=6?BޟUC__ڟX|ɛɛ GsM}G)zfY$E$w&zFj,K QrJҳ~Qd:C6_*iQ ĉ3uѬ!W=  ?_$}M0!5>vG?vW$beL?ҙzci0 b<3S+7ݏ7bo9~/b7>~VOYUWRqe xHg$?[^gלzἧ.= Z#Ͻ,gwW+f_]q(4q37#^Bbzi^xJ.NZv8'ԞC7noHk٣{Dgg,bfxř?z0?ǃoU0&} v\SCr*Lss gv0(/Hw}'y}3rҷOޟ'}y2{n߾x]q{sy?aM_Κ%{\kxbАuw> v%{'|ۅ;?]i:$d?Bv{j7-~OWGT<5 ]Ѵ~*WJ M5ٳ@"]nsK>W>[g\J왫F2gܴ̋7_7j~4?NbL?o{7>U]{FM7 oOٕ5fatԿYry>2q{=HS'<>upjpx睿;rܜ'ԩaûF.]c)@w:m/gO=zܫ >\%Eg9&E7#CI5Qy"]$g[MZEFp'VRE]ERpU[ ;[Ж( *hU1iff޸h'}ofƴͤ&g"wsrX|맮CuUpט-}}ӗt=ӇTb{(]*E(|N!!QGɬA)M.u@1acuKv~`4YP~̄Y&7OG;kSűPL9RPisgҽews`@%NYLgw* h=Ê϶ތtTc t^XYm4ydA@҄f٣!$sE;k|jp(u\i3g\[²'M7̈́/ǃ%,X#lzG=y :[>xNZe$ZW<*ke$h fn##`m1o8=5:t4c.!]Ri祾D ^ؓ8Ko%\V69z3v.P=|SL⮵0T{=Z4o9k(2HZhi$}#t?un*R-qekCp4TJs}R#FCۥlhy=L@-ksd-'SEXPc(ۋx4DZV!11lI"XŰf,_hٞ?MWRڽQz!D' 䔑% S@@QaC@Af?M=l6 EF·AE(p P(Q$@/|t DIENDB`netemul-1.0/images/edit.png0000644000175000017500000003040711230150773015002 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATx}y&GueV}uh.Fc4,!1؀w12ZcL="3 Pf0B6#2X :@j3#i4}Uoȣ^eL(ЊݸKp@`lm 8 D5Ì@55 1U T 6T T`hLDi4$ \1,@1\:R"rO4gV_'D\ >6oxוP|Y*T_x/.Y{2ӓ<~霬stnjb4ɒU|- kT0}韓/j5Mֳ%Jّet;+r*XӖE;$_C+^΍y_Gnt1Ue Ma$%X&ږٓ;w3SUN`K:)x Tʩ j KI耊dȈt81,S',s _HS[ g<@ӔSw_BYڢ@ J( BQjF-zQ(F-zu|];s]B,TbQ`5<}Tn1L?l'(V/L /$IyhxD $ ;,r94]4`hzShoabAG s}A9Q">FomU0)%B1A{UM9 l2w|=~&&RkG|f 0!bŠfw]~ wOi˔8ipgʾy VB2r.#1A["" u/qELP (5; Ynݺv>$AΕh}%cKׇ4:ݷ0`h5WR~(-/ڛU-MH/_z v̵D]&A%>zv4Eb =ۿۯg wRbPhu19b)ceBX~C(@TEڌ%֒-GVF 3A/JٶGO2nZB^FDjA=yB8R0`Z4[0ae`9dy&> cOeVR jX-j)9EdQx%}$D ,=4 !L>hCx?&ujL/Py<ڪv!Ďo\O~;34j9tDp$- ?dY#yU/މP2#ra@MhNr 6ܲ <# f 8UUak/űYwg5ْ`f)>wcA3+)ћ-<[v# y RoLOu}^ZI~0i}_Pg6=fѶl{PG>TKjx)Z#&GCdܽك1h8]߳\Cup,<|bM@{klA1M = )H0%(J&v_4 XjT/"Y&|+vaa}dd8N`oۋF˔_:{zlD þ_m.ygiX4ooCk123=3 J?|u oJAGw]HIy͹HJ|d+>i ~? 09)Ȥ?A,,r8dEъk_y崙e~SKT'YEkNGc;dSOK`@iNW-hmknjެl+Գ_>exH[``\f?3=udă,H+ckМRےH7ӽ@kAiʩso{ ̧0 ,O L)=4s9!HUp5Pe cx߈(Zi @ %Ozʔp\?g\tk"p ü%~Gкk|i$/;9L!qFVx |Ϋ?KQ,+Et#0P(B%_D^=hK #g2 hLfl:sd`|TUj+QZg L4߭xD}KV;wݟ~adV /b6L#>e`~4 dBŢq$R)a"RvP[#܋n`hhmg,qw>Z) _4ү\I G%̒I@2MH/m~F޻{ÄC& =C[ /ܓ/:+7lX%~ $?Mt|)q;Em sG3%.z}\lg: W_H-i%Kdh 8~Z)(B9- GHŒ~^~߈}Q% `mDѢ2ܹ#OsA8 N)в`Ǎz:/O 3&mV ?qnX0%\~z*N3o뀄o%p#_mR οCCC-B,&wZʬ~q}yM2 ee?I#?Œ$OEI*߫}A ë7F 2J73=e)E; X+[jRq)sZ)AӐϯ;NPOʽ :ӡY.o d';h`4ߟ䧞~?t+o )`WZ@~̟BڷP \v0#O$3Q#znLUe?"hS4{Bܷd!޿ `<04?_pOO)O\5K?L;ҟ{#ir ɩʗf Mɐr玖_XL~PU(r&`]/a|޿)K]/& O{Bt76Wv_o=.k3-3SN'K;w]Aˀ<~oG1VؿeGև!s#~.r#ϾߩHk-n{W|U,*c;:],N~]sEK~ ۿB8c? ?-XE+~kƣ73 jt@ϸn:1Jmzx[+aݸI?9/Sr7 v_.o~*9״AyU'?{N'MNUoЗ.5 ׊v\0I۟|u&x? Ś#Δ{q%wmWwol%}`PtfzҒOA /{5҃زnPnTW  Ж@,CS /ur87W+ =[7a_eQY&0Lix茶bISU+/K?4:8_VD @}dOϴ>,\O$K%I`ܽo= #g^LOɴ(-φ{ʖ. xO|@N֯2?lt2`Pfsр Q:+~{gmϿ6#5wx+JK]~9VԶר~g_~U20<4o_ζK5,~2-0\~0[Q{f.wuCJR5|ZAV |7_Ix)<@Ӈ-6hݗ}kX3?b|Т3;wU=WizpZ%W>?,yf2G:Oh3q_XR[io˱!R;N#˄?{[s0c;Og_?"h a.&Bqe;v ̗z|*5Pi}r%CQyȁ@ng5/#gs{_,vL/I\x[ןO?/Du-go$F02NMr'ކCwvƨ'?(L5ND?*Ns?8ꑄ@#媽ҁmhsXOMGΡ drfMDH?f"P5L?Jч$b50R)ߵcC`>d𕝤pQsҹ#m}Az'v MLrM̽~ٔz['p?œL;*[=hxIDAT(r/Jnyj_fiKwƠ$D׶| ~-`ht'eݷտʪaf/тܹ T!'zѶG-J45ի[S!fG|.)%sGF"E0+GGYhX%4C6 OJOp1dTDrKlh43]棑vC5Ɲ{6@ea`"0@uKu~MFUpX]+\^1(* a-'ZTp!Ӿ@ä%"Xb˙-\Z-7=c4"#JH car.s& cnklrDyh^Lܥ~$i%|{G/%^WU<7d ` TH`eVa? =:}'VAkENG]Uzn;Զ7Y/DA>WJw~QJVP*k|mXf64x,˖iF:fϜ\dk練МeѦ"bx+3A7z"\3^T竗`JkV@voy9eY8NA*מ#ϵ4 M~ hmD"O m 74{iѢRm0/QK:.{^#Fk[aLO-0 1iA\'E: X .R-I|tҮ{v~ivi!'i&d&\ k%R;| *˱jnH4DM&ɣH)L*z#Q{ws L̊Kx +4%Bm m&ww]y߭o;/硑3d`rspa]5 ]YZ2Z9/:q2ʛ)bx8M#kw7V''j00 BKC"_7>"h>4qH˅9.~@s*A ԺT`O&vsJ\w2lrƿ~Cv:wRM-,2?3sKfxiaf-b꘼i,cǎX $ːƝY?1Ć &X7> &*WXJ*d= ǽgĶ>/`BSiu1] \KH? 驯Mu;WfJ71!Ƒ8ܔK+80XsBmf)"T5prn #(@ku֏WX;Qa]u5֎vlcuSIEa0m!h 1*~`a|v3jK02`Ioy7u 瞇 5: Ryh1%ao\p6n*x iPpߩw=h0 +ΐh4S_#%q hR-I&GawCQ &f_ZEM"'D;!@B% ̀b"(I*G PDƇEf[2pq/71}ʇV5֍bmx8x2mBq\:p˸`A5Ϻ--OkLw`}y%=}p֩(]˝vI_rjSZk kHPtȦ|Θtmzj( DO ^yCp _|xX!NUd P=wϭ`…iɝx;,Jk۝ m9&^ԴpڃZywNy6O{&sY5aj٪ڢ_v=j}#ӍLf- &w k2Ƌ0{u)ݧPPS{3Ui48jNXKs |a~ 3f̴dXS^׹htZtϼJ0]% }$'9fcy]4΢;%/)(RZ9oKâBFG:)_*z^a+XgT%ALY=ᷝuR_EVm'6.b"`3@ܳDiЧŨ"vZ&}h08k7%TFr6imז+VúVFمc۾6`)tnެ s"L[`l4ȸ %ڟ˩UirA 6C`og>%w%Jyo=x`۠`+6/h3@DEnĢ-z;F0>/,h4.w,GM4^?;~6ky;[se.fpV30Wޥ]$X2Óv[&fOo?C`-19#y[oY{U-$[2_`#؁*5!jܓ) yZ.`1hd(}I ;湊wWjq [93Iw1NK06~.@4i{siDHܹKkej+f0 Q&k7/sOљ蜠pS8)qӧcIENDB`netemul-1.0/images/pause.png0000644000175000017500000003225211227717431015200 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATx}ilIU#NoHBgtdؔ 4t% * }8,%.nRpjm[Q*@}5Wo'#"Ήs2^aU޼yd;/vDmJwveS$oO9=O<[v;p9P>"}T UلꦪlBtSU6r?Et/uMi'NTUרu2T ( 8Ax <SPyU?__}R;'Nx6;T *Ѡ77w zP)8^?]Wp.}9'N<x&f^4^_䍯7z)(T>$cڗ]sp;O4 oj^(C} Fo`loDUӮQ<:dߑV?Ͻ/X='[ v]eI^'⾊$NQⵥ#A*.>/#M!"ew~iܞ `~ۋcx~j"7I_85܏Hg8Th;fonr^Œ1 7\#$?ྔ0ɸu>;}ތdwVOq;OL]!%} 3*<nzo:'N~9<_"YjY~FLlc9eX(J ? Ňap0>{v1EtXo yq}W7Ѝ\ɤ̺$g7Aes;O݅iY53-؃m:سɻ9ٶ%kPxKt8*J TYHTUD BέmgƐ+ cB3˨9N(y~~R;@q2@Gz}cZm[ ).*wEQYY(.Haqk8Ht(R9T֙3}G/|I ;@nt32-mH϶ڔw2@1 TUU>{#d|U)#F|]X0rk>QYY <)L)D1B@g,ܡW<߻ϦR9@0k޴\7uձT=]ՇmQU ,*L\qQAd-Q'3ja:a5b^GTPv\}å0Ծ;@`{"|@͏Ϸ7{fl2%OjK%#h<\%N P$#@ʬx$WKcgrpR2BTG*֗췽BTsl&k|;vM0"͇r}+hPj RHCD5^CItn3N"G VϾwͻdhm5罅m Aח!uS1p] %Bd U"B $O"@ a>8P@FK֗إ?6usY疃sywEy 1݃{xBʦ1>Sm8UNA*\ -BLn`z%#'HNѣF(Clk~n"wa>hmk΍Zc3YSfjWZQ%WH}H_@@wk1LF?N}dTq m.~~ ,jU/55sYB;ܳ%1kb$`(RAe ˨Cq(?KĪ>{HqIb } OI_p?:4~VX_zw}].B1ݻ6eճYVP϶;<بJbHKOU}J4f9Ae|;WRACzM!̤=M&_ x놋?|b#7c@WfyH߶;Y4~ߒG XCH\䩌H͘+ L23BH$ۊ=co)$8^/B ߮ʸL yH?kw2j"%w#H5!  NAI û_M(`jpc/2bʍk]3\W{o;nWBxAkA3vA@;#sl&krջf6[@eX:l^x~}9pOrQrmbU>Z:y4`M@?3cPֿZnnsZ˒Ҡ[ݘ)ή3CKFy>wdڨ) ]_;/"5=wsm˒9еZ yomrK i~ їw_s,)r ><|_- J) ' Sr.*";P^xm_|tޗz>zw'/IUQz}y]U]O?m6mvQo 4ױymg2n 8tOگd"LpQ/\yc?tʱ zBL L BHJaV #[r̅kֿ}\#$BT6ﳏ{B ̰3>_~gwK.0٬31`Z}gdo[ z{,9cnJWrKhYk-k;-kzڙ3k禛[me3m˅8}_  |fS_Hy4)*韕QBu+j=9@v.sټsg-aa/%=:ݐ7j״WP?L;!ˈLft22Vn>lNnM;7e-e֐5d2k(7̚ϽAM+|f7ֿO֠E;]f?wL~fry>dt//Uz~@vȏGv ȏ!<`gLzmz-kyfK0KϱRT UfVv%;HA.P6@ڙϺTHA)ߔR% {Mwr{/fvla#5%gv^SOK 5̡ ;Dad 6̌{ Vb?r.C,gj=COb~rUC_Fs/n9zK<'6bO }~7Tl5/mw l R|dآy{t^ F Yx sMbfd_cfVa1G3ڙЇ/}`aЗM@Vc˾fs WFbKBcW=׶~i7UȯP!%! ?C]rp-?nG DHjgVhL^I_h@r| (J;DgVbOoBJht+|=/&ر,c73D3mc:6d(R֝d|  G;>1MV cSY˪ru(3 $#22~"( 4p?_(gU^_̷m>2%2V@b|!h:l? a?١00&0LK|֥jy/URe""~VEl$/GnZ|7EOڹ! cB&&:C*Qbr؞u@̘ZKn 0g~лaCp04_QdWjo3ߗWgUDAT@,}6 oPٗ<P+“RCm2CYko'B38RxӍ/>{?wi'ī2v67Y^}Iȯ2%zP׮eՠ ;0pj~8d-I0j LP f|LՏ23χ$%Z3K@@id"l+?#W q$*ăl. 2239em13ԉkɎU@T]n+寓(~0Z(DJ&˼,qWէ U0ڰ>͋Ȩu}n] G kbOЉ@U@ Fns wn"e@ݜR}]=5ܯ"nkmܩ$'N|Qn$+~aB r" zEoS硨n0VccS ر_QF BFTgM2Ù ÉIabOCϧ@& Wnoi4W5S:UF,:*XH%(pPQ~ըZ*fx4<xmZ5.nt 47hqU1D8f#FmQ0vbOLbj*&Jssm)7@RYH0IPHKV8?8, )%߰G6$ S}~25-8(ljobOJ葦 7u'oP֨е!Va؟SpY&@!D" x Wּc) #_aETX(l WR%Afh"Z]j;qLaq/PII_&8PᅋvHޡ29lֱܱrUU)|RCa% ?<݌+NPHxY@zRjbB4JMD>qSÌr,/BII_Ӂ/M-ݝİ~T̊u,ldP\a?7 ϼ1EYW6avNX9 '@ H˾iՁR."C:]=H_u) ew>F**ZDڢnn,ß W3 ()e5LT#8ˣC1U508b-Yr>{;hTH3)pи՗Ev1bOiM`q'_:vȬ**|"1DpPĔk9U^;eҜy"\P]HT2u A5bp0v?Q s8)>A_;Ș_V5T7SZUl7kz n429dcNf!Oz= !*U{k ̮2>;08' |zMXx4_ Ρ0\8r*ة,BD0aFkgvIIVGϵYtX>=5҇;&P=75pv,Z l'{G*dP; Yz@}Ӂ_xY8aV'☜sT89IDAT8&"I\( GZii|z_s x?Ğf橋A-O_tI_9Eв%a"յ#(%Ltk>Fj vy8 cahTSXĹnAIa1Y@?!!V_عx`TA6FJbOUdd3={vyhJR~-;^aI"F!=cD05@0;fuN3 JR*e鸪Ұ$0~&ϙ՜(L"}q?8v;wn;o_8Fơ\øR[Wg-{ZQŤh 7g W89's:*Ƒ$jptU$|nOk4?gVrR=ɘӼG/fg>IvjȀu"/%U0C9:wye&*13knX2 8v!CQKI,l V[\u>N'%UO/Xmpdҷ{F(a;og IbOeLB?^䝊13bl: I;A86S+3 =3XdjƐtX_el8&OxrX39Y`'!}䴭P WyaIDW +ёD3΍J9&_TF jqg,!C!F/aVftH&R?ۢ#^&= K'Ta;3ܳ>:M)q_Ǣ8#}^-TIqz}&qQQϾ):3 JvO9ӡP 9Yfƕч84NPR'A'1gPgGW?r#^8H_J+C:pVJˠz4_E?#4Yf.Hj/L?Z!Ҧ;_6DZJ `?ĞJS(']kwnv`bO#Mzd][~}mh8f-Jj. $bO) ɸfً3US=@U hq.mZ2}áS$aY+=UȾC ˕ x|D ,@eP,) H'LKlo;Yw7>p1bO5"Œ/'m*ˀ[X ,Cx;lOp%:D;IUC: ̸!d?/ %O^Fp!.9k37޳}'Wɾ<#H=MҗBCR#gm}ȫ~ڑ+[u &(z_*J} %QV-NeU81[o' Cʾ@`7)`Tjƣ/{ёڇ{n,Cާ*DgMƉ<@@9 Gê-~Qp~ :G u╰g~ gع?@Kigdy(8r* ((Lq>{j+Dp>s/\zߪ*&?~u!V|U"" 1]@<%LQ`*PE 'Ď=#^E B_/G@ }twtǍ[ڂhxO8-@yJ'Xd==E9G}s]3i(L/]fzj?v~Qf Pt8-g 5bX`N9g1곃@÷xe}KlV#kaLT6T#gĞK@U>xo֬w< /Ti@EB*k> j6ZCu6O8 0,Sǹh ( =M|D,faT%d gF> py#]^/ MG}`IU` jo=#yY9̬vvk]w?%;sGg/h0\-{>eO +}x? k50?# G#FÑ9W88aeqpiI Ù=^5*Dk3W?řz_x_2[ZX\*ܗ۵SEzG-ž;M)< ~L4,]yV~ D$ NSCgZ8Q\̬`b9x~ UƀǗ3~}7+y7, EpUkYXc(!oHߘ3F긯PvwtO?C" {H_M5ATP8]~jOQ-J|DCg%;X5<$"qú7QKٟ!bQӮY˄)=cOjU]{;}M-hЭ=(y}Uƒ_[k,![,R5*ns@smO8Pd}3fRDFOI]9&DZ&^֛_=;o߼vYx;HFxP>i*JGG#t0SFxHkN)cFOgK> slmi c։p)֝rW?N~ //?U3T5Şj`U$Xڽkjb4~9P0gm\鬌Fϛ$L0`bO ı=~:ڵ }4giq2`W3u +GO;g S)=)D!qڧblxQpk_e[v+At|6"I7""uBz9k3Tǜt@2IS޺cv9@ڞ]R ?gHDܟݓpNR#}ML)3>W I?Q#}"s=vϹX]T(odΎSz5܏AỲHd_hL}+/ӍŞW?bɽ{٪mu~t$buQ"  Wn/46]>P#}{{tOGa}qϽM~s3Lc' )Y@/RHp45~!1ň=ܭ޽_v7^o5y ~UВD ֒hMXjBKn*{H_5.P3߷6W^k֟II8nWh/ uq4 ҾfrOp_{)W㠨pwy~k(_mWB왠>2=㤯{iۯ~vIvfH}^YM{{o5/z"Kpd v{HjQĞuFpsw`~,]2~[&i-i}&Tؙ0 }g GI#JF6W5OuOKi|`ݴ~͵?m.'x4ܯoc4}j>kndAc_9w~%i[^7\kDw)Ğɤ{>3p;}"@lOb}gk HB$ku/T2:U2(09 S*(avi Ta{s<ib{w5wlqA왲{o"O0~؍:{6>p"@n{O{x2!2u~b}'yk9MW V|"[Lƍ85 `5S]ݳs{W.j=bwn{k^X{%P.4gj%雄:Jk_Jg׸o37|OʎoO~]X_bm.׭D ެmtx]3>!&o/7 ȶO+4c =?̂Zb]⊙q߮gi:Ε=&ooZ~{~yW[/g{B:@l~͏d4깗J1Xd{l޽ַ3~?:qIռiOh֗WmX_z:ӟMWݒ_'}s ]Um__qWrv>) m׺t+\Gњ?P5{~ kt[^#Gy{YO;?oz Ojh^7hR n֍2ںčZOIt'?g۽Ӧiu>b{~W?ݿꊛU䀊ȼWY@ ƬUL&O 't/u{R8SmzAO'V{)xIޞr'y&&IENDB`netemul-1.0/images/install_apps.png0000644000175000017500000002403411235657137016560 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxy\G}?=hFh,o,Wbcf9Is!y9 `` vm6e[^e-#4#i֞^Rtb,{.uo߷~_UJ, ~eaL8 2^X&Kf#3#]x'H#s2Cihw!׈?Y=w=,E6o3xѫo^@kq5,  N>%yfbȧs‹򴽅nOۚ6TkWU-鲨<7Ej_35Mlk7m1ev>Ļn<AxBo^u#x۩?fBǘvZG?%2bXλϥ}SB_p6{E{Zg [h˨ ~ܚ*2QʸE wA7$7&?J_?"^k !c{ /e θd98tM=k`еZDzMWꓯz{E-ӕ~I/j=ikg i¼!0fU-F*\~sAeޯ|{n?\|O[ oךORcǿz I/ FNzhU`<%-pzh籯 ?'|Y>֗8nO_*V AE3ZXfr ¡&w /~M&7>{lSy$w cY,UgJrm5=>?=Ϙ) u Ϣ?0@:w?wYySe @WSR6]ܒjoZioܐr ~3u޴uo*8?D(ee2Cʳ&{.oh\ p ݚyd.3&(e b b,k`ͩ}(vAdV_X Nēf _)0{IV4}h>MV:ZYfBY=.J!Xn,ޟKڐۖ+塙SfOeX"@BX ?]OUr: jOtb@Y XƼ)j쬅q/kGD %}d! E8GuSQf-_y_Skkx(Qi h)1]M`o "bjXI5@@]ۇ% -W4=[/p\:{V9jՆkTAWۣu$=6|Ts# ؙB+Of D3S!>uvHXhwrD)u:$on %@iZ$uf @v<""N kojQx(qQ'-Zp4-_U(aRfs{(~jѳ'ȤQAc:p=gP] L÷b, IxHc-W :, A80 (o._aC&-Nd# ˨۔PCaWMjGh^*7pTR{ٸz ě_u?#HaX_9MMM}iU7N0/V2L–6O|gS1J@z4XO 0ᆄJ +/ؽhN%duȝtt QR!rQQ2#;j]ƿ ŴUy -X7 =r. ==J15\NLGH%u5 Pρo;EKP醖NH|y1OZw`k%g˘=П :Ơ/w|ntL|?)׺0\UOClwcg ŠQx"rl^bJukJ)3:ԯ=koރ:r6p;g?v`FwUr7:^yQMU,!8ui٢&AZtޔ1'wg=xd.BsHI[Đ%D;i0%Liܿ, u_WO>I"L("HRD,!lUCbI۞Nۚ锭p`9)ukwXy[_X +,搒͖i6-l̺\@–!to9^ߘ;=Ip*@fv;pB[{YlvSP1X: hŔ5M$SG,hXanbYZ+RY<ãyw?f37]ukQF0ux9rmtpA }#b2hmkWWj綟2pܥ5ҍaи:wGKV!Lt9VB|3_0lSB5;nF,7("Ǝm@1J\31;SjN0`)}|alcu”Uq|f:w jxя8]S=-;[ (;LفǛ-Cm6:(!xZJgApG@/FwO "FS-:\ %|h3dk92%iX'7$ ]Y2xsHĄk^C[Ǫ48!Ԃ?knʓH4ɉ,߾~,Kf1y--'*nzlt'`J_mN8D#uv! x,o[kGVl`4-)lg+p 5T6XӕTh Y[\u/9,`lA!&y#ৣ={2yi'_4qQw?~kď>Y=\P+~gW<`Ǚ]5`)-Sǟ;>eŠp-.>F`oo^֭)^죐 zV`[uaM3_˷u]^ueHIA+jcƿxٺu%C+">6]adx8( D' >;ώC K ^ '`E{w^@8`eZbJޝ촸5~i/+@<@46qfHlCl].'65vhݼl.@ {ڷga C+pA; dkJ'PaKֵB ;٧RM$\@/+6wDCACOLZbU@oo;pA m /|'$ g7V.GƛJM'X RK?4 ߿uƦ mpS{)00tSm9^0p(#oO:hC;[Pl_mezNnGHH8m˚B7}fK^ڷm8[Z^ ֶXMmdž3U{Kx~MAMf~KQQ w4I!vW`#\4@/@,bip-o2r~g$X`{$YWX x<VRx%+:@sip9_߬rR\QYw^BUxUQ')`-0Q_;C'GCf4h(G 1~QλA`T }V4CWhOKhhD!(3`J;hONb8hw| +;6GsPB=U 8yZOuҔD]܉-J՞&i<J#j9 T eNcjU"!0 \%lb2wjRZ+]!uvR1v:uJ bN?k1l`υ&K}1 I`TKHi5zUiY >9Jx:;2PR@@^ȼLdPWn* PYd0Z`  o~۷P1̖!Y@uy5ZUrO]|}ip tXlI9TT%07Pw|!̍;B ,@ b)\6eiPҘ!) ,٬P *<`ǨuRmFSpsϠ]S AB_r6vl_dmK|RѐeRdWp=)گm ϗ0̗oD5!z[@2jhDMeR Q!SG>PQ4oQ(_m]it-$Q킁Y0)؁?r{Krb-M9Ob'B Z R7 j?=a(;"A_ ՠ؈[4N؋6@(с47`S_vmy/ߕ,\}@S"I$Ş5DGxT㇆Ȏ' D@ڀ0Ss^CcNnK|iטEZ̾%2EGǹݲKҙȬKt7x!?Y(_Nƭtu-c Ki ĪM?U Ԝ=s& }>1g1URtydqKzGN3W,UUqq]Ǧin{nױ1 @ %""4i3_̬)wH}GqNb }wU)X4@:Nؿ OP8Z`@@"ذ/I7[.bBUVNsN2"tU$"LZ jnn6>M!ǵkğ)}:ϓ*Z{~z}t @ᚌiXC#ٟd?9oSXpM%AA oGGG=qn,DzguwT̖C|#O>e)kcwohEA$i큙 y?O(Z]̡y\xoL#;tޒȭcrQ~5ꑠ&fcjks@ P1=>/~xɯFƪeUYp) fS^ͷ*3dR|/@:Eǐ5tU :~;^`Ttն2e XTlWDn{E~;x2V1]bJ w&[QZHJٯ~5jj17#J zttfy|HU gIDAT4~gpRyW +E#8 PJ<ڛON2k:_PM> DG]7Lp-Eۯ'z%_SeθdLc(ԇ"kӨ~!S[u͈Ҡm?|܋1 $+=S/[菜L3˿Z3hF  |'2 pɫWpԮEkXE՗ c#eQ]pvm*pN7x!D uϏ>Fׂ\yYo$v%WpBQ?pyj=q7z5DMk2iC'@_`>W2ֆJj vs#lCʜb+7O3~jsԏg^=90zٗ|Q6G鎕3A#:j!=a]\s)M\qAUx'7 Kj=q>y>Gy~!R "Gzrfh O;lY7Ύ3 M=_xBq ?K)fҾ6. _UOyBPp7D.6fuA2-mcɅ;ld ]iqA;Td }/(x$bއif_yslghx!Ot7yQW\,A ^ٷsCy:Wl) rlmpƦ [Tim[_zEKdPeOdi|BA;䔌<}oWz [ZQt/-nC].AqBΊu}˟gnw=&M0GMNu?YYEhR=9?>4pxjáЋl_զwaXǐУ|SK};{mC]6_)DP[*5BIwAST)!UB40 He<&ɴG2姱 wu]{iOu==_?=@/:,j'qhV^H79pE ИF*6>!dZb DTO4Dk›hHhY4a(9Hx>՘xK"@mऺѪ0$#! $Kx9.l)xh<E0Bg9G0=oAD_48+kֆp:B! PeɫQ7K2%ߖ})&2.K%eıL8 2^C0~HIENDB`netemul-1.0/images/edit_remove.png0000644000175000017500000003032711261705352016363 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATx}y,I]̬.o޻iAAGҀb{d#(zh<p9:G @t7 zw揈Ȍʺu{mww}u++*/~_Dfm|m1'c=Nx{f897߹b s=C/lAdM&«~#?5'{FGED.G<3X3AK Of[¶<DMD>v/|gU{T i#–0DHځHGa[n@xMx|D%/p<G;UߋP |%)* D*DwR~߾|OϖۣGWme*`3;E\C&m@q GI|^bj p7x!i+Ҫ2mK"A*/?.+M%!)2;݃stʶ.H2<7XpPk}@鋈SjD Gǖq 6ww/vAx/h4rJG\J@y?nV `LzJ}!U G&hĦ/1W:}KJ6L_M[=7^5@tBg__]=SNǎ׍ρ-DD`"X,3ʼXvkV(fD82t{ÝwN+;-nm配-lA`"0)b2mQ M BZɭ(,e2slL_㦯&-W \wn؏eWN}?+H!k$d:^LGJDJdHaQV 2*,Fy]xu0ȢB6 q^#;wyt pj}ܼ,2ʴ讁ϔO)TѤSMD C,3 ke22S{fu`W#΋B$m7}m*5l1HH4ş؏~dƧ|vN poMB1&TC fL~B(m $"`v][=20>VZqvuX<6!U: "O|[yO3I8g8zy- jQs)Lz:]TMHg&:X ptZa$v$L," fQnem3+ա-a06Zh2jCD't3?7S&&q_Z@J`Og:*(I5)N8ߎM=>Ƿ(, k- keegVGάy<@Zu5H_E*Bߨ'v5NU`5pH4!"=2J:&H( aW"L/eϳe +k+v8,>$z]"J{O}nOk52ԞL=lOG'!рf;q{# \Î/°d0/z:煕MÞ6IP}D"=?sv$̗`DgZ_`k%sK'L"rK0y5E*EK{s@gv!"PG+I2{D=<$L_c/T 9^}3zK~Q[ lTZŤ{՞dȢ괣ɐ;t݃.6J"A[XVD-3Px DtQ5c蟃G9 $|^ӊw->E̐iISe4A9T}/$rh;v$?=U(5ZR J V')uQH%Wz L^Y5Sqz@Ds&zoڻbNǐ"Rጛ+Q9AUKv%H4$\3cùgI5TU"9-=«%f3#O~` QDs֗;/[Lz{::MAe?/K>: zS9{]$ 45D5GpmU˼'oB_Y6l2 /dY0kK\Jq;qIq‰4v)HXV߂YʤD'74 {`P7}Q3~h3<^]7 fU~Sf@+LKΕ{9'dP\ ʲ^[8@v%=~5H:,3ZBuyяm/~Hǰ2 vL?;լ^ % &bO;ӝ& _< %~((jHez#C8LXčbo6L_CcWj +q |Nb6?*}._L{{:hrzpFՐ.| &LD NIˆ=TpJBP$s#o+mM"Do7ADx%vSt͋` r1"P?Uy]u14 }I_NT*RXk+p}So&G103}=euߛ>1x"MFg~N6qr:4,]Izt\ UAq/"A ,X.d؅UmW{mu|Ӯzx8n>4tzd!ꛬP%"H ~Us@~) Ѩ!"-A?Da2iTb,{rlfĺW> &Ne0'7,[^)]I-vd>N7!C]Ŵs}5\ם(W.O"kEhRM*1 VD4 RQti(/-=rm`ms&;\Q:xO}K=5(zQya׃<EDVh:VĨ^u/3Ɍ&ZwRQU1~5Þk}T Dž`xn9Ҭa6@f:%QQa?h IZW"ĖK(."n1$/ZȲ2rѰQR $ C! sGXzVžžǦd=bۖx=lrVXqok#OQ(U %Kk0_~XW[vF@& i2JO 6˃,Ek-BÜ.냑] 1d}4GQRvc^?-S{ㅛm{?-vTrgҹDMp"FU%s4Xaْ'2$jRNõZQJ"ra' \@엀 UhJ,Ք%Z%ZdaOźj" zW;VL3%]&UiI\~cÿSkLaj@}CH|TCMxL])cwi7ʡ #"a͞4AZQFwSCdHb*cz==߲u` .$ @)4"gtv% `7u?-j2:ȗ]uëόp-KJcPFe>{H6맩OEۄxSe?"J/a}uW:sDB 4NTz}EPq_fbɳ" CQ,nޟ1urJ̷~5ftE>#HV7 Hg{ͽy0n @2)OE@$L/bX@q+Ou~qnx׃sO޻0{_u<9R_ tE"<>݃m.*HeVV$?5Ծsxxҙ;=;{j_23 phH v9tTi@z0\@dWRWU׋轀9ONDJThU5]YWI?ԿruݟoDfXsޞ?.raQW_II>Cø=M)LZ[&:(XXF9xeX %(JdD !ۛxD$\L\-%|+G,ɮʺ{T ABC!baƋ`f\h*;dS5~΁m p_ @YCLr/ К{/M;6Þi"jāݳc'7 ]rGێI# 3X+ p .~tdQXp`*rA$D@:_V1]~ˆ_3{b$zB Io qKVbOϔ![0piwuX?/+q=˟#u `RApr3jdSĀ$p"4ދ'FK #0mf*෫K ; @dv,a>"yBB$)u eeWr Rd#d{ AI*<6?-L B: 9 ⻊L{P3}h=5W,LyF(@}a< 2@(YNufQZ㱋̏!;įYi` &(|SJ?Աa$7]S3}z@KFX~`V%T:?+rI&QtmM{_8? " *G[bFab*y :UlZuBԈrXAJMYÞZo_JB͚Q!lb4R64Ih徴mwPDD N\8;/[(B-3OiJQ&2v$DL3۪;{j/ +ePzM_ժؒby ,{ҽTDJbhp$zT,my'n pHXܠFqw=<ӊ+E<{L_wOH[& kcRI@FoѤYl!<ApB&*"M"0)"e5WOzDc6/S@? CڌAݸ5 A1R.K'Ú'@*@rfĦ|U4+ژ鋂1 klu&-E^D- NB_.[f9HjYu!mMaj=4'M&*y d$Peߗ=snc "`t"rFm#"C>ȓ+" %5!eR ))wkrPN&ܴ%HB,n>e^d'z_LbvW]7Ī:Mc 9/bWDOt޹尧'o]8{7pHIDATA"uugk, "&G/VIagB7UNZ̰2D ["fX3X>8e {rk`XXd.?_2+ɡUsfW;&jHUGȠZ"O[u _{UKbž>u mv;ԺPvnUxh– II( Q/ m d7Z{ XZ܁y"coIA0VC ܊>4ṋs+zot!ArQ#)|Xܹg;N-kleO>쩙JN߶Ma-1NT+"PArVQPCfM_ o"aE+"/+aRnwE0[l˛APD ֺuWŸ'C f>1w!-4w/Iapyu Gcn{v6 4L_º#VݯL_u"l1hr/Ⱥo['S5{ ,BYK,eܱJ=A~'׳U~md)b[ nNКԪDmX~G0=ȕt?6}l ' rd'_i\l4Rr\ S![\ZFJ\T+J`9M4U#چMmKqk$"sȿtOn4.\aO f-.n!7@jLRZQj"DT"U@PC,w_J Hz 1\U9إ/p/$=5ȿ"¬~5`Y ,P"6 P"y].6A*Bu* N-2v[~6.maO2+P9A޹zx/o '~5DzG#P~0drc""rrHPL@\֧MJ#ypr!z.{7-6{^H)xI ϯy @<1d?f*ݯUJ_@khcTR k۸0UPV1 |ssDI3nH9xŧ{GvEQn)pהȗZ+ g[j%Z۶A$T,ޭFs:Hخ~qw=& "]:== '>P= ݯ[Zo Ol) +ny[nF ${@l-_*ܒ°|Xm왰o$tVt{۴N}3@ž 27VI( Q>r /0 \RQ([\(=~0jYSU@w|_ޚϜ}r{БK+j >I},A R@Qbuwh#:0'. {LP2;Hn+no۶D1oUj$!&'KJSW>kg6 َÞJ=m{^x%;&YoOɟq({@"o5}^^Bk$.ۼgO> {kM_]릯]Qg!IGދ~jpn7^~Z{xcѼAF7jl3}m\ :y#kU=\sik}\^G:ó{"QuW '/Lߢ NÞoaϘ΋-.u^`-oֿYk뚼Ͱ:1HZ@u~_XIl>Oل= W=쑲sW>[#hG= |ZkCǺ/}!qoB 37 {4}3 {jU@>b ·ݲ]M mѹ {jU4h {qHۿ / ;"'In=aO5ޱp氝kg 9{[wlg{S~ٕ1ڕ?S>fT.~7Hwp{g1tm7PU={OSvTʝ$ς#ceLCHD~ Hןo (m0}S=cU{ų˞`7|M7.LG>M#6'T$i=coa,\{}q̈́_{UY1'-dS7}~GqUۧ {k3+fFdwbg LS7}{ BsW>]%f3%|2{j0}[{z^'nߍk2kInF?aXɽž>9t]W}n`+o}՝W֟i.'W>kۦ^䱕+;||%44÷kr=hLQ{芻yƳOvpot]WikeN= _wh3}7L_u,>nT [h쭯{@л ?3Ji.֖JxJ 1`@Vew7+t cv5'R% sស>q_|eW+@>s돿n`+u&~{M_; {&@dg|woUОʩ_|t7_PI\e /d U*> K*7(eH"нkU>I@gݏ&aF_ZY_0}~<\ ^/WN$֦uoźߜ5Mn>u6OW'/3`ח4}ɪ-`BL8m! Lw]|h> ^K'^eG('o=龌\RL;4w[w!\ӛʙW˧n.5n5}<אZsGf4_wu/-+ =Ҟb}u=ƪIL൅=dKtߙs.Hvw\G-x1=Ggq2{]Mv.hv퍯\/ξ(_9t5uߢMWiMDݯ>\"e~*s{?yަi _|Wr[#8?a ]asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATx}weEVpSa"À"A 9몸]w P5,*]ń I8{Btz?ν=OJGs=tCai686z%Y!6z0538C0XS0`3 ` 3z?IM;`#`^F`c$h %-!Ʊ)RHޓNwwDxMsNpc׋ @M̚,L`nAo!E3J"5^D$!O/+۳'A6mNc,PߌHG  " ๎K@<#!7/G^-= pڦs@\5-ƤHѢIdHm l%ү)!8yw\yg_S{n٢ۣ.̿=8 -DM_8-x" N}6ϔ  "}Ͼfi*R mHa7 \wԄ\%?"£m|7X7M_JgDhm/D:fFߘ@4&g7N6m&O[f!1`1CCFk6ƆyfC 7P?* "y2}/e롹 kmB.mᛍ$ِ CAzw $`&5ZRJc8GqXiFL_SgeQ¾'¥/vXpڦypʢߜ}u $1$yE^F$K_ 6JiVp4XZTtr-2Qb60C*7^7{l~xv/O(=8m>j}9%hf(,dG(dG@~G($H" d6ae Ŋk2ZNj5=Yr-2Rl$гF ͬaa `ɽ^?nz-Qi`~&!I +2 BzB `bfc{aځg6RK5wu8mg7}mRL0 f+ R_PdAa0,%tj6̆ɑ%6dc4Xsb53YRSV*70c>ʀd%>|ϗ>yt7hxَ>A`{{ ҸžJzrɰ7#@ l-7%!1Zk(T͞r<:YRzdXa|ϪSϽaŹ==W7ґ.4 e 70/䐦iAK| /ItBDfMo[Vvy%y|!%A113b@u/[ ;{]@:95gF| ¼i[w/^*Yb[L=S~_s B2>8^Ir,~P 2% 3[]w@j{can{ "1֨ʌjޢ*WM43Ӧ>Ͼ5/P>hx֖ZDB s5p}zQ:Dpa#3w jtpwo9sg@8q^bߔMO~Bړ'⾘9m &) MqFCDhj c!*uk*j6 K0:npw?.zS dJ(?Z+E@SEdw+>tPI;C};?xK~XtbYX6W#=Kʣb-67w`{8Mp0 $xBHI FKtl`}kz]g8<dJ .RqQ=.J)4OL!@UUeN@o{8>r*BȀ(HTˠɝW-;>U3~ xHNwraxH]4!6_ O psgX~%?\wuq dʎ%G w$W4%R׾"ju}/ky-ꯎ2F2ڎMedOM;Q2<^؄܂ۢ"su\Rѓ^.!c@WEn0ƐGJ$Rt&i+(vof >bIg^bXïxC Ox$r/'r'r''2/D %yR$<)6B\=nt]7[?h W<|ᩜjߘ;:5q(6 9}^Qjsz{9_ saXjB s>=z܃ #fn#POP=⺕Lϲ'h%CkP(9 /D62z2 x+BL޼T3/aY 2H=)$A"ѨF }m[D`,O>+zy]yegmOu$h${M_Zќ ֜KbsrZ' Z31F|\sm\mQlիgV_:wz^`A~,Jz ;C{x0zʔZU}&Q 50r VkU`o?D0Ҝ9< ! Գ:hNFh 񎍟Z;/w VgnՓ:+{74}$I455羷o!.YeioC3=zG^eA{(G n=fI'5A;c˩fo/` aUǎV|Hfݠq~4lN5"6FΛ=շ|u13yM y_7hTuzAt % _'`Os6y'&- (HmSÏ_/ "υ=B1IU0$*fVw_n hCvr')Kf",Gkq`Zt`'Zt߾l]]Mhn+cy"e=!:3 $$f\3&vcanP+VU-zwN D[h`34F`d `Mk~Oak0$iqgw;@>wT 6dϬ3|hvӗ NG).Y3]p<:M? 'Pcj1 \?YPs6sdLp \ ȊHQ =Acd,Zk  -/ ~(00?ϝai7F"`CV~Bq_D'/ F%NcUG|Ù# %Ai7j 0gv@$] DƑ 6\ߟlP[YEo;sCGt)ۧ/ˆ'1ZS2nKWЦ@ *ӧ(Kj gal]iL2VDiz굲MWsCD6]cqdT4Hv0m&jUx/uLC*6I*Z%q~gvݟ);qi}ݵy pڦ}V,CD(Yز\1O?eo|rA[gJqETUHV7@X͢, PhkEH& 8_R_|`Ck̻sg' /[(5Ԇ\4yD==]20U/x}}E-d&|!")Hf$KlPo} +,Z+q(Q@k$ (=vz8_v^^rR2 qԒrU9.^١Al-nKnxh1c]]!MZ9faf}|}kݾ2G3v`TWI< j|Ύwt{csk.)_k f  Qm$jq٠$d VGu u`L5<GޞkeqY3r@[ nh;/-ҊI]aim\Nl3|K0}h6OtT=@|_5cFN}n}rP4 5j=u#gɎ+<[~~_*'x2'>uK3j2*@֯HD֒#(!ӈ ԩVdlȁ'=moVݟ%::He&WVǟ~| 31{c<k-:Yg\2ƀ8*3[I w`ŷeGո ʄrQ p2a@ 01:uCs5: n{GMUө>|+FvMw*5֬&IL @3i3}I4t?~zH fҵҼip\Jnh=?߲Z'Ƥw1L ;/'1`ؠjKvTYC j *a`d"'B(Eyk_622%[hIicVFi aE[oIU-;;'N۴؍k M6WRZ;6l,9]../HV@ʱ㏙H _k'A0P&@]wTKJ,^7%$pCj$/oxmq ZSlwuf KXa-"3 _CL+)C<ñl]N$כdGmõCIfHAlԜ‹"Yjsj֍5z$ t2Nu'BD$mTXu#Z318kJFLJDJjSfI; 0HP@-8O\>-ZdP+I%.2?CZ IDATD2iEd iI\Ez&@j/n1=THPwo(TB2ҎvFQ I5@Q G_c#-FNw dLANM_;9,]K~/JOXS* )9w7̍d >-[L!3 AD6$hX#Ш1nqg#h"_][3&C; G-<'>݃0֮m)d[YOfRQ1;ZRM84M1X(+֢RMi-,`c6e@D`HH|z_#.c5imXr ˷=}ީ)!K͈p0$UY@-|!_ |NH/& ;>%{Z#LlTjR#4@]B=ź[22uj.n] 7@c5w'Q=AiÚNk|^er3B<5:X zH1 S,|0|v?A77n6i}&{2} KtA@ss̗ ~۝#M c`ȨklؐR ]Ygjn0WɞtoOt! 'kZB"F*WH?Ia5dkَ%u`aŴ6K朁/Ξ })PϽSuչ{ lu[n\c $ک$؂X M]e¿j4;6 H[~$=-"T:\<ꬦe{TFjMQ31P<BLd'JJLb+mo\8Qky}D]'#- KHap 8( 7.ݨe_׌_ ƴa:{6;$h bj2~&uͧh2bSE'h_$B 0ɞ9M_k5 Hzj_~hgӦ/Ӻ-^xfxT7lp/XQ[aK!kwة\C: X-!4-E?'.} oLbDRho-Ör%P:U{C(몌G ivE܅8㉃=tP=Yu ӗ>A#3Mnaabܶina,b41k_+xCVo[> X]_c_^ ]caޛQ6Bj={s e26wPX,@zLYTrO\]OdO9ܹe&k u52`!'߸&~# B0}dwyVU@f5~+ ):dXd2pVZV*3w_d `*P&)Lj mA&@kUYu[~_.~=L#O@{,J XfkjF;M: `JdN5J(+ƼΝw>ψ3u|5G AP//m?9a@r!o4'm3rt`\RU|%ƫA@s"ZģmI:SW5#dkMHϮh샙^kb_o `ܑfᬺ?Mi{EnW7 փJ Yj Y DFlӰ :w*{u;iZ[v+ͱT*/nD7M;*41JPQAF},`&{N;B޶d מ.v=={dWu+5z b(`z ˠr@~ͣvH_݂n#ڼS ? ,m M8'(?g1=g,{%]lYu=Ip3wxb=3uUة=. X+_?-i`%-m?c7DݯC6S,߄=&0'@hW$:Y"Nh.UyݿݷqW5_pQ4Î 4TKFP?j@<g,{%ݽ@ #ٓN77 \wyӧ|${ ^yg'}>`^}͡^vDe?=SAP&~w حKN#a+bE?]֮ܳL \ɰ 4 'yS,euOl>znɞV7#}ΰgpێk2|px}[d猕wu@]/&8` z#JJ 8=h41X!z7qYԍ'd-۵Ũڥ kfvUHZ+Y=#Lg%!{V[Ip| FI:g?e(u{͟i5}/Hj!.tM0}ɞSz01+M*7ʎsmsH¾Ayuo-T~?ga,h=؞ߐ6RH!] R~ݿ{u(oja;4Hanϻ0ɧYO]tY9p=mODBhF%~;ggt |LjsR 7Ivn? ~7WE~黸}).:y6dܪ^_Jʍc]53bϪ%_5\ԯqG-BB' ĸ>g?u(wKiWE%{ӗ"ӿm=hpچ[@'u񱓿^v!LpkxJ?4{R=؎d3.ĝEpǖWqKXg0 b Ԑ 9a6nDt$}UK&{fVg0dHE[yu"q|MGt `@xڮo9.|iw ,Tǹ`%;Ջ.?cT$ H*u˸ZV$yX3A3eO-2|'{yZMGP @@(Dx Ӈ|!,܏Ge<̗aLr7\5|es0D:['IR uLd +*/uy%m?~a? UxXtWoC;k]~J9a gO[9w|ǧyõl ÃAx]|?܉ v S҇g DŝX3Bh1ɞDL g p?D$jS`*eqrrsʦq㝶G[]/I wMؼsvego/ڂfok6jtAÁ;`KqߍOw@#QA"%2ACz &1Mf>ȯ8;CN )/g6@l7#kR}%@9ا̺ 5fo?ѰSn])? bϱud2V9pאHMВ9af5z?cI 7Dպ >::yms, 50kȄ!dn;g:80OLmu]+c!j ^k:ӿ~ඏNRkZ>0sP)Mf n-5x@a 2|;CFw/쬭{Jn-#ThoV紅&an{`6ʟj5ɛo{0տ1XA}ȅ5e'c(U!K#eВ۩\o#nj}SV?R#/)nid#Timǽh00b-܈!KxG3L>tl7گ12:ZkgmŲTo} B9t?m\ѫݨAvlOTk#;n~AutC"S'WG1]" @U66 גH.U\5{v8IzsMn'~~鈪w#zΟC@!aW`aΝd.-#Y~ݟaf E醑TH,9Ǩ5ͷ>!x*Px*JF{s۫;"4}= ft~Q; G?~>v7YOS5fdOykn ؔ!RuuAiD{;]gm1W͛YQ}fJ-ӘWw/@$IJ{ Ff7 #IwnQSnc&.ApV~yz5c1% bS'|u/>6؎{1qi͊_b`>e;T <ݽAz`:{ˡ38<]_x2W-čmR$szIJ hcow3PlQ1k;h^GW-'K^=xTVg;jWwGk,b5aIؔڻ&l}SUK:h 1DY'6d2V>'X, _x6?<'7aRH$]7uǥ$)o鹍p#$ʱ T06UdhA|,7g'7_Ul 6FDt;Vu|ȂXd^]IݸoW}wNШ?=LmZ v'$ߨln&ɍO'{vFE͹dK8rG9"XAf"F-IB6D})o A#<_}69mTϾm2 %`A\Llpq-nӴMmlLk'MRtML+!"fM%`RQvtEoS^ DC 6ݿw{~Kp2ط~] x|QּmC{;[W's:[z R> 7'o6b3wduZ7R)ݧT ~2lNLH@NQaqWI;ǽQ4Mojvla>vr6s?KB6,7dt^67GnYܑiӗG^$C]rz(0W#kz^#]xkN%{fgٳ~3HhK =nm>L^6kJl>Bf`ս  oo2򾦖558]Ei7Io)ك|{-צa#TWGgrOgb؋w$t{9 mX}7\"ŴCBsy$ R=-:!Dk޿dOq%~O)bzC@hII>ҥ=br^b{;ם/2 oAg-[ҞI$R&y0C[DH )sWQʯ8|چ~êRw湓-=D֟G |{яPHѯOK2quv=~ڬѐOG6?íDu'~gW\HEqӻo :'-3u Yk6}~3SUٶ6_RA -z94aO=.Zu0%{5̮DStW KOK'jYkML 7 Zqn3ӿܲ#0|ePN/ޫzҘƞNIDAT3|-=3fҺ>CMsN,5"t_f; +/;nۣᵟƥs٨l'~۟ksG|2jϼ=F?c3oD筞]b-IENDB`netemul-1.0/images/arrow.png0000644000175000017500000003333311261705352015213 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxk\Wu&}Ωk$.e˲ E! !q 03afx@C'LH&|<'$ 1c IuiI]u{}NUnɌ}:U}ֻwDCqn?cxq<Ə\q<܅pGD .D Y,<?u\>2p} dasoVa`&a&bH@@L`.>~GZ47 OTl6 B" @[P@B @\}^3:~gQ,`u{2Ky oRgΗΝ˳{Sv4ϱA7(R} f\lfD}!=g}I>-"_]0gZxT`} ?{^Q^F0  L`Yd+>pi*W<}z~(gS}E0J{Q<&QG՟] `} 3W!W+lHL$+a&6Fma®->3a$UB37fX+`}/p=^XK&(&EL1! U@c$7F6І̒Z::UF8QGzӪ`kp6kr_Cdu"Px%;Qs}K5ƛ4"R$ ^pfv?-gvv>q@`afc '#'zz>85F2G@<H 5E}5y3D'FDQ;&5@56vDfLQD ""#6 3-|.2 #FɞIS&ug/"=+~`Q 7|oAxu^+nP1u(^Q͍jNPD;1焝X^w؈  \ _aL4Ȓf(@P}"7 .+?pWM6Җ (p6 Ee@Dc( s̞a;[=@ l5-]͘÷Eh[ PPT'úb\|uec/W^p~e]Q4AlTaH XH@p7{B HꢄE`$AʎzՊ۪yo25DC&TH~HW]  w8(Z6KPP ]] 7x1XE f a;JX#SC0J WkG?޾~5bZuXO"E4TIkFg;t8d"j&h*M@viX 4|U|/Np UB78A:F UW=p\6IMߐ?M.kV/ ։}*LD4(@uF@7؟ѤB2yZag:j;D,V"Q|yXx"VƎ#9=XU@= 9@y~Û4~gTfc>c m[M5:QRb˅u#~ҥ1V }ܭn@2wˋb00m t"1ޖ%5c󃔏3'{2hZ/mԪCpWv*'(l;{1< *,CPі}2lFVL b"s&G= r#oghhXl"A+N+?͗|׏ 69FxO/ G>?j/*WE_}YNjHG lwIOoYm\ʕzǢ慓Igc7nb +lD2Lp bUǥ)FG ]8jd۶\rㅛ4|(:\#n5̞yזfo||W/nR6tƶ7 E|; ULtZ`ҍrlq?7AŢ\հk잱7?5;7*#mIɤLk1N#9}#y&B}Q8;]׽s:<]+%XO"R(:6uV;b >+҄).]RM7;`3̜}t<@ 74bw4WCwCJ4"(%"{c1,(_N6dG~ o4+nƋ汸y,nv*VDw .Oe +ܭ JîWLo-L;h!D+ÆL.  mc'mqI݌TVf#ZqDI@doy)CfO!٣*0A:_{2mft'Jǭɖjnk'5ȧSW@. XRSht5W 6kPfIle'm [_ws %II(ͭ`4~4쩋~(62Kn7r>V_ֵͫ񤵾5)TgE0(&|D!p:: 4l*uAqsC>/Bq"ZP\<ҷkđj5cnMN#o7TMv B쩋=թ,!6 x^Q+?NnԜFv" ;':]_*z-W1+ȝRT2Bjn3ZpBԄ*B[~ohEI(clDDIH"W8_}uD_ay&BG9|َo\^ )h'?؍SmhDďv휻+bP ! /krX66sWZ"J"B#V*Q8FQ@Da=÷".euGN׮~z'?ՊN$*.RKW^/ȆJ+g@Ьe7ˊ!C?( '6$Tk6yS֧mf7RJEDPD#B) 䃎;5WR(;lchYpߒ-^~OwD3Jb2Ӭ,"bjG~g_":Q@$z –C%cIt?iMJ)BgM̞Rh@)t&#OqV { mR?bE4TT+JZ1 }Ũۮ@KD-d$AૅpFqj'Ǜk /V~yӭXxEPD1:H~lbݟ~5߈IM6dH ۙ%RTh^_ 'P(@$z }5l ô.LuzyCwEOSgCIG^*p[=q+5Rq#BDU ]!' 耡 y{! =<nbgX7>AWPJcO^pgW+p|BK=#gP JjbH̎^kKW+[ '*N\p=PcY&mF3A$0*@HFdjV :|oM3rD4#+3{Dߢ?,uA$dW@XBq3XY˷\o'eHhXa{Y8w  @ KGPE( (o c[7([f)\`6J!5&V:9^}ȧ`K@X,<>i2.8 A>OP@4hc:sAaُfh736ضImnwVԿ]}cu`p Dh g5O J.-f#ݯ! RU飸P\aS#Eq f_]R`ɅbJXNe߫o7mwİLPЀ,Fre9p!߃r~SY6dtnY"3|+0{DG8,Sn)\beK?gIڵ | 7}=3afiuC B? ee@8ũ*;`{G3c4.!WE=C&@sYd/|!"r,6h(ҾE˱ٷhf9WNU*]>2B+#>,`a<_)=Qwr! xX̞2͞jubRJDEg!:(gvqpr|gfCE< T62C!Xx?nm< <<;'h(0B&VbUW32K`QW2nZmX w /w ~}E\O؛>no{| rlʄ5:""Rv ̞ggQr.~Ĥmyb/7jte%ˍhfvOʍįs- lpzYZ E`Z˟/#u\?o[㟺9 M]ÑR@Dň\1W ̞ Kth)x* "@8˙{inxWߗN#S@CD j4RY^S73g _,;K=/1!# &6 rma֋v MG|+Y.sin1k+3Y:g  "g?XSEIWo#Ҿ9^ +/&G:hɍq얋Y1(<3D-^Ul z* ?E kE!NowU1(6Z.OK$ Su^7;sA ;BHyn|Oh@aZ{ niki Ey’~/ͧO@.6\8L4R:")4~B!VQ:>Ղ~󋑿p$g|aÞeL; e5;k 3JY=1աf̌47|GYo66 X(} AߊE\k e73N9_4FUc-n~6ŊHlGah U}>8WE_P~#87sK^ϧsb ;UDe$tw <Tӽ Ğޟ ?LHucM?M8V@)ޒfboyfOE%8X`$,HYa aZc%X)"딉M "7| fҧzݍb 1o!ncJ;j8,ؔ>'1TKߞ_%b+\4uМ!& n/=}#yʾDp)U-DB' J(Ybi91?O,dzzε-6F]4M#0U) R|(R~gjF\)nm< 9绦 …7E% Gsv{:s)`̞CE` l E_e{TAj% ̜ ePQHEJD }W)ŤcH‘ ;NO`V~^p >[J0!Qgf%l`Agzf3wMx1H09GqF0{E_wz:b0$j_Z~&if1Z8 spB0ID"IA+R1%*Q-~8($ݑnnoV2@i8X>^p`_&ul?` 6ɴk ol'qg|d=9䆥}5DjѯY<, V+rBA63P "d{tZ )ch(QXfj]?5f5r?roWESn@c;8϶рeOP~Mݽ<ҷHhf=E_wVQ.b/@%(\z@2ώkLIDAT ,þwa1ڐfiՊ|S 72l)̱j|v&kxw|~_7P[i k2("+̞EE_쩈R X?tb ~aP7aԴD,,32-L2F1FǞ+A0OS }} mb wMu]wskuU ~)zl\׌{ۍXH)On%Fr=qT1>$rpX HmdSA}vad ϑf, 23?HZ5y5䜾?^z]vn+{ÃGXo~$~koUl XgZ'I(R٭y̞9ܹVЩBFr`lZ}V}Bೂ54 ˉӘ !%FTD>c/M `N5.P23 {c1; 埸}]0rz`"q Y`"#_7}Vjt.d+y g[S}AZO(Qf:;`Teca,ӒZi.,Ay2€?m͜& ]cusI i.Y#sIs#if஗?"[ >#ؿD'ɵqG7tӢ̭ {Je/CYbk/-f I}+GD#9#'Mg@6a佻_pxTLcΞu]" UBJUvj80ݗ+3{UW}HusGٷ Kn&$߂ȶS=}BDbh,aaZGJNJHRM˻zd9O (kݐ_]7Za5 `#셎HDz޽uO9:i_ę?@ؠ.E@ ^ˎ乂^e[M'iLms.g7ۅZ6{D}.Ū& lh95bHR""{yD;.:ooڵ~hv3#bڶ!0.}%ubIHT ȂM} yl܏_sZ)2,N30{rAҝ*@ Z3UWLLZRE++ J)0E~;"&!cXh_ cĽ0I1rT̝[f_#`bofPlH?M "tv_y}_ֹRĘ|( ̞n.Lǖ !?~"S}axF R- d?>_H?92ڈ56bv>% a{nd0H_v\oϕ<T9CY;hb]e8^p`<"TB |*jfO3pl[}UD ͞QGc _N ׾B$MsI\ )Ҍy&YEkmӾm$cgfLk-iج6c\W~U"[T7)<}ɠvVrكײa-ˉr7諛=CoP}U!Sc>|FCk- miLkɵ<>Eؐ{@Ch"=CAlo[IHWoD1{qz/UPBAk[6ȬӖ^.HuӈZEf ,n q?Ғbnefϐ C:_vˁE[_ #E_}5 )/"!µTZݳO@9,qhFg99oÊ OJҴ7lw3O6VA0 TȚJùbE ̞sV2@8kՇ;7*tϟͧڨgWBT>?7l^JT0[o<ᗠ1y OW@[Lamr(npx͞X~M􅼏zȞ=@!#V3dY|>x@Xnf]?a Ї}>/=cǦA4q*gH%Lζ6^Ӊi ([Sm69oj\KSj  \璦)n¦9͉7<6zq9{ك@=?V;U3|=Rd]`+߽o/GNAh >&ohMX砍u4~#~~ >~ ض~NRfC ^Mk{zt:@QF/VT+X-sÍ3;3KaEP)x?WEPVyߟ?|) (RDqHMiI1^m|05$Wų}15,>tZAڛ/_~2@q[ ud(M̞EgBBn~)M0u?1 ?;TXi:1{} !W7{ߙ<ٽ /ZحJ+~O]pySUCEg6P0^ŅaO%qɮ>ٰ<D}7raU?ݻ9%;._H_?|z5*|+PI}4U3{o$/a j>aq#yɌ_ N,祲ٔ9Q,=?曆g8>,]? >OIQ*o{7*K?)"GrÿQ ?|':(0Syx+>y[[x:^7Y*_C|D^[}sD_(A/FT`|LnĖ,Y#y-[>Aƪ6a]D9үvX8yb^a@”.̞W5d?Xy7dzgI3?᝽]ؼ/M׎쩉3jϙ=78Wv"^{sKrV_8}R&*#U4j/|1B2RhR 4)޻1 ܧ( ghn?vVRǪq~w&#(`Ylo%fOy!"j%P𗱌D9ϳX:޴޵ >~hjP8+P+'y3|${5URAZ^2~_kH?녹kKʾ+1jOshޯOGA!؂FRC*²B)ϩ&௅}|lL^#>[,e\~7gղmX)0x+Gч[KX+fe>xع?‡?s6q2?5&_5۷ I?}#x `U) t&ks#>*]agOkEw{³~ w^fcU?fb=~ѓo~䫟x9 \߿8mӟ{z]>ɳLD@!BDpG Vwj0f*|0@ (gQ,٣f7&7[߿%gxT^~S/eG_`쉚^]MwMݼ39Ǯ_N$:U?뢯}~U%RS["j?Эu[uAt ɝ~4&7>\qw=}OuiTc޺ɤ ?k=zS`~H }sĝd|Ýqw-~8c5~1gr>̤8gYg*҈)Z(ΣfhRN~}?](,v\t/uz̓zR,: NO{߹k}<&q'?]x1~<8JpDIENDB`netemul-1.0/images/print_preview.png0000644000175000017500000003350411270115521016747 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxw%Gu'ϙf$ AD! 0dM0؄Kc\36"Ə d $(Gqg49vZ޻w:a4AҚϞ{w~jU']SxSxSxSx} p<+EybL1Y!&'&!) R1Db?7x~E ܲuG"' %,,(1F!(1JQ!>֔}G^`z/9xh["DL@cD C几@$zl@|N6E)uퟸxVc'lݑ ( jŢHB@h:PԬDt\ wPj:ɶӉX=s'lݡ3~6*=jkU)ۘP"鏕;. cEiZ]x\q -[w+y펫)~_Iǖ!> $ĨH~Z aeyg\:NU6gy\ 2/.=86u~?~%ScP${KPIeW+?wǣ"+D-U+܌'4(5XomV ڽ^Oq-[w<x`V'$I_7*M@~A+ԾǮ#^ըRV*~m?9:K9زus95tBeRb(%h%B`2A Ƅf^( 7К%Ծj豩 ;^H-&@aeQZe+,[p[e)cr*\#8'+~P.UJ*dfWͤU-HtU۷ Ǥg!'[8w''>2xK-%*k);:N[JXm$e)Uhm+T+ccSʻɧZJߝ(vW^:<z\:ٴeߌLehdNʃ{GTox.N Nyo$}z al" !;uhLr\e뎋 B,eks;쮴v:S9N;ڲ5ZcBNeid.naʹZDa Adb5l{M )R)NoI\E-$ HpG_-[wx\SJHV"ڵD\W=Yr-'(e)Q |ok=)õgJ1w n*y>bs4Wͼ@{ J >Z@Tyv&8:hYQs9ocܞ_-&BO(Z3<|z "5@_T]|cN>;$Z.Ái@!VQ)ω`D7q/ );g,ޗD/|Q!.BWWF] YJ;Wk)=?;tJp^ݸ|Z{Ȥ3Hz3L|ܔ-‘8z5P/8q*J]I؃:r-@DBl{ӟu콠8#5G>\?Fa"@@d=?9rުW]R ?PGvjUs MFuwr _ #qԢï\z\w&9j"|6Q R)Zf]Lz|ZUq rly&9* h׋Oi{aN dU\*v3\> (0֐|JәYlȰ []sv"M_]x>Wk<>fͤWGZ0tvyx?}.|nGf-GfWْuPwJ.m+,U<Q6(X *Zin|pI3l^aUo4Zs3uiOU @W HaT}.S[c@4;Q=h%*O-)J]W2i8=nYũ]7 (=^}u@,Fy yKqi5<*Ks.7'I=WMG5 4~2FP5W! (or;O!1 JxlU"T +.LI'맟:+loKX@{>gu,݅u4~y\>2'/ e%vz,>bI_ ?A1><-/Ϗ?8X-_3dq5y0٧>_,I !ø>q,z=#z)K>,>wpÁsٶ'%^}z?5t&+1[$k&W#8%2z s(H8}tAql@:^L礎_PT9dI}ҜeYQDV*r) lĶl.sVw(P(@GGT*Jeל۷1?6 -q}(>63w|y$E}ae 11 k.F)auދ`3d&)-|Rϡ]nf :֤R)\ŶmAA&gh)8'e*zu^ǻo0~8w-4چ41# Zi4{~Q9]HW]9 x)MQ~alͼTujnMK@e!Jy*-siAeݩlF(h,vpK[hɥsva_lmd}v>6JcDy PxӃZd'vjnzij}sU;&(O-갼5]w aN&3?չyA+mtONStb;6Z[(l۱m˦I!:ρܧ t?%۷b 3(EuDyQL'}լV`+?󌪄\tsqRZ05ٿ^):1W0b]dgox)-em^陗3FdN7םܔѝ$[Y\pvJƶl AWv0<>gavkrGbZQi&}jT+4(t<^91AirQO{PFQvyǂL!e+i~'h'h{~\A"'yCEԋVql4mJљ6;_#0>?0L%Y)Uhoځs>H~CtYCixߥ+/~߬\,L7E;2~Ջ? VnR:e+3md%Z2$'ضR!YJa)\SKN]Ǻ}L|~hRw_+Y{I_]N&Sb./RL3zS9w`ZdR?)}u؈ge;:SRiGY9r3Ki+fBhRjlq]PcWbLM x J%x aIH~?q5P߅M zhV~Ӧx_p=Yo`Ϗ:SX)*e+i[ێ-”-BiPEk6{PZCKdSYR[Yy1K{FsTWd0S#}~?[Iei+/~_lt;[ lZ,R}O9tZq+ꥠOB~~aIݣsj2ek\qёJi 6vpJi{1sؤřc ɧs!n~M$v l8>A`ZoJOwS׃( }6(X,?h+(G) 9u l$qfT-5ej J.JiʩpfǏ905H̟=ZB jFhIb+^tfcNiI1kk#TJz;m$~p *^b (w5HZI-W0N県BN+ƋAhfPeH Df%y~j$N7fSg:@0DDVXxH "AJ *~P1& D\T{R=PQmCc=nw A/-UjSZc Tk !y* ͤ f(euCJ*,FDL|Q<QFheQJR>.LAE8PQ}HK`Š۴'u? lDAd0V(#%6~bM?C2-l,1b[+he(HyAVP"╦l0ucƶm,±HMj T(:TQ$I"+ Jk`Kӗi`PxS:Vs98H_Kh(0޿XvŞ/=D#F}110>fdWP100rTUbe\:et5\pE>|8ս?{~?d&LhK+n.USgڛİyJ~ߤ=~x}=MӜdހ<*1 M܁ v6S0Q (1@a 1)?Uqr]bQo=}t`2e1cηBj5Vl^sd)<:.S_9mGpalٺȴ~(#!AQ+x6zZ 3-%R40z :\\7oR{ 3EE".PW#XrصmR_l+^(K]6,wfѓ<@ŰᏤ׿W}s6/}pШ:S8j[0.oWJ6ok8Pc&@[DLѩy2.n,Gnoe}OXn}e&uZ+;AG|WFۦVxloB)\c’Q컏NdF3ruF,# wz)l}}\tKѵ?䢳7~7*W 4d0, <(U(#+zeߤ7!:6^ځӞ$ ;A(y|qu1 iOQ);V)Ee_V.7eb,(n]Rk\̞Ú`5=Pv96N:|nG[{*]Dmt&7mV W\w" [Xj<7< ğd҃8.TBV&?%ǔÏ rg2׏?(9*@*ؖG_w`}mϣҋ^F6eZ{!d҉ eh1Qa#J5R=0ghM@1:>?u|K`R5ʌ(<&"GHUG@*>R)GDŽqusX?`"AtsW3ǂu 86FD8Uy 5LkN c&ךOCEL~%4=դAJ2w>iy%(@02(McJGL(*8. ׎\N2ũXu},8J]֚`m~S3ł Xj]{E~.@j. ) 髽wyMH0~xʒo K1Cr>2',<#Nu^YGHAT(p^.Ǝ3͡Sa^jj(x`<f4Ld-m_DNj^bDgn^:+=^{H1~Y8H=?4UW7{:~5 !& b< )8Rh #}^_RX_@~`_w?Ă챈HE@w85l>`n6l8|6mm^(#}|n1 u~?n' Nl囏Nˢds6{v1`0A JB 嗢SGF% kh+}vp{TUHlH!DZt!8O()-[ i }qA0RZ}YU{%L^V}mF{oZe× K&ߊkӳ\,X@ɷeN(Cѳ`j^1CLF/z]Q I5jW$z6m:yҍ|k~?|>_kxc^tWH-L&)yt),ưT p0*!=V<,o/ 쮜v]X0pAy$[?t]瞽J3eZV8Cc>i}T4R&nsظa#~++;vUjA J鶯i )4D'IvX,Z=y=7,꽯p\KlY+)QL?D9pQ*RdL|-p#v ƃ~~4r9x(u:xŧ?XxѻQqJ?p?c-y߾gGxJaj; թoNa,@בM8V۾o{ 2ؒ5oD+T*r~~Y>7w}ckel% ?Ò}8tJ`ٛ0ƚh X0:8?]%F C(8kp"#_mwo4X?M^LgΘ>D (ũQ&&B?f{A. dӮnUT]E-~ \ywID21kk0⹂`v٫-d^> ~~LIJPSn ԑDY/=1{1fm'P}kQBX.MD35qt/?? ?ã~!f t&qv)#^*Tr !]%fs"?i,PuyaUIu?f)BF$oۺKN%u&܄&!*:qeYZ/5+@%L !"Dz-x@wuoOj:)^\\Ýcst3CE+ث\P݈@2d'uɝw^DlX 9"]nW{(B;y)j#,r'ힶZq1# gBaX|#rոIw֘w+;0ݽg-I_qTlH3aWL Xd0u1Vbd˓e1q1axm~X; 0t=tmyj~S0Kwj.>{s5q\Fc(iD ܓ/ҹ{&U'k&q1sU;B;2Z.>0ǁv4+ǝHL/'C|\P_1lh6dVVH_qZn=XȶFWe2 TuGq?1Wѐgno~c~m޼܊eQ|33fw |Ng$x ]2 izN}i*~t5{Z wqi,I#RF̰1}ݜg |U^aչlyl(qy0'+{ χ=*D#5 T~Tq;5L1@1f"Kaj$VyQ. R2z(<1ә6»^[3g%g=5 璖 O`TN]kZ9J@}ݧCׅHs `Pn&H _7$wTLMyIկZaF >~)شкJkqLJ%Srr?W_y ü,z% }+]F|3ߔ6~Fغ<ă5}xpr?osr;1JL2T9$ޡ=vNǶKaeߣ̟r^vvD"<vs~=%efӷ0:`0zٸ=s/m?#sۡ"Sӂ aߝ43?k}ru =IGk>x ~s9Y:w"uyIзz.rrzћ3^vg96t˲|S]?aй@R=w{g,T%}U "TmLy}Ltf&\ @`X9tP?zL`t1.dm`}ꁮпed_c*Ln>6I~b^@oճ)lW[D\rYuլY ^eB6xgY+/ZEi>~γ#v'mDZ-ſ9cSU߃ypHh5<ցvJxRf?~3?vEg ^~\h[ra7oyљaB_ϾS%(0meӊ]7>|՘cUz_Ezlk+5_gKAlsL[}D3'Q8=l@wYfSUOڅAD=71z~}=L[!0ĸ@KMc}9V>2yᙓ|lX^5%\{Xђ1ZFtǤ~uu37[#}1jkޅn]yF5'RI+ʼp\`'Y[$"e믚hs}_DljsVI m-|!c~8I!f!|6 ic04<1z/V*Sr[?zQY)}u,i,U©`[ & 5J@~Qk_ΩBĔ6HQx-M ڍH|Ov 0 pĽZ+(mTς9]Iy@LMjdz^3w {|C4$C' B-_{~CsQqeYW"Nȕe^Y" ƫDײЩzk8*hgHnDc/+C:Aa'ëZ\x^d_7UCkd.c)/QEqgOS1IX,صgvK  {^S 9bd[9pEG 7e$`5޽О !ı4TR3ܓiQvm~˴_gN~w!M B=: sGvU^5xuFDo9 OzYb- ^B~c45ջ&3I43Do8*w޿Q!xXq7=zWH84L~Ev@P"E(a.Q$&$.nPbƒHq: 3#Q-KTGԣ%QWUX;^%JT[pu:H9x爺~Vs/Y\(6˧_W{ƀN$ joΖ@U5FQ]($\m$r6QYdJ1!&ΓA뵷rT1 @VU.qNPU҉E<5­ur'רҫӿMo#j&xTw~Ai1QA@V  '!0Tc" %Dʍ|W(9V@נ ɡq!hI8NjѨ^[bkw}ƕnGKgG%M)䦖PZ?$H#@"!nL0$~Wբr˪EVQQcw$Tjl| JՀ#3x8#ݫ %WPd} m0U3-$Z<$_?a7:Wq֑g#43kr3/|\]K]CwӢuAt^H DMm^ZOhK(.v[4 4n͞kOZ9>dóV-;0qIA1B-Im[hL%EݽNiv#pSk𶟾xf?ng;~{HϖoW׭]Mdm\I_G"}o"}kԓ>RZ>IJӽO_mkDrt4j!VH]jVEnZor-n?Z^MQW|?\sHGrB͟ZM^'No$}ʪ'ys"}qFhM؊5Ɓv@z޲{ :*RN8bY|_P)QRk~JZ}i &BGDg~;m/qotƛ71|?SA <ԙhil In͑\/x5%?n^]@,uʼnwxCh #|u>{'$x=mô-^DvRܢ?pxu_Ք)KIJ5T/5^R5v:z>g[kIJ5/ʛ9Lo$}u~߯'}}Ao]ߴRIY/ ck#'*#]M.|qg槓'‹0454f3WWw ;9s7ڙwNpU<(+_y*S)xAT |W\ WYܠЩNR8Oz*w*1G߅1]b. asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATx}YpdywzEwcf8ҤdQSRPR$J*~]zPǕT*OIN9*qɲHddD e4׻۷v  >To{?%sl lckM{DZM{DZM{!nu>/Eٽ&9#o~Q5'ıD?xŗv&M߮4 ~&?mB8ѱ5cN>l6 \o6;v_ںK//|϶{w> +gf*I8 ++/͎UU /&]R\.:;R? pwV[!9ɂ׾lm]OF=m&=m&=mh ̓@`󲳍z ~eCo6zml9'ӔM6V# dԯ9FJm#Ǧ`R$J4LB Nqq9!Yv+}Yn@QO˞DJA`P&?(2W v遱o]~a. */'cK/7ţ{C^o,],W?_{x}G?BG{fnxCJt|;J ? d_ ĉpKVܦKxӱq8q v(hBiy>Qg\ڼM(@Ep7*P B&&P* U7ZOm!7_ BM{Jd2XL4@BX *K èeU _J3l%atlBP QH&xw%&_\",]X ] $dIg*a3+n\5J !s+$#4i|&Y`&Ξ HZZe6 ygMŝ쥰wFO*v,{;1$,.g{̌;{j7ffplp Ȅ2"[8lQ<'Sld| 14AT Jmrq/US`K2US2, d3JX~jYQR`) HƗD;Pw^}*FgDEi2A }ͤ@Q0(15R BD"_8lX(5hY Њ[6]\\D6APeJX(0*nEGؙYBO$ 35ILMG8aEyL⾧"D8j`C@ =Qطb<ȉJx}F12_ʮ~*=ưg@$c<`8w24ng"vۛM%H$A4 n.8YUr3lV>"w15(>@LMrh$ dp# h[|fB߾r{k:r2$f^mr<8߼`/>] E0Dx}HQJ155S7P" ߵ<\1+Aj[NeX3E GΌ w]GSXD|x^KUeźC,C\} k'\Ś{w/5k,:6^Q^$ˈvw[`852"r%kCC,f_ͪJHfr;rƊXe.s 5K'SpD?3}XV"} b%oOgҽY7vhMy]ֱۛCV|;;Nc7>pK߽Ux_/<YnR J)t]3fBEHy,Tse8[ɩžLe|ߧlƦE(B2B^.@DHT!6@ś quj*y=L~-@B,26 `;^Id_O\'&>c#荆L \zqڵ@(B$x<tlT _]Yέ sBi| RE??8آf3 ^חR?=h>Sl>ϽE0MW&1yeRx<AtwGi&,c(|&gqn=89ģn}}vz,)zQ;z8<Ű ˘[}&!c BA,Fa<#T$|录e{ J(Ʉ !Dc=Nf\pJps>/%E5H !ssd2 UU! VG[ð`DkNK%/.` %s$wtI7!xOeZzJX,= !b"" T*·!{S ܤ`&NoNSƶfL wxW50|c:hf ~FuBmt-ͱç/ ;:0xșqB8@m||z)*M@+/>!zai?Ƨn9[@EŒ5hOpYëvׄw Id&rb$DS]IC׋d T=wFȧ P6MzPNU^' 'P$x6X|壇Ry^\&lo2d 0<`f!  Q0k̓dH0[Yt[i/,/4M(nKFL~BPTUēIhD]&@(_+_zߪH}ѱxgͩFab*q=C*PK%0Y9D2x:ER0$5_~Y"7>=>*2Ў#1躁y;Fa& 0>:'}D2A0ӟ,pÏ?n$xއX;o^DXB8),]|' n͟:W$5S>OzodRsվ_=7Ƶ$^mD̄9JUGi@L96o5LO]Q17h0(5LLT44 *> #DQkIYdb@$-EQbrp&*z_Fĉљθ*izA hTt1Q1@DfFh<yo2حT #"eMY4Gɉ[pΐ,/IV` 0#~[MHLP5 bRjgs9:AV&P*N[- 4j|Ui:' JB&>zCetWRw3ǧM_ݻVl* <Ҝw@XVUe1V`HawV djbtJ1tTN?I( o\"G4-NNv 3_ $"Q"QE(@oT>{Wggǒ'v]Css+ْ.I G޾t Apeq0ylf_)IckܥP8 L}˗O87S.M2?8ݤre,>K 0y<7Wz:_4Yyh:2\A: =t\5Q k ,Cx.X".'NΆhE؇FfWջR͕ DYo_WF⏬0A^gP gAD`6cL+} ʉ5]`9~١d@;z/` r&TH}j4Irlѣ%. T]2I'ҡ㭷{mMT6!d h QRYD26NlɮD$o`!b÷oTUi|4,_5Y2ܝXig~/(.9ڂJD6*Zȣf^}–`)uU cxz9v򊵊,ZW[Bʜ}dTޯhI_WSo1—]%+h #[UY:c^]x4FF6l  b_S]i6(dB8WF%]4GNwlEh?9wd^xP[P@c}sscWjT珞 zK2L. %͍V ߺ1} &;`UxbRco\ Jx`ZQS=ڏ fd>PzؗKW{ܑ{=f{o pW0N[/4 GVi, 굄sjvra0i0Fu\4]hw~"!Bf'sPlȝS\n B+K8Vmḻ`uG2vc !8:˽3woU(qPW:ڿFEJ;yU &ĹM;5?o(q"w6*ru% E`6UHtk"$ڜ "msP7Oj.f'"ˆ[e%<;z#/٩'m`F[ NcO%[#'ؑy0~{+1_^pjyut??oF(6RJ9ݾ\󛻆 s)ۇfqUFD6< {7&\Oh~6p|x6~,~ (Cs'~'}5|v`/O1'Ɂi*2%x$Gzn&_hU}f`PzV6JY6Jc0j>@mOIvrZ_CKf7hTv~l ~)9wșہ 9h@W@[{iFƈ~XY5xaQ$Ef-p3<f;;}mx[",IZWyRϮd&E35UB.:9 À֩:,{JEFDm `!B;!"Z QH`z[2tjsE+VZ+aN!hji.s25+FU&NTϯZ6&jˉ;>\&MAvkuN{a%'jqZ 5 7s.>wQ~G`]>ӎP;ܛ;:~+ ,x\vVklW6ppg>RwtRV &A=ԾS~Xf[MUy?UVz?ZB AQ3lZV~J/@G J gYڿ;5~7[M5#B[z"n5ʈOyuO/~S7W IjІڌ/iKwPV{#+u/v Xy6_럽jdH~ jnv XÄ$ɪCW0zC]y_Y_uX(O}gPFl5XV۽65inkA'nB_2i׃C[Zgzi.'FmۄXhߺId[`*suo沸!J*^ mF|[#. "0BV !0cTUʼs ȩ}s9]z NC5|圭&yEm[fpu=:)@SN giHj:%۸AGZ] nK^ζB@S G$pP%v Ya塝w45'S0P&Pk9 ~=ߍSu_o֓jMŬ( !½-Ynwz~o=u'@Z?Ikiq*%W&⥋T sM̜I@ݒf۶( HЉݾ]7sFnjzm&fLM (4M?*%W~i׮6 Cp^;է[_+7mnvOկpk| Bp ?|H*H;hFfnt6Vʐkeg‰fNkV)g]o=uTk\Ϲ"T ikNn5 nmJnX_.r|}`0u*VqZvA憖k;)v8QA[mm m ݉ |Zpkftדn;"Hw5"ZVᶝZX&ޖRٝn6Zvm%@ÛtV̭"F y8)hk IǷh3܆ȝR6@ ~ˉd0u5IENDB`netemul-1.0/images/computer.png0000644000175000017500000002573411261705352015725 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxklu<ݻ̕ !)Qe1%Cb'@, (G+lNlCK@ 8l'sC.@ b1E7Q$G$g8sZ?psPTWu{$<.MwcCE Y~ cQۘ[{pnC#5xӉۙ$ˠ? |T&#o2IoZ7 Z;-w6YB(;~WPt 睄D f"F(-o0H7#(9n!;< Gx@|DE}DP/q]? 7? T@J 'd4BNFFD( %T(P ©p(N;wxuC0|/{ߜ ?OTg(@d HIHf4C#|I%g'pDlQp@$0yXK_h\7$~eĊPj2Rd$QA4I"QZ0F8Ո@8n)"# P\Hmt]r\ %+B1e0]I`i(CW$GR4446)h Rb Bq2xAwS7p2`Y:Iiᄑ  H6? Hu}}eӄFA  @3ad 3̌IF6X>1-F4F#$wE3Q@ڟnK酏+=%7\N Kyc  l)45ƉFZQ$3,͸ +@(X:r%$(P8",&%@xwS7J>(bq+i莿E )7@( @+'AciFq6d9eaOƃVР$"( @7w˜R4ୱ3 [+_HلN )~#4^ OR&&48ll2r"l2֠b}X_i>T  2ԄbbFHB6ܘ]o`|,BdД6&6CL67Llnl@%族62f(Ğ/OMi'H5#\D~?Has p EU!_ H  @ f6llfHX˨0#`Z!hLdf̬iNAV1,azƲ5qƞ;)___VOvd `#9Cmc6&Fk6hC$'@A* 4Q>ÅfY#-3Ҍhd!Y%{シ,oW̫v$,7"ěmLv1 !P4ڼZ@XJ֨@d18~D]Np3 8EYR*y5_};'0>t( 6il&hvІ PP>PDhDbHpkʴo\ 1drD)G?HR`z_?)ccyAJ0'mhܘ.&k.mnh3ae(hDcT*G("1ga`82W (fXHDB(OKߖ/_X#tFCp \AEiPy aa3al rb6L ̆-!ȊiY|PG4&x{dPBDVD K_7}* na-|Y#% 0'3ɋ&4k`>dvђY!IQ2r0  `hNubL&s4l3ܥX_k\~9Xkbt 8Ŕ9Zvmf 4bbܘdhV9 V4H5l)TDj>b! "DwѽKqί|+}¾! |K__> ~1@ijWvU`6f5H`pT-xlN'"?O PwDz8GWWh^m\ מНK^Ue~hj]lWrb۴@#3WY?#S02Ⱥܰ"tבLq`tj nͲP%޵,z_,%D^ױi*8h*cKor]hMW3ei#Ñ$L7eͿr#EQ H2`0FYL)kpI~}Z KwGx$M/'}B7s k_DՈ8Q4p1~h 7g{֐,A6Ye*`,UF˜< RX*z{U~/bekY:ޱ.i*p#PWS2?oL.&˙->ѓ)5ĉFdв~sGߐ S;(H_k7 =ŵ_ ѻ# l^Zh;j9#]1 .'F^6-|qdZ)S%6/FSo/V& z-K׮/˲h=s2XD>.'Z~S; r@˷ODkmXZ/>H.!z`D`ھ-얽.˯eqR&Z(:ٹ0Pyϼ?Rn\4f2KjbxX#RM3[y21CQl?(/"2?|@enzN.vE˲`YzwV6P˯+cx<G|j4sm&?1kdgKo:UnMI  DC=ct{m{=t.Ceqs? k1G?Ag73a6ʸ> Ifd&3f*8'Fp |g֋KA%}wKlw{=zvv.}~lNBJv,|6 pyjVB#:_poQY?GA}c$c һ"]ұ]xq\ 8//&6ތ˗ǮǮMll5mMyl5ULnXj"A)U.=c{Lfͻ̧%6ŢҹnĶ5's~-wF\l8@eLpiŰYlN$,470 >vlͺDpizuA:~護 ̄bj/}A3~m_[`u9G&xQ;>E}}H4eMF$ W"t0 IKOhv~{eA߮YEf~UCgXliH hIYfXmɕC4(@Uo]"]A;!sޅҵ/zk_xG0# Q^zvwwnv߱niXxW_>[||3m G5k$npxݚ]qBڗ{"|o~PY| k6xLpu;zNMh|AgFfJ4n]'}:opXUf87ijƩML6yj6MSsai45m@Ff#APA!v#.]}۝Vpӏ.>lnz9_0s"ͯ}3fM4qxiEm&4ͬF~S.6\e,Hf}4=XMC5aSytb6g<nc~,zx<86g `'Mkf(?+Wh0 ă607yeż5s<#\ Aʆg*<|4~~X@2:%"JQ'T 2Qg|7y6xLYBG,tԦf?,JaHofâ G!Up"NSNx+oAEGd\&[s $-gKHPlkPZ-ld \xbiO*£ `GZZ\i`ٖmYW(IlLŀZ }90˩L\=(QX+o_g_z~>7_`z7M6ShfZ34ڱ"`7lgol{#˹=]}׃V۽]1˥%o\T !!5B6<ӗyFx[%;! \SrXvyɈ4uQ³} 6rQFGqu O3 1JW-K ;K8Xsh;jGF$ϙ]O ^ުE~Gi|&NXAHC: xnͨ" P@:WxD B jVt<G漄aXɁ  @.y>4Qa*Uņ1 c,<#> 4xZT8<V` D&}wT7I=]ZCCʞ N0 }n񺆩k5p@H.Ch㠠jRR ٟr` !86Ô 18|"JGpLRcwVl L#A:OGPOT$ lfӈc~ LssIbAsiӭ~A 2t,=.yM 2h/_`s`n^_cqvJg;aNClqu0_%?'ՇΪϚ]#p˗is}{:cGX 2O읤TU^U#\!;ӿ@k]Gv~R a'@Q ]O߭cQ^[G2c)eFBx"׽Թ?Mjj{I{׿w>|n~/l`BwǏG[>5ՅPW>K: ?7a<}ᦸ~oG& HMFնvQ~3&:M-Ww{h@X޸K8Y�wo~4@ึ(<6M1>BuHt~"l?95-E׉|g4!go4:d X3=2R_)cХZ~Npu?rwZ=z/=lT>wNl{QUvXGJF 0:]{!T?=!GIXQr{=v"A7d 2fWL@AoƣޓѽB.fj`TK6*wOƹg;'£9k@'4j7O]eBH9}DK14-Ú8P`58<#>5=(`m:!!Etrǖ5,AUwi`Q@W7M3}=\(p#qrnIa3DD{4hy KwKs?{ :,V/g|-i4w=}rB0j+8*GPpuI.EQg<48r%+_7ɠ1rQU \GN G{^>UuOLt3Du2IP`<(#rCU`^\a#y?OטEY1F]GN MwGy-t, kY&rCZDv\0[,FP E8PFﰠBՂR-PG)Ad"-== ^}g<bsN!{+b%edW^{gZH+Jum,vAZWʏToȕtu">@.cN -82ѩs έ c5 y 㑨Ȍbyne]\z`dB. `Ëb?>ildAU'X+e'A^k^{Or0-6=rIJZ*H'~Ǥ;)'u nL:v8J8"\ ^}VA7~\}žv,\#k{˟1 @p(dNZ5Ԟ ZPauH~:wd$Xh.;,JKl?y/{;'ZsDBkA( jq`1>{2#d^ z!%k_?ҝ s:j<qjԈfjl^]Y4"jxzc'`Z9 F]sEM.CW{ /w|zo|}wp]6Ӭ/_np9!){CEKPK5J6?\t Y=.ur+I~?Eyd`{* Ƀit*`$3&U*/P j3[:_BKdzo7?+X30818mnΉQgh(YZ NE՚HVh8y*Qj N`AEК.^ @. ũ3٭1*)̝lH8S8K? rUGtޏ"KԾ+'W7>Αcplg-*h>o },Jrɟ_G/<#]VqsӨJTFф,7O(Hey~Ox>!ż(X.HVGc}u8;r]Zth3$: ]ӛ0ijq:h' fPj_CT7>Ҳ%!.Rv]^vA|pg[1t~F-72 <p05QM`u²oOb=Z%H!M&>DCNu{`H['zVcs_ '9j"2lRLQWVf6F{zl hxu:rŰes*H1&} `}v ]"tŷ?zޫx:)@i>\c1ѨCLϾ>![ʕG ZI^G!zbQDzSB! I{/s^ߧY 縅*a:ߥ,O. /zM <\A3a}l0E$n@Z|\.R/U#C ow @| |{~2tv*ztI7<'>v`x1(}|Yk?+S }6.DɊzNv5'k C#9vy_C>Z7T԰y3[W=u~=ݩssssӿ=IENDB`netemul-1.0/images/source/0000755000175000017500000000000011305026147014643 5ustar frostfrostnetemul-1.0/images/source/cogwheel.svg0000644000175000017500000004423111257634326017177 0ustar frostfrost image/svg+xml netemul-1.0/images/source/fileload.svg0000644000175000017500000016607511261455471017171 0ustar frostfrost image/svg+xml netemul-1.0/images/source/note.svg0000644000175000017500000007105111236630460016337 0ustar frostfrost image/svg+xml netemul-1.0/images/source/clean.svg0000644000175000017500000005772511261455471016475 0ustar frostfrost image/svg+xml netemul-1.0/images/source/refresh.svg0000644000175000017500000004564611236630460017043 0ustar frostfrost image/svg+xml netemul-1.0/images/source/network_nic.svg0000644000175000017500000014305211236630460017715 0ustar frostfrost image/svg+xml netemul-1.0/images/source/log.svg0000644000175000017500000014755111237622011016156 0ustar frostfrost image/svg+xml netemul-1.0/images/source/computer_fw.svg0000644000175000017500000014670411236630460017734 0ustar frostfrost image/svg+xml netemul-1.0/images/source/cable.svg0000644000175000017500000003704311236630460016443 0ustar frostfrost image/svg+xml netemul-1.0/images/source/setting.svg0000644000175000017500000010753611236630460017057 0ustar frostfrost image/svg+xml netemul-1.0/images/source/play.svg0000644000175000017500000003542411236630460016343 0ustar frostfrost image/svg+xml netemul-1.0/images/source/not.svg0000644000175000017500000003355611236630460016202 0ustar frostfrost image/svg+xml netemul-1.0/images/source/router_fw.svg0000644000175000017500000016036511236630460017415 0ustar frostfrost image/svg+xml netemul-1.0/images/source/install_apps.svg0000644000175000017500000005722411236630460020071 0ustar frostfrost image/svg+xml netemul-1.0/images/source/NetEmul.svg0000644000175000017500000011032211257634326016746 0ustar frostfrost image/svg+xml E E N N netemul-1.0/images/source/arrow.svg0000644000175000017500000003157111236630460016527 0ustar frostfrost image/svg+xml netemul-1.0/images/source/print_preview.svg0000644000175000017500000021121411270115521020256 0ustar frostfrost image/svg+xml netemul-1.0/images/source/redo.svg0000644000175000017500000004166511236630460016333 0ustar frostfrost image/svg+xml netemul-1.0/images/source/router.svg0000644000175000017500000006133711236630460016720 0ustar frostfrost image/svg+xml netemul-1.0/images/source/properties.svg0000644000175000017500000005300211236630460017562 0ustar frostfrost image/svg+xml netemul-1.0/images/source/question.svg0000644000175000017500000003534711246541572017257 0ustar frostfrost image/svg+xml ? ? netemul-1.0/images/source/hub.svg0000644000175000017500000004623711236630460016160 0ustar frostfrost image/svg+xml netemul-1.0/images/source/edit_remove.svg0000644000175000017500000002637011236630460017700 0ustar frostfrost image/svg+xml netemul-1.0/images/source/filesave.svg0000644000175000017500000016566711261455471017216 0ustar frostfrost image/svg+xml netemul-1.0/images/source/edit_add.svg0000644000175000017500000002605711236630460017135 0ustar frostfrost image/svg+xml netemul-1.0/images/source/pause.svg0000644000175000017500000003632111236630460016510 0ustar frostfrost image/svg+xml netemul-1.0/images/source/ok.svg0000644000175000017500000003614411236630460016007 0ustar frostfrost image/svg+xml netemul-1.0/images/source/edit.svg0000644000175000017500000005546211236630460016327 0ustar frostfrost image/svg+xml netemul-1.0/images/source/undo.svg0000644000175000017500000004057511236630460016346 0ustar frostfrost image/svg+xml netemul-1.0/images/source/switch.svg0000644000175000017500000006354711236630460016706 0ustar frostfrost image/svg+xml netemul-1.0/images/source/tcp.svg0000644000175000017500000005615611252473767016206 0ustar frostfrost image/svg+xml T T T C C P P netemul-1.0/images/source/left_right.svg0000644000175000017500000005052411236630460017523 0ustar frostfrost image/svg+xml netemul-1.0/images/source/table_route.svg0000644000175000017500000006152211236630460017701 0ustar frostfrost image/svg+xml R R netemul-1.0/images/source/description.svg0000644000175000017500000004113411277075354017726 0ustar frostfrost image/svg+xml netemul-1.0/images/source/print.svg0000644000175000017500000020161111270115521016515 0ustar frostfrost image/svg+xml netemul-1.0/images/source/table_arp.svg0000644000175000017500000006624511236630460017334 0ustar frostfrost image/svg+xml A A netemul-1.0/images/source/computer.svg0000644000175000017500000005333411236630460017234 0ustar frostfrost image/svg+xml netemul-1.0/images/tcp.png0000644000175000017500000004244611252473767014670 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATx}wS3r֝NBBY$%#ED3 &00ɶ ` "(( Nٝ 3C맺nbf|-}/| ?._+|b|/EA,J,\,E,#`0$Ge,!_is7yK1YփyKQoHI,%`A,%,% 2`e̼eK` & `2Y ,%31KP@WJf,E\R ZDD 8Kl%u 0s?7`b&8zx P4 fA |&Wg(EJXي:V ^SC_b X+` iP}] eӖNRȬL >l+ul+'IZvnWZf0I*{:/ H>Sy>KP o[ܔ"%8ei.h'$,{/,_I(dۼg}'P~6s(N߷9B"9>vp29VidOQ?|{vUB0,ZNDHs)Hg> cuZwL j=;Ww_v{K3 d"DD H!$)K<$ '}NpEXJr"E4 Gk߰l2[m %T^<u]"`H\% :g $ h҉50Bi BBJɉɉdISR#}iK2\Eh3&{f,-h˜ X6́>04 nQ9ȧMaߵޭIs%0M0ISƒ&wG;XB&4E62上4tw,}z/<4dt* xvށ%ʒG}X@nAs D1`%;iޏw!>&vWm `!KlJ SH;f&:1 Rl0pq 8"S~2z~?]2pgbh}.\ >)t"jl)ҦJFS*t)xtA#t""0i`t dh i>\Fy-񹫋}bpiٙD͹#bഫH> f5B)E$E"E6[E1аJːw%C3n]`fC{V.ۏ7c3;6~{ƴ-ZRXR__#篫OV2 "{|(8NBE@O1vŋ`@,IЎϥJ0AA<XB]aS0H)AKJd>;@d( F2~IY׬}k+Y툽<7YRTWapb -A?>:[1zҗ܁Ag߅K0cȻڌOjU;gOk[J$/.)E/(9MhK[c)%,RwVuiZJ$;TD+ ANTȰpɣθB_أ䁘3Q@ƀֿC3mqT{{KPĭy@oP~60nj^nlM'I` %@7b츣虋^4NYƻ.|g/qd,?.T`@CJ.-tY~i%ru!Reoߣ)"A G@|b/-_OzW+c5Ꮐu+ԗv1ֿ 6]C~oÃIu!3X@f;2u=*#F1v4o%oܲ#ޅG;n-±¬`6UbF@`::ic+ϰMz`f !RV$Y55C#g MnN9B&@"l~w+ OEEâ2o+'eٚW=9 [l;ҐY+i};ޔq@qato.]ъ'70.xŪ !03$gR!Y2I׉:ɟP0K[ bh>vZ,aFCH]/[F3wnC#SZ7d?Cb9cSg,1Wd@oBFj@z3Q~6ƖhdˤO2J&ہR4Ժ+Fߥ e$+ <rf4M{.&=吝GIR8qyӀڴҷB٩^4߃ 1h$\0h51Ob D x]S}0CJ߼#1"c#ƩS?#vP[o}Vh}PE,{Rf#I:ffBZ=_K)R<>AVr!p*Rz0p'`I#NՏھI f .CbTUPᡫ<Й>}<z:ૄQ#PaH0Iv?7G)͗@%ZuQQ @O1?_ b,f*lEdOg>~?e=9U0%:v\gzVY)U V$vf6]A /{/*"M`G!V4B! aEj q'}Hd~?[C${`'@4ۍ{-Z7r"I-Wi&D{W P@Qk0a$7 ZV3Җʎݵ9aU2H<Ȍ?}D}.$e}$TXݕItmEϲJvwL6H瓾M6})|ca۵(m[hPt-Nݦyafą8wf'Z%t.:3"RJL |)S"VNǐB˾=9dO( }o(-K)}^}#Oua@)q= ;G9Їj)2J ?5?nw^ئؤ(K!,` !D\+lB*Iޒ=9dOz8E{XRlI\[8P RXUf.Z}WoĩDM(9c;J tFGֹ3nJ;̐"HfKLN"dO^yצn|L8scsHg>G';Ivv;*M ݸXN_/FmKo/W?9S[C&_b٢EsJn%? I I R[e Z`TJV3u~ա7<T e0J~w%-.=٤oɞr祭++0om/\=(wiZe(=S1J \G\W;q+4@K@x]2 Q7QM(B1hx{P8 (<(:ܺ^p7Ǭ*⩝j@Pɞ\KQl& Dg-XSOAXCEj}RYA fJ2MC,Cxފu h iIgă?C JO߿L$!{C-ك,җ vLPi؝ `~u+ tOGw=1+pW&msa| Gn <` f/nPtP| .<*r{ۻ|9Oc#$6EG`du޽*[l-3ɞ4Sʚ$Z sYg~笭Zȳ,K4GKk@,QYkֵڟ oO͛ld܃p7?_3y(G6 SE j?(=(| wyqĢ9o:' g;8vܲMƈNDd~*Lϓ ඾0o*_mV]fD Um~vQf+j](;3>Aw6gfB@͕Xu+jy]2{] 6u;oUrn=#>l#fDJa k({g7'{!*g'Z 3Zm34ȫnr`)e,|jng$Py:zwi2QK.9S:bfBoLN)lN)1+ $Dkq@+EB^ xYvSӥ)̒m5GD,|l_m D AZEGgCY2K`M@Դq>pmB?iy팮tYd!=,0;#]ōsڸ1` *!T}NU7 g4^wc'ՂN8"f$xp_@>.eW?  d@20%n*]Ǎ/+6ҸvB兊Ku}5[J{_TA )I,[|V}gzv(\s"mB]M̒a E3fH,ҷ=~IvO ^` ͣʦ95ɒEaz! C莻!8cǐ sU~]p} ?t8>!STψⵖ ڥ$ dgIRR Ӛ?@P<x flyq,clM;$&uM NxNϬz$),Y gGv,>)-0<\OaVÖB+i=9/߇s\AE,rTo`IMI}i3_T>f1s|}|K*@-<@uXzѣthq (, ڏI]Ry |AB~)*$a)LV Bg5o*I` (;XM#+OB@RoKmBʨ΂-ϻ/ٓ9u^@XCϹHr ܵ m֚B2\N{mj.+Nd]wmT-,Y09>UQLc{dX)^5b0Ma_ZSҲl !Դr vcYɞ anOGcKhWjL~e@2HhJ.(MRjroCd@עE@Bhps2$iWNZ@IKH)HH%B4@~TcB,X)*B ^ɞH_=YoV9zSH߷{CJq!8K2M>54R&S-L&ߨ@EO+F@TOV 8_)li4MSXvj#*)HBBŽ3+Y^ xR]ҽ*k=SJJHHXZFZid߷JgT#}{">Gou X䐾liz dJdOC:KAtNiXVw"0QM2Mi >tFj'%(vvP= S@BMaem)LB ao/ʵ ici}+2+N{:$}k=0GRڤϑS 3US 4YƘ)FR3 LqJ'ZשX /Zs/d &i0 IL)X A0Y ^%Z0 B x$4ieؚVF D@R0l%q`Nc?A匿)и5˶ۃl ek-A}I+51`sk^җ3E`u*A*z0R %{ںXK<^ȃF7(|X!dT_r]FGoT#{RJ&%T~̳t~*f{ & ౗Ep4I-"TEh8wgWDk|&^XHv"}i>tW]WA.1&}~Z),&lTEe0'|Pjpw 6`JG? 1l}BK)X IdBJkS~<8z/TIu>\9GfX~vl#*>t1els&z<ٰI%H7-i]O5R6AʆOs0}wF \!K8r{Ʉ&v^nk\2FVva]Kq<X.PrƔ7OV=^)f*R %XYO52f  s ^1E/lIj1 =6NnrtI'c$R.AۘeC&~[J8>g') !4~i|()]=_C8q:)yx`9Tp}58P4}Tێ`0i"i ´>VW[ 3dn 7òj *;BcS:&x(oEY 8$PZpl/(  ѕgLQX-lؔ*0G~4J~պPv*ѯ9ͦ)C@g,;aG6 Cz&=(pAD> Ao & LNGM܆C=D+kP`?̠+Wn8וN-{g)Kҗs3`J҅%BJN$LC_ʿ \q:Q߄EG'a6, Ma9`y+/Դ ,I)1ŕ63GDYA6B% ai<%Q[otIKiΖ1;6]r& /\%toUoS>be/d)Kj/kb)n}ΩL}۴f>cH'&iuB h0͝A{sqNz'֩re7]P] ,`) H~ĪJRvzž!Ёǀ*@M c C¯%!{ O_EӆQMqz`ԅUۋRܸ3~u᱋kU@UblO_/xO߷=S^W~РX#TSOJC3'w<>t!>k.^Y[n| 0B9}U7{a_O0[c)(>0^[Q_<}X&F[Kч<_r{(euZz.ہſu/$y݇U #:ౘQkW[Fytfz^җ"y;h[ssM u(; ph$`}uƦ|ލTJOQ.s5fIq{o~RH |X0 )tp{}cEQ| jǁYٷ+ir kԾMWw@ׁ'ᄺol{oza,7[ˋפ}kRZ" (l^^w>]/fa>Rjx?m/ȡx?; KyzNB@ӈQ]/#y.&^sLZ0رP_+V,$ C#YBluq Wr #IJ_"y@@ >v\~`W}dO9SY85pv<h t7X!O[['{XbU x r/ȑxfOcjO0>`Ӫu? 'ۗ&s3?Ҵ~nЛDO~>BEX?ˊve" lo7xǁ/Z9k74 l GN}$ +Sw^g6y=)Ɵ2 ׽5{[vaujِ{`O\K>;tkugW gmUAjQn*.RX7rĂ>7232qϙ [NYeګN@+TD=o|Tpw$Fmu5یWtCt$(0~\49o0&{22{=Y/+YcJ0Oڰ_Gcp{tuU5]JC7L=q*+<j8f - li/cMkw\1{|]}RmX TZ 32wXe Y4 qV,it}Ht|7ʿ xc|}jd7'9e[۬D1TcSk]yp>׿7ٓvdO.K'2FfvOy컍wRULtNO\r2NUCY O+xr_Tum4T !4l,FSG-KfC[c#Z @ejBiIuʞEy̓flPi,wH4In-*T/W gPh dOnv'{(gLyM4ϞtSoT`߀~f4_Y^Y=HnLUCCS{=>E"U1̙Ng=T^\G|gGu]{rcO.7GeOcK@pף4݋^%+A?R) dO7gtWt{7ZV<{^}q %ǩg! C-o_$6×s[g'"&BE΍1BoX#k_~3w/&}tTSR5ʚ +Ϛ|E 'LD,>у>"D) R܆c~jeYj6h|a{^u냻ImyU=FtxǨbkҬ+3C-/kj]zr|O O1%yx2I^؂5so|OOiMW_@J7;T vk=DCH6WWZ|t~]uu6۲3Y.Q3udL>X%=4>{hyըb Rſ9:><'"}M2F$#ȸwk+~Ҍ{ޙ~E\8~G5kؿ*0TAQVTVu@t[ .Ig?UxR\V y*T˝o^g!$c~cf<ЋT xADTfw]Id|Dv/*h!yۓ;W\հȘ-Iu bz?nd%qCl*/\xӈ{k;;]22~N'0cdmRvw= Zß'A&4yia== utO30vGIҊrccz|aٰ  U!KT^ѫ FU { Se[K 霄ݻ%9rbYܟS~|\'dzi `MqT꘥(>cjӞh돋O?0o~#|K˲BBd(eC 2|we*^=Os+ 0`PQuC; jayc+ >nt) k譲b $Ud1Qoo;ⓛO~se.#}$}N,S!`[{Rk5{2K~>-B1*|fkJں=[##>欽vwT;UrS]V ݸ?ٝÑ"y`{ޕ#6i8N|a\3)5u%^lom/o0z"}ROo9u ǣdO>&ȱ8mWZ}yvfL3Yԧr|{>cTumqShUFu*q]4] %ġ'S8=~?m$}Y$}οNH)u/GiA3F7SOaxM<& җB6H_ay>2ޱV S/&[~r9T=\G[E@}@ m=ў>d(_eF)ٓѻ dO{M``;~鳁)҃l$_d`uj6Q>!r 9hO-E`.cjmdOg'g\9%CISmW=׭_vU{ D&=&}J-S[@J48HV3<6xH%sQX~1_},AɞF:O dOwIe#W5tUily叻gSXw'e25|dOmɞߗe/N +cA?(= >H`|gcν*3:%_d^K/5MIe}IooFz=jo0EH3Ciɞ/9U:גTI'q@5^'Wam_dO~җRq) BH ; >^2ɯIDAT _,w~{| tD[HknOd[Ёcî_Z3 ;dJ/lnqkپqimgm_ʾpO Mf|Ap?LvBSj SSP{ff/3*Sta'{RB鷯\}~ aW}ER5VƵWޱ9|1l8O^ZD/T5MS/yd1߻uD: M.$M`ϳ}L 7ÒaerE AߌEGPN9 ߦɣAתF FwVvxn/]li8D"^=3veڅ (~*'w*GXڨ2;וgY x6Ԅ Vý`˹w|eƜ{/d}Kӗ풲?dOFEoJpqvxDu5erE|oa $ >I3 `.q7;i:hx]P208SO&yȚ/t 0j#e20dOOo&{\yL3@ @Rhͱ{ֈ畏-AiJ)-Wkod2VҿdOȻ#ٓJz].=W$]Q/\eIW2#a2p4*8a@)M*3KISЪ{;~xt#?'y$m{9?Sd؜e39,eiCbf1 Q0ABDZDA" IѸnȸ @p& cj| Zz\X| ?._+| D NIENDB`netemul-1.0/images/hub.png0000644000175000017500000003737111261705352014645 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATx{eYUc}NSGwjF *( MqF1&%MDMb">n.F1hLP?H\ȫ~@ꜳךsc̹9uNGn{~^k1~9 x y2!F^kcD ~gc4\Z:yLg\P͈]}-cYGm[!zĖuޯw2z]KsFxL%os yhE@H3Mh0w,$EK{)B0@C&BHB`B룐~H`PhRF+BFZI FTo9d`H]+^K|1ct! >$!c7jn=ÿq?dKQAER'SAgmL#J)VI", τh `z] И qCHhIݞc..+~1L}6.[C{7 DX ж*EDBlED+BP\͙Jt9c2@eT4$UhL4$™@ɀR F$X꘷ ~eBu#Wa>/EDŽ^BIr)D7W'p >  8P !"(R%]5 S@EHцVBVmJ!oN|@3#)RX ,RD hY!矎tȇh׹x%?2 1+CXJP¥V @JjQ{Ar[@T#tt\k1[ǀ~R$E)"DH2t)B@쀊#8ؑ&秋uz(|i~{ ?ؼMƣ_5^)XZa. JQ @B% %TؤTX ޯ:` q! L1 @ T 4~ 4&1U?lϱ920\c˳fkyCME,aҚ"DTAP'!.Ф$$Ф~ $)*MO6_os3j N)ƄIH(Ń65UCD+E T XB$p䥳_Qc⟿%fi;3#W;$Y Iť]DP]c'wD볠|#h"1".TFR,p%0R&2&s Ta,P U2%UTEA.ރ8[ý8< _cTnލ H&*BjDB$D(*JtNTRmu׭.Ajjr[b=*(f6O &`*DTDzSUTX IYDE(5U7:`\>9v⓳3't̰#FylTſ5p_@*= 1hQz]&D!U:QPIUA 4P-N|>.1)Cp)HwM*NLq#SV$!H_@6 #alT T"C3n(.C{׌bX0tߥ0u5 BvL&NRTѤ .K_݊&000D^T5q'ѓ1 `6GI"@)oĠLD fbUDžlH!$y._xyvQ4}4{Jxv$_8#0ᙺV'K$ ~ЉPZߋLYu2QH?H;D]2z G +q=nBbreq}4&=rj5uitTfA=ID_L*i"iDgIsJ$q}?">5 5#/UuHz>MJJ|8,`0j.T0V^c*abJZh/KČLbZ}oR侰/}̜3rFB+-xµOowd`CkߓfGl5qy$_!s*:sIu.$~.I*dT'↟*ty}'D %^QxdNy$m2`2 ZT亞ךg%=gg&b@! 1e.IhKv.rϾ}}Fd(}lVm1_9cp?J*/ j[DԹ$2LIt.UFpJ x$| jP P[ Fb 騪]M3I$ EOPQAHC)&朥˽}F{}/}@FŌQ;( 9in݅*?C-Bwoj|WbS%Is 'LЪU=. -[> btFL'cM!*E,DWS= jQY j̐K>9c{}fgv}3K)p/y]+qd }D?P\[^g1 jc;ѡ:'SeJxdYtá_5آT!* +%m /#&}B' 5o[?v@MR \KA ce̺}P 3'񻳳ɳU_35*MB|N DtN gZAtnp.G&{aH$OeFVY!R6F$Vi+K@zP'u}Cu躞,;t}hUķ/#+?x{%Ű#ne]a/;796SU7& &\}n4#_{7A|GGK[BS#k b4|16!U tE&}wg=g+N|})ukhC WݘWNsжReosO*:&`ALaxn tn:$͹x5;:'UkjIqRF^dbr(^۝2=b'1lc8Ҋ3A" r) ~s62lye+Wf3κݬǬ'g)EJF3'?]9s+9@vz|a׀^%F% zk)VuOn#U蟆Z=wɵJ@3E"'.:AHFjM?"Eܲot~>,íc΅]+]ǕٌK+XY鸼2ʬ8.@J5a_F¿؁2]'e2cնCI"]&费|*חUWHLTDPmEvDp)T.B͇_umU¨Jidb !2(J "~м̍9B]o+]YgKWlyeVlyaeq6IeˮQJ#wٓ{-;_ҹMg?uXSy 1@K-t)\$DD d2uDHQD`fE@'$pҌW@64y0ɓU;ɳz5I(BRQPH133 9:[Z^ᅕWxay 3v] ĚbB}7>/ggj>a~oB oPD;a旁3jjgAiOdq.MNd8ӽs:]t4ML"ܘ'g4QI)&T4ޯndWl E#/U7u !_zRY1C K&YיA''0NYУ 2&1L Ä́f$(GO?@2JD[Mr)LY | 2TLzdi E4/;>OBj@4r{jŐ,}2\=?Ob9R:?5jSpϘsJFW_Zᅥ%[deyź{sŊX)$)V 5ߺt:r."_#? Iv7XGknZdBM߶X[gpu ~D +J9 L&-zxJy"{9af]g2ozhȖٗݬJsyce揮ʬ X#ictOuYCˀ]."~Uk D@`_:[G9צܧW5㬞 dVAWa+5/?sֻ=e gFėD=whȂ^;=v[or\'(?P#5U *ID!H"/~:ߝ<_7y/5C&1C3Yev]ϮvgD.J6*UCk~5#Df+GZe]ȚNMG2ӍkNŒת@<7jX7kg'><%( ?KNYz/sY_8u9exzR?G ׻UD5YV hou9d@cӓy>!)6fy0ttr8 K2ڹ.{)aV#|:=s.l}sa)\ 꿻9oe0*ӐaQvOÍ O?o,MG._'IGFYah_@[EZ fay6^+g9˅]..d]̶Jz{91RMmNrϏ-=6q; oXrow;ِCX_6<[] -*t1Ϫ SjWg-)f It?V{hwnXOt4cT`e(Fx7>FqhsLE8|>@ί 4YU!vǖmwyo}>[z| nFįsa)p$k +4/a>!&װm ?r׿R9_qWnqK"@n6ס(e9UxbkZzaASYV)p{Ȋ:E1=3F薧(6B4}2—YkHy-Uk tl3.Oß{˶oݍ֎%^ٮJ0`Bt4lOTk\iϏk4z1^+cMP6EV4*?\m ܤ$lG P='玷_f]𔫅 E͐1ZevmЛ#~Y Gf@yx4Z?6V7P16fk|?1{>TG6:VХRUS'*`>V'zo ïyYM4>qwËi|ۜ`4W` ~1qvל}zێ4WLn[<}Di,ԽWHFM*|;%_%z3JoPD ,A%,xUxE}C\G;q?S=ȴ\2.1]߭i4&/`DUU>+g?s_ޓpOz܃̙TEZM> Q"FF.q͗'2 .HC!|yVTZ#S= '='=~/3N7]..rZ皪UkJ}xIH CM#+I:E %%j"TvQ!3@K6o-p,3܀ z߷|ܱ{ OS`4_c ھ #>BU_>&1Y-ZA` k`j̫X-c&k~#Xo\Wx %t  yBSW"a7jIDAT!X-yԲǺ0݆E@GYi,ʽi* q*~j3V dYXM}_pQS$%Ba;bGPZla͗y3쾈 `EOK4j8>} [ʇ\>\#ʡrr?n Q#qhaÿuk^pqǯUo[G\ڥ1M٬ZNi,4B B2w0z@jC]|rHs2/y=s !-CSť-3|K?vhKoծP>_p|7ӐbIZn5\{O&HwJTVF,$q[P`GDѐLegC%v7-1y'cGgñQ˗тU# X4`Pp0B5M0i@x`D&]ª);U7Wxl5Tz-W\С?Xapw f{v*wXGȶS[eZ(VqLd?c-59^Jchb<#[" ցcoӱQKľ㗾T1*i_UMm7T* 3(o[#Di@L\(P0ea$7c Ǻh7Ƴ`\ UA=(`"X,ΎQF-i$h [ ,t7qyBAo/\dĎxmǯ!?Z-bV]Kz8 ~fP 6s9N0iro1zە_x?\˰bhek4W (",վG< 3 !`b/ĎSu#aX)0:/C&=+o\Ȓ ]_sϾƐ}.(9+ey[Wq\ xQ%"@h5Q[-E,&-F  @R>Ox;+ >Gocg_}y+.=:lC=f] +q|4o Coݿ'l jTE\[bf=FcĘR™ lpb7Ƨ Y(p%}mO 877В@Qs1z$Kq/%}E}QsOgl=d=IQr|?yx~ʧ-~p +_xCKW:X^QE {>UIgd5lm9BzOU5f%blm!ɻF pf7{-7łm[g5 #p^Wo|ھt ٕ\r^%м{)0~w))]ݡ;hw캽{UÛ>Y %qus]_4ws)fIl+/uێ\ ]'g>cncӻ#3@Q@ $L ֔^[ ;|Gn ;\ WY[{+b3F#G[;83+k+ /d,(,J'q W妉Mi&υT @AQEw7$+aQ iۚk^PߤaՔ.a6bpD͠wK\Wp^G-e/1v 4g!Mx?^B/s`$! y8wҌ\J.a\Zjh4R";/5vOcO>[{[=W~˱@I `7Cmn9>yQ5к7&t0 })5luYfIn{=6m3 [G.l8߻ ~Ki<7 P0943 3jB,@+irpH b%wOPgf]w9IQ`IQ 7sc[ pdǞ=2OC"%ĊYbY2 B#H!X_bcqj]DK|^O;NP]6;JZmu!8/?tVcWjOμ?9?wor]u?O&I(Pk#P`nhG×!Zi4ۢ0%m/қOjZk>®'!zӗ?#|SGgkWћ-Y  Rє(>]6bRfFp???mu%;w}ʹ|zh'FM%MDV*0ʈPW җ".Ve{d= ª1BjXypayU85O;JQ@54^_0BƕO~k{ Wc#cw@ߛzφL]e?Mrmv,P)hRd4eDo +YC+{[]:FP3Ѐ6r kR"CddGNKݔԅ KRFxpʦ]&jxQP  ss&lqֹW d/ B ;9v'Y߽)ֻ4"X .-2UD* I ^6]ϓYtUjH 0x#ּ~?{}Ȩ\)S[Ygg{˙|feo9XN/-懖{KG*Tҁ=[FWoWEgdJɾ{-ˁ=oP-j?R)&-_W,F2]U*]BI읛޹56f+hv|Xɮ7sxyz+@X_s/e6Yu*E!% LT#MVv׾("{UE&Fj 'P!^[-w ᬈu=U-̣V^sZ~5} ;9I*DsO[Rt*Y"5`"H._ӟ5U鮮?{gϔ(ؖ?y_신+@׃]&r%EOD%s靿㛆7V_( 5H)LDPQQà#.>o}az1 vœ 9/FRO$3v;~vwd TӺdʬ1clC67U&pȁ?7V_x߈RJ{KyPqOnNʝM-L)^c1Og{m 'm!#cT<};Z.YQ%P]>@~ fe =}O?螵ũ%_ur (R\F]>ۈ>tϑ /GPӈ|inUncc[i7*B9+U-zd0]m( A5G~7}}ۏ?]97yjx[?>rճk^ИF5Ͻ|c.yc|O>c'vF!i;O}V>;v}|>g3||>g3| EyIENDB`netemul-1.0/images/left_right.png0000644000175000017500000003363711261705352016217 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATx}y$Gu"25F"̲6/,kX``c|,Y'e$`wA 4H@HxoȬk`Mk*++/#IDxuOqjǣxG >%#|DNxe7OA:anA)"-M "y̋dy/Py#))R_D7KɞӚK X @z9 E){_ Thyi( W/)[8- s\ `|{^!PN_}qJqkBg` P㤣W/9qZY <@k7T 'FX skgϫ^(J>13qJ {Ͼ ⾅ L&ELAGw)&Q!cHdO3)̈a6D_E_)T %{R]={ eSB{OA܇X JPSSTE5c5D5@R0 3HfXA?͸fMn}3S+:` T ׾}{I/(t޳orc}8\%(E7"њң ţ55DD)@!f5h[ Kƌ駙t}sxku\i $0E߰lVP$@@E߹u뾽S8ؽgc[b&MLjEĈ*ST $"`V 8Ub 2c`iwzpkgsh.*(0L@X!0Qk|wOZH8iؽgcy/ hQ# TM%SMT܈I4iMt@`gW1. 4",H lIcXD|/僳tv6=3Y d ,DWDя?U`=pe+}/ % M6ukSu(N4)`'YDOK*hW7(, c 2cMyѹv6sf^qē΋#_TosB'{ kRxdmK'뚺6Vn!"",0b]YDi)E8l|?:n^/cjgH_@(P/YE%5|Yehy>Qp1ǯ@H4Um}K&:nE$\9a'6;+6@$`^srE^@1nwfsN3#K{>GRA@AM!B* _mW9{X! VD5E⑳֦Ѹ>^SI(E^ ||` ZzUr%p_+@Y@=Ν?]/}^}N\OkBOMjmqcD@< P u|WcE 0 + >)H '/8jbjpW- RD#57Z͉N'PG9;Bn\){] a* I.K$HJq^(w@YS XW}雟Z \m cQe,n$G|6Kħ~\oS8 A8|]A 1`7`RE6QJL/=eO0 P}Q.{w? oZ VˬFk*2ϘLFz+HZ|/juwwX_a!8`|a0\~8,KJ~H0Κޑ޳7ܒVB7EqsmS4s`K~J ]*(אB[%C/¸_}0JE_'?(m茋 Njq5sb9$JojǓ暦5xo8"._̫x"bS:$>#`K8S"4B1$an{ Dql@Dx9z|Y/zx=fEVѨc7׵Z=" ),ˉE_-70auC9X),I[d8ŞqJ->7mpENJ1_׺ idX\_ߊj4y/| "+ vh karùc rY& ܒCѷ Ş0ESLpon ^eXhh\_ߊꍘ"zL8틔.Ns\;qA ka8dE kEk8"$T)Z$$P$J`o=>WE9y:*́7 +&hyvqHT0Z]O8wD 웃Aa?r7/l-(_qçD("JX+UǑj&Z7kn&QTEk]Oj$GZՒH#Md~UU=U7,WDlQ|\z̟5XE)ͣQ}H5|@6+mJ(,Bl8Ev8VbM (,`-D- GJLRQG#^j k5S}ACa>+gla r+poZc]+ϚJZ[ǣf+V"U59$٥uun{0b$Vi&H) ʻư CC,n/NstfCחN/i1S^ E j:t4ܼIstg+kk[ֈVB/ڋ?_$%_)ZA{ROH# 6d(jb"THr#a#blv/4*3 |T$L޺\@\ z~x]3JFbi]/hů_aD^E.h_kEDC%&UR[I<"L($sdݻ%FմZQ#T=VkiEںaE\03*h!MD&ZX#MII+QS}"#' :~DYK[D]Gk:iJ{V.^qb`½vѻb 7V b+Un:ZմV@J$<![]a20C)E"B)$VIIȳ,"J@c)P:{hمe~Kxy_ҵKX\>"쭇`źŜ@KHTմҍ$X$"HbD1/`Ͻ66,{V'f(M@H) 0 Gc/xq?7Ow;/~U#<۲TmPzzԛuy9 (HDPьZM2W#Қ)ՈnԴRqHFxK5aW7qY0Y&0ž޺w%XIoǵH).V,!|} {-4y*l3E劅e$"5^H"M`-+_^BbXA>3-4 bq[zv#7w(HiMkžy᪅Iy.WK=6!ֱɯ>隵gO=Pw_!nsk:_ֹܺ}L\& naEŞ@?}Z?}x璸-Up[n\ M5(޵6imZ͈~.Ybl093JkG5: \$H _}_6.}Vu+Cfc ac5`$3gVZO"C:qfwn͛Í&/.H=e}Ew}Z x ߷xGcy|<ml9J]]/TW@((rxB?1v{guf@^G\c߾?c~מtzAuwڝ#+2@2l[&+I?_s~;7Sa!Y0<a80sx pR/ %H)Ya㛀oּ0Զ#DATxP򻀙m1 07AC8bߍ1Vj٭gvmA<1pMc ;: ѬOk'9[7]]_}mC[􅢯tPZ"3N$ Ԉ)59W6pF_㒏NMG[j:h9B 8Îך_~AxCA |&vn #cC6B01{Mq^X7bGOհ`8xH>SlnwŗΜ;bHd={BKxOX E {Ͼ5.uUӢka A M|pꉺjGP @zA#L@v" @NӺ(+] ضyxn&fÆp>[- AȆhr'czR}Zu6gc%'"bhc"`wMLjEdc=p#vqȽ@`Nx2R5zXfB`SAg|1dlg So&R.XʕHвMȅ+wϸǴ}%'us0ԯ~+3R JdLsb-E- od+)`={k[~fvg = }刚 AkE  Zkꩆ 5MhFGS91G#f>o7Rf#䶑A+*uFGƺcA(p^v^`qUO+uv?nlS;E]34ƾ {v>e3#%Hz4{Mָ#¨Y Qhټ1QO7G=US]kC<çm2OL_3Lws;:Gb$]m{b< |8h8]6uf6h@LA:yШK|xC#򟷷=n=3oh)5BL=J xE +.ͿskJt{Aݽ|lջʇ`{brS㮺u4ZwpdhB ig.><յ]O^%sq~ swOAϔCwN裞eO?zS6w| ǯ>Zw+.`%p}>ε&͓ZOް͏yuEw߼7>/nfsH=@^ }Hxڶ*VFcH3bMT*=RK>_w0@vȞiHGkx#l@>k\pi,y;9lYBì>4$?휹Pd셭6`.X2qS|Ͽ\o΋yr˧@?5yWon j"pcC@->̗q|hCWsv-5dwᦁRv, A Y ~n3]9 ~x]Rπ X͙X`R.No7ٿdW@d aRdVLϜ 4ukgL}a,].M{lA]lx'`Gajsukg&@ Hp.uvGH>&[Lbƒ 3%w0wg?H:{`Z W%~E@޼󵏿plzGؓ.r?'+;W0VO8WT˺d%A)pcr@㫏eP-%㓂.ttl;΋O3;tQ@5矹h}9o968_e3Й.7{wփ`ӭ 홲q(\~) !؅) n9~ְX`@f- gQM5\E6 ?לRss,ȠH5]y~7[ϘlEmv`#v{YSh\oX)~cDn2ȫzdyO^ \!^g,c&Esy_)TԒO9w>tڕ-H:X2%zrK+9rG({ ^G)"wLB^Y ^|:êvF?|H ʵ?m_&llS[r5EĶO2gp`Bخ$HS^7^/{+u -Ld]1;6q ?eD?lC+'8ew1}$n=ajٝiz֕3+@W-ڎWIDATBOѢ`R}J_?x3a7m ;`61g5˸/fmklU5)\5@]so1Q$BDD@y YO4"B w/d}8 fY k3A_2 ~&jm/>>ac5 nP#+&DJ-S"[fΙٷ|lĎ2J *!﫫,w@+"aӶч-㭣kƦ㍣#5օ{m,@>g48߬[53'}y}nt}qʿ18۟*#KTyvMW s^P+ `{#o^x\i_N:ܼua̻ 7ڤqáǴ/]c/qu#uR.QU4˜k,$BQ(AY ÜJ K0=m(Rgz|㩢 rp#1.X}㽏ʵ[[Ż  HJC^ ]3{gwۯ(Dax!HUYLНj{zw<ҝWo<ks_jz3 h7 ah‘o 9bE"0irj2d6db2C1&2!6;11vWYH]f'<E1MṋGR(i4;_Wm߻/1V Iuun_r1^wсo/"[핼fɅ( =O:ٻ85w41-{ĪrsA~r>bmfcYfw^0 A"naokckJFppV/Ѻ0>͝a_- (6¦>sx[_tr˺ _G#}ێP"[Jܗ|CJ;:Uwll{ I7$pu:)6_o,3vt|KZ+%o`㾱@۫l%~/<5o{St[?r๵ogw_^z Is, IH&6|o)|squ<yx(D)Y'?%wK-cGj#@wO2M?~$3FSzDD%Vy6tm.W69=HfI?k'<7Lt.vw62'r`VB(r܇p5U \E_F CnQV74hOxǟǭo4K* ]xCwCH so3- 얳e D#z~{+hʉjhuko}|f8|sD@ n])o/TCCs>4I we ;;o}[ǟѩF;G,zwV"ngR]ao19! 0&\qu>c DaǰtƺN2mɦ~Lˑo~Mu9?/9x"V %e/P~ &7so>n)lG|"P(sʬ?kny 4K:]'H)H Z"ep w |/왃RD.^Glw>\3/ V#rt^Ý[ fr->P(,_؃粶fǗr7Dw [@K- /ylelY}],)ݵP`}>0d2_!dQ$'{m2LL]Fk .E=RH)L.xIx8Mܷ~mU } ^eA5cgd d/ 2[̺`,;F]>&:a66y}+*xIQ_>r]fфk!bOኆ[LU 'ߓ#M ĺw `mHb1|*(v1&{l Gy!yݣTg8M}-}+( dsXº| ^;3n9,-J8!HJ+Ƒ@l`7of{.>kdL&~Ȫ+Y [jpc(DFE5߿\XWw<_1+W,| 0T,p7.HQ2~ڗ4͐iJʲ Y!c#3dYV6h,[ 6@%p*^ajn9}t `ϓ?&"-\uȊ+tc#w>g%2Kũc1P^ 7j* !iE!/.c+ >e еF7zJ ]G?#R_i -/r7 $d~uϋ֩eVY =RQ:X{g@{6?[ҩ +&+^ }~%,}1TE6h.J_hRlBчB r/qc_?W p[&wyŞRP1K JᎍZbw&}A*7\a VdAky+pi}%CuJ=q/0=c;/!~# ~A<8zr~bo=9>S_׏c"uoi\SX)&fp9`_˃=R ժZsd C8Xv"c/Hu3.x뽟|nx o:)XB%W '@*!&E@xg[bO%# ;n~+cN:z'D'S" ;cKZ ߕGC:2-`x\K(d{J{oq!+* ST+Yl89~/9=fJKUV*qOtTzX\L~Ⳬ#RY&\Ucسg aY/u g~-_{bw\ ?H\{Hpӕbς+|Zʀ } @Q[vg@pc/Vqtk[V {yNon: /x/)TDߪ{Dʋ=D2Irg<ح {T\ꦱjŞZNbOY^Lڒ/<m7/}PŵJ`'v=ӦS}]q5yVU%|WCE-{Er^wת(OEu% SQpYg qKcgN7jt}5me=TEiV)|kk6=zϼs_vJ !ׯF_" ,,·bOuviS>rr7e쬋~X'pӻ~+URג%W.D_+,Q}\!p>lWS>=km=O$*U3};ߘ|QeܢxAYû݅~u9 NP= .(^PIT΂}d/9Pۮ?c0q9Tbpї*,΁H'_v'}<_}O9-+ I\+q?_cSIO /0< T.fLi ;_y_?ɓI~ܺuN>_K{X;m=74'O6)ҷz> 1&) _+|YC q?<(=W>Apj OLGb:Ob"oEE˸B@`k8vq777ǵ]/3_o5oZ\ 2pȵ!bϲnΌl[_~jg܎ӆp+HGߐX8kP^|{@UB@Ms Ir[Og}N89/3졋9KGb=IHP +,H;{T\6D2/9NKqK|݉bڍMg4>VgK߬9KO0my"De?$WE_)/W-ˢ}.25[nMl;]k|kߗy[ @8ξ͓Y Yegb _wwmj'Ļ{O;7#@8z76l~ ;~hͼRW:F;^ԚB=|x*yH:vw~?r=:gpt6pַ7 KC+^tZ렮5R]*ߦkS7"B㌋kd<)y\8cF!(5Kf@4CQRs?AG/=:N(Q<ǣxG OIgIENDB`netemul-1.0/images/back.png0000644000175000017500000000036711261705352014762 0ustar frostfrostPNG  IHDR22?sRGBbKGD pHYs  tIME :tEXtCommentCreated with GIMPWRIDAThA ð d_AMo%9)  #%Av?IENDB`netemul-1.0/images/not.png0000644000175000017500000004232611261705352014663 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxydWU]{snݩtBBDQ&ŁQqx|}}A}1 bd2$$$&ӝ;WZ{soNi@_=TUSUo~^Ǧn;}}g2 ?_|+'?nw43t4Ncbj {>>o&J/tv7驘lO͠ELU0bd#S4b[1]q|zpɥg 0;4 *L[@!OFY28>c@5W#y~Inm Kw G >4?oEI`@_g/k iD>_Y^C%vH?6@] j,|Pǵ^`x>/ο>~~zv_]%6mG8Dq w|wFCWTtԟ{n Kw_ <8%}3($k@:q#x@nCGo&^y7K.}s} )^DLEP3ubFTT7S9؜uת17xu5Wȶ\r'? ܷiDPo*NT b31Z QQU`uЄhQ#7#}0[*6lHi|u_WK.l/97w>_{q7_zq 93%B&Z kH`7xAbdoW>f_W]P%kin9 g AzT9?[I9seߋ`a tpBT n :޹4VqeXkolan EC+K|r%~,)$xQz}-(B|EcW;7ד_n^1335%@63U9f:5*u:{4{h4vyFg؆Əcqjn ׎342 ˀ^^ܖ+\i堔`c2Gq j2tl ͔^TUbw..CmBbO#DLQ;F.19j^-1oIIXv/(t"=O+zl+gVN4[{*N`䓧4bm԰WM"WND,"yVQ,Qme׉-8u &.R(Õ{O֕=tT^l'͔fxѝL}M#f@~r#1*`D33geBh]H~\ΐ`511IXP:I_67gY$$nJX[?#ePu; "|N^!ngWSgm-f|r\"y0j !szM%ZKL\@X)1>Ztͯ-EsT:8 nYf־ 9d :MڐAG/L `*ay~꯾xu\9@hԹk璻lgfjpO̊͟*ù35%d`0L $(!1UQL4F1UECa{-K+1qξ[޵rg7gwE?p'b(&#}3ҷߺiAWC|0;n?aWΕSf~&z.~&hSwlS 'VϿc.YQOϵ jaL(bzO8LtJ86{{3Lg/<=Sa,nuAB) B8@#w(l'˩/(Uo8FX$R kr|/s牧5)+ M@̰I,*j!yPuwX ˫Uk>vNbHAx~?B$6&+}?ko;.vNj2G2WZ vRMZ=GSOo} "N8Épꗮ~o<3@b.L*Hh F2?EB AD!q1Ɲzڗ?y"";{F+>^rՇNt1 {oӸN!\Izmhm:mSG4乢wƖrc}/߷7?ُ;Lf!%qM9z']sHI|-jECb18gQ$4RX],:,!!Q(ea|ׯ{zf61.d㾵f[ wB@.x G0߂?S9\?sK59}/C15+xYKrug :Aမ(G˟LcDHY3AT5,y4 !pT끅e}U=IRQIqa7ZUNZ募pRQiNi"}lCwl"< N<7˾v]sa1dr٢w|99{b=o.3O8}ss҈_u_p8w{Wz{(҉9y˶~@!O3QmjA#(>6"ijw-:SWdC(SS_0q@Ux|EnOњc'71$$6̡AcY1{\GrdP:׎gT)C,a6uӍC#n8ǣG 8G B.IdMf7Ѥ傋ϻ]R0Mӈ"Rmsi3j!"E 7pF%V2ɞOp؛ ai Q7[،0Szw #96+|='LR7o(O>m~7G pâ!X( K(KPHQPDX絟}{ߴ518"bq]ѕJ~0\u[Nզ"e! C yOXO"TRŹDٟክ#t q旜c58,U ~*GK/ng EB@LAӧ^817#Th-?ss" BLAvTyUAhvOhpŏX5qrZ"8DitOe;w,TRHxo C@PE>4FUԵC}O^eHs0 1RգC@^Fn 2ieN4nw^x™-_"_!pKn>:Xtq lpP<^x|cj΋+]1_RgŬ~ߛvs UzRGf?9LAc BS<сKİ*"j?ytOpD+H^b臕/:Z0F\-9]lO/ӥ+*|eg{K-&J3G=.V`UV;~.`!@ƌYz3sFkx֝{n( ރxyD՘k՘ "z]?hq")߸7FKl+wʑbz>LXi1{SvL3~N"$G|Z Zbbbl l640 "27~ţgpFdG?4AzӶEWYt= ~vuw~ێ}U0`?0;o:yf01`1y%b6P- ,Rj1:Aq`>z:_p4"HL?G|<䚵hjDe%!M-VI(8zƵ_L W ^!W)ܸ=y bt$.3h0FZyJ[ѼM|2u Fkڌm:ŎhS?{&];'[hcX)` c2@\\@J `5+{KlT#e#,Fλ_fW8\!'V Ud>pK,T&N٪Ŋ}Jpބ2囑u-֥&Ҿ=SÖxǴ|Y8\kz;3ڪ3@$8|ƣ?)<X>"i 07 L6`5!'#k b\Ptl`䳂Q^4z#BEP8GG)E 3 ,fb:BB w'hw޾b<e9ÜL-}_ RoiKa儓^DO h1(*zLa2@4&?A\ @h%,oXSら)yx_lIq"l5H >Ҁ5 &DmFIT8Md\khEX[iw q=_T"55 z};SdaN͂}UlhU D# 1?@P)b,HaMHQ.#Xj\dBQ A2\JLʤJ!L Ηmdxy0# 7 GmD'{OE?|$p, ba?H¹+*RɵSF1cӚ`Hd/oJ:%k%$9F.bf'{o9(^!-PnbG#ss,2??d{X",3X1(A*L2Sˡ-\<2DxӖMúqD /;_r,y֙O|a#жb;֖xMWϖ(i_^ْ@ Wr#ICBZ-:$qcb )PNA)RII=CLJUzm@ rGz |Q$">\A~X".H2mEm"$b]? J<˻HtwRfJ)z $z;~%X_',l̊9BF()_DDL#SH6қFTЛEw3TX9q߂-lRNa+X5f2?|s >2_L0RTK(TqX}D  ~ @zvOY=xKL3Kpk̤YNZ?oV3~ 7xZgWփJʯ{TQAUS94l39EzWP jJ{ %RPDQ|BmF^ySIf}&bO7-"%_:WsWvDpΥ0CBToo-ј !oïų95gbi뿂~ĐGf%Òj%Z'pŸgĐH/!4,!ذĥ*_ME۔fI `R)<ᬥMͅR-#LSfo\'Ȇ&^ k8pcQA*L'n.+r-YLҊ?1~k"Za>W4hg)rV](c&5Ǽt4(i=gg!+h՘E#[gLm.:BcZy <܂n40H@l`Ę>΢ :^=,]$7;س>;Lc5yW.|IGyQ^<{5s#̢Ajs[G[S^ht.lVrMBK;n"f'/}ڋ ^ezSP%(c&}gaM+TF(O 5@ .`iAh0^uwX>^NMH>)G(~.! &R8炿 vaQ 16#z?y/(ɒߝG&#.@z H6vU2FW$C(!Tde>RJOR%b9#O I+5}zn?l?eEۅ䠉uس.B&].tVҜ&[NG҉͕ż|;@k9@K F 횽j0_wzykb~CĈ1?n}#`!']Ejbed%)i I!a6ߨ'㴠&q=E/ΙީA촊2W سnh!MN/u8F>@w IDATKI&ZPvyפR"gz)υ/є|'{pz.P@!?Л!AX#ÁDL DCqZCD*Jq],flGb1RUcuab2uPfr"I%RHḄ,4L3X#Fuy¨[7M S԰)4h1U~gsYX Z;kzL.X5Yw#E M|) ie,֘ xK,~#=#8P#! i#o<񜅫uip4*z bOMBE7EDLöbK7+kucK&51ƨ5zk lPi]^̔F@nׅ/?1ix1Ynm&QC/[B%cU.!E6vzSe$a1~t!,DPʙkout-n2G-tIx uir `$j!!Zǥf!峉 HGr:/r{Rژo#vKDODL,:B"8= Gȶ,f a"4cYL1@!X^Uͤ/DBw>lL%MMv,_Zx|b2դHDZo@b2מ|_li4FĔIYRacس.t{aP `#dL'FCdi(ѡan렔ɤ9d("&g||⃳RVM)G;[0'f(b0{hNLbkǻdC0/0Jǐf<Ōm?m[OZjxIسY'TL we~;sܧkISc-L%/s"8QE<&1:S&U[s8gi9dNvyM]K&F{eo[-?`Ab ycaB|2=4TU~)RD?g}W IV]^ $HGtD!tsҷ^YGپkn8jHߧ7kiaݸ֟)r)6ر|lJj) s<VJtdǧO[U=ђ[ 5V#o@-B͕HL 9)朹J PxD|Go)1\p$?o3)&[N6I[00#0?ZA4C)'--1W˟_NE$RzʉSz蝙v"\Sat [;\HĞQ?}۱v󦤯7G{ωfxK!Ǧ`VJgKܿoc}vm [=f FPwf !Db@FsʄRYp;%W$y[loni 6˵vb:?c6SfbAq#k9Ş(K5Sf+_' w19xcx}oN3r Y3škU`6Z!QI|& miv]BZpȎ|!Rx0v7vb+ &&_H !}髩/`vF7q%}~57M0}'ΌAN(~d~bmL/.Yn%05k/aå2P`*6ZMsafrxƑ!\M<CBstG/>^OYǝ"ߕ!}p?c6O?~w|(g /1R8w'v^,)f*Xdј \kX5k 26Z"a `Eld+ioְ$R8i[C0L/7#O7N;H[la qĞ I>گƇ TSJ92>#YϾĩzX Bᣘ RDIj1?&j]E,d0Dam+PWˉêb1 1mpHo.`iςGoRs4sʁvtcQV3G/Lƞڲ닇H_iǕC=IK={ӴP>f:[ DI547m):6q}$ $0Zbʹr5q/r܂F@;: ` !`$/ J\#JѯR*M.W5^7X33Ic~<ʏXiD6 ̌rzGr+Ğ.65g^ lpr }w"JR1&Rqw!@zNV<^4U,SqJk#,ȍ"sJb~?P fLYs#I.8Dܿ '(heC?]G,L&US g/$ęénZ]iqe^^[Zm 0-A\Rڛ%hYltkpُxǚw@EK,#qtl "yMҤ݅8)7c'(Lʪ]f\XhM3c%p}?hoO%z[wM˛cv1+gR3ǯ?t5?REa&z2 FŠH4(s1*ambi"zm$ n g;S\Jt@yfbY q*\Pt$=2#N^i2xV=}_O6=t#AHD}Lj3KZݠ22&_yv|ޛf,yv_F XlG~Yc@0@ 4o #$1r!|zEK?}?wXwկgɕ,Z@r/>$*[ 2i!Տ"xo"'~0H!@/6 K1Bhĥ{Sxh>c$ObeWW1=L&03zN# @'(c,~}qK?wg !x;n A);Ky 6U@ZA\C_OC0`8 M% dWx5U $F#_jħvFfEi(M]r~{+3,௎#hlB68 {⵪spaZ(&)<^b&P!]L7Bd`,-!K4o\Fk4#!:\c цkayhquhм~v)}[YYJ+V0Yn GgBATF/7؛ noI+7bBBH`28^oïk`v3[<丟C?D%!{3BjV%9vp kďfd%a $A2e׬`7`kfyhkk\ݛ[{=xwf!aeHXbK+?@wĥ ~H%>| 6sL˧f7lm$}=q0|ojXntҏp|ϳ5[v|׿ L-Tk׾OϽ睷PU:18GOnt߀Ԉ1MJ{!'Vx>Z-65w:{m'w/{_>=޹|OfН(.>Y=Lкܼű(2zNMQ&n9{9A D #leD=t մN?Knl3 jFlMUj,U.ov}kih0M5Fk14JP֞ef2? hǩ7H8o~z`~_:&,\em_l#/{z Gλ4UlR8XuʝBׄqhN`uRUuxwҹ >Q5bX)a@ޥM/mDuˢ,3q Nyy#4A:#Gt;c6 ^7dx>Ƴh` l[[*_ן}ʁR*=(}+~R|(/sz~dMq#C'{3;p/>V )w1b}29. d_~a?+[vbFTj0K ?X=!Rf6B-Q7+̤V`BcjRw>"Ҥ4DѾܛjvmˮ嘚e4BfH! kX/9oy;ftͣ{k&ӧw û.xћtI_͵R2q4(US^] ]8xV2鼽\g]'5Wh^b&$yܠYLE,A[РrR7e>kKn\ZYLK!?|;N]yxIe.n2%}ܹ͞ϾwmPуmN ZN Ɠw_y_1":,֖eC';j|@s=vF˰ZcpҞm#{o7Ƶ=7:֢w+2C1Q"L:]쎋\̅忱؜p[ :a@:f(2W [/m6ZMsIa\{.\;nDa&B ֭cؤ1S[Aa 4Ji=zqoL=pe׺('s[v}d0Wב>Bz`nqw?7}.v.x__֖4>C .lQhpg_}b-Fp9Kk3 'ɕjj"VO:Y{dbeš3%ƙR}ז|?R:! #KIQĶ]7xv >}3pbqu:Ν2ASDLݴ:IڋcJ]$G,c\m6/`7=^0Q9F33znekYopeﲎ$:A:w$kx`?Aͱ[bbKBjfi '1??d%t8YOgĶ}7dwmqTaKv&&MLRm4B" >OxXX[H X ji}-6 < 1&fg;̹MIi7;3;ws${(0 zWY-03g\kK qײlCn&McwH)Ke6.qH @Up(zի^5dW8),"n*_eYm]} & 3\& YÐ@ux6] 5m_,E!wZ0ic^vy^ExIm.Sq6@xI@@Ӈ 7xې!ٳ%5{c^Z4s^ӊ[ hǔy* %bޗT xc1DWBPcP;IDATL9,VFHk.59O;6$-=tITspu_ -JapK-f < =_f3k/CdxƬ)UA41p٥qI s.`E}"S{jr̶Rĥر!^Qلunк/-|F#>~ern@*o6SSmXS}$fT)oe:1}e8V4~DZ8L!(/z:nߴ>y75y2}D1(=I$ ?;w^?w|]<k-fbE;;W'}GTpٵE>X=y&7֟~qw'ۥDEsaF5}Ϛ>F}%5#'V9[>X9ʤR[3~i8frB~4qpŕ@cF{n!;ߚlJh9GjƇ(X2V4xl|vM?L=llBV6i,I*hI@pL3"_O>Kyi"{lwsbbmGT5(j%( 괢꿎3[XX?J>V9ʱFU5rT J)XIENDB`netemul-1.0/images/question.png0000644000175000017500000003271611246541572015741 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATx}yeUuo}kzIFADpώL 9$䩉Sl1$"-jOM4FQD AFZ繪n՝^q>gsﭺU]ݍ}瞵Z[kM"Gw};QxDxGa>}Gb<;A̘0W!\*¦  DfDx,3"< ݿxY{A@1f*a `&a&bHa^n7"rM_kV+M[tCd!@ $la'P t,X) +I);79e8[7mxp `gO/1 _XH}S1@t)uH]~G_0u/ϼolܴE8П O,tԧUk Q$6N^sV )IHշK͑ViظiKx>^KKW/̞Rd "AR,?N,MB ૷g#t= `s`x7;,p~?<}2+{t ((\B:䑸~)3\P9\x~#n_y4TPDʟy(Ylܴ^ `E_A;@_ R&<}@7`ui5ׄ@W+xg^}a}7m*O:@_.ċ-DD`"X 31y&1,lI3hz GAx.V>x煯\QU<+6 0@Z1HU@DA16F 2 fV;Vvdİn//*D gں4p]xa}7mx5{~#xMP*R(IP ((0#D7Hj5ZWQQZt9**=Xp’&]D 3#1FČi#i"5Z@at(c4}ݢ5HH okȗ|qD`-Bb&ML U (  T8TTA@A)T:TP Bؿdzc3 fFA&T"&U$3fL 6R7Z쟜N7VԆ"0{\t`fV pĎj۰p<01eb" ʃߺ+z^VK3Y@*jPYIñ..+P MHQ*2n-r*!ル(c";}Ǝe;ݼ{OyYۿѓX""rL;r Bo~'EV|> T.(5Zօaiŀ.UXumw+˴/L^~gMVu{oۦ}"͚ɷ}Y[wO&a+A粒|’oŒ٢)e}@A.+r%$ڒ;+B<^NdD%[pÚDﷂt=#G=U=RUzon5d`N T8_@wI `JǾ_{ߵ!EQ}һ PDCE . ˣT uK ]*kҧeOzKS P7;+LSD^4)'|3v*UDoo^[c ,}qR :ڕs7>xBex.U賘CZPz`P\;VƪXH SSJ%VK=ߙ~y>;eݽ/ )o "5(Yc>!VBzիn-[#B $~ ?J6l4(/5|}q)Ch+X I2¯^H(T^#e9n #w.qXÂ78@`z~ܴ;{9YKUNdz41=~8#kO_7/ ,H,߷/h.;ƪAVzaJXz(zizAe9O pHXV˝ow>UPH)fḀ2sUd{+oF D? HȰi ط-ǽ=r.\CMjUai*!Djb(ns`i>D sbD#CH{;^Jw~a/yn*dʧ6zko~`ICDÙx+t$8 >U,Hkrϻm69Aq@PT :]>4[Gs3~GtQD6vσ5] /" J?B&g) Q9ǰUZY»y ld#l8+υX砏EqrGъW * $Z.]ZJ@ѻԴ\.`YjRǡuG)*şS(īco1w`oB1yG9 Syڝ3䄟}H1I*R4}M-3\1ҲVe],h딅q|aIʹlz '|p?^xG6l^Kó`B5/VV*pA%n]@OZ yXO< "~?$ [{+1_ǘkb_ hUˁ $jp0 ?= au\|nbm=PℤWd(& =sdw}iy7ʘV4j3su T8V  4RC Rz>%x$?qSY%BQc3Oӹ+paؠW8+x P^z2@4osԷk8,N0zUIgVʵt~eJsIx}ϑry,t p].~#w?]qI(ܬsy^2_RhE*Ͳ-nQ3V@ p}jy#!ux?Gr-E~.~i5P{xSR[PRqŠh]2ȁ,.5?nOKl7gU]*0PPNKEEޭB4'\|ūKB/Gvn݊8Ȥn3z=TfL,# EuxJU;P$8yIA_w 6lMys4)k.mY#PDEtX ! Y"2{ 'c lzU>Gdr#Mf 7K SG4VՎE†7~?  O3ke  *D `@XDXC)w` 5xB?10C|eg_Xw֏Nϑ=^(E=Ω)s~ʁRC%4t\af0@'̂ ; 11sZܫ\+[?~iN?o{=?+Io-lO_쿙qJC6QE$;P8ϗ_{f 0=LyO:%ry)|n2sY3TnȞ6w&Ә~\gOx\o R!E-R1 Wi]-\.#LpφzBDB'_BB*,pt?( +TÐw2~ಉ|~S]PPrHA3WI'")^%K.lW~>4ay >b}K)[YXgKo] J޲L]K=h:-3M%s=~h?vU7n2`u?[TQRd|juG@:;a/7Sv|yg# :{w FKHRpK@(]7e[)B Jib! 8ݐaS)Li_LjuՈ!R sw濖~0Ґ<#V:c'#N l6gtxNyLcz.$KO 1J)ms"xm 0Gg6W(^>2/r.!L]BjV*W%T)gH*o|pcٯ?p%j;F}Ir~'R+`Zf;b v?`//߷!SWnv3Nkvv'MNHɟfN.T쒜qeZ>dKܺED&N9s0f7h1=+!·͙u\ jMbG$BL\,bM<3:yfEpW%V6~\,gD˚ }̟@Vviڪg.U@1CIɯ>rI鬒zO5Zobٓ}O~D4jp&7L ",$,m5>okŚODFRutV '2d_sg0@{?ҳdOgfԬܞ6n-KK?;D,bb/(`ag/ )w~}@G{wz?k_w=['tOfٙz 0Y8LhZ_הּ/ae=dٓI!\! Gšg^r~ڨ1)jVHT$vH0*ߺkuxsu,RJ0;ɚ|?.wVU5 HgQvC2e8+=ㇰ@R ? z6'|0iDe Yge<_C,,6֌"* $6 /uіպ{:sn_i Rh{Y]ED%Lt>0d]a$ksԴ5wmh]rg-C}CDpԳZx^ h]9DPoeIV&TP0sbR%@|v綼l kW~9*.^FmVVNR(GL=(3s)0daX> ;]܀^ Ob`Xo3~hԥFlti| {2E`i6% T°1.{aA%w~uY#2^Tu*B.{&Y6\u%|TW!|gi$+e~\_~-ޢPoO_ag `[.A_^Nܳ?fI10F0s`4`Q=q ' hKxS]GW2VZƹg%ԪL.<ӟY>n/Ev5}-'3#Fݸb#0a[;Aw!{> ~x/w'> I;$!C w}{]xit&?voUƾS+Wn(_S - !bhȔtC)r/L,(/dÝ输A!Gd\z{H  -DϋiZ6 d8RRQx V6B 7 hrUn]eOj %uwC"faq 8<^7>x/ ))Aqtޅ]ze N?gi?s_x!=-*gBc6}7=(FiL G(0\a)P%̒5qQsBE @tJ]{J Bw\dʱ7 gkR|Bws KoXU{ݿvY '~;KAJܬdOgo+dgX!HشVKL3ࡒKV L8/"(#X/!#"l(fatPL,+*(gfQܛKKʦr&1'?t5!=@}J_M+۫%AmldAq%TRP:T"Y $Bk ( !k!Il) X r%wd])- Լ⒄˟Hj ;zث;7~翟r`D! f6d8ЗaXp` ]A_K6݂W$z`D"f, @(fE)j(B3aI"F]6,WwkV@J,>$G7#owp>Kg>Ƨ?'e-+P*{f!{2/}w+"S'7S?IDATD@_7*E- R-p$*bV$V5 52Y06a>|rߟΤ=<+8qٽɬw\~BW|U}16Xj^==Ȟ/Kd@_ A:s[m`>>Е}$wP;g'DYg2Z@,ȑ1O!ai(h(U@pP=Xe_"Sl I_HDP\i$s1ww7޿LƤ+Yχn]\@~[gއU8*U\UdmVǑ!4$ Ruٰ\got,F~'$_5vpŧ^erW?gap}c_fL1{.㚝'{2ϳT͂@FLjא}yyQbJ KZ"M T5F+TŬ mf\iZP uZ3<@FD"{@lDpi9@+C;eCř %2ee\@FIR!'d6HL'q;do9,u.8&a~vs=03tq7x+)R6F(VT"DDiq<#a]}䬋=qtG%YB_/8'  54CtU_yH:}y#C { +DauɏAfĎW͇YЗ &DTā"hRP g}GwU:Z%ݹşCB+xVPm}7 ?]SK̯5z}69зd\N)tesI nDhm9{A;y^Peߥ>$/}Wngm6o/[*0V!uyf]t9R7e\'sn45~e. Ԓf@=;KW%`i/FJu&JpKn]Kl_$m8З'{:@_}YWэ4qOVQ/Y|Փ]̻N&cx|'Xߢ_D`d0ҟ~-#@z}~=y2ҾKk]ߓ~~?c5|+a?C$w-hQkǀ۹cSڈc#5g;H `dO'@S۶`Ӟ~dwOYZdDe+_͵;'*2~?V,EEPz7un9n!}oӉdad$Hq[nO"zj?2Ȟ̏\N@Pb勋7 7{s^dO |L!|t!GC:F]F2M*2JdL\a|wVC- ~d߉f'{R+0U9[ 'KD8Ywfh.ǀsn{ UC;zdX0WzY9^ ~_ r#\t^ p$R,w~1t恡_S oBR0[D ߵN_"E@BȞs%~Ş%R䥠Hf< ( 3=vr9_P9a'\߽g8o]rE~f챂' }d3U6RAU\?F/w"ݏUB~Gw{mm2Nmo#GX3@ߢ=# >[݇]${dX/?|U WyS59#k qg[h]nCy=97Mi|;ƅ`!Z G:'QV%91su{νH6E/\(3ZF)T9ᕇ"CR[>/ٓmB.G{ d1Ś<_P]G1W ĊPor$xۏA_ޅܲuysd.şɆ:uٙl]D'REIL#"8u͝-Ft=1%:v-Ex/UXP䅈H!u ?کy)\dz_ҕu|&scv[00,%4Kzx@h__bmn? ̀~A_;.I$ o\D}#t}$ 0l\}Ps߄bI\H@֝?-)EUQ/ٓiTAZ;yF ݼ\Wk2{;L}{s-ʙoȞ1'ޛxbk(߮n~? | Hc?|lBe0v[{#ڝ>w"7t?vKd<,}S_wq)>p1['y%.g"!vA tygIvfW<+a/wMz}PƷ~%wSlwV8GRsæpk7[3$GV`rH]$V|{'qOk#Sʕ/ \ o=|,|f>rnhvw2L#=!VN;p 8 ~ڴ7~_;2fKO?P5R*g \_W\̾g{v̴+c/kƧ.xPe ?,_̭?b] ]8hfT x~m>q ~kW*Rː4 L(+Og^s@0SNk~[5o/>r9b 'M|0= -Gcyg;s

Try using another name, with fewer characters or no punctuations marks.QFileSystemModelComputerQFileSystemModel Date ModifiedQFileSystemModelInvalid filenameQFileSystemModelKindQFileSystemModel My ComputerQFileSystemModel<ONameQFileSystemModel  07<5@SizeQFileSystemModel"8?TypeQFileSystemModelAny QFontDatabaseArabic QFontDatabaseArmenian QFontDatabaseBengali QFontDatabaseBlack QFontDatabaseBold QFontDatabaseCyrillic QFontDatabaseDemi QFontDatabase Demi Bold QFontDatabase Devanagari QFontDatabaseGeorgian QFontDatabaseGreek QFontDatabaseGujarati QFontDatabaseGurmukhi QFontDatabaseHebrew QFontDatabaseItalic QFontDatabaseJapanese QFontDatabaseKannada QFontDatabaseKhmer QFontDatabaseKorean QFontDatabaseLao QFontDatabaseLatin QFontDatabaseLight QFontDatabase Malayalam QFontDatabaseMyanmar QFontDatabaseNormal QFontDatabaseOblique QFontDatabaseOgham QFontDatabaseOriya QFontDatabaseRunic QFontDatabaseSimplified Chinese QFontDatabaseSinhala QFontDatabaseSymbol QFontDatabaseSyriac QFontDatabaseTamil QFontDatabaseTelugu QFontDatabaseThaana QFontDatabaseThai QFontDatabaseTibetan QFontDatabaseTraditional Chinese QFontDatabase Vietnamese QFontDatabase &(@8DB&Font QFontDialog& 07<5@&Size QFontDialog&>4G5@:820BL &Underline QFontDialog-DD5:BKEffects QFontDialog&!B8;L H@8DB0 Font st&yle QFontDialog @8<5@Sample QFontDialogK1@0BL H@8DB Select Font QFontDialog&5@5G5@:820BL Stri&keout QFontDialogWr&iting System QFontDialog2H81:0 A<5=K :0B0;>30: %1Changing directory failed: %1QFtp<!>548=5=85 A C7;>< CAB0=>2;5=>Connected to hostQFtpB#AB0=>2;5=> A>548=5=85 A C7;>< %1Connected to host %1QFtp:H81:0 A>548=5=8O A C7;><: %1Connecting to host failed: %1QFtp(!>548=5=85 @07>@20=>Connection closedQFtpJB:070=> 2 A>548=5=88 ?5@540G8 40==KE&Connection refused for data connectionQFtp@B:070=> 2 A>548=5=88 A C7;>< %1Connection refused to host %1QFtpConnection timed out to host %1QFtp>!>548=5=85 A C7;>< %1 @07>@20=>Connection to %1 closedQFtp8H81:0 A>740=8O :0B0;>30: %1Creating directory failed: %1QFtp2H81:0 703@C7:8 D09;0: %1Downloading file failed: %1QFtp"1=0@C65= C75; %1 Host %1 foundQFtp(#75; %1 =5 >1=0@C65=Host %1 not foundQFtp#75; >1=0@C65= Host foundQFtp:H81:0 ?@>A<>B@0 :0B0;>30: %1Listing directory failed: %1QFtp4H81:0 2E>40 2 A8AB5<C: %1Login failed: %1QFtp5B A>548=5=8O Not connectedQFtp8H81:0 C40;5=8O :0B0;>30: %1Removing directory failed: %1QFtp2H81:0 C40;5=8O D09;0: %1Removing file failed: %1QFtp$58725AB=0O >H81:0 Unknown errorQFtp2H81:0 >B?@02:8 D09;0: %1Uploading file failed: %1QFtp$58725AB=0O >H81:0 Unknown error QHostInfoHost not foundQHostInfoAgentUnknown address typeQHostInfoAgent$58725AB=0O >H81:0 Unknown errorQHostInfoAgentAuthentication requiredQHttp<!>548=5=85 A C7;>< CAB0=>2;5=>Connected to hostQHttpB#AB0=>2;5=> A>548=5=85 A C7;>< %1Connected to host %1QHttp(!>548=5=85 @07>@20=>Connection closedQHttp*B:070=> 2 A>548=5=88Connection refusedQHttp!Connection refused (or timed out)QHttp>!>548=5=85 A C7;>< %1 @07>@20=>Connection to %1 closedQHttpData corruptedQHttp Error writing response to deviceQHttp&H81:0 HTTP-70?@>A0HTTP request failedQHttp:HTTPS connection requested but SSL support not compiled inQHttp"1=0@C65= C75; %1 Host %1 foundQHttp(#75; %1 =5 >1=0@C65=Host %1 not foundQHttp#75; >1=0@C65= Host foundQHttpHost requires authenticationQHttp.5:>@@5:B=K9 HTTP->B25BInvalid HTTP chunked bodyQHttpF>;CG5= =5:>@@5:B=K9 HTTP-703>;>2>:Invalid HTTP response headerQHttp@5 2K1@0= A5@25@ 4;O ?>4:;NG5=8ONo server set to connect toQHttpProxy authentication requiredQHttpProxy requires authenticationQHttp0?@>A >B<5=5=Request abortedQHttpSSL handshake failedQHttpL5>6840==K9 @07@K2 A>548=5=8O A5@25@><%Server closed connection unexpectedlyQHttpUnknown authentication methodQHttp$58725AB=0O >H81:0 Unknown errorQHttpUnknown protocol specifiedQHttp*525@=0O 4;8=0 40==KEWrong content lengthQHttpAuthentication requiredQHttpSocketEngine(Did not receive HTTP response from proxyQHttpSocketEngine#Error communicating with HTTP proxyQHttpSocketEngine/Error parsing authentication request from proxyQHttpSocketEngine#Proxy connection closed prematurelyQHttpSocketEngineProxy connection refusedQHttpSocketEngineProxy denied connectionQHttpSocketEngine!Proxy server connection timed outQHttpSocketEngineProxy server not foundQHttpSocketEngineCould not start transaction QIBaseDriverError opening database QIBaseDriverUnable to commit transaction QIBaseDriverUnable to rollback transaction QIBaseDriverCould not allocate statement QIBaseResult"Could not describe input statement QIBaseResultCould not describe statement QIBaseResultCould not fetch next item QIBaseResultCould not find array QIBaseResultCould not get array data QIBaseResultCould not get query info QIBaseResultCould not get statement info QIBaseResultCould not prepare statement QIBaseResultCould not start transaction QIBaseResultUnable to close statement QIBaseResultUnable to commit transaction QIBaseResultUnable to create BLOB QIBaseResultUnable to execute query QIBaseResultUnable to open BLOB QIBaseResultUnable to read BLOB QIBaseResultUnable to write BLOB QIBaseResultNo space left on device QIODeviceNo such file or directory QIODevicePermission denied QIODeviceToo many open files QIODevice$58725AB=0O >H81:0 Unknown error QIODeviceMac OS X input method QInputContextWindows input method QInputContextXIM QInputContextXIM input method QInputContextEnter a value: QInputDialogCannot load library %1: %2QLibrary$Cannot resolve symbol "%1" in %2: %3QLibraryCannot unload library %1: %2QLibraryCould not mmap '%1': %2QLibraryCould not unmap '%1': %2QLibrary)Plugin verification data mismatch in '%1'QLibrary'The file '%1' is not a valid Qt plugin.QLibrary=The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5]QLibraryWThe plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.)QLibraryOThe plugin '%1' uses incompatible Qt library. Expected build key "%2", got "%3"QLibrary!The shared library was not found.QLibrary$58725AB=0O >H81:0 Unknown errorQLibrary&>?8@>20BL&Copy QLineEdit&AB028BL&Paste QLineEdit&>2B>@8BL&Redo QLineEdit&B<5=8BL&Undo QLineEdit&K@570BLCu&t QLineEdit#40;8BLDelete QLineEditK45;8BL 2A5 Select All QLineEdit%1: Address in use QLocalServer%1: Name error QLocalServer%1: Permission denied QLocalServer%1: Unknown error %2 QLocalServer%1: Connection error QLocalSocket%1: Connection refused QLocalSocket%1: Datagram too large QLocalSocket%1: Invalid name QLocalSocket%1: Remote closed QLocalSocket%1: Socket access error QLocalSocket%1: Socket operation timed out QLocalSocket%1: Socket resource error QLocalSocket)%1: The socket operation is not supported QLocalSocket%1: Unknown error QLocalSocket%1: Unknown error %2 QLocalSocketUnable to begin transaction QMYSQLDriverUnable to commit transaction QMYSQLDriverUnable to connect QMYSQLDriverUnable to open database ' QMYSQLDriverUnable to rollback transaction QMYSQLDriverUnable to bind outvalues QMYSQLResultUnable to bind value QMYSQLResultUnable to execute next query QMYSQLResultUnable to execute query QMYSQLResultUnable to execute statement QMYSQLResultUnable to fetch data QMYSQLResultUnable to prepare statement QMYSQLResultUnable to reset statement QMYSQLResultUnable to store next result QMYSQLResultUnable to store result QMYSQLResult!Unable to store statement results QMYSQLResult (Untitled)QMdiArea%1 - [%2] %1 - [%2] QMdiSubWindow&0:@KBL&Close QMdiSubWindow&5@5<5AB8BL&Move QMdiSubWindow&>AAB0=>28BL&Restore QMdiSubWindow& 07<5@&Size QMdiSubWindow- [%1] QMdiSubWindow0:@KBLClose QMdiSubWindow!?@02:0Help QMdiSubWindow &0725@=CBL Ma&ximize QMdiSubWindow 0725@=CBLMaximize QMdiSubWindow5=NMenu QMdiSubWindow&!25@=CBL Mi&nimize QMdiSubWindow!25@=CBLMinimize QMdiSubWindowRestore QMdiSubWindow>AAB0=>28BL Restore Down QMdiSubWindowShade QMdiSubWindowA5340 &=025@EC Stay on &Top QMdiSubWindowUnshade QMdiSubWindow0:@KBLCloseQMenuExecuteQMenuB:@KBLOpenQMenu^

About Qt

This program uses Qt version %1.

Qt is a C++ toolkit for cross-platform application development.

Qt provides single-source portability across MS Windows, Mac OS X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.

Qt is available under three different licensing options designed to accommodate the needs of our various users.

Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.

Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.

Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.

Please see www.qtsoftware.com/products/licensing for an overview of Qt licensing.

Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).

Qt is a Nokia product. See www.qtsoftware.com/qt for more information.

 QMessageBoxAbout Qt QMessageBox!?@02:0Help QMessageBoxHide Details... QMessageBoxOKOK QMessageBoxShow Details... QMessageBox Select IMQMultiInputContextMultiple input method switcherQMultiInputContextPluginMMultiple input method switcher that uses the context menu of the text widgetsQMultiInputContextPlugin4Another socket is already listening on the same portQNativeSocketEngine=Attempt to use IPv6 socket on a platform with no IPv6 supportQNativeSocketEngine*B:070=> 2 A>548=5=88Connection refusedQNativeSocketEngineConnection timed outQNativeSocketEngineDatagram was too large to sendQNativeSocketEngineHost unreachableQNativeSocketEngineInvalid socket descriptorQNativeSocketEngine Network errorQNativeSocketEngineNetwork operation timed outQNativeSocketEngineNetwork unreachableQNativeSocketEngineOperation on non-socketQNativeSocketEngineOut of resourcesQNativeSocketEnginePermission deniedQNativeSocketEngineProtocol type not supportedQNativeSocketEngineThe address is not availableQNativeSocketEngineThe address is protectedQNativeSocketEngine#The bound address is already in useQNativeSocketEngine,The proxy type is invalid for this operationQNativeSocketEngine%The remote host closed the connectionQNativeSocketEngine%Unable to initialize broadcast socketQNativeSocketEngine(Unable to initialize non-blocking socketQNativeSocketEngineUnable to receive a messageQNativeSocketEngineUnable to send a messageQNativeSocketEngineUnable to writeQNativeSocketEngine$58725AB=0O >H81:0 Unknown errorQNativeSocketEngineUnsupported socket operationQNativeSocketEngineError opening %1QNetworkAccessCacheBackend#Cannot open %1: Path is a directoryQNetworkAccessFileBackendError opening %1: %2QNetworkAccessFileBackendRead error reading from %1: %2QNetworkAccessFileBackend%Request for opening non-local file %1QNetworkAccessFileBackendWrite error writing to %1: %2QNetworkAccessFileBackendCannot open %1: is a directoryQNetworkAccessFtpBackendError while downloading %1: %2QNetworkAccessFtpBackendError while uploading %1: %2QNetworkAccessFtpBackend0Logging in to %1 failed: authentication requiredQNetworkAccessFtpBackendNo suitable proxy foundQNetworkAccessFtpBackendNo suitable proxy foundQNetworkAccessHttpBackend)Error downloading %1 - server replied: %2 QNetworkReplyProtocol "%1" is unknown QNetworkReplyOperation canceledQNetworkReplyImplUnable to begin transaction QOCIDriverUnable to commit transaction QOCIDriverUnable to initialize QOCIDriverUnable to logon QOCIDriverUnable to rollback transaction QOCIDriverUnable to alloc statement QOCIResult'Unable to bind column for batch execute QOCIResultUnable to bind value QOCIResult!Unable to execute batch statement QOCIResultUnable to execute statement QOCIResultUnable to goto next QOCIResultUnable to prepare statement QOCIResultUnable to commit transaction QODBCDriverUnable to connect QODBCDriverCUnable to connect - Driver doesn't support all needed functionality QODBCDriverUnable to disable autocommit QODBCDriverUnable to enable autocommit QODBCDriverUnable to rollback transaction QODBCDriveryQODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration QODBCResultUnable to bind variable QODBCResultUnable to execute statement QODBCResultUnable to fetch QODBCResultUnable to fetch first QODBCResultUnable to fetch last QODBCResultUnable to fetch next QODBCResultUnable to fetch previous QODBCResultUnable to prepare statement QODBCResultHomeHomeQObjectInvalid URI: %1QObjectNo host name givenQObjectOperation not supported on %1QObject)Protocol error: packet of size 0 receivedQObjectRead error reading from %1: %2QObject3Remote host closed the connection prematurely on %1QObjectSocket error on %1: %2QObjectWrite error writing to %1: %2QObject<ONameQPPDOptionsModelValueQPPDOptionsModelCould not begin transaction QPSQLDriverCould not commit transaction QPSQLDriverCould not rollback transaction QPSQLDriverUnable to connect QPSQLDriverUnable to subscribe QPSQLDriverUnable to unsubscribe QPSQLDriverUnable to create query QPSQLResultUnable to prepare statement QPSQLResultCentimeters (cm)QPageSetupWidgetFormQPageSetupWidgetHeight:QPageSetupWidget Inches (in)QPageSetupWidget ;L1>< LandscapeQPageSetupWidgetMarginsQPageSetupWidgetMillimeters (mm)QPageSetupWidget OrientationQPageSetupWidget Page size:QPageSetupWidgetPaperQPageSetupWidget Paper source:QPageSetupWidget Points (pt)QPageSetupWidget>@B@5BPortraitQPageSetupWidgetReverse landscapeQPageSetupWidgetReverse portraitQPageSetupWidgetWidth:QPageSetupWidget bottom marginQPageSetupWidget left marginQPageSetupWidget right marginQPageSetupWidget top marginQPageSetupWidgetThe plugin was not loaded. QPluginLoader$58725AB=0O >H81:0 Unknown error QPluginLoader/%1 already exists. Do you want to overwrite it? QPrintDialog7%1 is a directory. Please choose a different file name. QPrintDialog&0@0<5B@K << &Options << QPrintDialog&0@0<5B@K >> &Options >> QPrintDialog&5G0BL&Print QPrintDialog%Do you want to overwrite it? QPrintDialogA0A0 QPrintDialog$A0 (841 x 1189 <<)A0 (841 x 1189 mm) QPrintDialogA1 QPrintDialog"A1 (594 x 841 <<)A1 (594 x 841 mm) QPrintDialogA2A2 QPrintDialog"A2 (420 x 594 <<)A2 (420 x 594 mm) QPrintDialogA3 QPrintDialog"A3 (297 x 420 <<)A3 (297 x 420 mm) QPrintDialogA4 QPrintDialog%A4 (210 x 297 mm, 8.26 x 11.7 inches) QPrintDialogA5 QPrintDialog"A5 (148 x 210 <<)A5 (148 x 210 mm) QPrintDialogA6 QPrintDialog"A6 (105 x 148 <<)A6 (105 x 148 mm) QPrintDialogA7 QPrintDialog A7 (74 x 105 <<)A7 (74 x 105 mm) QPrintDialogA8 QPrintDialogA8 (52 x 74 <<)A8 (52 x 74 mm) QPrintDialogA9 QPrintDialogA9 (37 x 52 <<)A9 (37 x 52 mm) QPrintDialog;80AK: %1 Aliases: %1 QPrintDialogB0 QPrintDialog&B0 (1000 x 1414 <<)B0 (1000 x 1414 mm) QPrintDialogB1 QPrintDialog$B1 (707 x 1000 <<)B1 (707 x 1000 mm) QPrintDialogB10 QPrintDialog B10 (31 x 44 <<)B10 (31 x 44 mm) QPrintDialogB2 QPrintDialog"B2 (500 x 707 <<)B2 (500 x 707 mm) QPrintDialogB3 QPrintDialog"B3 (353 x 500 <<)B3 (353 x 500 mm) QPrintDialogB4 QPrintDialog"B4 (250 x 353 <<)B4 (250 x 353 mm) QPrintDialogB5 QPrintDialog%B5 (176 x 250 mm, 6.93 x 9.84 inches) QPrintDialogB6 QPrintDialog"B6 (125 x 176 <<)B6 (125 x 176 mm) QPrintDialogB7 QPrintDialog B7 (88 x 125 <<)B7 (88 x 125 mm) QPrintDialogB8 QPrintDialogB8 (62 x 88 <<)B8 (62 x 88 mm) QPrintDialogB9 QPrintDialogB9 (44 x 62 <<)B9 (44 x 62 mm) QPrintDialogC5E QPrintDialog$C5E (163 x 229 <<)C5E (163 x 229 mm) QPrintDialogCustom QPrintDialogDLE QPrintDialog$DLE (110 x 220 <<)DLE (110 x 220 mm) QPrintDialog Executive QPrintDialog)Executive (7.5 x 10 inches, 191 x 254 mm) QPrintDialog=File %1 is not writable. Please choose a different file name. QPrintDialog File exists QPrintDialogFolio QPrintDialog(Folio (210 x 330 <<)Folio (210 x 330 mm) QPrintDialogLedger QPrintDialog*Ledger (432 x 279 <<)Ledger (432 x 279 mm) QPrintDialogLegal QPrintDialog%Legal (8.5 x 14 inches, 216 x 356 mm) QPrintDialogLetter QPrintDialog&Letter (8.5 x 11 inches, 216 x 279 mm) QPrintDialog>:0;L=K9 D09; Local file QPrintDialogOKOK QPrintDialog0?5G0B0BLPrint QPrintDialog"5G0BL 2 D09; ...Print To File ... QPrintDialog5G0B0BL 2A5 Print all QPrintDialog"5G0B0BL 480?07>= Print range QPrintDialogPrint selection QPrintDialog&5G0BL 2 D09; (PDF)Print to File (PDF) QPrintDialog45G0BL 2 D09; (Postscript)Print to File (Postscript) QPrintDialogTabloid QPrintDialog,Tabloid (279 x 432 <<)Tabloid (279 x 432 mm) QPrintDialog7The 'From' value cannot be greater than the 'To' value. QPrintDialogUS Common #10 Envelope QPrintDialog6>=25@B US #10 (105x241 <<)%US Common #10 Envelope (105 x 241 mm) QPrintDialog 0?8A0BL %1 D09; Write %1 file QPrintDialog;>:0;L=K9locally connected QPrintDialog=58725AB=>unknown QPrintDialog%1%QPrintPreviewDialog0:@KBLCloseQPrintPreviewDialog Export to PDFQPrintPreviewDialogExport to PostScriptQPrintPreviewDialog First pageQPrintPreviewDialogFit pageQPrintPreviewDialog Fit widthQPrintPreviewDialog ;L1>< LandscapeQPrintPreviewDialog Last pageQPrintPreviewDialog Next pageQPrintPreviewDialog Page SetupQPrintPreviewDialog Page setupQPrintPreviewDialog>@B@5BPortraitQPrintPreviewDialog Previous pageQPrintPreviewDialog PrintPrintQPrintPreviewDialog Print PreviewQPrintPreviewDialogShow facing pagesQPrintPreviewDialogShow overview of all pagesQPrintPreviewDialogShow single pageQPrintPreviewDialogZoom inQPrintPreviewDialogZoom outQPrintPreviewDialogAdvancedQPrintPropertiesWidgetBFormQPrintPropertiesWidget!B@0=8F0PageQPrintPropertiesWidgetC<5@0F8OCollateQPrintSettingsOutput&25B=>9ColorQPrintSettingsOutput&25B>2>9 @568< Color ModeQPrintSettingsOutput >?88CopiesQPrintSettingsOutput >?89:Copies:QPrintSettingsOutput"C?;5:A=0O ?5G0BLDuplex PrintingQPrintSettingsOutputBFormQPrintSettingsOutput@040F88 A5@>3> GrayscaleQPrintSettingsOutput;8==0O AB>@>=0 Long sideQPrintSettingsOutput5BNoneQPrintSettingsOutput0@0<5B@KOptionsQPrintSettingsOutput$KE>4=K5 =0AB@>9:8Output SettingsQPrintSettingsOutput!B@0=8FK >B Pages fromQPrintSettingsOutput5G0B0BL 2A5 Print allQPrintSettingsOutput"5G0B0BL 480?07>= Print rangeQPrintSettingsOutput  525@AReverseQPrintSettingsOutput SelectionQPrintSettingsOutput >@>B:0O AB>@>=0 Short sideQPrintSettingsOutput4>toQPrintSettingsOutput &<O:&Name: QPrintWidget...... QPrintWidgetBForm QPrintWidget>:0F8O: Location: QPrintWidgetKE>4=>9 &D09;: Output &file: QPrintWidget!&2>9AB20 P&roperties QPrintWidget@54?@>A<>B@Preview QPrintWidget@8=B5@Printer QPrintWidget"8?:Type: QPrintWidget,Could not open input redirection for readingQProcess-Could not open output redirection for writingQProcessError reading from processQProcessError writing to processQProcessNo program definedQProcessProcess crashedQProcessProcess failed to startQProcessProcess operation timed outQProcess!Resource error (fork failure): %1QProcess B<5=0CancelQProgressDialogB:@KBLOpen QPushButtonCheck QRadioButton*bad char class syntaxbad char class syntaxQRegExp(bad lookahead syntaxbad lookahead syntaxQRegExp*bad repetition syntaxbad repetition syntaxQRegExpL8A?>;L7>20;8AL >B:;NG5==K5 2>7<>6=>AB8disabled feature usedQRegExpD=5:>@@5:B=>5 2>AL<5@8G=>5 7=0G5=85invalid octal valueQRegExpB4>AB83=CB> 2=CB@5==55 >3@0=8G5=85met internal limitQRegExp:>BACBAB2C5B ;52K9 @0745;8B5;Lmissing left delimQRegExp$>H81:8 >BACBAB2CNBno error occurredQRegExp"=5>6840==K9 :>=5Funexpected endQRegExpError to open databaseQSQLite2DriverUnable to begin transactionQSQLite2DriverUnable to commit transactionQSQLite2DriverUnable to rollback TransactionQSQLite2DriverUnable to execute statementQSQLite2ResultUnable to fetch resultsQSQLite2ResultError closing database QSQLiteDriverError opening database QSQLiteDriverUnable to begin transaction QSQLiteDriverUnable to commit transaction QSQLiteDriverUnable to rollback transaction QSQLiteDriverNo query QSQLiteResultParameter count mismatch QSQLiteResultUnable to bind parameters QSQLiteResultUnable to execute statement QSQLiteResultUnable to fetch row QSQLiteResultUnable to reset statement QSQLiteResultBottom QScrollBar Left edge QScrollBar Line down QScrollBarK@>2=OBLLine up QScrollBar Page down QScrollBar Page left QScrollBar Page right QScrollBarPage up QScrollBarPosition QScrollBar Right edge QScrollBar Scroll down QScrollBar Scroll here QScrollBar Scroll left QScrollBar Scroll right QScrollBar Scroll up QScrollBarTop QScrollBar%1: already exists QSharedMemory%1: create size is less then 0 QSharedMemory%1: doesn't exists QSharedMemory%1: ftok failed QSharedMemory%1: invalid size QSharedMemory %1: key error QSharedMemory%1: key is empty QSharedMemory%1: not attached QSharedMemory%1: out of resources QSharedMemory%1: permission denied QSharedMemory%1: size query failed QSharedMemory$%1: system-imposed size restrictions QSharedMemory%1: unable to lock QSharedMemory%1: unable to make key QSharedMemory%1: unable to set key on lock QSharedMemory%1: unable to unlock QSharedMemory %1: unix key file doesn't exists QSharedMemory%1: unknown error %2 QSharedMemory++ QShortcutAltAlt QShortcut 0704Back QShortcutBackspace Backspace QShortcutBacktabBacktab QShortcutBass Boost Bass Boost QShortcutBass Down Bass Down QShortcutBass UpBass Up QShortcutCall QShortcut Caps Lock QShortcutCapsLockCapsLock QShortcutContext1 QShortcutContext2 QShortcutContext3 QShortcutContext4 QShortcutCtrlCtrl QShortcutDelDel QShortcut#40;8BLDelete QShortcutDownDown QShortcutEndEnd QShortcut EnterEnter QShortcutEscEsc QShortcutEscape QShortcutF%1F%1 QShortcut71@0==>5 Favorites QShortcutFlip QShortcut ?5@54Forward QShortcutHangup QShortcut!?@02:0Help QShortcutHomeHome QShortcut Home Page QShortcutInsIns QShortcutAB028BLInsert QShortcut0?CAB8BL (0) Launch (0) QShortcut0?CAB8BL (1) Launch (1) QShortcut0?CAB8BL (2) Launch (2) QShortcut0?CAB8BL (3) Launch (3) QShortcut0?CAB8BL (4) Launch (4) QShortcut0?CAB8BL (5) Launch (5) QShortcut0?CAB8BL (6) Launch (6) QShortcut0?CAB8BL (7) Launch (7) QShortcut0?CAB8BL (8) Launch (8) QShortcut0?CAB8BL (9) Launch (9) QShortcut0?CAB8BL (A) Launch (A) QShortcut0?CAB8BL (B) Launch (B) QShortcut0?CAB8BL (C) Launch (C) QShortcut0?CAB8BL (D) Launch (D) QShortcut0?CAB8BL (E) Launch (E) QShortcut0?CAB8BL (F) Launch (F) QShortcut >GB0 Launch Mail QShortcut@>83@K20B5;L Launch Media QShortcutLeftLeft QShortcut.>A?@>8725AB8 A;54CNI55 Media Next QShortcut>A?@>872545=85 Media Play QShortcut0>A?@>8725AB8 ?@54K4CI55Media Previous QShortcut 0?8AL Media Record QShortcut4AB0=>28BL 2>A?@>872545=85 Media Stop QShortcut5=NMenu QShortcutMetaMeta QShortcut5BNo QShortcutNum Lock QShortcutNumLockNumLock QShortcut Number Lock QShortcutB:@KBL URLOpen URL QShortcut Page Down QShortcutPage Up QShortcut PausePause QShortcut PgDownPgDown QShortcutPgUpPgUp QShortcut PrintPrint QShortcut Print Screen QShortcut1=>28BLRefresh QShortcut ReturnReturn QShortcut RightRight QShortcut Scroll Lock QShortcutScrollLock ScrollLock QShortcut >8A:Search QShortcutSelect QShortcut ShiftShift QShortcut SpaceSpace QShortcut56C@=K9 @568<Standby QShortcut!B>?Stop QShortcut SysReqSysReq QShortcutSystem Request QShortcutTabTab QShortcutTreble Down Treble Down QShortcutTreble Up Treble Up QShortcutUpUp QShortcut"8H5 Volume Down QShortcutK:;NG8BL 72C: Volume Mute QShortcut @><G5 Volume Up QShortcut0Yes QShortcut Page downQSlider Page leftQSlider Page rightQSliderPage upQSliderPositionQSliderAddress type not supportedQSocks5SocketEngine(Connection not allowed by SOCKSv5 serverQSocks5SocketEngine&Connection to proxy closed prematurelyQSocks5SocketEngineConnection to proxy refusedQSocks5SocketEngineConnection to proxy timed outQSocks5SocketEngineGeneral SOCKSv5 server failureQSocks5SocketEngineNetwork operation timed outQSocks5SocketEngineProxy authentication failedQSocks5SocketEngineProxy authentication failed: %1QSocks5SocketEngineProxy host not foundQSocks5SocketEngineSOCKS version 5 protocol errorQSocks5SocketEngineSOCKSv5 command not supportedQSocks5SocketEngine TTL expiredQSocks5SocketEngine%Unknown SOCKSv5 proxy error code 0x%1QSocks5SocketEngineLessQSpinBoxMoreQSpinBox B<5=0CancelQSql&B<5=8BL 87<5=5=8O?Cancel your edits?QSql>4B25@48BLConfirmQSql#40;8BLDeleteQSql&#40;8BL MBC 70?8AL?Delete this record?QSqlAB028BLInsertQSql5BNoQSql(!>E@0=8BL 87<5=5=8O? Save edits?QSql1=>28BLUpdateQSql0YesQSql,Cannot provide a certificate with no key, %1 QSslSocketError creating SSL context (%1) QSslSocketError creating SSL session, %1 QSslSocketError creating SSL session: %1 QSslSocketError during SSL handshake: %1 QSslSocket#Error loading local certificate, %1 QSslSocketError loading private key, %1 QSslSocketError while reading: %1 QSslSocket!Invalid or empty cipher list (%1) QSslSocket/Private key does not certificate public key, %1 QSslSocketUnable to write data: %1 QSslSocket%1: already existsQSystemSemaphore%1: does not existQSystemSemaphore%1: out of resourcesQSystemSemaphore%1: permission deniedQSystemSemaphore%1: unknown error %2QSystemSemaphoreUnable to open connection QTDSDriverUnable to use database QTDSDriver Scroll LeftQTabBar Scroll RightQTabBar$Operation on socket is not supported QTcpServer&>?8@>20BL&Copy QTextControl&AB028BL&Paste QTextControl&>2B>@8BL&Redo QTextControl&B<5=8BL&Undo QTextControlCopy &Link Location QTextControl&K@570BLCu&t QTextControl#40;8BLDelete QTextControlK45;8BL 2A5 Select All QTextControlB:@KBLOpen QToolButtonPress QToolButton#This platform does not support IPv6 QUdpSocket>2B>@8BLRedo QUndoGroupB<5=8BLUndo QUndoGroup QUndoModel>2B>@8BLRedo QUndoStackB<5=8BLUndo QUndoStack Insert Unicode control characterQUnicodeControlCharacterMenu$LRE Start of left-to-right embeddingQUnicodeControlCharacterMenuLRM Left-to-right markQUnicodeControlCharacterMenu#LRO Start of left-to-right overrideQUnicodeControlCharacterMenuPDF Pop directional formattingQUnicodeControlCharacterMenu$RLE Start of right-to-left embeddingQUnicodeControlCharacterMenuRLM Right-to-left markQUnicodeControlCharacterMenu#RLO Start of right-to-left overrideQUnicodeControlCharacterMenuZWJ Zero width joinerQUnicodeControlCharacterMenuZWNJ Zero width non-joinerQUnicodeControlCharacterMenuZWSP Zero width spaceQUnicodeControlCharacterMenuCannot show URL QWebFrameCannot show mimetype QWebFrameFile does not exist QWebFrame&Frame load interruped by policy change QWebFrameRequest blocked QWebFrameRequest cancelled QWebFrame%1 (%2x%3 pixels)QWebPage %n file(s)QWebPageAdd To DictionaryQWebPageBad HTTP requestQWebPageBoldQWebPageBottomQWebPageCheck Grammar With SpellingQWebPageCheck SpellingQWebPageCheck Spelling While TypingQWebPage Choose FileQWebPageClear recent searchesQWebPageCopyQWebPage Copy ImageQWebPage Copy LinkQWebPageCutQWebPageDefaultQWebPageDelete to the end of the wordQWebPageDelete to the start of the wordQWebPage DirectionQWebPageFontsQWebPageGo BackQWebPage Go ForwardQWebPageHide Spelling and GrammarQWebPageIgnoreQWebPageInsert a new lineQWebPageInsert a new paragraphQWebPageInspectQWebPageItalicQWebPageJavaScript Alert - %1QWebPageJavaScript Confirm - %1QWebPageJavaScript Prompt - %1QWebPageLTRQWebPage Left edgeQWebPageLook Up In DictionaryQWebPage'Move the cursor to the end of the blockQWebPage*Move the cursor to the end of the documentQWebPage&Move the cursor to the end of the lineQWebPage%Move the cursor to the next characterQWebPage Move the cursor to the next lineQWebPage Move the cursor to the next wordQWebPage)Move the cursor to the previous characterQWebPage$Move the cursor to the previous lineQWebPage$Move the cursor to the previous wordQWebPage)Move the cursor to the start of the blockQWebPage,Move the cursor to the start of the documentQWebPage(Move the cursor to the start of the lineQWebPageNo Guesses FoundQWebPageNo file selectedQWebPageNo recent searchesQWebPage Open FrameQWebPage Open ImageQWebPage Open LinkQWebPageOpen in New WindowQWebPageOutlineQWebPage Page downQWebPage Page leftQWebPage Page rightQWebPagePage upQWebPagePasteQWebPageRTLQWebPageRecent searchesQWebPageReloadQWebPageResetQWebPage Right edgeQWebPage Save ImageQWebPage Save Link...QWebPage Scroll downQWebPage Scroll hereQWebPage Scroll leftQWebPage Scroll rightQWebPage Scroll upQWebPageSearch The WebQWebPage Select allQWebPageSelect to the end of the blockQWebPage!Select to the end of the documentQWebPageSelect to the end of the lineQWebPageSelect to the next characterQWebPageSelect to the next lineQWebPageSelect to the next wordQWebPage Select to the previous characterQWebPageSelect to the previous lineQWebPageSelect to the previous wordQWebPage Select to the start of the blockQWebPage#Select to the start of the documentQWebPageSelect to the start of the lineQWebPageShow Spelling and GrammarQWebPageSpellingQWebPage!B>?StopQWebPageSubmitQWebPageText DirectionQWebPage3This is a searchable index. Enter search keywords: QWebPageTopQWebPage UnderlineQWebPageUnknownQWebPageWeb Inspector - %2QWebPage'B> MB>? What's This?QWhatsThisAction*QWidget &$8=8H&FinishQWizard&!?@02:0&HelpQWizard&NextQWizard&?5@54 >&Next >QWizard< &0704< &BackQWizard B<5=0CancelQWizardCommitQWizardContinueQWizardDoneQWizardGo BackQWizard!?@02:0HelpQWizard%1 - [%2] %1 - [%2] QWorkspace&0:@KBL&Close QWorkspace&5@5<5AB8BL&Move QWorkspace&>AAB0=>28BL&Restore QWorkspace& 07<5@&Size QWorkspace4>AAB0=>28BL 87 70&3>;>2:0&Unshade QWorkspace0:@KBLClose QWorkspace &0725@=CBL Ma&ximize QWorkspace&!25@=CBL Mi&nimize QWorkspace!25@=CBLMinimize QWorkspace>AAB0=>28BL Restore Down QWorkspace*!25@=CBL 2 70&3>;>2>:Sh&ade QWorkspaceA5340 &=025@EC Stay on &Top QWorkspace?@8 GB5=88 XML-B530 >6840;AO ?0@0<5B@ encoding 8;8 ?0@0<5B@ standaloneYencoding declaration or standalone declaration expected while reading the XML declarationQXmlferror in the text declaration of an external entity3error in the text declaration of an external entityQXml~2 ?@>F5AA5 3@0<<0B8G5A:>3> @071>@0 :><<5=B0@8O ?@>87>H;0 >H81:0$error occurred while parsing commentQXmlf2 ?@>F5AA5 3@0<<0B8G5A:>3> @071>@0 ?@>87>H;0 >H81:0$error occurred while parsing contentQXml2 ?@>F5AA5 3@0<<0B8G5A:>3> @071>@0 B8?0 4>:C<5=B0 ?@>87>H;0 >H81:05error occurred while parsing document type definitionQXmlx2 ?@>F5AA5 3@0<<0B8G5A:>3> @071>@0 M;5<5=B0 ?@>87>H;0 >H81:0$error occurred while parsing elementQXmlt2 ?@>F5AA5 3@0<<0B8G5A:>3> @071>@0 AAK;:8 ?@>87>H;0 >H81:0&error occurred while parsing referenceQXmlB>H81:0 8=8F88@>20=0 ?>;L7>20B5;5<error triggered by consumerQXmlvexternal parsed general entity reference not allowed in DTD;external parsed general entity reference not allowed in DTDQXmlexternal parsed general entity reference not allowed in attribute valueGexternal parsed general entity reference not allowed in attribute valueQXmlhinternal general entity reference not allowed in DTD4internal general entity reference not allowed in DTDQXml4=5:>@@5:B=>5 8<O 48@5:B82K'invalid name for processing instructionQXml>6840;AO A8<2>;letter is expectedQXmlP>?@545;5= 1>;55, G5< >48= B8? 4>:C<5=B>2&more than one document type definitionQXml$>H81:8 >BACBAB2CNBno error occurredQXml&@5:C@A82=K5 >1J5:BKrecursive entitiesQXml`?@8 GB5=88 XML-B530 >6840;AO ?0@0<5B@ standaloneAstandalone declaration expected while reading the XML declarationQXml>BACBAB2C5B B53 tag mismatchQXml$=5>6840==K9 A8<2>;unexpected characterQXml.=5>6840==K9 :>=5F D09;0unexpected end of fileQXmlTunparsed entity reference in wrong context*unparsed entity reference in wrong contextQXmlZ?@8 GB5=88 XML-B530 >6840;AO ?0@0<5B@ version2version expected while reading the XML declarationQXmlT=5:>@@5:B=>5 7=0G5=85 ?0@0<5B@0 standalone&wrong value for standalone declarationQXml#%1 is an invalid PUBLIC identifier. QXmlStream%1 is an invalid encoding name. QXmlStream-%1 is an invalid processing instruction name. QXmlStream , but got ' QXmlStreamAttribute redefined. QXmlStreamEncoding %1 is unsupported QXmlStream(Encountered incorrectly encoded content. QXmlStreamEntity '%1' not declared. QXmlStream Expected  QXmlStreamExpected character data. QXmlStream!Extra content at end of document. QXmlStreamIllegal namespace declaration. QXmlStreamInvalid XML character. QXmlStreamInvalid XML name. QXmlStreamInvalid XML version string. QXmlStream%Invalid attribute in XML declaration. QXmlStreamInvalid character reference. QXmlStreamInvalid document. QXmlStreamInvalid entity value. QXmlStream$Invalid processing instruction name. QXmlStream&NDATA in parameter entity declaration. QXmlStream"Namespace prefix '%1' not declared QXmlStream Opening and ending tag mismatch. QXmlStreamPremature end of document. QXmlStreamRecursive entity detected. QXmlStream5Reference to external entity '%1' in attribute value. QXmlStream"Reference to unparsed entity '%1'. QXmlStream&Sequence ']]>' not allowed in content. QXmlStream"Standalone accepts only yes or no. QXmlStreamStart tag expected. QXmlStream?The standalone pseudo attribute must appear after the encoding. QXmlStream Unexpected ' QXmlStream/Unexpected character '%1' in public id literal. QXmlStreamUnsupported XML version. QXmlStream)XML declaration not at start of document. QXmlStream,%1 and %2 match the start and end of a line. QtXmlPatterns%1 cannot be retrieved QtXmlPatternsE%1 contains octets which are disallowed in the requested encoding %2. QtXmlPatternss%1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works. QtXmlPatterns%1 is an invalid %2 QtXmlPatterns?%1 is an invalid flag for regular expressions. Valid flags are: QtXmlPatterns%1 is an invalid namespace URI. QtXmlPatterns/%1 is an invalid regular expression pattern: %2 QtXmlPatterns$%1 is an invalid template mode name. QtXmlPatterns%1 is an unknown schema type. QtXmlPatterns%1 is an unsupported encoding. QtXmlPatterns$%1 is not a valid XML 1.0 character. QtXmlPatterns4%1 is not a valid name for a processing-instruction. QtXmlPatterns"%1 is not a valid numeric literal. QtXmlPatternsZ%1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3. QtXmlPatterns#%1 is not a valid value of type %2. QtXmlPatterns$%1 is not a whole number of minutes. QtXmlPatternsC%1 is not an atomic type. Casting is only possible to atomic types. QtXmlPatternsg%1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported. QtXmlPatterns&%1 is not valid as a value of type %2. QtXmlPatterns%1 matches newline characters QtXmlPatternsJ%1 must be followed by %2 or %3, not at the end of the replacement string. QtXmlPatterns=%1 requires at least %n argument(s). %2 is therefore invalid. QtXmlPatterns9%1 takes at most %n argument(s). %2 is therefore invalid. QtXmlPatterns%1 was called. QtXmlPatternsA comment cannot contain %1 QtXmlPatternsA comment cannot end with a %1. QtXmlPatternsAn %1-attribute must have a valid %2 as value, which %3 isn't. QtXmlPatterns8An %1-attribute with value %2 has already been declared. QtXmlPatternsUAn argument by name %1 has already been declared. Every argument name must be unique. QtXmlPatterns=An attribute by name %1 has already appeared on this element. QtXmlPatterns1An attribute by name %1 has already been created. QtXmlPatternsdAn attribute node cannot be a child of a document node. Therefore, the attribute %1 is out of place. QtXmlPatterns3At least one %1 element must appear as child of %2. QtXmlPatterns-At least one %1-element must occur before %2. QtXmlPatterns-At least one %1-element must occur inside %2. QtXmlPatterns'At least one component must be present. QtXmlPatternsFAt least one mode must be specified in the %1-attribute on element %2. QtXmlPatterns?At least one time component must appear after the %1-delimiter. QtXmlPatterns+Attribute %1 and %2 are mutually exclusive. QtXmlPatternsEAttribute %1 can't be serialized because it appears at the top level. QtXmlPatterns]Attribute %1 cannot appear on the element %2. Allowed is %3, %4, and the standard attributes. QtXmlPatternsYAttribute %1 cannot appear on the element %2. Allowed is %3, and the standard attributes. QtXmlPatterns^Attribute %1 cannot appear on the element %2. Only %3 is allowed, and the standard attributes. QtXmlPatternsVAttribute %1 cannot appear on the element %2. Only the standard attributes can appear. QtXmlPatterns&Attribute %1 cannot have the value %2. QtXmlPatternsfCasting to %1 is not possible because it is an abstract type, and can therefore never be instantiated. QtXmlPatternsCircularity detected QtXmlPatternsDay %1 is invalid for month %2. QtXmlPatterns#Day %1 is outside the range %2..%3. QtXmlPatterns@Dividing a value of type %1 by %2 (not-a-number) is not allowed. QtXmlPatternsLDividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed. QtXmlPatterns(Division (%1) by zero (%2) is undefined. QtXmlPatternsCEach name of a template parameter must be unique; %1 is duplicated. QtXmlPatternsaEffective Boolean Value cannot be calculated for a sequence containing two or more atomic values. QtXmlPatternsOElement %1 can't be serialized because it appears outside the document element. QtXmlPatterns.Element %1 cannot have a sequence constructor. QtXmlPatterns Element %1 cannot have children. QtXmlPatterns+Element %1 is not allowed at this location. QtXmlPatternsElement %1 must come last. QtXmlPatterns=Element %1 must have at least one of the attributes %2 or %3. QtXmlPatternsEElement %1 must have either a %2-attribute or a sequence constructor. QtXmlPatterns&Failure when casting from %1 to %2: %3 QtXmlPatternsbIf both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same. QtXmlPatternsEIf element %1 has no attribute %2, it cannot have attribute %3 or %4. QtXmlPatternsIf the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified. QtXmlPatternsPIn a namespace constructor, the value for a namespace cannot be an empty string. QtXmlPatterns@In a simplified stylesheet module, attribute %1 must be present. QtXmlPatternsDIn an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can. QtXmlPatterns>In an XSL-T pattern, function %1 cannot have a third argument. QtXmlPatternsOIn an XSL-T pattern, only function %1 and %2, not %3, can be used for matching. QtXmlPatternsyIn an XSL-T pattern, the first argument to function %1 must be a literal or a variable reference, when used for matching. QtXmlPatternshIn an XSL-T pattern, the first argument to function %1 must be a string literal, when used for matching. QtXmlPatternsMIn the replacement string, %1 can only be used to escape itself or %2, not %3 QtXmlPatternsVIn the replacement string, %1 must be followed by at least one digit when not escaped. QtXmlPatterns0Integer division (%1) by zero (%2) is undefined. QtXmlPatterns+It is not possible to bind to the prefix %1 QtXmlPatterns)It is not possible to cast from %1 to %2. QtXmlPatterns*It is not possible to redeclare prefix %1. QtXmlPatterns'It will not be possible to retrieve %1. QtXmlPatternsAIt's not possible to add attributes after any other kind of node. QtXmlPatterns7It's not possible to cast the value %1 of type %2 to %3 QtXmlPatternsMatches are case insensitive QtXmlPatternsMModule imports must occur before function, variable, and option declarations. QtXmlPatterns0Modulus division (%1) by zero (%2) is undefined. QtXmlPatterns%Month %1 is outside the range %2..%3. QtXmlPatternsYMultiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed. QtXmlPatternsONamespace %1 can only be bound to %2 (and it is, in either case, pre-declared). QtXmlPatternsUNamespace declarations must occur before function, variable, and option declarations. QtXmlPatternsNetwork timeout. QtXmlPatterns2No casting is possible with %1 as the target type. QtXmlPatterns1No comparisons can be done involving the type %1. QtXmlPatterns{No external functions are supported. All supported functions can be used directly, without first declaring them as external QtXmlPatterns$No function by name %1 is available. QtXmlPatterns*No function with signature %1 is available QtXmlPatterns-No namespace binding exists for the prefix %1 QtXmlPatterns3No namespace binding exists for the prefix %1 in %2 QtXmlPatterns1No operand in an integer division, %1, can be %2. QtXmlPatternsNo template by name %1 exists. QtXmlPatterns;No value is available for the external variable by name %1. QtXmlPatternsNo variable by name %1 exists QtXmlPatterns^None of the pragma expressions are supported. Therefore, a fallback expression must be present QtXmlPatterns6Only one %1 declaration can occur in the query prolog. QtXmlPatternsOnly one %1-element can appear. QtXmlPatternsIOnly the Unicode Codepoint Collation is supported(%1). %2 is unsupported. QtXmlPatterns5Only the prefix %1 can be bound to %2 and vice versa. QtXmlPatterns>Operator %1 cannot be used on atomic values of type %2 and %3. QtXmlPatterns&Operator %1 cannot be used on type %2. QtXmlPatternsEOperator %1 is not available between atomic values of type %2 and %3. QtXmlPatterns"Overflow: Can't represent date %1. QtXmlPatterns$Overflow: Date can't be represented. QtXmlPatternsParse error: %1 QtXmlPatternsLPrefix %1 can only be bound to %2 (and it is, in either case, pre-declared). QtXmlPatterns,Prefix %1 is already declared in the prolog. QtXmlPatterns/Promoting %1 to %2 may cause loss of precision. QtXmlPatterns/Required cardinality is %1; got cardinality %2. QtXmlPatterns&Required type is %1, but %2 was found. QtXmlPatterns5Running an XSL-T 1.0 stylesheet with a 2.0 processor. QtXmlPatterns,Text nodes are not allowed at this location. QtXmlPatterns$The %1-axis is unsupported in XQuery QtXmlPatternsWThe Schema Import feature is not supported, and therefore %1 declarations cannot occur. QtXmlPatternsVThe Schema Validation Feature is not supported. Hence, %1-expressions may not be used. QtXmlPatternsThe URI cannot have a fragment QtXmlPatterns9The attribute %1 can only appear on the first %2 element. QtXmlPatterns?The attribute %1 cannot appear on %2, when it is a child of %3. QtXmlPatterns+The attribute %1 must appear on element %2. QtXmlPatternsQThe codepoint %1, occurring in %2 using encoding %3, is an invalid XML character. QtXmlPatternsAThe data of a processing instruction cannot contain the string %1 QtXmlPatterns#The default collection is undefined QtXmlPatterns7The element with local name %1 does not exist in XSL-T. QtXmlPatternsThe encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2. QtXmlPatterns.The first argument to %1 cannot be of type %2. QtXmlPatternsuThe first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration. QtXmlPatternsPThe first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5. QtXmlPatternsFThe first operand in an integer division, %1, cannot be infinity (%2). QtXmlPatternsThe focus is undefined. QtXmlPatterns3The initialization of variable %1 depends on itself QtXmlPatterns/The item %1 did not match the required type %2. QtXmlPatterns5The keyword %1 cannot occur with any other mode name. QtXmlPatternskThe last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two. QtXmlPatterns*The module import feature is not supported QtXmlPatterns.The name %1 does not refer to any schema type. QtXmlPatternsZThe name for a computed attribute cannot have the namespace URI %1 with the local name %2. QtXmlPatternsThe name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide. QtXmlPatterns;The name of an extension expression must be in a namespace. QtXmlPatternsTThe name of an option must have a prefix. There is no default namespace for options. QtXmlPatternsThe namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases. QtXmlPatternsJThe namespace URI cannot be the empty string when binding to a prefix, %1. QtXmlPatternsDThe namespace URI in the name for a computed attribute cannot be %1. QtXmlPatternsIThe namespace URI must be a constant and cannot use enclosed expressions. QtXmlPatternsyThe namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this) QtXmlPatternsThe namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2 QtXmlPatternsThe normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization). QtXmlPatterns;The parameter %1 is passed, but no corresponding %2 exists. QtXmlPatternsBThe parameter %1 is required, but no corresponding %2 is supplied. QtXmlPatternsTThe prefix %1 can not be bound. By default, it is already bound to the namespace %2. QtXmlPatternsThe prefix %1 cannot be bound. QtXmlPatterns/The prefix must be a valid %1, which %2 is not. QtXmlPatternsgThe root node of the second argument to function %1 must be a document node. %2 is not a document node. QtXmlPatternsQThe second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5. QtXmlPatterns:The second operand in a division, %1, cannot be zero (%2). QtXmlPatterns~The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, is %2 invalid. QtXmlPatterns-The target namespace of a %1 cannot be empty. QtXmlPatternsIThe value for attribute %1 on element %2 must either be %3 or %4, not %5. QtXmlPatterns:The value of attribute %1 must of type %2, which %3 isn't. QtXmlPatternsTThe value of the XSL-T version attribute must be a value of type %1, which %2 isn't. QtXmlPatternsThe variable %1 is unused QtXmlPatternsCThis processor is not Schema-aware and therefore %1 cannot be used. QtXmlPatternsTime %1:%2:%3.%4 is invalid. QtXmlPatterns_Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0;  QtXmlPatternsNTop level stylesheet elements must be in a non-null namespace, which %1 isn't. QtXmlPatterns?S``Y2ee@eSįį y~^Q(4Of(4O(5O(5P*y*y|*y*TT *0'*0+F+F+fW+fF+z0+&+} +Z+z1++:;+F+TJ+9+=+įZ+į}@+į+1M; F0iG:Hw9Hw9:I.IJ+J6<J62.J6;WJ6@FJ6|J6J6!J6KJLZOLL2]LbM5@O|1PFE PFEPFEZTU?^$IU|8>V1V1Vl VޱWWTWT<X=X+X˙>EX(Y`YNZg\]4\]4\]at|^v9v"f[IA[=]I9y(ɵn2ɵnh9ɵnodɵn~ɵn,ɵnĖɵn)-^ B5qMEv-qH.<p5#Q%UT(ŎP{*42 CCCeID"D1YMxaR?FfP l!oR+w^2|{yW2O2.AqRO d yGturp m"l)+P-\/=N1$#5~Xj< u#?NtNky]`4`"  6KE")rg6966^\=|'=~.P8YEKEΝJ{.8AAZQ[yL6n@5K ŢɚMUMeEVE`Www!e-&)*/e5P;pBy@F8gOZfJ`cփfjCP>qKu(B~U )$$ g(^ n,jc;y3A&Hi./i5IxS/~R>#YMWAYM`h^ i%ssczw˦Wۊ1N-]]IfIsII;I.II>ILY؈iy\ט Ihxٴ,<uD[uDbDpo,,},,,mZɘeԣ5$ fR -fRMKNղMc#Pq^V<VfREIְ [q%C ?"KN?MR]g>]n\ky^J{yFNG%UMصǥ+&t {yir %/C-~5qƨƨ˾nҝz i4է?Z>!xf 2~bM~bS,o !l+3*//%6 DGVwGbQLAUPѧ;Sn'UsUZҙZZ ZA[]k*L^n we ri[sibkQ"oN`y;{X}uj}w)}wz}w  "t%tt.}.PDt(ytaMtg_ Fʢ67ʢd7"dddw59kiUBw xD k+d2A6\CU]EDKGU|arƬt}wZE}$}$&}$ZK<<6 /aETu%5RTi~xZ%.5kEXU KbDKbGvgAZi$x1 _z*2еd0Uћ5ÙzBmVnm߽C>ʴ5ʴ5ԄDZd F5F5YI IKAs 6 }$$ qe_3 ڤ E. E Acx AcN 35z K!?Hm bb b`^ b` i3% la7 xq | t tNI . X B (  > 3 pE K o %'_  ڤ =  )J */Ђ 7uc ;y, =U B Rۮ T^T ] `g `$ c( df e v eL f1X gnh k,C rD" t Sm) Vq ]$4T f)x f)H io>V m` = w yr8 H HFN * $I6 .@  i/  } J JJ v t. k Ӈl  N>w ̺T -DU .{ k k U)c? < 0;  Z  bQ ݦ xHfg ./ 7F >] >^ >_ >f >s >|` >K > DT I/G RVO) RV RV S. S Yo [1 j7oD p0J . Bo > T3e T$ T T X q% 5  )dU  .3 .h . .W a yE ҂  t a :bc ʜ.t +>1 0E ;ɾ Pt Pt fe` fe gN iFC iLB ic n) u' uX w$ w~ w w}x w} w}, |[% X a ^ }z R  X &% D M t5 t5   )v T)gT*O*(?*/E)/E=BuI_d XRu[ a.<(nyG#vɅy$S~eSsO^B&>ݖ[y  I5"#ȣ$U%4?C%4R6-v0i)ۣ0{1cR2wT]D!/HJde0L$.c5ʹc5gyC"{~a`k[7JJNCkyP|t2-~ǚi&4HLa secuencia %1, %2 no est definida%1, %2 not definedQ3Accel>Secuencia ambigua %1 no tratadaAmbiguous %1 not handledQ3Accel BorrarDelete Q3DataTable FalsoFalse Q3DataTableInsertarInsert Q3DataTableVerdaderoTrue Q3DataTableActualizarUpdate Q3DataTable%1 Fichero no encontrado. Compruebe la ruta y el nombre del fichero.+%1 File not found. Check path and filename. Q3FileDialog&Borrar&Delete Q3FileDialog&No&No Q3FileDialog&Aceptar&OK Q3FileDialog &Abrir&Open Q3FileDialog$Cambia&r de nombre&Rename Q3FileDialog&Guardar&Save Q3FileDialog&Sin ordenar &Unsorted Q3FileDialog&S&Yes Q3FileDialogT<qt>Seguro que desea borrar %1 %2?</qt>1Are you sure you wish to delete %1 "%2"? Q3FileDialog,Todos los ficheros (*) All Files (*) Q3FileDialog0Todos los ficheros (*.*)All Files (*.*) Q3FileDialogAtributos Attributes Q3FileDialog,Precedente (histrico)Back Q3FileDialogCancelarCancel Q3FileDialog2Copiar o mover un ficheroCopy or Move a File Q3FileDialog.Crear una nueva carpetaCreate New Folder Q3FileDialog FechaDate Q3FileDialogBorrar %1 Delete %1 Q3FileDialogVista detallada Detail View Q3FileDialogDirectorioDir Q3FileDialogDirectorios Directories Q3FileDialogDirectorio: Directory: Q3FileDialog ErrorError Q3FileDialogFicheroFile Q3FileDialog&&Nombre de fichero: File &name: Q3FileDialog"&Tipo de fichero: File &type: Q3FileDialog.Buscar en el directorioFind Directory Q3FileDialogInaccesible Inaccessible Q3FileDialogVista de lista List View Q3FileDialogBuscar &en: Look &in: Q3FileDialog NombreName Q3FileDialogNueva carpeta New Folder Q3FileDialog Nueva carpeta %1 New Folder %1 Q3FileDialogNueva carpeta 1 New Folder 1 Q3FileDialog2Ir al directorio superiorOne directory up Q3FileDialog AbrirOpen Q3FileDialog Abrir Open  Q3FileDialogHContenido del fichero previsualizadoPreview File Contents Q3FileDialogLInformacin del fichero previsualizadoPreview File Info Q3FileDialogR&ecargarR&eload Q3FileDialogSlo lectura Read-only Q3FileDialog"Lectura-escritura Read-write Q3FileDialogLectura: %1Read: %1 Q3FileDialogGuardar comoSave As Q3FileDialog2Seleccionar un directorioSelect a Directory Q3FileDialog:Mostrar los fic&heros ocultosShow &hidden files Q3FileDialog TamaoSize Q3FileDialogOrdenarSort Q3FileDialog$Ordenar por &fecha Sort by &Date Q3FileDialog&Ordenar por &nombre Sort by &Name Q3FileDialog&Ordenar por &tamao Sort by &Size Q3FileDialog Fichero especialSpecial Q3FileDialog@Enlace simblico a un directorioSymlink to Directory Q3FileDialog:Enlace simblico a un ficheroSymlink to File Q3FileDialogLEnlace simblico a un fichero especialSymlink to Special Q3FileDialogTipoType Q3FileDialogSlo escritura Write-only Q3FileDialogEscritura: %1 Write: %1 Q3FileDialogel directorio the directory Q3FileDialogel ficherothe file Q3FileDialog&el enlace simblico the symlink Q3FileDialogJNo fue posible crear el directorio %1Could not create directory %1 Q3LocalFs.No fue posible abrir %1Could not open %1 Q3LocalFsHNo fue posible leer el directorio %1Could not read directory %1 Q3LocalFsdNo fue posible eliminar el fichero o directorio %1%Could not remove file or directory %1 Q3LocalFsPNo fue posible cambiar el nombre %1 a %2Could not rename %1 to %2 Q3LocalFs4No fue posible escribir %1Could not write %1 Q3LocalFsPersonalizar... Customize... Q3MainWindowAlinearLine up Q3MainWindowBOperacin detenida por el usuarioOperation stopped by the userQ3NetworkProtocolCancelarCancelQ3ProgressDialogAplicarApply Q3TabDialogCancelarCancel Q3TabDialog&Valores por omisinDefaults Q3TabDialog AyudaHelp Q3TabDialogAceptarOK Q3TabDialog&Copiar&Copy Q3TextEdit &Pegar&Paste Q3TextEdit&Rehacer&Redo Q3TextEdit&Deshacer&Undo Q3TextEditLimpiarClear Q3TextEditCor&tarCu&t Q3TextEdit Seleccionar todo Select All Q3TextEdit CerrarClose Q3TitleBar"Cierra la ventanaCloses the window Q3TitleBarTContiene rdenes para manipular la ventana*Contains commands to manipulate the window Q3TitleBarMuestra el nombre de la ventana y contiene controles para manipularlaFDisplays the name of the window and contains controls to manipulate it Q3TitleBarNMuestra la ventana en pantalla completaMakes the window full screen Q3TitleBarMaximizarMaximize Q3TitleBarMinimizarMinimize Q3TitleBar"Aparta la ventanaMoves the window out of the way Q3TitleBarfDevuelve una ventana maximizada a su aspecto normal&Puts a maximized window back to normal Q3TitleBarfDevuelve una ventana minimizada a su aspecto normalPuts a minimized back to normal Q3TitleBarRestaurar abajo Restore down Q3TitleBar Restaurar arriba Restore up Q3TitleBarSistemaSystem Q3TitleBar Ms...More... Q3ToolBar(desconocido) (unknown) Q3UrlOperatorEl protocolo %1 no permite copiar o mover ficheros o directoriosIThe protocol `%1' does not support copying or moving files or directories Q3UrlOperatorjEl protocolo %1 no permite crear nuevos directorios;The protocol `%1' does not support creating new directories Q3UrlOperatorZEl protocolo %1 no permite recibir ficheros0The protocol `%1' does not support getting files Q3UrlOperatorEl protocolo %1 no permite listar los ficheros de un directorio6The protocol `%1' does not support listing directories Q3UrlOperatorXEl protocolo %1 no permite enviar ficheros0The protocol `%1' does not support putting files Q3UrlOperatorxEl protocolo %1 no permite eliminar ficheros o directorios@The protocol `%1' does not support removing files or directories Q3UrlOperatorEl protocolo %1 no permite cambiar de nombre ficheros o directorios@The protocol `%1' does not support renaming files or directories Q3UrlOperatorJEl protocolo %1 no est contemplado"The protocol `%1' is not supported Q3UrlOperator&Cancelar&CancelQ3Wizard&Terminar&FinishQ3Wizard &Ayuda&HelpQ3WizardSiguie&nte >&Next >Q3Wizard< &Anterior< &BackQ3Wizard$Conexin rechazadaConnection refusedQAbstractSocket"Conexin expiradaConnection timed outQAbstractSocket(Equipo no encontradoHost not foundQAbstractSocket Red inalcanzableNetwork unreachableQAbstractSocket6El socket no est conectadoSocket is not connectedQAbstractSocket2Operacin socket expiradaSocket operation timed outQAbstractSocket"&Seleccionar todo &Select AllQAbstractSpinBox&Aumentar&Step upQAbstractSpinBoxRe&ducir Step &downQAbstractSpinBoxActivarActivate QApplicationPActiva la ventana principal del programa#Activates the program's main window QApplicationlEl ejecutable %1 requiere Qt %2 (se encontr Qt %3).,Executable '%1' requires Qt %2, found Qt %3. QApplicationBError: biblioteca Qt incompatibleIncompatible Qt Library Error QApplicationLTRQT_LAYOUT_DIRECTION QApplication&Cancelar&Cancel QAxSelect&Objeto COM: COM &Object: QAxSelectAceptarOK QAxSelect<Seleccionar un control ActiveXSelect ActiveX Control QAxSelect MarcarCheck QCheckBoxConmutarToggle QCheckBoxDesmarcarUncheck QCheckBoxH&Aadir a los colores personalizados&Add to Custom Colors QColorDialog Colores &bsicos &Basic colors QColorDialog.&Colores personalizados&Custom colors QColorDialog&Verde:&Green: QColorDialog &Rojo:&Red: QColorDialog&Saturacin:&Sat: QColorDialog&Valor:&Val: QColorDialogCanal a&lfa:A&lpha channel: QColorDialog Az&ul:Bl&ue: QColorDialog &Tono:Hu&e: QColorDialog CerrarClose QComboBox FalsoFalse QComboBox AbrirOpen QComboBoxVerdaderoTrue QComboBox@Incapaz de enviar la transaccinUnable to commit transaction QDB2DriverBImposible establecer una conexinUnable to connect QDB2Driver@Incapaz de anular la transaccinUnable to rollback transaction QDB2DriverLIncapaz de activar el envo automticoUnable to set autocommit QDB2Driver>No es posible ligar la variableUnable to bind variable QDB2ResultBImposible ejecutar la instruccinUnable to execute statement QDB2Result<Imposible recuperar el primeroUnable to fetch first QDB2Result@Imposible recuperar el siguienteUnable to fetch next QDB2Result@Imposible obtener el registro %1Unable to fetch record %1 QDB2ResultBImposible preparar la instruccinUnable to prepare statement QDB2ResultAMAM QDateTimeEditPMPM QDateTimeEditamam QDateTimeEditpmpm QDateTimeEdit QDialQDialQDial$Asa del deslizador SliderHandleQDialVelocmetro SpeedoMeterQDialTerminarDoneQDialogQu es esto? What's This?QDialog&Cancelar&CancelQDialogButtonBox&Cerrar&CloseQDialogButtonBox&No&NoQDialogButtonBox&Aceptar&OKQDialogButtonBox&Guardar&SaveQDialogButtonBox&S&YesQDialogButtonBoxInterrumpirAbortQDialogButtonBoxAplicarApplyQDialogButtonBoxCancelarCancelQDialogButtonBox CerrarCloseQDialogButtonBox$Cerrar sin guardarClose without SavingQDialogButtonBoxDescartarDiscardQDialogButtonBoxNo guardar Don't SaveQDialogButtonBox AyudaHelpQDialogButtonBoxIgnorarIgnoreQDialogButtonBoxN&o a todo N&o to AllQDialogButtonBoxAceptarOKQDialogButtonBox AbrirOpenQDialogButtonBoxReinicializarResetQDialogButtonBoxJRestaurar los valores predeterminadosRestore DefaultsQDialogButtonBoxReintentarRetryQDialogButtonBoxGuardarSaveQDialogButtonBoxGuardar todoSave AllQDialogButtonBoxS a &todo Yes to &AllQDialogButtonBox&ltima modificacin Date Modified QDirModel ClaseKind QDirModel NombreName QDirModel TamaoSize QDirModelTipoType QDirModel CerrarClose QDockWidgetAncladaDock QDockWidgetFlotanteFloat QDockWidget MenosLessQDoubleSpinBoxMsMoreQDoubleSpinBox&Aceptar&OK QErrorMessage<Mo&strar este mensaje de nuevo&Show this message again QErrorMessage,Mensaje de depuracin:Debug Message: QErrorMessageError fatal: Fatal Error: QErrorMessage Aviso:Warning: QErrorMessage%1 Directorio no encontrado. Verique que el nombre del directorio es correcto.K%1 Directory not found. Please verify the correct directory name was given. QFileDialog%1 Fichero no encontrado. Verifique que el nombre del fichero es correcto.A%1 File not found. Please verify the correct file name was given. QFileDialogZEl fichero %1 ya existe. Desea reemplazarlo?-%1 already exists. Do you want to replace it? QFileDialog&Seleccionar&Choose QFileDialog&Borrar&Delete QFileDialog&Nueva carpeta &New Folder QFileDialog &Abrir&Open QFileDialog$Cambia&r de nombre&Rename QFileDialog&Guardar&Save QFileDialog%1 est protegido contra escritura. Desea borrarlo de todas formas?9'%1' is write protected. Do you want to delete it anyway? QFileDialog,Todos los ficheros (*) All Files (*) QFileDialog0Todos los ficheros (*.*)All Files (*.*) QFileDialog<Seguro que desea borrar %1?!Are sure you want to delete '%1'? QFileDialog(Anterior (histrico)Back QFileDialogHNo fue posible borrar el directorio.Could not delete directory. QFileDialog.Crear una nueva carpetaCreate New Folder QFileDialogVista detallada Detail View QFileDialogDirectorios Directories QFileDialogDirectorio: Directory: QFileDialog UnidadDrive QFileDialogFicheroFile QFileDialog&&Nombre de fichero: File &name: QFileDialog"Ficheros de tipo:Files of type: QFileDialog.Buscar en el directorioFind Directory QFileDialog*Siguiente (histrico)Forward QFileDialogVista de lista List View QFileDialogVer en:Look in: QFileDialogMi equipo My Computer QFileDialogNueva carpeta New Folder QFileDialog AbrirOpen QFileDialog&Directorio superiorParent Directory QFileDialogEliminarRemove QFileDialogGuardar comoSave As QFileDialogMostrar Show  QFileDialog:Mostrar los fic&heros ocultosShow &hidden files QFileDialogDesconocidoUnknown QFileDialog %1 GiB%1 GBQFileSystemModel %1 KiB%1 KBQFileSystemModel %1 MiB%1 MBQFileSystemModel %1 TiB%1 TBQFileSystemModel%1 bytes%1 bytesQFileSystemModel<b>No se puede utilizar el nombre %1.</b><p>Intente usar otro nombre con menos caracteres o sin signos de puntuacin.oThe name "%1" can not be used.

Try using another name, with fewer characters or no punctuations marks.QFileSystemModel EquipoComputerQFileSystemModel&ltima modificacin Date ModifiedQFileSystemModel6Nombre de fichero no vlidoInvalid filenameQFileSystemModel ClaseKindQFileSystemModelMi equipo My ComputerQFileSystemModel NombreNameQFileSystemModel TamaoSizeQFileSystemModelTipoTypeQFileSystemModel&Tipo de letra&Font QFontDialog&Tamao&Size QFontDialogS&ubrayado &Underline QFontDialogEfectosEffects QFontDialog2&Estilo del tipo de letra Font st&yle QFontDialogMuestraSample QFontDialog8Seleccionar un tipo de letra Select Font QFontDialog&Tachado Stri&keout QFontDialog*Sistema de escr&ituraWr&iting System QFontDialogDFallo del cambio de directorio: %1Changing directory failed: %1QFtp&Conectado al equipoConnected to hostQFtp,Conectado al equipo %1Connected to host %1QFtpPLa conexin con el equipo ha fallado: %1Connecting to host failed: %1QFtp Conexin cerradaConnection closedQFtpRConexin para conexin de datos rechazada&Connection refused for data connectionQFtp>Conexin rechazada al equipo %1Connection refused to host %1QFtp*Conexin a %1 cerradaConnection to %1 closedQFtpRFallo de la creacin de un directorio: %1Creating directory failed: %1QFtpHFallo de la descarga del fichero: %1Downloading file failed: %1QFtp(Equipo %1 encontrado Host %1 foundQFtp.Equipo %1 no encontradoHost %1 not foundQFtp"Equipo encontrado Host foundQFtpPEl listado del directorio ha fallado: %1Listing directory failed: %1QFtp4Identificacin fallida: %1Login failed: %1QFtpNo conectado Not connectedQFtpJEliminacin de directorio fallida: %1Removing directory failed: %1QFtpDEliminacin de fichero fallida: %1Removing file failed: %1QFtp"Error desconocido Unknown errorQFtpFEl envo del fichero ha fallado: %1Uploading file failed: %1QFtp"Error desconocido Unknown error QHostInfo(Equipo no encontradoHost not foundQHostInfoAgent:Direccin de tipo desconocidoUnknown address typeQHostInfoAgent"Error desconocido Unknown errorQHostInfoAgent0Se precisa autenticacinAuthentication requiredQHttp&Conectado al equipoConnected to hostQHttp,Conectado al equipo %1Connected to host %1QHttp Conexin cerradaConnection closedQHttp$Conexin rechazadaConnection refusedQHttp*Conexin a %1 cerradaConnection to %1 closedQHttp,Solicitud HTTP fallidaHTTP request failedQHttp(Equipo %1 encontrado Host %1 foundQHttp.Equipo %1 no encontradoHost %1 not foundQHttp"Equipo encontrado Host foundQHttp0Fragmento HTTP no vlidoInvalid HTTP chunked bodyQHttpHCabecera de respuesta HTTP no vlidaInvalid HTTP response headerQHttpfNo se ha indicado ningn servidor al que conectarseNo server set to connect toQHttp>El proxy requiere autenticacinProxy authentication requiredQHttp,Solicitud interrumpidaRequest abortedQHttpZEl servidor cerr la conexin inesperadamente%Server closed connection unexpectedlyQHttp"Error desconocido Unknown errorQHttp<Longitud del contenido errneaWrong content lengthQHttp0Se precisa autenticacinAuthentication requiredQHttpSocketEngineJNo fue posible iniciar la transaccinCould not start transaction QIBaseDriver>Error al abrir la base de datosError opening database QIBaseDriver@Incapaz de enviar la transaccinUnable to commit transaction QIBaseDriver@Incapaz de anular la transaccinUnable to rollback transaction QIBaseDriverJNo fue posible asignar la instruccinCould not allocate statement QIBaseResultdNo fue posible describir la instruccin de entrada"Could not describe input statement QIBaseResultNNo fue posible describir la instruccinCould not describe statement QIBaseResultXNo fue posible obtener el elemento siguienteCould not fetch next item QIBaseResultBNo fue posible encontrar la tablaCould not find array QIBaseResultXNo fue posible obtener los datos de la tablaCould not get array data QIBaseResulthNo fue posible obtener informacin sobre la consultaCould not get query info QIBaseResultnNo fue posible obtener informacin sobre la instruccinCould not get statement info QIBaseResultLNo fue posible preparar la instruccinCould not prepare statement QIBaseResultJNo fue posible iniciar la transaccinCould not start transaction QIBaseResultHNo fue posible cerrar la instruccinUnable to close statement QIBaseResult@Incapaz de enviar la transaccinUnable to commit transaction QIBaseResult.Imposible crear un BLOBUnable to create BLOB QIBaseResultFNo fue posible ejecutar la consultaUnable to execute query QIBaseResult.Imposible abrir el BLOBUnable to open BLOB QIBaseResult,Imposible leer el BLOBUnable to read BLOB QIBaseResult4Imposible escribir el BLOBUnable to write BLOB QIBaseResultDNo queda espacio en el dispositivoNo space left on device QIODevicebNo hay ningn fichero o directorio con ese nombreNo such file or directory QIODevice Permiso denegadoPermission denied QIODeviceXDemasiados ficheros abiertos simultneamenteToo many open files QIODevice"Error desconocido Unknown error QIODevice4Mtodo de entrada Mac OS XMac OS X input method QInputContext2Mtodo de entrada WindowsWindows input method QInputContextXIMXIM QInputContext*Mtodo de entrada XIMXIM input method QInputContextzNo fu posible establecer la proyeccin en memoria de %1: %2Could not mmap '%1': %2QLibraryxNo fue posible suprimir la proyeccin en memoria de %1: %2Could not unmap '%1': %2QLibrary|Los datos de verificacin del complemento no coinciden en %1)Plugin verification data mismatch in '%1'QLibrarydEl fichero %1 no es un complemento de Qt vlido.'The file '%1' is not a valid Qt plugin.QLibraryEl complemento %1 usa una biblioteca Qt incompatible. (%2.%3.%4) [%5]=The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5]QLibraryEl complemento %1 usa una biblioteca Qt incompatible. (No se pueden mezclar las bibliotecas debug y release.)WThe plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.)QLibraryEl complemento %1 usa una biblioteca Qt incompatible. Se esperaba la clave %2, pero se ha recibido %3OThe plugin '%1' uses incompatible Qt library. Expected build key "%2", got "%3"QLibraryZNo se ha encontrado la biblioteca compartida.!The shared library was not found.QLibrary"Error desconocido Unknown errorQLibrary&Copiar&Copy QLineEdit &Pegar&Paste QLineEdit&Rehacer&Redo QLineEdit&Deshacer&Undo QLineEditCor&tarCu&t QLineEdit BorrarDelete QLineEdit Seleccionar todo Select All QLineEditHNo es posible iniciar la transaccinUnable to begin transaction QMYSQLDriverFNo es posible enviar la transaccinUnable to commit transaction QMYSQLDriverJNo es posible establecer una conexinUnable to connect QMYSQLDriverDImposible abrir la base de datos 'Unable to open database ' QMYSQLDriverFNo es posible anular la transaccinUnable to rollback transaction QMYSQLDriverRNo es posible ligar los valores de salidaUnable to bind outvalues QMYSQLResult8No es posible ligar el valorUnable to bind value QMYSQLResultDNo es posible ejecutar la consultaUnable to execute query QMYSQLResultJNo es posible ejecutar la instruccinUnable to execute statement QMYSQLResult>No es posible obtener los datosUnable to fetch data QMYSQLResultJNo es posible preparar la instruccinUnable to prepare statement QMYSQLResultTNo es posible reinicializar la instruccinUnable to reset statement QMYSQLResultHNo es posible almacenar el resultadoUnable to store result QMYSQLResultpNo es posible almacenar los resultados de la instruccin!Unable to store statement results QMYSQLResult%1 - [%2] %1 - [%2] QMdiSubWindow&Cerrar&Close QMdiSubWindow &Mover&Move QMdiSubWindow&Restaurar&Restore QMdiSubWindowRedimen&sionar&Size QMdiSubWindow CerrarClose QMdiSubWindow AyudaHelp QMdiSubWindowMa&ximizar Ma&ximize QMdiSubWindowMaximizarMaximize QMdiSubWindowMenMenu QMdiSubWindowMi&nimizar Mi&nimize QMdiSubWindowMinimizarMinimize QMdiSubWindowRestaurar abajo Restore Down QMdiSubWindow6Permanecer en &primer plano Stay on &Top QMdiSubWindow CerrarCloseQMenuEjecutarExecuteQMenu AbrirOpenQMenuAcerca de QtAbout Qt QMessageBox AyudaHelp QMessageBox.Ocultar los detalles...Hide Details... QMessageBoxAceptarOK QMessageBox.Mostrar los detalles...Show Details... QMessageBoxSeleccionar IM Select IMQMultiInputContextTSeleccionador de varios mtodos de entradaMultiple input method switcherQMultiInputContextPluginSeleccionador de varios mtodos de entrada que usa el men contextual de los elementos de textoMMultiple input method switcher that uses the context menu of the text widgetsQMultiInputContextPluginbYa hay otro socket escuchando por el mismo puerto4Another socket is already listening on the same portQNativeSocketEngineIntento de usar un socket IPv6 sobre una plataforma que no contempla IPv6=Attempt to use IPv6 socket on a platform with no IPv6 supportQNativeSocketEngine$Conexin rechazadaConnection refusedQNativeSocketEngine"Conexin expiradaConnection timed outQNativeSocketEnginepEl datagrama era demasiado grande para poder ser enviadoDatagram was too large to sendQNativeSocketEngine$Equipo inaccesibleHost unreachableQNativeSocketEngine<Descriptor de socket no vlidoInvalid socket descriptorQNativeSocketEngineError de red Network errorQNativeSocketEngine>La operacin de red ha expiradoNetwork operation timed outQNativeSocketEngine Red inalcanzableNetwork unreachableQNativeSocketEngine8Operacin sobre un no-socketOperation on non-socketQNativeSocketEngine,Insuficientes recursosOut of resourcesQNativeSocketEngine Permiso denegadoPermission deniedQNativeSocketEngine:Tipo de protocolo no admitidoProtocol type not supportedQNativeSocketEngine>La direccin no est disponibleThe address is not availableQNativeSocketEngine6La direccin est protegidaThe address is protectedQNativeSocketEngineHLa direccin enlazada ya est en uso#The bound address is already in useQNativeSocketEngineNEl equipo remoto ha cerrado la conexin%The remote host closed the connectionQNativeSocketEngineVImposible inicializar el socket de difusin%Unable to initialize broadcast socketQNativeSocketEngineZImposible inicializar el socket no bloqueante(Unable to initialize non-blocking socketQNativeSocketEngine8Imposible recibir un mensajeUnable to receive a messageQNativeSocketEngine6Imposible enviar un mensajeUnable to send a messageQNativeSocketEngine$Imposible escribirUnable to writeQNativeSocketEngine"Error desconocido Unknown errorQNativeSocketEngine8Operacin socket no admitidaUnsupported socket operationQNativeSocketEngineHNo es posible iniciar la transaccinUnable to begin transaction QOCIDriver8La inicializacin ha falladoUnable to initialize QOCIDriver4No es posible abrir sesinUnable to logon QOCIDriverHNo es posible asignar la instruccinUnable to alloc statement QOCIResultvNo es posible ligar la columna para una ejecucin por lotes'Unable to bind column for batch execute QOCIResult8No es posible ligar el valorUnable to bind value QOCIResult^No es posible ejecutar la instruccin por lotes!Unable to execute batch statement QOCIResultJNo es posible ejecutar la instruccinUnable to execute statement QOCIResult@No es posible pasar al siguienteUnable to goto next QOCIResultJNo es posible preparar la instruccinUnable to prepare statement QOCIResultFNo es posible enviar la transaccinUnable to commit transaction QODBCDriverJNo es posible establecer una conexinUnable to connect QODBCDriverNo es posible conectarse - El controlador no ofrece todas las funciones necesariasCUnable to connect - Driver doesn't support all needed functionality QODBCDriverZNo es posible inhabilitar el envo automticoUnable to disable autocommit QODBCDriverVNo es posible habilitar el envo automticoUnable to enable autocommit QODBCDriverFNo es posible anular la transaccinUnable to rollback transaction QODBCDriver QODBCResult::reset: No es posible establecer SQL_CURSOR_STATIC como atributo de instruccin. Compruebe la configuracin de su controlador ODBCyQODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration QODBCResult>No es posible ligar la variableUnable to bind variable QODBCResultJNo es posible ejecutar la instruccinUnable to execute statement QODBCResult<Imposible recuperar el primeroUnable to fetch first QODBCResultDNo es posible obtener el siguienteUnable to fetch next QODBCResultJNo es posible preparar la instruccinUnable to prepare statement QODBCResult InicioHomeQObject NombreNameQPPDOptionsModel ValorValueQPPDOptionsModelJNo fue posible iniciar la transaccinCould not begin transaction QPSQLDriverHNo fue posible enviar la transaccinCould not commit transaction QPSQLDriverHNo fue posible anular la transaccinCould not rollback transaction QPSQLDriverBNo es posible establecer conexinUnable to connect QPSQLDriver>No es posible crear la consultaUnable to create query QPSQLResultApaisado LandscapeQPageSetupWidget"Tamao de pgina: Page size:QPageSetupWidget"Fuente del papel: Paper source:QPageSetupWidgetVerticalPortraitQPageSetupWidget<El complemento no fue cargado.The plugin was not loaded. QPluginLoader"Error desconocido Unknown error QPluginLoaderJ%1 ya existe. Desea sobrescribirlo?/%1 already exists. Do you want to overwrite it? QPrintDialogv%1 es un directorio. Elija un nombre de fichero diferente.7%1 is a directory. Please choose a different file name. QPrintDialog><qt>Desea sobrescribirlo?</qt>%Do you want to overwrite it? QPrintDialog$A0 (841 x 1189 mm)A0 (841 x 1189 mm) QPrintDialog"A1 (594 x 841 mm)A1 (594 x 841 mm) QPrintDialog"A2 (420 x 594 mm)A2 (420 x 594 mm) QPrintDialog"A3 (297 x 420 mm)A3 (297 x 420 mm) QPrintDialogNA4 (210 x 297 mm, 8,26 x 11,7 pulgadas)%A4 (210 x 297 mm, 8.26 x 11.7 inches) QPrintDialog"A5 (148 x 210 mm)A5 (148 x 210 mm) QPrintDialog"A6 (105 x 148 mm)A6 (105 x 148 mm) QPrintDialog A7 (74 x 105 mm)A7 (74 x 105 mm) QPrintDialogA8 (52 x 74 mm)A8 (52 x 74 mm) QPrintDialogA9 (37 x 52 mm)A9 (37 x 52 mm) QPrintDialogAlias: %1 Aliases: %1 QPrintDialog&B0 (1000 x 1414 mm)B0 (1000 x 1414 mm) QPrintDialog$B1 (707 x 1000 mm)B1 (707 x 1000 mm) QPrintDialog B10 (31 x 44 mm)B10 (31 x 44 mm) QPrintDialog"B2 (500 x 707 mm)B2 (500 x 707 mm) QPrintDialog"B3 (353 x 500 mm)B3 (353 x 500 mm) QPrintDialog"B4 (250 x 353 mm)B4 (250 x 353 mm) QPrintDialogNB5 (176 x 250 mm, 6,93 x 9,84 pulgadas)%B5 (176 x 250 mm, 6.93 x 9.84 inches) QPrintDialog"B6 (125 x 176 mm)B6 (125 x 176 mm) QPrintDialog B7 (88 x 125 mm)B7 (88 x 125 mm) QPrintDialogB8 (62 x 88 mm)B8 (62 x 88 mm) QPrintDialogB9 (44 x 62 mm)B9 (44 x 62 mm) QPrintDialog$C5E (163 x 229 mm)C5E (163 x 229 mm) QPrintDialog$DLE (110 x 220 mm)DLE (110 x 220 mm) QPrintDialogVEjecutivo (7,5 x 10 pulgadas, 191 x 254 mm))Executive (7.5 x 10 inches, 191 x 254 mm) QPrintDialogNo se puede escribir en el fichero %1. Elija un nombre de fichero diferente.=File %1 is not writable. Please choose a different file name. QPrintDialog"El fichero existe File exists QPrintDialog(Folio (210 x 330 mm)Folio (210 x 330 mm) QPrintDialog*Ledger (432 x 279 mm)Ledger (432 x 279 mm) QPrintDialogNLegal (8,5 x 14 pulgadas, 216 x 356 mm)%Legal (8.5 x 14 inches, 216 x 356 mm) QPrintDialogNCarta (8,5 x 11 pulgadas, 216 x 279 mm)&Letter (8.5 x 11 inches, 216 x 279 mm) QPrintDialogAceptarOK QPrintDialogImprimirPrint QPrintDialog*Imprimir a fichero...Print To File ... QPrintDialogImprimir todo Print all QPrintDialog*Imprimir el intervalo Print range QPrintDialog*Imprimir la seleccinPrint selection QPrintDialog.Tabloide (279 x 432 mm)Tabloid (279 x 432 mm) QPrintDialogDSobre US Common #10 (105 x 241 mm)%US Common #10 Envelope (105 x 241 mm) QPrintDialog(conectado localmentelocally connected QPrintDialogdesconocidounknown QPrintDialog CerrarCloseQPrintPreviewDialogApaisado LandscapeQPrintPreviewDialogVerticalPortraitQPrintPreviewDialogRecopilarCollateQPrintSettingsOutput CopiasCopiesQPrintSettingsOutputOpcionesOptionsQPrintSettingsOutputPginas Pages fromQPrintSettingsOutputImprimir todo Print allQPrintSettingsOutput*Imprimir el intervalo Print rangeQPrintSettingsOutputSeleccin SelectionQPrintSettingsOutputatoQPrintSettingsOutputImpresoraPrinter QPrintWidgetCancelarCancelQProgressDialog AbrirOpen QPushButton MarcarCheck QRadioButtonVsintaxis no vlida para clase de caracteresbad char class syntaxQRegExpBsintaxis no vlida para lookaheadbad lookahead syntaxQRegExpDsintaxis no vlida para repeticinbad repetition syntaxQRegExpXse ha usado una caracterstica no habilitadadisabled feature usedQRegExp*valor octal no vlidoinvalid octal valueQRegExp8se alcanz el lmite internomet internal limitQRegExp<falta el delimitador izquierdomissing left delimQRegExp>no se ha producido ningn errorno error occurredQRegExpfin inesperadounexpected endQRegExp>Error al abrir la base de datosError to open databaseQSQLite2DriverHNo es posible iniciar la transaccinUnable to begin transactionQSQLite2DriverFNo es posible enviar la transaccinUnable to commit transactionQSQLite2DriverFNo es posible anular la transaccinUnable to rollback TransactionQSQLite2DriverJNo es posible ejecutar la instruccinUnable to execute statementQSQLite2ResultHNo es posible obtener los resultadosUnable to fetch resultsQSQLite2Result@Error al cerrar la base de datosError closing database QSQLiteDriver>Error al abrir la base de datosError opening database QSQLiteDriverHNo es posible iniciar la transaccinUnable to begin transaction QSQLiteDriverFNo es posible enviar la transaccinUnable to commit transaction QSQLiteDriver>Nmero de parmetros incorrectoParameter count mismatch QSQLiteResultDNo es posible ligar los parmetrosUnable to bind parameters QSQLiteResultJNo es posible ejecutar la instruccinUnable to execute statement QSQLiteResult:No es posible obtener la filaUnable to fetch row QSQLiteResultTNo es posible reinicializar la instruccinUnable to reset statement QSQLiteResultParte inferiorBottom QScrollBarBorde izquierdo Left edge QScrollBar"Alinear por abajo Line down QScrollBarAlinearLine up QScrollBar,Una pgina hacia abajo Page down QScrollBar2Una pgina a la izquierda Page left QScrollBar.Una pgina a la derecha Page right QScrollBar.Una pgina hacia arribaPage up QScrollBarPosicinPosition QScrollBarBorde derecho Right edge QScrollBar*Desplazar hacia abajo Scroll down QScrollBar(Desplazar hasta aqu Scroll here QScrollBar8Desplazar hacia la izquierda Scroll left QScrollBar4Desplazar hacia la derecha Scroll right QScrollBar,Desplazar hacia arriba Scroll up QScrollBarParte superiorTop QScrollBar++ QShortcutAltAlt QShortcut(Anterior (histrico)Back QShortcut Borrar Backspace QShortcut*Tabulador hacia atrsBacktab QShortcut(Potenciar los graves Bass Boost QShortcut Bajar los graves Bass Down QShortcut Subir los gravesBass Up QShortcut LlamarCall QShortcut*Bloqueo de maysculas Caps Lock QShortcutBloq MaysCapsLock QShortcutContexto1Context1 QShortcutContexto2Context2 QShortcutContexto3Context3 QShortcutContexto4Context4 QShortcutCtrlCtrl QShortcutSuprDel QShortcut BorrarDelete QShortcut AbajoDown QShortcutFinEnd QShortcut IntroEnter QShortcutEscEsc QShortcut EscapeEscape QShortcutF%1F%1 QShortcutFavoritos Favorites QShortcutVoltearFlip QShortcut*Siguiente (histrico)Forward QShortcutDescolgarHangup QShortcut AyudaHelp QShortcut InicioHome QShortcut Pgina de inicio Home Page QShortcutInsIns QShortcutInsertarInsert QShortcutLanzar (0) Launch (0) QShortcutLanzar (1) Launch (1) QShortcutLanzar (2) Launch (2) QShortcutLanzar (3) Launch (3) QShortcutLanzar (4) Launch (4) QShortcutLanzar (5) Launch (5) QShortcutLanzar (6) Launch (6) QShortcutLanzar (7) Launch (7) QShortcutLanzar (8) Launch (8) QShortcutLanzar (9) Launch (9) QShortcutLanzar (A) Launch (A) QShortcutLanzar (B) Launch (B) QShortcutLanzar (C) Launch (C) QShortcutLanzar (D) Launch (D) QShortcutLanzar (E) Launch (E) QShortcutLanzar (F) Launch (F) QShortcutLanzar correo Launch Mail QShortcutLanzar medio Launch Media QShortcutIzquierdaLeft QShortcutSiguiente medio Media Next QShortcut&Reproducir el medio Media Play QShortcutMedio anteriorMedia Previous QShortcutGrabar medio Media Record QShortcut Detener el medio Media Stop QShortcutMenMenu QShortcutMetaMeta QShortcutNoNo QShortcutBloq numNum Lock QShortcutBloq NumNumLock QShortcut Bloqueo numrico Number Lock QShortcutAbrir URLOpen URL QShortcutAvanzar pgina Page Down QShortcut"Retroceder pginaPage Up QShortcut PausaPause QShortcut Av PgPgDown QShortcut Re PgPgUp QShortcutImpr PantPrint QShortcut"Imprimir pantalla Print Screen QShortcutActualizarRefresh QShortcutRetornoReturn QShortcutDerechaRight QShortcut4Bloqueo del desplazamiento Scroll Lock QShortcutBloq Despl ScrollLock QShortcutBsquedaSearch QShortcutSeleccionarSelect QShortcutMayShift QShortcutEspacioSpace QShortcut ReposoStandby QShortcutDetenerStop QShortcut PetSisSysReq QShortcut(Peticin del sistemaSystem Request QShortcutTabuladorTab QShortcut Bajar los agudos Treble Down QShortcut Subir los agudos Treble Up QShortcut ArribaUp QShortcut Bajar el volumen Volume Down QShortcutSilenciar Volume Mute QShortcut Subir el volumen Volume Up QShortcutSYes QShortcut,Una pgina hacia abajo Page downQSlider2Una pgina a la izquierda Page leftQSlider.Una pgina a la derecha Page rightQSlider.Una pgina hacia arribaPage upQSliderPosicinPositionQSlider>La operacin de red ha expiradoNetwork operation timed outQSocks5SocketEngine MenosLessQSpinBoxMsMoreQSpinBoxCancelarCancelQSql:Cancelar sus modificaciones?Cancel your edits?QSqlConfirmarConfirmQSql BorrarDeleteQSql,Borrar este registro?Delete this record?QSqlInsertarInsertQSqlNoNoQSql8Guardar las modificaciones? Save edits?QSqlActualizarUpdateQSqlSYesQSqljNo se puede proporcionar un certificado sin clave, %1,Cannot provide a certificate with no key, %1 QSslSocketFError al crear el contexto SSL (%1)Error creating SSL context (%1) QSslSocket@Error al crear la sesin SSL, %1Error creating SSL session, %1 QSslSocket@Error al crear la sesin SSL: %1Error creating SSL session: %1 QSslSocket>Error durante el saludo SSL: %1Error during SSL handshake: %1 QSslSocketPError al cargar el certificado local, %1#Error loading local certificate, %1 QSslSocketHError al cargar la clave privada, %1Error loading private key, %1 QSslSocket"Error al leer: %1Error while reading: %1 QSslSocketLLista de cifras vaca o no vlida (%1)!Invalid or empty cipher list (%1) QSslSocketHNo es posible escribir los datos: %1Unable to write data: %1 QSslSocket>No es posible abrir la conexinUnable to open connection QTDSDriverNNo es posible utilizar la base de datosUnable to use database QTDSDriver8Desplazar hacia la izquierda Scroll LeftQTabBar4Desplazar hacia la derecha Scroll RightQTabBar&Copiar&Copy QTextControl &Pegar&Paste QTextControl&Rehacer&Redo QTextControl&Deshacer&Undo QTextControl>Copiar la ubicacin del en&laceCopy &Link Location QTextControlCor&tarCu&t QTextControl BorrarDelete QTextControl Seleccionar todo Select All QTextControl AbrirOpen QToolButton PulsarPress QToolButton>La plataforma no contempla IPv6#This platform does not support IPv6 QUdpSocketRehacerRedo QUndoGroupDeshacerUndo QUndoGroup<vaco> QUndoModelRehacerRedo QUndoStackDeshacerUndo QUndoStackHInsertar carcter de control Unicode Insert Unicode control characterQUnicodeControlCharacterMenuHLRE Start of left-to-right embedding$LRE Start of left-to-right embeddingQUnicodeControlCharacterMenu,LRM Left-to-right markLRM Left-to-right markQUnicodeControlCharacterMenuFLRO Start of left-to-right override#LRO Start of left-to-right overrideQUnicodeControlCharacterMenu<PDF Pop directional formattingPDF Pop directional formattingQUnicodeControlCharacterMenuHRLE Start of right-to-left embedding$RLE Start of right-to-left embeddingQUnicodeControlCharacterMenu,RLM Right-to-left markRLM Right-to-left markQUnicodeControlCharacterMenuFRLO Start of right-to-left override#RLO Start of right-to-left overrideQUnicodeControlCharacterMenu*ZWJ Zero width joinerZWJ Zero width joinerQUnicodeControlCharacterMenu4ZWNJ Zero width non-joinerZWNJ Zero width non-joinerQUnicodeControlCharacterMenu*ZWSP Zero width spaceZWSP Zero width spaceQUnicodeControlCharacterMenuParte inferiorBottomQWebPagePrecedenteGo BackQWebPageIgnorarIgnoreQWebPageIgnorar Ignore Grammar context menu itemIgnoreQWebPageBorde izquierdo Left edgeQWebPage,Una pgina hacia abajo Page downQWebPage2Una pgina a la izquierda Page leftQWebPage.Una pgina a la derecha Page rightQWebPage.Una pgina hacia arribaPage upQWebPageReinicializarResetQWebPageBorde derecho Right edgeQWebPage*Desplazar hacia abajo Scroll downQWebPage(Desplazar hasta aqu Scroll hereQWebPage8Desplazar hacia la izquierda Scroll leftQWebPage4Desplazar hacia la derecha Scroll rightQWebPage,Desplazar hacia arriba Scroll upQWebPageDetenerStopQWebPageParte superiorTopQWebPageDesconocidoUnknownQWebPageQu es esto? What's This?QWhatsThisAction**QWidget&Terminar&FinishQWizard &Ayuda&HelpQWizardSiguie&nte >&Next >QWizard< &Anterior< &BackQWizardCancelarCancelQWizard EnviarCommitQWizardSiguienteContinueQWizardTerminarDoneQWizardPrecedenteGo BackQWizard AyudaHelpQWizard%1 - [%2] %1 - [%2] QWorkspace&Cerrar&Close QWorkspace &Mover&Move QWorkspace&Restaurar&Restore QWorkspace&Tamao&Size QWorkspaceQ&uitar sombra&Unshade QWorkspace CerrarClose QWorkspaceMa&ximizar Ma&ximize QWorkspaceMi&nimizar Mi&nimize QWorkspaceMinimizarMinimize QWorkspaceRestaurar abajo Restore Down QWorkspaceSombre&arSh&ade QWorkspace6Permanecer en &primer plano Stay on &Top QWorkspacese esperaba una declaracin de codificacin o declaracin autnoma al leer la declaracin XMLYencoding declaration or standalone declaration expected while reading the XML declarationQXmlnerror en la declaracin de texto de una entidad externa3error in the text declaration of an external entityQXmlzse ha producido un error durante el anlisis de un comentario$error occurred while parsing commentQXmltse ha producido un error durante el anlisis del contenido$error occurred while parsing contentQXmlse ha producido un error durante el anlisis de la definicin de tipo de documento5error occurred while parsing document type definitionQXmlvse ha producido un error durante el anlisis de un elemento$error occurred while parsing elementQXml|se ha producido un error durante el anlisis de una referencia&error occurred while parsing referenceQXml4error debido al consumidorerror triggered by consumerQXmlno se permiten referencias a entidades externas generales ya analizadas en la DTD;external parsed general entity reference not allowed in DTDQXmlno se permiten referencias a entidades externas generales ya analizadas en el valor de un atributoGexternal parsed general entity reference not allowed in attribute valueQXmlno se permiten referencias a entidades internas generales en la DTD4internal general entity reference not allowed in DTDQXml\nombre de instruccin de tratamiento no vlido'invalid name for processing instructionQXml*se esperaba una letraletter is expectedQXmlTms de una definicin de tipo de documento&more than one document type definitionQXml>no se ha producido ningn errorno error occurredQXml(entidades recursivasrecursive entitiesQXmlse esperaba una declaracin independiente al leer la declaracin XMLAstandalone declaration expected while reading the XML declarationQXml.etiqueta desequilibrada tag mismatchQXml&carcter inesperadounexpected characterQXml2fin de fichero inesperadounexpected end of fileQXmltreferencia a entidad no analizada en un contexto no vlido*unparsed entity reference in wrong contextQXmlbse esperaba la versin al leer la declaracin XML2version expected while reading the XML declarationQXml^valor errneo para la declaracin independiente&wrong value for standalone declarationQXmlP%1 no es un identificador PUBLIC vlido.#%1 is an invalid PUBLIC identifier. QXmlStreamT%1 es un nombre de codificacin no vlido.%1 is an invalid encoding name. QXmlStreamt%1 es un nombre de instruccin de procesamiento no vlido.-%1 is an invalid processing instruction name. QXmlStream., pero se ha recibido ' , but got ' QXmlStream(Atributo redefinido.Attribute redefined. QXmlStream>No se admite la codificacin %1Encoding %1 is unsupported QXmlStream`Encontrado contenido codificado incorrectamente.(Encountered incorrectly encoded content. QXmlStream4Entidad %1 no declarada.Entity '%1' not declared. QXmlStreamSe esperaba  Expected  QXmlStream>Se esperaban datos de carcter.Expected character data. QXmlStreamNContenido extra al final del documento.!Extra content at end of document. QXmlStreamRDeclaracin de espacio de nombres ilegal.Illegal namespace declaration. QXmlStream.Carcter XML no vlido.Invalid XML character. QXmlStream*Nombre XML no vlido.Invalid XML name. QXmlStream@Cadena de versin XML no vlida.Invalid XML version string. QXmlStreamRAtributo no vlido en la declaracin XML.%Invalid attribute in XML declaration. QXmlStreamBReferencia un carcter no vlido.Invalid character reference. QXmlStream(Documento no vlido.Invalid document. QXmlStream<Valor de la entidad no vlido.Invalid entity value. QXmlStreambNombre de instruccin de procesamiento no vlido.$Invalid processing instruction name. QXmlStream\NDATA en una declaracin de entidad parmetro.&NDATA in parameter entity declaration. QXmlStream^Prefijo de espacio de nombres %1 no declarado"Namespace prefix '%1' not declared QXmlStream`Las etiquetas de apertura y cierre no coinciden. Opening and ending tag mismatch. QXmlStream<Final prematuro del documento.Premature end of document. QXmlStream8Detectada entidad recursiva.Recursive entity detected. QXmlStream~Referencia a una entidad externa %1 en el valor del atributo.5Reference to external entity '%1' in attribute value. QXmlStreamVReferencia a una entidad no analizada %1."Reference to unparsed entity '%1'. QXmlStreamZSecuencia ]]> no permitida en el contenido.&Sequence ']]>' not allowed in content. QXmlStreamJStandalone slo acepta s o no."Standalone accepts only yes or no. QXmlStream>Se esperaba etiqueta de inicio.Start tag expected. QXmlStreamEl pseudoatributo standalone debe aparece despus de la codificacin.?The standalone pseudo attribute must appear after the encoding. QXmlStream No se esperaba ' Unexpected ' QXmlStreamCarcter %1 inesperado en un literal de identificacin pblico./Unexpected character '%1' in public id literal. QXmlStream0Versin XML no admitida.Unsupported XML version. QXmlStreamlLa declaracin XML no est al principio del documento.)XML declaration not at start of document. QXmlStreamnetemul-1.0/translation/netemul_pt_BR.qm0000644000175000017500000007221111303443115017531 0ustar frostfrost\wJCmGkt:ZQ#:k=bfDdz1bz1`ȩ*V&գ}*D=wJ^^Q(>9>}(:zO4fazbkQ30kQ^I)I+I+I,I/I1I@IBDIJIP(IfBOJuO,{,7,$,0L,@H,D0,a,cy%BΥCsʘ&ʘRʘb:ր,'%Og8&u8E3<G?KKF Y qvd`HU ȕGrSN l U \h7: Fۘ/a19֥wa>;j[GbSGb(GbP`[[e _i@=r 8g; zTjLV֣֣)֣4֣J?֣_@7ŵ N"4t,l4t5[i(q0Fh'^h4h` i?m-EY|qo+":p-a4T.T61!WT.]na?]?bN@R O"7USxZgA|YBDȼ<^2L0&(030_!0a0d ^3 e ^37V ^3A laF k h3 8+ e?F N0P RL UU9 b\Y gm8hg uN6 b< E{ sB sAB sUu Od* ϘX )? I +bp 0f DY `^ - F s; <Q ˺Zj 4 j;j;j;X`%`aqhp WQĿApS'>6:1KgixL"|Y 0R7 iiSobre NetEmul About NetEmul MainWindowSobre o QTAbout Qt MainWindow&Sobre o dispositivo About device MainWindow.Adicionar um computador Add computer MainWindow Adicionar um hubAdd hub MainWindow*Adicionar um roteador Add router MainWindow&Adicionar um switch Add switch MainWindow&Adicionar um unibus Add unibus MainWindowTabela arp Arp table MainWindowCaboCable MainWindow FecharClose MainWindow(Fechar arquivo atualClose current file MainWindowComputadorComputer MainWindowControlesControls MainWindow"Criar uma conexoCreate connection MainWindow&Criar uma nova redeCreate new network MainWindowCtrl+Alt+P Ctrl+Alt+P MainWindowCtrl+Alt+S Ctrl+Alt+S MainWindow Ctrl+DCtrl+D MainWindowCtrl+F1Ctrl+F1 MainWindow Ctrl+ICtrl+I MainWindowCtrl+L MainWindow Ctrl+PCtrl+P MainWindowCtrl+Shift+A Ctrl+Shift+A MainWindow Ctrl+TCtrl+T MainWindow Ctrl+XCtrl+X MainWindowExcluirDelete MainWindow Excluindo objetoDeleting object MainWindowDispositivosDevices MainWindow EditarEdit MainWindow,Editar placas de redes Edit netcards MainWindow Executar scriptsExecute scripts MainWindowSairExit MainWindowArquivoFile MainWindow,Arquivo foi modificadoFile was modified MainWindowrArquivo foi modificado, voc deseja salvar as alteraes?/File was modified, do you want to save changes? MainWindowLInformaes completas sobre o programaFull help system program MainWindow AjudaHelp MainWindowHubHub MainWindow:Infomao sobre o dispositivoInformation about device MainWindow6Inserir comentrio de textoInsert text comment MainWindow MoverMove MainWindowMover objetos Move objects MainWindow Ajuda NetEmul Help MainWindowAdaptadoresNetcards MainWindowNovaNew MainWindowNotaNote MainWindow ObjetoObject MainWindow AbrirOpen MainWindow.Abrir arquivo existenteOpen existing file MainWindowReproduzirPlay MainWindowProgramasPrograms MainWindowFProgramas instalados no dispositivoPrograms installed on device MainWindowPropriedades Properties MainWindowRoteadorRouter MainWindow6Executar scripts existentesRun existing scripts MainWindow SalvarSave MainWindowSalvar como ... Save as... MainWindow.Salvar arquivo como ...Save file as ... MainWindowSalvar rede Save network MainWindow(Salvar rede como ...Save network as... MainWindowScriptsScripts MainWindow EnviarSend MainWindowEnviar dados Send data MainWindowServioService MainWindowConfiguraesSettings MainWindowTMostrar dispositivo do arquivo de registroShow device log file MainWindowMostrar grade Show grid MainWindow Mostrar registroShow log MainWindow(Mostrar propriedadesShow properties MainWindow@Mostrar estatsticas do cenrio Show scene statistics  MainWindow"Iniciar simulaoStart simulation MainWindowEstatsticas  Statistics  MainWindow PararStop MainWindowParar simulaoStop simulation MainWindow SwitchSwitch MainWindowGerar unibusUnibus MainWindowVerView MainWindowAdicionar %1Add %1QObjectAdicionar cabo Add cableQObjectAdicionar notaAdd noteQObjectConectado ConnectedQObjectMensagem DHCP DHCP messageQObjectExcluirDeleteQObjectDinmicoDinamicQObjectErroErrorQObjectLEthernet, transmissor: %1, receptor %2!Ethernet, sender: %1 receiver: %2QObject LAN%1LAN%1QObject MoverMoveQObjectSemNoneQObjectRIPRIPQObject*Frames recebidos: %1 Received frames: %1 QObject,Pacotes recebidos: %1 Received packets: %1 QObject(Frames enviados: %1 Sent frames: %1 QObject*Pacotes enviados: %1 Sent packets: %1 QObjectEstticoStaticQObjectVO dispositivo no pde transmitir os dados!The device can't transmit data!QObject\A rede encontrou um endereo IP correspondente'The network found a matching IP addressQObjectPA rede no est funcionando corretamente$The network is not working correctlyQObject.Mensagem UDP do usurioUDP Message userQObject^Porta do transmissor: %1, porta do receptor: %2"sender port: %1, receiver port: %2QObjecth<a href="https://sourceforge.net/projects/netemul">Pgina Pessoal</a><br><br> Semenov Pavel - Adiministrador do projeto. Desenvolvedor.<br> <br> Omilaeva Anastasia - Desenvolvedor.Home Page

Semenov Pavel - Project admin. Developer.

Omilaeva Anastasia - Developer. aboutWindow SobreAbout aboutWindow Sobre o programa About program aboutWindowAutoresAuthors aboutWindow FecharClose aboutWindowKonstantin Andreev - Autor da ideia e criador dos cones, Arina Shelest - Autor do logotipo. Lisandro Damin Nicanor Prez MeyerKonstantin Andreev - Author of the idea and creator of the icons, Arina Shelest - Author of the logotype. Lisandro Damián Nicanor Pérez Meyer Márcio Moraes aboutWindowPrograma para simulao de redes de computadores. (C) 2009 Semenov Pavel e Omilaeva Anastasia ZProgram for simulating computer networks. (C) 2009 Semenov Pavel and Omilaeva Anastasia  aboutWindowObrigado a Thanks to aboutWindowTraduo Translation aboutWindow!5<5=>2 025; -  CAA:89 Mrcio Moraes - Portugus do Brasil Lisandro Damin Nicanor Prez Meyer - EspaolСеменов Павел - Русский Márcio Moraes - Português brasileiro Lisandro Damián Nicanor Pérez Meyer - Español aboutWindowAdicionarAddadapterPropertyRPelo menos uma placa de rede deve existirAt least a netcard must existadapterPropertyExcluirDeleteadapterPropertyErroErroradapterPropertyJPrimeiro, remova o cabo da interface!First, remove the cable!adapterPropertyEndereo IP:  Ip-address: adapterPropertyEndereo Mac:  Mac-address: adapterProperty"Mscara de rede: Mask: adapterPropertyPlaca de redeNetcardadapterProperty&Nome da interface: Netcard name: adapterProperty,Restaurar estatsticasReset statisticsadapterProperty LAN%1LAN%1boxChip`<b>Computador</b><!--Voc pode utilizar HTML.-->'ComputercomputerComputadorComputercomputer eth%1eth%1computerRota padro:Default gateway:computerPropertyHabilitar rotaEnable routingcomputerPropertyPropriedades PropertiescomputerPropertyCancelarCancel connectDilogConectarConnect connectDilogJSelecionar as interfaces conectadas: !Select the connected interfaces:  connectDilogJEspecificar as preferncias iniciais  Specify the initial preferences  connectDilogArpArpdesignerDialogCancelarCanceldesignerDialogTCPTcpdesignerDialogCancelarCanceldeviceNoteDialogDescrio: Description:deviceNoteDialogCliente DHCP DHCP clientdhcpClientProgrammCancelarCanceldhcpClientProperty6Propriedade do cliente DHCPDHCP client propertydhcpClientPropertyOKOkdhcpClientPropertyRota padroGatewaydhcpServerModelEndereo IP Ip-addressdhcpServerModelEndereo Mac Mac-addressdhcpServerModelMscara de redeMaskdhcpServerModel TempoTimedhcpServerModelServidor DHCP DHCP serverdhcpServerProgramm segundo sdhspServerPropertyAdicionarAdddhspServerPropertyCancelarCanceldhspServerProperty:Propriedades do servidor DHCPDHCP server's propertiesdhspServerPropertyExcluirDeletedhspServerPropertyDinmico:Dynamic:dhspServerProperty"Tempo de locao: Lease term:dhspServerPropertyOKOkdhspServerPropertyEsttico:Static:dhspServerPropertyAplicarApplydialogTemplateCancelarCanceldialogTemplateKOkdialogTemplate LAN%1LAN%1hubChipP<b>Hub</b><!--Voc pode utiliza HTML.-->"Hub hubDeviceHubHub hubDeviceErroError hubPropertyNPrimeiro, remova os cabos da interface!First, remove the cables! hubPropertyEndereo Mac:  Mac-address:  hubProperty,Nmero de colises: %1Number of collisions: %1 hubProperty$Nmero de portas: Number of ports:  hubPropertyPropriedades Properties hubProperty,Restaurar estatsticasReset statistics hubProperty,Programas disponveis:Available programs:  installDialog FecharClose installDialogCliente DHCP DHCP client installDialogServidor DHCP DHCP server installDialogErroError installDialogInstalarInstall installDialog:O programa j est instalado.Program already installed. installDialogProgramasPrograms installDialogRIPRIP installDialog Type:  Type:  logDialog encontrar  found  logDialog localizar  search  logDialogARP-%1:ARP-%1: logDialog TodosAll logDialogArpArp logDialog LimparClear logDialog.Mensagem DHCP, Tipo: %1DHCP Message, Type: %1 logDialogDeForm logDialogISN %1, ACK %2ISN %1, ACK %2 logDialog,Siaddr: %1, Chaddr: %2Siaddr: %1, Chaddr: %2 logDialogTCPTCP logDialog TempoTime logDialogUDPUDP logDialog&Xid: %1, Yiaddr: %2Xid: %1, Yiaddr: %2 logDialogflags: Ack flags: Ack logDialogflags: Fin flags: Fin logDialog flags: Sem flagsflags: No flags logDialogflags: SYN flags: SYN logDialogflags: SYN, ACKflags: SYN, ACK logDialogrecebido  received  logDialog pedidorequest logDialogrespostaresponse logDialog<Endereo IP do transmissor: %1sender IP address: %1 logDialog>Endereo MAC do transmissor: %1sender MAC address: %1 logDialogenviado sent  logDialog.Endereo IP do alvo: %1target IP address: %1 logDialog0Endereo MAC do alvo: %1target MAC address: %1 logDialogComentrio CommentarymyCanvasErroErrormyCanvasNAbrir arquivo para leitura impossvel&Opening file for reading is impossiblemyCanvasAdicionarAddprogrammDialogCancelarCancelprogrammDialogExcluirDeleteprogrammDialog(Programas instaladosInstalled programsprogrammDialogOKOkprogrammDialogProgramasProgramsprogrammDialogConfiguraesSettingsprogrammDialogRIPRIP ripProgrammVAtivar/Desativar atualizaes desencadeadas Turn On/Off triggered updates ripPropertyCancelarCancel ripPropertyDesabilitarDisable ripPropertyHabilitarEnable ripPropertyOKOk ripProperty0Dividir horizontalmente:Split horizon: ripProperty$Com veneno reversoWith poison reverse ripPropertyAdicionarAdd routeEditor FecharClose routeEditorExcluirDelete routeEditorPara endereo:  Destination:  routeEditorRota padro:  Gateway:  routeEditorInterface:  Interface:  routeEditor"scara de rede: Mask:  routeEditorMtrica: Metric:  routeEditor(Tabela de roteamento Routing table routeEditorConectado Connected routeModelPara endereo Destination routeModelRota padroGateway routeModelInterface Interface routeModelMscara de redeMask routeModelMtricaMetric routeModel FonteSource routeModel\<b>Roteador</b><!--Voc pode utilizar HTML.-->%Router routerDeviceErroError routerDeviceLAN%1 routerDeviceRoteadorRouter routerDevicevPara alterar o nmero de portas, desconecte todos os cabos!5To change the number of ports, disconnect all cables! routerDeviceHabilitar rotaEnable routingrouterProperty$Nmero de portas: Number of ports: routerPropertyPropriedades PropertiesrouterProperty KB KB sendDialogCancelarCancel sendDialog&Escolher protocolo:Choose protocol: sendDialogPrximoNext sendDialogLSelecionar a placa de rede do receptor Select the network card receiver sendDialog EnviarSend sendDialogEnviandoSending sendDialogO tamanho em KBSize KB sendDialogTCPTCP sendDialogUDPUDP sendDialog segundo s settingDialog11 settingDialog1212 settingDialog1616 settingDialog22 settingDialog2424 settingDialog33 settingDialog3232 settingDialog44 settingDialog4848 settingDialog55 settingDialog66 settingDialog77 settingDialog88 settingDialog99 settingDialog.Velocidade da animao:Animation speed: settingDialogAplicarApply settingDialog(portugus brasileiroBrazillian Portuguese settingDialogCancelarCancel settingDialogComputadorComputer settingDialog PadroDefault settingDialog InglsEnglish settingDialogRExpectativa do tempo para resposta do arp!Expectation time for arp-responce settingDialog GeralGeneral settingDialogHubHub settingDialogIdioma:  Language:  settingDialog@Tempo de vida das entradas arp: Lifetime arp-entries:  settingDialogPlaca de redeNetcard settingDialogDO nmero de interfaces por padro: Nubmer of interfaces by default: settingDialog:O nmero de portas por padroNumber of ports by default settingDialog>O nmero de portas por padro: Number of ports by default:  settingDialog<Nmero de envios de repetio:Number of repeat sendings: settingDialogOKOk settingDialogRoteadorRouter settingDialog RussoRussian settingDialogConfiguraesSettings settingDialogEspanholSpanish settingDialog SwitchSwitch settingDialog\Registro do tempo de vida da tabela do switch:#Switching table's records lifetime: settingDialogTCPTcp settingDialog.Ativar/Desativar OpenGLTurn on/off OpenGL settingDialog>Tempo de espera da confirmao:Waiting confirmation time: settingDialog(Tabela de roteamento Routing Table smartDevice eth%1eth%1 smartDevice FecharClose staticsDialogDispositivos:Devices: staticsDialogEstatsticas Statistics staticsDialog Texto TextLabel staticsDialogTrfego:Traffic: staticsDialog*Nmero de cablos: %1 Number of cables: %1 statisticsScene6Nmero de computadores: %1 Number of computers: %1 statisticsScene6Nmero de dispositivos: %1 Number of devices: %1 statisticsScene&Nmero de hubs: %1 Number of hubs: %1 statisticsScene2Nmero de roteadores: %1 Number of routers: %1 statisticsScene,Nmero de switchs: %1 Number of switchs: %1 statisticsScene LAN%1LAN%1 switchChipX<b>Switch</b><!--Voc pode utilizar HTML.-->%Switch switchDevice SwitchSwitch switchDevice Tabela do switchSwitching table switchDevice LAN%1LAN%1 switchModelEndereo Mac Mac-address switchModel PortaPort switchModel Tipo de registro Record type switchModelTempo de vidaTTL switchModelErroErrorswitchPropertyNPrimeiro, remova os cabos da interface!First, remove the cables!switchPropertyEndereo Mac:  Mac-address: switchProperty$Nmero de portas: Number of ports: switchPropertyPropriedades PropertiesswitchProperty,Restaurar estatsticasReset statisticsswitchPropertyAdicionarAddtableArpTabela arp Arp tabletableArp FecharClosetableArpExcluirDeletetableArpEndereo IP Ip-addresstableArpEndereo IP:  Ip-address: tableArpEndereo Mac Mac-addresstableArpEndereo Mac:  Mac-address: tableArpAdaptadorNetcardtableArp"Nome do adaptador Netcard nametableArp Tipo de registro Record typetableArpTempo de vidaTTLtableArp"00:00:00:00:00:0000:00:00:00:00:00 tableSwitchAdicionarAdd tableSwitch FecharClose tableSwitchExcluirDelete tableSwitch&HH:HH:HH:HH:HH:HH;_HH:HH:HH:HH:HH:HH;_ tableSwitch LAN%1LAN%1 tableSwitchEndereo Mac:  Mac-address:  tableSwitchPorta: Port:  tableSwitchTabela switchSwitching table tableSwitchErroError tcpSocket:TCP: Erro ao transmitir dadosTCP: Data transmition error tcpSocket TodosAll testDialogCancelarCancel testDialog@Escolha um diretrio com scriptsChoose a directory with scripts testDialog"Clique em iniciar Click start testDialog<Script finalizado corretamenteScript finished correctly testDialogBScript no concludo corretamenteScript not correctly finished testDialogScriptsScripts testDialog&Definir localizaoSet path testDialogIniciarStart testDialog LAN%1LAN%1virtualNetworknetemul-1.0/translation/qt_pt.qm0000644000175000017500000021017711270702635016136 0ustar frostfrost;M52O#Oz}5Zm5+;+;6+;=?+O+O6cH4HJ£KLD,LÀPSoZrE[`>[`\iX__1>:6C,n3y%U%E70080w0z00[55 D< DI+O,<,V9V}ŜM 1f-%C?"qKN>MNR|!][]bky^l{yG%LصǥϪ+t{yr%,C-t5ƨƨ˾c`ҝz է?f~bGu~bIo !a.+3/$/Y6 nGM"LAUPѧ8 UgUZZZ ZA^ne iQiXy;p{}un}w}w}w$htPt.7.PDt&atWt_ Ft ʢ3ʢd4dtzdd59`,֛UBw3kx `2=6SCU]DK 7U|*arxt }wZ}$}$ӊ}$Z"K<9S0 /WEKuTi~ 5kEXU F[bDbGjgAi$dx1 cz*2dvU5az>~mLnΗC;ʴ5wSʴ5"ԄD,dF5F5xjYI *IFAsv 4$ }$u qeUf ڤ} Er E AcV AcH 35t K!?C bb b` b` i3# lazs |X t tHn p > &   > u d s K ޒ %'b   )x */ 7u =L: B5 T^ ] `\j ` c( d՜ e eG. f1Of gn k,% rD"@ x ~bT "W 9 I%Y I+i I5 ; u  Jh %p( , ,A )' ˔K> P% P[ O We 68 :.% f  f B 4_ s sE8 AAS 8f m, #-tz 0N) E9 L% L Mc\;a Sa Vf ]$1 f) f)C! io>R m`G w H= HAs $D# .@ѭ  iE 5 n ڙ J JEo t.7 k؜ Ӈ q ̺K| -DL k k U)Y < 0I  Q  X ̴ xH[ .- 7FG >S >T >U >[9 >h8 >m >e > DT I, RVI RV RV S.C S Y [| j7o@ p- . Bdk > T1 TpT T T l e 39  K )d/ F .1_ .]f .q\ . a yY z [ t :bYx ʜ, +>/ 0E ;ɾ Ptx Pt< feH fe g iFC iF ii u5 w w wA w}R w}= w} N V ^z }lV R9 X 3 D E t5x+ t5 yO  )P T'gT(!*&+*/E'i/Ep=BiI_YXRu[ a.8vɅ_y$~ZSgB$fݖ[y  D"#q$U%4;%4IV-v 0i)0ˑ1c<2wTʁD;H]JdZ]L$.c5lc5yC &{~a`@DN?kyPt2*oCD^in"%1, %2 indefinido%1, %2 not definedQ3Accel,%1 ambguo no tratadoAmbiguous %1 not handledQ3AccelRemoverDelete Q3DataTable FalsoFalse Q3DataTableInserirInsert Q3DataTableVerdadeiroTrue Q3DataTableActualizarUpdate Q3DataTablez%1 Ficheiro no encontrado. Verifique a localizao e o nome.+%1 File not found. Check path and filename. Q3FileDialog&Apagar&Delete Q3FileDialog&No&No Q3FileDialog&OK&OK Q3FileDialog &Abrir&Open Q3FileDialog&Mudar Nome&Rename Q3FileDialog&Gravar&Save Q3FileDialogNo &Ordenado &Unsorted Q3FileDialog&Sim&Yes Q3FileDialogJ<qt>Deseja mesmo apagar %1 "%2"?</qt>1Are you sure you wish to delete %1 "%2"? Q3FileDialog,Todos os Ficheiros (*) All Files (*) Q3FileDialog0Todos os Ficheiros (*.*)All Files (*.*) Q3FileDialogAtributos Attributes Q3FileDialog RecuarBack Q3FileDialogCancelarCancel Q3FileDialog6Copiar ou Mover um FicheiroCopy or Move a File Q3FileDialog Criar Nova PastaCreate New Folder Q3FileDialogDataDate Q3FileDialogApagar %1 Delete %1 Q3FileDialogVista Detalhada Detail View Q3FileDialog PastaDir Q3FileDialog Pastas Directories Q3FileDialog Pasta: Directory: Q3FileDialogErroError Q3FileDialogFicheiroFile Q3FileDialog$&Nome do Ficheiro: File &name: Q3FileDialog$&Tipo de Ficheiro: File &type: Q3FileDialogProcurar PastaFind Directory Q3FileDialogInacessvel Inaccessible Q3FileDialogVista Abreviada List View Q3FileDialogVer &em: Look &in: Q3FileDialogNomeName Q3FileDialogNova Pasta New Folder Q3FileDialogNova Pasta %1 New Folder %1 Q3FileDialogNova Pasta 1 New Folder 1 Q3FileDialogPasta MeOne directory up Q3FileDialog AbrirOpen Q3FileDialog Abrir Open  Q3FileDialog8Antever Contedo do FicheiroPreview File Contents Q3FileDialog<Antever Informao do FicheiroPreview File Info Q3FileDialog&RecarregarR&eload Q3FileDialogApenas Leitura Read-only Q3FileDialog"Leitura e escrita Read-write Q3FileDialogLer: %1Read: %1 Q3FileDialogGuardar ComoSave As Q3FileDialog(Seleccione uma PastaSelect a Directory Q3FileDialog:Mostrar ficheiros &escondidosShow &hidden files Q3FileDialogTamanhoSize Q3FileDialogOrdenarSort Q3FileDialog$Ordenar pela &Data Sort by &Date Q3FileDialog$Ordenar pelo &Nome Sort by &Name Q3FileDialog*Ordenar pelo &Tamanho Sort by &Size Q3FileDialogEspecialSpecial Q3FileDialog$Ligao para PastaSymlink to Directory Q3FileDialog*Ligao para FicheiroSymlink to File Q3FileDialog*Ligao para EspecialSymlink to Special Q3FileDialogTipoType Q3FileDialogApenas Escrita Write-only Q3FileDialogEscrever: %1 Write: %1 Q3FileDialoga pasta the directory Q3FileDialogo ficheirothe file Q3FileDialoga ligao the symlink Q3FileDialogBNo foi possvel criar a pasta %1Could not create directory %1 Q3LocalFs2No foi possvel abrir %1Could not open %1 Q3LocalFs>No foi possvel ler a pasta %1Could not read directory %1 Q3LocalFs`No foi possvel apagar o ficheiro ou a pasta %1%Could not remove file or directory %1 Q3LocalFsRNo foi possvel mudar o nome %1 para %2Could not rename %1 to %2 Q3LocalFs8Nao foi possvel escrever %1Could not write %1 Q3LocalFsConfigurar... Customize... Q3MainWindowAlinharLine up Q3MainWindowJOperao interrompida pelo utilizadorOperation stopped by the userQ3NetworkProtocolCancelarCancelQ3ProgressDialogAplicarApply Q3TabDialogCancelarCancel Q3TabDialogPredefiniesDefaults Q3TabDialog AjudaHelp Q3TabDialogOKOK Q3TabDialog&Copiar&Copy Q3TextEdit Co&lar&Paste Q3TextEdit&Refazer&Redo Q3TextEdit&Desfazer&Undo Q3TextEdit LimparClear Q3TextEditCor&tarCu&t Q3TextEdit Seleccionar Tudo Select All Q3TextEdit FecharClose Q3TitleBarFecha a janelaCloses the window Q3TitleBarNContm comandos para manipular a janela*Contains commands to manipulate the window Q3TitleBarvMostra o nome da janela e contm controlos para a manipularFDisplays the name of the window and contains controls to manipulate it Q3TitleBar@Coloca a janela em ecr completoMakes the window full screen Q3TitleBarMaximizarMaximize Q3TitleBarMinimizarMinimize Q3TitleBar.Tira a janela da frenteMoves the window out of the way Q3TitleBarZColoca uma janela maximizada no estado normal&Puts a maximized window back to normal Q3TitleBarZColoca uma janela minimizada no estado normalPuts a minimized back to normal Q3TitleBar Restaurar abaixo Restore down Q3TitleBarRestaurar acima Restore up Q3TitleBarSistemaSystem Q3TitleBarMais...More... Q3ToolBar(desconhecido) (unknown) Q3UrlOperatorO protocolo '%1' no suporta copiar ou mover ficheiros ou pastasIThe protocol `%1' does not support copying or moving files or directories Q3UrlOperatorhO protocolo '%1' no suporta criao de novas pastas;The protocol `%1' does not support creating new directories Q3UrlOperatordO protocolo '%1' no suporta obteno de ficheiros0The protocol `%1' does not support getting files Q3UrlOperator^O protocolo '%1' no suporta listagem de pastas6The protocol `%1' does not support listing directories Q3UrlOperatorfO protocolo '%1' no suporta colocao de ficheiros0The protocol `%1' does not support putting files Q3UrlOperator|O protocolo '%1' no suporta eliminao de ficheiros ou pastas@The protocol `%1' does not support removing files or directories Q3UrlOperatorO protocolo '%1' no suporta mudana de nome de ficheiros ou pastas@The protocol `%1' does not support renaming files or directories Q3UrlOperator@O protocolo '%1' no suportado"The protocol `%1' is not supported Q3UrlOperator&Cancelar&CancelQ3Wizard&Terminar&FinishQ3Wizard &Ajuda&HelpQ3Wizard&Avanar >&Next >Q3Wizard< &Recuar< &BackQ3Wizard Ligao recusadaConnection refusedQAbstractSocket Ligao expiradaConnection timed outQAbstractSocket(Mquina desconhecidaHost not foundQAbstractSocket"Rede inalcanvelNetwork unreachableQAbstractSocket$'Socket' desligadoSocket is not connectedQAbstractSocket:Operao de 'socket' expiradaSocket operation timed outQAbstractSocket&Passo acima&Step upQAbstractSpinBoxPasso &abaixo Step &downQAbstractSpinBoxActivarActivate QApplicationJActiva a janela principal do programa#Activates the program's main window QApplicationdO executvel '%1' requere Qt %2, Qt %3 encontrado.,Executable '%1' requires Qt %2, found Qt %3. QApplicationTErro de Incompatibilidade da Biblioteca QtIncompatible Qt Library Error QApplicationLTRQT_LAYOUT_DIRECTION QApplication&Cancelar&Cancel QAxSelect&Objecto COM: COM &Object: QAxSelectOKOK QAxSelect8Seleccionar Controlo ActiveXSelect ActiveX Control QAxSelectActivarCheck QCheckBoxComutarToggle QCheckBoxDesactivarUncheck QCheckBox@&Adicionar s Cores Customizadas&Add to Custom Colors QColorDialogCores &bsicas &Basic colors QColorDialog&Cores c&ustomizadas&Custom colors QColorDialogV&erde:&Green: QColorDialog&Vermelho:&Red: QColorDialog&Saturao:&Sat: QColorDialog&Valor:&Val: QColorDialog*Canal &transparncia:A&lpha channel: QColorDialog &Azul:Bl&ue: QColorDialog C&or:Hu&e: QColorDialog FecharClose QComboBox FalsoFalse QComboBox AbrirOpen QComboBoxVerdadeiroTrue QComboBoxLFinalizao de transaco no possvelUnable to commit transaction QDB2Driver(Ligao no possvelUnable to connect QDB2DriverFAnulao de transaco no possvelUnable to rollback transaction QDB2DriverFFinalizao automtica no possvelUnable to set autocommit QDB2Driver@Ligao de varivel no possvelUnable to bind variable QDB2Result*Execuo no possvelUnable to execute statement QDB2ResultBObteno do primeiro no possvelUnable to fetch first QDB2ResultBObteno do seguinte no possvelUnable to fetch next QDB2ResultFObteno do registo %1 no possvelUnable to fetch record %1 QDB2Result.Preparao no possvelUnable to prepare statement QDB2ResultAMAM QDateTimeEditPMPM QDateTimeEditamam QDateTimeEditpmpm QDateTimeEditO Que Isto? What's This?QDialog&Cancelar&CancelQDialogButtonBox&Fechar&CloseQDialogButtonBox&No&NoQDialogButtonBox&OK&OKQDialogButtonBox&Gravar&SaveQDialogButtonBox&Sim&YesQDialogButtonBoxAbortarAbortQDialogButtonBoxAplicarApplyQDialogButtonBoxCancelarCancelQDialogButtonBox FecharCloseQDialogButtonBox"Fechar sem GravarClose without SavingQDialogButtonBoxDescartarDiscardQDialogButtonBoxNo Gravar Don't SaveQDialogButtonBox AjudaHelpQDialogButtonBoxIgnorarIgnoreQDialogButtonBoxN&o para Todos N&o to AllQDialogButtonBoxOKOKQDialogButtonBox AbrirOpenQDialogButtonBoxRestaurarResetQDialogButtonBox.Restaurar PredefiniesRestore DefaultsQDialogButtonBox Tentar NovamenteRetryQDialogButtonBox GravarSaveQDialogButtonBoxGravar TodosSave AllQDialogButtonBoxSim para &Todos Yes to &AllQDialogButtonBox&Data de Modificao Date Modified QDirModelTipoKind QDirModelNomeName QDirModelTamanhoSize QDirModelTipoType QDirModel FecharClose QDockWidget MenosLessQDoubleSpinBoxMaisMoreQDoubleSpinBox&OK&OK QErrorMessage@&Mostrar esta mensagem novamente&Show this message again QErrorMessage&Mensagem Depurao:Debug Message: QErrorMessageErro Fatal: Fatal Error: QErrorMessage Aviso:Warning: QErrorMessagez%1 Pasta no encontrada. Por favor verifique o nome da pasta.K%1 Directory not found. Please verify the correct directory name was given. QFileDialog%1 Ficheiro no encontrado. Por favor verifique o nome do ficheiro.A%1 File not found. Please verify the correct file name was given. QFileDialog@%1 j existe. Deseja substituir?-%1 already exists. Do you want to replace it? QFileDialog&Apagar&Delete QFileDialog &Abrir&Open QFileDialog&Mudar o Nome&Rename QFileDialog&Gravar&Save QFileDialog'%1' est protegido contra escrita. Deseja apagar de qualquer forma?9'%1' is write protected. Do you want to delete it anyway? QFileDialog,Todos os Ficheiros (*) All Files (*) QFileDialog0Todos os Ficheiros (*.*)All Files (*.*) QFileDialog2Deseja mesmo apagar '%1'?!Are sure you want to delete '%1'? QFileDialog RecuarBack QFileDialog@No foi possvel apagar a pasta.Could not delete directory. QFileDialog Criar Nova PastaCreate New Folder QFileDialogVista Detalhada Detail View QFileDialog Pastas Directories QFileDialog Pasta: Directory: QFileDialogUnidadeDrive QFileDialogFicheiroFile QFileDialog$&Nome do Ficheiro: File &name: QFileDialog$FIcheiros do tipo:Files of type: QFileDialogProcurar PastaFind Directory QFileDialogSeguinteForward QFileDialogVista Abreviada List View QFileDialog O Meu Computador My Computer QFileDialogNova Pasta New Folder QFileDialog AbrirOpen QFileDialogPasta MeParent Directory QFileDialogGravar ComoSave As QFileDialog:Mostrar ficheiros &escondidosShow &hidden files QFileDialogDesconhecidoUnknown QFileDialog&Data de Modificao Date ModifiedQFileSystemModelTipoKindQFileSystemModel O Meu Computador My ComputerQFileSystemModelNomeNameQFileSystemModelTamanhoSizeQFileSystemModelTipoTypeQFileSystemModel&Tipo de Letra&Font QFontDialog&Tamanho&Size QFontDialog&Sublinhar &Underline QFontDialogEfeitosEffects QFontDialog*&Estilo Tipo de Letra Font st&yle QFontDialogAmostraSample QFontDialog0Seleccione Tipo de Letra Select Font QFontDialog&Riscar Stri&keout QFontDialog&&Sistema de EscritaWr&iting System QFontDialog:A mudana de pasta falhou: %1Changing directory failed: %1QFtp$Ligado ao servidorConnected to hostQFtp*Ligado ao servidor %1Connected to host %1QFtp@A ligao ao servidor falhou: %1Connecting to host failed: %1QFtpLigao fechadaConnection closedQFtp2Ligao de dados recusada&Connection refused for data connectionQFtp>Ligao ao servidor %1 recusadaConnection refused to host %1QFtp(Ligao a %1 fechadaConnection to %1 closedQFtp:A criao da pasta falhou: %1Creating directory failed: %1QFtpBA descarga do ficheiro falhou: %1Downloading file failed: %1QFtp,Servidor %1 encontrado Host %1 foundQFtp4Servidor %1 no encontradoHost %1 not foundQFtp&Servidor encontrado Host foundQFtp<A listagem da pasta falhou: %1Listing directory failed: %1QFtp2A autenticao falhou: %1Login failed: %1QFtpDesligado Not connectedQFtp:A remoo da pasta falhou: %1Removing directory failed: %1QFtp@A remoo do ficheiro falhou: %1Removing file failed: %1QFtp"Erro desconhecido Unknown errorQFtpJO carregamento do ficheiro falhou: %1Uploading file failed: %1QFtp"Erro desconhecido Unknown error QHostInfo.Servidor No encontradoHost not foundQHostInfoAgent:Tipo de endereo desconhecidoUnknown address typeQHostInfoAgent"Erro desconhecido Unknown errorQHostInfoAgent$Ligado ao servidorConnected to hostQHttp*Ligado ao servidor %1Connected to host %1QHttpLigao fechadaConnection closedQHttp Ligao recusadaConnection refusedQHttp(Ligao a %1 fechadaConnection to %1 closedQHttp(O pedido HTTP falhouHTTP request failedQHttp,Servidor %1 encontrado Host %1 foundQHttp4Servidor %1 no encontradoHost %1 not foundQHttp&Servidor encontrado Host foundQHttp6Corpo parcial HTTP invlidoInvalid HTTP chunked bodyQHttpFCabealho de resposta HTTP invlidoInvalid HTTP response headerQHttp4Nenhum servidor para ligarNo server set to connect toQHttpPedido abortadoRequest abortedQHttpVO servidor fechou a ligao inesperadamente%Server closed connection unexpectedlyQHttp"Erro desconhecido Unknown errorQHttp4Tamanho de contedo erradoWrong content lengthQHttpJNo foi possvel iniciar a transacoCould not start transaction QIBaseDriver:Erro ao abrir a base de dadosError opening database QIBaseDriverNNo foi possvel finalizar a transacoUnable to commit transaction QIBaseDriverHNo foi possvel anular a transacoUnable to rollback transaction QIBaseDriverFNo foi possvel alocar a expressoCould not allocate statement QIBaseResultbNo foi possvel descrever a expresso de entrada"Could not describe input statement QIBaseResultLNo foi possvel descrever a expressoCould not describe statement QIBaseResultTNo foi possvel obter o elemento seguinteCould not fetch next item QIBaseResultDNo foi possvel encontrar o arrayCould not find array QIBaseResultPNo foi possvel obter os dados do arrayCould not get array data QIBaseResultTNo foi possvel obter informao da queryCould not get query info QIBaseResult\No foi possvel obter informao da expressoCould not get statement info QIBaseResultJNo foi possvel preparar a expressoCould not prepare statement QIBaseResultJNo foi possvel iniciar a transacoCould not start transaction QIBaseResultFNo foi possvel fechar a expressoUnable to close statement QIBaseResultNNo foi possvel finalizar a transacoUnable to commit transaction QIBaseResult:No foi possvel criar o BLOBUnable to create BLOB QIBaseResultBNo foi possvel executar a queryUnable to execute query QIBaseResult:No foi possvel abrir o BLOBUnable to open BLOB QIBaseResult6No foi possvel ler o BLOBUnable to read BLOB QIBaseResult@No foi possvel escrever o BLOBUnable to write BLOB QIBaseResult8Dispositivo sem espao livreNo space left on device QIODevice:Ficheiro ou pasta inexistenteNo such file or directory QIODevice Permisso negadaPermission denied QIODevice8Demasiados ficheiros abertosToo many open files QIODevice"Erro desconhecido Unknown error QIODevice4Mtodo de entrada Max OS XMac OS X input method QInputContext2Mtodo de entrada WindowsWindows input method QInputContextXIMXIM QInputContext*Mtodo de entrada XIMXIM input method QInputContext@No foi possivel mapear '%1': %2Could not mmap '%1': %2QLibraryFNo foi possvel desmapear '%1': %2Could not unmap '%1': %2QLibrarydDados de verificao do plugin incorrectos em '%1')Plugin verification data mismatch in '%1'QLibraryO plugin '%1' usa uma biblioteca Qt incompatvel. (%2.%3.%4) [%5]=The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5]QLibraryO plugin '%1' usa uma biblioteca Qt incompatvel. A chave de compilao esperada "%2", ficou "%3"OThe plugin '%1' uses incompatible Qt library. Expected build key "%2", got "%3"QLibrary"Erro desconhecido Unknown errorQLibrary&Copiar&Copy QLineEdit Co&lar&Paste QLineEdit&Refazer&Redo QLineEdit&Desfazer&Undo QLineEditCor&tarCu&t QLineEdit ApagarDelete QLineEdit Seleccionar Tudo Select All QLineEditJNo foi possvel iniciar a transacoUnable to begin transaction QMYSQLDriverNNo foi possvel finalizar a transacoUnable to commit transaction QMYSQLDriverLNo foi possvel estabelecer a ligaoUnable to connect QMYSQLDriverPNo foi possvel abrir a base de dados 'Unable to open database ' QMYSQLDriverHNo foi possvel anular a transacoUnable to rollback transaction QMYSQLDriverjNo foi possvel fazer a ligao dos valores externosUnable to bind outvalues QMYSQLResultRNo foi possvel fazer a ligao do valorUnable to bind value QMYSQLResultBNo foi possvel executar a queryUnable to execute query QMYSQLResultJNo foi possvel executar a expressoUnable to execute statement QMYSQLResult8No foi possvel obter dadosUnable to fetch data QMYSQLResultJNo foi possvel preparar a expressoUnable to prepare statement QMYSQLResultLNo foi possvel restaurar a expressoUnable to reset statement QMYSQLResultHNo foi possvel guardar o resultadoUnable to store result QMYSQLResultfNo foi possvel guardar os resultados da expresso!Unable to store statement results QMYSQLResult%1 - [%2] %1 - [%2] QMdiSubWindow&Fechar&Close QMdiSubWindow &Mover&Move QMdiSubWindow&Restaurar&Restore QMdiSubWindow&Tamanho&Size QMdiSubWindow FecharClose QMdiSubWindow AjudaHelp QMdiSubWindowMa&ximizar Ma&ximize QMdiSubWindowMaximizarMaximize QMdiSubWindowMenuMenu QMdiSubWindowMi&nimizar Mi&nimize QMdiSubWindowMinimizarMinimize QMdiSubWindowRestaurar Baixo Restore Down QMdiSubWindow&Permanecer no &Topo Stay on &Top QMdiSubWindow FecharCloseQMenuExecutarExecuteQMenu AbrirOpenQMenuAcerca do QtAbout Qt QMessageBox AjudaHelp QMessageBox.No Mostrar Detalhes...Hide Details... QMessageBoxOKOK QMessageBox&Mostrar Detalhes...Show Details... QMessageBox8Seleccione Mtodo de Entrada Select IMQMultiInputContextDSeleccionador de mtodo de entradaMultiple input method switcherQMultiInputContextPluginSeleccionador de mtodo de entrada que utiliza o menu de contexto dos elementos de textoMMultiple input method switcher that uses the context menu of the text widgetsQMultiInputContextPlugin\Outro 'socket' j est escuta no mesmo porto4Another socket is already listening on the same portQNativeSocketEngineTentativa de utilizao de 'socket' IPv6 numa plataforma sem suporte IPv6=Attempt to use IPv6 socket on a platform with no IPv6 supportQNativeSocketEngine Ligao recusadaConnection refusedQNativeSocketEngine Ligao expiradaConnection timed outQNativeSocketEngineLDatagrama demasiado grande para enviarDatagram was too large to sendQNativeSocketEngine(Mquina inalcanvelHost unreachableQNativeSocketEngine<Descritor de 'socket' invlidoInvalid socket descriptorQNativeSocketEngineErro de rede Network errorQNativeSocketEngine2Operao de rede expiradaNetwork operation timed outQNativeSocketEngine"Rede inalcanvelNetwork unreachableQNativeSocketEngine0Operao em no 'socket'Operation on non-socketQNativeSocketEngineSem recursosOut of resourcesQNativeSocketEngine Permisso negadaPermission deniedQNativeSocketEngine>Tipo de protocolo no suportadoProtocol type not supportedQNativeSocketEngine<O endereo no est disponvelThe address is not availableQNativeSocketEngine2O endereo est protegidoThe address is protectedQNativeSocketEngineHO endereo de ligao j est em uso#The bound address is already in useQNativeSocketEngineBA mquina remota fechou a ligao%The remote host closed the connectionQNativeSocketEnginehNo foi possvel inicializar 'socket' de transmisso%Unable to initialize broadcast socketQNativeSocketEnginehNo foi possvel inicializar 'socket' no bloqueante(Unable to initialize non-blocking socketQNativeSocketEngineJNo foi possvel receber uma mensagemUnable to receive a messageQNativeSocketEngineHNo foi possvel enviar uma mensagemUnable to send a messageQNativeSocketEngine2No foi possvel escreverUnable to writeQNativeSocketEngine"Erro desconhecido Unknown errorQNativeSocketEngineDOperao de 'socket' no suportadaUnsupported socket operationQNativeSocketEngineJNo foi possvel iniciar a transacoUnable to begin transaction QOCIDriver8No foi possvel inicializarUnable to initialize QOCIDriver6No foi possvel autenticarUnable to logon QOCIDriverFNo foi possvel alocar a expressoUnable to alloc statement QOCIResultNo foi possvel fazer a licao da coluna para execuo 'batch''Unable to bind column for batch execute QOCIResultVNo foi possvel fazer o ligamento do valorUnable to bind value QOCIResult`No foi possvel executar a expresso de 'batch'!Unable to execute batch statement QOCIResultJNo foi possvel executar a expressoUnable to execute statement QOCIResultFNo foi possvel passar ao seguinteUnable to goto next QOCIResultJNo foi possvel preparar a expressoUnable to prepare statement QOCIResultNNo foi possvel finalizar a transacoUnable to commit transaction QODBCDriver,No foi possvel ligarUnable to connect QODBCDriverNo foi possvel ligar - O 'driver' no suporta todas as funcionalidades necessriasCUnable to connect - Driver doesn't support all needed functionality QODBCDriverfNo foi possvel desactivar finalizao automticaUnable to disable autocommit QODBCDriver^No foi possvel activar finalizao automticaUnable to enable autocommit QODBCDriverHNo foi possvel anular a transacoUnable to rollback transaction QODBCDriver(QODBCResult::reset: No foi possvel definir 'SQL_CURSOR_STATIC' como atributo da expresso. Por favor verifique a configurao do seu 'driver' ODBCyQODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration QODBCResult\No foi possvel fazer o ligamento da varivelUnable to bind variable QODBCResultJNo foi possvel executar a expressoUnable to execute statement QODBCResultBObteno do primeiro no possvelUnable to fetch first QODBCResultBNo foi possvel obter o seguinteUnable to fetch next QODBCResultJNo foi possvel preparar a expressoUnable to prepare statement QODBCResult IncioHomeQObjectNomeNameQPPDOptionsModel ValorValueQPPDOptionsModelJNo foi possvel iniciar a transacoCould not begin transaction QPSQLDriverNNo foi possvel finalizar a transacoCould not commit transaction QPSQLDriverHNo foi possvel anular a transacoCould not rollback transaction QPSQLDriver,No foi possvel ligarUnable to connect QPSQLDriver@No foi possvel criar a 'query'Unable to create query QPSQLResultPaisagem LandscapeQPageSetupWidgetTamanho pgina: Page size:QPageSetupWidgetFonte papel: Paper source:QPageSetupWidgetRetratoPortraitQPageSetupWidget"Erro desconhecido Unknown error QPluginLoader@%1 j existe. Deseja substituir?/%1 already exists. Do you want to overwrite it? QPrintDialog@<qt>Deseja gravar por cima?</qt>%Do you want to overwrite it? QPrintDialog$A0 (841 x 1189 mm)A0 (841 x 1189 mm) QPrintDialog"A1 (594 x 841 mm)A1 (594 x 841 mm) QPrintDialog"A2 (420 x 594 mm)A2 (420 x 594 mm) QPrintDialog"A3 (297 x 420 mm)A3 (297 x 420 mm) QPrintDialogPA4 (210 x 297 mm, 8.26 x 11.7 polegadas)%A4 (210 x 297 mm, 8.26 x 11.7 inches) QPrintDialog"A5 (148 x 210 mm)A5 (148 x 210 mm) QPrintDialog"A6 (105 x 148 mm)A6 (105 x 148 mm) QPrintDialog A7 (74 x 105 mm)A7 (74 x 105 mm) QPrintDialogA8 (52 x 74 mm)A8 (52 x 74 mm) QPrintDialogA9 (37 x 52 mm)A9 (37 x 52 mm) QPrintDialog,Nomes Alternativos: %1 Aliases: %1 QPrintDialog&B0 (1000 x 1414 mm)B0 (1000 x 1414 mm) QPrintDialog$B1 (707 x 1000 mm)B1 (707 x 1000 mm) QPrintDialog B10 (31 x 44 mm)B10 (31 x 44 mm) QPrintDialog"B2 (500 x 707 mm)B2 (500 x 707 mm) QPrintDialog"B3 (353 x 500 mm)B3 (353 x 500 mm) QPrintDialog"B4 (250 x 353 mm)B4 (250 x 353 mm) QPrintDialogPB5 (176 x 250 mm, 6.93 x 9.84 polegadas)%B5 (176 x 250 mm, 6.93 x 9.84 inches) QPrintDialog"B6 (125 x 176 mm)B6 (125 x 176 mm) QPrintDialog B7 (88 x 125 mm)B7 (88 x 125 mm) QPrintDialogB8 (62 x 88 mm)B8 (62 x 88 mm) QPrintDialogB9 (44 x 62 mm)B9 (44 x 62 mm) QPrintDialog$C5E (163 x 229 mm)C5E (163 x 229 mm) QPrintDialog$DLE (110 x 220 mm)DLE (110 x 220 mm) QPrintDialogXExecutivo (7.5 x 10 polegadas, 191 x 254 mm))Executive (7.5 x 10 inches, 191 x 254 mm) QPrintDialogNo possvel escrever no ficheiro %1. Por favor escolha um nome diferente.=File %1 is not writable. Please choose a different file name. QPrintDialog"O ficheiro existe File exists QPrintDialog(Folio (210 x 330 mm)Folio (210 x 330 mm) QPrintDialog*Ledger (432 x 279 mm)Ledger (432 x 279 mm) QPrintDialogPLegal (8.5 x 14 polegadas, 216 x 356 mm)%Legal (8.5 x 14 inches, 216 x 356 mm) QPrintDialogPCarta (8.5 x 11 polegadas, 216 x 279 mm)&Letter (8.5 x 11 inches, 216 x 279 mm) QPrintDialogOKOK QPrintDialogImprimirPrint QPrintDialog4Imprimir Para Ficheiro ...Print To File ... QPrintDialogImprimir todas Print all QPrintDialog&Seleco de pginas Print range QPrintDialog*Seleco de ImpressoPrint selection QPrintDialog.Tablide (279 x 432 mm)Tabloid (279 x 432 mm) QPrintDialogJEnvelope #10 Comum EUA (105 x 241 mm)%US Common #10 Envelope (105 x 241 mm) QPrintDialog"ligado localmentelocally connected QPrintDialogdesconhecidounknown QPrintDialog FecharCloseQPrintPreviewDialogPaisagem LandscapeQPrintPreviewDialogRetratoPortraitQPrintPreviewDialog JuntarCollateQPrintSettingsOutput CpiasCopiesQPrintSettingsOutput OpesOptionsQPrintSettingsOutputPginas de Pages fromQPrintSettingsOutputImprimir todas Print allQPrintSettingsOutput&Seleco de pginas Print rangeQPrintSettingsOutputSeleco SelectionQPrintSettingsOutputatoQPrintSettingsOutputImpressoraPrinter QPrintWidgetCancelarCancelQProgressDialog AbrirOpen QPushButtonActivarCheck QRadioButtonDm sintaxe de classe de caracteresbad char class syntaxQRegExp2m sintaxe de antecipaobad lookahead syntaxQRegExp.m sintaxe de repetiobad repetition syntaxQRegExp^funcionalidade desactivada est a ser utilizadadisabled feature usedQRegExp(valor octal invlidoinvalid octal valueQRegExp0limite interno alcanadomet internal limitQRegExp:delimitador esquerdo em faltamissing left delimQRegExpsem errosno error occurredQRegExpfim inesperadounexpected endQRegExp6Erro ao abrir base de dadosError to open databaseQSQLite2DriverJNo foi possvel iniciar a transacoUnable to begin transactionQSQLite2DriverNNo foi possvel finalizar a transacoUnable to commit transactionQSQLite2DriverHNo foi possvel anular a transacoUnable to rollback TransactionQSQLite2DriverJNo foi possvel executar a expressoUnable to execute statementQSQLite2ResultHNo foi possvel obter os resultadosUnable to fetch resultsQSQLite2Result<Erro ao fechar a base de dadosError closing database QSQLiteDriver:Erro ao abrir a base de dadosError opening database QSQLiteDriverJNo foi possvel iniciar a transacoUnable to begin transaction QSQLiteDriverNNo foi possvel finalizar a transacoUnable to commit transaction QSQLiteDriverVIncorrespondncia de contagem de parmetrosParameter count mismatch QSQLiteResult^No foi possvel fazer a ligao dos parametrosUnable to bind parameters QSQLiteResultJNo foi possvel executar a expressoUnable to execute statement QSQLiteResult<No foi possvel obter a linhaUnable to fetch row QSQLiteResultLNo foi possvel restaurar a expressoUnable to reset statement QSQLiteResult FundoBottom QScrollBarBorda esquerda Left edge QScrollBarLinha abaixo Line down QScrollBarLinha acimaLine up QScrollBar"Pgina para baixo Page down QScrollBar(Pgina para esquerda Page left QScrollBar&Pgina para direita Page right QScrollBar Pgina para cimaPage up QScrollBarPosioPosition QScrollBarBorda direita Right edge QScrollBar&Deslizar para baixo Scroll down QScrollBarDeslizar aqui Scroll here QScrollBar,Deslizar para esquerda Scroll left QScrollBar.Deslizar para a direita Scroll right QScrollBar$Deslizar para cima Scroll up QScrollBarTopoTop QScrollBar++ QShortcutAltAlt QShortcutAnteriorBack QShortcutBackspace Backspace QShortcutBacktabBacktab QShortcutBass Boost Bass Boost QShortcutBass Baixo Bass Down QShortcutBass CimaBass Up QShortcut ChamarCall QShortcutCaps Lock Caps Lock QShortcutCapsLockCapsLock QShortcutContexto1Context1 QShortcutContexto2Context2 QShortcutContexto3Context3 QShortcutContexto4Context4 QShortcutCtrlCtrl QShortcut DeleteDel QShortcut DeleteDelete QShortcut BaixoDown QShortcutEndEnd QShortcut EnterEnter QShortcutEscEsc QShortcut EscapeEscape QShortcutF%1F%1 QShortcutFavoritos Favorites QShortcutInverterFlip QShortcutSeguinteForward QShortcutDesligarHangup QShortcut AjudaHelp QShortcutHomeHome QShortcut Pgina Principal Home Page QShortcut InsertIns QShortcut InsertInsert QShortcutExecutar (0) Launch (0) QShortcutExecutar (1) Launch (1) QShortcutExecutar (2) Launch (2) QShortcutExecutar (3) Launch (3) QShortcutExecutar (4) Launch (4) QShortcutExecutar (5) Launch (5) QShortcutExecutar (6) Launch (6) QShortcutExecutar (7) Launch (7) QShortcutExecutar (8) Launch (8) QShortcutExecutar (9) Launch (9) QShortcutExecutar (A) Launch (A) QShortcutExecutar (B) Launch (B) QShortcutExecutar (C) Launch (C) QShortcutExecutar (D) Launch (D) QShortcutExecutar (E) Launch (E) QShortcutExecutar (F) Launch (F) QShortcut&Correio Electrnico Launch Mail QShortcut Mdia Launch Media QShortcutEsquerdaLeft QShortcutMdia Seguinte Media Next QShortcutTocar Mdia Media Play QShortcutMdia AnteriorMedia Previous QShortcutGravao Mdia Media Record QShortcutParar Mdia Media Stop QShortcutMenuMenu QShortcutMetaMeta QShortcutNoNo QShortcutNum LockNum Lock QShortcutNum LockNumLock QShortcutNumber Lock Number Lock QShortcutAbrir EndereoOpen URL QShortcutPage Down Page Down QShortcutPage UpPage Up QShortcut PausePause QShortcut PgDownPgDown QShortcutPgUpPgUp QShortcut PrintPrint QShortcutPrint Screen Print Screen QShortcutRefrescarRefresh QShortcut ReturnReturn QShortcutDireitaRight QShortcutScroll Lock Scroll Lock QShortcutScrollLock ScrollLock QShortcutProcurarSearch QShortcut SelectSelect QShortcut ShiftShift QShortcut SpaceSpace QShortcutHibernaoStandby QShortcut PararStop QShortcut SysReqSysReq QShortcutSystem RequestSystem Request QShortcutTabTab QShortcutTreble Baixo Treble Down QShortcutTreble Cima Treble Up QShortcutCimaUp QShortcutVolume Cima Volume Down QShortcutVolume Mute Volume Mute QShortcutVolume Baixo Volume Up QShortcutSimYes QShortcut"Pgina para baixo Page downQSlider(Pgina para esquerda Page leftQSlider&Pgina para direita Page rightQSlider Pgina para cimaPage upQSliderPosioPositionQSlider2Operao de rede expiradaNetwork operation timed outQSocks5SocketEngine MenosLessQSpinBoxMaisMoreQSpinBoxCancelarCancelQSql.Cancelar as alteraes?Cancel your edits?QSqlConfirmarConfirmQSql ApagarDeleteQSql(Apagar este registo?Delete this record?QSqlInserirInsertQSqlNoNoQSql*Gravar as alteraes? Save edits?QSqlActualizarUpdateQSqlSimYesQSqlLNo foi possvel estabelecer a ligaoUnable to open connection QTDSDriverRNo foi possvel utilizar a base de dadosUnable to use database QTDSDriver,Deslizar para Esquerda Scroll LeftQTabBar*Deslizar para Direita Scroll RightQTabBar&Copiar&Copy QTextControl Co&lar&Paste QTextControl&Refazer&Redo QTextControl&Desfazer&Undo QTextControl<Copiar &Localizao da LigaoCopy &Link Location QTextControlCor&tarCu&t QTextControl ApagarDelete QTextControl Seleccionar Tudo Select All QTextControl AbrirOpen QToolButtonPressionarPress QToolButton@Esta plataforma no suporta IPv6#This platform does not support IPv6 QUdpSocketRefazerRedo QUndoGroupDesfazerUndo QUndoGroup<vazio> QUndoModelRefazerRedo QUndoStackDesfazerUndo QUndoStackHInserir carcter de controlo Unicode Insert Unicode control characterQUnicodeControlCharacterMenuVLRE Incio de encaixe esquerda-para-direita$LRE Start of left-to-right embeddingQUnicodeControlCharacterMenu>LRM Marca esquerda-para-direitaLRM Left-to-right markQUnicodeControlCharacterMenu`LRO Incio de sobreposio esquerda-para-direita#LRO Start of left-to-right overrideQUnicodeControlCharacterMenu<PDF Formatao pop direccionalPDF Pop directional formattingQUnicodeControlCharacterMenuVRLE Incio de encaixe direita-para-esquerda$RLE Start of right-to-left embeddingQUnicodeControlCharacterMenu>RLM Marca direita-para-esquerdaRLM Right-to-left markQUnicodeControlCharacterMenu`RLO Incio de sobreposio direita-para-esquerda#RLO Start of right-to-left overrideQUnicodeControlCharacterMenu>ZWJ Ligador de comprimento zeroZWJ Zero width joinerQUnicodeControlCharacterMenuHZWNJ No-ligador de comprimento zeroZWNJ Zero width non-joinerQUnicodeControlCharacterMenu>ZWSP Espao de comprimento zeroZWSP Zero width spaceQUnicodeControlCharacterMenu FundoBottomQWebPageIgnorarIgnoreQWebPageIgnorar Ignore Grammar context menu itemIgnoreQWebPageBorda esquerda Left edgeQWebPage"Pgina para baixo Page downQWebPage(Pgina para esquerda Page leftQWebPage&Pgina para direita Page rightQWebPage Pgina para cimaPage upQWebPageRestaurarResetQWebPageBorda direita Right edgeQWebPage&Deslizar para baixo Scroll downQWebPageDeslizar aqui Scroll hereQWebPage,Deslizar para esquerda Scroll leftQWebPage.Deslizar para a direita Scroll rightQWebPage$Deslizar para cima Scroll upQWebPage PararStopQWebPageTopoTopQWebPageDesconhecidoUnknownQWebPageO Que Isto? What's This?QWhatsThisAction**QWidget&Terminar&FinishQWizard &Ajuda&HelpQWizard&Avanar >&Next >QWizard< &Recuar< &BackQWizardCancelarCancelQWizard AjudaHelpQWizard%1 - [%2] %1 - [%2] QWorkspace&Fechar&Close QWorkspace &Mover&Move QWorkspace&Restaurar&Restore QWorkspace&Tamanho&Size QWorkspace&Sair Sombra&Unshade QWorkspace FecharClose QWorkspaceMa&ximizar Ma&ximize QWorkspaceMi&nimizar Mi&nimize QWorkspaceMinimizarMinimize QWorkspaceRestaurar Baixo Restore Down QWorkspaceSombr&aSh&ade QWorkspace&Permanecer no &Topo Stay on &Top QWorkspacedeclarao de codificao ou declarao nica esperada ao ler a declarao XMLYencoding declaration or standalone declaration expected while reading the XML declarationQXmlTerro na declarao de uma entidade externa3error in the text declaration of an external entityQXml6erro ao analisar comentrio$error occurred while parsing commentQXml6erro ao analisar o contedo$error occurred while parsing contentQXmlberro ao analisar a definio de tipo de documento5error occurred while parsing document type definitionQXml2erro ao analisar elemento$error occurred while parsing elementQXml6erro ao analisar referncia&error occurred while parsing referenceQXml<erro disparado pelo consumidorerror triggered by consumerQXmlreferncia de entidade geral analisada externa no permitida na DTD;external parsed general entity reference not allowed in DTDQXmlreferncia de entidade geral analisada externa no permitida no valor do atributoGexternal parsed general entity reference not allowed in attribute valueQXmlrreferncia de entidade geral interna no permitida na DTD4internal general entity reference not allowed in DTDQXmlVnome invlido de instruo de processamento'invalid name for processing instructionQXml(uma letra esperadaletter is expectedQXmlTmais de uma definio de tipo de documento&more than one document type definitionQXml.no ocorreu nenhum errono error occurredQXml(entidades recursivasrecursive entitiesQXmlbdeclarao nica esperada ao ler a declarao XMLAstandalone declaration expected while reading the XML declarationQXml2m combinao de etiqueta tag mismatchQXml&carcter inesperadounexpected characterQXml4fim de ficheiro inesperadounexpected end of fileQXmlnreferncia de entidade no analisada em contexto errado*unparsed entity reference in wrong contextQXmlNverso esperada ao ler a declarao XML2version expected while reading the XML declarationQXmlDvalor errado para declarao nica&wrong value for standalone declarationQXmlnetemul-1.0/translation/netemul_ru.ts0000644000175000017500000032217111303443115017165 0ustar frostfrost MainWindow Ctrl+X Ctrl+D Ctrl+Alt+S Ctrl+Alt+P Exit Выход You want to go? Вы хотите выйти ? New Новый Create new network Создать новую сеть Packet designer... Конструктор пакетов... Open Открыть Open existing file Открыть существующую сеть Open... Открыть... Save Сохранить Save network Сохранить сеть Save as... Сохранить как... Save network as... Сохранить сеть как ... Close Закрыть Close current file Закрыть текущий файл Show grid Показывать сетку Delete Удалить Deleting object Удалить объект Programs Программы Programs installed on device Установленные программы Setting Настройки Setting... Настройки... Statistics Статистика Show scene statistics Показать статистику сцены Move Перемещение Move objects Перемещение объектов Cable Кабель Create connection Создать соединение Note Записки Insert text comment Вставить текстовую надпись Unibus Общая шина Add unibus Добавить общую шину Computer Компьютер Add computer Добавить Компьютер Hub Концентратор Add hub Добавить Концентратор Switch Коммутатор Add switch Добавить Коммутатор Router Маршрутизатор Add router Добавить Маршрутизатор Send Отправка Send data Отправить данные Execute scripts Выполнить сценарий Run existing scripts Запустить готовые сценарии Properties Свойства Show properties Показать свойства Packet desinger Конструктор пакетов Create user's packet Создать пользовательский пакет Edit Правка Ctrl+F1 <h2>NetEmul 0.8.5</h2><p>NetEmul is a program for the simulation of the computer network. <h2>NetEmul 0.8.5</h2><p>NetEmul программа для симуляции работы компьютерной сети. Routing Table Таблица маршрутизации Edit routing table Редактировать таблицу маршрутизации Ctrl+T About Qt File was modified Файл был изменен File was modified, do you want to save changes? Файл был изменен, вы хотите сохранить изменения? About NetEmul О программе NetEmul NetEmul Help Помощь Full help system program Полная справка о программе Netcards Интерфейсы Edit netcards Редактировать интерфейсы Stop Остановить Stop simulation Остановить симуляцию Programms Программы Programms installed on device Программы установленные на устройстве Arp table Arp таблица Settings... Настройки... Settings Настройки Show log Показать журнал Show device log file Показать журнал устройства About device Об устройстве Information about device Информация об устройстве Packet desinger... Конструктор пакетов... Print... Печать... Print user's network Напечать пользовательскую сеть Preview... Предпросмотр... Preview network berfore printing Предпросмотр сети перед печатью Configure VLAN... Настройка VLAN... Configure VLAN Настройка VLAN Set description... Задать описание... Set description of device Задать описание для устройства Show labels Показывать надписи Show labels on cables Показывать надписи на проводах File Файл View Вид Object Объект Service Сервис Scripts Скрипты Help Помощь Devices Устройства Controls Управление Ctrl+1 Ctrl+2 Ctrl+3 Ctrl+4 Ctrl+5 Ctrl+6 Ctrl+7 Ctrl+8 Ctrl+L Ctrl+L Log Log Save file as ... Сохранить файл как... Networks(*.net) Сети(*.net) Play Запустить Start simulation Запустить симуляцию Ctrl+I Do you really want to exit the program? Вы действительно хотите выйти? Ctrl+P Ctrl+Shift+A QObject LAN%1 RIP Connected Подключена Static Статическая Dinamic Динамическая Receive frames: %1 Получено кадров: %1 Receive packets: %1 Получено пакетов: %1 Send frames: %1 Отправлено кадров: %1 Send packets: %1 Отправлено пакетов: %1 The network is not working correctly Сеть работает не корректно The network found a matching IP address В сети обнаружено совпадение IP адресов The network found a match ip-address! В сети обнаружены совпадающие ip адреса! Received frames: %1 Получено кадров: %1 Received packets: %1 Получено пакетов: %1 Sent frames: %1 Отправлено кадров: %1 Sent packets: %1 Отправлено пакетов: %1 Ethernet, sender: %1 receiver: %2 Ethernet, отправитель: %1 получатель: %2 IP packet, sender: %1, receiver: %2 IP пакет, отправитель: %1, получатель: %2 UDP Message user UDP сообщение пользователя DHCP message DHCP сообщение None Неопределенно sender port: %1, receiver port: %2 порт отправителя: %1, порт получателя: %2 Add %1 Добавить %1 Delete Удалить Move Перемещение Error Ошибка The device can't transmit data! Устройство не может отправлять данные! Add cable Добавить кабель Add note Добавить комментарий IP packet, sender: %1, receiver: %2 TTL: %3 IP пакет, отправитель: %1, получатель: %2 TTL %3 Can't route packet! See adapter settings! Невозможно маршрутизировать пакет! Проверьте настройки! Can't set this gateway! See adapter settings! Невозможнов выставить шлюз! Проверьте настройки адаптеров! The file is not a NetEmul file. Этот файл не является файлом NetEmul. aboutWindow Dialog Настройки About program О программе About О программе Program for simulating computer networks. (C) 2009 Semenov Pavel and Omilaeva Anastasia Программа для симуляции компьютерной сети. (C) 2009 Семенов Павел и Омилаева Анастасия Authors Авторы <a href="https://sourceforge.net/projects/netemul">Home Page</a><br><br> Semenov Pavel - Project admin. Developer.<br> <br> Omilaeva Anastasia - Developer. <a href="https://sourceforge.net/projects/netemul">Домашняя страница</a><br><br> Семенов павел - Администратор проекта, Разработчик.<br> <br> Омилаева Анастасия - Разработчик. Thanks to Благодарности Konstantin Andreev - Author of the idea and creator of the icons, Arina Shelest - Author of the logotype. Lisandro Damián Nicanor Pérez Meyer Márcio Moraes Константин Андреев - автор идеи проекта, автор иконок, Арина Шелест - автор логотипа программы. Lisandro Damián Nicanor Pérez Meyer Márcio Moraes Konstantin Andreev - Author of the idea and creator of the icons, Lisandro Damián Nicanor Pérez Meyer Márcio Moraes Константин Андреев - Автор идеи проекта и создатель иконок, Lisandro Damián Nicanor Pérez Meyer Márcio Moraes Translation Перевод Семенов Павел - Русский Márcio Moraes - Português brasileiro Lisandro Damián Nicanor Pérez Meyer - Español Close Закрыть adapterProperty Netcard Интерфейс Netcard name: Имя адаптера: Mac-address: Мас-адрес: Ip-address: Ip-адрес: Mask: Маска: Receive settings automatically Получать настройки автоматически Add Добавить Delete Удалить Reset statistics Сбросить статистику Error Ошибка First, remove the cable! Сначала извлеките кабель! At least a netcard must exist Должен быть хотя бы один адаптер Must be at least one netcard Должен остаться хотя бы один адаптер boxChip LAN%1 computer eth%1 <b>Computer</b><!--You can use HTML.--> <b>Компьютер</b><!--Вы можете использовать HTML.--> Computer Компьютер computerProperty Proreties Свойства Properties Свойства Default gateway: Шлюз по умолчанию: Enable routing Включить маршрутизацию Description: Описание: connectDilog Specify the initial preferences Укажите начальные настройки Select the connected interfaces: Выберите соединяемые интерфейсы: Connect Соединить Cancel Отмена designerDialog Main Основное Frame Кадр Ip Ip Arp Arp Tcp Tcp Udp Ok Ок Cancel Отмена Packet designer Конструктор пакетов Choose interface: Укажите интерфейс: Count: Количество: Sender mac: Mac отправителя: Receiver mac: Mac получателя: Sender ip: Ip отправителя: Receiver ip: Ip получателя: Response Ответ Request Запрос Sender port: Порт отправителя: Receiver port: Порт получателя: Sequence number: Последовательный номер: Ack number: Подтвержденый номер: Flags Флаги SYN ACK RST FIN deviceNoteDialog Dialog Настройки Description Описание Description: Описание: Ok Ок Cancel Отмена dhcpClientProgramm DHCP client DHCP клиент dhcpClientProperty DHCP client property Свойства DHCP-клиента Choose interfaces which must be under DHCP control: Выберите интерфейсы, которые должны быть под контролем DHCP: Choose interfaces which must be under DHCP control: Укажите интерфейсы которые должны находиться под контролем DHCP: Choose interfaces which must<br> be under DHCP control: Укажите интерфейсы, <br> контролируемые DHCP: Waiting time for offers<br> from dhcp-server Время ожидания <br>предложения dhcp-сервера Ok Ок Cancel Отмена dhcpServerModel Mac-address Мас-адрес Ip-address Ip-адрес Mask Маска Gateway Шлюз Time Время dhcpServerProgramm DHCP server DHCP сервер Warning Внимание Your DHCP server isn't configured. DHCP сервер не настроен. Wrong range Ошибочный диапазон You enter a wrong range of ip. Вы ввели ошибочный диапазон ip. dhcpServerProperty From От to до Mask Маска Gateway Шлюз Mac Мас Ip Ip Wrong range Ошибочный диапазон You have entered a wrong IP range. Вы указали неверный диапазон IP адресов. dhspServerProperty DHCP server's properties Натройки DHCP сервера Choose interface: Укажите интерфейс: Static: Статические: Add Добавить Delete Удалить Lease term: Срок аренды: s сек Dynamic: Динамические: Ip address Ip адрес The field for ip-address. Поле ip адреса. From: От: to: до: Mask: Маска: Gateway: Шлюз: Wating time for request from dhcp-client: Время ожидания ответа dhcp-клиента: Ok Ок Cancel Отмена dialogTemplate Cancel Отмена Ok Ок Apply Применить hubChip LAN%1 hubDevice <b>Hub</b><!--You can use HTML.--> <b>Концентратор</b><!--Вы можете использовать HTML.--> Hub Концентратор hubProperty Number of ports: Количество портов: Manage via SNMP: Управляемый через SNMP: Properies Настройки Properties Свойства Mac-address: Мас-адрес: Ip-address: Ip-адрес: Mask: Маска: Reset statistics Сбросить статистику Description: Описание: Number of collisions: %1 Количество коллизий: %1 Error Ошибка First, remove the cables! Сначала отсоедините кабеля от устройства! installDialog RIP Dialog Настройки Programms Программы Programs Программы Available programs: Доступные программы: DHCP client DHCP клиент DHCP server DHCP сервер Install Установить Close Закрыть Error Ошибка Program already installed. Программа уже установлена. interfaceDialog Add adapter Добавить адаптер Add Добавить Add netcard Добавить сетевую карту Cancel Отмена Speed: 10/100 Mbit/s Скорость: 10/100 Мбит/с Speed: 10/100/1000 Mbit/s Скорость: 10/100/1000 Мбит/с Speed: 10/100 Мбит/с Скорость : 10/100 Мбит/с logDialog Routing has been <b>enabled</b> Маршрутизация была <b>включена</b> Routing has been <b>disabled</b> Маршрутизация была <b>выключена</b> send посылаю receive получаю sent послал received получил Type: Тип: DHCP Message, Type: %1 DHCP сообщение, тип: %1 Xid: %1, Yiaddr: %2 Siaddr: %1, Chaddr: %2 ISN %1, ACK %2 flags: No flags флаги: No flags flags: Ack флаги: ACK flags: SYN флаги: SYN flags: SYN, ACK флаги: SYN, ACK flags: Fin флаги: FIN request запрос response ответ search ищет found нашел ARP-%1: sender IP address: %1 IP адрес отправителя: %1 sender MAC address: %1 MAC адрес отправителя: %1 target IP address: %1 IP адрес назначения: %1 target MAC address: %1 MAC адрес назначения: %1 Count: %1 Количество: %1 ip-packet: <b> ip-пакет: <b> arp-request: <b> arp-запрос: <b> search <b> ищет <b> arp-response: <b> arp-ответ <b> found <b> нашел <b> Form Show mac Показывать mac-адреса Time Время All Все Arp Arp TCP UDP UDP Ip Ip Clear Очистить myCanvas Opening file for reading is impossible Невозможно открыть файл для чтения Error Ошибка Outdated version of the file, file can't be opened Устаревшая версия файла сохранения, файл не может быть открыт Scene opened from %1 Сцена открыта из файла %1 Scene saved in %1 Сцена сохранена в файл %1 Opening file for writing is impossible %1 Невозможно открыть файл для записи %1 Opening file for writing is impossible Невозможно открыть файл для записи Opening file for writeng is impossible Невозможно открыть файл для записи The device can't transmit data! Устройство не может отправлять данные! The outdated version of the file, file can't be opened Устаревшая версия файла сохранения. Файл не может быть открыт Commentary Комментарий programmDialog Programms Программы Installed programms Установленные программы Programs Программы Installed programs Установленные программы Add Добавить Settings Настройки Delete Удалить Ok Ок Cancel Отмена ripProgramm RIP ripProperty Rip programm property Настройки RIP Rip program property Настройки RIP Split horizon: Расщипление горизонтов: Disable Выключено Enable Включено With poison reverse С отравлением обратных путей Turn On/Off triggered updates Включить/выключить триггерное обновление Ok Ок Cancel Отмена routeEditor Routing table Таблица маршртизации Destination: Адрес назначения: Mask: Маска: Gateway: Шлюз: Interface: Интерфейс: Metric: Метрика: Add Добавить Delete Удалить Close Закрыть routeModel Destination Адрес назначения Mask Маска Gateway Шлюз Interface Интерфейс Metric Метрика Source Источник Connected Подключена routerDevice LAN%1 <b>Router</b><!--You can use HTML.--> <b>Маршрутизатор</b><!--Вы можете использовать HTML.--> Error Ошибка To change the number of ports, disconnect all cables! Для изменения количества портов, сначала отключите провода! Router Маршрутизатор routerProperty Properies Свойства Properties Свойства Number of ports: Количество портов: Enable routing Включить маршрутизацию Description: Описание: sendDialog KB Sending Отправка Cancel Отмена Size KB Размер в килобайтах Broadcast Широковещательный Next Далее Choose protocol: Выберите протокол: UDP TCP Select the network card receiver Укажите интерфейс приемника Send Отправка settingDialog Dialog Настройки Settings Настройки General Главные Computer Компьютер Hub Концентратор Switch Коммутатор Router Маршрутизатор Lifetime arp-entries: Время жизни arp-записей: s сек Netcard Интерфейсы Tcp Animation speed: Скорость анимации: Language: Язык приложения: English Английский Russian Русский Brazillian Portuguese Бразильский португальский Spanish Испанский Turn on/off OpenGL Включить/Выключить OpenGL Autosave Автосохранение Interval: Интервал: Nubmer of interfaces by default: Количество интерфейсов по умолчанию: 1 2 3 4 5 6 Number of ports by default Количество портов по умолчанию 8 12 24 48 Number of ports by default: Количество портов по умолчанию: 16 32 Switching table's records lifetime: Время жизни записей таблицы коммутации: Lifetime records of table switching Время жизни записей таблицы коммутации 7 9 Expectation time for arp-responce Время ожидания arp-ответа Number of repeat sendings: Количество повторных отправок: Waiting confirmation time: Время ожидания подтверждения соединения: Default По умолчанию Apply Применить Ok Ок Cancel Отмена smartDevice eth%1 Error Ошибка Such a program already installed. Такая программа уже установлена. Routing Table Таблица маршрутизации staticsDialog Statistics Статистика Devices: Устройства: TextLabel Traffic: Трафик: Close Закрыть statisticsScene Number of devices: %1 Количество устройств: %1 Number of computers: %1 Количество компьютеров: %1 Number of hubs: %1 Количество концентраторов: %1 Number of switchs: %1 Количество коммутаторов: %1 Number of routers: %1 Количество роутеров: %1 Number of cables: %1 Количество проводов: %1 Send packets: %1 Отправлено пакетов: %1 switchChip LAN%1 switchDevice Table switching Таблица коммутации <b>Switch</b><!--You can use HTML.--> <b>Коммутатор</b><!--Вы можете использовать HTML.--> Switch Коммутатор Switching table Таблица коммутации switchModel Mac-address Мас-адрес Port Порт Record type Тип записи TTL Время жизни LAN%1 switchProperty Number of ports: Количество портов: Managed via SNMP: Управляемый через SNMP: Properies Свойства Properties Свойства Manageable Управляемый Mac-address: Мас-адрес: Ip-address: Ip-адрес: Mask: Маска: Reset statistics Сбросить статистику Description: Описание: Error Ошибка First, remove the cables! Сначала отсоедините кабеля от устройства! tableArp Arp table Arp таблица Mac-address Мас-адрес Ip-address Ip-адрес Record type Тип записи Netcard name Имя адаптера TTL Время жизни Mac-address: Мас-адрес: Ip-address: Ip-адрес: Netcard Адапер Add Добавить Delete Удалить Close Закрыть tableSwitch LAN%1 Table switching Таблица коммутации Switching table Таблица коммутации Mac-address: Мас-адрес: HH:HH:HH:HH:HH:HH;_ 00:00:00:00:00:00 Port: Порт: Add Добавить Delete Удалить Close Закрыть tcpSocket Error Ошибка TCP: Data transmition error TCP: Ошибка передачи данных testDialog Script finished correctly Скрипт завершился корректно Script not correctly finished Скрипт завершился не корректно Choose a directory with scripts Выберите каталог со скриптами Script finished is not correctly Скрипт завершился не корректно Scripts Скрипты Start Запустить Cancel Отмена Set path Задать путь All Все Click start Нажмите старт virtualNetwork LAN%1 virtualNetworkDialog Dialog Настройки netemul-1.0/netemul.qrc0000644000175000017500000000272611277114036014270 0ustar frostfrost images/arrow.png images/cable.png images/sharebus.png images/back.png images/edit_add.png images/edit_remove.png images/refresh.png images/left_right.png images/ok.png images/redo.png images/pause.png images/play.png images/router.png images/switch.png images/table_arp.png images/table_route.png images/properties.png images/setting.png images/network_nic.png images/note.png images/install_apps.png images/computer.png images/not.png images/hub.png images/log.png images/clean.png images/question.png images/tcp.png images/undo.png images/cogwheel.png images/NetEmul.png images/fileload.png images/filesave.png images/print.png images/print_preview.png images/description.png netemul-1.0/src/0000755000175000017500000000000011305026151012660 5ustar frostfrostnetemul-1.0/src/graphics/0000755000175000017500000000000011305026151014460 5ustar frostfrostnetemul-1.0/src/graphics/insertrect.cpp0000644000175000017500000000277311252300033017352 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "insertrect.h" #include #include insertRect::insertRect() { setPos( 0, -50 ); setPen(QPen(Qt::red)); setBrush(QColor( 128 , 0 , 0 , 64)); setZValue(1000); setRect( -20 , -20 , 40 ,40); } void insertRect::moving(QPointF p) { if ( collidingItems().isEmpty() ) { setPen(QPen(Qt::blue)); setBrush( QColor( 0 , 0 , 128 , 64) ); } else { setPen(QPen(Qt::red)); setBrush( QColor( 128 , 0 , 0 , 64)); } setPos(p); } netemul-1.0/src/graphics/sendellipse.h0000644000175000017500000000271511252300033017140 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef SENDELLIPSE_H #define SENDELLIPSE_H #include class sendEllipse : public QGraphicsEllipseItem { public: enum { noSendItem = 0 , oneSendItem = 1 }; sendEllipse(); void chooseOneDevice(); void moving(QPointF p); void hideItem() { setPos(-100,-100); } bool hasUnderDevice() { return collidingItems().count(); } QGraphicsItem* underDevice() { return collidingItems().first(); } }; #endif // SENDELLIPSE_H netemul-1.0/src/graphics/cabletextitem.h0000644000175000017500000000113411303325155017466 0ustar frostfrost#ifndef CABLETEXTITEM_H #define CABLETEXTITEM_H #include class cableTextItem : public QGraphicsTextItem { Q_OBJECT public: enum { Type = UserType + 4 }; int type() const { return Type; } cableTextItem(QGraphicsItem *parent = 0 , QGraphicsScene *scene = 0); ~cableTextItem() { } void updatePosition(); protected: void paint(QPainter *painter,const QStyleOptionGraphicsItem *option,QWidget *widget); public: bool isStart() const { return myStart; } void setStart(bool b) { myStart = b; } private: bool myStart; }; #endif // CABLETEXTITEM_H netemul-1.0/src/graphics/textitem.cpp0000644000175000017500000000553411252300033017031 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "textitem.h" #include /*! Передает параметры предку и делает надпись перемещаемой и выделяемой. */ textItem::textItem(QPointF p, QGraphicsItem *parent /* = 0 */ , QGraphicsScene *scene /* = 0 */) : QGraphicsTextItem(parent,scene) { setPos(p); setTextInteractionFlags(Qt::TextEditorInteraction); setZValue(1000.0); setFlag(QGraphicsItem::ItemIsMovable); setFlag(QGraphicsItem::ItemIsSelectable); QFont s("Times", 12 , QFont::Bold); setFont(s); } //------------------------------------------------------------------------- /*! Происходит при потере элементом фокуса. */ void textItem::focusOutEvent(QFocusEvent *event) { setTextInteractionFlags(Qt::NoTextInteraction); // Запрещаем редактировать emit lostFocus(this); // Сообщаем сцене QGraphicsTextItem::focusOutEvent(event); // Передаем событие предку. } //--------------------------------------------------------------------------- /*! Происходит при двойном щелчке по элементу. */ void textItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) { if (textInteractionFlags() == Qt::NoTextInteraction) setTextInteractionFlags(Qt::TextEditorInteraction); QGraphicsTextItem::mouseDoubleClickEvent(event); // Передаем предку. } //---------------------------------------------------------------------------- /*! */ void textItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget) { painter->setBrush(Qt::yellow); painter->drawRoundedRect(boundingRect(), 5, 5); QGraphicsTextItem::paint(painter,option,widget); } //---------------------------------------------------------------------------- netemul-1.0/src/graphics/selectrect.cpp0000644000175000017500000000230311252300033017312 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "selectrect.h" #include #include selectRect::selectRect() { setPen(QPen(Qt::blue)); setBrush(QColor( 0 , 0 ,128 , 64)); setZValue(1000); setPos( 0,0 ); } netemul-1.0/src/graphics/device.cpp0000644000175000017500000001424011303253545016433 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include #include #include #include #include #include "mycanvas.h" #include "routerdevice.h" #include "device.h" #include "computer.h" #include "hubdevice.h" #include "switchdevice.h" #include "cabledev.h" device::device(int t) { createImpl(t); setToolTip( impl->note() ); } device::device(QDataStream &stream) { QPointF p; int tp; stream >> p; setPos(p); stream >> tp; createImpl(tp); impl->read(stream); setToolTip( impl->note() ); } device::device(sceneXmlReader &stream) { QPointF p; int tp = stream.attributes().value("type").toString().toInt(); createImpl(tp); while ( !stream.atEnd() ) { stream.readNext(); if ( stream.isEndElement() ) break; if ( stream.name() == "x" ) p.setX( stream.readElementText().toDouble() ); else if ( stream.name() == "y" ) p.setY( stream.readElementText().toDouble() ); else if ( stream.name() == "impl" ) impl->readXml(stream); } setPos(p); setToolTip( impl->note() ); } void device::createImpl(int n) { devRect = QRect(device::rectDevX,device::rectDevY,device::rectDevWidth,device::rectDevHeight); pixmapRect = devRect.adjusted(3,3,-3,-3); setFlag(QGraphicsItem::ItemIsMovable, true); // Устройство можно двигать setFlag(QGraphicsItem::ItemIsSelectable, true); // И выделять switch (n) { case compDev : impl = new computer; break; case hubDev : impl = new hubDevice; break; case switchDev : impl = new switchDevice; break; case routerDev : impl = new routerDevice; break; default: break; } impl->setVisualizator(this); } device::~device() { delete impl; } void device::paint(QPainter *painter,const QStyleOptionGraphicsItem *option,QWidget *widget) { Q_UNUSED(option); // Пока не используем Q_UNUSED(widget); // Эти параметры QList collides = collidingItems(); foreach ( QGraphicsItem* item , collides) if ( item->type() != device::Type ) collides.removeOne(item); QLinearGradient tempGrad(device::rectDevX , device::rectDevY ,-device::rectDevX,-device::rectDevY); tempGrad.setColorAt(0,Qt::white); if (isSelected()) { if (!collides.isEmpty()) tempGrad.setColorAt(1,Qt::red); else tempGrad.setColorAt(1,Qt::blue); painter->setPen(Qt::darkBlue); } else { painter->setPen(Qt::black); // А иначе черный tempGrad.setColorAt(1,Qt::white); } painter->setBrush(QBrush(tempGrad)); painter->drawRoundedRect(devRect,5,5); painter->drawPixmap(pixmapRect,QPixmap(impl->pixmapName())); // Потом картинку if ( isConnect() ) { if ( impl->isReady() ) painter->setBrush(Qt::green); else painter->setBrush(Qt::yellow); } else { painter->setBrush(Qt::red); } painter->drawEllipse(-17,-17,6,6); int traffic = impl->trafficDigit(); if ( !traffic ) return; traffic = traffic/5+1; traffic = qMin( traffic , 40 ); painter->setPen(QPen(Qt::green,3)); painter->drawLine(-20, 19, -20+traffic, 19); } void device::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { //if ( scene()->selectedItems().count() ) return; myCanvas *canva = qobject_cast(scene()); canva->turnToMove(); scene()->clearSelection(); // Снять все выделения на сцене setSelected(true); // Выделить текущуе устройство if ( !popUpMenu->exec(event->screenPos()) ) scene()->clearSelection(); // Запустить контекстное меню в текущей позиции } void device::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) { Q_UNUSED(event); myCanvas *canva = qobject_cast(scene()); canva->turnToMove(); dialog(); scene()->clearSelection(); } //---------------------------------------------------------------- void device::writeXml(sceneXmlWriter &stream) const { stream.writeStartElement("device"); stream.writeAttribute("type" , QString::number(impl->type()) ); stream.writeStartElement("x"); stream.writeCharacters( QString::number( pos().x() ) ); stream.writeEndElement(); stream.writeStartElement("y"); stream.writeCharacters( QString::number( pos().y() ) ); stream.writeEndElement(); stream.writeStartElement("impl"); impl->writeXml(stream); stream.writeEndElement(); stream.writeEndElement(); } void device::addConnection(const QString &port, cableDev *c) { myCableList << c; impl->addConnection(port,c); } void device::deleteConnection(cableDev *c) { myCableList.removeOne(c); impl->deleteConnection(c); update(); } void device::updateCables() { foreach ( cableDev *i , myCableList ) i->updatePosition(); } bool device::isConnectDevices(device *s , device *e) { foreach( cableDev *i , s->myCableList ) foreach ( cableDev *j , e->myCableList ) if ( i == j ) return true; return false; } void device::onImplChange() { myFeatures = impl->featuresList(); } netemul-1.0/src/graphics/sendellipse.cpp0000644000175000017500000000261211252300033017467 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "sendellipse.h" #include #include sendEllipse::sendEllipse() { setPen(QPen(Qt::lightGray)); setBrush(QColor(255,128,0,128)); setPos( 0 , -100); setZValue(1000); setRect(-10,-10,20,20); } void sendEllipse::chooseOneDevice() { setPen(QPen(Qt::green)); setBrush(QColor(0,128,0,128)); } void sendEllipse::moving(QPointF p) { setPos(p); } netemul-1.0/src/graphics/selectrect.h0000644000175000017500000000225311252300033016763 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef SELECTRECT_H #define SELECTRECT_H #include class selectRect : public QGraphicsRectItem { public: selectRect(); }; #endif // SELECTRECT_H netemul-1.0/src/graphics/cabletextitem.cpp0000644000175000017500000000157611303325155020033 0ustar frostfrost#include "cabletextitem.h" #include "cabledev.h" #include cableTextItem::cableTextItem(QGraphicsItem *parent /*= 0*/ , QGraphicsScene *scene /*= 0*/) : QGraphicsTextItem(parent,scene) { setZValue(1005); setFont(QFont("Times", 8)); } void cableTextItem::paint(QPainter *painter,const QStyleOptionGraphicsItem *option,QWidget *widget) { updatePosition(); painter->setBrush( QBrush( QColor(255,255,255,224) ) ); painter->drawRoundedRect(boundingRect(), 5, 5); QGraphicsTextItem::paint(painter,option,widget); } void cableTextItem::updatePosition() { QPointF p; cableDev *cable = qgraphicsitem_cast(parentItem()); if ( myStart ) p = cable->line().pointAt(35/cable->line().length()); else p = cable->line().pointAt(1-35/cable->line().length()); setPos( p.x() - boundingRect().width()/2 , p.y() - boundingRect().height()/2 ); } netemul-1.0/src/graphics/cabledev.h0000644000175000017500000000722011303325155016403 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef CABLEDEV_H #define CABLEDEV_H #include #include #include class device; class devicePort; class cableTextItem; static const qreal NORMAL_SIZE = 2.5; static const qreal COLLISION_SIZE = 5.0; static const int MINIMUM_DEAD = 3; static const int TIME_BEFORE_DEAD = 17; static const int PERCENT_DEAD = 25; struct bitStream { QByteArray data; QBrush color; qreal pos; qreal size; }; class cableDev : public QGraphicsLineItem { public: enum { Type = UserType + 1 }; enum { normal = 3 , broadcast = 4 }; int type() const { return Type; } QRectF boundingRect() const { return QRectF(line().p1(),line().p2()).normalized(); //.adjusted(-5,-5,5,5); } bool isCollisionCable() const { return isCollision; } cableDev(device *start,device *end,QString sp, QString ep,int s = 5); ~cableDev(); void updatePosition(); // Обновление прорисовки void motion(); bool isBusy() const { return fromStartQueue.count() || fromEndQueue.count(); } bool isBusy(const devicePort *d); void insertInPort(devicePort *p); int isShared() const { return myShared; } void input(QByteArray b,devicePort *cur);; void setChecked(bool c) { myChecked = c; update(); } bool isChecked() const { return myChecked; } void setShowLabel(bool b); void setFastInfo(bool b, device *dev, QString info); void deleteConnect(); QPointF startLabelPoint() const { return line().pointAt(0.3); } QPointF endLabelPoint() const { return line().pointAt(0.7); } void startCollision(); void registerCable(); void unregisterCable(); public: device* start() { return myStartDev; } device* end() { return myEndDev; } devicePort* startPort() { return myStartPort; } devicePort* endPort() { return myEndPort; } QString startSocketName() const; QString endSocketName() const; private: QString myStartName; QString myEndName; device *myStartDev; //!< Указатель на устройтсво начала. device *myEndDev; //!< Указатель на устройство конца. devicePort *myStartPort; devicePort *myEndPort; protected: void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); // Как будем рисовать private: void killRandomPackets(QQueue stream); void killCurrentPackets(); bool isCollision; bool myChecked; bool myShared; QQueue fromStartQueue; QQueue fromEndQueue; cableTextItem *textStart; cableTextItem *textEnd; int mySpeed; }; #endif // CABLEDEV_H netemul-1.0/src/graphics/insertrect.h0000644000175000017500000000246211252300033017012 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef INSERTRECT_H #define INSERTRECT_H #include class insertRect : public QGraphicsRectItem { public: insertRect(); void moving(QPointF p); bool isReadyInsert() { return collidingItems().isEmpty(); } void hideItem() { setPos(-100,-100); } }; #endif // INSERTRECT_H netemul-1.0/src/graphics/device.h0000644000175000017500000001300011303041536016064 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef DEVICE_H #define DEVICE_H #include #include #include #include "deviceimpl.h" #include "statistics.h" #include "visualizable.h" class cableDev; class logDialog; /*! Устройство, это основная единица с которой мы имеем дело в программе, хотя и являеться абстрактным классом оно уже подерживает не малую функциональность. Класс содержит несколько виртуальных функций, только переопределив которые, мы сможем его унаследовать. */ class device : public QGraphicsItem , public visualizable { public: enum sizeDevices { rectDevX = -23 , rectDevY = -23 , rectDevWidth = 46 , rectDevHeight = 46 }; enum { noDev = 0 , busDev = 2 ,compDev = 3 , hubDev = 4 , switchDev = 5 , routerDev = 7 }; enum { Type = UserType + 2 }; int type() const { return Type; } int deviceType() const { return impl->type(); } QRect devRect; QRect pixmapRect; device(int t); device(QDataStream &stream); device(sceneXmlReader &stream); ~device(); void paint(QPainter *painter,const QStyleOptionGraphicsItem *option,QWidget *widget); QRectF boundingRect() const { return devRect; } bool isBusy() const { return impl->isBusy(); } void updateCables(); void setMenu(QMenu *context) { popUpMenu = context; } QString tableName() { return impl->tableName(); } QString socketName(const cableDev *c) const { return impl->socketName(c); } QString deviceName() const { return impl->deviceName(); } QString deviceCommandName() const { return impl->deviceCommandName(); } bool isSmart() const { return impl->isSmart(); } bool isConnect() const { return myCableList.count(); } bool isManagedVirtualNetwork() const { return impl->isManagedVirtualNetwork(); } void dialog() { impl->dialog(); } void tableDialog() const { impl->tableDialog(); } void adapterDialog() const { impl->adapterDialog(); } void programmsDialog() const { impl->programmsDialog(); } void arpDialog() const { impl->arpDialog(); } void showLogDialog(logDialog *log) const { impl->showLogDialog(log); } void showDesignerDialog() const { impl->showDesignerDialog(); } void showDeviceNoteDialog() { impl->showDeviceNoteDialog(); setToolTip( impl->note() ); } void showVirtualNetworkDialog() const { impl->showVirtualNetworkDialog(); } bool isCanSend() const { return impl->isCanSend() && isConnect() ; } bool isShared() const { return impl->isShared(); } bool isConnectSocket(const QString &str) const { return impl->isConnectSocket(str); } QIcon isConnectSocketIcon(const QString &str) const { return impl->isConnectSocketIcon(str); } QStringList sockets() const { return impl->sockets(); } void secondTimerEvent() { impl->secondTimerEvent(); } void deciSecondTimerEvent() { impl->deciSecondTimerEvent(); } deviceImpl* contentDevice() { return impl; } void addConnection(const QString &port, cableDev *c); void deleteConnection(cableDev *c); void sendMessage(const QString &a ,int size , int pr) { impl->sendMessage(a,size,pr); } statistics deviceStatistics() const { return impl->deviceStatistics(); } void detectCollision() { impl->detectCollision(); } static bool isConnectDevices(device *s, device *e); QList cables() const { return myCableList; } bool hasTable() const { return impl->hasTable(); } void writeXml(sceneXmlWriter &stream) const; void onImplChange(); private: void createImpl(int n); deviceImpl *impl; QMenu *popUpMenu; //!< Всплывающее меню для устройства QStringList myFeatures; protected: QList myCableList; //!< Список всех подключеных проводов. friend QDataStream& operator<<(QDataStream &stream,const device &dev); void contextMenuEvent(QGraphicsSceneContextMenuEvent *event); // Событие контекстного меню void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event); }; //-------------------------------------------------------------------- /*! Записывает устройство в поток. */ inline QDataStream& operator<<(QDataStream &stream,const device &dev) { stream << dev.pos(); dev.impl->write(stream); return stream; } //-------------------------------------------------------------------- #endif // DEVICE_H netemul-1.0/src/graphics/graphics.pri0000644000175000017500000000072011303041536016775 0ustar frostfrostHEADERS += src/graphics/insertrect.h \ src/graphics/sendellipse.h \ src/graphics/selectrect.h \ src/graphics/cabledev.h \ src/graphics/device.h \ src/graphics/textitem.h \ src/graphics/cabletextitem.h SOURCES += src/graphics/insertrect.cpp \ src/graphics/sendellipse.cpp \ src/graphics/selectrect.cpp \ src/graphics/cabledev.cpp \ src/graphics/device.cpp \ src/graphics/textitem.cpp \ src/graphics/cabletextitem.cpp netemul-1.0/src/graphics/cabledev.cpp0000644000175000017500000002032511303325155016737 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "cabledev.h" #include "device.h" #include "deviceport.h" #include "appsetting.h" #include "cabletextitem.h" cableDev::cableDev(device *start,device *end,QString sp, QString ep,int s) { mySpeed = s; // Скорость кабеля. myStartPort = 0; myEndPort = 0; myChecked = false; isCollision = false; myStartDev = start; myEndDev = end; myStartName = sp; myEndName = ep; if ( myStartDev->isShared() || myEndDev->isShared() ) myShared = true; setFlag(QGraphicsItem::ItemIsSelectable, true); // Делаем наш кабель способным к выделению setZValue(-1000.0); // Кидаем его на самый-самый задний план textStart = new cableTextItem(this, this->scene() ); textStart->setStart(true); textStart->setPlainText( myStartName.mid(3) ); textStart->setVisible( appSetting::isShowLabel() ); textEnd = new cableTextItem(this , this->scene() ); textEnd->setStart(false); textEnd->setPlainText( myEndName.mid(3) ); textEnd->setVisible( appSetting::isShowLabel() ); } cableDev::~cableDev() { qDeleteAll(fromStartQueue); fromStartQueue.clear(); qDeleteAll(fromEndQueue); fromEndQueue.clear(); } /*! Отрисовывает кабель. */ void cableDev::paint(QPainter *painter,const QStyleOptionGraphicsItem *option,QWidget *widget) { Q_UNUSED(option); Q_UNUSED(widget); painter->setPen(QPen(Qt::gray,5)); QLineF centerLine(myStartDev->pos(), myEndDev->pos()); setLine(centerLine); // И мы её и ставим painter->drawLine(line()); // А потом рисуем заново if ( isSelected() ) painter->setPen(QPen(Qt::blue,1.7)); // Если выделен рисуем синим else if ( isCollision ) painter->setPen(QPen(Qt::red,1.7)); else if ( myChecked ) painter->setPen(QPen(Qt::magenta,1.7)); else painter->setPen(QPen(Qt::black,1.7)); // Иначе черным painter->drawLine(line()); painter->setPen(QPen(Qt::black,1)); //painter->setBrush( Qt::NoBrush ); //painter->drawRect( boundingRect() ); foreach ( bitStream *i , fromEndQueue ) { painter->setBrush(i->color); painter->drawEllipse( line().pointAt( i->pos ) ,i->size ,i->size); } foreach ( bitStream *i , fromStartQueue ) { painter->setBrush(i->color); painter->drawEllipse( line().pointAt( i->pos ) ,i->size ,i->size); } } //-------------------------------------------------------------------- void cableDev::updatePosition() { setLine( QLineF(myStartDev->pos(), myEndDev->pos()) ); update(boundingRect()); textStart->updatePosition(); textEnd->updatePosition(); } /*! Принимает кадр от устройства отправителя и начинает его транспартировку. @param b - поток байт(уже в таком виде нам передается кадр). @param cur - устройство отправитель( для определения откуда начинаем рисовать ). */ void cableDev::input(QByteArray b,devicePort *cur ) { bitStream *t = new bitStream; qint8 v = b.at(0); switch (v) { case normal: t->color = Qt::red; break; case broadcast: t->color = Qt::yellow; break; default: t->color = Qt::green; break; } t->size = NORMAL_SIZE; t->data = b; if ( cur == myStartPort ) { fromStartQueue.enqueue(t); t->pos = 0.0; } else { fromEndQueue.enqueue(t); t->pos = 1.0; } } //--------------------------------------------------------- /*! * Перемещает все кадры на проводе на один шаг в нужном направлении. */ void cableDev::motion() { static int n = 0; if ( isCollision && ++n >= TIME_BEFORE_DEAD ) { killCurrentPackets(); n = 0; } qreal speed = mySpeed / line().length(); speed += (qrand()%5)*(speed/10) - (qrand()%5)*(speed/10); foreach ( bitStream *i , fromStartQueue ) if ( (i->pos += speed) > 1.0 ) { bitStream *t = fromStartQueue.dequeue(); if (t->color != Qt::blue) endPort()->receiveFrame( t->data ); delete t; } foreach ( bitStream *i , fromEndQueue ) if ( (i->pos -= speed) <= 0.0 ) { bitStream *t = fromEndQueue.dequeue(); if ( t->color != Qt::blue ) startPort()->receiveFrame( t->data ); delete t; } if ( myShared ) { if ( isCollision && fromEndQueue.isEmpty() && fromStartQueue.isEmpty() ) isCollision = false; if ( !isCollision ) { if ( !fromStartQueue.isEmpty() && !fromEndQueue.isEmpty() && fromStartQueue.head()->pos > fromEndQueue.head()->pos ) { fromStartQueue.head()->color = fromEndQueue.head()->color = Qt::blue; fromStartQueue.head()->size = fromEndQueue.head()->size = COLLISION_SIZE; startCollision(); if ( endPort()->isShared() ) end()->detectCollision(); if ( startPort()->isShared() ) start()->detectCollision(); } } } update(); } //----------------------------------------------------------- QString cableDev::startSocketName() const { return myStartDev->socketName(this); } QString cableDev::endSocketName() const { return myEndDev->socketName(this); } void cableDev::deleteConnect() { unregisterCable(); } void cableDev::insertInPort(devicePort *p) { if ( !myStartPort ) myStartPort = p; else if ( !myEndPort ) myEndPort = p; else qFatal("ERROR in cable!"); } bool cableDev::isBusy(const devicePort *d) { if ( myStartPort == d ) return !fromEndQueue.isEmpty(); else return !fromStartQueue.isEmpty(); } void cableDev::killRandomPackets(QQueue stream) { if ( stream.size() <= MINIMUM_DEAD ) foreach ( bitStream *i , stream ) i->color = Qt::blue; else foreach ( bitStream *i , stream ) if ( qrand()%100 >= 100-PERCENT_DEAD ) i->color = Qt::blue; } void cableDev::killCurrentPackets() { foreach ( bitStream *i , fromEndQueue ) if ( i->color == Qt::blue ) { fromEndQueue.removeOne(i); delete i; } foreach ( bitStream *i , fromStartQueue ) if ( i->color == Qt::blue ) { fromStartQueue.removeOne(i); delete i; } } void cableDev::startCollision() { if ( fromEndQueue.isEmpty() && fromStartQueue.isEmpty() ) return; killRandomPackets(fromEndQueue); killRandomPackets(fromStartQueue); isCollision = true; } void cableDev::registerCable() { myStartDev->addConnection(myStartName,this); myEndDev->addConnection(myEndName,this); myStartDev->update(); myEndDev->update(); updatePosition(); // Обновляем его положение } void cableDev::unregisterCable() { myStartDev->deleteConnection(this); myEndDev->deleteConnection(this); myStartDev->update(); myEndDev->update(); myStartPort = 0; myEndPort = 0; } void cableDev::setShowLabel(bool b) { textStart->setVisible(b); textEnd->setVisible(b); } netemul-1.0/src/graphics/textitem.h0000644000175000017500000000357211252300033016476 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef TEXTITEM_H #define TEXTITEM_H #include #include /*! Реализует текстовую надпись на сцене. */ class textItem : public QGraphicsTextItem { Q_OBJECT Q_PROPERTY(QString note READ toPlainText() WRITE setNote) public: enum { Type = UserType + 3 }; int type() const { return Type; } void setNote(const QString &str) { setPlainText(str); adjustSize(); } textItem(QPointF p, QGraphicsItem *parent = 0 , QGraphicsScene *scene = 0); signals: void lostFocus(textItem*); protected: void focusOutEvent(QFocusEvent *event); void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event); void paint(QPainter *painter,const QStyleOptionGraphicsItem *option,QWidget *widget); }; //------------------------------------------------------------- Q_DECLARE_METATYPE(textItem*) #endif // TEXTITEM_H netemul-1.0/src/dialogs/0000755000175000017500000000000011305026150014301 5ustar frostfrostnetemul-1.0/src/dialogs/staticsdialog.h0000644000175000017500000000257711252300033017313 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef STATICSDIALOG_H #define STATICSDIALOG_H #include "ui_staticsdialog.h" class myCanvas; class statisticsScene; class staticsDialog : public QDialog, private Ui::staticsDialog { Q_OBJECT Q_DISABLE_COPY(staticsDialog) public: staticsDialog(statisticsScene *statistics, QWidget *parent = 0); protected: void changeEvent(QEvent *e); }; #endif // STATICSDIALOG_H netemul-1.0/src/dialogs/testdialog.cpp0000644000175000017500000001110411261705352017152 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include #include #include #include "testdialog.h" #include "mycanvas.h" #include "deviceimpl.h" #include "appsetting.h" QScriptValue ObjectToScript(QScriptEngine *engine, deviceImpl* const &in) { return engine->newQObject(in); } void ObjectFromScript(const QScriptValue &object, deviceImpl* &out) { out = qobject_cast(object.toQObject()); } QScriptValue ObjectToScriptItem(QScriptEngine *engine, textItem* const &in) { return engine->newQObject(in); } void ObjectFromScriptItem(const QScriptValue &object, textItem* &out) { out = qobject_cast(object.toQObject()); } testDialog::testDialog(myCanvas *c,QWidget *parent) : QDialog(parent) { setupUi(this); canva = c; updateList(); QScriptValue p = engine.newQObject(c); #ifdef __NO_TOOLS__ debugger.attachTo(&engine); debugger.action(QScriptEngineDebugger::InterruptAction)->trigger(); #endif engine.globalObject().setProperty("scene",p); qScriptRegisterMetaType(&engine, ObjectToScript, ObjectFromScript); qScriptRegisterMetaType(&engine, ObjectToScriptItem, ObjectFromScriptItem); connect( checkBox , SIGNAL(toggled(bool)) , SLOT(selectAll(bool))); connect( listWidget , SIGNAL(currentRowChanged(int)) , SLOT(selectChange())); setAttribute(Qt::WA_DeleteOnClose); } testDialog::~testDialog() { } void testDialog::updateList() { listWidget->clear(); QDir t(appSetting::scriptPath()); QStringList h; h << "*.js"; QStringList s = t.entryList(h); foreach ( QString i , s) listWidget->addItem( i.remove(".js") ); } void testDialog::changeEvent(QEvent *e) { switch (e->type()) { case QEvent::LanguageChange: retranslateUi(this); break; default: break; } } void testDialog::start() { if ( listWidget->selectedItems().isEmpty() ) return; bool res = true; startButton->setEnabled(false); QList l = listWidget->selectedItems(); foreach ( QListWidgetItem *i , l ) if ( !test( i->text() ) ) { res = false; break; } if (res ) { label->setText(tr("Script finished correctly")); label->setStyleSheet("background : green"); } else { label->setText(tr("Script not correctly finished")); label->setStyleSheet("background : red"); } startButton->setEnabled(true); } bool testDialog::test(QString s) { qDebug() << s << " started"; QString g = appSetting::scriptPath()+s+".js"; QFile file(g); file.open(QIODevice::ReadOnly); QString temporary = file.readAll(); temporary.prepend("with (scene) {"); temporary.append(" }"); QScriptValue t = engine.evaluate(temporary); if ( t.isError() ) { qDebug() << "ERROR in " << g << " file"; file.close(); return false; } file.close(); if ( !t.toBool() ) qDebug() << s << " script failed"; qDebug() << s << " finished"; return t.toBool(); } void testDialog::selectAll(bool c) { if ( c ) listWidget->selectAll(); else { if (listWidget->count() ) listWidget->setCurrentRow(0); } } void testDialog::setScriptPath() { QString name = QFileDialog::getExistingDirectory( this, tr("Choose a directory with scripts"), appSetting::scriptPath() ); if ( name.isEmpty() ) return; if ( name.at( name.length() - 1 ) != '/' ) name.push_back('/'); appSetting::setScriptPath(name); updateList(); } void testDialog::selectChange() { label->setText(tr("Click start")); label->setStyleSheet(""); } netemul-1.0/src/dialogs/dhcpclientproperty.h0000644000175000017500000000272511255455500020413 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef DHCPCLIENTPROPERTY_H #define DHCPCLIENTPROPERTY_H #include "ui_dhcpclientproperty.h" class dhcpClientProgramm; class dhcpClientProperty : public QDialog, private Ui::dhcpClientProperty { Q_OBJECT public: dhcpClientProperty(QWidget *parent = 0); void setProgramm( dhcpClientProgramm *prog); protected: void changeEvent(QEvent *e); private slots: void apply(); private: dhcpClientProgramm *myProgramm; }; #endif // DHCPCLIENTPROPERTY_H netemul-1.0/src/dialogs/computerproperty.cpp0000644000175000017500000000431011276270637020470 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "computerproperty.h" #include "computer.h" #include "ipedit.h" #include #include computerProperty::computerProperty() { setWindowTitle(tr("Properties")); QVBoxLayout *all = new QVBoxLayout; QVBoxLayout *prop = new QVBoxLayout; QHBoxLayout *temp = new QHBoxLayout; gateway = new ipEdit(this,tr("Default gateway:")); connect( gateway , SIGNAL(textChanged(QString)) , SLOT(applyEnable()) ); temp->addWidget(gateway,0,Qt::AlignLeft); prop->addLayout(temp); cb_route = new QCheckBox(tr("Enable routing")); connect( cb_route , SIGNAL(stateChanged(int)) , SLOT(applyEnable()) ); prop->addWidget(cb_route); prop->addStretch(1); all->addLayout(prop); all->addLayout(lay); setLayout(all); setAttribute(Qt::WA_DeleteOnClose); } computerProperty::~computerProperty() { delete comp; } void computerProperty::setDevice(computerSetting *c) { comp = c; gateway->setText( c->gateway() ); cb_route->setChecked( comp->isRouter() ); btn_apply->setEnabled(false); } void computerProperty::apply() { comp->setGateway(gateway->text()); comp->setRouter( cb_route->isChecked() ); if ( sender() == btn_ok ) accept(); } netemul-1.0/src/dialogs/routerproperty.cpp0000644000175000017500000000526111274657601020156 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "routerproperty.h" #include "routerdevice.h" #include #include #include #include /*! Создает интерфейс диалога. */ routerProperty::routerProperty() { setWindowTitle(tr("Properties")); QVBoxLayout *all = new QVBoxLayout; QHBoxLayout *temp = new QHBoxLayout; temp->addWidget( new QLabel(tr("Number of ports: ") ) ); cb_count = new QComboBox; connect( cb_count , SIGNAL(currentIndexChanged(int)) , SLOT(applyEnable()) ); QStringList t; t << "2" << "4" << "5"<< "7" << "8" << "9"; cb_count->addItems(t); temp->addWidget(cb_count); all->addLayout(temp); cb_route = new QCheckBox( tr("Enable routing") ); connect( cb_route , SIGNAL(toggled(bool)) , SLOT(applyEnable()) ); all->addWidget( cb_route); all->addStretch(1); all->addLayout(lay); setLayout(all); } //---------------------------------------------------------------- /*! Задает диалогу устройство для работы. @param r - указатель на роутер. */ void routerProperty::setRouter(routerSetting *r) { rt = r; cb_route->setChecked(r->isRouter()); cb_count->setCurrentIndex( cb_count->findText( QString::number( rt->socketsCount() ) ) ); btn_apply->setEnabled(false); } //----------------------------------------------------------------- void routerProperty::apply() { rt->setRouter( cb_route->isChecked() ); int m = cb_count->currentText().toInt(); if ( m != rt->socketsCount() ) rt->setSocketsCount( m ); cb_count->setCurrentIndex( cb_count->findText( QString::number( rt->socketsCount() ) ) ); if ( sender() == btn_ok ) accept(); } netemul-1.0/src/dialogs/hubproperty.h0000644000175000017500000000304111277100130017032 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef HUBPROPERTY_H #define HUBPROPERTY_H #include "dialogtemplate.h" class QComboBox; class QLineEdit; class QLabel; class QPushButton; class ipEdit; class hubSetting; class hubProperty : public dialogTemplate { Q_OBJECT public: hubProperty(); ~hubProperty(); void setHub(hubSetting *s); private: hubSetting *st; QComboBox *cb_count; QLabel *lb_statics; QLabel *lb_mac; QLabel *lb_conflict; QLineEdit *le_mac; public slots: void apply(); private slots: void reset(); }; #endif // HUBPROPERTY_H netemul-1.0/src/dialogs/tableswitch.cpp0000644000175000017500000000511711261705352017333 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "tableswitch.h" #include "switchdevice.h" #include "switchmodel.h" tableSwitch::tableSwitch(switchTableSetting *s) { sw = s; t_sw = s->switchTable(); setupUi(this); table->setModel(t_sw); QHeaderView *h = table->horizontalHeader(); h->setResizeMode( QHeaderView::Stretch ); int n = s->socketsCount(); for ( int i = 0 ; i < n ; i++ ) cb_port->addItem(tr("LAN%1").arg(i+1)); connect( btn_add , SIGNAL(clicked()) , SLOT(addRecord()) ); connect( btn_del , SIGNAL(clicked()) , SLOT(deleteRecord()) ); connect( table->selectionModel() , SIGNAL(selectionChanged(QItemSelection,QItemSelection)), SLOT(selectionChanged()) ); connect( t_sw , SIGNAL(modelReset()) , SLOT(resetSelection())); } void tableSwitch::addRecord() { devicePort *t = sw->socket( cb_port->currentText() ); t_sw->addToTable( macAddress( le_macAddress->text() ) , t , switchModel::staticMode); le_macAddress->setText("00:00:00:00:00:00"); } void tableSwitch::deleteRecord() { QItemSelectionModel *m = table->selectionModel(); QModelIndexList l = m->selectedIndexes(); foreach ( QModelIndex i , l ) if ( i.column() == 0 ) { t_sw->deleteFromTable( i.data(Qt::DisplayRole).toString() ); return; } } void tableSwitch::resetSelection() { btn_del->setEnabled(false); } void tableSwitch::selectionChanged() { btn_del->setEnabled(true); } void tableSwitch::changeEvent(QEvent *e) { switch (e->type()) { case QEvent::LanguageChange: retranslateUi(this); break; default: break; } } netemul-1.0/src/dialogs/switchproperty.cpp0000644000175000017500000000677011277100130020124 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include #include #include #include #include #include "switchproperty.h" #include "switchdevice.h" #include "ipedit.h" switchProperty::switchProperty() { setWindowTitle(tr("Properties")); QVBoxLayout *all = new QVBoxLayout; QHBoxLayout *temp = new QHBoxLayout; QLabel *t = new QLabel(tr("Number of ports: ")); cb_count = new QComboBox; QStringList s; s << "4" << "5" << "8" << "12" <<"16"<< "24"<<"32" << "48"; cb_count->addItems(s); connect( cb_count , SIGNAL(currentIndexChanged(int)) ,SLOT(applyEnable()) ); temp->addWidget(t); temp->addWidget(cb_count); all->addLayout(temp); chb_manual = new QCheckBox(tr("Manageable")); connect( chb_manual , SIGNAL(clicked()) , SLOT(applyEnable()) ); all->addWidget(chb_manual); temp = new QHBoxLayout; lb_mac = new QLabel(tr("Mac-address: ")); le_mac = new QLineEdit; le_mac->setInputMask("HH:HH:HH:HH:HH:HH;_"); temp->addWidget(lb_mac); temp->addWidget(le_mac); all->addLayout(temp); connect( le_mac , SIGNAL(textChanged(QString)) , SLOT(applyEnable())); lb_statics = new QLabel; all->addWidget(lb_statics); QPushButton *btn_reset = new QPushButton(QIcon(":/im/images/refresh.png"),tr("Reset statistics")); connect( btn_reset , SIGNAL(clicked()), SLOT(reset()) ); all->addWidget(btn_reset , 0 , Qt::AlignRight ); all->addStretch(1); all->addLayout(lay); setLayout(all); setAttribute( Qt::WA_DeleteOnClose ); } switchProperty::~switchProperty() { delete sw; } void switchProperty::setSwitch(boxSetting *d) { sw = d; cb_count->setCurrentIndex( cb_count->findText( QString::number( d->socketsCount() ) ) ); le_mac->setText( d->snmpMac() ); lb_statics->setText( d->statics() ); chb_manual->setChecked( d->isManual() ); btn_apply->setEnabled(false); } void switchProperty::reset() { sw->reset(); setSwitch(sw); } void switchProperty::apply() { int t = sw->socketsCount(); if ( t != cb_count->currentText().toInt() ) if ( !sw->setSocketsCount( cb_count->currentText().toInt() ) ) { QMessageBox::warning(this,tr("Error"), tr("First, remove the cables!") , QMessageBox::Ok , QMessageBox::Ok); cb_count->setCurrentIndex( cb_count->findText( QString::number(t) ) ); return; } sw->setMac(le_mac->text()); sw->setManual( chb_manual ); if ( sender() == btn_ok ) accept(); } netemul-1.0/src/dialogs/installdialog.cpp0000644000175000017500000000411011274363172017644 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include #include "installdialog.h" #include "ripprogramm.h" #include "smartdevice.h" installDialog::installDialog(QWidget *parent) : QDialog(parent) { setupUi(this); setAttribute(Qt::WA_DeleteOnClose); } void installDialog::setDevice(smartDevice *d) { smart = d; } /*! Слот устанавливает выбранную программу, закрывает диалог. */ void installDialog::install() { if ( smart->hasProgramm( list->currentRow() ) ) { QMessageBox::warning(0,tr("Error") , tr("Program already installed.") , QMessageBox::Ok , QMessageBox::Ok ); return; } if ( list->currentRow() < 0 ) return; programm a(list->currentRow()); a->setEnable(false); smart->installProgramm(a); accept(); } //----------------------------------------------- void installDialog::changeEvent(QEvent *e) { QDialog::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: retranslateUi(this); break; default: break; } } netemul-1.0/src/dialogs/aboutwindow.cpp0000644000175000017500000000254711252300033017353 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "aboutwindow.h" aboutWindow::aboutWindow(QWidget *parent) : QDialog(parent) { setupUi(this); setAttribute(Qt::WA_DeleteOnClose); } void aboutWindow::changeEvent(QEvent *e) { QDialog::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: retranslateUi(this); break; default: break; } } netemul-1.0/src/dialogs/programmdialog.h0000644000175000017500000000337511252300033017462 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef PROGRAMMDIALOG_H #define PROGRAMMDIALOG_H #include "ui_programmdialog.h" class smartDevice; /*! Реализует диалог установленных пограмм устройства. */ class programmDialog : public QDialog, private Ui::programmDialog { Q_OBJECT Q_DISABLE_COPY(programmDialog) public: programmDialog(QWidget *parent = 0); void setDevice( smartDevice *d ); protected: void updateList(); void changeEvent(QEvent *e); private: smartDevice *s; //!< Указатель на устройство. public slots: void apply(); private slots: void stateChanged(QListWidgetItem *item); void programmChanged(); void settings(); void add(); void remove(); }; #endif // PROGRAMMDIALOG_H netemul-1.0/src/dialogs/routeeditor.cpp0000644000175000017500000001415511275641120017366 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "routeeditor.h" #include "ipedit.h" #include "smartdevice.h" #include "routemodel.h" #include #include #include #include #include #include #include #include routeEditor::routeEditor(smartDevice *s) { setWindowTitle(tr("Routing table")); dev = s; QVBoxLayout *all = new QVBoxLayout; table = new QTableView; table->setAlternatingRowColors(true); model = dev->routeTable(); table->setModel(model); table->horizontalHeader()->setResizeMode(QHeaderView::Stretch); table->setSelectionBehavior(QAbstractItemView::SelectRows); table->setSelectionMode(QAbstractItemView::SingleSelection); all->addWidget(table); ip_dest = new ipEdit(this,tr("Destination: ")); all->addWidget(ip_dest); ip_mask = new ipEdit(this,tr("Mask: ")); all->addWidget(ip_mask); ip_gateway = new ipEdit(this,tr("Gateway: ")); all->addWidget(ip_gateway); QHBoxLayout *temp = new QHBoxLayout; temp->addWidget( new QLabel(tr("Interface: ")) ); cb_out = new QComboBox; cb_out->setFixedWidth(250); ipList = dev->interfacesIp(); QStringList tempList = ipList; suffixList = filterConnectedSocket( dev->sockets() ); Q_ASSERT( tempList.size() == suffixList.size() ); for ( int i = 0 ; i < tempList.size() ; i++ ) tempList[i].append(" ("+ suffixList.at(i)+")" ); cb_out->addItems( tempList ); temp->addWidget(cb_out); temp->addStretch(1); all->addLayout(temp); QHBoxLayout *lay = new QHBoxLayout; QLabel *lb = new QLabel(tr("Metric: ")); lay->addWidget(lb); sp_metr = new QSpinBox; sp_metr->setMinimum(0); sp_metr->setMaximum(100); lay->addWidget(sp_metr); lay->addStretch(1); all->addLayout(lay); lay = new QHBoxLayout; btn_add = new QPushButton( QIcon(":/im/images/edit_add.png"), tr("Add")); btn_add->setFixedWidth(150); connect( btn_add , SIGNAL(clicked()) , SLOT(addRecord()) ); lay->addWidget( btn_add, 1, Qt::AlignLeft); btn_remove = new QPushButton(QIcon(":/im/images/edit_remove.png"),tr("Delete")); btn_remove->setFixedWidth(150); btn_remove->setEnabled(false); connect( btn_remove , SIGNAL(clicked()) ,SLOT(deleteRecord()) ); lay->addWidget(btn_remove, 1, Qt::AlignLeft); lay->addStretch(2); btn_close = new QPushButton(QIcon(":/im/images/not.png"), tr("Close")); btn_close->setFixedWidth(150); lay->addWidget(btn_close, 1, Qt::AlignRight); all->addLayout(lay); connect( btn_close, SIGNAL(clicked()), SLOT(reject())); connect( table->selectionModel() , SIGNAL(currentRowChanged(QModelIndex,QModelIndex)) , SLOT(checkSelection(QModelIndex)) ); connect( cb_out , SIGNAL(activated(int)) , SLOT(selectAdapter(int)) ); readSetting(); setLayout(all); setAttribute(Qt::WA_DeleteOnClose); if ( suffixList.size() > 0 ) dev->setCheckedSocket( suffixList.at(0) ); } routeEditor::~routeEditor() { writeSetting(); dev->setCheckedSocket(""); } void routeEditor::addRecord() { model->addToTable( ip_dest->ipText() , ip_mask->ipText() , ip_gateway->ipText() , ipList.at( cb_out->currentIndex() ) , sp_metr->value(), routeModel::staticMode ); ip_dest->clear(); ip_mask->clear(); ip_gateway->clear(); cb_out->setCurrentIndex(0); sp_metr->setValue(0); btn_remove->setEnabled(false); } void routeEditor::deleteRecord() { if ( !table->selectionModel()->hasSelection() ) return; model->deleteFromTable( table->currentIndex().row() ); btn_remove->setEnabled(false); } /*! Проверяет выделенное и при необходимости делает недоступной кнопку удалить. */ void routeEditor::checkSelection(QModelIndex curr) { if ( curr.isValid() && model->isConnectedMode(curr) ) btn_remove->setEnabled(true); else btn_remove->setEnabled(false); } //------------------------------------------ /*! Читает размеры окна из файла. */ void routeEditor::readSetting() { QSettings s("FROST","netemul"); s.beginGroup("routeeditor"); resize( s.value( "width", 800 ).toInt() , s.value( "height", 600 ).toInt() ); move( s.value( "left" , 100 ).toInt() , s.value( "top" , 100 ).toInt() ); s.endGroup(); } //-------------------------------------------- /*! Записывает размеры окна в файл. */ void routeEditor::writeSetting() const { QSettings s("FROST","netemul"); s.beginGroup("routeeditor"); s.setValue("width", width() ); s.setValue("height", height() ); s.setValue("left" , pos().x() ); s.setValue("top" , pos().y() ); s.endGroup(); } //-------------------------------------------- void routeEditor::selectAdapter(int number) { dev->setCheckedSocket( suffixList.at( number ) ); } QStringList routeEditor::filterConnectedSocket(QStringList list) { QStringList temp; QStringList::const_iterator end = list.constEnd(); for ( QStringList::const_iterator i = list.constBegin() ; i != end; ++i ) if ( dev->isConnectSocket(*i) ) temp << *i; return temp; } netemul-1.0/src/dialogs/senddialog.h0000644000175000017500000000432311277100130016564 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef SENDDIALOG_H #define SENDDIALOG_H #include #include #include "macaddress.h" #include "ipaddress.h" class QListWidget; class QListWidgetItem; class QPushButton; class QLabel; class QSlider; class QSpinBox; class QCheckBox; class QRadioButton; class QVBoxLayout; class deviceImpl; class device; class devicePort; class interface; class sendDialog : public QDialog { Q_OBJECT public: enum aim { sender = 0 , receiver = 1 }; enum { UDP = 0 ,TCP = 1 }; sendDialog(aim cur,device *t); void prepare(); QString dest() const { return myDest; } bool broadcast() const { return myBroadcast; } int messageSize() const { return mySize; } int protocol() const { return myProtocol; } public slots: void checkSelected(int cur); void checkAccept(); private: aim myState; deviceImpl *myDevice; QString myDest; int mySize; int myProtocol; bool myBroadcast; QSpinBox *sizeBox; QPushButton *okButton; QPushButton *cancelButton; QRadioButton *rtn_udp; QRadioButton *rtn_tcp; QSlider *sizeSlider; QLabel *caption; QLabel *sizeCaption; QListWidget *list; // QCheckBox *check; QVBoxLayout *all; }; #endif // SENDDIALOG_H netemul-1.0/src/dialogs/dhcpclientproperty.cpp0000644000175000017500000000412311271166761020746 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "dhcpclientproperty.h" #include "dhcpclientprogramm.h" dhcpClientProperty::dhcpClientProperty(QWidget *parent) : QDialog(parent) { setupUi(this); setAttribute( Qt::WA_DeleteOnClose ); } void dhcpClientProperty::setProgramm(dhcpClientProgramm *prog) { myProgramm = prog; foreach ( QString i , myProgramm->interfacesList() ) { QListWidgetItem *item = new QListWidgetItem( myProgramm->isConnectSocketIcon(i), i , lw_interfaces ); item->setCheckState( myProgramm->checkedState( i ) ); } sb_offerTime->setValue( prog->offerTime() ); } void dhcpClientProperty::apply() { for ( int i = 0 ; i < lw_interfaces->count() ; i++ ) { QListWidgetItem *t = lw_interfaces->item(i); myProgramm->observeInterface( t->text() , t->checkState() == Qt::Checked ); } myProgramm->setOfferTime( sb_offerTime->value() ); accept(); } void dhcpClientProperty::changeEvent(QEvent *e) { QDialog::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: retranslateUi(this); break; default: break; } } netemul-1.0/src/dialogs/dialogtemplate.h0000644000175000017500000000273111261705352017461 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef DIALOGTEMPLATE_H #define DIALOGTEMPLATE_H #include #include #include class dialogTemplate : public QDialog { Q_OBJECT Q_DISABLE_COPY(dialogTemplate) public: dialogTemplate(); protected: QPushButton *btn_ok; QPushButton *btn_apply; QPushButton *btn_cancel; QHBoxLayout *lay; private slots: virtual void apply() = 0; void applyEnable(); void applyDisable(); }; #endif // DIALOGTEMPLATE_H netemul-1.0/src/dialogs/computerproperty.h0000644000175000017500000000274211274657601020142 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef COMPUTERPROPERTY_H #define COMPUTERPROPERTY_H #include "dialogtemplate.h" class QCheckBox; class computerSetting; class ipEdit; class computerProperty : public dialogTemplate { Q_OBJECT Q_DISABLE_COPY(computerProperty) public: computerProperty(); ~computerProperty(); void setDevice(computerSetting *c); private: computerSetting *comp; QCheckBox *cb_route; ipEdit *gateway; public slots: void apply(); }; #endif // COMPUTERPROPERTY_H netemul-1.0/src/dialogs/ripproperty.h0000644000175000017500000000261711255455500017070 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef RIPPROPERTY_H #define RIPPROPERTY_H #include "ui_ripproperty.h" class ripProgramm; class ripProperty : public QDialog, private Ui::ripProperty { Q_OBJECT public: ripProperty(QWidget *parent = 0); void setProgramm( ripProgramm *prog); protected: void changeEvent(QEvent *e); private slots: void apply(); private: ripProgramm *myProgramm; }; #endif // RIPPROPERTY_H netemul-1.0/src/dialogs/staticsdialog.cpp0000644000175000017500000000312311252300033017632 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "staticsdialog.h" #include "mycanvas.h" #include "statisticsscene.h" staticsDialog::staticsDialog(statisticsScene *statistics, QWidget *parent) :QDialog(parent) { setupUi(this); deviceLabel->setText( statistics->devicesString() ); trafficLabel->setText( statistics->trafficString() ); setAttribute(Qt::WA_DeleteOnClose); setMinimumSize( sizeHint() ); } void staticsDialog::changeEvent(QEvent *e) { QDialog::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: retranslateUi(this); break; default: break; } } netemul-1.0/src/dialogs/devicenotedialog.cpp0000644000175000017500000000127011274657601020332 0ustar frostfrost#include "devicenotedialog.h" #include "deviceimpl.h" deviceNoteDialog::deviceNoteDialog(QWidget *parent) : QDialog(parent) { setupUi(this); setAttribute(Qt::WA_DeleteOnClose); } void deviceNoteDialog::setDevice(deviceSetting *device) { myDevice = device; te_text->setPlainText( device->note() ); } deviceNoteDialog::~deviceNoteDialog() { delete myDevice; } void deviceNoteDialog::apply() { myDevice->setNote( te_text->toPlainText() ); accept(); } void deviceNoteDialog::changeEvent(QEvent *e) { QDialog::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: retranslateUi(this); break; default: break; } } netemul-1.0/src/dialogs/tablearp.cpp0000644000175000017500000001360411265702206016613 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "tablearp.h" #include "ipedit.h" #include "arpmodel.h" #include "smartdevice.h" #include #include #include #include #include #include #include /*! Конструктор создает основной интерфейс окна. */ tableArp::tableArp() { setWindowTitle(tr("Arp table")); QVBoxLayout *all = new QVBoxLayout; table = new QTableWidget(0,5); table->setSelectionBehavior(QAbstractItemView::SelectRows); table->setSelectionMode(QAbstractItemView::SingleSelection); table->setMinimumWidth(300); table->setAlternatingRowColors(true); table->setEditTriggers(QAbstractItemView::NoEditTriggers); QStringList head; head << tr("Mac-address") << tr("Ip-address") << tr("Record type") << tr("Netcard name") << tr("TTL") ; table->setHorizontalHeaderLabels(head); table->horizontalHeader()->setResizeMode(QHeaderView::Stretch); all->addWidget(table); QHBoxLayout *temp = new QHBoxLayout; QLabel *lb = new QLabel(tr("Mac-address: ")); temp->addWidget(lb); le_mac = new QLineEdit; le_mac->setFixedWidth(150); le_mac->setInputMask("HH:HH:HH:HH:HH:HH;_"); le_mac->setText("00:00:00:00:00:00"); temp->addWidget(le_mac); ip = new ipEdit(this,tr("Ip-address: ")); temp->addWidget(ip); lb = new QLabel( tr("Netcard") ); cb_port = new QComboBox; cb_port->setFixedWidth(100); temp->addWidget(lb); temp->addWidget(cb_port); all->addLayout(temp); temp = new QHBoxLayout; btn_add = new QPushButton( QIcon(":im/images/edit_add.png"), tr( "Add" )); connect(btn_add, SIGNAL(clicked()), SLOT(addRecord())); btn_del = new QPushButton( QIcon( ":im/images/edit_remove.png" ), tr( "Delete" )); connect(btn_del, SIGNAL(clicked()), SLOT(deleteRecord())); btn_del->setEnabled(false); btn_close = new QPushButton( QIcon( ":im/images/not.png" ), tr( "Close" )); connect(btn_close, SIGNAL(clicked()), SLOT(reject())); connect( table , SIGNAL(itemSelectionChanged()) , SLOT(checkSelection())); temp->addWidget(btn_add); temp->addWidget(btn_del); temp->addStretch(1); temp->addWidget(btn_close); all->addLayout(temp); setLayout(all); setAttribute(Qt::WA_DeleteOnClose); } //------------------------------------------------------------------ void tableArp::setDevice(smartDevice *dev) { device = dev; s = device->sockets(); list = device->arpModels(); updateTable(); } /** Обновляет содержимое таблицы арп записей при каких либо изменениях. */ void tableArp::updateTable() { table->clearContents(); cb_port->clear(); table->setRowCount(0); int i = 0; arpRecord *r; foreach ( arpModel *p, list ) { if ( !device->isConnectSocket(s.at(i)) ) { i++; continue; } cb_port->addItem(QIcon(":im/images/ok.png"), s.at(i) ); for ( int j = 0; j < p->size(); j++ ) { r = p->recordAt(j); table->insertRow(table->rowCount()); addItem( table->rowCount()-1, 0, r->mac.toString()); addItem( table->rowCount()-1, 1, r->ip.toString()); addItem( table->rowCount()-1, 2, r->modeString()); addItem( table->rowCount()-1, 3, s.at(i)); addItem( table->rowCount()-1, 4, QString::number(r->time)); } i++; } btn_del->setEnabled(false); } //--------------------------------------------------------------- /** Добавляет в таблицу arp указанного адаптера статическую запись. Если значение mac или ip пустые добавления не происходит, обновляет таблицу и обнуляет поля для ввода. */ void tableArp::addRecord() { if ( le_mac->text() == "00:00:00:00:00:00" || ip->text() == "0.0.0.0" ) return; list.at(s.indexOf(cb_port->currentText()))->addToTable( ip->text(), le_mac->text(), arpModel::staticMode ); updateTable(); ip->setText("0.0.0.0"); le_mac->setText("00:00:00:00:00:00"); } //---------------------------------------------------------------------- /** Удалеяет из таблицы существующую запись и обновляет таблицу. */ void tableArp::deleteRecord() { if ( table->selectedItems().isEmpty() ) return; int n = table->currentRow(); list.at(s.indexOf( table->item( n, 3)->text() ))->deleteFromTable( table->item( n, 1)->text() ); updateTable(); } //------------------------------------------------------------------------ void tableArp::checkSelection() { if ( table->currentRow() == -1 ) btn_del->setEnabled(false); else btn_del->setEnabled(true); } void tableArp::addItem(int r, int c, QString s) { QTableWidgetItem *item = new QTableWidgetItem( s ); table->setItem( r, c, item); } netemul-1.0/src/dialogs/routerproperty.h0000644000175000017500000000271411274657601017623 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef ROUTERPROPERTY_H #define ROUTERPROPERTY_H #include "dialogtemplate.h" class routerSetting; class QCheckBox; class QGroupBox; class QComboBox; class routerProperty : public dialogTemplate { Q_OBJECT Q_DISABLE_COPY(routerProperty) public: routerProperty(); void setRouter(routerSetting *r); private: routerSetting *rt; QCheckBox *cb_route; QComboBox *cb_count; public slots: void apply(); }; #endif // ROUTERPROPERTY_H netemul-1.0/src/dialogs/senddialog.cpp0000644000175000017500000001061411277100130017117 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include "senddialog.h" #include "device.h" sendDialog::sendDialog(aim cur,device* t) { myState = cur; myDevice = t->contentDevice(); setWindowTitle(tr("Sending")); all = new QVBoxLayout; prepare(); QHBoxLayout *temp = new QHBoxLayout; temp->addWidget(okButton); temp->addWidget(cancelButton); all->addLayout(temp); setLayout(all); connect( okButton , SIGNAL(clicked()) , this , SLOT(checkAccept())); connect( cancelButton , SIGNAL(clicked()) , this , SLOT(reject())); // НЕ НАДО ДЕЛАТЬ setAttribute(Qt::WA_DeleteOnClose); !!! } void sendDialog::checkSelected(int cur) { okButton->setEnabled( cur >= 0 ); } void sendDialog::checkAccept() { if (myState == sender) { mySize = sizeSlider->value(); // myBroadcast = check->checkState(); if ( rtn_tcp->isChecked() ) myProtocol = TCP; else myProtocol = UDP; } else { myDest = myDevice->nameToIp( list->currentItem()->text() ); } accept(); } void sendDialog::prepare() { cancelButton = new QPushButton(QIcon(":/im/images/not.png"),tr("Cancel")); if ( myState == sender ) { sizeSlider = new QSlider(Qt::Horizontal); sizeCaption = new QLabel(tr("Size KB")); sizeBox = new QSpinBox; sizeSlider->setRange(1,1000); sizeBox->setRange(1,1000); sizeBox->setSuffix(tr(" KB")); connect( sizeBox, SIGNAL(valueChanged(int)),sizeSlider, SLOT(setValue(int))); connect(sizeSlider , SIGNAL(valueChanged(int)) ,sizeBox, SLOT(setValue(int))); sizeBox->setValue(50); // check = new QCheckBox(tr("Broadcast")); // check->setChecked(false); // check->setEnabled(false); okButton = new QPushButton(QIcon(":/im/images/ok.png"),tr("Next")); QGroupBox *box = new QGroupBox(tr("Choose protocol:")); QVBoxLayout *btn = new QVBoxLayout; rtn_udp = new QRadioButton(tr("UDP")); rtn_udp->setChecked(true); rtn_tcp = new QRadioButton(tr("TCP")); rtn_tcp->setEnabled(true); btn->addWidget(rtn_udp); btn->addWidget(rtn_tcp); box->setLayout(btn); all->addWidget(box); all->addWidget(sizeCaption); QHBoxLayout *temp = new QHBoxLayout; temp->addWidget(sizeSlider); temp->addWidget(sizeBox); all->addLayout(temp); // all->addWidget(check); all->addStretch(1); } else { list = new QListWidget; QStringList portList = myDevice->sockets(); foreach ( QString i , portList) if ( myDevice->isConnectSocket(i) ) { QListWidgetItem *temp = new QListWidgetItem( QIcon(":/im/images/ok.png") , i); list->addItem(temp); } caption = new QLabel(tr("Select the network card receiver")); okButton = new QPushButton(QIcon(":/im/images/ok.png"),tr("Send")); if (list->count()) { okButton->setEnabled(true); list->setCurrentRow(0); } else okButton->setEnabled(false); all->addWidget(caption); all->addWidget(list); connect( list , SIGNAL(currentRowChanged(int)) ,SLOT(checkSelected(int))); } } netemul-1.0/src/dialogs/dhcpserverproperty.h0000644000175000017500000000347411270341054020440 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef DHCPSERVERPROPERTY_H #define DHCPSERVERPROPERTY_H #include #include "ipedit.h" class dhcpServerProgramm; class dhcpServerModel; class smartDevice; class macAddressDelegate; class ipAddressDelegate; class dhcpServerProperty : public QDialog, private Ui::dhspServerProperty { Q_OBJECT public: dhcpServerProperty(smartDevice *dev,QWidget *parent = 0); ~dhcpServerProperty(); void setProgramm( dhcpServerProgramm *prog ); public slots: void addRecord(); void deleteRecord(); void changeState(bool); void apply(); protected: void changeEvent(QEvent *e); private: macAddressDelegate *macDelegate; ipAddressDelegate *ipDelegate; dhcpServerProgramm *myProgramm; dhcpServerModel *myModel; smartDevice *device; }; #endif // DHCPSERVERPROPERTY_H netemul-1.0/src/dialogs/devicenotedialog.h0000644000175000017500000000071611274657601020003 0ustar frostfrost#ifndef DEVICENOTEDIALOG_H #define DEVICENOTEDIALOG_H #include "ui_devicenotedialog.h" class deviceSetting; class deviceNoteDialog : public QDialog, private Ui::deviceNoteDialog { Q_OBJECT public: deviceNoteDialog(QWidget *parent = 0); void setDevice(deviceSetting *device); ~deviceNoteDialog(); public slots: void apply(); protected: void changeEvent(QEvent *e); private: deviceSetting *myDevice; }; #endif // DEVICENOTEDIALOG_H netemul-1.0/src/dialogs/testdialog.h0000644000175000017500000000340711261705352016626 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef TESTDIALOG_H #define TESTDIALOG_H #include #include #include "ui_testdialog.h" //#define __NO_TOOLS__ 0 #ifdef __NO_TOOLS__ #include #endif class myCanvas; class testDialog : public QDialog , private Ui::testDialog { Q_OBJECT Q_DISABLE_COPY(testDialog) public: explicit testDialog(myCanvas *c,QWidget *parent = 0); virtual ~testDialog(); protected: virtual void changeEvent(QEvent *e); private slots: void start(); void selectAll(bool c); void selectChange(); void setScriptPath(); private: void updateList(); QScriptEngine engine; #ifdef __NO_TOOLS__ QScriptEngineDebugger debugger; #endif bool test(QString s); myCanvas *canva; }; #endif // TESTDIALOG_H netemul-1.0/src/dialogs/programmdialog.cpp0000644000175000017500000000740211274063073020026 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "programmdialog.h" #include "smartdevice.h" #include "programm.h" #include "installdialog.h" #include programmDialog::programmDialog(QWidget *parent) : QDialog(parent) { setupUi(this); setAttribute(Qt::WA_DeleteOnClose); } /*! Обновляет список программ. */ void programmDialog::updateList() { list->clear(); foreach ( programm i, s->programms() ){ QListWidgetItem *item = new QListWidgetItem(i->name()); item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsSelectable); item->setData( Qt::UserRole , i->id() ); if ( i->isEnable() ) item->setCheckState(Qt::Checked); else item->setCheckState(Qt::Unchecked); list->addItem(item); } } //------------------------------------------------- void programmDialog::programmChanged() { btn_remove->setEnabled( list->currentItem() ); btn_settings->setEnabled( list->currentItem() ); } void programmDialog::stateChanged(QListWidgetItem *item) { if ( !item ) return; s->programmAt( item->data( Qt::UserRole).toInt() )->setEnable( item->checkState() == Qt::Checked ); } void programmDialog::setDevice( smartDevice *d ) { s = d; updateList(); } /*! Слот, вызываемый при нажатии на кнопку Ok, выполняет все принятые изменения, закрывает диалог. */ void programmDialog::apply() { for ( int i = 0; i < list->count(); i++) { QListWidgetItem *n = list->item(i); if (n->checkState() == Qt::Checked ) s->programmAt( n->data(Qt::UserRole).toInt() )->setEnable(true); else s->programmAt( n->data(Qt::UserRole).toInt() )->setEnable(false); } accept(); } //---------------------------------------------------- /*! Слот вызывает диалог установки программ, обновляет список установленных программ. */ void programmDialog::add() { installDialog *d = new installDialog; d->setDevice( s ); d->exec(); btn_ok->setFocus(); updateList(); } //----------------------------------------------------- /*! Слот удаляет выделенную программу. */ void programmDialog::remove() { QListWidgetItem *w = list->currentItem(); s->removeProgramm( s->programmAt(w->data(Qt::UserRole).toInt() ) ); updateList(); } void programmDialog::settings() { s->programmAt( list->currentItem()->data(Qt::UserRole).toInt() )->showProperty(); } //----------------------------------------------------- void programmDialog::changeEvent(QEvent *e) { QDialog::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: retranslateUi(this); break; default: break; } } netemul-1.0/src/dialogs/tablearp.h0000644000175000017500000000342111252300033016240 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef TABLEARP_H #define TABLEARP_H #include class QTableWidget; class QPushButton; class QLineEdit; class QComboBox; class QStringList; class smartDevice; class ipEdit; class macAddress; class arpModel; class tableArp : public QDialog { Q_OBJECT Q_DISABLE_COPY(tableArp) public: tableArp(); void setDevice(smartDevice *dev); void updateTable(); void addItem(int r, int c, QString s); private: smartDevice *device; QTableWidget *table; QPushButton *btn_add; QPushButton *btn_del; QPushButton *btn_close; QLineEdit *le_mac; QComboBox *cb_port; QStringList s; QList list; ipEdit *ip; public slots: void addRecord(); void deleteRecord(); void checkSelection(); }; #endif // TABLEARP_H netemul-1.0/src/dialogs/adapterproperty.h0000644000175000017500000000365211274063073017717 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef ADAPTERPROPERTY_H #define ADAPTERPROPERTY_H #include "dialogtemplate.h" class QTabBar; class QLineEdit; class QCheckBox; class QLabel; class QPushButton; class devicePort; class ipEdit; class adapterSetting; /** Класс диалога настройки адаптеров. */ class adapterProperty : public dialogTemplate { Q_OBJECT Q_DISABLE_COPY(adapterProperty) public: adapterProperty(adapterSetting *s); ~adapterProperty(); private slots: void updateTab(int n); void addInterface(); void deleteInterface(); void reset(); void changeTab(int n); void onAutoClicked(bool isAuto); void apply(); private: adapterSetting *sd; QLabel *lb_statics; QTabBar *tab_interfaces; QLineEdit *le_name; QLineEdit *le_mac; ipEdit *le_ip; ipEdit *le_mask; QPushButton *btn_add; QPushButton *btn_del; QCheckBox *cb_auto; }; #endif // ADAPTERPROPERTY_H netemul-1.0/src/dialogs/dialogtemplate.cpp0000644000175000017500000000402611261705352020013 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "dialogtemplate.h" #include #include dialogTemplate::dialogTemplate() { lay = new QHBoxLayout; btn_cancel = new QPushButton(QIcon(qApp->style()->standardIcon( QStyle::SP_DialogCancelButton)), tr("Cancel")); connect( btn_cancel , SIGNAL(clicked()) , SLOT(reject()) ); btn_ok = new QPushButton(QIcon(qApp->style()->standardIcon( QStyle::SP_DialogOkButton)), tr("Ok")); connect( btn_ok , SIGNAL(clicked()) , SLOT(apply()) ); btn_apply = new QPushButton(QIcon(qApp->style()->standardIcon( QStyle::SP_DialogApplyButton)), tr("Apply")); connect(btn_apply, SIGNAL(clicked()) , SLOT(applyDisable())); lay->addWidget(btn_apply); lay->addWidget(btn_ok); lay->addWidget(btn_cancel); lay->setAlignment(Qt::AlignRight); } void dialogTemplate::applyEnable() { btn_apply->setEnabled(true); } void dialogTemplate::applyDisable() { btn_apply->setEnabled(false); apply(); } netemul-1.0/src/dialogs/hubproperty.cpp0000644000175000017500000000653411277100130017377 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include #include #include #include #include "hubproperty.h" #include "hubdevice.h" #include "ipedit.h" hubProperty::hubProperty() { setWindowTitle(tr("Properties")); QVBoxLayout *all = new QVBoxLayout; QHBoxLayout *temp = new QHBoxLayout; QLabel *t = new QLabel(tr("Number of ports: ")); cb_count = new QComboBox; QStringList s; s << "4" << "5" << "6" << "8" << "12" << "16" << "24" << "48"; cb_count->addItems(s); connect( cb_count , SIGNAL(currentIndexChanged(int)) ,SLOT(applyEnable()) ); temp->addWidget(t); temp->addWidget(cb_count); all->addLayout(temp); temp = new QHBoxLayout; lb_mac = new QLabel(tr("Mac-address: ")); le_mac = new QLineEdit; le_mac->setInputMask("HH:HH:HH:HH:HH:HH;_"); temp->addWidget(lb_mac); temp->addWidget(le_mac); connect( le_mac , SIGNAL(textChanged(QString)) , SLOT(applyEnable())); all->addLayout(temp); lb_statics= new QLabel; all->addWidget(lb_statics); lb_conflict = new QLabel; all->addWidget( lb_conflict ); QPushButton *btn_reset = new QPushButton(QIcon(":/im/images/refresh.png"),tr("Reset statistics")); connect( btn_reset , SIGNAL(clicked()), SLOT(reset()) ); all->addWidget(btn_reset , 0 , Qt::AlignRight ); all->addStretch(1); all->addLayout(lay); setLayout(all); setAttribute(Qt::WA_DeleteOnClose); } hubProperty::~hubProperty() { } void hubProperty::setHub(hubSetting *s) { st = s; cb_count->setCurrentIndex( cb_count->findText( QString::number(st->socketsCount() ) )); lb_conflict->setText( tr("Number of collisions: %1").arg( st->collisions() ) ); le_mac->setText( st->snmpMac() ); lb_statics->setText( st->statics() ); btn_apply->setEnabled(false); } void hubProperty::reset() { st->reset(); setHub(st); } void hubProperty::apply() { int t = st->socketsCount(); if ( t != cb_count->currentText().toInt() ) if ( !st->setSocketsCount( cb_count->currentText().toInt() ) ) { QMessageBox::warning(this,tr("Error"), tr("First, remove the cables!") , QMessageBox::Ok , QMessageBox::Ok); cb_count->setCurrentIndex( cb_count->findText( QString::number(t) ) ); return; } st->setMac(le_mac->text()); if ( sender() == btn_ok ) accept(); } netemul-1.0/src/dialogs/installdialog.h0000644000175000017500000000310711252300033017275 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef INSTALLDIALOG_H #define INSTALLDIALOG_H #include "ui_installdialog.h" class smartDevice; static const int MAGIC_START_PROGRAMM_NUMBER = 50; /*! Реализует диалог установки программ. */ class installDialog : public QDialog, private Ui::installDialog { Q_OBJECT public: installDialog(QWidget *parent = 0); void setDevice(smartDevice *d); protected: void changeEvent(QEvent *e); private: smartDevice *smart; //!< Указатель на устройство public slots: void install(); }; #endif // INSTALLDIALOG_H netemul-1.0/src/dialogs/logdialog.cpp0000644000175000017500000001636011263602433016763 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include #include "logdialog.h" #include "frame.h" #include "ippacket.h" #include "arppacket.h" #include "appsetting.h" #include "udppacket.h" #include "tcppacket.h" #include "dhcppacket.h" logDialog::logDialog(QStringList list) { setupUi(this); cb_sockets->addItems(list); cb_sockets->installEventFilter(this); connect( cb_sockets ,SIGNAL(currentIndexChanged(QString)) , this , SIGNAL(changeInterface(QString)) ); } logDialog::~logDialog() { emit changeInterface(""); } void logDialog::receiveData(frame fr,QString port) { if ( cb_sockets->currentText() != port ) return; printRecord(receive,fr); } void logDialog::sendData(frame fr,QString port) { if ( cb_sockets->currentText() != port ) return; printRecord(send,fr); } void logDialog::printRecord(int c, frame fr) { if ( cb_type->currentIndex() != all ) { if ( (cb_type->currentIndex() == arp) != (fr.type() == frame::arp) ) return; ipPacket p(fr.unpack()); if ( cb_type->currentIndex() == udp && p.upProtocol() != ipPacket::udp ) return; if ( cb_type->currentIndex() == tcp && p.upProtocol() != ipPacket::tcp ) return; } QString s; QTreeWidgetItem *main = new QTreeWidgetItem(lw_log); if ( cb_time->isChecked() ) s.append( QTime::currentTime().toString("hh:mm:ss.z")+ " " ); if ( c == send ) s.append(tr("sent ")); else s.append(tr("received ")); if ( fr.type() == frame::ip ) s.append(parseIp(fr,main)); else s.append(parseArp(fr,main)); main->setText(0,s); lw_log->scrollToBottom(); } QString logDialog::parseIp(frame fr,QTreeWidgetItem *parent) { QString s; ipPacket p(fr.unpack()); s.append( p.sender().toString() + " >> " + p.receiver().toString() + tr(" Type: ")); QTreeWidgetItem *item = new QTreeWidgetItem(parent); item->setText(0,fr.toString()); item->setBackgroundColor(0,cl_frame); item = new QTreeWidgetItem(parent); item->setText(0,p.toString()); item->setBackgroundColor(0,cl_ipInternal); if ( p.upProtocol() == ipPacket::udp ) { udpPacket udp(p.unpack()); s.append( udp.typeToString()); QTreeWidgetItem *t = new QTreeWidgetItem(parent); t->setText(0,udp.toString()); t->setBackgroundColor(0,cl_udpInternal); switch ( udp.receiver() ) { case udpPacket::User : parent->setBackgroundColor(0,cl_user); break; case udpPacket::RIP: parent->setBackgroundColor(0,cl_rip); break; case udpPacket::DHCPClient: case udpPacket::DHCPServer: parent->setBackgroundColor(0,cl_dhcp); { dhcpPacket dhcp( udp.unpack() ); t = newItemWidget(parent, tr("DHCP Message, Type: %1").arg( dhcp.typeString() ) ); newItemWidget(t, tr("Xid: %1, Yiaddr: %2").arg( dhcp.xid() ).arg( dhcp.yiaddr().toString()) ); newItemWidget(t, tr("Siaddr: %1, Chaddr: %2").arg( dhcp.siaddr().toString()).arg(dhcp.chaddr().toString()) ); } break; default: parent->setBackgroundColor(0,cl_undef); } } else { tcpPacket tcp(p.unpack()); s.append(" TCP "); parent->setBackgroundColor(0,cl_tcpData); QTreeWidgetItem *item = new QTreeWidgetItem(parent); item->setText(0, tcp.toString()); item->setBackgroundColor(0, cl_tcpInternal); QTreeWidgetItem *t = new QTreeWidgetItem(item); t->setText(0, tr("ISN %1, ACK %2").arg(tcp.sequence()).arg(tcp.ack())); t->setBackgroundColor(0, cl_tcpInternal); t = new QTreeWidgetItem(item); if ( tcp.flag() == tcpPacket::NO_FLAGS ) t->setText(0, tr("flags: No flags")); else if ( tcp.flag() == tcpPacket::ACK ) t->setText(0, tr("flags: Ack")); else if (tcp.flag() == tcpPacket::SYN) t->setText(0,tr("flags: SYN")); else if ( tcp.flag() == (tcpPacket::SYN | tcpPacket::ACK)) t->setText(0,tr("flags: SYN, ACK")); else t->setText(0, tr("flags: Fin")); t->setBackgroundColor(0, cl_tcpInternal); } return s; } QString logDialog::parseArp(frame fr,QTreeWidgetItem *parent) { QString s; QString type; parent->setBackgroundColor(0, cl_arp ); arpPacket p(fr.unpack()); if ( p.type() == arpPacket::request ) type = tr("request"); else type = tr("response"); if ( p.type() == arpPacket::request) { s.append( p.senderIp().toString()); s.append(tr(" search ") + p.receiverIp().toString() ); } else { s.append( p.receiverIp().toString()); s.append(tr(" found ") + p.senderIp().toString()); } s.append(tr(" Type: ")+"ARP "+type); QTreeWidgetItem *item = new QTreeWidgetItem(parent); item->setText(0,fr.toString()); item->setBackgroundColor(0,cl_frame); item = new QTreeWidgetItem(parent); item->setText(0,tr("ARP-%1:").arg(type)); item->setBackgroundColor(0, cl_arpInternal); QTreeWidgetItem *t = new QTreeWidgetItem(item); t->setText(0,tr("sender IP address: %1").arg( p.senderIp().toString() )); t->setBackgroundColor(0, cl_arpInternal); t = new QTreeWidgetItem(item); t->setText(0,tr("sender MAC address: %1").arg( p.senderMac().toString() )); t->setBackgroundColor(0, cl_arpInternal); t = new QTreeWidgetItem(item); t->setText(0,tr("target IP address: %1").arg( p.receiverIp().toString() )); t->setBackgroundColor(0, cl_arpInternal); t = new QTreeWidgetItem(item); t->setText(0,tr("target MAC address: %1").arg( p.receiverMac().toString() )); t->setBackgroundColor(0, cl_arpInternal); return s; } bool logDialog::eventFilter(QObject *obj, QEvent *e) { if ( obj == cb_sockets ) { if ( e->type() == QEvent::FocusOut ) emit changeInterface(""); } return QWidget::eventFilter(obj,e); } QTreeWidgetItem* logDialog::newItemWidget(QTreeWidgetItem *parent, const QString &text, QColor color) { QTreeWidgetItem *t = new QTreeWidgetItem(parent); t->setText(0,text); t->setBackgroundColor(0,color); return t; } void logDialog::changeEvent(QEvent *e) { QWidget::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: retranslateUi(this); break; default: break; } } netemul-1.0/src/dialogs/designerdialog.cpp0000644000175000017500000002715411273023745020011 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "designerdialog.h" #include #include #include #include #include #include #include #include #include #include #include "ipedit.h" #include "computer.h" #include "tcppacket.h" #include "udppacket.h" designerDialog::designerDialog(computer *comp) { myComputer = comp; QVBoxLayout *lay = new QVBoxLayout; tw_design = new QTabWidget; tw_design->addTab( createMainTab(), tr("Main") ); tw_design->addTab( createFrameTab(), tr("Frame") ); tw_design->addTab( createIpTab(), tr("Ip") ); tw_design->addTab( createArpTab(), tr("Arp") ); tw_design->addTab( createTcpTab(), tr("Tcp") ); tw_design->addTab( createUdpTab(), tr("Udp") ); tw_design->setTabEnabled( IP_TAB, false ); tw_design->setTabEnabled( TCP_TAB, false ); tw_design->setTabEnabled( UDP_TAB, false ); lay->addWidget( tw_design ); QList list; btn_ok = new QPushButton( QIcon(":/im/images/ok.png"), tr("Ok") ); btn_cancel = new QPushButton( QIcon(":/im/images/not.png"), tr("Cancel") ); list << btn_ok << btn_cancel; lay->addStretch(1); lay->addLayout( createLayout( list ) ); setLayout( lay ); setAttribute( Qt::WA_DeleteOnClose ); connect( btn_cancel, SIGNAL(clicked()), SLOT(reject()) ); connect( btn_ok, SIGNAL(clicked()), SLOT(apply()) ); setWindowTitle(tr("Packet designer") ); } QWidget* designerDialog::createMainTab() { QWidget *main = new QWidget; QVBoxLayout *lay = new QVBoxLayout; lb_interface = new QLabel( tr("Choose interface: ") ); combo_interface = new QComboBox; QStringList l; foreach ( interface *i, myComputer->interfaces() ) l << i->name(); combo_interface->addItems( l ); QList list; list << lb_interface << combo_interface; lay->addLayout( createLayout( list ) ); list.clear(); lb_count = new QLabel( tr("Count: ") ); sb_count = new QSpinBox; sb_count->setMinimum(1); sb_count->setMaximum(1000); list << lb_count << sb_count; lay->addLayout( createLayout( list ) ); lay->addStretch(1); main->setLayout( lay ); return main; } QWidget* designerDialog::createFrameTab() { QWidget *frame = new QWidget; QVBoxLayout *lay = new QVBoxLayout; QList list; lb_senderMac = new QLabel( tr("Sender mac: ") ); le_senderMac = new QLineEdit; le_senderMac->setInputMask("HH:HH:HH:HH:HH:HH;_"); le_senderMac->setText("00:00:00:00:00:00"); list << lb_senderMac << le_senderMac; lay->addLayout( createLayout( list ) ); list.clear(); lb_receiverMac = new QLabel( tr("Receiver mac: ") ); le_receiverMac = new QLineEdit; le_receiverMac->setInputMask("HH:HH:HH:HH:HH:HH;_"); le_receiverMac->setText("00:00:00:00:00:00"); list << lb_receiverMac << le_receiverMac; lay->addLayout( createLayout( list ) ); list.clear(); QGroupBox *box = new QGroupBox; rb_ip = new QRadioButton( tr("Ip") ); rb_arp = new QRadioButton( tr("Arp") ); rb_arp->setChecked(true); list << rb_ip << rb_arp; box->setLayout( createLayout( list ) ); lay->addWidget( box ); lay->addStretch(1); frame->setLayout( lay ); connect( rb_arp, SIGNAL(clicked(bool)), SLOT(changeFrameState()) ); connect( rb_ip, SIGNAL(clicked()), SLOT(changeFrameState()) ); return frame; } QWidget* designerDialog::createIpTab() { QWidget *ip = new QWidget; QVBoxLayout *lay = new QVBoxLayout; senderIp = new ipEdit( this,tr("Sender ip: ") ); receiverIp = new ipEdit( this,tr("Receiver ip: ") ); lay->addWidget( senderIp ); lay->addWidget( receiverIp ); QGroupBox *box = new QGroupBox; QList list; rb_tcp = new QRadioButton( tr("Tcp") ); rb_udp = new QRadioButton( tr("Udp") ); rb_udp->setChecked(true); list << rb_tcp << rb_udp; box->setLayout( createLayout( list ) ); lay->addWidget( box ); lay->addStretch(1); ip->setLayout( lay ); connect( rb_tcp, SIGNAL(clicked()), SLOT(changeIpState()) ); connect( rb_udp, SIGNAL(clicked()), SLOT(changeIpState()) ); return ip; } QWidget* designerDialog::createArpTab() { QWidget *arp = new QWidget; QVBoxLayout *lay = new QVBoxLayout; QList list; QGroupBox *box = new QGroupBox; rb_response = new QRadioButton( tr("Response") ); rb_request = new QRadioButton( tr("Request") ); rb_request->setChecked(true); list << rb_response << rb_request; box->setLayout( createLayout( list ) ); lay->addWidget( box ); list.clear(); lb_arpSenderMac = new QLabel( tr("Sender mac: ") ); le_arpSenderMac = new QLineEdit; le_arpSenderMac->setInputMask("HH:HH:HH:HH:HH:HH;_"); le_arpSenderMac->setText("00:00:00:00:00:00"); list << lb_arpSenderMac << le_arpSenderMac; lay->addLayout( createLayout( list ) ); list.clear(); lb_arpReceiverMac = new QLabel( tr("Receiver mac: ") ); le_arpReceiverMac = new QLineEdit; le_arpReceiverMac->setInputMask("HH:HH:HH:HH:HH:HH;_"); le_arpReceiverMac->setText("00:00:00:00:00:00"); list << lb_arpReceiverMac << le_arpReceiverMac; lay->addLayout( createLayout( list ) ); arpSenderIp = new ipEdit( this,tr("Sender ip: ") ); arpReceiverIp = new ipEdit( this,tr("Receiver ip: ") ); lay->addWidget( arpSenderIp ); lay->addWidget( arpReceiverIp ); lay->addStretch(1); arp->setLayout( lay ); return arp; } QWidget* designerDialog::createTcpTab() { QWidget *tcp = new QWidget; QVBoxLayout *lay = new QVBoxLayout; QList list; lb_senderPort = new QLabel( tr("Sender port: ") ); sb_tcpSenderPort = new QSpinBox; sb_tcpSenderPort->setMaximum(0); sb_tcpSenderPort->setMaximum( MAX_PORT ); list << lb_senderPort << sb_tcpSenderPort; lb_receiverPort = new QLabel( tr("Receiver port: ") ); sb_tcpReceiverPort = new QSpinBox; sb_tcpReceiverPort->setMaximum(0); sb_tcpReceiverPort->setMaximum( MAX_PORT ); list << lb_receiverPort << sb_tcpReceiverPort; lay->addLayout( createLayout( list ) ); list.clear(); lb_sequence = new QLabel( tr("Sequence number: ") ); sb_sequence = new QSpinBox; sb_sequence->setMinimum(0); sb_sequence->setMaximum( MAX_TCP_NUMBER ); list << lb_sequence << sb_sequence; lb_ack = new QLabel( tr("Ack number: ") ); sb_ack = new QSpinBox; sb_ack->setMinimum(0); sb_ack->setMaximum( MAX_TCP_NUMBER ); list << lb_ack << sb_ack; lay->addLayout( createLayout( list ) ); list.clear(); QGroupBox *box = new QGroupBox( tr("Flags") ); QVBoxLayout *temp = new QVBoxLayout; cb_syn = new QCheckBox( tr("SYN") ); cb_ack = new QCheckBox( tr("ACK") ); list << cb_syn << cb_ack; temp->addLayout( createLayout( list ) ); list.clear(); cb_reset = new QCheckBox( tr("RST") ); cb_fin = new QCheckBox( tr("FIN") ); list << cb_reset << cb_fin; temp->addLayout( createLayout( list ) ); box->setLayout( temp ); lay->addWidget( box ); lay->addStretch(1); tcp->setLayout( lay ); return tcp; } QWidget* designerDialog::createUdpTab() { QWidget *udp = new QWidget; QVBoxLayout *lay = new QVBoxLayout; QList list; lb_senderPort = new QLabel( tr("Sender port: ") ); sb_udpSenderPort = new QSpinBox; sb_udpSenderPort->setMaximum(0); sb_udpSenderPort->setMaximum( MAX_PORT ); list << lb_senderPort << sb_udpSenderPort; lay->addLayout( createLayout( list ) ); lb_receiverPort = new QLabel( tr("Receiver port: ") ); sb_udpReceiverPort = new QSpinBox; sb_udpReceiverPort->setMaximum(0); sb_udpReceiverPort->setMaximum( MAX_PORT ); list.clear(); list << lb_receiverPort << sb_udpReceiverPort; lay->addLayout( createLayout( list ) ); lay->addStretch(1); udp->setLayout( lay ); return udp; } QHBoxLayout* designerDialog::createLayout( QList list ) { QHBoxLayout *temp = new QHBoxLayout; for ( int i = 0; i < list.size(); i++ ) temp->addWidget( list.at(i) ); return temp; } void designerDialog::apply() { frame Frame; Frame.setSender( le_senderMac->text() ); Frame.setReceiver( le_receiverMac->text() ); if ( rb_ip->isChecked() ) { Frame.setType( frame::ip ); ipPacket Packet( senderIp->ipText() , receiverIp->ipText() ); if ( rb_tcp->isChecked() ) { tcpPacket tcp; tcp.setSender( sb_tcpSenderPort->value() ); tcp.setReceiver( sb_tcpReceiverPort->value() ); tcp.setSequence( sb_sequence->value() ); tcp.setAck( sb_ack->value() ); quint8 flag = 0; if ( cb_ack->isChecked() ) flag |= tcpPacket::ACK; if ( cb_fin->isChecked() ) flag |= tcpPacket::FIN; if ( cb_reset->isChecked() ) flag |= tcpPacket::RST; if ( cb_syn->isChecked() ) flag |= tcpPacket::SYN; tcp.setFlag(flag); Packet.pack(tcp.toData()); } else { udpPacket udp; udp.setSender( sb_udpSenderPort->value() ); udp.setReceiver( sb_udpReceiverPort->value() ); Packet.pack( udp.toData() ); } Frame.pack(Packet.toData()); } else { Frame.setType( frame::arp ); arpPacket arp; arp.setType( ( rb_request->isChecked() ) ? arpPacket::request : arpPacket::response ); arp.setReceiverIp( arpReceiverIp->ipText() ); arp.setSenderIp( arpSenderIp->ipText() ); arp.setReceiverMac( le_arpReceiverMac->text() ); arp.setSenderMac( le_arpSenderMac->text() ); Frame.pack(arp.toData()); } myComputer->sendConstructedFrame( combo_interface->currentText(), Frame, sb_count->value() ); accept(); } void designerDialog::changeFrameState() { if ( rb_arp->isChecked() ) { tw_design->setTabEnabled( ARP_TAB, true ); tw_design->setTabEnabled( IP_TAB, false ); tw_design->setTabEnabled( TCP_TAB, false ); tw_design->setTabEnabled( UDP_TAB, false ); return; } tw_design->setTabEnabled( ARP_TAB, false ); tw_design->setTabEnabled( IP_TAB, true ); if ( rb_udp->isChecked() ) { tw_design->setTabEnabled( UDP_TAB, true ); tw_design->setTabEnabled( TCP_TAB, false ); return; } tw_design->setTabEnabled( TCP_TAB, true ); tw_design->setTabEnabled( UDP_TAB, false ); } void designerDialog::changeIpState() { if ( rb_tcp->isChecked() ) { tw_design->setTabEnabled( UDP_TAB, false ); tw_design->setTabEnabled( TCP_TAB, true ); return; } tw_design->setTabEnabled( TCP_TAB, false ); tw_design->setTabEnabled( UDP_TAB, true ); } netemul-1.0/src/dialogs/virtualnetworkdialog.h0000644000175000017500000000071211275241253020743 0ustar frostfrost#ifndef VIRTUALNETWORKDIALOG_H #define VIRTUALNETWORKDIALOG_H #include "ui_virtualnetworkdialog.h" class virtualNetworkSetting; class virtualNetworkDialog : public QDialog, private Ui::virtualNetworkDialog { Q_OBJECT public: virtualNetworkDialog(QWidget *parent = 0); void setDevice( virtualNetworkSetting *device); protected: void changeEvent(QEvent *e); private: virtualNetworkSetting *myDevice; }; #endif // VIRTUALNETWORKDIALOG_H netemul-1.0/src/dialogs/ripproperty.cpp0000644000175000017500000000335411276204703017422 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "ripproperty.h" #include "ripprogramm.h" ripProperty::ripProperty(QWidget *parent) : QDialog(parent) { setupUi(this); setAttribute( Qt::WA_DeleteOnClose ); } void ripProperty::setProgramm( ripProgramm *prog) { myProgramm = prog; cb_split->setCurrentIndex( myProgramm->splitMode() ); chb_update->setChecked( myProgramm->hasTriggerUpdate() ); } void ripProperty::apply() { myProgramm->setSplitMode( cb_split->currentIndex() ); myProgramm->setTriggerUpdate( chb_update->isChecked() ); accept(); } void ripProperty::changeEvent(QEvent *e) { QDialog::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: retranslateUi(this); break; default: break; } } netemul-1.0/src/dialogs/designerdialog.h0000644000175000017500000000573511263602433017453 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef DESIGNERDIALOG_H #define DESIGNERDIALOG_H #include class QLabel; class QRadioButton; class QLineEdit; class QCheckBox; class QTabWidget; class QHBoxLayout; class QSpinBox; class QComboBox; class ipEdit; class computer; static const int MAX_PORT = 65535; static const int MAX_TCP_NUMBER = 2147483647; static const int IP_TAB = 2; static const int ARP_TAB = 3; static const int TCP_TAB = 4; static const int UDP_TAB = 5; class designerDialog : public QDialog { Q_OBJECT public: designerDialog(computer *com); ~designerDialog() {} QWidget* createMainTab(); QWidget* createFrameTab(); QWidget* createIpTab(); QWidget* createArpTab(); QWidget* createTcpTab(); QWidget* createUdpTab(); QHBoxLayout* createLayout( QList list ); private slots: void apply(); void changeFrameState(); void changeIpState(); private: QTabWidget *tw_design; QLabel *lb_senderMac; QLabel *lb_receiverMac; QLabel *lb_arpSenderMac; QLabel *lb_arpReceiverMac; QLabel *lb_senderPort; QLabel *lb_receiverPort; QLabel *lb_sequence; QLabel *lb_ack; QLabel *lb_interface; QLabel *lb_count; QLineEdit *le_senderMac; QLineEdit *le_receiverMac; QLineEdit *le_arpSenderMac; QLineEdit *le_arpReceiverMac; QRadioButton *rb_ip; QRadioButton *rb_arp; QRadioButton *rb_tcp; QRadioButton *rb_udp; QRadioButton *rb_response; QRadioButton *rb_request; QCheckBox *cb_syn; QCheckBox *cb_ack; QCheckBox *cb_fin; QCheckBox *cb_reset; QPushButton *btn_ok; QPushButton *btn_cancel; QSpinBox *sb_tcpSenderPort; QSpinBox *sb_tcpReceiverPort; QSpinBox *sb_udpSenderPort; QSpinBox *sb_udpReceiverPort; QSpinBox *sb_sequence; QSpinBox *sb_ack; QSpinBox *sb_count; QComboBox *combo_interface; ipEdit *senderIp; ipEdit *receiverIp; ipEdit *arpSenderIp; ipEdit *arpReceiverIp; computer *myComputer; }; #endif // DESIGNERDIALOG_H netemul-1.0/src/dialogs/virtualnetworkdialog.cpp0000644000175000017500000000075511275241253021305 0ustar frostfrost#include "virtualnetworkdialog.h" virtualNetworkDialog::virtualNetworkDialog(QWidget *parent) : QDialog(parent) { setupUi(this); setAttribute(Qt::WA_DeleteOnClose); } void virtualNetworkDialog::setDevice( virtualNetworkSetting *device) { myDevice = device; } void virtualNetworkDialog::changeEvent(QEvent *e) { QDialog::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: retranslateUi(this); break; default: break; } } netemul-1.0/src/dialogs/routeeditor.h0000644000175000017500000000406011265161115017025 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef ROUTEEDITOR_H #define ROUTEEDITOR_H #include #include class QTableView; class QPushButton; class QSpinBox; class QComboBox; class ipEdit; class smartDevice; class routeModel; /*! Реализует отображение таблицы маршрутизации. */ class routeEditor : public QDialog { Q_OBJECT public: routeEditor(smartDevice *s); ~routeEditor(); private: void readSetting(); void writeSetting() const; QStringList filterConnectedSocket(QStringList list); QStringList suffixList; QStringList ipList; ipEdit *ip_dest; ipEdit *ip_mask; ipEdit *ip_gateway; QComboBox *cb_out; QSpinBox *sp_metr; QPushButton *btn_add; QPushButton *btn_remove; QPushButton *btn_close; QTableView *table; routeModel *model; smartDevice *dev; private slots: void selectAdapter(int number); void addRecord(); void deleteRecord(); void checkSelection(QModelIndex curr); }; //-------------------------------------------------- #endif // ROUTEEDITOR_H netemul-1.0/src/dialogs/logdialog.h0000644000175000017500000000451611263602433016430 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef LOGDIALOG_H #define LOGDIALOG_H #include "ui_logdialog.h" #include "frame.h" static const QColor cl_frame = "#fbec5d"; static const QColor cl_ipInternal = "#efaf8c"; static const QColor cl_udpInternal = "#ccccff"; static const QColor cl_rip = "#f78d9d"; static const QColor cl_user = "#badbad"; static const QColor cl_dhcp = "#f2e8c9" ; static const QColor cl_undef = "#f984e5"; static const QColor cl_arp = "#7fc7ff"; static const QColor cl_arpInternal = "#c0c0c0"; static const QColor cl_tcpInternal = "#98ff98"; static const QColor cl_tcpData = "#c59cff"; class logDialog : public QWidget , private Ui::logDialog { Q_OBJECT Q_DISABLE_COPY(logDialog) public: logDialog(QStringList list); ~logDialog(); enum { send = 0, receive = 1 }; enum { all = 0 , arp = 1 , tcp = 2 , udp = 3 }; signals: void changeInterface(QString); public slots: void receiveData(frame fr,QString port); void sendData(frame fr,QString port); protected: bool eventFilter(QObject *obj,QEvent *e); void changeEvent(QEvent *e); private: void printRecord( int c, frame fr ); QTreeWidgetItem* newItemWidget( QTreeWidgetItem *parent , const QString &text , const QColor color = "#FFFFFF"); QString parseIp(frame fr,QTreeWidgetItem *parent); QString parseArp(frame fr,QTreeWidgetItem *parent); }; #endif // LOGDIALOG_H netemul-1.0/src/dialogs/switchproperty.h0000644000175000017500000000312211277100130017555 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef SWITCHPROPERTY_H #define SWITCHPROPERTY_H #include "dialogtemplate.h" class QComboBox; class QLineEdit; class QLabel; class QCheckBox; class boxSetting; class ipEdit; class switchProperty : public dialogTemplate { Q_OBJECT Q_DISABLE_COPY(switchProperty) public: switchProperty(); ~switchProperty(); void setSwitch(boxSetting *d); private: boxSetting *sw; QComboBox *cb_count; QCheckBox *chb_manual; QLabel *lb_statics; QLabel *lb_mac; QLineEdit *le_mac; public slots: void reset(); void apply(); }; #endif // SWITCHPROPERTY_H netemul-1.0/src/dialogs/adapterproperty.cpp0000644000175000017500000001652111274363172020254 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include #include #include #include #include #include "adapterproperty.h" #include "smartdevice.h" #include "ipedit.h" /*! Конструктор создает основной интерфейс диалога. */ adapterProperty::adapterProperty(adapterSetting *s) { setWindowTitle(tr("Netcard")); sd = s; QVBoxLayout *all = new QVBoxLayout; tab_interfaces = new QTabBar; for ( int i = 0 ; i < sd->socketsCount() ; i++ ) { sd->setCurrent(i); tab_interfaces->addTab( sd->isConnectSocketIcon() , sd->name() ); } all->addWidget(tab_interfaces); QHBoxLayout *temp = new QHBoxLayout; QLabel *lbl_temp = new QLabel(tr("Netcard name: ")); le_name = new QLineEdit; le_name->setMaxLength(10); le_name->setReadOnly(true); temp->addWidget(lbl_temp); temp->addWidget(le_name); all->addLayout(temp); connect(le_name, SIGNAL(textChanged(QString)), SLOT(applyEnable())); temp = new QHBoxLayout; lbl_temp = new QLabel(tr("Mac-address: ")); le_mac = new QLineEdit; le_mac->setInputMask("HH:HH:HH:HH:HH:HH;_"); le_mac->setDragEnabled(true); temp->addWidget(lbl_temp); temp->addWidget(le_mac); all->addLayout(temp); connect(le_mac, SIGNAL(textChanged(QString)), SLOT(applyEnable())); le_ip = new ipEdit(this,tr("Ip-address: ")); all->addWidget(le_ip); connect(le_ip, SIGNAL(textChanged(QString)), SLOT(applyEnable())); le_mask = new ipEdit(this,tr("Mask: ")); all->addWidget(le_mask); lb_statics = new QLabel; connect(le_mask, SIGNAL(textChanged(QString)), SLOT(applyEnable())); all->addWidget(lb_statics); all->addStretch(1); QHBoxLayout *b = new QHBoxLayout; b->addStretch(1); cb_auto = new QCheckBox(tr("Receive settings automatically")); connect( cb_auto , SIGNAL(clicked(bool)) , SLOT(onAutoClicked(bool)) ); connect( cb_auto , SIGNAL(clicked()) , SLOT(applyEnable()) ); all->addWidget( cb_auto ); cb_auto->setEnabled( sd->hasDhcpClient() ); if ( sd->canManageInterface() ) { btn_add = new QPushButton(QIcon(":/im/images/edit_add.png") , tr("Add") ); btn_del = new QPushButton(QIcon(":/im/images/edit_remove.png") , tr("Delete") ); connect( btn_add , SIGNAL(clicked()) , SLOT(addInterface()) ); connect( btn_del , SIGNAL(clicked()) , SLOT(deleteInterface()) ); b->addWidget(btn_add, 0 , Qt::AlignRight); b->addWidget(btn_del, 0 , Qt::AlignRight); } QPushButton *btn_reset = new QPushButton(QIcon(":/im/images/refresh.png"),tr("Reset statistics")); connect( btn_reset , SIGNAL(clicked()) , SLOT(reset())); b->addWidget(btn_reset, 0 , Qt::AlignRight); all->addLayout(b); all->addLayout(lay); setLayout(all); connect( le_ip , SIGNAL(maskChanged(quint8)) , le_mask , SLOT(setDefaultMask(quint8))); connect( tab_interfaces , SIGNAL(currentChanged(int)) , SLOT(changeTab(int))); btn_apply->setEnabled(false); updateTab(0); setAttribute(Qt::WA_DeleteOnClose); } //----------------------------------------------------------- /*! Деструктор снимает выделение определенного интерфейса у устройства, тем самым когда мы выходим из дилога у нас нет выделенного кабеля. */ adapterProperty::~adapterProperty() { sd->setCheckedSocket(""); delete sd; } //-------------------------------------------------- /*! При смене вкладки вызывает обновление содержимого. @param n - Номер выбранной вкладки. */ void adapterProperty::changeTab(int n) { updateTab(n); } //-------------------------------------------------------- /*! Обновляет содержимое диалога в зависимости от выбранного адапетра. @param d - указатель на сокет выбранного интерфейса. */ void adapterProperty::updateTab(int n) { sd->setCurrent(n); le_name->setText( sd->name() ); le_mac->setText( sd->mac() ); le_ip->setText( sd->ip() ); le_mask->setText( sd->mask() ); lb_statics->setText( sd->statics() ); cb_auto->setChecked(false); if ( sd->hasDhcpClient() ) { onAutoClicked( sd->isUnderDhcpControl() ); cb_auto->setChecked( sd->isUnderDhcpControl() ); } if (sd) sd->setCheckedSocket( sd->name() ); } //----------------------------------------------------- /*! Применить сделанные изменения. */ void adapterProperty::apply() { sd->setMac( le_mac->text() ); sd->setIp( le_ip->text() ); sd->setMask( le_mask->text() ); sd->connectedNet(); sd->setCurrent( tab_interfaces->currentIndex() ); if ( sd->hasDhcpClient() ) { sd->setUnderDhcpControl( cb_auto->isChecked() ); } if ( sd->isConnect() ) sd->sendArpRequest(le_ip->text()); if ( sender() == btn_ok ) accept(); } //------------------------------------------------------------ /*! Слот сбрасывает всю статистику у адаптера. */ void adapterProperty::reset() { sd->resetStatics(); updateTab(tab_interfaces->currentIndex()); } //------------------------------------------------------------ void adapterProperty::addInterface() { sd->addInterface(); sd->setCurrent( tab_interfaces->count() ); tab_interfaces->addTab( sd->isConnectSocketIcon() , sd->name() ); tab_interfaces->setCurrentIndex( tab_interfaces->count() - 1); updateTab( tab_interfaces->count() - 1 ); } void adapterProperty::deleteInterface() { if ( sd->isConnect() ) { QMessageBox::warning(this,tr("Error") , tr("First, remove the cable!") , QMessageBox::Ok, QMessageBox::Ok ); return; } if ( tab_interfaces->count() == 1 ) { QMessageBox::warning(this,tr("Error") , tr("At least a netcard must exist") , QMessageBox::Ok , QMessageBox::Ok ); return; } sd->deleteInterface( le_name->text() ); tab_interfaces->removeTab( sd->current() ); tab_interfaces->setCurrentIndex(0); updateTab(0); } void adapterProperty::onAutoClicked(bool isAuto) { le_ip->setEnabled( !isAuto ); le_mask->setEnabled( !isAuto ); } netemul-1.0/src/dialogs/settingdialog.h0000644000175000017500000000274311271035563017327 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef SETTINGDIALOG_H #define SETTINGDIALOG_H #include #include "ui_settingdialog.h" class settingDialog : public QDialog , private Ui::settingDialog { Q_OBJECT Q_DISABLE_COPY( settingDialog ) public: settingDialog(); void currentValues(); public slots: void apply(); void applyEnable(); void defaultSettings(); void autosaveChanged(bool isAutosave); protected: virtual void changeEvent(QEvent *e); }; #endif // SETTINGDIALOG_H netemul-1.0/src/dialogs/dhcpserverproperty.cpp0000644000175000017500000000761211276270637021007 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include #include "dhcpserverproperty.h" #include "dhcpserverprogramm.h" #include "dhcpservermodel.h" #include "smartdevice.h" #include "macaddressdelegate.h" #include "ipaddressdelegate.h" dhcpServerProperty::dhcpServerProperty(smartDevice *dev,QWidget *parent /* = 0 */) : QDialog(parent) { setupUi(this); device = dev; setAttribute(Qt::WA_DeleteOnClose); foreach ( interface *i, device->interfaces() ) if ( i->isConnect() ) cb_interface->addItem( QIcon(":im/images/ok.png"), i->name() ); macDelegate = new macAddressDelegate(this); ipDelegate = new ipAddressDelegate(this); tv_static->setItemDelegateForColumn(0, macDelegate ); for ( int i = 1 ; i <= 3 ; i++ ) tv_static->setItemDelegateForColumn(i,ipDelegate); connect( ie_begin , SIGNAL(maskChanged(quint8)) , ie_mask , SLOT(setDefaultMask(quint8)) ); } dhcpServerProperty::~dhcpServerProperty() { delete macDelegate; } void dhcpServerProperty::setProgramm(dhcpServerProgramm *prog) { myProgramm = prog; myModel = myProgramm->dhcpModel(); tv_static->setModel( myModel ); QHeaderView *h = tv_static->horizontalHeader(); h->setResizeMode( QHeaderView::Stretch ); cb_dynamic->setChecked(myProgramm->dynamic()); sb_time->setValue(myProgramm->time()); ie_begin->setText(myProgramm->beginIp()); ie_end->setText(myProgramm->endIp()); ie_mask->setText(myProgramm->mask()); ie_gatew->setText(myProgramm->gateway()); cb_interface->setCurrentIndex( cb_interface->findText(myProgramm->interfaceName() )); sb_waitingTime->setValue( myProgramm->waitingTime() ); } void dhcpServerProperty::addRecord() { myModel->insertRow( myModel->rowCount() ); } void dhcpServerProperty::deleteRecord() { myModel->removeRow( tv_static->currentIndex().row() ); } void dhcpServerProperty::changeState(bool b) { ie_begin->setEnabled(b); ie_end->setEnabled(b); ie_mask->setEnabled(b); ie_gatew->setEnabled(b); sb_time->setEnabled(b); lb_term->setEnabled(b); } void dhcpServerProperty::apply() { if ( ie_begin->ipText() > ie_end->ipText() ) { QMessageBox::warning(0,tr("Wrong range"),tr("You have entered a wrong IP range."), QMessageBox::Ok, QMessageBox::Ok); return; } myProgramm->setInterfaceName(cb_interface->currentText()); myProgramm->setBeginIp(ie_begin->ipText().toString()); myProgramm->setEndIp(ie_end->ipText().toString()); myProgramm->setMask(ie_mask->ipText().toString()); myProgramm->setGateway(ie_gatew->ipText().toString()); myProgramm->setTime(sb_time->value()); myProgramm->setDynamic(cb_dynamic->isChecked()); myProgramm->setWaitingTime(sb_waitingTime->value()); accept(); } void dhcpServerProperty::changeEvent(QEvent *e) { QDialog::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: retranslateUi(this); break; default: break; } } netemul-1.0/src/dialogs/connectdialog.cpp0000644000175000017500000000517211261705352017634 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "connectdialog.h" #include "device.h" #include "interface.h" connectDialog::connectDialog(device *s, device *e) { setupUi(this); start = s; end = e; connect( startList , SIGNAL(itemSelectionChanged()) , SLOT(changeSelect())); connect( endList , SIGNAL(itemSelectionChanged()) , SLOT(changeSelect())); foreach ( QString i , start->sockets() ) new QListWidgetItem( start->isConnectSocketIcon(i) , i , startList, start->isConnectSocket(i) ); foreach ( QString i , end->sockets() ) new QListWidgetItem( end->isConnectSocketIcon(i) , i , endList, end->isConnectSocket(i) ); for ( int i = 0 ; i < startList->count() ; i++ ) if ( !startList->item(i)->type() ) { startList->setCurrentRow(i); break; } for ( int i = 0 ; i < endList->count() ; i++ ) if ( !endList->item(i)->type() ) { endList->setCurrentRow(i); break; } resize( sizeHint()); // НЕ НАДО СТАВИТЬ ЗДЕСЬ setAttribute(Qt::WA_DeleteOnClose); !!! руки оторву тому кто постАВИТ !!! } void connectDialog::changeSelect() { if ( startList->currentRow() < 0 || endList->currentRow() < 0 ) { okButton->setEnabled(false); return; } okButton->setEnabled( !start->isConnectSocket( startList->currentItem()->text() ) && !end->isConnectSocket( endList->currentItem()->text() ) ); } void connectDialog::changeEvent(QEvent *e) { switch (e->type()) { case QEvent::LanguageChange: retranslateUi(this); break; default: break; } } netemul-1.0/src/dialogs/tableswitch.h0000644000175000017500000000303611261705352016776 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef TABLESWITCH_H #define TABLESWITCH_H #include "ui_tableswitch.h" class switchTableSetting; class switchModel; class tableSwitch : public QDialog , private Ui::tableSwitch { Q_OBJECT Q_DISABLE_COPY(tableSwitch) public: explicit tableSwitch(switchTableSetting *s); private: switchTableSetting *sw; switchModel *t_sw; private slots: void addRecord(); void deleteRecord(); void selectionChanged(); void resetSelection(); protected: virtual void changeEvent(QEvent *e); }; #endif // TABLESWITCH_H netemul-1.0/src/dialogs/aboutwindow.h0000644000175000017500000000241311252300033017010 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef ABOUTWINDOW_H #define ABOUTWINDOW_H #include "ui_aboutwindow.h" class aboutWindow : public QDialog, private Ui::aboutWindow { Q_OBJECT public: aboutWindow(QWidget *parent = 0); protected: void changeEvent(QEvent *e); }; #endif // ABOUTWINDOW_H netemul-1.0/src/dialogs/connectdialog.h0000644000175000017500000000310311261705352017271 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef CONNECTDIALOG_H #define CONNECTDIALOG_H class device; #include "ui_connectdialog.h" class connectDialog : public QDialog , private Ui::connectDilog { Q_OBJECT Q_DISABLE_COPY(connectDialog) public: explicit connectDialog(device *start,device *end); public slots: void changeSelect(); QString getStart() { return startList->currentItem()->text(); } QString getEnd() { return endList->currentItem()->text(); } private: device *start; device *end; protected: virtual void changeEvent(QEvent *e); }; #endif // CONNECTDIALOG_H netemul-1.0/src/dialogs/dialogs.pri0000644000175000017500000000324511274657601016463 0ustar frostfrostHEADERS += src/dialogs/adapterproperty.h \ src/dialogs/computerproperty.h \ src/dialogs/connectdialog.h \ src/dialogs/dialogtemplate.h \ src/dialogs/hubproperty.h \ src/dialogs/installdialog.h \ src/dialogs/programmdialog.h \ src/dialogs/routeeditor.h \ src/dialogs/routerproperty.h \ src/dialogs/senddialog.h \ src/dialogs/settingdialog.h \ src/dialogs/switchproperty.h \ src/dialogs/tablearp.h \ src/dialogs/tableswitch.h \ src/dialogs/testdialog.h \ src/dialogs/staticsdialog.h \ src/dialogs/logdialog.h \ src/dialogs/aboutwindow.h \ src/dialogs/dhcpclientproperty.h \ src/dialogs/ripproperty.h \ src/dialogs/dhcpserverproperty.h \ src/dialogs/designerdialog.h \ src/dialogs/virtualnetworkdialog.h \ src/dialogs/devicenotedialog.h SOURCES += src/dialogs/adapterproperty.cpp \ src/dialogs/computerproperty.cpp \ src/dialogs/connectdialog.cpp \ src/dialogs/dialogtemplate.cpp \ src/dialogs/hubproperty.cpp \ src/dialogs/installdialog.cpp \ src/dialogs/programmdialog.cpp \ src/dialogs/routeeditor.cpp \ src/dialogs/routerproperty.cpp \ src/dialogs/senddialog.cpp \ src/dialogs/settingdialog.cpp \ src/dialogs/switchproperty.cpp \ src/dialogs/tablearp.cpp \ src/dialogs/tableswitch.cpp \ src/dialogs/testdialog.cpp \ src/dialogs/staticsdialog.cpp \ src/dialogs/logdialog.cpp \ src/dialogs/aboutwindow.cpp \ src/dialogs/dhcpclientproperty.cpp \ src/dialogs/ripproperty.cpp \ src/dialogs/dhcpserverproperty.cpp \ src/dialogs/designerdialog.cpp \ src/dialogs/virtualnetworkdialog.cpp \ src/dialogs/devicenotedialog.cpp netemul-1.0/src/dialogs/settingdialog.cpp0000644000175000017500000000756511271035563017671 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "settingdialog.h" #include "appsetting.h" settingDialog::settingDialog() { setupUi(this); currentValues(); setAttribute(Qt::WA_DeleteOnClose); } void settingDialog::currentValues() { sp_arpResponce->setValue( appSetting::arpResponceTime() ); sp_ttlArp->setValue( appSetting::ttlArp() ); computerComboBox->setCurrentIndex( computerComboBox->findText(QString::number( appSetting::defaultComputerCount() ) ) ); hubComboBox->setCurrentIndex( hubComboBox->findText( QString::number( appSetting::defaultHubCount() ) ) ); switchComboBox->setCurrentIndex( switchComboBox->findText( QString::number( appSetting::defaultSwitchCount() ) ) ); sp_ttlMac->setValue( appSetting::ttlMac() ); routerComboBox->setCurrentIndex( routerComboBox->findText(QString::number( appSetting::defaultRouterCount() ) ) ); int s = appSetting::animateSpeed(); sl_speed->setValue(s); languageBox->setCurrentIndex( appSetting::language() ); sb_send->setValue(appSetting::sendingNum()); sb_waitingTime->setValue(appSetting::waitingTime()); cb_opengl->setChecked( appSetting::hasOpengl() ); cb_autosave->setChecked( appSetting::isAutosave() ); sb_autosave->setValue( appSetting::autosaveInterval() ); btn_apply->setEnabled(false); } void settingDialog::applyEnable() { btn_apply->setEnabled(true); } void settingDialog::apply() { appSetting::setDefaultComputerCount( computerComboBox->currentText().toInt() ); appSetting::setDefaultHubCount( hubComboBox->currentText().toInt() ); appSetting::setDefaultSwitchCount( switchComboBox->currentText().toInt() ); appSetting::setDefaultRouterCount( routerComboBox->currentText().toInt() ); appSetting::setTtlArp( sp_ttlArp->value() ); appSetting::setArpResponceTime( sp_arpResponce->value() ); appSetting::setTtlMac( sp_ttlMac->value() ); appSetting::setAnimateSpeed(sl_speed->value()); appSetting::setLanguage( languageBox->currentIndex() ); appSetting::setSendingNum(sb_send->value()); appSetting::setWaitingTime(sb_waitingTime->value()); appSetting::setHasOpengl( cb_opengl->isChecked() ); appSetting::setAutosaveInterval( sb_autosave->value() ); appSetting::setAutosave( cb_autosave->isChecked() ); btn_apply->setEnabled(false); if ( sender() == btn_ok ) accept(); } void settingDialog::autosaveChanged(bool isAutosave) { sb_autosave->setEnabled(isAutosave); } void settingDialog::defaultSettings() { appSetting::defaultNums(); currentValues(); } void settingDialog::changeEvent(QEvent *e) { switch (e->type()) { case QEvent::LanguageChange: retranslateUi(this); languageBox->setCurrentIndex( appSetting::language() ); listWidget->setSpacing( listWidget->spacing() ); break; default: break; } } netemul-1.0/src/ipedit.h0000644000175000017500000000372611270341054014322 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef IPEDIT_H #define IPEDIT_H #include #include "ipaddress.h" class QLineEdit; class QLabel; /** Виджет для ввода ip адреса. */ class ipEdit : public QWidget { Q_OBJECT Q_PROPERTY( QString labelText READ labelText WRITE setLabelText DESIGNABLE true) public: ipEdit(QWidget *parent = 0, QString str = ""); void setText(QString str); ipAddress ipText() const { return ipAddress(text()); } QString text() const; void setLabelText(const QString text); QString labelText() const; void clear(); QSize sizeHint() const; void setLabelVisible(bool isVisible); public slots: void setDefaultMask(quint8 u); void changeMask(QString s); private: QLabel *label; QLineEdit *part[4]; signals: void textChanged(QString); void maskChanged(quint8); protected: bool eventFilter(QObject *obj, QEvent *event); }; //----------------------------------------- #endif // IPEDIT_H netemul-1.0/src/interfaces/0000755000175000017500000000000011305026150015002 5ustar frostfrostnetemul-1.0/src/interfaces/visualizable.h0000644000175000017500000000021611303041536017647 0ustar frostfrost#ifndef VISUALIZABLE_H #define VISUALIZABLE_H class visualizable { public: virtual void onImplChange() = 0; }; #endif // VISUALIZABLE_H netemul-1.0/src/interfaces/visualizable.cpp0000644000175000017500000000003311303041536020177 0ustar frostfrost#include "visualizable.h" netemul-1.0/src/interfaces/interfaces.pri0000644000175000017500000000012411303041536017641 0ustar frostfrostHEADERS += src/interfaces/visualizable.h SOURCES += src/interfaces/visualizable.cpp netemul-1.0/src/ipedit.cpp0000644000175000017500000001217311270341054014651 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "ipedit.h" #include #include #include #include #include #include /** Создает внешнее оформление виджета. @param str - строка отображаемая перед полем ввода. @param parent - виджет родитель. */ ipEdit::ipEdit(QWidget *parent /* = 0 */, QString str /* = "" */) : QWidget(parent) { QIntValidator *v = new QIntValidator(1,255,this); QHBoxLayout *all = new QHBoxLayout; label = new QLabel(str); label->setFixedWidth(150); all->addWidget(label,0,Qt::AlignLeft); all->addStretch(1); part[0] = new QLineEdit(this); part[0]->setFixedSize(45,25); part[0]->setMaxLength(3); part[0]->setValidator(v); part[0]->installEventFilter(this); // setFixedSize( 450 , part[0]->height()+10 ); connect( part[0] , SIGNAL(textChanged(QString)), SIGNAL(textChanged(QString))); connect( part[0] , SIGNAL(textChanged(QString)), SLOT(changeMask(QString))); all->addWidget(part[0] ); for ( int i = 1 ; i < 4; i++) { QLabel *p = new QLabel("."); p->setAlignment(Qt::AlignBottom | Qt::AlignHCenter); all->addWidget(p,0,Qt::AlignRight); part[i] = new QLineEdit(this); part[i]->setFixedSize(45,25); part[i]->setMaxLength(3); part[i]->setValidator(v); part[i]->installEventFilter(this); all->addWidget(part[i]); connect(part[i] , SIGNAL(textChanged(QString)), SIGNAL(textChanged(QString))); } clear(); setLayout(all); setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); } void ipEdit::setText(QString str) { QStringList s = str.split("."); for (int i = 0 ; i < 4 ; i++) part[i]->setText(s.at(i)); } QSize ipEdit::sizeHint() const { return QSize(label->width() + part[0]->width() * 4 + 50, part[0]->height() +10 ); } QString ipEdit::text() const { QString s; s = part[0]->text(); for ( int i = 1; i < 4 ; i++) s += QChar('.') + part[i]->text(); return s; } /*! Сбрасывает значения всех полей в 0. */ void ipEdit::clear() { for (int i = 0 ; i < 4 ; i++) part[i]->setText("0"); } //--------------------------------------- /*! Исходя из первого байта ip адреса выставляет маску по умолчанию для этого класса сетей. @param u- первый байт ip адреса. */ void ipEdit::setDefaultMask(quint8 u) { int n; if ( u >= 1 && u < 127 ) n = 1; // Далее это число else if ( u >= 127 && u < 192 ) n = 2; // Скажет нам к какому классу else if ( u >= 192 && u < 224 ) n = 3; // Сетей относиться адрес else n = 0; clear(); // Очистим for ( int i = 0 ; i < n ; i++ ) part[i]->setText("255"); // И выствавим нужные нам в 255. } //---------------------------------------- /*! Слот посылает сигнал о том что изменился первый октет ip адреса сигнал может быть перехвачен другим ipEdit и использован для задания маски через слот setDefaultMask. */ void ipEdit::changeMask(QString s) { quint8 u = s.toInt(); emit maskChanged(u); } //------------------------------------------- bool ipEdit::eventFilter(QObject *obj, QEvent *event) { if ( event->type() == QEvent::KeyPress ) { QKeyEvent *e = static_cast(event); switch ( e->key() ) { case Qt::Key_Left : focusPreviousChild(); break; case Qt::Key_Right : focusNextChild(); break; case Qt::Key_Space : focusNextChild(); break; default: return QWidget::eventFilter(obj,event); } return true; } return QWidget::eventFilter(obj,event); } void ipEdit::setLabelVisible(bool isVisible) { label->setVisible(isVisible); } void ipEdit::setLabelText(const QString text) { label->setText(text); } QString ipEdit::labelText() const { return label->text(); } netemul-1.0/src/tools/0000755000175000017500000000000011305026151014020 5ustar frostfrostnetemul-1.0/src/tools/scenexmlwriter.cpp0000644000175000017500000000141111276453652017615 0ustar frostfrost#include "scenexmlwriter.h" #include "mycanvas.h" #include "device.h" sceneXmlWriter::sceneXmlWriter(myCanvas *scene) : myScene(scene) { setAutoFormatting(true); } void sceneXmlWriter::writeScene(QIODevice *dev) { setDevice(dev); writeStartDocument(); writeStartElement("netemul"); writeAttribute("version",QCoreApplication::applicationVersion() ); foreach ( device::device *i , myScene->devices() ) i->writeXml(*this); foreach ( textItem *i , myScene->textItems() ) { writeStartElement("textitem"); writeAttribute("x" , QString::number( i->pos().x() ) ); writeAttribute("y", QString::number( i->pos().y() ) ); writeCharacters( i->toPlainText() ); writeEndElement(); } writeEndDocument(); } netemul-1.0/src/tools/statistics.h0000644000175000017500000000505011276013507016373 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef STATISTICS_H #define STATISTICS_H #include class statistics { public: enum { ReceiveFrames = 0 , SendFrames = 1 , ReceivePackets = 2 , SendPackets = 3 }; statistics(); ~statistics() { } statistics(const statistics &other); statistics operator=(const statistics &other); statistics operator+(const statistics &other); statistics operator+=(const statistics &other); QString toString() const; void clear(); quint64 receiveFrames() { return myReceiveFrames; } quint64 sendFrames() { return mySendFrames; } quint64 sendPackets() { return mySendPackets; } quint64 receivePackets() { return myReceivePackets; } void incReceiveFrames() { myReceiveFrames++; } void incSendFrames() { mySendFrames++; } void incSendPackets() { mySendPackets++; } void incReceivePackets() { myReceivePackets++; } private: quint64 myReceiveFrames; quint64 mySendFrames; quint64 mySendPackets; quint64 myReceivePackets; protected: friend QDataStream& operator<<(QDataStream &stream, const statistics &st); friend QDataStream& operator>>(QDataStream &stream, statistics &st); }; inline QDataStream& operator<<(QDataStream &stream, const statistics &st) { stream << st.myReceiveFrames << st.mySendFrames << st.myReceivePackets << st.mySendPackets; return stream; } inline QDataStream& operator>>(QDataStream &stream, statistics &st) { stream >> st.myReceiveFrames >> st.mySendFrames >> st.myReceivePackets >> st.mySendPackets; return stream; } #endif // STATISTICS_H netemul-1.0/src/tools/abstractsocket.cpp0000644000175000017500000000263411274363172017561 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "abstractsocket.h" #include "smartdevice.h" abstractSocket::abstractSocket(smartDevice *d) { dev = d; dev->mySockets << this; } abstractSocket::~abstractSocket() { dev->mySockets.removeOne(this); } bool abstractSocket::isOurData(ipAddress address, quint16 port) { if ( myBind.isEmpty() || myBind == address ) { if ( port == myBindPort ) return true; } return false; } netemul-1.0/src/tools/udpsocket.h0000644000175000017500000000274211252300033016172 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef UDPSOCKET_H #define UDPSOCKET_H #include "abstractsocket.h" #include #include class udpSocket : public abstractSocket { Q_OBJECT public: enum { PACKET_SIZE = 1024 }; udpSocket() { } udpSocket(smartDevice *d, quint16 port); ~udpSocket() { } void treatPacket(ipPacket p); void write(ipAddress address, quint16 port, QByteArray data); private: void writeBroadcast(quint16 port, QByteArray data); }; #endif // UDPSOCKET_H netemul-1.0/src/tools/tcpsocket.h0000644000175000017500000000433011255455500016200 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef TCPSOCKET_H #define TCPSOCKET_H #include "abstractsocket.h" #include "tcppacket.h" class tcpSocket : public abstractSocket { Q_OBJECT public: enum { Sequence = 5000, PACKET_SIZE = 1024 }; enum { NONE = 0, WAIT_RESPONSE = 1, WAIT_ACK = 2, R_WAIT = 3, RECEIVE = 4 }; tcpSocket() { } tcpSocket(smartDevice *d,quint16 port); ~tcpSocket(); void setConnection(); void treatPacket(ipPacket p); void confirmConnection(ipPacket p); void secondEvent(); void write(ipAddress a, quint16 p, QByteArray data); bool isBusy() const { return !buffer.isEmpty(); } signals: void writeEnd(); void receiveEnd(); private: void sendMessage(tcpPacket t) const; void sendWindow(); void sendAck(); void receiveSynAck(tcpPacket t); void receiveAck(tcpPacket t); void error(); tcpPacket createPacket( quint32 sequence, quint32 ack, quint8 flag) const; int state; quint16 myReceiverPort; quint32 sendIsn; quint32 receiveIsn; quint32 isn; int timeout; int inputTime; int panicTime; int lastNum; int sendingNum; // Число повторных отправлений int waitingTime; QByteArray buffer; }; #endif // TCPSOCKET_H netemul-1.0/src/tools/statistics.cpp0000644000175000017500000000471511252300033016720 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "statistics.h" statistics::statistics() { clear(); } void statistics::clear() { myReceiveFrames = 0 ; myReceivePackets = 0 ; mySendFrames = 0; mySendPackets = 0; } statistics::statistics(const statistics &other) { myReceiveFrames = other.myReceiveFrames ; myReceivePackets = other.myReceivePackets ; mySendFrames = other.mySendFrames ; mySendPackets = other.mySendPackets ; } statistics statistics::operator=(const statistics &other) { myReceiveFrames = other.myReceiveFrames ; myReceivePackets = other.myReceivePackets ; mySendFrames = other.mySendFrames ; mySendPackets = other.mySendPackets ; return *this; } statistics statistics::operator+(const statistics &other) { statistics temp; temp.myReceiveFrames = myReceiveFrames + other.myReceiveFrames ; temp.myReceivePackets = myReceivePackets + other.myReceivePackets ; temp.mySendFrames = mySendFrames + other.mySendFrames ; temp.mySendPackets = mySendPackets + other.mySendPackets ; return temp; } statistics statistics::operator+=(const statistics &other) { *this = *this + other; return *this; } QString statistics::toString() const { QString t; t += QObject::tr("Received frames: %1\n").arg( myReceiveFrames ) + QObject::tr("Received packets: %1\n").arg( myReceivePackets ) + QObject::tr("Sent frames: %1\n").arg( mySendFrames ) + QObject::tr("Sent packets: %1\n").arg( mySendPackets ) ; return t; } netemul-1.0/src/tools/scenexmlwriter.h0000644000175000017500000000044311276013507017255 0ustar frostfrost#ifndef SCENEXMLWRITER_H #define SCENEXMLWRITER_H #include class myCanvas; class sceneXmlWriter : public QXmlStreamWriter { public: sceneXmlWriter(myCanvas *scene); void writeScene(QIODevice *dev); private: myCanvas *myScene; }; #endif // SCENEXMLWRITER_H netemul-1.0/src/tools/tcpsocket.cpp0000644000175000017500000001264311254065431016540 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include #include "tcpsocket.h" #include "ippacket.h" #include "smartdevice.h" #include "routemodel.h" #include "appsetting.h" tcpSocket::tcpSocket(smartDevice *d,quint16 port) : abstractSocket(d) { myBindPort = port; isn = qrand()%Sequence; inputTime = 0; lastNum = 0; receiveIsn = 0; state = NONE; buffer.clear(); sendingNum = 0; } tcpSocket::~tcpSocket() { } void tcpSocket::write(ipAddress a, quint16 p, QByteArray data) { myBind = a; myReceiverPort = p; buffer = data; setConnection(); } void tcpSocket::setConnection() { waitingTime = 0; timeout = 0; tcpPacket t = createPacket(isn, 0, tcpPacket::SYN); sendMessage(t); state = WAIT_RESPONSE; } void tcpSocket::sendMessage(tcpPacket t) const { ipPacket p; p.pack(t.toData()); ipAddress gw; routeRecord *r = dev->myRouteTable->recordAt(myBind); if ( !r ) return; if ( r->gateway != r->out ) gw = r->gateway; p.setSender(r->out); p.setReceiver(myBind); p.setUpProtocol(smartDevice::TCP); dev->ipToAdapter(r->out)->sendPacket(p,gw); } void tcpSocket::treatPacket(ipPacket p) { tcpPacket tcp(p.unpack()); if ( state == NONE && tcp.flag() != tcpPacket::SYN ) { deleteLater(); return; } if ( tcp.flag() == tcpPacket::ACK) { receiveAck(tcp); return; } if ( tcp.flag() == tcpPacket::NO_FLAGS ) { if ( state == R_WAIT ) { tcpPacket a = createPacket(0,0,tcpPacket::RST); sendMessage(a); deleteLater(); return; } inputTime = 0; lastNum = tcp.sequence(); return; } if ( tcp.flag() == tcpPacket::FIN ) { lastNum = tcp.sequence(); sendAck(); emit receiveEnd(); } if ( tcp.flag() == (tcpPacket::SYN | tcpPacket::ACK) ) { receiveSynAck(tcp); return; } if ( tcp.flag() == tcpPacket::SYN ) { confirmConnection(p); return; } if ( tcp.flag() == tcpPacket::RST ) { error(); return; } } void tcpSocket::receiveSynAck(tcpPacket t) { if ( state != WAIT_RESPONSE ) return; timeout = 2*waitingTime; if ( t.ack() != isn ) return; isn = t.sequence(); tcpPacket a = createPacket(0, t.sequence(), tcpPacket::ACK); sendMessage(a); sendWindow(); } void tcpSocket::receiveAck(tcpPacket t) { if ( state == R_WAIT ) { state = RECEIVE; return; } if ( state != WAIT_ACK ) return; panicTime = 0; sendingNum = 0; receiveIsn = t.ack(); int r = (receiveIsn-sendIsn)*1024; buffer.remove(0,r); if ( buffer.isEmpty() ) { timeout = 0; emit writeEnd(); return; } sendWindow(); } tcpPacket tcpSocket::createPacket(quint32 sequence, quint32 ack, quint8 flag) const { tcpPacket t; t.setSender(myBindPort); t.setReceiver(myReceiverPort); t.setSequence( sequence ); t.setAck(ack); t.setFlag(flag); t.setWindow(tcpPacket::Window); return t; } void tcpSocket::confirmConnection(ipPacket p) { tcpPacket tcp(p.unpack()); myReceiverPort = tcp.sender(); myBind = p.sender(); tcpPacket t = createPacket(isn, tcp.sequence(), tcpPacket::SYN | tcpPacket::ACK); sendMessage(t); state = R_WAIT; } void tcpSocket::sendWindow() { if ( sendingNum++ > appSetting::sendingNum() ) { error(); return; } panicTime = 0; sendIsn = isn; QByteArray data = buffer.left(tcpPacket::Window); int count = 0; int size = data.size(); while ( size >= PACKET_SIZE ) { count++; size -= PACKET_SIZE; } for ( int j = 0; j < count; j++ ) { tcpPacket t = createPacket(isn,0,tcpPacket::NO_FLAGS); if ( buffer.size()<=tcpPacket::Window && j==count-1) t.setFlag(tcpPacket::FIN); t.pack(data.left(PACKET_SIZE)); data.remove(0,PACKET_SIZE); sendMessage(t); isn++; } state = WAIT_ACK; } void tcpSocket::sendAck() { tcpPacket t = createPacket( 0, lastNum + 1, tcpPacket::ACK); sendMessage(t); inputTime = 0; lastNum = 0; } void tcpSocket::error() { QMessageBox::critical(0,tr("Error"), tr("TCP: Data transmition error") ); deleteLater(); } void tcpSocket::secondEvent() { waitingTime++; if ( waitingTime > appSetting::waitingTime() && state == WAIT_RESPONSE ) { error(); return; } if ( ++panicTime == timeout ) { sendWindow(); return; } if ( lastNum && ++inputTime >= 2 ) sendAck(); } netemul-1.0/src/tools/scenexmlreader.cpp0000644000175000017500000000260711276453652017553 0ustar frostfrost#include "scenexmlreader.h" #include "mycanvas.h" #include "device.h" #include sceneXmlReader::sceneXmlReader(myCanvas *scene) : myScene(scene) { } void sceneXmlReader::readScene(QIODevice *dev) { setDevice(dev); while ( !atEnd() ) { readNext(); if ( !isStartElement() ) continue; if ( name() == "netemul") { readNetemul(); } else { raiseError(QObject::tr("The file is not a NetEmul file.")); } } } void sceneXmlReader::readUnknownElement() { if ( !isStartElement() ) { qDebug() << name() << tokenString() ; qFatal("panic"); } while (!atEnd()) { readNext(); if (isEndElement()) break; if (isStartElement()) readUnknownElement(); } } void sceneXmlReader::readNetemul() { while ( !atEnd() ) { readNext(); if ( isEndElement() ) break; if ( name() == "device" ) { device::device *item = new ::device(*this); item->setMenu(myScene->itemMenu() ); myScene->registerDevice(item); } else if ( name() == "textitem" ) { QPointF p; p.setX( attributes().value("x").toString().toDouble() ); p.setY( attributes().value("y").toString().toDouble() ); myScene->createTextItem( p , readElementText() ); } } } netemul-1.0/src/tools/tools.pri0000644000175000017500000000071411276013507015706 0ustar frostfrostHEADERS += src/tools/statisticsscene.h \ src/tools/statistics.h \ src/tools/tcpsocket.h \ src/tools/udpsocket.h \ src/tools/abstractsocket.h \ src/tools/scenexmlwriter.h \ src/tools/scenexmlreader.h SOURCES += src/tools/statisticsscene.cpp \ src/tools/statistics.cpp \ src/tools/tcpsocket.cpp \ src/tools/udpsocket.cpp \ src/tools/abstractsocket.cpp \ src/tools/scenexmlwriter.cpp \ src/tools/scenexmlreader.cpp netemul-1.0/src/tools/udpsocket.cpp0000644000175000017500000000534711263441241016542 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "udpsocket.h" #include "smartdevice.h" #include "routemodel.h" #include "udppacket.h" udpSocket::udpSocket(smartDevice *d, quint16 port) : abstractSocket(d) { myBindPort = port; } void udpSocket::write(ipAddress address, quint16 port, QByteArray data) { if ( address.isFull() ) { writeBroadcast(port,data); return; } ipAddress gw; routeRecord *r = dev->myRouteTable->recordAt(address); if ( !r ) return; if ( r->gateway != r->out ) gw = r->gateway; if ( !dev->ipToAdapter(r->out) || !dev->ipToAdapter(r->out)->isConnect() ) return; while ( quint32 size = data.size() ) { QByteArray tempArray; if ( size >= PACKET_SIZE ) tempArray = data.left(PACKET_SIZE); else tempArray = data; data.remove(0,tempArray.size()); ipPacket p( r->out, address ); p.setUpProtocol(ipPacket::udp); udpPacket udp; udp.setReceiver(port); udp.setSender(myBindPort); udp.pack(tempArray); p.pack(udp.toData()); dev->ipToAdapter(r->out)->sendPacket(p,gw); } } void udpSocket::treatPacket(ipPacket p) { udpPacket udp(p.unpack()); emit readyRead( udp.unpack() ); } void udpSocket::writeBroadcast(quint16 port, QByteArray data) { Q_ASSERT( data.size() <= PACKET_SIZE ); // Нельзя рассылать широковешательно много данных foreach ( interface *i , dev->myInterfaces ) { if ( !i->isConnect() ) continue; ipPacket p( i->ip() , ipAddress::full() ); p.setUpProtocol(ipPacket::udp); udpPacket udp; udp.setReceiver(port); udp.setSender(myBindPort); udp.pack(data); p.pack(udp.toData()); i->sendPacket(p); } } netemul-1.0/src/tools/statisticsscene.cpp0000644000175000017500000000416111252300033017731 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "statisticsscene.h" #include "mycanvas.h" #include "device.h" statisticsScene::statisticsScene(myCanvas *scene) { myScene = scene; comps = 0 ; routers = 0; hubs = 0 ; switchs = 0; foreach ( device *i , myScene->myDevices ) { Statistics += i->deviceStatistics(); switch ( i->deviceType() ) { case device::compDev : comps++; break; case device::hubDev : hubs++; break; case device::switchDev : switchs++; break; case device::routerDev : routers++; break; default : qFatal("Fear!!!"); } } } QString statisticsScene::devicesString() { QString temp; temp += tr("Number of devices: %1\n").arg( myScene->devicesCount() ); temp += tr("Number of computers: %1\n").arg( comps ); temp += tr("Number of hubs: %1\n").arg( hubs ); temp += tr("Number of switchs: %1\n").arg( switchs ); temp += tr("Number of routers: %1\n").arg( routers ); temp += tr("Number of cables: %1\n").arg( myScene->cablesCount() ); return temp; } QString statisticsScene::trafficString() { return Statistics.toString(); } netemul-1.0/src/tools/abstractsocket.h0000644000175000017500000000330011255455500017211 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef ABSTRACTSOCKET_H #define ABSTRACTSOCKET_H #include "ippacket.h" class smartDevice; class abstractSocket : public QObject { Q_OBJECT public: abstractSocket() { dev = 0; } abstractSocket(smartDevice *d); virtual ~abstractSocket(); bool isOurData(ipAddress address, quint16 port); virtual bool isBusy() const { return false; } void setBind(ipAddress address) { myBind = address; } virtual void treatPacket(ipPacket) { } virtual void secondEvent() { } virtual void write(ipAddress, quint16, QByteArray) { } signals: void readyRead(QByteArray); protected: quint16 myBindPort; ipAddress myBind; smartDevice *dev; }; #endif // ABSTRACTSOCKET_H netemul-1.0/src/tools/scenexmlreader.h0000644000175000017500000000053111276013507017201 0ustar frostfrost#ifndef SCENEXMLREADER_H #define SCENEXMLREADER_H #include class myCanvas; class sceneXmlReader : public QXmlStreamReader { public: sceneXmlReader(myCanvas *scene); void readScene(QIODevice *dev); void readUnknownElement(); private: myCanvas *myScene; void readNetemul(); }; #endif // SCENEXMLREADER_H netemul-1.0/src/tools/statisticsscene.h0000644000175000017500000000265711252300033017406 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef STATISTICSSCENE_H #define STATISTICSSCENE_H #include #include #include "statistics.h" class myCanvas; class statisticsScene : public QObject { Q_OBJECT public: statisticsScene(myCanvas *scene); QString devicesString(); QString trafficString(); private: myCanvas *myScene; statistics Statistics; int comps,hubs,switchs,routers; }; #endif // STATISTICSSCENE_H netemul-1.0/src/macaddress.cpp0000644000175000017500000000543711261705352015513 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "macaddress.h" #include macAddress::macAddress() { for ( int i = 0 ; i < 6 ; i++ ) myMac[i] = 0; } macAddress::macAddress(QString str) { setMac(str); } macAddress::macAddress(const macAddress &other) { for (int i = 0 ; i < 6 ; i ++) myMac[i] = other.myMac[i]; } QString macAddress::toString() const { QString temp = QString("%1").arg( QString().setNum(myMac[0],16), 2 , QChar('0')); int i; for ( i = 1 ; i <= 5 ; i++ ) { temp.append(QChar(':')); temp = temp + QString("%1").arg(myMac[i],2,16,QChar('0')); } return temp.toUpper(); } macAddress& macAddress::operator=(const macAddress &other) { for (int i = 0 ; i < 6 ; i ++) myMac[i] = other.myMac[i]; return (*this); } macAddress macAddress::operator++() { int i = 5; while ( i >= 0 && myMac[i] == 255) { myMac[i] = 0; i--; } myMac[i]++; return *this; } macAddress macAddress::operator++(int notused) { Q_UNUSED(notused); macAddress temp = *this; int i = 5; while ( i >= 0 && myMac[i] == 255) { myMac[i] = 0; i--; } myMac[i]++; return temp; } void macAddress::setBroadcast() { int i; for (i = 0 ; i < 6 ; i++) myMac[i] = 0xFF; } bool macAddress::isBroadcast() { int i; for (i = 0; i < 6 ; i++) if ( myMac[i] != 0xFF ) return false; return true; } void macAddress::setRandom() { int i; myMac[0] = 0x01; for ( i = 1 ; i < 6 ; i++ ) myMac[i] = qrand()%256; } void macAddress::setMac(QString str) { QStringList s = str.split(":"); for (int i = 0 ; i < 6 ; i++) myMac[i] = s.at(i).toInt(0,16); } netemul-1.0/src/other/0000755000175000017500000000000011305026150014000 5ustar frostfrostnetemul-1.0/src/other/other.pri0000644000175000017500000000010611234546024015642 0ustar frostfrostHEADERS += src/other/appsetting.h SOURCES += src/other/appsetting.cpp netemul-1.0/src/other/appsetting.cpp0000644000175000017500000001272311303325155016674 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include #include #include #include #include "appsetting.h" int appSetting::_defaultComputerCount = 0; int appSetting::_defaultHubCount = 0; int appSetting::_defaultRouterCount = 0; int appSetting::_defaultSwitchCount = 0; int appSetting::_ttlArp = 0; int appSetting::_ttlMac = 0; bool appSetting::_defaultHubManual = false; bool appSetting::_defaultSwitchManual = false; int appSetting::_speed = 100; int appSetting::_language = 0; int appSetting::_sendingNum = 1; int appSetting::_waitingTime = 80; int appSetting::_arpResponceTime = 45; bool appSetting::_hasOpengl = false; bool appSetting::_autosave = false; int appSetting::_autosaveInterval = 10; bool appSetting::_showLabel = true; QString appSetting::_scriptPath = ""; QTranslator* appSetting::mas[LANGUAGE_COUNT*2]; appSetting::appSetting() { } void appSetting::defaultNums() { _defaultComputerCount = 1; _defaultHubCount = 4; _defaultSwitchCount = 4; _defaultRouterCount = 4; _ttlArp = 1200; _arpResponceTime = 45; _ttlMac = 300; _sendingNum = 1; _waitingTime = 80; _speed = 100; _language = 0; _hasOpengl = false; _autosave = false; _autosaveInterval = 10; _showLabel = true; for ( int i = 1 ; i < LANGUAGE_COUNT*2 ; i++) QCoreApplication::removeTranslator(mas[i]); } void appSetting::readSetting() { #ifndef __TESTING__ QString translationsPath(TRANSLATIONS_PATH); for ( int i = 0 ; i < LANGUAGE_COUNT*2 ; i++ ) mas[i] = new QTranslator; mas[1]->load("netemul_ru" , translationsPath); mas[2]->load("netemul_pt_BR" , translationsPath); mas[3]->load("netemul_es" , translationsPath); mas[5]->load("qt_ru", translationsPath); mas[6]->load("qt_pt", translationsPath); mas[7]->load("qt_es", translationsPath); QSettings setting("FROST","netemul"); _defaultComputerCount = setting.value("computer/socketCount",1).toInt() ; _defaultHubCount = setting.value("hub/socketCount",4).toInt() ; _defaultSwitchCount = setting.value("switch/socketCount",4).toInt() ; _defaultRouterCount = setting.value("router/socketCount",4).toInt() ; _defaultHubManual = setting.value("hub/manual",false).toBool() ; _arpResponceTime = setting.value("netcard/responcetime",45).toInt(); _defaultSwitchManual = setting.value("switch/manual",false).toBool() ; _scriptPath = setting.value("main/scriptPath",SCRIPT_PATH).toString(); _ttlArp = setting.value("ttl/Arp",1200).toInt() ; _ttlMac = setting.value("ttl/Mac",300).toInt(); _speed = setting.value("main/speed",100).toInt(); setLanguage( setting.value("main/language",0).toInt() ); _sendingNum = setting.value("tcp/sendingNumber",1).toInt(); _waitingTime = setting.value("tcp/waitingTime",80).toInt(); _hasOpengl = setting.value("main/opengl",false).toBool(); _autosave = setting.value("main/autosave",false).toBool(); _autosaveInterval = setting.value("main/autosaveInterval",10).toInt(); _showLabel = setting.value("main/showlabel",true).toBool(); #endif } void appSetting::writeSetting() { #ifndef __TESTING__ for ( int i = 0 ; i < LANGUAGE_COUNT*2 ; i++ ) delete mas[i]; QSettings setting("FROST","netemul"); setting.setValue("computer/socketCount" , _defaultComputerCount ); setting.setValue("hub/socketCount" , _defaultHubCount ); setting.setValue("switch/socketCount" , _defaultSwitchCount ); setting.setValue("router/socketCount" , _defaultRouterCount ); setting.setValue("hub/manual", _defaultHubManual ); setting.setValue("switch/manual", _defaultSwitchManual ); setting.setValue("netcard/responcetime",_arpResponceTime); setting.setValue("ttl/Arp", _ttlArp ); setting.setValue("ttl/Mac", _ttlMac ); setting.setValue("main/speed",_speed); setting.setValue("main/language", _language); setting.setValue("main/scriptPath",_scriptPath); setting.setValue("tcp/sendingNumber",_sendingNum); setting.setValue("tcp/waitingTime",_waitingTime); setting.setValue("main/opengl", _hasOpengl ); setting.setValue("main/autosave",_autosave); setting.setValue("main/autosaveInterval",_autosaveInterval); setting.setValue("main/showlabel", _showLabel); #endif } void appSetting::setLanguage(int n) { if ( n == _language ) return; _language = n; for ( int i = 1 ; i < LANGUAGE_COUNT*2 ; i++) if ( i != n%4 ) QCoreApplication::removeTranslator(mas[i]); QCoreApplication::installTranslator(mas[n]); QCoreApplication::installTranslator(mas[n+4]); } netemul-1.0/src/other/appsetting.h0000644000175000017500000001050411304016657016341 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef APPSETTING_H #define APPSETTING_H #include #include class QTranslator; static const int LANGUAGE_COUNT = 4; static const int main_digit = 10000; static const int little_digit = 20; class appSetting { public: static int defaultComputerCount() { return _defaultComputerCount; } static void setDefaultComputerCount(int n) { _defaultComputerCount = n; } static int defaultHubCount() { return _defaultHubCount; } static void setDefaultHubCount(int n) { _defaultHubCount = n; } static int defaultSwitchCount() { return _defaultSwitchCount; } static void setDefaultSwitchCount(int n) { _defaultSwitchCount = n; } static int defaultRouterCount() { return _defaultRouterCount; } static void setDefaultRouterCount(int n) { _defaultRouterCount = n; } static void setDefaultHubManual(bool b) { _defaultHubManual = b; } static bool defaultHubManual() { return _defaultHubManual; } static void setDefaultSwitchManual(bool b) { _defaultSwitchManual = b; } static bool hasOpengl() { return _hasOpengl; } static void setHasOpengl(bool b) { _hasOpengl = b; } static bool isShowLabel() { return _showLabel; } static void setShowLabel(bool b) { _showLabel = b; } static bool defaultSwitchManual() { return _defaultSwitchManual; } static void setScriptPath(const QString path) { _scriptPath = path; } static QString scriptPath() { if ( !_scriptPath.endsWith("/") ) _scriptPath.append("/"); return _scriptPath; } static void setTtlArp(int n) { _ttlArp = n; } static int ttlArp() { return _ttlArp; } static void setArpResponceTime(int n) { _arpResponceTime = n; } static int arpResponceTime() { return _arpResponceTime; } static void setTtlMac(int n) { _ttlMac = n; } static int ttlMac() { return _ttlMac; } static void setAnimateSpeed(int n) { _speed = main_digit / (n*little_digit); } static int animateSpeed() { return main_digit / _speed / little_digit; } static int realAnimateSpeed() { return _speed; } static void setLanguage(int n); static int language() { return _language; } static void setSendingNum(int n) { _sendingNum = n; } static int sendingNum() { return _sendingNum; } static void setWaitingTime(int n) { _waitingTime = n; } static int waitingTime() { return _waitingTime; } static bool isAutosave() { return _autosave; } static void setAutosave(bool cur) { _autosave = cur; } static int autosaveInterval() { return _autosaveInterval; } static void setAutosaveInterval(int n) { _autosaveInterval = n; } static void defaultNums(); static void readSetting(); static void writeSetting(); private: static QTranslator *mas[LANGUAGE_COUNT*2]; static int _defaultComputerCount; static int _defaultHubCount; static int _defaultRouterCount; static int _defaultSwitchCount; static int _ttlArp; static int _ttlMac; static int _speed; static int _language; static int _sendingNum; static int _waitingTime; static bool _defaultHubManual; static bool _defaultSwitchManual; static bool _autosave; static int _autosaveInterval; static int _arpResponceTime; static QString _scriptPath; static bool _hasOpengl; static bool _showLabel; protected: appSetting(); ~appSetting(); }; #endif // APPSETTING_H netemul-1.0/src/frame.cpp0000644000175000017500000000350411270606674014477 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "frame.h" frame::frame(const QByteArray &b) { d = new frameData; QDataStream s(b); s >> d->different >> d->sender >> d->receiver >> d->type >> d->data; } QByteArray frame::toData() const { return d->toArray(); } QString frame::toString() const { QString temp; temp.append(QObject::tr("Ethernet, sender: %1 receiver: %2").arg(d->sender.toString()).arg(d->receiver.toString())); return temp; } //------------------------------------------------------------------------------- //------------------------------------------------------------------------------- frameData::frameData() { different = frame::NORMAL; } QByteArray frameData::toArray() const { QByteArray t; QDataStream s(&t,QIODevice::WriteOnly); s << different << sender << receiver << type << data; return t; } netemul-1.0/src/mainwindow.h0000644000175000017500000001174011303041536015212 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #if QT_VERSION < 0x040500 #include #endif class myCanvas; class settingDialog; class sceneControl; class QActionGroup; class QToolBar; class QComboBox; class QMenu; class QAction; class QGraphicsView; class QPainter; class QPrinter; class QLabel; /*! Реализует главное окно программы. */ class MainWindow : public QMainWindow { Q_OBJECT Q_DISABLE_COPY(MainWindow) public: enum { noDev = 0 , busDev = 2 ,compDev = 3 , hubDev = 4 , switchDev = 5 , routerDev = 7 }; explicit MainWindow(QWidget *parent, QStringList param); ~MainWindow(); QString& file() { return myFile; } // Получить имя текущего файла void setFile(const QString &text) { myFile = text; } // Задать текущий файл void setEnabledFileItems(bool cur); void writeSetting(); void readSetting(); public slots: void newFile(); // Слот создания нового файла void closeFile(); bool saveFile(); void saveAsFile(); void openFile(); void setting(); void test(); void selectionChange(); void groupClicked(QAction *clk); void uncheck(); void helpDialog(); void playBack(); void statistics(); void showLogDialog(); void aboutDialog(); void printDialog(); void printPreviewDialog(); void paintInPreviewDialog(QPrinter *printer); void incTime(); private slots: void autosave(); protected: void closeEvent(QCloseEvent *event); // Событие вызываемое при попытке закрыть окно bool eventFilter(QObject *obj, QEvent *event); void changeEvent(QEvent *e); private: void openFile(QString name); int saveFileDialog(); void setOpenglMode(bool mode); QString myFile; // Имя текущего файла myCanvas *canva; sceneControl *sceneControler; QGraphicsView *view; // Графическое представление нашей сцены QPainter *printerPainter; QPrinter *printer; QTimer *autosaveTimer; void createMenu(); // Функция создания меню void createAction(); // -- событий void createScene(); // -- сцены void createTools(); // -- Панелей инструментов =) void retranslate(); QLabel *timeLabel; QAction* createOneAction( QIcon icon = QIcon(),bool inGroup = false); QMenu *fileMenu; // Выпадающие меню: файл QMenu *editMenu; QMenu *viewMenu; // -- вид QMenu *itemMenu; // -- объект QMenu *settingMenu; // -- Сервис QMenu *testMenu; QMenu *helpMenu; QToolBar *deviceBar; // QToolBar *controlBar; // QActionGroup *groupAct; QAction *newAct; // События : создать новый файл QAction *openAct; // Открыть файл QAction *saveAct; // сохранить QAction *saveAsAct; // сохранить как QAction *closeAct; // закрыть файл QAction *exitAct; // Выйти из программы QAction *showGridAct; // Отображать сетку или нет QAction *deleteAct; // удалить выделенные объекты QAction *tableAct; QAction *settingAct; QAction *staticsAct; // Don't forreget ! QAction *testAct; QAction *computerAct; QAction *moveAct; QAction *cableAct; QAction *textAct; QAction *switchAct; QAction *routerAct; QAction *hubAct; QAction *shareBusAct; QAction *sendAct; QAction *propertyAct; QAction *aboutQtAct; QAction *aboutAct; QAction *helpAct; QAction *adapterAct; QAction *playAct; QAction *progAct; QAction *arpAct; QAction *logAct; QAction *aboutDeviceAct; QAction *designerPacketAct; QAction *printAct; QAction *printPreviewAct; QAction *virtualNetworkAct; QAction *noteAct; QAction *cableLabelAct; }; #endif // MAINWINDOW_H netemul-1.0/src/deviceport.h0000644000175000017500000000532311262222661015206 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef DEVICEPORT_H #define DEVICEPORT_H #include #include "frame.h" class macAddress; class cableDev; /*! Класс представляе собой место соединения кабеля с устройством(сокет, гнездо, отверстие). Необходим этот класс из за того что устройство как абстрактный класс имеет гнезда, но обработка у всех отличается, для того что бы оставить общее и разграничить разное, был сделан этот класс. */ class devicePort { public: devicePort(); devicePort(int n); ~devicePort(); bool isBusy() const { return !senderQueue.isEmpty() || !receiveQueue.isEmpty(); } bool isConnect() const { return myConnect;} void setNum(int n) { myNum = n; } bool isShared() { return myShared; } void setShared(bool n) { myShared = n; } int num() const { return myNum; } void pushToSend(frame &f) { senderQueue.enqueue(f); } bool isCableConnect(const cableDev *c) const; int trafficDigit() const { return senderQueue.size(); } void setConnect(bool cur,cableDev *cable); frame popFromReceive() { return receiveQueue.dequeue(); } void receiveFrame(QByteArray &b); void queueEvent(); void setChecked(bool c); bool hasReceive() const { return !receiveQueue.isEmpty(); } bool isCableBusy() const; void startCollision(); private: int myNum; QQueue senderQueue; QQueue receiveQueue; cableDev *myCable; bool myConnect; bool myShared; }; //------------------------------------------------------ #endif // DEVICEPORT_H netemul-1.0/src/states/0000755000175000017500000000000011305026151014163 5ustar frostfrostnetemul-1.0/src/states/states.pri0000644000175000017500000000067611256417761016233 0ustar frostfrostHEADERS += src/states/abstractstate.h \ src/states/insertstate.h \ src/states/textstate.h \ src/states/movestate.h \ src/states/cablestate.h \ src/states/sendstate.h \ src/states/emptystate.h SOURCES += src/states/abstractstate.cpp \ src/states/insertstate.cpp \ src/states/textstate.cpp \ src/states/movestate.cpp \ src/states/cablestate.cpp \ src/states/sendstate.cpp \ src/states/emptystate.cpp netemul-1.0/src/states/cablestate.cpp0000644000175000017500000000621111257760107017012 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include #include #include "connectdialog.h" #include "cablestate.h" #include "mycanvas.h" #include "device.h" cableState::cableState(myCanvas *s) : abstractState(s) { line = 0; // Провода нет } cableState::~cableState() { if ( line ) { scene->removeItem(line); delete line; } } void cableState::mouseMove(QGraphicsSceneMouseEvent *event) { // Заново прорисовываем линию от начала кабеля до Текущей точки if ( line ) line->setLine(QLineF( line->line().p1(), event->scenePos())); } void cableState::mousePress(QGraphicsSceneMouseEvent *event) { if ( scene->items( event->scenePos() ).isEmpty() ) return; // не будем водить кабеля из пустых мест line = new QGraphicsLineItem(QLineF(event->scenePos(), event->scenePos())); //Создадим временную линию, выставим её свойства и добавим на сцену line->setPen(QPen(Qt::black,2)); scene->addItem(line); } void cableState::mouseRelease(QGraphicsSceneMouseEvent*) { if ( !line ) return; QString start,end; device *startItem = scene->deviceInPoint(line->line().p1()) ; device *endItem = scene->deviceInPoint(line->line().p2()) ; scene->removeItem(line); delete line; line = 0; // Линию временную делаем указателем на нуль if ( !startItem || !endItem ) return; if ( device::isConnectDevices(startItem, endItem) ) return; if ( startItem == endItem ) return; connectDialog *conDialog = new connectDialog(startItem,endItem); if ( !conDialog->exec() ) { delete conDialog; return; } start = conDialog->getStart(); end = conDialog->getEnd(); // Вообщем так ... если уствойства есть под обоими концами // и эти устройства различны то мы создаем этот кабель! #НИХРЕНА НЕ#Проверено все ок =) scene->createConnection( startItem , endItem , start , end ); } netemul-1.0/src/states/cablestate.h0000644000175000017500000000273311257760107016464 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef CABLESTATE_H #define CABLESTATE_H #include "abstractstate.h" class QGraphicsLineItem; class cableState : public abstractState { public: cableState(myCanvas *s); ~cableState(); void mouseMove(QGraphicsSceneMouseEvent *event); void mousePress(QGraphicsSceneMouseEvent *event); void mouseRelease(QGraphicsSceneMouseEvent*); private: QGraphicsLineItem *line; // Временная линия для рисования }; #endif // CABLESTATE_H netemul-1.0/src/states/emptystate.h0000644000175000017500000000254011257760107016550 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef EMPTYSTATE_H #define EMPTYSTATE_H #include "abstractstate.h" class emptyState : public abstractState { public: emptyState(myCanvas *s) : abstractState(s) { } void mouseMove(QGraphicsSceneMouseEvent*) { } void mousePress(QGraphicsSceneMouseEvent*) { } void mouseRelease(QGraphicsSceneMouseEvent*) { } }; #endif // EMPTYSTATE_H netemul-1.0/src/states/abstractstate.cpp0000644000175000017500000000470111257760107017551 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "abstractstate.h" #include "emptystate.h" #include "mycanvas.h" #include "movestate.h" #include "insertstate.h" #include "cablestate.h" #include "textstate.h" #include "sendstate.h" abstractState::abstractState(myCanvas *s) { scene = s; } abstractState* abstractState::initialize(myCanvas *s) { return new emptyState(s); } void abstractState::goMove() { abstractState *oldState = scene->myState; scene->myState = new moveState(scene); delete oldState; } void abstractState::goInsert() { abstractState *oldState = scene->myState; scene->myState = new insertState(scene); delete oldState; } void abstractState::goCable() { abstractState *oldState = scene->myState; scene->myState = new cableState(scene); delete oldState; } void abstractState::goText() { abstractState *oldState = scene->myState; scene->myState = new textState(scene); delete oldState; } void abstractState::goSend() { abstractState *oldState = scene->myState; scene->myState = new sendState(scene); delete oldState; } void abstractState::goEmpty() { abstractState *oldState = scene->myState; scene->myState = new emptyState(scene); delete oldState; } void abstractState::goTo(int mode) { switch ( mode ) { case move : goMove(); break; case insert : goInsert(); break; case cable : goCable(); break; case text : goText(); break; case send : goSend(); break; } } netemul-1.0/src/states/abstractstate.h0000644000175000017500000000341311257760107017215 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef ABSTRACTSTATE_H #define ABSTRACTSTATE_H class myCanvas; class QGraphicsSceneMouseEvent; class abstractState { public: abstractState(myCanvas *s); enum { move = 0 , cable = 1 , insert = 2 , send = 6 , text = 8}; virtual ~abstractState() { } virtual void mouseMove(QGraphicsSceneMouseEvent*) = 0; virtual void mousePress(QGraphicsSceneMouseEvent*) = 0; virtual void mouseRelease(QGraphicsSceneMouseEvent*) = 0; virtual void goMove(); virtual void goInsert(); virtual void goCable(); virtual void goText(); virtual void goSend(); virtual void goEmpty(); virtual void hideState() { } static abstractState* initialize(myCanvas *s); void goTo(int mode); protected: myCanvas *scene; }; #endif // ABSTRACTSTATE_H netemul-1.0/src/states/sendstate.cpp0000644000175000017500000000530411257760107016677 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include #include #include "sendstate.h" #include "mycanvas.h" #include "senddialog.h" #include "sendellipse.h" #include "device.h" sendState::sendState(myCanvas *s) : abstractState(s) { mySendState = noSendItem; SendEllipse = new sendEllipse; scene->addItem(SendEllipse); } sendState::~sendState() { scene->removeItem( SendEllipse); delete SendEllipse; } void sendState::hideState() { SendEllipse->setPos(-100,-100); } void sendState::mouseMove(QGraphicsSceneMouseEvent *event) { if ( SendEllipse ) SendEllipse->moving( event->scenePos() ); } void sendState::mousePress(QGraphicsSceneMouseEvent*) { if ( !SendEllipse->hasUnderDevice() ) return; QGraphicsItem *tempItem = SendEllipse->underDevice(); device *t = qgraphicsitem_cast(tempItem); if ( !t ) return; if ( !t->isCanSend() ) { QMessageBox::warning(0,QObject::tr("Error"),QObject::tr("The device can't transmit data!"), QMessageBox::Ok , QMessageBox::Ok); return; } if ( mySendState == noSendItem ) { sendDialog *temp = new sendDialog(sendDialog::sender,t); if ( !temp->exec() ) return; messageSize = temp->messageSize(); broadcast = temp->broadcast(); protocol = temp->protocol(); senderDevice = t; mySendState = oneSendItem; SendEllipse->chooseOneDevice(); delete temp; } else { sendDialog *temp = new sendDialog(sendDialog::receiver,t); if ( !temp->exec() ) return; receiverIp = temp->dest(); senderDevice->sendMessage(receiverIp,messageSize,protocol); emit scene->uncheck(); delete temp; goMove(); } } netemul-1.0/src/states/insertstate.h0000644000175000017500000000275711257760107016730 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef INSERTSTATE_H #define INSERTSTATE_H #include "abstractstate.h" class insertRect; class insertState : public abstractState { public: insertState(myCanvas *s); ~insertState(); void mouseMove(QGraphicsSceneMouseEvent *event); void mousePress(QGraphicsSceneMouseEvent *event); void mouseRelease(QGraphicsSceneMouseEvent*) { } void hideState(); private: insertRect *InsertRect; // Прямоугольныник для вставки }; #endif // INSERTSTATE_H netemul-1.0/src/states/movestate.h0000644000175000017500000000352211263602433016353 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef MOVESTATE_H #define MOVESTATE_H #include "abstractstate.h" #include class QGraphicsItem; class selectRect; typedef QList itemList; class moveState : public abstractState { public: moveState(myCanvas *s); ~moveState(); void mouseMove(QGraphicsSceneMouseEvent *event); void mousePress(QGraphicsSceneMouseEvent *event); void mouseRelease(QGraphicsSceneMouseEvent *event); private: itemList filterDevices(itemList list); selectRect *SelectRect; // Временный прямоугольник для выделения QPointF p2Rect; // Точка начала выделения QMap coordMap; //!< Соответствия перемещаемых в данный момент устройств и их координат }; #endif // MOVESTATE_H netemul-1.0/src/states/insertstate.cpp0000644000175000017500000000355111257760107017254 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include #include "insertstate.h" #include "mycanvas.h" #include "insertrect.h" #include "addcommand.h" insertState::insertState(myCanvas *s) : abstractState(s) { InsertRect = new insertRect; scene->addItem(InsertRect); } insertState::~insertState() { scene->removeItem(InsertRect); delete InsertRect; } void insertState::hideState() { InsertRect->setPos(-100,-100); } void insertState::mouseMove(QGraphicsSceneMouseEvent *event) { InsertRect->moving( event->scenePos() ); } void insertState::mousePress(QGraphicsSceneMouseEvent *event) { if ( !InsertRect->isReadyInsert() ) return; // Добавляем устройство на сцену addCommand *command = new addCommand( scene , event->scenePos() , scene->nowType ); scene->commandStack.push(command); scene->myModified = true; } netemul-1.0/src/states/sendstate.h0000644000175000017500000000334511257760107016347 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef SENDSTATE_H #define SENDSTATE_H #include "abstractstate.h" class device; class sendEllipse; class sendState : public abstractState { public: sendState(myCanvas *s); ~sendState(); enum { noSendItem = 0 , oneSendItem = 1 }; void mouseMove(QGraphicsSceneMouseEvent *event); void mousePress(QGraphicsSceneMouseEvent*); void mouseRelease(QGraphicsSceneMouseEvent*) { } void hideState(); private: // All temp transport varios int messageSize; int mySendState; bool broadcast; QString receiverIp; device *senderDevice; int protocol; sendEllipse *SendEllipse; // Кружочек для выделения отправителя и получателя }; #endif // SENDSTATE_H netemul-1.0/src/states/emptystate.cpp0000644000175000017500000000203011257760107017075 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "emptystate.h" netemul-1.0/src/states/textstate.h0000644000175000017500000000253611257760107016403 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef TEXTSTATE_H #define TEXTSTATE_H #include "abstractstate.h" class textState : public abstractState { public: textState(myCanvas *s) : abstractState(s) { } void mouseMove(QGraphicsSceneMouseEvent*) { } void mousePress(QGraphicsSceneMouseEvent *event); void mouseRelease(QGraphicsSceneMouseEvent*) { } }; #endif // TEXTSTATE_H netemul-1.0/src/states/textstate.cpp0000644000175000017500000000254611257760107016737 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include #include "textstate.h" #include "mycanvas.h" #include "addtextcommand.h" void textState::mousePress(QGraphicsSceneMouseEvent *event) { addTextCommand *com = new addTextCommand(scene, event->scenePos() ); scene->commandStack.push(com); scene->myModified = true; emit scene->uncheck(); goMove(); } netemul-1.0/src/states/movestate.cpp0000644000175000017500000001065111270702635016712 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include #include #include "movestate.h" #include "mycanvas.h" #include "device.h" #include "selectrect.h" #include "cabledev.h" #include "movecommand.h" moveState::moveState(myCanvas *s) : abstractState(s) { SelectRect = 0; // Выделения нет p2Rect = QPoint(); } moveState::~moveState() { if ( SelectRect ) { scene->removeItem(SelectRect); delete SelectRect; } } void moveState::mouseMove(QGraphicsSceneMouseEvent *event) { if ( coordMap.count() ) scene->QGraphicsScene::mouseMoveEvent(event); else if (SelectRect) // Если есть выделение обновляем его. SelectRect->setRect(QRectF( event->scenePos() , p2Rect ).normalized()); } void moveState::mousePress(QGraphicsSceneMouseEvent *event) { scene->QGraphicsScene::mousePressEvent(event); // Если есть выделенные элементы и мы щелкаем на одном из них if ( (scene->selectedItems().toSet() & scene->items( event->scenePos()).toSet()).size() ) { // То нужно сохранить все их координаты на случай если начнется перемещение. foreach ( QGraphicsItem* i ,scene->selectedItems() ) { if ( i->type() != cableDev::Type ) coordMap.insert( i , i->scenePos()); } } // Иначе создаем прямоугольник выделения. else { if ( scene->items( event->scenePos() ).count() ) return; SelectRect = new selectRect; p2Rect = QPointF( event->scenePos() ); scene->addItem(SelectRect); } } void moveState::mouseRelease(QGraphicsSceneMouseEvent *event) { scene->QGraphicsScene::mouseReleaseEvent(event); if ( coordMap.count() ) { bool needReturn = false; QGraphicsItem *curDevice; QPointF curPoint; QMapIterator i(coordMap); while (i.hasNext()) { i.next(); curDevice = i.key(); curPoint = i.value(); if ( curDevice->type() == textItem::Type ) continue; itemList underItems = curDevice->collidingItems(); if ( !scene->sceneRect().contains( curDevice->pos()) || filterDevices(underItems).count() ) { needReturn = true; break; // while( i.has...) } } if ( !needReturn ) { QMap old = coordMap; scene->calibrateAll( coordMap.keys() ); QMap rec; foreach ( QGraphicsItem* i ,scene->selectedItems() ) { if ( i->type() != cableDev::Type ) rec.insert(i, i->scenePos() ); } moveCommand *c = new moveCommand(scene,old, rec); scene->commandStack.push(c); coordMap.clear(); return; } scene->putItems(coordMap); coordMap.clear(); } else { if ( !SelectRect ) return; QPainterPath path; path.addRect(SelectRect->rect()); scene->setSelectionArea(path); scene->removeItem(SelectRect); delete SelectRect; p2Rect = QPoint(); SelectRect = 0 ; } } itemList moveState::filterDevices(itemList list) { itemList temp; foreach ( QGraphicsItem *i , list ) if ( scene->isDevice(i) ) temp << i; return temp; } netemul-1.0/src/devices/0000755000175000017500000000000011305026150014301 5ustar frostfrostnetemul-1.0/src/devices/computer.cpp0000644000175000017500000000401611276453652016666 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "computer.h" #include "interface.h" #include "routemodel.h" #include "appsetting.h" #ifndef __TESTING__ #include "computerproperty.h" #include "designerdialog.h" #endif DECLARE_STATIC_PROTOTYPE(computer) DEFINETION_PROTOTYPE_FUNCTION(computer) computer::computer(int c /* = 0 */) { if ( !c ) c = appSetting::defaultComputerCount(); for ( int i = 0 ; i < c ; i++) addInterface(tr("eth%1").arg(i)); myRouteTable->addToTable("127.0.0.0","255.0.0.0","127.0.0.1","127.0.0.1",0,routeModel::connectMode); setNote(tr("Computer")); } void computer::showDesignerDialog() { designerDialog *d = new designerDialog(this); d->show(); } void computer::dialog() { #ifndef __TESTING__ computerProperty *d = new computerProperty; d->setDevice( new computerSetting(this) ); d->exec(); #endif } void computer::sendConstructedFrame(QString Interface, frame Frame, int count) { for ( int i = 0 ; i < count ; i++ ) adapter(Interface)->pushToSocket(Frame); } netemul-1.0/src/devices/hubdevice.h0000644000175000017500000000373211303253545016425 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef HUBDEVICE_H #define HUBDEVICE_H #include "boxdevice.h" class frame; class hubDevice : public boxDevice { Q_OBJECT DECLARE_PROTOTYPE(hubDevice) public: int type() const { return hubDev; } enum { hubDev = 4 }; Q_INVOKABLE hubDevice(int c = 0); ~hubDevice(); void dialog(); void detectCollision(); bool isShared() const { return true; } QString deviceName() const { return "hub"; } QString deviceCommandName() const { return tr("Hub"); } QString pixmapName() const { return ":/im/images/hub.png"; } friend class hubSetting; protected: void write(QDataStream &stream) const; void read(QDataStream &stream); private: quint32 collision; }; class hubSetting : public boxSetting { public: hubSetting(hubDevice *d) : boxSetting(d) , hd(d) { } quint32 collisions() const { return hd->collision; } void reset() { boxSetting::reset(); hd->collision = 0; } private: hubDevice *hd; }; #endif // HUBDEVICE_H netemul-1.0/src/devices/computer.h0000644000175000017500000000443511303253545016326 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef COMPUTER_H #define COMPUTER_H #include "smartdevice.h" #include "deviceport.h" #include class devicePort; /*! Реализует компьютер. */ class computer : public smartDevice { Q_OBJECT DECLARE_PROTOTYPE(computer) public: enum { compDev = 3 }; int type() const { return compDev; } computer(int c = 0); ~computer() { } void dialog(); void showDesignerDialog(); QString deviceName() const { return "comp"; } QString deviceCommandName() const { return tr("Computer"); } QString pixmapName() const { return ":/im/images/computer.png"; } bool canManageInterface() const { return true; } bool isCanSend() const { return true; } void sendConstructedFrame(QString Interface,frame Frame, int count); protected: void write(QDataStream &stream) const { stream << compDev; smartDevice::write(stream);} void read(QDataStream &stream) { smartDevice::read(stream); } }; //--------------------------------------------- class computerSetting : public smartSetting { public: computerSetting( computer *c ) : smartSetting(c) , cp(c) { } QString gateway() const { return cp->gateway().toString(); } void setGateway(const QString &str) { cp->setGateway(str); } private: computer *cp; }; #endif // COMPUTER_H netemul-1.0/src/devices/hubdevice.cpp0000644000175000017500000000365411276453652016775 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "hubproperty.h" #include "hubdevice.h" #include "appsetting.h" #include "hubchip.h" DECLARE_STATIC_PROTOTYPE(hubDevice) DEFINETION_PROTOTYPE_FUNCTION(hubDevice) hubDevice::hubDevice(int c /* = 0 */ ) { if (!c) c = appSetting::defaultHubCount(); myManual = appSetting::defaultHubManual(); chip = new hubChip(c); setNote(tr( "Hub" ) ); collision = 0; } hubDevice::~hubDevice() { delete chip; } void hubDevice::detectCollision() { collision++; chip->detectCollision(); } void hubDevice::read(QDataStream &stream) { boxDevice::read(stream); stream >> collision; } void hubDevice::write(QDataStream &stream) const { stream << hubDev; boxDevice::write(stream); stream << collision; } void hubDevice::dialog() { hubProperty *d = new hubProperty; hubSetting *set = new hubSetting(this); d->setHub(set); d->exec(); delete set; } netemul-1.0/src/devices/deviceimpl.h0000644000175000017500000001327111303253545016607 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef DEVICEIMPL_H #define DEVICEIMPL_H #include #include "scenexmlwriter.h" #include "scenexmlreader.h" #include "statistics.h" #include "visualizable.h" #define DECLARE_PROTOTYPE(CLASS) public: \ deviceImpl* prototype() const; \ private: \ static CLASS *myPrototype; #define DECLARE_STATIC_PROTOTYPE(CLASS) CLASS *CLASS::myPrototype = 0; #define DEFINETION_PROTOTYPE_FUNCTION(CLASS) deviceImpl* CLASS::prototype() const \ { \ if ( !myPrototype ) { \ myPrototype = new CLASS; \ Q_ASSERT( myPrototype != 0 ); \ } \ return myPrototype; \ } class cableDev; class logDialog; class deviceImpl : public QObject { Q_OBJECT Q_PROPERTY(QString note READ note WRITE setNote) Q_PROPERTY(bool router READ isRouter WRITE setRouter) public: deviceImpl(); void showDeviceNoteDialog(); virtual ~deviceImpl() { } virtual int type() const = 0; virtual QStringList sockets() const = 0; virtual QStringList featuresList() const { return QStringList(); } virtual bool isConnectSocket(const QString &socket) const = 0; virtual QIcon isConnectSocketIcon( const QString &socket) const = 0; virtual QString socketName(const cableDev *c) const = 0; virtual QString pixmapName() const = 0; virtual bool isBusy() const = 0; const QString& note() const { return myNote; } void setNote(const QString &n) { myNote = n; } virtual QString tableName() const { return QString(); } virtual bool isSmart() const { return false; } virtual bool hasTable() const { return false; } virtual void dialog() = 0; virtual void showLogDialog(logDialog*) const = 0; virtual void tableDialog() { qFatal("error not compatibility Table!"); } virtual void adapterDialog() { qFatal("error not compatibility adapter!"); } virtual void programmsDialog() { qFatal("error not compatibility"); } virtual void arpDialog() { qFatal("error not compatibility"); } virtual void showDesignerDialog() { qFatal("Error designer!"); } virtual void showVirtualNetworkDialog() { qFatal("Error virtual network"); } virtual bool isShared() const { return false; } virtual bool isManagedVirtualNetwork() const { return false; } // Writing and reading virtual void write(QDataStream &stream) const; virtual void read(QDataStream &stream); void writeXml(sceneXmlWriter &stream) const; void readXml(sceneXmlReader &stream); virtual void writeXmlImpl(sceneXmlWriter &stream) const = 0; virtual void readXmlImpl(sceneXmlReader &stream) = 0; virtual QString deviceName() const = 0; virtual QString deviceCommandName() const = 0; virtual void secondTimerEvent() { } virtual void deciSecondTimerEvent() { } virtual QString nameToIp(const QString &name) const { Q_UNUSED(name) return QString(); } virtual bool isReady() const { return true; } virtual void addConnection(const QString &port , cableDev *c) = 0; virtual void deleteConnection(cableDev *c) = 0; virtual bool isCanSend() const { return false; } void setVisualizator( visualizable *view ) { myView = view; } public: virtual deviceImpl* prototype() const = 0; virtual statistics deviceStatistics() const = 0; virtual int trafficDigit() const = 0; virtual bool isRouter() const { return false; } virtual void setRouter(bool) { } virtual void detectCollision() { } public slots: virtual void setCheckedSocket(const QString&) { } virtual void setIp(const QString&, const QString&) { } virtual void setMask(const QString&, const QString&) { } virtual void setGateway(const QString&) { } virtual void setSocketsCount(int) { } virtual void sendMessage(const QString& ,int, int) { qFatal("ERROR!"); } virtual quint64 sendPacketCount(const QString&) { return 0; } virtual quint64 receivePacketCount(const QString&) { return 0; } virtual quint64 sendFrameCount(const QString&) { return 0; } virtual quint64 receiveFrameCount(const QString&) { return 0; } protected: visualizable *myView; private: QString myNote; }; class deviceSetting { public: deviceSetting(deviceImpl *d) : dev(d) { } QString note() const { return dev->note(); } void setNote(const QString &str) { dev->setNote(str); } private: deviceImpl *dev; }; Q_DECLARE_METATYPE(deviceImpl*) #endif // DEVICEIMPL_H netemul-1.0/src/devices/switchdevice.h0000644000175000017500000000542711303253545017153 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef SWITCHDEVICE_H #define SWITCHDEVICE_H #include "boxdevice.h" #include "macaddress.h" class frame; class switchModel; class switchTableSetting; class switchChip; // Пока такое коротенькое объявление для свитча // Все его комментарии действительны для других устройств class switchDevice : public boxDevice { Q_OBJECT DECLARE_PROTOTYPE(switchDevice) public: friend class switchTableSetting; enum { switchDev = 5 }; int type() const { return switchDev; } switchDevice(int c = 0); //Пока конструктор и прорисовка ~switchDevice(); void updateMac(int u); void dialog(); void tableDialog(); bool hasTable() const { return true; } bool isManagedVirtualNetwork() const { return ( myManual ) ? true : false; } void showVirtualNetworkDialog(); switchChip* concreteChip(); void secondTimerEvent(); QString deviceName() const { return "switch"; } QString deviceCommandName() const { return tr("Switch"); } QString tableName() const { return tr("Switching table"); } QString pixmapName() const { return ":/im/images/switch.png"; } protected: void write(QDataStream &stream) const; void read(QDataStream &stream); }; class switchTableSetting { public: switchTableSetting(switchDevice *s) : sw(s) { } switchModel* switchTable(); int socketsCount() const { return sw->chip->socketsCount(); } void removeFromTable(int row); devicePort* socket(const QString &s) { return sw->chip->socket(s); } private: switchDevice *sw; }; class virtualNetworkSetting { public: virtualNetworkSetting( switchDevice *device ) : myDevice(device) { } private: switchDevice *myDevice; }; #endif // SWITCHDEVICE_H netemul-1.0/src/devices/deviceimpl.cpp0000644000175000017500000000432611277114036017144 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "deviceimpl.h" #include "devicenotedialog.h" deviceImpl::deviceImpl() { } //---------------------------------------------------------- void deviceImpl::showDeviceNoteDialog() { deviceNoteDialog *d = new deviceNoteDialog; d->setDevice( new deviceSetting(this) ); d->exec(); } void deviceImpl::write(QDataStream &stream) const { stream << myNote; } void deviceImpl::writeXml(sceneXmlWriter &stream) const { const QMetaObject *meta = metaObject(); for ( int i = 1 ; i < meta->propertyCount() ; i++ ) { QMetaProperty temp = meta->property(i); if ( temp.read(this).toString() != prototype()->property( temp.name() ) ) stream.writeTextElement( temp.name() , temp.read(this).toString() ); } } void deviceImpl::read(QDataStream &stream) { stream >> myNote; } void deviceImpl::readXml(sceneXmlReader &stream) { Q_ASSERT( stream.isStartElement() && stream.name() == "impl" ); while ( !stream.atEnd() ) { stream.readNext(); if ( stream.isEndElement() ) break; if ( property( qPrintable(stream.name().toString()) ).isValid() ) { setProperty( qPrintable(stream.name().toString() ) , stream.readElementText() ); } } } netemul-1.0/src/devices/routerdevice.h0000644000175000017500000000361211303253545017164 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef ROUTERDEVICE_H #define ROUTERDEVICE_H #include "smartdevice.h" class routerDevice : public smartDevice { Q_OBJECT DECLARE_PROTOTYPE(routerDevice) public: enum { routerDev = 7 }; int type() const { return routerDev; } routerDevice(int c = 0); QString deviceName() const { return "router"; } QString deviceCommandName() const { return tr("Router"); } QString pixmapName() const { return ":/im/images/router.png"; } bool canManageInterface() const { return false; } void dialog(); protected: void write(QDataStream &stream) const; void read(QDataStream &stream); public slots: void setSocketsCount(int n); }; class routerSetting : public smartSetting { public: routerSetting(routerDevice *r) : smartSetting(r) , rd(r) { } void setSocketsCount(int n) { rd->setSocketsCount(n); } private: routerDevice *rd; }; #endif // ROUTERDEVICE_H netemul-1.0/src/devices/sharebus.h0000644000175000017500000000360311261705352016301 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef SHAREBUS_H #define SHAREBUS_H #include "device.h" class QPainter; class devicePort; // Этот класс представляет собой общую шину, он тоже вынесен в отдельный класс // который унаследован от device , так как у общей шины будет отличаться // реализация и отображение от остальных устройств // class shareBus : public deviceImpl { public: enum { defaultWidth = 200 }; shareBus(int c); devicePort* addInterface(QString str,int t); void dialog() { } bool hasTable() const { return false; } private: int widthDev; // Это длина нашего устройства общей шины //и она может изменяться в отличии от других устройств }; #endif // SHAREBUS_H netemul-1.0/src/devices/switchdevice.cpp0000644000175000017500000000520111276453652017506 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "switchdevice.h" #include "tableswitch.h" #include "switchproperty.h" #include "switchchip.h" #include "appsetting.h" #include "virtualnetworkdialog.h" DECLARE_STATIC_PROTOTYPE(switchDevice) DEFINETION_PROTOTYPE_FUNCTION(switchDevice) switchDevice::switchDevice(int c /* =0 */) { if (!c) c = appSetting::defaultSwitchCount(); myManual = appSetting::defaultSwitchManual(); chip = new switchChip(c); setNote(tr("Switch")); } switchDevice::~switchDevice() { delete chip; } void switchDevice::write(QDataStream &stream) const { stream << switchDev; boxDevice::write(stream); } void switchDevice::read(QDataStream &stream) { boxDevice::read(stream); } void switchDevice::dialog() { switchProperty *d = new switchProperty; d->setSwitch( new boxSetting(this) ); d->show(); } void switchDevice::tableDialog() { switchTableSetting *set = new switchTableSetting(this); tableSwitch *t = new tableSwitch(set); t->exec(); delete t; delete set; } void switchDevice::showVirtualNetworkDialog() { virtualNetworkDialog *d = new virtualNetworkDialog; d->setDevice( new virtualNetworkSetting(this) ); d->show(); } switchChip* switchDevice::concreteChip() { return static_cast(chip); } void switchDevice::secondTimerEvent() { chip->secondTimerEvent(); } //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- switchModel* switchTableSetting::switchTable() { return sw->concreteChip()->modelAt( sw->concreteChip()->vlanAt(0) ); } netemul-1.0/src/devices/boxdevice.cpp0000644000175000017500000000470511276453652017005 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "boxdevice.h" #include "logdialog.h" boxDevice::boxDevice() { } boxDevice::~boxDevice() { } void boxDevice::write(QDataStream &stream) const { deviceImpl::write(stream); chip->write(stream); } void boxDevice::writeXmlImpl(sceneXmlWriter &stream) const { Q_UNUSED(stream) // deviceImpl::writeXml(stream); } void boxDevice::read(QDataStream &stream) { deviceImpl::read(stream); chip->read(stream); } void boxDevice::readXmlImpl(sceneXmlReader &stream) { Q_UNUSED(stream) // Q_ASSERT( stream.isStartElement() && stream.name() == "impl"); // while ( !stream.atEnd() ) { // stream.readNext(); // if ( stream.isEndElement() ) break; // if ( stream.name() == "deviceimpl" ) deviceImpl::readXml(stream); // } } void boxDevice::deciSecondTimerEvent() { chip->deciSecondTimerEvent(); } void boxDevice::showLogDialog(logDialog *log) const { connect( log , SIGNAL(changeInterface(QString)) , this , SLOT(setCheckedSocket(QString)) ); connect( chip , SIGNAL(receiveData(frame,QString)) , log , SLOT(receiveData(frame,QString)) ); connect( chip , SIGNAL(sendData(frame,QString)) , log , SLOT(sendData(frame,QString)) ); } QIcon boxDevice::isConnectSocketIcon(const QString &socket) const { if ( isConnectSocket(socket) ) return QIcon(":/im/images/ok.png"); return QIcon(":/im/images/not.png"); } void boxDevice::setCheckedSocket(const QString &port) { chip->setCheckedSocket(port); } netemul-1.0/src/devices/boxdevice.h0000644000175000017500000000653211276453652016452 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef BOXDEVICE_H #define BOXDEVICE_H #include "device.h" #include "boxchip.h" #include "abstractchip.h" class boxDevice : public deviceImpl { public: friend class boxSetting; boxDevice(); virtual ~boxDevice(); bool isConnectSocket(const QString &socket) const { return chip->isConnectSocket(socket); } QIcon isConnectSocketIcon(const QString &socket) const; QStringList sockets() const { return chip->sockets(); } QString socketName(const cableDev *c) const { return chip->socketName(c); } void addConnection(const QString &port , cableDev *c) { chip->addConnection(port,c); } void deleteConnection(cableDev *c) { chip->deleteConnection(c); } void setManual(bool c) { myManual = c; } bool isManual() { return myManual; } void deciSecondTimerEvent(); int trafficDigit() const { return chip->trafficDigit(); } virtual void secondTimerEvent() { } virtual void showLogDialog(logDialog *log) const; bool isBusy() const { return chip->isBusy(); } statistics deviceStatistics() const { return chip->chipStatistics(); } public slots: void setSocketsCount(int n) { chip->setSocketsCount(n); } void setCheckedSocket(const QString &port); protected: bool myManual; boxChip *chip; virtual void writeXmlImpl(sceneXmlWriter &stream) const; virtual void write(QDataStream &stream) const; virtual void read(QDataStream &stream); virtual void readXmlImpl(sceneXmlReader &stream); }; class boxSetting : public deviceSetting { public: boxSetting(boxDevice *h) : deviceSetting(h) , box(h) { } int socketsCount() const { return box->chip->socketsCount(); } QString snmpMac() const { return box->chip->mac().toString(); } QString snmpIp() const { return box->chip->ip().toString(); } QString snmpMask() const { return box->chip->mask().toString(); } void setMac(const QString &str) { box->chip->setMac(str); } void setIp(const QString &str) { box->chip->setIp(str); } void setMask(const QString &str) { box->chip->setMask(str); } QString statics() const { return box->chip->staticsString(); } bool isManual() const { return box->isManual(); } void setManual(bool b) { box->setManual(b); } void reset() { box->chip->resetStatics(); } bool setSocketsCount(int n) { return box->chip->setSocketsCount(n); } private: boxDevice *box; }; #endif // BOXDEVICE_H netemul-1.0/src/devices/devices.pri0000644000175000017500000000073011231325065016444 0ustar frostfrostHEADERS += \ src/devices/boxdevice.h \ src/devices/computer.h \ src/devices/deviceimpl.h \ src/devices/hubdevice.h \ src/devices/routerdevice.h \ src/devices/sharebus.h \ src/devices/smartdevice.h \ src/devices/switchdevice.h SOURCES += \ src/devices/boxdevice.cpp \ src/devices/computer.cpp \ src/devices/deviceimpl.cpp \ src/devices/hubdevice.cpp \ src/devices/routerdevice.cpp \ src/devices/sharebus.cpp \ src/devices/smartdevice.cpp \ src/devices/switchdevice.cpp netemul-1.0/src/devices/smartdevice.cpp0000644000175000017500000004410111304016657017325 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include #include #include "smartdevice.h" #ifndef __TESTING__ #include "routeeditor.h" #include "adapterproperty.h" #include "tablearp.h" #include "programmdialog.h" #include "logdialog.h" #endif #include "routemodel.h" #include "tcpsocket.h" #include "udpsocket.h" #include "dhcpclientprogramm.h" smartDevice::smartDevice() : myRouter(false) { myReady = false; isDirty = true; myRouteTable = new routeModel(this); connect( myRouteTable , SIGNAL(recordAdding(routeRecord*,int)) , SLOT(tableChanged(routeRecord*,int))); connect( myRouteTable , SIGNAL(recordDeleting(routeRecord*,int)) , SLOT(tableChanged(routeRecord*,int))); } smartDevice::~smartDevice() { myProgramms.clear(); qDeleteAll(mySockets); qDeleteAll(myInterfaces); } const interface* smartDevice::adapter(const QString &s) const { for ( int i = 0 ; i < myInterfaces.size() ; i++ ) if ( myInterfaces.at(i)->name() == s ) return myInterfaces.at(i); return 0; } interface* smartDevice::adapter(const QString &name) { for ( int i = 0 ; i < myInterfaces.size() ; i++ ) if ( myInterfaces.at(i)->name() == name ) return myInterfaces[i]; return 0; } interface* smartDevice::addInterface(const QString &name) { interface *t = new interface(name); myInterfaces << t; connect( t, SIGNAL(receivedPacket(ipPacket)) , SLOT(receivePacket(ipPacket)) ); return t; } interface* smartDevice::ipToAdapter(const ipAddress a) { for ( int i = 0 ; i < myInterfaces.size() ; i++ ) if ( myInterfaces.at(i)->ip() == a ) return myInterfaces[i]; return NULL; } void smartDevice::receivePacket(ipPacket p) { if ( p.decTtl() == 0 ) return; interface *f = qobject_cast(sender()); if ( p.receiver() == f->ip() || p.isBroadcast(f->mask()) ) treatPacket(p); else routePacket(p); } /*! Маршрутизирует пакет. @param p - указатель на пакет. */ void smartDevice::routePacket(ipPacket &p) { if ( !myRouter ) return; // Выходим если нет маршрутизации. routeRecord *t = myRouteTable->recordAt(p.receiver()); if ( !t ) return; ipAddress gw; if ( t->out != t->gateway ) gw = t->gateway; interface *f = ipToAdapter( t->out ); if ( f && f->isConnect() ) { f->sendPacket(p,gw); } else { QMessageBox::warning(0, QObject::tr("The network is not working correctly"), QObject::tr("Can't route packet! See adapter settings!"), QMessageBox::Ok, QMessageBox::Ok); } } //--------------------------------------------- /*! Вызывается при подключении или отключении сети от устройства, а также при смене ip-адреса или маски подсети. @param p - порт на котором произошло событие; */ void smartDevice::connectedNet(interface *p) { checkReady(); ipAddress ip = p->ip(); ipAddress mask = p->mask(); if ( ip.isEmpty() || mask.isEmpty() ) return; myRouteTable->checkConnectedNet(ip, mask, p->isConnect()); } //------------------------------------------------------------ void smartDevice::addConnection(const QString &port,cableDev *c) { adapter(port)->setConnect(true,c); connectedNet(adapter(port)); emit interfaceConnected(port); } void smartDevice::deleteConnection(cableDev *c) { foreach ( interface *i , myInterfaces ) if ( i->isCableConnect(c) ) { i->setConnect(false,0); connectedNet(i); return; } } /*! Записывает устройство в поток данных. @param stream - ссылка на поток. */ void smartDevice::write(QDataStream &stream) const { deviceImpl::write(stream); stream << myInterfaces.size(); // Количество сокетов for ( int i = 0 ; i < myInterfaces.size() ; i++ ) myInterfaces[i]->write(stream); stream << myRouter; // Включена или нет маршрутизация. myRouteTable->write(stream);// stream << myProgramms.count(); // Количество программ. foreach ( programm i , myProgramms ) // И сами программы. stream << i; } //------------------------------------------------- void smartDevice::writeXmlImpl(sceneXmlWriter &stream) const { Q_UNUSED(stream) // deviceImpl::writeXml(stream); // stream.writeStartElement("smartdevice"); // stream.writeAttribute("routing", ( myRouter ) ? "1" : "0" ); // for ( int i = 0 ; i < myInterfaces.size() ; i++ ) { // stream.writeStartElement("chipimpl"); // myInterfaces.at(i)->writeXml(stream); // stream.writeEndElement(); // } // stream.writeStartElement("routetable"); // myRouteTable->writeXml(stream); // stream.writeEndElement(); // foreach ( programm i, myProgramms ) { // stream.writeStartElement("programm"); // stream.writeAttribute( "id",QString::number(i->id()) ); // i->writeXml(stream); // stream.writeEndElement(); // } // stream.writeEndElement(); } void smartDevice::read(QDataStream &stream) { deviceImpl::read(stream); int n,i; stream >> n; qDeleteAll(myInterfaces); myInterfaces.clear(); for (i = 0; i < n ; i++) { interface *p = addInterface(QString()); p->read(stream); } stream >> myRouter; myRouteTable->read(stream); stream >> n; for ( i = 0 ; i < n; i++ ) { programm p(stream); installProgramm(p); } } void smartDevice::readXmlImpl(sceneXmlReader &stream) { Q_UNUSED(stream); // Q_ASSERT( stream.isStartElement() && stream.name() == "impl" ); // qDeleteAll(myInterfaces); // myInterfaces.clear(); // while ( !stream.atEnd() ) { // stream.readNext(); // if ( stream.isEndElement() ) break; // if ( stream.name() == "smartdevice" ) { // myRouter = stream.attributes().value("routing").toString().toInt(); // while ( !stream.atEnd() ) { // stream.readNext(); // if ( stream.isEndElement() ) break; // if ( stream.name() == "chipimpl" ) { // interface *p = addInterface(QString()); // p->readXml(stream); // } else if (stream.name() == "routetable" ) { // myRouteTable->readXml(stream); // } // else if ( stream.name() == "programm" ) { // int id = stream.attributes().value("id").toString().toInt(); // programm p(id); // p->readXml(stream); // installProgramm(p); // } // } // } else if (stream.name() == "deviceimpl" ) { // deviceImpl::readXml(stream); // } // } } /*! Задает устройству шлюз по умолчанию. @param str - строка с адресом. */ void smartDevice::setGateway(const QString &str) { ipAddress t(str); routeRecord *i = myRouteTable->recordAt("0.0.0.0"); // Ищем старый шлюз if ( i ) myRouteTable->deleteFromTable(i); // Удаляем его if ( t.isEmpty() ) return; ipAddress a = findInterfaceIp(t); if ( a.isEmpty() ) { QMessageBox::warning(0, QObject::tr("The network is not working correctly"), QObject::tr("Can't set this gateway! See adapter settings!"), QMessageBox::Ok, QMessageBox::Ok); return; } myRouteTable->addToTable(ipAddress(),ipAddress(),t,a,0,routeModel::staticMode); } //-------------------------------------------------------------- ipAddress smartDevice::gateway() const { routeRecord *i = myRouteTable->recordAt("0.0.0.0"); if ( i ) return i->gateway; return ipAddress(); } /*! Отправляет сообщение посланное из интерфейса программы. @param a - Адрес назначения. @param size - Размер сообщения в кб(на деле сколько пакетов). @param type - Протокол с помощью которого происходит отправка. */ void smartDevice::sendMessage( const QString &a , int size ,int type) { if ( type == TCP ) { tcpSocket *tcp = new tcpSocket(this,User); QByteArray temp(size*1024, '0'); tcp->write(a,User,temp); connect(tcp, SIGNAL(writeEnd()), tcp, SLOT(deleteLater())); return; } udpSocket socket(this, User ); QByteArray temp( size*1024 , '0'); socket.write(a,User,temp); } //--------------------------------------------------------------- /*! Обрабатывает входящий пакет. @param p - указатель на пакет. */ void smartDevice::treatPacket(ipPacket &p) { quint16 port = p.receiverSocket(); foreach ( abstractSocket *i, mySockets ) if ( i->isOurData(p.sender(),port) ) { i->treatPacket(p); return; } if ( p.upProtocol() == UDP ) return; tcpSocket *tcp = new tcpSocket(this,User); tcp->treatPacket(p); connect(tcp, SIGNAL(receiveEnd()), tcp, SLOT(deleteLater())); } //-------------------------------------------------- /*! Узнает ip-адрес интерфейса лежащего в той же сети что и указанный адрес. @param a - Адрес для поиска. @return ip-адрес интерфейса. */ ipAddress smartDevice::findInterfaceIp(ipAddress a) { foreach ( interface *i , myInterfaces ) { if ( !i->isConnect() ) continue; if ( (i->mask() & a ) == ( i->ip() & i->mask() ) ) return i->ip(); } return ipAddress(); } //------------------------------------------------------ /*! */ programm smartDevice::programmAt(const quint16 p) const { foreach ( programm i , myProgramms ) if ( i->id() == p ) return i; return programm(); } //------------------------------------------------------ /*! Удаляет программу. @param p - указатель на программу. */ void smartDevice::removeProgramm(programm p) { p->setDevice(NULL); myProgramms.removeOne(p); } //------------------------------------------------------ /*! Посылает всем программам установленым на компьютере прерывание. @param u - номер прерывания. */ bool smartDevice::sendInterrupt(int u) { bool b = false; foreach ( programm i ,myProgramms ) if ( i->isEnable() && i->interrupt(u) ) b = true; return b; } //------------------------------------------------------- void smartDevice::tableDialog() { #ifndef __TESTING__ routeEditor *d = new routeEditor(this); d->show(); #endif } void smartDevice::showLogDialog(logDialog *log) const { #ifndef __TESTING__ connect( log ,SIGNAL(changeInterface(QString)) , this ,SLOT(setCheckedSocket(QString)) ); foreach ( interface *i , myInterfaces ) { connect( i , SIGNAL(receiveData(frame,QString)) , log , SLOT(receiveData(frame,QString)) ); connect( i , SIGNAL(sendData(frame,QString)) , log , SLOT(sendData(frame,QString)) ); } #endif } void smartDevice::adapterDialog() { #ifndef __TESTING__ adapterProperty *d = new adapterProperty( new adapterSetting(this) ); d->show(); #endif } void smartDevice::programmsDialog() { #ifndef __TESTING__ programmDialog *d = new programmDialog; d->setDevice(this); d->exec(); #endif } void smartDevice::arpDialog() { #ifndef __TESTING__ tableArp *d = new tableArp; d->setDevice(this); d->exec(); #endif } QStringList smartDevice::featuresList() const { QStringList t; foreach ( programm i , myProgramms ) t << i->featureName(); return t; } QStringList smartDevice::sockets() const { QStringList t; for ( int i = 0 ; i < myInterfaces.size() ; i++ ) t << myInterfaces.at(i)->name(); return t; } void smartDevice::setCheckedSocket(const QString &str) { foreach ( interface *i , myInterfaces ) i->setChecked( i->name() == str ); } QStringList smartDevice::interfacesIp() const { QStringList t; for ( int i = 0 ; i < myInterfaces.size() ; i++ ) if ( myInterfaces.at(i)->isConnect() ) t << myInterfaces.at(i)->ip().toString(); return t; } QString smartDevice::socketName(const cableDev *c) const { for ( int i = 0 ; i < myInterfaces.size(); i++ ) if ( myInterfaces.at(i)->isCableConnect(c) ) return myInterfaces.at(i)->name(); return QString(); } void smartDevice::deciSecondTimerEvent() { foreach ( interface *i , myInterfaces ) i->deciSecondEvent(); } void smartDevice::secondTimerEvent() { foreach ( interface *i , myInterfaces ) i->secondEvent(); foreach ( abstractSocket *i, mySockets ) i->secondEvent(); foreach ( programm i , myProgramms ) i->incTime(); } void smartDevice::setIp(const QString &a, const QString &ip) { isDirty = true; adapter(a)->setIp(ip); connectedNet(adapter(a)); } QString smartDevice::ipaddress(const QString &name) const { return adapter(name)->ip().toString(); } void smartDevice::setMask(const QString &a, const QString &ip) { isDirty = true; adapter(a)->setMask(ip); connectedNet(adapter(a)); } void smartDevice::checkReady() const { myReady = true; foreach ( interface *i , myInterfaces ) if ( i->isConnect() && i->ip().isEmpty() ) { myReady = false; break; } } bool smartDevice::isReady() const { if ( isDirty ) { checkReady(); isDirty = false; } return myReady; } bool smartDevice::isBusy() const { foreach ( interface *i , myInterfaces ) if ( i->isBusy() ) return true; foreach ( abstractSocket *i , mySockets ) if ( i->isBusy() ) return true; return false; } void smartDevice::addInterface() { int max = 0; foreach ( interface *i , myInterfaces ) { int t = i->name().mid(3).toInt(); if ( t > max ) max = t; } addInterface( tr("eth%1").arg(++max) ); } void smartDevice::deleteInterface(const QString &name) { interface *t = adapter(name); myInterfaces.remove( myInterfaces.indexOf(t) ); emit interfaceDeleted(name); } QList smartDevice::arpModels() { QList list; foreach ( interface *i, myInterfaces ) list += i->arpTable(); return list; } void smartDevice::tableChanged(routeRecord *r,int n) { r->change = routeModel::changed; sendInterrupt( n ); r->change = routeModel::noChanged; } /*! * Устанавливает программу на устройство. * @param p - программа для установки. */ void smartDevice::installProgramm(programm p) { p->setDevice(this); myProgramms << p; myView->onImplChange(); } //----------------------------------------------------------- statistics smartDevice::deviceStatistics() const { statistics s; foreach ( interface *i , myInterfaces ) s += i->chipStatistics(); return s; } bool smartDevice::hasProgramm(int id) { foreach ( programm i , myProgramms ) if ( i->id() == id ) return true; return false; } int smartDevice::trafficDigit() const { int sum = 0; foreach ( interface *i , myInterfaces ) sum += i->trafficDigit(); return sum; } QIcon smartDevice::isConnectSocketIcon(const QString &socket) const { if ( isConnectSocket(socket) ) return QIcon(":/im/images/ok.png"); return QIcon(":/im/images/not.png"); } //------------------------------------------------------------------------------ //----------------------Функии класса adapterSetting---------------------------- //------------------------------------------------------------------------------ /*! * Функция устанавливает текущий выбранный интерфейс в настройках адаптеров. */ void adapterSetting::setCurrent(int n) { cur = n; oldMask = sd->myInterfaces[cur]->mask(); oldIp = sd->myInterfaces[cur]->ip(); } //----------------------------------------------------------------------- /*! * Изменяет таблицу маршрутизации в соответсвии с новыми настройками интрефейсов. */ void adapterSetting::connectedNet() { routeRecord *t = sd->routeTable()->recordAt( oldMask & oldIp ); if ( t ) { // Удаляем запись со старыми натсройками sd->routeTable()->deleteFromTable(t); } sd->connectedNet(sd->myInterfaces.at(cur)); } //-------------------------------------------------------------------------- bool adapterSetting::isUnderDhcpControl() const { dhcpClientProgramm *t = qobject_cast( sd->programmAt(programm::DHCPClient).impl() ); return t->isUnderDhcpControl( sd->myInterfaces.at(cur)->name() ); } void adapterSetting::setUnderDhcpControl(bool isUnder) { dhcpClientProgramm *t = qobject_cast( sd->programmAt( programm::DHCPClient).impl() ); t->observeInterface( sd->myInterfaces.at(cur)->name() , isUnder ); } netemul-1.0/src/devices/smartdevice.h0000644000175000017500000001754011303041536016772 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef SMARTDEVICE_H #define SMARTDEVICE_H #include #include #include "deviceimpl.h" #include "interface.h" #include "programm.h" class routeModel; class arpModel; class routeRecord; class abstractSocket; /*! Интелектуальное устройство, абстрактный класс объединяющий в себе свойства компьютера и роутера. */ class smartDevice : public deviceImpl { Q_OBJECT public: /*! Источники записи таблицы маршрутизации. */ enum { addNet = 100 , delNet = 101 }; enum { UDP = 0 ,TCP = 1 }; enum { User = 7777 }; /*! Значения для флага записи из таблицы маршрутизации. */ smartDevice(); virtual ~smartDevice(); QString tableName() const { return tr("Routing Table"); } virtual void tableDialog(); virtual void adapterDialog(); virtual void programmsDialog(); virtual void arpDialog(); virtual void showLogDialog(logDialog *log) const; virtual bool canManageInterface() const = 0; virtual statistics deviceStatistics() const; bool isSmart() const { return true; } bool isReady() const; void checkReady() const; void checkTable(); bool isBusy() const; QStringList sockets() const; QStringList interfacesIp() const; QStringList featuresList() const; void addInterface(); bool isConnectSocket(const QString &socket) const { return adapter(socket)->isConnect(); } QIcon isConnectSocketIcon(const QString &socket) const; QString socketName(const cableDev *c) const; QString nameToIp(const QString &name) const { return adapter(name)->ip().toString(); } const interface* adapter(const QString &s) const; interface* ipToAdapter(const ipAddress a); void addConnection(const QString &port, cableDev *c); void deleteConnection(cableDev *c); void sendMessage(const QString &a, int size ,int type); void treatPacket(ipPacket &p); void routePacket(ipPacket &p); void connectedNet(interface *p); void deciSecondTimerEvent(); void secondTimerEvent(); int trafficDigit() const; ipAddress findInterfaceIp(ipAddress a); programm programmAt(const quint16 p) const; void removeProgramm(programm p); void installProgramm( programm p); bool sendInterrupt(int u); int socketsCount() const { return myInterfaces.count(); } QList programms() { return myProgramms; } QVector interfaces() { return myInterfaces; } void setRouter(bool n) { myRouter = n; } bool isRouter() const { return myRouter; } bool hasTable() const { return true; } bool hasProgramm(int id); ipAddress gateway() const; routeModel* routeTable() { return myRouteTable; } QList arpModels(); public slots: void receivePacket(ipPacket p); void setCheckedSocket(const QString &str); void tableChanged(routeRecord*,int n); void setIp(const QString &a, const QString &ip); QString ipaddress(const QString &name) const; void setMask(const QString &a, const QString &ip); void setGateway(const QString &str); virtual quint64 sendPacketCount(const QString &name) { return adapter(name)->countSendPacket(); } virtual quint64 receivePacketCount(const QString &name) { return adapter(name)->countRecPacket(); } virtual quint64 sendFrameCount(const QString &name) { return adapter(name)->countSendFrame(); } virtual quint64 receiveFrameCount(const QString &name) { return adapter(name)->countRecFrame(); } signals: void interfaceDeleted(QString); void interfaceConnected(QString); protected: interface* adapter(const QString &name); interface* addInterface(const QString &name); void deleteInterface(const QString &name); bool myRouter; mutable bool myReady; mutable bool isDirty; QVector myInterfaces; QList myProgramms; //!< Программы установленные на устройстве. QList mySockets; //!< Список установленных соединений. routeModel *myRouteTable; //!< Таблица маршрутизации. virtual void write(QDataStream &stream) const; virtual void read(QDataStream &stream); virtual void writeXmlImpl(sceneXmlWriter &stream) const; virtual void readXmlImpl(sceneXmlReader &stream); // FRIENDS: public: friend class tcpSocket; friend class udpSocket; friend class abstractSocket; friend class ripProgramm; friend class adapterSetting; friend class dhcpClientProgramm; friend class dhcpServerProgramm; }; //------------------------------------------------------------------- /*! Модель данных для настроек адаптеров. */ class adapterSetting { public: adapterSetting(smartDevice *s) : sd(s) { } void setCurrent(int n); int current() const { return cur; } void resetStatics() { sd->myInterfaces.at(cur)->resetStatics(); } void connectedNet(); int socketsCount() const { return sd->socketsCount(); } bool isConnect() const { return sd->myInterfaces.at(cur)->isConnect(); } QIcon isConnectSocketIcon() const { return sd->isConnectSocketIcon( sd->myInterfaces.at(cur)->name() ); } QString name() const { return sd->myInterfaces.at(cur)->name(); } QString mac() const { return sd->myInterfaces.at(cur)->mac().toString(); } QString ip() const { return sd->myInterfaces.at(cur)->ip().toString(); } QString mask() const { return sd->myInterfaces.at(cur)->mask().toString(); } void setMac(const QString &str) { sd->myInterfaces.at(cur)->setMac(str); } void setIp(const QString &str) { sd->myInterfaces.at(cur)->setIp(str); } void setMask(const QString &str) { sd->myInterfaces.at(cur)->setMask(str); } void setCheckedSocket(const QString &str) { sd->setCheckedSocket(str); } QString statics() const { return sd->myInterfaces.at(cur)->staticsString(); } void sendArpRequest(ipAddress a) { sd->myInterfaces.at(cur)->sendArpRequest(a); } bool hasDhcpClient() const { return sd->hasProgramm( programm::DHCPClient ); } bool isUnderDhcpControl() const; void setUnderDhcpControl(bool isUnder); bool canManageInterface() const { return sd->canManageInterface(); } void addInterface() { sd->addInterface(); } void deleteInterface(const QString &name) { sd->deleteInterface(name); } private: ipAddress oldIp; ipAddress oldMask; int cur; smartDevice *sd; }; //------------------------------------------------------------- class smartSetting : public deviceSetting { public: smartSetting(smartDevice *d) : deviceSetting(d) , sd(d) { } int socketsCount() const { return sd->socketsCount(); } bool isRouter() const { return sd->isRouter(); } void setRouter(bool b) { sd->setRouter(b); } private: smartDevice *sd; }; #endif // SMARTDEVICE_H netemul-1.0/src/devices/routerdevice.cpp0000644000175000017500000000472011276453652017532 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "routerdevice.h" #include "routerproperty.h" #include "routemodel.h" #include "appsetting.h" #include DECLARE_STATIC_PROTOTYPE(routerDevice) DEFINETION_PROTOTYPE_FUNCTION(routerDevice) routerDevice::routerDevice(int c /* = 0 */) { if ( !c ) c = appSetting::defaultRouterCount(); for ( int i = 0 ; i < c ; i++ ) addInterface(tr("LAN%1").arg(i+1)); setNote(tr("Router")); } void routerDevice::dialog() { routerProperty *d = new routerProperty; routerSetting *set = new routerSetting(this); d->setRouter(set); d->exec(); delete d; delete set; } void routerDevice::write(QDataStream &stream) const { stream << routerDev; smartDevice::write(stream); } void routerDevice::read(QDataStream &stream) { smartDevice::read(stream); } void routerDevice::setSocketsCount(int n) { int t = myInterfaces.size(); if ( t <= n ) { for ( int i = t; i < n ; i++ ) addInterface( tr("LAN%1").arg(i+1) ); } else { foreach ( interface *i , myInterfaces ) if ( i->isConnect() ) { QMessageBox::warning(0,tr("Error"), tr("To change the number of ports, disconnect all cables!"), QMessageBox::Ok , QMessageBox::Ok); return; } for ( int i = t-1 ; i >= n ; i-- ) { delete myInterfaces[i]; myInterfaces.pop_back(); } } } netemul-1.0/src/devices/sharebus.cpp0000644000175000017500000000232411261705352016633 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "sharebus.h" shareBus::shareBus(int c) { Q_UNUSED(c); widthDev = defaultWidth; } devicePort* shareBus::addInterface(QString str, int t) { Q_UNUSED(str); Q_UNUSED(t); return NULL; } netemul-1.0/src/models/0000755000175000017500000000000011305026150014142 5ustar frostfrostnetemul-1.0/src/models/routemodel.h0000644000175000017500000001003111276013507016476 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef ROUTEMODEL_H #define ROUTEMODEL_H #include #include #include "scenexmlreader.h" #include "scenexmlwriter.h" #include "ipaddress.h" struct routeRecord { public: ipAddress dest; ipAddress mask; ipAddress gateway; ipAddress out; int time; qint8 metric; int mode; quint8 change; //!< Флаг показывающий изменена запись или нет. QString modeString() const; friend QDataStream& operator<<(QDataStream &stream, const routeRecord &rec); friend QDataStream& operator>>(QDataStream &stream, routeRecord &rec); void writeXml(sceneXmlWriter &stream) const; void readXml(sceneXmlReader &stream); }; typedef QList routeTable; class routeModel : public QAbstractTableModel { Q_OBJECT public: enum { connectMode = 3 , staticMode = 4 , ripMode = 5 }; enum { changed = 0 , noChanged = 1 }; enum { addNet = 100 , delNet = 101 }; routeModel(QObject *parent = 0); ~routeModel(); int rowCount( const QModelIndex &r = QModelIndex() ) const; int columnCount( const QModelIndex &r = QModelIndex() ) const; QVariant headerData( int s , Qt::Orientation o, int role ) const; Qt::ItemFlags flags(const QModelIndex &r) const; QVariant data(const QModelIndex &r, int role = Qt::DisplayRole ) const; void update(); void deleteOldRecord(int time); routeRecord* changedRecord(); routeRecord* addToTable(ipAddress d,ipAddress m,ipAddress g,ipAddress o,qint8 metr,int mode); routeRecord* addToTable(routeRecord *r); void deleteFromTable(int n); void deleteFromTable(routeRecord *r); routeRecord* recordAt(const ipAddress &a) const; routeRecord* recordAt(int i) const { return table.at(i); } void checkConnectedNet(ipAddress ip, ipAddress mask, bool add); bool isConnectedMode(QModelIndex curr); void write(QDataStream &stream) const; void writeXml(sceneXmlWriter &stream) const; void readXml(sceneXmlReader &stream); void read(QDataStream &stream); signals: void recordAdding(routeRecord*,int); void recordDeleting(routeRecord*,int); private: mutable routeRecord *lastRecord; mutable ipAddress lastIpAddress; routeTable table; }; inline QDataStream& operator<<(QDataStream &stream, const routeRecord &rec) { stream << rec.dest; stream << rec.mask << rec.gateway; stream << rec.time << rec.metric << rec.out; return stream; } inline QDataStream& operator>>(QDataStream &stream, routeRecord &rec) { stream >> rec.dest >> rec.mask >> rec.gateway >> rec.time >> rec.metric >> rec.out; return stream; } inline bool operator<(const routeRecord &e1 , const routeRecord &e2) { if ( e1.mask != e2.mask ) return e1.mask < e2.mask; return e1.dest < e2.dest; } inline bool operator>(const routeRecord &e1 , const routeRecord &e2) { if ( e1.mask != e2.mask ) return e1.mask > e2.mask; return e1.dest < e2.dest; } inline bool routeGreat(const routeRecord *e1 , const routeRecord *e2) { return *e1 > *e2; } #endif // ROUTEMODEL_H netemul-1.0/src/models/switchmodel.h0000644000175000017500000000425011252300033016632 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef SWITCHMODEL_H #define SWITCHMODEL_H #include #include "macaddress.h" class devicePort; struct macRecord { macAddress mac; devicePort *port; int time; int mode; QString modeString() const { if ( mode == 0 ) return QObject::tr("Static"); else return QObject::tr("Dinamic"); } }; class switchModel : public QAbstractTableModel { Q_OBJECT public: enum { staticMode = 0 , dinamicMode = 1 }; switchModel(QObject *parent = 0); int rowCount(const QModelIndex &p) const; int columnCount(const QModelIndex &p) const; Qt::ItemFlags flags(const QModelIndex &m) const; QVariant headerData(int s , Qt::Orientation o , int role) const; QVariant data(const QModelIndex &m, int role) const; void updateMac(); void deleteFromTable(const macAddress &mac); void deleteFromTable(macRecord *r); macRecord* addToTable(const macAddress &mac ,devicePort *p , int mode); void contains(const macAddress &m , devicePort *s); devicePort* portWithMac(const macAddress &m); private: devicePort *lastPort; macAddress lastMac; QList table; }; #endif // SWITCHMODEL_H netemul-1.0/src/models/dhcpservermodel.h0000644000175000017500000000524611276453652017532 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef DHCPSERVERMODEL_H #define DHCPSERVERMODEL_H #include #include "scenexmlwriter.h" #include "scenexmlreader.h" #include "macaddress.h" #include "ipaddress.h" struct staticDhcpRecord { macAddress chaddr; ipAddress yiaddr; ipAddress mask; ipAddress gateway; int time; void write(QDataStream &stream) const; void read(QDataStream &stream); void writeXml(sceneXmlWriter &stream) const; void readXml(sceneXmlReader &stream); }; static const int COLUMN_COUNT = 5; class dhcpServerModel : public QAbstractTableModel { public: dhcpServerModel(QObject *parent = 0) : QAbstractTableModel(parent) { } ~dhcpServerModel(); int rowCount( const QModelIndex &r = QModelIndex() ) const; int columnCount( const QModelIndex &r = QModelIndex() ) const; QVariant headerData( int s , Qt::Orientation o, int role ) const; Qt::ItemFlags flags(const QModelIndex &r) const; QVariant data(const QModelIndex &r, int role = Qt::DisplayRole ) const; bool insertRow(int, const QModelIndex &parent = QModelIndex() ); bool removeRow(int row, const QModelIndex &parent = QModelIndex() ); bool setData(const QModelIndex &index,const QVariant &value, int role = Qt::EditRole); bool containRecord( staticDhcpRecord *rec) const; bool containRecord(ipAddress ip) const; staticDhcpRecord* recordWithMac(macAddress cha) const; void addStaticRecord(staticDhcpRecord *rec); void write(QDataStream &stream) const; void read(QDataStream &stream); void writeXml(sceneXmlWriter &stream) const; void readXml(sceneXmlReader &stream); private: QList table; }; #endif // DHCPSERVERMODEL_H netemul-1.0/src/models/arpmodel.cpp0000644000175000017500000000507311254745330016471 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "arpmodel.h" #include "appsetting.h" arpModel::arpModel() { lastRecord = 0; } arpRecord* arpModel::addToTable(ipAddress ip , macAddress mac , int mode ) { foreach ( arpRecord *i , myTable ) { if ( i->ip == ip && i->mac == mac ) return i; if ( i->mode != staticMode && (i->ip == ip || i->mac == mac ) ) { i->ip = ip; i->mac = mac; i->mode = mode; return i; } } arpRecord *t = new arpRecord; t->ip = ip; t->mac = mac; t->mode = mode; t->time = 0; myTable << t; lastRecord = 0; return t; } void arpModel::deleteFromTable(const QString &ip) { ipAddress a(ip); foreach ( arpRecord *i, myTable ) if ( i->ip == a ) { deleteFromTable(i); return; } } void arpModel::deleteFromTable(arpRecord *r) { myTable.removeOne(r); lastRecord = 0; delete r; } void arpModel::update() { int n = appSetting::ttlArp(); foreach ( arpRecord *i , myTable ) if ( ++i->time >= n ) deleteFromTable(i); } void arpModel::clear() { qDeleteAll(myTable); myTable.clear(); } arpRecord* arpModel::recordAt(const ipAddress &a) const { if ( lastRecord && lastAddress == a ) return lastRecord; foreach ( arpRecord *i, myTable ) { if ( i->ip == a) { lastRecord = i; lastAddress = a; return i; } } return 0; } arpRecord* arpModel::recordAt(int u) const { return myTable.at(u); return NULL; } int arpModel::size() { return myTable.size(); } netemul-1.0/src/models/switchmodel.cpp0000644000175000017500000000752711253515344017215 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "switchmodel.h" #include "deviceport.h" #include "appsetting.h" switchModel::switchModel(QObject *parent /* = 0 */) : QAbstractTableModel(parent) { lastPort = 0; } int switchModel::rowCount(const QModelIndex &/* p */) const { if ( table.isEmpty() ) return 0; return table.count(); } int switchModel::columnCount(const QModelIndex &/* p */) const { if ( table.isEmpty() ) return 0; return 4; } Qt::ItemFlags switchModel::flags(const QModelIndex &m) const { return QAbstractTableModel::flags(m); } QVariant switchModel::headerData(int s , Qt::Orientation o , int role) const { if ( role == Qt::TextAlignmentRole ) return Qt::AlignCenter; if ( role != Qt::DisplayRole ) return QVariant(); if ( o == Qt::Horizontal ) { switch (s) { case 0: return tr("Mac-address"); case 1: return tr("Port"); case 2: return tr("Record type"); case 3: return tr("TTL"); } } return s+1; } QVariant switchModel::data(const QModelIndex &m, int role) const { if ( !m.isValid() || table.isEmpty() ) return QVariant(); if ( role == Qt::DisplayRole ) { macRecord *t = table.at( m.row() ); switch ( m.column() ) { case 0: return t->mac.toString(); case 1: return tr("LAN%1").arg(t->port->num()); case 2: return t->modeString(); case 3: return t->time; } } return QVariant(); } macRecord* switchModel::addToTable(const macAddress &mac ,devicePort *p , int mode) { foreach ( macRecord *i , table ) if ( i->mac == mac ) return NULL; macRecord *t = new macRecord; t->time = 0; t->mode = mode; t->port = p; t->mac = mac; table << t; reset(); return t; } void switchModel::deleteFromTable(const macAddress &mac) { foreach ( macRecord *i , table ) if ( i->mac == mac ) { deleteFromTable(i); return; } } void switchModel::deleteFromTable(macRecord *r) { table.removeOne(r); delete r; lastPort = 0; reset(); } void switchModel::contains(const macAddress &m , devicePort *s) { bool cont = false; foreach ( macRecord *i , table ) if ( i->mac == m ) { if ( i->port != s && i->mode != staticMode ) i->port = s; cont = true; break; } if ( !cont ) addToTable( m , s , dinamicMode ); } devicePort* switchModel::portWithMac(const macAddress &m) { if ( lastPort && m == lastMac ) return lastPort; foreach ( macRecord *i , table ) { if ( i->mac == m ) { i->time = 0; lastMac = m; lastPort = i->port; return i->port; } } return 0; } void switchModel::updateMac() { int t = appSetting::ttlMac(); foreach ( macRecord *i , table ) if ( ++i->time >= t ) deleteFromTable(i); } netemul-1.0/src/models/routemodel.cpp0000644000175000017500000002424711276270637017060 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "routemodel.h" routeModel::routeModel(QObject *parent /* = 0 */) : QAbstractTableModel(parent) { lastRecord = 0; } routeModel::~routeModel() { qDeleteAll(table); table.clear(); } int routeModel::rowCount(const QModelIndex &r) const { if ( r.isValid() || table.isEmpty() ) return 0; return table.size(); } int routeModel::columnCount( const QModelIndex&/* r = QModelIndex() */ ) const { if ( table.isEmpty() ) return 0; return 6; } QVariant routeModel::headerData( int s , Qt::Orientation o, int role ) const { if ( table.isEmpty() ) return QVariant(); if ( o == Qt::Horizontal ) if ( role == Qt::DisplayRole ) switch (s) { case 0: return tr("Destination"); case 1: return tr("Mask"); case 2: return tr("Gateway"); case 3: return tr("Interface"); case 4: return tr("Metric"); case 5: return tr("Source"); } if ( o == Qt::Vertical ) if ( role == Qt::DisplayRole ) return s+1; return QAbstractTableModel::headerData(s, o, role); } Qt::ItemFlags routeModel::flags( const QModelIndex &r) const { if ( !r.isValid() || table.isEmpty() ) return 0; return QAbstractTableModel::flags(r); } QVariant routeModel::data(const QModelIndex &r, int role /* = Qt::DisplayRole */ ) const { if ( !r.isValid() || table.isEmpty() ) return QVariant(); routeRecord *rec = table.at(r.row()); if ( role == Qt::DisplayRole ) switch ( r.column() ) { case 0: return rec->dest.toString(); case 1: return rec->mask.toString(); case 2: return rec->gateway.toString(); case 3: return rec->out.toString(); case 4: return rec->metric; case 5: return rec->modeString(); } return QVariant(); } /*! Добавляет в таблицу маршрутизации новую запись. @param d - сеть назначения. @param m - маска сети. @param g - адрес следующего маршрутизатора. @param o - интерфейс с которого отправляем. @param metr - метрика @param mode - источник записи. @return указатель на новую запись */ routeRecord* routeModel::addToTable(ipAddress d,ipAddress m,ipAddress g,ipAddress o,qint8 metr,int mode) { routeRecord *r = new routeRecord; r->dest = d; r->mask = m; r->metric = metr; r->gateway = g; r->mode = mode; r->time = 0; r->change = noChanged; r->out = o; return addToTable(r); } //--------------------------------------------------------------- /*! Добавляет запись в таблицу маршрутизации. @param r - указатель на запись. @param tr - нужно ли вызывать прерывание(по умолчанию нужно). @return указатель добавленную на запись. */ routeRecord* routeModel::addToTable(routeRecord *r) { table << r; qStableSort(table.begin(),table.end(),routeGreat); reset(); emit recordAdding(r,addNet); return r; } //------------------------------------------------------------ void routeModel::deleteFromTable(int n) { int v = 0; foreach ( routeRecord *i , table ) if ( v++ == n ) { deleteFromTable(i); return; } } /*! Удаляет запись из таблицы маршрутизации. @param r - указатель на запись. @param tr - нужно ли вызывать прерывание(по умолчанию нужно). */ void routeModel::deleteFromTable(routeRecord *r) { emit recordDeleting(r,delNet); lastRecord = 0; table.removeOne(r); delete r; qStableSort(table.begin(),table.end(),routeGreat); reset(); } //-------------------------------------------------------------- /*! Находит в таблице маршрутизации. @param a - адрес назначения. @return указатель на запись, если такой записи нет то NULL. */ routeRecord* routeModel::recordAt(const ipAddress &a) const { // Оптимизация работы, запоминаем полседний адрес и если при новом поиске // он совпадает отправляем по той записи которая была последней =) if ( lastRecord && lastIpAddress == a ) return lastRecord; foreach ( routeRecord *i , table ) { if ( i->dest == ( a & i->mask ) ) { lastIpAddress = a; lastRecord = i; return i; } } // Иначе 0 return 0; } //--------------------------------------------- void routeModel::checkConnectedNet(ipAddress ip, ipAddress mask, bool add) { ipAddress dest = mask & ip; foreach ( routeRecord *i , table ) if ( i->dest == dest && i->mask == mask ) { if ( i->gateway == ip && add) return; deleteFromTable(i); if ( add ) break; else return; } addToTable( dest , mask , ip , ip , 0 , connectMode ); } /*! @return строчка описывающая источник записи. */ QString routeRecord::modeString() const { switch ( mode ) { case routeModel::staticMode : return QObject::tr("Static"); case routeModel::ripMode : return QObject::tr("RIP"); case routeModel::connectMode : return QObject::tr("Connected"); } return QString(); } //---------------------------------------------------------------- bool routeModel::isConnectedMode(QModelIndex curr) { return (table.at(curr.row())->modeString() != tr("Connected")); } /*! * Находит в таблице измененую запись. * @return указатель на измененую запись, 0 - если такой записи нет. */ routeRecord* routeModel::changedRecord() { foreach ( routeRecord *i , table ) if ( i->change == changed ) return i; return 0; } //--------------------------------------------------------------------- /*! * Обновляет содержиое всех записей увеличивая время жизни. */ void routeModel::update() { foreach ( routeRecord *i , table ) if ( i->mode != connectMode && i->mode != staticMode ) i->time++; } //----------------------------------------------------------------------- /*! * Удаляет из таблицы записи время жизни которых подошло к концу. * @param time - время жизни достигнув которого запись считается устаревшей. */ void routeModel::deleteOldRecord(int time) { foreach ( routeRecord *i , table ) if ( i->time >= time && i->mode != connectMode && i->mode != staticMode ) deleteFromTable(i); } void routeModel::write(QDataStream &stream) const { routeTable temp; foreach (routeRecord *i , table ) if ( i->mode == routeModel::staticMode ) temp << i; stream << temp.size(); foreach ( routeRecord *i , temp ) stream << *i; } void routeModel::writeXml(sceneXmlWriter &stream) const { foreach ( routeRecord *i , table ) if ( i->mode == staticMode ) { stream.writeStartElement("routerecord"); i->writeXml(stream); stream.writeEndElement(); } } void routeModel::read(QDataStream &stream) { table.clear(); int n; stream >> n; for ( int i = 0 ; i < n ; i++ ) { routeRecord *t = new routeRecord; t->mode = staticMode; stream >> *t; addToTable(t); } } void routeModel::readXml(sceneXmlReader &stream) { Q_ASSERT( stream.isStartElement() && stream.name() == "routetable" ); table.clear(); while ( !stream.atEnd() ) { stream.readNext(); if ( stream.isEndElement() ) break; if ( stream.name() == "routerecord" ) { routeRecord *t = new routeRecord; t->mode = staticMode; t->readXml(stream); addToTable(t); } } } //---------------------------------------------------------------------------------- //---------------------------------------------------------------------------------- void routeRecord::writeXml(sceneXmlWriter &stream) const { stream.writeTextElement("destination",dest.toString() ); stream.writeTextElement("mask",mask.toString() ); stream.writeTextElement("gateway",gateway.toString() ); stream.writeTextElement("metric",QString::number(metric) ); stream.writeTextElement("out", out.toString() ); } void routeRecord::readXml(sceneXmlReader &stream) { while ( !stream.atEnd() ) { stream.readNext(); if ( stream.isEndElement() ) break; if ( stream.name() == "destination" ) dest.setIp( stream.readElementText() ); else if ( stream.name() == "mask" ) mask.setIp( stream.readElementText() ); else if ( stream.name() == "gateway" ) gateway.setIp( stream.readElementText() ); else if ( stream.name() == "metric" ) metric = stream.readElementText().toInt() ; else if ( stream.name() == "out" ) out.setIp( stream.readElementText() ); } } netemul-1.0/src/models/models.pri0000644000175000017500000000041211270066211016141 0ustar frostfrostHEADERS += src/models/routemodel.h \ src/models/switchmodel.h \ src/models/arpmodel.h \ src/models/dhcpservermodel.h SOURCES += src/models/routemodel.cpp \ src/models/switchmodel.cpp \ src/models/arpmodel.cpp \ src/models/dhcpservermodel.cpp netemul-1.0/src/models/arpmodel.h0000644000175000017500000000361111254745330016132 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef ARPMODEL_H #define ARPMODEL_H #include "ipaddress.h" #include "macaddress.h" struct arpRecord; class arpModel { public: enum { staticMode = 100 , dinamicMode = 101 }; arpModel(); ~arpModel() { clear(); } arpRecord* addToTable( ipAddress ip , macAddress mac , int mode ); void deleteFromTable(const QString &ip); void deleteFromTable(arpRecord *r); void update(); void clear(); arpRecord* recordAt(const ipAddress &a) const; arpRecord* recordAt(int u) const; int size(); private: QList myTable; mutable arpRecord *lastRecord; mutable ipAddress lastAddress; }; struct arpRecord { macAddress mac; ipAddress ip; int time; int mode; QString modeString() const { if ( mode == arpModel::staticMode ) return QObject::tr("Static"); else return QObject::tr("Dinamic"); } }; #endif // ARPMODEL_H netemul-1.0/src/models/dhcpservermodel.cpp0000644000175000017500000001553611276453652020070 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "dhcpservermodel.h" dhcpServerModel::~dhcpServerModel() { qDeleteAll(table); table.clear(); } int dhcpServerModel::rowCount( const QModelIndex &r/* = QModelIndex() */) const { if ( r.isValid() || table.isEmpty() ) return 0; return table.size(); } int dhcpServerModel::columnCount( const QModelIndex &r/* = QModelIndex() */) const { if ( r.isValid() ) return 0; return COLUMN_COUNT; } QVariant dhcpServerModel::headerData( int s , Qt::Orientation o, int role ) const { if ( role != Qt::DisplayRole ) return QVariant(); if ( o == Qt::Horizontal ) switch(s) { case 0: return tr("Mac-address"); case 1: return tr("Ip-address"); case 2: return tr("Mask"); case 3: return tr("Gateway"); case 4: return tr("Time"); } else return s+1; return QVariant(); } Qt::ItemFlags dhcpServerModel::flags(const QModelIndex &r) const { if ( !r.isValid() ) return Qt::ItemIsEditable; return QAbstractTableModel::flags(r) | Qt::ItemIsEditable; } QVariant dhcpServerModel::data(const QModelIndex &r, int role/* = Qt::DisplayRole */) const { if ( !r.isValid() || table.isEmpty() ) return QVariant(); staticDhcpRecord *rec = table.at( r.row() ); if ( role == Qt::DisplayRole || role == Qt::EditRole ) switch( r.column() ) { case 0: return rec->chaddr.toString(); case 1: return rec->yiaddr.toString(); case 2: return rec->mask.toString(); case 3: return rec->gateway.toString(); case 4: return rec->time; } return QVariant(); } bool dhcpServerModel::setData(const QModelIndex &index, const QVariant &value, int role/* = Qt::EditRole*/) { if ( index.isValid() && role == Qt::EditRole ) { staticDhcpRecord *rec = table.at(index.row()); if ( value.toString().isEmpty() ) return false; switch ( index.column() ) { case 0: rec->chaddr.setMac(value.toString()); break; case 1: rec->yiaddr.setIp(value.toString()); break; case 2: rec->mask.setIp(value.toString()); break; case 3: rec->gateway.setIp(value.toString()); break; case 4: rec->time = value.toInt(); break; } table.replace( index.row(), rec); emit dataChanged(index, index); return true; } return false; } bool dhcpServerModel::insertRow(int,const QModelIndex &parent) { Q_UNUSED(parent); staticDhcpRecord *newRecord = new staticDhcpRecord; newRecord->time = 0; table << newRecord; reset(); return true; } bool dhcpServerModel::removeRow(int row, const QModelIndex &parent) { Q_UNUSED(parent); staticDhcpRecord *record = table.takeAt(row); if ( record ) delete record; reset(); return true; } bool dhcpServerModel::containRecord(staticDhcpRecord *rec) const { if ( table.isEmpty() ) return false; foreach ( staticDhcpRecord *i, table ) if ( i == rec ) return true; return false; } bool dhcpServerModel::containRecord(ipAddress ip) const { if ( table.isEmpty() ) return false; foreach ( staticDhcpRecord *i, table ) if ( i->yiaddr == ip ) return true; return false; } staticDhcpRecord* dhcpServerModel::recordWithMac(macAddress cha) const { if ( table.isEmpty() ) return 0; foreach ( staticDhcpRecord *i, table ) if ( i->chaddr == cha ) return i; return 0; } void dhcpServerModel::addStaticRecord(staticDhcpRecord *rec) { table << rec; } void dhcpServerModel::write(QDataStream &stream) const { stream << table.size(); foreach ( staticDhcpRecord *i, table ) i->write(stream); } void dhcpServerModel::writeXml(sceneXmlWriter &stream) const { foreach ( staticDhcpRecord *i, table ) { stream.writeStartElement("staticrecord"); i->writeXml(stream); stream.writeEndElement(); } } void dhcpServerModel::read(QDataStream &stream) { int s; stream >> s; for ( int i = 0; i < s; i++ ) { staticDhcpRecord *rec = new staticDhcpRecord; rec->read(stream); addStaticRecord(rec); } } void dhcpServerModel::readXml(sceneXmlReader &stream) { Q_ASSERT( stream.isStartElement() && stream.name() == "statictable" ); while ( !stream.atEnd() ) { stream.readNext(); if ( stream.isEndElement() ) break; if ( stream.name() == "staticrecord" ) { staticDhcpRecord *rec = new staticDhcpRecord; rec->readXml(stream); addStaticRecord(rec); } } } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void staticDhcpRecord::write(QDataStream &stream) const { stream << chaddr << yiaddr << mask << gateway << time; } void staticDhcpRecord::writeXml(sceneXmlWriter &stream) const { stream.writeTextElement( "mac", chaddr.toString() ); stream.writeTextElement( "ip", yiaddr.toString() ); stream.writeTextElement( "mask" , mask.toString() ); stream.writeTextElement( "gateway", gateway.toString() ); stream.writeTextElement( "time", QString::number(time) ); } void staticDhcpRecord::read(QDataStream &stream) { stream >> chaddr >> yiaddr >> mask >> gateway >> time; } void staticDhcpRecord::readXml(sceneXmlReader &stream) { Q_ASSERT( stream.isStartElement() && stream.name() == "staticrecord" ); while ( !stream.atEnd() ) { stream.readNext(); if ( stream.isEndElement() ) break; if ( stream.name() == "mac" ) chaddr.setMac(stream.readElementText()); if ( stream.name() == "ip" ) yiaddr.setIp(stream.readElementText()); if ( stream.name() == "mask" ) mask.setIp(stream.readElementText()); if ( stream.name() == "gateway" ) gateway.setIp(stream.readElementText()); if ( stream.name() == "time" ) time = stream.readElementText().toInt(); } } netemul-1.0/src/ipaddress.cpp0000644000175000017500000000617311270702635015362 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "ipaddress.h" #include ipAddress::ipAddress() { for ( int i = 0 ; i < 4 ; i++ ) myIp[i] = 0; } ipAddress::ipAddress(const quint8 *cur) { for ( int i = 0; i < 4 ; i++) myIp[i] = cur[i]; } ipAddress::ipAddress(const QString str) { QStringList s = str.split("."); for (int i = 0 ; i < 4 ; i++) myIp[i] = s.at(i).toInt(); } ipAddress::ipAddress(const char *str) { QString t(str); QStringList l = t.split("."); for ( int i = 0 ; i < 4 ; i++ ) myIp[i] = l.at(i).toInt(); } ipAddress::ipAddress(const ipAddress &other) { for ( int i = 0; i < 4 ; i++) myIp[i] = other.myIp[i]; } ipAddress::ipAddress(const quint32 intIp) { myIp[0] = intIp >> 24; myIp[1] = intIp >> 16; myIp[2] = intIp >> 8; myIp[3] = intIp; } QString ipAddress::toString() const { QString temp = QString().setNum(myIp[0]); for ( int i = 1 ; i <= 3 ; i++ ) temp += QChar('.') + QString().setNum(myIp[i]); return temp; } void ipAddress::setIp(const quint8 *cur) { for ( int i = 0; i < 4 ; i++) myIp[i] = cur[i]; } ipAddress& ipAddress::operator=(const ipAddress &other) { for ( int i = 0; i < 4 ; i++) myIp[i] = other.myIp[i]; return (*this); } void ipAddress::setIp(const QString str) { QStringList s = str.split("."); for (int i = 0 ; i < 4 ; i++) myIp[i] = s.at(i).toInt(); } ipAddress ipAddress::operator&(const ipAddress &e1) const { int i; ipAddress e3; for (i=0; i < 4; i++) e3.myIp[i] = this->myIp[i] & e1.myIp[i]; return e3; } ipAddress ipAddress::operator |(const ipAddress &e1) const { int i; ipAddress e3; for (i=0; i < 4; i++) e3.myIp[i] = this->myIp[i] | e1.myIp[i]; return e3; } bool ipAddress::isEmpty() const { int d = 0; for ( int i = 0 ; i < 4 ; i++ ) d += myIp[i]; return !d; } bool ipAddress::isFull() const { for ( int i = 0 ; i < 4 ; i++ ) if ( myIp[i] != 255 ) return false; return true; } ipAddress ipAddress::operator ~() const { ipAddress ip; for ( int i = 0; i < 4 ; i++) ip.myIp[i] = ~myIp[i]; return ip; } netemul-1.0/src/programms/0000755000175000017500000000000011305026151014667 5ustar frostfrostnetemul-1.0/src/programms/ripprogramm.cpp0000644000175000017500000002047711277110431017747 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "ripprogramm.h" #include "smartdevice.h" #include "routemodel.h" #include "udpsocket.h" #ifndef __TESTING__ #include "ripproperty.h" #endif /*! Инициализирует программу стандартными настройками. @param d - устройство на которое устанавливается программа. */ ripProgramm::ripProgramm() { myName = tr("RIP"); mySocket = 520; interval = defaultTtl; timer = qrand()%30; myTriggerUpdate = true; mySplitMode = SPLIT_HORIZONT; } //-------------------------------------------------------------- ripProgramm::~ripProgramm() { clearTemp(); delete receiver; } void ripProgramm::clearTemp() { qDeleteAll(tempList); tempList.clear(); } void ripProgramm::setDevice(smartDevice *s) { if ( s == 0 ) return; device = s; model = device->routeTable(); receiver = new udpSocket(s,mySocket); receiver->setBind("0.0.0.0"); connect( receiver , SIGNAL(readyRead(QByteArray)) , SLOT(execute(QByteArray)) ); } /*! Отсчитывает интервалы, по истечении которых происходит отправка rip-сообщений. */ void ripProgramm::incTime() { if ( !myEnable || !device->isRouter() ) return; timer++; if ( timer >= interval ) { sendUpdate(true); timer = 0; return; } if ( mySplitMode != SPLIT_NONE && timer != 0 && timer%5 == 0 && !tempList.isEmpty() ) sendUpdate(false); } //-------------------------------------------------- /*! Обрабатывает rip-сообщения от соседних маршрутизаторов @param b - Полученное сообщение. */ void ripProgramm::execute(QByteArray data) { if ( !myEnable ) return; ipAddress sender; quint16 size; QDataStream d(data); d >> size; d >> sender; int count = (size-4)/9; for ( int i = 0; i < count ; i++ ) { routeRecord *t = new routeRecord; d >> t->dest >> t->mask >> t->metric; Q_ASSERT( t->metric >= 0 && t->metric <= RIP_INFINITY); t->metric++; t->out = device->findInterfaceIp( sender ); t->gateway = sender; t->time = 0; t->mode = routeModel::ripMode; t->change = routeModel::noChanged; checkTable(t); } } //--------------------------------------------------- /*! Посылает rip-сообщение. @param isAll - если true, рассылается вся таблица при регулярном update, если false то только изменившиеся записи. */ void ripProgramm::sendUpdate(bool isAll) { if ( isAll ) model->update(); foreach ( interface *i , device->interfaces() ) { if ( !i->isConnect() ) continue; QByteArray b; QDataStream d(&b, QIODevice::WriteOnly ); d << quint16(0); d << i->ip(); if ( isAll ) { for ( int j = 0 ; j < model->rowCount() ; j++ ) { routeRecord *t = model->recordAt(j); if ( t->dest.isLoopBack() ) continue; qint8 metric = ( t->time == ttl ) ? RIP_INFINITY : t->metric; if ( ( t->gateway & i->mask() ) == ( i->ip() & i->mask() ) ) { if ( mySplitMode == SPLIT_HORIZONT ) continue; else if ( mySplitMode == SPLIT_WIH_POISON && metric < RIP_INFINITY ) continue; } d << t->dest << t->mask << metric; } } else { foreach ( routeRecord *j , tempList ) { qint8 metric = ( j->time == ttl ) ? RIP_INFINITY : j->metric; if ( ( j->gateway & i->mask() ) == ( i->ip() & i->mask() ) ) { if ( mySplitMode == SPLIT_HORIZONT ) continue; else if ( mySplitMode == SPLIT_WIH_POISON && metric < RIP_INFINITY ) continue; } d << j->dest << j->mask << metric; } } d.device()->seek(0); d << quint16(b.size()-2); ipAddress temp = i->ip() | ~i->mask(); udpSocket sock(device, mySocket); sock.write(temp,mySocket,b); } if (tempList.size()) clearTemp(); model->deleteOldRecord(ttl); } //--------------------------------------------------- /*! Проверяет таблицу на наличие одинаковых записей. @param r - Указатель на новую запись. */ void ripProgramm::checkTable(routeRecord *r) { routeRecord *i = model->recordAt( r->dest ); // Ищем запись с таким же адресом назначения if ( !i && r->metric < 16 ) { // Если её нет, добавляем эту и выходим. model->addToTable(r); return; } if ( !i ) { delete r; return; } if ( r->metric >= 16 && r->mode != routeModel::connectMode ) { model->deleteFromTable(i); // Если метрика >=16 значит этой сети больше нет, удаляем. delete r; return; } if ( i->metric > r->metric || ( i->gateway == r->gateway && i->metric != r->metric ) ) { // Если метрика этой записи меньше прищедшей i->metric = r->metric; i->gateway = r->gateway; i->time = 0; i->out = r->out; return; } if ( i->metric == r->metric ) { // Если равны значит сеть еще жива на том же расстоянии. i->time = 0; return; } delete r; } //--------------------------------------------------- /*! Обработчик программных прерываний от устройства. @param u - номер прерывания. */ bool ripProgramm::interrupt(int u) { if ( !myEnable || mySplitMode == SPLIT_NONE ) return false; routeRecord *t = 0; switch (u) { case smartDevice::addNet : // Если добавляется сеть рассылаем всем новую таблицу. addToTemp( model->changedRecord() ); return true; case smartDevice::delNet : // И когда удаляется тоже. t = model->changedRecord(); t->metric = 16; addToTemp(t); return true; default: break; } return false; } //--------------------------------------------------- void ripProgramm::showProperty() { #ifndef __TESTING__ ripProperty *d = new ripProperty; d->setProgramm(this); d->exec(); #endif } void ripProgramm::addToTemp(routeRecord *r) { routeRecord *t = new routeRecord; *t = *r; tempList << t; } /*! Записывает отличительные черты RIP в поток. @param stream - поток для записи. */ void ripProgramm::write(QDataStream &stream) const { stream << RIP; programmRep::write(stream); stream << mySplitMode << myTriggerUpdate; } //--------------------------------------------------- /*! Считывает отличительные черты RIP из потока. @param stream - поток для чтения. */ void ripProgramm::read(QDataStream &stream) { programmRep::read(stream); stream >> mySplitMode >> myTriggerUpdate; } //--------------------------------------------------- netemul-1.0/src/programms/dhcpclientprogramm.cpp0000644000175000017500000003400411277114036021266 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "dhcpclientprogramm.h" #include "smartdevice.h" #include "udpsocket.h" #include "dhcpclientproperty.h" #include "udppacket.h" dhcpClientProgramm::dhcpClientProgramm() { myName = tr("DHCP client"); myOfferTime = 60; } dhcpClientProgramm::~dhcpClientProgramm() { qDeleteAll(myStates); delete listener; } void dhcpClientProgramm::incTime() { foreach ( interfaceState *i , myStates ) { --i->time; if ( i->time == 0 ) { switch ( i->state ) { case interfaceState::CS_ALL_RIGHT: restartSession(i); break; case interfaceState::CS_WAIT_VARIANT: sendDiscover( i->name ); break; case interfaceState::CS_WAIT_RESPONSE: sendRequest(i->name ); break; } } } } /*! * Переопределяем функцию установки устройства чтобы соединиться со слотом. * @param s - указатель на устройство на которое установлена программа. */ void dhcpClientProgramm::setDevice(smartDevice *s) { if ( s == 0 ) { foreach ( interfaceState *i , myStates ) resetClient(i); return; } programmRep::setDevice(s); listener = new udpSocket(s,CLIENT_SOCKET); listener->setBind("0.0.0.0"); connect( listener , SIGNAL(readyRead(QByteArray)) , SLOT(processData(QByteArray)) ); connect( s , SIGNAL(interfaceDeleted(QString)), SLOT(deleteInterface(QString)) ); foreach ( interfaceState *i , myStates ) { resetClient( i ); } } //------------------------------------------------------ void dhcpClientProgramm::resetClient(interfaceState *session) { device->adapter(session->name)->setIp(ipAddress("0.0.0.0")); device->adapter(session->name)->setMask(ipAddress("0.0.0.0")); device->connectedNet( device->adapter( session->name ) ); device->setGateway("0.0.0.0"); } bool dhcpClientProgramm::isUnderDhcpControl(const QString name) const { foreach ( interfaceState *i , myStates ) if ( i->name == name ) { return true; } return false; } /*! Посылает Request серверу @param name - имя интерфейса */ void dhcpClientProgramm::sendRequest(const QString &name) { interfaceState *t = stateAt(name); if ( !t ) return; if ( REPEAT_COUNT < ++t->count ) { restartSession(t); return; } t->time = myOfferTime; dhcpPacket message; message.setType( dhcpPacket::DHCPREQUEST ); message.setXid( t->xid ); message.setChaddr( device->adapter(t->name)->mac() ); message.setSiaddr( t->serverAddress ); sendDhcpMessage(message,t); } //------------------------------------------------------ /*! * Посылает запрос на получение настроек. * @param name - имя интерфейса. */ void dhcpClientProgramm::sendDiscover(const QString &name) { interfaceState *t = stateAt(name); if ( !t ) return; t->state = interfaceState::CS_WAIT_VARIANT; t->time = myOfferTime; t->count = 0; dhcpPacket message; message.setType( dhcpPacket::DHCPDISCOVER ); message.setXid(t->xid); message.setChaddr( device->adapter(t->name)->mac() ); if ( !t->lastIp.isEmpty() ) message.setYiaddr( t->lastIp ); sendDhcpMessage(message,t); } //-------------------------------------------------------------- void dhcpClientProgramm::sendDecLine(const QString &name) { interfaceState *t = stateAt(name); if ( !t ) return; dhcpPacket message; message.setType( dhcpPacket::DHCPDECLINE ); message.setXid( t->xid ); if ( !t->lastIp.isEmpty() ) message.setYiaddr( t->lastIp ); message.setChaddr( device->adapter( t->name )->mac() ); sendDhcpMessage( message , t ); } /*! Обрабатывает входящие данные. @param data - пришедщие данные. */ void dhcpClientProgramm::processData(QByteArray data) { dhcpPacket packet(data); switch ( packet.type() ) { case dhcpPacket::DHCPOFFER: receiveOffer(packet); break; case dhcpPacket::DHCPACK: receiveAck(packet); break; } } //--------------------------------------------------------------- /*! Начинает заново сессию @param session - указатель на сессию */ void dhcpClientProgramm::restartSession(interfaceState *session) { resetClient(session); sendDiscover( session->name ); } //--------------------------------------------------------------- /*! Обрабатывает входящее предложение настроек. @param packet - пакет с настройками. */ void dhcpClientProgramm::receiveOffer(dhcpPacket packet) { foreach ( interfaceState *i , myStates ) if ( i->xid == packet.xid() && i->state == interfaceState::CS_WAIT_VARIANT ) { i->state = interfaceState::CS_WAIT_RESPONSE; i->serverAddress = packet.siaddr(); sendRequest( i->name ); return; } } //--------------------------------------------------------------- /*! Обрабатывает вхоодящий АСК. @param packet - ack пакет */ void dhcpClientProgramm::receiveAck(dhcpPacket packet) { foreach ( interfaceState *i , myStates ) if ( i->xid == packet.xid() && i->state == interfaceState::CS_WAIT_RESPONSE ) { i->state = interfaceState::CS_ALL_RIGHT; device->adapter(i->name)->setIp( packet.yiaddr() ); device->adapter(i->name)->setMask( packet.mask() ); device->connectedNet(device->adapter(i->name)); device->setGateway( packet.gateway().toString() ); i->time = packet.time(); i->lastIp = packet.yiaddr(); device->adapter(i->name)->sendArpRequest( packet.yiaddr() ); return; } } //--------------------------------------------------------------- /*! Отправляет пакет с нужного интерфейса. @param message - пакет. @param state - поток-отправитель. */ void dhcpClientProgramm::sendDhcpMessage(dhcpPacket message, interfaceState *state) { if (!device->adapter(state->name)->isConnect() ) return; udpPacket udp; udp.setSender(CLIENT_SOCKET); udp.setReceiver(SERVER_SOCKET); udp.pack( message.toData() ); ipPacket packet( device->adapter(state->name)->ip() , ipAddress::full() ); packet.pack( udp.toData() ); packet.setUpProtocol( ipPacket::udp ); device->adapter(state->name)->sendPacket( packet); } //--------------------------------------------------------------- /*! * Показывает диалог программы. */ void dhcpClientProgramm::showProperty() { dhcpClientProperty *d = new dhcpClientProperty; d->setProgramm(this); d->exec(); } //--------------------------------------------------------------- /*! * Ищет указанный сеанс связи для интерфейса. * @param name - имя интерфейса. * @return указатель на сеанс, если такого нет то 0 */ interfaceState* dhcpClientProgramm::stateAt(const QString name) { foreach ( interfaceState *i , myStates ) if ( i->name == name ) return i; return 0; } //-------------------------------------------------------------- QStringList dhcpClientProgramm::interfacesList() const { return device->sockets(); } /*! * Возвращаем иконку подключения, для указанного интерфейса. * @param имя интерефейса * @return иконка соединения */ QIcon dhcpClientProgramm::isConnectSocketIcon(const QString &name) const { return device->isConnectSocketIcon(name); } //----------------------------------------------------------------------- /*! * Вызывается когда у устройства удаляется интерфейс, если мы за * ним следим, то мы прекращаем это делать и удаляем его из списка. */ void dhcpClientProgramm::deleteInterface(const QString name) { interfaceState *t = stateAt(name); if ( !t ) return; myStates.removeOne(t); delete t; } //-------------------------------------------------------------------- /*! * Если интерфейс еще не добавлен под наблюдение, то добавляем его. * @param name - имя интерфейса. * @param b - включить или выключить наблюдение. */ void dhcpClientProgramm::observeInterface(const QString &name, bool b) { if ( !myEnable ) return; interfaceState *temp = stateAt(name); if ( temp ) { if ( b ) return; resetClient( temp ); myStates.removeOne(temp); delete temp; return; } if ( !b ) return; interfaceState *session = new interfaceState; session->name = name; session->xid = qrand()%5000; session->time = 0; connect( device->adapter(session->name) , SIGNAL(equalIpDetected()) , SLOT(onDetectEqualIp()) ); myStates << session; sendDiscover(session->name); } //-------------------------------------------------------------------- void dhcpClientProgramm::onDetectEqualIp() { interface *t = qobject_cast(sender()); interfaceState *client = 0; foreach ( interfaceState *i , myStates ) if ( device->adapter( i->name ) == t ) client = i; if ( !client ) return; sendDecLine(client->name); client->xid = qrand()%5000; client->lastIp.setIp("0.0.0.0"); restartSession( client); } Qt::CheckState dhcpClientProgramm::checkedState(const QString &name) const { foreach ( interfaceState *i , myStates ) if ( i->name == name ) return Qt::Checked; return Qt::Unchecked; } /*! Записывает отличительные черты в поток. @param stream - поток для записи. */ void dhcpClientProgramm::write(QDataStream &stream) const { stream << DHCPClient; programmRep::write(stream); stream << myOfferTime; stream << myStates.size(); foreach ( interfaceState *i , myStates ) i->write(stream); } //--------------------------------------------------- /*! Считывает отличительные черты из потока. @param stream - поток для чтения. */ void dhcpClientProgramm::read(QDataStream &stream) { programmRep::read(stream); stream >> myOfferTime; int n; stream >> n; for ( int i = 0 ; i < n ; i++ ) { interfaceState *temp = new interfaceState; temp->read(stream); temp->state = interfaceState::CS_WAIT_VARIANT; myStates << temp; } } void dhcpClientProgramm::writeXml(sceneXmlWriter &stream) const { const QMetaObject *meta = metaObject(); for ( int i = 1 ; i < meta->propertyCount() ; i++ ) { QMetaProperty temp = meta->property(i); stream.writeTextElement( temp.name() , temp.read(this).toString() ); } foreach ( interfaceState *i , myStates ) { stream.writeStartElement("interface"); i->writeXml(stream); stream.writeEndElement(); } } void dhcpClientProgramm::readXml(sceneXmlReader &stream) { Q_ASSERT( stream.isStartElement() && stream.name() == "programm" ); while ( !stream.atEnd() ) { stream.readNext(); if ( stream.isEndElement() ) break; if ( property( qPrintable(stream.name().toString()) ).isValid() ) { setProperty( qPrintable(stream.name().toString() ) , stream.readElementText() ); } else if ( stream.name() == "interface" ) { interfaceState *temp = new interfaceState; temp->readXml(stream); temp->state = interfaceState::CS_WAIT_VARIANT; myStates << temp; } } } //--------------------------------------------------- //--------------------------------------------------- void interfaceState::write(QDataStream &stream) const { stream << xid << time << serverAddress << lastIp << name; } void interfaceState::writeXml(sceneXmlWriter &stream) const { stream.writeTextElement("xid", QString::number(xid) ); stream.writeTextElement("time", QString::number(time) ); stream.writeTextElement("server", serverAddress.toString() ); stream.writeTextElement("lastip", lastIp.toString() ); stream.writeTextElement("name", name); } void interfaceState::read(QDataStream &stream) { stream >> xid >> time >> serverAddress >> lastIp >> name; } void interfaceState::readXml(sceneXmlReader &stream) { Q_ASSERT( stream.isStartElement() && stream.name() == "interface" ); while ( !stream.atEnd() ) { stream.readNext(); if ( stream.isEndElement() ) break; if ( stream.name() == "xid" ) xid = stream.readElementText().toInt(); else if ( stream.name() == "time" ) time = stream.readElementText().toInt(); else if ( stream.name() == "server" ) serverAddress.setIp( stream.readElementText() ); else if ( stream.name() == "lastip" ) lastIp.setIp( stream.readElementText() ); else if ( stream.name() == "name" ) name = stream.readElementText(); } } netemul-1.0/src/programms/ripprogramm.h0000644000175000017500000000502211303041536017400 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef RIPPROGRAMM_H #define RIPPROGRAMM_H #include "programmrep.h" class smartDevice; class routeModel; class routeRecord; class udpSocket; static const qint8 RIP_INFINITY = 16; /*! Реализует Rip-программу. */ class ripProgramm : public programmRep { Q_OBJECT Q_PROPERTY( bool triggerUpdate READ hasTriggerUpdate WRITE setTriggerUpdate ) Q_PROPERTY( int splitMode READ splitMode WRITE setSplitMode ) public: enum { defaultTtl = 30 , RIP = 0 , ttl = 6 }; enum { SPLIT_NONE , SPLIT_HORIZONT , SPLIT_WIH_POISON }; int id() const { return RIP; } ripProgramm(); ~ripProgramm(); void setDevice(smartDevice *s); bool interrupt(int u); void write(QDataStream &stream) const; void read(QDataStream &stream); void incTime(); int splitMode() const { return mySplitMode; } void setSplitMode(int mode) { mySplitMode = mode; } bool hasTriggerUpdate() const { return myTriggerUpdate; } void setTriggerUpdate(bool has) { myTriggerUpdate = has; } void showProperty(); virtual QString featureName() const { return "R"; } private slots: void execute(QByteArray data); private: void checkTable( routeRecord *r ); void sendUpdate(bool isAll); int mySplitMode; bool myTriggerUpdate; quint16 mySocket; udpSocket *receiver; void addToTemp(routeRecord *r); void clearTemp(); QList tempList; int timer; int interval; routeModel *model; }; //---------------------------------------------- #endif // RIPPROGRAMM_H netemul-1.0/src/programms/programm.cpp0000644000175000017500000000367611276204703017243 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "programm.h" #include "ripprogramm.h" #include "dhcpserverprogramm.h" #include "dhcpclientprogramm.h" static const int MAGIC_PROGRAMM_NUMBER = 50; programm::programm(int n) { createImpl(n); } programm::programm(QDataStream &stream) { int n; stream >> n; createImpl(n); rep->read(stream); } void programm::createImpl(int n) { switch (n%MAGIC_PROGRAMM_NUMBER) { case RIP: rep = new ripProgramm; break; case DHCPClient : rep = new dhcpClientProgramm; break; case DHCPServer : rep = new dhcpServerProgramm; break; default: break; } rep->countRef = 1; } programm::programm(const programm &other) { rep = other.rep; rep->countRef++; } programm::~programm() { if ( --rep->countRef <= 0 ) delete rep; } programm& programm::operator=(const programm &other) { other.rep->countRef++; if ( --rep->countRef <= 0 ) delete rep; rep = other.rep; return *this; } netemul-1.0/src/programms/dhcpserverprogramm.cpp0000644000175000017500000002504311277100130021307 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "dhcpserverprogramm.h" #include "dhcpserverproperty.h" #include "dhcppacket.h" #include "smartdevice.h" #include "udpsocket.h" #include "udppacket.h" #include "dhcpservermodel.h" #include dhcpServerProgramm::dhcpServerProgramm() { myName = tr("DHCP server"); myDhcpModel = new dhcpServerModel; myDynamic = false; myTime = 300; myWaitingTime = 60; } dhcpServerProgramm::~dhcpServerProgramm() { delete myDhcpModel; delete receiver; clients.clear(); } void dhcpServerProgramm::setDevice(smartDevice *s) { if ( s == 0 ) return; programmRep::setDevice(s); receiver = new udpSocket(device, SERVER_SOCKET); foreach ( interface *i, device->interfaces() ) { if ( i->isConnect() ) myInterface = i->name(); break; } receiver->setBind("0.0.0.0"); connect( receiver , SIGNAL(readyRead(QByteArray)), SLOT(execute(QByteArray))); connect( device, SIGNAL(interfaceConnected(QString)), SLOT(checkInterface(QString)) ); } void dhcpServerProgramm::setInterfaceName(QString inter) { myInterface = inter; } void dhcpServerProgramm::checkInterface(QString port) { if ( myInterface.isEmpty() ) setInterfaceName(port); } void dhcpServerProgramm::execute(QByteArray data) { if ( device->adapter(myInterface)->ip().isEmpty() ) { QMessageBox::warning(0,tr("Warning"),tr("Your DHCP server isn't configured."), QMessageBox::Ok, QMessageBox::Ok); return; } dhcpPacket packet(data); switch ( packet.type() ) { case dhcpPacket::DHCPDISCOVER : executeDiscover(packet); break; case dhcpPacket::DHCPREQUEST : executeRequest(packet); break; case dhcpPacket::DHCPDECLINE : executeDecline(packet); break; } } void dhcpServerProgramm::executeDiscover(dhcpPacket packet) { clientState *client = findClient( packet.xid() ); if ( client && client->state == clientState::IN_USE ) return; client = chooseStatic(packet); if ( client ) { makeAnswer(client, dhcpPacket::DHCPOFFER); return; } if ( !myDynamic ) return; client = chooseDynamic(packet); if ( client ) makeAnswer(client,dhcpPacket::DHCPOFFER); } void dhcpServerProgramm::executeRequest(dhcpPacket packet) { clientState *client = findClient( packet.xid() ); if ( !client ) return; if ( packet.siaddr() != device->adapter(myInterface)->ip() ) { clients.removeOne(client); delete client; return; } makeAnswer( client, dhcpPacket::DHCPACK ); } void dhcpServerProgramm::executeDecline(dhcpPacket packet) { clientState *client = findClient(packet.yiaddr()); if ( !client ) return; client->state = clientState::DECLINE; } clientState* dhcpServerProgramm::chooseStatic(dhcpPacket packet) { staticDhcpRecord *rec = myDhcpModel->recordWithMac(packet.chaddr()); if ( !rec ) return 0; clientState *client = new clientState(rec); if ( findClient(client->ip) ) return 0; client->requestTimer = 0; client->xid = packet.xid(); clients << client; return client; } /*! Выбираем адрес из динамического диапазона. @return указатель на созданную запись. */ clientState* dhcpServerProgramm::chooseDynamic(dhcpPacket packet) { clientState *cl = new clientState; cl->requestTimer = 0; clientState *c = findClient(packet.yiaddr()); if ( !packet.yiaddr().isEmpty() && !c ) cl->ip = packet.yiaddr(); else cl->ip = giveDynamicIp(); if ( cl->ip.isEmpty() ) return NULL; cl->mac = packet.chaddr(); cl->xid = packet.xid(); cl->time = myTime; cl->mask = myMask; cl->gateway = myGateway; clients << cl; return cl; } /*! Создаем dhcp пакет. @param client - запись клиента на основе которой будем создавать пакет. @param state - тип отправляемого сообщения. @return созданный пакет. */ dhcpPacket dhcpServerProgramm::createDhcpPacket( clientState *client, int state ) const { if ( state == dhcpPacket::DHCPOFFER ) client->state = clientState::WAIT_REQUEST; else client->state = clientState::IN_USE; dhcpPacket p; p.setType( state ); p.setXid( client->xid ); p.setChaddr( client->mac ); p.setYiaddr( client->ip ); p.setMask( client->mask ); p.setGateway( client->gateway ); p.setSiaddr( device->adapter(myInterface)->ip() ); p.setTime( client->time ); return p; } //------------------------------------------------------------ void dhcpServerProgramm::sendDhcp(dhcpPacket packet) const { udpPacket udp; udp.setSender( SERVER_SOCKET ); udp.setReceiver( CLIENT_SOCKET ); udp.pack( packet.toData() ); ipPacket p( device->adapter(myInterface)->ip(), ipAddress::full() ); p.pack( udp.toData() ); p.setUpProtocol( ipPacket::udp ); device->adapter(myInterface)->sendPacket(p); } void dhcpServerProgramm::makeAnswer(clientState *client, int type) { dhcpPacket dhcp = createDhcpPacket(client,type); sendDhcp(dhcp); } /*! Ищет в списке клиента с данным идентификатрором и проверкой состояния записи. @param xid - идентификатрор. @return указатель на запись из списка, если xid совпали, или 0 в противном случае. */ clientState* dhcpServerProgramm::findClient(int xid) const { foreach ( clientState *i, clients ) if ( i->xid == xid && i->state != clientState::DECLINE ) return i; return 0; } //------------------------------------------------------------ /*! Ищет в списке клиента с данным ip-адресом. @param ip - адрес. @return указатель на запись из списка, если ip совпали, или 0 в противном случае. */ clientState* dhcpServerProgramm::findClient(ipAddress ip) const { foreach ( clientState *i, clients ) if ( i->ip == ip ) return i; return 0; } //-------------------------------------------------------------- /*! Выбирает ip-адрес из динамического диапазона @return выбранный адрес, или "0.0.0.0", если нет свободных адресов. */ ipAddress dhcpServerProgramm::giveDynamicIp() const { bool isContains = false; quint32 i = myBeginIp.toInt(); while ( i <= myEndIp.toInt() ) { isContains = myDhcpModel->containRecord( ipAddress(i) ) || findClient(ipAddress(i)) || device->adapter(myInterface)->ip().toInt() == i; if ( isContains ) { i++; isContains = false; } else { return ipAddress(i); } } return ipAddress("0.0.0.0"); } //------------------------------------------------------------- void dhcpServerProgramm::incTime() { bool canDelete = false; foreach ( clientState *i, clients ) { if ( i->state == clientState::WAIT_REQUEST ) { if ( ++i->requestTimer == myWaitingTime ) canDelete = true; } else if ( i->state == clientState::IN_USE && --i->time == 0 ) canDelete = true; if ( canDelete ) { canDelete = false; clients.removeOne(i); delete i; } } } void dhcpServerProgramm::showProperty() { dhcpServerProperty *d = new dhcpServerProperty(device); d->setProgramm(this); d->exec(); } /*! Записывает отличительные черты в поток. @param stream - поток для записи. */ void dhcpServerProgramm::write(QDataStream &stream) const { stream << DHCPServer; programmRep::write(stream); myDhcpModel->write(stream); stream << myInterface; stream << myBeginIp; stream << myEndIp; stream << myMask; stream << myGateway; stream << myTime; stream << myDynamic; stream << myWaitingTime; } //--------------------------------------------------- void dhcpServerProgramm::writeXml(sceneXmlWriter &stream) const { const QMetaObject *meta = metaObject(); for ( int i = 1; i < meta->propertyCount(); i++ ){ QMetaProperty temp = meta->property(i); stream.writeTextElement( temp.name(), temp.read(this).toString() ); } stream.writeStartElement("statictable"); myDhcpModel->writeXml(stream); stream.writeEndElement(); } /*! Считывает отличительные черты из потока. @param stream - поток для чтения. */ void dhcpServerProgramm::read(QDataStream &stream) { programmRep::read(stream); myDhcpModel->read(stream); stream >> myInterface; stream >> myBeginIp; stream >> myEndIp; stream >> myMask; stream >> myGateway; stream >> myTime; stream >> myDynamic; stream >> myWaitingTime; } //--------------------------------------------------- void dhcpServerProgramm::readXml(sceneXmlReader &stream) { Q_ASSERT( stream.isStartElement() && stream.name() == "programm" ); while ( !stream.atEnd() ) { stream.readNext(); if ( stream.isEndElement() ) break; if ( property( stream.name().toString().toLocal8Bit() ).isValid() ) setProperty( stream.name().toString().toLocal8Bit() , stream.readElementText() ); if ( stream.name() == "statictable" ) myDhcpModel->readXml(stream); } } //--------------------------------------------------- clientState::clientState(staticDhcpRecord *rec) { ip = rec->yiaddr; mac = rec->chaddr; mask = rec->mask; gateway = rec->gateway; time = rec->time; } netemul-1.0/src/programms/programm.h0000644000175000017500000000372011276204703016676 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef PROGRAMM_H #define PROGRAMM_H #include #include "programmrep.h" class programm { public: enum { RIP = 0 , DHCPClient = 1 , DHCPServer = 2 }; programm() { qFatal("Error programm constructor!"); } programm(int n); programm(QDataStream &stream); programm(const programm &other); ~programm(); programm& operator=(const programm &other); bool operator==(const programm &other) { return rep == other.rep; } programmRep* operator->() const { return rep; } programmRep* impl() { return rep; } private: void createImpl(int n); programmRep *rep; protected: friend QDataStream& operator<<(QDataStream &stream,const programm &p); }; /*! Записывает программу в поток. */ inline QDataStream& operator<<(QDataStream &stream,const programm &p) { p.rep->write(stream); return stream; } //-------------------------------------------------------------------- #endif // PROGRAMM_H netemul-1.0/src/programms/programms.pri0000644000175000017500000000057611244521167017433 0ustar frostfrostHEADERS += src/programms/programm.h \ src/programms/ripprogramm.h \ src/programms/programmrep.h \ src/programms/dhcpserverprogramm.h \ src/programms/dhcpclientprogramm.h SOURCES += src/programms/programm.cpp \ src/programms/ripprogramm.cpp \ src/programms/programmrep.cpp \ src/programms/dhcpserverprogramm.cpp \ src/programms/dhcpclientprogramm.cpp netemul-1.0/src/programms/programmrep.h0000644000175000017500000000413611303041536017401 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef PROGRAMMREP_H #define PROGRAMMREP_H #include #include "scenexmlwriter.h" #include "scenexmlreader.h" class device; class smartDevice; class programmRep : public QObject { Q_OBJECT Q_PROPERTY( bool enable READ isEnable WRITE setEnable ) public: friend class programm; programmRep(); virtual ~programmRep(); void setEnable(bool b) { if ( b != myEnable ) myEnable = b; } bool isEnable() const { return myEnable; } QString name() const { return myName; } virtual void setDevice(smartDevice *s) { device = s; } virtual bool interrupt(int u) = 0; virtual void showProperty() = 0; virtual QString featureName() const = 0; virtual void incTime() { } virtual void write(QDataStream &stream) const; virtual void read(QDataStream &stream); virtual void writeXml(sceneXmlWriter &stream) const; virtual void readXml(sceneXmlReader &stream); virtual int id() const = 0; protected: smartDevice *device; bool myEnable; QString myName; //!< Имя программы. private: quint8 countRef; }; #endif // PROGRAMMREP_H netemul-1.0/src/programms/dhcpserverprogramm.h0000644000175000017500000001123111303041536020752 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef DHCPSERVERPROGRAMM_H #define DHCPSERVERPROGRAMM_H #include "programmrep.h" #include "ipaddress.h" #include "macaddress.h" class udpSocket; class dhcpPacket; class interface; class staticDhcpRecord; class dhcpServerModel; struct clientState { int xid; int state; macAddress mac; ipAddress ip; ipAddress mask; ipAddress gateway; int time; int requestTimer; enum { WAIT_REQUEST = 0, IN_USE = 1, DECLINE = 2 }; clientState(staticDhcpRecord *rec); clientState() { } }; class dhcpServerProgramm : public programmRep { Q_OBJECT Q_PROPERTY( QString interfaceName READ interfaceName WRITE setInterfaceName ) Q_PROPERTY( QString beginIp READ beginIp WRITE setBeginIp ) Q_PROPERTY( QString endIp READ endIp WRITE setEndIp ) Q_PROPERTY( QString mask READ mask WRITE setMask ) Q_PROPERTY( QString gateway READ gateway WRITE setGateway ) Q_PROPERTY( int time READ time WRITE setTime ) Q_PROPERTY( int waitingTime READ waitingTime WRITE setWaitingTime ) Q_PROPERTY( bool dynamic READ dynamic WRITE setDynamic ) public: enum { DHCPServer = 2 , CLIENT_SOCKET = 67 , SERVER_SOCKET = 68 }; dhcpServerProgramm(); ~dhcpServerProgramm(); // Атрибуты public: int id() const { return DHCPServer; } void setDevice(smartDevice *s); void setInterfaceName( QString inter ); void setBeginIp(QString ip) { myBeginIp.setIp(ip); } void setEndIp(QString ip) { myEndIp.setIp(ip); } void setMask(QString m) { myMask.setIp(m); } void setGateway(QString g) { myGateway.setIp(g); } void setTime(int t) { myTime = t; } void setWaitingTime(int t) { myWaitingTime = t; } void setDynamic(bool b) { myDynamic = b; } QString interfaceName() const { return myInterface; } QString beginIp() const { return myBeginIp.toString(); } QString endIp() const { return myEndIp.toString(); } QString mask() const { return myMask.toString(); } QString gateway() const { return myGateway.toString(); } int time() const { return myTime; } int waitingTime() const { return myWaitingTime; } bool dynamic() const { return myDynamic; } dhcpServerModel* dhcpModel() { return myDhcpModel; } virtual QString featureName() const { return "DS"; } public: void showProperty(); ipAddress giveDynamicIp() const; void incTime(); bool interrupt(int) { return false; } void write(QDataStream &stream) const; void read(QDataStream &stream); void writeXml(sceneXmlWriter &stream) const; void readXml(sceneXmlReader &stream); // Слоты public slots: void execute(QByteArray data); void checkInterface(QString port); // Обработка пакетов private: void executeDiscover(dhcpPacket packet); void executeRequest(dhcpPacket packet); void executeDecline(dhcpPacket packet); // Функции создания и отправки ответа private: void makeAnswer(clientState* client, int type); void sendDhcp(dhcpPacket packet) const; dhcpPacket createDhcpPacket( clientState *client, int state ) const; // Функции выбора и нахождения записи клиента private: clientState* chooseStatic(dhcpPacket packet); clientState* chooseDynamic(dhcpPacket packet); clientState* findClient( int xid ) const; clientState* findClient(ipAddress ip) const; // Переменные private: QList clients; QString myInterface; udpSocket *receiver; dhcpServerModel *myDhcpModel; ipAddress myBeginIp; ipAddress myEndIp; ipAddress myMask; ipAddress myGateway; int myTime; int myWaitingTime; bool myDynamic; }; #endif // DHCPSERVERPROGRAMM_H netemul-1.0/src/programms/programmrep.cpp0000644000175000017500000000434311276270637017753 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "programmrep.h" #include #include programmRep::programmRep() { } programmRep::~programmRep() { } /*! Записывает программу в поток. @param stream - поток для записи. */ void programmRep::write(QDataStream &stream) const { stream << myEnable; } //-------------------------------------------- /*! Считывает программу из потока. @param stream - поток для чтения. */ void programmRep::read(QDataStream &stream) { stream >> myEnable; } //------------------------------------------- void programmRep::writeXml(sceneXmlWriter &stream) const { const QMetaObject *meta = metaObject(); for ( int i = 1 ; i < meta->propertyCount() ; i++ ) { QMetaProperty temp = meta->property(i); stream.writeTextElement( temp.name() , temp.read(this).toString() ); } } void programmRep::readXml(sceneXmlReader &stream) { while ( !stream.atEnd() ) { stream.readNext(); if ( stream.isEndElement() ) break; if ( property( qPrintable(stream.name().toString()) ).isValid() ) { setProperty( qPrintable(stream.name().toString() ) , stream.readElementText() ); } } } netemul-1.0/src/programms/dhcpclientprogramm.h0000644000175000017500000000670111303041536020730 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef DHCPCLIENTPROGRAMM_H #define DHCPCLIENTPROGRAMM_H #include #include #include "programmrep.h" #include "dhcppacket.h" static const int MINUTE = 60; static const int REPEAT_COUNT = 3; class interface; class udpSocket; struct interfaceState { enum { CS_NONE , CS_WAIT_VARIANT , CS_WAIT_RESPONSE , CS_ALL_RIGHT }; int state; int xid; int time; qint8 count; ipAddress serverAddress; ipAddress lastIp; QString name; void write(QDataStream &stream) const; void read(QDataStream &stream); void writeXml(sceneXmlWriter &stream) const; void readXml(sceneXmlReader &stream); }; typedef QList sessionList; class dhcpClientProgramm : public programmRep { Q_OBJECT Q_PROPERTY( int offerTime READ offerTime WRITE setOfferTime ) public: enum { DHCPClient = 1 ,CLIENT_SOCKET = 67, SERVER_SOCKET = 68 }; dhcpClientProgramm(); ~dhcpClientProgramm(); int id() const { return DHCPClient; } bool interrupt(int) { return false; } void setDevice(smartDevice *s); void showProperty(); void incTime(); bool isUnderDhcpControl(const QString name) const; void write(QDataStream &stream) const; void writeXml(sceneXmlWriter &stream) const; void readXml(sceneXmlReader &stream); void read(QDataStream &stream); void observeInterface(const QString &name, bool b); QStringList interfacesList() const; QIcon isConnectSocketIcon(const QString &name) const; Qt::CheckState checkedState(const QString &name) const; virtual QString featureName() const { return "DC"; } public slots: void deleteInterface(const QString name); private slots: void processData(QByteArray data); void onDetectEqualIp(); //Property public: void setOfferTime(int time) { myOfferTime = time; } int offerTime() const { return myOfferTime; } private: int myOfferTime; public: sessionList states() { return myStates; } private: sessionList myStates; private: void sendDhcpMessage(dhcpPacket message, interfaceState *state); void sendRequest(const QString &name); void sendDiscover(const QString &name); void sendDecLine(const QString &name); void receiveOffer(dhcpPacket packet); void receiveAck(dhcpPacket packet); void restartSession( interfaceState *session); interfaceState* stateAt(const QString name); void resetClient( interfaceState *session); udpSocket *listener; }; #endif // DHCPCLIENTPROGRAMM_H netemul-1.0/src/mycanvas.h0000644000175000017500000001536111303041536014662 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef MYCANVAS_H #define MYCANVAS_H #include #include #include "textitem.h" class QMenu; class QAction; class cableDev; class connectDialog; class devicePort; class device; class deviceImpl; class abstractState; typedef QList deviceList; typedef QList textItemList; typedef QList cableList; static const int UNDO_LIMIT = 7; /*! Класс в котором содержиться вся логика отображения, именно в нем реализована вся графическая функциональность программы. Наследник от QGraphicsScene, он получил по наследству все самое необходимое, для того что бы мы могли свободно писать логику используя уже хорошо зарекомендовавший себя каркас. */ class myCanvas : public QGraphicsScene { Q_OBJECT Q_PROPERTY(bool open READ isOpen WRITE setOpen) Q_PROPERTY(int animateSpeed READ animateSpeed WRITE setAnimateSpeed) public: // режимы : нет файла , перемещение , вставка провода , вставка устройства enum { noFile = -1 , move = 0 , cable = 1 , insert = 2 , send = 6 , text = 8}; enum { width = 2000 , height = 2000 }; // типы устройств : Нет устройства , компьютер , концентратор , коммутатор enum { noDev = 0 , busDev = 2 ,compDev = 3 , hubDev = 4 , switchDev = 5 , routerDev = 7 }; myCanvas(QMenu *context,QObject *parent = 0); // Конструктор ~myCanvas(); device* addDeviceOnScene(QPointF coor, int myType = -1); // Добавить устройство на сцену void hideState(); cableDev* createConnection(device *s,device *e,QString sp,QString ep); textItem* createTextItem(QPointF p, const QString &str = tr("Commentary") ); bool isOpen () const { return myOpen; } void setOpen(bool c) { myOpen = c; } void ticTime(); bool isEnd() const; void newFile(); void closeFile(); void turnToMove(); bool isModified() const { return myModified; } int animateSpeed() const; void setAnimateSpeed(int n); device* oneSelectedDevice(); device* deviceInPoint(QPointF p); QPointF calibrate(QPointF c); int devicesCount() const { return myDevices.size(); } int cablesCount() const { return myConnections.size(); } QAction* undoAction(QObject *obj) { return commandStack.createUndoAction(obj); } QAction* redoAction(QObject *obj) { return commandStack.createRedoAction(obj); } void registerDevice(device *dev); void unregisterDevice(device *dev); void registerCable(cableDev *cable); void unregisterCable(cableDev *cable); void registerText(textItem *t); void unregisterText(textItem *t); void putItems(QMap map); void calibrateAll(QList list); bool isDevice(QGraphicsItem *t) const; signals: void uncheck(); //!< Сообщает панели о сбросе текущего устройства void fileOpened(); //!< Сообщает главному окно что открыт новый файл void fileClosed(); //!< Сообщает главному окну о закрытии файла void tictac(); public slots: void emulateTime(); void editorLostFocus(textItem *t); void setMode(int modScene,int curDev); void setShowGrid(bool b); void setShowLabels(bool b); void removeDevice(); void newScene(); void closeScene(); void play(); void stop() { killTimer(myTimer); myTimer = 0; } // Выключаем таймер bool isPlayed() const { return myTimer; } void saveScene(QString fileName); void openScene(QString fileName); void saveSceneXml(QString fileName); void openSceneXml(QString fileName); deviceImpl* addComputer(int x,int y); deviceImpl* addSwitch(int x,int y); deviceImpl* addHub(int x,int y); deviceImpl* addRouter(int x,int y); textItem* addNote(int x, int y); QObjectList computerList(); void addConnection(deviceImpl *s,deviceImpl *e,const QString &sp,const QString &se); protected: void mouseMoveEvent(QGraphicsSceneMouseEvent *event); // События перемещения void mousePressEvent(QGraphicsSceneMouseEvent *event); // нажатия void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); // и отпускания кнопки мыши void timerEvent(QTimerEvent*); private: QUndoStack commandStack; device* deviceWithImpl(deviceImpl *d); bool myOpen; bool myModified; int lastId; abstractState *myState; public: deviceList devices() { return myDevices; } private: deviceList myDevices; //!< Список всех устройств на сцене. public: textItemList textItems() const { return myTextItems; } private: textItemList myTextItems; //!< Список всех надписей на сцене. public: cableList connections() const { return myConnections; } private: cableList myConnections; public: QMenu* itemMenu() { return myItemMenu; } void setItemMenu(QMenu *menu) { myItemMenu = menu; } private: QMenu *myItemMenu; // Меню для устройства int nowType; // Текущее устройство int myTimer; // My dear Friends =) friend class statisticsScene; friend class abstractState; friend class moveState; friend class insertState; friend class cableState; friend class textState; friend class sendState; }; //------------------------------------------------------------------ #endif // MYCANVAS_H netemul-1.0/src/delegats/0000755000175000017500000000000011305026151014450 5ustar frostfrostnetemul-1.0/src/delegats/delegats.pri0000644000175000017500000000025411270341054016760 0ustar frostfrostHEADERS += src/delegats/macaddressdelegate.h \ src/delegats/ipaddressdelegate.h SOURCES += src/delegats/macaddressdelegate.cpp \ src/delegats/ipaddressdelegate.cpp netemul-1.0/src/delegats/macaddressdelegate.h0000644000175000017500000000327211270341054020431 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef MACADDRESSDELEGATE_H #define MACADDRESSDELEGATE_H #include class macAddressDelegate : public QItemDelegate { Q_OBJECT public: macAddressDelegate(QObject *parent = 0); QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem&, const QModelIndex&) const; void setEditorData(QWidget *editor, const QModelIndex &index) const; void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const; void updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option, const QModelIndex&) const; }; #endif // MACADDRESSDELEGATE_H netemul-1.0/src/delegats/ipaddressdelegate.h0000644000175000017500000000325011270341054020275 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef IPADDRESSDELEGATE_H #define IPADDRESSDELEGATE_H #include class ipAddressDelegate : public QItemDelegate { public: ipAddressDelegate(QObject *parent = 0); QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem&, const QModelIndex&) const; void setEditorData(QWidget *editor, const QModelIndex &index) const; void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const; void updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option, const QModelIndex&) const; }; #endif // IPADDRESSDELEGATE_H netemul-1.0/src/delegats/macaddressdelegate.cpp0000644000175000017500000000402111270341054020755 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "macaddressdelegate.h" #include macAddressDelegate::macAddressDelegate(QObject *parent /* = 0 */) : QItemDelegate(parent) { } QWidget* macAddressDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem&, const QModelIndex&) const { QLineEdit *line = new QLineEdit(parent); line->setInputMask("HH:HH:HH:HH:HH:HH;_"); return line; } void macAddressDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { QString data = index.model()->data(index,Qt::EditRole ).toString(); QLineEdit *line = static_cast(editor); line->setText(data); } void macAddressDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,const QModelIndex &index) const { QLineEdit *line = static_cast(editor); QString data = line->text(); model->setData(index,data,Qt::EditRole); } void macAddressDelegate::updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option,const QModelIndex&) const { editor->setGeometry( option.rect ); } netemul-1.0/src/delegats/ipaddressdelegate.cpp0000644000175000017500000000407411270610043020632 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "ipaddressdelegate.h" #include #include ipAddressDelegate::ipAddressDelegate(QObject *parent /* = 0 */) : QItemDelegate(parent) { } QWidget* ipAddressDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem&, const QModelIndex&) const { QLineEdit *line = new QLineEdit(parent); return line; } void ipAddressDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { QString data = index.model()->data(index,Qt::EditRole ).toString(); QLineEdit *line = static_cast(editor); line->setText(data); } void ipAddressDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,const QModelIndex &index) const { QLineEdit *line = static_cast(editor); QString data = line->text(); QStringList list = data.split("."); if ( list.size() != 4 ) return; model->setData(index,data,Qt::EditRole); } void ipAddressDelegate::updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option,const QModelIndex&) const { editor->setGeometry( option.rect ); } netemul-1.0/src/main.cpp0000644000175000017500000000325711273023745014331 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include #include #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); Q_INIT_RESOURCE(netemul); qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); // a.setStyleSheet("QMenuBar { background-color : black ; color : white }" // "QMenuBar::item { background-color : black ; color : white }" // "QMenu { background-color : black ; color : white }" // "QPushBoutton {background-color : black ; color : white }" // "QWidget { background-color : black ; color : white}"); MainWindow w(0, a.arguments() ); w.show(); return a.exec(); } netemul-1.0/src/ipaddress.h0000644000175000017500000000611011275241253015015 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef IPADDRESS_H #define IPADDRESS_H #include class ipAddress { public: ipAddress(); ipAddress(const quint8 *cur); ipAddress(const QString str); ipAddress(const char *str); ipAddress(const ipAddress &other); ipAddress(const quint32 intIp); void setIp(const quint8 *cur); void setIp(const QString str); QString toString() const; bool isEmpty() const; bool isLoopBack() const { return myIp[0] == 127; } bool isFull() const; quint32 toInt() const; quint8 at(int i) const { return myIp[i]; } ipAddress& operator=(const ipAddress &other); ipAddress operator&(const ipAddress &e1) const; ipAddress operator~() const; ipAddress operator|(const ipAddress &e1) const; static ipAddress full() { return ipAddress("255.255.255.255"); } void writeXml() const { } private: quint8 myIp[4]; protected: friend QDataStream& operator>>(QDataStream &stream, ipAddress &address); friend QDataStream& operator<<(QDataStream &stream, const ipAddress &address); }; inline quint32 ipAddress::toInt() const { return ( (myIp[0] << 24) + (myIp[1] << 16) + (myIp[2] << 8) +myIp[3]); } inline bool operator<(const ipAddress &e1 , const ipAddress &e2) { return e1.toInt() < e2.toInt(); } inline bool operator>(const ipAddress &e1 , const ipAddress &e2) { return e1.toInt() > e2.toInt(); } inline bool operator<=(const ipAddress &e1 , const ipAddress &e2) { return !(e1.toInt() > e2.toInt()); } inline bool operator>=(const ipAddress &e1 , const ipAddress &e2) { return !(e1.toInt() < e2.toInt()); } inline bool operator==(const ipAddress &e1 , const ipAddress &e2) { return e1.toInt() == e2.toInt(); } inline bool operator!=(const ipAddress &e1, const ipAddress &e2) { return !(e1 == e2) ; } inline QDataStream& operator<<(QDataStream &stream, const ipAddress &address) { for (int i = 0 ; i < 4 ; i++ ) stream << address.myIp[i]; return stream; } inline QDataStream& operator>>(QDataStream &stream, ipAddress &address) { for (int i = 0 ; i < 4 ; i++ ) stream >> address.myIp[i]; return stream; } #endif // IPADDRESS_H netemul-1.0/src/chips/0000755000175000017500000000000011305026151013766 5ustar frostfrostnetemul-1.0/src/chips/switchchip.h0000644000175000017500000000446111275012203016310 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef SWITCHCHIP_H #define SWITCHCHIP_H #include "boxchip.h" class switchModel; class virtualNetwork; class switchChip : public boxChip { Q_OBJECT public: switchChip(int c = 4); ~switchChip(); void receiveEvent(frame &fr,devicePort *sender); void dialog(); void secondTimerEvent(); void sendDataSignal(frame &fr, QString port); switchModel* modelAt(virtualNetwork *vlan) const; virtualNetwork* vlanAt(int n) const { return myVlans.at(n); } public slots: void checkPorts(); private: QList myVlans; }; // VLAN class virtualNetwork : public QObject { Q_OBJECT // Инициализация public: virtualNetwork(const QString name,switchChip *chip); ~virtualNetwork(); public: void recieveEvent(frame&fr, devicePort *sender); void secondTimerEvent(); // Работа со списком public: bool containPort(devicePort *port) const; void includeAllPorts(QStringList list); // Атрибуты public: void setName(QString n) { myName = n; } QString name() const { return myName; } switchModel* table() const { return myTable; } QStringList devicePorts() const; private: QList myDevicePorts; QString myName; switchChip *mySwitchChip; switchModel *myTable; }; #endif // SWITCHCHIP_H netemul-1.0/src/chips/chips.pri0000644000175000017500000000046111230647403015617 0ustar frostfrostSOURCES += src/chips/hubchip.cpp \ src/chips/switchchip.cpp \ src/chips/abstractchip.cpp \ src/chips/interface.cpp \ src/chips/boxchip.cpp HEADERS += src/chips/hubchip.h \ src/chips/switchchip.h \ src/chips/abstractchip.h \ src/chips/interface.h \ src/chips/boxchip.h netemul-1.0/src/chips/hubchip.h0000644000175000017500000000247311263441241015573 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef HUBCHIP_H #define HUBCHIP_H #include "boxchip.h" #include class hubChip : public boxChip { Q_OBJECT public: void addSocket(int n); void receiveEvent(frame &fr,devicePort *sender); #ifndef __TESTING__ void detectCollision(); #endif hubChip(int n = 4); }; #endif // HUBCHIP_H netemul-1.0/src/chips/hubchip.cpp0000644000175000017500000000341211263441241016120 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "hubchip.h" #include "deviceport.h" hubChip::hubChip(int n /* = 4 */) : boxChip(n) { foreach ( devicePort *i , mySockets ) i->setShared(true); } void hubChip::receiveEvent(frame &fr,devicePort *sender) { #ifndef __TESTING__ checkReceive(fr); emit receiveData(fr,tr("LAN%1").arg(sender->num())); foreach ( devicePort *i , mySockets ) if ( i != sender && i->isConnect() ) { checkSend(fr); emit sendData(fr, tr("LAN%1").arg(i->num()) ); i->pushToSend( fr ); } #endif } #ifndef __TESTING__ void hubChip::detectCollision() { foreach ( devicePort *i , mySockets ) i->startCollision(); } #endif void hubChip::addSocket(int n) { boxChip::addSocket(n); mySockets[n-1]->setShared(true); } netemul-1.0/src/chips/switchchip.cpp0000644000175000017500000000724111275012203016642 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "switchchip.h" #include "deviceport.h" #include "switchmodel.h" #include #include switchChip::switchChip(int c /* = 4 */ ) : boxChip(c) { virtualNetwork *vlan = new virtualNetwork("VLAN1", this); myVlans << vlan; connect( this, SIGNAL(socketsCountChanged()), SLOT(checkPorts()) ); } switchChip::~switchChip() { myVlans.clear(); } switchModel* switchChip::modelAt(virtualNetwork *vlan) const { return vlan->table(); } void switchChip::receiveEvent(frame &fr,devicePort *sender) { checkReceive(fr); emit receiveData(fr,tr("LAN%1").arg(sender->num())); foreach ( virtualNetwork *i, myVlans ) if ( i->containPort(sender) ) i->recieveEvent(fr, sender); } void switchChip::secondTimerEvent() { foreach ( virtualNetwork *i, myVlans ) i->secondTimerEvent(); } void switchChip::sendDataSignal(frame &fr, QString port) { emit sendData(fr, port); } void switchChip::checkPorts() { if ( myVlans.count() > 1 ) return; myVlans.at(0)->includeAllPorts(sockets()); } /****************************VLAN********************************/ virtualNetwork::virtualNetwork(const QString name,switchChip *chip) { myTable = new switchModel; myName = name; mySwitchChip = chip; includeAllPorts(mySwitchChip->sockets()); } virtualNetwork::~virtualNetwork() { myDevicePorts.clear(); delete myTable; delete mySwitchChip; } void virtualNetwork::recieveEvent(frame &fr, devicePort *sender) { myTable->contains( fr.sender() , sender ); devicePort *t = myTable->portWithMac( fr.receiver() ); if ( t && t->isConnect() ) { mySwitchChip->checkSend(fr); mySwitchChip->sendDataSignal(fr, tr("LAN%1").arg(t->num())); t->pushToSend(fr); return; } foreach ( devicePort *i , myDevicePorts ) if ( i != sender && i->isConnect() ) { mySwitchChip->checkSend(fr); mySwitchChip->sendDataSignal(fr, tr("LAN%1").arg(i->num())); i->pushToSend(fr); } } bool virtualNetwork::containPort(devicePort *port) const { foreach ( devicePort *i, myDevicePorts ) if ( i->num() == port->num() ) return true; return false; } void virtualNetwork::includeAllPorts(QStringList list) { for ( int i = 0; i < list.size(); i++ ) if ( !myDevicePorts.contains(mySwitchChip->socket(list.at(i))) ) myDevicePorts << mySwitchChip->socket(list.at(i)); } QStringList virtualNetwork::devicePorts() const { QStringList list; foreach ( devicePort *i, myDevicePorts ) list << tr("LAN%1").arg(i->num()) ; return list; } void virtualNetwork::secondTimerEvent() { myTable->updateMac(); } netemul-1.0/src/chips/boxchip.h0000644000175000017500000000420311274611651015604 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef BOXCHIP_H #define BOXCHIP_H #include "abstractchip.h" #include class cableDev; class devicePort; class boxChip : public abstractChip { Q_OBJECT public: boxChip(int n = 4); virtual ~boxChip(); QStringList sockets() const; bool setSocketsCount(int n); int socketsCount() const { return mySockets.size(); } bool isConnectSocket(const QString &str) const; void addConnection(const QString &port, cableDev *c); void deleteConnection(cableDev *c); int trafficDigit() const; QString socketName(const cableDev *c) const; virtual void deciSecondTimerEvent(); virtual void secondTimerEvent() { } devicePort* socket(const QString &name); bool isBusy() const; virtual void addSocket(int n); virtual bool isSharedBusy(cableDev*) const { return false; } virtual void detectCollision() { } #ifndef __TESTING__ void setCheckedSocket(const QString &port); virtual void write(QDataStream &stream) const; virtual void read(QDataStream &stream); #endif signals: void socketsCountChanged(); protected: QVector mySockets; }; #endif // BOXCHIP_H netemul-1.0/src/chips/abstractchip.h0000644000175000017500000000634011277114036016621 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef ABSTRACTCHIP_H #define ABSTRACTCHIP_H #include "scenexmlwriter.h" #include "scenexmlreader.h" #include "statistics.h" #include "macaddress.h" #include "ipaddress.h" #include "frame.h" class devicePort; class ipPacket; /*! Класс являеться абстрактным устройством приема и обработки кадров. Являеться предком для interface и boxDevice этот класс уже дает возможность вести статистику входящих кадров и пакетов, поддерживает обработку и передачу кадров на уровень выше. */ class abstractChip : public QObject { Q_OBJECT public: abstractChip(); virtual ~abstractChip() { } virtual void receiveEvent(frame &fr,devicePort *sender) = 0; virtual int trafficDigit() const = 0; QString staticsString() const { return myStatistics.toString(); } void checkReceive(frame &f); void checkSend(frame &f); macAddress mac() const { return myMac; } ipAddress ip() const { return myIp; } ipAddress mask() const { return myMask; } void setMac(const macAddress &m) { myMac = m; } void setIp(const QString &str) { if ( !str.isEmpty() ) myIp.setIp(str); } void setMask(const QString &str) { if ( !str.isEmpty() ) myMask.setIp(str); } void setIp(const ipAddress address) { myIp = address; } void setMask(const ipAddress address) { myMask = address; } virtual void write(QDataStream &stream) const; virtual void read(QDataStream &stream); virtual void writeXml(sceneXmlWriter &stream) const; virtual void readXml(sceneXmlReader &stream); statistics chipStatistics() { return myStatistics; } quint64 countRecFrame() { return myStatistics.receiveFrames(); } quint64 countRecPacket() { return myStatistics.receivePackets(); } quint64 countSendFrame() { return myStatistics.sendFrames(); } quint64 countSendPacket() { return myStatistics.sendPackets(); } void resetStatics(); signals: void sendData(frame,QString); void receiveData(frame,QString); protected: statistics myStatistics; ipAddress myIp; ipAddress myMask; macAddress myMac; }; #endif // ABSTRACTCHIP_H netemul-1.0/src/chips/abstractchip.cpp0000644000175000017500000000547111276013507017160 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "abstractchip.h" /*! Задает устройству случайный Mac-адрес, пустой ip и маску подсети. */ abstractChip::abstractChip() { #ifndef __TESTING__ myMac.setRandom(); resetStatics(); #endif } //-------------------------------------------------------------- /*! Сбрасывает всю статистику, накопленную этим устройством. */ void abstractChip::resetStatics() { myStatistics.clear(); } //------------------------------------------------ void abstractChip::write(QDataStream &stream) const { stream << myMac; stream << myIp; stream << myMask; stream << myStatistics; } void abstractChip::writeXml(sceneXmlWriter &stream) const { stream.writeStartElement("abstractchip"); stream.writeTextElement("mac", myMac.toString() ); stream.writeTextElement("ip", myIp.toString() ); stream.writeTextElement("mask", myMask.toString() ); stream.writeEndElement(); } void abstractChip::read(QDataStream &stream) { stream >> myMac; stream >> myIp; stream >> myMask; stream >> myStatistics; } void abstractChip::readXml(sceneXmlReader &stream) { while ( !stream.atEnd() ) { stream.readNext(); if ( stream.isEndElement() ) break; if ( stream.name() == "mac" ) myMac.setMac( stream.readElementText() ); else if ( stream.name() == "ip" ) myIp.setIp( stream.readElementText() ); else if ( stream.name() == "mask" ) myMask.setIp( stream.readElementText() ); } } void abstractChip::checkReceive(frame &f) { myStatistics.incReceiveFrames(); if ( f.type() == frame::ip ) myStatistics.incReceivePackets(); } void abstractChip::checkSend(frame &f) { myStatistics.incSendFrames(); if ( f.type() == frame::ip ) myStatistics.incSendPackets(); } netemul-1.0/src/chips/boxchip.cpp0000644000175000017500000000726511274611651016152 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "boxchip.h" #include #include "deviceport.h" boxChip::boxChip(int n /* = 4 */) { for ( int i = 0 ; i < n ; i++ ) addSocket(i+1); } boxChip::~boxChip() { qDeleteAll(mySockets); mySockets.clear(); } QStringList boxChip::sockets() const { QStringList t; for ( int i = 0 ; i < mySockets.size() ; i++ ) t << QObject::tr("LAN%1").arg(i+1); return t; } bool boxChip::setSocketsCount(int n) { int i,t = mySockets.size(); if ( t <= n ) { for ( i = t ; i < n ; i++ ) addSocket(i+1); } else { for ( i = n ; i < t ; i++ ) if ( mySockets.at(i)->isConnect() ) return false; for ( i = t-1 ; i >= n ; i-- ) { delete mySockets[i]; mySockets.pop_back(); } } emit socketsCountChanged(); return true; } QString boxChip::socketName(const cableDev *c) const { for ( int i = 0 ; i < mySockets.size() ; i++ ) if ( mySockets.at(i)->isCableConnect(c) ) return QObject::tr("LAN%1").arg(i+1); return QString(); } void boxChip::addConnection(const QString &port , cableDev *c) { QString t = port; t.remove(0,3); mySockets.at( t.toInt() - 1 )->setConnect(true,c); } void boxChip::deleteConnection(cableDev *c) { foreach ( devicePort *i , mySockets ) if ( i->isCableConnect(c) ) { i->setConnect(false,0); return; } } bool boxChip::isConnectSocket(const QString &str) const { return mySockets[ str.mid(3).toInt() - 1 ]->isConnect(); } devicePort* boxChip::socket(const QString &name) { return mySockets[ name.mid(3).toInt()-1 ]; } void boxChip::deciSecondTimerEvent() { #ifndef __TESTING__ foreach ( devicePort *i , mySockets ) { i->queueEvent(); if ( i->hasReceive() ) { frame t = i->popFromReceive(); receiveEvent(t,i); } } #endif } void boxChip::addSocket(int n) { devicePort *t = new devicePort(n); mySockets.push_back(t); } bool boxChip::isBusy() const { foreach ( devicePort *i , mySockets ) if ( i->isBusy() ) return true; return false; } int boxChip::trafficDigit() const { int sum = 0; foreach ( devicePort *i, mySockets ) sum += i->trafficDigit(); return sum; } #ifndef __TESTING__ void boxChip::setCheckedSocket(const QString &port) { foreach ( devicePort *i, mySockets ) i->setChecked( tr("LAN%1").arg(i->num()) == port ); } void boxChip::write(QDataStream &stream) const { abstractChip::write(stream); stream << mySockets.size(); } void boxChip::read(QDataStream &stream) { abstractChip::read(stream); int n; stream >> n; setSocketsCount(n); } #endif netemul-1.0/src/chips/interface.h0000644000175000017500000000543111276013507016112 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef INTERFACE_H #define INTERFACE_H #include "abstractchip.h" #include "ippacket.h" #include "arppacket.h" class cableDev; class arpModel; static const quint8 COUNT_AGAINST_SEND = 5; struct waitPacket { ipAddress dest; int time; quint8 count; QList packets; void insert(ipPacket p) { packets << p; } static waitPacket* create(ipAddress a,ipPacket p); }; class interface : public abstractChip { Q_OBJECT public: interface(const QString &name); interface() { } ~interface(); void receiveEvent(frame &fr,devicePort*); void receiveIp(ipPacket &ip); void receiveArp(arpPacket &arp); void sendPacket(ipPacket &p,ipAddress gw = ipAddress("0.0.0.0")); void sendBroadcast(ipPacket &p); const devicePort* socket() const { return mySocket; } bool isConnect() const; void setConnect(bool b,cableDev *c); bool isCableConnect(const cableDev *c) const; void deciSecondEvent(); void secondEvent(); void sendArpRequest(ipAddress a); void sendArpResponse(macAddress m, ipAddress a); int trafficDigit() const; bool isBusy() const; frame createFrame( macAddress receiverMac , int t); void setChecked(bool b); arpModel* arpTable() const { return myArpTable; } void pushToSocket(frame &f); virtual void write(QDataStream &stream) const; virtual void read(QDataStream &stream); virtual void writeXml(sceneXmlWriter &stream) const; virtual void readXml(sceneXmlReader &stream); void setName(const QString &str) { myName = str; } QString name() const { return myName; } signals: void receivedPacket(ipPacket); void equalIpDetected(); private: QString myName; devicePort *mySocket; arpModel *myArpTable; QList myWaits; }; #endif // INTERFACE_H netemul-1.0/src/chips/interface.cpp0000644000175000017500000001542311276013507016447 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include #include #include "interface.h" #include "deviceport.h" #include "appsetting.h" #include "arpmodel.h" interface::interface(const QString &name) : myName(name) { mySocket = new devicePort; myArpTable = new arpModel; } interface::~interface() { delete mySocket; delete myArpTable; qDeleteAll(myWaits); } void interface::pushToSocket(frame &f) { checkSend(f); emit sendData(f,myName); mySocket->pushToSend(f); } void interface::receiveEvent(frame &fr,devicePort*) { checkReceive(fr); emit receiveData(fr,myName); if ( fr.type() == frame::ip ) { ipPacket p(fr.unpack()); emit receivedPacket(p); } if ( fr.type() == frame::arp ) { arpPacket p(fr.unpack()); receiveArp(p); } } void interface::sendBroadcast(ipPacket &p) { frame f = createFrame( macAddress("FF:FF:FF:FF:FF:FF") , frame::ip ); f.pack( p.toData() ); pushToSocket(f); } void interface::sendPacket(ipPacket &p,ipAddress gw /* = ipAddress("0.0.0.0") */ ) { if ( p.isBroadcast( myMask ) ) { sendBroadcast(p); return; } ipAddress t; if ( gw.isEmpty() ) t = p.receiver(); else t = gw; arpRecord *a = myArpTable->recordAt(t); if ( a ) { frame f = createFrame( a->mac , frame::ip ); a->time = 0; // Стартуем заново время жизни arp записи f.pack( p.toData() ); pushToSocket(f); return; } foreach ( waitPacket *i , myWaits ) if ( i->dest == t ) { i->insert(p); return; } sendArpRequest(t); myWaits << waitPacket::create(t,p); } frame interface::createFrame( macAddress receiverMac, int t) { frame f; f.setSender(myMac); f.setReceiver(receiverMac); f.setType(t); return f; } void interface::receiveArp(arpPacket &arp) { if ( arp.type() == arpPacket::response ) { if ( arp.senderIp() == myIp ) { emit equalIpDetected(); QMessageBox::warning(0, QObject::tr("The network is not working correctly"), QObject::tr("The network found a matching IP address"), QMessageBox::Ok, QMessageBox::Ok); return; } myArpTable->addToTable( arp.senderIp() , arp.senderMac() , arpModel::dinamicMode ); foreach ( waitPacket *i , myWaits ) if ( i->dest == arp.senderIp() ) { foreach ( ipPacket p, i->packets ) sendPacket(p,arp.senderIp()); myWaits.removeOne(i); delete i; break; } } else { arpRecord *t = myArpTable->addToTable(arp.senderIp() , arp.senderMac() , arpModel::dinamicMode ); if ( arp.receiverIp() == myIp ) sendArpResponse(t->mac, t->ip); } } bool interface::isConnect() const { return mySocket->isConnect(); } void interface::setConnect(bool b,cableDev *c) { mySocket->setConnect(b,c); } bool interface::isCableConnect(const cableDev *c) const { return mySocket->isCableConnect(c); } void interface::setChecked(bool b) { mySocket->setChecked(b); } void interface::deciSecondEvent() { mySocket->queueEvent(); if ( mySocket->hasReceive() ) { frame f = mySocket->popFromReceive(); receiveEvent( f, mySocket ); } } void interface::secondEvent() { myArpTable->update(); foreach ( waitPacket *i , myWaits ) { if ( --i->time ) continue; if ( i->count <= COUNT_AGAINST_SEND ) { i->count++; i->time = qrand()%(appSetting::arpResponceTime()*i->count)+appSetting::arpResponceTime(); sendArpRequest( i->dest ); } else { myWaits.removeOne(i); delete i; } } } void interface::sendArpRequest(ipAddress a) { if ( a.isEmpty() ) return; arpPacket p( macAddress() , myMac , a , myIp , arpPacket::request ); macAddress m; m.setBroadcast(); frame f = createFrame(m, frame::arp); f.pack(p.toData()); pushToSocket(f); } void interface::sendArpResponse(macAddress m, ipAddress a) { arpPacket p(m, myMac, a, myIp, arpPacket::response); frame f = createFrame(m, frame::arp); f.pack(p.toData()); pushToSocket(f); } void interface::write(QDataStream &stream) const { abstractChip::write(stream); stream << myName; } void interface::writeXml(sceneXmlWriter &stream) const { abstractChip::writeXml(stream); stream.writeStartElement("interface"); stream.writeTextElement("name",myName); stream.writeEndElement(); } void interface::read(QDataStream &stream) { abstractChip::read(stream); stream >> myName; } void interface::readXml(sceneXmlReader &stream) { Q_ASSERT( stream.isStartElement() && stream.name() == "chipimpl" ); while ( !stream.atEnd() ) { stream.readNext(); if ( stream.isEndElement() ) break; if ( stream.name() == "abstractchip") abstractChip::readXml(stream); else if ( stream.name() == "interface" ) { while ( !stream.atEnd() ) { stream.readNext(); if ( stream.isEndElement() ) break; if ( stream.name() == "name" ) myName = stream.readElementText(); } } } } bool interface::isBusy() const { return mySocket->isBusy(); } int interface::trafficDigit() const { int sum = 0; foreach ( waitPacket *i , myWaits ) sum += i->packets.size(); return mySocket->trafficDigit() + sum; } //------------------------------------------------------- //------------------------------------------------------- waitPacket* waitPacket::create(ipAddress a,ipPacket p) { waitPacket *t = new waitPacket; t->dest = a; t->packets << p; t->time = appSetting::arpResponceTime(); t->count = 0; return t; } netemul-1.0/src/mainwindow.cpp0000644000175000017500000006657611303325155015570 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "mainwindow.h" #include "scenecontrol.h" #include "settingdialog.h" #include "testdialog.h" #include "mycanvas.h" #include "appsetting.h" #include "staticsdialog.h" #include "statisticsscene.h" #include "logdialog.h" #include "aboutwindow.h" #ifndef QT_NO_OPENGL #include #endif #define UPDATEACTION(A,TEXT,TIP) A->setText(TEXT); A->setToolTip(TIP); A->setStatusTip(TIP); #define FILES_CURRENT_TYPES FILES_TYPES_NO #define FILES_TYPES_XML "XML files(*.xml);;Networks(*.net)" #define FILES_TYPES_NET "Networks(*.net);;XML files(*.xml)" #define FILES_TYPES_NO "Networks(*.net)" // Конструктор главной формы MainWindow::MainWindow(QWidget *parent, QStringList param) : QMainWindow(parent) { QCoreApplication::setApplicationVersion("0.9.6"); createAction(); // Создаем события createTools(); // createMenu(); // Создаем меню createScene(); // Создаем сцену setEnabledFileItems( myFile.length() ); view = new QGraphicsView(canva,this); view->setFocus(); // Даем ему фокус view->setRenderHint(QPainter::Antialiasing); // Включаем сглаживание view->setOptimizationFlags( QGraphicsView::DontClipPainter | QGraphicsView::DontSavePainterState ); view->setViewportUpdateMode( QGraphicsView::BoundingRectViewportUpdate ); //view->setViewportUpdateMode( QGraphicsView::SmartViewportUpdate ); view->installEventFilter(this); statusBar()->showMessage(""); // Активизируем статус бар timeLabel = new QLabel; statusBar()->addPermanentWidget(timeLabel); readSetting(); setCentralWidget(view); retranslate(); setOpenglMode( appSetting::hasOpengl() ); cableLabelAct->setChecked( appSetting::isShowLabel() ); canva->setShowLabels( appSetting::isShowLabel() ); autosaveTimer = new QTimer(this); autosaveTimer->start( appSetting::autosaveInterval() * 60000 ); connect( autosaveTimer , SIGNAL(timeout()) , SLOT(autosave()) ); printer = 0; printerPainter = 0; if ( param.size() > 1 ) { if ( QFile::exists( param.at(1) ) == false ) exit(0); openFile( param.at(1) ); } } MainWindow::~MainWindow() { if ( printer ) { delete printer; } } //Событие закрытия void MainWindow::closeEvent(QCloseEvent *event) { // При попытке закрыть главное окно выводим запрос на подтверждение if ( !canva->isModified() ) { writeSetting(); event->accept(); return; } int res = saveFileDialog(); if (res != QMessageBox::Cancel ) { if ( res == QMessageBox::Save ) if ( !saveFile() ) { event->ignore(); return; } writeSetting(); event->accept(); return; } else event->ignore(); } int MainWindow::saveFileDialog() { return QMessageBox::question(this, tr("File was modified") , tr("File was modified, do you want to save changes?"), QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel , QMessageBox::Save ); } // Создать один Action QAction* MainWindow::createOneAction(QIcon icon/*= QIcon()*/,bool inGroup /*=false*/) { QAction *temp = new QAction(this); temp->setIcon(icon); if (inGroup) { groupAct->addAction(temp); temp->setCheckable(true); } return temp; } void MainWindow::retranslate() { UPDATEACTION(newAct , tr("New"),tr("Create new network") ) UPDATEACTION( openAct , tr("Open..."),tr("Open existing file") ) UPDATEACTION( saveAct , tr("Save"),tr("Save network") ) UPDATEACTION( saveAsAct , tr("Save as..."),tr("Save network as...") ) UPDATEACTION( closeAct , tr("Close"),tr("Close current file") ) UPDATEACTION( exitAct , tr("Exit"),tr("Exit") ) UPDATEACTION( showGridAct , tr("Show grid"),tr("Show grid") ) UPDATEACTION( arpAct , tr("Arp table"), tr("Arp table") ); UPDATEACTION( deleteAct , tr("Delete"),tr("Deleting object") ) UPDATEACTION( progAct , tr("Programs"), tr("Programs installed on device") ) UPDATEACTION( settingAct , tr("Settings...") , tr("Settings") ) UPDATEACTION( playAct , tr("Stop") , tr("Stop simulation") ) UPDATEACTION( staticsAct , tr("Statistics ") , tr("Show scene statistics ") ) UPDATEACTION( moveAct , tr("Move"),tr("Move objects") ) UPDATEACTION( adapterAct , tr("Netcards") , tr("Edit netcards") ) UPDATEACTION( cableAct , tr("Cable"),tr("Create connection") ) UPDATEACTION( textAct , tr("Note") , tr("Insert text comment") ) UPDATEACTION( helpAct , tr("NetEmul Help") , tr("Full help system program") ) UPDATEACTION( shareBusAct , tr("Unibus"),tr("Add unibus") ) UPDATEACTION( computerAct , tr("Computer"),tr("Add computer") ) UPDATEACTION( aboutAct , tr("About NetEmul") ,tr("About NetEmul") ) UPDATEACTION( hubAct , tr("Hub"),tr("Add hub") ) UPDATEACTION( switchAct , tr("Switch"),tr("Add switch") ) UPDATEACTION( routerAct , tr("Router") , tr("Add router") ) UPDATEACTION( sendAct , tr("Send"),tr("Send data") ) UPDATEACTION( testAct , tr("Execute scripts") , tr("Run existing scripts") ) UPDATEACTION( aboutQtAct , tr("About Qt") , tr("About Qt") ) UPDATEACTION( propertyAct , tr("Properties") , tr("Show properties") ) UPDATEACTION( logAct , tr("Show log") , tr("Show device log file") ) UPDATEACTION( aboutDeviceAct , tr("About device") , tr("Information about device") ) UPDATEACTION( designerPacketAct , tr("Packet designer...") , tr("Create user's packet") ) UPDATEACTION( printAct , tr("Print...") , tr("Print user's network") ) UPDATEACTION( printPreviewAct , tr("Preview...") , tr("Preview network berfore printing") ); UPDATEACTION( virtualNetworkAct , tr("Configure VLAN...") , tr("Configure VLAN") ); UPDATEACTION( noteAct , tr("Set description...") , tr("Set description of device") ); UPDATEACTION( cableLabelAct , tr("Show labels") , tr("Show labels on cables") ); fileMenu->setTitle(tr("File")); editMenu->setTitle(tr("Edit")); viewMenu->setTitle(tr("View")); itemMenu->setTitle(tr("Object")); settingMenu->setTitle(tr("Service")); testMenu->setTitle(tr("Scripts")); helpMenu->setTitle(tr("Help")); deviceBar->setWindowTitle(tr("Devices")); controlBar->setWindowTitle(tr("Controls")); } //Создаем элементы меню void MainWindow::createAction() { groupAct = new QActionGroup(this); groupAct->setExclusive(true); connect( groupAct , SIGNAL(triggered(QAction*)) , SLOT(groupClicked(QAction*))); newAct = createOneAction(); newAct->setShortcut(QKeySequence::New); // Устанавливаем горячие клавиши connect( newAct, SIGNAL(triggered()) , SLOT(newFile())); openAct = createOneAction( QIcon(":/im/images/fileload.png") ); openAct->setShortcut(QKeySequence::Open); connect( openAct , SIGNAL(triggered()) , SLOT(openFile())); saveAct = createOneAction( QIcon(":/im/images/filesave.png") ); saveAct->setShortcut(QKeySequence::Save); connect( saveAct , SIGNAL(triggered()) , SLOT(saveFile()) ); saveAsAct = createOneAction(); #if QT_VERSION >= 0x040500 saveAsAct->setShortcut(QKeySequence::SaveAs); #endif connect( saveAsAct , SIGNAL(triggered()) , SLOT(saveAsFile()) ); closeAct = createOneAction(); closeAct->setShortcut(QKeySequence::Close); connect( closeAct , SIGNAL(triggered()) , SLOT(closeFile())); exitAct = createOneAction(); exitAct->setShortcut(tr("Ctrl+X")); connect( exitAct , SIGNAL(triggered()) , SLOT(close()) ); showGridAct = createOneAction(); showGridAct->setCheckable(true); showGridAct->setChecked(true); deleteAct = createOneAction(QIcon(":/im/images/not.png")); deleteAct->setShortcut(tr("Ctrl+D")); settingAct = createOneAction(); settingAct->setShortcut( tr("Ctrl+Alt+S")); connect( settingAct , SIGNAL(triggered()) , SLOT(setting())); staticsAct = createOneAction(); connect( staticsAct , SIGNAL(triggered()) , SLOT(statistics()) ); moveAct = createOneAction(QIcon(":/im/images/arrow.png"),true); moveAct->setData( myCanvas::move*10 + myCanvas::noDev ); moveAct->setChecked(true); moveAct->setShortcut(tr("Ctrl+1")); cableAct = createOneAction(QIcon(":/im/images/cable.png"),true); cableAct->setData( myCanvas::cable*10 + myCanvas::noDev ); cableAct->setShortcut(tr("Ctrl+2")); textAct = createOneAction(QIcon(":/im/images/note.png"), true); textAct->setData( myCanvas::text*10 + myCanvas::noDev ); textAct->setShortcut(tr("Ctrl+3")); shareBusAct = createOneAction(QIcon(":/im/images/sharebus.png"),true); shareBusAct->setData( myCanvas::insert*10 + myCanvas::busDev); computerAct = createOneAction(QIcon(":/im/images/computer.png"),true); computerAct->setData( myCanvas::insert*10 + myCanvas::compDev); computerAct->setShortcut(tr("Ctrl+4")); hubAct = createOneAction(QIcon(":/im/images/hub.png"),true); hubAct->setData( myCanvas::insert*10 + myCanvas::hubDev ); hubAct->setShortcut(tr("Ctrl+5")); switchAct = createOneAction(QIcon(":/im/images/switch.png"),true); switchAct->setData( myCanvas::insert*10 + myCanvas::switchDev ); switchAct->setShortcut(tr("Ctrl+6")); routerAct = createOneAction(QIcon(":/im/images/router.png") , true); routerAct->setData( myCanvas::insert*10 + myCanvas::routerDev ); routerAct->setShortcut(tr("Ctrl+7")); sendAct = createOneAction(QIcon(":/im/images/left_right.png"),true); sendAct->setData( myCanvas::send* 10 + myCanvas::noDev); sendAct->setShortcut(tr("Ctrl+8")); testAct = createOneAction(); connect( testAct , SIGNAL(triggered()) , SLOT(test())); propertyAct = createOneAction(QIcon(":/im/images/properties.png") ); propertyAct->setShortcut(tr("Ctrl+Alt+P")); tableAct = createOneAction(QIcon(":/im/images/table_route.png")); tableAct->setShortcut( tr("Ctrl+T")); aboutQtAct = createOneAction(); connect( aboutQtAct , SIGNAL(triggered()) , qApp ,SLOT(aboutQt()) ); aboutAct = createOneAction(QIcon(":/im/images/NetEmul.png")); connect( aboutAct , SIGNAL(triggered()) , SLOT(aboutDialog())); helpAct = createOneAction(QIcon(":/im/images/question.png")); helpAct->setShortcut(QKeySequence::HelpContents); connect(helpAct,SIGNAL(triggered()) , SLOT(helpDialog())); adapterAct = createOneAction(QIcon(":/im/images/network_nic.png")); adapterAct->setShortcut(tr("Ctrl+I")); playAct = createOneAction( QIcon(":/im/images/pause.png") ); connect( playAct , SIGNAL(triggered()) ,SLOT(playBack()) ); progAct = createOneAction( QIcon(":/im/images/install_apps.png")); progAct->setShortcut(tr("Ctrl+P")); arpAct = createOneAction( QIcon(":/im/images/table_arp.png")); arpAct->setShortcut(tr("Ctrl+Shift+A")); logAct = createOneAction( QIcon(":/im/images/log.png")); arpAct->setShortcut(tr("Ctrl+L")); aboutDeviceAct = createOneAction(QIcon(":/im/images/question.png")); aboutDeviceAct->setShortcut(tr("Ctrl+F1")); connect( aboutDeviceAct , SIGNAL(triggered()), SLOT(helpDialog()) ); designerPacketAct = createOneAction( QIcon(":/im/images/cogwheel.png") ); printAct = createOneAction( QIcon(":/im/images/print.png") ); connect( printAct , SIGNAL(triggered()) , SLOT(printDialog()) ); printPreviewAct = createOneAction( QIcon(":/im/images/print_preview.png") ); connect( printPreviewAct , SIGNAL(triggered()) , SLOT(printPreviewDialog()) ); virtualNetworkAct = createOneAction(); noteAct = createOneAction(QIcon(":/im/images/description.png") ); cableLabelAct = createOneAction(); cableLabelAct->setCheckable(true); cableLabelAct->setChecked(true); } //Создаем меню void MainWindow::createMenu() { // Создаем наши меню и добавляем их на меню бар, fileMenu = menuBar()->addMenu(QString()); fileMenu->addAction(newAct); fileMenu->addAction(openAct); fileMenu->addAction(saveAct); fileMenu->addAction(saveAsAct); fileMenu->addAction(closeAct); fileMenu->addSeparator(); fileMenu->addAction(printAct); fileMenu->addAction(printPreviewAct); fileMenu->addSeparator(); fileMenu->addAction(exitAct); editMenu = menuBar()->addMenu(QString()); viewMenu = menuBar()->addMenu(QString()); viewMenu->addAction( deviceBar->toggleViewAction() ); viewMenu->addAction( controlBar->toggleViewAction() ); viewMenu->addAction(showGridAct); viewMenu->addAction( cableLabelAct ); itemMenu = menuBar()->addMenu(QString()); itemMenu->addAction(propertyAct); itemMenu->addAction(tableAct); itemMenu->addAction(adapterAct); itemMenu->addAction(progAct); itemMenu->addAction(arpAct); //itemMenu->addAction(virtualNetworkAct); itemMenu->addAction(logAct); itemMenu->addAction(designerPacketAct); itemMenu->addAction(aboutDeviceAct); itemMenu->addAction(noteAct); itemMenu->addAction(deleteAct); itemMenu->setEnabled(false); settingMenu = menuBar()->addMenu( QString() ); settingMenu->addAction(staticsAct); settingMenu->addAction(settingAct); testMenu = menuBar()->addMenu( QString() ); testMenu->addAction( testAct ); helpMenu = menuBar()->addMenu( QString() ); helpMenu->addAction(helpAct); helpMenu->addAction(aboutAct); helpMenu->addAction(aboutQtAct); } /*! Создает панели инструментов. */ void MainWindow::createTools() { deviceBar = addToolBar(QString()); deviceBar->setIconSize(QSize(32,32)); deviceBar->addAction( moveAct); deviceBar->addAction(textAct); deviceBar->addAction( cableAct); //deviceBar->addAction( shareBusAct); deviceBar->addAction( computerAct); deviceBar->addAction( hubAct); deviceBar->addAction( switchAct); deviceBar->addAction( routerAct); deviceBar->addAction( sendAct); deviceBar->addSeparator(); deviceBar->addAction( playAct); //deviceBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); deviceBar->setEnabled(false); controlBar = addToolBar(QString()); controlBar->setIconSize(QSize(32,32)); controlBar->addAction(propertyAct); controlBar->addAction(adapterAct); controlBar->addAction(progAct); controlBar->addAction(tableAct); controlBar->addAction(arpAct); //controlBar->addAction(virtualNetworkAct); controlBar->addAction(logAct); controlBar->addAction(designerPacketAct); controlBar->addSeparator(); controlBar->setEnabled(false); //1ughyh8ihuttji } //------------------------------------------------------ /*! Создает сцену и проводит сигнально-слотовые соединения с ней. */ void MainWindow::createScene() { canva = new myCanvas(itemMenu,this); // Создаем сцену canva->setBackgroundBrush(QBrush(Qt::lightGray)); canva->setSceneRect(0,0,10,10); connect( showGridAct , SIGNAL(toggled(bool)) , canva , SLOT(setShowGrid(bool))); connect( cableLabelAct , SIGNAL(toggled(bool)) , canva , SLOT(setShowLabels(bool)) ); connect( canva , SIGNAL(uncheck()) , SLOT(uncheck())); connect( deleteAct , SIGNAL(triggered()) , canva , SLOT(removeDevice())); connect( canva , SIGNAL(selectionChanged()) , SLOT(selectionChange())); connect( canva , SIGNAL(fileClosed()) , SLOT(closeFile()) ); connect( canva , SIGNAL(fileOpened()) , SLOT(newFile()) ); connect( canva , SIGNAL(tictac()) , SLOT(incTime()) ); sceneControler = new sceneControl(this,canva); connect( sceneControler , SIGNAL(selectOneDevice(bool)) , itemMenu , SLOT(setEnabled(bool)) ); connect( sceneControler , SIGNAL(selectOneDevice(bool)) , controlBar , SLOT(setEnabled(bool)) ); connect( sceneControler , SIGNAL(selectOneDevice(bool)) , logAct , SLOT(setVisible(bool)) ); connect( sceneControler , SIGNAL(selectTableDevice(bool)) , tableAct , SLOT(setVisible(bool)) ); connect( sceneControler , SIGNAL(selectSmartDevice(bool)) , adapterAct , SLOT(setVisible(bool)) ); connect( sceneControler , SIGNAL(selectSmartDevice(bool)) , progAct , SLOT(setVisible(bool)) ); connect( sceneControler , SIGNAL(selectSmartDevice(bool)) , arpAct , SLOT(setVisible(bool)) ); connect( sceneControler , SIGNAL(selectVirtualNetworkDevice(bool)) , virtualNetworkAct , SLOT(setVisible(bool)) ); connect( sceneControler , SIGNAL(selectComputer(bool)) , designerPacketAct , SLOT(setVisible(bool)) ); connect( designerPacketAct , SIGNAL(triggered()) , sceneControler , SLOT(showDesignerDialog()) ); connect( adapterAct , SIGNAL(triggered()) , sceneControler , SLOT(adapterDialog()) ); connect( tableAct , SIGNAL(triggered()) , sceneControler , SLOT(tableDialog()) ); connect( propertyAct , SIGNAL(triggered()) ,sceneControler , SLOT(propertyDialog()) ); connect( progAct , SIGNAL(triggered()) , sceneControler , SLOT(programmsDialog()) ); connect( arpAct , SIGNAL(triggered()) , sceneControler , SLOT(arpDialog()) ); connect( logAct , SIGNAL(triggered()) , SLOT(showLogDialog()) ); connect( noteAct , SIGNAL(triggered()) , sceneControler , SLOT(showDeviceNoteDialog()) ); connect( virtualNetworkAct , SIGNAL(triggered()) , sceneControler , SLOT(showVirtualNetworkDialog()) ); QAction *t = canva->undoAction(this); t->setIcon( QIcon(":/im/images/undo.png") ); t->setShortcut(QKeySequence::Undo); editMenu->addAction( t ); t = canva->redoAction(this); t->setShortcut(QKeySequence::Redo); t->setIcon( QIcon(":/im/images/redo.png") ); editMenu->addAction( t ); } //------------------------------------------------------------------ void MainWindow::showLogDialog() { QString str = sceneControler->note(); QDockWidget *dock = new QDockWidget( str.remove(QRegExp("<[^>]+>")) ); dock->setAttribute(Qt::WA_DeleteOnClose); logDialog *d = new logDialog( sceneControler->sockets() ); dock->setWidget(d); sceneControler->showLogDialog(d); addDockWidget(Qt::BottomDockWidgetArea ,dock); } /*! Подготавливает окно для работы. */ void MainWindow::newFile() { setEnabledFileItems(true); showGridAct->setChecked(true); canva->newFile(); } //---------------------------------------------------------- /*! Делает окно закрытым для работы. */ void MainWindow::closeFile() { if ( !canva->isOpen() ) return; if ( canva->isModified() ) { int res = saveFileDialog(); if ( res == QMessageBox::Cancel ) return; if ( res == QMessageBox::Save ) saveFile(); } setWindowTitle(myFile = tr("")); setEnabledFileItems(false); canva->closeFile(); uncheck(); } //----------------------------------------------------------- // Слот включает или отключает пункты меню в зависимости от того открыт файл или закрыт void MainWindow::setEnabledFileItems(bool cur) { deviceBar->setEnabled(cur); closeAct->setEnabled(cur); openAct->setEnabled(!cur); newAct->setEnabled(!cur); saveAct->setEnabled(cur); saveAsAct->setEnabled(cur); showGridAct->setEnabled(cur); printAct->setEnabled(cur); printPreviewAct->setEnabled(cur); cableLabelAct->setEnabled(cur); } /*! Слот вызываемый при изменении выделения на сцене. */ void MainWindow::selectionChange() { if ( sceneControler->isSelect() ) { tableAct->setIcon( sceneControler->tableIcon() ); tableAct->setText( sceneControler->tableName() ); tableAct->setToolTip( sceneControler->tableName() ); } } //------------------------------------------------------------ // Слот окна настроек void MainWindow::setting() { settingDialog *d = new settingDialog; d->exec(); canva->setAnimateSpeed( appSetting::animateSpeed() ); setOpenglMode( appSetting::hasOpengl() ); autosaveTimer->start( appSetting::autosaveInterval() * 60000 ); cableLabelAct->setChecked( appSetting::isShowLabel() ); canva->setShowLabels( appSetting::isShowLabel() ); } void MainWindow::setOpenglMode(bool mode) { #ifndef QT_NO_OPENGL QWidget *widget = 0; if ( mode ) widget = new QGLWidget(QGLFormat(QGL::SampleBuffers)); view->setViewport(widget); #endif } //Слот сохранить bool MainWindow::saveFile() { if ( myFile.isEmpty() ) { saveAsFile(); return true; } setWindowTitle( myFile ); if ( myFile.endsWith("net") ) { canva->saveScene(myFile); } else { canva->saveSceneXml(myFile); } return true; } void MainWindow::openFile(QString name) { setWindowTitle(name); setEnabledFileItems(true); showGridAct->setChecked(true); if ( name.endsWith("net") ) { canva->openScene(name); } else { canva->openSceneXml(name); } } void MainWindow::openFile() { QString t = QFileDialog::getOpenFileName(this,tr("Open"), QDir::currentPath(),tr(FILES_CURRENT_TYPES)); if ( t.isEmpty() ) return; myFile = t; openFile( myFile ); } //Слот сохранить как =) void MainWindow::saveAsFile() { QString t = QFileDialog::getSaveFileName(this,tr("Save file as ..."), QApplication::applicationDirPath(),tr(FILES_CURRENT_TYPES)); if ( t.isEmpty() ) return ; if ( !t.endsWith(".net") && !t.endsWith(".xml") ) t.push_back(".net"); myFile = t; saveFile(); } // Фильтр для виев айтем =) bool MainWindow::eventFilter(QObject *obj,QEvent *event) { if ( obj == view ) { if ( event->type() == QEvent::Leave ) canva->hideState(); return false; } else return QMainWindow::eventFilter(obj,event); } /* Запись настроек программы в файл. */ void MainWindow::writeSetting() { QSettings setting("FROST","netemul"); setting.beginGroup("window"); setting.setValue("width", width() ); setting.setValue("height", height() ); setting.setValue("left" , pos().x() ); setting.setValue("top" , pos().y() ); setting.endGroup(); appSetting::writeSetting(); } //--------------------------------------------------- /* Функция чтения настроек из файла. */ void MainWindow::readSetting() { QSettings setting("FROST","netemul"); setting.beginGroup("window"); resize( setting.value( "width", 800 ).toInt() , setting.value( "height", 600 ).toInt() ); move( setting.value( "left" , 100 ).toInt() , setting.value( "top" , 100 ).toInt() ); setting.endGroup(); appSetting::readSetting(); } //---------------------------------------------------- /*! Устанавливает режим сцены в зависимости от активированного действия. @param clk - указатель на действие. */ void MainWindow::groupClicked(QAction *clk) { int m = clk->data().toInt() / 10; int t = clk->data().toInt() % 10; canva->setMode(m,t); } //---------------------------------------------------- void MainWindow::uncheck() { moveAct->setChecked(true); } void MainWindow::test() { testDialog *t = new testDialog(canva); t->exec(); } //Help=) void MainWindow::helpDialog() { QString dest; if ( sender() == aboutDeviceAct ) dest = sceneControler->deviceName(); else dest = "index"; QString t; switch ( appSetting::language() ) { case 1: t = "ru"; break; default: t = "en"; } #ifdef Q_WS_MACX QDesktopServices::openUrl(QUrl("file:///" +QCoreApplication::applicationDirPath() + "/../../../doc/"+t+"/"+dest+".html")); #endif #ifdef Q_WS_WIN QDesktopServices::openUrl(QUrl("file:///" +QCoreApplication::applicationDirPath() +"/doc/"+t+"/"+dest+".html")); #endif #ifdef Q_WS_X11 QDesktopServices::openUrl(QUrl(DOC_PATH + t + "/" + dest + ".html")); #endif } /*! Слот включает или выключает симуляцю сцены, меняет картинки и подсказки. */ void MainWindow::playBack() { if ( canva->isPlayed() ) { canva->stop(); playAct->setIcon(QIcon(":/im/images/play.png")); playAct->setToolTip(tr("Play")); playAct->setStatusTip(tr("Start simulation")); } else { canva->play(); playAct->setIcon(QIcon(":/im/images/pause.png")); playAct->setToolTip(tr("Stop")); playAct->setStatusTip(tr("Stop simulation")); } } //-------------------------------------------------- /*! * Выводит на экран статистику программы. */ void MainWindow::statistics() { statisticsScene s(canva); staticsDialog *d = new staticsDialog(&s); d->exec(); } void MainWindow::aboutDialog() { aboutWindow *w = new aboutWindow; w->show(); } void MainWindow::printDialog() { if ( !printer ) { printer = new QPrinter(QPrinter::HighResolution); } QPrintDialog dialog(printer,this); if ( dialog.exec() == QDialog::Accepted ) { printer->setDocName(file()); printerPainter = new QPainter(printer); view->render(printerPainter); printerPainter->end(); } } void MainWindow::paintInPreviewDialog(QPrinter *printer) { printer->newPage(); QPainter painter(printer); view->render(&painter); } void MainWindow::printPreviewDialog() { if ( !printer ) { printer = new QPrinter(QPrinter::HighResolution); } QPrintPreviewDialog dialog(printer,this); connect( &dialog , SIGNAL(paintRequested(QPrinter*)) , SLOT(paintInPreviewDialog(QPrinter*))); dialog.exec(); } void MainWindow::autosave() { if ( appSetting::isAutosave() && canva->isOpen() ) saveFile(); } void MainWindow::incTime() { static QTime t(0,0,0); static int n = 0; timeLabel->setText( t.addSecs(++n).toString("hh:mm:ss") ); } void MainWindow::changeEvent(QEvent *e) { switch (e->type()) { case QEvent::LanguageChange: retranslate(); break; default: break; } } netemul-1.0/src/frame.h0000644000175000017500000000710011270606674014140 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef FRAME_H #define FRAME_H #include "macaddress.h" #include /*! * Класс данные общего пользования, для фреймов. */ class frameData : public QSharedData { public: frameData(); frameData(const frameData &other) : QSharedData(other) , sender(other.sender) , receiver(other.receiver) , type(other.type) , different(other.different) , data(other.data) { } ~frameData() { } QByteArray toArray() const; friend class frame; private: macAddress sender; //!< Mac-адрес отправителя macAddress receiver; //!< Mac-адрес получателя qint8 type; //!< Показывает несет ли в себе кадр ip-пакет или arp сообщение. qint8 different; //!< Разновидность фрэйма, влияет на его цвет и отображение QByteArray data; //!< Данные протокола более высокого уровня. }; /*! Реализует кадр, также как и в реальной сети содержит адрес отправителя, получателя и поле данных где содержиться информация протокола более высокого уровня. */ class frame { public: enum { arp = 100 , ip = 101 }; enum { NORMAL = 3 , BROADCAST = 4 }; frame() { d = new frameData; } frame(const frame &other) : d(other.d) { } frame(const QByteArray &b); macAddress sender() const { return d->sender; } void setSender(macAddress temp) { d->sender = temp; } macAddress receiver() const { return d->receiver; } void setReceiver(macAddress temp) { d->receiver = temp; } void setDifferent(qint8 t) { d->different = t; } int type() const { return d->type; } void setType(int t) { d->type = t; } QByteArray toData() const; QString toString() const; void pack(const QByteArray &b) { d->data = b; } QByteArray unpack() const { return d->data; } private: QSharedDataPointer d; protected: friend QDataStream& operator<<(QDataStream &stream, const frame &f); }; /*! Записывает кадр в поток. @param stream - ссылка на поток. @param f - ссылка на кадр. @return результирующий поток. */ inline QDataStream& operator<<(QDataStream &stream, const frame &f) { stream << f.toData(); return stream; } //---------------------------------------------------- #endif // FRAME_H netemul-1.0/src/macaddress.h0000644000175000017500000000556211261705352015157 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef MACADDRESS_H #define MACADDRESS_H #include class macAddress { public: macAddress(); macAddress(QString str); macAddress(const macAddress &other); void setMac(QString str); void setRandom(); QString toString() const ; macAddress operator++(); macAddress operator++(int notused); macAddress& operator=(const macAddress &other); void setBroadcast(); bool isBroadcast(); qulonglong toInt() const; private: quint8 myMac[6]; protected: friend QDataStream& operator<<(QDataStream &stream, const macAddress &address); friend QDataStream& operator>>(QDataStream &stream, macAddress &address); }; inline qulonglong macAddress::toInt() const { return ((qulonglong)myMac[0]<<40)+((qulonglong)myMac[1]<<32)+((qulonglong)myMac[2]<<24)+ ((qulonglong)myMac[3]<<16)+((qulonglong)myMac[4]<<8)+(qulonglong)myMac[5]; } inline bool operator<(const macAddress &e1 , const macAddress &e2) { return e1.toInt() < e2.toInt(); } inline bool operator>(const macAddress &e1 , const macAddress &e2) { return e1.toInt() > e2.toInt(); } inline bool operator==(const macAddress &e1 , const macAddress &e2) { return e1.toInt() == e2.toInt(); } inline bool operator!=(const macAddress &e1, const macAddress &e2) { return !(e1 == e2); } inline bool operator>=(const macAddress &e1 , const macAddress &e2) { return !(e1 < e2); } inline bool operator<=(const macAddress &e1 , const macAddress &e2) { return !(e1 > e2); } inline QDataStream& operator<<(QDataStream &stream, const macAddress &address) { for (int i = 0 ; i < 6 ; i++ ) stream << address.myMac[i]; return stream; } inline QDataStream& operator>>(QDataStream &stream, macAddress &address) { for (int i = 0 ; i < 6 ; i++ ) stream >> address.myMac[i]; return stream; } #endif // MACADDRESS_H netemul-1.0/src/controls/0000755000175000017500000000000011305026151014523 5ustar frostfrostnetemul-1.0/src/controls/scenecontrol.cpp0000644000175000017500000000715011275241253017740 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "scenecontrol.h" #include "device.h" #include "mycanvas.h" sceneControl::sceneControl(QObject *parent , myCanvas *s ) : QObject(parent) , scene(s) { connect( scene , SIGNAL(selectionChanged()) , SLOT(observeSelection()) ); } void sceneControl::observeSelection() { if ( device *t = scene->oneSelectedDevice() ) { emit selectTableDevice( t->hasTable() ); emit selectOneDevice(true); emit selectSmartDevice( t->isSmart() ); emit selectComputer( t->isCanSend() ); emit selectVirtualNetworkDevice( t->isManagedVirtualNetwork() ); } else { emit selectSmartDevice(false); emit selectOneDevice(false); emit selectTableDevice(false); emit selectComputer(false); emit selectVirtualNetworkDevice(false); } } QString sceneControl::tableName() const { return scene->oneSelectedDevice()->tableName(); } void sceneControl::propertyDialog() const { device *t = scene->oneSelectedDevice(); t->dialog(); } void sceneControl::tableDialog() const { device *t = scene->oneSelectedDevice(); t->tableDialog(); } void sceneControl::adapterDialog() const { device *t = scene->oneSelectedDevice(); t->adapterDialog(); } void sceneControl::programmsDialog() const { device *t = scene->oneSelectedDevice(); t->programmsDialog(); } void sceneControl::arpDialog() const { device *t = scene->oneSelectedDevice(); t->arpDialog(); } void sceneControl::showLogDialog(logDialog *log) const { device *t = scene->oneSelectedDevice(); t->showLogDialog(log); } void sceneControl::showDesignerDialog() const { device *t = scene->oneSelectedDevice(); t->showDesignerDialog(); } void sceneControl::showDeviceNoteDialog() const { device *t = scene->oneSelectedDevice(); t->showDeviceNoteDialog(); } void sceneControl::showVirtualNetworkDialog() const { scene->oneSelectedDevice()->showVirtualNetworkDialog(); } bool sceneControl::isSelect() const { if ( scene->oneSelectedDevice() ) return true; return false; } QString sceneControl::note() const { device *t = scene->oneSelectedDevice(); return t->toolTip(); } QIcon sceneControl::tableIcon() const { device *t = scene->oneSelectedDevice(); if ( !t->hasTable() ) return QIcon(); if ( t->isSmart() ) return QIcon(":/im/images/table_route.png"); else return QIcon(":/im/images/table_arp.png"); } QString sceneControl::deviceName() const { device *t = scene->oneSelectedDevice(); return t->deviceName(); } QStringList sceneControl::sockets() const { device *t = scene->oneSelectedDevice(); return t->sockets(); } netemul-1.0/src/controls/controls.pri0000644000175000017500000000012011230647173017105 0ustar frostfrostSOURCES += src/controls/scenecontrol.cpp HEADERS += src/controls/scenecontrol.h netemul-1.0/src/controls/scenecontrol.h0000644000175000017500000000377511275241253017416 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef SCENECONTROL_H #define SCENECONTROL_H #include #include class myCanvas; class logDialog; class sceneControl : public QObject { Q_OBJECT public: sceneControl(QObject *parent,myCanvas *s); bool isSelect() const; QString tableName() const; QString note() const; QStringList sockets() const; QIcon tableIcon() const; QString deviceName() const; private: myCanvas *scene; public slots: void observeSelection(); void propertyDialog() const; void tableDialog() const; void adapterDialog() const; void programmsDialog() const; void arpDialog() const; void showLogDialog(logDialog *log) const; void showDesignerDialog() const; void showDeviceNoteDialog() const; void showVirtualNetworkDialog() const; signals: void selectOneDevice(bool); void selectTableDevice(bool); void selectSmartDevice(bool); void selectComputer(bool); void selectVirtualNetworkDevice(bool); }; #endif // SCENECONTROL_H netemul-1.0/src/commands/0000755000175000017500000000000011305026151014461 5ustar frostfrostnetemul-1.0/src/commands/addcommand.h0000644000175000017500000000263211257760107016740 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef ADDCOMMAND_H #define ADDCOMMAND_H #include #include class myCanvas; class device; class addCommand : public QUndoCommand { public: addCommand(myCanvas *s , QPointF point , int type); ~addCommand(); void undo(); void redo(); private: device *myDevice; myCanvas *scene; QPointF myPoint; int myType; bool isOnScene; }; #endif // ADDCOMMAND_H netemul-1.0/src/commands/deletecommand.h0000644000175000017500000000314511257760107017452 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef DELETECOMMAND_H #define DELETECOMMAND_H #include #include class QGraphicsItem; class myCanvas; class cableDev; class device; class textItem; class deleteCommand : public QUndoCommand { public: deleteCommand(myCanvas *s, QList list); ~deleteCommand(); void undo(); void redo(); void deleteConnection(cableDev *cable); void createConnection(cableDev *cable); private: myCanvas *scene; QSet extractCables; QList extractDevices; QList extractText; bool isOnScene; }; #endif // DELETECOMMAND_H netemul-1.0/src/commands/movecommand.h0000644000175000017500000000261611257760107017160 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef MOVECOMMAND_H #define MOVECOMMAND_H #include #include "mycanvas.h" typedef QMap mapWithCoords; class moveCommand : public QUndoCommand { public: moveCommand(myCanvas *s,mapWithCoords o, mapWithCoords r); void undo(); void redo(); private: myCanvas *scene; mapWithCoords old; mapWithCoords recent; }; #endif // MOVECOMMAND_H netemul-1.0/src/commands/addtextcommand.h0000644000175000017500000000264311257760107017647 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef ADDTEXTCOMMAND_H #define ADDTEXTCOMMAND_H #include #include class myCanvas; class textItem; class addTextCommand : public QUndoCommand { public: addTextCommand(myCanvas *s, QPointF p); ~addTextCommand(); void undo(); void redo(); private: myCanvas *scene; QPointF point; bool isFirst; bool isOnScene; textItem *text; }; #endif // ADDTEXTCOMMAND_H netemul-1.0/src/commands/commands.pri0000644000175000017500000000055611257760107017020 0ustar frostfrostHEADERS += src/commands/addcommand.h \ src/commands/movecommand.h \ src/commands/deletecommand.h \ src/commands/addcablecommand.h \ src/commands/addtextcommand.h SOURCES += src/commands/addcommand.cpp \ src/commands/movecommand.cpp \ src/commands/deletecommand.cpp \ src/commands/addcablecommand.cpp \ src/commands/addtextcommand.cpp netemul-1.0/src/commands/addcablecommand.h0000644000175000017500000000256411257760107017733 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef ADDCABLECOMMAND_H #define ADDCABLECOMMAND_H #include class myCanvas; class cableDev; class addCableCommand : public QUndoCommand { public: addCableCommand(myCanvas *s, cableDev *c); ~addCableCommand(); void redo(); void undo(); private: myCanvas *scene; cableDev *cable; bool isOnScene; }; #endif // ADDCABLECOMMAND_H netemul-1.0/src/commands/addcablecommand.cpp0000644000175000017500000000301011257760107020251 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "addcablecommand.h" #include "mycanvas.h" #include "cabledev.h" addCableCommand::addCableCommand(myCanvas *s, cableDev *c) { scene = s; cable = c; setText(QObject::tr("Add cable")); } addCableCommand::~addCableCommand() { if ( !isOnScene) delete cable; } void addCableCommand::undo() { cable->unregisterCable(); scene->unregisterCable(cable); isOnScene = false; } void addCableCommand::redo() { cable->registerCable(); scene->registerCable(cable); isOnScene = true; } netemul-1.0/src/commands/movecommand.cpp0000644000175000017500000000244411257760107017512 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "movecommand.h" moveCommand::moveCommand(myCanvas *s,mapWithCoords o,mapWithCoords r) { scene = s; old = o; recent = r; setText(QObject::tr("Move")); } void moveCommand::undo() { scene->putItems(old); } void moveCommand::redo() { scene->putItems(recent); } netemul-1.0/src/commands/deletecommand.cpp0000644000175000017500000000510011257760107017776 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "deletecommand.h" #include "mycanvas.h" #include "cabledev.h" #include "device.h" #include "textitem.h" deleteCommand::deleteCommand(myCanvas *s, QList list) { scene = s; foreach ( QGraphicsItem *i, list) { if ( scene->isDevice(i) ) { device *dev = qgraphicsitem_cast(i); extractDevices << dev; foreach ( cableDev *j, dev->cables() ) extractCables << j; } else if ( i->type() == cableDev::Type ) extractCables << qgraphicsitem_cast(i); else if (i->type() == textItem::Type ) extractText << qgraphicsitem_cast(i); } setText(QObject::tr("Delete")); } deleteCommand::~deleteCommand() { if ( isOnScene ) return; qDeleteAll(extractDevices); qDeleteAll(extractCables); qDeleteAll(extractText); } void deleteCommand::undo() { foreach ( device *i, extractDevices ) scene->registerDevice(i); foreach ( cableDev *i, extractCables ) createConnection(i); foreach ( textItem *i , extractText ) scene->registerText(i); isOnScene = true; } void deleteCommand::redo() { foreach ( device *i, extractDevices ) scene->unregisterDevice(i); foreach ( cableDev *i, extractCables ) deleteConnection(i); foreach ( textItem *i, extractText ) scene->unregisterText(i); isOnScene = false; } void deleteCommand::deleteConnection(cableDev *cable) { cable->unregisterCable(); scene->unregisterCable(cable); } void deleteCommand::createConnection(cableDev *cable) { cable->registerCable(); scene->registerCable(cable); } netemul-1.0/src/commands/addcommand.cpp0000644000175000017500000000316511257760107017275 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "device.h" #include "addcommand.h" #include "mycanvas.h" addCommand::addCommand(myCanvas *s, QPointF point , int type) { scene = s; myDevice = 0; myPoint = point; myType = type; } addCommand::~addCommand() { if ( !isOnScene ) delete myDevice; } void addCommand::undo() { scene->unregisterDevice(myDevice); isOnScene = false; } void addCommand::redo() { if ( myDevice ) scene->registerDevice(myDevice); else { myDevice = scene->addDeviceOnScene( myPoint, myType ); setText( QObject::tr("Add %1").arg( myDevice->deviceCommandName() ) ); } isOnScene = true; } netemul-1.0/src/commands/addtextcommand.cpp0000644000175000017500000000304511257760107020177 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "addtextcommand.h" #include "mycanvas.h" addTextCommand::addTextCommand(myCanvas *s, QPointF p) { scene = s; point = p; isFirst = true; setText(QObject::tr("Add note")); } addTextCommand::~addTextCommand() { if ( !isOnScene ) delete text; } void addTextCommand::undo() { scene->unregisterText(text); isOnScene = false; } void addTextCommand::redo() { if ( isFirst ) { text = scene->createTextItem(point); isFirst = false; } else scene->registerText(text); isOnScene = true; } netemul-1.0/src/deviceport.cpp0000644000175000017500000000573611270606674015562 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "deviceport.h" #include "cabledev.h" #include "frame.h" devicePort::devicePort() { myConnect = false; myShared = false; myCable = 0; } devicePort::devicePort(int n) : myNum(n) { myConnect = false; myShared = false; myCable = 0; } devicePort::~devicePort() { } bool devicePort::isCableConnect(const cableDev *c) const { if ( myCable == c ) return true; return false; } bool devicePort::isCableBusy() const { return myConnect && myCable->isBusy(this); } /*! Достает кадр из очереди и отправляет его. */ void devicePort::queueEvent() { if ( senderQueue.isEmpty() ) return; if ( !myShared && myCable->isShared() && myCable->isBusy(this) ) return; frame t = senderQueue.dequeue(); if ( t.receiver().isBroadcast() ) t.setDifferent( frame::BROADCAST ); else t.setDifferent( frame::NORMAL ); myCable->input(t.toData(),this); } //--------------------------------------------------- /*! Устанавливает статус соединения устройства. если устройство включено необходимо обязательно задать кабель вставленный в это устройство. @param cur - true если соединяем , false если отключаем. @param cable - указатель на подсоединяемый кабель. */ void devicePort::setConnect(bool cur,cableDev *cable) { myConnect = cur; myCable = cable; if (cable) cable->insertInPort(this); if ( !cur && !cable) { senderQueue.clear(); receiveQueue.clear(); } } //--------------------------------------------------- void devicePort::setChecked(bool c) { if ( myConnect ) myCable->setChecked(c); } void devicePort::receiveFrame(QByteArray &b) { frame f(b); receiveQueue.enqueue(f); } void devicePort::startCollision() { if ( myConnect && !myCable->isCollisionCable() ) myCable->startCollision(); } netemul-1.0/src/forms/0000755000175000017500000000000011305026151014006 5ustar frostfrostnetemul-1.0/src/forms/dhcpclientproperty.ui0000644000175000017500000000655611271166761020321 0ustar frostfrost dhcpClientProperty 0 0 264 335 DHCP client property Choose interfaces which must<br> be under DHCP control: Waiting time for offers<br> from dhcp-server 150 16777215 60 300 60 Qt::Horizontal 40 20 Ok :/im/images/ok.png:/im/images/ok.png Cancel :/im/images/not.png:/im/images/not.png btn_cancel clicked() dhcpClientProperty reject() 350 245 398 208 btn_ok clicked() dhcpClientProperty apply() 250 245 112 230 apply() netemul-1.0/src/forms/testdialog.ui0000644000175000017500000000633411261705352016522 0ustar frostfrost testDialog 0 0 369 236 Scripts QAbstractItemView::NoEditTriggers QAbstractItemView::MultiSelection Start Cancel Set path All Qt::Vertical 20 40 Click start cancelButton clicked() testDialog reject() 352 78 377 162 pushButton clicked() testDialog setScriptPath() 303 96 336 174 startButton clicked() testDialog start() 326 35 252 9 setScriptPath() start() netemul-1.0/src/forms/forms.pri0000644000175000017500000000073111274657601015670 0ustar frostfrostFORMS += src/forms/programmdialog.ui \ src/forms/testdialog.ui \ src/forms/connectdialog.ui \ src/forms/tableswitch.ui \ src/forms/installdialog.ui \ src/forms/settingdialog.ui \ src/forms/staticsdialog.ui \ src/forms/logdialog.ui \ src/forms/aboutwindow.ui \ src/forms/dhcpclientproperty.ui \ src/forms/ripproperty.ui \ src/forms/dhcpserverproperty.ui \ src/forms/virtualnetworkdialog.ui \ src/forms/devicenotedialog.ui netemul-1.0/src/forms/dhcpserverproperty.ui0000644000175000017500000002432011271166761020336 0ustar frostfrost dhspServerProperty 0 0 800 462 0 0 800 0 DHCP server's properties Choose interface: 100 0 Qt::Horizontal 40 20 Static: QAbstractItemView::SingleSelection QAbstractItemView::SelectRows Qt::Horizontal 40 20 Add :/im/images/edit_add.png:/im/images/edit_add.png Delete :/im/images/edit_remove.png:/im/images/edit_remove.png Dynamic: false Lease term: false 0 0 70 0 s 300 3600 10 false Ip address The field for ip-address. From: false Ip address The field for ip-address. to: false Ip address The field for ip-address. Mask: false Ip address The field for ip-address. Gateway: Wating time for request from dhcp-client: 70 16777215 60 300 Qt::Vertical 20 40 Qt::Horizontal 40 20 Ok :/im/images/ok.png:/im/images/ok.png Cancel :/im/images/not.png:/im/images/not.png ipEdit QWidget

ipedit.h
btn_cancel clicked() dhspServerProperty reject() 789 451 49 284 btn_add clicked() dhspServerProperty addRecord() 694 214 234 228 btn_del clicked() dhspServerProperty deleteRecord() 789 214 260 234 cb_dynamic toggled(bool) dhspServerProperty changeState(bool) 42 244 114 326 btn_ok clicked() dhspServerProperty apply() 693 451 540 364 addRecord() deleteRecord() changeState(bool) apply() netemul-1.0/src/forms/settingdialog.ui0000644000175000017500000010204411277100130017201 0ustar frostfrost settingDialog 0 0 758 381 Settings 740 70 16777215 70 QAbstractItemView::NoEditTriggers QAbstractItemView::DragDrop 32 32 Qt::ElideLeft 5 QListView::IconMode -1 General AlignLeft|AlignVCenter :/im/images/setting.png:/im/images/setting.png ItemIsSelectable|ItemIsUserCheckable|ItemIsEnabled Computer :/im/images/computer.png:/im/images/computer.png ItemIsSelectable|ItemIsUserCheckable|ItemIsEnabled Hub :/im/images/hub.png:/im/images/hub.png ItemIsSelectable|ItemIsUserCheckable|ItemIsEnabled Switch :/im/images/switch.png:/im/images/switch.png ItemIsSelectable|ItemIsUserCheckable|ItemIsEnabled Router :/im/images/router.png:/im/images/router.png ItemIsSelectable|ItemIsUserCheckable|ItemIsEnabled Netcard :/im/images/network_nic.png:/im/images/network_nic.png ItemIsSelectable|ItemIsUserCheckable|ItemIsEnabled Tcp :/im/images/tcp.png:/im/images/tcp.png 0 150 0 Turn on/off OpenGL Language: 200 16777215 English Russian Brazillian Portuguese Spanish Autosave Qt::Horizontal 40 20 Animation speed: 350 16777215 1 10 Qt::Horizontal QSlider::TicksBothSides 1 Qt::Horizontal 128 20 Interval: false 150 16777215 1 30 Qt::Horizontal 40 20 Qt::Vertical 17 92 Nubmer of interfaces by default: 75 16777215 1 2 3 4 5 6 Qt::Vertical 20 70 Number of ports by default 75 16777215 4 5 6 8 12 24 48 Qt::Vertical 20 70 Number of ports by default: 75 16777215 4 5 8 12 16 24 32 48 Switching table's records lifetime: 100 16777215 s 10 300 300 Qt::Vertical 20 10 Number of ports by default: 75 16777215 2 4 5 7 8 9 Qt::Vertical 20 70 Lifetime arp-entries: 0 0 0 0 16777215 16777215 s 10 1200 Expectation time for arp-responce 0 0 s 10 300 Qt::Vertical 20 29 Number of repeat sendings: 0 0 75 16777215 10 1 Waiting confirmation time: 0 0 0 0 75 16777215 s 30 130 30 Qt::Vertical 20 109 Qt::Horizontal 40 20 Default :/im/images/cogwheel.png:/im/images/cogwheel.png false Apply :/im/images/refresh.png:/im/images/refresh.png Ok :/im/images/ok.png:/im/images/ok.png true true Cancel :/im/images/not.png:/im/images/not.png btn_ok btn_apply btn_cancel computerComboBox hubComboBox switchComboBox sp_ttlMac routerComboBox listWidget btn_cancel clicked() settingDialog reject() 747 370 637 204 btn_ok clicked() settingDialog apply() 651 370 349 265 btn_apply clicked() settingDialog apply() 560 370 269 262 listWidget currentRowChanged(int) stackedWidget setCurrentIndex(int) 318 73 262 97 computerComboBox currentIndexChanged(int) settingDialog applyEnable() 78 98 20 258 hubComboBox currentIndexChanged(int) settingDialog applyEnable() 69 98 37 264 switchComboBox currentIndexChanged(int) settingDialog applyEnable() 68 87 67 266 sp_ttlMac valueChanged(int) settingDialog applyEnable() 90 98 186 239 languageBox currentIndexChanged(int) settingDialog applyEnable() 111 148 40 290 routerComboBox currentIndexChanged(int) settingDialog applyEnable() 67 98 105 255 sl_speed valueChanged(int) settingDialog applyEnable() 232 148 104 288 sb_send valueChanged(int) settingDialog applyEnable() 65 114 383 162 sb_waitingTime valueChanged(int) settingDialog applyEnable() 65 114 383 162 btn_default clicked() settingDialog defaultSettings() 469 370 303 287 sp_ttlArp valueChanged(int) settingDialog applyEnable() 71 114 142 277 sp_arpResponce valueChanged(int) settingDialog applyEnable() 43 114 67 300 cb_opengl clicked() settingDialog applyEnable() 159 199 179 309 cb_autosave clicked() settingDialog applyEnable() 189 173 4 142 sb_autosave valueChanged(int) settingDialog applyEnable() 275 210 71 341 cb_autosave toggled(bool) settingDialog autosaveChanged(bool) 221 170 162 362 apply() applyEnable() defaultSettings() autosaveChanged(bool) netemul-1.0/src/forms/programmdialog.ui0000644000175000017500000001442511301064563017364 0ustar frostfrost programmDialog 0 0 400 250 400 250 Programs Installed programs Qt::Vertical QSizePolicy::Fixed 20 40 Add :/im/images/edit_add.png:/im/images/edit_add.png false Settings :/im/images/setting.png:/im/images/setting.png false Delete :/im/images/edit_remove.png:/im/images/edit_remove.png Qt::Vertical 20 40 Ok :/im/images/ok.png:/im/images/ok.png Cancel :/im/images/not.png:/im/images/not.png btn_cancel clicked() programmDialog reject() 393 243 188 245 btn_ok clicked() programmDialog apply() 393 214 180 277 btn_add clicked() programmDialog add() 343 63 313 18 btn_remove clicked() programmDialog remove() 393 132 315 135 btn_settings clicked() programmDialog settings() 360 89 386 23 list currentRowChanged(int) programmDialog programmChanged() 140 120 351 13 list itemClicked(QListWidgetItem*) programmDialog stateChanged(QListWidgetItem*) 232 109 335 30 apply() add() remove() settings() programmChanged() stateChanged(QListWidgetItem*) netemul-1.0/src/forms/virtualnetworkdialog.ui0000644000175000017500000000056411274657601020651 0ustar frostfrost virtualNetworkDialog 0 0 400 300 Dialog netemul-1.0/src/forms/staticsdialog.ui0000644000175000017500000000757511237623072017226 0ustar frostfrost staticsDialog 0 0 211 156 Statistics 0 100 Devices: Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop true false TextLabel Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop Qt::Vertical Traffic: Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop TextLabel Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop Qt::Horizontal 40 20 250 16777215 Close :/im/images/not.png:/im/images/not.png Qt::Horizontal 40 20 pushButton clicked() staticsDialog accept() 119 125 197 133 netemul-1.0/src/forms/aboutwindow.ui0000644000175000017500000001032011257760107016717 0ustar frostfrost aboutWindow 0 0 412 374 About program :/im/images/NetEmul.png Qt::AlignCenter 0 About Program for simulating computer networks. (C) 2009 Semenov Pavel and Omilaeva Anastasia Authors <a href="https://sourceforge.net/projects/netemul">Home Page</a><br><br> Semenov Pavel - Project admin. Developer.<br> <br> Omilaeva Anastasia - Developer. Thanks to Konstantin Andreev - Author of the idea and creator of the icons, Arina Shelest - Author of the logotype. Lisandro Damián Nicanor Pérez Meyer Márcio Moraes Translation Семенов Павел - Русский Márcio Moraes - Português brasileiro Lisandro Damián Nicanor Pérez Meyer - Español Qt::Horizontal 40 20 Close :/im/images/not.png:/im/images/not.png Close clicked() aboutWindow accept() 317 304 144 286 netemul-1.0/src/forms/connectdialog.ui0000644000175000017500000000504311237132505017165 0ustar frostfrost connectDilog 0 0 466 360 Specify the initial preferences Select the connected interfaces: Qt::AlignCenter false Connect :/im/images/ok.png:/im/images/ok.png Cancel :/im/images/not.png:/im/images/not.png okButton clicked() connectDilog accept() 111 343 234 299 cancelButton clicked() connectDilog reject() 298 344 463 279 netemul-1.0/src/forms/ripproperty.ui0000644000175000017500000000722611301064563016760 0ustar frostfrost ripProperty 0 0 247 191 Rip program property Split horizon: 0 0 Disable Enable With poison reverse Turn On/Off triggered updates Qt::Vertical 20 40 Qt::Horizontal 40 20 Ok :/im/images/ok.png:/im/images/ok.png Cancel :/im/images/not.png:/im/images/not.png btn_cancel clicked() ripProperty reject() 236 180 254 200 btn_ok clicked() ripProperty apply() 88 152 44 118 apply() netemul-1.0/src/forms/devicenotedialog.ui0000644000175000017500000000516611277114036017672 0ustar frostfrost deviceNoteDialog 0 0 274 276 Description Description: 5 Qt::Horizontal 40 20 Ok :/im/images/ok.png:/im/images/ok.png Cancel :/im/images/not.png:/im/images/not.png btn_ok clicked() deviceNoteDialog apply() 135 246 48 245 btn_cancel clicked() deviceNoteDialog reject() 209 254 272 199 apply() netemul-1.0/src/forms/logdialog.ui0000644000175000017500000000646511251267234016332 0ustar frostfrost logDialog 0 0 447 231 Form Qt::ScrollBarAlwaysOn QAbstractItemView::NoEditTriggers true false false 1 Time 75 0 70 0 All Arp TCP UDP Clear :/im/images/clean.png:/im/images/clean.png Qt::Horizontal 40 20 btn_clear clicked() lw_log clear() 260 213 223 99 netemul-1.0/src/forms/tableswitch.ui0000644000175000017500000001030411245346241016664 0ustar frostfrost tableSwitch 0 0 518 281 Switching table 500 0 QAbstractItemView::NoEditTriggers true QAbstractItemView::SingleSelection QAbstractItemView::SelectRows Mac-address: 200 0 16777215 16777215 HH:HH:HH:HH:HH:HH;_ 00:00:00:00:00:00 Port: 100 0 Add :/im/images/edit_add.png:/im/images/edit_add.png false Delete :/im/images/edit_remove.png:/im/images/edit_remove.png Qt::Horizontal 40 20 Close :/im/images/not.png:/im/images/not.png btn_cancel clicked() tableSwitch reject() 450 257 360 276 netemul-1.0/src/forms/installdialog.ui0000644000175000017500000000652511301064563017210 0ustar frostfrost installDialog 0 0 300 253 300 200 Programs Available programs: QAbstractItemView::NoEditTriggers RIP DHCP client ItemIsSelectable|ItemIsUserCheckable|ItemIsEnabled DHCP server ItemIsSelectable|ItemIsUserCheckable|ItemIsEnabled Qt::Horizontal 40 20 Install :/im/images/ok.png:/im/images/ok.png Close :/im/images/not.png:/im/images/not.png btn_close clicked() installDialog reject() 215 236 9 223 btn_install clicked() installDialog install() 98 233 31 227 install() netemul-1.0/src/packets/0000755000175000017500000000000011305026151014312 5ustar frostfrostnetemul-1.0/src/packets/arppacket.cpp0000644000175000017500000000411111261705352016775 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "arppacket.h" arpPacket::arpPacket(macAddress rm , macAddress sm , ipAddress ri , ipAddress si , quint8 t) { d = new arpPacketData; d->receiverMac = rm; d->senderMac = sm; d->receiverIp = ri; d->senderIp = si; d->type = t; } arpPacket::arpPacket(const QByteArray &b) { d = new arpPacketData; QDataStream s(b); s >> d->type >> d->senderMac >> d->receiverMac >> d->senderIp >> d->receiverIp; } QByteArray arpPacket::toData() const { return d->toData(); } //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- QByteArray arpPacketData::toData() const { QByteArray t; QDataStream s(&t,QIODevice::WriteOnly); s << type << senderMac << receiverMac << senderIp << receiverIp; return t; } arpPacketData::arpPacketData(const arpPacketData &other) : QSharedData(other) { receiverMac = other.receiverMac; senderMac = other.senderMac; receiverIp = other.receiverIp; senderIp = other.senderIp; type = other.type; } netemul-1.0/src/packets/ippacket.h0000644000175000017500000001052111270702635016273 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef IPPACKET_H #define IPPACKET_H #include #include "ipaddress.h" /*! * Содержит в себе разделяемые между ip пакетами данные. */ class ipPacketData : public QSharedData { public: ipPacketData() { } ipPacketData(const ipPacketData &other); ~ipPacketData() { } friend class ipPacket; private: ipAddress sender; //!< Адрес отправителя. ipAddress receiver; //!< Адрес получателя. qint8 upProtocol; //!< Протокол верхнего уровня quint8 ttl; QByteArray data; //!< Данные протокола более высокого уровня. QByteArray toData() const; }; /*! Реализует ip-пакет, так же как и в реальной сети содержит адрес отправителя, получателя, тип протокола верхнего уровня и поле данных. Остальные папраметры реального пакета пока не используются. */ class ipPacket { public: /*! Используется для обозначения протокола верхнего уровня. */ enum { udp = 0 , tcp = 1 }; ipPacket() { d = new ipPacketData; d->ttl = 64; } ipPacket(const QByteArray &b); ipPacket(ipAddress s,ipAddress r); ~ipPacket() { } ipPacket(const ipPacket &other) : d(other.d) { } QByteArray toData() const; QString toString() const; ipAddress sender() const { return d->sender; } ipAddress receiver() const { return d->receiver; } quint8 ttl() const { return d->ttl; } void setSender(ipAddress a) { d->sender = a; } void setReceiver(ipAddress a) { d->receiver = a; } void setTtl(quint8 ttl) { d->ttl = ttl; } bool isBroadcast(const ipAddress mask) const; quint16 receiverSocket() const; quint8 decTtl(); void setBroadcast(const ipAddress mask); void setUpProtocol(qint8 u) { d->upProtocol = u; } qint8 upProtocol() const { return d->upProtocol; } void pack(const QByteArray &b) { d->data = b; } int size() { return d->data.size(); } QByteArray unpack() const { return d->data; } private: QSharedDataPointer d; //!< Данные пакета. protected: friend bool operator==(const ipPacket &p1,const ipPacket &p2); friend QDataStream& operator<<(QDataStream &stream,const ipPacket &p); }; //--------------------------------------------------------------------------- /*! Записывает ip-пакет в поток. @param stream - поток для записи. @param p - записываемый пакет. @return ссылку на результирующий поток. */ inline QDataStream& operator<<(QDataStream &stream,const ipPacket &p) { stream << p.toData(); return stream; } //-------------------------------------------------- /*! Назначает пакету широковещательный адрес исходя из маски. @param mask - Маска. */ inline void ipPacket::setBroadcast(const ipAddress mask) { d->receiver = d->sender | ~mask; } //--------------------------------------------------- inline bool operator==(const ipPacket &p1,const ipPacket &p2) { return ( p1.sender() == p2.sender() && p1.receiver() == p2.receiver() ); } #endif // IPPACKET_H netemul-1.0/src/packets/tcppacket.cpp0000644000175000017500000000432011254745330017005 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "tcppacket.h" tcpPacket::tcpPacket(const QByteArray &b) { d = new tcpPacketData; QDataStream s(b); s >> d->receiver >> d->sender >> d->sequence >> d->ack >> d->flag >> d->window >> d->data; } /*! Записывает tcp-сегмент в поток. @param stream - поток для записи. @param p - записываемый пакет. @return ссылку на результирующий поток. */ QDataStream& operator<<( QDataStream &stream, const tcpPacket &p ) { stream << p.toData(); return stream; } //------------------------------------------------------- QString tcpPacket::toString() const { QString temp; temp.append("TCP, "+QObject::tr("sender port: %1, receiver port: %2").arg(d->sender).arg(d->receiver) ); return temp; } tcpPacketData::tcpPacketData(const tcpPacketData &u) : QSharedData(u) { sender = u.sender; receiver = u.receiver; sequence = u.sequence; ack = u.ack; flag = u.flag; window = u.window; data = u.data; } QByteArray tcpPacketData::toData() const { QByteArray t; QDataStream s(&t,QIODevice::WriteOnly); s << receiver << sender << sequence << ack << flag << window << data; return t; } netemul-1.0/src/packets/dhcppacket.cpp0000644000175000017500000000523711274363172017147 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "dhcppacket.h" static const QString TYPES_DHCP_MESSAGES[] = { "DHCPDISCOVER" , "DHCPOFFER" , "DHCPREQUEST" , "DHCPACK" , "DHCPDECLINE" }; dhcpPacket::dhcpPacket() { d = new dhcpPacketData; } dhcpPacket::dhcpPacket(const QByteArray &data) { d = new dhcpPacketData; QDataStream s(data); s >> d->xid >> d->type >> d->yiaddr >> d->siaddr >> d->chaddr >> d->mask >> d->gateway >> d->time; } /*! * Выполняет сериализацию. */ QByteArray dhcpPacket::toData() const { return d->toData(); } //----------------------------------------------------------------------------------------- /*! * Преобразует тип пакета в строковое представление. */ QString dhcpPacket::typeString() const { return TYPES_DHCP_MESSAGES[ d->type ]; } //------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------ dhcpPacketData::dhcpPacketData(const dhcpPacketData &other) : QSharedData(other) { xid = other.xid; type = other.type; yiaddr = other.yiaddr; siaddr = other.siaddr; chaddr = other.chaddr; mask = other.mask; gateway = other.gateway; time = other.time; } /*! * Преобразует содержимое в последовательность байт. */ QByteArray dhcpPacketData::toData() const { QByteArray d; QDataStream s(&d, QIODevice::WriteOnly); s << xid << type << yiaddr << siaddr << chaddr << mask << gateway << time; return d; } //------------------------------------------------------------------------------------------- netemul-1.0/src/packets/tcppacket.h0000644000175000017500000000551011254745330016454 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef TCPPACKET_H #define TCPPACKET_H #include #include class tcpPacketData : public QSharedData { public: tcpPacketData() { } tcpPacketData(const tcpPacketData &other); ~tcpPacketData() { } QByteArray toData() const; friend class tcpPacket; private: quint16 sender; //!< Порт отправителя quint16 receiver; //!< Порт получателя quint32 sequence; quint32 ack; quint8 flag; quint16 window; QByteArray data; //!< Поле данных }; /*! Реализует tcp-сегмент */ class tcpPacket { public: enum { User = 7777 , Window = 10240 }; enum { NO_FLAGS = 0, SYN = 1, ACK = 2, FIN = 4, RST = 8 }; tcpPacket() { d = new tcpPacketData; } tcpPacket(const QByteArray &b); tcpPacket(const tcpPacket &other) : d(other.d) { } ~tcpPacket() { } QByteArray toData() const { return d->toData(); } int size() const { return d->data.size(); } void setSender(quint16 s) { d->sender = s; } void setReceiver(quint16 r) { d->receiver = r; } void setSequence(quint32 s) { d->sequence = s; } void setAck(quint32 a) { d->ack = a; } void setFlag(quint8 f) { d->flag = f; } void setWindow(quint16 w) { d->window = w; } quint16 sender() const { return d->sender; } quint16 receiver() const { return d->receiver; } quint32 sequence() const { return d->sequence; } quint32 ack() const { return d->ack; } quint8 flag() const { return d->flag; } quint16 window() const { return d->window; } QByteArray unpack() const { return d->data; } void pack(const QByteArray &b) { d->data = b; } QString toString() const; private: QSharedDataPointer d; protected: friend QDataStream& operator<<( QDataStream &stream, const tcpPacket &p ); }; #endif // TCPPACKET_H netemul-1.0/src/packets/arppacket.h0000644000175000017500000000562211261705352016452 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef ARPPACKET_H #define ARPPACKET_H #include #include "macaddress.h" #include "ipaddress.h" class arpPacketData : public QSharedData { public: arpPacketData() { } arpPacketData(const arpPacketData &other); ~arpPacketData() { } QByteArray toData() const; friend class arpPacket; private: quint8 type; macAddress senderMac; macAddress receiverMac; ipAddress senderIp; ipAddress receiverIp; }; class arpPacket { public: arpPacket(macAddress rm , macAddress sm , ipAddress ri , ipAddress si , quint8 t); arpPacket(const arpPacket &other) : d(other.d) { } arpPacket() { d = new arpPacketData; } arpPacket(const QByteArray &b); QByteArray toData() const; enum { request = 0 , response = 1 }; void setType(int i) { d->type = i; } int type() const { return d->type; } void setSenderMac(macAddress m) { d->senderMac = m; } void setSenderIp(ipAddress a) { d->senderIp = a; } void setReceiverMac(macAddress m) { d->receiverMac = m; } void setReceiverIp(ipAddress a) { d->receiverIp = a; } macAddress senderMac() const { return d->senderMac; } ipAddress senderIp() const { return d->senderIp; } macAddress receiverMac() const { return d->receiverMac; } ipAddress receiverIp() const { return d->receiverIp; } private: QSharedDataPointer d; protected: friend QDataStream& operator<<(QDataStream &stream,const arpPacket &p); }; //------------------------------------------------------------------- /*! Записывает arp-пакет в поток. @param stream - поток для записи. @param p - пакет для записи. @return обновленный поток. */ inline QDataStream& operator<<(QDataStream &stream,const arpPacket &p) { stream << p.toData(); return stream; } //------------------------------------------------------------ #endif // ARPPACKET_H netemul-1.0/src/packets/ippacket.cpp0000644000175000017500000000557611270702635016644 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "ippacket.h" ipPacket::ipPacket(const QByteArray &b) { d = new ipPacketData; QDataStream s(b); s >> d->sender >> d->receiver >> d->upProtocol >> d->data >> d->ttl; } ipPacket::ipPacket(ipAddress s,ipAddress r) { d = new ipPacketData; d->sender = s ; d->receiver = r; d->ttl = 64; } /*! Проверяет является ли пакет широковещательным. @param mask - маска сети, по которой идет проверка. @return - true - широковещательный, false - в противном случае. */ bool ipPacket::isBroadcast(const ipAddress mask) const { ipAddress a = ~mask; if ( ( d->receiver & a ) == a) return true; return false; } //---------------------------------------------------- QByteArray ipPacket::toData() const { return d->toData(); } QString ipPacket::toString() const { QString temp; temp.append(QObject::tr("IP packet, sender: %1, receiver: %2 TTL: %3").arg(d->sender.toString()).arg(d->receiver.toString()).arg(d->ttl)); return temp; } quint16 ipPacket::receiverSocket() const { QDataStream stream(d->data); quint16 t; stream >> t; return t; } quint8 ipPacket::decTtl() { d->ttl--; return d->ttl; } //---------------------------------------------------- //---------------------------------------------------- /*! * Переводит пакет в массив байт. */ QByteArray ipPacketData::toData() const { QByteArray t; QDataStream s(&t,QIODevice::WriteOnly); s << sender << receiver << upProtocol << data << ttl; return t; } /*! * Копирующий конструктор данных. */ ipPacketData::ipPacketData(const ipPacketData &other) : QSharedData(other) { sender = other.sender; receiver = other.receiver; data = other.data; upProtocol = other.upProtocol; ttl = other.ttl; } netemul-1.0/src/packets/udppacket.h0000644000175000017500000000551011254745330016456 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef UDPPACKET_H #define UDPPACKET_H #include #include class udpPacketData : public QSharedData { public: udpPacketData() { } udpPacketData(const udpPacketData &other); ~udpPacketData() { } QByteArray toData() const; friend class udpPacket; private: quint16 sender; //!< Порт отправителя quint16 receiver; //!< Порт получателя QByteArray data; //!< Поле данных }; /*! Реализует udp-дейтаграмму */ class udpPacket { public: enum { User = 7777 , RIP = 520 , DHCPClient = 67, DHCPServer = 68 } ; udpPacket() { d = new udpPacketData; } udpPacket(const QByteArray &b); udpPacket(const udpPacket &u) : d(u.d) { } ~udpPacket() { } QByteArray toData() const; int size() const { return d->data.size(); } void setSender( quint16 i ) { d->sender = i;} void setReceiver( quint16 i ) { d->receiver = i; } quint16 sender() const { return d->sender; } quint16 receiver() const { return d->receiver; } void pack(const QByteArray &b) { d->data = b; } QByteArray unpack() const { return d->data; } QString typeToString() const; QString toString() const; private: QSharedDataPointer d; protected: friend QDataStream& operator<<( QDataStream &stream, const udpPacket &p ); }; //----------------------------------------------------- /*! Записывает udp-дейтаграмму в поток. @param stream - поток для записи. @param p - записываемый пакет. @return ссылку на результирующий поток. */ inline QDataStream& operator<<( QDataStream &stream, const udpPacket &p ) { stream << p.toData(); return stream; } //------------------------------------------------------- #endif // UDPPACKET_H netemul-1.0/src/packets/udppacket.cpp0000644000175000017500000000424211254745330017012 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include "udppacket.h" QByteArray udpPacket::toData() const { return d->toData(); } udpPacket::udpPacket(const QByteArray &b) { d = new udpPacketData; QDataStream s(b); s >> d->receiver >> d->sender >> d->data; } QString udpPacket::typeToString() const { switch ( d->receiver ) { case User: return QObject::tr("UDP Message user"); case RIP: return QObject::tr("RIP"); case DHCPClient: case DHCPServer: return QObject::tr("DHCP message"); default: return QObject::tr("None"); } } QString udpPacket::toString() const { QString temp; temp.append("UDP, "+QObject::tr("sender port: %1, receiver port: %2").arg(d->sender).arg(d->receiver) ); return temp; } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- udpPacketData::udpPacketData(const udpPacketData &u) : QSharedData(u) { sender = u.sender; receiver = u.receiver; data = u.data; } QByteArray udpPacketData::toData() const { QByteArray t; QDataStream s(&t,QIODevice::WriteOnly); s << receiver << sender << data; return t; } netemul-1.0/src/packets/dhcppacket.h0000644000175000017500000000514311274363172016610 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #ifndef DHCPPACKET_H #define DHCPPACKET_H #include #include "ipaddress.h" #include "macaddress.h" class dhcpPacketData : public QSharedData { public: dhcpPacketData() { time = 0; } dhcpPacketData(const dhcpPacketData &other); ~dhcpPacketData() { } QByteArray toData() const; friend class dhcpPacket; private: int xid; int type; int time; ipAddress mask; ipAddress gateway; ipAddress yiaddr; ipAddress siaddr; macAddress chaddr; }; class dhcpPacket { public: dhcpPacket(); dhcpPacket(const QByteArray &data); dhcpPacket(const dhcpPacket &other) : d(other.d) { } ~dhcpPacket() { } QByteArray toData() const; enum { DHCPDISCOVER , DHCPOFFER , DHCPREQUEST , DHCPACK , DHCPDECLINE }; void setYiaddr(ipAddress a) { d->yiaddr = a; } void setSiaddr(ipAddress a) { d->siaddr = a; } void setMask(ipAddress a) { d->mask = a; } void setGateway(ipAddress a) { d->gateway = a; } void setChaddr(macAddress a) { d->chaddr = a; } void setXid(int x) { d->xid = x; } void setType(int t) { d->type = t; } void setTime(int t) { d->time = t; } int type() const { return d->type; } int xid() const { return d->xid; } int time() const { return d->time; } ipAddress yiaddr() const { return d->yiaddr; } ipAddress siaddr() const { return d->siaddr; } ipAddress mask() const { return d->mask; } ipAddress gateway() const { return d->gateway; } macAddress chaddr() const { return d->chaddr; } QString typeString() const; private: QSharedDataPointer d; }; #endif // DHCPPACKET_H netemul-1.0/src/packets/packets.pri0000644000175000017500000000053011254745330016470 0ustar frostfrostSOURCES += src/packets/dhcppacket.cpp\ src/packets/arppacket.cpp\ src/packets/ippacket.cpp\ src/packets/tcppacket.cpp\ src/packets/udppacket.cpp HEADERS += src/packets/dhcppacket.h\ src/packets/arppacket.h\ src/packets/ippacket.h\ src/packets/tcppacket.h\ src/packets/udppacket.h netemul-1.0/src/mycanvas.cpp0000644000175000017500000004104211303325155015212 0ustar frostfrost/**************************************************************************************** ** NetEmul - program for simulating computer networks. ** Copyright © 2009 Semenov Pavel and Omilaeva Anastasia ** ** NetEmul is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** NetEmul is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with the NetEmul; if not, write to the Free ** Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 USA. ****************************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include "mycanvas.h" #include "device.h" #include "cabledev.h" #include "appsetting.h" #include "abstractstate.h" #include "deletecommand.h" #include "addcablecommand.h" #include "scenexmlwriter.h" #include "scenexmlreader.h" /*! Конструктор проводит начальную инициализацию сцены. @param context - Контекстное menu устройств. @param parent - Объект родитель. */ myCanvas::myCanvas(QMenu *context, QObject *parent) : QGraphicsScene(parent) { myItemMenu = context; // меню из аргумента myTimer = 0; myOpen = false; myModified = false; myState = abstractState::initialize(this); commandStack.setUndoLimit(UNDO_LIMIT); } //------------------------------------------------------------------ /*! * Деструктор пока не выполняет ни каких действий. */ myCanvas::~myCanvas() { clear(); myDevices.clear(); myConnections.clear(); myTextItems.clear(); } //------------------------------------------------------------------ /*! * Событие перемещения мыши. * @param event - переменная события */ void myCanvas::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { myState->mouseMove(event); } //---------------------------------------------------------------------- /*! Событие нажатия мыши. @param event - переменная события. */ void myCanvas::mousePressEvent(QGraphicsSceneMouseEvent *event) { if ( event->button() != Qt::LeftButton ) return; myState->mousePress(event); } //----------------------------------------------------------------------- void myCanvas::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { if ( event->button() != Qt::LeftButton ) return; myState->mouseRelease(event); } /*! Создает соединение между устройствами. @param s - Указатель на первое устройство. @param e - Указатель на второе устройство. @param sp - Имя порта первого устройства. @param ep - Имя порта второго устройства. @return указатель на кабель соединяющий устройства. */ cableDev* myCanvas::createConnection(device *s , device *e , QString sp,QString ep) { if ( !s || !e ) return 0; // Если хотя бы одного устройства нет, то выходим. cableDev *cable = new cableDev(s, e, sp , ep ); // Создаем между ними кабель addCableCommand *com = new addCableCommand(this, cable); commandStack.push(com); myModified = true; cable->updatePosition(); return cable; } //------------------------------------------------------------------------- device* myCanvas::addDeviceOnScene(QPointF coor, int myType /* = -1 */) { if ( myType == -1 ) myType = nowType; device *t = new device(myType); t->setPos( calibrate(coor) ); t->setMenu(myItemMenu); addItem(t); myDevices << t; return t; } /*! Функция удаляет со сцены выделенные устройства и провода. */ void myCanvas::removeDevice() { myModified = true; QList list = selectedItems(); // Получаем список выделенных элементов. deleteCommand *com = new deleteCommand(this,list); commandStack.push(com); } //------------------------------------------------------ /*! Открывает новый файл, проводит подготовку внешнего вида сцены. */ void myCanvas::newFile() { if ( myOpen ) return; lastId = 0; setBackgroundBrush(QBrush(QPixmap(":im/images/back.png"))); setSceneRect(0,0,myCanvas::width,myCanvas::height); myState->goMove(); myOpen = true; play(); } //------------------------------------------------- /*! Закрывает файл, очищает сцену, делает фон серым, удаляет все соединения. */ void myCanvas::closeFile() { myState->goEmpty(); commandStack.clear(); clear(); myDevices.clear(); setBackgroundBrush(QBrush(Qt::lightGray)); setSceneRect(0,0,1,1); myConnections.clear(); myTextItems.clear(); if ( myTimer ) stop(); myOpen = false; myModified = false; } //--------------------------------------------------- void myCanvas::setMode(int modScene,int curDev) { myState->goTo(modScene); nowType = curDev; setSelectionArea( QPainterPath() ); } void myCanvas::hideState() { myState->hideState(); } /*! Загружает сцену из файла. @param fileName - имя файла из которого осуществляется загрузка. */ void myCanvas::openScene(QString fileName) { newFile(); QFile file(fileName); if (!file.open(QIODevice::ReadOnly)) { qDebug() << tr("Opening file for reading is impossible"); return; } QDataStream s(&file); s.setVersion(QDataStream::Qt_4_3); QPointF p; QString str; s >> str; if ( str != QCoreApplication::applicationVersion() ) { QMessageBox::critical(NULL,tr("Error"),tr("Outdated version of the file, file can't be opened"), QMessageBox::Ok , QMessageBox::Ok ); emit fileClosed(); return; } QApplication::changeOverrideCursor(Qt::WaitCursor); device *item; int n,i; s >> n; for ( i = 0 ; i < n ; i++ ) { item = new device(s); item->setMenu(myItemMenu); addItem(item); myDevices << item; } s >> n; for ( i = 0 ; i < n ; i++ ) { s >> p; device *start = deviceInPoint(p); s >> p; device *end = deviceInPoint(p); s >> str; QString startP = str; s >> str; QString endP = str; createConnection( start , end , startP , endP ); } s >> n; for ( i = 0 ; i < n ; i++ ) { s >> p; s >> str; createTextItem(p,str); } if ( s.status() != QDataStream::Ok ) qDebug() << "PPC"; file.close(); QApplication::restoreOverrideCursor(); emit fileOpened(); qDebug() << tr("Scene opened from %1").arg(fileName) ; myModified = false; } //----------------------------------------------------------------------- void myCanvas::openSceneXml(QString fileName) { newFile(); QFile file(fileName); if (!file.open(QIODevice::ReadOnly)) { qDebug() << tr("Opening file for reading is impossible"); return; } QApplication::changeOverrideCursor(Qt::WaitCursor); sceneXmlReader s(this); s.readScene(&file); file.close(); QApplication::restoreOverrideCursor(); emit fileOpened(); qDebug() << tr("Scene opened from %1").arg(fileName) ; myModified = false; } /*! Сохраняет сцену в файл. @param fileName - имя файла в который осуществляется сохранение. */ void myCanvas::saveScene(QString fileName) { QFile file(fileName); if (!file.open(QIODevice::WriteOnly)) { qDebug() << tr("Opening file for writing is impossible %1").arg(fileName); return; } QApplication::changeOverrideCursor(Qt::WaitCursor); QDataStream s(&file); s.setVersion(QDataStream::Qt_4_3); s << QCoreApplication::applicationVersion(); s << myDevices.size(); foreach(device *i, myDevices) s << *i; s << myConnections.count(); foreach (cableDev *i, myConnections) { s << i->line().p1() << i->line().p2(); s << i->startSocketName() << i->endSocketName() ; } s << myTextItems.count(); foreach ( textItem *i, myTextItems ) { s << i->pos(); s << i->toPlainText(); } if ( s.status() != QDataStream::Ok ) qDebug() << "PPC"; file.close(); QApplication::restoreOverrideCursor(); qDebug() << tr("Scene saved in %1").arg(fileName) ; myModified = false; } void myCanvas::saveSceneXml(QString fileName) { QFile file(fileName); if (!file.open(QIODevice::WriteOnly)) { qDebug() << tr("Opening file for writing is impossible %1").arg(fileName); return; } QApplication::changeOverrideCursor(Qt::WaitCursor); sceneXmlWriter s(this); s.writeScene(&file); file.close(); QApplication::restoreOverrideCursor(); qDebug() << tr("Scene saved in %1").arg(fileName) ; myModified = false; } //------------------------------------------------------------------------- /*! Событие таймера сцены выполняет очень много функций, так много что необходимо разнести из по разным потокам, но не сейчас. Происходят следующие действия: обновление arp,mac, rip таблиц и сдвиг пакетов на кабелях. */ void myCanvas::timerEvent(QTimerEvent*) { ticTime(); } //-------------------------------------------------------------- void myCanvas::ticTime() { static int n = 9; foreach ( cableDev *t , myConnections) if ( t->isBusy() ) t->motion(); n--; foreach ( device *i, myDevices ) { i->deciSecondTimerEvent(); if ( !n ) i->secondTimerEvent(); } if ( !n ) { n = 9; emit tictac(); } } void myCanvas::emulateTime() { while ( !isEnd() ) ticTime(); } bool myCanvas::isEnd() const { foreach ( cableDev *t , myConnections ) { if ( t->isBusy() ) return false; } foreach ( device *i , myDevices ) if ( i->isBusy() ) { return false; } return true; } device* myCanvas::oneSelectedDevice() { if ( selectedItems().count() == 1 && isDevice( selectedItems().first() ) ) return qgraphicsitem_cast(selectedItems().first()); return NULL; } device* myCanvas::deviceInPoint(QPointF p) { foreach ( QGraphicsItem *i , items(p) ) if ( isDevice(i) ) return qgraphicsitem_cast(i); return 0; } void myCanvas::setShowLabels(bool b) { foreach ( cableDev *i , myConnections ) i->setShowLabel(b); appSetting::setShowLabel(b); } void myCanvas::setShowGrid(bool b) { if (b) setBackgroundBrush(QBrush(QPixmap(":im/images/back.png"))); else setBackgroundBrush(QBrush(Qt::white)); } /*! Выравнивает координаты точки по сетке. @param с - точка подлещашая выравниванию. @return - выровненая точка. */ QPointF myCanvas::calibrate(QPointF c) { c.setX( (qRound(c.x()) / 50)*50+25 ); c.setY( (qRound(c.y()) / 50)*50+25 ); return c; } //-------------------------------------------------------------------- /*! Происходит при потере текстовой надписью фокуса, служит для уничтожения надписи, в случае если она пуста. @param t - указатель на надпись. */ void myCanvas::editorLostFocus(textItem *t) { QTextCursor cursor = t->textCursor(); cursor.clearSelection(); t->setTextCursor(cursor); t->adjustSize(); if ( t->toPlainText().isEmpty()) { removeItem(t); myTextItems.removeOne(t); t->deleteLater(); } } //-------------------------------------------------------------------- /*! Создает на сцене новый комментарий. @return указатель на созданный комментарий. */ textItem* myCanvas::createTextItem(QPointF p , const QString &str /*=tr("Комментарий")*/) { textItem *t = new textItem(p); t->setPlainText(str); t->adjustSize(); connect(t,SIGNAL(lostFocus(textItem*)),SLOT(editorLostFocus(textItem*))); addItem(t); myTextItems << t; return t; } //-------------------------------------------------------------------- /*! Проверяет устройство ли данный объект или нет. @return true если устройство, false в противном случае. */ bool myCanvas::isDevice(QGraphicsItem *t) const { if ( t->type() == device::Type ) return true; return false; } //------------------------------------------------------------------------ deviceImpl* myCanvas::addComputer(int x,int y) { device *t = addDeviceOnScene(QPointF(x*50+25,y*50+25) , compDev); return t->contentDevice(); } deviceImpl* myCanvas::addRouter(int x,int y) { device *t = addDeviceOnScene(QPointF(x*50+25,y*50+25) , routerDev); return t->contentDevice(); } deviceImpl* myCanvas::addHub(int x,int y) { device *t = addDeviceOnScene(QPointF(x*50+25,y*50+25) , hubDev); return t->contentDevice(); } deviceImpl* myCanvas::addSwitch(int x,int y) { device *t = addDeviceOnScene(QPointF(x*50+25,y*50+25) , switchDev); return t->contentDevice(); } textItem* myCanvas::addNote(int x, int y) { QPointF p( x*50 , y*50 ); return createTextItem(p); } void myCanvas::addConnection(deviceImpl *s,deviceImpl *e, const QString &sp,const QString &se) { device *st = deviceWithImpl(s); device *et = deviceWithImpl(e); createConnection(st,et,sp,se); } device* myCanvas::deviceWithImpl(deviceImpl *d) { foreach ( device *i , myDevices ) if ( i->contentDevice() == d ) return i; return 0; } int myCanvas::animateSpeed() const { return appSetting::animateSpeed(); } void myCanvas::setAnimateSpeed(int n) { if (!myTimer ) return; killTimer(myTimer); appSetting::setAnimateSpeed(n); myTimer = startTimer(appSetting::realAnimateSpeed()); } void myCanvas::play() { myTimer = startTimer( appSetting::realAnimateSpeed() ); } QObjectList myCanvas::computerList() { QObjectList temp; foreach ( device *i , myDevices ) if ( i->isCanSend() ) temp << i->contentDevice(); return temp; } void myCanvas::closeScene() { emit fileClosed(); } void myCanvas::newScene() { emit fileOpened(); } void myCanvas::turnToMove() { myState->goMove(); emit uncheck(); } void myCanvas::putItems(QMap map) { QMapIterator i(map); i.toFront(); while ( i.hasNext() ) { i.next(); QGraphicsItem *curDevice = i.key(); QPointF curPoint = i.value(); curDevice->setPos( curPoint ); if ( isDevice( curDevice ) ) { device *d = qgraphicsitem_cast(curDevice); d->updateCables(); } } calibrateAll( map.keys() ); myModified = true; } void myCanvas::calibrateAll(QList list) { foreach ( QGraphicsItem *i , list ) if ( i->type() != textItem::Type ) i->setPos( calibrate( i->pos() ) ); } void myCanvas::registerDevice(device *dev) { addItem(dev); myDevices << dev; } void myCanvas::unregisterDevice(device *dev) { removeItem(dev); myDevices.removeOne(dev); } void myCanvas::registerCable(cableDev *cable) { addItem(cable); // И добавляем его на сцену =) myConnections << cable; } void myCanvas::unregisterCable(cableDev *cable) { removeItem(cable); myConnections.removeOne(cable); } void myCanvas::registerText(textItem *t) { addItem(t); myTextItems << t; } void myCanvas::unregisterText(textItem *t) { removeItem(t); myTextItems.removeOne(t); } netemul-1.0/copyright0000644000175000017500000000143611245346241014040 0ustar frostfrostNetEmul - program for simulating computer networks. Copyright © 2009 Semenov Pavel and Omilaeva Anastasia NetEmul is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. NetEmul is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the NetEmul; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. netemul-1.0/test/0000755000175000017500000000000011305026146013054 5ustar frostfrostnetemul-1.0/test/ripprogramm/0000755000175000017500000000000011305026146015413 5ustar frostfrostnetemul-1.0/test/boxchip/0000755000175000017500000000000011305026146014510 5ustar frostfrostnetemul-1.0/test/boxchip/deviceport.h0000644000175000017500000000116211253161366017033 0ustar frostfrost#ifndef DEVICEPORT_H #define DEVICEPORT_H class frame; class cableDev; class devicePort { public: devicePort(); devicePort(int) { } void setNum(int) { } bool isBusy() const { return false; } bool isConnect() { return false; } bool isCableConnect(const cableDev*) { return true; } void setConnect(bool,cableDev*) { } void pushToSend(frame&) { } void queueEvent() { } bool hasReceive() { return false; } void setShared(bool) const { } bool isCableBusy() const { return false; } void setChecked(bool) { } int trafficDigit() const { return 0; } }; #endif // DEVICEPORT_H netemul-1.0/test/boxchip/main.cpp0000644000175000017500000000064111232623611016140 0ustar frostfrost#include #include "../../src/chips/hubchip.h" class TestHubChip : public QObject { Q_OBJECT private slots: void setSocketsCount(); }; void TestHubChip::setSocketsCount() { hubChip b(4); QCOMPARE(b.socketsCount() , 4); b.setSocketsCount(2); QCOMPARE(b.socketsCount() , 2); b.setSocketsCount(12); QCOMPARE(b.socketsCount() , 12); } QTEST_MAIN(TestHubChip) #include "main.moc" netemul-1.0/test/boxchip/deviceport.cpp0000644000175000017500000000006611233076350017364 0ustar frostfrost#include "deviceport.h" devicePort::devicePort() { } netemul-1.0/test/boxchip/boxchip.pro0000644000175000017500000000137211263441241016671 0ustar frostfrost# ------------------------------------------------- # Project created by QtCreator 2009-07-18T22:25:27 # ------------------------------------------------- QT += testlib QT -= gui TARGET = boxchip CONFIG += console INCLUDEPATH += ../../src \ ../../src/tools TEMPLATE = app SOURCES += main.cpp \ ../../src/chips/boxchip.cpp \ ../../src/chips/hubchip.cpp \ ../../src/tools/statistics.cpp \ ../../src/chips/abstractchip.cpp \ deviceport.cpp \ ../../src/macaddress.cpp \ ../../src/ipaddress.cpp HEADERS += ../../src/chips/boxchip.h \ ../../src/chips/hubchip.h \ ../../src/tools/statistics.h \ ../../src/chips/abstractchip.h \ deviceport.h \ ../../src/macaddress.h \ ../../src/ipaddress.h DEFINES += __TESTING__ netemul-1.0/test/test.pro0000644000175000017500000000062111263441241014554 0ustar frostfrost###################################################################### # Automatically generated by qmake (2.01a) Sun Jun 28 01:51:25 2009 ###################################################################### SOURCES += ../src/macaddress.cpp HEADERS += ../src/macaddress.h DEFINES += __TESTING__ TEMPLATE = subdirs SUBDIRS = mac \ ippacket \ ipaddress \ frame \ boxchip \ routemodel # Input netemul-1.0/test/ipaddress/0000755000175000017500000000000011305026146015032 5ustar frostfrostnetemul-1.0/test/ipaddress/main.cpp0000644000175000017500000000415111270702635016470 0ustar frostfrost#include #include "../../src/ipaddress.h" class TestIpAddress : public QObject { Q_OBJECT private slots: void saveAndLoad(); void operators(); void toInt(); void isEmpty(); void toIp(); }; void TestIpAddress::saveAndLoad() { ipAddress ip; ip.setIp("192.168.1.1"); ipAddress t = ip; QFile f("test4"); if ( f.open(QIODevice::WriteOnly) ) { QDataStream s(&f); s.setVersion(QDataStream::Qt_4_3); s << t; f.close(); } t.setIp("255.255.255.255"); if ( f.open(QIODevice::ReadOnly) ) { QDataStream s(&f); s.setVersion(QDataStream::Qt_4_3); s >> t; f.close(); } QCOMPARE( t , ip ); } void TestIpAddress::operators() { ipAddress ipA; ipA.setIp("255.255.255.255"); QCOMPARE( ~ipA == ipAddress("0.0.0.0") , true ); ipA.setIp("128.0.0.5"); QCOMPARE( ~ipA == ipAddress("127.255.255.250") , true ); ipA.setIp("192.168.1.1"); ipAddress ipB("255.255.255.192"); ipAddress ipC("192..168.1.65"); QCOMPARE( (ipA & ipB) != (ipB & ipC), true); ipC.setIp("192.168.1.2"); QCOMPARE( (ipA & ipB) == (ipB & ipC), true); ipA = ipAddress::full(); QCOMPARE( ipA == ipAddress("255.255.255.255"),true); } void TestIpAddress::toInt() { ipAddress ipA("255.255.255.255"); ipAddress ipB("192.168.1.2"); ipAddress ipC("0.0.0.0"); quint32 v1 = ipA.toInt(); quint32 v2 = ipB.toInt(); quint32 v3 = ipC.toInt(); QCOMPARE( v1, 4294967295U ); QCOMPARE( v2, 3232235778U ); QCOMPARE( v3, 0U ); } void TestIpAddress::isEmpty() { ipAddress a("1.0.0.0"); QCOMPARE( a.isEmpty() , false ); a.setIp("0.0.0.0"); QCOMPARE( a.isEmpty() , true ); } void TestIpAddress::toIp() { ipAddress address("192.168.1.1"); quint32 intIp = address.toInt(); QCOMPARE( ipAddress(intIp) , address ); address.setIp("0.0.0.0"); intIp = address.toInt(); QCOMPARE( ipAddress(intIp) , address ); address.setIp("255.255.255.255"); intIp = address.toInt(); QCOMPARE( ipAddress(intIp) , address ); } QTEST_MAIN(TestIpAddress) #include "main.moc" netemul-1.0/test/ipaddress/ipaddress.pro0000644000175000017500000000053311270702635017540 0ustar frostfrost#------------------------------------------------- # # Project created by QtCreator 2009-06-28T11:29:53 # #------------------------------------------------- QT += testlib QT -= gui TARGET = ipaddress CONFIG += console CONFIG -= app_bundle TEMPLATE = app SOURCES += main.cpp \ ../../src/ipaddress.cpp HEADERS += ../../src/ipaddress.h netemul-1.0/test/README.txt0000644000175000017500000000336111221755440014560 0ustar frostfrost******************************************* * ТЕСТИРОВАНИЕ * ******************************************* Если вдруг вы вносите какие либо изменения, значит вы должны подвергнуть систему тестированию, что бы узнать, не оказались ли ваши изменения причиной ошибок. Приемочное тестирование создающее сети и тестирующее их можно запускать в пункте меню тестирование самой программы. Если вы написали приемочный тест сами, то необходимо положить его в папку test и указать расширение *.js. Теситрование модулей осуществляеться с помощью нескольких программ, которые вложенны в папку test. Что провести тестирование сразу всех необходимо: 1) В папке test выполнить комманду qmake, затем make, что бы пересобрать программы в тестируемом коде которых произошли изменения. 2) Запустить программы ./pusk которая пройдет по все папкам и запусит все тесты. 3) Если произошла ошибка и нужна более детальная информация, зайдите в папку с программой которая выполнила неудавшийся тест и запустите её без параметров. Пока всё. netemul-1.0/test/frame/0000755000175000017500000000000011305026146014146 5ustar frostfrostnetemul-1.0/test/frame/frame.pro0000644000175000017500000000111611262222661015763 0ustar frostfrostINCLUDEPATH += ../../src/packets \ ../../src SOURCES += main.cpp \ ../../src/frame.cpp \ ../../src/macaddress.cpp \ ../../src/packets/ippacket.cpp \ ../../src/ipaddress.cpp \ ../../src/packets/arppacket.cpp \ ../../src/packets/udppacket.cpp \ ../../src/packets/tcppacket.cpp HEADERS += ../../src/frame.h \ ../../src/macaddress.h \ ../../src/packets/ippacket.h \ ../../src/ipaddress.h \ ../../src/packets/arppacket.h \ ../../src/packets/udppacket.h \ ../../src/packets/tcppacket.h TARGET = frame TEMPLATE = app QT += testlib QT -= gui netemul-1.0/test/frame/main.cpp0000644000175000017500000000270311263441241015600 0ustar frostfrost#include "frame.h" #include "arppacket.h" #include "ippacket.h" #include class TestFrame : public QObject { Q_OBJECT private slots: void saveLoadArp(); void saveLoadIp(); void creatingCopy(); private: frame arpFrame; frame ipFrame; }; void TestFrame::saveLoadArp() { arpPacket p; p.setType(arpPacket::response); p.setReceiverIp(ipAddress("1.2.3.4")); p.setReceiverMac(macAddress("10:01:10:01:10:01")); p.setSenderIp(ipAddress("4.3.2.1")); p.setSenderMac(macAddress("00:11:22:33:44:55")); arpFrame.pack(p.toData()); arpPacket a(arpFrame.unpack() ); QCOMPARE( p.type() , a.type() ); QCOMPARE( p.receiverIp() , a.receiverIp() ); QCOMPARE( p.receiverMac() ,a.receiverMac() ); QCOMPARE( p.senderIp() , a.senderIp() ); QCOMPARE( p.senderMac() , a.senderMac() ); } void TestFrame::saveLoadIp() { ipPacket p; p.setSender(ipAddress("1.2.3.4")); p.setReceiver(ipAddress("4.3.2.1")); p.setUpProtocol(ipPacket::tcp); ipFrame.pack( p.toData() ); ipPacket a( ipFrame.unpack() ); QCOMPARE( p.sender() , a.sender() ); QCOMPARE( p.receiver() , a.receiver() ); QCOMPARE( p.upProtocol() , a.upProtocol() ); } void TestFrame::creatingCopy() { arpFrame.setSender(tr("09:09:09:09:09:09")); ipFrame.setSender( arpFrame.sender() ); frame a = arpFrame; frame b = ipFrame; QCOMPARE( a.sender() , b.sender() ); } QTEST_MAIN(TestFrame) #include "main.moc" netemul-1.0/test/mac/0000755000175000017500000000000011305026146013614 5ustar frostfrostnetemul-1.0/test/mac/mac.pro0000644000175000017500000000061011235262047015077 0ustar frostfrost# ------------------------------------------------- # Project created by QtCreator 2009-06-28T00:44:43 # ------------------------------------------------- include(../testing.pri) QT += testlib QT -= gui TARGET = mac CONFIG += console CONFIG -= app_bundle TEMPLATE = app # HEADERS += ../../src/macaddress.h SOURCES += main.cpp \ ../../src/macaddress.cpp HEADERS += ../../src/macaddress.h netemul-1.0/test/mac/main.cpp0000644000175000017500000000242411230647173015254 0ustar frostfrost#include #include "../../src/macaddress.h" class TestMacAddress : public QObject { Q_OBJECT private slots: void toString(); void setBroadcast(); void saveAndLoad(); void operators(); }; void TestMacAddress::toString() { macAddress m; m.setMac("01:03:00:00:00:00"); QCOMPARE(m.toString(), tr("01:03:00:00:00:00")); } void TestMacAddress::setBroadcast() { macAddress m; m.setBroadcast(); QCOMPARE( m.toString() , tr("FF:FF:FF:FF:FF:FF")); QCOMPARE( m.isBroadcast() , true ); } void TestMacAddress::saveAndLoad() { macAddress m("01:02:03:04:05:06"); macAddress t = m; QFile f("test3"); if ( f.open(QIODevice::WriteOnly) ) { QDataStream s(&f); s.setVersion(QDataStream::Qt_4_3); s << t; f.close(); } t.setRandom(); if ( f.open(QIODevice::ReadOnly) ) { QDataStream s(&f); s.setVersion(QDataStream::Qt_4_3); s >> t; f.close(); } QCOMPARE( t , m); } void TestMacAddress::operators() { macAddress a("01:02:03:04:05:06"); macAddress b("01:02:03:04:05:07"); QCOMPARE( a < b , true ); QCOMPARE( a >= b , false ); QCOMPARE( a++ == b++ , false ); QCOMPARE( ++a == b , true ); } QTEST_MAIN(TestMacAddress) #include "main.moc" netemul-1.0/test/routemodel/0000755000175000017500000000000011305026146015233 5ustar frostfrostnetemul-1.0/test/routemodel/routemodel.pro0000644000175000017500000000070111236232557020142 0ustar frostfrost# ------------------------------------------------- # Project created by QtCreator 2009-08-04T16:11:22 # ------------------------------------------------- QT -= gui QT += testlib TARGET = routemodel CONFIG += console INCLUDEPATH += ../../src/models \ ../../src TEMPLATE = app SOURCES += main.cpp \ ../../src/models/routemodel.cpp \ ../../src/ipaddress.cpp HEADERS += ../../src/models/routemodel.h \ ../../src/ipaddress.h netemul-1.0/test/routemodel/main.cpp0000644000175000017500000000235711236526074016702 0ustar frostfrost#include #include "routemodel.h" class TestRouteModel : public QObject { Q_OBJECT private slots: void initTestCase(); void mainTest(); void changedRecord(); void deleteOldRecord(); void cleanupTestCase(); private: routeModel *table; }; void TestRouteModel::initTestCase() { table = new routeModel(this); for ( int i = 0 ; i < 5 ; i++ ) table->addToTable(tr("192.168.1.%1").arg(i) ,tr("255.255.255.255"), tr("192.168.1.2"),tr("192.168.1.60"), 2, routeModel::ripMode); } void TestRouteModel::mainTest() { QCOMPARE( table->rowCount() , 5 ); } void TestRouteModel::changedRecord() { routeRecord *t = table->recordAt(tr("192.168.1.0")); if ( t ) t->change = routeModel::changed; t = table->changedRecord(); QCOMPARE( t->change , (quint8)routeModel::changed ); table->deleteFromTable(t); t = table->changedRecord(); if ( t ) QCOMPARE( t->change , (quint8)routeModel::changed); } void TestRouteModel::deleteOldRecord() { routeRecord *t = table->recordAt(tr("192.168.1.1")); t->time = 6; table->deleteOldRecord(6); QCOMPARE( table->rowCount() , 3 ); } void TestRouteModel::cleanupTestCase() { } QTEST_MAIN(TestRouteModel) #include "main.moc" netemul-1.0/test/pusk0000755000175000017500000000013611221522477013771 0ustar frostfrost#!/bin/bash for i in $( ls ) do if [ -d $i ] then cd $i ./$i -silent cd .. fi done netemul-1.0/test/ippacket/0000755000175000017500000000000011305026146014654 5ustar frostfrostnetemul-1.0/test/ippacket/ippacket.pro0000644000175000017500000000107211262222661017200 0ustar frostfrost# ------------------------------------------------- # Project created by QtCreator 2009-06-28T01:50:47 # ------------------------------------------------- QT += testlib TARGET = ippacket CONFIG += console TEMPLATE = app INCLUDEPATH += ../../src/packets \ ../../src SOURCES += main.cpp \ ../../src/packets/ippacket.cpp \ ../../src/ipaddress.cpp \ ../../src/packets/udppacket.cpp \ ../../src/packets/tcppacket.cpp HEADERS += ../../src/packets/ippacket.h \ ../../src/ipaddress.h \ ../../src/packets/udppacket.h \ ../../src/packets/tcppacket.h netemul-1.0/test/ippacket/main.cpp0000644000175000017500000000320411262222661016305 0ustar frostfrost#include #include "ippacket.h" #include "ipaddress.h" #include "tcppacket.h" #include "udppacket.h" /*! Тестирует класс ipPacket */ class TestIpPacket : public QObject { Q_OBJECT private slots: void setBroadcast(); void saveLoadTcp(); void saveLoadUdp(); private: ipPacket tcpIp; ipPacket udpIp; }; //--------------------------------------- /*! Тестирует setBroadcast & isBroadcast */ void TestIpPacket::setBroadcast() { ipPacket p; p.setReceiver(ipAddress("192.168.1.13")); QCOMPARE(p.isBroadcast("255.255.0.0") , false ); p.setSender(ipAddress("192.168.1.2")); p.setBroadcast("255.255.255.224"); QCOMPARE( p.isBroadcast("255.255.255.224") , true ); p.setSender(ipAddress("192.168.1.255")); p.setBroadcast("255.255.255.0"); QCOMPARE( p.isBroadcast("255.255.255.0") , true); ipPacket a = p; ipPacket b = p; QCOMPARE( a.sender() , b.sender() ); } //------------------------------------------ void TestIpPacket::saveLoadTcp() { tcpPacket *p = new tcpPacket; p->setSender(1024); p->setReceiver(512); tcpIp.pack(p->toData()); delete p; p = new tcpPacket( tcpIp.unpack() ); QCOMPARE( p->sender() , quint16(1024) ); QCOMPARE( p->receiver() ,quint16( 512 )); delete p; } void TestIpPacket::saveLoadUdp() { udpPacket *p = new udpPacket; p->setSender(1024); p->setReceiver(512); udpIp.pack( p->toData() ); delete p; p = new udpPacket( udpIp.unpack() ); QCOMPARE( p->sender() , quint16(1024) ); QCOMPARE( p->receiver() , quint16(512) ); delete p; } QTEST_MAIN(TestIpPacket) #include "main.moc" netemul-1.0/doc/0000755000175000017500000000000011305026146012642 5ustar frostfrostnetemul-1.0/doc/ru/0000755000175000017500000000000011305026147013271 5ustar frostfrostnetemul-1.0/doc/ru/switch.html0000644000175000017500000000761311250530163015464 0ustar frostfrost Коммутатор
Руководство NetEmul
Пред. След.

Коммутатор

Сетевой коммутатор или свитч — устройство, предназначенное для соединения нескольких узлов компьютерной сети в пределах одного сегмента. В отличие от концентратора, который распространяет трафик от одного подключенного устройства ко всем остальным, коммутатор передает данные только непосредственно получателю. Это повышает производительность и безопасность сети, избавляя остальные сегменты сети от необходимости (и возможности) обрабатывать данные, которые им не предназначались.

Принцип работы.

Коммутатор хранит в памяти таблицу, в которой указывается соответствие MAC-адреса узла порту коммутатора. При включении коммутатора эта таблица пуста, и он работает в режиме обучения. В этом режиме поступающие на какой-либо порт данные передаются на все остальные порты коммутатора. При этом коммутатор анализирует кадры и, определив MAC-адрес хоста-отправителя, заносит его в таблицу. Впоследствии, если на один из портов коммутатора поступит кадр, предназначенный для хоста, MAC-адрес которого уже есть в таблице, то этот кадр будет передан только через порт, указанный в таблице. Если MAC-адрес хоста-получателя еще не известен, то кадр будет продублирован на все интерфейсы. Со временем коммутатор строит полную таблицу для всех своих портов, и в результате трафик локализуется.

Такой вид имеет коммутатор в нашей программе. Он выполняет все функции, описанные выше.
У устройства есть возможность посмотреть таблицу коммутации.


Пред. Начало След.
Концентратор На уровень выше Маршрутизатор
netemul-1.0/doc/ru/device.html0000644000175000017500000000355111250530163015417 0ustar frostfrost Сетевой адаптер
Руководство NetEmul
Пред. След.

Сетевые устройства

Компьютер
Концентратор
Коммутатор
Маршрутизатор
В нашей программе используются следующие устройства: компьютеры, концентраторы, коммутаторы, маршрутизаторы. В следующих подразделах Вы можете ознакомиться с ними подробнее.
Пред. Начало След.
Основные понятия На уровень выше Компьютер
netemul-1.0/doc/ru/send.html0000644000175000017500000001221411277100130015101 0ustar frostfrost
Руководство NetEmul
Пред.

Отправка пакетов.

В предыдущем разделе мы настроили сеть. И сейчас можем посмотреть насколько правильно она функционирует, увидеть работу различных сетевых устройств и поэксперементировать с сетью.

Для того, чтобы отправить пакеты, выберите на панели инструментов значок

При наведении мыши на рабочую область Вы увидите оранжевый кружок, это значит, что надо указать от какого компьютера данные будут отправлены. Мы пошлем данные от этого компьютера:

Щелкните на выбранном компьютере (остальные устройства могут отправлять только служебную информацию без участия пользователя). У Вас появилось диалоговое окно отправки данных

Здесь мы не будем ничего менять, оставим предложенные параметры. Вы уже можете начинать экспереметировать и выставить свои значения. Затем нажимаем кноку Далее. Теперь появился зеленые кружок, т.е. Вам надо выбрать получателя.

Опять щелкаем по выбранному компьютеру. Появляется диалог.

В этом диалоговом окне нужно указать интерфейс, на который будут отправляться данные. Так как у данного компьютера один адаптер, то на него мы и отправим пакеты. Далее нажимаем кнопку Отправка и наслаждаемся видом бегущих кадров.

Как Вы заметили, прежде чем побежали эти красные пакеты, компьютеры отправили еще что-то. С тем, что же отправили компьютеры, а точнее, какую информацию содержали кадры, разработчики предлагают разобраться самостоятельно.
Но мы можем дать подсказку... У каждого устройства в контекстном меню есть пункт "Показать журнал", можно открыть этот журнал и увидеть всю необходимую информацию о пакете, пришедшем (или отправленном), и его содержимое.
Теперь Вы обладаете достаточной информацией, чтобы самостоятельно ответить на поставленный вопрос. А для получения дополнительной информации можете обратиться к учебникам.

Здесь очень кратко и сжато мы объяснили все необходимое для дальнейшей работы с программой. Обладая этими данными и толикой любознательности (или любопытства) можно продолжить изучение как возможностей программы, так и дисциплин, связанных с компьютерными сетями.

Желаем успехов!
Коллектив разработчиков.


Пред. Начало
На уровень выше
netemul-1.0/doc/ru/howto.html0000644000175000017500000000660011254065431015323 0ustar frostfrost Руководство пользователя
Руководство NetEmul
Пред. След.

Глава 3. Руководство пользователя

Содержание
Интерфейс программы
Построение сети
Настройка сети
Отправка пакетов

Интерфейс программы

Все элементы размещаются на рабочей области (далее сцена). Устройства размещены на панели устройств.

Так выглядит главное окно программы. На всей свободной области сцены, размеченной сеткой можно ставить устройства, при этом они не должны пересекаться. На панели устройств размещены все необходимые для построения сети инструменты, а так же кнопка отправки сообщений и start/stop. Для Вашего удобства, при наведении на инструмент, в строке состояния появляется подсказака. На соседней панели (панель параметров) расположены свойства объектов. Для выделенного объекта появляются только те свойства, которые характерны для него.
Панели можно переместить в удобное для Вас место или вовсе убрать.
Это был очень краткий обзор,а для того, чтобы лучше разобраться с интерфейсом программы стоит посмотреть пункты меню и все настройки.
Более конкретное описание определенных действий можно найти далее, в соответствующих разделах.


Пред. Начало След.
Ip-адресация На уровень выше Построение сети
netemul-1.0/doc/ru/comp.html0000644000175000017500000000400411252512512015110 0ustar frostfrost Компьютер
Руководство NetEmul
Пред. След.

Компьютер

Так выглядит компьютер в программе. Мы думаем никому не надо объяснять назначение этого устройства в реальной жизни. В нашей программе оно выполняет ограниченный набор функции, а именно производит отправку сообщений от одного компьютера к другому, а так же имеется возможность устанавливать определенные программы, связанные с работой сети, и просматривать arp-таблицы и маршрутизации


Пред. Начало След.
Сетевые устройства На уровень выше Концентратор
netemul-1.0/doc/ru/img/0000755000175000017500000000000011305026147014045 5ustar frostfrostnetemul-1.0/doc/ru/img/net2.jpeg0000644000175000017500000016416511303253545015603 0ustar frostfrostPNG  IHDRb!KsBITOtEXtSoftwaregnome-screenshot> IDATxw|ǟmO˲-7\pi6$K /H%/!@J `Jh&mpVNy8IV9udfͳs3=w5 @ u[ھD_S4UeHh@ !agM>actgsx)gLdh@#*U @㡪iN`?:8gΜ2~'D@ ^l Տ}tJJJ,)^Eơ1@Ќ6gqn!wđ).d7YZ봱W)P33>#K o\ s{\gǪsU 9aa"asi21+Ν0A7U䋚;atWVպwe1ͣ] %&Q{rsOVDwZIeU) ~RsN(WfMBfMM\} ߿zT o*ֲrO巹jM7DMxc/et@_s߮'ڍ3kv-O6M4~waVId|e6x{YtP*mkjobjȼMRy3{S5 K^W\kv%8}~վ:MnuBܘolv7nhQoiц̖eR.o{9U;9:n췔HWtr<W~5>!Prg wq sxc\P:2alVڸQv[uiӆn "hE:a =} ļ?Nqk7u3w>ueeIQ8*tE2Ơy)BL;y`<X`Lq8W4yz>Q^Rܺ38VO0U-ܴ SHU/[\=qH6sq0񒋦ZU>e闼Z 9W!5f%߹%3哇gEr^2P⹳Ͼd>~zMSQbxVs_vԼcG]$ Pq@w\yŵW\xqSƮ]~Ι3oCYS&vrBg>3n]O9ͮN/fuX1;5#X(ט_pBN0=?_~PZr}On{ڼ7uwtJH;uv]0sZp=^1>bva{قnzfLsŁu7^:32@?ojKSӕ2v|4=YjƝ[K\_ dG`S9Lʂ%&}㒴CBxWnSP%GOAI:L(t;,=ugQUmtg̤sW`HjQ6/j3u԰a)ŷ5W{ 1Юj  j ܁X5$KkV!na&Afl2nz4h7*ܪɒgD~gF(G$vJd&'iINK41b85يR.|}?s#G;)gI7(JҲ5a;kN\''D2Zí'1eK w]3 }K8r B:*';rf,֎hvړ~ m~-/> ,VKVȰJUL'e\NV!Сn^Y5-qҭ]1η}c]c}^!NIzhIYM-5AmZtJ-5!a,"'c rAWݠ̤<Gu6eǝ=j[˘ۚj^Y!,TWw~0"b.ৃ54}m!5vo@RAZ R`‚S2~XN{x070Fm;Me`B2HKA rSg bdhwr%łypG=O83]+?z䳗<Ս掶akMPPwN@[-RRcꗸa5C`|*p諫;_@҈WO>+[)YǷo#-d w.?G[zͳvk'H2;n!\RSn`w?zCJڎwv:ެ2GbsSJ6Wථu:r}ⶩNcߟyiKͅcݣ @p4ӹߖwS>;5ԅ~TYM΂{vL,)ԅFM[E3CKp$i몖@p!Ϛen{x_R$>D@mzdٶ9ϬYV^kJ@kO~(ڦ wYu'&.|{͔M;!a1ڎ?!ᤓm(:~<;B]{Y1Tَ \.U\)&P" *k`Z:·+ J?u;'iW91/?dGwEjl vc)޴;rlK-K>]rv ͞ݶp]3bWg"tib}3g3_O}ųOW|{\ԵWw{%s]o|ÕM(1^W/|QJrƁ]uqlK'6D3tKߺCW]Z 8A1~tZ?F_LEzTiqBnNh8}Tu (TY!pEu]D79n6xvJW&cm>XIH,uV~wxBV5R.aթC]Ak?_zO5w 3*xg V {8B]ݺrm~(qqOR8>%92jk]YqpiƆ@:4]=7{VžN~FVeKKoFȽ}˜_X^ І!==ɝR$hNY8*)  %沨qn%ɯM8u[?:BnK(!oYԸxIYK{1&GXT3Tg\f)k ;`rr3i'ktt z 7L-O[;``3jN| 51n(8T39əi4S0(X]$8^ܛΖ5yvxs_QiħS$oUN{iߝ [-5^ UD8dwT4&E~YE]i{JM:w6{'|<2;pB`C}vغ2E(S^M:9h)J7cY?|QdI)!HKOItR8`d&gIV3[R\JZf+o4LCŝf5(@caCt6̖W-A ּJ@r&&8(!l]RAL&E!,VÝLN}}p~5Uհ$ꢰ{1lq`-`0+6+9 EuV}k@vÕD@Գ~m\8.Yu)Ų'7u<18ƚ:;G_9a4V2۬H瀱!IJqZmԝpW:5,K CtΚ`u{ GXS5rXMcw0ռe+U}ﲫ0RߦTv׹z%;=,6^^Q Yu ]㝎I[^:o]V{1; ќ K^Zٱm-Gʹm55^:sUg1xsvԬYZVk5SlqEmٗT[ݩ+ڝ6]q0@pLnF`F_G-+8;J|B*8A%GQҊDKF т#)H )TN=+kjqTk;eǞ͌ MrA;2mr G9tt{IMt%Jz@ ArB;r6 eO@ hM:uZ#@ o)ɫm*#EFB l(7w.p @  -& @ b % i f\H G& @ b D@ A D(GZ@ #̏&=xѥ/vpE+VT`M W.{(O࿙~-a lWnS+oͽ7aiɳ瘱efَgS~q(1;/l Qɖ;jx ͺ!SN7<-mWy@I{:Y~ E>5}ܵq-P /a"7kֽZGng.PSɼ/xx Bc| Q-ivoNyjܶ/13Ǥ]+-sBY-5h1*@@ h/ ~'Kl/ vܙ3fzɢn7ͿiKhòߜ1䖗7<֝B`M^sf=皇?+DcE-gOʎ`-.{Y|o_jvҸ˟p5߾zo *yZiشiS*PS<~fb~ʊM-މ;B k]8;~9W{:|ܵs֩K˘~E7/te]|n}-WfO+jΚש^گ:po/_c bvtC'Gg 7+>~whNv w947S_^޲'-׻^=VSj_}ͭPƆ~Pp{KCcԞ0ѻ??7~YfILqOeӲ]$2Oꆔ*CEwOϹZB iks] &$jZ℅w.PVRYdsqytoo~w 4׊zkgo-ݪvm#,J6@֓}#\:һLLԴĉ \4 -lg=o]xAS@ !z=7Qu53&Й }֑.oۻO?*o05-P=soZ 9QJv%5:9alnE7x4@Jʜ;=ax[ RO=-ٴ}ߗ0=V,_44wa 0VΗ߯ݰiZ6L-^(#5[| i݆'?_PͶI݊f6gʁSӏD /bun4w7Ns}{]B` 2~Lހ g]=g-v 7UzpH +9G_%kY/oy᳒eH9Vɨ_j#~}4whb?:}F/x])3n2ݟ<>!nEFAIc9‰7*c_ _Pw_`Jܥ&&~_0#ƒ=F3%#^?H83|e,idlK,m4(&Zd{v:߱rm;vޱ}Ê/?hij.<*~~]-PfrNoK}r_2ti?s}ߤ?,~='Z-t81oɹx.YwDL_WJ6`]ko0:<>C.ɏv6FΏ 2VKIWO1qK]^rZ$%3W;MxS Iοpum[tof `oo}2Wn6Ҝ \Lu 2ڽ6Is=4 ph$'_{W.-'²5y+:G0b o~ߟ=n<~ܠNv_>4Z9p]O?zEigEcNOz?*-3;)Ѣn@ WN1mպU{ f r:7 ]gJZJMzj+fs-i. $⫫nl` t {kj&$ӓQ=mL O+.O3@wc`蝮9H!|%*Jnyp_S毉4U6uZbY"`}Z_k]@ G/"L<pL}{#!>@p&%j3,&iɤ@ ৅@ 1s@  F@ 184u#C @p40?O}A9F  ף?&#E Bb@  *-O_@ y-[nv8t㎛,f:lz~"4 iwB!_qKcڡL}MA!Hc8n+mKO9CE(GG-% l_f'f8202\E ěn u*zJrcC7*KHj> B RJQ`scBLӠ0JfgAz81qsg gq1cQB2(gs~qLo8DMB0N0d aCl Fu9H,*%'ߏd]034M4I8XTUd@Co>[scI9*fqUzC|pàs0 4ŒgEpͭ~81"L_~zafD1'4p555~j_v`_&%:#S "F$ 3p)唘az$`H4iŹ2R'es'rTM8DPB 4)1 ]7u,uqkqԴ8۰UxyIAL:3 ԜQ=Q$}ӂP(ILJ8e"Ir9Iqqy^]e{<,Ҁ4LFMjRj45Dd[?,wFQHʇDL¡i 9cR6Z He--%TN`1},m ngG飝x0oc٠CpF0gY5ł)0JD?f9(Q)'3q &ɠȒ"I*1 s)4MЕ*ɘQC7tN)XT+`:pyFH`ѐ0 ȴ-˓?6(/Yz0#xcrfMS$m@YCM8F #QˆMO̍^i.Gf*k9Ft3`xh4gclyE(~vs_o~Qk9gD $4o-MvLMq@͚3^< B~y>y({@jE ʃ|q!v0mʍTZع B̪?(>۱m[%2WRSu45E0&ؤo88Q0hְldMsB(/1 2')%!`6gǸڑPKϻ#q6:$ 1<:Y)ti4sQEeE$٭* /Kb=a6r8H\r;U+T`x HsVV|d]6o" gH)ikf{sZˁF I"X(!&!$Dc>oӦ͙Fx@phb4!F>aSwzb. ,1pu1(#&RRY|ei % !$q)qDЭ"O_{RڤY6uo hnr8!X=iP@̝ NH1SJpDԈ0J(5VM7 ` ))3#lA\B !acQY74%ibRBRC$Y~l=rC} F4C^6Uycsiz$\d [ThJ{f_9>y A"^%pSJ4MdDpCLNMLF %w[Uq\68먎h9#c2jBib0$4P__[[cpYiI6m,Q@pӟ`2e"$Fh\YKrꑐ7l2J5#U;*jnsWxrƠ.LmPRmSI1 `  !IS@UȈ$,(ɘ+$8pƈL(!&H(X0`3B(18A:jqJ;;AH㵏|0. }ᴴIOعx]YŠ"+6~}[t8jT OВ%aR0ILPJ\V!JLFLF݅eOs>{?؎[cD IvM48eaj4DEq9:@()1SFo_~YĘ@ џ]&2*Cȱ=fUlR2ͅ*eft0j2j/zշ]2o^2yCuhN=np 5p ڵ2=ڹL|ڤ|Ke䔂8XGuTÐh,Ȧ"5 (a`444yLBB)l@abEdCA Vɭ! U$s(%pFpΨI@ TxR3F i XWYgT x\<»@ED *3"x08*/qp w*|iI u[EU} 7GfVM;B3L$$aa,Fc&#Q` OqB%_\[[e,ܚIabȲ1epLOKsԤUՕ3FyMm'O?5ҹ+V)qDOJdS5PR]e蕞J gŖ+*oنΜ9V!p 8_:`+q) 3xd{o NZS).ecEv4ix,6٩"UȘQ"Qeɔp0ptuQ9o˸$J6*خmhe$pGx874=p2 F1<2p9FHb䱵[AYkhTZ2je8pIk}ppDAXoՔ1IhlͩIIiR$azĠFW3jPPb2|jq'ҧJ J ]q "*V:a .[$ƘbX,cB'LX,a446=‚ԔHA[\vyPe<.Te>"}WX~r˯ ]it#1(5idn)# 뜤##׹:t2<.sR|&u${Ipb+z!6zg:\R *ZUQEA8B[T^RpJt VfDVE.r(ئI21+ݑ@A{ F元s]]mt͊P2jXBP ,8[e0RSSAbb⦍(%-[6}*G!Y3鼶NVC AtM6o/9epJ#NMJZWU0?|c}`UwhJ@ u_RM8a&>Eќ$R^WO#8Lሷ s">˜5 ܏6I 0Lz?_ 39PBٗdWߖ*A'<SF1V'7HK 5n1N)4zkha}g0 #$x?l&vZ6S'pJ$f2=hjIZaPgO%41!L'L0cfRZ #TD6e![(<* H%׺*ʋL?Ԅlr]& %FDSnʜcCu.g3`P7I(1i2bR0bmuy}:])!dK:4T`TCu&%T17([_]PI/W:BiVEVdƈ PB<̌'@ Z,pqTYY IV:w<$mJ]&&$`!SA pKx?ȴW &3"o0WlWz @i4h~# Y\,ݗm@0)㄂A!bP 0 ¦]u=}?/BP0 $&QB9}Jzt´%},o$P!H)^ Xzxh+4l@LmO%[w沶}]ijM'U㲡yug䪮;]w.$$a1x,-$Nfo!W1,{MQUqtkyau_{?;#;+0aL$,B9$D[pޱbj^6P>*Hn3jR<덉 Iطg0iy?mlMG7<a.%wf$UbO{*5FWvDKevJϕe΅#+rzǘWW3+^7E/QiS80Y7wt䲹\>_%`]F{Q^g"%LjMU kȤH-0wSj2)"CMsD(h(5SWS?=?z_]&QUqݺX4*P"iBc6*r 2!g7{k>[fy$):gV!Ugs9IRQ({ff9?X2ZgbOjW J>_YTtN6[9L|QH~EPn{l=<ۜt^qζ@a{=bw=R_6_JDeñwTO޸zpI;o_@f~&Sٹ(D7Ŷ?yxoiI#Osc،cuklTg9>qS5Щ),=U'ZUDd(mOS%x⹁爈*gw=&{1v{ք1Qq-?)$.K _šߕz(&W{H("qs:TxIBb+Xg/+abgbwǷyVfJSj (7Pa' #SFjƐNr˜("qZsA.\`;<&o޲\0seng: zᖦ|YYEU̾8?X zO`^@A&z]oj*`Ogc 8ت($UȟVxV޸ [g❲9n]͑J}#{w']?yW?g?DŽ5_;Jtl{}픚c勦3u &Dano+zQņ剢f/@LJN+l6gsm٥^\3}{ec#kvyݞD 7q@ФCJ`T#WK3)'_?ZFD{i$1>;BHM BRs)DtCqxg߱a;G;k(nTh]cl!_.a_dƗnnr7RWZ7WSZڼdq tW9ˮ$ObI4vdsIGNIHHruͦchFMIJG)URU^1{Ͼs{E^s,\[;^Doё嘅EK`ћ;9zo_W _/ z~-oNoog8<Νua7H2&VoMDsǜ}r<-=<=Q_Zv戲'54y𣯜rV?0zl/""2N8qF#^ Iq}Gk*xWk=}}DBTۛimhlniljfMzfDɩu 5OVD4%mf]l zd}?ݽÕBs0Y(!6ֱsZ$.Is8o\ũ{ͪ=911q|+<׏{FU@A9o4hڤ%$)XN穰׏#~윶gۊ9D-v wMրIRߘM XgmJHJa%?0{}s$JdHDI} )'TW>z=;ٳpΥ$ ,d2Gݽ{/ͤRCIOf:1,MGw޻&V>\[a]4ר*_o0ⅡlJAq9IlD|Ws6S#N5vΘ(9A4ƣLhJ^U5*QY=SOʎHU; ^=}ɵ"c<|Y׿:&:{;..ד2QH~kjmDtį:" Nk\Ҙ/hoF7uNu}bjPBNc|s:ob1Y}EH[14cX8`÷ԏ=kW6wl;l$$}B'ycx{z׾W-oMrj+>9RG s(yϑEwVS[w&iljhj!im/NҞT]]JOL{9,}`W,/6a„+?&Չ'cDJ`OgchjyÝmG;?\\>iRzŵTt]QޝՋp)e*TDT^585ӑ֚%8{W"5]?y-J⨜b)"JE,뷯xI8u[g_Dƙ mx}Ac򠅈fU]d uĐB1XV/*=|>4ON=1xgx+GUQ^iIKA5oL!l&%xeVV*܇^}Z4>ҁbM;,ǻOL|V% T;o IRpI]Ҙ5T]bzu{>Kketv͕B>I >vx|$>WIBw~'=̘>-XkEdܹtСCκbųYtqcڎ;6|ذR8,"syx^\g(ޑ{+֊@;[زʕ)MX\y >ۜŽ+x kˇroF{$m~rvԏʔ=|1zo9g=ːyӟ+hR^"Zr$#GMe053G& IPH[:jjkcvڦnO8va1FakEt>Ӝ(k*&\ΫI'݅eٔm$i`$46 cl%%$!ṈdbiueARr6&Jԓǧ 7x9Uq'9'[gkx龺gN!^1}ڵ˯*w?{mqߍ׈tt<#;3s?zao߸( I5S$%td;:<45HCCqc'Mp?KũQG;2J<5"83/QK-;'~h(s%c)H۵X}MrE}/6sxշ%|#ỉLz_oOd53n S|߻of۬lńC̱ͅ(YÏë"+Hy>H62lDR=mr$,>Nzn0YwŜٽyyw7 5h{\4Gpe KD&e)sYY#s)mZ?z̘W][_k~#a? ѡտj=m#m-6Ih4e+^9>sDU  &W\܆OɄQ5z$76$=x]"zϼ1 ο;Y{׹Q'z\I61ʺ3|gqmYFs;w8Y__ܳ$"d2g&"}T*566Ԍ92N岹Dzu]u f}0ӹ]sͳg_Dڅ]qs>ڼDDjy B;Oo9Uezhf럷~sWw̧ݶvcW_gȤ--K:lǯ{n#zɃ NL Q*H:Lc$ jk8iʊ%zA?m5Uk݄L(ӛcSP"VD N}lC<0#&!﹭õ;תMuᳯdoXZ̞#' Ž8Φc|e̶-Xً0 Ν#(S%VQ%!jnʛCA`ptG[sDDT[}k߸e9ԒO9啝Fvž߸}+{9$->nh/ޱKI68^.7IJ\T]]5v옣2 ikk۽{O*-^GJ>̞5YTUd'OAT'3<}T)5s;W).;gfؿWSG7F?8B-q}7/_U>슛f^n8:|k~v^_X|ĴWe4&U6+VL881؉;=S_5zI)L蔉yj+Ddyip=}9""ڟ\u4?2l, ;xf!C?ⵎ0lLOOoҷ~19nlqC-[4 ɘ*Öz;X~:K82YtVy%j_3a5W\/;=+8@m) 5φ8 =V估QrY+[N9ze}ks Ω!أjpțWw֑-^?HI.8Ӧwu465(K/m-+444͚=} &֮X.p# m(;Ήwx+nU#"^[0>2MjUnnoyctC\[;7<zs˞eGjdSjs.~nO"2OٹzC{oc 7WޖJo~t)P 9uIy9e%Sqm/_4 WfQQLIODQs DTO_6L6M{?ڳQ&s.5f ^;}쑇{BB-mܳ7x?y1-t&zRCDƘp4Dʼn+̔$f Ή1>ɩd߹[ycVN;=O/SZhg_I@NrΧc͟mֆFaf/dYjsSsC1uǏR;?.چt>-^{7o3u(S3ǫ[_rx`޼eݻFD7Lߪ]k}3[BEc|fO\l?○&jnkԽ^$$٣Nc3Öxi& H2ADCdž'gb+P[V޵vUeyY_1"I6m,1р9Ps FRaCڑ׶,_/{rōHBC^󔉑qQ|$ D 6n0 0>6~mXBlԨae&fOdق$)l6:|T;w?plY*-˿OmuzM=ԩel_ŋwz[{>N>GQdU>tTUk+;v ={YDsKa^`UP#P{:)yɣxW0e;;y?qO/ ^KE(HII E&M&MAu>|/߹xŘܲ[+)+]! Ļ$p-'/gHC#@|Oͫړʑ Տx~ŤN|vˁQֶ|ޏΜ:{Utͅ[, yz>][6\[VzFf#Hm r.`-~.jpγU'gsgˤE[0z5?pU3?o-v䳳^KٟX88m}+`JRL3A0ocܱsEQa-NfV-NUQJ#Gk1|8 >fic惇tɓ?[S(N4~_gvgQfq,,^Tx'/ť ,,TN{GqywF/]'/?na5V}p{]0s8mb%M 3pkHspSx-hhւeYG)RcjFVO7bqsgL*t+˨QWYS__ǎfVfUT:3q„9sfO/t.eEyS}7|it IDATklqI$v,lUZsʫ<)eqʵO.:(!(0?2Y^aGIsRx)9֌;=Y+&W&hZ9`_ t_13y*N SZg'Z\XuHd8\TEDM׋ ۗb%`!a/2wIFu+Z-.ܻo2,2,iUGDz)8tfRQػ.-=e)">rx}CK{ WW=jJKLRL.;vرQ(T)NWUV 6Xt><Ϝx$6ԟhliϪruEQ&W_UO$*ۋtT6SP5~}gӵ{_='sYGTL0fg z!(M潹cH^WhJL?ق \JMgqJ oսK/~~]4?\[r|nky[{Y&^}'̹_wK_\ @ з,sL!w!e7ķmrlGZ4)21'r|t{\gM[.u~۾eoy.VU/|%TC!U鐪tHU:*RS:x`6lk֬m=?~|GRJTC!U鐪tHUMU/x䗿߈Jczb(%q&@o0sϞ2`(qCɓ'[tDCٙiӈhڴi(.wk3g~p̙(.kBpΜ9g=>gΜ󗉘0W^y\:C.L.L.jϞCցz\& Mk֬Y>&@Л04mذ_~ă6}3A0YkEDDYp]ΆMgDDDDDDDDDDDDDDDDDDDDDDDDDDDDe֭[%!U鐪tHU:*RJTC>d޾bٳoۿe}}˖oߑ</?haf9Ù_2uw߽Dɣ>~ǻ8Z*RJTC!U鐪tHV>@o>&?#tJTC!U鐪tHU:*LU^&@@]@]@]@]@]@]@]@]@]@]@]@];\\?-]zm۶͛KDM>g7`[f|Cʕ+r\ϋ-lll,yYG9׳P&@06`D&06 & q]D8&@D!ckgD30al"t cl}e"te"te"te"te"te"te"te"te"te"te"te"te"t2q֭tHU:*RJTC!U2o_7e۾e7H?֊0/yݺ^"JICY?NU]S]]]mm-RJTC!U鐪tHU:zx7O?LhƏTCҽ5~ƍ[nmood1ʮꪵkFQeJvU:*Rn`* P7o^p>XWWw)___xKpi]@zo"iͷvۺu֬Y/6nxw<˗/p1]@7`}x-'UV=s3W[hW](79EW9r 7+.֭[WX)V\/w hW]0ഷWVV>DwkҤIg~w(ۄm\"$GފO ;qۂwI!I;~/~'r}֠]@wL=STzmڐ?};:]3@9 &ȤcQR,{'׏o+8C>OSDD{]s *lTB0t阢( $$vI͐+[;:]ACDA'HMS_ϡՑDU"g‘԰*WL02(GQUyek=+8?& z>O"y"!h&6QTk&ЈaC7>T֩'O CC0x&h&䦇n"mi0*aUd" ʁ p]IqXgm{TF",ܡ]L&MOJ[uǏ?H$Ș:eҡA)DDk]jhoii-sTW\/{hWp~(k?1榇n*% qYlA&teD u.͵wrz訰W~OЮI7瘽z}ЮP& Vqy:UUVDT C}*X757 v=0z}\Ю4,00(0a`aJA&cTU 7eyfQ%V.NvEM~2Dt.Db ))) HUHسw,16 phW@(;vaUëe噲LJaaIS[#62kBw2+ t(((q0TA F&O/UE>pnhW@M 0(ũ((8 a;Y؋*Ɛ9]LԔ2֪T`HR>-65""aV;[]@DALUN:\GtTyBRHl?ޘ \{<5dLرwž LDEYԋh(8f9xoN,U/^8'+ zVޤCe&4cs[ث'f: vBDcf,ٱZs޶qN>pnhW@(;Qz, ٖ;^Ykm>xOKݬtTx/pNhWP2`p"RhET::.Xpl 72)޻p>hWCƁz\9/"lx\_[XEcd8+!a͚5=\g=2`(^$TEz8cPJIp `>}?t.Ʀ2`p+N+MhZĹlDd$OWWSaGb&YphWCC+F2u[2`S"\6$hdD )T9NwUzʼnO9iaT8?+!`%ֈQ#GtCAD9CD|>P!G)F09W?>+X7`3D0*^ [ffVUc 4c@v0t7񬧣7`p3D2N(e/WYTHDxlG|Àv047荋Y+6qֳ̢Jo'P%贈1m|[?FA `H@o"(HQ[]"^{VU5dHUA[Àv0d72f4$a5c<9O8=y6ykrjn0] M|$.Έ |zv-{lol6(x$. `/5AA2wyoK %ƻ% \(x溵7wjЮ pR5^S^I셝D^;q.p0DJ `@o"PSUUuر .vl6;z*pi]\zٛ),Β%K^xNADiӦe˖w hWƦk)SU#Dh---ׯׯonn^zuƀvpLgN֭{zʰ~{wݺuaW[hW^&bl"@tw}wuuʕ+/KgM6577G?! r3nݺdɒK$HU:*Otm۶=3/R[[x{LUǍNg=a$(~7~cĈ?)ѣ򕯬^Px* B!U+U/g:W,SchWUoٲ?m+ݛ]LER UX*fk/zDK{55գG?=bĈo~7n n JbjB tHV/" uǏT{k*ƍn~b]uUk׮TASm߾]D;޽{޼y ETC*WCo*͛.\]mllW:n\ڲeKsVX_<04]|Cf:àynmݺuk֬7n;}˗Kq9cƌ}]<04\ +Лs.Z{2 ؅79ϹEW9r 7 d8_]Xp.[XS\8kMYU{}3׎; U ^2.ʷ>~'|wM4oeMKY[a'z[.)r\6I6poŏ|$\?y4k'/ˋʑ ˫]|C& us}Xx?x}WƦ&J);b#*ұa=Cm}%G}#];cWP#v N աC>OSDD{]s *lTB0t阢( $$vI͐+[;:];q0.MDQY=; } )&`OצiꩯP?^HK*IyL3xdejXy\+q&RqNET5ŔjzY!"$\{} )tCoٻCD;O$$-ͰhDE<tzyoqD0\ +0I&}篿sSR~}o82IElґHE1^( s ,Mm$9ܜc""t W07G^n¸<*LJ+"!>EAޛ@MZZr;ǞUR ^&b3 8( ( LtEEAIUe -mlYTI/QK9r߾}3gμy`h@*W0a3 A? "c:0TXDXD$;a%"e˖}[*M6} _y`h@*W0al" A쒉ê*W*3ee(8üGm*$""e9yXpaYYn<=#cƌ;w% Up caR08TQ 8RA gM <}Way֭wyg<#aÆvU"` Co" ALaTQGqFqj0 i,EX23k֬s=_ז.]:}|>ODeeeƌaÆiӺ8 U)p 0(ѵ]7<}]eUD19}b}[mRk' DD$*Ҍ3~_ڵ?~~~QZfҥW\=chW pMFUN:\GtTyBRHl?ޘ \{<5GرwA0|U3eʴ?`+ vu8_DDEYԋh(8f9xoU/OpI|M!HD=+Xw"cs)Vث'\B8_@ua"'sdȳٱZs޶x!H2+> dC(WldCEeg;/O?owZxn9 3`+f޾}c{'j… w'Ю+06%Q%r,hN(86؈kvnh:FD*^𶶶/gϞgUUU]}{n喾{ͮ]nYdĉ"J3ǎ{֭[7k֬ kW=O~͛7g#A̝;'>ݟv)W=D,zU筳 -?9)ÍLDD,ⅻG >>7}ztttl߾//y|;555}ڮ]no|zs.Ilss1fذTJ}nᩧlޅbxssoo~ _(///>."{ꩧ-[փ{iW=DyXQ`[=ʴ",,*[s==ŋ ~#җ|G۹Ș{)^u^zCE<;Smݗ& vC]'?9qD5i˖-?}s=|c2ċ*sY"2'ΫZ+<%))OK&%k=- }C?xoEe˖oX矿y`hb?]wu=c>_^?>_FCcS5┩κL(aR"\l('I%4V-UqvL!GHyZ!uuucƌIRdj޹swFFZxd+F݂6(:*h>o޼K.dܹƍknᆅ ֻʰR,nY_ꎯw>^bxY'pi*9߷o_KߩSP@4O>`Kfig_Ҩh0dȐ~{ʔ)ÇOMMmGG5k֔.\077wڵBԿ1zFFz} hX,,,;,Yz xGuYYY_~e2%w=bĈc{FU^^߿e˖+l& /С D4{>=--1FRzƫf{]r6l4hP3ڟʪiV 2dӦMVZ~}8n6g͚5z}8pqSwիuƈ.[o}'}󹮻jժ3fcsssydJYf̙ ʗ`p„Ɲz+"$b=Y_*@`ܹgyfmϊƍKf??'NbgX, .|衇ٿP$hRbumٲeeV?馛"Hiii]1cZUU 48!ҥK,0T>nĉ O>dƌDn/!hxѷ{~~գ̉tEY ʪIX]V>())qט8uD'Ljſ6l ??c mѮ];,+s8n[iiYꩧ6mt5^ *1V5_vio橧ZGݻcǎ6mZJěnYժl:t_~9v nŋ5AiRڟ_5ʪ)((Ms]_c-c}䠬j֪~W_}ꩧFYM,~7sY`EWc }!DE0*u]w^uUu[_4 })Xr m.Zȶ.]dddp4o&%%eҤIy|;va}:?V5?j"*//ɉb.|?9s&+#UkjÆ ^zԩSoᆮ]V}+-_;ػwo,9LV֮1d1Jl_>==rP8'N|G'IxΝ[”={\tEz߾}L9lذ@ p\Z Xlڵ7oްaàuVW~W__{ʕ+?ύs=~a,  rss >eUU ŒIgȑ#oAŴ$kx3o+̚Kkկ۷'8ÇOklذAUڱcG2oך;\p3^c1ι~J *ǀ&*jb1---Zn(ʃ:oL+__?,b믗-[Ǐi< !K($" Ar@N$B!!G!kۜs]uPpRDUyr)))pgUk܇QuVa CQs~S4eZf󫒒6Qx;)Vݳ4, YYY=zTQ8T4QhTY4 =LB1'sx]FQQɎYϻ=c= mw6zNqQQ!#4Mti4FL"A ^!b"9!R"IdFJuNQ^x?bԙ31ƀ@. s'Ww1|-oE#t)f-.6"tn$NIJ *ǀ&*X^ײL0R}><swWfv7<%%Ƥ {;`_w=u72itLׁH $%  <@ܵBH(|iid8y#i;vbkL?|/ "8Qƪ ҧT*5,xܷc{Ӕ_i8nX< W٩cix<׫4Bql42+c̲,oYi`/q%NչPY8\x>yaaQ{.]끓>7AZ H>3+ x:=~OZ5|Le薡{Lk4&L$J)M}?ێzy ԙ@$C gxLk>~gu/5MK UqqI sP([n\ny''X,R K%aFMT(X4M37o׽D * <䚦(KKK `7Wc`2ЙԀFHIARG! .IA.#$IJ(%>ꉦ1FGjt.XJq^XB\] wml Иkc D9g}զ Qáı._PXiW}~z)AݻpUfEBQ'jmB^}t$p Y\׵ƍGY\nj53=:x4bFR1"SJBC4\E@FqpEv\JA(7oޜ_Ufff01i_\yD_9Äێ(Ј=_:p=\ ƀ@44-zժ{]s9Тj˖-YD_ [ fiY?}_s(è E:+w&ԛa&8tZnݺy~nG@ ׈x;{ 0tt SC@c@D$D!C8㺡Py$b;vZȥD4q۶mSLR:a_}3<͛w56OK ?4 :g P|:1h} .b_v;U-WJɈ M7t4ǞK2U UYYi.u`ru/gϞ UsĕLb9c&O^8/w9tKX;jO?[&YPjL`Lj;vS{|iw6 Fk}-W4fiKP(MT( xA]Ҏ.陃.b FNg q#F],dff.5NJ4R"dS0 *1~|$!E$?T-. E.$)Uf:eurssia>Ӿ}MI}kHB#H7A-!E$ {]J믏?mcrFo{yL΀u~ b&4S9uChi(DqBL$E \";!NIIIFFF2ѣݻ)ykFr #"˯+hΈ@4Srt8.ڔk+uruPvwF#zrۅJYW6W 1`UtꚦkB"! )Ir!#9ɌNJޯ4M,kӦM6!Ă {dګP(FMT('N|WGybW~'vԴk+5"̀Q}(+0p@TIDDbL.!NkF(B3[H/hA4Ϯ̢߇`].lS;gvoR RROE^ :VxJ`dTѫoYQUr~Df͚ugEĻ{n[P(*PDm /̘1c7p+!nݺ|KwT^ֲ>Q !J(%JIdDRJ!%(*\$bV$DoC_ o:)qFᮐ@Gp[1v\Lq¿?XDbؒ]sDD)*Q[F̉#)οyR_F?ߠSA&W#F(((xϟi&!*:t1bٳ?6FP&*m'N8仇3+b]ƽ~AJyLC$ JB"JLVu֙bZ #袋~m -L |jb 9?,C8qW2T<' eq^ڑ5'*,,>B"B :1QJɑ$I5tWHW[c]r !+R"%rR-ugѦΛ}nhgEؾJS@IO"}0^. 9r!]*  GcÝ__UrmvmP(AE eߥmk IV1X)]!+\!@ T BT6@N5!;p.`|nNpXmSGswIsd"{'Ж8*UeO>YU[(#8Y@&#DH\ڎ;㸮]su+ ({$P-+pۨ4H˺r~q}ԧPw_%?M*If_x߯ E󠢉 E[bѢE^~~~4M\4O>F1cFKIiiD$1$$/*bx4f:.FS8$9'DBA`Ν^xoo,]$ YV"c;kk1YN:2(n9f+켿|7xsLREm`&W:wrιm;u\u (D" Xw+j+z\kkq}ԧPw_pɞT,,:%IF@JDvb_XRSw1 ]E}t0 $!I# !$PDmDRʊ]Tts O JoN^{CBH$%Å E.v#6'iZbō7x饗gϞ&L+=Qɣ'GH=$IhN+&"p R1'8[o5y:͟??''Od34]:AOP R"7P$ )Pb:M*I4ax{jL7o{v=ԪW^.\HՉBHD.w$P`b}Ν322m2 6D=@D322|_c4(t,:\J B1v=$Ё)XL.Iۮ+i;MΟ?[bE_Ps A*bYD*ΕH@yľf1ˣu}ujZԄ53ЙxA-rk^VH JqL%+ *v" !4HA_!L4MA=P(GtV(6 ('!m;vяwҤpP/ sNI@1v&]AculKSO=5//G VuݻW^bŊOWi۹sg#F~z:/R*ebՙԎe"H%㙣έVW$uq}o\=| ~v=9ʶe]ç.|o+8#b,С"*3M탭6l{72j:?ZP4MT(n_:s ;N~q˔},e|N9 25gQ/5"`DHDBDTd^q㐎UuQŅ#B;v IiZ~jKK͏M.hAdPdwAv5eJA!u)XŎ쁽EMZs¯Ω,ͷk5uۙ]-()nmW}D-r]7rMΜ3п.ݷVBT4QhKb6h/zܲ,߯놦iG$`0aiI$R2)@"4(j6u}ҹ iaO2 XKIЈ1D $ &Ap\qxqlEܳփ~8$c\ȸBqUFFF, SxuO?I'?qי3=r4BXT4Qh㸇 X4g(8MWZc,u팡\Hr$ ѕ(Q?i R"" 3GxGŤ@ Qf1rAol&r5H$$$B ]@$9rG" BµQ by'-__-(۩2D$Tqr(IJHRLJ{m+uy,1--d Xt־s5GuMlYFEN<wǶmιkiqՋq/0L,..-zB!( W(PprP<ݞ>wQH!̑cͱH눖!0$#;K9"@ .`N&isgZߣ$Uj]|n +@0l`9B(\R_eYir+Ģo 7Okਲ਼sD8N<m6m_(MT(Z/x|˖m;wJrn]uYV=k $iH$1)%$)ƺM]G (@D QCIԮm]I,,p-ԫouߧĄ pĶeؐ} 8vIƯ$RJBI!Ϯ;p B DΎcĢcNu˫^wL{h42N`0ջkz7]8Z~5獰$VS{1Ku~;s;O2xuHxǎυ;vRbQh*P. w}g0u`^m{/75f͚Yfu1hРwyP}֬Ys/[숫/|s97T!icϞP&MDEAhBZQ 2RTT0 4z>yyy[f#//t-hC=LU28p`mMC)999'tƍl٬ĢB T4Qh,}U:ujP uI.9id|$NcKΝ;nܸxw 7,\P[uc]U_%Izi[W㫯zݷXv*MܰaàAPV%*ynիW?guV@BQQќ9srss~fǒ}xl۶N@Ľ{r)0dȐM6Zjp-Z:ux8 øU=k֬ѣGWOҪWMW}=p8wݫW{]v٭OVuUV͘1OUJDv܏??6WMuO]MP(ZXnݖ-[fYVme>n)TvE?3feYUA1/]dɒH&N3#Of̘Qms>Ǐ|~Ji!XzzF<Ţ/f@ 0o޼!C]lڴi}`p„Ɲz+"$b=Y"8̝;3ϬYx|ܸqǰw^h|՗Md=?8{X.b_}{HQV%O*]ޒW_}/X2]WϿY,x}T'///guiʕ mbСN命{۷<8<AOPY$lU3U~hV>۶ 6̟>gX?ϟ?x<^yO?=uzo6-MM;&EYu4֭/(&V־6s皏oYUsUB+Wnذ9#[>ocǎ5 @+Ǎ'L6ASGz_yK/tԩ7pC׮]Ŗ/_~wBQF5u7oRN4bW^y#<}}&_y[@;ꪫ2dSO=5rH_7|3gΜ ,Z萿i4g}vmUbYΝ;+}i U;&EYu4j-?eʔaÆf{nII~_6l֭[t̆=z̝; Y V2hР{ώb`0qCPnny~ [n]' 駟6\{=sxקW. Á@`ĉiii e˖3gkݺu/Jƫf{]v:+ 'O7oޘ1cZĀ+W^~o"%Dee?o@$##ʅS%Mӎ]%%%IܣGݻw?(ǯF| "&.eff&YCb1 '}iWu,T(EEm!Ĕ)SZps9W^Zu\tHXcjBu{^ȹ˹bi֛[xe˖APDE`ʕ-8&=ztff j+P)@FB C,h4¹ ybW+VhY3mMT 6lJ >|ǎ.iڀez8B{w9([57F%;wPOO?)L8uٹ'D}{M#2X}3^6&*5믗-[Ǐ֭[շx[tt]@R8 pm;Ǣwc1ڗ_;g3cJJJIII+DO>uD;=r) , YYY=zlC0y٧rP$Ojb1---Zn(ٟit?}Yb999G"U,;hⱯW(ϼ׀^ ^[P])@0YWzr|3R:eSɤD%M7l=9+J9l sӢJOOS'z]zAh+=˖FRNn"Yڨ_%ɓL2 =LMKKd90 zYֺ??s]ꨪ+(.9F~4"hٳgͷӇO{.]DFRuO` 8hiKhGqx<z-d t<^P -P\^([vR(MTU.]끓><#=~a7e4@M~33`͠L^ӰLc^ƈHn|NQ7%@s9C8AtO~ϲdr+*8}𨟭ۿ3ǿmimW1˲~ n-fa΅U+142d`Q?lkMF~)fL~{M{M1 QJD]:w(H5gTIYY CPsnt(cC2 }&r:5 zW_].}dZ UVړ_1ƬI?-iXr'ZPY8FGRBMvtV\pszVpV9^/+f$zb^C LB錤D]pMuRr-7| %ʤ~oٲ%;;s-w|J;` "I|q_g(tcʭ9B1um;qQFV+1ΊJny;w^MTyt25ͣG3]\FMAy,dc((aKn0L0;\Դn>s)=f(ů3g{&E@Ds0RG4:TR| W EcPymz9c?C؄&$G' gG1g21 Dh4*b~DAR&h3 4zcP(ĚE49Dzssk8+1hmӥKSVBy fjb~1 !Af&QGJáHqR&x8 IDAT< >% EXhg~qzbd"lJh j4 A"-J):iH+QQbRLjifYMVG1!Ă {ƶ}g)f͚3g6=A;Ϟ={麮Q_?~|4xP46QA۞LH<GMM\ GAJH ɒ}D$5kg[ wuW=Ӫ&c>ﭷޚLoc2ZK~yf5>okjj/v:a̫C`BNu:mm;g]sZeLR6s:UW(g\7 dkCqJke6Z+eygF;gmA8XPθn"Ȋ(eLm\ N )(?=ťɉq9 c@ [>E燆NS7^Zic?=;۳E#r+c3<ÏTX^#""k5{m۶]xk֬KRBۻ)Sf2L&,_|ڵ]UW(gtDNDDikγ+"CPСR+Zkʼ\1檫*_^l|J8Wq^q3+Zg qPRJ+cC֚R.gyZ{+V?G'u̫z43)QuXDij919s˧=U6[U:3]gnڴ)ΖO=DA20bbB9۳w_qa8 :l9c 1+2-%{^~R:kl}*J[eu332 ߻wԩSly)رc W^lql"+%YODѹ<ɧBMJ2V{xx6WZg 2^zԉ̫hW(stqlu+O$CCC3f̘RB}އ)S7#cDNaQ`~)DD6lN*3qlXti___[[[ic.]13+$Mı!UV]TVZA2(WHqv~| … z衕+WNjzhhhÆ >`>>}zGGG-wq9Lt$C++$>6(Ty nݺ;8餓f3fz<́kn]Դq8[nذaѢE*9WGAbR1XFEJjDY\WgGӵ%~]]]]]]K// 7Kpp7mѽ[4Cgv=== T%/Ջ/|SXB)U(uqg̘~=Yf֭WƚTT1#U|6o,nɧ6tl ˾i/?/ar! U|Riׯ_>000꾽?p>ohh:uRJDtoo+RWWw%L2ejjj \ ܐ;JrP&W@Mo׮]r[s9E^v޲o8k}Gnt漌8QZj9sfWk}{Bmjrƫ \S"*/Qiߓ7l&SkvW<xtXv޲3gOLMګJW=k1J[k ʾ90>^5Y[ׄc^F7 W_}81)ui*}WIզ=O⋗ |c|kz /fZK"¼n"Pҗ ҵUZWqu)}O֙TO;=yY/o}}|(eqHW@qc'jT*p")߯9猳y 匱Ήƙ٩# H T}'u!DD8qbƽ眈XVkt c1dDU8)kjjjkjS HASv_W^=""qo]QΘW@2pl"PќHJT*өt&ҩTRXzA[C#c^@E I3t:J R)/ y'O 6hksC1dDr9s,ZdRg|Ol6;/""g歷w + 186\ιٍUϸ鵁ٴq|!_sk{3=kw}Ș5hU6< H M*ub3ik923*cBmm1X`3Ym-]y$&Z3ֆYZm1F)V[59k'#`^@E":eED(BmBm JoOOq@r"b1F9c]y$DY'/li3P_׵ژ0J۵.FݙO1b-7Uá1dT.'bs"X9)hSPz( s0ezN!"⬶Z[˩ H @E"$4Z:'ҹPCuU=]foq{gCa^@7lNDDikγ+"CPСR+[kj.Ca^@7ZuV"NjUPJie<}W|bZS(w+XG7hJ ں**5lNLiOզr8zJ+ iH!0d.,@s"dbWdZJtT TgYg,ИW@p'"|ɋ\ A&S=kuc윋5@8H#U|T*>Rl͒{:Ϝ9"*>RGH#U|3".,MM@@7& DDtn""M@@7& DDtn""M@@7& DDtn""M@@7& DDtn""M@@7& DDtn""M@@7& 80*>RGH#U|Tڳw_qӎ&\:;/G^Wgs.iӦΎΎm]&:J2F@8H#U|T*>Rl͒cgΜYH#U|T*>RWT  tn""M@@7& DDtn""M@@7& DDtn""M@@7& DDtn""M@@7& DDtn""M@@7& DDtn""M@0n2h%? T*>RGH#ՁF5q￸9׽Ύk/Kᜋ9nڴ{s[?iι444*RGH#U|Tۼy$ę3g:BRGH#U|T6g: g: DDtn""M@@7& DDtn""M@@7& DDtaDDd>;k-[ZZ^)R&$SGGuVe-W 96 5aO[nt3)le":$Cy{A"wLHFillLtksrܹXΛ7o;t),IV}ّ5D$8@ێ Xcޗn"@2aMHu֍gcz-g(Z;6v:ID$8@2or9 dc̎;=c)l-}On߾ rGD$;ܶml۶*>RGH#U|TV> ;z|jcOǶЯۛ6(GDV{- BkW_JD26]g:;&$X444*RGH#U|T%ę9sf#D U|T*>RGH_9Jls/3eٲaOMH9sEQlii)n|g:/:::׭[wΘ8W={Mv<####DTwE}1xs1շ)6f̍sVXDfnddddd<]ō\)eqss{s]MM7Y G}7T>#a####Dco1G綮lqsStXF}7;4#Ik֮<(/ȘqluW&L< c#BHңmYkyMddddqlu!6}3]'=u 9000TIDAT0f7dddddҎz{91#\_?w܃Z{dc(%_C<Wí.+w1)Ӂ(fgD3NH +]kܹ۷o?۶m{?R(e޽{5k(###cJ{uڶmD8>ii?Ą޿{})Ș౸n5[>%-[̟?SX T51cqOݵe˖+b"yf^1|)Ș౸nݵ[l▉F<--K_y啱}$)Ș౸nu>ō.sS(fΜƗ^zil_#aJ2222&x,[wc6LliiY+W~2:( 'jmeKۆs4t>9---{FFFFƉ'jii)77=ƞm_3Οc]v7: e""P& Bqpoo߲)Â`t@DDL8z|OsβKfn=q;.?s\;y1wu5W\dѢ%\q7rHˏ2 >73g7o/_?|q^#]x~?~'u/:2/2 6iҕgP]sBӕ_jo葟}swZMvK7מ}'/;.k8n͚-(b nrnCuO :n`p7cC[S;sK9+gk{ֺM[}O_i=^|R_ܬٍ~ f~LNhSROY8^{k_Y뉿ʍg}nzsn}˾򩵫x?r] 20ɁWU}:Edk0ھϜ?@d{~z$?~}rGW7~ǿȊ^ݏx%{++iM~|o߬oXN?kzӓs"#i{O^<~(96`LR'wMߺg֦.My%R=Mp)o~GoYAO޷jIC{ZgI W V#rl"ؤNO_u׮59KxGz>ξ_Jx)W#2gΜ'ŋϽSv}OZqg_߷_A?{NJq_!jD77=ƞm_35ĺλ=?0 ֭[[ZZ>?oW^9i$bQGֈ]w]v7̇;3~_~?9y|F96i"rg?w~l6;J5cxe G1J<;s/Ҫ/&ĬE$uY͗^~Ńfgwy]a:J+EY|޻bŊ 0o޼bx?9jxu{mn'9>C{ϠcM F5񹧞|gOyHu}(}otuCx/Rt&3[Fo;[R7dsUP(wF#˹IENDB`netemul-1.0/doc/ru/img/rtable.jpeg0000644000175000017500000010411411254745330016173 0ustar frostfrostPNG  IHDRk?AsBIT|dtEXtSoftwaregnome-screenshot> IDATxyNu53 f2c3%QD(QR+HZTJ7Z;wh,Yu+ZEnJccu~0'lיkf33<Ν,u\g'c lūȊd ld ld ld ld ld ld ld ld l'/3oܰ%^d()YkKz+ɚ$UZÓT:s".x9/^d1E%kn %kjPE4 Pͮj7Z+cD^&V,%md%ŋm\QvLi?J<}*FMRt ɰvYbC>xZƬ9sjܤ"۷Ӈd'ݙmh;f.eKҗ_~U)}u2Է:~o:믿^=饋ePpmq',Up\uqb:Dk׬kjo'/ܯcGVJHw縼a Wαs.[@njU͚)z^cFc<DO|聾k܏d>SfMUA=b3gN۝wmI.%-VSqFtO1 @+<8@ʗӾ}h_~2mT\+Wn?oNƎ>wW'-ZoLd~n8Bs:V: zݣ؃xXԟ{wkԨӷ'&X+#r;bj[_rFV)xɘQWv۸'V39}ý׷ݭ=Wrr~ q}IL/?X(#Hw/0ԧ}Zx]KINoY+)K]ʕ*I۩iZgڷoVZ)OV`*Gرcڶm٣kzjan: ]z2}vժfأk͚uW5S9$x{fXX_\9URE߯>Sn}XmCF2 c0h*55U/^?햇X)^åЀZdRS4{\ |h_ߖncS~Yv]hH:1OqX,+w.cHMMU2e2}iÆ++_^4 Zfbcc%>Kp:5zS bwͭ=czzrHz{|||n:#cD&VǓ㋥mċm1Dl'3ws]ڶm^{u+TP&2A7lԁܞ{yLbYKINWʘ5{u}VJIN];kZxל/PT2r麐j~6NU\ѥ@>P;rL2:TOoٲTR S#G=ƿl;zTRWR?SGWKӺTb%-7˥/-ioh?_I['NTv}$'Xjt…͝;GΫ_^JKKVJr&^PUV] よ7;p:/4fM5Չڹst5kɐ,m56 SϽZh~AǏSJW%΋xK/*=2c qR/}t=;bTB3 $I9x@A%O*/TX=9KHׅ iyUf2oXypd8/(%RSS%Ii)IAUt!xR]9#ۊڒ+WYI6Θ^Qvl]vs@TBǑիz)Y7;OלCNS .ӧլut͝@}2+r\zE1.QTHp_~ʕ+eiǾ}*5-MG*4.MzܺMٞ#GȠZx:DKfՒor:˯իO?PBߵ˭Vs4p>1s)x\yy{_yzar8ZXAi¿&#qbuO~k`uߞӱ20(H JpAe˺8yJAAaeV$l+X8XF,xyTBQ6mLwzHRSSu K8"9{f0!R1Uxt#Xz9\/H[Mv!ڶg/qgL~cɐX;)Q#EEװt 9P}~1] 4PTzvhs1ͱ_L))r:hH^:.A,2HNJVcr!/ [VڐyʛtkZf*6K?Ѵ7ԎJqr}qt" }i:~[MICM}c6lA~_IK}rșTZj9S9Neĕ3ݩ ĉtM.RW^pO$(|Ǝ{YQګV͚nI."9hR{g^w浺oX٬I֨>uiłe8 -YRSSiy=6GXk_6r]&ks鹝c~.xh-q ֩czLʺN]?{Sv9 ׃ʘ;oU״l2zV;on(0ԥ۝<'Nԋc_RHHu&IҀhڹkW f]tP'LTT[پnr͙ƼvQ5δ7^N}#S kԈa :DjO[p8tys__ŋ]>=_S~\և6dvAc_|>|P6TwiGn1UfWeokçm.6KVLSQ6y'IICh9Y_>{ph괷wxL;̘p\%GK-+YKyyy7h-SO;W+_>+݌eoeߞ۱r!zk;z쑇%I^^^jZY3UbEutw(XE2.E}ecgu?c{S<,7GG=&ͯPoX>sKw1UVM+'c-?qzEvgwOJұ# oBI g=.Wj5mY=3vmv{WEx~ < E brLMMUHX&ի[oh]!Vǹ+VdIٓf>eYQZ55hmM7Vpp˿.="V`r+3]~ZƹUX(,%k2eowڷ>i<=8K=^"V`2ctl--̋Ҵb}mi  V+X1XY\9=u[cCĊ έr@ Q+XU "V`q F/6@7`rP3kyZܕNV?8k_`+/_7[eV+XU N`Ŧu\)G/X%8Ya&oF<7.dajT@1@*bV+8?_Fy~'F53ynPdY N =J3cqCBoqCBf2N =J"K8;$(< 2ߏe9_p"##/,u:tH=zP@@*WܹsÇiӦ*[V̙39]}n:uA˗WJԳgOUTIʕSv?䫾+kĈ nǻ]$)wq9aԩŦwb7gJ/ͱVt5˱8cx饗y(F KԱ-Z+V󕵠 2D&Mʶ;Sފ՟'Oꡇ2'$$S\\+m޼Y>h]pWߦMto߾:xvryt ڵK'OT۶muw(%%ţ28q>S㏊P޽--[Rteʶ~ǕlO?tŦwb]3b%oX z)cqrrڴiSBqs2>ְ:|X#)l|bh oolIJ8k#5%x핗Xv;vlb8ٖ;NsWaM7d 6,6lh]vzT_faaaƌ3`n-I6[vzРAsZO -XaBX]p|FfI.]gy&mƍ3?>|ѣQbERJF^cǎ,3}tlٲFXXf)SƘ3g9EƢE 0SN[6~i2le8cffΜiaw}QbErF^Ǐaϟ7$0?9sxG`߸曍{u.m_o 40U6RSSfӺU.աufnծU3y<}f͸W?sˬ[N[c.p6lؠrꫯZjΜ{Ւ%KDj߾jժQW:y>VZիʕ+_~wŅgֲK.Uhh4i#F(111OKs}ymOa~ SiۯxZiIEWZb3 ]w%___>|X111JNNֽ2Tu!:tHW_}ue>}Z;wVddM~eTX12>/_^GQtt+,+'zұcǴk.>}Z;nyԫWOVRBB6oެUViʔ)/i<{f;DjyzyDzԬY3?^ϟٳg/K3{=^Zo'ٳguE-X@-ҙ3gt{$=s*[BCC˗k̙f GF\dߒJBݶݻVXM6iԩ/]nQq74I{ PJ~%2JK*b%w)V8> ںuN*UXQo֮]%''7ײN>[nEM49T-[62ݫkjԩSJohժUQ /{7|~[AAAѸq[ZX#CkזtiOjՖ/i|ql88y򤂂r\~Ȑ!kRוq8;wNZj)<<\_}9oLL:wƍq拈N>m7tP]'(22R5kTxxCYiQ㐖<Zujʕ:uꔢղeK-[Az׵f5k̓Iʗ/,88mݺUC QժUU|y \ߓO>3gjϞ=JOO[ognSw}WgΜQZZf̘ϛ絾?'//(IWMf;Yf (|n$N =J6ȌqCB̳+kvy83a7d|au+C6|Y+$e@q̧;z?b.Ν;2Pu4bXU "V`q+vͣgyF'OԖ-[~nZwRSS=/o^WX==j=XJr_qU%I~||<1îWJ|MXB~9=E,У>9zZjUB1S`OHL[oMс?|~ڪ'?e|ٳjժeZttvءѣGRJ ѣrJ=zT4eEFF*00P^{}Qm޼٣$_C=*88X!!!SϞ= *h:}?Q}y]ھʶ9x{{izi$W[zw4qDKuĊ+b%gg3.W ϝ;gyF 6T͚5գG߿ߥK.ui۵^/;UV S 4bY\%O]Y>MEEF*J zy+kWwi9//,sbӦMk<… HꦛnҚ5ky.}駊WRRfϞ6m(,,̣:+s־”ݶ^|7n6mhرJJJ\_^S\cJc0 =;v MvD+N:8lJ*~+–]v~Srr 2T6msNܹS͚5˶3gV۶m5iҤ,ew}fٖ1p@+WNw֎;l^9H4Ngy衇tqm޼Yj۶ztDta}wZv}]˗4Bεa&]{5.p5nX&Mt:5ydIryf ٳn:ZʣΝ;/jҥZlׯ3fwںuj֬aÆo߾jܸ$VZZlY_LN+LgϞUZ5ݻW/٣ŋ[^=5J~œﯞ={gtb%Cwm,ٽ{o߮ŋO4anZ $%''7ײΜ9=z("""۫iiif9?qFٳG*TpiϡC*Uh͚5YʌW^~fԨQ1co֭߮[[%nݺ#tf:uhɒ%:pvء͛L2.jk>}V\i<={aÆ9.?i$}JJJryf.=!!!]jߵcuٜFr8oesسgnfsW^yE;v0+#Gs=~M;vs=kK:ϞY#aS3?V㈈^zzRSSuIRjj[vءX%&&j:t}Y1ch5kfY~;wy}GڷoܹsܹYtYiΜ9JHH0#k}y?Zi_qn[/\PVRR~5J۷Wpp陷EI$ݻkZ~֯_˗KtܕoE,bŪj:t萒4n8EFFz" dqjٲƌ$?^cǎUv̫j[n?=zZVTT$iԩڰa>IթS\hٲի^xA:ƌ(լYm5j( :L@ϟ?/B/^t$%%%t*""B^^^:wʣ '~KgX5k]zk!˿pBgdSPP6oެ^{MgΜQ:u4x`5z%Imڴ15ԵzjĘغGչsԽ{w>}ZM4ѿo%K_T&Mt:U~}͜91er_ooo+lKj̘1:{V.]襗^2u7mQJv_)*_ʗ/o.:`UX1[ŞbŪCٳnIg.fZpƍpcǎ'~+0t뭷˜8qB/WrJT_W6md}7Zx*Uk[2#GTF奎;j֬Y3o<?^QQQJLLTŊ]ZZA5jv0+**J[l܆q2>Ce7Wd(92ݚZ፲[pw<.FZ()?`~ݦ&ͯ-f V`XQXqgiժU6mZiO>u2ۮ_)"OYٕL3# jժ)"""i76o@V`A(ڵSv6dȐ5(*d U (X\Y5!n6H+ Pi)I=/J 7>]Y6H(T%kV~k5w(vbXU "V`qQᖻ]q`.SyBh HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH|SU`{yN6nX_\q2>(F\ؐOQ7( Cii)JKKL/dKeʔoS,}.2 }.>PHր"}8tz{yj꺶u5m~6LZaD ):z~ܸ^vGjוwQ7˔~Qi՗23}3d (Bi)O?[j|UˢnNVUU4`|glg Z`d ^K,+jbp:u">^!a)]N=Z WF}gВ5өy?U͚V5@1g)'>r(]gВ߯S4ikYp\ըYOWNWN!5j⿮ةƌv7ޢ֛ϝ; -U^c}O8mN?{:BM[V]ߡo[S-.Z/gQU7B^Tڅ MTf=V[OLLTPZ=d?A4ya 7vOn~~RPZz_uK;ԨI ]:mT~ 2uzv9rd;}gВ/wUFjw}͝ b^{_c;*I:~~Mm۴V(=[5*Z#{ܧ:Ŋ=z֭ߨw1ڻWأnwՐ(O&Ng˻[y=xR_jִv]2۶-QLN پ3Q(ѣUuIzZO2_rJ|}ZV}Tr%IRvm8VRkW'(Jh:~~eS7lԛoLRj:UO~[ 3zx@߰ќ~U*SG㣰V~Ure+Wr><1b5bJʕUZZӳO1dnސ4d+bzzF`V|||/ٵ ˢd(H-xuCT$w(%%UYekYՂ|cta9~Im#oRN*SΜ9#qq-[Vaj٪9:2}/uw몖שevz72O>T3>9[/}w8z{?C5ZjV}o.n}XmCK)1)I 2_ҩӧUnCz<+pĉO?*..NC{.%vdY>3_t:`b>uZZ6ǧk^s?n˵1.QT ̼v}TjZSh+\^^4?n#qzd`-]4OQ"Y?Ғet|9N}է~e*TP wӺߘâs۴snIm?ky.?0 [DTnQ^F'$I'˯/A^ώ|Μ}0Fcb=WrrN5l(///;w^.2'%%K8y{{+99Y.\,q>be,6nQK}Lv 7iwT_iy'Ojժ9^z\~嗿y&+~2eKs5]ۺE.;UQ׵n͝o2 Mnd@ IDATk<'NЋƫzjFI҃snUVM4}4ӭJLLRŊlwz9q>RRSU3,ToOskCu{*ul-?mt͓S|1]xAkQJ |+ܭ.Gg դW'zj.۵`"cwW} } df [{Iw嬜EKH bMpطNiӦ1mڴ DԸ֞qQΡA9}(dzּ)T)58EDbM$˷=s՚K""rQ&TN 4YsR"""EŚH)im v(}[ɩCx+ХEDDB󎉷N v"hV.ObR q!2en`p_e_嬜r $p DW6uΪe(UeYpJǑ%CS9+P95+"P,&*ТEDDB5:5bMDDDDD$X A*DDDDDDB5bMDDDDD$X A*DDDDDDB5bMDDDDD$X A*DDDDDDB5bMDDDDD$a϶xjxؖhc`8V9πQYDD$TYuu%7|(.* A$CG}  PlY9[k,""H*De,fuY]p8iݼ/>~ 2;w9>rHX "r9ѧ`ӨToq8rVΡ"9Z,0rE%c3^UoHEVޭqXvǶ, I v(ԥ{۷dfD9.,""ZZm5^={kʫӻW:H;dca@taa7Hhib15kp{<;\ۋs/pq'ս7d)x^{YY9a" "{oqK.`11gp6O[ ,}B8sR"""Պ5%]]۷׭kޛ=-'2w7<˯ۙزi-3gLZZZ>JK89vPzflJ^"mh'@ƩCr zS~{ o.nW^忻>6Ι@]qucoذ'W:tHӵk JK{ٓyjpx,ȔEph&'N$--ƎKaaa۫8ٗrVȜEDDUݺҿ~192h<<1*+VP@Dx8MީŢ-} >;… )((0 . DWcq/嬜%9RKcOrGDxxm 9V[KIau{gta۶&sy&yw ]/sqwC||<ӦM㫯bڵANsyx-K9+`5k""ZX;Ә &rS,ˢWϞ8+xu=r1|M̎l#7o#27oz2d[vv6\ku=_k{K9QkDD$TM\Y{^]9+`""TYc;NMƴiӂQZ{E9,"":uHeZZPC^Ï5 k/K(RΡWkj/qGŚHP8]., v d&NWΚVΡJ9k"Ad8$Q\-ءmy$v}ଡ଼Cr -;&:5A΢bYx>I)%ti_|1MxD$;~rYDD$-v9\ԭWc;-tW1e;,?AbR*GFlj*O嬜CAk,""h*DB@DDHgCiLZ<Cr =*DDDDDDBP\@ """"""~*DDDDDDB5bMDDDDD$X A*DDDDDDB5bMDDDDD$X A*DDDDDDB5bMDDDDD$X A*DDDDDDB5 v"=qc[fُpNDd`[>F9,gR&dՕn%3N|10+@)glH X "۶yrydu vX~#w=R2T9F"""bM$ܞZ.^\DNSIOY9@,""hL_m'vu72[[#v, I v(ԥ{۷dfD9.,""ZHPX!?Pt:]XM9*,""ZBX4y Y{PJjz.Z )Wg@qq1ZKv#)ٹ.[t͉'ymsǟjD0*tS9.,"":BX- ?~XV,&..F"#YRV,YHmM-\7~aߓig~*7Oo[|%1si r]YDD$t\x ;>7nb yS&>>tsgk~>GX Eff''<%7ѻHr8Mdĉرc),, Bt{5g R9XH \s.l{S&5%ſK .2:w/zA>;… )((0 . DWcq/嬜%9RZ~={4_wfQ]]MqI-[رۛoʶ_˨nEZe{9rrrgڴi|W]6iu=/:E})g,fMDDBUkev۲1,{ \i3).._<`@ݸ{ψ蜙Iuu5۷םVcN^YONoE˔ϐ!C۲ILLdʕm_s_t_ʹr]&""n?R{Vs 'ϿW_"!!};NfxIЧ`_<>_WsŗQXXKV/<7ymLy#&^zmМzxRmO׬Hjbknlߴ~|9;;oj4Nҙ<քǫP0Op}PYYYo{EE-3})罔s d"""P"Af~JJ ,[̿m͔2po8ٗr#95 klqq#GUU&Mbȑ;i%+g,Z`DDDBU]&"ز'OS[['̬Y{k/鮜sh~ U*DoN'ӦMcڴiAq=㢜Cr :Q$2y-SRΡWkj/qGŚHo[{%)58EDbM$ .i;L+PgM+PEDDB5 2S(.PhVΡK9o DgQ1Ѭ\<ĤbCje:4/>&<"rY9[k,""HFI;AlV+ޱUQ˲ 1)#K65ܧrVΡ5r 4k"! "" WD$3ء4`Y&^w-wM@UΡE9k""""""!(t. ?k""""""!HŚHR&"""""T k""""""!@lLgbۡs3Yipp:q;iT0M~V֮^Ey`#"p8Gdeu!,"*!HSL||Ǎ8pG;,i!COkf9 2t;, a*B+1r49};9Dpr _Nt5i QmQk]{; .ٔ8k!̶,\Z@$}& }±L Hw""" bMD$(TȁX A*5w}im[ACsNv0DDD䠋/-ܹs1bQQQ$$$p 8sIHH 22?ow07'/svѣ=z 6 CY۴i3/ I'ك}o!hqp7׿78NlO?DII W^yg}̙âEk[| ps饗ˏ?Xع(..c=3<`|.~Sڵ]v`9bmaس5v#xΧL>JAC9׮[@yynD~݇]\ofl18K9s1d;߾jy2=z'7fѧQ 9f8,X߷9z}t[0ս7Ǎ8%K0w|} z\xtڵAƍY|9SN%11Nʻ˶mx9r$))) :dz`nCddd0j(ڵk &&qƱsNZtE84h֭cݺu 4_C*.Z_~Ŕɓ^~XV,f<}{kDZo/E4|ɿwW^GAvlkq޹~w$'un):}=֬]oI\\W]G?lٴ3^&-- eW=j {z+V4srGx^ɑGILL C ?s3k, cذadeeֳo͉_)\z饼 \.\./^z)ODDDڹkm3?1)=1q&\~$'%rtرc+V~K/&11aK޽Yrs0 ]v%_d7 }=&qwLغbmÆ7_С@ֵ ]#nϒE5&;;#8?OTTTPVVPﺵ=}YKx koAii)\r guyyyL}rF}ak&yW6lK/$33ks_u:Y kn??Ws"111M~#}t 9ky0bTVVx,؊KJHINnxxcI öm_!@O{ߧ{n =z/2t=zT,/::^zp8msaa!˖-駞 5aLz, /8kMscOBj^?MO,ε\59$-: o˥_xzøuQ @EE%of:l^g\:tCFt?mW_{^eYzmn7#k})Y9u)tؑN:?/**+9r`|cߣ34MLg7x?۟ȁhfm]٧,bh/yANu UU1s}.Rnx'\Cx[/p-<3\{MߑCݿHHsxrםM:b u霙O>J.Y,YfW_T7cGjJ ~x]t֍ o;]ǟxAyYrlknnqesv_|t޽{fw='iҳg^yEѯE;##"~6ߟ_oIII|G~ƙ=Hl&55? )"""FI;AQcNl&K,GZ;C殩wov("MkWЭ&gvi?&9ڿ)NBr*"""-^`DچN M{LII96!""""JZS&:19% A.־fAIVuX ("""m]ktÁ k^q"z;:`}݋3S Ab|[65Oٶ5Ĥd:YDDD~tSLˤk^ai|^ֱp?r aIN IDATDDDB\^mbaVr8$$&CZtjfzym"8 pGY C+,\?@DDDDDDR&"""""T k""""""!HŚHjxjxؖhZp8 '"2 -3.""""ҶTJr7odQ\T"[ft8HLJW~տ"""""퓊kپm+ )gOV8`Kx_z=n\˼/?!9%xjZ9BCZ=,߷qdKXX8N! G8N+^t56F̶, H B>Gn9절BZXX8,h&[tzfe \ᘖĀEDDDDO*ZAHi_-]SƌaÆ 2f K-k=kھeزe8異?^N;4-[5#ppOu]wЃrWpᮻ9s@ fο跤tbm_v);`WMͬĉIKK#&&cRXX1d\y]y|2c4&""""\-: W3 AwM];pB 0 .Mc; UKSnj&7/׬po/_yynD~݇]̦Mr}4ҩs69]p /3aȓz<#G>?zto{iisw}g{;w &OΛϣ?uhm};!>>iӦW_vڃ>FZiZT\..ڇ}L߾}^oǎbl\s4 L+Ê П|O>>{<(( 5ko۠s/coֵ ͞ɖMk;yy+yY 9YRRB~~>C o&11+W1ZN՚H{ /%n^yuz7n_LrR.I;vbw?Υ㏥O^| x]1Vbcke=bz_<^駍sf&PW]}7dzdfǺGcAWo{\\MDDDDDdٽ[W?G5kqs[1 sϿ)--kq:{JaQQm3gEUu5W^q=t{ϠXTTT֛yyزu+.-hd5x*++m𷵅|Qg O>VFDDDDDrHK_~%\sxn"뵥c}XKlͫ<77F ?/++i/hZ ;G=W_Ϥ;Om[\?7xF p̬f8=YKII!33e˖1x6o1ٗ+K[1i!Oc3pM zøuQ @EE%c: ֬]mۼlڜYgo8S9jPψ݅c+|w˲ճ' ^Ff?9ٱjƍG!//*&Mȑ#ݻnw0V70tt`80#O<k'OS[['̬YɡhjJ -FIᖐ]o1z.8`le%|L~7N=O>|W^wA wSQZ QHc4 Y \5E[m۾u3-Wo=[ja8^~2 6bY[75+8wH׬4!HS }g2l4K?~H;7DE`YfM> p{%$sSK":&۶#"""""m/g'ӉeTcנ%0bt".~|^nMDDDDͩX 0 )5m$&;[HI"EDDDDژ W#Y?DFF vX~]ez#}wm+G&""""" G6t:)ޱUQ˲5ft8HJIc1=VLDDDDDbDDDኈYeY&^w-wMC94VvV#"""""-eDDDDDDB5bMDDDDD$X A*DDDDDDBP V1}^Lmä}1 WXxU[94܊Hi !P]yn~+[((<0HOb݁69fWi1pWs+0 "#HEJj}nED$n7[Yz奻3A|l<=%+A!X3}^63k^{W4 CgRJٶEuvaЧ[NWXy,'?'rz SVS~YLm_RZs+""g8nI+<"aI;zi-0AFVCdc⍤BtBA+bb:{YIDǶvcۖ{ :wݽnc/$-# Ɇ5+kϭ+1r49};i\a+,$%-UٶE~q%9sTE+""|mQk]{;i2dS^A!5Ӳu2p36+ltjMIJs+""g[p-.%eZ=hjc[jٲZLXMFB8aSFvXS]CYyՕnLrMRJ2q,,CcX[_yy<5ܵu?{j驥kr4x;;d !8p{U|>LӇgb>LgzMZZ`,"""A]k)gA^5E AyM^a7>w-kr˸='] g J3kmmk>%;mALt4LPZZaY;wd޼yt֍֝)"""?X3-xuE)jqc 6q.H |׃%l^%nR@ lfӦMTEdL4ay8Naen:*ql"""&^n>c0wy=nL[cvݬrVrMsxq{<ԺֺMebz=^7pfϿeYuGZIn^.. zCDD$ a1n8j95^7GlG12caivQ/q àOZ8 zqx51>`vM_m|߮~9IMM%!!n͎- !(dNArR0,|^LW}͚ijia&׬e˖Ap|ƒz%d^S˾RoNj FmrEJ2H7vϦyuxsYoǗ,Ya ?xc~;:u*EEETTT0}Cz{Fƶ)*(Ķmcq)̦Y."#"X5emYg9ٖɂ/> w!"" g=ߙJԃ.3+'GO^%}l A݉3k~C\Ei>Ν;rNote!_mW%izp{sLI&a9z+;wsDDDzj_{Vک Ȕa[6a<^^/>ra[&>Ӭ+vϤvukHIJ,LǦ66z(;eZkܝ0W[|=m| >-[6aWOf3?Xޱ?E`,)r Yܱ sܷٻU{_9;ͬH?~2ՋwAxFP_vN1HQPM(V$whX8,, /,HOOO>DEE4o gk.7\nc̘1 6kolZZZalݺ|VPöm ˋgam\\>;ϤOȁL"2NPC-2Yk@uurMsgA~~>yyypu^ee%lڴbcc9묳|TVVh" }zǘ>}:[n%//&O\j/"@?[uV:(|I~5 vc6mz|>(HINsf&9ۧ7ːѧW/5{IaQQܭ%; ,gW*Kګ>eQgP=2*ACGr)2,.b˦m3pp3ظz;<:&`TH0?.I`7eW8FR&F!8`9,;W: daXxڴi\9sԩ^mB]6zhΓO>Y?d̙,Xӧs璟p붨X+ tMpXZjuש sC̱80 ²#W<Wõ#~``]^XtcKTTTVbɒ%<7k6nHxx8PAOLL$::{+V|r9t}oFFddd4~72uT7A[~zv "*&K6 }oc}}ׯZJGrOo$""6=^֌8уCm)8 OtpaWcķcSb,b}q\DG}>ؗ+|>,zWzfW֭^m[?VWUp:muܱm[6⮭pIdTt~jk߻ͶkqTa[^O-[7uN{ԝnmY_k&2:9}o.""rb۔±N7X1N0P+ݎS[A]H&1>>x?.3^{oYco:QTO> e_i)lLmuycԮ] DwMe!Vĸz).dcN=%CQKmP20wAT~ywq ]q!ݤ& .co|өh[n;ѭ[7 7oj:w"?]~%LkWU3ݧH=c{? ʫ^ZVƔ{p{UY9990m; ȭLjjٹs%;KUVJޖ-q k֮eulڴ)**ʪ 0=׮`DDIGDH\Br݅O׺n֭^NV >~EV'W[UItL>ۨq-{a8k)tqQǍ"2*p RDD?XxOy~f*0t40M܅]]S>2 `{n,>1]} A0mڔtGӿu78[FkHqy0}{/, K&)] \==[zPSiy=heO_޻ovm6#cQGq]Sx'0MgΔ)dҝwq 4 ~²,餬^zqe}}ܶz}xg,>zޗ`4͠՞{7}fN%ةEDD`, 4xvp}ګ2M޺|u7̮[`2MR˶,j+z`&1u+R|lpnٱ} ^Խ}@JZ:q G5 Qw/c*""!(ca7Mq:+Lv&)+\1`ϨVngPX8//'5W_EVVvRYQ9gfaG<0xfS =x|m.|/yK>}xٸi=Gcc=Rk_!km1b1[ )tc$Gq.ʎ`yQmqczo,r҉57ʫߌm>)3u꽼Lnp+sz`57^/ ^bZ&'pgpгWO{2':w$..#Oۅe rqtڕz^p[/7muom"wGOiaZ&m 5˶d^?XDuU9:ܡSv|tfӆՄEFFn=~""q$$PQ *)|Oge[tggm֭"w,"22^L;6^0J'&xKWcD:!#|FUʗ2S %$gMaa!qqus~EzNwYc=cdK8u3ꫯªUر#WiIDATfNfpzumf N JKB˰z=n|k()T+`۬AmMrʙ>a`>Mn0z|A7m{tl2$^y&ۧuSŋ6T76W-->CTde{g, gL,<^/׋mxw/&b&>_}LˤCwd^Gd,iE>_210ҽ7]nnǞx磆l>t膱}Bh"""m-c}¦gG⤷ Q w95+]DY^q20"+˨YmfbZɉI|sc_+=dpw7j:_X7gÛaHǵ3Ne`&"*\om~sczL&nRVdyEDD*r-~mYYUeZu i׭dmwڲ!m 1-K*<"Fߓ8\a!~  oK~gso~z'/[,d|\Ǹmq'+#0=5?;n3M# kg%~l} buˏV{Gq3 l!]XRZ@P5iS۳iJg/nz/'LkTִM&-BŖ_B`셯nԯrsrsraz臝I}+U/|oAodM}p>/] NZnf~),?9qd\G\x[>VpcG,=ڡ^ _#͞阅_/ jutt3F } ^@S5I*)z}ݹ//=ui=W jrֆ:600˲L$L~VsXؖga@|SeYodۑOϲmhQq[AslV=DNaͲl,PzZRR,ŀ%iI/4˲l툕_S'7}=l]Ϧ,?u eيУvP)^YsSXD+>X%5e?=ٯ7;UT%#"jliSEU rbI *g_^HHeyӾ&lȉd`OWGs!ɱa%99Qϝ1>EmK:}Z-*Wmu;91Qge u-Kr%*+KC ?533-㙠b۶*jllRuMm=DNa-˗8go|keɶHqJʕk[lDPu =6bc=:`Aoo5!a B!DX"@ kB5e^wIENDB`netemul-1.0/doc/ru/img/send_dialog1.png0000644000175000017500000002675211277123237017126 0ustar frostfrostPNG  IHDRf9sBITOtEXtSoftwaregnome-screenshot> IDATxwX߽(` RT@DkDMQc1_55'*jņ((v4Qz۝q"繇~ݝ!  .8x+CߐUP6`0Lb0EժԚl&$] j#CEqT"H$*qblP(}X,ѹ7!?2tH׎TE1 5#eo8Xq2TZ-D,:蹑G^KW\; JFh[ov/KuZUC0=nmt E~{:)ON1BG{ɗkH !B$ZB3t=% h%rZKAl٫'4׋.r7,ɛgjjB@R!O$EeRw09IQAiI2BP,)+O~N**(HtQ!x:?j mڶ ם#gǁ_m߆0Iog/'~0vr¸I^#vjVd%v߱{ @s dd?w (It X<#M.<ϘV4fI!L#fj)!K[p6ޞp/7_ &R!DQ( ɔrfɥ5Z&_hŚfE\vNi `ٍoc6ug X"ڡ mrS)OAIynoK?}@ '3N]8㩊nPݿZg&?sm~D`gK<@~+׋U- E}tT~RmvĨ].\Ziϥ'0;[GƬj9Rn1)@R)ӡ%Er>-=paL )JwRKT3{ *tB)rKe e`9($dk|Wɑ祿l2+wۃ? ]7=Nӧ2%ߟh91W턽iw'gv_'wr[Nx/īnp=ntJrB66T T2ۚ;frsr0)e՚{Ez "ZnJ hB9YFLTҽ15!XL:u`1,W\5_ 1 :oW\eD])@(1kaNߟ( շG :4$Z[/h!<;P#A^پ++ &|sI8ͅ ۻ6|H oXgPр jj-Ԑ`0=JQZKZJe{ܶ><:TȻ]1@p `U:_`љlvTHPmx/B괃% /f'HR*ӎǥp{{є'*@tZݤ'v,禖 DjFj-e4IJC"Bt?L4\2 + m< O=X2G&Šba6Јfq!lӵK'*ȧgV.wb" {|gZy|p@'';)p,]VSIX 5UM-,N{m(;ج݌bAa6c!pV^ Q) IJ'!R@ҝ[c2?/SVL9 Qx%Z~zʼn 4[%o.#:T{~;ULuϞ:~U#GMMq-Vz-r tt_eiZ95@Euuͅ\|X VxRT ! )Uge>b0-j(?4v}\R Wi@tOk6OY|=ѳ.f;[o/GE{c[3M 2z[\Ig:V軔yϏ<hқWX˭aLZnGk`6+ y]V+S4Z-0 >ͲW?(RDZ,UH5Z q,:s %_̅#|."W8W ro["b:w2B3-*-I+bi˴@0\:BvfQAWd<&},g)I/,ў>3ÇpAR&`r s Gu; Z%dL+:p9R IQFgx;C:ɷk[qEH"  \&< `ɑDB \ FӅ`5Zt7- YAg0 !QQ }(Pbd>*O`ZXOPYv92eQю  NS'N0yK3|@g4j«iΎ_\ Vu[.?;{G9 ~ ])AWXյv LZ p4D2߾J|%sSdž5`8;98W$iSH4 *nv8 +0T*g]LLϸ*OdOW.R,5R,5R,5R,5R,5#!)̘٧7wts \LQw)cS$Ag =?\Z&K/E5b9^">?t0l;C@*Ҏ,^Mң;}ƀ5{q,G¼"ԋs %O+QHSb^A2zIov{'rˉim9o]]U17'sT" g{M MnLϊfi.j Eeܹˎg*| a1IiO~3p[RBd"zVP/RONRn[!R.KOA+M'[fm{P==kmz?{ #ݐ*%#l/gVݼz҄[tTlrrrrr0]gw a".櫡e΢^K^ҫh眭UTB )xx4ˑ) *i ohTjzGtyme}&g윘6%$fH#9 eΑ33gth.Ss7薻`7'&؅v 9;y).PeI=`\svUURDu0[ Ev\"{/(c- %Ӽm]>Qr`{*RՐ%_sΑP.Ax Mg; 3E9  V`)uD:3U~RmuZaNUZ.:Ft4ӱ i9η? =Ny$LT.l8A;}>^ N}c*P TI;>YA}YM4R7@}]z;Ƴr}6ҁZ=˛GIojȼ}UWajbkʔ9+-$!h{V[>X|ҞtKgu'ڠK_ i9mh8$Qs}]s8Z<_zs8G:tDC*_ؿb(]V܎[pUցZ4ܡzgd`\afN Vp@\7cPW44`ʒܼ&Y`gڶU-'nuۧyP4oqL0sǚza98s~JX ٪Cw؆[ثu]V_JFQTZZvd2PWྚ^ǷpY,VtT7ܹrǏLuVj:7~y& dR ͉angXmvE}D[C^ Z=^hTkb!v7K c#06K c#06K c#iT*}Rp8nnn$uRd2on2,9@ 6.iJI@aخ?4MnՎW3,ϐLW^1Nɛltа< `M\?qUF '?&aG A$8> Q>"K,|9/43!c9999P>3[ ]|ÆgqHSCIR>1֥.ߞB~%ýE,:4Y7ss@-\t6e{Kᶄ96n;eΑ33gth.Ss7(uI|ߛfük+ndYd~vG1 t]0y.SfUd%G͉ qa]Bbfd_QA08>c ™(,r-Ϯ|A~RK! DJ'Iи-~1ޭ4F#gHw= ZIfGDoݚ°|X"aEba@}UfRvi ]gns75η? =Ny$w$u괈/}@pa'AoayLQ@sENAc+rҪY,j YDm4/Ze-M}\EŇYVxWO Uta;&_M8}۷ܯ p:)]s8Z<_zs>Cf-|0߬M}hϙv`],6Wk`w292Mߖn ?:fьViy"~/B-'nuۧyP4/Vke9VFl'9o^k;}-7y<^U,7d3d-IiV pjMudP[d 42[dSEF]"y|gCW`XjXjXjnv4f|7MQ2===9??Fc#Kg:JJUt:$kov멩ڷڡbEt-@h֩t:[C˗-F BWknܸaNQAmZ .X@!~ la:LGv ԫ~:\9Z#N͵jh␺#"Zy6m>siC \|A \= 4s$CQ^LFGCCCk- ݧa/wwޭu>]]?%2 <%+ћ. O%ױM-LJ!K4#֟gz"CR|`Flӟr^e D3WGBQQ ŋK`Ϟ5GA Ջuʒ.G, PHעpb!~qTRSj|0Q={BfBy;}W={@j4vt'}X/% qIDATKb><]O*!Sf̙w1>,)E߿sY9@p5{m%P Gf Q<@ZyS?+"DTpCc93UV\_لGЖ. !ӏ5aP(/j 6y^II[7#]Fc92%jJ7J5 gMa ύkŤϊR ~lˬR"5Zh}Kg^K^M4 "ݣEOȇ @sġiaOFƼ/avC5,vC?ܼ⥤V6ѡ}k"222O?I[TUe1YQV<gv1_ȿˋM0+b̶_ [up~1TIre_M޾~:s,~0e,u2ka_Z݉fw}Ϣ=Q/;j(s^̄e+>Ֆxiog޿գfPӧ/5Twc ul<֙!q{vVH$J_7{5Nz~sڡC{:{50|Z@dRRPRR2L@j:k{תsAnSlPČQg ;yubT?n7;K 2UQ3UlQŖjZ%r!ʉ`{J T||LaH-L#32J!!U2_Og[zyxy20~VfBp2K{tbZ;1@).U.N{*v'k:~4)wVdO)?2%o$rҳN,T%e>4~$I* ;='hj)8CQR]1Ii ۝.'Z6(~͇f*-"FLrJt{,1ulqfL "s]c? Voh@Ks.&O{۵j:S81zϫg29pܻ}x̥Z}8ca\6g $K[m,QӒb7ķ.^M/L $#'.Ù 2B.Ӂ w&yҪ?q|z Hyn#zEv:d #I!D$A!)8q=":=`,l)*~<\%ZﶏKm "c 'l>҉^|ϳӄ3]tYdC*$iRtHm*BmCë0$iқ*}lZY6R~I4l+Է+x-3rPfG4OwN%4kN"z\2́HPEtzoݑ+W헰|iBN'$E ;zp.;.8t&/Xu]BY ZXFoei!|ފu6B;c6m3΃:8ʿt*8@݅ԋ߇{リz0>B!sBN]X b`aC[v-SKYW[ҒH&W\gZQᑛ=(aLKQ`!.44ulсFTP` P4|E Rb2 Xa>kՇÏv{&Gn$)v5.. (,ZejB&JBNh׊.qtfN{f \v*eZҪ\M s\A@O7 ̛٤GןJ U1҃e8!tZn_aŜ(gQ"cgn/M Br֮ete_A@3QE[wR'f.l)]rU)5*F 㲙F5UTѰ$\CS8q}9 ?N8oGgA|oLoCWrjك#^4p.<<Mω{ayS;}ܥxs,W5^F󧯇3Wń ~ܰ4Mќk%k%I>~WN4\^A֞, K@U̘<}]+֎ߛt:{GAJ8Y^3iUUD'ǜMUS`}3g4We~q6F!S+deY6#:4WRB6_/fO3N&6><=TPUmjzi%%LҲW;hE8\RnX W}U2IHy)M Z-ӨJ9y3bdBQ2ZlbZ SRH5 Z%D JESv!&~Q)Jh;͈v3wrx (U3ף*g:sXZԯfX1 <,0d4pEBe!)^Užkuj 5O;(0jcܺ}zlPaݺ}ƕjTgb-LuYP_e؎it`alF`alF`alFqCWC4b(@5 IDATxw|Wջlr 7Mې?jx)I B B(H!J m;]:ۦ$d5d|3>;<3{7?mZ888888888̢w(1PiisPdI#Q !Ĵ" 8?q!/?}TDH$DG!,+z+Wk8 @?8 --8.@aHTZ9F22+jO=YfMqh XF?0^⡷ǝrg@g~pqBKu4/hCKN\hx^W-[|ȂQ碈MBcVoYp0PC Z߯zO HUZ6?[FGJ;?NE-fkȿo |]?g{`<:ЊeE2}Vݑs& 1=`dZ1qN?:EQGf>bBh]CrS1&n (x]"9s7P;=Զfe>+Έ=rU HmX[’lk QtoQk j\!C{~V?>6`;l< C^v%8ʘExB!JwQRvܾ " hR Y~OߛT˜P b00{&{~/o[r\Z,0(gŸOk4<yU_yw\y˷N`6|L/Cݛ(P>kot|o\}}oRg^vyg)H!^Wxjw |~u`/.a5t{= ?N% u9eT ͦ/ړ_x[9׶y͋ӡG^r悑ZG#$՟IĮ&ol-w˛O͐ O#oXyo8猁;ъ)?^7EO<rjg{[=ϽwXsÿg[~ss;y$qmw\8|}ÍVJ׿zE~%>0&'TY)xœS-9mN{Wߥsz\3;&vs8N9(c_nݛɣTڻږpBɣ-~'QaN44eDr}~DmeEbOS[$Q1*C{SĚ?|X $^%߽˿: \-/׷]r.!!'\ȋg>8z冹n۾tO5{N~:降1tw`LMC,1ȑ' FB USoiՔͷj}p Sv45H(/ S}-f?9vWE3ۍ0i.v;Wn}Įekm+׵d]0rǸ{5J϶ ̀u7"mv0ڻ31ğE[ǽIi<ʟwc$Fh\Ksr\WGEo;^M&O(ș8ܹF]4kȉ6} p]/;Vn=踛 .~uS =2Μs+7虝{2KcKeeFnt9{0X"5OsJD)EcbPޥ>rF$sw_W0_w|nx4-{*弜אQsjMʪ[\5eX m1w/ gΞ1{_ᗟ7m/-W8u.>lڭ_;g|Cunϟ3;Gh'8CIM򻮸(.^[OD--oIƝmdU_ 5~˯3jr`+<{SϺ fLf=5Oe =`vs5u2ߝSc;ι U謽cChԫqtkκ0*$߬;^{0>pu^ŊUV`3/x7ny`yHu {߻}ᩋλ{_S1gӵ ?=ŗ7˧4NIŗ.3;2_i i!qQJwQs= Zir3T{,5{|qQnf/(p)&]K^[98 J)=-_cH &fj{mUWK+B0Z&Jy{i4ǐU)&f5To_HPI#,Wlþa?z1cbMDٯ}/5pZׅ3zЪ/_!'L̻=V~7)MJ\ΜmYRJ]r(HIarFrGj֬9=b}X6:P>2Jށ4Ss'n0ԋnvPbxbee;W ǟ֦:vffG|"Zꃟzt|]9&,wfg xHIt=+iw'^  !ES{̉ExOf{BXyw}eH}m$Gfo,mHlLI Θ9vĆe[f1"7E%`fG,B+J!?]vCS($XS TUu؂s5YP\5M-L\\ɲ D)5ED 8#$!/u ;i"yAd_6U឴K߸1w1cO9 L{L<0Q8aXxL_?u :hjN.$ K^&e$ӊx}yb=u/(5]0wbq<Hq[XB{6 ܲ;Nz#& $^:Q==*B*8s+xf&1 nE~g;EZ%ݱ'sڣ떫"w2&X=A| Zex__Re}c/fgtz5ezUY߸㖭%wW(ԃ^jW^UKQHz*0$؛\Apug|U5ߵUU5h9bb}uLX{%^5cFH+<>[E7xR6MLX@]7yIrMso}G,V^YSPMu< W漢Yps/+i{3B;_KYD(漢}7Xqm[OS=Z ۍ7ic:-}逘3~VVN|m l7N|od5O_{>yZ.]C }ߞ|os^4j̘4:>/MZNG}$ol녿'xp?gs oDnbE'٧wn]vg}J g"z`U#v ;:{oIF}Gs}׼)Hs{hjǷ?o?oQ^sfGk%Qa`І .M`V8o6{EL~{_jsƎ@IDKTty XL5|XNưɣM+ḧW};{9-Bbi(5EG$8bpgy w2T;C% -D??ݗ,ѓBU-ѐn,~JdMT)Ԕtof )~ɎGkc!ò ZV/whSe8ѝ/ItMKDqLFjqv|T=!9n|uܳj?w_VnWv*Cby)Ytg?_74Ҳ19¢%Ѹ {Sӥ`eu[`'}\@s>vH5_d=TQl|JǺqY5? in*hAXU EDIvs2SSxy_`~4^Fؤ ˝In;]2:teʱʚzޡqmkΑU/?& x3{(!t֭\=h%)lF9J̣AXp5_(LҾ~u0+`AlagbXa%j1K.Rrzv5 åtb@tp;Ki)\L!K]$GcE=?\L_1ͣ) ͦ tM8p=!Ms+;T(d 39kušrrepphXHKH91Sj>?50صx&s˂(0Bߛa..н$z :=TK%vinwA<]ukS$R}"_#tӿn5w!)+%oM}][ѱ*Nv:S1WtW#o-թVtiyZ_pt1*ȮxABC6:Yq۲϶W,9gX޼O+؄У/c[3yY9а?oܸsTcT>p잀CJoIGw_Zߙ?z'N},U_opy\|oW6Sϻqchg?:}ImngM-LQ`%p{хnOR.{\?_ uધk} qҲ뗽8;Y:7Xޣg4ѡW%3_Z~o=es`7Mυ/yɫ'ymf`F`Go֧vV0A \4&6T5,)q{NGcOkrE{S;Ag=\ֶ/.mے׶ÖwN~ey|nWk+ O*1@/' i8888= 6Rh'#`A'lx=*ɂ??6Byjς*RZpgH9T߹xrO^rbi{l-=15bMχzWkNd 'Κ5kκwM䂼yF#YLX(ޚCH| "일pz QM;U4V,nFūQ'z9Lh2֭+!'`RQ4V{eq0Xm;wl۹,ޯ*7r-,1,ٚ~DГ :pt7Q_6+W#O1M6@;I}Cxorɝ+Jw,Q~oJVy{Evi qppp8)?Vnj;M61> hxO==!07hXȦ=uݯN;۷u`AzR7:;c^lY]`w<Ӧ1\UJ kfit햝?p% h$.渄 +juZ&òEt65R\3ݠW^E՟7jlq" A IDAT.9i*\ol@֐ j)x;&$Rָ틏8sփ z8ܐ$ViOl~ԆֳI 78 aɓ;[~ =x[&{5m}ʒ;^__v{;}]:h>ХEe;?p8\xUo f~}K~|#˯׮_ɣ\QGN;^PaC4[ ]BJ&2&kW+8S=prӏLf$?mqV`y]k )hhHKPTso) ZZ[-vi# (f}+]BKϻ[n[ɻF$Rt;(bmpQ>1mY=j7]8LU!c,jΩRE=Ǘ7ӃK'|N6!%'% ~+5H_VD-ƈ\c9ym楑+vgVjO%"Z=Vd=;o(2U]˷,_yӖ۷l^wY,(Gbc6%q*!m?uVWFl;RgP_TElj4GّnFÝ{ccaK?{=== Ig{F&ٮ `lm<1v WͰ6Zӿ;'H9t-rppp#){wϿ2s1v}O^qʝ1vyi_~eO;Lōn-uiޡwd_.y=Godd9>0F8P'𳓮Zأ~њlBX2,⾫V2[@t޴!u 8'4m[)d ©0# zGM),Ye e_θF+Vb$2$j 'J=|bD珞ZXkV։-,2$?r۳w3׾\Qrqwo>oO)}5pzpp'5>oz~ ݫvWl@j;`w{9z"|$r'Fk5ׄ[M1uB)g{%tH:}O̱ǢG VGꊛsg ܎WF|ÌҖC4V{[2I$Xk޲z}=~߀N xfs8885&zK ePҞ;S™;_5sppppp8<8S79z88888888[̙6.@85GHs.buppoSjñBΤ#D/9ݐàpV98{|o6m:̕N6m釹~KYpHq)cD,uzO`l悋.(w~{|sϻ1p9$N@KE9.Y(JP^QEË3dT^~"'rpp8(,6~¤# NR~[EI<7oX_+{rzKlB]c^$(ṕ:* /rbc4ca؄p˲ry~,NEneY ɢ"k>755P!9!85dTbz`~C&M9W .] j*vX} Hc.<vChfeyLLږI5QB RJQ`scBlۢ0J&fI:}A9eq9c1)sg8c2c(1?m5|W Aq8a1pU;avqm۶lcEe2u= Kռ> uG"fӴDQ#c19g>7z0X<WT%)#jjk0‚!(h,j۶$I[UUQm0Ǝ`9'XiSY~M>f^i1bSbۦlKlt2sx!;%$IF"sZ}s8ܲ;k~MPhqƓ$UPId 09CUFX: @M f-SGᖖx$BmKp|Ol© N#f8rJl۲-ӈx,NmvJ//+}ʨcNA5B! 2(MemĊțo7'63sR\#r<~9maSιYRU|غ!p8Ħ1(aSF(כ24ːsh8x^<l޼YD9dY3vLa QBq.J)#&pai{#FPb(n p+sF !8J쬬ܼTJ) B;vfdd4A225M5-ڻA@wq=zܶ|qUFai90J!ڌFln۔b )9&o$=_/^[5"#sr1 mĤίn[ HE%''l^*k[:@3SS{Rw81ǀ5P$̙*!MTENIԖ +HSEU-J4=͔™8DDAD s9Qb۶l. "f2-SJUUnȎ**BdITD$bP0F*eϪ.d_^<Ƣ7e$h{OT➰?*,Qڔ%&m~qJ855vt u=h0L3`ut3ƀ174i.רG$ dgqmRyiiIYyn芢8ҒҦ@ɓUUoP8EAeI=mn3F,۲,ʨmxL׍3gz*˲jMTUEP8'9iE)5LSuزmkcSӤIGrcXYyc3220Ɣ184H,ejjjzz$irt'qJnwZj(:J"v: nȑ#ו}}c-̧ WD uMVȢv ޫ?a|&I  jU҆yKܻ9v3LPO h;Tr|B&p۶mBL@*(z,HlNmlF %wWBM9 cic? KO5ȯs͉9S ]P$jˆ,zU0CdmMT+tUH a9ER S`PjkbZSM[nYDP0#`3aTD4-!8-Fm[ؔH,(?:A} И[~E-B|'~6S 0.~ MDH)UοSz΋q* o I|*NQT+Ѹ^h-ʈ)4^qgM;;P !KR1VS[EQTU0 *V18lEE(5kf׿RX"|Ua$`VKH4liEIRUMYbt$55-.C7&3 su>khAEv9?+\aPJYd8cJms غm۔S]5TA ،rc!1Brƃ`,OKMe@;!UQY,4MY5M%͌ARsrr(c;v;vpAle㨽%::>uq%dY6mJOABM ff^Z_?Ug UWڢ-}wň1q!B. 1JżX:x07u 3lB v^TT 1X4cѸ X42_Cm%WT$D%E 8cD$J"QÑh<w{6njJGPD=Rv7ۋw1c')a|)UeT$©9e;%EK([t֤1FdGju\D }j8FT26Q1B Y3g Ʀc hd(-ڄ9%+ g24EaF!I륔64:Neq͚5ծ]6l܈ӏ1uBx^^c!&1MlH_mniidE%UU5UE1I)!16۶Zeneu.\8ёFƹ(`YEd91@9K41qN1tDȲlؾ{33rU5}R۲tðmZ{ADA$I/˻tY=o ˥j.7 CM6͘1h=R ʾU]&Ek]RVZ$|Zi߰cYeY6af2J+_^Cն >WW2˫ 'UYKwM\36I͙ZSulɟUrŒv&@ .1EE.y$@-a4mB$U$FLu]0P4 MD,aY@p9eB8 8g&v4olC!Bۛ;k*@)ϨT#T\>:XeD,Is .^4„lGD0gٶMMlC!}e_CCC*"bWEXu< c,bb~jں~ӧPϧ(3$It\(PJl"Y[Db^1,5r[K#缸xȑ#*++㱸w_ǜ`z1=^Gc];wfeg@C~-ӦOZŎ!fe_e#Mvy$Tpco;ە&jyMâ&0jQPb3|b#6V!p 8Kie4Us҆fqcsOKN]+0]it_]B:KW!%zeUČr, jluCc( Fz0˘jep&D, \[0964M-@s0p`frJxG\01B|?B Ds[QlZQP~/ ]mBcbv"k KJKFe555EEEa#0ǔQc$ *DQ7 UéA@4MtvQ1NR%n-.M+.. ȶeYpL34+V`3Tu {6fB|& {Fyne(ybnl"@ 6%䕿oqonry=^yi>1wFj>tU;~pBlDCC] K eXS`TECeUu-?#S2d_ ,aEU?4I.Hإ"1nI"C 8GEu!YfXb + )HQ,#IaSc<1F= Dm(6dX00)4{04nl[{낗n?ޝV˲\|vK*:պ-(,≹n !!Mm/mqi4ΎXԶYk|z1GtQ.MH!{ cpzsb4 H8'E9`Wec! s=$I1DeUUx4FWT5EѲ,@~U} guF` PJ)¨3fpjjZ"p!$Jj0u3uԄ3X5~AcScٳD0REQaI0MM\eIj},cRkv"fٖei6cX$ZUUUXؿx)~% c"Ƣ $޸4 sYeYQU2Mʘai1۶Mܽkw©X,^^QxF-IRUUeY3ι"˒$$((|ݺ{>}~Mk(Mؼ}\*Hn5~?466FQB ςc!XWz %fEBhe1qu7* G-_q~33ljJ,fی&إ+mwܤQiB,_ 9ǟO[P^ȥ)Æ[ i\}BVaÇ5iG1pv }~FVVVa0Q.Z锌126q B~^h,*`RJl*677I*JSsQU>)b˲ޛuUk3ܭ3FuCz5=/n{EoZ5-u݆MNLj#R{-~.3n ps]7HhHd-ˬ-Z0XV!D Q31bq:3NpqTTe###sssZFTJEQT/^v,0\,{mZWP ssWԫƘbLn6L&mD^&Hag[+t\ 'd+|ݺb1 (\?*Xme_AH3c){BlZ@ς6`$P †Jdz)JVzirvcşf{50[ӷvT˂S/~O^0Qn<~}S.^$Zh+,ݝSʖN϶oYto 8^3sWgVx @jdq2yυޚ84wf0L‰[_ 8JjdXTrHiBmW8_?wWmcwJyyRe\j.x:~ A2FpD/4t FT+a\.KJ5 aZ.RZi$BƘz]S \pfMǓfI|px2"wm4zfxJ|Gռc'X]ل4>幓XpD"Hi'<Ε V)03\׷э(K)UcQ3%mٳgݻm۶Bxb7cWPKjy^Oo0Be đ|>ҥKkVR֖夼Fߵsg28utwvmn= H:5Q{DNOXdCCc.8߮Y7:6v X )cQJ2PTTlP(J)z{{gffZK9vp>دٳ^)5,Uk\f333R0 s\&ɋ/ dF%HsΛ,oq= EQiuˡ7m,M7=333?rTXme_AXSKJ\\ &۵xOU@\%W=V hkFjTΟ_<` 7޸cO[ ucnoPDqCC=΅mm|魟::Ux{%{x»?p~<\?ԝδ8&1!d5 !!4WGJ2d> s|+rFIɉor&h|ޣ_~ip,VYQBϪ߽&+MR-I kܘ竲 n h2 .d0XBVcq,JH )RY.eB44@;3< &P4L4f<|9_qc9A6 8?~:|汮/<%QKܚ!ɫ|`$*sL$XHF!0*l7!c,JwvQB-:f`Ip]\.8~otʀRjtl\)8A qM8Q)1\esY˕:HRd*.fSr-/333M͙LEkiӦ( /^Wc[ї SsWGō!qH+ .]:rOID9ASSzJ:eYLcȐa~!d㼭矯-OcΟ:x@CC|>o}ۯ۠ JB800&0ZX(ujX!s@* JJH$m6qk%UJjPb!.o$655 !N>-D өk:Q?`!Rg$RZM jt9 Pyc;;pRVU!ih$iP|0lp׎J N5<3_P3 Ӿԙw΅ۺϿ?;0ݘxv[kzWg& GL=2;ל/|ό 3]rDd !Dt$FR ֱ 5Y16y- >Ky$5c.'"c}E1d`ޏz?~MOm'͇Z:WC2@Lt錉JKgh &rW7vKͪW1d2&$*B3u>RDX08**q)iӧHDd`Ω+|%ǺdAg!5\j`ގ= 46(8Aj'8M £mC7?\we4ƍ`~Lt<_uExVߍ1׉!00$"]5dlmjZJ;Zid.)eRR‹Sӄh!C˔ Xmy~0|wq8}qpq@T*988Gȥ9#D`?{p cCQvvv,h7nT(KbfТTL&dj)Z~zzz`388`S?1999==}=7yPaۆs)d5vuuB0DJ!! ZOO[vzrr2 ÁY-.bT.2A"HqBX)W[STkK繫bKoc!-Z"TҮDTZegоٳg3L{{{"wPGӼ0g\h=6F'aгS ΀y"QlIp1*jB\U 9;W?M󺘾Oߛ *Mڞ;йZz`/voz]O\T8.nhUJw0FiPhA 9m[v2hc"]H)DcP$" IIK%D*r[=aMuz\ `Uh@b8 |0m94 @3ln38CjT__zk+1WH-}b0bFe2Z"\AXfe (t\7SERQZkTm'[ossϓ1Rrw!q j =ߕvr3< c[gIgҥB.:5==ӳ|H${z+, d X⢵BV*)cƘM6MMN`lvӦgϞ+uuuuGf>7d>uDc CV]JAVZ a  ]hmm9xCDt~hhMHim b&fy9l.!q=uH$y:2*@XΗ^tJ)JCA[z~&IӮ&+ v:G >a!.|'&JetlljzX,^QlHD[Ww]]"c;0DRj)ƱwX*eik@lp|b|S{{Q]TBGIח! " dPcLj(BSs544744v8ׯ[ga°}G_:x9mkkd2 ( XH$mx1cpn+Z^TZk$2KbTMMMss7V V[3cOZP)*j&oq3Aȼֿ9gV}JE'  v @ -]n2MS  :j £P}3'y>PA$͕bF prY-UTyoPM:uO+guRHEDǎ+W*Q"՛뺮Vė3Vp[eUG}cjŰM Qclfzv:%s+\SaζrȘ8t..eAcE`SH@VĘFuG6# !! Kb*JN[t*U*lݐ|F+j u:ƞiTooh___CcCaP.6orY&{-R@*bE+NqaEss} \&L,u=B$UZK)kfR\.>H)hhhhҥbXTnzoV[ה`PDmcv J%%vkĶϼtmsR;y>.lt=Pe:\Mb0=9Yi\B ϜAvfz\u}s2Z<{>v2fC˳327;=ֱʖLr" g`,b=gt蘲!NZڙDŽ랗o0!kq@w,{\_(狕jUI'^IE1m6+J"GfѤ]w-fB T(N\soh&#Z`6"N&HJ))J elZ=x1W24`zrC77|;U} ; u X^jXQJkJx4ې(y_h8od?5&-:qM/0zqTR̖ <` =[7 ne{QT:kRTC.;:>ڊMFmE ]oǎDb||ԩӈںg_WYBS9.z풼z:&,**8N-гo߾_{0ϷM2p}ϿA NU6SZ 1̺ȐRZj ].G|ygk`=0:>&kV B  IDZD"OYFk}ю5؄陮", IDATaqvαWL\f9bqb|qŹ D&I'S5LZ O)eKsS\ em[A.R+{^]Gc 5:+Vd B*ofnC7{ | <!>_R%ݼPWj!:puX%#[Z7\1&V/WtVU8DҐRi"V7ZT6,o ĪTwí;/M 1 cRb%~G!)CmB+:eQ {Gsvj ɔR8R|-b.5#DCH$IRiRR*-*J-6|TVpŎǴPzW?ޚyx RDBKa.͚ >jjh75ɍ*e*n_rkb- bXX^}B Os ƵdnAx>X6˶(/?033͙QkQ)H5g}{zzz3!ӻfM]>EBs1R(lxk?xrSYzPkk+^ETeȤ9KGkkۥK#1"! 2d KZwu{6O>=44dwtc FQdSdۻC$")UooOSwxMamذ 0 7l059sg A(|%CQ Uιd321 ɩFp(l`e9pEr9N[qN0008955??QZ89{VU#гogWphM+yl4$1F+-Ow 6p; sۇ'.BMkJ=p=7H L)Xby?!nOŒR(E2&&H,VFck%2^xO}k<q(UL$(! Bc<]km oÏg{sw_%?_mQ MEf:`Hjbc"bΥ N 41lk1ȱ+`eYy_>wN\=R9@ՙNs`b|5<}~-ie [wݴsA MQ[ Py0)Hh}6s$Zx0׏567͐-o"Zvж7&m[A022^$!װgϞΎR4>1h%ͫR⽼*Na"(JQL&˥ug</o\T,fs9p^WQ  Z ]s]mt*H!X*EbOsT2?/ˎumٺWHu=ݓS6eum&55笯ĉX,3c|>G@C[6o:a `k*q@&.JB%e*nim!Cbqzz-L Gt:](.X1zZ[A)utoOO_o$K$ޢͲ}R.cn*Pٷ%ёuF4-NGR)-D-IIBv<-uOy׶/=Pj; 6O™w}p|]s_V3Ϝ;tOۙMW>˥}]xW̘Nv]aL#LpqS)p I4%N2T)*GY"w5 @ڨ0V_&"zzMFt:eDah2'Z@tyrrX,nC.wT*B+h1Em'ebwvu9riKZdm<1+=riF[oٴqcEJ镵NwFJR&cm4^8aƖ>99 wtӽW>㸶3X*Ft K$R1a6)W*tw2rinn5571!NLu44j ֋ 3aiXũ88N$DƮs=mjejZit7/;wς  Zֿ+CuCߞ%EcO}{w??ֿ>ƀw{;Z^8s>utCI$,ĉr帡io [)i#3e! .}$v}c41ڼij.| ‡:M^>\oI};U|VE7_Chl7m[7_A_hZ~/qF0B+kJ!PĽ闧7go 45Qi2VL} &p\!effq~&=i}BҤTPRZEʢlrx}Εj쥍od& 55jG텶\\5/ 1gvqCdff4boD"qF7|p~~ZFׅFtR8ad۴%I!=LTÐjޓUu]ƝUl \ׅ"8?m^@ӧOI%c }zbbҦxn`CChٗb|LO#QCCC.Z*j+,ֵn_WyQecQk!k>AtOD *iO?ݶR CDKGoȝ\?(~/kĖֺtwg oi{90<߹xu|.QHȠV Q3 a pP˺)z]| o;̼W=Uj9qܘ5 QA`ȹlX8ƅZce5lz%bx_7>қ8=o=/J 7v|R@! j2qjZgHf1V+0 p:ZJ [fē7M^m!ھcǚ5}u KZqtvt [ӧ?V===BqZv8Uhkk"jO ˴y.KS ::ڣ8RBȥh~۷wާ| ;k.)﯐Qqη~!+}OJ NRCz{\׾^,mW2|u°###=J)N;י CR-MBa?6 ޣ:leiđ8~ ;::.o䔲?CRT&q\gƛ]?JXmeޱ|pzti֪&S-5N-;I9Oh˥ڵso|#7/Cq}[G+Ŧ]/uϜÿ Mvdfe ^yIsM϶zW>J]ǙjdsyQ PZ^VTQ\7G2|ҩh" 2csx^>Wqy(頿amϽe㡿|# *O÷ܶ0`lmp(eDiqNT)+$tgnyxɋ7@+@w%!`xiJ:r=&qMOOh}TXTAelU/J*EJYmoZ$|kU׭[Re>'"2H:L&擩䆍~{޽QO|KbwO;;¦gg禦4,ic28? c6l`0^|EX̽[~1Nggglr^266?q\5rqĐB`)ǏCOA[.cǎwY/Z’ИOqp^*9ZT(*W*J%JRaX|PkMC[]d¶q]gp燺rk/qƻ92ALSSӁ;^2ZƆjboQG000y^[k!ݷZ );sy"1cl===s7o^زyΛnho-[nG^><|sk=7bes "Sd*&T2ɤ8WT<ϫV*uq)W2m޽0<fٲewܱb n@e7|=q{F% jְڌ_mϪ g|`>Xܷ@D6C][7ɾKcGN~@_sQš GIlo8k&v]yhOy׾)^8$_ꌊ-@ hUi*yr È Tu '+nYdZ|?hPiāv_ziUG~^2g8 SrNMMgߺI0;/Uy5T V<hI7XO;gfy8*j#J4JBI(smo~oU$<'?vLM !p"Z*CK?c,~Xa}sm붎O5E6BFa%2`iin;V)[cVAgGgsSb@֨|%A9wlj^ F'BƘ{6zV BJ 5mFs+B]5ky2R?~zPǷo~M;ζmێ= O?ݻrq26edUJ94t!𽾾^[`x°㺍 yTT:~$tuu-\mܰa9t́q10|q8%d"?2WAT:?4T, cc!PUMM7_rܘʾ+}c;y셗_:~WQI\*L>fԅgl,j$"H *h2V tM-F mՕFE5ʱy3XOcݟcNȎhKU675 MRNU?8@{m/LIW bcȈtUXٶeˆa \IR"P{՟ȎäCs$@>3irM[W9ѾHzA$jJk]<6gviD)Q+%Q![Лތh1[GlK5( 5ސmɦ;un]חJi` seP%53ܻC1ˬmxĄ4!1h!C~ٴi5u/s/6Xf ԍ!2*52YKyյ}r8wjGY'gg|]. MM6md308cX [O<9kkkOMM?B=mۺWݣ̪vە s)eCCcTא Z/3/΁y_oGh FFF.H!5Q ~޸{qIɯA#l^:u9hlvajzP\&~uSѷp*Vh˘ZZg \twTX]J'Ϗ6Br[TsML7Dc6YuJ6?!.YlF7\"C¢;4JXyDft.idd޸{k&>Cr@HMB" \'J]Pg-|OtsBA[)%m3d2妭㶛wH)/OCw,@ Bx-ѩN] cL\.+qAd3W׃.=~uc?hkF}ߏ8L@ZM%k=pΥTʽSDxMU{,I&L4\D[. *rrDۃq*O IDATREAj[Z<ĠP0!$!D$HrZs9! I3{f=3O޳.Z~ֻ޵Vz4u ^dZ.pge孟 vgApQG5 (O=tDLUlouL6mWyյi==yOMDrGri3>C#rDe>K"zސW@%rq8羼zf2iBQGytۑ5~S :ܤIC5ܻy Adc}z ܜz?TUdA_?{ٿn#wi9זaxjgamFs;8|Z mve}zhQg8h( PJS[Pq=h43x.wٲ< "9k&_z׻=ơt `9k&-[Z3ʻN>3gDf/\zy=Zv]RRw0N-tywwԔ%Ns5uZ?px֡*?̜/ߐN]'VsӧOߣQUQUQUQUQUQUnEu_ܼrʃ.p·ؽF! QUQUQUQUQUQUnEUΥn.y_$xWΥK|b"VWjCD")*)\ "7:et qGDw)J͙?oH*RNN<xN0赡6lߏ&J) ʐ;hC^).\tm/<Tw+W*\SDDiwb@UNT@UNT@UNT@UNT@UNT@UNT@UNT@UNT@UNT@UNT@UNT@UNT@UNT@UNT@US֭K*******Wg͚U  QUQUQUQUQUQUQUnhQ}f)3fsîc鈪rrrrrrDuPͮ}T[[[C``u `/#ٳgO;q2m<- VWjiH̛7P(~ڵ[ @U0v NT ccc`@0v `0v 0v NT ccc`@0v `0v NT@UNT@UNT@UNT@UNT@UNT@UNT@UNT@UNT@UNT@UNT@UNT@UNT@US֭K*******Wg͚U  QUQUQUQUQUQUQUnhQ}f)3fsîc鈪rrrrrrDuPͮS! QUnD֭YMMMfZhQEFUЮ***WǨ0V^}ip ]nSN9~6ЮƏFNիW_|K.]pa]hooK-[vg% hW͛.)טyɒ%u#vm_~  /+Qg…KVA:Z{{{kkk?,Xںr `y[[t9[l>]t Ƶu͝;Q͛7o͚5Sΐ*ɥ9}WG:ZOOĉ}˖-=wy3fk{YDD}I8UNx)%IP(IRL NK}wɄ  0sdRԑG_@KO_]u䮹[uelOYE80 Hr 0r"X()к$Mya}  :0nz./-=GWͻjEӧO'?TiH¦ SO#J I|Rvdzy{z{|TPohW x|0(KǾDʞ˯~ەiDṰ9n99nq.2qDLnxy@@hp;w0:R99"zz{B*\&DrN8@qhƩ7%U&mm;zL9 P{hW cӹ瞛\ DӔ<,e1Ng8lɸ\$p3U r:$IӴ'j"UQT;+SiƌwsUf~#~KڶtyR:9q Ȇ ""3Իԙ8pյT,d2*lЮS첏\h9gjӣ;ISZA.ldMESaJz SN9u֗UT}LPhW )7}+;FN]6rq`2Qs+0 T7}wgbYaUUTЮS#OvEaܜʹ4[.c"j#aDQ \agWϫ x/,*@㨲:*€kʆQQL331-y՝EԌLŤ|7>`phW PSVGu R߻#ruȌHTUlZ@fFD*,UD648+FS5">ysaa-ԔmМkjElAfB""2(ΑC#Ch;P#FFqQ 83aGQ&#SF..f"*@#)q8Lg880(ras!#R,**fv0v 謳><{Z2#RS$$\1\Q"""U1S@)Z0c;vZ#i,$+RKWve:߳Kw6E r-CBh;P#j$jƪa`q&^$ey}QhWcjDXLTS6^D{afE86S-߄hWcjDW"# Xċ,)K0C*x1T`ЮS5F\!j\wuJ+(){֟ÄY-/Bx@#@u HՌȋ̼Q’xΧi1I#:NBۈȔYCaЮS5DdORQɻfL]MDUl58+F@g؜Q& 'Y0)cE8+@Mj){"){^ dLʦ*@}:P#ۨV˚zIJͱxS1γd,3@hvHZ5+M [ -Qʞ+'ZKŐa80+ì5QY@%"".8*aqQv*NXOPߘ]NԎ#ʄE3USa529GY(pȥ 8+)qfDq^)LD͋)9ȕ-Ho[844+F@v$OSM/80돨%3b/"u F+@-8إ|DԝOm 3##gDfS _7@@u &e$p*:18䙼Py0b 2e;nhlhW)ZHɨ(9fwŅ,8"iiG%ƤphW NԂ9a>iiD'N'}%ᒔJŝ}@S`25f+3Cfw@$ ;ySFv Pm۶tqHGL2{@uNa(:k3g|ѪU̙S(`x]:;w0:Rt ƹ tuuXaXs  S}H`\ pҥW\q~zŰbŊ+bҥa+^hWN)nw}%K&M4o޼I&l|~ժU˗/1 `tS֭aBTCTٳׯ_/o~!maoW} SL馛zy ~JGvuPrrCg3맷l~q5w qﷶ3߿%wD0]ޖ/Y>[6e~3w}f6nꥣc鈪rՆ O]ޗ_]wYUUU媉j͚54jkkw-Q1s{{uzzzjFSSӬY-ZEѠQ5DU9DU9DU9WCT&*;[ziv 7tttrvO9w+;Xz_t҅ %K/tٲegyf]4T` f^dI&"?mv嗋HbƇ fE[[[7-Xuʕ +hUΊ}cкuΝ[(͛WW`P诠A31{g AOOĉ}˖-=wy3fk{YDD}I8UNx)%IP(IRL NK}wɄ  01诠AT9v xKEYG뮹[\TEX$0 # ,2%RKҴ*x80Cu n֭Wb"stռ_4}t";MřdaH(l 1E! 4$А'nGgΝGc+ fe^Hٳo3Hc:<6ǭ35-xB6Q&(q83 >oF+ ;眣}wRb7!&Ɩ ,tʎC3N)2MokcXN{ɵ @t<=M[ѭOt͑MÖE:M:S}(IK>M{&Rŷ=~诠.0v nƌwsUf~#~KڶtyR:9q Ȇ ""3Իԙ8pյT,d2*l`@u *rG.[4[|s"ѝ)v- R6g%RUI {zz )i*l>&_A:>}W^#H'.8 9vrQ*ӛ߾{Oo1I^,*A5 ¸9ii\&DԒ Gœ 6f+ήWwwJ%^XL_H:5G. \S6Ј eB眙iή|(fd*&f=@gAUw#G\ߍΑش̌TXث 1l_)ͅL8|RSSiBs)eaaX;߾j DoB:G +9;U108LQ 82A T0rAwy56S|B#c*\aLQGqFqE. 0r.$rd}ueQaU1X)W0r0v Έ:ógO%8(p,>eNRN%""RS1 &_):3;c5;9 BB))%iT|eW#=tkCT/o0SP55Qc00S8U/x >SDMYHQ-W0r0v j,&)yfb"0"zWfej(WJ^$rb!x%eIɅڦ]wgWlI8QI"|;}Ӧg*f +P34'؇>M8-rHIı|B$\RP3kxIO?IVI"uI'|I]lvY[MS0tf-ê^cV2s9dv{yx D"7 m_lIVy"fZW0:l۶}F:|>?eʔ {Iq)h̙?яѪUnioHƆ+R_8 `+Vs9u cŊ ,HFẴ7Z+P0\tE]~}o]bXbW\|0 $*exH 0T`gϾ,Y2iҤyM4fV\|9s*\ I@森1iS֭9sf ިfϞ~~xڵ5 `ʔ)7tӂ ϫ\8j`CATQP"5CTZTUV{/WwL4]'p(UkiiY}sޤI[z|$?'|8]rɇoʽe?W00f4Tܟ+HmS-xy맮ꔙ >}:Ę*IT/?x*Uu6lxz'!omLG؎AUO~kՈBT{QY:T{49h0BTIƍ1󠕪(53[o4syԩSڦUzSSӬY-ZEѠQ5a9WUWj_ IDATފTr-@TcQUX_u ! WTÛTjK,imm;wĉBB{W.]:w\ A6TYܐZf!F/ߋ} k^/^t… G~饗.[3ϬKùܨ;W#y`|ޤ,YR<"?mvoذ^1Tr\! ;p%Uu+[`Akkʕ+Ɓ\Un+$R{:WIպuʃKn޼yJU\!)Izzz#e˖z;{>SL 3sj*"'B$fbYR{>MDs*sySqq„ Bk*9W3f%ޓ'sK.:96)!D26U)A:@tI6KEYGY?m:'dL"80t!Sq)=Ora VP.zo"^ULEjvrF΀su˷n9C}QL#g",Sa/Q˦sFDj/O|pzGkDԽ]!8T^WyR|T*[^髋cDDу70;7G9 \( R2%S6Y$ H٧TLir+' ]_ľ3˓g6=R9爈B.PD{ؒԜ2{[,֍>Tv5y_D Pj,_~϶mӧ_.}щ;ew,0 , (D!B4pJj&4qJ$8QX\@DD|^ ?Gn 9GfDdJc PT6498ԩzjyD#;o,)@u `p$U;vN9h p9j].p0j(v: Y`JDfʦN=S6ԙ#!SS5U/7U9{g#{,@w$?DD?;r삽?e O!, \9%\u;|juL#jΝ[lF"p`NȁS:S/&&DD4#)[px.hlHQ3 HC 3#UU8RHr)M$i*š*p]N0:s }ùJ~Ay2\~OK蘽?z1yO+JAq&8y?f5خy?H );@R5`3f|߹|gd}rDa`!YRP(t823SUaVeoH$HtOOOWמRRvLZ*xe_zpď}wlMu/WV{ 2u/Cʅnjrݟ./Vȝ;LqڥEt6-n 6'O/~4rPSh8jWdɕH )CSN.re{kk Zg{iKd78 e\BGDjfFs.L͌YRWw:t%攚B}gi)msǃ9l&dlJ?rwHE·`;`0"z?A!W:#?~|#8*ScK5댓O~rGlSSy l&dsIٖL6QAQ7e3MLS.Mq|a=K%f_"噁TwCRs sc=n@.EN8;0?ʝv(x5) p*d*i"Gf}!Y깷Xݕ՛O=Zj+26)/Vbe-)<˔5;`Mo3sP{VmιI)) R鸦:i'bÛsgjîܮE!},iMVjy ~&U߮?~pjl3,YI،Ÿ""#3;M?ٖLOfɇ1ٮjPSVGu `/n_Nj3!jHw]j jY׮Ⱦw`m߾?_=S<$娶o1u}jf$B#b^DՋi깫PEaʚ2K/$Og,%MYSffUJ|\ѣЕ{Mlf/){3RWw~wמܳ'_ {q% *SO䘦dv > 5 nߛ.>ճ=+"z?qUe5,%|x͚]9WMHXͫ)5Ů<ga]{rO}BT,%'I4-%iRS̢*f:x]j4+"r=OI~,udlH/L*^gDW' sRIJ`3#5bռ,μXx~H9˞%.=z["*s9x_(M>|C*D,a\ NDYUTL4)%TJ=콰%IU_[E7 zo4+׮Di$ޑqQ=*ɌDċ Mf+SìIjjX(BԑHB" طߝ&Mdk]snW*y"[ Լ6Ι/XY$aNY<3xᔙky]{T G8Lk'ɽ61ކ[:$l{§~'?@:0HX͋i`,a.$Gvoj'Ⱦ{y^xѰpM#R3T \,PSUaLfʢ^5R>M}sryƄd ^YTTEDEŨoA^kWRC/7i)nWP T)Q¡:"/ IUE!K> "S~ŦNr}nXe>G}x +xːLļJBH9IRI$i4>Isܢ^DڮN ,1u_\@D)"Q{?KSIދկvf>jf"RtqLU(U+xвNIMXIQ/EXEE>%RS@"[\₱0EBFtlf?jW51s Wsf,qq)4kE{_V7GhG;UKy?rN'IDL8eS꙼jj<;bG:nB.Qjs2-~ :0'O~5RjxLթYX|5_7n|v.W 3"Hȕ#""+6G8 {a@ 0 "IB٫^ jt5ђMbk̜=#7sdiSܡL58 G~%k)'"b"b"ZEdH9us;߲wJCmW;w\˗kKR`8ԀQqX,n̦MϋȖ-GO?sYbl-."VT(0s}B2{5VR##gqϸoW\eJ'MJ*^zF93\}eg /{Oۙ/7ۺ̬kH8ӓSGV<.=ut'ɅN!όXlޒՙg3 m vgG]pD?J5jr\G藋n*%~酁|w'/]>r̉Jմi6lxjÆN=4$USDj֬^xڵk]ˑŁov3rfJjj*lך죞}ԓ6uk[:=='>;WO_!",bD|vR v9kb4Bz{KB|sI#~$5QnW_:4i㌦DDo| g3wZԊ%[ڮ{ϼ瞻|r*Au `pN>8_~}WtDLf;3RqNT2n9'ax9#i_Z$FcJJR`Ή䔝S1fbOS^KEb1IJOp_ڵu~8mW[cLJ[WYSBzv5uꔶ|͛7#T$Z|wܾi3DZƘćb,*G*lX_ ,*"š =}[sOAY~W_-BD|%#>1I#cS6e51@R1Dų,9$*wGQ =!zHDLf2gվiͅEMEDLF>qgS4JU[۴ʕQ!T^WI"uI'|I]lv٠1 BI$2gYpF|j7giy$-O}/ދMg-5I3L>}8>o=:'LIRvI؛zrJ\|O8خF~ʗە&,*}gNESMJ*lW===fwT )CÍ7e"@-#QSs$JЩo 3*,i","H yկ&>U+O`O[3QgMq ߾Ɨ~DoM97??eJ}v]}U%Nza'O{0F2UOUɾ IP̙38AZꦛnwsU?WH@u ƣẴ`+VsN=g6ZbEgg A\Un+$U{:0"0 .]zE}}{[bŊ+ba% \Unt+$UÛH5{{ɒ%&M7oޤIFV\|9sj!ùܨ;WH`:3w/~gҠo|455|W?-AÀ1AUKKx{ߟM$v}?eb 0Bl~qթ}{9 :::O*1Ƣ'?5j ^]wu琷6~#jlGP\ŋ?^0J /DUjZf Smm3[fa455͚5kѢEQ AFo ʍɨFhL՘jQUpg nK,imm;wĉk]v|'tҹsҺ5H`Fzh`}0իW_|K.]pa]hooK-[vgV<)7BIը`LBu b%KԱo"vm_~ $)ex_ ZǾl+WHFJFKcS0кudyJ D `l>j T`Arnٲ塇";oƌt}/KHۻsoڗܹ X*-"( A+Z/)SXڃ=VQz.~oKjm׶(Rr@QHB$d.{1!@`= g}<g'g()(Ohi^<E#Q/ۮF[Hx$Uy>)HJp}xVXGʶVZ+E:c;"lվ͍cjӇۻ)[W*ANܹmFƈѵSuά"՛l`c6; < IDAThwȳMZz&Al&Oz%U;H'U_~E<? Bu mŊYֱPxzxW_}5jCu)Ƕm+a(2іLFqr®c f6?xxdz|D H&3k>BMMmI^x}SplB:l}!mѮ,W:NY-,/ِ(b.).klf*UHdT+Pc={Dh y{sCDlr![`ce{R{/}&cɼ5o<2$R}ѓ?/Cu m=ص׆ \#//..ndLe8!ٵMa!bڗk jninl<EC'7ܲ25^A_$$1 v"ܐ A Y$24D?t%yj1& 0#DRUVvΪU OF+Pnzbcc9P~g8ס, 9RbR+F'cxO񥹹y3ǎb2;x}YC/"lKؖێc3cYY![̚M\ƦH$a&6u⮙'۶)e]Nu8թw%H z#LDĤ1ZDdJV  W>;h ~??w@Avv8;7'+;; m۵l;&Ȏ]{!Ykn]%Ñ@_ s &q] ٮ!v'dَl#}a;oX1ga)D]vBr\q\umǵGضm;BDn6Z1z+H̝c3f s9?d 2%/&/EK<Fѭ@xiS}Xb"66i4:Tx;?J*#LFm0z+H)PTEq""wm/QN(aZX\*S&W;A c6VѾZkf`K%%GZ+LD xiS`&BL!XjaĈ"}[ÿ}<Ӂ@ )gHIvþJim?{(1R,֗vC>  S}~qf%=x{&%L31 &b$WVNACg RFhJ T$IMZ"拦(Jx兙WNNAYd)ZZJ #-|־%=|+qZJ+,.  NA&K+-}O1{ڷ'HO(iId\ǕbƬd:j0^AZa)>f8UFK(JYJ %Ԗ=ТLG }+H+TcvՙI$)**J S~0ao(֮][ZZ(xD}$s#Guȥ i̙ 3glЛa^"}HN@mϟ?ʕbmg*0^A/:S'I&-[l޼ySN-((豷D"k׮=p>9+ R<+,H|͏W^~eORZ+" ۱ajvFVh8K_fNΝ;ئXldh];Y*))!_YF 66mSرKMf-}<ؤkjf[Z2 Яz9J+V CߏjC&ǥYva[ga7uB9Y!':`fÏVyW\;P!|!mѮ,W:NY-,/ِ(b.).klfӻ= )T={Dh y{sCDlr![`ce{R{/}&cAC0w Ï][zm15FIdYfpSa] "f})|ZƃX41Z1~yWS)vW:g˅sxoެ]l ;,F+2DKD6D/yG;wؘL&<+ )+))oa\WZrr\!!c[Z[FȾ<Q1ƠD~Ћ:vOlltl7':eYR!DZ\VJX,"Zؼwc4RjhT3WGJH -r,a[";l;Deel!3k6q"ֆh։k 3z~GK u!Ic4h4Z26rWN-a(gdegg9mmǤٱk^?dkͭ e8rЯz̝!Ld;㺎]qC:NȲaFveoX1F:~:C um'!uu\v\˶YXa +5Fi1s\S[{O-pjW=)Dgr~dKb_J_)WM^d?/'V'""c4F8L~i/1|~MAܺ~ژߟW?ADHTz35rh lG^c؞P%Lݡ)-FKdJ{~ʏߛ6iB*J6{YO=`óh@ZNad&mXN\h5kSZiaì eZW7|w{9oZ&ìh,)kOAcgP5o'؍~ ̥F!"S3fmhJIcfZ)%_qF+fc7aIKxcn}I1n0^<թ̂a#"2HVZ[&ܲ 9LLy7\}ȳЯR!|03+cɗ*K_/0|nHZƳ|>i,L\06ƗJ)焣yKh%GhRW)@Oa""vYc!H)af2RF"abcb]!s\-h6J؋(܁G0ZK$"Uٴ|0p2Ll 1i#>TBu 0Qc6#6ջ!m,7GBs@3l SpiboHE1[#kޔۛ߮~nXp~6dg_S=ʡ "bDD*f'(^Qh 5TJק23Bh\S^[EDvAH":SּԳwhr;Rlu eP9(dǘaabi֚uj%HQ&(4(>"r@e[N\#"駟zױ9)VE!BBb6)CDRFiÆE$Dɇx^ko5-AlLLZ3WX^`+ª=gHIvþJimLJQcZ_r zۏF,њ2NJ)MtOs/xO; UPCg RFhJ T$IMZ"拦(Jx兙zYxlz縏 a2Fh#!"RJ%2_Wy閝5%9:!H!,2YJi--%XJKVVRkߒP8-qh5EfTÔ}rwof- e&"Rʶm۶D4w%Kڬ9sdee%@@C:Vdi%)?|O %-鑌kZ̘LG ]kF]'q|}_hG.-lؗ8^,] Ȩju>SIaCi\e42J)[*[)PRHiImimѓ-t۵Wn[U!=4e۶eYgqƎ%(}{{饗&Oܖi@:}5553;H$RTTw_]DD]v͚5ͻkyo_~eá_$ )0as=(֮]hY'T+T]]_|o~\s… B^;žA'U]}C:@u fΜXQQqf0̜931@ _޽+8qb]]C=t]w_+ >wk%gNS}_#@{mϟ?ʕbmg*HT/κo|[nƏOU@םBu I&-[l޼ySN-((豷D"k׮=p>[ZZc = `} ꫯ:̿o~7iz8W6lЃ' Q%Q%-I&mڴ6lXOPTThѢ}.z^U~%(++:tֿЯRċjtW\\Q%Q%Q%/Da!D(dXB&kqoW2/ξeŭkU⡢/Mxnͻ ~YDW<+Qg-ZXzocKs̟vh cwWe1NNGQ+|?Z_vx{ǖO^h#߾-ߛ=8g7 j|Nd'N߷SNWSHW\s{INܑǑOx/n5'5~#]ˣy}[KDw TiWDR|K&--m:yCr۟jGSNUQ8匿׿,+[/O ~+cDDn~qKe_TT9庇 [/[x̀˿;8O_jK~X3vh{ěߒ)ޱ`xKg6$^OgTHS٩R'`u q9Ս_?يb(|F/?x݇?)Ϫ;΀ FmcqߞVܥ4Kd>;Fwi\|f3Wڝk/Ə#v6&N͚Ra7=zS;}ϫ'MΝB:}S}%gf:S' w`w`VEw@ N@ N@ N@ N@ N@ N@ Ng IDAT@ N@ N@ N@ N@ N@ N@ N@ N@ Sө 6T]׽'K9jPOR5;TWU|JuU%3'ٮ[fǖM2mJiǹS̜љڒD DY" |:5j("5j)dLGn8zhSII$Lcƌ}̘1GO0T͛7w  B !@ ܽqgUUUuXT++++/_:}ݪU}]IyO-H1gΝoD:@B:H"5j?:2 Hk޾}{۷oׇ@SD)m6n۶MsNK[n%[;⁘;@tT͛7'99@ Ha;+++;GT^FT;QDT^{%vnOLR[VnK\-UVJY;@Ŀ E-d4'GL2;xŽթDw}W2gIŒ}==F-Zh٦/?I팪մ)\cKuUeZxF+%cvlxw&ǢxWĿJfF-ZɴO߿[6˴)GNx옯F#-xeUreʕv2>6Eqv/?I~tST847ᕩWʕm]PB-ڮO[ӑN57lT8pPۇ{^x )hѢj۽{߿:X:uگ :z7v` 4 Y]5b(hѢEL9tѨQoߞu~̘1ҩ ڴ}"?n|  -Zh61rv5?9GG޶m[GcS[n;vlg1A:Yee35dJ&hѢ=mݺ;c_ۼyqSS/אAТE8j#gW?ڼys:r)J&"7y]2>6Eq&F ƍӗ$NQ>c"NאAТE8j#gW}MTfܵkWL؄-ZQ9ճ#Sܥ ʠSN'tkȠMhѢE{IWﶎTYYw3o?EUUUJC2>6EqԦ/?)/_ZVV͡TK98I mZhѢMM_~RVV8ybڔ7zroe<@2;xB+ӑߐNt #/=۰aLG;wOpLҼ7jZx͛K:ߞc;g? q۷D>S\ s ͜\\WO[į xFy<3^~Pʃ;V IDATxw|elMOHHP  zgCQ=EN9<9PO<م "H;HzNXI 5dgy̆3.!"H@!IBHBI B!B" D!DH$!$!!""$@BDBHBI B!B" D!DH$!IP d}03 gɧ= !hڂJ F6na>9E?u^s҃Bt@ڤp_ {/qՕW,.Rtܓ?x8+Wfҵg_K˔4;u ټ^|>ھz0ihhkWO|pu7ѮC3:s-),*VGNڳ/ݹwU[0iyr-_@ii'MS瞴I˯dǎA:oBTWx~nU]{%Um|Ky6֫ $j={ -RI!W,)17e,^[n ,[ط?];r$&&g_nݺ^w@mYڑ_ażkoJ֭~n:a֯]5)((zr۲;@|Qe7|+,]-7ߙ}0M3]yR~IMW_ë/Wc>] 귏FY>:fT{^ztʬ ]OHgзOo+oΥ}vlݺE/'FRR"PжMj>Һu܍_\6lfuDFFC%ؙWc}]70 櫚㮱;vB{7kbHAAkXW8O皫$..٩#sE8~\}%~)~m۶kn6v곞"4P f~tgw>[ )9^|]wr -}u3{8pH^m%Юm>|]P~:HjJoAQF|CqqIb e2сOMd\xBؼϯ>n@\8F=?ٹsgvv!{!11^={̾ZDմݻ~;LĺYj)L ۶ׇUKSjJ-Z*yv,;Gbጞ=uؼe+kĘ(3/^rpg+PYb i1!&rsHJJ> r +|׌:۪zB@TM#{F [-!r{0;suz}>e1#Aiio^PevHݸCTVVRVVϬi, ~ְwAt=+++/bFPpQ}\!yؔ۶ywٱ3.8?}L devߜuU,]ЇF_> u\t5񯗙8lJJV<㎃1O.uVDEE1x@beP?tEQ8kP^{jLT&S<ϻoNllLyGzTTT͠9AYNH )k殻aM$%%kЪUK~8Ժڽjxg? !jRy|@ ;DCXN, ;fqo Z6~x}y-RutӲyl-7dBG}@tUe}^!b_Qy&N:C!96a=R螖Tiw].۶͢ZOLk`DV K}:e;iٔM!-4tv(ߋhѓY(\~m>X07dkwqۮ9y:y>.Қ1$#:;RgT $Lǝxa$wMd0 _BxL<۳+0_ '4ޓUWOXsVpA ό?պNB_ 1-[z0m MSּcrJ[cO>ĉ?s=믿ȑ#q8=:Es'ջDB{ Jt y~YTdm,cu`:^Ipo$DLik(eGJ$ʂ%+٦W/""0jX˥^Jll,qqq;~n7=͚5#66QF{@3gATTL0M;rמ={@JJ ͛7 / xY'O(|7L4RRRz^oذ!P]91@ľҪ{)騚5.2$xӚ,FfąquU8#podCcYYYup1.n5j^={c̘1@U*//;vo>袋 1oڵkYf \r mڴ?~麎jժǏgDGGk,G1!D+I_Yzu5Շħ+l"\"l (yhpFۦt͏15]SU1޸a=iic[_YJmXe[=-cˆ w6:gvOgϑ Iyy:ַ- &?O|tEWmx)++kfƌhje-DjnmL8S`&:1޽qߓ+CMHDq(ǝ"]֡ ’rY[ԗ\sr9%`ʥTdEf0uq1lsٲ;̟?orr2~]$']v(Bnޮ"***iܒ={r͵sߴ)l@l6#m>٘Ma>7\myqI γO?qU=Jl6mXOzz:z'G @'>7:Lt`qd|_^M0)#r[p 7>]U&}85:uHm˲˯>CTmml 4Mtzqϔi<Әɔ4h iiUgw]xLv?|\.'Bnٳ[nò,23q:ozǥ((:4޲=8.>}z)Rc۔:7 |Rz B(ǝZD`l\Tds /o%oA*+*USSKWLCֿnj4M.RӖ-[w4#(|,hށN\.{@]/tE锔G8dt`{~ι3<  L8HiӞ%KOW[i>ySڷ0鮻O= "!NRC!qaueOI N"#GQ6om݋_ý薕I:V9rYu@)S;>oz˧M´)S\b:յ|Ƕ-5}pAH7$I BWolc;b>u!-U3#yaJ7$SwIP15 nwՙWuzz' Nx{xܒW5 czi.HEW}u0\ue RW\1+SGf<6d DqJ]sVzK@賫Xҵ:g _ﻻ7C =!I? œE0tC}x3t7Rv7a^on/I B)^ c@6<7mT,C0:mt~h D($!N{gqFf{6eѪulξ|L]'!&6 ԏnI Bv">Ӎ$!DHitӜmrkI B)"ةylAyc$NZB8" D4>ml-f 96 = nOM$!D.Zs E;ؿ{=i7vX"H.B˄h jEQEFWB)Fό:&`U!DN/ /?J"D .؁F"2BI B!B" D!DH$!$!!!eض)t@!U=v!⃍pC,RSU^"hSTXkVp3:CN7- Th]@A3 2xH35v8"D.nn}?d"@d]4۶(>xi;qnFii1UN"$emL~ \niay+39%h{ 6ur?i[j36؞reI BSjK-1T]3K6>C#ec, DqJTʒJ-r;Y^q msHtnW4ߏ8c!=v]66ƍc՘ɹݻ;ZIB4[H>)BA'YJ[!&E\.bt"67'o~}sM0qjO/L4>}0bRRR;Z -3+8/svS VEl-NGu69-๥1S1uuذu']275,,Xa@ fcۆ 3q%+Kbh8̄=K^G9}Zw :~Vnh* 8fΜIFFQQQ$&&2a4M ,/..榛n"))(Xl&M"%%^/6lgϞu]wy 8nݺ7޻w/^z)1vX {ɬY'O(:^~AwQ'$!DWj`6i:9g,* Gt?zg`zǡ0% 9O84͛Gyy9˗/g޼y̜93.cϞ=[r>sZh̙3ٽ{7wW^<3ם;w3gfbɒ%<=={0j(^/{!//ǘ1cj3;;^{<ȑ#4h ]Jrm;a]׍nU_t]cj*:۵Lqc`{ͿlX ] 2q\kƃ=pT[l~_|'kW=1U.~!>i^"89~^WO>['G?)b Eox,=];]> O/}sޙ S-M6}'rՕ;L'ջ@;޷ZEᢞ0uppcՊ/;l[,ߏ~Mw}5>g/"8mLݏ}m(Gm j5)r"d tMgHV+^X܆;-c,ٖ Spe%WN|v-j. U媱1|SU'J6^K& D9 O<غJQի8<_,hib[r}lr09!<|ߟ{3e)# D~5f0Vhơa$74LS4t,6 ƍ&m"Y0in.ƀmxydoڊXahUc]:r3|pq"$!N@{gqFf{6eѪulξ|L]'!&6 ԏnqә$!DBW)dKNg@!Q C4v( $!DA\L,{v.='hﮝ5dR"hN.X4.eҶ}G鉜 ]#wf-G=p{‚*/ D4ERrKvaղ|,jDqLf EFU^"h Ѷ]Z&04l޷MCKDd"CWbr3E!!""$@BDBHB9 K"1wӓ8p8!M' D]Uٳo79)->(1Q1t"5 noxP%!f:Ef5'=3.}T[ƼyhӦ ۷o .`̙s=k?@\\\dggkT% L0wSJє&iPRBUUk7gTωIYADF>O πx'ٿ?FC|xuYK. 3gN*QQQ3}tyIB_YzB5Շħ+l"\#A9Ѥ*8"V5J(e Gq۸4yƺv,.0߲LtH~:}]\N+!Z=h*8ΟC-ecr帱]mŋs$!DNfɑ C4 oH<}|^~K+PZ߯ajXѩCZqʦ xd5[b%W7^ ,SS|>?e餤_׃([oCA~#FV({qF]|}>Fv5Z5#"JٶŮrڶmeK8ݵjݒ=ET9I BBpav$!DNG~4(PtMb-ci,QkY4G~JB{,c똚0T?|ioDXw <7ko@TtLX[NoB&Ͳִt 6ĺ*UC*c[&nH°s)o7JsR м嘆{ƴc˸K۩%7C0 v|yE{UʎɚB!=!DȚi>Bh'fj~iq96k[|͍6$7)g*"U6oa\۵E7_mg^%,<﹓]y;u=>4ME=z\Fe#"qO3@!3,ְm sb~MR43$S_ثI$eQ±l5,Ukjm˲l:q ',oX8^8=KO?ݻms ClJaiwR"V6L99cŜL$.?(4Oo s|0tSض}k۸}&KX~y cy\:Zlꃿ ^=^}p_ ;<bf( ?dezy%G4$!DȚIXe48LΌ l lޤ r!ޛb}K|[ݎ@t‚ZI5+STXXVRRﯺLjeq\$0b{]j\nν&D$!BvC(>|m~`L%܌fsO<}x$G jS}Qf'ijU꺊ZrGyGijl⧢B1(0mfu*KٱG}>bNH\p 7|3>CxaM""dL^2TLMZђws"q4/|(ݣ9ӕp( 'o15,a*ѵ6-),˖78@s._Yxaƽڗa6f{Y}O[SWQO ??!į6LC2Tl *kWP:;.Geĸ)tnI3L]Եаt6jmpp||?(+)FS|<9}W2mgFQ& ֭\‚>=}yxdYݺu#22HnVJKyblݴ0)rK2G8rXj庆e蘆FlNgOɦ}.!!#]c.ƭ)5 +W*RA4AסW% P=su{}~q&6Wm]׌?xx]{IV)=}xbZn&z.{Q(nplj/ D&?hy*bjƿ9ݙب!8q|§ _0UL]5:dqmg1z^7O^)((`()-aԨQ|<8]Nzv7CXB9IM,CQ&a*f1v;*[:jtL'r57t8NI{aԨKHEj y<w|1 Mtt ΓCI[B4ϧqtoXtjI`ǻyxMexvg8a/.5 kNݵ5珢W3OYcǎ#\[j yu4I B5ևn0EmJ+ڦjPT~ToX&4s@!q:gc"Nbw%@AS ,'>ec#NPO&E=" D4E7dxOZ$29CwL"hN\2 ogor =Dԋˡ:1Qg&-)Ȩ7P\B_0x)m0 cQ%^ 8=j(/I B)\SwѝhZ^XB!B" D!DH$!$!!""$r"D6c&m5v0"Dtt6$!DHtUeϾlȦ`c#B8D!36A"i<θ<K5rx7 Rt]^"ha~ZIzfG Ͳ瓐LDT !f6Sc"Nm(--ՠIBĶ,\,:t? 5L8Bqr-3ؘgJF˦UnhϏt#ORL]5ޚ؛! D$l)RYWӡ/Kiu Z'PZL]\cw8{RL]5>?llU"hn)umx:ᏸP2ZtJm9+oW|ɗ&ٞ{iDo~}sR/^yGLL ݛzTl/$!D[fWq*$G9Zwomtǎ JDе Hm[c+g@dQl:َkʺ lغ 9)**3wq>)ӝ$!DXǶ!2 rryvA4xQcxn=Ǡsyoo%lgm|Rbh* -۶ۙ0as͛7'""+W_}z\&MDJJ )))x^7l@Ϟ=q\;w.pu敔p7Dtt4#F`֭={߮gO8]Hr9dC%! :-0(@#S+Vƶtm(huZFXk4TDGAV!@$!^^I4TvMs{_jjj(..&--1M3o$@dE$A9\H[[5Q nM\*Y*YOIDAT֋l9. wցhlldW[`)))DSSǏg祥њRzuQ^~`-sΟ?OEEöGEEE޽{}AD.mB D( g4zg % <ِ"fw~ccY[aNӧ˻baw]ە%Ki& ;vYfE744P[[ˆ vb Z[[ٷo_s뭷RPPtҥKٹsgH(Y-. :A \͍x[&.= 8p!H`2Bfmi6; `wϋǎ l8f_V86ڼcY3yOK8r( uq J)~8se j&FıyY--'6mκ?m.9"nA,$@W!>sPKc3ABj6'D:C$3c3Yn :za0^OQP0͛دԴc9cFeKϝwE{ +Yjut}~~>J)v]PELm[VYa<̟.EDxMbj`Y&ys+&"r(v;TIf|1'Y9hMm2zdQSJd*rrrU$''7j~hîf0RPP@ZZjB)EGeTO\.]̹&nw_j# 8%>. mmFu"I !Dt*nۢ&PʣA} /A%Y3*#{Y> p~!ؚS'vۿsڎ?+A'-jU+(|6ȣ x2:e2sιT7_<2d0TVN={Bm={{w7;/$gMѿ2q> {8k^^NT"ڃz?vh 'G0f(T"gr>r'`L /<]搑9B.lTzKo%q~DjbyF^CG͸&aQljIf,{~!5 !D LS!lmFDZ_:}Yy02X6beR%'"fTM+<{>;M>TكAt8euκkY<ټm!l6U,ΐB,c nZ8gޏXf(:A[&8 X2'= !Db:)Mm^㳃0<hpDl1%XV}'O{_7B\ƒ"n X ¡#&˓JqQ+&P+"f}}VJ>puZ$"2 ,KNHﮈdi0ה2z2h>~J-'\|ec3l(9?dicGNcƎ#!1W19S,eBo &7/1e}v[ ;_I)f֫^{m[FI +I~`,$z⚠0L(B|EfB !1B !1B !1B !1B !1Z#AIENDB`netemul-1.0/doc/ru/img/send1.png0000644000175000017500000013744111277123237015605 0ustar frostfrostPNG  IHDRKwsBITOtEXtSoftwaregnome-screenshot> IDATxwUǟ3={#!^I(R^EbA}AWE^P)4) A:{l9c.)m! 6Ν3s< On,>D"H$Itޒ}jTo\vkvdH$D"9: 9|w!B@j'9|3Hx<~d}H$D"9 1 4`0X%>s~p-8.OĤH$D2lH#KNS9յ u1kƢӵ@nSbRKI$seea4>߼Pˎ;l]tIÊ ׼qGM9h4%)sz\iq127jp3f)CS>ZuKKZ܈DǍ@@gDwysFU$c!q_sƹJMmCICzo9Grg2]BB-i;\e;yKYf 㦟Q*ظ|٧V"y{u$$Q9?tr4p\0ҋk?^i @fɬo8C25Hng#@9meoxQ+[W>2;>-CWkukߺ eq?wL*[D=;Ož{B΅S1ro9Ep]bew NsF{6sM-2f|ii\wgstt&TnO 5i5͐1*FeJᒟ۰F yͭklj…< Ϙ=n?pD6檊-FXBғx]) @q߾+tWjtoVό5Uk/m&H 8Mpw6'Wlnk6KSo=hXW9Żv(n-wZ eH }$$Q ︑*3/˼_k4WqP?/,sptD_y֫ߵ|%Y*x~ǼVM"Vs򔤞m?kX͝{GmŽF?땬h<tDrڷST3aVCŁ9FޱR=r":*[ur]S# CD"9Iy 3qLfy5}J.g>kP2act,}vzvBkcRWE,hzz / D\ uz2:%+ JੋdwDQ~ʆd_w`hAq#\2k܈EjL&]G0eՕ9ǔuJ"(iw|"ұOZ;J۱m<9>)VV C7lM ') Cl#I+mRNI$ x 5nj&\q)L ij߶}MKAiM 5MvgɱN!~ǣe`Zm+ hYOWpE1ڳ&uuN R5cHAܷ[qcuQ5 tGD"98Z[@ݘ3=ijٲz%[TO5`6B13Icb糡eg}ݵH$wwv<'lAO/vK d2oJXYW=={_{OjejoP]v}|ϐ^xu~c 9q$Dr9@t2e԰DݭTO餫5u;n&CUt5AwD";U'[/]~KN8Q[O|P\oË< ɨ+%CTz/ohZֈ]oܖwsɱ^ALu-e 60}2:A4$, tM MN m~uڏh p6?t7G8h A_'18q˝a(unV6ieC}ҳf].H$G1U,}J9:M;F;=D"H$ BP5A78iwSD"H$c+ lW#$D"H„%_`ScB%D"H)#eT.H$D" DJt嚆_H$D"-,\W}ݏleA$D"H-r)D"H$!%Jiso%D"9)D"H$!D"H$ɀrJ'J$D"94vK-jAx“M{6^чɦSLD"~']{󡙁ޭ3ph[֍s]apcGNR`ē.\+voK1՗]2j<ӕMyr>t)',"Q:u͖O>z}mue(zU7p c9vD2EN Ҵ=ֲsGN׾u!Z%w Ѯ9N+ϙү~'g>ypoܙ(}Q֥m˚U Suy/74m&/'ggBx/Re+c7)j?y臗N?-kcuמw~|;&]xv΅Bbݵ\|'[xUwZiڠ{'Ϟ={qstUR-4%g_ ލz}Ԗv㱂8\i6&-:ij.mmJnj7˕GfRO<Ƈ+%9[{p7>tՖ1*XdݲnܶuU1F;_6{G?U #4d%4у߿-8?{f{Xŧ8K~D_#vݹ .8xs#E-:;_>;<\W=d~m1Z"HS_OT.ΚVi"Pig~﮻V<^ |d^['0voUt ,O;:c0\쇗]Y+Tsn{/}F#?K=:ҵkV~ܭS7 ]Ͽ`jr unsM'{]|бpv1c$!o9U0NbMhܢK7ϙTokUϜuyߺfI?ld妲dތsqmU+٤a[U <sN9[} ]RtÍ7p'`PƥMgN<޳>o>tݔpsuA.3ON?sOn)ܵ{}Iynf=aǒ>p֎?P;^\_~wȞz_{l@2T]~ &7T ys* [׬CG-:}X%Xz*SĶIz۷USY-($K/}KntfW [|elzu+z< goW'.#Ocm.NCqaUҼ%SsL3g]lxyfV>-۟Z!桚H$QOkqVr|~>uS;6m|^\V)B΋%o̹Ips2k90tYw{'$, H_?@joud_= JCf(:}ǫ_EG]+`=)Чp)&c^.ኡ)P9:kkl\}3vf?= H<ţ') A8^v!Oz2J/bۿ͎yk+/jXՋ%w͏W^':/"푻VOu3Mcهvũw&Rڣnd=N{>vo~}~qw? =kiK?jL>V,ke"h3]ű` &NHv ~g 3SS8avO > :8{}u!}ϬoIG(7ޝ ֽݜ!dws-mmys/x|jW~`vj:O[2kHM>{Mw߾[.C+N<0qߒ3Xʺoґu+b{$G sgrMCv|zN4zsbSd7 =_3p}sŎ*, y5v-U;G Nh)J ͟Sh9hkcK \,ћ)~vc48}>Rc%H4몯/dAM5.>v{}E ޵+K4Rl9hݕo~*H$)zC,Hl_D"9j&$=%j3'H$3w?U"H$#D"H$ɀS_XdL"H$H$D"E6pH$D"9;}395GD"? VDE@8)˒O H$ɢDrx$D"H'{lXaƍFgL>cy}*H+RNI$:?;0c 7\կVWg/+{-#D"9,$**`3иZ4y__8T.UU0|#D"pک⒒aåH$C'L|H$_zN 9Bjִ5Y4JZv|'cXiOP+˶ڛ+'f=W]׏ÒcБveRKI$ϓCN G9r£,Šzk^is JFFTq2{dvE>O>;9 ʁs)HW@pG !zsvl  !!`JP4 0H$Rt7ק8lmH8S(0pM1g W]Ҹ?CM:ڕ_8@ @ 0f/Wr`LSEpaH]$U0] "BA߫-6PGe"1'رRX-3|sKNWNT0`S(\ F ;vJdq,F0%$33T3ucKdJ;FQ(ؘ2BqPbləBffFfFuU_! FP#0!LeyM|B'n֯O}W*bDP3ʹ`2`0//73sp~/AT_~5 ,8RS"a)YUW2/;rl tLNV,Y];R# k9 -kQhc7z2@! (J0/#v*hOsK93y-O0 4`TETܣ#{E Έn'3=ɠlts(kcR \G\@T]U UBP8;ev#cA8@6G6j ]35)1R J|^*5(^Nyq*H$EY& 7u7%10:< nH׬eYaq/M91k >Q#H$.{;.Їb} PL4 E$Rjc+bi3 '} C.=iHL0IU!j_%?˽@gj `@8੺cs m3VxUa2m9xWǥ R n`cXg~& c 'u|xF% *yTTAW! 7F %E\džWph#@ڑgf(}SĤ2!O|N: eQn̽"< ?>'?zK]b83JA g I01P h3Xd IDATgO+FHuܬ_o hTj)(%& BucڵJJJƍ77BXѩ>0+8BSWBHfP"pF%Uz)FB Hw$l/]pĘ!|`-)V!JaCdV+"+95E0$ m(c5TN1.ިBpCA~MWS* \pN9`sF FivnA< KGցD\ 46zX{oGB{ZOul Tch|f7;-,@˛-Q@xȣdS1)%B"qJ]pdAA(ۧ|s!7ԧRG4=(BP֖pYp\htٚ&H >.Pg9~}(J(!1e0J%𶊚A@A}+`NI#'b ShH2&06DJ^+uѠ*shNS)5;ځPa4GC*p`EG"L$SV2R O^ TCܯ+4G]A"t$4TΩFDUmX'| j뚮izٓǎٟ74knu]pmlh3[Z[VZ5o<H Ⱦk]WG'&uʄwc1pqJ9Ngtky  ־u(sOھqЫ.4X[2bem$ywNV_{N:lhf9>-Ӄ| 芩`L3˶[#Rݣ3FK\QW0WC*RA!gR*8 gD"D10;+)`wda51fx! ,jLt*6$ϵ!,)SpB 7 Vf769D *kzSE@o5)2*ǓW9%΁:dzHqƄ_%UזxIٷCX9LP19BGaWKi0MSU˲@ǣi(Ez.8g)ܴiӦ3 N%abpF$-0U4UP??ػK_3ofy:6fC{8ÌPF 'X0֧kL9m`ZA̻tSپ?#?{pDH؛l{w;5w6篩+11טs<ӂMጪL(JTƸ-lo0#81!X7G9_# ySOS Uxuoj*wzθ*A;,=IZ6<$9%1u; .cjSDͷ:V=`{ P;Ę10`=?Z֬q)L* u tLP¹[PQYg[3]J 0N !c9B#,ˊF"%*x<Jp2 CQJaSLx<ֶY5S\\RP?W%ɱ@AhT'h(Ћ?| ԲсSͥ\C J[0J{?z +&0ОYJvf(Q^O5 N,ؑS^8L484&An*x=T3]@UB%ZYepj F [Vtln4tgs/ۜEHD"L.B(aٵ֊p2ĎS籤[=C&2M0A}숱m!EQsFɠ; gD)^]A9+3zoEsUx |׶?p}ȥ~+Cٕkx*} u3]YֈL* bJ aPW|c(f0Bx:F?XiI#Q:B)ƔR6N{n^TxַRgHutu57@ :5 RD"H$(\az<a ANN5kםuYvU" Ⱦ84Y>-ϯQb<h`s$xCjimpij%s:ɤMbN)[fkqGdq%BBEqvQ.Ȧ?}6Y٧9cɺvmsNթ".GPbD#l`5[EE}"\G u=(o\2Jb슬 ]MhqB9)+^Ea)H"zy^[CKX=M$91&;&`4*[۲zh&|* R¨`T;I SQe-&t@pQg|9)w(UsOë՘Z Ί [hMʗƥd2a'CZmU8\W[U`VO:dߊf(LJ0M!RJU}j*SM]rN^zMWrp(%kFǛuヿk?lv<6?GCȾT*e;z4]) &D"(* 2#ڒ⬬S@"z3()𩜳3r&!*H{DCSXWdž(ϊHN V@[F 5Xx}WjcYV1_wCCƐ+=X,g4y<ϫ뺦( [C: PNiU^W"P > ?B!q~qL$GS HCR2*y '攤2bAP !ƘaP׬v'qƘ裠M(a)WP OBŎL?SIpB1{k6쬚1~x|:L(Dg-^w2x@+ԼsҳsÊ6BoFb1@(4-H477SJ %20[n=fc9whkp9㜱={ʥH tdPCѐWrJI gG@1@ @[ [вyF g1(v3,p4L2?Z"G }ee_-s#CTYUyd}IyxTv\S55z]|xu2*etV>nDb' 1׻N6 TCig A24`@ Qu]Ҧct>eu!Yv0%3 `#trRvT@ G`"i*}G׌9L(Q8E 3;lomllŢD2jԮ1PʙSn7¶jPBl8X6v00g|* v5OfNۣ!%A1|s@13:IElS u'H) 8M&}>Dc1Ƹj(pҲ-dB@ #˵U쭩;7H$G?¢H!8'7θѴh3 n`-%8#TvLFIJmh^RBeHC| -Z|ǚvL} t8.ד J9zvvlo/]j啍ˇ{] I۹OՄ]v!@ z`1̑ڤ;8n]eP:C#0)) fPJm۶RRWKVQ3*9sL4iĈțo#Ǵ H$c8nW +ԭ?)~ p R]3e(g'G F"QW*˼e.W'dDz}ϫgi>ݿ_֒ Lʫ_2UMq^HL/JҘ}ե*.N3fO yЯqpҲ"DM]Ӷds @p&t>x+)4E@ĽrV v&ɮ:yȦ׎nr4#Q_'j qKY|u;̎X9v(UHxiݵNK[['Ap@0؜01匩 6N98i;m;c`b;Rs`a"!sx+qxiC[zXWc VB`#^黋wâg>)ŒcƖEywA(5jE` k6L/~c vݍ#$!|>SEQ"L@ iZ<߶u1&RNI$_B:a 1$8&PHf{H6p5VCHm^Z6|JR>Q1w*?)nrR+󄒞Ph掌 ph[k7j_7xtW[RO]උ[RLO+&ܠDjW}dc˰ #76\p&>%kGڮϖlq!fLqB&0nJ!9.fgȧsLι BpcEHٰ#5&LB鈜+g,tyO9Kr>$0Q_;Š6 ݋WP,5v<koO&;V=!¦\Eq r )m,H%S)˲S1Z SR9z: #`Ah&;P@$) }J j&,"RD7 ,MyU?Y 6OM-Ê0!hjHb5L@&<,oÕ6zq!&4Jq 4Mp(c1;(%1w.q"^3&[?W%1 y\d4%+6Cj$>g& wG3Ɯ`TF9cz(jEiWf4Uq3bȬ֓VܿkN*v(ߞ@zR!;M[qW~.j܄'gdpD :  S`qV(E~f`c DLMAABp(Dxq:P@t?6Q1 "6跂T;V%`t;Iy;MX.@BX%EЀe*e001Bv{f3T_oe>qːq6O8P3 ,KC< (J,G@:h٠f1 |!xV^vW^4ge:œ+wH|W0;^srL9[^i@@vHtV7{;ws!+%ɗ)a 3JbX\N-*s4dЅ'^Ȼ!w S(f |AgGuYcDbzʮlNkǏ+ 5HןmbsSg/͙6%!lDi "YkO:!Qr;F-2& 8cH/ ƅ81F)gG! MU **2]aA:B3GT"Բeضc[`!vgdcWCȩB2 0JA N[JL@^)oНWgս !x4:V1&p ma-3(!G!o U Y>J:騚"'nw5cz<Ǔ3{ pƘ1D"0Б}Y$FfĦ$&32W#^ϝ7'3ڰ'lpod]#"=A3)*,<("p!JA x4vZz1^67{+K&+87I S#Ѩi)D,˓G(%6"8 uEX p(7t!M7$-'LYP.VydpxۣŞF]SET\pAú32_轲=8q@@h\A)MY3B ,۲mWLaƎmێq$t^o>7i奏mZ>pGlGyXq(RtS8&HԆp͏~Y?㜾:␥ (88`mk3;쨁w٧kBpNx_u#VrB㬸sаyx"aRqy(ꓫ@Gey!S̨#6H^@=L5?|Ԭۖ`- M"T mT2'#E9Ã!rda耀sb=6(ʰ>/#cԝlQF[N‚>eSWWcNƨ[1 Y.|9>`T!A҃a0J6NS~;6ʼn}g`|JmrѲ_;#.;s1lvGθCp*AוGG4' \d K t P9ǂk ,۱ 5!DZ@ XN;ʽH]XU)\p(!6&)˱l l[[rt掓|AƝ& k`Rjh,MŲ⦶;,FgLsL8& '`0B!Wio> viChzk/9딢Qn`(>{FI;qƎ,$WHSfh1>wXq~}=tnjwOpʁ4 ?q%CndB(p9hX hmoRF)! IDAT1Bc?{wgUu 3ܡFDP&cĠ1M'&v61{۟_C\ :C`k7'ᷖ͝L[Hާ~kWtǿ׫O=M0O .J&[lHzYښɓ'8u{*,"|]/^`f߈Ԁjk?5lb}RR8d}-/g7 K~!MUxO7V߆ںQeȽ⃿z{ 7N% ڭ%/W׷8D'<ʊ"VE7F C\(yZ)XQDL ٬Sۙ 3|q/OvU)Cvn%zF|^SdLGId( '=PR!ڴl6ZsБ cvb݁V,=h"BlY QZO0Gd;1rS?5%W/]?wlWS]J""MM^;S̏ߚ˒޷'K^Ve_>&;Dta4L֣S"Ԗ4D䧝`RNR>kjŐ\} vV}_XTI 9JD r2;,:lB[cׯ.8<=!V߶Cupy{FhK?1im 5V,Ihިٛ\sD W=E*#['***"ڱ}4/H$k+tnn:q^";ѿlŹC؈,Nm$.,PԱ;ǸaC\2y|"9j >f/^ql6r+VqRqNvIP̞}YFETd]vt쪫HDRȑ#9y^"f͵}D6-I3fmP+8_%{/]~,BCܫ- ~m?=x nfÏ:忶̼zpG|oc֪9cwp:o`e*iɮٕ|yb{,?ysN(=*C"(;k! |CF# :s'^ۖ': \8OUЖlDRM΃^(U%VQ%!:Z;CgI@d{DDDd/Q#)| E[qGwGÅDb֭[G:ffQU1cǞ{N gRgCnymn)tv,ccu3:3uKY;aؿ짺ںME wQ{?a_}?\{?yvWv[ C3bD·>7W9̓&"7CԘKVXZgȋs'"IkJ=m&mϝ_7v'"=ek1Dέ|5Cjw]?W\X{[l>oo)Gw"C?mxrE߲+#7ů%dQL ;/9g%Ї.<5Ss:@CIcCdxNM+Y',DD~OrL⨷MORk;9.QqHvdWUc:ҵV-Mp7uN^!o;;h{(ʊ+TSSs"}ȑmmm/9gPôSs<;fիr)an8aY{Ɉp.{kݼigLΝ,"im .wP:}ԟ<3/;8Y)e/,gYuWDNOۚ[vTtC5o&5'} jf?}w͌l<~@O_ز~_l3jS6T[5V|"w{<לuٿrk;xv⑤<1 Ž3 a6VL6Oz̪#g>iIҏ&&&#1{ʞ8>QnHsښa"{2v) 9 N=vSJCQ۷i{IW1F:OVfb&qL8/Q^8|. nn4sĎU$O\߾5@VcoٱGW6:bN`5ߨ,Yɶ Q_;9"R2Ͼy05eıt:"K-#i[;oe60"46>[DZZ+.bY86r3?e^v)z-n'+L]_4 d֐73xy~_1Ɓ{.68'.l>8現v灪XNZ]~sͧ^)ή=lc戭5.޴rXّI, H2ψ/:opE Ƅ B߻e eC *w0v~Me-Pew}͚={׮]7o޾c9afUaVUQI$S9gԨp蚙}G5q䐉#\mϾZUb`Cw50agᑋxD RGc%LEEq{8On:3|l߽׶hsFPU"ذ)"D|t@D>cO 1OemˆF j{Sˮ-mULݼS7t;cLMM 4bt̾2rգT""TX@:1'iN8t]9G)@w;89X.43q„nq~7~>q"8i"_K.irG )I~0pj8 )I w\IVXY8:'fMfN:ue)f3VN:~֕Hޡ=vj7^PN+?ܔC|W:5//ƍ 466644ꉟڍUUUUUUμl޴q%Kg~Ķ{=}f_}}}C8 DUNSp[dWÇ;SDDq0:7Jt $HJt $HJt $HJt $HJt $HJt $HJt $HJt $HJt $HJt $HJt $HJt $HJt $HJt $HJrx:rʲq|xxxxxxxe*8I&u'׹җJ9锪r]QQQQQQQRNkQ !!!!!!>:p^"ɓ'ѪU믿ADÇ;Q=}t ;͞=? )ӧOf?#߶m۱B:PNt@@P;y(Nt@@P;y(Nt@@P;y(Nt@@P;y(S%A:PS%A:PS%A:PS%A:PS%A:PS%A:PS%A:PS%A:PS%A:PS%A:PS%A:PS%A:PS%A:Pө+W%CTCTCTCTCTCTCT+KTa?O48!DUS2^2'&aey(jHe|UPnhW=\SXw ]z$ =(J^|' ?mkT% wʯ*TX Sad"H%dxFUeko(sz +yoԐ˥S1chCTAU)O}# '8_VE6iiSY0@CP;ЕI4R\4D×JE_0@|Cg|";y(r6ۂ4`lváv + zhW=Fح7:g'|3=5B!N:|JM*cNDck3l67f׷lv*RkC0:>$I&2TƐ:!L{̞gv׺=E[eFЮz0NraE2Q]VTvCv ;aCVh=#Q4Qv6'=,{[v0PB!P;MDEYԉh(Xر.r)U'ت '@@7Q"Sa/j IDATYֲsZf~#Nة&a@O)n"DV YcIeǎ#64)GD"lY1džv`t ,fQoϴp]1DZNٸqU\936C 0:HDȲ8ZUqd]&sQpmy-D9 1]&BDJ1Qغ\lc؎m< Wf'xЮzNt%"N8T#",DQbk#keExЮzNt؉h,ZvYg yGHp 0:M Ө"'T%6<͇VlUXŒ8Qa@OU1g}}b_j M*rݯVNH ٚ ]VEVe z'"r9_#CЏҁ ⌰a6䲒[z>+B@1D ?*N ̬Ɛ1!2l١N P;M*%JI" Բ8R5D)<=Qd;pЮzNtO0#mKYNرs̢JQKeエ!i @w0J7E5js6oX,;VU5dHUr^kRGC!0:-&391Ʊl#2ّcMkVc>suz6+S#!cF"c.fgcF^&;,Z 'vC`)Kqַq✋#}g=ͳs>,s,wӡ]Xw ; 'b%tV'9:9qXY=":ש$Ti)Ymĉ/R "zLR(k]vK :\NYn֬Y---/.o/޷o߬Yt+N3NY qNd^|}-Zwd0hW.Zre7_,DU8e˖͟?…g.KK.馛{챩S%8]Sp8܂ 7̙3yo|诠pKՕo*5kV]]ݒ%Kd诠(qUt;\rڴi厂h酹G zBtNhkk:͛7?DtW<sqY]% [Fl6DQ.f]};~$l / 0诠(v b ]9IC/з[8옝B~`!A3p2쬰[ڛe8)8-[rr9" t;̜@D_IO )IXE6ʵR:m2__AY`fSO=~E˓O>dm-$!Nua]UWEX +a* LD Ϩ~ 8_AY`)81c 1H84 MeT7byU]lUHXđjC}6_AYv N쪫>ћD#h-EEsKD?|ɨTZ 7*{7*¾'.,GQl-H @Ce)8߽sʝ Rۅ?\X__ŒHʓAM$} =/S TckblCP[{[K|.HT;E+( NAQn93<Ƙ- q:4I/S2thRguB$"[dg1cƾeSr__Acء(q@Rd`BO+AEh  K[{f}sQu_ى2诠at :WZ?H&+4ʀSgKsS5٦]{[<[ˎU;S),pV3DGg|Ϥ~Jx^*cTU5f29fQ%V.̚ARسJSϐ!2c"1JD":#U%"a +cpBj$lA+{פteE*Nmͼm׮82kǂ.e6AD 0~a Hx~`<_llx:UfƷ=^AĐA0 DcD] ;VE-t+Wpv :O.1wrFU ϐ1sQZ^5"'ODD"*]t WpJv :OU:B$o |\>9ٶfs@ز| *BDXE琢&e["ǎBNQeQq-E{R5HMrguy9x+(F$"XY$v&+3ql-;ew"a*R,Ѝ<U5.n 80qZ?olEED́!:f;Gmh {iSD*tCP9Ѷ-7U7L83\ܞݸ'8Y}8?ۏ N 3$+Y3--,ܸscqq쬓g6nu?WNz$M쯼\srߛWno?',¢;`Qˎ]~v{0:ODT,3ꫪU%Ge86x~?AD*NAi't>OD,"1c$پ{dOחSr=F$BDJ1Qغ\lc؎m< Wf'=QU//DT(Eg2*Hfk4WxnmYRθtPҩY'"28\lmdw'¢,t7u9ҩ1;)t_"Bl(*goVݻv/n8 45-22taut b'"*DjFZgY1yZ#q*":K_VUUba"*cf"2F)l,B*,r=j$qMX srCc+B*bIu(0S!L&]~#"uVr8DIEUHE}r$۲XU1'< P;R"欯9b_J@Mi [jmuفޮN#HERRtPtR]D\r=͐GYr ?豥HruV&*lӞd2Bt)e 9"(ODr C?J"! I'"E'u7Q+_otS[[?._8ċ4#K$Djru-ua@QXD>q*iikk;U?NA Qϩ%133v xeNKჅ=RhMQ& jڜ;V9ˎUD*)%Rնj/?~O<++THM4aŊEQ '}.Vѽm;EN)"r]x.Y:kLsGUMUe:i}pMxVls1a6ȱŦ5sп}6mBRpV9~"uC0ܾ}k/g4E;%?#i(#B"ZX49ϼ9W>e}AC+3F<Rq9f9kz.R;bv9ld\e2A{ޱ;~ d T%I-z?믯+5 8]=AvW!aͻ)0:uoޗM5};W =NAbgm8cFFYFd;fƜ+O,mmm&M=µk#8H]xᨋ.[?L>V+^zWpfaO)g0@e7pÀf^8z|EE`t :O8M8+8q}zMMM:ɼ[hє)S< I@wͻ㘈s{?믿fȑac/_^GT[ \/*&Ojժ}k ꫇MEWj;>}_0aկ~+? ]6TQiEO_|[vҤ_WF7CĉϥNE}뮻O>H$uQ2L&Rn׹K :\iSTu[k7o8uuto~T;vܗt?|o΁#͛~nР?7~G[n?/~i1DTz{Gpʪ2y:)lnn޷o_:.oTm޴QU_޼iMwv__6m7:1U1Ȩ(:s:qޫի׮X瞟짝~37xQvUO}qd2k;7n\2o_<}{wUUJjTB픹lڔaYu}Rcz/(=BR~ Iydâr-]tʕmmm{Ɲo0+W_?I̙s* v*Y^]+8qR,ٹ 7oUイp;:vʔ)+V0Dd`OS)}+NߡS پϾp/ҩNBT모6:4e˖-XnڴiUUw";KvZpit :D̜f W;]ޫ3)(FUzRrBqIM>0{U^-T t?qQ[?yMݸO_21} `t v$UmmmG޼yO?MDW_}HbvVةsNLb TYٲs.筵q.ŹK3VVVfnx:j:5ϻ⽙ZW zWkaЙO3*W:[#Ɨqӿb] ~kG$j :8/хw}䜤!syɼg#e>xFPIJ9뜍R~>eVYVaTvۛs^=~jg(M71ƐQflcv:knclOl.Y.]:%ޮDHo<6I^p}?cv}LJ۳G_OoڝO=/'W :'LH?Gnǟ^=ty`A%/{jQ߸IoQ; VqOveN;>ry5;1^~U__\DIxGI7rmjlrקʭ戈6S9ON1QϨ>Ӏ|#!Rv*;#H9#eVv:b^}l'V;i@}C'3)VT}g_]ka/US HWe}=RyUmmLMV9sҺm'?#{o k9>CwPmv}櫷]i>$QGשּׂroڨ'uQ4w\G>1g⯰;t}gb;Eرcz$ =(/Ml^'Ix&N}+}}**au:J ҉0 SD' a`<"!ҹSaa78򽪸,]>^MүJx$} } }<1Dt/ T"Hde:UJ^{fnSjzwyCћ k?8W9_1:mGcx3?~5WK|nѯߊu8䌇G61ﶫW1ﳃR[ΟwåӅ~fcH{at XŌTPQ:PEhRIA:Аo#5 S3:5T)6jIEETXkY8%1nC:]Ӷ#M}DnCݐu_&'# <&C /НS//]t]555m޼z/y-gkܿM]78 "۶=c)__94˼K0^_|׼&3|go9ϑ(> \i[$)4I"ّZ, WEvZ}V4mSʥo!^ɻ|u@*sdAǙ88zo>M1W_bzcpM4_s|ηqQ׏?ܶ9TIn}):1Q)_97,x+S'_=ɛx'WhJzѵ|$WsGM?S~uq۫9>PJ{ sm/IU-'NS1<9&#}?z_QL!EBG#33UfULQ@$I$M[Z[[ZڊIq#bA+ }G:xf!o6uqӑ\y@6g=#>߹{N,˦, ( 8`Oدl<|pD4]ܲ'e[oknj+hɗLc?w/~YA:}oXqKW1ﮞ=wŸ~W7qn{yt']CÍ;{;{nO@:&UbK.s'x?҅#&\L@Y6rš#3g*j",dF**"sr!IZZZvl ɨ,j2өTg왳|xQ=cjB7.qϖ6לa̭&8mVW :v|:KGN3g$jٳO;aHuxE?Ugf;_O?y}Ww~S?Oノr 7uѳ𻗈ZP櫴>pic]8rRJIx%n9Ɍ;y{t!Wk+}mN9rDQMg}&sT:JIUSŋ444칁Wa0^"z?N2=P~5f́zpLFxe݈nyݿgxgo}g)=ퟺ*+Z"`+:Ù}=:u Ns ښ#Ff3L&SWUd3qEAAEqm6S[d8q%߼խ;Zrb?sU2 lE-#=GE涸PHVB!_,'>ɷ2r3{ [ku~. )\enC"zWKs3E~]'0w ]Ԑ XDXUԳ23g9mvdEDB j<8xzsRQm+Pu\N29qj)YRsBt:ef)w[JUEDՆH:UbDOwg!&C4;^yiS ~PN7e&UQ55zfʪ^ۿ>#RT(af[Һ,K1usG&yLX'>eMYEbb1I~D[p؝-^DDɥm|f=PWwtq ^:e˦o}mEܟFmoD*",^YTM:F*l(|iX;b 6=^U95/ /|[vrIjbާ,""%>gт啕tSG6\R+Z dЖ=? m`F5Ġ:o4n}_GՅT5$W.p^-UaVҵ?:3k?눌y[8O>~)EyqIhȋyQ"U/|& S֔Ȝ\L}>I|=ga/i̚23Pn ϊLoo N v84U/^Rދg.$杹-[lѲ}Gsk.O~r)ާD_o~etLc3[Xɋ߅'NRfrYR72;s\DUg lʇ>e:/^u6mzeČռ YmJkQzRQ iPbRL|œ>Ib&iZ,&>,*bf]|0~VDz59T !5^4 \xUfMxGND})|3)_@9P}fFؙ ϻ \;[z*(wr\RmKlȵOJqDXՋlݙ i&$g$)ꮕUDJyC8gE(?-ޠ砎XMDp8sDt Wk뚖ѯN7q` SG&" (BvD ų=r6^sakJ2U1b8Py53+Ma1_*ݱHœxff)3si?\5a/ݯ.y۵1t:$j.3؊pgN>#R"Vb'K؅ D,%6ڏi7]p-VUUYt%s}N;>ث7qG,3"5J5Ufj,US/EIԧO=)VL(-EEUDTTש2YѮ~Z.#?m J^,-C;35* #a$II/$Ii$>e̞YDEJsՌYS%*)}+(S}B_勛oٚkD?ͼ㈼MĄmKՎ_wmn]_Y$g(OE<4MXL8M4eI4IRR2\iI){H""U{&96X&L`5FD*j$$_Ls%f_Җ϶~@u Vig"2-%OXJ\Hg^D>~uGگf&"ETARW -Tt^YYXTJkujJ j\r~uR7Q1SI<SNS!W]+wl+<~oP>vR"JXSSFgfZKɳgUmצ)Mn/).CP:Պ$B'>74ݷ=gfR.**Guy]a0%Ow='*-QL|K-hi{n)NvONk;&eK"M8I3sfA{KL&L FdF)I{,ޫgIX=Wl r3jˠwŌj+s)NI7NTM #d\D>C,ST ӺX$jEaOCv.M$'%aDId>v)k3S)1d>(u\\0HȈ<'^ :sEy [\\5Z^ŗU/$6mkŜg`9#$b&HWL^55Fs B# ƁnDM4zDF<򮵍w+R aWH )=z.[鷽LS_ץa.䀄TBʝ;T ]>q`j * ej$櫾}}+tZ-d(!a+62#jV:4Xnn, WWfxD/9?dSK7<#xύ[i>)>QiՐ-w 5Y._=3GbMMM?EATTYPxe^ݧzz-]n0/s&HbJ|* H"#WU# M?0YRZ$gjwf?~QMjcܮIOFfگbU]h_ue!j,58 sE/'"b"b"ZEd֡k>Gmln֭[yYbo`TQaP(Zg7^SOo\p+i* }ҟ^șsFc'֢o;PɱּIQTeۋco?ۯ8 ۟{K `\RaRǯܩ&δtI?Tȫy' &"gsD~d;ug;昣cQsc"ϔ):w&A 5S#UBF.r|_sSێy)k;ۺ_ݵfOH8liM {{7zw:՚ԄN8!όXlՉ ;0>JdҦ/|8KN {}c-{79gD\9CYU8!NMwԩ:냏?˽Y:B`FLɔTXMőuZ]TviTgxC펻6}~98`}{!r+D5ؚEVH>R$]_ʚ-M-_-Ŷb!>7_7u&B&(N}jbSDDv 'C|zgEPtmhjƌwfˑTt)=:#8~E3A!THř:Ruʤ?@&S|BY788k[b >V(H@Nٙ ;c&8UX\/ ]w{AgwZ'==k!q-ʧWƍ?~%\n:$UAu ro[}v͞;')1&񡩘0ʑ 9h?f¥'"ⓏGп4n\㉗FN5H}$bFƦljb&$b{gYU+-`/D7z_zϫ_˚ yN^wsnێ}όN?ӯt@$ DS5dƫ~WIT8c͝;a#Gݶm5\sE͛7oo?$R}=Q}0W0>c=vgϛ7*,YsιOUV}K$RK&Uk! )lɒ% UJf͚аx6@"0xVR5X+PΖ/_>@&̘1tD'Hʓ?^0t\$O?}ĉ%M$MOԧSĉWrZdB>$4xμ=#F z*Ix SPy7g?u.t9w,"$5 0r"X()К%M 9a+~~@"0oRxSo6lg?]XY(Y "z.q왳'L@D}h8Ӑ, )A6($!Fs#hi+wѣG?2$RAIG>b3Twa )ط/;;>61=9{=\pDRsbiS]ֆAmd2i7R&ltM?~M^ݧzQNR5gƍ&LxҋU`8Cu 9G{#՛RnD&ЩG(;8d6a-ͭeu!Il)xSovZrYBM&"Քܟ̹~ݸt3ltg\M$p3U rwxIԧikTKRK?wܱjܸ?Wq )ط'? ?~}'՚@E2.ZِADd&z:ZZ[|&SVef$RӖU`8Cu rGΝ=s=㜛su"VGRlPR6DSaJz[Z[zܳ^VaS-ug>u H>*\rٍ7ߞUk )(ׄ Js9w3tD첑bX) Hmwli+$ɋ;"Zƌ9𷿽[oA"%iKܦ* gNAݼ9 7xIDATlj26" p$̙( bcvomn}u{sXTޱǾkfoKkkԩ'{ٸ+*N0 ( ( \lEEAP sf&E[wr5#S1)5Sa_ "alSvGuj-9"O$v̈DU ̈Hpa̝O?u@1jk#jjkkL6 ^̽ҫ!Mtr0`SP# 8(ʄqř0( B #VWc3UaSPG.0Dq&(88"a99a.+Ww0w zΈN>1SFV i8Gz2')Lru-KJp/0^A)93;rґف;. B|1)&iXxe[fS[]ST/ NAEHDUL-LTH=',,DN55e%EaSPUc1QMT3{U׆"6S-,Џ0^A)y5E"G,KYR3;,@D"M=_:QgW,5.嚛Ee+(){օkswFLc"6@x})9#R5#,43oF$siZHHFozMGDdʬЯ0^ABu *Dd OSMTEEM@x}))Zʞȼp>޳e(t#cR6UUv0aTtKjY3RsIX1v.o*y%9ƙ20^AP)#ɇ$n#jhk#d|}gʉ3b^E1+#XzADyGDdZImQF٩8GB3euc ̝J9LX0S5V#*s\-aLD*x}s"Ό2+eRšȳyQ5%3GҶmyIX`x})L`p\@44񒍳) v)Q2#fjn"r{YŐ`x})9gt]v&e{~Jbf;WoWЧP 8IT,`ubyq3y|Nabq[sϬv0`\@JFa{>|Sa/>q\Vda,. U ֝3Fر}pZ444c|Q("{q~w);=g25f+3Cfw@$ [u)T7sN8#rcǎW  V0}2e#3x~vsCCaMnЇ>\`(@׭52ۥK_v_Xr'Mo|̺|jٴiӄ U9Uz+UV?ݿ^qGջUЯʇʇWIT˖-!BUKT̼dɒ˗<7oٴ|>ソ=t񇔿{mmԩSgϞEQQ |WCTCT$*P{lܹ ӧO9rd;7vܸ\^w۶m\sE]4o޼ӧI`BD*:@E{챳>{޼yMMMU `ɒ%s~'V% W VE9f;wnh̙7t'> V лЯsK,ihhw^ɬY/^\0_ :}0-_|L.1cFЯ̝._#~'New,i"i}>$O*'N"$)pw1"[*Btpf@/wOYG/Gןsw?",I@R0 # ,2%b YҴ*v`@PM6lg?]XY(Y "z.q왳'L@D}h8Ӑ, )A6($!Fs#hikjCpf@otߏ{K͉Fu1 ↑xD6Lf3QM&QLW=Ԫa `>T^9G{\9GD7';݈([M`S'(PvqMIEl[[Mu_ p;ЛN;䲄'LDD)?s"qVgZ8ϸHCGIBg4)$O֨TEQEЯ8̝M'Nɏraㅙ2y7?~fO5Fe\68!eL$.u&>67 LN _{@/;#Ξ9{q͹~N隚?xh#]}6 )Ymjg%RUI-m|o= /V=A_ dN &\p1tD첑bX) Hmwli+$ɋ;"*@yEsuL}dlDD5AH3Qsy|( A8*Na80(pajaFAM&tΙ=omޙDԌLŤt6kWO~~/Gȹԝ#3""###QUC23"Raa"*\ŰaC0w O?u@1jk#jjkkL6 ^̽ҫL r0_ ;O(((qg0LF.է.\^TEU@Sđ 82Q8((ȅaF΅DHa t ` )`D'rʘ)#c4 #KOw& –"J Я̝fv#3vP]8dbRLBʶ̦n-xa_%T7xЯ̝'j$jƪa`q&^$eymR=+sl*晽*ދk_q*lZ: WN%j^ɋDX,$c/,gvXRTEěCP'jEŶ\slzUe4eϺpcNΈl^Tq1;+)`DfD^f͈s.M IMOѼ豴LYU1e~0@:OR1U33V5s!bvpvȶ&* @@1""*9U%\1MNO_YrŌfQLC:Я";"" HDąG8Lj#2Nʼn8/3 |WՅSe‚WIED̜#,p8GRoc @a@?qfDq^)LD͋)9ȕmKj@@  HR&^q6eaQ.QKfLͭ^D~;2 WS.]"I+Dٞ߸932rFdf`N[ `@u _8IT,`ubyq3yiiD'N'}Eŝ2Վ:+N3ǖaU1xX92;怽c"5 tWS=W__q}nv u$\nر}*?Я Sڔ)SyjGAD766V; Wm̥8rR\N07k֬EU7Eرc֬Y z S}H`X p޼y… âE?yaXw_ :V0w iӦ-X`ܹF1cƨQs?cǎ~0ܩ˗cBTCTմiV\o~Ǝ{W?g5 Я QQgQUX7V_z} *׭52ۥK_v_Xr'Mo|̺|jٴiӄ U9UUUUUU*jٲe47~jDU>DU>DU>DU>DU>DUP WE)@EPSAu "NT):PT*@EPSAu "NT):PT*@EPSAu "NT):PT*@EPSAu "NT):PT*@EPSAu "NT):PT*@EPSAu "V:S˗/*******_Ϣںm{GN:46z `PYn.]t׭K>izcSfVѝM6M0QQQQQQQ-[FCxBUUUUUU^T8"8"NT):PT*@EPSAu "NT):P SH`;kpÍܲ騣:gTH`[vŋk򪫾ND2*̝ᮔKiŋ;lGSDS8@D$wөI&ѤINkw4ywN<@YJ 1c9f횊jժ)",P!SA:P3َ8֭[}Qᮩi޼߸=NpxJ6Fu keoN  "R}naÆ=D:@*t "tjҤI{>epf?^vrGSD)ygv3H]t C:%"k֬!5ku#N1}ժUeNNG:@3*t "H*bf=gpԴ煍4oMMMMDu DDݴ-JwN_۴vMԞqu/.KYn[m?@hѢE[NGIQ2Z\~eT)֫Z9R*1vU_}DtđТE>۾OJ8jwF36^|ە_ Oy{WK ypí[uk -Zhі,?)+}ƮөXc\nպ-Zp…=Jv>6E j{H8.J۷ĭZE +ߟq )hѢ߶g^6HZwtpA vc-;p 2oNE=OeWNuPBUA'O睝jE q$hѢE[N[97?ФI>ѻYwjs1ҩ*Z ":gMhѢE;ȹɞMGDo|=cZh4ro~oVrөC:U]MM^z饞 R -ZhQ[97?鷣g]Sf_ςt:j_מ UT -ZhQ[97?{s:tU_;?źuz5$acZhynjjjPKttEyn*g˗1Դuv"B-Z}455MkפAm0|d ʠڑ nH*t "]/3_|ŊjGp”S*ySЛXqW;p 7VN`@ENTo?U߻WgU96-?~n=%lxO|k׾ǥgد}) ]_v崯;o'~׿z1?8;9?-e偯^c·d}߾97u\Mpo^򫭍q5ϻq˂r/үoq'wyQi~{?mWx-GviSmK8yBM鷚 ݺtKm>uo _G[daZjuW[W臛?s{9IsE:}@ӝ3 > f߿_x~צ 6ug|#2]<})"̝>dFkv nu˯c{X/|ϗ QZƾiw.uekϞ `o2 #X,VPK}A/ozI aW&~~~gccccӧm\v;1)cѸװ7/\,n^zwwܹSͧ~wwMBWS.x@_o|a׮9Wg}3JskD]է?`Q|OW^r)"r'Mo|/mZ& *9[nt{]R]vYF [^˯>nuKa%T旪%Tf.EDY>/m-y_``Y+VT;0L}R]vY+/|W.C"tqP]Lgv2KqկPsU/?(kFW1zoDtٗg"T,Y$o|(3* 0P]#~kms(89{7tW3:< _?v IENDB`netemul-1.0/doc/ru/img/set.jpeg0000644000175000017500000005071411254745330015523 0ustar frostfrostPNG  IHDR-NsBIT|dtEXtSoftwaregnome-screenshot> IDATxy|לsr+/aWpmԅTmZhRRRmz-XQb[Uln; [@Bsf!1p3&|;s>""""QDDD!"""Q!"""Q!"""Q!"""Q!"""Q!"""Q!"""Q!"""Q!"""Q!"""Q!"""Q!_Kafg!""|m<7ƷW8}qmwtvI"Go>t .xGg$(ȑ\y 0;Ϳ`0ئm#s?ϩ( ˱4MvGC^=۵n ?TUUsoѵkCYH(pH\s[p]>^ӯ ??]Vof>^ GEZ[~}Y: HP(Dll,'4#u0Lˋ֫"3\PL 8g߁\+tWUUsOnb޻i]ĦMsmwpޅ0쩌poN_ۂǷq;;rh7.zgǟ[ߪ[ڿF :^3n"} ;w0w {7eW?y.z7֙׭>/ޗQ'㟯,l|| N;ΐFӫ ΥmzOrd[dp?i>#y:>Va܄;`(A~vCg 'h{mzL=xwoȁ(p!ifVXɨ#ڴR]Sf'$%&r+}+X?l\Ow.ukϳW7]|kرcg~g}$VV.>d!̸ku_vٕװcNy_l}l.JbaV-O?H}+A㺭i?Q[Sg=2A TG[۟sϥ\q8ܩ_)O??_y m@dryv^GC:ɧp+豧0yҩimFLL;n5)soocUX77IFz:P~cvŲ6ng% IcOp@^zڻ7im|ywϼzѽcٲOߐHrr-,ZHpoeYd%F$aÆlݺS'oSmio\f-[q`ߝ~q@/`(;yL _GۮKDc8C4~cN~[鍿q_񿸞K~}֛^Ł.!>=7"!!%UVbqcbTTT6>j|vv%M=7j[۶ooUAl8L~׮͞+))!66}A4[Β23ZwώM{׷QЫ90ֿ&ii6i"EVZU߻͛77`58ִeYYIIĆ23)++'!>3Ro噓ͥ|~&睋8[76>߽Gah+}:rs{]7ؒ[<޲Nj|\YYɽ3O=֦`Z>]t,w4J 774ٵ콿neYjkٲO9XwϨ5yw^0xn<5+P[[;s3PښȠӲ:hu[}&9{ Q:"8u62oӻe p,szZS<{75s˭w0d B~}wI_kW58Ӹ>>O> 6oFq7pq۴m}0Ml\~"mp@ʭ:k7w2v ѽUm}R-[ηynh{<|m\[^Ɣ3~HBBg>} A %Y>O=g<=Ld'>_EyuctG%7$YMͷ2 t}fy'!>#Op*+ԣ&3#S&Aޅ?/xy˦_Oo桇gc4kβl~_k?[~338i$ z K.@sfа qP_"_g9dgg3`@+П$ 4*r;Ǝ9~xZ/"uS*"""u:""""Q!"""Q!"""Q!"""Q!"""Q!"""Q!"""Qצ-zh!"_s'|D];.wmEpPȱlkj"rz;-ʕmm^ߥH/p!oy8xKp10F#SqÚ[QQ-B>]S -HGV2 "Gpؾ:oxZX!RsKHn_)"rX_np} E6mXnj4ۊGF2ύtv"r+pA<0p## >FdIcvHu )dU,. lx$B|rρZZ"cFX[l "Q:!"'1<˶lHd'RkmpjVz  "G ׃U4B !\4]L#!ya**#X~-a[&/;Ks JDvh#7`_V||fs)MmM"B{$d65Sj@na'YUBYaRb|,´lL"bD"&u :#q'VM:)z~_}+uH+o69X> ð_c3ș939l^G2{,.'8:Tl_O힝-q({uc|ߤm_oj& ämL4-"aZ4'o%9}l:o!M,_ӡZDs+pl2SwmwY@ ݉?'SVΠ=:9`\bϋcZ2#x9lXy-ӖoucB&\rB&\ғ'.OO#%.Z4i:RXR^ ibY6c;{=또x5!u55݅Ƶ-zr~2e 7p뮻0 'x `…M5ܹs9IJJ"="uHKx!71H nOFJ/Fo[E>F|O>%x:A}CQZM=.z&rm|&|n)Ɋ*mA`ea6GJlIkL v'/}:ߦ LCI]*6pmOWf;\y<# >ٳgLff&7x#fffrs=t&c! %\F'N#&L'Э #>nXj¬O|wmKq2ŨIFxRvV\660Tnrw An>+]Ȼ0zJ ӓ)1'"fW߇`YVq HΔ BIm xR,k[8ɛ?dp^k…CrJ d/^xG}L2_~C+858~ ;>xC }1 nxU8gRjuN86U]H6sX[Rϧt%`<{L`.fɅ}?9oSs1I bcYjZˣGfhttN} Ʋl*K;1$?QgyL f0@~) #[[6l׶Xٺv׳ٳ6mf̚52qqq̘1[n)"蔊Tۘl;C=>n )~oU +vnj;V]fX]TJu|I9!zgpVW|^]UAzB1 /Gݴ5b{ćuH[T.PY4KLF&s|lZ1d @ض =k[{'%_~ӧ0}t~i-{EQPPۡ6EAN䱇TEOr'b)eF.` "n89c8||Yz|7w\߰yn쩵\j]ą j\4y.mQaSReǟF̫.ま /q, L_?pԻVΙ3l&O C͛_dY09s&SL~CukssD,*]I ̅T<Ԁ7b{%3it|wl<&kΗ쩵_Z=H_NK]>ݵ6ظ/0A6i*1&eԆREB `'ƟP^dO3Կ%EA;ػ&<̙Cyy9_8fj8Əϔ)Sݮ48$_p}\w߀Ok3@L&BU =803rG5ΆJLͣk~߶d~0+sAEC|8$>RTջ䥄n竧_[oMcsY]\K]/ȱKRW6, #Y>hŏ"?T~OF')<*희zo$kúEmQدOv]H$d믿֭[˗3eVXСCm{aȐ!$&&6kömle_{qq>+r:$=x:$X 5ف #Ko!nbΈpԯx,5<sH٬WdL.]Зu˪Z>\}i)N7e;lR-z.AnijP^"/CCx/o/23$1T9(;Խ9?2nx '||ɼ'2uTFd~^^cǎe֬Y۷/^{-<@=W_}uxvEVVV9%[[tѻp\B{dTVa[<",{+b1™Nul$s2 P~}u;mtgC0Z$zGhߒ}etkܝ[ƺm8Vی StJA&'Lm^(H4|{skEvn;q%x8j<ǡ,.9w{Ĝ`,}3g"h[\:mMCd 1t5cH~mȑ) &2vP+׮DZN8_ձ-|fBnZ&٥!rp|U\b*]zìHnH  Fbv ə{>!r57#~6o睏vvI݃0l` 9TZd&$fDaQثe"r7HԵG:Dkjw.ADW;)uO5 &|ZNd 9(pad*mƱ"8f}X sV \x`%!!"Qz`m9s֧en98}d?x¡`'tpHT~ƠAdeeqWRQQњE䘤!"QQ\PTi%lӶ0- ˶ Ob„ dff2zh:/^DV ";|l,˦ک3O+Ouzˤ`6i c$aJ뗲0E{ĵ-Vu͞=iӦ1x`ƏϬY-nj3[iv~mFDV "զ:TF3M: ij97B)>)۲rrL!0Paogq"0ldgIij*.._fL>~f^tEpt?0o:TLCD\\ۢO7R'z_wb ǒ^3 Km:vj3gL<?H$¼y-k3gd̙l߾}ȝwz١Df "!6q,Hy+1Y$ S'`e~+o}Q6~d3g瓗ǀp*Ǐgʔ)|->wp}o2xv&r,ЍD$*$z%lϲ0iKc[(NGd{ʣɚKF 6kY_nmuD"Mlݺ>˗/gʔ)XC6=ÐB IDAT!CHLLl2g?/׿((( `xD~g>{M^zucH7?*g#uocOZM{7H|||i̙L:#G8y晌;v}keݍjjj9s&EEE6z8D$* fݶ`9t}k3ԤiWտͲ/Iıqލa2|ꫯ/_?㤤V݄LD!"Q3udwoS!;M﹀o/O u<[K3q,+S=/~r=at.H;)pH )d|^}Mc0 /Lq&~w{g)rJ{*Ų tJNדDeSk7KVk<= k2YFLHKD&z 3nUgtHTxᩜ9b ׶#6 s,.<ӕ"Gry-rzZ94pop<spu A #&V$6-"3b@{88D9o}<]׵mϱ\ q` DJzq 戝OIe~iO.kGPC_ff=, H2(mRx%R]FBJ&18/R9lF(^O6K'KiZmpmO#$ϵٽRr{ kqLWa4)!"o69X> ð_c3ș939l^G2{,.'8:Tl_O힝-pk>_&Mљ>ιP-0}.1B# M'8Y>S%Эi/ s(ٰ^#NovGٗ_M '+o΅2Jxk}u~5+û%p,V8o7"S&|6ʾ])pȡM&psIUꂑ#{89kCJ_gB],Ea%{k6%[QM}Rˍ -o}VEB8)쨰3]ʫ-kl*I25!"dr PȊ@0I`H W&]ϱf*{ټM1Y6[r}p .NK{}9WwMht$Ne]D{(pHTKUi9X͆DZ3*jo$@r:CrU%ǻ9x8x:XuUi/=!Ĉa;o^~)Cϝ,ZoK>*p낭Tջ\wj?ȑkTٳZOFEpcs6-lON.R* >@]0AEdëpsp^COW9/v^c=rK*|Kh<)1=ڊ/86/•x_n({.G E8*GӝFE3_yc9{"f}.~ɉzB\*xDjHR bOea:g;6k 5ko7oz &L'9.7ptvOeYQ m֗ȑĊTD|wlq}>Ʈ]BJ=2! U%`V7`AgC%OQx8%g6k&u ЇuK"+)ekǯI cb9tMDSw!" R3{>5{8x8^0u|sٳgLff&7x#t{=ߋDŚ]|RbxÖO4]=`2&o8  ]2,ip,7.\HYYseɒ%\2_~9<ƍ~f^tEpzdt&cD繸EEMvVPQ]Cx{i%Ea0`{TSS`,v_c[ݡ̙Cvv6'O'0o޼f̙39s&۷ooܦM1c?p9(pHT$|\ı,*kع3=!1\jU7,ep^z¶&`q&<̙Cyy91`i 2e 7|s-Ç8q"v[k9ihDE`&m2:chmJ#I)LڰRKݎEa>ju]"Hy:[n> ??q˙2e +V`СͶu=0d{zꩍwň#7o'xb_)cDŠD7F0Rl0*vNrU1'ńWYʩ$-]{&c3yɭjl2oĉL:#G6رc5kVu˵^J,6''ˆ8D$* fݶ Q9IF\~M%=Oi6x 2M#M}G08avlVCVϲ tJNדDeSk7KVñ->ڛ%Y]qzl{c,^Kĵ"f׶t)̸W"A:""Q pㅧrƻ:Vq0*/.m cq@\llgtz8D$¡ ?]S -HGV!%m;.t0ptdc[Q͢qpl2qz3kEp"tM0 K& PTi61!csV \x`%1CWGy% b $`߁Z-;kX&aJ8o3' !&=z`m9s֧n98}d?x!Cs0PL i'fu:I uI>tOC\qٝ+" bUiP`@V+[&TŒ+Ň;5ǶX x*ٻ" R9LV,/5  ƒec6"1DLL+s2e.e e8j#wHΣ'A}>gFM fۉ:v,g=^+6uMڮ|?zn\B+/.|# ;|`gc:t.i6|CZ6,ib6cP9뙐x5!u55薷 +ױx/뮸`htN3nN-4|,\U)1l~/NFx]xeW"oZ&z$Z k[k\:ƅ/|923Oj%I{k!R풠À ]SOˠbk 'Z"EuGK;}C1 ȮJ)hC϶ju<)S={62j(,Ygƌn'<<ܟ߽{7:ubPPPj*$Ib„ mL4hN';u[ouIII,[̟ʢUVŔ)Seh~/p\T IWe3jE> Qo9_qC& I)P*!l#U8S{9r[喝ܨLΝy^z%^C5jEEEٳSNưa4mȚ5k(//g֭YZ=?(9`K}1_)ɥr.YfJP& 84k2VH8&  MQ]R|DJJhU=<"A9>g!۷lP~yؼa-=3,laҴٔw6?T:4?s7&(yv2a\(&".} 3^ ]S)uyx<>9 }{1xNIHU YѤ?acNju bbb.(3LDEEQTT}8q"K.v~٬^ŋb|73b1yd֮][gRtgOW\=7% 12 IZ9#N\k7ԋ s8^M?|ޏ"rM^O[DZ{cQN KH^n>׃$I;z9+ljJ)8tg_V7(+?CaYYN|3OO8&\RtӮ˨|UC5Z%MZGu$I({SQV\^7FqUvwk In\eLhG A}r(^w,@A~.a!Ή"Bu EPk8|}:{} ?w"TOE9{$sZV+SQkL>9s_~Qo_e+xO)(8bERRKq]6 .XXV%]2r 1Gs]@?:jI7 23&1>>s` L]+z u:m扭h4u+IR5?a EcG" I9B\|B/IS>M C^.S8VZtdI<}]X|wq tƋg2'hEEv~_la߲N~s8IW'mPڴ+Fi=]dl`4특v5U:SƄ mNǕҦW"1A&TUFS} ѴqMQ|%>gsoڒ UEUdtEMRbsYd̝㈊bq8>_)S2{L_X h߮ÇgOppo{mr2cʃx.Y)+;ú:F,V+RAu&'c6)-+7fqq"kC\*hL6"> p}MX%+e ʖj\8NsXJ9u{I',&5*ˉlCCګ?&IΟftz*]{Ѭ2{u^{~!GpBn=ٸǦN0 ~;n_żcDF5[@TEw$;/UϗUş=/DQ4nσs]9nl0a,! R m@_Ș=H! HuJ ƮB$Z6UlJ ezxI?Y9ʧ'ēO(*my'7ɤP5sCw2G~]o\rBBB׷C+[nŜ930}0p:ߏ[!?dvgŃ/o$(y m"[]U|8xPdI~ʨ [S FI,soݯMX_A=h^Azd-x"/oX/m\C󞻠9SI4!`Շгg/ ŘI vֹӱ=Jpgw&4Q\,t7مŨc<b1]!id-(/,X{oo/g1ơ5 !"-1tEAWeLVB365q776y?oڱPFh"M\O$$HJ&<2J\U혘Ȇ IK#(ٰ~0-W!;5#h1g(o= ?6<6Vx5 &O>BڎB,=>ҙcjw6;FfN!FW5beyTؾ'r$|籰k.Gx5LOU+_5d7ӹ[z=zѱ[jgeSUmkvGs6;VDž3 CSdVu+v>5D {-;h;βHktYąطw}DrҚӧOɟcw#,;SP46WrQ{qiݯ!εiX,RSSYz_n'kqQt[v*2ۚ&9)׍uV>¿C"V5,( Ƃ30(|dJl;T7'CWe4EEAϞ ZЗ&>d8Nf\F1UU1XVzO?%3s67lNG}Y<4%vTU9PȨV9\UtU᎑8> 5q[,2Z45=*ZP4Ĥ$ƌ.]շz4$>}Gr뭷;8f/˃jamϒװko[GUe볕oۚS~>շk1RO$'Ӧŝ:rw&?/b4E&48ظXtJĖ#TUb yg)c܉n_쎀z^uz96.-؟Ͼ-*BS"BhJ!4ZHDئ4mZߦ(Yaߞɒ%2qҽzKnw˽)ˏ$I$%El}"O.0$bDbHE [R9{h#Gx:m:s3{f2a`Z'L&TUbsU+>I21w)whU2LtLM%77׿fk&wl&hO>\HP 2u ͑Cy5 EHf=[W0~:DZ8z(6mbL8|c8L&C/l ulNjsԸb%]Z MhޢtW!"p?[6}ԟ㢖67)qj..U<9u#FBYYHfH9&IX,6$L&3&I+IZL͢dt&%ΰ$7'RtMٺAd2ֈĖDEdPp0P[d7C8A]PQ}>[ѣG܊'O1<,XV~ .$*2IN`=V+bj_!..Wm{.Lk,nL&͛7/g@8˅z@pЯo=ӷoۥxbN'lٺ Sf A\4v@PgLf`4#44deڵ!7dԳ@ӈ!in7x&֭@r6ك[;"cx,˸nZbO@`C*A:'B$v;vO@p & @ s!@ :G8@ p@ sxfZ|IENDB`netemul-1.0/doc/ru/img/netcard.jpeg0000644000175000017500000007320111254745330016344 0ustar frostfrostPNG  IHDRn"J sBIT|dtEXtSoftwaregnome-screenshot> IDATxw|SeIҖB']B me+lT ""C*"P@QY "Ȇ(Cn&iQMI!i}`Ϲsy+gxDDDdV2K@DDTIH,DDD`%"" ,X`$KDD$X""" I@a \5BLRCDE(2ybHncp&ؿnbxv_6r Hi4NWێMZ4tHDd$ лK8zCbTqmX ,Q%bRMH^-d2DG=Oza L*fF=WF. "tB&F&Fx8M;_+ѿE'G*Gـ_ ޘXbm D [© 9 U5g*6Ȃ)L:Dl#rXX(\g R B@ʅ킽#'lx:QbRU  U{mᗀV'V=2TY ANm 4?_<DT+!ŲaShaZS#@[hxW s)(P`sϚ-2{7c~1 O@l4Lczz0qr1"'@!+WTjDܻD =~D @pļ(wnPsAzj*=1`W36l9?ƹ300凷ijGaْ/1i[8{222"99 ͛Cq|ߣzz@sDImdpzu+.CZaWhZ~;lCItqf#O[[L4\d2VF2 M6^:RSRkc¤|ݟldRM>[E- =\QԚ:*Nq3"GUR*N&gbڵf鋈wɯ0p(>޼> 7/_,Y_]Z?hk4 &O ԨQ}EJJ&"F.}ݛjWFtOzH}[7#pqu.] ]FP `c 8-[v05GiPQNBBZuaf Ct w=u`Y赽v_@VV6ODpP4DgB{G3:ƣǎc6_]x GGGt7n?/_ᅬ `ݾ}]v=4h薭X>ׯ''',\Ƶkʍ==S1mjAU^7jfƬѤq#\".GŤ zumFG_o{wX6Zaap9,.GEƍLcdztu~ut̚ߴi^@AZz:N8[/MV8t$4O|2ݽ _dbpoT{2YMK/!55W\ݻwѡC/FHHϟ7n`?LV\O?1bQqܾ}-[Ե  .]TnDDwiDQĴ31Ѩ]6Æ [AT[OTfZ ƸK{:>> Шq 6yJ%lGqV4>OAMWW( D7iiiݰ! h߮ a=F8~X;}Xoaɒ%pssB3sΕ[oPFRRn߾,^{GGG2"ʬ"{~Ӗ_vb"ƽfm\\]Хs'V\6dG:m|酜_OڹkX( " _MrJ Gp6A@"##Srw5 }Y{n}yzzT* k '''c&"69[R0)QF2ێ~U>Loy@?4 ظn,Z\dQIx퍱ijt L_M赋{x>EZ ޮC5$&6N8t oo 8y0򸹹.\@-111@MuVLX S8z0 CB-ZNmf3ˋ,LjZ> 󯏴d.ZQ0EJa̴+ӈ4  DD֬"&bpź_vn^69' eh0ydxxxF۷/RRRt׭[: Eת{hܸ1lmmW_}%ډN:ADEE_y7v}AJL KJJB~jժ]v8yd+/ߙ3gA"""U.S]Xv޼k#8("=d=̝;[nũSA0p@r77777j999X|9믿xK[tQ7%%yyy7SO=:uoHOOǕ+Wpi{RP|ۣGHKK˗r1=];))SN⸷=Ϟ=~GEVtQFO>gj7nB@Koشi+V}5|;TYkӦMUeݻפ*=mk*aCJ50bmz:>> 㨑q 7q ||xzz+~в{ Omٱg@vm08;w[8t(>75]]P(!ҟ<~X;}zu3eܸq˗/t.] GGGòWC+ڟX lmnM:mۆ+W/"lc1%r"pQObJ$/zڵRTߗÝxTnDE&ewll<==PV-}úLˌQe\pa11@+Yfa…8|04y8qh޼9u:u3f}}ř3Ϡ~saܸqpww=Ǝ Qq1{KD]E@=u%A"(02 YYX^Gޡ=&ENEZZ:op]/\DT%<\2^n^QzzDĢO l1q]L9>`K|2t՘1c`!77@ppmPJRB:y~waRJ7oDTTp'Nh_ W^@ 6`̘1%ޯyyy˖-CFFj5kdggYf|Z-.\7o"77ƌ 7=^>آllx#j,~D7=E_7FxzmV} j}Ơ!#np]Az^@HhBB?W0mLw"֮+ei =!dԩӧZh///jl~ׯ4XN>o@> qqqhذsyիN:vSצh孿꯼|`prr2xKr9vڅh K.ѤI W}kNNNx}qȓ;)U*;w J,;n"z膞=!s7} Կ,);vm݈acއ!""Οf ;N!U}2ap˾ɒ,b""V*3lѮmk[50"Ut):rpC(A DDT{'@!C{IQDDd] rf0A&S- WwOhZm55nGBuY F8lJY2TV" LOKN#n:Z""zd2#E[x /Ǹg?k%조DD$ V|jUɯ}"V*UT؀DDdxH,DDD`%"" ,X`$KDD$X""" IH,DDD`%"" ,X`$KDD$WGdiZ ZQt4 IDATd2®=<2gi6l9Kda 6.;hH. -ZF-5Sl̙9[T9KdA*%p1t~KG)@l g>ppp@x8s`6rD1mLxyysr׻o0xsWރ#:kn]O1;vRBo,rXnEWDQOVViGGGe`y/>_PC$vƵ%իWM0ɓc n&BT^''G, rg,beǍeq% 999z󳳳u,x9?Ĝ?sׯ$JA5 {>Yدg777… y111@wx:4g_̹s s\T,ڶ[c^7읱c:c ]`1f,XqqqEdd$""",v 3sJ#=XzLaS"##-ZRD.]i& DԷo0gl)6"2Яg\ b…0lu`fW^hR17)Y+l=}I`'z1g3+IDd$rZҁI@0%lyY S-JPZY2gŜKW"2}t8\\"hp;;<[jj _̜-MK3;KDUiidMVtX:2 .i~y1gl ȹ8X"+`gg]5drKRVAJ *Ϭ2gœ͏Hs@ a%"" ,X`$KDD$X""" IH,DDD`%"" ,X`$KDD$X""" I@axZ ZQt4d2®=<2gi6l9Kda 6.;hH. -ZF-5Sl̙9[T9KdA*%p1t~KG)@l gHJNƱ} ׭^ üg~alM$_B挓9[/l>>hb_Rz:>D=‚8jp;~pM;~66uDO|dt0~X;}ܜ)L&+h4]9rrrIIwlԨng";;辉 +1;w.n݊SN!)) `!Cq/̜-Ŝ9%G >/"lm%&&7bJDy4ΟĔI޵kCV#11_oAfM9&X>ׯ''',\Ƶk,a!cSm߱ ֬P_̙9[J;@=u%A"(02 YYXnnyޡ=&ENEZZ: &6q668-l7o8~,rs&2E?w۷ѲeKݼҥK;<cSw"֮ۀJ<8::wtt-cS} ŜbΏT`%)7-uYg >ᡀɓcwqqƒ/\v>;k{,dq2A@ 'Gl2K(9b1Ϝ9+IDd4دg777… y111@wx:4g_̹s s\ ,b̘1X`␛HDDD 8r̙9[T9aDfS"##-ZRD.]ie"̙9[TY_r .… -aR0gد$Ѥ:cnRVzUQOљbfW^H )V\a3JZ1gb% A&CM7&Z:2%'ơ'Gd֋9?2{Dd4qqE++Bv }Zwxvՠ[lJjjSAǷutI:ذq:>1 _^@xD9z#:wC C`f4tǎcJUk0_.0q⏓qf!"zIvvȈWagk/ß@īk#jxyu0žŨKkoDSSGW[ -='O­Ѧu+ :! üg׫m[6">~ۻGV",=iܸQv~ {woç>WF#))?1.GşO#--}JKXa{IImL/'gg'\r"'$눊̙5jg~BLlJM;:: a mܴÇEoϭ[qQ|:ojBP HKKCԥ?͚Cq;`ɜ u||Q#zmJٖ۰! h߮ a=&ǜ_Ԫ奛7~X;}zs5;p@vNN1=i$))))nnw5]] 1rPle((Р{Ƃ `Woڲ~Hڄ۷! 6FO]ΰEFFݴg"e;plԨng ;wA}Жϑ&9%nnz{x#%5蘧L-ۡaPr<קW{\srs`TDDO I T*եϗzy=[ 6o6zؾc֮ۈF[޽8yxQO3tjժAov>qX7]"ݜ3uncrŽԿvm߂f͚"rIx퍱9^8'1%rDQ?Ҥ1ϛ;QO".Z6ǘƕjvZeݼdff!Ic "zRHR`ylܻw9>sڵmzuhvF3|`,] ~Æ 2zA ޡ=&N+69>%҄||$V@d2deecͺ z=".ޣ\n^QzzDĢO&,akk$ݼ'/WF WKW mܻwڷER~(=$i!+;DP(÷_(cXG8;;ǀ"6.oW} j]:vJ\\K#rOH@|ozϿou8^Vѽ ͘ڎ6&OA@P,] V޵9ơ8u ~nٹX/j޵ :=MZYn{BD$ċ7 QѲuHÑԎ%7ztCѹƾ^QQ;vFR>{Z:yxx 88ಆApw/'"".XFpA&gag[m+UAѮmk[DDd]1QeeՇ*+X""" IYqX"B̊xEcbx.Qg[Go1c)[V^sfM׭iXΉ=:9ʘ1aKSQxDD$Or*o\#]֩c#o3k:;np<ؙ>E_@.#4j @<آ ܇MJN69SܵVD|BrrssK d0mT7={c*9M!f͞T4jܐU$踤/m<_t<]{{gu\jsf{h~6&`ca5:wL&w߯¦[ڽԿ-@|&Ucs7w6 08lZ۬YS/\9T1c)yqX"LJV0(oL⊏)k8^,aƃ%"Ū$KDDU ǃ%""U"&""1QeKDD$X""" T>s_ۯ:=?{Qi8f,= L.D"C{\8{7w~S>-"Fb8f,= L*("rxmH7n5k/<_,Z@|BQ3vjDnp,yz]F1flղ6Jܘe[^w?v]NcF3љT`{q PժU#nj(T|2ݽ _Qo[MǤ,7,PxjJSƍJ_1cI6=p/ӳdG2j"=ݼ҆ 9}6h0nl m >&%ǔ-meE_}1e_oAfM9|cs!!MJ(}563KDUIV̛; ߬_-]E^^v܍w'L<(֬ۀ׮CE^1ӫc>P|lƤ䘲kL/\DT%<\{3_PbqѫG7э+cG%V!2ap"5""ՎKk׶5ڵmmp;c˿ǪUVlYy8^,Q8[c.mLG͋Zx1&Ɣ56pX""pb fϜ)qK`ot/bo#C|!q(N97u֭+~ Ѯc'l߱ CVv67kf-ZCP=!1e#|eLNbK3~Xt&ZxDTX9n)UV|T"X`$`Շ*+IH,DDD`%"" ,X`$KDD$X""" IH,DDD`%"" ,X`$KDD$X""" IH,DDD`%"" ,X`$KDD$0MA>4PA\]QI}.UR!*&EBZáRe|\ٖh6veWp;)YwST 6L\Wi 7`} IDAT 5n= 9(χFB:*%4j% JV+l%]d6Qa߿9GA~> J kQDݚSMrxUWm cv-WCsj5**Z 4jh*h /7V*J^)#}ZjUՎYvU߮bUp8A+}-6 ZPsÆ5ڢF~p9JʹZ-j5U̯>ARL5. heW;@**NګhVm+.*hUvTBV9Z !,64ܓq ha g[@TWZR Z]ڭ+Hn3h ]ȽwA>?  xNWd8uZ ڵ;1i$KT\-Zd :6pTTPhPU+CucšV{^Xy&Nmc9f/\\kZ 6tlیkͳ*]MQ]%U+A'$""1Y dѢEUS<5^C莖PO~8uT?wkkpkٽBh222駟pss_~!==n: Pko:Z4{IDՈȹC}d"..Ժ--sj*!!LOsWihK piWIcXso&9z^S֬Vǫf=8qh..l8?>fecj$MVf&vb˾{0y(QFMyJeݕ5MoiO?y)|y=Ǐݗ酦ش'M{mێ/,8yJ`2d+슔Joϗ.0蹇kb-_4<=~MO?DTT`ԩ۠ҽ{wHHH]v⃂غu+YYYٳ[pyy;֙w9r>xb9:t`߭[.+6sяun-"Vg> FU㥖0JvK˕ulGZZu,]yۛѣGzj:w(Y+Z`/Pˍr ϲڰZmdIVY.*Ai8#`p @1wE#v6[DEa@iU%*qR'cpX^4&o?ND/<s2&:-ٹe|Ig0MriL/+/ϝEϑL0E$b +v>C22y_:i&)*9U^ŊW_DU4oCO%(MZq#]-'xnE`H&rH`q8Y\!fH Iv$юd[' "[gc[y\U$r}V$> &l['%<5|Lmr2Tn&33eѢEy\Yn0uTf~EQ akW9_)~:I$ؕhk sdegMFfٙXsrZ6da73Ch-f^tE^<&yx{N\iZ ux(ï~={WWW|ݝ74@\)lv;z>x-}DTVinIU׊V5UaƌtЁ;|>o//!h HKlƒEPQe;(ɩT6Eeʍ5e=%4?{ca!bUv|, @T+g}v;S)gPϟ")IgRYs׀I?qlG?eħ@.',䣟ӄg'ʗlV44r2`Byaz-<:E>y/k~ME;w*q!=褋NhoIt6_wȾsMҢ!}眻hczW.o:u[nW۷wr=2vxyǏr<s<;y9cǏҪUyt̝NJeK1f$yNګ/s<ǎE<u]6SD cz k%7ō>"H$''ՊfUƩmA2_3ehz\z6 %0)k~Yh9A . dgpCbb K iذ!6g\\:n7nn'1l:V,,EUڶ[Eյ"VcFf柉`ԩ̓Xcw/fK<ԺlEm^,vTIBDs,,;p/nFzn"/ރ4]]J 9H6,JM6+{w }Ҷ#9խ(_QJې|zeEHT?aDfj`nbfYȶ22DіoHHpPv?΅ hU58ㄼ?Aj*aF32Ïp8l( )))п@mʫ3xc\m37LX,L$fӨK:3 \pl6+6[n.VwWpݞOk3AX|)#Gݍqߟx>ڶmGqې̙Y.<|?p wua|cbc07nLV._(<;{ j@^=yu אɘ~o`'L&-^ke1vЍNvf:W|`i`l '%zXpݽp_L;~R$QdYS< |yN'~H;A(65p]}y$9w!3.5'X0åt ]Fޫ*Q>=YޭC2`-qF^ M ҫOC |zlJV-=Hpo曯)(8 E M6g׮?YlI On(/%ꌄF0Q]L܈jEٹE S9{n+fd˖M?tփ70t6AݝV!a6oAzz:}`08uC4 6 `|3 Wk̤y`Zb2O2]ؙz~ q]\H{/KevK+kqu-l֭Wԩӈ?sy|ҭ[W[|MTѶݚwڇ&ܠ~iΦ\Dlvhw̽٭4+_1~u@a Ϭm,P6نl6Zh[>lkY[)Tʂ5']8u]vQ{zU;{[:Jxm\|nobJ G9xY!~ IېE+x6D[Y9;[l(Ry~r=~l oUq~oC9ߚo/f-+ff"+{{)^`{4dlXjFټHc=Xq~ Yi|SW:{ƌ2tMmݖ=G꜒¨C㫤sKuΧXE cX\ l=l;*bnW3v"dյHY\,\,*rض"#{]ó}o hīgQKbu,Lslhw:(SO<赔  +T֭[_'ZElfLlaP}r2dXtѓGh?: [fS+lիtuө|ͷXˣSUDu9@?_5cTsǐq6>9ٻeउ"Í],\|XQt$2aaaۯ+7w/7=z7}zɽ녲C!>J:- "p!wVɆ8%O." ۬ *tNT! )ZUy;ҥKD);-0*9njc,ҡs7D9W dWDټy b0psU7ې#o&ᰯJɂOUw5U\Y~к1JCݢ~.G'p ?~G#µپ{I9:GBB5+:Xg6_6#rKhΕy7wc E߭Cydk+y:eшlK.lܰ!CnՕN廘Lك,w =^c U=r *fQidw,T6TNtj=>mhPSB˙QbcIpEt'I;vEPjU&y:et?{bg[Uc^n :6DY'IJNF$y{2)}"o"\ܼ  gd%c4W`զd_~$6RfF6luؼ+@ņIDATdI$.mmtt(uQfD V>ĖIMFVjՆ,~utTE-w:`0[7mCٮ¨5ց,Ife1w:ɱҶS~wƌCЖ\mcG*qbF ^m[05id.4*OYlT),sk-Bë[JdvEh8&;~_C=m"躮Fo4S.4MRZA!-Nиi%{i6P9躮F;Xr*&UQ>\$z8k>ѕVGGk>e>S#9EZ |[uS,bio¢GV5x2F۹s 14Պh ?tSe 6ξ1 F>;?s#^O +*o|Ղ *dȼߟtɷ9sh3hO>ɯ/Dajҙ&/sX<7֭7n\_C:5Ow/uFrM[Ъe(_}EөfN&;!Cg~6e+$oϘA`zx>`NuIb3 ҅͝;yT5J}};XEbI~<.v̭$!k))ɴiԽөF;͸`pl)h !)a% f<4hDF~ vFbې!t=W:v}~1EVFx y 3K 4uDt!23݄O4Xn݁.;-*(*Ȫ¥jx1l "Bz:o'Ofخ23vX0{W8V5dADu?>f-!Pt[nABüy]%t*w<'W0RpT5S̶iV|wɠA͍N:W]E&Çp!* 5#pZiٷ/sideqoayN GdI=;?Ko_b&Mj]tT ~n-n cMfq+0nXK~`㶃lU^z/}3vƍ׏>}Mjj*O?4SL_Vջt\Cz( ?.cǢ>R;Vۧ٢Ey[uXVtS#f<K0®CpWKhյ@s}L>Aѽ{wٲeKk:Ϝ9Ai"""0L;lڴ Axyˋs*ߢ>wߕJiӦ@@@u:=z2j {[0";dRj(yv˅+yx/YV;:ji?8&Mb֬Yԯ_wwwF󉋋 ?--Ν;3eʔkJ/20wwʂ$#GP1DDך5O ^}]Z^iŴlOOO4i(VTŢ;XkBjY3/˜*Dbۉ1P3o>KqwTY֯_ڵkٵkV; 11tG>ۻ`[fժU˖-#& 95)j(c р]q\JJ 6*`0GrrXZZ',,KVUMc]w_f h.a_I?L ::Edp1Arf3%::u*g??{6 )._oqF3fLCرxWNyu}x o *АP6mڵ_^ɱZ׷ؘѣٲg""":uzZ:u$ ܃?`)$Ah/bLK#l=3ʪÒ赸2vxyǏr<s96NOnadﰫ6 ,Yo6K.'-- ʷ}c'1h,Y^z"oZ;+UÇ9L?4BIJԡ'lasϑ18e~EFrq.(6ϲ谴m'Նb4?*N˃>DS1J6gݻx{ V~4z o׆ص,dN{aE&Y^b Wʓࡇ3i9r hEP0 Y `"Ϙst;Yx{ 2|ʒ"6)f}N@-[R* o{3oeH`T Zu"v#χ1+"ȼ ̆`K/襗$P^y%Ǝͷp'֭WЭ[W\5>|r+It'Ni ymzLѴ2FouxY{_O-[dgo W{O_g;v5N+y;OϪ?> K"FѤ$qa7uɩSg*+zჷ3/4m,dY%~k+6Yy*+*]GqoM1'Kعf }vnǽIt{RPp>moE0dp%$ރթe| N/n v#odԶ*}ꔛ*ԥ +Šn@e4Mjزx21G[ލ'l f@EysRۆTQ%=VB`gYn:{n/p $qTSTUIeYu-,]wԋ hh4`20LJl35Ze$I"`Hf3Ws jEZZ#PA͉߱I=nK@QL&ET]{:UUQEQa! 3i^:>HfVS57OFL&SnZT,#"$!I2,!K|x] ll2c6Pł_p$Q#$tdYv̧8xټ&ONCbXNөuviujthܟEUUǗQ y ~3oP},*ިUUsըb4|Q9D`4b4dft յdʧ?M35YaN(&A\5Z5|ލP4#w煼 9qz*ζ( ,;GA4MsrjetiSoCa:)7թ e:z\iNjF=TFc!ڣ;X mڡv;Xr# ȲRݢT2$C@u])Dw:B zC-N%sL,ub(ǤAuͧ46* Lhp EUlJ%޶cvq-2*OYlTV:B$31D:IFFZ`ǷAA-oo"mb躮F;X !K͊,8^W՛SF ł%9m躮FW;XGXGGGGG N;X*@w::::::U`utttttTѩtSVGGGGG N!F|IENDB`netemul-1.0/doc/ru/img/first.jpeg0000644000175000017500000011042511254745330016053 0ustar frostfrostPNG  IHDRDsBIT|dtEXtSoftwaregnome-screenshot> IDATxwUSn^齓$HH"JU_E H+@$$ilfsf7|?;{g̝s<9VK`0 `0`0 pp8 `0 C`0 k!`0 zń `0 -&d5ƲM `0 ap+h}W3ˮ0nW5jil!Jb͚2 `0k跇hwM '.?_39,>}'u_.8qcƌXۯxz ˲K.sdN;[SMyE?1ssRRVeY׸Guرc97r'bԨ-ްzw 5WkD`0^a Ћ{|{?`⥜ g?Ϭyԧ?Kkka=2ktry~h@|Jkٳcqoyiou))ลsŠ3?iodmFȀ]ۙ=o ѓyYy^9Ͽc֗o!Ǐ|FWzݹrܢmb,f1a9—}{߸햛xͯ~#u\xAo5KWΔ` ~KmooTc?)3pr.Y Y#xD,ubOZqu[d-1aL'Ok2ڶ&3~4HqU9PW/&݅m[4bsx^[xYxG{.!;'ÚɤS}}"dW7SSYăS뭵n1q83gL狟 ]p.]\}u=xΚNvɕsoK7|K/w1qvuoaXd9/wֶ>ۏt;ԧe3e|V<a-OGg'gs> H~[uprNɿ|c Sfٷroᮻr]]TF}C〯O>{/xC465seƜ|WtONIm]}GV=Fi\kTNo=?zէ׿goo0 ᵉ>׿s~ˢ H& i 'N?,8n}38'rgq~??|?P6nwIQQ!ZkzdPJq.*3.}@ds5a#o䢾彌LR)?8v:|tN&2iFU;QU؎CG{3X>RJ,Z۲ٱm[_zKV0il&MMG>vmtXYm|rXt©8K]vc?O^lyq L15elxiLDEmv]pc|>F,URTTcxys~!{(-)kx{>d|k7po%Nsŗ5W׉DXRUYI͞X#o<\ws s _sr׾z=_tA+N=7|s>9w6LѾ+?)X(ǯ_f7/~t-̝3;,i>zroP`0 kz`Ҥ^Q1|xg2~8&Oȕy'OƋ>e[!r܂ctw#{}?TcYݬXy&+V)H4BG~C@#r_fɲSD\ܷ}йuF7vz}{WA~~>k}A_N_83<|7d٩,>a^6l4"9}b 0iܶJKxq=|~/(G `>2WRR՟%Y~2 ÿ랿os>'O}}яsm'a6{>$|ne;dz0hTVʊ .R—7oL^|sa4)_@,GsS= lkkiBIIq٨\hX&"GIA4YtI6<4EaY-qQQ53Qi72}α aƌiL0c9|>Ƶ{}}9}_>Խ;+__t~^}oQfпY>+GUU%籯9[޳7TUU{7U$Ipg~`9}?{퇺.ǽ`0GLp'>Ư~֬}}#\;>1nOH(9smxAaE 6;iiieʓ:n^:_>mjdx[&XWCC.D62~tb<\7J٨*ڊ%%5;_XL~Qa˶m'7%/rvVo$B֦> 5u1tu0lƲ,pon;!ux;Y| 4DA;غ5vrh,JwϧOƊ˸/_g/{֎=Xv6|[7ӫl돾Gzk*y{3{L]0 R4݉_,=&8g,>|⪏7r+}] `0 nO8}ɜd,?OZkiSO]y^ʸqc),,de}y 뮽^m%%El_nͭeN__2=#\ѼKr߷r _W2`FU0۳(/(dTcĺՏ1E{^fFKYh@3EK>Rq)*-'lhA׍0}mZGaQ xPCo8_6cƌԓ_rYL%).*e'rO+.3~[RYUo~SƎ~ _3q=on uN}xqŤ(ѷRZZO~q’L0_Iˡȡ_kv~/xy9nϹ_fᒓ,SO]Ϳ!ίu}SN]8 q] `0T~ж_Y77y${}s}/:tr6^oyxc}}F`0 ]\mz3IE(f͜Y3UQ~mW:7}_1{Ls? `/=ZYz,=Cn? Kc0^ , 0 0X 5LW`0 `x]bB `0 C`0 ˦6 `0 Vښ-`0 `0`0 `0.`0 p"l#D d!r,z`0 ȸzPkS- {ټi͍## pQU>f3."?" `0 W9%ime(+^:<1es|8M|E2 `0 r,?ET'{c/H4#)߀dOsk2 `0 #2 kF& DcbynddUqZ5m1 `0 kWȍRb[8.9.H)n`0 ;Agj4zY^I^Ţ '/д0ZDh1m]oDIAg[ Sc1aٟFa^ϔY _763 WO uUdٱ>1_&؍H?AGz:>*ihoo#ݍ <>K DwmI1 dD-P[ l- KAG:&JJ2id#R&di[y%%ih&(^=}$YhTYHD搊#i%%eMB<@F=m[YuL>+WyCA͌߿BVYe CmW|ۙx4hҸM<"b]]R |stm{ 7$f-|.q[!Bic6Ѳ|t %ԋmCA0'p_^ RJvAWwwXކR>.?ih'.g{{zA9g\5q 3,yg\sյbfTKI#PDBhVt&Ck{;B N$l+9"t ٙ֒]JXD0 -ZD 6D 6H>'JIHhik$r;yRjHz(\qHCZRk73:FTDHE5i:vNb_W@}XUE5,=ܞfg ̩ʣߡh)P=^ Yu[+/ ݆FmpbmN@<u]lql ,"ƏKqI1Bjsjy晧Yb0HiL"`84Ѫ7]g`4G2Q9c(ڜRH "LV/1~:k.Ob? }/h*Z%Xm70䌗nuٚ g>wO&(ϯNҬ<ٱ/{y5liډ1,~P-iK,FF8nw[vuN{dPRY@j5EQPw(˳s,"&/buq,r骕 =0a[a&B'i袵TC)ͨ1LnaׇhMq4bt#XD4G~Tq2/1bI.jȏГ)v)6M0e՜=u*} {zCL]u,V)h!% ~=GÄ~0@ _|SC|O B#;( 1$҃t}T IDATt'imimJKKp%5K!vE".m# q|ߧ5LE/Îlܸ)0~A{`02̭|@~ޛ+tۻ4kXيvt N,2Ռw';ֿ_6"Ј>J j '-q'Q1Ok;N"4WMY8&;eؼ[ܱe8eϼ?P3F. 7u]eGpcE^&/fu\TcK'h褴r JdD@\}RRD(Ѩd~( )8Gm+,MH36}$I|/CBTg"N"Du5uQ|5V-88a-W\._0{h(D6oӱ%v~"Iy*o/0mk(HT?IA |k jFwSR5=|&y{A34/?gЄjQ!db%("6QK[DmH ;.(D? Iܗ6^r ?&ѷs5O͗}Ѱ֟H֢uTQq! ޔ&-"JHR$Bt!())u]|g̘XTVT3 2$?oq: a9B>z=XŠiE,Ҫ(,'2 N%ZulczWݻx4LЫq@#Bpӗ?2 $,@uc'Ʋ4ZP~i׷S>+}@ރrΘh/lՅe)QvXH>#FIIcc"J61FZhNz8FgZ -pruryGr>B&nYH%L>G\n ӝ[}!%O[W.:Sx^-z?eZ\xm]F/D}RLeD\!G(/jFdqd 'FL^4{;m“ _ڸPy3c3+A6rJ2ԦIgJH&;4Ҳ=v ŽvI}"[SR y@g]y.Z[SPPUI u^cow6bA:P=Ð71 ;rv0d {3t[X)|;eآSg.Sv~ӵT:@^,N^,8m^D"Ak[;D_BQg/'E H&煆Tfvf#w_?`02w=qzrn3ꂆd]yKe~Xv pRMH=O, y۹5s.{2I 5ʎ-Qgocٱ3{ؖNД; KP Ɩ&fHK6-$H)'/a۲[ eh IQi"-٢/Ķ# x^@:őn.?Qڻkwa[cN <8+ h)e)( "#E͖]wAlxۡ폔ij nC[[kn= 4eQTX$ [ZBFRf+J|'Ιu70{,̞R ҎT*7hML4CpT9Czoz&d=h}sOϵŸHm3!`4ĦS nĦC|6${ d{c65pQSfGPoЃR}_<5g_좉~#$drNw[ ɵHeuν[C .#e[) y8] 83 L#Bd :Jϧѕd[ZJsNVCXDp4qxRjgGy5l cEي6闓'@C`=3+'O;$ᘢVs/"eh;le;ʖ&Mxa;цV~ |w2ﭗm8}‹W ŎJ:BvrYT˲CBdx%±b7oᤥ'21L:N_R1j&7  c7 t>B=M: ~.Z@4*ZҚ*!9ӹ߅Qg&}L00 Lf[a/[@KnϦ3ew2sT3[T!*xn͛ϣ;L)EcyUtyyܷ ^N]jJS6yEQq \x!c 4c \"ZxO*+&6UfWaȜ2|Fd QO[H۳h!m`+CNfeb'(iss3i‡'',g5 WqVݔ5s:!Iecc6--mHC7(~!Dd풬["h|lgԨb,"`8Դ_r7B3=k=h >3asvx!,VdӧބfSuT؆&?G[;cl}? vcl.y+r]0N!}l8ۧ^DKecYQnToǎ:+ƽo"m:q ;j='Ά^lWhSX:#O#t!Bd>APF5ev>ߥ''N"K7i<;J jRҖɠ LLȤ33aʁKztnlЮk: UwB9PtFrJBcA!'6,@`%ª>`NE\迹gۣiH M覵Fn?3X ?N& YFu@dhMd2p႖^k#PR ߳/dZGBd=Ji<'H".Z+ȆFQ6k`4Zk<#L>O<4jRJҩt4 ͤ^Qy"Np֮(AGEQKOCdȻP8@j $ԋ:j*3)A~("Chsl  c߹~.ٱoJ(94=z.ޓw ڱ2E}qo8*6s՝eFp{ `$)h%"BH=2G:㇋yG&glR"y?$y@lo'D'Q; ;8-v1Eahpo1IJ@K Zށ{xG>;U.. /+VRtltT*W [O">3d8=`4BYGJ()ϥK|'yarIH-x&ð8L<@s"jYQQŸR2H- Ga'PP \ hW57WKQ.`hw$OWdh!2Ik*B*!JNI{" 2\d axtDaUj)d@YtW}t|fBPTTLii)뒊rPPOB"T>')//eKN&m.M`0  SϺ(fYs 1k$.Xwt1;$:l`sy[ O=l؜V2?lCwGhХn^ sٸo Jی.L`Yr҅\:M3w_?pIzd!/zFL-$=tGwvFIg:RiU;x|kb.E2ܲi1.Tx"K6mT8VFY@оH{t'tu'Y2yVN]'\7ҲC> R9PTߵX#fgCk@QZܓ=|h0Ǹ277o]\KL RW*ΐdz-~6s[ ,p%&JI"dp =JB#Hz:;bny`2]%<Ə36gL@ 6TάiZIR4HpJhh'7Ea3h>:h4۪P.(Ah,E }@ Th$ LR*&MRFa]]$SiTH%3 \`q rޡޙ(SxrA |2RT+X\06]4riP"ѷ ЛǺIܠ)\e"!7W&9D= B_JV6i_2hlEN5ճ-943[VI(gC$b5di ~zdҚ#B)b./@uw.v[:5Mq5XŶN$Od|5pM缛CWkؑYD0)S$Ff6ev ʐ')׳eo>j xi,rGV^^"-&fIȎ' 7A z&@ zB**$ ={Y 7*&fI|q+o9>~4F fO+2Ge Ӭ9! d6Cκn~H9w?1΄Ȧ)(gır}a&T.Jtb0&cd2'= BЂ)wrȒuO}t(b(V6#mXiS(-.a=Rٱh2f[ [>gX ǩ㥗6FQ;>{ X*R(Eɪђr;kJN(NyīMzI:[7qqY7Um I$2S?$U(3|~ 1#x1;)̚9DDd яW^`0Qzćv~Y)O?4KXr~.g?%nz#4Ce/})s*s3$? /'ƼrV͔C =s{O9ĵ '`jk2H] ,$I ,:R # aƵ3>47~2>3g1Dx!oR#[l zuvWd{+,F);¾{hsu.!?L'4sS̒f7|c|6{%k >+Վȿ=wLyf mƌ8:̡+o)aΊix|slB{e.M>_lMCYW 㔼!LLkYyõ56kyf!\F**zԲef7e}z֖ƽC~=zNŎNT*sϡ\.SG'YiӸ7oClٲ3gbB$5eӟļ7qZ[s-׎Ch%.O"\F'XKxYǏ%>&saʥ|72Tm>7~gY}І w3Vr*wۖ-w㽋R52O<ĴO1soDmSwCбsس56DLLGDԉxi qwF8'7q2qR4HW< W'K)7.x('Lu @VubG\㢮E'`Ќ k`H:qa_Ä:(.@QL1C<'gbԄwmp3KSl@7dal*YzO[Uy$uamY9I ]8Ֆ|s嚟Y8u1.;qk;ף72ct: jnnlj'.`Ѣ9y,\x"[XQ(3geʔ)E^x%˷h9sfsکqSLtѝko$U w""6g;gHZBfl}lRxG%~ 峠0.J)Wǿٽ%ĪMK 2\vBe^3Ԟܹ-cWRYޕPzG{4\|K ʼ24$r6c;_yf̃)'LlE!%1"R C]:qgM5kLM ΘF7zhwbfo|\|hRĮmS;o8?y݃ U~Íw+۰2m oP*94FJBnM'P*nt̯L^sGU4_՜W^Θ>?t3i͝TgkhXlF7N&~\>[rau6ۿqD=䕪Ѭ~U[_Z/uK+go?V摫k+a)vmEڽș'lg^{xirNju{ 1cC<JV,_NEl߱3fR,y|rYghB 4ޘd)GU$""/y>:-7|N8mv-ʝOlk0:.4o Ŧuw?L3waqي޴VyqLy6\#ټwg|/ޓ#:|Glt(K<@f{,IKV˿]wǮ^6o2;*h8hypsu)˸Y{i\xћ9;Ȯ]}ycc?HGW;w줳3.exxot"+/JMᡇ C9NZk.sƌ7Z 76rYc*QhGDYʏw?sogbGPfY~ߟC܌ߓ܍qdqx ĵ( O:nyMWsb˯ /3Y5!?>J&Lr*Y;_9ܵ0\uc\0m{q!%qR]c u_W:z:|-E#(.abNFOU)b{pޑ9qcII"ˇسa}裣W|?{0R8m>_;5$1 ׈$=^ﺁ: :b 7Q'37쭕)Eb򽩌W)~*9={Skdǘ?ݏqI j̣ qoB緌M9XwMt hb|r8.c<ҟDQ̅+Vgg.u稤CxT*<'2{Ebu|P&ō OZ_|H8RHD^eP4Blgoy)꾫DM1mmSwfryg?!оٌ0[)Zpxanv5̘5.yqq*?_GW/bٜ|gp Wo/rCD14TfsS'KO[Eu }I][O~^Kz=O)D 6 x 78gPk{J I:eSG`p."(mS]0!濭}J,;Q>e.Qb28{q QK /dzį_Z6B c'x{6xޑOq,5OURFF WUغ礅 pẹ:J +}oVU}WOh  Z㻸w?N8^'m$K/>S}FҔ7mjl{<@a Wpא$s\C""M.sv~˹qxz +F tG|l6#X{nt/o^@bj+ *))a#Qq~/.Ż3^wX[9rbG|SEXg]z,=Gp;ʣ}<=oYFwO.QM 5ILQFmv{pӻ?w6K#&n۷)tz^=gL\wx*K}%ກ'عA*#ϰso:CWr̼ XtGH&hDolvavG @3*?^?&xWl ńqZ4(b,?qLVmc1}:3Oo_x}E>U G"cϛyxR&cnpsm4E_ti !c/-7sX]8f  RmZh``NKš2W{bŅ0gނ ]pz8B]<-"""""e\<;m'8&r|,cfΚÊWrfIDDDDDZ{hTcZj~UțId^Y7L+͕7D~2VuwmY|R I@[Q}DQLxغ%Ioc֙s*ٶmX`!v:Zh-֢:Zh-mwny}?7KXzy ƏOSN]Jέߤ7{BuZTGkQEuZTGk:Rk貫1\'H{ JzLX"DDDDDB`ˋOtzwB<~ߗDDDDD0T8q>4n*QG8L+ZC$"""""mLHDDDDDږ-"i[ D"""""ҶDDDDDm)HR @$"""""mKHDDDDDږ-"i[ D"""""ҶDDDDDm)HR @$"""""mKHDDDDDږ-"i[ D"""""ҶDDDDDm)HR @$"""""mKHDDDDDږ-"i[ D"""""ҶDDDDDm)HR @$"""""mk,=ǸQEuZTGkQEuZT2_ን5wQ""""""rP;6swqUc+UCEqdqδ22蓄Rxٶm ,P-BuZTGkQEuZTGn-:Ϳer?~0.TGkQ`ulܸc4CիǾnd:Zh-q"i_k֬{լ]c 6lhPDDDUDdR[f W^y%֭kPjݺuc=j4nȤ~I D6lci' D"2i[nR|DDDDdRZ~=k׮m0DDDd"9n^y5;:65MY`D\Jp>T*#T+#T+jal⢋?!GDDDZw֯_ƍ6O{%o-YsHL I qC"KpiD=1pN{ugTP"9[ A&xbq $#*Q !Ɓw&P<1^ep@\|ɥ>ȸ"9}a{{hfeNOgfcfu5]BBS*& BBd!x3i}"""2tHD;ígY(@`J(q`@)Y[k`ñ)JDDD&WzzzX^F[)l\"L/R Q cB 8Kf 'KN3*#U*6 8sIxP իeyWЋxO)舙Z4@! RΑf8ahx4St;BMSDDDwF7lm\%apt ݥr $Q0924whJʹ/m;K D"""BOWPJ (UL, !Exa= ZyO%o$"""/o ttw@WȀb` }C=@Ve:wB$""rPmi+Hb(q S ICr)`ceZc{Uxoa(UDDD&/]!/Ñ1fe @=EfsxNSDDD&;"i;.$ӻ1R]e::$q\ cgmHx|p)sނ!4eNDN@R($EBP$_'`<K}DDD&=]!c0ąqR$)(Hy &"at:o ^Lz D"VY x*:ZjƎ>JtT7{,AkDDD&5"i+!|0փlyX|Yo٨;"""k8 (9R2K:s6O|v۫* IDATd@$"muyI;G9d9`r DDDdR9i;| 9#pc#sWPxp.k"LHDJ .Ԧb'3<0@f-lAUYb1tfJx S Dx (BfjfZlnQv\˜ë˜Ȥ)s"~W2q!o`]lFj)%2źnkܶژUDDdS Z̀@,ͨgs(%x5D"""̉H WPrY:BBBnP ;lⱉQ>icVINHDR80"fѕT t(cg["Gm0իȤ@$"m+ QUPPH,Ic3`+j-Zj+5D"Җ P'ȼ#u!cfJᬮLv D"vLc#e6\!U`3شDDDd|hʜ8-=(oRsT&K-Y!c,з^sy+@$"mH"K:X soWaB`S8n]+BDDDƍ(Fuq!y `-8q`+Z>w4 D"V"<2:\a3"l=l같åY`ӈY=$""rP LD͗q`,c*6Ҙnpi,"CVsؚVdΰꪫ]"i+>\(a'sEsdskc,΃i~kƜէ\"V^1\>NxDDDdr>D""Poo/W]uU!""" D"2)q0_WnPDDDAHD&ksSaƍ[fEDDD5D"2iBફbƍ-ye 64y4"""jcW~fcܨ֢:ZZdž !nnwl1Y֢:Zh-J_=\r.jXDDDDDDf.Xj?e7jq|h<CU(" q5>ΙVf}_7e.Д˶mX`h֢:Zh-֢:rwn7Mϟ! ZTGkQEuZTGkQ8nR @$"""""mKHDDDDDږ-"i[ D"""""ҶDDDDDm)HR @$"""""mKHDDDDDږ-"i[ D"""""ҶDDDDDm)HR @$"""""mKHDDDDDږ-"i[ D"""""ҶDDDDDm)HR @$"""""mKHDDDDDږ-"i[ D"""""ҶDDDDDm)HR @$"""""mKHDDDDDږ-"i[ D"""""ҶDDDDDm)HR 4{""""""㡻B@Ca!2c @dcDDDDDd{8)ȤzQY ){HDDDDDX zᇛ9q:Zh-֢:Zh-e+W1kfEDDDDDwl枻⊕_=)sckB;cl۶m,X@uZTGkQEuZTGkQ;x oƅh-cƍV^=u;<&vCDZ:Zh-ZM 9֬YOZڵk1ưaÆfEڐLDӚ5k+Yn]rP֭CooL$""2٨aX~8كoÆ br|!""aXnݤ:4Cd"HH_k6{"-ILJLVZC$2Fi~5 :65MY`D\Jp>T*#T+#T+jal⢋?!Gǥ%V@$2֯_ƍ6Oz;Zx0&@8!1(D҈zb(ixR4B#CDDZ8XnOh|\{ _G<18R(;HGGV28h x.REieZC$rz{{Y˾=F?=`:!x<QY`֔"; t t BLP.& yg; ""tHd^>|g`傡+IR@l< [dwxo!̟Ϯ!Ǧ(qCDDZQa}O{{]*X/>GԩSi D"I 8"S IlRJb("Kw Uklޡ :Bmd/ߴRkɒ%lܸ+Woo3uT5Z8:>DDD/}L~g̾@h|ywyѾ:ӔV`嬳?!===ttt}n#CDDIHpY'Ōt:,Q&)QS<GxnvEkL J9H?~\s5e>3eäCDDIH@H H\(qu'(g)|g%XkB_̷-n2R(: :>DDD!."I8O$;8N0& }Ӆ{scW1\o\.sM7٩Ptt|H3)L|_b~g`V)pBg1b1JNVZR0>%8K֒$X(꫹>@T|' EoBLJ4 !D&`C c}zO:|F~[j+sc8 =o{;~~ru]G\V(:""l D"ǀ|5N(|h{2H#,u8y[aU6:ensn&jGҗ[VJBAfR 9XܥP[Ll#YpxG;iISu(r?|V|C_|ICDDI"ǀ2M?ⷬ&VpwtgW?]S[GR,캏3xg͛ kq.Ɠ-Zˮ]ٻw/|;_U>O$ k֬2W(( r!""5{"`=u>\-TzfISXʶS?e/N'|ͶuVwqsYg|boo|L:HjFLJ4^E m/RM3QK3-1\s.Z.ZM.[nO}S|3app[nM6Ci9ifR 9gBxܺmR[,Y{޻FKa'5\?q.֬Yg?Kww7˗/Z6{i"!9Rq.xj3BpF=lw2E(@-{h(Xno{8S>}:z+~;yǹŦ 2Qt|H3iʜ1Ǣg\Jpd%6Z`L1@qk.or%"OLJ43R\ۀ;·|wʰ !0RT!2At|H)L4(Fuq!y `-8q`+Z>w4CDDLHdExPueu,fEz K-. a3K### 5[EO:>DDD&X05_YbMشKcI~Eduj[sjV]uu:>DDD&JX\+ژ,=a oO7 CDDMH^c>|:""2Yi"\oo/W]uU!Ғt|!`ƍaX~=!V^qNLJLV D"aڵԠfظq#֭C6CDD&#!9 ===ꪫظqcK< 64y4Nt|d4vn8ƍh-k6ln#rnnޱiLoTd:Z֢:Zh-J_=\r.jXDDDDDDf.Xj;U:oIHLJ\gߔ۶m ,P-BuZTGkQEuZTGn-:㦩=q:Zh-֢:Zh-ZM 9\ D"""""ҶDDDDDm)HR @$"""""mKHDDDDDږ-"{ ;[rdL0R0qJ.ua(A dۋ$o.^Ɩ:I1Spov2Kx Ntyr)!Kttk/$|u93־p_ٳw_n^ :ux>Hw鹇?z{&ӥ>4J)kĉٽ{9ba1ǰcX1,s,~ ]a׮] aa1ǰGI\\dVba1ǰcX6A;LI14sOÇ7{)"`K;'쥼ii2M2[Ov)]s0!QYJ^cWMKdtY%iJIiMl=g;ӎwt]ݤI mg9YPp'}Q5KM%QxQl^R.Kq=w.Ϝ=l=KϹs3gz>o{ۭ˯MMleضBt&˓&QK\7mҤQLƣt(}癳7z?خ_u "ؙL\W_WcIk,M&MKڶɨ4YmVgrӵ]J9Bۀm4I&diRJZغ!w2jq46iraIIJ}MJץo)s ":|=o^b^坹ٹsG&K9?ssOl) /݅S6q"Ҝ2T$OLL2N3.eP&MiƓLKhH4Ǔ48IoN׷ z!-OU)I~~.+a M4}F8%kY[[ˬ2Yo]m{*V&}I-g6Yt}f,]ڶ|ޥPwaS;[]I}ɼO]]yW2kGm4ke]n~amG`+D@UJ}?L?gd޶7NfYoϲ6oso?x?_.}F-6U躹9:n)iJI.tͬ]*>o3i|Nُ̉w]/6T( L铤$bsRټ>]Ylv96z|y{WvƬ "ZOߗ}ɬ')wmfzQ7sm[ 5j$I(k'4Yt6>mӧktMҮ96O۶' "JMҧ/}fwIDATOIɼ2t]RJ&iQ&IټduK::[ \R3O'Zy[2Ε>)*%9e}}ڴ9:MKFdmS?MZJSɨ͎'mt]IߖPח[˳~Rrnm.nD@]zFOWF&]iuM6麤\&mӫ%?I '%9Hv棴&|vd>kKYvޥ2_oF9wnkmֽ`D@UJ3Z#]ۤ3O;[O7gޤM4e׺k]̻& J_te9mg-̻iKێ3!Ԏ?q-6#v6 СCWWh=>DJ^p $I9 J)%"`˺{r+>un39r$f/x[ցRJwܑ#G #X}Û.!:vfcØcX1,uÇN)ep?w}w\:ت1,s 9e(s4>p_ٳw_n^ :ux>Hw鹇?z{&ӥ>[̕R6v؉'{ns 9ba1ǰcX1,X8m®]6{ ba1ǰcX1,s 6ApP-ATKD@P-ATKD@P-ATKD@P-ATKD@P-ATKD@P-ATKD@P-ATKD@P-ATKD@P-ATKD@P-ATKD@P-ATKD@PKAtر\dž1ǰcX1,s 9b<}e}ƛ6{-/9#ٳwߥ~rL2/L.>(lJ'Nds 9ba1ǰcX̱p7t=]vm69ba1ǰcX1,ͱmJ "Z %j "Z %j "Z %j "Z %j "Z %j "Z %j "Z %j "Z %j "Z %j "Z %j "Z %j "Zرc ca1ǰcX1,s 9yʞrÍ7mZ^֩sGgK=3.e<_g=\|PJؕ^c'Nݻ1s 9ba1ǰcoz5Dv%ls 9ba1ǰcX1,CcD@P-ATKD@P-ATKD@P-ATKD@P-ATKD@P-ATKD@P-ATKD@P-ATKD@P-ATKD@P-ATKD@P-ATKD@P-ATKD@.ѱc6sba1ǰcX1,s 96V={oS'裏d}{s˭g2]x}9=ԙ<{ൂV>O殻(z3|S "`[G?n{{=_qnmȇ? "`[F{o߾|#ɏȻPF">}'w׋P4>p_ٳw5^裏 _o:[Q$k糼3iCV4 9=edbS`kOg/ڶmRd׍G7#oy͋ :կl^ї~}ծ`|N6M2N{sw|U;9qgm3sgw켬7~un~/\՗lU_-޾mk'>)2A>G2YZʮ]>;gAח䙵+;սzn&lwn}SO>7>WlG?&+m7֜sU9>R^K)/|:o?KIۓKG+b?d>яf4zU,/bH>s:Џk"!xe<9޳=_/b8y_<2tɓf2N*Bw_O~"~/RcE{oW9/孷ܖd9tm6ϙgo%k}7>۷/???I<'_w}_΍^i^VC4f/wI<ԙn~t~}wk$IF/^m^ oxcy{o9BT)sxKy^77^wN~|2?wok/M߱<7?{$_/fpUٜ:yWÿY^ ܾ骾`+|N6M4dߝ[rU}o#@Rro6-j "Z %j "Z 3׽57N/kb }:I2\KC"ڳOsPg&SP-K&9`{2pSmrNs-]irN)s@)?IENDB`netemul-1.0/doc/ru/img/gateway.jpeg0000644000175000017500000004407611254745330016375 0ustar frostfrostPNG  IHDRgsBIT|dtEXtSoftwaregnome-screenshot> IDATxw|M׽7["@$DĊURnڥfUuWחZ?jlE!d=ueJ~>=s>s={ƽQ޻C!f,B$X!$ ! V!IB!HB!,@Ba`B +BX$X!$ ! V!IB!HB!,@Ba`B +BX$X!$ !`UH###VS8}rQM&4 p6SUɭ6V|{s:=Z!1n$y͈Qc 7AC["! :{(SΫCɓob5Y2wCc2tq4CdYʑ \Q(T:œTVhљ6sQe>,BsT)Pk-Te-c'[u\2z4ZkC^}įRzHzڽ@zѰq3;k4B6Ç={ܽ{=o zHLll6nf0/M=|oÇ۷e>Ki/zcm̒q)E}ٞW-YNz[J5=v=ШIs6mf^C ƦQl)q)őӶcǙ=yTCS\t=+q> \i.?qr}bog__IKMOAS'O ]u 6*vgNox{y,p3oA9vݸɹYF Cʕ*rjW`r7V3lߺ[aW;9z/k[sn,R<#4s)}.8E.gd`mcg0N+ӧMŝ:y"GןV XYYQ\?'3MXb8992uDN7ówrr}۷Xv 7ӣ[rݻvf˶qz(nEZWMn71d3ɜjr倬dۻg?a=b'dp'Xc۰8s* #2mڵ4hGGG?A۶mqrrDу#G |ř=Ns֕_=JHH8;;EFFҾ}{W^_~1{˘>?msN1n^AQR(UdnjFM[~wEuO,[I/pLwwڻ:=m'55BТe%Kzlڲ+Vѧw/Oƶۘ) |3%KWPf]k ܵmQ5^˯琔lPfzE?݊MN6lLrJ zv϶̔Q( ]\\:t(_|E[T*nݺ׉W^III,^H˩S۷4g]ɓjՊ]rM._lp`ׯ111\|X^~eڴiCZZY4g]09ɯEIms])T Y˷o{tiw}M@ղ{ѱsw.qc*]4DGX{s\fp |}|.v?tꀵuz@rr2&/gn^c֢hu߹Iش{^ iRdlܼՠiS?kxz~eoPSۋ&{^-Z`׮]ٖr9V^M%4i/2wÃ%K˻0h On8]~&וWƏO<<<_r>H?ơ7(8g>s9'9}7(GVCzz~iuh4Vh4Y(ϺkT?Bjj*IL4,W:S(T*RSST/+QF5>4t4^Wq{t8pݻvαL`@eZh ɖkה1Ijj*ZJ+T*IHH?dsM k';abxVzK2:ѣG]v1q:|;O933ǏcggG)Vj2:t`ƍDFF̒%K_>^^jLak~PX vXl?wzs/Xw8;ϳnJƵ=vU_BTZ\u`OcܻE:o///YoyYJFOPZ(Y}bitxMN:u͵ܧ,vMTv+灣#! 3&וɄqc,v8sk֮gAy|1UTaɬ\VԩS >xb:of8lu=*>>Z͚5kسg*Ub\roooƎ˩Sg3˗gϞ=O υŜ}~REE kL^gClî{ ˖ksl2'>rh_y?hQ߯2NbŊRݻd[SS&M4]cq߭4P0j0Fkyc&2ϟmv^ Tv!IPsN B)^8d޽?>_|iκ+BO>TR#FW_o>Cƍ "::bŊj*4h ̧겤gNn~>g`nEc$S?MjZoiUء"LQ3___vqPn]})S_?FO;NseooOʕ]W(t:"##9s C{{{ Nرܟ7wO.K* q5`-r)sf}Ma#*h4~< {9n޼IRR7ųn9+WO?EZZfӜu|r^Fa޼yӲeKJ.-".. .]Jbb"իW7k+>KD~}ok?(jSϋ+v"[]DGGʉ'2e <חÇ3d kfe=鯬Oƍ>UTa޽vň#(WJ*nݺ':{/>KM'>%`(d91Ӈ>}[)A)zO>JaeL( VBP*)FLԝ%OwS2w\M2Cdq? ?7qƎJA8{'lRUt)VNuNEHH_>[-TV#,*Gne)b*B$X!!'!$ ! V!IB!HB!,@Ba`B +BX$X!$ !PJzZcI(B?,BXRlZ S'[V!4m6iN!x(3N0v\ll,WSFҴeۂ4%B< |VQ\lhF١S7\J{R 2UŔi3hBK*r9nq5/YovXB!I\U [[[ԯGjrUFMmӴykƌԠc'[u\2z4ZkC^}įRzH$''Rڋ[z{_1ISRڋ#G1)zQrU+WߴecӨIs=|}[?#by,vWL;Lz&~6wJm i:G3Xh\eʴ -CnFշhظA?nÇ[FSn RӏqqmPgP&ݧ/"`v .RKٖӾcg^SϧO1Xjy;\<Ocyg~%-5>P(j{+WY~iS>շ_ZUfN]REq+UdK$(0Oyoo+=vEXt{;_~>yqV_wv&/f5 qz|NȵJV-:lIcaT^RkP&S畆4migP&..v:SbEfL ml'44ipppxq'Nclj}{{{J(apfQQqtk.ݻvf˶qz(nEZW ʴjr倬ӻg?%T]{(srr}۷Xv 7ӣ[8W XYYQ\Y2cI(}Jb)r ;8zh?'ܸΈQc |:i*9iqJ,kc}J-pppE? {P(,f6KZͺzX߆INIW&wzj5N.\x)%J&ٴeKWO^vC6\ZsHJJ6(j͕{QQ&oL}=m'55BТyS^ܱsw<}*l*&}:^?ߘ0GSBKKFֵ6m1(ڱի1zlu\+3cFRRRﻹZ;-/so? 7mx&Oɬ/gT>Ӧ~pI|}6bt,gSw ݹI3z8~gat:r7ny3ww775aǏXv]:uڴo7Λ| :vNJJcaݧ/"`uPըjnEDev+ Y_p/l uklFj0)IS iP_I~CV-\ä~>NRaccFW*ӪE3>hRSSjTXRIBBGv=_N5q7[*pף{.^Ɓ޵6)))ܽ{ȺoRHMM%3SmX%x>& Ұ&TV7l*-_#cʥ9-YQN-6mOpv.O*6]J5d岅F ɄqcLZQcʔi3Hۓ/?fzN =cZَrr9!F_L vD g$BtXP),[o.|(}̞֜ mZfp iPupn"55VKQ*$$$&_*Ҡ>GѷĞP?q]!7Ӣlٴ?%+TT90u=2220nLVZK)/t>111Tvy}8MnۨKafxʫ. gΞcMB"-]a!Bc<==YbׯꫯRD 9p~ٔ)Sc\x͛ȑ#ٹs'͚5Ͽsڵٙ%J{_yCPгgOrJS?YYY}v2y]:W~,h߾=Δ,Y{o֠ݿ x틻;NNN?1͛S~}Uf09km߾~BXfǓxΎF/r~qqq( ""r5cEZ[oE=t@ܹs&00k0>S?7lؠ=zh ~ѧOqtt$00_Un~ޫQ1&e IDAT_Ryn^uFcE+++6o̝;w4hzqqq4k֌=z0tPsCt~-ŋ{w}6'III޽ҥK1潪j޽GϬY!))vѻwo^p!e8x III:u2{lsagϞح[RZ5*Vh rxV-nٲ`6mJBB=aaa|嗼Kߟ  |+Vd֭@YFHH ,̙3Pj׮M >ul޼3fЪU+.\hpptgΜaܹ8::Rxqf͚ő#G ՗ӧ֭#55WrMx s O6׮]ȑ#̝;bŊ̬Y8xYP^߿ ₕ}̙3*Y$ 6J*q6eFƍ̵ MB#e)SWWW*UD-ڵkz\~1-;v|'$''ӪU+֭رcI8p &M +Wp!-[F2ek^MOOƨ:WF W2LjL233k۶-~8C(Nc-]WWWٳo߾]4-[F~mL=?K̖`#"" %((5jg{JJ*ԨQ^ʽ{ ʤqA6mDtt4ӧO/NoG+U-[d͚5̟?^>c|||Yf?`СCY&Ŋ-ϸrB7 r=<|~SiժyچġT*qtt5k<㼇vx"O&44M~_ELL {ѣL>BÇIIIї3v͓zj"""'-S;>ZO~ۯe˖8880|K2d>>>.]+++}][ҠA<==a$&&4{GB 3c .]D T|Șl vذaܻwk.ʗ/O֭yp;::%KФI_8q"t`ݻK/QX1֬Y̙3O-[4Cٲe :t(gfǎѣc1gnܸAXX`9tpr+'( ~ot=Zh/P8< ۆ;t NJ(㼇(S eʔVZݛޠ_^ڇxꫯ8x nnnjՊǏSZ5ƌ_} 7]?..1cưxb!z:?ƾW/_L@@@KZZ/e˖$''7|Í7HJJN:t pѩS'&OLxx87n`{2u{^égcڴiL}_r=:t`۶mܺu:vZʕ+Dze ._˗/wqy 릷/cDFFfZnmpu2~xuFRRUTVZ9d5j*~~~VZ~qQX'J-j:۲ZjIII!!!#GҸqceҸqc?($$$}vVXKt,_ׯf>}-[`mh쾣VYbQsPըjn޼ɺuTRe~k2f_0a~~~777 APd6nܨ@n i׮u1_re7ǹf7>+Wecn~ܹsȺ,RHII!33Ӥģu?0V%00RI||=W}ڵk nEBCC_>}Я_?J(ζm?mڴcǎۛرc)S }uy3!!?7UCwww?n C*ݻwE2e lݺWWWqrr"((͛7\ׯ dɒ̚5`6۹s'r0}GV3k,nݺet}?>X[[SzuزeAc_^ڇO8ի}]!777-ZD^R3221cFQJiӦI_k|fΜʕ+ٹsr~qqqh777J,ɤIX~.c 2{TT>6lH.] W0֓{Oښ_WW\,X{{{ҥK۷M62E[F_8q B^fȑXնm[ڴiTB~T>%'ayvU!Dެ ;Q=CBg$瘱_/Ba~rX!IB!HB!,@Ba`B +BX$X!$ ! V!IB!HB!,@Ba`B +BX$X!$ ! V!IB!HB!,@Ba`B +BX$X!$ ! V!IB!HB!,@Ba`B +BX$X!$ ! V!IB!HB!,@Ba`B +BX$X!$ ! V!IB!HB!,@Ba`B +BX$X!$ ! V!IB!HB!,@Ba`B +BX$X!$ ! V!IB!HB!,@Ba`B +BX$X!$ ! V!IB!HB!,@Ba`B +BX$X!$ ! V!IB!HB!, +ݏ0wB!s{1K!BLՉ 92[Mj*J*U!D+ uvw&P)T|z"ˏӷR%FeSLהbvht ڬf檽 ܨPb+j-^̟&Pys}1fΤoTLMҽ;4>xr 1@E_?vm9JtM@{zӍ5::؝q-yoY{q=d퓙əCy}Hר]bT{ /2g 'Pn]שC?X6$XQ~p],en\N< uDGGQţ~a'r7G}:-JZPTHDP<؞t$5^^=xlЀ? _Q'%qukt]bx56xvE E2{__|3q[gFPШ $&&ѲzOҗu:Fzڠ=ݿ VZ-'-6VB@Pd^W??Y+ڢxRr+#o&UMK>E._zxFZh?>>M4udK)ij\} ԰=겒je$R5+}Nscl2|>3ym[66\mBժAj*۷ؤ ڻwA#%)s;vP<ժU7lؠ=zh Lpp0VVV۷BAϞ=۷/899#fپ}Q >OOO<==TRWmXNg?wx7T!J\LB,ӑ:r{0=6MŽ/n/-gFETdW1}p:\[;{iϤ/tޗ܉N7`m?M0u049AٳX"1x`222tX$ V<Iwo-ζUѫiܙHDs[sq)nXvɆ 8y$ .}ܾ};[K.RaAAA,\Pz޼yTf;v$**˗/4h@6mh4XfϞMDDԬY_=ݯ2ln,zNC(?wjuϕxFsv܉jފwH$ܼN "[ׯ͝pZ{/۲ך֎Gucǎjptr&1!gO:)İ0362cݸ1vߟ*cY˗qݺu˶]vO?>$))SNqAfϞm! V<|ˤd$0jSS^ nƸ8~s#65~R$:t|hWq;UZ(464 lCɒ%hذ!UTa֭ 8I&mu֑իWy&o~kؿ? ,+++>3ݻǙ3g snX1!sދ\(' [57SёoJ%@.&VZCѡ#+!ZgQe?66R*pq%6&F_4>!:8?~7+F3[-NĻڈtqqhoDJܾzzk[Utt4eʔɶLTFTTѡ=S۶m9tYVJ Y+:P5wcq+U<[lZkGgmaEr?6}zjo Z&00ÇѨkdTbObc8qTٳ֠TSqpvFHbM=NYoR2VKtT%Gioae")) Sc0ES: ΊTM'栗o];m4@h/fR׹ ?_kóD<5r#Ae0q̛Rʱ?dܵ])[, #?gS4{ }_}9W._O^b5&au *!&q M=z Ҭ3֨vq )UCDlj25<2Pk`5Z-VJٳfT앭~q/{e[v>SSJCk-htԨQc=(=qg)bVmV.hϞEѠWʕn< 70v|Tۋ 6e[kRRSiڤITuZtߋq_\|5.S1Ɠ+"( sche)':v 'QqaWL~|.uY7AP`VsѾ_|5o&kZ oٚOFѱXֲ Q ( عk7Ơcyb󭬬E1 /e1FJi24VAy9ZݩQ 7\IIS(:WVRdиX-GFzfΤt72P+@ZnݺٳKgsx6Rx,5/rah.ĪfM8O?%11?giЀ'NܹjSjjZT* |&iA%bayeJ2s,9:;>GQ+|t]jm:5f) i ֗sw {b𐏸tKfu/`Ɇu׷P0m\auLS\$w!n*[=/b'~Fzz:>3oޜƽ˯qq;\d;,wat)/'3|+#|^ K,U/IDATX.=5!Ka7-KZF&m;^iKw,RSy111akk%ws 9ξ@Iv|~q //}j6|m9x1OlV&y4k*m9aA[݃=E\q'=>9ZeV+g3؇lmS#v[Ϊ5~'-þi4j5* Jou֬\>}akkGݐ&f٘X߇ȈT =n wwR !MGD Ğ=K6-Ӈ$XaPܝ3#<19[GжI֟VA})nNzz"5*%RբVhhj5;~N !RDPR)Q*UP.aQ( /?z:Џ>bԪk[)uj233\ZGHRtZ "+PY[aee:566(?ۣg5j/c3sSff#n])ѱǣVj(J\Fb^?^NPHl /=pfo~b8罙,-b(R%)Z !1X&k6BBBbJ q*+sgdn XrHj~ź&NBi$`@Ojmzz'Ntܽ3A SpqŗPPP`Jo,FK+ݶQ :N"G8F8ƧgU4> חKB$E)7!J3üϴWں'axڟYZnx2i m[YH{K4D߻o0ʆ7J; nŅE@Uu]͡ ݺ9Ҵy''H4q}j_*򕰊JA[67&T _~M?Oh=GvrX^Rxs2. c󨮭CSs **`xҨ.8fnGpv :T:2=._B6}l?+,0c+}~wO=݈`0tm,eDEp`ƹ+t* H}9)F|{%[sؗ~D"i͑BCEym AW7& ,..$.i#W !PT\}Qܽ6AŰ\Ab:ΦAhxsN2Ǿ~𥻍5y X"""0`\%""r X"""0`\%""r X"""^a!?bIENDB`netemul-1.0/doc/ru/img/mac-ip.jpeg0000644000175000017500000010360111245742137016072 0ustar frostfrostJFIF``C  !"$"$Cg" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?uZEk6ڎyS\[H (@FmVoVBՎ`i9]J3iRc O6wf.#ar0=1|V*8h$}<)6ބQiE$ȋ]x\ Q$Z|ӥI+=j d_CIV`xRX#ŸwBJUegZoBTRh-,kb6GѴ ?Ut탪y\hx>>~cY-aӮd8/c !lG[h}*Rnr% \O8K &)+ {WI]U2@.{S~A-[7 PXz:;] i+Z6s@m䲰ԡꣿ̰I2'uZ{뇻IxOԿ8(QsK, ̯q<!ǕyX'5W+ƸKQeu#O ͺfyfŘI{^A-_EUh?_n8v_o{..NA-_ET?_nyٿT??_nFA=cEy_..FA=cETh?_nl7ٵ?S?_n>A=cEy_o..>A=cEM /7GGytyu??A=cEM 7GGytyu??A=cCM /7GGytyu??A=cEOOX?pf<[ˣ˯iOOXOT[ m#p_@Z7LMԿ8D,եrAX[t/kkKO6Vqٴ\f}ح[[*r7 qۥwr#0O6>?Nfxd 7VB$me9\ujc #??RtUG_j}!G2E_8+;Eׯ¯?%q?Wտ︿ikKd1 'Z5= GMʋd\c-y MBajtUKO3Y. Du_kWIyRIi\mN@v͎RNI&*?ԝH GpdqQԿ8yo xkÊWS TTxTyS Z>zm?n?路NvwSX؃3|$z/௟H:)}U /?~)nTAYm1 %G$?:%7h+gy/?~+t}r& u+CcE:RTEtI>ߦ _*U[˸l&Y@(31$Z^\-Qhh81rwq"L?oyfΙYX-4P|뻅7s3VYIeE `yP*o7QO<'M?K>ߦ _.o?owK:˛xO~)Ds C:]9 C:]&߶ ] A:] GPF X :P\:zduK̗{[iKޗup qsDuXg=-zծ4l2gцx'JpW1js,en\ϙ/S^A9{ y;Uw6urZ77׳3{d4z!A:>> &Kg3 m|=E 7W3=4yƀnus>l?o͗{[h .7W5=4yƀ\י/K=4\,t7{7K=4yy !jMo?o]2Io0s?ր/nuE3LDQɤ34gހzL3Fh&E74#֚i3@&G7&FiP@g\gbg\gᮼg63/ ۏ-u/\F|mz#O0xA lw2^`e]SzƋ-6W+< 6-'q\g>h>0)5]Z^ ZHLv g޹/'NP[ʼW+_, x@$wE4eb@M{f+hyV3={sa(1-~|(/o59<\>g޻ʕ(Ѧç GFs%orOkkKBݪhc>~uhr ]n0hsbΗVI86@e 1= ^UV߇5_9wM4wUI#q $n{/14^O \i!Rs+@6h; (QmE?4S( 3Fj<\K4gހ37󎲵ft&A \BcXLo[o 8OCx/2h<*.eojX5 &d-]GO̍0(?u .w_ogy ~{WCv> Ni ;oWFffӠg엶iKMJWYnSH"{MBf{Q$jX/+ !|= iI;?\P[w‰Hq˃z_KUgx爬$5[[.%k /dp9gZ; 2+үEekeIg^k??*Cx/ 5k/P ?3V?*Cx' 5o/P ?3V?*/P hZ???**fcʵ^<U6Bs90xg4yqgnh;_G??ƀFig>q4f{/O_@ qg_G??ƀ#={/O>q4}Sh:*OqgsqCRA8Ezi~H0__?͎v.ŘM%&hqBI3@ E&h-4RfI3@ E&i-5Zg!8'03@U iڳdQFX#ߐzE?߇eO~߇S}9-MϛۘW˗,n\abX9#/xVUK8 $"Ef֋mqs..L$f}0ƻ/neB6q3w|)mɦ<&h4)hT$ێYJRyF: M_LuմMB-+,lGL yƗR]\ǫhXt;NDЇI2E_Z4} >#}/X[8}ٰ@q/;* @"_xKQAӖbKH wyW 8pQ9'n9t O-$biHcA'9 1 Lat7u;[8cȸ|?qI]ot'ҭ3xZ8>ۼ],v A#c' 4i6)hH%щ#Vn[xX9&)b[;noS@Xx'(XZ+{-R763G( %(񭟅AK>|/yZf.c@P>xT;^komk(#iBP]ػvff'$Msςt+ xIt7F[{[$V&Dev}h-{Qo.RűrxvWkS R8v*K(&{OeMgW$IF;ր3iZ8ks^=O]x㯟|g_EA>Ezyo a޽G4f~HX/௟ŢZ?'fvsgIaM4^ٗTu:谷7SKb322qV}ׂalNk;1 y.&w #0P] `ֶhzƛa}o.vhX2>H @\\x/\O5Zi6f)9V&1bipxSSX:ږ}s0ܜIC@\Đxcg]J]2\aWR\n"8Ur#ֳ5_[L/TYNwHF+;&֑hUiwP]q,sƲ"4H d<. j~!t gPR|@.fWqi8ph\ί_YAj! EXݵ]DY>_'zVm|-M}s_->IMς<{%Kď=S\_E,XAyzf0DTc80HAiZsg8&9܃*AA Ȣr:+K=?~/ =?~/ s6OOKhOOKh\͢R?R,3h/DԿ1ƏDԿ1Ƌ+K=?~/ =?~/ s6OOKhOOKh\͢R?R,3h/DԿ1ƏDԿ1Ƌ+K=?~/ =?~/ s6OOKhOOKh\͢R?R,3h/DԿ1ƏDԿ1Ƌ+K=?~/ =?~/ s6OOKhOOKh\͢Rm W.&ؐFztr{@ ׏~3p^3g}z -i~HX/௟_>7qN?/Ϸycn5OMxo~on$ҮA`\l䒥oϦ_7: nDaJl8J͸`>n]BM,&Sˆ=ai~if7|k;P/4;2#3iz-qh泍̎C0j /p"K-IX4vc`S{)P."ipN-'{m>@GItG4I!ʒA!pI$ײQ@fZ:D4{HDX%.Zh(̢3r{:( o ڸ[jN7&ZO[aF|Ǖd `)݃vZ}JΊtu{vOO꘎kᆱ |hN׭VUKY/KHll$<*̍!I!];6ӭ#SO7E ^\/$y\ vOO?? u=U-V"k77),w@{uPJ`q߮-|Gjץbkp yYlr*???dt-Ŧmxr fm<=-EHT)rXC5c7\ŬMcspmt g{MFMzg۲ϺT #W1֡dn`Fs7#)24|u0/++]JI4$h (e]4{>\q'G09 ]6zv}X?N`eekh##(9FjV"a>Zx)YdhaIhd½75 {.LRP҇iT$ $e `cKvOO??nQX۲ϺTn>}SXܢdtݓ}crݓ}vOOꋅ+vOO??.7(????dtXܢdtݓ}crݓ}vOOꋅ+vOO??.7(????dtXܢdtݓ}crݓ}vOOꋅ+vOO??.7(????dtXܢdtݓ}cr|Oo??盛_EdTT;2x; O? {x; O? u?9/6o路P/ ٿa޽Ba/䅂 l(:Š((((((((((((()B{]66Fc0ӊbE/k!]X.%!]ɡmvB|s=208QES!U:zK ]Oqp0x?C@_ )J)C@_ (3q([6ؖ;G6ӨbG,<w`)C@_ (3q(3_ BUFX%[h d]z0fHaE3m@Gnpyԟ!]%!]gvQ`RO]ǥcQ'bT?:}y9 O7 zy9 O7 u?9/6o路P/ ٿa޽?4|$,Wg/^|?6c&SZ[y2M Y˨#8PFM]uz\wFpjPm)h-MҟަP `\hm%n4k2y]F.C<2N xA z ķe,s,#"4 \/qg3$  m.=7ø;dٻN~ X\۽ s򤑒w*.wtwš~څp";Cw4"X$G Hf\95'Í]^t42R"!}9Tu1)?B^*mt[K@TI'U8H&v-` C4-R;.6sd+;r @'سgi ΁k=^klV{^E}c6;@^0H5τ?>eCmq$#epNN~n{0,SMZAҵ]J+}F`m"FYac2#(b)$v1Fi)A,j6 zT.#\vtVno$WG/Ha_TXd2ȗZ̢iifvf+q[6ѿLF#}6ѿLZBmhZ:jA-ծe{r4{mܧ#:? u?W3x~hGԼF5ku븥eqgC=2 A+93n"3gj֗.}#n^2JĞ: 7hfz7h\m}]B5НfCk$76=2sI ^AM^k@o|&sc?_/lo^^aA>Ez~i~HX/௟Š3Fk (3Fhњ(4f (3Fhњ(4f (3Fhњ(4f (3Fhњ(4f (3Fhњ(4f (3Fhњ(4f (3Fhњ+iZ8k׳^CL]㯟\g_E -ӫ~6o路M<_/ شW|K[ xoTb{/Jԯ K\ d(cw?tOPӵQMt"uۉ%E "6 6yjwFf`FEqg^Ii/ZO.4άfkewZj`ӌ;>(ռEm.W<.-U63ʱ*(!`?= smbRHHSA$c$GDͰrqpsĺi7w-A&GeS=’*M$x4fLњZ)3Fhh4fLњZ)3Fhh4fLњZG-9AH٘ 5wSY!!-Jf* iNT7z^`=̖ø+yH˓y'"Mu h44MFK h;RR C.N\dЅrRfԔKiIi;8'1S=~% m44زn#Gq\"xX𖺶zw?]iXi!VO2[]ȫ3TTvk߇{];?\Jz$o-t/买=:]b;}QIY#+T Y`]YJӇxr%wvvs$SlG|ME]~ ʸƅZ6(R)m=i";Y Fk&(gAsBQ{];?G#'_|3miO j>֐iW* Fݬ[, ?ǷVUt[xsqۀF2BH8iNSdug:|FvK{gqc:g:G{8PXTT-ģnl s OҀ8X|jJdg_fc/ 6&(g`H8= Y{];?W'٫>i᾵b/?Q}s+wo.bQgh8y?w*GӿULG |=HӉ_zmɲE%]spk*\gЍ&4G^EL^/c@o|&sc?_/lo^^eA>Ezfi~HX/௟ݮh"kh㔠ވK(nH}CwiiViqV 6o:5,U#P]3\GYwenYC4b)cHDV +~3z~huJf8-) PG8b;3@z9jyNn'E2 ֬Z]DzmeXP*ly;͎rE[4fLњZ)3Fhh4fLњZ)3Fhh4fLњZ)3FhjΣK'5h]"xÀT8W#>֪-[}m i3Kbt+` ]UxgOH@=F`ڨpj:Ncei,q jں^ZxeA%cp[WI~yhϐ)+89T4\v/)4MwH,$9)0pAGҴVwz_[kTN4Q T'Fie,tY4K/ T, |`m9ǥO Xhzh8cv53E桭=G "5I3@.t;Bqk| 6ӑpq׳λӵ(,Ւhd@"2de<2jhIЮe<isY,!gJ R@GrIIteiFmd޴e1Gs٣4\, 0z yql_XQ<ȱMѬɑz}Wv ՜њC/i.#}xjUլ|=gk^6sk74f /G$_ҹњ.:30qI^Cv,fh-y/ _7 zkioZ8ku͌ ~hA>Ezey`陧K!`8FKvwNKEW(ˢD̫p\dLoE6Sیc+]WOК'agyl;V7<qmckϋg?ng۷oc:~%ҮI[[YoYBy d6Hzg,1]>^wc |9}MXU֣2i o4eN2x9Wmckϋg?ng۷ocoxY{i.ejRYTK?yD!pՏmxk+iw]Ɵw[{usr NAISjOšEgWc _aGmX>YIJ>45+彂[]vg`Ţs9.3u+{X5x/<ϰ^/vrY Xp 껀$dWK^y]_OEZۿӌ^m?-Ux\y3Fhњ(4f (3Fhњ(4f (3Fhњ(4f (3Fhњ(4f (3Fhњ(4f O[@oג~ҿ3pf3{Ge}z?? -O0xB|6pw|Q?4O\_FKdxXC*h$o txw;J!"*1ݒ vxC{[xɮg4˳#G/B<мIዝE}&eII@E T9 -IX5zԯ_QI'v[Id5LrTRtH-/vSƤZcmA W# Ut"׾|c@b̨ZIV< w~kϟϕmM.jz׳gg35 KxJ [O4^Rfʫ0ޫFj-?sjiXV[Y{Y-*;U,~LkgY@[{-Y@{lXrrxO<3E Ћ{>WrnyFÌGnjK WPO ׳Ƃ ݠņT3 껔3Y~c? ˧ivi5,60 Kr稵iZbӠUy{{h%O O,1Cu$1ip~D,ÌxWb(`X<Әz( g#,}3T%z2)|Ѥ 0 0;Wb: [vf}aa}jEK ].sb?,hΣ/4,෎-LDUSƃ,ޟklw4xmӚqwrc΅6Ʃrq Þ0n7:.Xư3[Ok $Q=Zi~W:[Ƌ:GlUMl 根嘇MOu}Qn|u7Kw9i \ L6\>j?jusiGq]" 01ȬsjD_k/+@I9TH7@Ћ3;<6>)F2|23GðC=iz 9\[\Lem*J7zD0Z65啾mi r73?V. y#~ [X/toKKΙ%<9e?drPOEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^KI^^KI]㯟\g_F`U/?[ץS?%__?͞uk>"мiq֚͠},"80_3O1 b 8Ʀ[ Zii5S1C$Hwm|;Aas͛5N[ KsiI*h$ 9UYU Ơ&xYA1s׌qg%ONW4;{$.X[j w_(Q&}N.ItL}xoP;ql;,$ igfx M۟/>HI`/%ԼE⛝NSӵ=F'6p{Z[6P]$R`9;_} $Zp]̘6&9fBJo#}ǓgzS{/bO9mc_7V~;f[foi$J(DsFQN9'3]"_%Cơ. "B$o/c8߂GL( @hF:Ҿ߰}wmۏ>fs+7?}i&-L,Cb3F?yp-?:}UŞ&:a@Njあ6֮t|m5 0B O NbtG]5Irhg!yl+[m4wwUIU#<ѣ0?L԰gxgOk6}.m%8䑏U]VViq[i [SC)eٶ b%&YM4M&4RX,Ivt<;6Նa3^]NoŷxH4{B}8Y>o7,yEť#aIbF3`LsW&[-[Tnog 8\iF˷qwcKgC4F%jvDbY7oBMǂHo+MUE[FYR9?zqTcҼXku~jmu[ic?'9'4Cc+Cc nm RDQ$#em<@*k~/thZ&iZyOuH 'v~75 ^m3L] }z960(C9øcރ5h=q=Em=!tG*nf9hqAa4i6c A&HձfxMOS.%xIϖەNpq+h,೵b5(ע*>PQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE俴-5U俴-5ـ:L4h| lo^^k'A>EzU<_/ QEuQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@y/' o7 zy/' o7 v`?9q//?[ץW lo^O0xB|6QHt+.i0,"7׀x絯MZXcd/RwbN#p&IdKL h3ck_F~yp-Ă"R3x[U$<[;BUY7rGS.R&۽0V 'u=hǺֿ5Gfy:_wI6لlc8`A°/x=wĚ e-{bV0<5u_o&{k}\nJ5|=AcOTR:r&V,+SB3U:ޘڌF}yҰWLH+yLT?|/={Zmok/nW-#^Kt 50,|N EX(hZ_K-"mkrq/<{2mTg{Zmu=k|u{_ZwKyΙ7w 7$D Z@~jH<j~m{}Ev̓K4rI&_@pck_?絩N|AsZvm䲺I[Д$Z;udu*J=Iio-( X($7DIV|秉a9A:˶q>6IֺH9(I_tC?絯M_o&W5]JG,ve!䀹?ZM&R\{Cvi絯Myfiyav,y-E.W0CzשxGYOxWJ#[8vwzVTQqi{ӺN߰_o&{k}\%o66Ŝ:lvREo;BFe2osU(+`?Fc> Ək4z܋?-i6J7BRذFz_={Zm+aVi׆#ƹ.oȷmjy^X[HOϸ<7:?W~ϻُ/4ck_?絯Mf^$5bqi fq)dr!ٍb2g~5OU|em9>!AqӚ[I.bf??xck_?絯Ms_ks?uoA[{[l32ms!Tr7'W7|Zi{yk.%,Bprz O{k}G=^(>ũj2G= # r[wM:UYJ:,7!0+"Kn7axǺֿ4ck_7u_vWZ,ng5DDwf 0[:/3E+k[{~X8El ).:{k}G=M_ ]/LQd-kAZMq泼1R6ұtuĶ^^I +LHkTImĦ.W n9'Ǻֿ4ck_Sx. S5ޣm.XYmIU#˞&6d't2MGQԵIi5ǚJۏJǺֿ4ck_ ŧGWWJӿLM1.b:y}3Eآ/孝7ǭ\J6sRr1\>*F?)$Ǻֿ5^{DY$1r1 ^hWwako3젔݁tx4?ɯ%m\fZ%m\fᮼg63/COe}z_? -ҩ~HX/௟†hGBJXdVh"He\0A~UfeQz0kt۹|ۛ(e2P?6<ĞFB/Ƅ#zaEoΟ }M~H'޶d18F /G_4?6m^﹕:1Il-E6Iզ,˨?6HQz:I`i{Sy{x^5]N Em՟kcBv''z?6fjOjjZ>?eF_]݅6Xn*;_SV5iaM0ar;W-3 h ,MOZEy QǗbq :ᵎjֺjfg2A‹YU< v< M@G_4xwNuYo#h<>OXp۴Q`/֛Z| *] -[{_5~$K3s@G_4 _sjڎ_Qu{~ q'mY N;( 6#70_^][^PFڊQy 緖EI.#pl> "ƁBݭF+RT=f:^ɯ+]wZc%$(ks(V8:WE@G_5*.hեx[J$).VI'b`G3_Vs\o#/m?o|nNp)wx[0xwTO_xw^ZL6?f ΅)ff$G_4?6,3Ko ̇Kͷ7$?(VRAX5χΌW}F ,]1s!h ,# EmG#/m<#:Mś\o,l o4O$2K$iV-͐r1i6myjw8v+"aSy'`w h 'u[Tm?M]0om;nU/y9&G_4?6 K˨/5y^A"E B̧+$,բk4Yq*@'vB(cXz*D%Nѐ"h.6 0[@G_4A;y^Ssygoi"B:1;8O4zQZ;[K)iZVHFng#/m?o|lj|;=zYoMQބHIO*`SЭJx-.S 2MY9DOCa?6i~W *Asdb,]ԉQNqɨ- Ck%#iZ)y$[94o|@4o-3u" x#@b#31c 80 ӮPnn5(4DZ%vʑ.<SEmG#/m׾Z/j:7s\]"}U`͐A]<_o[jr 8d &"9#1ɐs,F23@G_4[L5,Əi_iϼU xl5;DCD%-) 802O)(7m͟O8"Z8np ڣƏi_k#k#↉꺍Əi_kn5vOx5Mi-l.<#cq4:e)<pwvZOi|-Ov.9Y w?>ќzg4ȯ4}O_^zu]Ehwݼھt '< Գ!9kFkG ZLjWS[py=ŲJ]cUW-^=W>ϯE/־Ok=BX6^Ф&e>lVQ«tV`|?kh:~i~kǑ0đoPvaq@#xc141| ='(@gWJlhb&w=ywkhח@En3*pIz٤I:n]LGNH5xcvzω4O wA*j!M܋P3@rx3_%^9uy'ċѼ; pElh{4ȯ4?Oa[啉"wkx ]J'c1m+X5vj0~D'&92GrA?_mVygrya7Ē9!xF5ixt/O_\Q ^Xܢ ] ʇ K ާW~Ҟ(.o|;l̲"o'{, 1:'es EV=^~ U.'Q]$ҶA 32 =kWOكJﯵ?]m6R[ɆDPI%u.N~R9_ũ]x#^ٗRM̩&cE\E%Jn ^DV-ZJ4FqpJi}O_^gj~ϯEW3uϲ\]kZZsɝ=,.$` ݭ߉:׈,t`\Y+)Xe2)RI€xb`" ?}+y5hH[+;ʻX ,iV|)b&]i&Դu.ʠ"e|G 2X#袁$@=c>%r?sjfOj!4P"+UCᕦvgēEsJ>-ݬoG@ ;񊚊/?.sPm-][US^2:h:/U&(qbOBN8IzERrwl?&_]/?.(L??&_]P 2X#tQ@$@=cnukL-:uŤզ{Ss5+i?[8k֫i?[8ku͌ ~ht\O_IXT(*1`O 9:?{o;E 84=?{M>v^Ͻ?^Η!f{o;G/iEΗ ?{M>v^Ͻ?=/AS}{o;E{:_ȃ07#?{M>v(t=Oa oG}Q"zmh7#(D?/i oGQG93^Ͻ?mhgKsf{o;G/iEΗ ?{M>v^Ͻ?=/AS}{o;E{:_ȃ07#?{M>v(t=Oa oG}Q"zmh7#(D?/i oGQG93^Ͻ?mhgKsf{o;G/iEΗ ?{M>v^Ͻ?=/AS}{o;E{:_ȃ07#?{M>v(t=Oa oG}Q"zmh7#(D?/i oGQG93^Ͻ?mhgKsf{o;G/iEΗ ?{M>v^Ͻ?=/AS}{o;E{:_ȃ07#of qG@, >҅?z1IOݔnetemul-1.0/doc/ru/img/net.jpeg0000644000175000017500000013667711254745330015533 0ustar frostfrostPNG  IHDRDsBIT|dtEXtSoftwaregnome-screenshot> IDATxwUSoۻ}77RP!"Ak/W^AEQ,EQQD@ :!Pғwwor1wov&$[|?ܙ9<3sy!55GZ 07\.\ߟz% y9#uַǭןg>y/_ɧ?Yz{{hE ]w?K[Nvog?\'_R}]@K>E.Z'0e6>D<(aH5V}Ò^̹KJ2͘ca3L9cZaPS7KqN!O.=kt6;y;c8Nx?yx,_4'w;nH!+tO? ;صMY.>lR\|e|}7f$h.s`:E_cNdAR;_\p9sg^Kϱ'aɊx?@oo߈|3hk׭ǟ4}?0g]va{0}N_:/;t{^q3.o7i?1>?CF0 -{>u :}ًhim+}w{1 ?ua3\Ϗ]io?p&RjmmϷqoc&-̚58l>֟q:sf~Ìilj?5|>Q nd C2H)y˛W}EKWXX5oF~Y7lydRrsˍpoD9\ N!OMG7 SD#qguϰG9̞Eî-edzk+O: 4imŶ7q̉wv Һ \w̙;͏>}">?^_~q> \ң-F;ÏTp=yoή.fϞ58̘19g?Ш~˹ORHu]l:|-oǭ⨣OSU\Ǜ{aT(ؑ ], uK3i^ Mұ ,}=[ Ӳ4s.@i;#DcI.\:ZNO_/uufO^6s_KTUUb'aSO{JeE:%s_{>SLxϽvuu@p/70^}-o{.+.o{{;y򩧹H$$e\qx465{;ͷB= 4Wv;!!!!!!!/?h͛;4xÅmA:asp|L&~7x3|K.]wƽw'/Ln6N){nD};r_) r ;PJO=Myӽ<}hlMbMmu =ܦ MxuYn=,ۢ`!\#ή/K4{2aם߱FضƬ_Uqy1~O_8=<\+9aiwZ.x{x-rE$)g*WJx}>/as2q0d>u!~ዤR)֜xd'~\/xSukn$|~u4X2sns&($EE umpķ~!SOsk_32f2E "ݝmN$GD AyUM)4"m#BxH'+n"^$HiW0 Q[?ys˓4|G3k g̙[YQ2M7RQ&sccYY{w_9/\e>zE\KO6uikkg8C>Mo[_ǹ}{Ķϧã]W_8Mo,Ӌ.ݯotH/Q__8tuw~ḾGn|G.$Ko}Aa33 _*S皟\>E:4 %W;r-HOO/ֽbJug̟wH2z'Lh72W|ߣqصk7W^-n/,ZkVK@wOYIg2;}Qj뷿;v7&^^ б#6I?5_`>k׬K/+IwkɆƕ<E߃9bYx+r\t&×:N>9 e҄8{̊#-FHHHHHH7:CBBBBBBBBBB^!s!!!!!!!!!!!/[ yeCBBBBBBBBBBB]1[wiBBBBBBBBBBBB:($$$$$$$$$$e~ 9R~Rf;9R ôFB[/$$$$$$$$$$0ۚٺz;&G1`5,YEKWďH!!!!!!!!!!!/rCMbr 'QUxqxb4M0cf:g9"B-ζ.XIEE0ɔ`q[V 9(eߣd ˎ0MkduQzڏ!!!!!!!!!!!/LuXn]u010Ar͠*p2EH:ZsK=Lf}m=y1̸)|m/!!!ce]|Y29f3r9|CJnĢ1ʓTD%\etf\6Cv$J"ztV(u\e8J\^lapi}+2cxPt.unPֻofUR|943tfMQR)R@<{H!XdsM|YWE)5lRR($j ֡RH)~QW:De+7!J'$)%a:b͔;+(ڄE}2ViV_M.J)\!_( 0 h4F,qf2&D"Auǘ9}}}tv0 !AI/J*d/^RTUװh"'M#RJ"I&+>%R)r}==4كf̞9 O$LṤi\Ŷl8hH4`Z~5ʋ yq`PJ}Io^sDI]5!СJi: :z4?l!CCẂFOI̝Ry)(]J?i6R M?>ϟg֑w^C8C.spyIȥ￀9/AmY"<9HC { }t+M 4zy9BKuU%q/[y| ION[PdE֓:uRQS[e+.ZAKKe0t KjkH B~]]]tw1k<Ν ])SO? L'H9d5hH$9dh"  s,UQOΞ~ɓ]}tN꒣ZP򙕇->AMbˆsxe6is̟ڂԒ(>xċtd{'hL3rr$˦0wjݑMTdg?Gk5LHC?'\Sg~g(C/ǯ;']@ ] "&,abL O!3HFDQǙt979<ۑG>JxhJ`jPX[X蚉DS%}GuL򖎩 SE"O, yX_J* >YmDL CC(?bṊi;Xh ky`OLl6ìJ^r1{mgt0#}[F@T3b+X1~⅚EΤimn&:JB=d0w&ʒe,_fxGWg'SLS{J)yimJ!'Ohɤyf˳q5 i& -lۢ,Q'JB\t3Y<--MmijB:Sanr<ѨkDHRYQQPH%quOPr y6>| VJJz:عkǬXAum d}3ZZۨͣi& _ԑM!GT; }=+ѺAtYze}.Bvy PkTYؚdr:}.N|S=2\;8'cƄ8VuB)EKK3=ݥ{Y5,2- M×LC!l9nqƋO磽WM**+O{G;%!@B_owy;N :;;l2MôL4޵s\u\7aaklB1G/,TyRE/DC7M*+*<\`3U1 c"ߐ2&pcIB{}6vҮ&):>~'`eۑ᫿kc3VbN@e`TJb~s;x+Ls(p oh̎Ɓ/}35rO.$#U4$Hkt !<(yA 9i ,a"LH: j(lCa04BSM)@CBx9PuSd/\~qQݷO)X6hf~'@*]}q yP0 mG,2\_U|mo׹+~LݩiT5f$Lz0 Gѱg]KLۃO9Dl./z&! {v3NDm( LΙIww/Eo;wl'Ǻu|AC&a/co|_ }X!Sq;,?EgGi`&xX,LZ L4MGiBP]9)$/!n3ϤlB/{F ݠD L*$JE,;Mv2}?zJ5,N ፬^zBKuMupΊFcD$JI<CE# r4Cq7ƘrS8A v]258,;lN.y1[>H)GPfЁ.B8zZ" 3= 4A@>"iOUTP FBP?G.)@}̦RD ` AZb՟R' IDATTiX/g?IH3Y И[eS {>QTj#^{eB)c./ƋR={v.CH$Dl!(lvĦ wvP֎)_dgN'E'Kp`b',jX8cƌR-]K麎6|ݰvaǡd3cuZ,۲FcS ۴|!jg#:OE _8KPP.l׿ eҌ}t bD"#Jt )u"2mw]-0.Vt=N:m4{+u6#}PG&߀}HE yۗm}}HR09q);!2svǵ"IHY'} ฺݜs~R b(jb&Q[0ul#H \O) zS`˰"k{rJ*jRaCҰ 65lCCG)))pL&GO_~ yBr\z/HLxZ'^mOo3٫))E^+UWD^ aOOЖFs_- H'3[8z+Ϟ@9>FoB<rȋC> 'G7Oq8m|4NHd`Lh45)++C4*ʓ̘6r|ߧT~k׎[F󨬪",DY4=hF$b#u\ `p sG33JGQRkϞQc)bɒE,Yݻ^21 ;e[dry,BӠ;jc&]]_+҃i2\1d.0}+z^BJR}}l߶.|)>Cw 8Cyy>|_PWWC{[!UPnP(֖\GIihx 0 4]#Ff%̙5hI29 Ⱥל6(f((KP9v#1+VsU[އirm3_G+}6ho9=9%@ݫ!2TwRWUϜ & l|q{GOi#RuWG[fQc1!C%-zTG4j&eGu\s@W&g.}d%B!KVbe9lC3:jPӉYq("H |] *:.K_ ry)5Sg2K݂/yQr[/Z`%#Qlc)֯qz}Fi- 4M|CwDq3ª,ş=qM$bqg{}n blCci}2KPyzn㸈g"|7X,L }?y?91=[T&!Idts]9h2Gk9)z4:Lޞ WVV`R("IKv2u,cYA4u]zzz * >,seƌcֱsA<,#/e*I ˠĶl6VxNN<;mj)}׿&M]uVhmۘA$C2XFFDuPh252pY;!A+vSb&UXz ;an㭑O%r2k{?,Dx~;A"_6<)G/%w=?vJym͠=(:V'ϱ`wL[7}N.<{7&/ m8[ ҈Eub%|L]/@u N_uS~L$̵eYض`E&My nZewi}- tN{gL)P; 9)J!.ak TLџd044:B\AWበ )4lC'j|*MR P) fSg_L"3)ytmv*mFv2%X&0ߵFSSyiPL1ИWҊ!d>gu$1K CypD{?s,@7:D]EGX%Κr=MБJq%|7Mn֖dJaf0/$rdW@ jG(4M\e)h >R ^Y: G5 ií˶RnqAjG|ןDb_@r%]s*S _(XCE-_gIsSd&FbM65X4kFi U# luf  y$kAiئjfc&ma[XukB0!OnqD\m۶LxB,Ӥ)rlƶ-,+F"XeZSPL[ɼC{(d429rlAG(IK#/A;tH  $dOwqO~7lA_76HF܅)ѝm ]ՖzZf~ާϷWsƼaG8ٽ7?r &A#zhjX&&>чNБ8vџsR\H.ivޑv(3usDvPjV6w A.7tJOQ222kAjS)N ~bRmcHdqs у&M׉Gtp:!$r!<\GSI ~;+ В/!͑fg)7Zh쮤ݼz8;%h51_!D(:GB2jQ_-d<&xܛ {y-=n<6t}Y][TYT%ݎ<Í*t6Pq 9}t{~k:&DE覎Zd2dY3SUUc n6er1b̦/EGG|~- ξh$󨩩{f?n7kX?ݟ#Lb<3XheR,_4 (R8s&C)3o<{OFm Uŗ;Boo/e$hΎN~d%}X57xۙ`y)|_`QGF.L2n6u }) E=<)8ds9\PMTE,LTʪWfw׬g޼TUWN&A*a,l Db1˓R)LӤTMϳ iӦ0I#d~bi`o_QS?ȪD1'`>8 G3O;yۛf_@s.2Cw^ʏ7NaBVOK:HY zXP J1ڳl۳X чȦ[*n6>O} :Ŵm$:)KhKb_>\둒1t8BPpy/B*[ y]w(cvch,, IW#x#yO205h,!^`o'f߷q?8t=[Px+ n[8 ǃ -2Wpt'nR\z^OCFQ .b/^# w2 1yARb>O<$Uq*++RG!_!%{vA)9V̖ed25lFJa8N>N8xlirug*zZLӤj͝˶minizAʓc4*ک zPL+zbE6IY2$P!&2, ypwX*?x:8E7H]zLl6[2>266ՅB!|ޞ^{?N]m5]H3{LЋzC4M̢P(JӍ53oh쏹_/܎#3O]5nͺ b~'>PA zYWDY7g?{R(ƣ9ECǞBȷk<h Uk@fu:˗1\OFI7t 4M'bDvhP900@:&0{,TsF>By}44e 5k6uU$I\tm_I,g:n?m4^~=eKB4]G*0줼0h렲_X:$9sO> Dn)p J{>d289O]f͞AGw .ϣ?z[~YWٶu;o"6??s8 f}fk '7ų톚qQ۠ٗ'|<{0M@?Wu,+HFNP)'/녠(eA b0ˌOIJe+U>t| wnW~40,S=q]2555ȘY5`(3 ($wE&֚s}8ݮ}oqK8--4KР "Ξ% CJ"u*wrT2I6%""2s9H&L&C\&[[[8sEW端z;Bef'OFKυT5 \X5P(UW&RV"3gyfӪPJ㺎)ȑHUR4iF>yɧ²BS1Y*M'!4])!.+ZWs/Lji͑#Gyhllq+" y{0 gÆu3idm|vY?M 4H&@4٤J"ٜ5hx>`V,Rm͜'o6Sr5t$˗E\ܴH0FL GF+U^]"eF >r푁It<\C梀)}!psxP)M4SGWVHS:y:(Ɓlk |@< WI))/.pdFL&IS C2Ir!Jy'ZCX&[eS'Oqb:=lڸƦU׭`h}lDGԅ\wqx\Ig°ZMά„馽}%O<(ev+6<4:O :mozw幎 4 ub@{G;AHJz^ B::~sش:N8I*J_q $.ԅ8M/J{M055Ŋ5YZVL& տQ"" qKެt\(J#@ ƒ(d M<@e?7yj^;JX."Ė?"4U)"M}JVKpg縕@AD㝜='<9h*g=軑|FEH7uWIK>/-N>񰞟 ~OęMl9CjW쥱R+oqe #m:lG ޘ^BS]IVAiўӊlZ("\6 N5ljR#ܸB 'KV"ysMO=OÌ6dM%6eG2w9q̾v3?w@(/%<Ûa>P,'50jI!P=ӒPKDIyJgJ0T (rh> (erEHWQ&lQF9IHޤkR. [~YeёI i-&ZEAq㽚FD2 Qȉ O[G$grZ+Xj2rIz>8 Ӧ Lg;k,.|d2Fɤ ^؉stw^u0TNXűcelԢ3&R~"$ #&'s476N%"/h֭ߏP_[6s#LNNH$ϷoL*yWYz5:rh*{*! l(M&^kCbfժ;F[[^9eyŗ~DJIjjR As@jeDHgҌE6I|q%=~E{EI/?=5}>c8~T, Drbh))`$LB )(g!C(f}H}DJȸ\8'f0_fgۼ0d*}l|CޞC[r뿜 U9-Ї϶!q uviu=_3dZ2:^(BT(;\J(\!.ؤ҄MR0}tʑ(RI(R2~4}-u I8$01zG &C dbbLXX,Q I|( hͅ+j)d4]ܸ*PWWOcc#tD2Q PLCLB" ʤWsn<׭V[F )m.O*6SC"|j255$Ih#P>@iH>7!(/9Bs 19@R6t?q=s&`FamwTY40 Muko=ѣ9p (6^7]IIo_ߢ͙%SRL>rxJp$zOMcPxܷ#|kπW'>Y~uqڜh?BDCmpѼEMfySvC(6hL6zg\]b@o6|c7{ÅZz;3ʥ)TБ&L2>#LR*GLKN.BZv[< ̩PP*aҗ#ISU%]@kt C򥀩BT_ }oțTOY͛<2E:R$\Hz\<̛"A ZW?8{Sc܉-x7b蘊.Ǭ@)*U*g|qr,LS|!39๱7[:'Sx2۠f;hr]|ʥZD2h[ƠTl+ LNV3(پלvѕ= L: MKQ/jsREƩH3.XUwnW~tm d:e q)00'"eJ51)zPJ100o#7P,Ž]d gɄo^sMMU1贮,+^t¬;45N|oapp-7-`&H$sJ%Xr% RtT*ul]]-m|ASxM g*%T((xR1 ^tS2>1U͚T(03 r`RЅ Vfpp(X͙3XFFƙ8{7lСEtVZ1/fq] twuRWWGTgu.sCk/| Jf|&\iN7JN$DHY 9u76ũa|uP{w(Ap[{/bYq~ nclia2{ sG8>cU  de›TC$D(<Jr(hI8jjOڋS$JE|JgڵkBʫκuk3-%*ZW`NlR@H_D$PլxzOp\/]]xG>?հ87V^z1zgDZSxρbE28ν< ^?x>g]W/[Avk_| eWLڜYI2/_8 ‹_hҾ`"#וS{E/7*'&6WV$VǀUEA9(c\IRڤyJ ׄ@JR9 Z D8nJ Skzՙxir"p7^ϔ)v'OP#R`*=ql#=T6T Е;IM%[:wѫ2*qDX1)&9nP~E}+JBHOis E($a$ BaHFHw)9s%{~u31%([Eމ;! B20rB9|6 _QR] D~kn,bEf(8ExnA!cPxu(Z]ќstH5UjbbSd2(8 袸٤nV\eSWq⎽OkVq T], xEPWozI\ENPr@dᯝRj\ם3BT\ .R妨5$l[S(9jJ2%UgF(9kK{b|C|uu9a= LwrlM<RS,@ǫJ=tAlZRD_o?q3R[P(ٲyJiΞ;GTb˖q-7/xࠤb*?;;؍zOC}Hi Gim5{ccAsSEb"=~_x\Tٟ_q?f|i]/L_YRCS??}mIWa/ ^,D'ĪoȽ_#M"c&\2o_qdjzf _OG L@d#nG^>#|oIrAozHBi6/&}Re@((BGIH I(1A]]-mm5GF㟕 }nGy˦ӝf? `~6P(f4HAmLeik[R h_ |C֒/\ ˦t3Ǚ67Εok\r!#s!#<Zk%/fm͛jo*b$LnzHEW.[(dSkgGOWԚQj RtT (70n ╗]WSɦS(\ae3U.^zj5rV~W2r]L&C"sj{ncM2Ri5W 0. |ĉtv{㵯\Io_?`+q'ø Z4ǩ|/|j2j5"d&'sTH}}\hG)d.hhiifrbƅwZEI/>z Y_a Iڳ.Ft~"")Б AO!_~c +͒MܻuxnukWqۗyYlO rARz92Cўʉ%{ɚ-7Bbq_ol d 4SdC vP[gfHNW)@6D_!Rr1)T[lZ\q^>X_p.鉟=Gcbg)9}Rn!K#$)L@pbb\+vE}x:Lp+>M =IB$"#B0Vj~-DfoQsnN`U/MV5 I\|'A6KFG.nhM\!0.LU+c84\ &FGQǼйxn#?_+;@JN7\4/>q~SEő%ەmڵqD!hLT2YUYH&EFGhhuT|!W4+XQ)=G*$_(IS,Hg22{&CP4g,_":%KnwvvĿϒd"q`cc62=LT*=q罇 ɰqu8p eAH2&}̈́auoUq'ٴ:"WXn=cLLLATU=]:u '><}b}/^k )oiŕ=\|(68 Mk*\.3>>A{JDr1\o/R ZZĺ.|J\mi<=a6J1o\69l++'4y[ny0P~ O7dM(DFKθ+~\« }Ύ/x-|o[gsS쿗gZy$yml'0$_>)>U?ìٵ4;R9!Z"T\ G{hA`ժq%cSQcn!H<-q4JB)Z#dd6욦~64S'@\>br*BoS2˕?Ifr7eCg0卜C0$ BR q{㜛hc& SINx\x=Gѐ qDEΑɇ.*PsWTك3E%8T FQO|ݽkAc>8r,ETFGEUŜە]Zcc#9}"%D.7ŁCoJ%صs'284HsS3d3g[6 œ wu.h`ңI9uoHk(ɺ1֬YME^Bg IDATC)QxF\o: ~E ]]s} ?R u׵6fI3$>Nܤv:;;) )" D\u/'z;;D}~nFtfq"صk/'Lr"@L3o9JOO7_Kͪs =]9v9q]QT3_Wr675~:=V8~$==];~+V0<|ѱ16@cc}Oe\4uǬήg@g*Xs/<,0ۇφ {[ :B*.@IJ#Uқ|i>l}>g׶wr9kY97;xd_o}y_p`7ϯp'͙?yRщgS$O4Gueɞ?GCwIy´1 K $bf?PR?S[q wWZo7WIs~` nDOyc&'Rn׿׽pά$_ND?ӟJhMcm5Cjʣ;HY(% v:_Nfg[nJ]URCI r]=5=wYW]C$tݽkQm8tzSYKQM7Ք>+y?z'dGLaK/J&axh6oH>_;=NϪ.ca }y7U==\_hi{#)CCC^[_+m~ lpgy/qkk\H&IsXqq/"'H%SR |ut݆ ֚Yj44dBMLOCo!NqZB q p>ҩ$޳qS;M}}=chhY"rzX~'O!L000@TD =~3 Tt*EmUdkjp]( T*ʄ9ɤ3s 鲖˹\Te8`R/IHύ4d)0bZHTJxHhG:u_}Q "m]oőDɅ_|D _Y>m1?;O}w;/nC9tsTd%AHH)fx}p|rIDGw$8R85"+X}]2iD/}~se(#6[ǯ}a?̝n3 N ]=k_gc~癇%(01uI>)WG0YNrI-@Tcv)= AJd.dtL)7c9CՏ<[M|H12T)$:N.B"b|wL1q]v⥗_fxӧ9u:nHGJӿ)>/ kI$l@iH$" K00[^%q-^!^>>?Ͻrtuvo%۷nell^{cc?~ٴqQ.XoX"LP[EJEGH];A(s~ Iq͟8)pկSzr P2DI !9 PW:74k쭵9ᑟCʶh)c=L9팗32M]̞~c __s|Wwҳ32K1GB$S( B$* D "dΥO~%cƥqPmaj raq0g>3⮵ox h_ϱiEoNĿ7;$g3ol<>[Kw+CEoE[ٞ>[!H"#*tQC B*D 04Мi;ݳv%7/TM=|[Oqtb YȴOٰn W>[o\-b9mǮ7믿+?^f)ikm?QT5+sIg5nȩ㦢:88 \?ٳg) qθ\~\-Lfnض-xfLVe*w9ExZVSx8[mJ ##L&q:=}--475^\kȭA!76JJe;u5w^RZDRhj}t771(834yrSh%iұuWj /{f͹h$7X*&P__Gss|2^9~C8G2 Q9s0RMyed2I(L3Qɉ Rqڙ\E E]UH%\vPmz9;]B]K*sWRjaצUڴԓ??(S4fhomaMg뢼ѾtzjksB cjv骣y9mMp߫ ,2qȦԦ=ڛ[m;ɖ%ѥfZ3gA6s~r{mWsj>5i)y˺Vu,]Ne9m9CSc#M l.:lDT xл;#".w꡵f (_z<YeYeYO'9u%"YeYeYbb7 l@dYeYeYʁW&71?c=&8qxE縿eYeYeY{V[*ܸAk{~77Xs#LR)bbx纸m i_Sʃhߕ -:;;< ;cyX^<;cy0Ɔ{u<;佡¢X^<㩧's=}տ_ ?;cyX^<& ,u}L|qxw{(eYe]Dew}u]| _xrY_p'|rjeYeY.[v۲G}= xX-˲,Zb"˲޳/J:_eeYeY>Y裏eYeYqveY[K H2ZRe**bR@X\#]7_1s=eYe-#vȲG}xGvJ()q;~9ޙ!)QjnMbz؈$s$.8)nMw(9tm`4ݦA``TnX尶7 ll-l2)Q̝{y~)ږLZ#;<ps/| W+*ۇpϡ6ε!V Ј;vq*etgK3()R\D$ixH-رcoхq:xU;VknFuaPFuŨ(ú&Pٔaj)9QJ^`$2InغɱcW7Dϟ'X*Vj5A`9S䜘-c^x[6G_#H"I3[+ЮB!s`5AU80lX")U䔹 /ĥؙNyq׮;wI$_"Iѧ/FCV Z6 ՠc*qseνxdBj[RLC$I- z%M úJCSP fe䜉9ryg^cbL9y6u$Iw$ίcT G!\mB)gr*[+WR"DIN$i3INq*UB3Qfͼxi9͆42# $IS$Nf@34Cf0ϛU= uCkޟKLv"I=I@ !`8F]@PM uB (W5TC$IҾg +G GF75VPSOL&Sv&]Hz< [g:#9FJI$J)\@s X BL 1g\H1;)v[}@$wr i ̸ IDAT|Pra )gڔDF1SyB.ٮ $g"Is!.b`TR:tD&bm"|mJ $IҾe9I6 mJ]0J21%T.Ѵ|ҀI\}No{H@$W t#BJJ9eNRώC!\3Ti"qwgz w J2I$N(0K\5W(fmdg2kYq.f&JJ.sl9I5I6fR+Ɍ42k[m$o|54oݘU}@$f1s!,@MYl-mls\yP"H5D$sN;}&1RF JmP˔4tAfm0ՖX'bMf$tucVI9^*@N2 \PsapcXB$f43Kf٦ $k"I0&Pt/2%0aPOYm"0C&D ǙIK/IzHR/`XPJ&LB͉YJ(PT!Y[)zwH@$w|#ahJiЦ\PJ C81? IS$N[9o_%%wJ;m"B[kTB,0k _bZp%$2IP"+L!R*Xȱ3rvo-x'5q7~aqEH=c /0T%JEʁT)u!FH !,pi\_[t%$i$JE;im qZhg,DU@Ulo7lM")$I ^)bWH1ۚv6%v)iVNit!hNqL"m </ IG Dz%@*#bδiHL6 H)cM]q=Y<1cЂ$I{@$i_:v'O7h<$ir"I677y= I4g /p} 677=I !oSJKyeVΙSN-x4$]Ct̙EcXrrq)?N)u=Ξ}3gc89 g>>?~+^:u,X.ֱ\O>Vx!s"I >ʣ'|'G&Iv]8,O}O<L$pYgyO2we Q)eoGz={:u,><%~׼vq{x{wX6}<u,X.Ƹet3=#䜁jٜ8qNZPn:w}w}o[y&\v<$I@$ݠGy=lll,z(icc6VX.I~cm/exXg}~<~"9'H40amPqpTqJÝGq`ĝGyp#Wxӡ58W8|pCk+ p8)9?[Q,I2ڰax}Nܼf /}<%'BFMj5b@CM(e$.(|׻yykk!5'p X tU(ԃ@jjPSJ)RrC*R0#l´$J.Wo?Bzq"uĉ{58LCfmwYpk 802hjFÆahPB)/}() M80DsooRVn[icu yw8682Jau8`u4`AJS3hBi@?Jɉ,IҲ]W^ SȉA( JUC&Tumɐ9G(/S$]Ӱu)XJ !SQ]!()&U"m,)f1ʹ @9qۡC| EIsy~Hwשkݻ~EӰquy}pm\rhڐ;j>2 Z;Lwv4)Eo45r!w 9pW~`F9ҭ:ƝV5[?t5VRw&lloN&TU vCC$cǎFw1NX/3*sjm. ¨UPrbX [\b62Lm>8 ;9v뛰?q]|O;VuU) ꚦ:t*@)C1"P45)Yx˗3ǘMv9y>~{YB^<m:yb~uJS+cN̻aS"Ɩ3Co]vױο}<fIR  *\Bʙ6nDDLګ\R"9'|~+{WВx_} \)=vTЦB]U݅xή@KqDlcwlR&<}w}6S()Õs⼏,$H 2\Յ#MiDJ4_4I}k|Ungsr!V:ALC&ܫ-Яع{`w1nQY.ܵ~};ɢIR m.ڔhBŬCѦ,v\p 9nVJNg7o~ >=j|Bs+BKau)T~u~/ {e/\ҕr6e,$Hz@_y1)EU^<4&67~AN?_\YR]mz+J!R̨*S5DMiSWly#>؟G~4_m#)W;}<fIR`)YL nP6i"qwgz w ƿm?{U<'yOpPyoRJ3oRBUnOP+{x^|K_~gȩؿ{R =TJWCo"&f[ռY)0k#;YZ~ψs߸ta[kTn'o-T\wy+k%_ > [',fYM+¹F@;LI3tӷ Z8E2I77m̤A!nOɌ42k[m$o\Ɠ'iB[4fjA)dJ.*eO!O,2%b{9b+9KPa~|_$i DM4\wg[ L;HPUR@0ou?ۖ8Ic, !kMJw)G(ʟ$ĹAE0I7=IQhg44T2%!]fYLa%։db)j53jȾn\!0a` 3RvwDݝ͘;V2Ӫr͑*Mt-I"9Mˌ*$r8BEafLau &r̤JL.uUfץ|G{>c"4:X+SRɩ6pvHf 2ɻC("&j5x.TLu06f!B"Τ[V?|v/1嵟~ۚ-;Ց9Q͏S7(#T13eDU&W.PhȰN\ʙe:bd"߷m>ؙ6\2DRjy?o|qI"yHzMYR*XhcK;eڻ=? ` e0 SB}JS!<?oy/?ɸψmWy-2IҢ7Z( )UȤRs nUm{$)R E)3 \f1~(+M ê%B4@JR Fh[#}Ƴ,S5#ޫ2C`N` bL"ViER[DliVNqVݰ5*7")ʐ!5%'JIiF 9E "-)Er;%HI`oo2XHp;W>!IZ4%ʈ3mSMRJXӶuw+{yJݬ>WRjJH9\S yJ4~r.,SrA(wkbɩ?ncvF.]p%IҢt1N؁܀'ORJرcʞx,$i2I7ĉԠE8}4lnn.z(orxH#I7`}}R ?0O^,>̩S<7cx<$Iѕ;DgΜY8u,[SNqqJ)K8~8Ǐgss4Wczٳs3|cgcc3g=߁rb:˲>>đ{_X$iGy"O\$IҮ }|kyA3Ruӿ)sMvY>Xֱ\<̗x/^yOX.ֱ\cXr΋/Xy8r$-{(>>>_9| x $Iuܳ<]y38oy;hC꺾z}RJۑdgϞ%a:3|5?~Ğ;b:u,s{:;pEaOXrZu>}ϝ{?Ǘo' _x{Lu;vy~b:u,xc2HR=#䜁.||..^M܉'!pԩ9$i$k<y{XP^!677[$I˶ے'O0] :uԾ$I}b omll쫀;ow$IZ<}ɓ8qbÐ$Ik$ݲvļښW_#ͦل4N(qJ"%(%x6;1q6|'3?ucZ__$IK;Dn9'OGĉuNZ'ɓ'r)B &pۨGp*w\n_[ai grLoP$I+!tnu8yr)v%SSk55Ո 5 rY*Sh;\d~]孭(Iw$R6779qjݯ7if)d2kcڀ#^pheрApP36 F*J|@I&W(Iw$r]W{a 91A@ppPX uȄ.8-r"pѣ|eJ~}J[JzPt4ll\mksdn={ۀ;׆Zm86C#<ڭ:Cӝ.͠DJqeJ="IcǎFr>ƉrfTeXmՅAU PRbJN @ak{[[fSD)yJ@$閳a&ǎ]?@bu84XaV"DL6f sbֶloyo}}"%$I DnY B ́A`Uamb@SWTS6/^bg:ٗ]&I$GHSX 9VX4ph bd4TBa9EƓ mI1Qr$I*H45 늺+ M]C)QC s& _x/1Q aU$_!;яQ.pmvPO  ɩpo|_I%9eN@$wR;叏ÇpmV9 pD]ꚝ6ms87R_|\6D$kN;`@ ?oTL y.R2}$IC$wz0n4<u C5%TuC5\NcP!$IHR'?]+޴BfXAMa<2LٙL8w".ls3r))R\C$IҾf +r 1C̅*b) 1eb.Ĝis!DݮP$lmI9R.yBɅa(iSbmDL PRng*H$N΅3Q]H9нm1Ҷy(͛*v$I]$N\h3)u(RĔhSaD6K&ep9R;o"I3^)t!lgicϟMiL3&mo&#~_ )n*I>9I>;BP s,vSmd6ċQ.^s5T(@$I~f ;,rUJ\YˬMLf-ogĹoJ()ͻ%]$Iל2'wژIkSl'3Ȭmu՜ӼvtcVI9ޚL΅ 6EfeڶrA#%gI9eNRH%(vMCC/SeaV[bM&6V3ӭ֍Y%I Dz9Mˌ*$r8BEafLau &r̤JL.uf*H$VØ@bҽw˔A=e4L )@gv&-1F~7> $I"IaC)\2)f 6'f)RBB Pfma>đ{_X$I$5]8,O}Vx!s"I$I¹gysg>qw u}ݟo?E#Ξ=}gK:u,X.ֱ\cXr΋/Xy8r$I$ }|kyA3RuӿRގ&;{,wu, X.ֱ\cXrb::/ܞYCtEaOXrb:u,X.ֱ\[&I$Iҍ2I$I-$I2I$I-$I2I$I-$I2I$I-$I2I$I-$I2I$I-$I2I$I-$I2I$I-$I2I$I-$I2I$I-$Iۻت<{io  : i ҊA%&h$4Ƙ8UbɚHv]\Cq$qw3VTg#Xn{EmB{|>Hos2K%D@f " Y,Ad 2K%D@f " Y,Ad 2K%D@f " Y,Ad 2K5D۷o:F9bt1G#]̑.Hs ϭ)l3ϙ\|=wE-1cW^u4O$( CZ;~IrydWZa]]]1i$s9bt1G#]̑.Gt=5'V{ #bt1G#]̑.HsK標 8Q*VkT@OOOw}W_Eooo7T@www<#qEQJ"Zn]<qQ0R6o3f̈1cĊ+bϻNQ-* /M6E{{{466=Ǐ\.We  *JZ\q˖-&QT*'$ذaC̝;7[nqƉ DPAR) B㥗^ DCCCx1vXQTA*g*Q.xgcK,1cƈ DPAR)$9sĚ5knb .FQTR)JRϟO=T,[,6l@oֹ~K,ÇҥK駟+2Ţ+EH@T|>---sС馛bݺu1}D#w*PWWWtvv7K.իWǝwvZ(xU$F,TPT/"/^ ƭ=P$Ig\]]]U{5M>XhQDsssZ*㮻gy&r455㣱1y&]믿>f̘˗/+VĪU|رcGl۶-DP!\.ΝwqG\|1{hmm<5nR3k|<1 O?ؼys;x*4[T@}}}}ݑ$IŁŚ5kbƍquEGGG;ʫAP(bܸqGjX9sD[[[DD;֝*H@ NJb*7U2K%D@f " Y,Ad 2K%D@f " Y,Ad 2K%D@f " YA}jcĘ#]̑.Hs9bt1ʽܚ8^ ڳ{Wtn3;{_GK"B0䯵㷝P.Gv&M2GJ#]̑.Hs9b>{?xDS3!8qb0"̑.Hs9bt1Gm "%D@f " Y,Ad 2K%D@f " Y,Ad 2KT{QמkI=W{W2\rrD|!BGі9 Y,AԔk޽{ؾ}u/u jǼy5EE._=XAԔ'x"Z[[mfsMLxlG+c+{,f̸,~CԜ(z2::: 3""r/<<89[ķ_~c֤ rba:r!TV$+z֖O7UNm-w?>cKR{-ܞݻZ'c۱wϗ{ |L8hg1eԾ D tg5kj/jG]{|l.QWĬ+?:&]]ƛolK8'>}1urS5]Re@kcߝÇW7DR_'N:&z3̻:.O)}]o9χO-ܒ*j[XlDbkOɞ/?^wT.w@-*?BP@m9&9EmXLzz{.c\.gOQ-=l=+ #vڵOD> a_I{gD@!Y/~8nXz1h6ehk#)$ ז9 \!Q2g3Έ _qmOx%z'v|/.jn$;_>|hDvc뽧5Tʄ ꫯZ2:::⦛~D~qpy3⼩?>(\.7*,U{ PwIDľ}矏y:z!ֱ?wwC_'\.WqF.|hmmF)""B>Hc(?;s+D@!-Z0-\xKҰ/$guv|鮘2'+D@2X/>}3aX 8Ky:)>a3g?ͯ&KzsurS٬Gu\D}Dbʔ:oM Ir[ٔj*",Ad 2K%D@f " [_3nǹ=w鏡`DD$\ @%P?[mrmr " lj2Լme5a(ljP2 [?$,umz\IENDB`netemul-1.0/doc/ru/img/send_dialog2.png0000644000175000017500000002350611277123237017121 0ustar frostfrostPNG  IHDR(} sBITOtEXtSoftwaregnome-screenshot> IDATxwxwvgn6PB(" ^E ("( ˅HQPAP)"H'B @ $ۧKBH#Ny쓙9sNBѿS;@yb˾#e'u #i*e+*OEwjQ)}=qT;ױ^lVjkU7jFc22/f+,ҿSA:X6 ݗgqe^ʹlqnwNe,L;g[=3;w]maY'k=_=,b ժ'UHF?`F%Hnrlzet7 :}ڭ޴]'I&L{kͺ Ϳ"*N'/Jf&N+O7aic(c=3j٤E?]1WB@e^K\) 6"tf4̦KLH0 (I]Lڤ/N}1#?7w6^Gcԍ:! {;>V|6V"]K\V)3 \ۧ?'W.y gU(㧼?kTdkW}j[.G@ɲeEY]7B{~Ί'Y_ZN]UO!Lʆ*ϔ4ުY!p:+th((B,ebwqG)^Us>Y蓜LL/b5˪JPP/ߑ2{}w zp'kם_ (眄;wmt 04hΜi!/w9XclηOXlW(цSp7 δWV^P8:7mHt1 ~co˽r줧ZK'=54ԦAd} &JgJZM`sO]$Y ruICUdw2/.IHNQ+;_=G <7S*oDa;e]# VC7Lզb5Z@Z~K3qtaOشgfSm?ܶ-Җz|7OXq}[S_xO]n(eke!-EW<1|lҾ9`2ФB0R5 t('Ӥih`%@Ii܏8A$d](7_*lb5a2/Q*άbP. mר,?YbuQ!3x+ !H?t ڄCdceWf~c̢p#gMn6}Ot( 1 _|oˤbAqO\2Ҭچ&>*@D|tg.Ήn(|Ͻ3H#/.Ay|geYEr]"4Jpl>D-2F^UeV}>h`JU4~ƒJ| ;OY} w덮6HM1`V)ٟٔ<~_ _)U5ryQ.7Yq%Y;  `Ql^nn X]Y ]] l|Af%˩tf9F555 eN^i_2Kͬ>ԩ=2Cy?o6v#aZJi4R{'*+HI,;'%=3+*W L6i5E]Ei5?S>Z$UHpOgj%m~tw5]˹W\@dBdbAQֺo~uzl:x"HcTR7Y^,g[u'=7|V`?{#R֫K>ZENt-YzVFx+઩SJOսS>0^pdDs+ޛv0xjߪi$TS:ziD53ױSU2hwr(e :?^Bk& 0,u&R h=P z8Ϥ_5N Xnm]/}/ԒIQ`22</*ZjQyCkes*IoT+lW o#YFŕ+U櫻O.2d衽Kv.٠7eWo߹ۦM(I'/]q1Lu:ARiTj)YMim$G5^jY yoIc3@?Dd au (sQ0DdBtz?]1"B@0wF.-dUf#kbJPhtYedET^-vl,9`Kp~d)9 DPz S u/՗ R)ʝiuP]gTf7Wz}oL*JO=) r?^GǝrXܫJ+Xߕgcˏܭvg3 Tn':&4(9EuyD衿f _9bK~ǎk0!jb"¨ !\!1%Խ+\@N`⾾mR+3'^KG2 Ba Ce*(P!D !0TQB2 Ba Ce;v8qP[w~oȈKʒCfraEj!3[K)Bg Jnى(5yz|ϨqO7o#˶㫦+^2VRϪ ޶}v3Nʽ܊/}ְ UY^;',Xй-VAS츞ߜs+MnZzق26ˈOǷ4:Ϙyꗣh1[MXhXQRۛ2Kqelz;1xg'2ިTw^v8tСC;Ň/yСCv,kg.uxux٪o$7[mq3ݾs ҳN ˘I]]QsF,yuĽb⒂IsF5ӕ\|pPsJ.n lS#{Mh>Ŋbsѯ$hZ ڳ) QcG&LjdRB@sD{|u+sßʄמhS} Vj^iCJ֓k^k;<;%b ӤyΠ /8Q-kɒn~{Dek|\76oc;fMh)9dMoWnY'za]!&hwUzPilcS|76]oc%pdr(ajֿbE{oUW^ê6TMؠ>>taȦ%TӞG;= J̛|gKw3zv/_3mɬՉsϠf@*H :<=]|j|C~JbK_[֤N|by-7g,gb'3 ]@]vJuS$g6 * ά!Bm?e:=U5P[PlJ?ŏVٞU;=dW,! nN6okh9iFv]dĨFN᳤3pǼgNֱ>q}B}|X]ę>Y(p?l5k_ jUs朴WXbk9WRM sh)Z毬+>?w% WZ#j ȡ ss >O:q+aa6cGÕkCvsw]UGMykO቟ }@*9wŇgN֕9.ż/-P/F??wMz 4'|VK'ѥ嘆7YڎjT4b=ߜ>'~<9Zͫh1I[x4fEJmDCئZ&ըUn kh3=̊3>h[<e'>QF7ݡ8(*d"8,p *U*.v՗/j=PoVITN姊 4Q"ەt{aDi '5lS"t****ʏ)$w ~5ǵy.="2=VwLCt鑊(fGpx%#4+v%jL֩1DŽ P0PunYx*;~mpBّP0jx1M;-Vy|Vi<ψ|A]΂Dq2T4| b}њ3'cV/O]\l9)wR1mtԚ~;3`Qڻّ+XF:Pr*W͢1P#KcȖQ&uvzO'?S>&/.i*(icVY?.Wz;b׵T,Zc 0^ b)I,BwZTH|NK :>OלYc =$s=J"p5T(#Ok+M, K ,!)Bɲ$TyMj=Z6BEdIe/^ Qz]slh3s),pIdu^eky=WtܽOpǬzxSv4+veК^*DA~*?cYN[fV}QL߹ЕkdQN8wBy#7F* T)>Q}CD.$&F-r% {m{ZaxOCqk=u`t9my\{p/V0;uh^W#""ӬSZJq~ Û551BypOJl>YvL]qK|^±9pBtbݏ)l.K;e1[Aj$) ; ZZ!tx;od9)i, , S#m#Ǵ/9M`+67scPkM4iEN%OOvzTjP}?:@P||w m7($n`ha {O 8DAHxO:Vdn7r݅  lU9U^ʾ!-N0*r6Ts!ؒ!ɗ|4f>,Eܙ̂+#'Ӻ5ׯRQ|eU~ːQ~lwvcx<)ef/\CzWsI58qjrQsoe߾9HGUnkߴ+G5qF |$_jՀә=&'!%&?wCtdiOYAڿޖޟoԖa~T>Q=:wthCn֭>ǐ=_5[yayVp8 Ԑp(Bk8E޹nkJW&m{yNVY/B.ăʞ*o/!SnLw8v.yaXNwg DBn&.s3֟wʄX>_MUڪ n~i֊x\Gؽ5{9tR!p=!BϦ 1#__boajW!A&ɬOeomQe_$bG JdF.硣)wV\Vx ݞ$}>%''''<@!T2ǽu_?PlSB5[|F߸s]kEh"F9G^?ͱv42EQKNhiW]BDQvHB3)I4O A)Lr}c}sA[v*׹/K{baÛsZ咆)NCU,rɢDQvWڽ~__K:)3EyT+piλrʒWj3`5ﺹ*֫'4|VjoiU7f:1-r&B 2 f9˗ jͺgʶ_M2~MDIDATP] SwQ>*"̮^/K^. [}hmy}iUɒoc5BWF ұ<흼)QI!'i7~EesZ2#~!`'Ì};(fy55MdW리jt .rIiƗslPgHNb,% U)BԦ( ,G~=gr]Lje~[[`T^ZeGDgL U@%мP^R}dV𱧎)i@J%q8Ω&Gl`S{wvޞ}` tM͔+וN+s킍'r|"9$F .-:〛V`X= [}zzvՔP;u*#ʘ"6Hk?6.&y(/&8#">Rxۖ?ōmcR,L#vg\ќJ )y;T?þmP]5w:d(C\1vЊ[=ٴs>eKaEϴT2|N$88k‹WtIsBͦ:װNݶGtɇwZ~$:HͻFê_ aGǿPG*֪F*w0I^~;v |Z`; N;dpͳtrwyMpִ)+lG&k^?~[g޽zUmvG}Ωz\T(=jnZ}tIwZv^9w'*?\I=6 C\}:?eBv KWRG56i9GByJo];G;Z#}q09P "ձ])*ܕ>9-"[DժUpǺaݿc԰~u硞s^(GbÃ)S_#UYG DT{cB`w܅<UHpϿ26jNW vS(˃Pot"5J!wLLbbb<*)쎻}w !0TQB2 Ba Ce (ʿT@C7 >Bg too`2.ħ%}!˪S}W {l6}ֲ/VAi`/*Z*"toyybr=jD=T {|WvϫIENDB`netemul-1.0/doc/ru/img/main.jpeg0000644000175000017500000011135111254745330015647 0ustar frostfrostPNG  IHDRS%AsBIT|dtEXtSoftwaregnome-screenshot> IDATxw]USo;}&7RP!"A۳>DAEQ,OPE)BBIO&{ܹ!) ~3)uξgZh]m mBBBBBBBBBBB^:BBBBBBBBBBB !!!!!!!!!!! 톐*0T_(!!!!!!!!!GSACtbSL>bWz,J 'OgeG[!qS_ϩ^ϯ1s6a>}'_`` /8'OX[n[Q[So~#G%x~>INCi}vTcMӂ wC6l|Tj)SpٯO\BUUoy{8 .'D!!!!!!!Bz_\[.Ǟs^!Yt9g- ?{﹋}Cu/4~=nկ77Myt3(+grL9/иg;GSN-=j<^˽ /f1don |Gz]42l9qm%\%\%\er}~矹x M\xq=\sV> q̱'qXpq.5_v\x?Ef/X'V1i<6<āD< aHUmÒ7ً2MᏣnL>i3bZaPU3y~'N>G65k5ױu<=l{I'@<Ƚl|<}#>=Ƈ 6e7=]-sO>Lݎ9vnGGegCg3[)eW\.3ct( }7^p^v;9 u{圹u|r͹_g3~u,Zz"ǟENz?=ö O_Nfe^'zz*O_?g>wՇ9sXb=UL5g/o̵㏷ޱNKKka_A #}]hko09?|>t45ݷjO^vX ||-xψc*;t7,?X2BScO\dYg2k n7L6F]{ UAj[H&KPJ1(7yWXxE\_-o~"O>o }pˤq9js|yU-aI4G}X<۞{cOZ̹9w}<,_x ]3X~IsN>N>}Xl}qJJ+=1J)f[yxG<}&յ{CWwEo`cR|??F$H&|{?z?b28uL< j.xr\p/oK?1D#~#ؖښ&PAyzmSN暫v=XW7^P,o3u/~y^{ޛx{9l27:|zχ5{&x)%C/o}뮿, J:rWP=yo%$$$$$ߕ=̜9c۫H$ⴷs2mTf͜{<=W\e~Dbzu-t3NX1Ǟiū^7]Ò)#"ؑ} #G\g; -& 8ss{` eifs]2~ljƒ̞x?]=T=A~͗(4 >Ŧg+2N[q*.䮿}<}&Oܵ~okA]70V}o}' 皫g;RWfg:Ys+p3{iēغm;Tp_/x3O^I+=>|mdsYw쳭o {]߽C7IzC֏7ՕUtvvOss 淽kֲzZN?5XE_^ŝ*:;_q8i,=TLםϹw[[۰mSZAEAk<ēR}L_8p5 N8e5< 9ϋio  93f RQ^ƫ|%ůx{޵׫v.G뺄 F U*++O^_":m% ;sfũ'~t/xu~nan~?~Vlԇ*ر7q PbQjNWMu5o\/_s2=s _LxH4Fg{ 3azڑBPZQU DHc[ ;ek gxG$%h+1}8eTNe΂ u;^`1Z6}}~ Ϗq}W#/ \7饗}?Wʌ7:(> r8rCc!.>Kd2|o7H:r?k ^w]!!!!!!/}}'>}Tˏ9Bpo5k^q%9$zzlz_qiּ%5TyH!lg6cH ӴnBH!ߵxI)deQǏ$+ٽSZxS,\@ݝP4M~+Ԍ8ܹkg̟U+_+Ou(̶;PJnfO}?w_a%t͛U++ohiBd(o\ÏnP=Poʢ 8e\kfsi|Yq)zQ1rٯ|x<6rFÑ.!!!!!!Gspm$\ \ 2,9:mŐ=?u _x1SNիV[P7wuus_3ל~2UTUinEsNT%̞ISr[yf(ɲ -YJJAդ)TTO ,iv{1 dy%啃{2Myeg(Ix> WΝko$N3yd9,x*@~׮:<2 $<_}fQx[We6jj)S&_/rWq]fL7v5rA~UW3^u0mTo0s4CwR^^-qI'0}C@ __ez7kk:qp9~p'iqjs~u ~( ?az[0sR&%8>_KHHHHHȿZ[Îwܻͯ~׾ռ5kd/o:<>pMߗ:[o(,$$$$$倩ѱR]]Yp>UՕr$P/krKee-GHHHHh Reũ'ԓ&$$-m1BBBBBB Zkp,$$$$$$$$$$䀄J!!!!!!!!!!! 톐qXCBBBBBBBBBBB̦G[8:!$$$$$$$$$$G[>2~NTB0-%$*Ѵ& /LuvCw{-l<ݝm#(0 ʪZ-YʂˉDG[INt 4^US:c)$$$$$$$$$rhoeɲ唕a ÜH~6=(L!!!!!!!!!!aN2YeGDb5Qښ(]G[+LuX !ab/-a-$$$$$$$$$$d$UB7Hm҇=;61{/g]HDe'If=)%i(MQY]M49ڢq]>R4{ؑ(xJjjj#))R@<{H!XhL|WE)5dRR($j RH)~CQW8De+~ *!J'$)%a:R{+=9Ag'QJ5 dK11$tXRC.w=`:hX,oDI2UZPRJ64 %%({PJQQYł 0F&~Dlt&[xnKRd3Yz۽Й9},$2RI2sIRm$qh)u ?nB[yAJ(K]hJ) \\6G&!s\*+ʙ1} KhMK"(2$xA.9a?^V2*ɢHƏH^Zwz H+^/QXbdV-̲ ^JMzDPP CӧS]=Ϝ'63sGs5LHCQM J.=>ö373#A vtQGW 1$i(a"hq&\΍-/吾0cfb єDI%$!qcjqFp9~%y~n6 "kF JL\Ŕ=7oe[KpoE.u-}#kNx~ pUq) -lۢ$Q'u!x.xBa |PQQ1.rS{\h5JJJE"(/++xRIu]|,| =J{[b\6vq˖QY](|G L-dčhV3< 6@&CƖ@#_;(s;0%sl¸RxRnP̌?Jsȍ$j9Le=L{j Chµ-R5$ z-?_Iޖzkզ!k-%/&c,&Mڿ>5>} JרКcW,Õ1L e] ۺppc ݙ&'X@$%(+57Iguz\|{ԵWp xkO6qq;6RF:;uY5,2- M×H~^_sr0SWMF]=Dk[+E/q@BOw͚3_Eyv:[L0-4\>R o!!\.xB Psyڳϳc6L'Rʤ1 n\CBMs<=?S TA=޹c'l5\3nBL|.q.$TuRDC7M޶r.;K2.33~B#_\39raՑWq|S-y,$ɈFE"a),M+ Gy]aLGx,JuPBNB*n~>yH,N2 P( MДDS )}0d>AFMd/ytx͟T'AN&p$Kvm@kZ4eM44סwziok4 L$EP] B!0M_*42l!@ ~!Y{ٔC`Ϟ]耡HЃJDe ێ`Y&^40IR6<+Ws Y#(DTc1T4B@l>J:񨿡al*ao^ W:T XD Uh|4]e }f4s^E;cACIa}RpXGfD5h* O>PH>i-Czeco<>ٔX $H ձ4U"G&Ōɥj&ڽ>Oc nCm4"0Ѧ$7؆'dYRi,dGEXZțu.K.b=267qn K[HYKCxU T',zLC4 ,NXʱƞ!$ kИ]aS IDATnx= ҨIo_ ^eӶ\um|<./ w"U0 C'H()BQrYMII /hm@!R(Z[?ڳO?C>OwywgrԐ6qڴil@]]׋ uum!CrCk[;룡ΤG-:4aY&eF"Ai J"x>eJ*|8.||>뺤3^^kԈ}t bD"A Jt )u"2mw]r4YCalnV%pr0GkߏiSսFo ooc4 =k~W)yգ P\֯AJNsVh /ͱkH28&;oxu'.qfCSE!nAԱ s]~[Sa~ߛtJbJJh?WCdhӴSM]w%;ے쨍ettt~ëH HgPp}0/Rö[8fQɷ?R8\Re(UqrNq(-M݃ jjhmu< ]ϣjH̚'`$(+/ QRb:f.Bð0 M׈F#ĢQ:;:Yxfq-46aݷ5 /u練E!j^Y9fh!܅:AT4 IM{؛:v*WRDw~8Me|5̚:otB2džp"+5<4*q>RGeD*nRbAiT'j= te{3@.K烸I%]VO(ږ6$1*1aM 4R#R_ׂ|ޥo~9)Uӟ f2 B}yȋRzqO&b~k301"lQLθ⣤,J=ÊiW`~,6n}%k"CXsKekX 0 Տ'a(nLM۶Y4%˨ɧ IJl6K*¶KJ☆,kCӈƢXi$/B%%2)\C)+D!}gE6T{[+m-%q,ėk:X$,M1w)+-%y^!C"D0=^l²e&hiieYr9Z[[tu ]^AضiD"14, hd0Q7>Jk^s\ס߇*<6 ZA4 4s+o|͑SkH%AcoË[E ?ӎljb;ԺBZs@9({&ph^wg>)s sO[6~Ni .9 G=[ ҈Eub%|L]/uSJO_?5~a Uj3 KmDMBA1`>oRCj 1Аij2 zF ?] B0T^ְ#?Ǖ 6_ahh4G\W`Sh6؆N I2St&>L}ǎ'I(ӶRjbhdClZJb (|!ZcNUK+{G=0B#Y:f4lҾW FόIܗt&neI0t*: mб3&Θt'#=ow=:MMB,-2`X*l;I4%͒fIxQfM4q]ɓ'iPS]#mH)xx[6j4߇ky ($Nm!s¾Tgn O$KR6KI2U8yr|39Z̼d2:lG%{gW'E4C>hΨĢQt]C5*L+HUdPVZ:p%u傎y&:`a.#1)Y J6 K5]0 S7 D,T^l ۲Ƣ8_烁'p:\%g+Nzv4Ck (]i8R*d ɚhzcPՉ:SqT-=e`\)TB|F `'?JL2JL!@G1Q R:|!\z2t П8^1R~&*Z0C,'S? @\K\eN!9=0t2N|q WIEc#:Jj8B Sא ?s+#~Pƹ9kӔ-"ɒɤɥ;)5,]zՉcWВb+c&510 >nỉ$3QJu$dԢ,ϐ{H+!;ӛY}XOϑt}ڽ[dXPEݎ<Í t3QvY}t{~k*"DE覎ZUHtNg0 1!|AC}C#3O @:! !%]1Ŋ:b̚IwO/mmmds};{ssΡa}xG}=$I1L[<}4,XeY4 ah ǥ8C.}P {zi̙;zD#ض|{;Bww7%$hvg]#h1* q~!lf !3#Ç*."P+,a]e|AdrutH4G vǨNjQ ߲Z^>$_F4 YX ?lS9!JTt}lC6aaj.ELTz Z9Hs<<q=|_)p[;LZo.0Sx-ƔR0EjMTG[Յ躅yסJ7%X7mɽ!εz:ׇtM(B!q"xG}Yn * 섞QW=x" MH`&tή.|_m|! \sAg6=ϢE 9fs~dtpv#U*0bL9s$:|L&K[{;w[42F_owV.h#eW`AP"Q_flj$p0@ Fq\ڦt:EĶ0tC7 {`EEi2Ybˢ{U*kP|.W |^(/;:!OXٳbds9 ؖe[c1(|֖6R{u&v05P_?æPVAjd"(" 2s8Lv0e7ϡyPl`űިr$OǙyC.1Rxtx$vg~eUGw,G|RA^WżvPњ)gRGffN>J& ,W9OfdSfƠ$S^jaQLFk3-)UY썷Wqm=^48_N0SK( ^CFG#t(1_e0tȫ?'QH2Dԗ/ŲlG\4% +&Kֶ6ɦSiP@QzH F䣦FPXE-,HG4Rz rϣGx~\%: ?'pqF0=.7=6;ģR!>|nQC0 vܶ q Oe$/P{O f d6"7Ĵn_GEj w xX4/~ F E:/ B<3TV)//vR \ή.޵:Za&L6C:>`[6RJ CqrDoOOR8C<g5:uJ1x<%̙3S.iRVVJUU%sffm465 qruM Qg38 ?z0V؅$%(x)衊C<ͦ!sD'pwH&*?x:E6H]zLL&S4Ғ7сB\nZLC\eΝ1st*** D4M̂ GGW'/r >FCW `1m#㕂5nAʸ b~;PA zI@0ҿfF~iQ r$#O>oAml@.f8uʌ %/?Ρ%U΢V]ofKtL]rg9z ]59%ePkq´>$Y='=r.軕7dw1Q|vIRD"fΜ0rAHU.G4=,^tܞ3f̤d2}۶8bQ{a q)k,{L"RA[{;eA[K唔$!U̚5&zY|g` E$2zA)[x߂T q}UZJ:q\fϚAO_/neiuvH>`{zλe_E"gmxf9J}}cƃ4m&Ֆֆ8d)-+$(~yva@h/:"7|X7}^GXD+ ]< NP08̃tgT۠?aOssOAՎ__k_ⲾQo{jicYPqηѕ-aiu ͹ 틹~;JQ,ggqgYܲc]3}5'~ոɻ?e\pLN(&'Ll]55%7;P&KÄ8(e&u:@N_H똚]5 J{Up+_Y+m'e0|c0'x/XU(4WF a>R!I \|\Jk`?ٙ# K0F7x^H TBa GJr$bW`d]/ȃq'Xߘ* s@y5N,ć v<3A3!f4gOnFrٻSaAb"P(ٲ%ّ;q*8&r77.D>V"zSf|*TVqFb|L 5mImFFƢYU 5|UՃ(5K}xSCހJ\cy] ApR/S*fu*KI,AP,q,\ /P_G2d*755J2HeY_5X}}47ՓθR;S,8{<*lHU: )JՑn5`tI ʫThmm+XHYR4mV>GxɧVD(`J-fy}l,ִg%1'N#mWK_~|^}ٲeL0nՙbL?ccc^,}_K||hKƫS=!A@y;շ+YyC(HP{8VUlg}ClVg,S^=]Ը)71 &-2ߑ:M055Ś5YZ֐L&WK7.9 A0b,HZ& |{!r4ů P| OC ŊgYW*# `,SJ1D1LB 9( g ](wyfx 9hAu[ 0m~燢9]8_<0^r1~=;qo ,xC8G:xO?[~cU(Kr@Xfs)2I46:q `Bmr TTf;&N_|ٖ&hUPUo~\h{Ka,lMc$4NHž~]WBRCP!ɢG (O1U,/)ʔf|6k%(=/A@.њ⮭ܖ9w"JS18~?v]\I'0xt@CmoٯѢEOFo滣2džfmm2\l&*~d?2٦ĀOlsS7ÅZ{{W6@KSd-yaC:d|2G*T(H]VO5QyMlDxJP(_q9IX`Im%0;|cP 7Uxx巿>_CcS%؅ut{=?KGj IRCtұ5AE2{?;v^Ʀ =kYToE\K4TT YR).*5Ǚ~oDTn:X?N6Z){C{y勼q2W jvQNr~oB@T LZytu/]6gLU\GK52RG)1O(JGh.20N5u1Sؾ-|tFK4gQ6$A&]|@tLT無f]OZkyCrj%2$n؎Enj*jFzɘ4U|4r=hѲ,ر}]x'9gJC]ۆ0yR.jq\Snみ0R*Ķ[ko'ʄe~V/q Rnu>kmMtL&fW݇%TdkOLm}}6Je/Zbnu=\p{hijdtl\z}N{ cuKlҏlm۶@!]Q*r˽o+E>-k3Y0s4*3"P>P1<{|М6χDk,Cg <{ĩloʪ||t몛X+;Zxs8Z. s[G8=cёu y emҋTiEC,c8JF{>e_ђr=1$a/ :\MWI;.g18h6Ek[e1vɩ)F'$_( LE:[g{.Kfy6q0~ӎ6e2f0G6魥앰p%u0!1./kAW) BF& ]96i⫀ _;0}{au#x^\lC0پ)fv&*N]ְcY^Gmcy&(QRe'=.pIpj(.O\R$VM399S,͛6NghoŋQ}xL_q,Jp랽i8rhANiin^&'&ײor'`2\n ם^qU}y#YJ%5Rl&&Q^X: )R)dd/p}C~P.gl mb?Pdg8 TuSO?;zzⴼ7Yp"e#89:˥udTٚ <'ٸqJʫttiFFǢTMҭk?0@Wg'uu ɻ Pa4cgQwTU+.-+G/Յ8ӳqkwf^|1{xgҠ4$Pxht>gp'寭yx3M];Pi?S2LCL<-WfjjllΛj9: p?ȴC+b[NyXXU֑Wuxܲ}hdBh95q](ТT(Q(BjuNUtՙxOhwOr?E?N9'J_iYqMx*>%/ĩ|zQdP`+f_c27d1GszϹ~letI14 WQ ( $PMUZ+K93ZʅSA _9>6՞dGq`:~T- |۷720rBsǻ9~1AG t< C;-q39Wtu9blr5E3 9L}<sn/mA9hQW_呑I$IFFGr'gEMi۱9xY:y3 Psֿɣ?KX-FT{a;9!ccڑm#Dz:jaz'pp;2X\[Βz@$(MFn6J$: N~P"Te[t5VBXPFeV]m9~d 6'Z~_Wha:(`MuB\+D[Q3㔘˴2T3\?R{Բ26Qeh!QaXvpzZaTQM!٣saugxh NTg>up7G}}l”~4=T1Zo; =:P|3RҬ(a"(P/2y_;pnQ75(Z-|45- _/ ClݲT*eҚ]$NsY<Ϗ0(EcCwvr)z{{ijn2f0`weE~3eLN( S"ٚ b55rSs?u~֍Hʋz&s46DkRbpzX$LDkĢ^[WK&Sp00^\'C6u=D\e2u:ؽ{z "L{]֭ҥ(W*g:6{z8T2>1A]]-mm` GFU0ܲNbmK>&+~BkY bTt/PQc"7A+y>uuY֠f|b׮&C>_ap2QJ9 k3Y5kL{:~1n׺0Na(EytȋGd䮅ڻxg0^Rx?@\TY˶όXiC{o{- &.jޛqxEOOG7셒ֽaKXe66"hHq|7$Hk4hhe!Z5hXBRvSTDAuChthHԇLYYt?f>αBn~}ɕo_?婦i8Vk{8Xe,Z +$CBWvA AMƥXHCWwL'۲tֻ.TS@W6FiFBЁxB:kF)nڲܱv.[ScpS5q–>_~_y  Aײm!kijh$I31Chvptt 5C#tuuŞݻI H$Ѿ(= |ߎ.Taikke-7h]8*Mm6TH&"_(R0U(RJ~ƘxﴌM Z`l|t*:4KPT(ۆy,a!PJP_ DSd5Le$=LR,5R)|-zNJJ׹8kR$BLMbD:蕣  B1*8s ۲#{I&̄3:6gʁ(Cc*Mmًdغ&92 (R%uܹx'>Ql{ KK%&맽}RJcQ*M5PqRǤ/##f۱ [(ˌO޾Hz{ CEK^ks%rCq˚leJs}>5m2 ՌԎq:x\XYt_;cxSq膉8| pY FK١y͟ގx|{_wr?w/gnӛKZy$yul/y?5$?I>?5lٷ2;RvtF+ei\Xc[(eR[{ػbzlW8Y:}?f4`LuQ4-$DŽX%_&ajƠ eG64Ϟx>TLN(/%fE'->moЙ:Ny+u=C8&8G;a>]ws&wќ)c[-5ȟaJY~+_~'>r?WZgFyL\ʊCTlɵzȻc49b} yUЅ!rt.%6&_%kO0P;8G)xtrWK ̅=|؝ nmXq+mmε2ݿ~fq\-˱wmVg*FE@U/u"Z~ي [%o 9gM7qH`!ΏKf[cӳDСüՠ! CCxhY~kְ 9-bhh޾3D_۶q83Λwf˲xg@%\6oH' P*yiRL&C&&J}۰~ٚl!|z{׶mY,ɤ3s5V˵;UYƪ zNFrui¨CoG*8Y8?N׌ bﮛgwg G) v,m3ޡٽ|pv|ua;l޵z'KC AWXܿ(6N|{Oygmil}xR!& )S<:{gNDZ h6.JsXƘ/СX.266QV0r b||BFƱ-d*5k֦z\l`Cz֭ĉlz LuY=ʸ3c}2q\lێ*-}{ 7D\`, ;it@QSNqp}It/*M-06[͎,d2ɦ񽀣Gy>]twJEC]]-gnΟ?056lX:<5Gg355H,"|9T:D6T1POd5xE%tX*-/^p,>6~=_ÌJUiUGRu3tj'V2)Ht p.O16iԜ]cI B-ȽhC?'ocѤTt*0h EZ(mQ W<.Mbߍ&e{-B6ahcB;jqY3=naȗ B߿N* #R3R% pય;萲``-{M6'O+.+ Au!0J*eW֔>G!_\Pf]w'+?ϝ{o^6WdR.#o7?24T]Uו Ew9(ŧc?GX{˪2p.wuoyӧ#%c|7FAѣǢ@!N] nm=ಏ,G%CԶ0NQ-ݙxטMQ(Mri)BT2h%fz Yؔ޵ mVN:EOwuuu׬PqR/mݍmEmcZA2b5kxryΝ;P656ѱ6_JLז-I$m@瞻ηKbNVNC>:>?B{΍䋕n 5|s#o p|'3ZXSV; ~.U@YM?.1.K\[ҳK1L:!,Ay!AYm&s6%~㏬X6]h0QNƯj _LOx{wٴ;{q7˿x`_ϰmeoo 7ao($|`@T93;+emoE[Nr~RrA|!  $ B@}Be)Џ.ܶ{u57.Uum=|kj{̕ RlٴW>;o]-b5mþk呑3 auY D{!Vxlڸ3V9hOE&ָ𗉋.TfaaхmY8C*"NN\)VpǍ8@c[d۷s%imm~}gllѱQ:::iin~/Up=8ܴy 7m˗ B "eG8|{b=0Lذg.^y5Fx{OqPR*kXvdams)47KéxCSS?OI355š7k S\p۷.*ki\S'ijj$&M[`[΢aɪ4ª#|>!d~Ͼ2.T E'!G+T=6Oq`- W/̯Bssߠ<Űwx0Zt1JQT7p.>(7ttl\C[6 _r؟W^;{Eoƭ5y5]"FiM]x6]\[swi0}HKgzy@ A/%R\$(2~)* %rX̊TgؖhٜRq)? ָ縥5 863ms{6,sue;9H{U\p˞o ['vqf)3 ZBm0sa) OM*1#=\۰.Ś,:װ}C''Ih;қgsxЛLEOMM{nG>>s2l`Y6lCx8u,/^X,4qVd2ɆeN6oڴ홹#EgFL5V|?sU S+f[`ˮOo_/o9V-X6&xa#_6="##g.֮̒RŶm oh`jj Ƕ qѿwR6 QGH`PK|cr4 T05:1Ԥؿg ~2򥿈n}"`, BbIdj7-3aǾSyB=}:.L41W_j>7 [hx-yߕ0R2e36G*7\q:ߝ[ֱuHpjlU-7hYxфP'Ӱ,;7JpWuH']\gy/5FXn CtmeSw Qgs/ٷc &sKE1hnnW4+gs?nW/#Øz02lp^)SkVH&**Z091A*.7mۄJSװ3޺ʦxZ,zl^bi]w*-\%ҍ=þmطm]CO0:6C{k :[4_Lfjhs Kksv9l6Np+ ,2ȦԦڛ[1]lyd Z3pճ:ػvf|kSW;7ʱ,j.5˴b%9ͦV6u\`;zoY }[ieHJ-.q\͜*A5Px{s#5uA.=1L2{ K*- NTq!u}Uu"ڴDub8Æ606o%&1(E)lAkCߥ ͿcuEZ BH?V"X]cu~Lcn^|~p!B!tL0 B!x3{uAI B!Ļ1#<ᗞܩ $pB!]* w0gO1g B!RG^ywɞ%79ƙ㇮;B!mq\cpl]\*^u_ B!xj8&ol꾲TI!B1/ B!A!B1/ B!ĻI B!Ļ9ΆE6c@C, ۲, ˢ!B!6SeE56M31U¶m±mc[C=B!BA!B1/ B!A!B1/ B!A!B1/ B!A!B1/ B!A!B1/ B!A!B1/ B!A!B1/ B!A!B1/ B!A!B1/ B!A!B1/ B!A!B1/ B!A!B1/ B!A!B1/ B!A!B1/ B!A!B1/ B!A!B1/ B!َe#X]cu~.ҏEH?V׿s{YӾmir2`Y݌%~.ҏEH?V"X]ލȳ<=~+lQ&KPkBmfbm8cǶ4nI0\} %X%cu~.ҏEH?VeuvvҏBH?V"X]cuy!B!A!B1/ B!A!B1/ B!A!B1/ B!A!B1/ B!A!B1/ B!A!B1/ B!A!B1/ B!A!B1/ B!A!B1/ B!A!B1/ B!A!B1/ B!A!B1/ B!A!B1/ B!A!B1/ B!A!B1/ B!A!B1/ B!A!B1/ B!A!{#]yݵ8+5uV*.L.F"%@\$?х]N**E 4K!ZmJ$85kj;Slf佳;|}<(񮿟?}z @J8)@J8)@J8N8LMM=cGY(e,vŎQ~]Our^:1̎Q;bGY(eY;>Dr_ņw/\_;y2F4U4hWYh&v^G122bG!(e,vŎQnw9wb/ሰvŎQ;bGY(Kwxq4@J8)@J8)@J8)@J8)jkVusuu1WױjUUEFUu>F82L\1qKl.<55@N8)@J8)@J8)@J8)@J8)@J8)@J8N8LMM=cGY(e,vŎQ~]Our^:1̎Q;bGY(eY;>D~ F7n`4_SњnwqLOOȈ,vŎQ;bGY1sPO #ŽRQ;bGY(e,@J8)@J8)@J8)@J8)@J8)@J8)@J8)@J8)@J8)@J8)@J8)@J8N8LMM=cGY(e,vŎQ~]Our^:1̎Q;bGY(eYf KIDAT;>D~ F7n`4_SњnwqLOOȈ,vŎQ;bGY1sPO #ŽRQ;bGY(e,@J8)@J8)@J8)@J8)@J8)@J8)@J8)@J8)@J8)@J8)@J8)@J8N8LMM=cGY(e,vŎQ~]Our^:1̎Q;bGY(eY;>D~ F7n`4_SњnwqLOOȈ,vŎQ;bGY1sPO #ŽRQ;bGY(e,@J8)@J8)@J8)@J8)@J8)@J8)@梮~בp+v;>OK/:j\\N>_bff&"7tSX">_..1Efqu7͸[bŊ| VZ%.!Ei۝g׿zkX"n%B8(j:q7ݻ Ŏ;bʕ۱(v;fggcvv6<~7WGSN8yEU7oYwmũS⮻~w3<p,m4iӦOy'Ow=P\wu ..`Qiɸ;㮻]vG?XfM4+W(qȑ[_;vć>g?V+mJ100#^ :t(nشiS}},E]ױz+bʕhp18rDZcbΝO~28qDܹ38O?t>}G]*n馘k6m7o/}Kzؼys߿?N<#4g>;w+2.?sOl߾=yI%/+_uؽ{w;bGY(e,ve98z`Lcݸ%Zl6|OM8.\vŎQ;bGY(K;f;ppDQ ;bGY(e,v;8H  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  ~g(e,vŎQ;ү=Xn}_Ku]GUU>ƒQ;bGY(e,qcr<-fxj2Zo.\vŎQ;bGY(K;f;ppDQ ;bGY(e,v;8H  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  ~g(e,vŎQ;ү=Xn}_Ku]GUU>ƒQ;bGY(e,qcr<-fxj2Zo.\vŎQ;bGY(K;f;ppDQ ;bGY(e,v;8H  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  ~g(e,vŎQ;ү=Xn}_Ku]GUU>ƒQ;bGY(e,qcr<-fxj2Zo.\vŎQ;bGY(K;f;ppDQ ;bGY(e,v;8H  %pRH  %pRH  %pRH  %T^?먣3u'Ff_ݪ@J82 /ffއ>},Szؾvafx罷c}L}cMuXi0x=缯pehĮ]bbb"o[Dqn&9/D- =xkmrͯW\k7.mUS'chhł?_EUE<`?z1vÿ[Lp_ Z^ Ŷ37oOƳ?۶ձ_<_N=~/; _шް66mX~Ùpxgqٮ.캥_r:8}l[Uw5aImMO<~ؼ庸nl[ Xs sI8sOEnc@N?v;#-NN~;~h 8붞7y^Ksu/Ou,^qG˴|(fZnk~'&Nܲ㽋d7mx˙ڥ_(nԿCl$PnvӆıKf=78ߵ뺎qǺ79>Wўj7x>e>G/y@kp:ss?Yʼn/opzF7œ;G>ȇc׮]獇:sCYix/b]VusnUz3@g}μ+G[G>ص=<IetsZkS_<תA?몫w7&&&;cOVDĉG_5WȆߋloGq*VU< ,OUUpQ8o|#'߲y-)~{z26u3giTU4> g>3s<nڽơqo}pmӏĩ/s~hz8œO͛⋯Q4DDFj.U#g޳cGgǎ ¿W?7nCnU9K ^?oX{zuoGhmЂ?z͊%΅^jpӧO{q_%]:\<ݿӳ]gg-s5/PU1jĶwt{O\^UU~T+Z/? @|K$ %pRH  %pR8W\vcxO^a>^'""eynU"╷'U 8߼=[r,c=ɭJ@DžnOr5*2ۓܪBnOr5*jؓIENDB`netemul-1.0/doc/ru/img/send_packets.png0000644000175000017500000016617211277123237017241 0ustar frostfrostPNG  IHDRKwsBITOtEXtSoftwaregnome-screenshot> IDATxw|Wջ,r 7=t %BIBMBKB @ 4`wܻu*׷MqrՌ ,}Ti*##&8ѓep؉h ӋRKV-=ě8cbbh}cr[1&n (x]"9s&oQc쁷{I Pn-}W:#JvGfl{^nDˑu ’lk mQxocFW;Ccgo9A;0;;l< þy8/9P,:kQzھFT i EJ{2ޤƄRc8ٛp\W<9^~z4siÐ@>PQ%MC?>z.R~<'χl,][Ͻ+HAW>߷@݊>Z iz蕽QHɟug: Ex_zjtEgV9&˪_w;+PC .9c^AݫǝT+N F~ӥ;qt =b ϼ|?_z݊&~ PC_f/9m('S+#+iGc3e(?>|+x 49cNbyO~x}AW=WOH׽ћK^z6~w?ΛrN{ww_.-Uθ[zt{߼_\~5MuýKE*w~__딉 <@+ֽ|K9=.2;nvcEӑ9p̓sNt8E3Ɠ}uo҂ѾMյM30vUu,{ܽb mt)&w׃G* }?*Q9rE'Lk~%2oz׈s f^}/̇h\;SI'%Vpa`;7pb+pǟmszQ@K\z{Y}i[nCkXo,HS{8aC/8SnXC8]ͮVY"ŽsnB:P$u||Ƀ=㱃$a7֗0sՋ{۫X6E&{qX=K uSA.@]RbSwn^tұg_s]v/@Ή/aq ={%3j u 22m<> @ J7ǁ"wD)=M`΄n/ F6U(:b9Js30EN6W\`1aXPOi쟻mE110S˫ZZVI~R5QOkDStMUIcgeԬ2TM11"GBÇUJ`a.dۈMIKx@BBUI_i^tey%%5OqZׅi3zQUc&]Ϋ`M+?3`nYreB.ꄪ?*L9$0%W|٬5{^No+oX< suѵwb])*n܉01& aX82Գ^ .o&< 'PR}OB+_/²+G^_%w?֜LnjFI]k[rFpgzaZJYcN) -G˜{sˀ,  ~_%>)I/wdnV¤ɾLYFn]ޱdָ#szl*W0N> gZY^[ƘEho 9ʷD!ѷǚc FmɂR\mi nf䪷H%H b1) b! #nա*/7LCp/Dĝ UɾP])&H)^-Sý^g:o&W4)pUK%큢F0dQBGX sFT]1ۢﰀ,K6%bF])vOպ;PUܪ|0I@:m;zyVP5'ʝdhB[ P'M,*Jnd>&ϱwsa. 8 u5EYQ8јչ ado:_aؔ[-2e6x)߃.%voSYpYc{;~1jL:ES,oS:=%W<|,O?1֩3B0Pz>/ibjb0Uд󒭥SJzJiJRV«*y?xT7RJ98 BG9G\]OS3vª o_ZO _xkmuNX{rL~kOl6w|v%BCG, .k_{$\˷Uԅyִ2T~UE5{`v.ԧJb_NT!s+qѝ o8'xݔ DlWQ~q7]P5}l[_:!,XйռK5|x[O"kWۍa%YpWZGO.-J, Ka{/y(~3g=wh KQO#|A,9UI\[{i+JOU Sׁٵﯭ8?Ψ=Ef#5W yz݋ JwZ:RRb:d$ djXjJIQDD5kDTooNTI^(CUEJ9/5/!}#ؖ7Wʪ QӁ? r4n^xt+CIAݟ=dsgHkϪ̌yA%!@6.w&SZx 1.[s)}}gs3^zRh5meQQҲ|8R5; 5;#/hmK,dX6QQ {J6Wsݹ$@WmZ"cz4TUjEc r_SH怳q]N,]xݮTUVSR!~iu_S4jsEKq@K@+;7%vs .z\@K>~HµMm_d=TQn|L&c=xݚXTKpu fT`CԢd%FI)?`y4{g S#lRN$ם.]uSXUmAtf d4tdj;uwNزcH)XrAr{]_y;8|_;Gg4E(\syȈ Ri_τbSJʹw]:})=;88888888`4.ffeXlvF j*/7 8G'A8 W.:#$Hޜ'g;FZb[nvֶĩJ/7*SIMv`}lw;o_7Tv|s@f Vr[YcpY&/8{W^8/K:HI)^?羡MN;ڋ ڕSqۿ|b ۴+7S'dm>^:Pkby9~ZW?`Bmyߖzsw΁-}mCeo04~pǕ_~dzG_ON @^ų?͝7ae nk7F6S1gѱpXn̋_O.:θwˍDlлgϞ=9=_]a.޳_eX,5;ŷZ} ]j. ȓ;vj T7ļc˵O@fɾ^~g51@}'~lckZr3oK?[bahpʶQ}Պ aJt~%7u3˳~| FdW0{-A i\-|]zk;bcIvw7s'nZr1 Ng]o6p*:;uvsɐz{\}qwWUX`U?h53[?x!,f ]h4ⱙ9f1NCe<#ppw܅W\3'u H)N<ʫEG.b2gyW,YѴKmI5R1jm(#vQ#sx[+8oln6U!))= /ѽG/߾D@z8̏/W?^'ܗ]]srymuimxf=}I^ K4=x}o-[ֽ'4>{Sj!MFz?OLVሧTh@:=i ӌ=a3hvOW߿:,,bm gqC5Y)S%}ʒ[K+ߩ.hԶ%z=\XZ88 7{s9?6s:]{ -f21Ccx[" "aSɂwʢZ6zwir_y6n!#4yGOJ35 ,sXen[WJJ;eX)Niraرvضswy|@TTolGXb3X|E35StDГt|υ?xv&GtMcM6@v0I^jOMWo]|D-ssxus qppp8)?NnjL7> hxk==u!078YȦ?>u/M:`!zmh"#9n6 )k-̒LUY}8ِ9pq>r=4qzpԟ^? hvON;DI%]1%)21YߏRgJ }Ws0 )uɋRH}@CWGRg]{kM}H jG $MӠ!XmE1㌫o~ԑ%!$dpÍ7pc"yw(VOZr٧VmF0>e~-$+2&+׬Yvu֭왶Vf#ΰ=!YCsmc:kWis:jbFU'G^vt:Osk'.f3lӏ{[~?~~{wZtdǣ Vf+Y>7wl5sӇxb oղZ?!$`Ŷ0B9iz|]Ǖ>zp Оު&$$^{v♩CrVʨ[*w2Լ4} WbcSDuĊ,Vg-Zf* sk7oڲ}k}[kv@,s\Vݦ$[@%†yuuUĶ#|]qxImMuĦF/^~_,L 鶻:_-:yml0p'?g{7ِ1x$۵5x䭭-ղG0Sy?Fk'F}2q$e/ Sn:G/=6]s/۾BF'`Ϳ(PɻF]XK4Ni},8{jnB+/€hK6!,jcˊd+ sѶ욳~D˷WZᴓVT</gc(Vb$2$j܉ǥJ]4}RS1"zL+,5kDj rO۞W>_Qrzŭgww屧?{O)s7tziN|P\O=pCK)lPVh`{՜\ޠHTɧ1ZMv5Ƈz]3dL<83:ei&>q$pWOsgXlE=@4zӳ:`<$yrR]2V,XmVSs}[Bǝ}z!ds@;=73գPs}SdhTV,1\вGK 5mR.&r;MlD͇ W遚Kg ܎4TE|Ìڲ֞C4V{[2K$Tkz}~m xf=޳Ys8881|K}}%h3p(H}0SC™;ɚ988888|=8SCW::Y̝>>@8ImSj7I _Ps!!1;W6 )}0c3g|uppfGϹ2p*Kz)HMoQ98 |s?E嗫:ܦ@rH+(+Q#;$b)EQ,Yx CEef3dT^~~QȾqppp8(,1aíFGLK!o - bUBxiؔmXk[S$IE÷b'bf,3t0 θ `Y\.寣$DcQ=nY!HȚMMM=Ape2w*1=grW= 4vڂ¯Gx$z>q8a1plu9MbrݤsU`KM`hY?ιmۖmpȲ|+'u]Gƒ.R57D H$b(R28c2`1FX0 %1Uuc85t=ںZ!++pX.9Jl@(ڶ-IVUUE&Wq !eGTYs(h!æsxx$Hdn3cի9o.@[}w@Լ !lc$IUTYBF6|'U$,)Pslp%Pۼ3+`?l3ۦdpjSĈqN9۶l4z,⦩S"J:' )GMnPq EmSbYi&bIMȜ4&{Ym-<QbĦ"Mmٖ٘teVQCuf:$~8p,M)cQP$>733#%exaa箝p$x ؼysȲ4vAwba4662Fn a9\*O5aٻ,)@cS<%r!AΕtq(!Bg1Bi8ھ=7RJBЎ;).M@`xtMSMˢmgm'EuSgSt=nH> ;jeJ. b̲MmQbRVyJ2]I"{\zEGT3bڄI_ ݶ"JNOD{384AUl,t|$ m޾?sc<k6"H8#3UB"- V5b(Z=,PNg6LBLAId1b0SFm۲eJ,Q˴LN)UUf ,\CQD$*"1 Rۂ|'ŷ 2'|//FcTQO- ލ(,8F #Qˆm;BuК59>傹0*hO@0M΀%M,X__\KF!P(֖~J9ee+: /+-k4M2EUՁCQY$q۶-`x8c1˲-ˢږtho9kXU__gZ(?19LӴ,Jaz<Ɩm['O<8s+*Ə1q%iEbRSS$Q4Lՠ@OGv@$Biv59 ;o7Eª&8猒Dʉͨll;JMWei%YC=$EEs#b,qͼg1m:N;@?6 h71jl^z^Z,L9TbZ~Sf$e6zj {wtjS#FEݚ[2Rj ٶ"IDY }& "` *H@)OֈMl9ALd)" ` syS¡ i)fG⼈k|\x| G¨V1JE5%Di 5so3=c@hi5`>%Bh\oBe-j=N1 .:v$ pt%~yTccc(#QE, h$jJ퇱p(~q oh8a`,x<~ڲesSS3gA `C5kVϚ55 )dX$A<B0eB) [ ݠ0Q(t媕O-;eՊ"sek.$4fR ]o )2h"ப2Ms֬x:eZa7&j'pA>/!$GԴTEi_@7:EQ\.$IQ0FP6(m?{KHYklAEv9?+\aPJYd8cJms غm)Si bJ 38Bc4MX<8ǽmmq TEQdٲ,4eY430BINOKɡ544رcܸqGQp̝}}`3AZ#Hw>k**^ӈtQ¨Z^|i+Q e?Xh1bL5yǨ, CRn1o]05: yA MLlP]WUUD0`̶x,X4.. }Η P%"bn +#U #s q %ƆHp$1#{a`2A_GNf{1t.f `d0L(7ƜD8) qGP(`I%Q|Ϟ_,w\>0 E +*+7m4s#ap1;zkڸԝ7_V0O&u@M )QQ{weﭼc-&=-gWFNd)7crŴ\'5gZm=kv6FV13W`Hw)*r#aEʨmY 5h"$1?hjZz$ ~i"0(d s)e96xSK0 J޴p(Xq@vW@IĦ)wFj>t;ipLK!6d>\%2T)0*"BpM`؟͈)JQ *t$7y$RqΘFя!|td#Q\VUW,Hwp,1{QA$) e$#lC|l >'"0(]@2JacMƊ5 #CzKCg0 @V'ǸŭXMw e_Z V=ɉ.jfG,d^ۄXim؄ LS2Qbĝ";%ڔ︶>B1A Wj %9`caTrЬ_ И{x$I%,ǣh4%0)~(eegg'7n83 i(PB)fΘméi!(I n{ݞiӧYmeY457*3gn}C}J!EQEDpcĹ\1F(yL l2M4mX,.,hn)~% c"Ƣ $޸4 sYeYQU2Mʘai1۶Mܽk©X,^QYxƌ#IRuueY3ι"˒$$((|v# z<5m4qx<.b"kF C< ξW_@g^Rk7ig/]Q6cQ)aPJ8)%ײot(BEp38S t *’'T2M@`BhNk$K@.<0Q:VF!>lp(mhlr 0 e4[#o IDAT=-9%INԛ (>#a c(FľCc{tZ#Bi xJyg_<7LE4UD ƈF( PB[ԩS@4TUuYkkkmmmBҔ#F21!+iiiM uhc(xG8q]BUX8B@)1 (hx:%c̴L?M0ׯh,*`RJl*4K*JsKQU!)b˲uÈatĭpQ**+NEcQB cBg뺮;ѵiw؋("ER$ؖU,{d;qNyOLfd2_2IMdql-IJ-KDu [9B^[ue~J*KΎXZkVZFaXRaX*b4 ޝw1008==]V 2jUA$\.}=)$s!{y) YkmӇpy8-keGVJ9%嵧]lZ+@!l`-$6Cx(}h{ßa5RMP3wmXez3_LT28Uª)'cϰuZg\xP]㥦Ũ O{+&w.73MiWZT:\ՐI%t*yy% ł|:2js/~Ӽ汷x𕛪 U0Jka"MZYvMBfCng/ũMHSy+6ghj 0|E'\#\f"|nV*aV(I %J TbsgW+eD4'qz@*D.u]RXԎ$RڦCV"'N\a38<?_ ?BRnPixM[Vѧ?]O<pR_e:f(>~PP{]ۛ?m_&ʷ@S7͂\ )S ] oTےƬ q&Qm,uU4b$K Z m/A宰 6Z h"aؠ̸.ԟdsL J*ajI3W 3R15jD$#2FJ .K-Η7H4OBtY R2c!xh֍updZ38+-CǗk=IFi͐ ħ4B8m, uA$NQK[r]'gUpptj틥"qǭiZF(Ѩ;ސe2\5܂46QΝ0* KyDs"AQTK+C`Jl.q5}}ZkZ2uZZZϝ??59'g0Lt].g }1n2mYk[a a5T+B C Q31bMa 8q'r8knjT*d yQ#*(*e%9Y9raX,tw777[pum*(y׫ԫƘbLn6L&mEϞ0X+K.K l圯[P,FaxGŮf1p@cIBuU6N<O wF$pb87~T?l~M娮 ~ M͓oL7uztgZN1ŶȢqݩ]=l\ݏ\K[Qh]w\E"8s U#X!, {6|Wki?0S3[|f]M8qk ̀VH]j&^6+8_?{gmewNyRe\j.z>^j c$n$B,iK% E*!(UJX( RR jX%VP1TAH3hqgnvn})Bb)B =zSRWD6'#H <ǺpRT457Q׷`=1TJʥp|z~MWʮX~/k1` 7x?li(\m#Cm -soΧ3fMklPAkDҹ[& hMz2;i7pLcBjJCGs!!4W[K<u6%=''š @jqCŻz~3U/Q; 43w.x?j={ʰ0%I5WcbϏ|*:8`@Qh0p&Ԅ耩20c!TBXH!RRש q/魐YH 0wCwuMBj/8 8 &HhkC?q_Lǃ)aH)kI^ Td"B2 yLX(֨K˂ siwhhhXo J|, b( )\׫2+DҢ]׍Xk-QZk *R[FlSS̙3B8jvE$^IY:Rr-RjBl^x"/B[ P2h4gWoisa.xڣq Tsxi_?}Caf[_'=l0}Y d|Gy}k{2_UzD HD@h$8V&@% ]n4,Ԍ017óĜ փ-?{?7MFc1 7~s nw>ϟW]^ebM3HT2gB|R aEq(T,U\Oi@})rή@}i惉DxA0*O`4P}_gū4p'R,Uj|FR)})/T8.GQd01E-rX{cP*] C"}u]C֡Z?d d]0RJ"|gfC&`٬lA88=u\9=q%q,R`ţFQ#16t|@.[6(츖 @kqӦBX*dRud2)$Š!2=88`!ҋ'N9{v o+a[AFιV:c!"BJuuwi''&׭[;zqTk=55ܜX]0pkBP* $PJ8NX+-ͩTՏY@E!-R5 TDTZe3h?ܹsL=HJof@fw*xHV&p@B.\ @я}{ o:1u g?a^$0Ԟ=Gmmmg~.84Vw\ 5ABP:D,d$U$U,TRKj5H9.~ ˢd=I9p%(KCzeJf0g\H-b0bFeTk-PR2jBדk쳚k_Iu1]D-7iJ6ޜD"qݧN9?4D mwBzw\])j7q^.9QqΣ0]xƘt&]* fff{zz= I$==r+ pDlࢵBV*)cƘM6MOM`lvӦΝ/uuuy?|>o>|62%j@,4M0rǁ߃LJhhxxMHim b&B")9<wd]z^m Oq# < ΂yvQPIʠ^²^jGMWne`v6| ޵{oZЕ0;;0c3 ;}kw~mhոdt+U>s9SRHՉ̋=gF"Zb[Ä1HReȌya丵4>gdi 1%zƘ|E&_ä/NtDAJC)u(a$XđJ iY±C\ulP𞞏}n;bŀ?њ*v7&3 5Q>ى_x;UljBuYRIr Q@|EQ\ ("$yT5jJYScnO88N&njlm}Z-Rj 5k6M$D"H$[Z}aA(fȐ1 ur+A6J_X x8c[V_T*yD"^D:~i\T96 WSt(fIJűwZ6r:!9smmڵ|qjjj`}1Dw jBcjfoq{׭ #7n{yjiny_ˮ69.. ΃ T*v -/J)59.RvhRʐgZNNLCmAc|9DCoؓ<G@`=4{pr⥏'k)Qkxڐ^忤qS>1A}l'ޑ)3fF- W?tC*Ԓ9M-_?<i-gd&8eߙh5jX*Www~DŽv<9ЈШ3;1q8C80F)-nw5=`᏾{b )(<0Z0҄J+Eq6q,E"Y2eh~;S/;ꋐhbϷOuTjQ ԱK-g>pS/4iYF+TJZ$͗bF pjY,!&Z:<׷[Fʦҍ `NJk&U쳺BMJ)$"cǎ+(  Eຮ%匕+e"ܶGx٣1ffF 16;3~CD0 gZ[[9cdLljDM:r!dXR"q[i$ KbLJ:#az#}r7uXL^¤ھk|HRbV hRQXcA5c陙QJ546 ry|||-gϝe5,[]c J1ΊŢFՕN8F԰1>IL.J&U}=P,IR2Ev*P.klj}D4<<uw h Q=SS/`k.=4:LoNFmk64M럕UJZ2Eȉ3&noוcʆ8ieWw.nԎ;$` BBא&XbXX+ժcO0KGmV"Æsh.G;ϔ|3Rjt9vjn7Oo?>vY@jS!d TR PJPZĮv^LlSyBJ}vΆ:~f=w)TJ+!4tsYO/c_>TըjN'W^&*_vI9.`B5X +"80zyWؓv J8_ӗJrٱ Ԩ2vO] oߞH$&&&N>mz&uA!85vΉp)Sl+!fDPTqj}]@IWn |kK X+WιWh(-$\[DVBD` i*2VZ+C.W|ygj`mhlBXBL IDATB*H677=k֬Z>rMa433ՙfkZ08cs7BYxXt\'VaEc d"fɔuM&SJT)C!l-MD"uDKHH=Y#c+b41-^F<V3yYfݣ/NlwKۖ=[ i?BK h*n( ! 2(^Ax.~нY6鵲x2.12FjICJ5BXihmPٲ VNxg>]!qh2d1 `C&*D+6<|b I -J)Z;[wPkHHB؉_*ŰԜ,HGkx;`StjF9H* B)TZ*T6h߼rj`]sb 庬g\=R5@h%B !c)ğ}{pj~W:sҀ\VwӮdE-m(#Jj 12AӠ7JR$9O:cLv>?ODT,ۦľ\. gFBD"iԜoٷoO?CdL5u0B9f3D\AU>!ۙf~QdL\LsLvhcK@d  Cdrn{w|̙3wܑIMd(lz ?D"Ra855k׮87oFц ?fLLNaaÆ;6%..sf2dqs=c SS Jh1wDt:m9-‚FE|?jiH&dDt9!Jf]>` ǎWԲZHV=M3JJU> `xݐڽԇ|Z-!OA}WKZ"ݞv*0UvfaƋ rC0 'f:/iO\xŒR(E2|BR }#ԱõrbW4u#/Gn718:Ҟ@hǵ4q Zaw<{'ޓϽXr 6Mi 1F9#+8ihhU=6 Eg{O7he,DJ,T_|gB%H(ORsuDԖH˗rR IR BJ~s^t:wnT߲{7t9]|<~&~6ҽA5v5Up'?qtCI$.Ɖr帡io[)i鲐b ӾpZ;1VRm޴q5'zP;~_30h5Ee:MAk)u[{WƠW54ΟN;[~/sF0|+kJ!PĽ뛳H:cnha,g jT!S!88$ݔ4.̿ E m5棖6iJ]q!Uђ_Zz}?݋[r{KG>=3ݹBxb&xqaWE[ڦomާoG.hmn鬳j|.QHȠV Q3 a pP˺߮A]վYgwd? TOZ|N 7fMbhTdrn&7>5qXbYiM~#NmoxM&ΌDBp7v\Kg\.>16nkymMox$Xl"L-R4"j! :'/>DZ)EDJ)`,\R,{mFM/6y=OWdr ېC=9Owo[whwA}4ƌ`c %ҵtB2*q-wt`8/nkHDٲñTJL 9u'쟞zDM'1w/%x d %F"P=wޞIy@#& 'JNmQf`*)Uzm \\ee!Xaq? ߺ^#9"3hND@ҀRIZa%#uw?p +I/>cC2Zzm u`xrU?uvӣG KfR?q BXܷ@D! ]ʥdm~1ڣ3}~@ߩ_(}fqMu䣤D675;.MVr8v`rz޼s_פP8$_ꌊ-@ hUi*y{V:aD:ap-Lb j"" cC[?m*TaRҊo#WsvHm$#tPiF)PZ()%q7|۞9_U[馛u}gF.M0*iPK_ڿOyr}|m'O\klVVa%%2`iin[Wa-1v+ yT*_>9pAp ͫ[`q"da ˇn I)bhs`%Y7y5PVO8i3^ĉ7pÍ7nB8:۶m;z(,..>ӻvrRE5dKKrxB{}}…u~NRRĩSյ|lR߸aõSi Í#\.L&1 ]> pTf2cOBV˳o־xt]nwǍ;;> &e h A,E֬ޝBώ=ucQ#DRHDlHkl1Rh4*BQ/:#jds{ѩndt{[yQnh"w87Ht]N7nO5&,i%L\F Xؗm˖ a& *E#P?;MIkQIDJUc#}ɛGf oxߺJNE͂h)HIo]<6[g6Ɓe@oƹmf/cygT%JR\ooȶdS:K%N;0{Cύ>O-UTJ%{os]P?H_'w㎙/NLNH"C2ޞM6Ytr:beA{(c/c#5΁1;ή(sF~5}R|~avfX-rԴiF8c3"Ex|b̩ӜVuHmܰX@gݺm[wHWeؿJqι1 T*5(ȵ׈c```sZ[FGJ)?J޸og_pJW #lo9ԧ>}=oimmO?24ċ':_.׃yql]U;KZvXamHz_Oçi^\yu/ٷ="3Ժ~֎*7[ể!g,╺v^m1yu ﺠ]t\K-량/nȴ-SjRވ{]F |+{#Jt, od>Q=BxƤB?'6Y^̬DR};b2d.igv[_ d2bkSA5ձCBR~nvTXx]J5v>@]rucG֍%"\[(]WB6c9=[?5@ kT(Fթ~ ZPݛ.e =shv{8]M4_:c8v34޾ f;aB*nO;qDd6PpEtj3KErԴ)]өc=LwFNe czyBEB5k}ϱSs~tCW|roߑNӋ4Bssscc㎖F*DU8DU8DU8DU8DU8DU5WZhѢ]n9}Yvo+rpppppp/|.urkzdTs]>̛mX^( f޳NNbHޙN3ƌt P[sC9d냇r)cx|ر;O0譡˗/S;t % @QNeuƝ}z=)O>moT v-k k;1A:@DDZ3K7ݿPSEA:PSEA:PSEA:PSEA:PSEA:PSEA:PSEA:PSEA:PSEA:PSEA:PSEA:PSEA: "Z()s}-ɈHc}Hq~+hmmEF)sW_ֆ `tGWWW_2d9 zvgK.-K; +QtA>~o\:DU8DU8DcLVuXz.C08q>lMMMcx af2Ύ֖-7oڸqo6{kk׬YW^Xz՚իֽbYӟ2žJQQQWJӵGp|]w'?ZcLYupppDuW֕>v!l**܀9~Gu7owh/\n;wn. odWA:%yGjժSlǣ:jkPz{6v H.ϛ7 //~q饗:d2YUUսpPӧOƍ~kmwt[P"ι7ymmmvڧ>믿>O<1g_a;Ll@~G'?I">wwj]]ݐ!CGD9眣>.W.{g,Yq "?|-{n^W^yuG{!R0|K&Nx'N0?i]]݄ ere)s]{g3f̰aÈ_G>򑦦+Vy  H$>AL&󣣎9昻>쳏?rN@}dN:c7@}PzunI&Ç>|x"LP9füSeS]0v X;0v N@QN@QN@QN@QN@QN@QN@QN@QN@QN@QN@QN@QN@QzSK.-K; WO4A*******ܞEu7Q̛LTu͍ppppppDuW=өJPQDkjjZtiGGG¨4iҌ3 nTQpppe ChǏkK7oַ5nܸ'| v0xTzu -^xΜ9ϟ>}zYhjj:묳瞣:,@_@wV^"A97o޼2~ 'pm}X|ybޅvL>} ߸#H`Pkjj/g^޴i-ZT0];4fƉ']M jK.2eJ ":u%K+~'!KpmwG:ZGGGmmYG!O>yݟopqY]! [sFL&IGQ6d\;#^ywIMMM&C2Bw߫\*_ڻ~#i/䌤!sٕ=ܭϊs̎yq*4~&irD9?k+q6 e/RÁ vPPMk׮˲DD/ES/qŒF"TبO!>1 +8FvC*GMY棂rCpEV0;<I:R>HUꐆ갾61:K50O&T"HgTU2hR]TMKp:Ѓ1YCD+6D$M&jCMy1lIz^ҧ2FنΎֶ\6HT ;ޠvPPesf<ƘY7ʯӿo2UKz)V&xF1['D"±t3Ɏwʵo;)1A]T2Tz_cc\%HjB LiM"!uB=aLo֙d@DhW )>wdzV'u՚JhM@u)3% 9ɘ̦֎[Z3[ˎUU+Qdu %=SWR nSk{:eURaX؃C[;Sz 1]7CDDJJJ,"s>+1;f){ĩrq4;+얽J0WPzN]K..fDMh 3ƿoRa>%K$l"O|be 5ej[gg "WPvNHҁo}?%|wFT4 J )Cw<au2QWT(w3d麑R%"RRRba呪cgYؕ1l_A)( h jJVTRA"Y+[ӯ~}HkB2G +;;EQ"?0 A0?0u{Q*mJ 2~A"AA~ȐvUűaUEB}c`)q?SPQbQu"*0"9vl;r*,) NAQDԱHTXsVı2윳HfB}c(BdEe 9V1[q8p>eH2+~B})((|v!\g\Xs;䯫VÚItmL"XJT`)*eqF}UDȺtg8|ZGD*NN()WЧP)Ŭ"NDb벱-b;~drѣxs~{eqX J T8JDdpFDX(F9~ x",,*@>؉h,ZvYg y:""\`0B})(Jvȉ&UIMDFYuYOs![V$:NhvSJ ̊R"振Of6&Wf8eY'V\$+#,t#@`sAD}_`Yѡ1DDQe} B? \g !l:/9|4˥R<gSK֎}_`SP,C"*DIp̪j !"[d]6m4kև,駟r}z /d٧Z /nڴq 3U"J+0BD@֩eq,*j<"߶3Qdoo |E--[N? K/hhh+V^ `PG}Ԙ駟^Kr9"K6z>? 7W fNHH))瘭HmتYسqN9n&nhu啟_)$U/pt5Q02gs IDAT>5. sGw,Xp]wݹrf +P=Iqַq⬋#}g=ͱq.,g1i҄=+V `c{w?~rK84/1㉖9>5y{v2yO/^ -T`ϩ 'b%tV'9:9qXY="{%I$Uʕ+?x2s%UCa.Ow] qG뗲A)詮nݺu :t:=bĈ `wy?#lK̝DcD5DDXUIO9眳GcJ`PAu z8q~rGADO\v~;DR00dO|՟f/5dU"%h:C ݤGTιKvtt؆ |衿ax'ψQ^UU5iҤ3fAݨ*D" sUv%" ,hn^Wz4>4O}#:'L _枵'X!U8¯u;7~ʫN!DUފwQ-^x޼ySL->e2'|rϟ2e sdɒN>y\6yL߯JD :?]p%W}Æ -2 VDU=jɒ%5=t wAGw-^xΜ9ϟ>}z555uYsQGU sUuTuŊLt%o˖9}g73 _wYgaBxթ= Q_G?~~r}=_|˃ ؟ U!_/6S[ƖS:9_5>ŋD/7x!¡:zRT___<"6mZ}}E\l6SKtK'z9=/Dߪ9Ç}}NfEjҥ%e7u}% p~s/t7ƎѡD=ﳉ1!Ct]|P(=̊]1IUGGvYG!O>W/';1;+9be'be&VI؉sl9frZg8Y\555LkrFs#ޒuu`xu8jhUIc`rl6{wox-e-!TK1gcTTv?KͿcŗ\4d.i{:zv3ّQC|xdMWuˈౙx!թ4?l&_[KelWZSSK.]{m9D[FD#G5{]˖ϝ~i#S=T͚ _?prF3ƒLbE~zQ &}gDTD%}bʾ \`<"!YDžemUouo<2Ɛ*yj0ӡ۾T2 $Me|UcI)]?8h/oiR}]JiS//GE 9TjM=)c VCաIy&U|#!THHUϞav֩JQCL**"<<"\“'1nC/Pǂl N=BD72䴭:MGGx&= }M. 9}EGo򏯺TWخ>N4~D75d ߼~ܹH:3;OgG}3gFWD !DDxyӆOy'ߐUPDyAlmNb(l3;IJ.+]YNH/9sf8Whe&Kiv7[Z ^f`XD!%0L {}Jv\}`"",D? D_DE ;Tvm'IU-G}M|bBR'G!7 |O}Ч#ߐo3*"윈(8nhmmE ĹWP{ޗokn3h;1 Ⱥx:g;:Yg8a?X{}|`>S7DirI~LRΆq:4[>}W'Od(q%\cL" xuȐK9r>@Cu `䓪OX~ XvXęg:T^o4T"RUU"1Ǥ$q6kmذesK[{Gg.s.dv*"bQV1kD|!J&%}K],k0劽3?ߺ&^)}rCDtu[b]qOuʕwrЖ7ruٴH+2D!C7S| +aVNs.aعװZp( e \&D6WH8\dc._'N2+Kf%j̒uދT@U&$E1}:8uamαu;Y˯B'9wĸ} _yADcf TAph8w@lWe@/{wű2K[awNڨ*"N OD)fZՀmqO$֌5*{UF6v;9\&bWWSރ_d2efujRJDN O ,Na(:@O_g۽q;^[XDYg$,=Qb%'DȉXmr7oI;;2tG[G[kGkK{˖͛Z7oٴ}ӛ_(s,ىsWOĝ}DDJt_ϬK]ޑflWթ:_wn~CO"&C-]{?h,옝0 ~Or[Wdx;6l8{Kp%Ն gĶϪ* 1j,e!"[ךɥ?v;s.].(cg9s;k~%e~zHTE|Ft_ }Yk:r-mmjiڑus\HB`@Z҈&/ 'dYBηKs6v8Y_#c~5ƅEĹQlu{c\ߜ;%KzN^v6EP"VuV1)jUhsQZǎus[&ئq&r\l\(sQq.:X R\yB,7kC\>ջ?Y3fbEزe7H%j3̷I! SODɉejVgԲwo OZK:%.|+vUXHDms9z(wO:!KL9MzL $Y̛ڣ\6(\.uֲ;bDޚ[97lJ_1a|Ց`IՉ2eaam<w)+(S,I%Nȉ:O}&RfODev0tZt!O^_uQ~WDL,kiDTƨ8V/9q̑scsl9g%?.s0vuEY6mmQ}͉Wޏ=k6ܮJ )ާDBD-xjI#g|Sڍѷ];7&""N4o;?̙'~zoHTPJ3QOTD9Jx*ŊĖsEcG6.]~Ƅd V 0R< ?+z]K푟͹tMj_%y @SU!ʗU/Ȳ |Y>S=6gO2JrTYcgcflZE.8v6q6dʹ|MC犈D߼vHB& Yar4Ʊ:3ֵUA{]S#~ɖDd5(Ze"5F=OTH)VvCR,,l$4Bl1Gl8rb[40 k>PՁ6 Rlj)ql3笨eZ.dT:ϼ5IIhz(Y]x>>DOٝɽCq׼=Ӻc̎Y-3Oy[iA:GxviӦY>`O?L.+[;S0d˟_ef^fnŊxmULߊ:!QR2j؄?6.f^BƱHGGX7Rp{߾UZi3;/w*y[ #(Mo7"Q/'3YQ+z\5>JD,F"S`jjZҲpνc:naTS=Z|"eihs[E VUQ1Ddo]-}1^<'Lgcaq/k)uЭTGxqC*9 [KVGb/neȷ/**j@ bMR4}9g-izsٟs]dgge}*o:{I%""m=Q'9S0(/9qOg&c$ %3\yhNE_}؞DH9IN*7~k^Vryՙدiկ_I:гD|CwTD2)'LV"ɲ,ܗ Nu] ,myR9[mɒcR(a!&fLle1&ńVkqCrAtHy IDAT;~bN󵱹@Q6g}  .YuD*uTS0r l"e֬YK.]`1c̙3f̘⽅n2ʕ+[[[,YR]]=ho8V c F)5wv /ٴ9t/{ Θ1#7#ڵkU5%R3fw"-*f~׮]=]v~guαǎ0WTTTWWtO*uly_,'|Y'.̴i{cMcLWREDy^jHKQYOUa~sWn{:Kرc/ںT*c"ywݲLsûO_r-;o'xlÀaf '|sǎ/ZKD?vO~zHt֊6"!kK"%UCna )`&"7o?|Wlܸ-Ht؏_!?/SIMxS]cccUUUcSAMMMUUՊ+)=\]OE_lh2^tnݺ0gΜ¹ NE/IUW0B:utt8g%?ҤI?79 8 M%Z(V&\605a\x>{$Ff߃D .U_{U*轋Tx# SI#\{M.H]/Qk a6C\+s=v9􂼛q0a- ڧHD4y[MIGI_^* F Tȶo~͵6rsDD[9Wͫ8q"ĺ$Ki-w>y.1Y֡Gc]b=}QW!;v@tJ)ʔRI7ѓ.|>?`Bu gIץMD4g-[vWm>Un{XCֱ-d Y=GLpl~͝]g$R#GjO.Y;vN`$Cu L)E\SwӮ,J|5FR戫bEX+bB-,[kHd :FZ gϞ=--HF(I{S W0:GvyJ46Q|0D=Jl'c}2<**]ǚ0ȷjPaWNֲ(/?_.E"0bT{N;ԃOp )8I&]]}uj^t&LhidmcƤTq.H9*Twutv粩Te#цݻw!+ P)tDۖ W0:\~u-[u"=Wi̥'*e0kcjdwtf|׶i;  D"]SSӭ7^6~P3'887ܰ|fIW0:QM80{dG*)ߑQ)WXrHyX]Zw,huO>G))޽ȌH ^d&BRU[;oŊƪId,fuI*nH#<ׯ(]YQQJ.KW|WIy^E_N)G=mok5;唿Yȥ{3%y:::fΜ~)e`$۳w_\SRtjSDC\G]ssfO[{&c"$ gD\-f=s_d&C W0:mw|7?s)"xU _ZrC) m-ƆEf +(̝XX'd_W91Qee^*9mga/0ˁ]`xpf"D{y)=?庾Sku\O9VkӰY"aaYܩNr}R||]w=OzJD@EleE(>o7^o$QxŃSBtƙg>s/)GHBCcд}r؊¥Je, :ǰ_(0^AQaL2 9:%T$Aڛ莽v;S,k6?_ W>pA %0](0^AQa) R(,l̡aM`0;ӊk,.) P#j>xŃu kŰˢf֚1Z3Ce#bmd(˾tm)U8wwJx+(sNtH[і43[0[ìYBá@-~^[f,o8&O|rYٺѕX( +(T +b򝙶6 [Fiywy`e&kqijjZ},ٱ_Ù}]0^A>?!VH5J\"D@L;tAΓ"k1bj'@̾aºS%"ZcBj·K;8[^5q ,b!@WP<;6EZÖ20Lug-[b (wXh0w @hbFfhfk"ǑĐ5bt%W\:Z\0J +(̝X JZHqNLΑtZ,d6 cp @l|問0HW6\tхIU0^A`UtK.kUyW~ӝne 6V[|ʾml1H~fW>ͷܜpL%IUёNGYED$剈LΕ@Qwrx)keŬdm.1|dc/T"WP 8RD)7'bX6VH吙ED)RJERD*Ԓ2LD(KEeek}:J+(̝XRcSi#a+DC vf9`ҁ ['rݎi"EST`Au q:ġC~:4l y3!cC3~<?Н7?w`Au O *l2Q{at`lݱh6,"dE"9[~;gke<x+(2T %)'peqU,ʰҬ!mH3s!*|r PDXƳgPsȒPˌa֎jCZLF3 L6X\w#DB#* ('o(]&̙0ՁӁ2<WP"1:qn!jjj &0ɓ'z=k++7]{?#*"WP"bهtjr]~…˗/O* ׻T CR20^AYܩi֬YK.]`1c̙3f̘A{L&r%KrG JϝZn +Yfmذ;83~cSQH|^Du%~0^QŬN"cۦ0b\pz葪NC\r璎wRq> , Pt-M"]zuKsSKsӎm64>5wvu?sΉ'"(Utƍ֮]7YQ ,D@E /ȏR~j`!_Tk֬aԄ *1qݺuџg׮;wfֿ_|~„^^^>s̺:z _wˎv1uZ˧Zxqѯ QE79wJ͝]Kv6m^Kb*U_~TVZ`AUUٳG=h1dٗ_~߮={6 cU:J?*!Utj͚5}ʨ {lnۿr-^(UV]|x饗>~z"@1_ -X1 ,Ho͛7+9``_ 9XWPSSSUUbŊdÀ~0\nݺ͙3p^ WCN!CgUGGGs[ZZ}Y":'MtCzÀ@Y25bmuh¼A>e3A Y/̅7}G2jԨl6;o ~0Ĝ;t G꯹t]Z_vyףflaWz*'sy7Ja.F[65% :0o~͵6rsDD[9Wͫ8q"ĺ$Ki-w>y.1Y֡Gc]b=} +H@Ù}gIץi;Oe˖{- *s*ѩq~e?*^w),}Q"b7/SF<+>TC)E"M+)(K#c2 Xl!&n[r+ C(q;0;`Q@[& ?\GdVTg]E\%ֲkXVA0Z"tW%sҤI~t:5/EB &i̱VxcR*8iҎG$j*a;::;sT²ЯJS.Wl2_/Q循L;e.=)U(ˆYKdPL&3}#MFM=AЯJSoĉW^yGvҞ*|H%:̎eљٵ}g.^o2kE :Pto\"q1)s|1F9*}m|fbU8+:"QDC\G]ssfO[{&c"$ gc D}'?H)uuHHHH,9$"DdٰіٲI0l(qWs *G5<]>K]w\7̶7~;LDD$r`#R~P 0w `{^}Oy)Z*S۵#b-3~P 0w `(R^S{)u]O)HleqB(;03<*}h_*S"9JZi2Dy""ŲX>gW%sL2 9:%T$Aڛ莽v;SZ,k6PKH6x(YW%sb+lX:"VRJZ [RpxWsbXЈehk 3k?q ` Dڊ=E%1̚%4ߥYZU8<+R Bo`+&ߙikc;z۰5ah˛w稙؞@wW) D֊iF+"Z(0h \z""ff[v֭wD:@N:[ls˖-|wD:@tP:̛7o&͛7{#N2}ƍ'# ™}1!@,"ҿqft^ظGv)>)DT_-l|05wv /ٴ9t/{onjj^bE.dg7.={Su4ZhѢ)?1=(esn^*ĺxQP1tY"'OA-ZGl6wFu"cۦ-#޶m-7\>noߝ&A-ZQ'ѷoinmǶM;t*x;8ln ˗7,_޿qKVI|lB-!/?}K1ҩCSut wvԭaA_-ShѢE׶I/u۾TGoT}L<8m[ShѢE׶I[}Kt^tԩٍ6.g{K󉓧E-(mak~)Slݺ#a֝ziӦ.!JІ i}_CТEvɡM:u˖-=)ڼy)r JVmm޽{5$% -ZhP[9͛}a^þ7z=T>Svݿ!AMhѢE;C7n,F.EQ)"Z~@ТEv3N~~+)"Zf SBDI؄-ZC-}O}SC:ښ7x_CRТEvɠ}zs:%"}zS א&hѢBmak~{:U[[xm |1S477hH#BcZhxI}õ=*\Q(;^>Хv}D-ZhOjkk O;Vl:1 `H7[#ڐNĂt Juk׭[>(`3fΈ H` [+&E<1)| )XN@qݿ}cu]{Onsd5_~Wݗvx7_y9p~Hۿ7Ǟkx[mͿyv@KT9xȶEϯsmO =7~o-+? 7V^sjɿsϟ:Ǟ4˃_=sa,'{iSP՝ΘXVlv5_KDsygp~%$DJRU{~'Ou_ %@ذ1M[":Y-{;nI{_=DKq[.EH(۵-|fuqY=yګnxˏ6>zjQg.^t~S;?x?6SmuR-";o@oRUգ^ؑ/|cRQBDD+eϯ|mzʹ}{OR;E;V]Տܵ?swg̫?ya<7pO.#n_+o[{Eۗ<[.SPl>j;>oE v[1pehp>3^r)"RsgWҪMC xp]{̥-ZonM>:\.SGK.u}z#(JS\]%O(`3fvsEuktx!"xf̜qhv2DɥN Справка по программе

Руководство пользователя Netemul




Следующая
Введение

netemul-1.0/doc/ru/whoread.html0000644000175000017500000000430111246700150015603 0ustar frostfrost Кому предназначена данная программа?
Руководство NetEmul
Пред. След.

Кому предназначена данная программа?

Программа NetEmul предназначена для студентов, изучающих компьютерные сети, в качестве наглядного пособия для получения навыков работы в данной области. Также программу могут использовать преподаватели для проверки знаний студентов. Использование NetEmul предполагает наличие начальных знаний компьютерных сетей и принципов их работы.

В следующих разделах Вы получите подробную информацию о работе с программой и ознакомитесь с ее возможностями.


Пред. Начало След.
О программе NetEmul На уровень выше От авторов
netemul-1.0/doc/ru/intro.html0000644000175000017500000000647011250230372015315 0ustar frostfrost Введение
Руководство NetEmul
Пред. След.

Глава 1. Введение

Содержание
О программе NetEmul
Кому предназначена данная программа?
Структура руководства
От авторов

О программе NetEmul

Программа NetEmul была создана для визуализации работы компьютерных сетей, для облегчения понимания происходящих в ней процессов. Кроме обучения, программа открывает широкие возможности для экспериментов и их наглядного отображения.

NetEmul свободно распостраняется по лицензии GPL. Также следует отметить, что данный продукт является кроссплатформенным и свободно может быть использован в операционных системах: Windows 95/98/2000/XP , Linux , MacOS. Благодаря этому программа может быть полезна как в учебных учереждениях, использующих свободное ПО, так и в домашних условиях обычными пользователями различных ОС.

При разработке программы разработчики изо всех сил стараются приблизить работу программы к модели работы реальной сети, стараясь отобразить в программе реальные настройки, факторы и случайности происходящие в сети. Подробную информацию о развитии проекта всегда можно найти по адресу https://sourceforge.net/projects/netemul


Пред. Начало След.
Руководство NetEmul   Кому предназначена данная программа?
netemul-1.0/doc/ru/config.html0000644000175000017500000002227611277100130015426 0ustar frostfrost Настройка сети
Руководство NetEmul
Пред. След.

Настройка сети

В предыдущем разделе мы построили простую сеть. Здесь мы ее немного усовершенствуем, для того, чтобы показать Вам как можно больше возможностей и настроек.
Приступим.
Для начала, мы достроем сеть. В нашей конечной сети будут задействованы все устройства. Вот наша сеть:

Пожалуй, начнем с того, что разобьем нашу сеть на 2 подсети. Допустим, у нас есть пул адресов сети класса С. Разобьем его на 2 части: 192.168.1.0-192.168.1.127 и 192.168.1.128-192.168.1.255 с маской 255.255.255.128.
Авторы надеются, что Вы сможете самостоятельно присвоить ip-адреса всем узлам. Это не учебное пособие ко компьютерным сетям, поэтому здесь будет рассмотрено только то, что непосредственно относится к программе.

Для настройки ip-адреса интерфейса открываем окно "Интерфейсы" (уже упомянутое нами выше). Выставляем ip-адреса и маски подсети в соответствующих строках каждого интерфейса. После нажатия на кнопку "Ок" или "Применить", мы можем наблюдать,как индикатор поменял цвет с желтого на зеленый и от нашего устройства, которому сейчас дали адрес, побежал кадр Arp-протокола. Это нужно для того, чтобы выявить нет ли в нашей сети повторения адресов. Если Вы все таки что-то не так сделали и адреса совпали, то появится информативное сообщение, после которого Вы должны будете самостоятельно разрешить эту ситуацию для корректной работы сети.
После того, как мы расставили все ip-адреса конечным узлам, у нас уже есть в принципе работающие подсети. Но только каждая работает автономно и послать сообщения из одной такой подсети в другую мы не сможем. Соответственно, на этом мы не остановимся.
Далее мы дадим адреса каждому интерфейсу маршрутизатора. Это сделать не трудно, поскольку действия анологичны тем, что Вы делали при настройке компьютеров. Но тем не менее, мы опять ничего не сможем послать до тех пор, пока на конечных узлах не будут установлены шлюзы по умолчанию.

В подсети левее маршрутизатора у всех узлов должен быть шлюз 192.168.1.126, правее - 192.168.1.254.
На рисунке выше есть поле "Описание" в котором Вы можете дать имя комьютеру или сделать какое-то описание, которое в дальнейшем будет всплывать в подсказке при наведении мыши на устройство. Удобно дать имена в этом поле, т.к. при открытии журнула для устройства заголовок будет содержать именно это описание. У остальных устройств тоже есть окно "Свойства", но их содержимое немного отличается. Рекомендуем их изучить.
Шлюзы мы задали и теперь у нас полностью рабочая сеть. Но тестировать ее работоспособность мы будем в следующем разделе, а здесь рассмотрим еще несколько свойств объектов.

Сейчас мы рассмотрим поверхностно различные пункты в меню "Объект", исключительно для того, чтобы дать Вам отправную точку для самостояельного и более тщательного изучения как возможностей программы, так и принципов работы каждого устройства. Конечно в следующем разделе будут более подробно разобраны некоторые пункты, но все же авторы придерживаются такого мнения: ничто так не ускоряет процесс обучения, как самостоятельное исследование интересующего материала.

Начнем с коммутатора.
Откроем его таблицу коммутации. Сейчас она абсолютно пустая, т.к. не было ни одной передачи данных. Но при этом у нас есть возможность добавить статическую запись, для этого необходимо заполнить все поля соответствующими данными и нажать кнопку "Добавить".

Перейдем к маршрутизатору.
В контекстном меню нас интересуют пункты: Таблица маршрутизации, Arp-таблица, Программы.
Arp-таблица тоже пуста (по той же причине, что и таблица коммутации), но в нее также можно добавить статические записи.
Очень важный пункт - таблица маршрутизации. Уже сейчас мы видим в ней 2 записи.

Эти записи соответствуют нашим подсетям, о чем говорят надписи в столбце Источник. В качестве источника может быть протокол RIP, установить который можно с помощью пункта Программы. В столбец Шлюз заносится адрес следующего маршрутизатора или наш адрес, если такого нет. В столбце Интерфейс адрес порта, с которого будем отправлять данные. В эту таблицу тоже можно занести статические записи, а в столбце Источник появится надпись Статическая.

Окно Программы выглядит следующим образом:

Соответственно Вы можете установить, настроить, удалить программы. Надо сказать, что здесь включены только те программы, которые могут понадобиться для работы сети.

Это был краткий обзор возможностей. Далее самое интересное...


Пред. Начало След.
Построение сети На уровень выше Отправка пакетов
netemul-1.0/doc/ru/router.html0000644000175000017500000000644711251015122015501 0ustar frostfrost Маршрутизатор
Руководство NetEmul
Пред. След.

Маршрутизатор

Маршрутизатор или роутер, — сетевое устройство, на основании информации о топологии сети и определённых правил принимающее решения о пересылке пакетов сетевого уровня (уровень 3 модели OSI) между различными сегментами сети.

Принцип работы

Обычно маршрутизатор использует адрес получателя, указанный в пакетах данных, и определяет по таблице маршрутизации путь, по которому следует передать данные. Таким образом маршрутизатор может выбрать один из нескольких маршрутов доставки пакета адресату. Под маршрутом понимают последовательность прохождения пакетом маршрутизаторов. В отличии от коммутатора, маршрутизатор видит все связи подсетей друг с другом, поэтому он может выбрать наилучший маршрут и при наличии нескольких альтернативных маршрутов. Решение о выборе маршрута принимается каждым маршрутизатором, через который проходит сообщение. Если в таблице маршрутизации для адреса нет описанного маршрута, пакет отбрасывается.

Это иконка маршрутизатора. На него, как и на компьютер можно установить программы, для работы сети.
Можно просматривать arp-таблицу и таблицу маршрутизации.


Пред. Начало След.
Комутатор На уровень выше Топологии
netemul-1.0/doc/ru/topology.html0000644000175000017500000001552011252512512016033 0ustar frostfrost Топологии
Руководство NetEmul
Пред. След.

Топологии

Существует бесконечное число способов соединить компьютеры. Каждое соединение - новый путь для данных. Топология сети - геометрическая форма и физическое расположение компьютеров по отношению друг к другу. Топология сети позволяет сравнивать и классифицировать различные сети. Выделяют три основных топологии: звезда, кольцо и шина.

Звезда

Базовая топология компьютерной сети, в которой все компьютеры сети присоединены к центральному узлу (обычно сетевой переключатель), образуя широковещательный сегмент сети.
Достоинства
выход из строя одной рабочей станции не отражается на работе всей сети в целом;
хорошая масштабируемость сети;
лёгкий поиск неисправностей и обрывов в сети;
высокая производительность сети (при условии правильного проектирования);
гибкие возможности администрирования.
Недостатки
выход из строя центрального переключателя(switch) обернётся неработоспособностью сети (или сегмента сети) в целом;
для прокладки сети зачастую требуется больше кабеля, чем для большинства других топологий;
конечное число рабочих станций в сети (или сегменте сети) ограничено количеством портов в центральном концентраторе.

Шина

Изначально "шина" представляла собой общий кабель (называемый шина или магистраль), к которому подсоединены все рабочие станции. На концах кабеля находятся терминаторы, для предотвращения отражения сигнала. Позднее в эту топологию вошли такие сетевые устройства как HUB (концентраторы). концентраторы представляют собой многопортовые повторители и не изменяют основу топологии, хотя визуально данное соединение похоже на топологию "звезда". Основная проблема в топологии "шина" - это коллизии - возникающие при столкновении сигналов в физической среде.
Достоинства
небольшое время установки сети;
дешевизна (требуется меньше кабеля и сетевых устройств);
простота настройки;
выход из строя рабочей станции не отражается на работе сети;
Недостатки
любые неполадки в сети, как обрыв кабеля, выход из строя терминатора полностью уничтожают работу всей сети;
сложная локализация неисправностей;
с добавлением новых рабочих станций падает производительность сети.

Так как шина является частным случаем топологии "звезда", в программе она явно не отражена, но увидеть работу общей шины можно на примере данной сети (см. картинку выше).

Кольцо

Базовая топология компьютерной сети, в которой рабочие станции и другие компоненты подключены последовательно друг к другу, образуя замкнутую сеть. Данная топология мало распространена в локальных сетях и на данный момент в программе NetEmul практически не реализована.
Достоинства
отсутствие коллизий и следовательно прогнозируемая пропускная способность;
возможность устойчивой работы без существенного падения скорости передачи данных при интенсивной загрузке сети.
Недостатки
выход из строя одной рабочей станции, и другие неполадки (обрыв кабеля), отражаются на работоспособности всей сети;


Пред. Начало След.
Сетевые утсройства На уровень выше Mac-адрес
netemul-1.0/doc/ru/mac.html0000644000175000017500000000434211245742137014731 0ustar frostfrost Mac-адрес
Руководство NetEmul
Пред. След.

Mac-адрес

MAC-адрес (от англ. Media Access Control — управление доступом к среде) — это уникальный идентификатор, сопоставляемый с различными типами оборудования для компьютерных сетей.
В широковещательных сетях (таких, как сети на основе Ethernet) MAC-адрес позволяет уникально идентифицировать каждый узел сети и доставлять данные только этому узлу.

Каждый интерфейс имеет свой собственный mac-адрес.

В диалоговом окне, в строке "Mac-адрес" можно задать новый адрес, но по умолчанию, при создании интерфейса, ему присваивается уникальный номер


Пред. Начало След.
Топологии На уровень выше Ip-адресация
netemul-1.0/doc/ru/ip.html0000644000175000017500000000607711245742137014610 0ustar frostfrost Ip-адрес
Руководство NetEmul
Пред. След.

Ip-адрес

IP-адрес — уникальный идентификатор (адрес) устройства (обычно компьютера), подключённого к локальной сети и (или) интернету.
IP-адрес представляет собой 32-битовое (по версии IPv4) или 128-битовое (по версии IPv6) двоичное число.

Маска

В терминологии сетей TCP/IP маской подсети или маской сети называется битовая маска, определяющая, какая часть IP-адреса узла сети относится к адресу сети, а какая — к адресу самого узла в этой сети. Например, узел с IP-адресом 12.34.56.78 и маской подсети 255.255.255.0 находится в сети 12.34.56.0/24.

Arp-протокол

ARP (англ. Address Resolution Protocol — протокол разрешения адресов) — сетевой протокол канального уровня, предназначенный для преобразования IP-адресов (адресов сетевого уровня) в MAC-адреса (адреса канального уровня) в сетях TCP/IP.

При вводе ip-адреса, автоматически подставляется маска в зависимости от класса сети. После нажатия на кнопку "Ок" (или "Применить") можно сразу увидеть работу Arp-протокола, который проверяет, есть ли в сети компьютер с таким ip-адресом.
Пред. Начало След.
Mac-адрес На уровень выше Руководство пользоватля
netemul-1.0/doc/ru/hub.html0000644000175000017500000000536111250530163014737 0ustar frostfrost Концентратор
Руководство NetEmul
Пред. След.

Концентратор

Основная функция концентратора - это повторение сигналов, поступающих на один из его портов, на всех остальных портах (Ethernet) или на следующем в логическом кольце порте (Token Ring, FDDI) синхронно с сигналами-оригиналами. Концентраторы образуют общую среду передачи данных - логический сегмент. Логический сегмент также называют доменом коллизий, так как при попытке одновременной передачи данных любых двух компьютеров этого сегмента возникает блокировка передающей среды. Все компьютеры, подключенные к концентраторам, образуют единый логический сегмент, в котором любая пара взаимодействующих устройств полностью блокирует возможность обмена данными для других компьютеров.

Это иконка концентратора. Он выполняет все функции, описанные выше.
Возникновение коллизий выделятеся подсветкой кабеля.


Пред. Начало След.
Компьютер На уровень выше Коммутатор
netemul-1.0/doc/ru/intronet.html0000644000175000017500000000660211250230372016021 0ustar frostfrost Введение в компьютерные сети
Руководство NetEmul
Пред. След.

Глава 2. Введение в компьютерные сети

Содержание
Основные понятия
Сетевые устройства
Топологии
Mac-адрес
Ip-адресация

Основные понятия

Компьютерная сеть - это соединение двух или более компьютеров для решения следующих задач:

  • обмен информацией;
  • общее использование программного обеспечения;
  • общее использование оборудования (принтеры, модемы, диски и т.п.).
Соединение, как правило, создается с помощью кабеля, но существуют и другие, более сложные средства.

Компьютерная сеть – это совокупность компьютеров и различных устройств, обеспечивающих информационный обмен между компьютерами в сети без использования каких-либо промежуточных носителей информации.
Создание компьютерных сетей вызвано практической потребностью пользователей удаленных друг от друга компьютеров в одной и той же информации. Сети предоставляют пользователям возможность не только быстрого обмена информацией, но и совместной работы на принтерах и других периферийных устройствах, и даже одновременной обработки документов.


Пред. Начало След.
От авторов На уровень выше Сетевые устройства
netemul-1.0/doc/ru/build.html0000644000175000017500000001520711254745330015270 0ustar frostfrost Построение сети
Руководство NetEmul
Пред. След.

Построение сети

Есть 2 способа построения сети. Первый с помощью скриптов, но это не интересно. А второй - самостоятельно, приложив свою фантазию (в умеренных количествах, т.к. нам эту сеть потом еще конфигурировать). Вот именно про второй способ здесь будет идти речь. Ну а для тех, кто предпочитает более легкий путь решения в программе есть пункт меню "Скрипты".
Итак, приступим.
Вот мы запустили программу, создали новую сцену ("Новый" в пункте меню "Файл"). Теперь на панели инструментов выбираем, например, компьютер, и начинаем расставлять.
По умолчанию, у компьютера есть только 1 интерфейс. Для того, чтобы добавить адаптер нужно выбрать пункт меню "Интерфейсы" в контекстном меню, либо на панели параметров. Откроется данное диалоговое окно:

Затем нажимаем кнопку "Добавить", выбираем тип нового адаптера, нажимаем Ок, и у нас есть еще один интерфейс.
В этом же окне мы будем настраивать интерфейс в следующем разделе. У всех остальных устройств также есть определенное количество интерфейсов по умолчанию. Но для того, чтобы каждый раз не добавлять/удалять интерфейсы, можно сделать собственную настройку начального количества разъемов. Для этого в меню "Сервис" выберите "Настройка" и, на нужной вкладке, поменяйте соответствующий пункт. Кстати, стоит посмотреть и остальные настройки, потому что они нам тоже понадобятся.

При выборе какого-либо инструмента, он остается активным, пока не будет выбран другой.
После того как компьютеры расставлены, поставим коммутатор и соединим каждый компьютер с коммутатором, выбрав на панели инструментов иконку провода.
Для того, чтобы соединить два устройства кабелем, нужно выполнить следующие действия:

  • щелкнуть кнопкой мыши на одном устройстве;
  • провести линию до того устройства, с которым хотим соединить первое;
  • щелкнуть по этому устройству кнопкой мыши.
При этом откроется диалоговое окно, в котором надо указать какие интерфейсы устройств мы хотим соединить. Если интерфейс уже соединен, то он отмечен зеленой галочкой и не доступен для выбора. Ниже показан вид этого окна.

Внимательный пользователь, наверное, заметил кружочи различного цвета в левом верхнем углу на каждом значке устройства. Думаем, надо рассказать об их значении:

  • красный индикатор означает, что устройство не подключено;
  • желтый - устройство подключено, но не настроено;
  • зеленый - знак того, что устройство подключено, настроено и готово к работе.
У нас только у коммутатора этот индикатор зеленый, потому что для его работы (простое повторение сигнала на всех своих портах) не нужно каких-либо настроек. А вот для того, чтобы наши компьютеры, подключенные к нему смогли работать необходимо их сконфигурировать.

Ниже представлен результат нашей работы. Надеемся, что Вы все таки попробовали создать другую, более интересную сеть, отличную от нашей. Далее можете сохранить шедевр, или сразу же приступить к настройке.


Пред. Начало След.
Интерфейс программы На уровень выше Настройка сети
netemul-1.0/doc/shareimg/0000755000175000017500000000000011305026146014441 5ustar frostfrostnetemul-1.0/doc/shareimg/comp.jpeg0000644000175000017500000000331711250530163016250 0ustar frostfrostJFIF``C  !"$"$CEE" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?.+s ivsy=nYcUYأ)%Q\g]O?f&vtWS.I3@{;O.4 j7Ikcq47dRފAq_zfid#Bl1Ϙ951\QT)˟QKIm|KIm|zGgEP\_ȋ⿌;eOOVdzҰOm+2[}0{{crB Sl$d ak> ,LOLG5亏L`WO"@?u ??4kju\4*J]'վ x7}sU$駊2[\+$펄h' :?57BҌ6;)#A,pI5|VYHTUI$hZMs->?lÏ65dLL 2u'Uh u VeSigEyt sº%t/k=j]%7FԌdMPӭ0“FHEP\ xݠkWqVڸ w gƣ .i$L,[>hG=:}!/o.ۥ;l0{Y”aPpYԙm~ g5sQ=VVxZ*FKk[}׉u OO[F+Jʆ%k'mRׂwd"W=8~ȏ6E-}$⍚(;>?ƥ Jl׺OтA@YTgҚl4M8(ǃQkz$%N i/myutCX:=}.Q>c )ErN㵟 'BCebGSoK}w+O¿,G"~gEAZ2htiQL~|k5׋17`Vz/ ܋ 1mt].^& ]l32 O? г _MWbhYv8҄6G= >o :fXꚾk-ܤ\UT*B$um3@Ӵpik ã@(tm#Lv}7JgfHC ((((((netemul-1.0/doc/shareimg/hub.jpeg0000644000175000017500000000364011250530163016067 0ustar frostfrostJFIF``C  !"$"$CED" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?.+s ivsy=nYcUYأ)%Q\g]O?f&vtWS.I3@{;O.4 j7Ikcq47dRފA^?ωѯ]N5d$qM(ϖi&d{VAr\mJ]b"vfyB ܒH[i" DVqMjSs8ɭbVZkgMNn:)4ޖ(D's5y$ףWG^'MkX k`f3yreۂc:uW|ao%xG/uOo{/&GW5{{GcfvtQEblxKJ?D5vuxKJ?D5yΙpܺI5v'T56 }WBw{WvmQP掫Ozۻ]tӱaB*OGk=7 Aj3[(jI3'%HxyI·bzdm3<̰}iGC^ aA <pip8`\~n6wnI;G{kaVsj~%Yw=' ͺ9? #+?a/jp=%!p BLM d.C)>KIm|IZ QPh\+CYhH܌? +ҼC%C k+67(t 8VʜF@nI2?Pi[e|nEJ(ʿ}+_|gOƫ㏣*8FJzNl>8ym5j>-ýxci$msT5τ^*f^'Ѣ2lgI%U˄+6FNs?4Siד-XVB1SI|ߛ]Y5vX԰TD Y.XG|wE(7Q 3F$G#;H?ƀ;:+_#fw{t~a@[Vaf [\J RmcҼG`r\\JnQo{i+t4Ыrc8AYFѴV^|QI>ȼrtmmCa{ߊѢ`Ӂ6eȯ5a L^UEޟS r NQue#grK^? !a urQsAe{7.(JJ0']4J6tՓ<3kׯ0hκ9fU!~S JV%5G8͸ we;ijf́A:~ ~e#;7niBI[EjtjarmkwӖ6󓻓Vq MSo.v=R`wg$ET8>ala.#C?ssaW}X&L, d)ӺI3mrV4@ZuRęyY[O]| @/Q^nZq-3ISIy??,!D?م9'F:o>h*׵q&6=ƫ2ng0C*­'n.UMXLzj<+ˡG*mk^ueBWBărI{9 V @F@+'ERR-V3˺W#rJ8H((((((netemul-1.0/doc/shareimg/star.jpeg0000644000175000017500000003751511250530163016272 0ustar frostfrostJFIF``C  !"$"$Cro" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?.((((((((((W^+?MK_s>$lRO*8+.a 1]O?f;:+RgLSΊ?ԙ5xŞi;wW2y3k$?693c+袊(((((((((((((((((((jz8OhVi,o&2eIJ:cq|}]kI[?4c{}4S ]q垻rml/&GT?>7V4  u%G5pI:v6E8b#Q>Rk+hvuW'8<\uotS|j2缾|JE5W%G%Y$l9̀UUJ\J4! >umOXs4yGu;J 'k$W>:c<υQC_L5c.zvtQEdjQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEqiGRYS 2j/_L4m~-ȧo tS?CMHAeFf%#<."^Dc`01?:x|? rnGH@e#cμƶ5̲8’Nk"8# I$v$>^sCL5cSCށZ[&q&2cM DW⺿L5c ɳ֦Ί(,(((((((((((((xYt.]OV[kXʩb 31 PI$ W 13nd2}? ԕ?T\g'%xԕ?T\g,hje$.}zǁV}VXѯnH7Ri 2nۻ N3cWNn芐U"-j Ys&G\zY?rzꮶZևwIZE-=ut=O HNjI"2j;0F##o#|EZ& ΐ\|+m# @85㏆GyB[f IFlwϜx\[ɣm +gu@]p2::j+k~g^XU*sMrɥOz|H]ltu jV_t^Xhb8dx8~S9v4s^].i-.gvT%G|Ħ+5 H0kMz2q8}\_7"k+YFWi\g?CWzgEPEPEPEP~CM^3趥?xwiIO7xڗd)E0=*(EPEPEP@&[y@x!%Uo>>|MhVZ֖KyvЯ l6p< t^- N_ xSS#!Mg{-K$ܣ 6;dJ3ںrc G %fgjh>"ѭ@XgH.W>Z dd%1OԬ]y4zmXEl@( NAU4ҵ=BF';;Vl@^{ųG5p06ExRgLS0r7ig1x/T>hwtv:p|1/1޽&/{._o܌2>;!U`ۇ5>t+k.Q5jΓj 8 $; ( ( ( ( ( ( ( ( ( ~ ;En4]j9 ˝? F*(_x^|^xNP~#g Ӆ~~ӯ- (,Yw#b|AvhլsE*;s:~@ |x/k JO$l9cvp `+* :Pe Wr:((O{HoԿ'Oל_-)?i!&[R̟E<;^q账QE((7},0Dfoր FOe,z˾/>#&5 B6ǟ8{pNjG?/FI#k)MCPㆎ63g?7?'ö.k0āIUN|oۍZhBnOOzxCMy;Bi'<,nN c`}UEA^[jQ^Y̳A*G^zQ@iO7xڗd)E'=$?7j_ٓH/(U}FOe,zR^L噿Zw#|#$~FGnp3G5me)j[ɖ"\7_.~#d65~8ha?@s/>#&5 B6ǟ8{pD?~-p%W:dI4>?EOm]8a2y$hQ@Q@Q@Q@Q@Q@Q@Q@q:i}fE4x$'nfyX՝XF nbNڸ O膠? gؿ?oڶv wOjw[T$zƿsőg3~?sD~" 7$zgRhynֽ{5&9Y)'Iũ4/oczҏ?O^g #◈5b]%!A6ii3\HcUEgr+|H6(Ɛt ;s]sE/c(n{LmbiOx+ӥջ7e6L=lt`ks/4q%v@{{ⶫ%$H>J;Ί(((((߈>|oۍZhBnO֫~=*=$b;xh.  qdލ&O$@PPaQӨ4k-GQ,ͦެ3o)#9+|ớA{jOIt?1)0\1}p36+KhiScaӥ |ע~lSZĝb K k MGx[z|OlPB"*0H-Σՙhֶ;F +ўvReUG.x\K7MKBj+]·ױ\=LJcWr  ɯE֢ͥL1 f@r{q?{7næ_N X֠QK~?EOm]8a2y$h(((((Zׄ5=qm%v,B{F{f7"mp1{@*ۙXo _ ַ?#KӟXEuV +reZӔf*J)T\Mn kO|\mo6mwnیcg>mu~!J }鷶h%4umB%ĞK4~A pUl4kUN-lqCR|IM4־ w-V?Mu#$HC#;yO0~ W_xtV!-$:uML?7ODr= f f Sa>?7ODr= f f Sa>?7ODr= f f Sa>?7ODr= f f Sa>?7ODr:r~ϖ&6V9^WL(EF@+ٳO$ ~ϴڅgN@' C2+(G뭓kTZJ4TMWwS\_08 k>,]^(I *Y+yLqcEp:tk ^6ңPW " O:|FIلp)G.RU{u_M=m*Pud?7ODr= f f Sa>?7ODr= f f Sa>?7ODr= f f Sa>?7ODr= f f Sa>?7ODr;^%nvڥH`ܓG^_4xsO -2u a-4t.GJ^5DImDb#:Ĺ-B/k1\5Jϖsd s^%Jirn#^ץOuz4/# {վc''\wV%z? {HVhU731,Y~332NW4[Ji?yqiGWo;L{II{iGA$~iw?RȽX<&'v.P*[qPt=Q@Q@Q@Q@Q@U}FOe,zxU W-6u{sߟJ7oxᴾ]\[G2HeadH+f8agjvQ_-1ЋRR[i{]Y?Gu{=g-I)nJv&t#6J^k5榑ܤ"݁:88q^m[E$V^O2Y~qg|6l>}AA@20pbi>=vd0xLI& :/S~-9t * RRGg-)f v߇4{HNxXݾ+8ymYEyg2{_vE֭c)P,۟`kx^|^xNP~#g Ӆ~XUQPiזڅWs,J׿^EPEPEPEPYچhѴ빱2{TvԌ֍Y/&D+B΋15Ec'_t_? г _Ml@[A $qUQ((((((((7},0Dfoր FOe,z˾/>#&5 B6ǟ8{pNjG?/FI#k)MCPㆎ63g?7?'ö.k0āIUN|oۍZhBnOOzxCMy;Bi'<,nN c`}UEA^[jQ^Y̳A*G^zQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@U}FOe,zR^L噿Zw#|#$~FGnp3G5me)j"ѭ@XgH.W>Z dd=Zxӕ]vsԦyB˪ygʏOJ *&%1OԬ O >ŭp(p skXY8r=0@U4U4EbO 񇈼Ox;}ZSt294 0O8rG˝Uq lm<`<FS? F Qn>&x f$M}:níPX?~)jss5w7]+#MĜ!%#q4ZҴWSW,Vt_ԕ?TRWWU C:mZ5k]2>` \N_ I^3_eG,aGc_@VU)SgM=&nmd,ee$22 U !xȚ=Vo~VfEPEPEPEPEPEP\gBg\gBqž1{{#@Yl "7(r͎q9]y4zmXEl@( NA{x7|7 I+!YvoֻrqR4癍#(wi~ms^].i-.gvT%G|Ħ+5 H0kMzO='I4 ҀWhSb9-}\8xKJ?D5vuxKJ?D5vuvQ@Q@Q@Q@Q@Q@q- ]q.Pg^)q{x4dPѵ N$՛ :Wv NݿSC$v-npy޼֍'/Z*)c`1_DF8qz_tIץۧz}ًzxCӥH#ӅmyxIZ=#)\<%%?:<#%? rEQEQEQE柴׌-fO"8ZR~CM^3趥?xwiLJ)QEQEQExJD-vuxJw]x_\Kwy|IynZJ۽z4dPѵ N$՛ :WGlMz\ |kJxt2]_yíO^ US9@b8y#sq'ڼb^i}oŞ tRtwDb^c={y%)?{s֡qp ]qp:((((((+ >:ͧjuڴŌIɵBFdvV\ (E|Ir.I3]3&hRgLgEq/{._o܌2> KuMFZF#ڨ'b*"NI%QEQEQESR1MKPG8Vc }T, /EW J4뫫"YrH;#DQNX4 cͦi:wgX/4O<e2EKT[DB2QoWe~Ҟ$okSR;٘mK6ö?ֿA*ZD$X-zjWZ;!htvVAȬOǿ tLjU᪭fT=7 ͢t_U^u=7SG}7PD8fd }I/hZҼ%efޛ 8  [^xwD_:]W:Oif̋$2mz29 ifljZ(Š(( /|֒Z6ij1'&B ёYr2 2qQ~_3c\}8dk8&u?Lɚ3.I3F>*7x2<˗#?LvtP>t+k.Q5jΓj 8 $;Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ixxrYaPax88\?jo]& I|)o?U|mayV4vtQEdjQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEqiGRYŸ_iGRY€#]8?BE-|''?xWqss\L\8MzΡCeb-WPm. '̘2XVj2'8i]{>_'^Il|u{ G4 A'} ē1/+;18T~60zVGgETQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEywx_xgWtخ&N#I 49PutW `$w[kȼasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATx}y$Gu"25F"̲6/,kX``c|,Y'e$`wA 4H@HxoȬk`Mk*++/#IDxuOqjǣxG >%#|DNxe7OA:anA)"-M "y̋dy/Py#))R_D7KɞӚK X @z9 E){_ Thyi( W/)[8- s\ `|{^!PN_}qJqkBg` P㤣W/9qZY <@k7T 'FX skgϫ^(J>13qJ {Ͼ ⾅ L&ELAGw)&Q!cHdO3)̈a6D_E_)T %{R]={ eSB{OA܇X JPSSTE5c5D5@R0 3HfXA?͸fMn}3S+:` T ׾}{I/(t޳orc}8\%(E7"њң ţ55DD)@!f5h[ Kƌ駙t}sxku\i $0E߰lVP$@@E߹u뾽S8ؽgc[b&MLjEĈ*ST $"`V 8Ub 2c`iwzpkgsh.*(0L@X!0Qk|wOZH8iؽgcy/ hQ# TM%SMT܈I4iMt@`gW1. 4",H lIcXD|/僳tv6=3Y d ,DWDя?U`=pe+}/ % M6ukSu(N4)`'YDOK*hW7(, c 2cMyѹv6sf^qē΋#_TosB'{ kRxdmK'뚺6Vn!"",0b]YDi)E8l|?:n^/cjgH_@(P/YE%5|Yehy>Qp1ǯ@H4Um}K&:nE$\9a'6;+6@$`^srE^@1nwfsN3#K{>GRA@AM!B* _mW9{X! VD5E⑳֦Ѹ>^SI(E^ ||` ZzUr%p_+@Y@=Ν?]/}^}N\OkBOMjmqcD@< P u|WcE 0 + >)H '/8jbjpW- RD#57Z͉N'PG9;Bn\){] a* I.K$HJq^(w@YS XW}雟Z \m cQe,n$G|6Kħ~\oS8 A8|]A 1`7`RE6QJL/=eO0 P}Q.{w? oZ VˬFk*2ϘLFz+HZ|/juwwX_a!8`|a0\~8,KJ~H0Κޑ޳7ܒVB7EqsmS4s`K~J ]*(אB[%C/¸_}0JE_'?(m茋 Njq5sb9$JojǓ暦5xo8"._̫x"bS:$>#`K8S"4B1$an{ Dql@Dx9z|Y/zx=fEVѨc7׵Z=" ),ˉE_-70auC9X),I[d8ŞqJ->7mpENJ1_׺ idX\_ߊj4y/| "+ vh karùc rY& ܒCѷ Ş0ESLpon ^eXhh\_ߊꍘ"zL8틔.Ns\;qA ka8dE kEk8"$T)Z$$P$J`o=>WE9y:*́7 +&hyvqHT0Z]O8wD 웃Aa?r7/l-(_qçD("JX+UǑj&Z7kn&QTEk]Oj$GZՒH#Md~UU=U7,WDlQ|\z̟5XE)ͣQ}H5|@6+mJ(,Bl8Ev8VbM (,`-D- GJLRQG#^j k5S}ACa>+gla r+poZc]+ϚJZ[ǣf+V"U59$٥uun{0b$Vi&H) ʻư CC,n/NstfCחN/i1S^ E j:t4ܼIstg+kk[ֈVB/ڋ?_$%_)ZA{ROH# 6d(jb"THr#a#blv/4*3 |T$L޺\@\ z~x]3JFbi]/hů_aD^E.h_kEDC%&UR[I<"L($sdݻ%FմZQ#T=VkiEںaE\03*h!MD&ZX#MII+QS}"#' :~DYK[D]Gk:iJ{V.^qb`½vѻb 7V b+Un:ZմV@J$<![]a20C)E"B)$VIIȳ,"J@c)P:{hمe~Kxy_ҵKX\>"쭇`źŜ@KHTմҍ$X$"HbD1/`Ͻ66,{V'f(M@H) 0 Gc/xq?7Ow;/~U#<۲TmPzzԛuy9 (HDPьZM2W#Қ)ՈnԴRqHFxK5aW7qY0Y&0ž޺w%XIoǵH).V,!|} {-4y*l3E劅e$"5^H"M`-+_^BbXA>3-4 bq[zv#7w(HiMkžy᪅Iy.WK=6!ֱɯ>隵gO=Pw_!nsk:_ֹܺ}L\& naEŞ@?}Z?}x璸-Up[n\ M5(޵6imZ͈~.Ybl093JkG5: \$H _}_6.}Vu+Cfc ac5`$3gVZO"C:qfwn͛Í&/.H=e}Ew}Z x ߷xGcy|<ml9J]]/TW@((rxB?1v{guf@^G\c߾?c~מtzAuwڝ#+2@2l[&+I?_s~;7Sa!Y0<a80sx pR/ %H)Ya㛀oּ0Զ#DATxP򻀙m1 07AC8bߍ1Vj٭gvmA<1pMc ;: ѬOk'9[7]]_}mC[􅢯tPZ"3N$ Ԉ)59W6pF_㒏NMG[j:h9B 8Îך_~AxCA |&vn #cC6B01{Mq^X7bGOհ`8xH>SlnwŗΜ;bHd={BKxOX E {Ͼ5.uUӢka A M|pꉺjGP @zA#L@v" @NӺ(+] ضyxn&fÆp>[- AȆhr'czR}Zu6gc%'"bhc"`wMLjEdc=p#vqȽ@`Nx2R5zXfB`SAg|1dlg So&R.XʕHвMȅ+wϸǴ}%'us0ԯ~+3R JdLsb-E- od+)`={k[~fvg = }刚 AkE  Zkꩆ 5MhFGS91G#f>o7Rf#䶑A+*uFGƺcA(p^v^`qUO+uv?nlS;E]34ƾ {v>e3#%Hz4{Mָ#¨Y Qhټ1QO7G=US]kC<çm2OL_3Lws;:Gb$]m{b< |8h8]6uf6h@LA:yШK|xC#򟷷=n=3oh)5BL=J xE +.ͿskJt{Aݽ|lջʇ`{brS㮺u4ZwpdhB ig.><յ]O^%sq~ swOAϔCwN裞eO?zS6w| ǯ>Zw+.`%p}>ε&͓ZOް͏yuEw߼7>/nfsH=@^ }Hxڶ*VFcH3bMT*=RK>_w0@vȞiHGkx#l@>k\pi,y;9lYBì>4$?휹Pd셭6`.X2qS|Ͽ\o΋yr˧@?5yWon j"pcC@->̗q|hCWsv-5dwᦁRv, A Y ~n3]9 ~x]Rπ X͙X`R.No7ٿdW@d aRdVLϜ 4ukgL}a,].M{lA]lx'`Gajsukg&@ Hp.uvGH>&[Lbƒ 3%w0wg?H:{`Z W%~E@޼󵏿plzGؓ.r?'+;W0VO8WT˺d%A)pcr@㫏eP-%㓂.ttl;΋O3;tQ@5矹h}9o968_e3Й.7{wփ`ӭ 홲q(\~) !؅) n9~ְX`@f- gQM5\E6 ?לRss,ȠH5]y~7[ϘlEmv`#v{YSh\oX)~cDn2ȫzdyO^ \!^g,c&Esy_)TԒO9w>tڕ-H:X2%zrK+9rG({ ^G)"wLB^Y ^|:êvF?|H ʵ?m_&llS[r5EĶO2gp`Bخ$HS^7^/{+u -Ld]1;6q ?eD?lC+'8ew1}$n=ajٝiz֕3+@W-ڎWIDATBOѢ`R}J_?x3a7m ;`61g5˸/fmklU5)\5@]so1Q$BDD@y YO4"B w/d}8 fY k3A_2 ~&jm/>>ac5 nP#+&DJ-S"[fΙٷ|lĎ2J *!﫫,w@+"aӶч-㭣kƦ㍣#5օ{m,@>g48߬[53'}y}nt}qʿ18۟*#KTyvMW s^P+ `{#o^x\i_N:ܼua̻ 7ڤqáǴ/]c/qu#uR.QU4˜k,$BQ(AY ÜJ K0=m(Rgz|㩢 rp#1.X}㽏ʵ[[Ż  HJC^ ]3{gwۯ(Dax!HUYLНj{zw<ҝWo<ks_jz3 h7 ah‘o 9bE"0irj2d6db2C1&2!6;11vWYH]f'<E1MṋGR(i4;_Wm߻/1V Iuun_r1^wсo/"[핼fɅ( =O:ٻ85w41-{ĪrsA~r>bmfcYfw^0 A"naokckJFppV/Ѻ0>͝a_- (6¦>sx[_tr˺ _G#}ێP"[Jܗ|CJ;:Uwll{ I7$pu:)6_o,3vt|KZ+%o`㾱@۫l%~/<5o{St[?r๵ogw_^z Is, IH&6|o)|squ<yx(D)Y'?%wK-cGj#@wO2M?~$3FSzDD%Vy6tm.W69=HfI?k'<7Lt.vw62'r`VB(r܇p5U \E_F CnQV74hOxǟǭo4K* ]xCwCH so3- 얳e D#z~{+hʉjhuko}|f8|sD@ n])o/TCCs>4I we ;;o}[ǟѩF;G,zwV"ngR]ao19! 0&\qu>c DaǰtƺN2mɦ~Lˑo~Mu9?/9x"V %e/P~ &7so>n)lG|"P(sʬ?kny 4K:]'H)H Z"ep w |/왃RD.^Glw>\3/ V#rt^Ý[ fr->P(,_؃粶fǗr7Dw [@K- /ylelY}],)ݵP`}>0d2_!dQ$'{m2LL]Fk .E=RH)L.xIx8Mܷ~mU } ^eA5cgd d/ 2[̺`,;F]>&:a66y}+*xIQ_>r]fфk!bOኆ[LU 'ߓ#M ĺw `mHb1|*(v1&{l Gy!yݣTg8M}-}+( dsXº| ^;3n9,-J8!HJ+Ƒ@l`7of{.>kdL&~Ȫ+Y [jpc(DFE5߿\XWw<_1+W,| 0T,p7.HQ2~ڗ4͐iJʲ Y!c#3dYV6h,[ 6@%p*^ajn9}t `ϓ?&"-\uȊ+tc#w>g%2Kũc1P^ 7j* !iE!/.c+ >e еF7zJ ]G?#R_i -/r7 $d~uϋ֩eVY =RQ:X{g@{6?[ҩ +&+^ }~%,}1TE6h.J_hRlBчB r/qc_?W p[&wyŞRP1K JᎍZbw&}A*7\a VdAky+pi}%CuJ=q/0=c;/!~# ~A<8zr~bo=9>S_׏c"uoi\SX)&fp9`_˃=R ժZsd C8Xv"c/Hu3.x뽟|nx o:)XB%W '@*!&E@xg[bO%# ;n~+cN:z'D'S" ;cKZ ߕGC:2-`x\K(d{J{oq!+* ST+Yl89~/9=fJKUV*qOtTzX\L~Ⳬ#RY&\Ucسg aY/u g~-_{bw\ ?H\{Hpӕbς+|Zʀ } @Q[vg@pc/Vqtk[V {yNon: /x/)TDߪ{Dʋ=D2Irg<ح {T\ꦱjŞZNbOY^Lڒ/<m7/}PŵJ`'v=ӦS}]q5yVU%|WCE-{Er^wת(OEu% SQpYg qKcgN7jt}5me=TEiV)|kk6=zϼs_vJ !ׯF_" ,,·bOuviS>rr7e쬋~X'pӻ~+URג%W.D_+,Q}\!p>lWS>=km=O$*U3};ߘ|QeܢxAYû݅~u9 NP= .(^PIT΂}d/9Pۮ?c0q9Tbpї*,΁H'_v'}<_}O9-+ I\+q?_cSIO /0< T.fLi ;_y_?ɓI~ܺuN>_K{X;m=74'O6)ҷz> 1&) _+|YC q?<(=W>Apj OLGb:Ob"oEE˸B@`k8vq777ǵ]/3_o5oZ\ 2pȵ!bϲnΌl[_~jg܎ӆp+HGߐX8kP^|{@UB@Ms Ir[Og}N89/3졋9KGb=IHP +,H;{T\6D2/9NKqK|݉bڍMg4>VgK߬9KO0my"De?$WE_)/W-ˢ}.25[nMl;]k|kߗy[ @8ξ͓Y Yegb _wwmj'Ļ{O;7#@8z76l~ ;~hͼRW:F;^ԚB=|x*yH:vw~?r=:gpt6pַ7 KC+^tZ렮5R]*ߦkS7"B㌋kd<)y\8cF!(5Kf@4CQRs?AG/=:N(Q<ǣxG OIgIENDB`netemul-1.0/doc/shareimg/ring.jpeg0000644000175000017500000003341011250530163016246 0ustar frostfrostJFIF``C  !"$"$Cpq" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?.((((((((((x"\Kof~.n.nѴYVڡI+,3ZwQgEq7Q ?oA4\g#;H?ƪ.o=k[G mqj$ufRU3.*\n6(((((((((((((((((((((+3oؼo<160O3ebao _ɭFz?Ί(B(((((((((((((((((((I#FyQTd+>'|t_ȴzCij H{UoPCKIm|/Ń r> rHarAfZS.7~ea$A=23_>|X7:xǵz-H".`bvl7S' &$8cNSI\/ؖO3jq@$W?>:'q/lW$w֗@$gel=z:ȁѕCEAbEQEQEQEQEQEQEQEQEQEQEQEQEQEd_WQ\K > ]RHBg+2u=ՔxEҾ~>/LZ?xW7}hv7X:.1^k3o?suP&p-?a&7*˂@qk˱oQʯ}IHꮅC+ FA ~:x/ƙ_nZ]ᕰWx5h"FVV Ax/Ƹ6ٺ|wjLoU~חco/{ _d?˚`}IEy_ m>֗@$gel=z:ȁѕCE Ve9.y7u3dq NIfb$aGĊY >dgMvtW n/9@E'?[(K7É5r~PgEdW_V\[oukr&pZ9H!A:QEQEQEQEQEQEQEWoPp?]q- @Wů,w7<9>Gce ܲZpdi],G$V|?α,5b;#]ԯArNU_z|U [y|I7U"W*U<r+}='EuaYʊGkHaxsW}fZ慕d~zxቧRmռf*lj'5߈| a#g‘9w]D[hڲk8($'#w%ş M)`$㟾W&WRExG~,߬lK3yI$Ӂ+̴ h:ƿkZ 6(;Tďq+=c6m6X|:`ܲW1t,u99Cܳ6K} ǰRET@UF ZDUDT`0((((()UУea"ω<\]ON>a&7*˂@qk˱oQʯ}IHꮅC+ FA> !ou)$-m`k'4OiCw,;\@lc $y<+_V?β|UYxNKK.-e}Z̹ $m#C A֯%Owi9gFDk°;ƿ *:mOPA D摎9,G@8 {WU7↫-GZݽa(4h.GbNq{bYҽa_ֻjݏ6|Fbq?]9;׼1!NqZYIJKrWccgwQԺ$(=;:gҷ|+YxwN{KI..%f}]L $BfnkQEQEQEQEQEQEQEQEQExfn=kh^"ӒKy`n-ndֳ.B`pHH pFQɣ[?R039OzΟcvtoF,+|Fbq?ױ;(DhwQL.WgpQ?g?z5}w>)`+K4RI#IyP c9LEy4ߊ:OuvwHѢ9}\xgΡ?ΛBH "lTnTcʬz>o9eUمH":e9-$yu3`40 H(((((((4iXߎ up-jr;{wyzyisẃָ#䯨UQ*pyo_B ws#O$6WEPEPEPEPEPEPEPEPEPEPEPEPEP:,Xa_.3%<;~/}I^WMxOW?d>VaI ܬ7z+0eaAZٗ_97C3mw u;YHmS(((((((4iXyisẃָ#Pu_ëh)fo]7SHb}'Ҁ=IQBREQEQEQEQEQEQEQEQEQEQEQEQEQE"2:V`GR@-3%<;~/}FA+?ii1si0u; Z_ٗ_97C3mw u;YHmE((((()$uG`$-y_7B\ AꚆ-!j@^g_D`uhy+4UDTE 0^[3x6EHw3I?MtQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE"2:V`GW˃5IcO+pu_RW^baFw+@?M޴h讌Xdx"e&m; ]xhNR;`>}k((( Pڮ^&SJC2* K1`pkۇj翱~ S4>/ٍqV5 'Te.m=-Օ̄1_gp Sg ϱ?ʱO^𾡦j5u5H8)gb8ܛqr(2v5k>Zw׮1e̷}.q,FnݢWmc05'sᕆA>*ǫ5'$GLc$¾vw|?ҭOBZ+RhZSR9>x7V\>[\xB0heFR;AU*[=q- ]s!EP\g?CWg\g?CPQM|ǦxoZp qjRF }9Mxv2-{Ʌp6)dץ_<[xz?/z{{7ȚS׳1]d?UE29^z 0?:> 0?;:( ( ( ( ( ( ( ( ( ( ( ( ( ( (8ύL5cθύL5c΀rlʽ?eNϧx^ڥ_ŲI|eG|0,Y:ɯ~8-AZƲHy̓ӻᗅOf W&.WՂ[?ſSo!k3ſSo!k#(+ۇjo? vkVyŬRʌ 6@;-o@'kĖ;9݉\:`J&h^uȥX}qFW3s|]6 BքiJRg i/\3/^ xN;]XO\{C&;h*Z@7V|t~,tK_閐ݡs7.XIujEƗMd7Qu2+V(((((((((((((((+u_ëh+uG`$|g_D`uhy(fo]7SHb}'ҽNQBREPEPEPEPEPEP^baFw+@?M޴/5slnfFv^##eapE|<σ_>d7QtDetWF 2<KH((((((((((((()$uG`$yg7B\ AꚆ-!jK3x6EHw3I?M|eK 6ZETEDPQEQEQEQEQEQEQEׁ4usCjvpѺwz#Ȍ忳/5slnfFv^_-3%<;~/}FA(h((((((((((((+iZ7T1miw;U@$J9cF*%<_.',w?|,k?)Jٛ|9G.?zGcrImSETEDPQEQEQEQEQEQEQEVO/uuij̶ɾk%cIrH+3#Z| ʇpfa >M q5ܺN$.y Bx,3u>Ծ(^ӵ[^[Y#`vg+Oi~;ÞLӣYo-Zv24ǖA#IvyRԾgXci䑮jW9V'*d/gOk־?S UyS2ӛo'#NQ n >>?8'W-=~]ϰ6p ) q]J=QqqoHt3|8Y,~gEnW_V\[oukr&pZ9H!A:xC^;?\*W)vtQEQEQEQEQEQEQEQEQEd_WQ\K=WW7&|F| BGi{7pAO\r2 s"FVV A>627UC|Pc~4ͧu8 SǹTd@!" ( ( ( ( ( (4gFK1GHўFTU, ω<-'Z$Ur[8~6e,_v0nYUN(յ:hn 7J;TĠq=ӫ| #xB}8=f/$nd j1_xq_]4>f7 ƽC=޷sX杝Gc w;`f''g -UhE>|2_ذwo,lqC$qFx23_u׋ j|Si}uVi椒G*s)7;գXg?CWg\g>o9eUمH":P(((((((h^"ӒKy`n-ndֳ.B`pHH u3ʿe 5c#?@(wQgEq7Q ?oA5@g#:o#ȪzkpNF~+wºt紴Yk5̀HN(Q2d^[;gki7vYpW=z>627UC|Pc~4ͧu8 SǹSuWB# ߉<\]ON>a&7*˂@qiH"FVV A>627UC|Pc~4ͧu8 Sǹi/S׫c떶׌`(,?ix)?Ym/BQ{}YKORU$JaQUQR|x­fgh ?htU`w:c8CJEݵ l0kQqvgDdޒGHўFTU, ω<-'Z$Ur[8~6e,_v0nYUN) <-'Z$Ur[8~6e,_v0nYUN+~ _:wrL!Y%W" DPyo P7BGSI=3dМ{ $UDT`02|UYxNKK.-e}Z̹ $m#C As+yGC&nXH 3F$G#;H?ƻ:(wQ玛o*=0?J ^ӞKg._|S6I#8`PQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ꮅC+ FAx/Ƹ6ٺ|wjLoU~ש@eöz[Yuk=w-q: 9 Yegk+IDQRdoݪS=1{_L4mhKOe#2%È 2?:>\M9N)v_{z84=rvv_GgicC#o>0k[lt˻kKiURq_|=l,èp0yXׄi(}$wr$~'$oo7o~ 9ZdS@>5~y /[3wjG^]gyԢM P7BGSI=3dМ{ $UDT`05 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (8ς_L4m~-ȩo EKIm|/ş??ryM'u.?^'dCy$ gCVⴵ6рQ#+ͼMy-k6noH(-$prI*і8)9w߱$7xd&ne HcR{ˑHk>60| xCK֘[iЦF8Y$W?>:ᓻYX袊(((((((((((((((((((( Ow~Ѧh%=ķcH#DfmRHwD+pvtP n/9]E'?[*g}LK=DKn7B7Y Q *bĕʅ;((((((((((((netemul-1.0/doc/en/0000755000175000017500000000000011305026146013244 5ustar frostfrostnetemul-1.0/doc/en/switch.html0000644000175000017500000000512311254507113015435 0ustar frostfrost Switch
Manual NetEmul
Prev. Next

Switch

The network switch — the device intended for connection of several sites of a computer network within one segment. Unlike the hub which extends the traffic from one online unit to all the rest, the commutator transfers given only to directly receiver. It raises productivity and safety of a network, saving other segments of a network of necessity (and possibilities) to handle the data which it did not intend.

Operation principle.

The commutator stores the table in which correspondence of the MAC-address of the site to commutator port is underlined in memory. At commutator inclusion this table is empty, and it works in a training mode. In this mode the data arriving on any port is transferred to all other ports of the commutator. Thus the commutator parses frames and, having defined the host-remailer MAC-address, brings it in the table. Subsequently, if on one of commutator ports the frame intended for a host which MAC-address already is in the table this frame will be transferred only through the port specified in the table arrives. If the host-receiver MAC-address is yet known, the frame will be duplicate on all interfaces. In due course the commutator builds the complete table for all ports and as a result the traffic is localised.

Such sort has the commutator in our program. It fulfils all functions described above.
the device has a possibility to look the switching table.


Prev. Main Next
Hub On level above Router
netemul-1.0/doc/en/device.html0000644000175000017500000000302411252512512015366 0ustar frostfrost The network adapter
Manual NetEmul
Prev. Next

Network devices

Computer
Hub
Switch
Router
In our program following devices are used: computers, hubs, commutators, routers. In following subsections you can familiarise with them more in detail.
Prev. Main След.
The main concepts On level above Computer
netemul-1.0/doc/en/howto.html0000644000175000017500000000476711257634326015323 0ustar frostfrost User manual
Manual NetEmul
Prev. Next

Chapter 3. The User manual

maintenance
The program Interface
network Construction
network Customization
Sending of packages

The program Interface

All units take places on a working area (further the scene). Devices are placed on the panel of devices.

So the program main window looks. On all free area of the scene marked by a grid it is possible to put devices, thus they should not be intersected. On the panel of devices all networks necessary for construction tools, and as the button of sending of messages and start/stop are placed. For your convenience, at prompting on the tool, in a status bar there is a hint. On the adjacent panel (the panel of parameters) properties of objects are allocated. For the selected object there are only those properties which are characteristic for it.
Panels can be moved to a place convenient for you or at all to remove.
It was very short browse and that it is better to understand with the program interface it is necessary to look choices and all customizations.
More concrete description of certain operations can be found further, in appropriate sections.


network Customization
Prev. Main Next
Ip-addressing On level above
netemul-1.0/doc/en/comp.html0000644000175000017500000000310711252512512015067 0ustar frostfrost Компьютер
Manual NetEmul
Prev. Next

Computer

So the computer in the program looks. We think it is necessary to explain to nobody assignment of this device in a real life. In our program it fulfils the limited set of function, namely makes sending of messages from one computer to another and as there is a possibility instal the certain programs linked to operation of a network, and to view arp-tables and routings


Prev. Main Next
Network devices On level above HUB
netemul-1.0/doc/en/img/0000755000175000017500000000000011305026146014020 5ustar frostfrostnetemul-1.0/doc/en/img/net2.jpeg0000644000175000017500000013130211254745330015545 0ustar frostfrostPNG  IHDRl|sBIT|dtEXtSoftwaregnome-screenshot> IDATxwU>S繽HM}u-+]ןUֆ )v"RR %! ~ScҸ{g9L9MsW[bqLLLLLLLLL1111111111vqLLLLLLLLLLJġ1111111111؟pwpG]~58d.6vl K`’8[e zq\MO<5h%C'͟aLc|/%%|_;ⷷ\ ė#ezj];1ZSPT”0i sަLKAaјL:IF\;Ȇg<&O̹uk3Vu.Ms׏x/Mysʫe\'埆V8>111111$/cw}˖m:N~if~/}᳔{Ng> yGաc8i2,ˢ{wl!e>k}ު'fzRq㭷.Od„ 'WPyXJ9]^)X縱eemd27ÕW_~q1?Iz&O:6?0"/x* Zӟӗ-e x2G8KLÁ)Ոd޷s d98eTUOf%؍lyi6z럢ϭ`߲T;6a_XnZ.C_//Ȥػy[NM457wIpsfw޷]K.#ůoK_4\Aǩ=Ȥ8x8vuwSdSX~< C:X{/rwp՛geWԪ5|_`_̻!3g΂%,/H0zmPm=?UQ!;G$r uuL:'Z͜ٳxr>c:O>=۶e^)G[^UetvP3i:Գ((*Pc۷<ҳVH&i籄ҳV`;v}N=B<vn22aܓjcYTC9I;g6xϻŋ5sBmr~d%^*bɲsټe+,^/}?wӦM c9x{>@uy/QS]́ڃ>cy Er<1)/+uya+>ͺx;n ;=ϛyڽwײJKK+^<"!ov/l?? %׾Gd(+-e)yrzzڵ|~'ӧOxH}„A||g?)yf=]ݼ WM$ L|oq߽ǒe/GuÖ8|Θ1c$'͛?}Cˇ!Hp􊉉9Q8~(£4ᰦhywQ s;of;Κp(aC eeXq&0ib {(g#5UXD2U@Ks3akomF+EiEU_ٞt(-̯I&Bx؎{qlc4;ql87peK\櫇t7I&<_Ïr훯&Lޚ>H/Zl~v-ϮYɋVI./> kVcy#0ylZ[xv_ؾyðuJ0sNZ¢c_K/uƷ31}˖z V\z%s,mw1dn_w,>~n~o3yD[x7z;\e-9y O?uSZR<{HyF<OxxxuM 1'$[7>CTOǼk׽eL[+&&&&o'"RI|p|1oUe^6+E+O[W[ Dそ['&&&&&&&&8"&&&&&&&&&pb8&&&&&&&&&b8&&&&&&&&&W[W~2ġy-2ccj'B`|q),.!b?&&&&&&&&f8fvq[s ZG`6U5,X L"ļ8A[!6,qa'gV[ʪ)L>)&&&&&&&&5ܐ-}~,:e)eee$}b*Ŧ-73D3de*LII1n"I2Y%ۈNz#&&&&&&&&506(llvN,R x똘2!M`{m,i{m_Iw"ÐtN9~Ӱ0.t`vL;$WX&ftM]F|bbN͛rNH!?CiڢYp^6(cGk+"Fc{~#CLP:s9h'Ӄ }> oϰ) CTeQ#CKK,#F!ߕ$ C'͑ff^0铫9c᜿[yƴ5h ߐ 59?D>JOAiM,z6y*˴̘HIarL ;$7l < ΗOfѤb?į7Y=t/{iok QA%%TضEeE%SMc„sb8&wM۩xH]+\G9sN`a/děX_7O;\9ТDjŒM$;yr_@$q$*Kɦ'QRX:$Lq)*[[NYFqUiý[2auȶ(rmR!al 0 h1h-FI?Ȣ@)IHHWL3A+"6IX)v  il#Kp!N {&Y+Yfmkgoˁ-R tIwws׷~̮}չ/ ?ےaOGB"Pi XIDE!sdVa~괇־Ⱦ&>sUQ=1r6(طw==}뒩maY6RJ0k4ZZhjn{5ߵsm\t$c4Ĝ0(Ƹ @vHu 7U6S]RWIT2t掬p^뛹K)9& /fΏhB|.<}9I(R]0i2*3CƎ2ZCWF+"-l<$$(v )6h.A` C&&͑Igqh3~z`0 Wt GaEhtJ"C-@IzҚl6KwOl&KII >}lkEޜ,,]I% N,2T,r]~Qz?R#GLp^+-kApl DZql1K>&ZigKyѵ*T BE(%A"CIFr)N8*{lڱ|AĻ:Zmcػw=yض-H&QJQXX!A.%LP\\C hhhDiVF{/\׏86cbNFގw0VzQ<=y7UH9 OpnDmoZC|=אRgQV7}rY?YՎEgr?D>GO7 Ym,[KgP~G7NeYt'X#i RPBcvUq嵡訫v(+/#t,\.R$` ۶(..FAYi S'O)%u }\x晧Y|H11' G1~AGb8g 'M[LJBV68 ?p#*\-ٴs|^^5S-%=kTSLs<sK&6,=u7gShgLܗCGў L ](MY+22񃀶nr9r2V*J6ƲYʔMEE-pmC+(L8؂4gZEY-@Z"\x^@{g7m]ds>Z&M+˧2AD>JQm [PLC`[ӱl: `lW$mfR,*I3b*vqIQ{rl>$~`o(#a ֤(v *P Ɛ }?@a2@ +WspHC%d(O\ IDATv,RB07)#J'~g%R) tdӎ2хRDY"JqXPe(Щ/9 0u3ׄZ}9nm8%Eah4p,6P3}({ UtuQ-$[@6%IKPjqCu?}t(QmeCu[ ?)*p0F_CIʥːBt}g /|:\=Pp 8@uQca~vzvZKQnW`VGݴdqpkOO\dd ˱%"p:t:mEa CT=iS`iKHg2 "ZiMKk g;j_LL̫O>zenxd&}ИU:TFnvt<s u2d'ĵ~ԂĻZ/C&=jyfN=uE/ K84>9uhX6viZ?e c̗>qCtz/j]zd{*hUE3QHi#^ 9T*EQa \Hs[CʐsfQ4 ~Wq=8KeM8d"H2Y2A JaDi7U9J=拟\k@O\SJSz/ofqWc5-I؂"Gb/Z-X CiArإ@r.@f gYIgY>x8I(ӆ4Fkv8:v!}0Pdh|_r&+J 80&(J8D[F!Td:hljlT~^xn#jWbuK'r[l ?}vޟY1 ?_<3?0`@تuϣu#-eB i2 .l%NFy> 1 ώn2P뫯GPGG㸶R)LHA*ּ'V۲0:+$/ʊ2 )//fb5^Σ5{=\es 1pqR壌E#H9 _fJr" d3v0Q>V(S{ bU>^-9pk{o>f;ԐعO{C+#̘=ŽtYاӳi)gAE?i8i/rm4{:QƦibN&tgKxvv>{SF)!JU3khI:t ?Ȭ"U؄yuCI6ndS_ M\N*6 8sTy?1D4҄R"B>/a'VaFm@?`u="ýOb6Ge\.Cg&@Ka"1D^acAj!/XhLF(+L>OO&KO:KgO]] L^cFkTtװ5rLo8CR C>lIiխ8vОh*SY(:WjcVz>5ih?~b /,{61wƔf 8"ʐ Iv,rɨ~ơ/'إ`%A$0¡+V7u>nC|aW`!I"rBF})Q,m99e"̞EgW(ک@Tq㘘#.<7f?Yz{M;g0@Xb.;PpF($ D{3Y[;]}Z;zGt{yBk BM&uL) R[~HxٜQzSQv_4rwrMI-AiᲸ,TyPr }(<-\nbB:>~v iޒ3&]h{MjP(. y7:M[Bg"prGG"IT>#EdHu(G=4²(H%),,IJ,Z[#/5#pH0 a~T02p0 73::espwo=@aRtW}n4x'3W@g!;ȷ^g вnXc7v6{[&?ql+u~SgzSi֟{uf9w.W[o5[Dy*g)':.lC4Moe|x/Y[?0;OcP:- 66U$7vm-O1?8nq (B ^s4 QaF n YUǹ|7f|8zk@z&m,bigҸO#M1RU!ahS.pi# x|iBVm(J 5R)=$LL6yS<}#8B\[s]%E^b,2MwL\ۅ;7 鵈]p*#91 Bf=<í9nT( B2Wh0^%A+LPze`ĺ }t4d@ki$ p!58gp|z6c dk/])E.111'~0كںa ZҞ$ia@Qll@v=WAE1TxY a4A9Q2Σ{"ɧv6GJ"M(Cr[ቦU6x2%̩hcE3|caŴ-ܲbdZ3Ky:R1A?J (8'~~>e4!n4dJ|&}Za4K{: 4_BKh Dk0!VG^R\\(&:B{8_?~p52q4z QQp! l8p^J&ڒO^ }獆q3V~~ m F ITBr9yA4y>Ż~tK0a@uӣ [ V)8ՄQ@*; C0`A'45tE&%ˑfZtWHGLto'6?aִd3ؖJ}i @ j~ OPJi,aJ8sfؙx>^ss|_(+^^6=h~"#@^OS1A5OV%( Td_jw]K|&蜾c㌵Tx{8-6NSy`;xp%ӷ y G/DTM{WM^v#6,=ⷵpγ9cO)ĸaF93 8 uim .V1> f*Ƴ,!0&߱8-4o\XBt4&P}+{c4 ys*IhRqE}4p-Eo`xLp, J&¼1G|?`gbOjxtuByC"hւhys9|/f):X>LYh)Y~9ۖ{l_(< KT0T;rD2 ^v*kae7Gg-gI8C߯2eazl4@07DB&G[ڥ;!>鬉1:Kc}5EoHuHD(DFs"hOAt_#cYpVJ3cT466 &?/&&f|qwS"[<[[z+^n( e$:`^βb$wȰ9/b"{ظ'Ú-&'/[cdʤczOG#9dbZɞjV7ҡ(dzJ.5733*[>m3W4js@~zeBFj@Rthz- tcoWh,2!~Cv^`IXD/AǠ(S/GWOm]utd: `@5Q1zy=RZȁM̵֒f֢NmG,Ķ9m1ym6{'ӕfEE̝>yLpt*; G{A.,u6L0iT.HZ:->c[m(L&|MWW;wB9H (/-cmm:ٴT>s.N[J*͛JAcФR)*+_31^aV:\v ҊH|L?eNs>γ K B9SX\ ΃Ӱ+~ &5)"oqaaYSJq6Cl'2R3ߞrBlz-tg55^30ߝځe =&&ic֚8!%J rJF"Q#M>mM)vn( .68;;Jo%D>b $(cN⑭3сOoo_τ=全3c U&)"SMԙ%NEҧ=[[?FWw]n*SV@s9 /'(5 @jBP%Ae4I ڲ52yU'L=WKS# >-wAf-{a8f }tT%%AkMgg(kRii)Dֶ6vd؇>mQN˶)--!H0uT_p>Of̙1p⼫bbbßǾ*1xS2޴ORI/ #ЙIX&i$_a `̗|7@W9S(uQP\C5K\PUemeʣO:X(uJ8 mX$: JG/ ̡mIF[h\!AqGo@t07V]x|]>[#e4 c+"|ʬ1jy=^nA|LsK\?zyC8J!*@*= l1wu]k}Ix8&qfqBfbB0:PhCoyZ <-Oo{y.@p ICil93!v8'ٖ5a5Gm:><'Z_-: 8@ۅsGu.[#/·lʕZ̓å)sͰi[جΞwV>q1a8?3-i4>s|lNiOd VZIkU[Y9mX[Fsn)J sER.y'?^O[Ϝ1 ,X@__? fƄ|2k|@[SIkjdZ˗1C?1[9?fOLkf]7&.#%KkEŕW=l0*n~?2Um>v1g߼^[`ܹU1<3?^1"N)}(U3đ=wv`o!˰pR<9JQm *\,Ɇ/ź]d0oY3!p?/6۾q;]~Nv~Z'*$&N1IN5LqO9[dք`>r\ēy7E6^"rhbklOg47?شQcN?!!=眽~ Dg^/bɒӹd,^|:۶JXQ(7o gڴiE^޼{|my͛o8**7FZ GJΞ]dA[=Ycל K,s\sB|(̇R {_3cwiB[KT9w+}oo>ك~j,՘ƣ5^ xbw=Mf]kc|qhO'35=\s|7-7|?r!rv~ ^~tm M\,kޕ E;ms/w(ۼvq֒Uc3#1@)3ցn1$6~g5o\9fVo|jogd kOP;0({u>8Jzgnၗos dϰɿ\\߃*ev'>(-m-ڹV[AXr\{T*lܸo0;8cwت#c⣍u".k\b{Pf0bR~g_׿ȧJ3ʋ/~WFDZ ޏqdQq9 }[|\ɍ#ʏm{~.wo[/ṅH[xet6aFK3gR %Հ3ދ Xc)O>#2il 52ۘ7͌M325R&x#s8(ϛD_3G!|BhK!7.v^`%e(p>"6p$rtl{=}uG~"_~&zZR) !_ژ|c}O AߗgO,'p#~e?ȓ?y|#I<0xh#4Y Mp;}ƪٿb 0"'LNN\j?|vηvJ*R̳ӳgYҋM̶m469c ?OFJEaRi 8Vb\ \>uƥzKC˱ٔ/|V{cפ|`-\|?\ FZ~vFq΢ݽ{ٻ0kvۨt?͗b|>zsy`*zzzf,j'22_NH7Ϳ=i|7r9 z R\'3,-d2gpzC}wtZǦP&SM8k@570u)R卣|(Er^+1Ivywf ,Ƌ}EI86;K%Fso{zgU~(J*mTqR疦m$ǟx_IcЊҔ 766ȓ'|*OKE%ŗ_nz3I2:P^,D[bdFRK!߹/w?~|cqoژqCOlqfx;vJq} 3떾J1y"&ʿbJgw)_/ZuѨNPn[79[/=}Z3=O[?TxvZH]RUVvu5[D_8n:`׼c<dnj; /Z1+0Z6nO{Ǽ-З3,֧;_ bS\m_ݳG7F?+Q/o|oi !we3-g;ut!u F V2 iGC>m <#e>s2O#q6¥[d[_] \} n7]u)Q46Ro+]g^ϋ_9h]:KgprC;t:k9{R>̵W\:e;ẕ$YRN_z]#YRl]cIJF Vi'ć^oHC1+˷?ݎφz26Ѝg;K\+CN_7X?>`в<!8_׾tzseŢ֑ <tuΣ+OW`n,Ov dGLRDxnU`,3,!GdV=jE굔sEp٣\!, og 66bȊKq9f>Oz/@y>syyWKb >skLʛR^Pb(g.K73sҮY:6#;2gFtfҙ-lٗeO=7[K\Y >g IĂ9mzyKq3ik)MA`9Ey'|rU { !/Knx0]t5z#ix [G/yh=^>ꙣ3r1!Ofwg=l߾}sYxQ4veK,]~ :4Clcì35sa~aD> x'"c.cN|iq2BΜu!4KΦ^:^?s18q>P8w.I8U)8f QnP\qo>6|%""""ҴkUrK_U]ɼtb͏߁VDDDDdLJB[yٻgι,߈q9Xuŵz}$""""?xHck_"""""#96{1""""r|7>0eW[LػÉ4kn̆ ?gc>/"f9K/O1~DDDDD&oofSHBCDqm[p_wH|̞F1ʶo΢E6\GsQEq4\ǩw+oK/]H$I8 ٵ|4ײ'a…]Q8h.(8?\~ Kɓrq=X,JEDDDd !9,DLj!x^6=/ u&DYerPNqP e"cICD&:%"#ڵkǻ"MICD&1EC=OGچKشp6g59Kp)eFVS R RTUiʪ/WG\M2!"N="5kְvmu`ykqØ@baz)af[9e洷0{Z+3h-SNoY*qPĩ~DcQO䁡::K`;LJILKT@B.#MybYJ_ʫ?00.1((c,rY@Cw2:!x<UZ`δ"3[ BLP.& yΝENꇈL$1G~p"Ԯ:xGC[0(Gx3@MɂB,ZݽߜrꇈL19IO4CgIF{(xfa~{ n-ޒ0Ȭ'[BPfTԫUR0ENꇈL$1Wμ~5kv7)EY-1ӋR(DRQ9, u.#xG~#9~"2Q(1C8S`p r $R0924JE][%x52~DXd 8",. 3ۘ5R meZZ$q\ cgo /i-*ꇈ4 9'B$) $"q9)<'(>>XBx*ꇈ4 C\('EB@ Āp2"uZeRfXdo%&)Fju;vP3@Kz[g C)ꇈ4%"c,z> @:=8YZJ&i&JENk4q>P4=s֑ew:d娼f!"B)}O;G9d9hfދL"",*)2syysd.ڼWY+P ƲTECDc1/?XI Y˫;v9O:*Zfy`C{'{g]>ȹLȤ!"DC)DNe x0!@Nm~Yb{ɷӻj|IFCDcSH]G(䓌B4Tӌ4sҌKܽ3wY2ɨ~HP S#Y $#|R[,Y;|]c)* dQ&XJf@ sfԳfl|Qo JT?Ddi()04Of- 8t\\?3Hk-6vcO58O} 2~HPb,rqH#bz)mI[@K29|uO-rM&$!"@)Pw*qcQ$Oa{:oc,rWYO yG9B"1!Y!"@)` M'2 y`33DƊꇈ4 9"X|=c2 f}u?3Α>iJEƘ D2u@{œ.B`S8/1!"DX3bT' "7`p.Y ւs9 H7Dd~HQb,2"<2:\a3"l=l같åY`ӈY*ꇈ4%"c,/f1YZǦUlZǥ1Y$o쳈YakZ͒9u78a i&JEƘJX\+ژ,F4eis1_?(DƆꇈ4%"#zj9X9QyDꇈLZXdnb4%9c`[EիWwQDbv IDATdS@qXv-}x<_Nǻ(2E~D1"ǡ7pׯoʞ;=֭T!"p ƳFq4Ǻu;!mlذ|tvva&oqRǼ;;}8&*\T?h.cb15^ǜKƻ,"S-ʭ'>|ヒ8Ld~ٳs+\{};YzZϷo*QG8_(/JBFYhhcd6mz?;;ڨEqQEq{w2Ǜ4c.\8ENJchl\3N8dT*T+T+jl?C(DDéxb͚5]uc:qZx0&@kb^JV`N{9-̶̞23Z˔[Gp`e"Ccz`h/Ec(%DΑYxwY`T*U.b߲ ,&"2Y9:%'!G`(%Bh+& aH" k>Pٺ/L.j?Dx^@kH{k\ %^ 8k)& Q!`! νTj5\#xO""SM P#8(%1RzKƎ=_ZGmEDdS!Sz'WL~3r9@hyw~\ps.L%j?d*Sb>XBxC)"2L=Ɠ IPl]~R &"e2o^PL)j?d*Sb< o%&)Fju;vP3@Kz[g #&"2%N$B `=XL@ `uƿ ?[ZnGDdP!SIp>'8 (9R2K;2Ir;^'DD 2)1XRu&9a%Ck1ybhfL j?d*Ӫ2?;| eZ]DdP!SRLRCX&`B)%zfIS]'Ns˫OSDdP!SIH]G((B4Tӌ4sҌKܽ3t˷ls5XDdP!SRLVOO.?A RuKe3u/k,c@TC0%Ɠ\j=66ed6g0|#XƈLAj?d*PIjhpZBApd ' ~ fBZ2l찉&jpD-@ED2)1]8D^`1M-TF>غ9j}^'DD2Ui($P`OD-VC CB\%=EOKZ$TkZ{7n|[nut׵ilIgx3@1;@ 9s0 D"cC*'i[o _ҨED6mzlIk<i,DY4"Cz d6|q!B^|~>w5ƍr .NDDmp2s~'<4+V\tBCd<)1"X|=cr&'_0 h&ē9˨'e%""!n6#i?DFB@Ca!2c fxs&AWWׯg]"0*Aj,~{pBSb֮]KGG]vsLׯfB+ATOCV/8U$"qyfAni?_=֭;c)ATjhN7l^:e5uMww( ? ։͖ OD88SO(e81^jxc(SX$F+[o[o u׹F[n=,??=bla"Eq4Տ#;#٘cHS~71:N'۷h"$* %ѣу<֯=ICk{j.cd&j8oI^85zeT7i/\p0*DZ!NJchl\ܹs;vg`'|L/KBF PHȒZbotQMTݬ]{ )ӧ?@0O'<`qQG &1彜} }mD7>?E6n|\ XA>Rb &w@bC92№ bQ [q9Kf[B 1{v{8"{9~/`0{JK_-&O@ q/ĄR[/J׸⍗ pC c`d _p\O{}7 RN䞫hK}C 8$䗐Cebqs4ͨb+STPՈ"/N*Ó>װ~ ͹[:;!c&uK3!{ =%W]O<C96̫E{?:J:2U)xӎ QVڣ=?| wmX&`h,#8~r˭zmbN1\K/ 6 $WўڋBD!'#CSN x߸g~3,eٳ4{޳3@fS-1R}H +fxAy|^&sTtr$HUfi(_fTĔ)Q G{ ꆐb{ ySJ^"N!O\8eė5/f'zM*J:UAΐ0CDD&c, i"uP7 z'-ͷ]{/1K0̹ as<,21GbhCnN !?O2Y},/cKl.XZ?7^"PAĿN8D AC"!r1?ڥcbPS^S)JC=$'ns9112'%衜Ӱi{ir qfMy]5]{ EN\CfPAh@ k_E|,^?#4 ;y P_et O__)O6;<} :.ӮCm˜ )VP 8f)R&!%B,错G4u&1%z} ^\ϑ827`~}>>ijB1 7H4Jqw76~<1OYM\}H:cioJˬ DS8M[Na/eB;5&bLpp,6x}yf~ Ki}yn LH"ydUS qqT:Яۡ~Mgv8{Pp\Vӄv,lq8{W0_n~{\u9S) D44MCDrQ<ʁC8x0ywcci$y]fiaeU8y.|b i!vkh![׼ʴ0r6k{}l,ox3ݢ<"WbJ @Ή ޠ_[7!,~ԃvlqSccy{W'O?cDdW {Ւ0_G/x!S#n:IZ`0H.Rb.]Ś E,ɹݴ 0α ^c.(!0IhBs<ӿ|׻7[TcY塚/o~ioodY@ ctb8&}͚y|M]jo{&40\bP6 3wc[i6bpr ^vqyx"k9V| )_hNr1[],?Oycci ,/ߧL(3U^/yW@'(ε3x}տSuZLYfݿe7dgۢ&fC[&MfMʤ9':fB4! WH8%Huдcc"Ķxa=z>~RT!a`WÏ3ß?țիsl`,-}Ie!3UYP1SȧYilO|Z)gT| 7y{_kW4 DY-2eH0QCBL4)Q7~3G\7ԃ uX\ )SLjdڵkj{=x8)/5F*o`,-31gAHLa@;ƸShbn ;OE!C\wݵ}lٲBJ |;ٲe Cyߘ2*'&Lq)s M`P5^5M= 5͠_7a4la p3Ǻj|=Ƕ-kx'v5|nC%sqCk\L3e.Ўu Ld^<|qzyz}vϜQF^LX$EM|qHlhRCBj?O!@õc&4I-9u~lyow?gt xf(>w9F(LU=LQ;MմXqtObPff$d'V]-$D.j(t te$0AM(&>ێ=NM^֑dceIoR,ɓ)\92k_D1=WW}Hpci <0/xe=TgӧR͚YC D>W_+"D&-.SEb;Cr@97 ǠH3TuɂNU2QMpZY8|fycY#w*Mء+115λ}ys.[ P.Hᇿoسy?'Ҿ'?(tsC12dŏV;(*Ȕe^U e)+@Fn2Gf#^ 4{/a%[79`(ieȹhNU>Q%׽`pų**[c$H3ҲLJyPG}͛_4?I#c4~ aG/}D쉿:Ku2/v=-n'ȹhoo~DAzcjvG}e+}41e)~vA*Ok0 VI[ *@~"%)>eR۶Ѥmvqۆ]T  dJrE>yK'ܷg喛y+n? I`,LlD&>ky&sMc;1E$2rpc_:z/>u|en?t8po{nzIH-,r^W9Isgd%7sdEtgAϘ%#9frJY{N]/w~nUU;m<xΧ8܏d .I M ))H b;Gڞ 4LMG54uC v?|ŏWw_.𳯣 Ay>Z{n;6:*K ޏկ3nPdx~Os$c_3>1s o}2)M]C&vŏ39Ě nxDlMM ԁI2zW>evt>~]Ibt1 $LwP%7%~;)?yu^yM)_3 KXʹW&nf~ϛsI")b amicha^ ,§{pC@j1Î~Cuϻr@c~ǕW2$~CM3\b b,bCC=ũąapQ_mW{f? YliyKeM Xas޽g%z KbOPw喛喛O YZ Z'LAC9T"TbA1fR,żem(h& pPD%/iMM9D?\*0-7pƯ?u_?y'eP7\{ej/})]e⼝kH9n_׶0 4 pBxK> e0X[@i&o~<\KLDžykyk>}uqldi1k,]dΝl۶mCΏh9À,cgffؾ};vbӦMK9=e5di5.U֭[a۶mlݺui"ٵk۶m;JcÀ,/VK=dbff3~nRbǎ|4hYmY?xݼ\cY1Z.V:?;vsNvyAx}<#<ȗ\wݵ\wݵ[lڐLj^1jy\]Tֱsw\}},slF68Ii,w +⸥Ka͛ȝwnokI__sw`c<}cƛ^E;AUUg\{>>m޽lذ:FRq>=o}]دlju-زe 3%lu,333''\c][ V-. :V ; =ظuVXE%i,v.x;xk_˶mۖPնm(;wltqy5?`0q۷o_ojо-az%* 󇴔 #nmpWg@,iy`0a۷oݣΗXZ# C +og b= }O 5À2rɱ!5}^o,yի_o'fffx)@,Iw t)WM)`ffff!H!c HQd:E)%9vuɠS%)B$@owk sJ;Hxj'(oh}Γ~OSȉLUdbK)cC݁A4y- '󻾛#}bI:?v{6+!- sNn=vڵxYrNtHtJ;2H%)&C :aۡ,29'W~ <bϞ%K@޼>/󇴜 +&FW""3-XpY73Uf"Q(I Tj ER 3֯f5%ik1\ +P vdaĮ]m=MOS].f& D %"gr 4KH4uCon<&Hᜏ Ē& xs/?+!-' i&ffvm[&nેH2qtU[f& cn29E&fg!H鼎@,Iϳ䅎Y iWm۶m۶m/}i "݂u%SLv2݂NI"!FDJiq,SBIM" 2?.Ꞝjt'ЙH"H, /cCcXLTD9C"iR#9g"SPPP7^/KjCxLÅ('D&'vW2Mlg97a >?l5H.=ZJ1"rHr127e>LK3Cd>4 ~kIҥCx :e` C2)ǔU @Ι~Em|EH.9Z Lʜ$ bl?B FHb 낣L?c_J$Ir1T |"HlJBS04u 6PGBuI3(u\~ מV;EI?MCAh*z@ XW4Xw7@ӏ~4`߻eH.1Z c(傘' ) B4K*jBIۏn?]s$]j?GئMؾ}9=M\.HVqc-;wr/aHVZn633]@9iӦ>IZ<H`iչlFw𶷽ᅬgLZ~IxSrmo>̍7Nw|C)rK{޽{ٰau8;?Imٲ{Ȓ~_bgqncXǥqpK|c3x}K:F˳ձ06B&۷'#|nᅬ|!~Nh8p5+jqYhilt)qNw.^kx _~֭[),ZI+X:Gwq}kٶmrʳڶmEQsΑdto߾"NОwر"U!i3K`۶m+Dwe}vnݺ܇!$ۇqci -1ԤOȱ&džiz9{sz{U~5FN-t&I+=j|9klv|?4eN$$KK`ӦMd۶&nેH2qtU[f& cn29E&fg!Hi+ΝCJa07xߧ 2-X7Y2Ud'3-)b HGė R _+CJa0Љ'Hnd[fNtX-(Ȅ%$ƒfG2?ء^Uj>$:t}ha:U5[Ȭe7BA zEc}bC$hƊCҨqt@಩TLMv((H)R|'ȱ!Drn~ ۇQbt hC@Q_N( ?dS"uexpg//k>$ t fz_uki'Yf):TUo׏c_=A5||K)˴j>$ RH@NNK3ANPU;]ʪK:euSHӪ1d4*1.ۥLN @ړ~E.JCQT@eډEuZ5lFX2𖷾k2WOfCQ$&J>&L?`)RȎ}H%c"9rA)LșL&DHMIï-h{)&X}H%cHb *39e&LL&Fi ;}4(erLrTE/I`,])eBlOu(21hohH~N.Zy/ۇQ%&eMm!FC+6hOTi>$ teď3BJ>LO<&&!CO/pH\c+Iġ%TTdaxC{x:{R)Bj'e՘}HcHIeOu 'IDAT$nuCDuN뙊Am Iκט}H.aX1BlOs P7 &⩛KQ70}HcC"LJ:4@:4 &4l2/~@N1[I͡%0Oy2B4:9 [̱;PEB':) 4vlFXD2b*הEʇ8DgmG`DRD􏶛$'i >$t uQ)7y$-7KHLT]9C"iR#9g"SPPP7^/aOI`,]p։!  لLY9AmlO9l/24|?~pj.ۇQP (v#esȱ&i@DBDڱ(?3MCbf+CҨ0KYS@2ĘI!BSnw9'|9g^W!]$I`,]lEfPD%1\c1BX0_e{rW"-=ۇb0.!DbSԔAɄ:HKAAK:16ƓC(1KY.Ji BSB=OĺĺӞ웒fM?~?Ăr!]I`,]d)&I+bݻ8uqcǎlٲ}lٲ-[sgcb-1Zce)|mX$Iv`c<}cƛ^E;AUUg\{>9=Kl޽lذ:Fu-1ZcXh:|Iol&߭_~aIXhb:FuX&K$I`,I$a0$I$I%I$`,I$cI$ 0K$IX$I ƒ$I`0$I$I%I$`,I$cI$ 0K$IX$I ƒ$I`0$I$I%I$`,I$cI$ 0K$IX$I ƒ$I`0$I$I%I$`,I$cI$ 0K$IX$I ƒ$I`0$I$I%I$`,I$cI$ 0K$IX$I ƒ$I`0$I$I%I$`,I$'ݻw/q,-1ZcXhbe\x.ܝom#W_{r$It{> ޶qO~xӫt'꬟kgIyiۻw/6la:Fu-1ZF_1ׯ_CX1ZcXhb:V ƒ$I҅0K$I%I$`,I$cI$ 0K$IX$I ƒ$I`0$I$I%I$`,I$cI$ 0K$IX$I ƒ$I`0$I$I%I$`,I$cI$ 0K$IX$I ƒ$I`0$I$I%I$`,I$cI$ 0K$IX$I ƒ$I`0$I$I%I$`,I$cI$ 0K$IX$I ƒ$I`0$I$I%I$`,I$cI$ 0K$I xyK:Fu-1ZcXh:K=w[o^"I$O=ȭm\07*: :ه,|s^#ˆ cDXhb:FuQǗfu-1ZcXhil$It! ƒ$IcI$ 0K$IX$I ƒ$I`0$I$I%I$`,I$cI$ 0K$IX$I ƒ$I`0$I$I%I$`,I$cI$ 0K$IX$I ƒ$I`0$I$I%I$`,I$cI$ 0K$IX$I ƒ$I`0$I$I%I$`,I$cI$ 0K$IX$I ƒ$I`0$I$I%I$`,I$cI$ 0K$IX$I ƒ$IpB0޽{rǒb:Fu-1ZƥR̍7Nw|!: 䜗H/{a1ZcXhbe8%}c~>%a:Fu-1Zce`,I$]$IX$I ƒ$I`0$I$I%I$`,I$cI$ 0K$IX$I ƒ$I`0$I$I%I$`,I$cI$ 0K$IX$I ƒ$I`0$I$I%I$`,I$cI$ 0K$IX$I ƒ$I`0$I$I%I$`,I$cI$ 0K$IX$I ƒ$I`0$I$I%I$`,I$cI$ 0K$IX$I ƒ$I`0$I$Iw޽DZdcXhb:Fuqsw\}},$IY;1ԃz>sMӝ~=}'9=Kl޽lذ:Fu-1ZcXh:|Iol_~aIXhb:FuX&K$I`,I$a0$I$I%I$`,I$cI$ 0K$IX$I ƒ$I`0$I$I%I$`,I$cI$ 0K$IX$I I$-=y=`,I.șL8ziʲC)$I$p$I%I$`,I1v}qn;t0;cI$u?:~OOOX$Ic? ^[_g|7r9cI$,뮻ظq#=xeyj vcI$67ziC1@=w[oxO$Ip}AN̲ࣳ$IJW0399u֏E{%I4.&:>;ucvLt:N$Iu?_}|/47|w({,_$I.ǾUxիy_ǾUv/M8o =nIKdr$IK{}f%};{>gAnywY==^ڷ^74Í7jC%Ү,qy?3 ֯p߷3|~ooog?"e8?^fIKkTy;G"I:L:99;~^<#-;ϋ^-n(6$]|yQU2$IK\^-.{vbJt;{1׽Ozʙ'-tWy$IZ1qz'>\L\pmXPr+ `,-3s$i=3{vkyׯ??]wum/D;8gօO:UgP ic,IK8]u'>k^s+?S?]w}`qt7~k_᱿}o:ucKz@ $W]u??̯oqF7/w~=J^˵/&z(ؒ^Q}$-gSCя~ۻ8 ZƤ)2IMQH.ROF".Gc1θHmZm}'-tJE]~kf`/"}&P+cQs>qf IRe}MUgm.41Zt񑱱kht<xVKc*ݨUO&'fFv̕K~ƌMy?\E,Ь]շ̗ܹu5>ȞYL,._LW IDATxy\T䂂( nLqɺʥL˴,Ӳ,m]n޼L3-R]2-. ) ;$9d9s9939g[RB!xk`A5 Xa ,DX "k`A^Y7W?3 k]9Ҟ*uX::s7N/} ky99 `Sa͐~.TX#@r̚|Zc[v !jfQ+0ZY ̠N`Nܙ5T$U E,jfQ+0:Ag\T ̢V`AܠWsh9 ƥRk]qzhn>])w ̢VJjO?uڰn6Ԋ*kGfar:\3 ||kԒoZVm1wiǎ.kʞQZn{⊮ L3]w{/]5j^lJ<Ɵ~I7U_]5nL:B6m2LV AL1jb*7/Waݷn.pw?\39lU"UN~7 |7hZ~uٺ{Uy&U3kupH-ԠA]ӎa 7 * w c(!)2"B YQf}jظXkו۸UZrYweܙ5WKw}lejJxNcK"#ϐ )L0QaTA0H翳_R (Da4y!M~}9uڶ먑 w~Z]uiӞѠ[jߡ֭`+]XB7ÓUVfVڈ?[TPF FdI}pru^%C%K5Q-JAvo]VO1!m6RNv{[]2V-?sv RTK:V;SNuT]n>\>Rv5gkAtw o uyi۶%V+&c9U\Uz-RRTةI㊏׽ܣUM-5{h_G6o*ƣG鲚~:sLQf N5 ?X~- ӱcǴ2dh;xB;ڦG+А7+'7G٣?7CkV#9V23Ժu+M{_]㢖%鋯һM-=g<2$\kV ݆Z;ꫥjc[?ث{SzzF>tܷQ+5>j^m-XxnSiZ͚77jk;:p\Z5lKFܾ \-+JݷWccu[.cUQQl\ Zn7kuן}z!O/Or0E~wo> k\OEąuZF.\~U+u[4lP{>* >6?m[~ЉcZb*Z眒WI;.o\HI5RQ*C4T5Gʕ:p`_Gۥlnj~3k+Bm忽~`$))8ki[W^z):qv!_2 CvdVQ Q6(ѣUO2 ]:~=&^BH&랱wiÆرS/gj^vjլMצPtt>eTSНGieHЂwj̝e\_pX~߳G}FCn_<=<,0Y+'%qm+W~&Z'3^CʯvmuAׯWJrۧG&=uKu7o>گUIᄋH2 ?ԝwr6,>ե :C.j(J?wmԫ/ۗ  3+NVLԒsJo]'6su~f͚ݺYy50:mSL}Tc:qSYHO-SZGY(''P_$ռG!ͦ ηLjt"ڵԛyP˖Cuݵϵa*;+3_yy6#/Or$IgN)V\9OqGKgϞUӦMZA_$VP+!//G9Y  T65?3{Fk%@Pk{WF6nObJ#G˯e{軵_-[5f콦Tx+ߪV.ԧW=St2A۶ntE7gzBm^9׷WR)GjgjSZINNrsrVR=DGڶf`eVYfs쯢^wUG)F*>Z5}ĔIzb$eegkŊ 5k8~iJ8+IH?+oBQŶ޲+ 6ˊO>UÆAjޢ \W:u\ŠA4heeeke3v[~~eيlCv{,7A˖,RT j (HJfSAuGǏL==]o/xWaPD˖q&=N&M6/RnN[+oof!l PttLm`hdSFzѢ<=S5АaMfSIv ~?AQ={[LRRSԪ]'p[RRNۻzt 8 S8Kzj!?mPEk֚߯>{+4z_ߣ՟0m%l6]UGmZfS>>6ӾfCplu͚}VZ诣c35Q:m|y[{T_5 o#8Ɛ>XqpbI9fWQuVTkDTԩ2eJLL1cڤGܷ_O6בzzvڭQ}5`Mj{ʑSl 3u [RBO&%O箞b޲R8T ̢V0 ] 4!C ̢V`u3.I${2˩UքujV`r}jeghjW½A8xցZYʥ<<<4ܜ2Oa/<4on޸̠V`ASf'`vҧ^M~bZ׃M=*wwE fi""Z Fϸ 8\x!Gʜ;V?ː q8D@U䙵2LBP]3kBP]Ϭ q8B@U涰 q8B?.ͦ'O+A#k^ѣj֬)//Bm9rD7pjժ:uhԨQJNNGպuky{{^z3fN>]'I7nTϞ=+???qy2dTzuu]?cڻXnn&O@ըQC7xޯ2).;Ǐf7KWզp)q\)f[R+2jtWZfm۶MVzTZ55iD>5t颅  Ϭ-YT}Z7PuJ}f- @'N?_d tA%%%;OMMox}ںuƎ[yf]wu9r>={{{tIٳGIII֭  +hƌ㏵efi[Ywf̾?~ƤI_-W_}={ IÇjcܹ/l{:oeyZƍ3&LPWf8XpjsW bVQ3 *X'yyyFxx#|^^aqQn0j׮m7|q r:t0x F-Z|O6n#00ШYѯ_??? 4jԨaDFF?>>>Ff͚C5㪫2j֬iDDD ,0$eغk)ά]su? rBY3ã?sٸqtRʁ^իWWUF uY~}aÆiҥٳgo+ThhSm^,))IGUΝ5mTuѮ]ʼg֊˖-SppZjɓ'ٳ_+mPqL++jűR+]Ѳ%g9gi6ll>}8p!XxquF``0^bb! 3~W#++˘5kQzu)))F~kܸo9^A2$w{hh1o~Cpuu1lbݻuxw of3N}[n WohJJJ25HQ)ByjǕ(j_Q+ūj3 x&>>^իWWPP&M]goooIfkQdd"##_ ȑ#1}6;&???ӴiSSFɜ kNYY%.sAiI&ZzN:uQڵ}_5k6lؠ6m834I""" ]bd}vM8QՓ&L 0i&۽ @!!!ڱc>}Z:t(+}iׅ_scUYōQ+;jX+f޽{SBBQF, j]_Æ 4}Tp̚T2|! eggK:ܹSVjj֯_q'裏7|Pedd(33~˗뭷2}ݧyi/3gkU _]OVVVΝoީ .?~x͜9S:{L޽{+""< ;C8={V;vĉիW/կ_6Kꏙǂ;q\qݾvZVl6zW4m4>|Xڻwq-^XmڴQΝ裏ٳJNNɓ3RZR߾}5n8{hJNNʕ+WǏ?t萢%IӁLM6j߾OiegN8ZhJ5-oxzzqC+3k+ ׹Ι3 4-Z)))EǾ]wet{yyyƳ>kիW7:wllذ~;v}5.2h׮d+|NN#F5Ǐ/ձ_뫮7<<< wuWkͿx_T 4GK!q\qvZV*Vx~FA}v֭ hܸ1qD#!!0 È3 d6ȡC櫥:-nHO6^#((ȨYb11 0N:e=^˭Z2lba[hڴQV-ꫯ6hO>Fǎ^z3g3kq3k8$&%GrP><Ec޲}|6*jgԳgG]q:jP+0Z q:ED) VϨFczYCS/*št/Us_0b9? q8B@U \ q8B@Uƙ5XUYeP2H^=2'/t~ k4^!=K~䅉p@̹3ke9v~4{`_-_*%%fM3Ji mUu@EҞr;s|SʼT~{~١V:E,jfP'0c/;Sa-/7ǩ8 NTX#@r 2DY{P'ϬYa IDAT|i Y r3k2 'ډ'Tn]%%%+_0T˗ Qz ?vFFq?~RRSNUnT~}5kLΜ9t{yfPPPt%$$oWXXt5_+[U$>i$խ[7o_ګ̵q%ah[~VJ~JrssSOy mݦ'N[~I#FPf:ɓ'5?݀\xf'坺v6ָӦϬkܸqzg뭷SvܩSNi„ gϞٳw^-_\۷o׃>t{۶mӰat7_~Ѷmt뭷?JJJҶmt!uEr233j;oiWwy?nRͯJUZ㸒+jKϟ///箢*j%?jx/VZoFf]wnb֮]믿^[>Hڰa e_0z6U/<[mZVttwp>x=Sׯ$髯*4/&&Fwo!???I?ZǏWPPfϞm__cǎլYjO}Yy3f 8p@Ǐ6fJLLTFJ^iw4"1===S:ͯJUZ㸒+j+&&F,Yݻj"VV`M2EM4tn_]~?ԢE 7V`&Mc-Zhڴi2Ο8~}QmܸQ6M /`?kFwVBB5k,dM:UեK͞=[M6$9sFSN_|4_׊+g=Ӛ5kڷo :\_\\~O . +3ks^zQQ=zȿn]utslϬ](jBwY͛u;^vvl"CӧOwB?X JKKӂ ԵkW8fYW+WTddvzJiii_+m*jq\)}mx@O=˥OVDP+:uJرp_uc`%Wlln"l6I҈#={_UzzFoٯZצMkcwyuVĨ[n>|rss%IFұc?ѣZl5c jJO?vء ZwܡPCP+\5kw{͚5TM>V~bٻwvܩ%KFӧK.Qxx$iѪS$;v\t[N {LsΝ;种7_BE9x`U~g}G񑏏{1mܸɭ 6omn6nXpY3l6,Y)S]vU.}ޱ;w^z%ZJaaaNWF l65DxkΜ9ZvF*""BP5ڼyt)5 BSqgϞ z:uJWlV+VJJfϞuֹB\PV-I>wT>>7nXҹ/j׮m-IȰV#Gfo׮Μ9gxGKMMUڵK 0ϩ 3S^yK п|g5nXK.UttvޭvکZjܹ}^xAsիOpΨ^7o^܋ӄܹSƍS@@W[at*nV_y*;ppB{TZgkk֭:uzf͚+$ 8P3fpYZVskذve-66VgΜQ۶m3XI˖-˗90 )333ߙXIR ܇ f믿ֶmկ_?+33Sǎ+;Z_PPRSSnOe:N}fM"}I>W>H,W\eff*;;[[vޭ8={V6m?GyNԩSh"}'jԨQ\~ͭn:prsso*99Y\s~[gΜQVVyM6NWKUd|G*--Mvc=+R\kW\W[Ν;i&mڴI+WtVƌ9sȑ#JKKӴiԣG\v6Mgܹs5c )33SyXBرN4詧R]rFe˖?lM)))ZfrrrԢEBcbbtaIޘ8tEFFM6?ᑗ^{〓afzY}5j,eegZ8|t+77WAAA ![ꪫRxx~aM0A=sҭ{s(.`g{^ÆߦWߺw7Gvl[J"[EOj7mojޛu_ɓtbx0\DqqzJ;[ڮ;)#=Cc;3}رs>\,Pte?u1f㒆@Iҩ?ԡCZa^t׭+///Mya%&&]+~wzj߮mۼSOpB%I]_BB$ nwM`z{?sӟQ5TVM=TybǚC'hK=.T_(j T5t7*!! KQt3cvWWa-11Q_=*ͦ!F[>֣G]jռu5 ՛ᆵ;__Zkۻ$)33Sjvjoع^RSϚ^wBB|||T~P<3}l3f-[(>>^6MÇwCRT?].̘ŕc.WS5l͛йKOZSA^AWVv/Y1ckoW̗;Mв)gyxxjeѠAeff*1Ify7|SO=5k&I5k5k})""RwQ|j>sFw>b̌cDCrrr}дgwՌfeJMOJRRR_)''GE[#j/lCN/==]yyyj٢<<bO?ٗyw[ ^W]aM#=>ll65jѪ7kҼK '>S5nJC(u5k)>ިo=ޯ=̷6_SRԺ}gU^^^zg\N_ $j)ydIRZ^V-r\ό1_"w( /yrk+4m߹J-|g~n]ϸ()!GG*S { ]><4q8Ϥvڒ|C~r]/sp%7xW? @!!!ڱc>}Z:tݳ+OW1ØÕckǏ̙3gjʔ)ݻ۾A*?̘# 6'ӧթS'eddꫯҥ1 _*fEYfi֬YnQ c uv"f2Y&bYWy(T=5*ʻ}ŊuU*J?Ua p+<(/7W^j1[cZk<<'+%:~,V+//u1fɓvw'̷eUnj֪coԵG?yTW^nN˘טp%[RBNUsߎw2~۱U<~=F_}e㞛"џl:uTeu&KO`BUVVr570k`y<3HqMcS9.,"":Xx<yy`v39̌ǵoזߝʦ ㏘3w>=P}O>nr2_;_*5ɯBLL Ki/J&2Pl8sR"""Q=Qt^/>kc^pmZ \w s ** DYY9Խ[Z^%.bvr;ncѷ1Cr8P,qѢE bbb>|8Aِm)g, HCjb-};uSO?ʕ 83ty*={Jyyeڦ3鹿WߠI9 9p>R9XtϚF/.z5w~JlۦSǎ\.JKx}70B~010j_9'K.yߟmEܹ-[лwLYlٱ/.|׼z)=k""aa_뾬L{Ni4k֌~}?ì]ǁ6x[O=/^k=V,Z7&Oa5v"GleJKgcck籱}Pz'- |5 UR=;ol.0q[ݺvO_ּ}q 5 y.w\\5q6d[kȜEDD~C߷IIInݚ7R\\L=uxِm)j982gbM$j[`̘1\wz@shEDDZ-0d2F_w#]zҲu9NobuncАLvc(tmSTXHj`rHm3(ڶAfFsR"""QϿ ]FNx[!aʴK& i֔sR"""5qwѾNKQ#ߞ ܤ9gdөs>#rz?q ek<]z63῾ 60?8}|"I-٘@4+~gۆyg̙;~?>9 ]CƩCr  ^^M|į{lvmyݩlڰO?9s/̈́?Ϣo&pMcQT7b9SyuXE~}g-z.|=gn}<sGj86d@o9ަ Ki ɉh"ņS9.,"":X+* @Jm͘IN <ڴn TNΛжׯWcaݿgǎ,]=͛qRn|( .09rdEmq6d[Y9KC,""Ґ|NIoӆwޝN. %mZ[S^\.^~Un/MIMM0 >5YqӘۉO笁HIiAjjK&2 dwXOك̘1F ,LO;U2&M$++ 'ŪU>!ugP\Rµw[Y9r"""_'=̤#=Ƽ|>EEEŁ*++mN;r(--Sj Աqfʙ9!v*eeK3>π\Y=gϿW]>o ɉn/%vɖ-[ݻw`[ff&,[l3u˯fԻ-\M9YP(~ |3>|Vdy6#~g fO+pzsӲ2:l8]+nvS;n@\6^W_y B6|8#6"<3N?Htଁ)++}WKPH^&N;T233-^w"2 uo}B9+}5EDDѮdxC3c߯o#qq<#<#}߻oYM &&D=w;n;{Ee$..a8- |5d""" IÏCeU.P8e~RR[&777mƍӣGc^q6d[ʹrYDD!X;'sy`#ǩ73f O>$TTT0~xsh UZV-_P۲wՋ*=\M C{Iw嬜EKHR&d}v8q"'N BDkH׉"ATi{BrSSSDDN<*D|3.H9N[)""'k"Aex-+؁mY= uմrUYDD$X ""1E۷;Cڶ5l9t)gg]ȉ,*&e#>!f!2mYl[˼/>䴾mGݮrVX94$cg&'AW+ڱR۶V">!n m&GݦrVΡ1rih*DB@DDH\.wC9m[U ڮr-YDD$X AsX A*DDDDDDB5bMDDDDD$X A`pqL?i8X92v v("""rQ^/[ 6v8"r fqtLzz["@T5 h?,~gձ `%"G[s>'mDDDbYɏ?.dtv8"r̙C~y\{}\ve4oޜH%C/r8vb ޏ"MzSOzF6:`}픔rǑݥ'ٜl-έS s㩧9ڏ'+]v[~=K,a„ ǓĄ >}:[n`ҤI 8$N=Tn6,XpD[n[o%%%4 ؿj* ҈a̘1ڵ۷Q=p.~8ٳ'Wf3PY/xqҳ|'3.n},̈́?Ϣo&pMcQT7b9SyuXhsǟ 2F2~5R};[oai߮-;MV1g|{@p3۶1wglڰ_Eu!w2ޜ2!>rrؾtZ3gN9#3o<"##9餓w|cFi(((I&ѧOӏϣou_`"""ꪫxx}[ '#=| _WPsQDDD$4Hv(ĤblܑغoF~}q\ʫL{]Zukii%9?&#={'?pN=c߯'!^_tt4:ur ]?:&L_/+.Q{1'kaϞ=km?5 dRb"7lSۇˎE3s'Yv+++mN;r(--S;tȢ_>a}~6哗N1̛l/۶zf(^ؿٴi{3g.N7͛aGkGoʿߘoka6><ZlIVxᅗ()-˯PV^IݻQ=p*>N~}~?SooeaYwL>퉈+^q7eu\v+/AChÙgk@aù_qӯoǼ $%%ҧ 3k)**S /}z1^QXEd'$Sk|>}вUk~{w{=`WTΦM{[L gλչ[;]@brK&O‡NMz:nˆHrJ+&^{_tuPu󘐐̙3Xtz9]9s oODDD1vnr[YPDNxV-}K]vsС̚9ĄCsrP'4x""""i{NDdJ$t1))g 11X$"""R'*5q<DDDD$T5k"B?"""TXk`˅e;Z.4X[߷w~"""rXk@">9[6m]VNus tC*FN,ۢ]F'Ͱ4aGކ,NAXxdCo@V)׮۲!E23hJlVcGZs0~|Uǩ&"Mwx159td3G9*` """"""R&"""""T k""""""!HŚHj?s|*|>/m;#d`\iTgO9yד)^"[Jjju\'$ҩs:tքNQUlۺ0dfr_ݸӱ~$&Ѳe*>_e#G("""""AUpW٩3aaFӻ0,,qwlNŚHFǶ)*Nj-ԜzڴbgSBZkŹtMy±l;RWHi{_-eyvZwss8FDDDDD6k{BX۷ .~R E嚈IkC.'Oi> Wk`?=(v;Q~<DDDDD#.FL~sZ+W&e:unkАLapک7z9̚eY7-Z),,lXK\u5]u|oqek<]z63῾ 6pXbzSN7`_s9.,))ߏ#KO39,Z xgꝓ4isYYY1qDfϞͪUS&""""r9b0jٵf̤s233jwMcQT7b9SyuX#O s6t?ǿ^x̏?e/n`6MV1uh%xsʴs8]sNlB޽233ɅIDATgٲeȩZ9#;L듹j_~_͞=LbBw;vtlWT뾵k1w|II.ڷkK6};vdii)54ϑ1};uSO?ʕ [`U}aa 5D:-HC (//,X(U3>[xEW4b4"""""r,qpQxmzˍDؗa|o^AiZغVGw]cIJJuҫW/6nHqq1=zh%n{ʋ199kwߚ;o?`_׷w;(++gO0MDoP>;tȢ_>a}v7哗 yߟw.+njÓO>I~~>?]G-ᢪ/$'"""""pT0')1I 49l>pF0[yo|咇+/HHʫp[x oaÆѫW/Zlcڴ/`r4 /iڌNJv{Sf=5v85?qw}zo:5BT"""""4fB3f˾jl۶y#/5F{*\+ԥ7k~ʥ =myj֭\Jד8NDDDDDZ xr$+S+Δ'һ`Kxx$g}1Q1ض(EDDDD!i f px6O~CmΙg#:8FDDDDD6ͬ`vМ$ gcLӏ[4i*֨.t[P}+Im|StYHb SX3"##IKv;7lZy_s.jDDDDD9kT_Fv)ڱR۶e:vHHjA.#FLDDDDD}DDDቈ Ym 2ءQez+%EDDDDDB5bMDDDDD$X A*DDDDDDB`~,qBYdҴ ۍ',VNp[ >!Ś"XPNlnAj(hI)ED~^/ض%R?aErty+""zRU?-xwÑ&pkGΤ^ŚePXʴؓN[`Rqlo9p{OS^^ʖuduNVާ_,dWV֬\I-L?;vÒ\w6Y vX҄~yV1焹 35gf2f&yr1 1 -IgKrHM Yck&[7cvRڴۻi>vife4mVDD2M~q)&+{Ñ&NVNwL׋غm;np 16MF#qذae4"2&˴&ߏ&::={0&ccW~`9t3mFnϋjNB>\YUx\[D&֍cx}~>U^/UU^İ-,Wnӯ4'_[7o0HoNTM,`3f` ۶1՗GږE^~.\<뗈H{se3f˗૬[Yu<ݜ7ㆠX[˂=]9-i>׏#^I׈wɉ܍7f`.d6,[m۶ 0(**:r '_eܵ a'< ۲~~ cYfM{l,P-˲i*6m|Lbnާl_XDDDBcܞoOdžvwbCz-sbmگޤ͕]7A?~c38^z2;1'khFpcl*Gf"~ӹݻ$5  β=ڻ8u0 W_}ӓ{F08CtL40>ϳi6ȈWdmaN˶1~ql}-v6_Θ—3i,#~Z~̶MYkfMDDWq}O&cFn֎!^Ig6-+/\r ɄwɎ;EǽXZf_'m̅o|~"=a!~8$^Azfn g/BZ~//ndt䬡#72N:a,9۷ms՟k}>z Uq-ހ' < '| &vcuwe}Ǹ1 {,ZRf͚ETT}1xvBk+vT8¶L>^˿Ĉ=$E[DE@L/CLL*nLJaئYEO>"&O7|Ï?Xc^^s0k֬z:!^%%%8Cx>4ߏa]x<´nLT`{/,lƲL6; c``T6G=IkŚsǙ~yϜe_QY^O;5=k/u+>f(C 7DAI4%?E41Nc\q[yi߾=QQQcqW[2|p7oN|||8]vg Mݙ9s&1_/^qpoXMDdQQq_1MӲ(//pVZe-g﬜Ezm-[cK*K]N0ykWg:{gs;tInۑ6Ƹ1ɽvL{[b{1voıvZ`a`X72zZw%\BVV[lmjFٳY|9&L`ɒ%PYYʕ+ˉdŊ4oޜz.˗+aβʆ*ZؖIIEUR4 B/|'#,ݞqS鑶 {{׶n?h[neƌyѼTVV?/'$""D?MQp!'d_~۶zm`DߜԖLrr2jEZ4ڴiMIؖiUiee#<<KeE) d0 v:y)+ݵO;m_{B%""7=AU1 KTTlo66V alX˖-YhO?4͚5#../|׬_haҥ' 5kO?ARR?hѢBͬm/CRlU{J:c_J_% hMC_z+pP**,_3)ʃ~=T2~W_ k#&*,FV)x+jOxcd n{c~ Xw>Zx>4g۶Le8Eyn~Uc *K{ɦoeEwl [[S?m6ie#}:%k{ǵ6TRkR嫪^ܬcܸ(}Иln#o:"##٪eyrg_Cvv6a.b횕S0 mi2FuA6KbRoLױ)o=Z0 *֚$1.LӇerdAE8/p5nH/OX[p|T-7FqS*⫪+B~2k<>s6o¼i?0,'uJndzqm?3ڥ!7c-?lˬ^ѶLrߏpۻR_۲n̮^`,se}cSU6mFa@LL3X2;v%,<4))."!s/r',=`k*jq ]( U{0`C:mw,߂醬`Jo*;)ͭV;2d =ϟُҲ26B9g}6~{*w9170SY}?5qt^{4oSO>ȩ ߏ /dYפy++ szwi-=XW[]ɫWJr|,8ɍOoeSVa_ElfLw%؞ZgŦ6~̓WybJ筬9Ϲǟ(.).,zGiؖm, YeKIiuGl|N.=VV~]oѷHcQQmpqXJYC}? #|'e:;K&O D|S {wuMKiڽ3Pَm9+3۝Ŝm;{^`OXDDhBc}ǸbZKC5?S#/v腫jwZH%[]?:,<W1n8!Y薞Y]ZwY,ďe)-0r&*q^lӇ:`g}ԁZB|-S[1ǩ^l4-l{}hvuQV4BͲm,IJlzAVfF9n41cOֈHp)_wbQR*>p1.dsҴBޏOGW1n9>īgue,\60k*>~_ 9k@_Ӹ`!u6cG*+ضb,P{`93h?j?yCmH]Z&$az+{+1ELq̊Uay4 1'@F.{1}Uy}WM?#G Gdd468㏬[v~loV>zBͶmzyC=nWC 6qBkan@Җk|իBϳi'ct܉qNvROMl]qR[ؾ} eV` Ƕi2KEDDCSj{|8!]ޝ3镓꼭]=V`v,:f쾧=cھZ2eKvŦ[رR,&*2D223hsRDDQ5߳6m'ھ ' 9m4P_`6aLrRrC9a51ƸMW5v>Dǵσa؎>&ɶ-\Ʊ;oED$ v(҄~.!U l<1^xKhw۸ ETd4eŻOjdQ13 qْY9G6X1D5'/Vұq"4&8Uq\ˠ]=aiϺU?٩;4&b%vq폴l""|nO9]3Olv4&b}mX9_C; 79u=J_Wl]i"x\bߥ≍Ol>>ow(`mx*mRw. 2:&VDD1Ħ _lvX҄\.'Ez!UUs0~|Uԫ}M_+cb9v輕VDDOc9G78bMDDDDDD+ȁT k""""""!HŚHR&"""""T k""""""!HŚHR&"""""TP"IENDB`netemul-1.0/doc/en/img/prog.jpeg0000644000175000017500000004075011254745330015652 0ustar frostfrostPNG  IHDRDsBIT|dtEXtSoftwaregnome-screenshot> IDATxwxVg&dFX CP@ "*qQ:U~ֺj-uo- " 3 2#! ܒu$9qέsn`BHBID!DH$@BDD!DH$@BDD!DH$@BDD!DH$@BDD!DH$@BDD!DH$@Bs<ߍUXXDr,J?BFdeWq}Gϛo{\BѼZ$*BgȈQgaeW1bٜ6x8_/XXO?Gѡs.{{߃lX~r 7/2`0:u[n}W07нG_g0پ}Gv1h!gܯ|O\|镌;w"CG#FC?ċ.cط)@.tڃo⒒2y;9%tˠ#yFc'Ih߅#Dzqfz]LF.뻰mB4xTs$$qi]6=s?k.ʦ[xYq/&ձC{>z-ef#/ˮnUotWOˮ% v_#7|@ u|:?Kt ,Y _u-}Ezz|9gOJr2g}.:t`ضͷ/nV9m@?{u 7i|:wء=w{rg_RPP9]Ȭ?'a#7B5S$!!nj{ kQQQIDDuԺƟs6230ګYhqmv>Ix<rj6n̪U?HLH~}z\yy1x 9ݻ1O 7rj}!%ؑ Yn=yq=lqޭ+~/L^NzDGG݉#rj!8qy4N:sO1pǯ[.9vƟs'<ܵ CUUٝԏ]w( N^2*++%)1v]Yoj:iBAaa))?~IMmSZYTU%66C`8ԡuBÎK! ::kС}V!8q 9s9s 7z_x3׮">>EQlg^nxW6t.^o~JKKCQoP6n`0X/p˯w^^>ÆQm۶E4iS<;w] 6Dv}q97Bq,MzֶmYdazINJBA $m^}0Ķmu墼QxtڅC7w6***9INn/Lm{coa&`<;w|tF> TTTrC0xtОܜ??nWORc7Bq,M: <#lٺǁvgk}[wӿߩ|sׯ$233a3߷^~G*@\\,C챣E;s61=v }QfʕyX~H?xzEQ8sp=_gO.{ίnqvtOBcQJ v:-݉p6b_r6Y˾ɗ]E\rkuO5G+M/!hU|]n}\uEa̘ˣtQB9!!B !!B !!B !!iԍ-+N8ASXnb ?=q⚪㺨޺Ɗԫjie;^S܍uSfe[fե,RBktNa8yGDZÂӵM >8nچ-E*;J~NP!^[Գ~Xݎm4,>^sہDo=^&[\v?BeEX' H?y?ƚ׆tElWw}FX.=!Q-O#4L i{D5Eqrx}.߉>9Y9 ϣu+<9w/Tԡe,Hmʮ !~b@4d43-l .HFi)٩x*RXJMppS)o}[H\ketnK69dǶk;e;T2}p12 |vK6(ܽ&PZĻKWᅜ=r×PS~hMiA~q'IvJú٦n}?Փ"K/K;ǀe|6Һ':G3QщmIޟ/߃U&Ÿ@j2kU1-Xs6-h _x.s$~7*;&x|^qIl[[i4fp8ΗȲI?ٰ,SRk׻a !ݠie;2h!´qy\R\n4Uq qXײ؉u^xö N_sm+#h~b'} {*L<R2tb<>zg%!%EQZͤq rܮ²l(O 1rS|:UgU|T"BVoPGK4l$4 L]ԂZ!)KOvzKw9SXE_]}y=%gX~W\o]Kc.8(GѺ, òar)66! U05 yevMqv ܰU3Y}qKѲW$\F ,emKX7mT+`>'6lX@xSa_fs+Ÿ ͨ0(xB$H$Ԝ4eh^u[vM۶yӧ/Bh3B8]ؖheHHGCt?>4܎bئq\HM|{6̙Cqq1:K.e͚5uqYgKNN~iև@q[^<<6uM7{"dbE\{^u|&{Fmt6_x&MDϞ=6l׿xk_|ݛO>*&O\և!FIEPmUi)Kj=wDT3ݿ#8Sơk蓱&8F={3eLkF0X֭cŊo>iۉP.CUkX:}-(.9#";MqWVgHo72!n`FevdahA,]48mfH "F;5B4ٓS vtqU!$WOap!<ǻ[z7†@a2y9y(/f-\ihZ"IC2 lɓ}w7IZ# !DiT^S/\n؂kئiuTcSȡO" 5}sӉMy{Xb57mcoa!aM29]澋p#";( 9ڑI( Bv)Nc5_q !DSQʀ:trLB8˘xi&686NDB㠨plax}*."hq..I\>Dc۵ )a<.X ɠCJ 1+DBS?]#+ԩiZ .>?Qѱ.-" ~Yh:(!!B !!B !!a©r'qICQ\~BCؽw׭@Kw礠\%'x*/"hqiPR\Ǡ#ܵ|qSS3 YKnN=B84Yf%CGsNI97e&L !Zؔ8@-ݕRflK1 Q$@am<>yIKx}ؖG),! aOBVXN!#GD:WSDDѪm.ј200uS bjj[J(.ޓ>-Ul%|Mj4DM(r/B5LMeC^g[xZ?B: ,eI~6"%9ki"Ul<1uLC=3ַ0h Oh4 !D2gs%c1*j:%R< bDy"<$DyB.Y_esXe<8Gvu͚578^/:uꫯnp_ 3]wgzÅSa_fs+31*񿜓>&#bc%ΟܲCwʫ,zN24V]Ǻ-;m4M>lX~=@9spѣqI!ZE*q~UV<ʖ/+q)9ɻѳ>/6֎:Vn|[o[{aϞ=L:L^/ݺucԩ۔q7Jll,Gf˖-L65k.]0yz_Oaۗ{wqѷo_uƗ_~Y~98rssyQbЮ];HMMeڴiWъ-7q6ul8Йo*.#"v }lrɢE:u*^{mm^ٳ?>\}޽EQ  =999A6lDjTheRVjQocci'>6-WDb2/M>ca׎DG# mrpBc=F޽;7o?g!99<@AA˗/zM7 ػw/wf͚5^{ GBBm(aʕɩS!†(?z] bz!cæsNNmAms+"{14/^!3U,]5 -xvb"q}Cu~]ne*š( :NKݨrlߐ"*Wm(&??X^v}6Ih &^= 7\O=wqyV4"YUf : &`LwD(8qYt3&l%2.s&7Jy8wv|>?Sj&OEQz\E[9k?g۶m8vUܤI4i"kskٙcgc),!DPKZ ԱPb~+(qQfcon&PW1TlS ]m|֬0 l۶O@nN#F gmwPTT(TTT2X($m۶:OjmzI=1 {nƢE1MOJJJu.Qm($@CQ䶍®Atδˈ(QBeQhjkTl\v.fp8^;b[#( HnFyx7n( o)ɜ6 RRo|!wy6m?#V;¨mcqzuדѮ=GdҤ p{A~}dfuMt#ʌюo(oWI?w :v!5&89/UQ-X庛s̺{ ytGdě(QqJ^A\-CS'v1bNgXJ|VKp).܇ڸ?qOJmp!1F ( 2 l"S͟?βhi,AD$s;X}-ִ\yy(bĉ L !FCFss] <1K&c:䦮b* |ڿ64"Fk}سw]<@ EQ8sxO4HJDL9'71f&<,h[&e86|۴u0߶n9wBc]upy9y(gCP16j98InXeؖc\6B^~ "#"ɰBF Bј2ԋF0G{8`az徆i8In=: ""#pltbSXM[Xe$E5=# wNf#8I!Fө9$" ˅ixI4G B(.ٝ G* IDATsZ;'=;w#@ !Ds{yslHNM,[0^hTy !Dsy<۫'+-ga[vKwrOH$'DD4)A]HO4u!Qp)mti !DPx}r;хBDD!DH$@BDD!DH$@BDB 4CQ\~BCؽw׭@Kw礠\%'x*/"hqiPR\Ǡ#ܵu3 YKnN=B84Yf%CGsNI97e&L !Zؔ8@-ݕRflK1 Q$@am<>yIKx}ؖ]Fk!DSaPe*qȈ;+)5u4.A$@'%s6W_f`bjALM]WyKWť{';*I!N 37$?OIX UUl+3Wn:>u9! Օ,R +)m}dĺ8x(pLб Cטr|}tlhU$@'Y[q).֍ch먚j8b[XehXFu,^O:wUBzK4prnhjux躆躊eh56H>37K ӛ""hl 3KOu8EW!.CBhfmp:yqr=qPEQ$;;˗7>03f4i%"hT i1.tD3t4]G7 |.8 `uUW?Ʋ kױnˎyc%%%̚5Ṫ~<;&$@"ǁ8 2tM35HC@Q( C6>jDטۣ( (zO<-mV;z)++o$55XF͖-[XѶ6mk᷿֬-]ta!qeBVmo8(W(̘i[IdT*>o$+RѴ*JJXEAhdMǕW^O?ƍK.!""?̄ Xv-n m'|E1uTMDѪUheRVei]_+KH-ğhP"ʪ"*evf+(lt?ڶm @II 7o?'??dxz)/_m9$@aC 71A=Q] JǛ\qE+z k2L;g (Ϊ`n@9ma4v{Ae"4Tf 1%VDGE`Y&֯VP_eBRЗy=222ֵS=O$$$cn_̮ *$@a#E0Mq|KU*UgD *45+1vW:^e:ݻd/ ea;vʫ^WfraĈLJyy( >%9m۶m4% K>Kn(IpCW|)9PF0@  TUQY@XV; 29|Qڄg'1qed1‹ٻw/_}%&M7 9%AJj} >Dq98iwk~=ڴMgFcPޮ ~~E 2tIBjLqr_>Zu7&ͻ1uCSj~zKװM CS՚'jA -X^˨)go8`'6@#y}3o14lS4_u+.8{u0̞혊eC2' z6P >GxwKF"#!D9>;'E¬+OS\]U;uxz6 .H/hqB84pۏ.]:`MMNqy9k{蒑HTqtۑhn.4FBvp=H~4?˃i9> Bң€Ŷ:ʃWi؆NۡMnd$Ɯ_۸/"-5_fxg}&a`T,]Uf*szwgm !Dpyb0?/s~&-F!1!o_ai*v;8W6Gv7kÍ"l4Ķa*h!=Z2u4Bl=磴LE ǰ1ty˾[/}~{.;v3&AzI9膎iUuهVH/wul}7,,!DpY2UnB϶~fj:"n;[s|ŮK$_/d庍ǥOGf{o61 !DذYv^ nT<4 ]3plhBY&ofDX*3r#W+)K+BWb:o~0vkôWo7\1Ӻsjv.7f:?]B!"4RWesCF]7tU>}s]m?g=iSȉī3}x M6eG^6 *PW_|Nt,!nƣXmocP B?eG@|2uM,w3%.(ybw'"DS" ʪdl6 L]cС ]ySQV¯p57[S~ q3:οJ3j@1PA~;:,?0!"l4ǿllA tݠ,Ǡ ~E䇄Ōr!!jtG0=sԝ%c:a:[mӆeY,){0bxL˪͙gO sk!l qqMo# !DhsUmVTiMzc635\./~[?'u%C9$͒bW˅eXmhE gά(/Ǵ+.S().~\=q4O\f9&΁),!D(( 4yA`PRblɑ|#U; HL; j 7LF׵ Sj ,Y3 Ǥ~ITL,6KqGQP>z5qr,~.!†KiůئhUySr%f`pN,_/R"Oť(6ip|cգԈNInn.o'5P7_A ?x8.P;@ǮK T58BF B*LeئlC*D$@aCi\||UX*LSST:a^s㠥s9qӭw>n7.>}m۶m ~*urO釧}H\s =&LN̞m۷a?^ae֌6L K:pz]²,{xbnzLzbbP^Hpf??"l4)Cd{+ٹg׭#oJ (e_tܠSL4M‹(+/ .o? Àê<^/^ŎA($@a%+Bvth8w˯snoJSOqsm1s{ u61\ Bۥ9s",^z9}s7s-駟iӦe6]e-Wc9ɘ^8D簋A7U"##z=-xKOTtlKK!„<~d]!DH$@BDD!DH$@BDD!DH*,!DpL˴p;sP.;$@a4vuk)/=9)(.q1qt%+=^dK!Ze1hH:wonLC'oF/[!#n%@-2M֬Ycӻsx}te٢y$I#*"B86!{Kw夔>RLCkT9 !DXplc\4-ׇm5kDB=& UvPZb:1xۢ߀  B9+/30 SW1 VtH=铝]n$@'ˆYؤFCdۄ**T]T6qKӿ+7? ~UK9!DgRp)收>2bDyMb8kXkz9>in: BVorx\ m[θB<ߣhA]R,C4t'_һH!Z%K] 9m|}yN{||KiR(/%aN df)a:̙U[zw~A1}fkODѪ\ @fD>A隁ҭѿO_u\٫MJշ[QZ"Ͼ>1e\@JJ ^N:qwPTTV$@֞ 2[!-Eo<8)8Pr%> _9s::c$Sc6LC24V]Ǻ-;g}ݻ7˗/O?Hfp!"h8]ؖIސI)_g6ds<א"3,uLJ%ۖ8r-L:Gy;INN?8_~9O<]v%&&6m0uTt]o߾{l7}ҭ[7p Cnn.˖-oTbcc=z4[li#|t BVko8(ES1޶2CIDiWpHA*xW_Qj&ӫCdM~zv)S]lΝKee%| s'ٳy7Yr%> W_}u.ݻwzj*++={6m۶K.s „ ,xFBZmUl:]Q}WZ .R ) <^ tG 3;a, m#8q"۷[oe޼yu馛HLL`„ ݻݻwqF͛ /@ZZZm:ub|<3$''xx(((`?8Jn$B 5Pިu-A*I$䣜 7(Jdž U+t^UW1LCWB -Xo?b+#?o qQGGO?C~N<7UtҹNǶm*e߹OeEaYgyRo7j۶0$@aqϦ5sU* I"wGnpl:DR:%ɋ691*è}XFJB\Cyw8Ꮬw={0Gs\. [ԩPgff&{233ԟ(|=. G9*ݴ"l(Ҩ%-څiXfy1w4x2q} }xqǨ"ZB%޶\.O?$yܹMشi3y=A۶vS^Q7?wƈùi( ;v䑗OnN#F gmwԮddz,N=,BM [rFa_JJ)Tm N'?Y!Ξ/{pw}mk а-csXj5%%5.DPU9Qt֕?4*).^!C.Ƅ'j??\wo]ױyw1/GD1>-g*AǡQ \ۻ0 s&uA߱u J7DA.bV.7-ZE;(2EH0"!MR+ jUνܱŠ:6>ٜs `\!|{NR>~ ;~iae_.nIG]e5PC;yhueՋ7'Lc!Ӻ0@(aXWg"0@.=zgxC!_zΦ4BgOp&jbіwKbdbR+ˬD6;)WG"*FDD0@Y!""K DDd ,a% ""BDD0@Ȓ?TZIENDB`netemul-1.0/doc/en/img/set.jpeg0000644000175000017500000004733011254745330015477 0ustar frostfrostPNG  IHDR-NsBIT|dtEXtSoftwaregnome-screenshot> IDATxyx-a_®TP(nUk>.j#*PE+Z( $!@!u3gfLd=e[|DDDD(ȑOCDDDNCDDDNCDDDNCDDDNCDDDNCDDDNCDDDNCDDDNCDDDNCDDDNCDDDNCDDDNC8gu6?xpʄ3y_Owj G rQkWw{wUϿ}1ky"_6 rx'\xw] {s1\: g|ǟxű|?ꀗ祥y F;ʘ2*zDageeӺL8z;^mNp&ǏW-}ǯmٺ_L>Ŝpҩy\%tʄ3oesҸ\tf?/D~|ϛ~‹qZ[_|҉_4}is K͆[,Ӗh5-:~?0fWg2xf{?>5h4y ߟ@ @MM^YwZaÆ,Z h Oo.Z]F$8䰒HEES.=zL9'N?m?,M8}3v<}~= -3ı(=K.;OZ~YzԬSL[kjq}?gQS[#~WB<TGGk ԉ8o2sc:t M?_ƹ|sI'jhF@Aw~3CKGKG:aw"1*˶]!"""q!"""q!"""q!"""q!"""q!"""q!"""q!"""q!"""q!"""qצ.zx!"N|D^:/ͯoEZyA?68{;:q뫾!zWпq/"][ۼN78\:q]vJ"G{lߒO?S9z*ߺBK6\s]G0D "` miv8(u<Ɩ TpmԐOÊ虛qr8qm|\w\·m f/q:Z)fi hU; ϲt||סjZwhƓ_mn?;c{;4 {ߦ=V,.i 0(΋˶1MӴÆiXm9Grq8Dyz,]H:~|f)L n {<ƭ|Տ{R:>]H s˗sl<ϡl2|kҼK[l{_ӭti{̓csWryi/?9@դHF?ҮuɈ{z5lbeKr`WZpJ`|ȥKf׶9j&Mn21 | `{5jwqG>('tB9^(!c8< \ A$u:B@ ?q$FIכ㷮"|񍾐IR/ex:4NvWvFU<cJ~5w+}t#7L({"y%6AAjv0m ӲlH#=!@y?% k Sv!vɇ>uڽO1sLF3Z\&''oo?crrr]ѠCp8H=gI96 2bT)`$%P@}I5MmfҲjgij;9` J$h<7Qcs٘<"|;&&ww;WgucPAfYΊmO/Ng(x vq/)3Oh1jc+b>'\˲Z1'Υ*}/"V` ndD%1|(x1׶p,eHڧsN0l0V\СCZfԩ2c,BjOu/86њf4>GOm⊇ֳ,&u#`<-M{goY&gL:^_[uv'-1@vJ ;cMmZ[=s"ѤH^^>gcY6N Od݊}S^dN}4Ģ,x <2GHcG?`~l rÆm}Ԍ38s2dcǎe͖ILLnomH]R~֚.P]4W4F&)_㼔Jٚ'NA*{غ -k[{&eڟRyL)SxGF͖K(**sFuIu콾0p=ZӢI WU^ 4> 1x4X:84{: U Jj^8Gro\ڼ#ۙMUV*˸04z\1yN7!%GV95D^\c[78k,8q"^x!?={6SNkY06m&Mnzc9cf?A@bxHj: Әb;'b:g;6k$6k_mXN};ڍ\9!i2&{t,#'}mK J8vwõM2z_8N吐ca$;`Al;nJH 1yDX<<sH/լ3k+]H h\VֳtS \;;_ڲ܍^߫ 9ُHíu奒9P41 9g!wP*Xs'9~6a#LSAIͳlX9'n2t@m}}{?~<'Ofȑ{/((`̘1L>:k宻kuK8x8`:xdN >?Ys0%AXzN;nT';8cŚoٸ6ϱEpoAbBB쏈tơYy$%{&bf%k~z۫琔GѤhuKR"ұͥ=P\01{2sK\jd|WǶ]ak0vLwBD 6S2g8f2bcuC0&1%"r<}m%)8E햤|gF AMxcrVYr\"'#}z2 4@DE0vJ 4:ds "֘3 )6Z9r}HxW}CU!_D:A=ȑ r9}z8DDD)c8DDZPZqy-kE65-#°,ziШFCD&QRm61M'=hF%HQs=% D HJ9PSSRVO2q7WY9}d9{,P@DKc8D$\^V%B !qm 2y2ctnH;CDjV FHXi٘E4LU,;uF,"~,zow=h/3pHܬ4Y\@0`P!#mc6i5 ӊ#LMsn&^eq,YqguɈ{z5lbeKr`WZpJ`|ȥKf׶9 I&q 7w?>a05; u]y̜9#F0cƌo}n{w۷/osW>#1|xiYDo&i fZlc3ԍHM^b1# Ϸ\$k,Xn?>;wGeɒ%\2SN۹8ScOH!"q} ƲljȺ;ȜhEY&yd&&)(~ymk[|ɚv5c =\ رc>}ze۸曩;.\QF>#E1LeLcd5K:OXpR8+ ۂg2QVޮJKKy2e SLG!6[K.?ϭn{W_k9)pH\xk[T5aqaX\CϬo39a ͨ11(3' 8pl ױUӬYcĉ\xb1fϞlY06mӦMc۶m7?kѫWv'r$SH cY*#nTsId IPr%`0?l[b`qƯ&yY]y̚5J )((`8ec2i$~_; 0dȐMhH\tM 6J&e~$s3?y<ݓFQz*?';ҋP>yUn 2[㺖YmQܿ.Xly [lwޡi˙4i+V`ذaͶu3tPRRRӟz_~"bapGKȧ)xg!wPf\͓liXJ8450a! >wL<j&))iiڴiL<#GRPP4y晌3fke׮]M6m%% F IDAT%7q=0"G:pH\e%#3šUry\rFx0c 3~Gli%)8V+l>d# jy浹wy'wyg2EܺqkSOE>Lg) x\Ή.o w5<^@c}p,;S==|=at.ARZÄ!{aA >Ң}=dW5ݕReKɄqv9EDO "WMAY.Xtyĵ-?&, ۍLXsDͦ&:negH\nTUs ׶c6s,u󾿒;?D!"q 3'3kqK&n{ul ߵ6 ctv"A8D5#}O6m㍥Yf=qmTG3| 9(p!eŽSܻ{g""pHܩCD:%,DmP'oȾ)pHhCpp<ױ\4 "D¡hШECD:H},|u-|s,mpm,BSF]z?;$"ICD:HAK "g sʼY>|ew!zgyܳ,.} BHPm-du9%"BCD:DKc8LkFŠ} /B ,az)Y'@{%sdScxCe>V^nlx\chT6[DdnW Mo\< f\4rSC8φ&[ɚ؁4.H\x%%Hu4|~HǓ47o]E}!1^>}\uhؽhve08ͻLN+hqZ_oYr#ɜ-lOH_p {.[ CϒrldtH S tHJ':k 3=ߵ]ڲ$eT==;.IQf-yFIct^]]vוGf,:vEv "AEbq| )8vxW 5R212Lpmr|gQR{RG:[X1|#W[OK*">R1-˱Y?vz᭫Fr:eA0[UƊ퉼9PӮC#kp] c 5vh]-gqӛ-D];=1De:^{KiQb|*H I`<|,bktq\i{=_l|;&51k|Ekvsʼnk>sv~_Y FƠ[FJ " _{xO:1@.qFRIƄy81q=߱\P$y;XaAY%qـNkw7[,+['nj|ˈ8Dc|wlqO|:Y!z@0<jmLD0%1r{-j(s\qHL9!_x䦆ٿֳ^^葝3΋c:^S0 ƈ\X0ܕ]1wCE "ANt9$Xuێ#(j !.g8a^-5dt z5k:Yrj[=laCE^جCR88tG|}D^tKa򱹤%9,R=nWH8DC|_A xn8E=r’WbD>Ư݌^Ip#R*Xػ:$gv!)=1g~Rxs 8D$n"Z+S3yb6{%n8)hCz>t1q/|00.m|`gy.gk8'`SD`WHRR wl"fV6{zIy MZ~V-"_ "1 "1%}cF먯*#V ;V:CaS2I+"9-gG4D "rh i$$uv%"rm"""wuv "r*u!"""q9Jk>.ewUu1\"5-#°,za詢"G9dV_[GIc8V nj☱b%e,njzs5G皳 ;yD4CDeU,.i `@Qz]"tK  !(H 7>2qm2y2ctnH;)pH\]]ê{=w.>F11 dȆ=?++ms"N "7k+M4 E88ORx'qty Tc ݯrGr mO_wH;(pH_[@az[H-ѿƀ\ד3^ű%ySpnczTEjB=?GO4na0 |7 5ԨQq͖}c˖-k>EiCIM$hP uٻG|g8~$⯑v-[@Y= 88RI3xµM>\W^y%z+999KH!"qQkxCu}ilV|[{o'Ī `@z.d@(_ oFlJen8k[{&e)S0eyhe/ҸUBCD\\ۢ;#̲A0=S|Կgp{nwñ-\nWMf"//'pŘ={ve `ڴiL6m۶ƍ۸{UDCD"%&eK8ߐy1BnБKl.(]K6<3$/+:kNd|22FH!"qQDkV&/ȩO1[1Zb Hlz``$į&ǓYMÇ bĐA;o޼6׺xwrwsz(Lc8D$n&,j ;2xxdb}{-W ^15meW,'4^,~1 wIDz8D$n0aH!׶?l4 0w { `iNinwcJ>{ce0k,o_M&;)"rxRl*vdn}X njbQg3ry11׊1\b©_vnH;钊U8ƋNQMO uX`Ro],@<[]?+ "Nܓs^b8Vcp>}מk3lp17]-ƎE(p!3jpF.lKzz9 ӓ'f *rQC0 {ww.ED!SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS Jʷvt"%OǢ7߈G"%󂈴ƨ,wv"""rd;;;;xظ{_ #@ $:/ v^[m,۴֊67("`0+Gq\| I]6Mm'j!RD%# =5~Ń(*y8\f|uyʈi|ߣvW/|0 Ӎ`(ⲮcSӷ`BC\ěc[l^ pР[Q}ZҦ:,YGǓEaCes{.ewUu1\"5-#°,z?ל=HH 94qaݦl^Τ!>Mq kc\cґ)ZjHР 5@w B9pI_#[z8qZi͛7q1l0.]JMM /"IIIˇl˭]c^SN,|2xC̲hb,I~# LRc3MHM^b1# Ϸb,ٸc,}<.z ߿f oã-=d!, !vR$MDA+PJkZ/]ިH[[}DDEQQ5@HB$A'˙s3'93q ,|Y}ALΗeѬԽ{tyqW{Ҋg&31z}KUU'O+Ԥv̞9J-$W<E3nx?},)NK=4pF#ޭb&)))l߶Ƶ0[ݨnNJݘ&;d ]#Hb=)?RL:ޏSSz.MdSԙퟟ4 ,͏`-m%8$[ϒE?dǑ$??5ovw'0(-O>6 ;>CXќXvoȶ)ݲؿ3@igMӰX,l6 -[=f 6tl'$<!ukWjG mj1Uh<>>;wKNNG&++~-[{nXf 3f̠I4ivÇMNNz???;FHH=cƌȑ#X 8/r"x5iTTk-ŀl&:GcG-{9⨯bGGW$d*">q0ȾAP=6zƏ4RIDAT <}Gſ?EK3aD iaБ̂Y=Kvqطg[%(=>͛{o$(8?}G haBom6i5躎XV$IbСlxm&NG嗚LB˸1t0r|(b2,*@ (/Ƭ)ؓ˾@6%tFTtUKJΝo5m^{Cgl޼cΜ90fONQQ555ڵ}edgg}v `ٲe\/^( 8W\EnrS(WKqb3(z5/B[|!0KBՅrdIb2F& :H r;'_t [uU*\۟FQ( E0փaR^w]{XhFh&>  s0v@<8*++ٻw/3g/#c dYfs1N n~?Xa95f&MTjشq=Q ζbQ7%%p"9;bWq7D)!0˹SG9hnuqBJBc9CjB$ϖ`* ~+gMs#Aar-r;R MAWTt;1YXĖ7L}4R&NDeU%ƍc<쯰YM[0jZv?^m^1P=򷱏Fag֕WAvײOr5 ]9dw+.tEeyAhF)pJH+uMFB$tUVdRRRgKl1V ?}vo[V'AGѾc'!3gdrIλ=nQ"hIi ;9r݃Guk=ř?dPCв%[@R|,:OGGyYOǘӗ173y5=`{w3gXRFOΜ//sdgϟGWUƒˈ!IN* UEIԱ=:oѬV+AW}ÏCӳ]f^#wұެ$I"sG:wlpXdwt 4% ~~"QZ?5HXmbݐ 4UmZ ФCdb)qU tW%1QA|s!I2!Ԃ5֦ɓM 8,VcS;|cXڈ~vd5QqWXm$ݕG::'A iB~I>ݳ{\s\hL67@Yv:Kqy \[UDFr=b ms֏ ʦC7Z Y #>>Ȩk iRe*ۻw9:"!K`;?_ :.\:RbTĸ µ9  B  N  4;p D! B  N  4;p D! B  _8sCcyIENDB`netemul-1.0/doc/en/img/netcard.jpeg0000644000175000017500000006755311254745330016335 0ustar frostfrostPNG  IHDRn"J sBIT|dtEXtSoftwaregnome-screenshot> IDATxy|Lϙl$ZRJBj)vBՒ*ZQE۫UU\kV-UJKk-JPHdF#d&昄k^&{w$3Ϝ+Jׁ,JbG,DDD"`%"" ,X`DKDD$X"""H,DDD"oo`琒Q2~^n υX;"2Yܵl|Iر6TbFDi7nbCxKsY;$"2Yv35 }j]XqhW];`ï'X`j #з.A +ѣ [vDd -mehJ(H%vDd"IH3'هL=FD`΀>ǬɯAS3 U8((@^D*X=s#""sFȤ]i\bnjp&鷕P)N!4"xב]7y{<|D/^NTU`e]]U^_UpneDRS+xvj D) ż-X7s-4} MK ZQD [hwd;\$ Nd#_yb x7 v(O/!j1kFH<&?(­4񲇧(V( \4knnr? LJCzw[7LGE@OfC G!<ʾ"&m܂J?X"^ztO CP@&hldncE_ACeфz xLUW//~q' ww9Ow&u{!?ʾf}'.݂ߨǏ :\/(=(VOq6H%i{Q3%PR|NJ“SSжeZcTT\OKT̝|">;]"`R̫JJo#1YD_}Ưb&pqq>HM K<=KTy n֔~þAΝb%B?d-tgPi!;-JUk`[3?xmPk"|oF  !88KLz>pf&ZC`C8;܈{X_x V1;DT >^]\PR 5o\1L |.SWJX-ҿXLJ8Ԕdu?g尵isg!w.5f,7o;;;:udge!;& NNNԩSEEVqx_w6"&M>X*{,֮/fhP+ M I1e82pm+?a'cAT@[O}/В23C ` n׿q{^iO9*%\]]w ),*pu"&]̾V"$w{u6N"p;p+}ḵ+|C2䭭j%JZ5o:Oى]A{jtP+)O촲_>Ο;a-iiȿ}͚7{2߽=v1NNEgÆx} pr2JŰ,>(ڇ!®Iį]!hJw+()FE ADDL{g*>3xzzDn!.#%9߇A?G%_.FNFnQX*xQmc1XYã7vFDcO@[SZcƁ?! OA,F;Է7"?g35ǚ5!hcAvҫ'M·۶"ݓ$它O:u ^z%tBDƪU+(J1f_߂ ARmtXou$Ԋ{B(JQ\(€/cΌJAdVLdINQQCqXRA=ۢMHu9J D6-axY&A8*,Qbvmڸ|:x*df߂Vw]O8>|DO/X̓J U4d(6'W8 ꕙbh'^%]̾plI0KDwr"]$l#Zz |XQtj T '7mĠQ?7?+j.6:je1?l[./zF"߂%"vQ"""u1YcǭmM׬cDDDd"&"" ,X`DKDD$X"""2ǕN*:B66w@Ms)po΂E,R^uѪshڼf~>b̸cЭ@@"XgDDhJrvm> R)L^1Toгo4 v8DD\ݰwfbVIN!V,v(DD_@rn'Nna"" Jef/$ڌRD[;Ij°n:EDT[U3%E /~z˥Ls߸ܗ' ߶ڴif-h0m4xzzCVVٯMDTU3Z9nn5ch~Tk`UGO>mp1dffBDEE=&"zTZ;4j >>y 0yj,B/ 3g$h.ڴbo)4 !x>N<Xm߀D쌙P׋s>ޱ vׯ(6Aٹ;>;#sw<ۮ#~=xHnJ -+ۯ:vꆤW1a3Z_#LϵAh4l4 ljㇱ8W!M:ғqjxzza֍HON;pP"~5wދ/A}J/;>ra;6mVen?+_`xcdt:cظi ϛ+ТE3D'O#8|'ٻ;v2i=g/2H<ٸx"W^h4Xh5kyիؼ+V>۷1j(9:n7кukpuuٳg͎2Z2}_|m׮%cӏLw ''gaW¡É?u^h㣟>vH:hǨIs3k&lmwTרpuut+yƌư!9 @u`znrOfgX;"ZfF<՚Gp8y'\O-Y"jj4|~FB,6ky^J͹ #= QM$Hf_ c1fg=$jVCTC݋j6Re5(,X`DKDD$X"""g6:TbTJ̼C v̻? l-sN!RSߐ ,()*dɒ VŊ+вeK,_ʾ }7бcG4h@?Oe너jcU.SzHMKKIJ[a-[6wo@C["vLj}x{44 o@'OUU~:_` ?o|U푝cGsw@;vw#?"iHNN/K,Y"iޟ9ۤcU}ggg,X@RR祗^!Co}4T {{{D"1ݔ'j_RR ooo8::"&&7MZv.\XV={ѣ8|1sjM^'DT<-XLaQ[;vBhh۷nDzrށG:7oЁWӳ׭cW.?lǦ- vދ/A}J/z rrsq4q?]>ϵAh4t/ķE=u QC@mpYlOxR[p nZ?-008{I}XjٱߦMPL6 EEEoРAHHH@ff&פQ?NcbܹFcX|9뇧~:te˪7B&afѣUפeb#Ö-BTb52yz ||DZGDիD|yW5t Ξ=9fn}w~٪5"w?d]K٧ 2 NANNΜNsDAA!Ѣy3 &O*-*??d0IV{W^5l2xxx<.s2XeŽ;p,Zv2imE͘1F:u}vX >d899USFFv܉#FFuAuxO\\ƌ[[["z[;94GfOcŸt2z|~=h0ώ4nү_L*CQQ~+7#3v~M[ ov\\+͛pvv~~Uq  3yyѺ3[^oOFxg$x;|+l{8;; ۪#::g6jr{Y/yÆ W_!22nݪp"NDjڴ)rrr舕+W"<<Ν3{}$''O>oVk~7D.]nA[HHHѣ+ԩS8q [rs n8j06~|;L6~6ůApH$|r56oxׯJLx{7XvƂBqJJJpZ2Z][!p,bIS>-SQÿZ (**©S0i$t^^^fWn]x{{cҥ˃J²ePPP-Z>׿_8s Μ9(!!SNݻ#G9s v܉cǎܹs|#&&YU너jGrlY662DvmAA}w z^}``+C.wGѣk|ҤVBЧ`4/sӔvcV\:v&hס~'A|ơO-eKTi8yW2v73fwhժ֭ J'PZ ߿?4 _Ǐ_m_~cڵ&oݺu 3z-Z`۶'T*Ν; 8;;cɒ%ذa~iGz)4h@_to\\\l2[Fzݻ]v5k}ywV:!:wrneDDPpvnۈ1bx'Yޒy30n,U~h,wὈ=ދ Ɓv""z8eej\LDD:UȤRhy)#h ƭLY`kA"q3# n^j۸aElmܴ9N S.sKHDZד/OߢuHU/T/өEt(47&.:rjcI"Z=o@( M=,dvH8Z bg.EL֡T*/%"" ,X`DKDD$X"""H,DDD"`%"" ,X@No IDAT`DKDD$X"""YN*:є#@H`cc ;{eeΖbr.)Dj5>rADR^uѪshڼ93gk+X`H,͌8xz_$hJrvm> R)O̜k1r.)9m /v"kPqc7 MY;=솽?lSC939'IN豢jz>R~AȽy"[ ̹bΖųRK=tBWv#ʠB1皊9[#)YbhԳ/""׃*]fi y|B3fBVӯ_GQ l/} =swh.Bx.n`X4 _`8)ex)= P4 3JXh+g/q2皋9[#;{puu1th;3:C?lߺ ||QXrL40zx4 m5sƌ1Xvص{/~~+>J#qp" ={sf̈́-\]U3jD^O?d2bߝ9.BۣEfPiL4'~5H+7Fi GGGYYYV>cqZ/̜Œ9+JFxyz遬llڲ ;w^,Yn|"͛7w77} ϫjC~ m hu [݆/~^-ZK*'|m۶رc̄ BtӒ}1gl-̹G8%54thcmxml_H$fj$l [. P(JꗯݘzA;vyWzJFMx$]8 Jۈ*cO\\!((`!)) !!!:DȻ}FDsf59j+JF]KIf$wFU(jnX>^$$O7 EZK㖛nLpFoもBqJJJpZ2Z][!@ #XŒu Vy5loDL{g23v?M&9_yϛ>yol'9RE$$g  mP>NKŜcΏ%s6W^dBor>>>8u~ZJJ вeG^8-s.ŜÒ9KdeN󑖖""22j'߀93gk70;JD`ƌCVP\\]"!! '̙9[KL3Y*bX`"2N-\30g +JDd2Xj*\s=3皋9[_Qz%" dj4RZR(1皊9[ ,  ΰv(w/haɜk.lYӦζxDd2ǧppuhg4VVԫ8{<vjJ_̜Mne3;UIҳ*ssn©'ZaI$yYEΎ93@c% D"v(j5P+R*,/sY'""zH,DDD"`%"" ,X`DKDD$X"""H,DDD"`%"" ,X`D vDO<*U1T*%tZ)G vt˜-ӧ0g\ ,ݹSԔk8}7fgAS>)R~AȽy"[ ̹bΖ%Yaͺ ֬݀b$Q-T-t9TٲD+/uiix) Ty6>`q+ AphKΘ Zoh,B4 Ϝm GQ(**j|Y2N\s1gF#Ö-BTb52yz ||۱GD܅?QPP{{{h` > ɓ&"fH$ӦM'ѯ_?deeY!iɾ3sKlЯ(͚=ҥٱs^žEXvl(,,狸_סiҽ'v` xꩧ0vH1S! ym'`۶m8v233!}d_̙9[%s.K[%1 <vmxm;:3'w?JMy> ۷fM0;"3v'..ӧOGPP`8pIIIV)ǩ~'V]_3sZw =^M1) hZ7n D]ov-GA.  /ʤXb6 Ao;xX"nD[nƍhݺ~Z`` \]]qG)ǩ~+쾘s)lbF662Dv`-((NA:u "=~BYs>տN4ƊeKdЏD"a>D>xx{ljn}<&O vDVO~~''ÿs'''}5r꿟ϯV_>u Vy ۺwL{g23͞nT-_ ~NKŜK1gdeY,bbb0|DHn3* 3sNr7'zD`ƌCVP\\]"!7M ̜EtX`طgT `V8ls-د(:cibsKL<KzoΜk.l~E镈L$@*AX;Ji5He:Ĝk*lY,DV$H$p{"7;ڡTfF=>%seIO:M:NXZ7R\xC)y~3s6r.K.PDT%JϪ͹ #\hZk'Hf_ ;;̜k1r.s1V*¢2皅9[ ,jq"" ,X`DKDD$X"""H,DDD"`%""A*^~kNjvvu}qᅪz-"".C^򺾨#:aͺ bos϶y$e̺jpya4FYs>FphK4h_CNN""ժ;Wu#W/aQtqc{+{"$ShܨҊoZV[vGaKq)޴vXDDZ 2 NNufJt_Sc4 ~MoP$'藽};oOa p)-ٹA\i&~:_` ?_aSޙM[h6_-[s>ޱ vKVЖ1*ZWdXh1^7~бS7$] ֺaҔw v*.^fa?(!McjZLzM4S|8$9Wp""Cݶ{t:l1v<>QGC)-~ԫy& Iظ~5<==MZʕ8w~ZMo~ LoK`۱i˶ ?0h` '_׷ڽ_/_ă^h[7"=9 {wCXr6nڂ"h #H<3 {ÎW˥˘7!Կ.c2Pg!>h^23o"E ~pqq V>r*km@f?(oMo/EHpc\O?d2bߝ9^ '̃WiQm?*-/6nt:lL؂aC._ٳ0gLNJ5"r/wG}~cGġÉˌ5!aggC!5-sfNyW܅?QPP{{{hLZ'M㇍^PPS`z:((, ""@V E[쏰kѻW\q a"/6`gk ojYcE Ƈ>cp;6z|٤ w77}[Cxx ~ޱsƭ@Ie(**B``<2ptt4TLʥug |r5ޞ2 I.tc ©N'""cU` //O,mF`oֲA]*222]ߠ^z.k `kg={v>7KIQXXBQXٌL6~6ůApH$|r56ovWz+{BV#~&z .s}~z8{'`吻cn lv:w?W\;to@FBnnJ5&:j0/Z=fVe,V`CxK09nY]AA}w z^}`,; fC?([˖ piO4/uN]^F@R_=tDDO2VVA=njխj X"""H,DDD"U)sJLDD ǃ}Lt7[?KDp8,1bǃ5q!xg_DDvů۫R(*Go_Y.ϜK0h6c^1b8=-Oc!3&T9leߓ^}~zXf~rl4 ljㇱ8KDde`GDՏhӾ][4 ^8~ORet ͅT*5)c8F,uq~ C†5MY7FDD`vx\J N56 9%{rr#bW$}gʺZr/KDd]`G;C`XrYMH$X3tG>iR.&m~P4cYǃ5Cdx ڡQ WnHDDT[D-X"""Vw@BRϾf؋0(j8BQ'ϴi7&NX@knFh\|n׶6JD0`hx{r[֣ukdXh1^7~бS7$] ֺaҔwjMΏc`f_zK) 1eLן~ڇqK/{0}T1q2t:qM?0h` '_׷ڽ_/_ă^U 7mys|Zhcpi$={釣*?JDDU`% v}m>ϿXȮhڢ~+qKG֏ ŮZ0F\Y3j8BC BjZ:?8::"00";c*?JDD=\>x:>x:Tj5nݎISޅ/4n @TV72 ~l|{e h0MTz\֭DDckcQq1]˫lsT5>ku2.+`%""]Ĺn᣹pŸP(**†MHIIEVTkLʏkZ]UZU1X =rrr0zxqhK,[ ./v zcU~\2e|,?JDDfDDD"J$""X`DKDD$X"""ݱi6kADD\&t#v>I8F,QTƃ>!xg_DDvq`oS!i|B|D'8yQ(*Go_Y~1b31bݷ7Bqq1._{cN9V5F,QLDTs`GDѾ][4 ^8WCS?襤 >/WLj%"z2`<= ~@Vv6ǁ̄-|+{}|;fƃ5ϗc=jx)i?CD*ǁ_J oY3/aHذF)c=yjxkRet:Y)ݳG6jx'v>Ɣ4ʤXb6 A[:)c=jxFDi!0i,j9֬Zo&zrhߡ3|B04zWDE ?Cp3&W>~KDdFv o QU"X`DP+wt܂%"" ,X`DKDD$X"""H,DDD"`%"" ,X`DKDD$X>{ IDAT"""H,DDD"`%"" ,X`DKDD$X"""H2k@554%tZkS2[溶${y[X`IOT|Z.NGBkSH%8 e􂍝CJȼ?/ ?GIH\׏,ܿX` )Q#9+ PqC=!<`*N;y9| m& !WSƭ;} GtBP㦐=%jRJBa#uOaߖ1,Д߯^Hkrv%jetZCat?@o'3o$=VI$(U>N&b25Z{8SXNp ebv1bh*ԑbnp ӂ|'['KrK=W v[%b((Q>WcOaHǧ2CѸ>Kh/H#d m _CZVUJ(q)6M2^l^[,\S~{HV4I!Gnh,=i3y] 8IQ)4%*((5Z<%9"J*h*UJ2nfc^&ѡft<5yU\D;p'I.uo,Kw?xFZJ JbJ4%h*hJhԥ!9,Zk1Ji=ֽD@UhS.-+)yaTb.Pf?>_u)dQWn)q$M9gw$B%H1" bUы ]XAPPATJTz 5-l&6 2yȞwg̜9sp:{H.";$5@S.1,^?m8qI8}t/4p8]t`q:TԩgϾ e% WC0C:3gsh2'裐я@^qSTK7~',OwmjT:R;8N7/v)C~&]u;i,`]+$I̛7w^OCH T{=:$IB$HHH;`uƫsiLP&+@%lؽ9ۻdGl9"5\%9׶df͚uAy&ey&N5\sA_(* ~&`P8NE,a laC0+[MX$t:iMMqm.v?\m3k,Ҙ9si:=j1Ip:Q.]Jtt4;w/0P^ł_Sp ď(A?T$ H 9r4w}o nZn} |l;V]Sq88 RB}k  jAp"*m:6l˗si>c~'vQ!ȑ#ӇoT$ddQ$%IPQѫzJl&00&OP,nq p kx_Ԥqez6 +PNlu9Y9dW(u%WzꚊ:ω?z AVA$S!bL%躆tmz<7:³8VҒN5AQq1P\\@~kj^qj~[y٧>}ziS0~5ꑖsf1i}Z'2xZ6 b"T/֔ddl6QTTLbbsw?V2;x`Vz紫&۾D8XAxjY/קpصu\ YӉӏ.?3v4(>FΘsFVZ]י;Μ9CBb̞>X():n_MkۯLOͿ)٠iڈ 2bu`rl;#<ֳz-s6lH-1 ׽XEXXX 6$4hPczlaPi9<^s*Z] 1-$'?4 JJl86<5QQ`f]iHLL,11̛ۤ1g\ye:tCtG3r=rV{c^zd]՗٣,3ݙ||w7e?..Afqj/RȀ7!6HFUhj^]?W qp7yaQ g t4ӽUWJL\ɱcJ6XvҺ5m0u;Ha=e}5{|qezωfkY! cκ4qqT}6r챞e',MӰٳIO?ˌwg}YINJG0HDaaK^inlz>2"}<x:,vͲq% HuB9 nYnn/Ưk\9]U<+"1Z=8ȺuQUJddˎ_Y~͎$'%a2((,d*^Y-ZG?ÇpHF}`U!I^@tYaQtc'9y7(Zk>㹔8hN{+tMWN5{0xڵ#&6Gǎ==$,UWӱS_7iWSWWӹ=q|l%%m6J)**!/_%@P`;  'aR&goѲO?Ok{ѣ6+-\JOmDD2[>]m)Ѻ}a+f M{XjeeH<괣8hN&Ƽa `ٯV] GIqIhJi>NjR+^0WvA># K^J9l,35ڬNO@W(;N{[]{}=k3&>ޢaj J28B*(X´oxCSqOxȵV^թoU+Zm뇏Mmt8U||iY+nwoN_6bTS᱇p]eU@Tgut\zz;3k3ZqmfH|Zԝ1C DpxR5` U~6B`R+6ٺ+6-FASף Ef2Oƣ8\#0Ua(]@w*fzusm{k<Ѹ&=LBSlIFs+@$GԵV ߲gTyۆp /cQ=S8ƝݣYruZv =wg x}.DRCll}w=Y$31~տĻ٧; *|M̲֮J,]5mWaTUgjakxNoĂ${˅$D!s0KbF3:B{p9V7sb;w/q=t;CSiܒ^]~? h,-~w?5uPvtAJRsVP%Y>9vIw8klcテd:(D"1t$5e =}^P+_ $I"Y#5ͿXy`nL^Rhq^; \ndUU0[XP9De_i:`HL\x @$Ptti'.2 I Gf!6O2;=LXx}xҷ*C8X&~W5aΪ}1t p1@"wXLj2[HJIehFf-hq)(G Wٿ,S/,DE >ÛU a*k_[Չv!!K`Bj־Ch/+[gV #vV :@8X@ `@ M.S KU Az$&4;+"Dq8:];)˽չdPoPmzçve-8$Kąү}<=Zkm_?`s:Jhޢ5f?RlOQ'GeXL a2[*M |~IUbii*eɊ_ @JBjڷx+C8Xe;]{yRŮ%GT ׭&"*N*_ۑ]lm1l&yw 0_Il^֢_oznͥIB]K ,FUU1 hҤBxMødרu'}2\OE|0[5&sU#fTͨQCѯO9:泎 ; .)qŮEbwfN>Z Mpe+yxDϋW?:~<'6>Kĉl6d??$"B8X8U;//ͽ$`ӳZݰ&/v. Ejμ?}r%*z[Fl{RGaE܍7Ң;M…4j͚k*.bƗiݬ-(9ZHb\]4t…YnV~Ql;eů`\zoGQ<~<}'NIZAAo&͖OYѡm.q|Hfn:_o`w*2Q S4bW 晩Ke:`S5P4E5;dI`u;P ssF]u+7nD-*bt> kGZ>:Nu#@C&/n%_9F<"bE[N={E)0: np| Su/+[7@AA%4 ϻnCvfy.{ɓٶl`8H įƱqH\q XF @#~6=MzsgIN,C$m+Hļy.@/u9uZbWy}JQ}*kݧnSb;m/=bZ5ʄ(n_,M7*Luܾe%CqznSSfC̤E'NaPRTo_}5 Tk_~o$22Bfxή V %Bq3w,fhV ]י5kiii̜9¡F9<=+"C1j׺;&ΧbKfV@ߛȰ*7l:wYwm<|aϋF٣G.X7+.Neҥ~]﹇G8p)p͙C?&y*m}wtޝT6oLAA~- ؈Uxo\ҍpvhk"be|0:#˗/,[TvA6mm۶O>رB y7۷G>}:3f`֭cUV8p&M" qYݯ$9!"Қcړal3bj Z"I_HtN es?{ޠ$&fpn{4ק#0(ct!$9͛m@Q0 г0ٳI7Wi0 xƎ/>k:u"??'W_aر#3f 11 St> ox[(fog;v@;Ezxl&~1sLJJJ ݺuw='ҥK?>6l`ڴitMdffz_ȑ#9p6mr3g}sߏYY3|`WDxn+#w,<g߱\a)$;GNb I9  VḦiORPd:=^GdL,oΞ`%9U(#l6[tG&<<ݻ¢E:}q92d7\d>=h d޽^3gѬY3YbSN%""?ɓ'ټy1E,lxon%-*Z5m n4?/S`&R:sGe+Ϛq|Rxw;DFFҥs% tƍ2ꎑF 6"#8q{IA񺮡8m{o՗?(:{ɼ*+k85&c85U$ ̲AE"o2[-)$~9u-;A%}^zukҥ+&\!#qH Hgrh5b$-t֫ZXH#4~# 2ݗ_.)S8l6F`=MѣXV"{$}T8nX8y"C] FɣT%dÌMcO R][^~QruObZzd_ 3gΐDf-"=2{:tχ0b۷oO%}Ȩ;Fby6kF|3c8""Ʊ;*vQ.k:L>ZVoЂJۢ*|jOhFIaOZ>x7ߟ+l/#зl4L:jk1ΜKr~l%JI̟xÀ㌺}f{wwN}fRoM}N"..Afs4hIUl};d>@~*u_/pI< {Na"7r}Qlbh(s S~ݽWOVرL~~%~_,_~]ޟ;{>x7 }=[{:_ki)or";F!d>iHK:&EӾE4iͣi4HJ*`f:mqmYyhҫ|l>7<;pMAZZV?Цm7Mn"?7Kw`cs}av,W^Iʕ|sbJLD۲]pfrZ,37yg ^~U=`߾t}y~96]INJd2QPXܹTht$V-[ңGwƍ@vv6$q 9)=3v"~ MӪ=B)b勇?ذf5l3LdWOp絏˞(^(BȻ^d\)X-UO9sAk׮~tؑs7&wc=Ν;aOkԨ=5ė]kyjt܉uR :Z7oC#z3nՄW@7ɟW^ 4؟ȰPoIUOs^Z=s!͘3UUoړWUUL&oqIn9m/ϗHzJz:>}ڹ}h?m ޙAѣI8m?Ju?Vk\^{靻RPXHÆ [Xeܚ*.hМg~ů[9B{JosXtD(۟7ժ|n>>m_qUg^W'ia6$]ht3yZc#} ۶reZxNA}OIAݶC~='}K}UXgU?3iLTe7VV\?,3]mVSz)oUi|e_#g.CHnˋˆ~l7vDI!޸mM^kfc!uZh=XVf-rtM9kyԣ b6No߾|'>b$~~VyWk,3ၿgvʦo'!EGSb3q"Fa!h͚e  F5VpRۓ_tH&#sOE`H;2B-8 ʂjWekHFeӧUM]8CQUMSTW5%"W?PN'2$c2Ȳ ٌdv@^ڠi{d289g1zXkozS(BX,l}eKrs]JIIXn19v,V ޭMs9MQPUUUPU`FM C7dLMfL3ff01 ~?d_^ֆ~P~[oWҮswg$[ *Qw$[Q|TUEudY&q=l[G&{VN'pU T\x2?lbpe\_޼aڢ 7*K('ۺF򱇕1au CGFd0\念At=tݵ5`r_L&dl6am(?z-xJKK6W˿L0.ܩe6];Q0cX\&ɽZZ$L\a=&قXbq.]\xNM?',?-\T}3E|{Ʉd0n.45&dde Iݔ\nX4X~=wuG2>CB$`uzl<&1J<;Qbw=+,{6(p)b7 0OZUU榛n& o1c_l6sUnUĀbb]+Żi1- .[.ǩڋ_A6dffr#hJޙ~m{9Əǒӵ\_A .K$YFU]KUq:O&YB6ґK4ai}enq/v[ <1 &0a&vnꮽ0[}2[5r[~]7xFL .;$I&,ljÄׯ$Gsʽ!ϥ_Ӄ[GUt;-Z2uTBBBHKKc8vw&ny+C`&T֮^k4iR\{89rh׬iXwj+eH6dG&Mxa|BBpCd]t5Y|I8y"%?neX5j-oWsy@'8?|5eza$$4'*:U-,VnxN1vir ]wOf3TSwsNB#㈈oApX1qQ!Mu|GZ~;!2@Uv)x,J`P5ߗh]\ǜzWi@@K7o?+p@ I :@8X@ `@ V :@8X@ `@ V :@8X@ ۨuHvIENDB`netemul-1.0/doc/en/img/first.jpeg0000644000175000017500000010534411254745330016033 0ustar frostfrostPNG  IHDRl|sBIT|dtEXtSoftwaregnome-screenshot> IDATxwU>S繽HM}u-+]ןUֆ )v"RR %! ~ScҸ{g9L9MsW[bqLLLLLLLLL1111111111vqLLLLLLLLLLJġ1111111111؟pwpG]~58d.6vl K`’8[e zq\MO<5h%C'͟aLc|/%%|_;ⷷ\ ė#ezj];1ZSPT”0i sަLKAaјL:IF\;Ȇg<&O̹uk3Vu.Ms׏x/Mysʫe\'埆V8>111111$/cw}˖m:N~if~/}᳔{Ng> yGաc8i2,ˢ{wl!e>k}ު'fzRq㭷.Od„ 'WPyXJ9]^)X縱eemd27ÕW_~q1?Iz&O:6?0"/x* Zӟӗ-e x2G8KLÁ)Ոd޷s d98eTUOf%؍lyi6z럢ϭ`߲T;6a_XnZ.C_//Ȥػy[NM457wIpsfw޷]K.#ůoK_4\Aǩ=Ȥ8x8vuwSdSX~< C:X{/rwp՛geWԪ5|_`_̻!3g΂%,/H0zmPm=?UQ!;G$r uuL:'Z͜ٳxr>c:O>=۶e^)G[^UetvP3i:Գ((*Pc۷<ҳVH&i籄ҳV`;v}N=B<vn22aܓjcYTC9I;g6xϻŋ5sBmr~d%^*bɲsټe+,^/}?wӦM c9x{>@uy/QS]́ڃ>cy Er<1)/+uya+>ͺx;n ;=ϛyڽwײJKK+^<"!ov/l?? %׾Gd(+-e)yrzzڵ|~'ӧOxH}„A||g?)yf=]ݼ WM$ L|oq߽ǒe/GuÖ8|Θ1c$'͛?}Cˇ!Hp􊉉9Q8~(£4ᰦhywQ s;of;Κp(aC eeXq&0ib {(g#5UXD2U@Ks3akomF+EiEU_ٞt(-̯I&Bx؎{qlc4;ql87peK\櫇t7I&<_Ïr훯&Lޚ>H/Zl~v-ϮYɋVI./> kVcy#0ylZ[xv_ؾyðuJ0sNZ¢c_K/uƷ31}˖z V\z%s,mw1dn_w,>~n~o3yD[x7z;\e-9y O?uSZR<{HyF<OxxxuM 1'$[7>CTOǼk׽eL[+&&&&o'"RI|p|1oUe^6+E+O[W[ Dそ['&&&&&&&&8"&&&&&&&&&pb8&&&&&&&&&b8&&&&&&&&&W[W~2ġy-2ccj'B`|q),.!b?&&&&&&&&f8fvq[s ZG`6U5,X L"ļ8A[!6,qa'gV[ʪ)L>)&&&&&&&&5ܐ-}~,:e)eee$}b*Ŧ-73D3de*LII1n"I2Y%ۈNz#&&&&&&&&506(llvN,R x똘2!M`{m,i{m_Iw"ÐtN9~Ӱ0.t`vL;$WX&ftM]F|bbN͛rNH!?CiڢYp^6(cGk+"Fc{~#CLP:s9h'Ӄ }> oϰ) CTeQ#CKK,#F!ߕ$ C'͑ff^0铫9c᜿[yƴ5h ߐ 59?D>JOAiM,z6y*˴̘HIarL ;$7l < ΗOfѤb?į7Y=t/{iok QA%%TضEeE%SMc„sb8&wM۩xH]+\G9sN`a/děX_7O;\9ТDjŒM$;yr_@$q$*Kɦ'QRX:$Lq)*[[NYFqUiý[2auȶ(rmR!al 0 h1h-FI?Ȣ@)IHHWL3A+"6IX)v  il#Kp!N {&Y+Yfmkgoˁ-R tIwws׷~̮}չ/ ?ےaOGB"Pi XIDE!sdVa~괇־Ⱦ&>sUQ=1r6(طw==}뒩maY6RJ0k4ZZhjn{5ߵsm\t$c4Ĝ0(Ƹ @vHu 7U6S]RWIT2t掬p^뛹K)9& /fΏhB|.<}9I(R]0i2*3CƎ2ZCWF+"-l<$$(v )6h.A` C&&͑Igqh3~z`0 Wt GaEhtJ"C-@IzҚl6KwOl&KII >}lkEޜ,,]I% N,2T,r]~Qz?R#GLp^+-kApl DZql1K>&ZigKyѵ*T BE(%A"CIFr)N8*{lڱ|AĻ:Zmcػw=yض-H&QJQXX!A.%LP\\C hhhDiVF{/\׏86cbNFގw0VzQ<=y7UH9 OpnDmoZC|=אRgQV7}rY?YՎEgr?D>GO7 Ym,[KgP~G7NeYt'X#i RPBcvUq嵡訫v(+/#t,\.R$` ۶(..FAYi S'O)%u }\x晧Y|H11' G1~AGb8g 'M[LJBV68 ?p#*\-ٴs|^^5S-%=kTSLs<sK&6,=u7gShgLܗCGў L ](MY+22񃀶nr9r2V*J6ƲYʔMEE-pmC+(L8؂4gZEY-@Z"\x^@{g7m]ds>Z&M+˧2AD>JQm [PLC`[ӱl: `lW$mfR,*I3b*vqIQ{rl>$~`o(#a ֤(v *P Ɛ }?@a2@ +WspHC%d(O\ IDATv,RB07)#J'~g%R) tdӎ2хRDY"JqXPe(Щ/9 0u3ׄZ}9nm8%Eah4p,6P3}({ UtuQ-$[@6%IKPjqCu?}t(QmeCu[ ?)*p0F_CIʥːBt}g /|:\=Pp 8@uQca~vzvZKQnW`VGݴdqpkOO\dd ˱%"p:t:mEa CT=iS`iKHg2 "ZiMKk g;j_LL̫O>zenxd&}ИU:TFnvt<s u2d'ĵ~ԂĻZ/C&=jyfN=uE/ K84>9uhX6viZ?e c̗>qCtz/j]zd{*hUE3QHi#^ 9T*EQa \Hs[CʐsfQ4 ~Wq=8KeM8d"H2Y2A JaDi7U9J=拟\k@O\SJSz/ofqWc5-I؂"Gb/Z-X CiArإ@r.@f gYIgY>x8I(ӆ4Fkv8:v!}0Pdh|_r&+J 80&(J8D[F!Td:hljlT~^xn#jWbuK'r[l ?}vޟY1 ?_<3?0`@تuϣu#-eB i2 .l%NFy> 1 ώn2P뫯GPGG㸶R)LHA*ּ'V۲0:+$/ʊ2 )//fb5^Σ5{=\es 1pqR壌E#H9 _fJr" d3v0Q>V(S{ bU>^-9pk{o>f;ԐعO{C+#̘=ŽtYاӳi)gAE?i8i/rm4{:QƦibN&tgKxvv>{SF)!JU3khI:t ?Ȭ"U؄yuCI6ndS_ M\N*6 8sTy?1D4҄R"B>/a'VaFm@?`u="ýOb6Ge\.Cg&@Ka"1D^acAj!/XhLF(+L>OO&KO:KgO]] L^cFkTtװ5rLo8CR C>lIiխ8vОh*SY(:WjcVz>5ih?~b /,{61wƔf 8"ʐ Iv,rɨ~ơ/'إ`%A$0¡+V7u>nC|aW`!I"rBF})Q,m99e"̞EgW(ک@Tq㘘#.<7f?Yz{M;g0@Xb.;PpF($ D{3Y[;]}Z;zGt{yBk BM&uL) R[~HxٜQzSQv_4rwrMI-AiᲸ,TyPr }(<-\nbB:>~v iޒ3&]h{MjP(. y7:M[Bg"prGG"IT>#EdHu(G=4²(H%),,IJ,Z[#/5#pH0 a~T02p0 73::espwo=@aRtW}n4x'3W@g!;ȷ^g вnXc7v6{[&?ql+u~SgzSi֟{uf9w.W[o5[Dy*g)':.lC4Moe|x/Y[?0;OcP:- 66U$7vm-O1?8nq (B ^s4 QaF n YUǹ|7f|8zk@z&m,bigҸO#M1RU!ahS.pi# x|iBVm(J 5R)=$LL6yS<}#8B\[s]%E^b,2MwL\ۅ;7 鵈]p*#91 Bf=<í9nT( B2Wh0^%A+LPze`ĺ }t4d@ki$ p!58gp|z6c dk/])E.111'~0كںa ZҞ$ia@Qll@v=WAE1TxY a4A9Q2Σ{"ɧv6GJ"M(Cr[ቦU6x2%̩hcE3|caŴ-ܲbdZ3Ky:R1A?J (8'~~>e4!n4dJ|&}Za4K{: 4_BKh Dk0!VG^R\\(&:B{8_?~p52q4z QQp! l8p^J&ڒO^ }獆q3V~~ m F ITBr9yA4y>Ż~tK0a@uӣ [ V)8ՄQ@*; C0`A'45tE&%ˑfZtWHGLto'6?aִd3ؖJ}i @ j~ OPJi,aJ8sfؙx>^ss|_(+^^6=h~"#@^OS1A5OV%( Td_jw]K|&蜾c㌵Tx{8-6NSy`;xp%ӷ y G/DTM{WM^v#6,=ⷵpγ9cO)ĸaF93 8 uim .V1> f*Ƴ,!0&߱8-4o\XBt4&P}+{c4 ys*IhRqE}4p-Eo`xLp, J&¼1G|?`gbOjxtuByC"hւhys9|/f):X>LYh)Y~9ۖ{l_(< KT0T;rD2 ^v*kae7Gg-gI8C߯2eazl4@07DB&G[ڥ;!>鬉1:Kc}5EoHuHD(DFs"hOAt_#cYpVJ3cT466 &?/&&f|qwS"[<[[z+^n( e$:`^βb$wȰ9/b"{ظ'Ú-&'/[cdʤczOG#9dbZɞjV7ҡ(dzJ.5733*[>m3W4js@~zeBFj@Rthz- tcoWh,2!~Cv^`IXD/AǠ(S/GWOm]utd: `@5Q1zy=RZȁM̵֒f֢NmG,Ķ9m1ym6{'ӕfEE̝>yLpt*; G{A.,u6L0iT.HZ:->c[m(L&|MWW;wB9H (/-cmm:ٴT>s.N[J*͛JAcФR)*+_31^aV:\v ҊH|L?eNs>γ K B9SX\ ΃Ӱ+~ &5)"oqaaYSJq6Cl'2R3ߞrBlz-tg55^30ߝځe =&&ic֚8!%J rJF"Q#M>mM)vn( .68;;Jo%D>b $(cN⑭3сOoo_τ=全3c U&)"SMԙ%NEҧ=[[?FWw]n*SV@s9 /'(5 @jBP%Ae4I ڲ52yU'L=WKS# >-wAf-{a8f }tT%%AkMgg(kRii)Dֶ6vd؇>mQN˶)--!H0uT_p>Of̙1p⼫bbbßǾ*1xS2޴ORI/ #ЙIX&i$_a `̗|7@W9S(uQP\C5K\PUemeʣO:X(uJ8 mX$: JG/ ̡mIF[h\!AqGo@t07V]x|]>[#e4 c+"|ʬ1jy=^nA|LsK\?zyC8J!*@*= l1wu?Zk<;'I8Ď Ď4Bmi-mim4{z}i{Jy(Ӿ -mio!2ȀȜ`;3?֖lv"[ֲ}H{IZ{}g`l 9tŌ#:f}Oɇlʕ?}8x 6æyoqhb&5go?;8ܚ03osm.iOCd:Iuéeێ&7}>:e=xg9PT4g兯Z̳lc[Ϛ97^y .dppm۶1{L'hV]xB~"2q#2mK!sp^&aSl5.O&.#%K<+l0 nn>6_3 ׭ʼnw/od0/yukxr|޲m3<{!Zϴrƞi= 3=y2)rwCбꆨثOL4GD4x4qdUO~gd ߐ2,-p,yJ4HW<%$KK.x&p @Vwbǥ]w=C'&#ġSLbh|$&d.rSMVYgD36Rbp0cǸֆ7x~OΟ ["rtbkmOg4k?شQkN_!!=瞳k|knke)~j%oX) 0t.##-K~ DKqmm<磣=s]Ub}~u{v/fɒӹhJ8tocmF\b,ZiӦQ.y淾oZ98u+¹JDrJ;Dڨ G })+bkZ5l2Kfc\c._誤\_3Yw骉KOZ֧sm<ܹ mw}+_+ޑ7zY>\v 46&f IDAT84$r3{'_~j!_Ӧ6ԈH$ Q1#tĝ6fr_Z&=nbN?1]ɝdae;J4/:w|J4zVD :;2\8㒱 W</YԲ`|V^-!k1Oj?| x`ݔS a? 50{ķlD Ipa]|kBal JDbJt{{mk#;/^ğ~5ݾƶ@AytV ݘ(`=1xk+];hgw nZeųs.^|qZfΘ*2矷 >њW̙374* #íq+]{q("Œ|׷Q75:H7_9ObpZm&eh x0A10:[S\_g,{F~<3^f~um/_wc;xn矞{kkNj\|4_G;?ڹZ)_y"ı&3bg&އ#/H7d{ DRZZRӹz<mQߚޢp[W\k^͗"VlxϻWǾmmQfEyhΚ am{Ϛ񝏎n֬Y,^!R=\̞=!~1*kV&"vɜs(˼ӭ|;`,YrNznl5lU$"+y5G/WƆsP sup؎ xC+B+rP4 K&3+w{eZ̕kVjqEyiW;f̹Gٺ6[.+_|My;.G{졯1c_X=Wvľz-~%=?n\?'gJlePdbhZ=x=ZH38kWseZO5'z|8 %1@e,z$fHA[ᬙ;yrݹ{7 92w5x敷rvAvegbc̍+ u[i;b}\y~/\Ŀ=zV􁶷 mb#*Q+6;0!k-!Й|#6g\|jK_k^yAٛO%?pttu{n:;;9rGΒ3OgWRpC?-[Bs3,gIH*P|1\{ֽ]ֺĜ`Ŝ|Q~ni>E|ov4g+/ǹ+?&m(_' p7`~O?t5|v5o^j?< gp3hڄuΚ9@-+q{k|g>_?.\qك\vR~HcC7llY?xW$OWcbN#1,P,Q*){s0ƑDx$|ϏB;J)vwýoaFj,[om@{//|86&&| |;Xބ-x*SB1(#!fӳ0Ayu^wGxcWc~뭗~{< .Mg=̻._΢eo:O%n̓d 6 x 78gPkaΉiTgDM \DpQ\p=080MO|joC)#hrH1o/lVį^T涧-[!M1ޓxqm} ށw䗾-8Kxlx&#u&9|cͣ:* k?ߺo%Μ%ѫbzSh wZ{;rBR )%\q϶Vh ,MC:#ATh(5\u$I{ @X@[b|ƷRG)޺[{l7[[4^x-.#،`?֟~f*$f떾H9 2 &?b*gw)/\búmSTr ̜ʗ;^{gyj{{3_oÎqƎ!we峞gξ w}|e ̷w>=o<3e>s2O#q6¥۴d[] \y*n辒7]q1Q41#$Wr[O?Iw.ec;ˍeK}]qQ%c֬-?ž{ vZk!!ϛǵ׾eg V)ć^mHC9ݷ繟g=int ֛gۿ\qطyy.f}ey<և Bށ 4q}Yq~˪ 00y ] /8÷w_\wt:9oVfY>{d>a,v]EsOr\k]xV0Iʺ2fD֌ ic뎬QHI1]x+ioH{yB0X2߉mmĐǖr65.Cxtx~Ǐ4io]d.5Ͽ}/k+jovH{mkCpy,<:o?gvٵYӑ9YKguVTyᥔt>{o!co`H&vc c.-Dz3E۞ahԆ''%?H^#@ә3g8糼6cwت74űšdyggv祡w̜ysYx^[p_ez0W#Zp5CP:w.[DDDDXӪQ3{<vN(+V0x- _.""""uLRT;XyjXs_xB'&.gnȸqJBϮ[}c_nsپq9s沵\fs$""""'3xTcTO~l/c=|j 䱇6LAs+'""""RdW]w[_x-[g=8=4.Rf9-_/&""""r2zǎw} ,}rJI@ȗ0E1Q}`$ >?Vf;v`ńps Eu(Q,XTGcmwǷŗ^Wџ$ gn9{woo}b-+q-Z4Mh Q,XTGbQŢ:&Oj-^y1=֑Z;uHPvs !`,""""S_m?BEDDDdJ !wzyGEDDDdCqu+.f7>#cc~NUq 3?tc#<_DDDDdJLV\|%I@QKҨ{LY 8 >ČYs{R`,""""(c,""""S̟O)Ȕ]ҫoƇ| c!Fa!2c 0{`,""""SPкyDQD("j}? h`,""""( """""`,""""( """""`,""""( """""`,""""( """""`,""""( """""`,""""( """""`,""""( """""`,""""( """""pP0޲edmTGbQŢ:Eu(Rǫ1}pu]d"""""2nrwquc_ KuCEqdq*;苄&vٱc/V:Eu(Q,X^Ǿzɫ?hѢnB[b9fY~קd:Eu89M`,"nÆ x<ƍ1ưynENQ6lꫯgzzz0{HﱈHi6SЦMNP y0޼yIV9)zzzN9:ctGw7;J&P-i@5 c"58lJ(xfaVĴRl 6rY2[d @:=8[ZMDD GXDp>Z8&'s:ҴNxL|\;)c7!8JpbbY֒eص&ߍL!""R ZBDd2ysd.ڼ׸Y,ֲm1bQ0q (xaȬŝȜifJ#ܳ^λOw^û|s6P e׬ x0!@+ߦ6B,ij[q.x1wwA[BH(ȸy (|^fzfFjA]{Pu9[sxJ!"""2~z\'YܑFJiIffMDDN cT6my3@7eykqØ@bIb\K##M#8Km6 v:>DDN,cT===l&?o/;L*ILGTDB.#MybYࠁ+?<| 9:>DDN,1IFI=It`v5fng,1ZRZJ(b*j9RJL ?y Ox9c,HsڻM TK$aZ)Pgo 6ὅXh{YKX&Mww7etJQ$/>(xfaVĴRl 6rY2[d j^jRi/c)4' d֒yY֒e}ך\4:^&MSO (O""`,2syp<92Hm+,O hҁ{sYkY*h׾-O0""`,/?XI  Yˋ;w9O:j͔FfgϽw2/w"2m`0ANO}S * :>DDOF.MwjK̒;2{>XXl}}}]~w~3fhB CD<@|B>(H3K=H3G#X®=Kloy-9dNk-+V;~ӧ+O0""`,ˬǕ{O#fӒfbxZKQYm`0As$IE]ķ-:*Ї6mD!"V rRHH2YFf3QQ   b%cJ]v7V匿Kxic)y k #$$D~j(:KMȰ&xuxÙ60 ι^cc k׮馛V靈Sxi/c)x )qaKeӠ+aK5hPb3O;fIHt|zL+DMдr dc'xCᚣߟd1[1QqEώ=^KK|k_.r!GLJH{$ǒ+.\Jpd%6X`L1@Y˻{$W2uر{o|(3g$"* ECDtv2R \ۀyO! tB4bj5'{x8Xkٳg7to;˿$ 6l[T*Q*&Sc).(GM"q!z  3d;sg:C=5 |}oJ۷w.+Ve~7/˄>}:3f̠(N[i;KaExPwUu,fEf K-. a3K### Zu媫#Z||ccgƃ>8S0 &8kYL6i6qiL44OYDք Gaɜa5NvS1뮻~ZJիg>'> V^wڵkLLJH)Ka`p̕ΑRkܘ,i~kMrSWE𖷼>YfO~wyGw7;J&P-i@5 c"58lJ'4sgMI|Lv2LɠI:b[ >bmɠY6g#:<w^}1drr{d޽9uݾ$')'7gP~>yÖndJUA2HIeRrt\gJVV mڶѤpn8mٳwon$ݻkxt]]:, K% AIRR6㺤tmT)9qd^8q"Z:kSJ79\1pک]?j|ITiu l& sU6Mۦn$]͸sr~‰,/]!ߥkN/8ˋ6t|¨ܠQ.RA ]'cy'ǖ'y& }"Oh8se%[K.%WldP%md~4`i Jj9CGgyu5m]mڔu^r6`*U02&2h8LJh- Tu] +yȱ4MRk֣xrsG? I$WO.VUIYXR]-y:Ҷwz-o]Np[uak.lKnݒBù ì]>2{P3\i׷RtM2Jh.Fe47ph.\TTKߕ&t\rZ*ù Gͯ$'QQFt/IB檓ln-ZiF]Qfډ >a \kW3, 6r<x\>ZN3l]͖4i6]ݥY:h a \QS%IJY<٬dXRe5sõl5wi.mզfjiėp6{ R%L`WMk3n۴mRJ*A *Iq]ܦm-10jBU.%K֚^)U*JReIXnVOf6U>r(OIi)m+M=nRmRfTϒ6M~o$p6a L*hdK֒&IIڶkJfr. E?IJ)9:rsn)10d~AҖAڮJ[iI6֟ki<\2nج'sT钒[4mzՃ4k%I[46MݦRUiƃ<9ʉ&m0RAV-i*M=L=^K3^I3^K;^ҎGגzMfuIVYCKSJ,|MΥm40u=q3H3㶝\O'{q߽ Wh=c &ݻ7rˬ&&gϞ$ɾ}f pwݻwz)lb.AggϞ R1 ߞ{z)lr%hϞ=)[nɾ}zy$#x5\ N1>p,ױa/3xGrmһn-v[{zx2G_/eS=p=e\}͎Yvܵx7pSFsS֓]lii)۷o7GO_/s9s} Msݶmf a~1G_/s6m0! cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$/ rb~1G_/2˩sbfǬS;r`?hvZ<ޛo) é?oԃRƮU۷'/s99>̆~ަcm۶Y/aC_/s9M&bc0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$2: FIDATcH" 0$cH" 0$cH" ɋ\dž1G_/s9erܵ1Ԏ:=O?nhn>pz3:+}---e s9b~1G}=io۶mKs9b~1kӦ c" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH0>p,ױa/s9b~,s);w-kvz-0#fcf=ཹ2p8N=(lJ_eKKKپ}9zb~1G_/}slm=۶m69b~1G_ڴi.0cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$(80uls9b~1G_6/z{]^ Lȡأٹks?xoᦌ3'?SJ)WRon0G_/sK83yfmf a~1G_/s6m0! cH" 0$cH" 0$cH" 0$cH" I2`pH~M_?JJII䟒$y  ɟC[) cH"=z%;v<gVi}rt;v[IR=p=eWyyp?h^ܲ?ǟSuUdaaRUb6(|O~ρ'h;6ͷ*ۿN]k{*?TG,:wϓGn8䪫ߘwk&a|ϾG"㺹/}yŮ wԳ^l.U͍{χ--(_x{ޝ–S\߿/6r 7z!~ɕ%'5_ьm{GzЭ/W&ϔwVt%yaŽ2-ˑg@S6–,~7_|rtsyuo\R~ W1g8ڦom9?좾sv]F9wRZ޴ڼxw휻]׌3~C_9\77uWDÌb63??|:w}yo|1&zHÇßh8:oV 9GؔvՕW=||ӟwqxt'7~*oƌFs=$:s ]pa.w. W]uU>яuWOކ~(I?~%O^sW-׽=>ty/d88I=UU"UU5%;Oرҗg}sbdp};ߝ_ڟ޳kr p2@ ٧ǎ'뷳s|s__dVW7\uWU#0S٧<7|$ t]htyǻ~od1̔.`3:'>|?뛦<_71\[}gt~.;Gy}3?0ʛ~nE-tgS.;#?~_d4t7_ԗgzK å#S(p}\R6 FG{fksI 0$cH" 0$c.Q=?s^quAws*O<$r10+[)dx\^}̭b+OJ%|'lsMgRM}V 8[) wxIENDB`netemul-1.0/doc/en/img/gateway.jpeg0000644000175000017500000004263111254745330016344 0ustar frostfrostPNG  IHDRgsBIT|dtEXtSoftwaregnome-screenshot> IDATxwxlI4H-I@ KH"t4 *"*ObRA& "UP"H$$iXY6a9y̝{ϝܙUϩ!¡t%B_$ V!Ѐ$X!B`B HB!4 V!Ѐ$X!B`B HB!4 V!Ѐ$X!B`B HB!4 V!Ѐ$X!B`B HB!4 V!Ѐ$X!B@{AVV&\BA0pvqT+}vL#}vXo" VvZQg#ٿw.]\NDzߊ4lܔ:bqPl{̬DdbCt73k;6m8F!ݲ33p>=vйW @ӗtXVfزa5PկYYUKf01m |X\JTv> [{%)Ofշ]g{1dc "dfe{{!t8y*WOr~ß|OB{6>!ұjWр 'XMr?`0OjA4lҒOCEgX,f"OvHrKX|&u6IXO%J҅ >^slvʻɈfO8g8}o. t~^_zRp, j.̋^oڤϥl EW0Y4[jAA`0JHpm#I9;0%%q/L$NCc9s_|o߯qp|>sӸykڀ/BV7 k¶;ϟû?)b=Δ7ߦqpFDγ/Q yx;,$^\hLQP׭Hm3+s6*FP(&hӮMΜ·J İ}Nf|iaShH S\z-q `C\N: #GpJ4kژc6/fޝïMmۄվ}{bf0n3ۻA[KNdZjbbbݻ7xyy1tPRR?~l0}7^cێLfv6%G~رct=\z" sa6:t(#F`ʕ1g>"##>|8#GdŊ?lW>޽nݺj*L&ǎ.5j=zOOO&OL=aqWq\ŽŽ&ؕPr%j3i{8"|o}MVt:~oVqvr";d}Z` FJJ57[ۨTR}M8#Gmo*Uy )Wka Q5?c݆8?Fcx,յkW֭[kYdd$gѢExyy0e5kR s{ۛgyz+W]d T 3ɓy'yꩧTbG9/c4쭊d"##'Ni,rL(ԮDx0$$\ 55 7Y޹Uzz:ڵjHII,)S~=~ s ?]gggsN\\\_>e˖QFl޼Z|7qUΝK˖-/GcJ%ő}v]{D;oT@` 8 ٸ{zf-yx/GBXú|wp͚L>>6e?O֭[Qӑu-[EQnݺ⋼lڴڵkG:uHHHlٲ|jՊ??;睪KK%μŽ#G`Ĺ-Y0Q9Rb"o={t5DWv=6#tPqeu|2gϞ%,, '''6mj-o믿ZOFw:NGJppps*qqq۷cル+< cǎ|ju|w.-8;v ;J'C ףEv17K:,׽M~>SI#nC%f aHFF'**4nʓO>ɤIr>pB~g 33q:O3|N8lf̙$''RbETٳIJJ"++?Tׯ8YWa}. ZDa}.-8(mQR;tԑ.;tvA E|6]@G|||صkoW\! ^xg}Ç~@HHgg:yk?SP]\\ =v ;JIB"""w1c0f̘vv&2D,D + !#KO]Z[H-_._|_z@%JAo0`1K:Yf\si>t`1{of14ʄ`(ANGy \xC)Ѕєb!}.@#1iL;1>Jr99PN=3..TN_z~b6s>4y.deGHNɂ_ΐmA{uYTm;+9ϷRϕw!T@s)GKҕKX,JU·6J@rcQI>$fa*=]Ơo'4@7V`(]18ӕ,3ٙde;^s"}v,O<׿Ӧпe؈4iܐ]Bt"|жBܞRw׋Rfd]>l <ҩ#@W*5WCٱsMÇ&v-EaGurynwQ\9 ?OBB7aCY'8poOJٲeqwwͩkFEކʣݼc9Q^2NF#LxqCB[߯/MxfowwNN9f333Xn\L W`S_U~~Ux1W1(BmN$%%x`WuY򭧨./^ x"B;.-[*U*yx]5[X"YҦܹXױi2W}*UBQ6_c2,+IB%*Ti\u>ejS(j___RSHII&٘BBqJb&33f2ͅbvZt:RRRmK9q˖-WڵoՒ&Ka&L&>v\ ڔ7vi6u-7^֯_bay6ux/O3vА`ꄆ[MJJ*̘YBا V7Qȟ /,*ՂloW*t58yC11}e:dcoN5Wz5k[Æ & ^^lьڬ];~-[ww7ޜ*vlTM7ҩ#ϰoNB@r刉EQHVЬhщdWgOjboD.ٰqpvrj*SprcB/^/8;;[<@ >>>:LB!╫Pr%jiޭzNfoy|h9Hʕ8T\xnuxK[A*VHff& p=Q;c]&BXW**& 8SE3m*PVZ„p 46l܄d"2 v!;ۄшw(((BPPM[ʼn/[=MT"Kq TUK9s6ݻ]uBQf(L/]cqҥ"8l ^?ke֜y||1O5TJ\W IIMNFo >}g|qBܳsjIhmwᙧ䑇t(B!QJB!JIB!CB!DI+X!B`B HB!4 V!Ѐ$X!B`B HB!4P_ٵsVq!^v-r!⿢=~YM!+]SuBIB!$ !+Bh@BIB!J$xhZDBh?qCh$ {-_7櫯*ػwo (vׯݻwgXx ]2nܸ\7oΔ)S$`0XQ/¦#G( nnn)Ľ$Xŋ.㏴iӆzo>RRRظq# ]Mzz:M6-쇢Q̚5:̜9!\\\HOON}aW^ e6ϟ?:uhI!M? ,YviZnl޼ٺ7 00ɓ's|WUz1c0m4jԨ+!!!}鉗>mXXo<4hЀEY|'X,6t҅-[R^=>ټAQ7n楗^"((ȑ#ݝ;r)6_z%:t}իW^C=()((_<-⥗^a,YmA!/IIIDDD닛ٳ3fPV-ܨPcƌ!++˺nXX&Mk׮QvmoUXlӧO|}}m ;V:t:z\Ϟ=9sdwd4vI!$'أGꫯ#|Cn:V\iڵkY|9wfV< IDATYڇ|w}L>SNb y.^ѣGr ZGfk֬a>|ئn޽{;t?8C< 8A1yd4ib׾-~ˡCHKKcTX@lBZZ{e˖-̘1f׳l28)S:t(9#G0e6oLJJ QQQ 6̺ܞcE+FÇ[bW\IzUm$ƟS~XTM?eŊj ʕ+cǎUwڥZ,<6h@:uͼ0u̙ʚL&ujDDhBݼy믿g;Uĉ*>}ό3˷nݪt:555:oРAĉm0}t7onCժU՟ٺܹs*^rEUUUmԨ_):::l6^^^={m~6meGEE^^^jVV>G쇢a6UEQ~-Tԩ6kL5v͎;kO>Q;ud}ݠA>NNNVܹ[dd.[LMNNYϞcV]tQ]\\Tooo`0zSx<> *X_%..*Ud`]vÍ g 233mqes`hESNB:uprrʕ+r6e^nݺa4N OOO/^l@MRRR󜜜 Cٽo3y._r%ZϏ5j0uTRSSmPWQxb>sTB&M=Vn5h 8`3իWȱԬY0~m9B߾}UؿoU1)DIsX7n<䓬[իӽ{wpέl^GGGۜ(;w.۷'$$={ꫯ-jԨ%KIUU*WLFFI+W>GFFz}6!ݺ nM>UTAQ~7;fڵk1e:< Er0x`TUN^^^yλ=p3???233111 0Sٳg:ujo(,~[reF#_(2228vXlu֥QF?W„ hݺ5 pTUe>}ڇ a )[<Jvx' #%%իWc2 Þ힘>h#CQ0L,X7rٷ퇛Ӯ];Fm9sk׮aX Eӑ|[nɓ'ٶm899ccőO?/oLFFͤ*+VuNGQI!JfO{zz2|p6mDdd$-[YQweժUl=G5vvٿ? 6ݝ]NǎєTBj0 nǨQ=z4ʕ?{Ǿ}[.m۶~6N8e˖AN!HpwwN:X[׮]<`3 9 ?ܹsvחmaV+WB ԭ[777zŋ]6:iӆҮ]ۊخ]Ƅ Ã^{e˖Yq.Hǎɷg}t6mķ~[6oNS=ƵkZ\'#Ǐg%]zM=._@{'Ie˖ !ЎwĉK:!H-tB!J1"B!4 V!Ѐ$X!B`B HB!4 V!Ѐ$X!B`B HB!4 V!Ѐ$X!B`B HB!4 V!Ѐ$X!B`B HB!4 V!Ѐ$X!B`B HB!4 V!Ѐ$X!B`B HB!4 V!Ѐ$X!B`B HB!4 V!Ѐ$X!B`B HB!4 V!Ѐ$X!B`B HB!4 V!Ѐ$X!B`B HB!4 V!Ѐ$X!B`B HB!4 V!Ѐ$X!B`B HB!4 V!Ѐ$X!B`B HB!4 V!Ѐ$X!B`B HB!4 V!Ѐ$X!B`B HB!4 V!Ѐ$X!B`B HB!4 V!Ѐ$X!B`B HB!4 V!Ѐ$X!B`B HB!4 V!Ѐ$X!BtbB!S`wܡEB!N- B+Bh@BIB!$ !+BhXb6ec6QUKIsQ:ɎҲolUoK'egfr8[#.1ùu <]i] ,ɁG1 BSZ 0ȾmtEߥtxyB${͙ٔMZa{kI .FQgY)Sq)|vh@pP@eEnfgY_n`:RY';);ٵ}3FB`=l2H*7OIsQeURp#~Q-;Š En@P@u3j_U)x[>|𶝨RGd0:Q3=;B|kZF_{/ɸz'ULٙSU .Qz5,dR2o+W|#7THJʪ^${٢ʰmR&JaylQ  vmkbTqD F',fKaIBTYG^Ec*+RޢyPD} ;x-Ps'xn%\)s5:Ǝ%~V{UBƏUƜ E/.`p,S_=_*wL^+]+j ]˛:P`$k&b#ck["6'+PK=<UzZe߆ - v[PjPB8ؒ=ӨO.|j ?/JEsٸ+*gYv}α9~+.F;NlKޠ.eRS'g-|(> _zMIRO6$X!(Iǃs4u cRIHH*-K:cwds,|M96Y&lJI%#+ܱnwҒhߟ+W 55%VH>xK{`JKc{40ekؐ:OMIflI֏d9Grv 4"ߤ`y,XDVUUbQvӟ|dfomQdLSo;[w4ߝb1CCŊYY(4у}=Q~}|QSSQ33Ew$X!d۱[V=g%["9?l?&v:z-EaѢEw ;Gˡk&[10m{>>FxHHHоC$X!ZV*nCOp6}/ Yi՟mW45}Zba4hЀy݁j2]HLagk)nMq6<9xҗ %C'!*Ψx۶-x4iњfQxjo:c-vy~׮oo0>bM A=}EʱsBZ,Y[͚?ҦMիǾ}HIIaƍ?ߑ4yXbdm{r_ t8iW6mҥK_zqa>0:tÇIMM%55>;ڵfsaܹǟ~:stz&AQrKcF`6xo"ʔ-NkBVoU$FMIcG,X@гRs|QUz1c0m4}]33gqqq裏2c YFXXݺu㯿… \vٳg[餤$Ə?k/y$''3~x֬YCzz:͚5cܹimvHL;3cV99JȄ~b/г?v,vSî6͛G>}[.[?Ufڵ,_ݻw3k,Kllo4hO?[p!;vtxr_my+w1{8U*p|?IDL2'c8u>1W8q.^Bb* W8(>}c\gvo߂Q * /0W|*Vq)S殼5z 7 gea|v8v-AA}9z(gϞeȐ!y.W%lٲ4˖-[1cM׳l28)S:t5A׏X:DZZׯbŊ<#\xGrZjE=0ͷ& VܳS*w-+ vuXg& Ψom{.š#0.7uݻr(f'ڇ>fWϟgݺuҐ!CXx11FDDP\9ڴiCݺuYro`,\̢E9r]{/r}( #gQi1ET,jCMfɢb6|фA#3ۄ>W*٢,CCKܸ/zQHnyyG]pUeJ5Ġ&%aBCĞ8A%K =.?{Zj@N}_lʌ5zLу8bcc9~8 ͣRJ:8y$?} ^uٷo_7Mqg]L+R ,4iLp0.dΓzF}Y=qvSjs&-Ơss,z->;ZhBƵzʳ>!Z̔/aSgoE%ZJ-3Y# [^=m*[l:w|/&]z|5;KjF6%lJقC2|ՄAjTp1*uֿU :pq6r!1 =rf1;SxꥷprvAjp9zלLf.ӫuбCF yЂ\ Re@S 8v'4eӸd9C6LHzx֣y.nWP=4d2`6eϜY*Vdr۾6jԈ@V}E!a4:sQMC{NPE#&y!-LLbWMddY0iR1s` Fϲ,tzX ,1dP-ػm4jMsQ+ɣZjCzd?{b%Wc'ٌys1vz2+Wԉ_\h}!!T^˿sBly L8~2oaǞBժU$6|2+WFQNgOӹS'z쟊N)R4Y?;ZJ-ѕtNfyΦNzdg l:zoL?oLLL,n{w[W?XY}";f;y巶f7#qQC۩!mDB:4DziU"B|iT˗5}SA>\0q:-j[1jؾM#)1?)/بqTZͺ/;&F#J[m^z iD78 ͛k hՊ˻vset|̞3io͹sĉ|;3X,IIM嫯\OolEQ]mq$$$( gFMhHm۶a̳Yvzfsỹ  Gw3wx>[CLåǮn]di,4p{׿>٘ح,^={аaC*UYf,X4#jy99BŊfR]G!o  IiѢ9A{RWTAԬ3۳`.W'ZXT0<+ xAxW+afswEƍo^3'_|.}ڔ) z`1~xo/XAU٢(>6Mt}LOءqG}f}ʡs | DFҠ{w=V`;wfM{iNJj*UTgtО *0y˴?Ӷm~۳>(r^|R&Na ͥF@ /[ʫFf-z5 Oڴ{n${=_waluz x~Fo{")+8c9Ogsy^ME8 Moo1y(g./w>Gl}qbժIOOOޚƭ exj@[n=9WUCy8nk2 e_h]x)S֭Æ+b\O&+9sP/d{='ț&*Wǽb|UCw v(ΰ:-TՂ zUtTb1Q^GgС31snAxSuQxx8+W~G߾pr#vIDATq]^)UX :՘31݆ ߽ ш``yhԸGw/Ig ߟGnu!⻗z z=j`Q-X̖bٚ`:=:ޚduz=R` PhǎYl)əŵ$Y{₪77OZ}o+D̹.ȟtz@F>xfuX[WY`>#GL6prv)%Ih1|LŨcIqRo۶9<|ddd0x94n''kI/% Vܓ:_(R*XNAZ_in"uxADFFZ˦愧`24h^~ٮmtLN^fκ>$^s$XqQU˕lf2{tHwdxUQt{JEV!bL\\vbذaDDDɬ9<<8t:qquEQǟV.'[$6w5qs?3lX13_,ؐ2())\ȸp!WRnHr;v+Ni3V,vgXsy]>=>{h0k{M {ڈg T`eY6Wr~bG"cv`|l,es~1;7.%7ofZtv]]]ڵTUUQSSٺ:,f ddLm݁8 =Y-ZLӃW'b}Q޼jQ}J2dζ'_1"}𴵝p'?1.49= {~ν'Ncܾt⛚G8s4Ν՛,~)S1LZ,*ϠxNn{/Z0٘147y?Xzb(c( iqɜK_ֽJV#77e%ލy4 x5qљ^zliLPh H-w֯c=,*^:\qzjkk)-]ʳp3Ax+"2i:q-+pQ>~cY-aӮd8/c !lG[h}*Rnr% \O8K &)+ {WI]U2@.{S~A-[7 PXz:;] i+Z6s@m䲰ԡꣿ̰I2'uZ{뇻IxOԿ8(QsK, ̯q<!ǕyX'5W+ƸKQeu#O ͺfyfŘI{^A-_EUh?_n8v_o{..NA-_ET?_nyٿT??_nFA=cEy_..FA=cETh?_nl7ٵ?S?_n>A=cEy_o..>A=cEM /7GGytyu??A=cEM 7GGytyu??A=cCM /7GGytyu??A=cEOOX?pf<[ˣ˯iOOXOT[ m#p_@Z7LMԿ8D,եrAX[t/kkKO6Vqٴ\f}ح[[*r7 qۥwr#0O6>?Nfxd 7VB$me9\ujc #??RtUG_j}!G2E_8+;Eׯ¯?%q?Wտ︿ikKd1 'Z5= GMʋd\c-y MBajtUKO3Y. Du_kWIyRIi\mN@v͎RNI&*?ԝH GpdqQԿ8yo xkÊWS TTxTyS Z>zm?n?路NvwSX؃3|$z/௟H:)}U /?~)nTAYm1 %G$?:%7h+gy/?~+t}r& u+CcE:RTEtI>ߦ _*U[˸l&Y@(31$Z^\-Qhh81rwq"L?oyfΙYX-4P|뻅7s3VYIeE `yP*o7QO<'M?K>ߦ _.o?owK:˛xO~)Ds C:]9 C:]&߶ ] A:] GPF X :P\:zduK̗{[iKޗup qsDuXg=-zծ4l2gцx'JpW1js,en\ϙ/S^A9{ y;Uw6urZ77׳3{d4z!A^zEw[{Z~Y3j 7W3=4yƀnus>l?o͗{[h .7W5=4yƀ\י/K=4\,t7{7K=4yy !jMo?o]2Io0s?ր/nuE3LDQɤ34gހzL3Fh&E74#֚i3@&G7&FiP@g\gbg\gᮼg63/ ۏ-u/\F|mz#O0xA lw2^`e]SzƋ-6W+< 6-'q\g>h>0)5]Z^ ZHLv g޹/'NP[ʼW+_, x@$wE4eb@M{f+hyV3={sa(1-~|(/o59<\>g޻ʕ(Ѧç GFs%orOkkKBݪhc>~uhr ]n0hsbΗVI86@e 1= ^UV߇5_9wM4wUI#q $n{/14^O \i!Rs+@6h; (QmE?4S( 3Fj<\K4gހ37󎲵ft&A \BcXLo[o 8OCx/2h<*.eojX5 &d-]GO̍0(?u .w_ogy ~{WCv> Ni ;oWFffӠg엶iKMJWYnSH"{MBf{Q$jX/+ !|= iI;?\P[w‰Hq˃z_KUgx爬$5[[.%k /dp9|GOPDOvP*6AyA'VCx//P lQTeUU_z_G^<GP\њTeUTz_ITW4feUz_@3ZZ1eZ/P ey r ! <jLӼ?Əq74f{/O_@ 4qfni3O={/Of??ƏqGEI{/O_@R}Sh=tTg>q4'??ƏqG^9Q^ s^7P]㯟\g_EA?Oo^",n2 yo a޽O4|$/௟;brO&4fh5 սח[AI4ҸDeOJLњZ)3Fhh[jԱ :-; N}gU ^DZj=k#l:9G\ꬬuy)؞ 7?G'?MP(bxtU؞ 7?@ TbxtU2'?MQTњ'?MQT̚)؞ 7?G'?MP(ɧbxtU؞ 7?@ bxtU؞ 7?@ TbxtU2'?MQT)؞ 7?G'?MP(bxtU؞ 7?@ TbxtU2'?MQT)؞ 7?G'?MP(bxtU؞ 7?@ TbxtU2'?MQT)؞ 7?G'?MP(bxtUC5c,bRT<*WiyJ}xC ?? {kjZ8kuˌ ~h>6路R,??[שfa/-.v+9M\CW|K_x3O,Ι$zY,+y-(J@l >&IgedUZ\xc#E: 4mQxۜy֏okXj}M"x-$hNoH+2>zk7dD X Y4#F^ ҽNB$ѴUo>1 I<+xἿ=v8jr:jmui 'it94*Sˣ-캖jK A516T~Wak5_óxLe܀x5o+[;!᱒%T@j>,ӯu'TGl4vn6VT2)~dwgzt ?MDJAg)193?ebHioo>xe*|ɓf]|ǑqP7~)x-et v`[iEϚWeT)1In,'nc d"墪Tsh: kShl`{T3~uv#PF6>6gw695u E&h-^mjp$&vsS<(0HڍgJiwki9pg0E0+2q qwlp{Q`Ec MO;jQ-6W%/qǵE;uÚ]pk 񬈳M4R 2><Ah\Ed.'uMb{V%Rf$DRF@ x_G[Pw;z&s88`&j u[gV[ck"pYT-#֫j:lu%Մб+v$ d&L 3@\آzi^[F4ΩIJ翵|4kY/Gok$ȒZ_$姐GLbI T~͊(Owe'"$1LBNr>`1i'֥4X.fZ_cc V"zj_G"zj_Em?Z??Z?`Ei'֥4'֥4X.fZ_cc V"zj_G"zj_Em?Z??Z?`Ei'֥4'֥4X.fZ_cc V"zj_G"zj_Em?Z??Z?`Ei'֥4'֥4X.fZ_cc V"zj_T=-أҙ;NX.C^=O^{@|&sc?_/lo^^]A>Ez<_/ x>I|_x7UvƩ ĚU7W¬ cT߃Wy6K&_w-ݳ藱ټB#2TmYܬҗ=[ڊypǣ\-!/<-v'~8}=MԿT-N$O&I 3;Ç1uSKS{ڎ>궚='[h ;tö9#¾O MJ]L2j2hwulX12溍s^503/9Weem]]\xE%vKL$ tw<3s:=wW5!aUQسJpG+ݓ}vOO'!ӼOi giv궚kK{uIf]ACۿ=={IKZ''IѥG %Kc\oR)KW'G!y~.յM{xF #ZWH {^YX3E" Vaţnxj~)$p4$#[5cHw"2y**GM>hts moz???dt~QO/qA'7ФohwA(d`ϔmK74k|A#a4o y> Sc?;Ѐ >'Gs1u- kv7f Gp )+LyNǚf }ɧm+nL2ȭ&&6ErSNJݓ}vOOꘌ:зۢqs~xqs~8wU'G 7(????dt,nQX۲ϺTn>}QpEan>}Q'E'G V۲ϺT\,nQX۲ϺTn>}QpEan>}Q'E'G V۲ϺT\,nQX۲ϺTn>}QpEan>}Q'E'G V۲ϺT\,nVOC'T+pTi\g`i\gᮼg63/`7?[רS?%__?ͅQ\GXQEQEQEQEQEQEQEQEQEQEQEQEQEQE6YOk7(\lfqLC3?? ‹Ģ?? ™4:׾(Y}'F(Šd0[OIaV+In#'k1 E/k!]X.%ۋ}f#=֛GqњuQLH]4%Gp89E/k!]X.%!]YJcmpFө (m"\Hsb<?? ˜?? .? ,Sa ˶8j8d# Q[pG@ ?i\f_ ?i\fᮼg63//`7?[קa/䅂 l%ڏf,d? kWo#1Ik3uga6ɫnXkN(}2mJ-Y")Sl8?~" ĺƍ{ZO+H(`gI#oH6?}AL%1ne`Fc6#|O[Ē$ׇ>x#Ux8ww8\ _7Ě7<.*˷Ss_ASBPBhnK$,+>c&:u$u[WsF~ΠpdL(\=|xO[Eҡk/ ǐFYv|݌i~~"-iipi~ѯn$Օ5è\1ٳ[s XOȐi֋en]:NU0rkCCyٖgm-'O<@W|}xVҤm6fuewU]&ƒ6{(`~]3.7j 7q1_Z b-:k4ce=DTH9$)6JqitPjVv*qcL o- ܪ֣Ӽ . [j{T(؈eS(+>%5k;]B V[DM9d#N͹QI`m\|;k%ľt%o H嶣O'=hh4fLњZ)3Fhh4fLњZ)3Fhh g#^{Y]i%7ZȓGl hKyR@8c5>ax]t )hgaBкB=|V~g'w݊|-{exK)k>"tXx㹻魖) +0~a1zK/<ڼaKtws3oN*~͕iwKy [][a!7Wfʼnf9o"Ю廗Rk ^M%5)(D9%Ď]Cr"L'+7ˢhVoieuKd&@;ASR:͑I#`P5SWo5^}KI؋Nq;*jJ6}[O8ec/%bLDdd [^knI!inMM./l]VtM#Pݲiu-p$LpFFA$U}E~WrhXUB#JȀ(©q'}{N:vm#F5/>;Ҡxd*6E{ۈu:+9 5yu;t_2@crBqZ6DF)-xw3M1\l&ip )bxfKiiw]7\u4A I u4տu\[W'[i-YD*>\c=4еGyZL,sF 2Jyᔂ \ޑ{eT 7r\gv ̈́N# J NBє: !έmw2\KET$  Ess!DԮvveHK31\'-ٰ|b4)Pٰ|dՐfn3@_)P.z Um.?nv4;.#ˑn=ՔW}ڼᖧ˯x:_JQ3ij3ϵ}rj5/go0xgIJCBi7}BB[yT3=~n^{-'pV򑕗'NEIi5hYJvA9\:]/ (Kѧw_5pOb{];?V/CK$1 iLidGЎ D=-um xVd/C[ܬdWdf,ک%C$NQ?w*I[hey_sa,zuõº=>v2)G WQa=wi^m8u$0J#?3eZ3fGI18X$[Aw_ſq N=A6mm QRێ3z3[:Dv7ϲM;y=P;x : ?w*GӿUOA״fž|?w!|ү7TC2sX/XXAo!5 ]M. b/1',dq=~ɠ.tJ:uemOxtBq ׇH<[9F8p)ȿANHAg_lLP$pz?w*OuW|;ӭ}jb_~$2~W]ģwрqLwtUk߇⫯@{^y?SۉdJ8 w\ULLhqCs5_-5׀:L4_ a޽67e}z?%__?͑]vD1F)AP@%j Ln>Pl*tjX>G̠q5k4f*Mb)4I!Y@>cj{ F,-`m6ȋ e, )*2;1^ Viq]6 !#U#+I!oRRfI3@ E&h-4RfI3@ E&h-4RfI3@ E&h-4gQލoŴ ^[Gz06ҧb,4=K XAgo1;TcsPX#JĤ D:MΡc `GDDAhi88kYg]ڍwwj42 tv2H5G4f$W2 4,zlH% U d8kEš%ž?Lx,eTsFhXI|9cU#z2yZ2G#bњ.P=V缸y/~(dX&FXޫjh!ka4їY>5aj>/?Xie53LGI  /\h 8B{dc$!?34fqCo5-5׀:L4_ a޽2Ge}z?%__?͜uo!5.ZI^ wrƬp)oi:ލ~md%17m'ikmjvV5ƛ{֥%vk_);FѾ oPE[#][jP\r?q{53 ]ZFʥr38ѴwC`Ot븭 /:@Ap=j.>5]?Sl@"rr 3P@ݔ䍿|x8g_E9vF o^j]C~5. ̰K=h* )' 2uQM7a:E426Ō-c;N9SYkqack)k؞4*u@# Xk:Fwqgacφ w=7(9\twC5:Z$O<>v=}+t iQۦqnr9l2LۆFA<;MN_뒯_{u?w[o@wN8=[ѵFլ5(m=J Rp}ki3jWV2$;DEٙ@"Z񵻏Uo-M6qjݯpZ8YXm >}뉷Oii'Mmt3XX5{HB}) %)` e՝/7[VںG 4MrM ʗlChŕu>0w}$vvKqm,cgkz2qm6K9WֳEwo=k=;ܮ8evĞuåMvbdhQ$c6:X-mo'f}jQfg`doڪd9zxC{ 2j mPniI<|"1%`P-gW<~KpadU}r^h] L,!L$qҢ}5mpK[/lC27`rxZ񥎍HM]^ZM $'tl%`s^t=QFtKe8昤,΢F1Lǁdg3DҼW/,5y4H`Ү,BX#$|ȡTO9lCT#?t?(!3qplr>au:I]]'DlG8mpp̀py,4j.o^|_gKqն \miz^n4 & FHS9?3n]c2G-4wG@/ibXʡ.3#HLطmkK"WNHwr֖cj+UM\>-o~wo'%|6,IݻڹngSZtM}wzvo.KCom;I@PC qx<#ӟW:]r<3~ȧb@ G4 f6[y ͍pb1,kJJ巹h̳tS˔+ ctҹjoB'2<5*!`џ2[C{$[O\.f{snIv 2֋id/ﮖݥ*K>ĀNh.mvvBn_5R@knR >0۽)ދtfX>\23(%r pi|!_ij7z[CT7 nF|TV` a"NH98E&h-4RfI3@ E&h-4RfI3@ E&h-4RfI3@ E&h-4RfI3@ E&h-4RfI3@ ^IJ^_S@o|&r?_/ lo^^k'A>EzU<_/  ZobiO2ё/88WsŸR :7uMB=?R轢Tن.27Z 5=o^Kybӄ#n}3NX{<7d-6*ve|^4 $PͿpF<,'on/o8>6sxxWMCK C嬗:YAHkb Xi64Z}6WP@4qJ>}̋œ1l'l-Ě^wN:c$f  96~м0io|'om,uo9Ow}q9/YI}kYWU.xb-cĊU 0T?l!O폨fgnaa%coA' VƟMgk4V7pM:Z\lj"tI +Nrsko ˢ[5 [Bkp=_v@-jxK~l#v\,}*$ScHǘO(.EyyEtIax:ƹ]NS D #*ʙcGGicfyksb62psG :(;K<Ddj3\ zgQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@y/' o7 zy/' o7 v`?9q//?[ץW lo^O0xB|6y5}Z}^kڝ2.ذRJLyO9$ʂHx_I1jfAd-h @1̓'XxM խ5 wYŋ3Ay,l3#!`Uݶ;.]z~h{M>"My#<  g`8c0kMk[8|CoMݪ>qy%/c|:< 'S.j/.`̂brHc-1$;1j}>)^2̻m㟒F/d[I6_路J5 a޽*a/䅂 l(:Š(((((((((((((((((((((((((((qCjqC0_?ɜ࿗? -ҫ~6_路JK!` (((((((vu+24H| *}%=Nb*ck_C\.3=ϫW5;e\ݑCI\ םy>&[,D!Tg=YY^ޯ婌IBw?_o&{k}^C :&5y$iɸw=0}k!׺o4DzX1P&0x!tiIGx]QpVe{k}G=WK.-T3j/M In3JF&<0s|a[x/4XBik 6VĻ>X&~c$Tw_o& n粫X M_Q/i%6aL[kv6#IAF?ypi84;{k}G=/>*Gx#7ZUƫ?,+uq,y#p80Ȯ~-׼AE^} MԭKƷi!cU*dªeg={ZmϋG|EiͣuS(sݍf{uPalN+ҷPݼ 7)SڣEgcE,v\ &Þ;J",ăi& \2W;>7_– IϦj*ϙk3% ΐ>#k 1PDǺֿ4ck_͡oHmEbU. [uk'$b&(e{@`EzUy`T|$,WaEWQEQEQEQEQEQE ֎w ΕlȬDʹ`;t:^i:mܾm͔2yGOw]Zm2T(=A5>$wo^0xBlx<Ğ4!; 2+o|@毚p})IKf7tOKhDQ>!-L.q0O5({׬m,cImF]NYFྛ^1@G_4''v\b|8w.\y)ipD dm2:{awֵ%Ψ5aћnD)6Q1\3 c hEmR3Wq^VjjWmDgiLQqT `` &3O"ErQkEmKN pM4&FrGCWt[V*QFG qU` UllT-ݼsp(O)Pl$))FPOvHvQdBGZ`onPAdr bxKw[ĺ/Idb:;|?Im٣&{W9|Ui=3ĦMNQpd #ȮHg+4IgsY{G#/m?o|4pA -wƛ-e2^1ʹVW%/*li{v2*fy"EmG#/mEM{}rYկ><vsIB6hMg'M-t?@ ( @<+;o|@6't(t[}FEьxUBJQ*x-Oo]k:'y#0"21RHF`@G_4G? kȏIIۙlDbH1lt~nIbyk/˨>5.>-116 n8?6i\YIuWLԯIdrHєHuo銚tdӵMNm(bThet4dmwE'`B?A@G_4<T4kۨomOM 0e8ؼfOEX&wkib֫iwlyУ^+?6v\Y!;1f/q$~\`W N=0?JEmV, &-ii$*nqCjqC0_?ɜ࿗? -ҫ~6_路JK!` (((((((((((ƙE:`3I/Z`tOm6&"`"Ԍ1?,o,-` &+;I`ޜJ*mFyqfqQͺF)dQk͆C(a?yY7-.sGom⹚-|,m 9yF|v[A xŚO˟_jnwHT 4U>w[hخ|HuIAp.b4 :DDa(8$IO`"dlBDbp}'{uq3MtvJlplB>gnx[2֘ IG0kWF3UT(V+۾A]7Anh4?ooW *$ j rp *~8?i1(]YZ0Hb2,Nj +IVyl#ztzdq["Yg_:|!|# ^wq#Ζ6 #A~`77Ar~_f 5pƅ[U(ms5vmK"MQ׭uM>Lbkˋ;pjY ڶϯES·6R.mhZRm,8,/U3_^kxSV4ȯ5󒵷P1x{7y47wIkvfVb,y8׼Smm6Ȅha`?i_h>Ƽ3/RPT .|G5ʁk4OhbI!0E[>]EFY_M>[1U`&@b3I\>ƪk/h=GYXss.dh יCW_wvj>>][*{mB'l"rG&uKx4lomO\-wY`[ M} ?}+Rmmmcw +CuQti?5i^KI^^KI]x㯟lg_F`U/?[ץS?%__?ͅQ\GXQEQEQEQEQEQEQEQEQEQETWBcrdex AEKE +-LIB/->İ$~xP4k.C<%H9 2 9(G=k}/6Z>;&XL28}Mt?/?.(I%d X?&_]gkuѵsyioi"`H^gR<^9Т_;utmtZ[Hbԁ9&w=c=w}:)'k54eHh>s6 Ԣ#Z8P@* Iǧzu?&8?Jms+Zͧ\]@X9*O9SQ@e|Gxo~%?l_&q+1ݷq G(E#S#55K*=*$@=c?&_]/?.(ļ|Xvs3KuvN)A|9h~s]5VuX 8*IV\z8SL?(gZҼ/xy;hHv #~c\qTxwL2v^Ͻ?=/AS}{o;E{:_ȃ07#?{M>v(t=Oa oG}Q"zmh7#(D?/i oGQG93^Ͻ?mhgKsf{o;G/iEΗ ?{M>v^Ͻ?=/AS}{o;E{:_ȃ07#?{M>v(t=Oa oG}Q"zmh7#(D?/i oGQG93^Ͻ?mhgKsf{o;G/iEΗ ?{M>v^Ͻ?=/AS}{o;E{:_ȃ07#?{M>v(t=Oa oG}Q"zmh7#(D?/i oGQG93^Ͻ?/oIkAlP[Y^Py$t@P QM(SInetemul-1.0/doc/en/img/net.jpeg0000644000175000017500000011014011254745330015460 0ustar frostfrostPNG  IHDRl|sBIT|dtEXtSoftwaregnome-screenshot> IDATxwui{ovM!!! "" (د{k_r+6ؑ" @Bʦg6SnVXpyMv9y)e!"""""""""o """""""""b2@0p"8"""""""""/R)""""""""""(""""""""""S0F\v'8_& #eSc;6%eGgHĒM^ht̫U=1y`CC|g0̠i]~?튫ƒ%WxL/3.m ׃њT31eڌ cMTIz\tzL1i3G[/}~u3N;/^:T_&Fq7h ˮ S[^/%1~ϻn ϖmsm'x;_(?9ݵ{>_pdzyjg 0kb/]eYtwk& nYs Zveؼ)W_w|}L2}G@AґyxH9 ]^*hv#8""""qmD"10K.֣dħ>ғNe嚷{Q xkRSmf?/9y*0%ß3Ϲp`ٯO݌ݻg7ld '!̻o~f̞a65,X{wๅe <{ O>Dowo/<(>K%ٵz/<=ln!weٳc lؾJKk+y OFqX0y _p|\}=^:ro}3mBo?}}|7Sh9gw1<ܰ?KCu+\}ݍ\X{%<#|_bWk=0Yy/YғN峟Ҩ #ݯ+"""""b2s(c G^~~}D"#淹_ƶ (]-?ՀSvF%g}il<Yzϛ˃?;f3~t ,[nam+klvi?KO:TFnzU%Hb UvSEMb !K1YpNNKm1czOʂg{}#O\9B ,3~=;o^V>6mfogYg0sA2zb]ֲw~DQ<d9TW}fn~;'7K_,O<~ \{[غm;{ p]F|,8mF|=OiSVDDDDDd엜━CxGX{٣5> B'gJgJrX[yb!1g!RdbTɨ8˲ri]zN:,?qbeEہI;ڷQ;w*u̙=ٳgyw<}%ˑt=׿*+*8Yx1#.J&1ưy2,d˗Xz}~^c'xor>3𹦺ouBַ0XIOĬY3)+-q2f^s'>?I_oox뎸8ӧDwh n»n|<8_?!b2{>SYQڵP;e Ӧ7J-Z0*Y%iMN-ъV򪚁un~v|ץAD!':ۉ]7#8MMO:o~Qe9C{u{;~>w.. կ}6>9c9,_GWDDDDD丩#eL>ygi;eY|}pyR]]{!N=e5',Y<&N?2,[֞뇜[N^rݶmzO]sd 5gO6Ͼ~Oc2~[ٶc ?ŭٻ. WTW{Nnvǟ ybTWWCǛc1Y:tb??5UU\7X{Bcmؓe ~;2Ox<B"` y!ZU3'Jow\ӏO]s YvLvo3wh٪b~:-ZㅧGeVbtI6ϚGG{O?ԈuJ&w޿`ڗtܯ-<̞5իN:qCMuk/KVKGGǸwX zz73KN<ߥ~*`o~.]@P_V¥+7(/+zk-RDDDDDDDĸ"|yƓ֦ݬ,[ b=Fe㳏q5"""""""^UL.o%:Z)++%OHp-jt5bDDDDDDDD;ѐГ R K,ƶlgr=(ΝWѐГS`0w$-"o= xet-B_De|g tyIޕcH:)ue /L{wnbˆGcYqL1ob1f4 ښ6mvƜһuqm,L2Â_0uLJ+0;2Yž%%FQZ+Vh2  Jjt#1. BcE?m\4hmN;gGca`LMfى-iߗ2c˜fʖhݯ5U(~[-W@..LP>: "ɠj[slnɡxh`HQ#Aw% ( 9<[8߫*U_)K 54g5yEky\)xP=#šodutʓLf֔dTJ*pLldmIow~ࡊJJ1(mjϜɔ)gs"8"b 7"9vHj(ДQcJDT4[zx̨J |N݄Wyqݛxq6v<5EƩ ]cՁ%[(KqL.'FYTN)f&lZ[GmoP8 ~csp .FI,H89$(8q87GVK$i&- 6l#%l4hQ9bP(G$L+zo^M{;%9EܶI8'lJL|C}^:w0#q]Yr,j+9gb.8D?)8GRq&p`~|tF[)76o>JJ9N1v&4ܵc^KhJPQ#.lt-Z|z)Q2`wS/\z~{Bn39 !]ޚކ7SmA Ϸsغ>z|l1VSoCuKb_"OP1텑tmxo8&|U]Ly+Iڔ9!( l<,$blZ'1FOl1*,C$,e 1˄& D/ ÏhUt[+IަfKN6v؉䬥L{11J`^u:cۤq,2-]?/3WYCyسj֭c ho8%91'-Rk?/!S4]~ >FItBsd{|K]#2 } }*.?kx7/-AJSFKoeGirZCg#\y%ajRI(AڱۄK'0ץ$q;:hZzbo]y,HǠ*PdLazBm oZ  fttuۃҊxy5}=a =&=^I/~2JNxm9BR)-.3|L\k)c(RXwpN54,992jvWBvmdŒW9ԞP1HC^&{6ml46#**+H$bXEPdqm["W#@@͍Ggw/ֆi3%Ja y1>0=n IRcux,lt^E\e6[ՇȚ9=CV[dYXª.(^jn8DlGg1C e8 E1ԞBcT;If4r~aǜs3!~f,*++m C)%V,BJI,cII&OGGgXPhؼy3seƌ∈Ia* Nvh~2@o~9~ &F0&>9V~WG Oʵxz&|VLmIrܶĻFb8 A,&H%-R $me oefzzbJєSbVx\N6 1-¨kH! 􈓋9-4v6r2eV)7;Sxv\Ob1pTk<{ ^ry|C^`qI'ts ST/c0ם]O.4{DmBleJ=ԦB|S۷hڄɞ`D5 ,4E\xٳ6C ihK."6%Sک,1߳s6сb(+/%8Ŋ=xd2I>'ϓd D00'(q|gڴSO?\Q8R"""&cTQnES6UN9ԦlTdL  ,F. 'Žn\!@@EekؽG{W/GO@gE1tnk,͘2byFcs÷8wyǰ℧RRt!SPH #$ѝɲ? ):iF-X;۸Ch. gGcgHma%;rC*E՗L :(F]ÈSR)vK9Xs'*38gs $(Fm~`FNd8G GKc|a \\.K!NJ:ٷ{'YsY$~qAN9#=,"ȹmFtR2KR:{'*=y@/ K05: IDATvn*=oM(ɐ/H%I,6lήn0|b̚9*V\@6# j5ٻs挓~/'Rc@vb ݑ5'?<kմthcx]uj.3_D>oظ%Ks’EhStut#Ej̝=8#"& E_W2<0tIHM r~5D)) 8Xa13z'cg䫅S1?XH+OhPI`B*lFdIO!Ϯ-,=}0}k4W#̞7 /{f{3335G>#;3Z*栛L=Z8EX%6|44Zq A̧+g:T'>JׂdnI>3m#?o ?Y7['՘HT)ܿg9[=r91z)+W\aZ!ni|KO_Mذ݅NFOH1?hԏ)X', G4IǦܻ- _ջ9F~"Zdܟk9A5:q"ts*cG_KDy|ݷ]#:5Hm`[Ok &a:F- y/ y\|0Qp Щ53w_O/!A8 b#v%Ճ? (YYs&72%Y?9nLoJў _cȁH>,2  XҝQ\*V/[= sJ#,T2AII eFeSF_> B#14?gPLȱa`LRy\^#BR$41u0ZAFYd`OBa?σ ذ) PZa=oXG52N-nRH -;~ESڹ|}Z:,meܼMzoee}\Gom￈۷ŁNޖ OmTX!@ 2 $AxG*DW=(CMpZkl∎ƥ<}&N skrz|7tu0]1JIPo6y2jCR*E%%pa=gg$D 0x+fPZa!RkRt.ZI|RpüC0F@nk!sJɛnK0JlWN)I̎APv^죈?(Y'Ï?8 gGhn%A+L@t\7U^F"p_=áVr\mhG@kdYqt!59.V)>pby6c }>FSS@.RB0*#""&[c{xG>;,ui" :A*hwRv)9@ܷH/?ЫcMtv-3yIe#Z *؇ xm]{\=Oܼ siΘ9OMWёKSsGYV0Лޒ幎llφ+Y;{^K~-<> {oĴyo:W,% ~~,h $^aX0FdsuXAh 05@``b9?AHSA`!UY?nU*vF2Fw,z Q}ܘ:[{ S9d^J7fK.;aNfZPtnK^+$b9O (|!a Wx~@z'\u|7RR)dF dI PYa ; V98aa!U0zll$f4^|POSA[ry|;$Ngi <ބX@ʠk:;=%(--E+@=v“>:PRKX$I֜y۶ 5rDDD"O72<%J>Kk$2v=-\yi)/ΕEAZWD쓗'83G{=@ aSVVNee%㐏Y|В 2Td2A2<bW6Ρ78'꤅$'/}m]ZVU܏Ńfwln?Μg)4ەMa'<%}:;?wmiÒE0rŠCnkKKf.êܾ\>ܺxٛLsXmjaȞwBt斯YtV #n!5&0$q{H܀|dN5_H12 L39x2g8 ^"14}l#їqʴg9oF<_ȋMSRab3E^OǸf-,ې-l XcHjS^p @XNR (Ma_G-KaPp).ޠ/Vzp1| ?џ'I -%t]̆UV.R!JN#A{mJ.-"8z!7]i]3,;ԱFz{[r~|z$Zzcgow,[݅h?|2:19͛pSm4wS$4zx<a)I@4%}ϫ@"u,K:JifϚ֚}n}>rHx'EDDL,ΡeBةHǣ"! *_]>]>l)wpyi?y5ü}X鳠d%vUt-WF߀̪l/+bx&c,XZƦz4S2a[C2&bY۱qi2K~c '}rlmj~х;o#Z!!@cK&йL/J_>x} 8)` 6Ext s0|Yf2tvK6#=~j+UL1Wzz ng tWѮ if7z,_\,vj]Rjk#[:sx+ b(,cH|/wkH# ;Np'HqK`ݼnԤ;vu/8b`yf_n]2@5w?ެ,6=IcꮬX;d$x>NP`X(5zD"@+hz{{ЀL,`Ͼ}a}b*gRs,z*$  1h$5/񋈈X?ݬ}x!,qxzѲ’=ŧn'4~),H?ˏHsCbQ8lt)̚"7(߸3 b+bsXEd3RX1U;͙01]aò6O`ugfG{ T ,ngGW-/vaae:fTѾں@6_l ,@z$n$E;)f>\c[cLs?}7ay+!5}MyקhX=}$߁lRj;zy!hCMl#o, chki4+@#GW>͛?No_||˧Տ\{m'T&t@|/CG9"$.+S(.;LGd2A켄;_,B,ޝ'anm{wGsG97ǣ[fe_ kφlR SJ #n%y{Z- (E(qգ h@k֚^cxtEDDL8ݰ@ 'ԥ^-W-;#,D?/ֽ 1X$Bl*Xi OˇD-g6{b#j#Đt~R%ISV\Z`ST#qfݖf%bN  _U BP vࢮZ[E.i@)ܕʭJleg2ҥK 6X %"STx)2c(0FFաxYZ7֥]1$6嬳7]qwL k+ IDATϠRJqpgM4BDb%}/ osM䌎X?)78`R'o᪞{YQ4/dOz,Ҍ %_gݹz<2؝&3a"އEёWOؼQQdTb,*3>a[+qj:Y1Yq2I,7_">;8_/fEҜ; e~s.>OEoglyNJ+xŗ!\'R)+v`2/po/b3)VsS׬s=b<ژDJ^}8媃??uݹl۹'_9c[:kyxCOy~s{y?~9_bR<+/gꬻtiT^|h+M+v5_y&W//q'?}77Go;?༥]TK {FfaM_*4l4svr݊Gn~Q/]=O^CP@{VoDw [Jz3Dxr[,9 ' 7\-+t>k%O$|v鱵h06:ƞ=C^c[|.vMww7]x!53o^eG-[bg\ɏ3DJ8qyZɷN>ur)ݏq#60Ӕ^'KqkgW'=}y [klcܱkg;g yƎkٺ߽?tyYRx]mp9@goaPfYlH}\oSͰi:&in㷹r~J.1kscX>x|ᅷq kvEܸ컼ϺxylMWmj>jy^F'rV>OB;.]N*9GhQ@PF%Nd 6x 78gPOa[owN#iŒD)U#|08\Tx~PC`9 1e㇩\퍣b(E+ڽZbr8?8hf%Fje˶1Ȳ2z$co[;ҷg)ozҦYϨRj z:s+Ж6Oq;>6HJ ]w=?J!g[nm-Q$O p͕'ˍ^<QLL_1S3xyx]wK2.:_o*Jr &}*.__y×xdju%w?w?M'2*_|czp?}\-dSluV౾̸%OcԐ7 6:Ŧ%4'oFE4Rx?~&R$5E5cޖzYJGҹ͓(&8kV>MIoѪK;Yֵ0YY.{=>Xn7oX-V0dok{'-6ee^|{{੝[|m.<ԒnYV|u.mo\w%QtbF:|vE'.I+9c -:'صPbk.wBB,Y[n7{N0*H8a=3x֧mְy:twqUηcudg\'c(ϬX7Yc} X?@͢+f]V4tOodˁ7ܽO+yj}]$~j}g1R5H]&?z._C^o[D\ ^es =Z< yynyBFiD )d m8f5b. \|~{W+%!bu&KH"+-+_悋O#_K~c4j}; 5Z1Պ3'g8g}U?‡-a޻t؁z#in_6{| 3Tj9!Oιhlϱi'NwʹD !0::Fjs`i"zNwHU!"]sDg:B tϡD^o185C<(SG$,ོ n]< oc{z|)g\'/nu7sȲ5{]]13db g[{Vl 6o>:|vۉfa~_f 3Ec|:U3݄T `j޴Ľ\ kǟaxVSk0Zz =Ո%} p,?ĥcVD6j:g)?1C8(wU]pm >YV1,fb|j䄽?##Xh)!xͤSIJ!S˯cUײdي:h{ˏ89^B^[4&UbiDYBS%DDDDN5wvo''SOf """""3jђ3Ive"""""n<^d˖o3gnG.+fނEEWltǎWxm:BJI@(Jlc#CDQLxؾ%'ry yrh;vb Bs GgQEqtYGgQ'/7\y\xѥ'I9]|Jg=8˗/&,(΢8:,cdro>mF2kOXDDDD$TjrB(1S__|u(1SZǿM}d}ɱc9eIf⼋ddx7?k&JEDDDw^nrepm=kl/""""rJX,.$q!G1^uF*1Sֲ39h$)1o!P JEDDDD1SvJEDDD]ƪ@311c~CWb,""""yu782QDd^c@XDDDDPb,""""(1JEDDDD%"""""c@XDDDDPb,""""(1JEDDDD%"""""c@XDDDDPb,""""(1JEDDDD%"""""c@XDDDDPb,""""(1JEDDDD%"""""cx˖-3َQEqtYGgQEqtS%#1_ndҕ3i޵oq걏]F=·32 "GQyUv>y !H@cVX8:,(΢8:,/#?evX|L7-Gg9ؼy3'5ڵkc6QEqt1;2u$lذc 6m馈i@ijݺutM tS^=i7k9 mܸqV$P$ƛ6mmMih```V%<&CJEN37ndÆ 3 1"rɞÍme)6k&fI)\ϛiJ^QѨi'Yƚi_DDRLٸq#֭cÆ~6mƍy,9 $&НVzJ,쭲s2J5I{ug3XD`r[?l8xЋ?yp&xbq $+P"!Ɓw%FG63<\{3XDb '0A^I .j .[-S)Q-%K1rBP)%D&?Kp$G(""c,"S^ÁS TK$aN)Pgo 6ὅX|9{F 3ӗzE,Pry3 쟄 ϼ2,-lnezﭰ`NW1.*iS5H 2᜝0EDDK="2eڵ20P$ޯeÆ~^{*g~WܲJQGT"@p,(1DYRv9;B3ȡȔɅ?/gapt j $U2T9r,ϩꌎOP7Kyxg ^t%"rIGd$R)'t aH"Oؽwc4ҔmE7_$"""D緎%+ezr'jDdYK9IJk Q0Mqvlg;HG;$189Մ$!*IL`0x2hsxuuVR\,"""Ic,"I1˭u7 "3\k; ΣXD)gֿG_ovU颧JWW\!KDqL#˻ؕ[J-t i @HJ%L\*q~R"Kx &N0Q|>XBx1c6!.2IJDHccb@?bWc@JEdZ;~݁c<bfJh65<=Dexi5xk 4XDD:c>\@d6<>÷~6-xUMDD:c6k%q>P6=sd֑+4E6w""YȴyH3k-&6Αk-yp"""DU)Dd<@!wH]9u2[Pڿw8ʶXDD:c@1zO֘`bdZ^ٹyR먧X}z wZCDD:RȴM].M64dŎ\Ȏ'Ȏ X+ށ/&- -""FLQ(&Ynid9Yhf9-kJnx2w.^U)DDh(L_8Ix n,Isu.kjZCDD:c9jx>Βٜ4m^T0EaF-{1"2mu$*#j$$D~)ݥrl찉&FpD]t"""qQ wMGFČP6Mz:T&U,6wcSO3r4NJEA&߉HQb,"G- , bhRSKRXq غ̱Ƚ_DDD1"rT P v'Ƚ#s!czzED(1i3Be - 6JE8Iq0QwiΧ>ADDp4BD-2^Lv1T&3%6X`L5@8kɷ G"""r(%"2-&@Y` x[;U@7 @S;~og.סXDQJ<.D8op\qs342X=Y˯3kRb,"!@U|a@Y\EfZDjHRb,"LDWq`w#"")TXDfAnn”fؼy6(lܸk׮馈)LihÆ yf馈)NcENCټysGNh{ٴi FDDNS=[lv,:M6~zBu۱c'[<EزQvy\~z֯_1[)΢8:,JGb;7¥+g-"2Kv~'r=ws_ᖉȩlx6>Ʃ>w;mX8Z7x(#CEDKU!H@cVX8:,':G}[;s]ߣYGgQEq{w;e&-_|(΢8:,(IEDDDDcJEDDDD%"""""c@XDDDDPb,""""(1JEDDDD%"""""c@XDDDDPb,""""(1JEDDDD%"""""c@XDDDDPb,""""(1JEDDDD%"""""c@XDDDDPb,""""(1JEDDDD%"""""c@XDDDDPb,""""(1 [o5!@O9Cd Șm)ocN2̹֮5$2qO{~@cEDDDDw[lv,(΢8:,*qʗ p# 鶈,umsO|ÿ=wy[&""]xWxC)ғlǎXBqtYNt>8[>vcׯ箻G(΢8:89~wL[|L7-N86o Ijvکӳknv=.bn~-[z̯ t,cv:ec֭[(>d;͆ 0ưiӦnh IDATIѮdb,Ye]ràYN!"%rҬ[nnAc΢!"2TMN7Ί}(>7m4+z?:HgPb,' =9TY?DD:c96nȆ fҢY?DD:KGy:ܘv\b&.mlϛ9KpI5zf}ej>vOIFx%83|{,x aBq? '8[lYdiE, o 20 {_$1~CDdS̘SA7IFQ+X]+ t'{R*f9Z`,ٙs履\~u,Y[fIoevW-1 {ŸnVY0stU.ᬥh2QSIMsqƭI};""'zeF]A}ײaC?/=3+fnP(P#*@ 8GwC`Vc|b,K)tyH֮]` kY3ײ;@ @L$ĦEX:blIs@LOPog5xo[c :>DDN6%2&6(ݿp=8U2V"1T@WPM"wXȭ<;AK.噗-}I_7l~?XP5TC'&PI P Y\Bk9G[HSF'`lF2w^u=yCDRb,IGd$E僞rBw`X$p.;D{16:A#Mٶ^^VyreћzˆRD)ʑZ&Ol &p|<:&#cQ'h6XA|B}]ḵ.HLJɡX:緎%+ezr'jDdYK9IJk Q0Mqvlg[zĎE1IP s*2TJ$WIa( {$&;xZãDFs6߇V=^9<""'cXHb(qSMHbwJEyVvYoo49::B1JXT/u] .q]P,v IWlW,UOol]Ca4'zCkw޻Ui?%>/" 0f9)c08.,2S εVҥP_?KO_ U(e#GJ~/={,g`ޠLI]1ĢKɊɜRb,)gֿG_ovU颧JWW\!KDqL#˻ؕ[wUi=3%W_d(mW[G-i9uX_L !U"A#!"^c,-qR")H2qDR*ǭI(.18DA` \:GvQY>{\,qhoŭYELJH{)1f0ĥqR&)[ @I8I0qL'/ϫNt=;yW.$:rWT>|5GG(?I.jȑi/ 3,,u'z͔f3lkx{]!kxotp,FܹnG}̈́8v͒%ɿ~.(lQzb1ZJ|SMJ[Kyk/>oUDζ&<t!"rQb,+z> @:=8ۚu%\S9;wqbڌc]yW!l(05y~Z?sX+w?ǿwM1nsuU7t LJȩFt4(J>(|l{rܒb4ZV-{gy}u.;ЈzO/ .GQ"d Gn+O<&'aJk'ix=3}|jKG+Ъt`-&6I^DDN5JM1.MP,6֒,ؑ qy;ĢclR/?]wmB1weoYlsB&PJkq5{MvxZ|rMK V Ah1>LuL""%<@uI?jUCrr.[ZaמTdnPW1er)c|x|ryS pBG8 2Gf}[?5Evy龵'~Ї!"^JzrqbfFZ<'-HAQ'u CbjĴfSbW8&1\XKYYNns/DDJ (ٜ*EE@Q XhEO{NMj\RF EoppIr4Q`bԑ{K8;9Rb,/5CFdq3B4IRTsM=+=zD_sǎ5&i3bSC%x.̭4Y8S3}'q%ezt|cA )&8+$e5g΀{#~q#k<[p걏;M&7-#{\"&#sʉ% y|䊯qh%ǎ$cǘԛ9ie?r&Ÿt|G4 9FBW8 rȜ9Gc(Ʊ YΪ7lkW)!d.'w+0SBښk\3GG@C8<0:-6/&}}g%""X:iU>(O J@nXJbPI!Dݑ9gg,w^ynJ5nx<.ڰ/}9"q+?O9k`3=iXnx۳3CD4B:Zd+/(b6Lp9jg3K;luh%a8kɷ G2D8QA%dqa| (=hۍoײ.سŇs|& ԛkw !"^1e$ s> Z3^wP!P29]qI1fQ!†u|Snp6w|/?XNe:>DDOt.(G)a{ 9Y c@f-^W.$R3Q1ysZsǿze8u׵+ӃP X WZ#lnyMyfqyf;\Ej Mz4qN eŹ obf |Gg+jWqN=AF"l{['9OLJH)1LDWq`O7n(~G'?Ḏ6\w x!"~Jc`pܕΑ96+nyVw%t'?>Q.%!#7XGxg\;KY"iS|n[ /ccl.bX#𡨊P)x?aJ:>DDOpk׮eƍG}'=폏/ֈΡw"1887<͐΢!""%rymQظq#!֮];Mi;΢!"9IaLؼy3 tSN΢!"4XN~B|l޼#{&{lڴi[sbit0oٲ+r&:M61w1r}g.Kʴ%іDr:7V(똤I6v9)47}p"ƈ["" "EX IK i;/TBRD.wg9O_ I]HJKq9\~>B̙_=s޽<۴cǎ$xyO=u8O=u8O>M}ͷܖp&~:r)7wlܸanyWvؑO.Wϣ[-s>=o|nÆ ^Š0G[-st9.O&Rc0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" \NJ1G[-st9eJﻧlڼ%믿qk.SwyWя~$IVx}S^ÇGi󖳏=н2Τ/X۟oJ)+|6nh0Gs|+__}c;vȧ?G+>~bn1Gq'WxW~aÆ ^Š0G\ s۷/IwW}ÇSO=?7?7p>fl۶-[n=󸜘[-<0.ӶmIZ]\w[?=~gvܙgϞK:,0+/vR^֮]RUU\ @w,8={.pypڵkegy a WݻwgΝ^t=9ΜОfzfi1M=J;^LkfҌӎ3^ZɜZ8S Y\8z4mzW˿W^Ӷm|ה3Yw۳sٳ-UUe<4MiRU%dga֯ukrs M[7)M S.cݒ3Wn۶-ٽ{^_IiTM?%~2;gMo6 OMJ3h,dt*>[%ͻ{'2#\3@ >v|>3Ez{RJi3H䚹~֯ffra s0sAf 273p^URJ=)M:O/c]ᅡO/%maU27r`7 Kz%MTIzi*uԣKMڶNJ ǟKiy{Q\I\mۋx߾d׮?_>^iua];ukzLY7k߰fx\nMf,Y8y*KNQR&MSOcL gnݚmf׮Iܹ-Im3ks͚~8Se_2{%IIi%m2Jɉ'܉2ӌS&S%cro$/J5*f{'5*s^I4m6md4Ʌ|YX8wͷ>mSn9^g4U**^U3VRRI/U^i܉y3y'rji)Y\歝3t0^4;J@c`ٚR޺\\5Y3&W˚5șԸͱgO<ãO4Ru2t$00LaÙ ӦJ_)M:t3Ud09ȓPDq?I<͢'k]$򫿜 kKϖy UfSťZ\<}$GOdͩ#Y:}uJSc @c`YJ)iK$umI*KIIIݴےm3nKI{Θ-6˵9X$M[Ҝ~%3UIӶ7MFuR=ދ>dז\;Eֶ%u3Q]e_Ҵu~5yi27:qi_ߝ2tR&%67$iS7MMɨ5^ya׷Mf|m-X6'yԉ8~|4c7sleꦤJR};'[(uF:_t@ޒL^6I;]qKh:F&IIFMI+ɇJIF:FMG97f9z'nMU)[);}x\iCxu3 ܓ,-YשsoѶKn@cࢍ6m[Ҷ%zd,*+gR꤭Sc:V `\GbSf4NfAzs)BL ɚ̥N=nҎKm{M;:FmTI^'֧/Ka)ku3mMS5i^hbMn~IDATsjq; \J2?5]imJJmQӤiRRUIUWUI% MbGVL5N&Kd.7T6)䯘IXh4ΧOm[)eUMn+sєf49yo2ԥd/rɿK2yf)M]S%eJ2ՙRR')IӔuI[O7m+I)%'YXhw!JfzK6Mi4JL:icMMS*.:fړy c`YzijRMq/J;^*4zԤ7iFԣ^NbvbKR^۹4uzxzt*h)ͨRf4R2^lR/6Y\3nl'=\0-U2m3nfR7M0MӤ {Gh}L.s'Ô pٺukv}Q[/Fpcರw~^0+̶mے$B.ݻSJ֭[V1a W;wf۶mbۗ]ve޽^ =pڶm[J)۳o߾N=sFmٳgʫJpcn1Gt={dǎ)tkǎٱcG{vDž\[-2+i󖬿iC#ٴy~|m g}~+E)eeW:ƍst9bnǞ~rEj>|aÆi/aE[-st9Up)1D@a I1$D@a I1$D@a I1$D@a I1$D@a I1$D@a I1$D@a I1$D@a I1$D@a I1$D@a I1$D@a I1$a|icŘ[-st9ݲZx%ՃS6mޒ8=|(}$6o9ݛo-Lu+}gƍst9bn1Gt}cO?[5{7l0%st9bn1Gj.0cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$ 80ust9bn1G[Vz{ʦ[Xed-g{{s-e0I_>?3ߔRVvlܸan1G[-薮q'Wxf an1G[-s\VMa I1$D@a I1$D@a I1$D@a I1$D@a I1$D@a I1$D@a I1$D@a I1$D@a I1$D@a I1$D@a I1$D@cn1G[-stjTwOٴyK_vlڼc?ton 3>gpRʮu6??7#-st99=o1ްaô"-st9bӪ c" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH" 0$cH0>p4ױb-st9bnY-s)6ooZ`َ>>M}ͷܖp&~: |SJYٕqFst9bn1G[>DZ\㭚=6lV9bn1G[qyZ5a B@1$D@a I1$D@a I1$D@a I1$D@d0J|{sU7GRRR2$$I=~$^?~?۶R@b1$D9v؋{yO:U3l㟞g9п>gT^ukзcGi >o;o{W&a|[̾=Ѹ7F}åX![oO{ "=tϭd8dw0?| ޝwoڞٹ5z~r~Xͷ6e&WXS?H33ٰa~_~;>?2y,gE[/,3M.G>Ly%٤sٲ=7~_;?rpyMo\"R^v+S^ mӷ^{p0w)%_s݆冷~9ޖ="/\6^g>|ꓟ<놃K>a;ﹿX'Q/?'.c2] j|#;_}lN|o3g9PyR9c o^sMg?wS~~=wom}㉼[3 /xJjq4N肀sՌpek~0g˖-_= I=~E{5~ O=\=ߛ~ꩪ59 ,_UU^i<q~_B~w9b$O|5sˏo9~^UK'X^ڧ IDATxwWuN=ޫlU6G RyPB __Bh!1¸Yn%KWvʴ]~Unqc{ϙ3gf}fZkVMBBBBBBBBBBB 0kؐL8$$$$$$$$$$$;N '# UJHHHHHHHHHH8)IRBBBBBBBBBBI>ӧy=gYuN-ò-U@y%{BŤX^z%$$$$$$ g۹{[weeKrcIwjzg,_/~3Gn h䪙5{!M3f ۬dsӏό h1gرcc̙3YyǼ6sy]'[Ww&nqd\tb>Ok^ϕo#oOmGSOHHHHHHxpw&>7- Ƕ~wjF7F 5<Û>h^!s`;~ l:Ldh};E.X:f㟷c( !ƛx镗ol6q3bL[:6ul}#!ơ˳5"?O縉吐b,T*UYk~tq3w+y5rWs}O};v_tz~ιEװsħ>;.N='+!!!!!!ᅋ {#z THuu5[nzXuZ[|=O*([dhmٳgqh6o.s2ߣqڬ[8 ӲcڌvjgY{ޥQ:8aKl{f< `1 {  #Lr5st/Z>iηzJ̟amN7k֭Xj%?ϸ 3gwihm(3T=,G o|#7oЦGxwo䳟;Mpرs/ΝK>;kYo}ڿSkG+!!!!!!Igsƚs*˝wso{㋟4uضŇ?婧%o~'߁{ͫdaUsv_}}ss\z5!! DVM9LzL{EFYt%`/! CR-_N32qq$i˗u6\ wSyP?뗏}GG'a7tzu3O窗^^\בN-ÆK.sYK|%} Ae5BD؎[YJgM~C?^G[oB:9 G??a(_}̝;ꪪSMM}~;>ɏÏ0:2ʫ^cu5kQME;ǓeOFss=k|C˖,oNO1 A{^OG'UBf^њ#BIӧO0 ~[-{8*v }o<0?#Le%~Z.%4751c4[ߦKKt6G*yˬo/vm(;Ja֮Dz뗊h|ƃG۶Mokl {5to7pK."~uT*u̶5st03gjw {qe9t#{h=}_kv+W^ME䧷}[9ps߷80S;WBBBBBB *.K,~87_(7; {:XlB29 ~v/%p%ߏWq(BI`_vmcŤRf"=x^LFH)AkM:c>|8~t~OAf3ۉbO~3Zr}-M׾o}ŋ|cP9Ɓ6Z'ݝLr:7snG7rk^W_jlgCIÏըz0.&镐< ͯX_ϕ/{58K/9mƉu4 zu?L'u.8R+Xh6\rBl8_&Vy.#C< /8ռ7eRyꕐ玭I#B rBr^}ꕐI*%<Fٱ1Q][\u`WLHHHHHHHHHH8!IRBBBBBBBBBBI!!!!!!!!!!!d$CBBBBBBBBBBI~eHHHHHHHHHHHxcDaL9$$$$$$$$$$$ !!!!!!!!!!8hM~dba)©j\XC #& [0NWg۟@_H5,ˢqWb銵RZ 5P1˖'sΣfmzY̚;)!!!!!!!!!E)[=?rZjkkqeO|[_lBBBBBBBBB$qZ~)"{qSRlۙ*Ŵ4]ϵ /*l}Zny00M ˲׌e-!!!!!!!!!!x[_FnvXɤ z3("( bn7,޾cO~f%#XsueK-,Xv֟ͽ.!a*###J"PJatZHRϵ0ddx|aRD"Me7< |sQ5dLxd8~99~9V_lnesrYseLpM*.ҜM󊕘&w, ԮZeCP;q3$R-AIh%QB"DDEHd,<C%J)E) ZQ胯uZT$R(9f?ZsgQK{LFIE$A)ciU äQBCa C~7 2er,^VPJ#y%%0m5yL>Y`GwxЇǒ0dcttAJ<2 ;c`8lGmEd!%"hJ`j%dDQDx%bHX"=d":ll dM1RxA  À("s-k|q&CgNc5M:{  1(UΗ,/KrF-yS8=t*F  024LȲ,@j2io`֜945M=g*y >_}̘1sBmhT8_Ncn,_r=ba\|L6H(+Rq'Ʀ&V\>{9RJ[r i1R @~Fi^z`! L3 |;y!>}\(1<2VW؀Ba`;S6 &&fİ3c7xW{P;$8cZ 7jNiwHS xH<|e#fj=-~LMuj{#)l;ŌJTWMg;5 >Nr(v!ySn'̡_ʬ `;O6{JW\ V.\N}vƵfK ,=¼Ct s3PYvG(>F><ͦ-mm R"# SED)2@)7jJe$YBS4H6iµ48oR D 44!te z'-?$ogA-V4c J* J E 3ѦAB>B,riS1o޲{s\~e== JAmkXaS(tM ; |uy+ǵIqu;֚6*m0 Ʊ,@(EFDJ!P?}7 -buXOǓ2mjjǽ.* L ٸv6\~up$===t6Aa;65(%EJI$" y~<4JJ!?ҫ^FcԍOg؎D$dJ/-0BCM=gph)b9(=<6\a… sUTUP:>O<00mZHP|FFۨ%͠uܷl g\3c &;ZU嫦r: TCj.wqyەkqh`Xh @`8Xxe 9:^q9He_z=U^J 4w8(S)q (0&)2"IZ)U*[Q±!gq-24C+ QJAhRB!B)Q"D( {Nٰg5Teh?v#cÈ&l 3 饮f!z;m ۶fd2jq赴1 )%m#ѠX($J*rh۽wU/{UUUX,Ӣ\ %;(5 S8&ql,cB('EN446|nHVl&NSKA S8Lq8ʋ>JNրƬŬ* L[9ȰwtMG|SOi7I("e%g_LyvP02cdoH jR0-Rh,P1tʅGPNe (=uvtm8FuƵv R1664ѦR)k T*1/P*&Pf(zⱖ/y=wYQu- Y Y M< ]ds yg%-I:ӾC ~5 mضc[|uX|9RWX;z持aOÇaQ5i8AgU![v9_&;?Bmhٷo/`Y&\TE+l6J)*t477مT%5]]ye/'xÜY%]1}ٳ+ـ iVrLìf&+]=DP,[0 lql\%NͤOk\ۉ&mʞx)5ZiAGEtןWO}G{RL"庤RAJLLR2I!b붧1s&ϟ~{EHIxGERGv\uL<̙c;{l01WUppa 9]fn}!;kiV1Ґ@F:S[woS~5)%#OyT? TH]NȜg|NQ8o5W}]ߖm WCs(ͅd303KR/Ԙ`OЙI`]SA(9ΚOmǾ!@69cZ*#""0c0DK:̃Coyeuya61[GxR[WK*uhТt:mۘeTUUa5̞9wtV*utqOXFENP IDATדIg*&WŶ-D$ R))ab#<W=ZɦJg߾cƓجf,_{E q<'p\Bq zq.eۇn`NR5O}<>FwIqy`1!eИr&mE y:Mj9FR۝%\K!mQ1X8Y21U2+iĕe`hqF ^l\(.!/ZSiMu*k>5?kqcK z>UFafIn./ٹOz)g~1<RiiMTE(uDA"Da\`u9wD^r!9bXwna0?ׂJt 2S۩G&_3غZ,BIMʵI" n4M8Yg&N!_Jm۶`fϞ=n+q ,U %ϧP*rSVWG!zq#Ʊ~R ,눜Iwzrrן^V\McC3=(ba\J%<Wkb[&|- IaP]]])"|1ODhJU}BH6=˖- P=]8MJ8d8Pc`&LaR]SQ.c}(*o(ѣb3YzĄ],X004L3~pp(sðp]۶H2&8uaTnG*mx@|^ǾKU8~9֖QnFCʶ`l{קgRs[;)UqglQR59{Nms;1NLo #6Nm߼yO0grc/q5h;Nnmg9e:)1ȤM2)-eiVBOGu3P\>t B:1]\W:{+iۥ~=9"XFϊ-4ȍfļar 4<~wKP$ |VF ;%knq5'=j,òYw4D2D2I0KCȿP-Gh(|St?B΋-9~In[hbM?]EUƠfnC 6rr8䑏"²DqL\" \ "*x%JDH߽}'$xt-o"o2!M/]_ĩvq_&JkoYΧnäv*щhoG*ێJդiJRB@T25ضM̘1À&|x/PJr}r ocu:dd4}˶I:(°(MǨ4<4qܡ@I U*.!|<ߏC`&3WZ͕W㒽T! ]=f0j&t40Mzۉz3H+abg; =ϣ{LnmneiXmژA.Tų"Τ Qq:yrVMp(J U,[Ƕ9F!uq]ljÕҩcҖTWFNyS~ab%:~T!a1Mcx?,ȝs$xO_qw?يw|?z3 PyŸ0 &fT^{:hMӥ//#\*t5AmSb ,ʜSCH=,$k-tw"2P6IY& ۀ0APAKa1]j50ɍ4k' T&i@*fqqr'hM+6RRBG2/Q%R QMBF\6|sN<rr\yR*(~7'ĔɫmD`&ٔVT6 \7d+ߑ 2 DP+60^RS*( x>jvN'p~a7dl3iAX~mel6E:06C)**5&7`x.^70x !k 2ri^?YpSq5J_ɜݎtTL*iXiij B! "V9?RHA1w,Y{ "LlpH@ &+ɤX8CtwwS򼣶C9ATE@ooa^!LˌgGCTWWcMlٳYt)^.kö-4'+Nˣm,\GHSCCä\b``j==D!P(<칏CU"ܵE'W52<v0r? J~2k` ᗍHDD b)'EyLC␻buXU,o/ PPOgg|'_'d2T344mTەs0U71&QJس}7>*;}(tu Yl!UXP%C H-Pz- 3{մE^Tm3 Q}{bK*n-SX!{Ok]#ΚAK>|WӃK8,ˣ>~!o̤#_Ϡ׀&UNV<49]Ns&hY- ?VgIlj9E/g`&)ًrBff_K`+5U9S #E# E1|Jyp@>A=G-5~ccBF֎Ǔdzo`KKÔȫЄJ_mh|SI(f3 YHh$ # "B(""0B! vtw\*eRx;蘆\Q E@Dd~= ?€'ύgP^y vuWr" ݝq OScvЛZ_S!w6D=03%n%SHMnl.V0¶m }H.Br51IDaxrV/_˗b !OZWJgX0oǶHNvcQ[[ì3 x/ YK_ږCTWZy#,^E9XHϳ3hBf2%{zطo?CC#d  TxZAa`&i7X8M]]=rU"D U2&͒a%e#B6)}S':XeZe.@)@SS]]qe3ܔb(Qr $CRW7gfauRJ^^ d(yFqGj&Lt:tuv3?37&Q3Az,v-}=jJ#S`Հ= R!pWz_Z.s(Rpiko調kw3oIB:u,>8T\>)nڎbP3AR[LY7{գ#ǖ5Ӻ kK{Yd__7;QS"oZIP`PhPa%BͺA@ K %yGF(JEJ"|`xŰmmv3m*4uwD NCtQmJ$4uo-:c:OeP Ӛ|/_ȥ܌1b-hSV*{M@,AE۴;}Xo$ uC|X?]\T֟ C\%+HU\~y |ɧԩS\0 )NdTa}'LJpm,d23a[XE2qlM(RL.˪U+({G#PemA{a횵,hlXRj&~u8mNyp9#ˑp]2 W'Ew}vvҲGu^ qק!^ٵSek̺֝V4m>|<sRmz|iko-Nd횫8|~܃T*j zz-j05SgCC zD[ |{CC#hB5Y7/"L+-.+Q]r&m% 4aiPRLt76IlCy?Wy2^:\$T>*L~jGS==F}'bV`/,B7KVwʉ}cQ{қce 6?_0^rk^~zͲMM]GWךwu_&o \˰_/rOkYQjdAVr⒜' &x(8Qi^b JVx.&PY(q5;ΘNY>od%Qa"\?ܽ ̈́qnVQWcx0[px9߷ L%ьw^O8{=Eͯ>//fk73!Ov DŽ&D9?/D" IDAT(<ʞGGor߾rSBa\5$)A!dg2iG[t ]讽 -c eWx/|Ϡ0 ^欋KNjb4"MPX*Q, :O`@(EL\Ԣ$=M74BǶh(ZFR2S(IZ $VeN^?pZƛ q2l ^J$,UT:LyEtql9v,myd9L&Mo_.pO좳풃t:Ųv*sZ1SmQ(9, JQnR10 )z^`ttD"IG[+ND=^de$3mi~TN/=(@ƀG+PZ.C477sATlp5=9W{No Öy/sGʱ{B:o[0)hv=$n{Zkfi/<1ت(Kr@XVs2ţhltXqBmJ~NH9*CPof;&_|ٖ&hU_oWR )'K4֜c|gJMQvE/Oml,&Ү6{,[SS>mJg>P=_2Fr Tdk įmh SE Rbً(X>?`igǏdٲN6.`ph\'t{Z cҥ3̏lm۶A!mQ*l=w+EI5,8$P9iTVE|ʡ7Ql~hoZ 7G{,'] <ĥqR4e^,>X4u|tkb/h֖n_)VTSbuo -bRV/8ށyaI̛LTEC,c8JF{>e_02Q'2u8?ۉgMov\cp$mנ$yuhcc 28vFQ"S]-x- Y&w~<+9hGIDžb<{j){%,+xWLm )+8%qπ *ւCDЕ;MZLwoaM UH+~oۖ<;auë#x^Ӝ8m,Cˑ1M|uU\'aUg<27F* ۆ.ZbQ ,(O{ ԂQ 5! bGJ% lQ:eYZt:Â8se¸+gTN>͞={:h t:¦m<7ƿĿϬsl;&ˍ:ny9Ax/Otz`ES)`MT&۶IIT86yCJ"TD")\P qM/EFhIXt)m G8qv!_%w^\q+'?y5!‹Dky>>|-_nU?SWw/܎lbC!8Ce)x!ڮ6ԤY޶/&8CPxUty p.|t9Zqz`Eedd_}}=dAzzz( YQitGvlvtqբvny=x\&Z|2,k&[(,P*M~kPWwh.Vg9C`kgl>g@Mg+!6 0,+1aI=J*VUzPW'xϾ뺼wU?n6^ρ! _K6[}[%S))Ja3m̄ڈ.<._FTwR S(Yn-/ ZNrṄ!e"u4Q6넸VfF%1gigW?}W'{r܌ DCUGe.c(celuW.r0Tˆղ#<'p(0|ӃrCkK36mdigRf)eNN슪}*ѡ8x0qLcݯA!##ܼ`k6C[vx]Sxm6KP*juF({e<ϧ.Ks" p%Kɐ$n3rTRšDeMڮ4і%Ir}^W6 p2/ܞ~nqt2r@K*;7@q]o3}%X3e%]\ͼkc|b_ ?|dB-?z%Zдxy(~Lqs/`1-Pa7wsX}ky8VH99RE G:Ma$C4X|4\ׅY"#pV0Аv A)D 3yL: .wnYdg_8KX2c>Fk$ ]M656b!A._1]frkVrP-]IʌZxqF:D7-<[׌R\z%~<;{6r/ڇU |fUAbGذl&h! Fgg;7mS T@"֖%F!?KYy1Wz@3$QijY E2BtBT؅+kelʞwaaSN04w?Ź.W7%iڜ R|gPw&Pʫ6qas^%`gɦ|n0rRnn\=/ŎuAEK1Pcmc;xz o')/ٱoTo=捽ye59/㌔ӜǵCV7C-lhںٯ0iFǵe\HYI&@iCN[֕ x/~&w9<>򋴤YƵJ|]&i $<0VOȧ4# W,Yƫʸqަ?b[щs$I%ar8f" P=idmNA)EC}-%nLhB<'qvau~+o~ #]s@fjZ!FFF|/É**UJPAv=y}a~_X*1:6FW)ZZfz4U2T)9&| 60 ;Ur--KPqJ0T,\8'3Dn;ncYޟM\oB5c\N3N +aˇ /z0P~ 4Ú8' B~:_d0IZW[Z#]oV}?}GoëGw=ϚZyv$yih y?ɺE_|'xy& sdǍ54!*+ei\Xc[(eS,]2gzhvpk ZRB^cB,K/Q7RcPa%Q3卧X8O]p>T(#gR~`"wŻ6]R9U^i}|'E75?ɑfv.g*' d3>^4|,G_7vdqVs3>jEC$c9Luv:n]:6~\I{]T;OJ&\DW*тZqC|/;o61VYH9hkTޤ-u&9[I09;߂ hkkխ)aUill$cϾHl۲۶륩d2'#rutvvuy۶me3#DR6q^1P*9u6VZIbeAe*Ttvv000kZ_qz]oiks({bZkXҼxǍ͒NgH$]tQ,o*<'Iێm=fqny;o#>{zy\Vetfvuضm>lg_e' Ji dxA:;;p]}_VQtHMM x΁Co. ?}bߦZU?:;9-ZDiXj5 ,QƶfeE}KHvg>}WYD7a ;k=% :.h" oy|aEwMK]xStW/6N9rh8ꛮMYv99+#拯;'63+G&?FSOyT/p lo;Jg(sϿH&֭YC>_=Bvv5R]v+T0 YOY-^E =-Rq{ ׶E\hM IDATf؎eY<ē \N8x ioo'Tjֺ0WSInڱ]'Q P TO/wy;}} LJrfժ9vt2AOOR)~g8d2dRiҩA<˖+|mv\eˢL:s!]|6|:űA^|޷@0=Jj}!7쿵5*ACزjoE]s“XArw) ;vl3=[-sW =tvrM72e,.w /ԸfՑYL&Ybw><ϧΎ6R{Q1b7oرcSae… IAњsM$u>o*q~Zjr٣hh'2i<:YU.oPp,>vZ>'z30aiRnUŇ⮣~TH)6o~ꓤSyBj'¶K{.!F-r:z${ncױy ~Wyo-OoGoG!]n Ks h\4w,yR-}C;'oXC;f> ѤTt*0h EZ(mQ W{mNE"?MH[jm,Ƅv\s4Ig>!_2 !~TrHMcG[\\+u>C~5V.Id|?QKk\g ҏP_xeMS(x%Eiv|[1WdR.S;_/a*ߍו Ewmx/~z3xmsno=G;%c|Wvf a}Q ]k,G7K hla\+ں3K/3P,2cc d*ZK͂(H70`p]kp!:;ک;oφ'pll+*mk4T,ZqGѣ e._ĥRҵz KZZn&~G Ty):/LDGF$csy"`/vYo_Pgzߛ;NF}|͂c@9s+YoEsG7%96yZO t!aоV }|Aџ]v}wܸ3r~]7rN>Ʊ I~˽ jgJP)V\ع}묏mynumJ{k/ &$mV(BD% ͋swrP[縫 L:CGG;͋ǍLܼlr2 ˎ.mqRt vJQ/Ƕ=nlA۲H&_'Oŋih344 m,lj[zp0qjjZӧO> (*%dJ{6oȖ͛QaLذyF^|exGsPR*kqdaI3s!4+/Ká8_Ԥc׫>1?ukUjn4`hࡃ46. &UkVc[δa43Puiz7w] 7y> 9Ǘ~'z Ä *+usvEO_2?T]w9bXG(**i6NͧBՆޢGw64hmyZ%Կ(&{/>Nm+/ɳ$)5lڥ7/̫kknxqۯeTУLQ~)OP. ^G^9_,qVq 2mS*nTb{kVWqx9o'h~Rج/e*n8V ~fk[=}ށo |<=P,ql`#yFrcN:}6,K>ʶE[5fRs:sy#|]<5F&hڧ&n==8 Ig:5)/PZww78‰'( qCr\(L|rٸU+Wx&nޢ+#Q+ȹRV(w_@St;J\M`B|ԀRK{<2nXmT _XRyq¨4ďw*M u|2 _Ð_ٻ}Ric5J餋٠x ==ʍatȂ,K~_ޮµJr10::Jn4GTC:~'2srqvۈ/<:8B\ˍuE2WQ2ёRq3l&T_quȅVj {w_/*Ϊt*.]ʶKzGdx! Z/dyY9!M52 j J:] `1S;wՀzVn+7;G^EC{`YdS j-M1t(nrg,g>lb˒AM o^*DzIR~\rlY:wTe>mYE4ΰl:"<ٕnΩT+;K.taf\ЀqݳoJ!hD/s::ߏ7a9/bDIKTq,dy^N16Z>w 4n`Yf]b>j\W*\ a ?K&qiؖeQ}04JZ !QMg?yB!b\RU%qhlZL~,E|222EK0FϿF!B7Kڄdٸy >ۮ斶yTj gwKldB!bXc#]U) 9?`YmįqhZ̶;Y*ϻCB!džqqU]-)B!=tDŹQB!b6zJA!B1-jB!By-~1^yN9MElz M>g>B!'S<{Xj 7D%J`;ZOǾL7kje===U[Y<"_dc~y/oy wG7^wkm뺬Xn}ߘ_efJaV<"_dc~y/2qR\KoW'pB!B\1Jg.k B!ou6( B!x 3ưc=B!BEEAÏc s $pB!-jϋbgݦlF8YB!oͭKYu18kwR.\ B!xjX1&_tV%!B!Ĕ$pB!BLI!B!Ĕ$A!BOߟI B![Q[G6c@C, ۲, ˢ~3$B!o5ceE56fdm8c i@rB!A!B!Ĕ$pB!BLI!B!Ĕ$pB!BLI!B!Ĕ$pB!BLI!B!Ĕ$pB!BLI!B!Ĕ$pB!BLI!B!Ĕ$pB!BLI!B!Ĕ$pB!BLI!B!Ĕ$pB!BLI!B!Ĕ$pB!BLI!B!Ĕ$pB!BLI!B!Ĕ$pB!BLI!B!Ĕ$pB!BLI!B!Ĕ$pB!BLI!B!Ĕ$pB!BLI!B!Ĕ$pB!BLI!B!Ĕ$pB!BL8+WrF1<"_dc~y/Wjַy-,jYzE01Xu1c2E1<"_d[q'x'y-Տ_ oђ"ԚPM32V¶m±m4nA0]F===< "_dc~y/2R1|{V5pxG`mmmcy/2E1<"_<$9Z!B1% B!SA!.#5Ƙ+= !I I>bJE!dԟ"b6ϟ2<< D-oB9K!.5,DŽBN!qԧ>E.A!ělUBlʕ<ܹL&P__/.ǛBq)X~=>(od2|N!Bqal޼~t://S[[+ByI!̔R8C"`|;{%N|l6+ByG!0:XΝ;׾>4A!ļ"B\fJ)\׭wy'> ??K*#H bސrBqaR Ƙw}<ÔI.B\I Ye-K)|K_wqTJVB\q8!eVIٶ͛9rHsJ??Ϸmo>)B!9 !eVYiᩧ(7ooЀmۤR)2YB!ĕ g"!̔R>}|r}++ɟ rW*% ĕB!Bquwww͛7~z>ϐL&-/cz2 -/B!<9 !eAx>O|\.<]x饗}JS!D!,⮻Bk֭[ٲe gc˖-<䓔J+=T!b 2m??OӼ`߾}_ !gh!L$'* 7t> Ї>-B6CB!"B\&P[[{V3T*ŝwM7@6JJB! 2:Wh˲HRR+0"!HB!bJ8!B!$B!bJ8!B!$B!bJ8!B!$B!bJ8!B!$B!bJ8!B!$B!bJ8!B!$B!bJ8!B!$B!bJ8!B!$B!bJ8!B!$B!bJ8!B!$B!bJW^52E1<"_dc~R;oaQ+2d+=yݏwyݸ@ Vjvb(5J0Av7FijU8?U gQ*5*UBK@{(K!h3~Y7T$=%nvݽ.%Jv2=;j;j;jY;N? 𱿹˱O<>1Xn_{9t:4t?ox8?G/2 Fuczzڎ"ŎZŎZŎZVcı^zMMMEUQQQ{7G)@J8)@J8)@J8)@J8޸޸mrFF,maMDiihN ?G8:_zU'`~زu[&&Z 'pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %0y;j;j;jqhM3c9(mMӌkfG-vbG-vbG-vԲw<~$ٹc-[Eob2{B.~0 Vqz~LOOQQQQjw,86Z/ ;j;j;jqh %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %0y;j;j;jqhM3c9(mMӌkfG-vbG-vbG-vԲw<~$ٹc-[Eob2{B.~0 Vqz~LOOQQQQjw,86Z/ ;j;j;jqh %pR_/IDATH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %0y;j;j;jqhM3c9(mMӌkfG-vbG-vbG-vԲw<~$ٹc-[Eob2{B.~0 Vqz~LOOQQQQjw,86Z/ ;j;j;jqh %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %0y;j;j;jqhM3c9(mMӌkfG-vbG-vbG-vԲw<~$ٹc-[Eob2{B.~0 Vqz~LOOQQQQjw,86Z/ ;j;j;jqh %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %0y;j;j;jqhM3c9(mMӌkfG-vbG-vbG-vԲw<~$ٹc-[Eob2{B.~0 Vqz~LOOQQQQjw,86Z/ ;j;j;jqh %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %0y;j;j;jqhM3c9(mMӌkfG-vbG-vbG-vԲw<~$ٹc-[Eob2{B.~0 Vqz~LOOQQQQjw,86Z/ ;j;j;jqh %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %pRH  %0y;j;j;jqhM3c9(mMӌkfG-vbG-vbG-vԲw<~$ٹc-[Eob2{B.~0 Vqz~LOOQQQQjw,86Z/ ;j;j;jqh %pRH  %pRH  %pRH  %pRqx}韊#_ XG>ѶFj#6"";s2:nt |u@J8)ԃ>O~cKKgbW]\z(va<,-O'߸֩?n2~o֭ X:Nܹ3|{NLs`||Wf]|<൶p@\/4/|\w݆ٳ/FDd~[1?X,>q &{=ow}/Ν;=|<'}ќzh:<OUtn}0ff6_<|qU]znlܸeZs&bb?t^xq˶Ňfo6ʊ>/ulk8~Keq:Ÿ/| Զ߾8Y5{Mƕݶm|ۏ oMoe}mch,OX.z(+ÿwẗ sgNǖ* n{۶3LܹVn(WN|6>vw+~E_v0B^qkoyKC_[o~泱s#ޕ<ѧUϟ遀 ~&%Z_}ywOH^DsgN7-1q'OoL#+Qie`}jfGk¥߿GD,-|+g;EDt7'Bl܅W.iv|F#`E.}iLǟ[ڽǡs?]}o/MD+xV{,n5^Ӊ6z+!~}'7MD+XK_q]w'?ÿ֍7Z'w[`eVWrO[7ްk>ǿxoo|x{LN^On&nx5XRgϾyxG?k6=}x[_ϯ0=u~Ӛ.p%o<7#@YGVܦb5]y⑯K+j֏j^Y~23#pRH  %pRH 2k꯽iqs٣~r42\DDyp[xInUoOV%ܪnOr0tۓܪ[`YInUun%'U X5*ꑒLIENDB`netemul-1.0/doc/en/index.html0000644000175000017500000000262411254065431015250 0ustar frostfrost Help about the program

The user's manual Netemul



Content

1. Introduction
About the program NetEmul
To whom is the given program intended?
From authors
2. Introduction in computer networks
The main data
Network devices
Computer
Hub
Switch
Router
Topology
Mac-address
Ip-addressing
3. The user manual
The program interface
Network construction
Network customization
Sending of packages

Next
introduction

netemul-1.0/doc/en/whoread.html0000644000175000017500000000327511250530163015570 0ustar frostfrost To whom is the given program intended?
Manual NetEmul
Prev. Next

To whom is the given program intended?

Program NetEmul is intended for the students studying computer networks, in quality visual aid for reception of skills of operation in the field. Also the program can be used by teachers for examination of students. Usage NetEmul assumes presence of initial knowledge of computer networks and principles of their operation.

In following sections you receive the detailed information on operation with the program and possibilities.


Prev. Main Next
About the program NetEmul On level above From authors
netemul-1.0/doc/en/intro.html0000644000175000017500000000465611250530163015276 0ustar frostfrost Introduction
Manual NetEmul
Prev. Next

Chapter 1. Introduction

Maintenance

About the program NetEmul
To whom is the given program intended?
Manual structure
From authors

About the program NetEmul

Program NetEmul has been created for visualisation operations of computer networks, for simplification of understanding processes occurring in network. Except training, the program opens ample opportunities for experiments.

NetEmul is freely accessible under licence GPL. Also it's necessary to mark that the given product is cross-platform and can be freely used in operating systems: Windows 95/98/2000/XP, Linux, MacOS. Thanks to it the program can be useful as in the educational organizations using the free software, and in house conditions usual users of various OS.

By development of the program developers very much try to approximate program operation to operation model real network, trying to display in the program real customizations, factors and randomnesses occurring in networks. The detailed information on project development always can be found to the address https://sourceforge.net/projects/netemul


Prev. Main Next
Manual NetEmul   To whom is the given program intended?
netemul-1.0/doc/en/config.html0000644000175000017500000001401311257634326015411 0ustar frostfrost Network customisation
Manual NetEmul
Prev. Next

Network customisation

In the previous section we have constructed a simple network. Here we will a little improve it to show you as much as possible possibilities and customisations.
Let's go.
To begin with, we will complete a network. All devices will be involved in our finite network. Here our network:

Perhaps, we will start that we will divide our network into 2 subnets. We will accept, we have a pool of addresses of a network of a class C. We will divide it into 2 parts: 192.168.1.0-192.168.1.127 and 192.168.1.128-192.168.1.255 with a mask 255.255.255.128.
Authors hope that you can independently assign ip-addresses to all sites. It not the manual to computer networks, therefore here will be considered only that directly concerns the program.

For customisation of ip-address of the interface we open a window "Interfaces" (already mentioned by us above). We expose ip-addresses and subnet masks in appropriate strings of each interface. After pressing button "Ок" or to "Apply", we can observe, how the indicator has changed colour with yellow on green and from our device to which have now given the address, the Arp-report frame has run. Whether it needs to be revealed is not present in our network of repetition of addresses. If All of you таки something not so have made also addresses have coincided, there will be an informative message after which you should resolve independently this situation for correct operation of a network.
After we have placed all ip-addresses to finite sites, we already have basically working subnets. But only everyone works autonomously and transmit messages from one such subnet in another we cannot. Accordingly, on it we will not stop.
Further we will give addresses to each interface of a router. It to make not difficultly, as operations similar that you did at customisation of computers. But nevertheless, we again can transmit nothing until on finite sites gateway servers by default will not be installed.

In a subnet more to the left of a router all sites should have a gateway server 192.168.1.126, more to the right - 192.168.1.254.
In a figure above there is a field "Description" in which you can to name the computer or to make any description which will emerge further in the hint at mouse prompting on the device. It is convenient to give names in this field since at opening of log for the device the header will contain this description. Other devices too have "a Property" window, but their contents differ a little. We recommend them to study.
We have set gateway servers and now for us completely a working network. But we will test its working capacity in following section, and here we will consider some more properties of objects.

Now we will consider superficially various items in the menu "Object", giving you a starting point for independent and more careful studying as possibilities of the program, and principles of operation of each device. Certainly in following section some items will be in more details disassembled, but nevertheless authors hold such opinion: anything so does not accelerate learning process, as independent research of an interesting material.

We Will start from the commutator.
Let's open its table of switching. Now it absolutely empty since there was no data transfer. But thus we have a possibility to add static record, for this purpose is necessary to fill all fields with the appropriate data and to press button "Add".

We Will pass to a router.
In the shortcut menu us items interest: the routing Table, the Arp-table, Programs.
The Arp-table too is empty (for the same reason, as the switching table), but in it also it is possible to add static records.
Very important item - the routing table. Already now we see in it 2 records.

These records correspond to our subnet about what speak inscriptions in a column the Source. As a source there can be RIP protocol, to install which it is possible by means of the Program item. In a column the Gateway server is brought the address of a following router or our address if such is not present. In a column the Interface a port address from which we will send data. In this table too it is possible to bring static records, and their priority will be above, than for all other records, and in a column the Source will appear an inscription Static.

The Program window looks like this:

Accordingly you can install, customize, delete programs. It is necessary to tell that only those programs which can be necessary for network operation here are included.

It was the short browse of possibilities. Further the most interesting...


Prev. Main Next
Network customisation On level above Sending of packages
netemul-1.0/doc/en/router.html0000644000175000017500000000452311252512512015454 0ustar frostfrost Router
Manual NetEmul
Prev. Next

Router

Router or router, — the network device, on the basis of the information on topology of a network and certain rules making solutions on transfer of packages of a network layer (level of 3 models OSI) between various segments of a network.

Operation principle

Usually the router uses the address of the receiver specified in packages of the data, and defines path on which it is necessary to transfer the data under the table of routeing. Thus the router can select one of several paths of delivery of a package to a target. As the path understand sequence of passing by a package of routers. In difference from the commutator, the router sees all links of subnets with each other, therefore he can select the correct path and in the presence of several alternative paths. Solution on a path choice is accepted by each router through which takes place the message. If in the table of routeing for the address there is no described path, the package is discarded.

It is a router icon. On it, as well as on the computer it is possible to instal programs, for network operation.
It is possible to view the arp-table and the routeing table.


Prev. Main Next
Switch On level above Topology
netemul-1.0/doc/en/topology.html0000644000175000017500000001032111254065431016006 0ustar frostfrost Topology
Manual NetEmul
Prev. Next

Topology

There is an infinite number of ways to connect computers. Each connection - new path for the data. Network topology - the geometrical form and physical layout of computers under the ratio to each other. The network topology allows to compare and class various networks. Select three main topology: a star, a ring and the bus.

Star

Base topology of a computer network in which all computers of a network are attached with central office (usually network switch), forming a broadcasting segment of a network.
advantage
Failure of one workstation is not mirrored in operation of all network as a whole;
Good scalability of a network;
Easy search of faults and breakaways in a network;
High efficiency of a network (under condition of correct designing);
Flexible possibilities of administration.
lacks
Failure of the central switch will turn back network refusal (or a network segment) as a whole;
For network laying frequently it is required more cable, than for the majority of other topology;
The finite number of workstations in a network (or a network segment) is limited by quantity of ports in the central hub.

Bus

Initially "bus" represented the common cable to which are connected all Workstations. On the cable ends there are terminators, for reflexion preventing. Later in this topology such network devices as HUB (hubs) have entered. Hubs represent multiport repeaters and do not change topology basis though visually given connection is similar to topology "star". The main problem in topology "bus" is collisions - arising at collision of signals in the physical environment.
advantage
Small installation time of a network;
Cheapness (it is required less cable and network devices);
Simplicity of customization;
Workstation failure is not mirrored in network operation;
lacks
Any malfunctions in a network as a cable breakaway, terminator failure completely delete operation of all network;
Difficult localization of faults;
With addition of new workstations productivity of a network falls.

Because of the similarity with topology "star", "bus" wasn't explicitly reflected in the program, but you can see how it works on the example above.

Ring

Base topology of a computer network in which workstations are connected sequentially to each other, forming the closed network. The given topology is a little extended in local area networks and at present in program NetEmul practically it is not realised.
advantage
Absence of collisions and therefore predicted capacity;
Possibility of steady operation without essential falling of a transfer rate.
lacks
Failure of one workstation, and other malfunctions (cable breakaway), are mirrored in working capacity of all network;


Prev. Main Next
Network devices On layer above Mac-address
netemul-1.0/doc/en/mac.html0000644000175000017500000000324511252512512014674 0ustar frostfrost Mac-address
Manual NetEmul
Prev. Next

Mac-address

MAC-address (Media Access Control) — It is the unique identifier compared with various types of the equipment for computer networks. In broadcasting networks (such as on the basis of Ethernet) the MAC-address allows a network is unique to identify each net point and to supply given only to this site.

In the dialog box, in string "Mac-address" it is possible to set the new address, but by default, at creation of the interface, to it unique number is assigned


Prev. Main Next
Topology On layer above Ip-addressing
netemul-1.0/doc/en/ip.html0000644000175000017500000000447111252512512014546 0ustar frostfrost Ip-addr
Manual NetEmul
Prev. Next

Ip-addr

IP-addr — The unique identifier (address) of the device (usually the computer), connected to a local area network and (or) to the Internet.
IP-addr Represents 32-bit (under version IPv4) or 128-bit (under version IPv6) binary number.

Mask

In terminology of networks TCP/IP the bit pattern defining is named as a mask of a subnet or a network mask, what part of ip-address of a net point concerns the network address, and what — to the address of the site in this network. For example, the site with ip-address 12.34.56.78 and a mask of a subnet 255.255.255.0 is in a network 12.34.56.0/24.

Arp-protocol

ARP (Address Resolution Protocol) — The network protocol of data link level intended for conversion of ip-addresses (network layer addresses) in MAC-addresses (the address of data link level) in networks TCP/IP.

At IP-address input, the mask depending on a network class is automatically substituted. After pressing button "Ок" (or to "Apply") it is possible to see at once operation of the Arp-report which checks, whether there is in a network a computer with such ip-address.
Prev. Main Next
Mac-addr On level above User manual
netemul-1.0/doc/en/hub.html0000644000175000017500000000366311254507113014721 0ustar frostfrost Hub
Manual NetEmul
Prev. Next

Hub

The main function of the hub is a repetition of the signals arriving on one of its ports, on all other ports (Ethernet) or on the following in a logical ring port (Token Ring, FDDI) synchronously with signals-originals. Hubs derivate the common environment of data transfer - a logical segment. A logical segment also name as the domain of collisions as at attempt of simultaneous data transfer of any two computers of this segment there is a transmission medium locking. All computers connected to hubs, derivate a uniform logical segment in which any pair of co-operating devices completely locks Possibility of data exchange for other computers.

It is a hub icon. It fulfils all functions described above. Occurrence of collisions cable highlighting.


Prev. Main Next
Computer On level above Switch
netemul-1.0/doc/en/intronet.html0000644000175000017500000000467611250530163016007 0ustar frostfrost Introduction in computer networks
Manual NetEmul
Prev. Next

Chapter 2. Introduction in computer networks

Maintenance
The main concepts
Network devices
Topology
Mac-address
Ip-addressing

The main concepts

The computer network is a connection of two or more computers for solution of following tasks:

  • information interchange;
  • the common usage of the software;
  • the common usage of the equipment (printers, modems, disks, etc.).
Connection, as a rule, forms by means of a cable, but there are also other, more difficult resources.

The computer network is a collection of computers and the various devices providing an informational exchange between computers in a network without usage of any intermediate media.
Creation of computer networks is called by practical requirement of users of the computers remote from each other for usage of the same information. Networks give to users possibility not only fast information interchange, but also teamwork on printers and other peripheral units, and even simultaneous document processing.


Prev. Main Next
From authors On level above Network devices
netemul-1.0/doc/en/build.html0000644000175000017500000001072411257634326015250 0ustar frostfrost Network construction
Manual NetEmul
Пред. След.

Network construction

There are 2 ways of construction of a network. The first by means of scripts, but it is not interesting. And the second - it is independent, having put the imagination (in moderate quantities since us this network then still to configurate). That's it about the second way there will be here a speech. Well and for those who prefers easier path of solution in the program there is a choice "Scripts".
So, we will start.
Here we have started the program, have created the new scene ("New" "File" in the choice). Now on the toolbar we select, for example, the computer, and we start to place.
By default, the computer has only 1 interface. To add the adapter it is necessary to select the choice "Interfaces" from the shortcut menu, or on the panel of parametres. The given dialog box will open:

Then we press button "Add", we select type of the new adapter, we press Ok, and we have one more interface.
In the same window we will customise the interface in following section. All other devices also have a certain quantity of interfaces by default. But that each time not to add/delete interfaces, it is possible to make own customisation of initial quantity of plugs. For this purpose from the Tools menu select "Customization" and, on the necessary tab, change the appropriate item. By the way, it is necessary to look and other customisations because they too will be necessary for us.

At a choice of any tool, it remains active, another will not be selected yet.
After computers are placed, we will put the commutator and each computer with the commutator is combinable, having selected on the toolbar a wire icon.
To connect two devices a cable, it is necessary to fulfil following operations:

  • to click a mouse button on one device;
  • to spend a line to that device to which we wish to connect the first;
  • to click on this device a mouse button.
Thus the dialog box in which it is necessary to specify what interfaces of devices we will open we wish to connect. If the interface is already connected, it is marked by a green tick and is not accessible to a choice. Sort of this window is more low shown.

The Attentive user, probably, has noticed circles of various colour in the left upper corner on each tag of the device. We think, it is necessary to tell about their value:

  • the red indicator means that the device is not connected;
  • yellow - the device is connected, but not customised;
  • green - the sign of that the device is connected, customised and ready to operation.
For us only for the commutator this indicator green because (simple repetition of a signal on all ports) is not necessary for its operation of any customisations. And here that our computers connected to it could work it is necessary to configure them.

The result of our operation is More low presented. We hope that All of you таки have tried to create other, more interesting network which is distinct from ours. Further can save a masterpiece, or at once start customisation.


Prev. Main Next
The program interface On level above Network customisation
netemul-1.0/netemul.desktop0000644000175000017500000000056211261675676015167 0ustar frostfrost[Desktop Entry] Encoding=UTF-8 Name=NetEmul Name[ru]=NetEmul Comment=The LAN network simulator Comment[es]=Simulador de redes de computadoras Comment[ru]=Симулятор работы локольной сети Type=Application Exec=/usr/local/bin/netemul Icon=/usr/local/share/netemul/pixmap/NetEmul.png Terminal=false Categories=GNOME;Education; StartupNotify=true netemul-1.0/GPL-20000644000175000017500000004313311216677600012615 0ustar frostfrost GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.
Содержание
1. Введение
О программе NetEmul
Кому предназначена данная программа?
От авторов
2. Введение в компьютерные сети
Основные сведения
Сетевые устройства
Компьютер
Концентратор
Коммутатор
Маршрутизатор
Топологии
Mac-адрес
Ip-адресация
3. Руководство пользователя
Интерфейс программы
Построение сети
Настройка сети
Отправка пакетов

(|QQ7߿] 1$83$',伛G׌̄H\!܅[ܑ(B|㗬]3 8%w ~_H\\.*gЮ|O}ٟ&g%p9aC^/~=P̖-Oٶ/d:|Eory'}5wVV~C8 /ɽo2HA{8]}) _'Oڰص *tTr^`p߮R_ 5U-B7KƇϟɁ5~`O#{x];sr7S'&7 UdQjS#dǁw,p;2.a_CЮseկ{֎5Ώq>$O=yߵ(:Hw eywpWFX:w=xZ}$CR8pr$;g]~b}sBH"|>CWZyq_o66*PCZ8Eώf&m6AgH R N^D.kCLqۊKV|U_zGG3~+ǽ=KF%QsGxEwx۵7RhѰ3A)"5 I"5 ~w/rp<2zR(|<<# 0.SXIENDB`netemul-1.0/images/note.png0000644000175000017500000001306411235657137015035 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATxy]E?uzt;#1$B-Yt\ t2q9#z83Q $rAA @X&$!!$$[?꾥ͻsuoUޭկ֢D PX(r(r(r(r*O]P7 $T@E8,|צ%h9|VSq`ߵBИL M& D"2qOۏ9DrF00#'!pLy=X p9[0Qq!B5 3p%DDG;O${=}ً[7v-sFfV0? 8t7g+od#`=@G^k  @ M;_qYck}Kl^;B|Ѓ`Eb`EAE@و1oJiD<tH ^ Q Ն}|,@Y#;mw{[ךZrul\PS @*OwҐ/|AkiveE ceepnJP DEA!VX`1YVZȩB4~~` HDM<X6T-_am$%+?Xt/ 0iBLA@ s͆}~ytKn)$,:IeVf#v U*Jy .8JՅPl_Cl2EMy0 kcXb^M)Uk_z]}x`sݵ1v7>K"i "8!VVEv*;f=kjf_t $ * vbφpڪA*@E}{f+%O IH;@yb1?z &N'1ʪxea,p1G! 45$Wt ?Ç@¶Keɋu/h4NIf ^յ'Dmgld |0=?C̭t_?uW5bHP2m٥ 5xϿp{k =x CkVETNMlؾwC ϶rC3$euβ[z'w>'@.Tn?Ę8y55eHp#f9'ꉝ?4PuUp$[ $Co^>+dx;oyO{uS`X^X TJF۽`FgGkkFxd"ܿc~rXX 9W+@ TV'@.Vi5o}(I$a}8=\C̈Gm53`q.;mgHűE~ gFy=(k!3+3f" {d~߭sbmWL/h1ýx(6pZi`f/.|qݏ)K//eÆe?ߦ /AF:rC(0mP23O .PsJ#;-o(<r;g %C(k _B9r`yv7:aCn afJ.:=L FLǼ^Qn 9bra9 u(2$ fZwfS]um'`_U8.׆rZpb-F;Xll^3?@'7W0օx`Oae{]p,U}ۊ嵠6p:|ï7Qn+mAy(/p#B>J<:WB'%bB w/hO4pA!н{QFYaCqQQ)g \&2yz%o/ Hw7hTN;K!<3+EP-^4L1,gZ5Qߺ -nbgZӀIW^һPF]IrAK1Z*͆Q2G 8Hl^oz`˩]* L5@%b+eFՀ{?g?~@A$p@IiZ4ʶ`jĊ'sC}64@>3=(D]a<.`ݍ范<Ƨw`> i(9 C ǟrn̮ឡ,eKDi]pȈ# ߍ뙩`egO< 񙣈p f}fL\bˍF܎ho F̂*#S0 Nw~b:Nhn!2#!x̙ Nc PnUB[K7fj,Ϲdج-ry}e }O??Y9^ǷnAfw2\$e#إ2߼n]}{73'@Zlf Gy}_1bG(FŀR]nFa'@*嵆+*rcCh]r2͕?y Okd,5|d+ . :Fec8P{ }Ei|c#SӴFohcrm+egHU W%㰘Q' J!R@^~:UC-''A+DژLfgΧYгe Ba^?[ 2I4yiԤ9Px#0@AquQ!,:*g`)R{=C$yOޛY(Kٰsk;3M>Tv#*qvh8 (r(rLhT,:XUP]cU7OZWlΉZ*vu_ h` ]xi 'L-n-,S,Mmi1SPS!d[ oJ/sXJ{b莗0bc8~WƛVY@z ^:/9Q] J 8tMl< ƐLXؙ+D?2bՒݬ:5O ۜU(ǝsԽаaǐŽ[Vn=D\D^K,7rD| 0ͽp&ECKOڵ;_!eϠ~چDK{ g7u0j=eqa 7ėiyC6a4ŗG޸ZDgD#Z[yńC#Z#̽_8.&\ckY8h xnBo{Ϭ?/hXW}т'yZZDF"dFkϏ)iy9EKF~:Ւ+ӂI#+kxވy3hEk7#kXLL"ZkEqkb}.xWUñ["@ceWOceWq m('F oEEW),OPBjqLxS L~6@P9QmIENDB`netemul-1.0/images/table_arp.png0000644000175000017500000004766111235657137016033 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxܽy%Uu.=t7 SAE$I2ݛӘk$ˤ&_bn4hT$$ "B7@O|Ω׺C48_}9u[k=YCumkyƒ"AH"]@ |GL egA,aawc&a&I0 3=X=N{~wMq/?lٺ \g!Bž0 _H@UUckJ ',~wAtk^a+;Y^|EKk'*>D8.*RxdDpϟ]1@Oq*;VxX1*tW.ĪfNN[](? q y\* Adҁ/ue?uS[XJ/`;. ?+;|u}q.]sqsDqii CIz ~\XOlٺc#T#qI)3k&Ϝ 8 O j~K5! I'}ߛ%y^#Ǽ޲u `ny1^,9T,m#L@`PaCd'uaV~Q9xR+Q)/wS_Ѻ꾿O?UODlq pN{55mn&3-um2`F\˱ LB9)3K;'U%r{G)֏\l&o辁 1l!B#ddX&&tl 2=P8A t "!#bsp.Z xCwr>< )O@!8v4BR䚻wۏmL`&f_y3~~d. P S7h}eiƣm۵oxPs-;L$ c[DEdoR Y`6^؄Bq! `QPw q*tqArpN9s'?g3S]3O婟t!bQR$!Ozk% "2pt>NWHMS@!̞IfXMăکCB,, 8b<#;IxR8s̉R8nac XœTDSrL#](]lߠ:ʚW^vyd ,X52 5zZ_X",fFlK4T{:{3!ffY+{9/,CSo|Mw2_8:GCtr@*jﯱv>w/wBielp`,9TNx-+ǒC$hi1Mjm4vh'(|PRXf!E> 3x^OF"L @35C$.c簃Mu,4ޓޟ{:ez`Va%*! dF[&0ӤmӤm&cRJgCع",0ËPA ԄXDfRqDY11{00RjX9q}ϗW Y.|zZ wxT 4GhS@̈́̒MM/I66 JH!ADij^8 "v0F $T̪4"`-*|YD?Y{,BL#1d(ken!*\kR}:dz,/C 6-D@VITĘIct`X:|4ɶJjGAj7)/>DL0CP r;EYɜ |jcZĐ&}>\7~e=b*:&PjgvIozIO歧 lq)za %P X>ma7Ɋj@si ' #$%A $]Mg H: 1A _,i1cx&R,BF9o aa{cDXj6!aa&l ћ5խ{ JSC6K ~4;wIo|?zɢnٺxxm+.Y5,1%z <q0 J&mcm$2 i: $ @XPJ :M7R{J p@D X]&qD] :cF{ lBEDCDd+D @z Έ$ 9 r%PEC 9Xb247u,tp_~Yl~ȿ_e>M ].\"%Q~H೅{q@J2$Y > 9 ]i!~JC<w҃px PW/skAͥkOɇI`cvo[*ͼLCJ0(I&mI:F#,XBY|\{IS{'Z/FvpO\=`#+~Em'|o6g&7 laiXC-;bd[H@&( 1 ;߇ 6=<I ̀hLC@- 29wt)t 55rI!ЂUf/y$+XzHe,BYƸt3óAgV4y|6ªB7ug =OEq=ixђß_4Lf?~ɋ?9cvc[{N~i42woy0҅!`$˛fx$w\%mCaSw.MM c6;~.z,-`ggǀ q1<>q3玥p…yAU7KjSa_}+}A1 &sh p; B#{{zzga$ 4sLn8羅g)wj a0{׼@Q8Luz]U2ޯՒ<1Ĉd/8aqT *U@֏M}OU \% ir =4,Ѳh5$5&YB0ðR([ A4S5O$0!#"bd5'@)@ ~ =,hU8* XBQi Ane *b s L+>|ΦWu?6p1Tqj$=uVGUKa0h;gfb̊AX;F[&%AR,茍ZR !Z[rP1(pB^@cH #0 cdb#Aٰ!aԂ{ЃHQ0 jy9f^BtW%E, {ߺ_]7~8jӫ_Fc8'3p0igV JsX2fiB94 eݖٜ|m8'G$BDMjk@F`%06rXޭT, MڔPvV7汉g `"@K{1Dd93༈2[xh6 Zf"Ýe8k5NC{R<佇0Ha!da O<Ôt*$ߛY\HګRSjy61|ҿ8WjYnBaiZ4d:g+ :%"6?^JE `s9{XI6N3jɥ'pWX9$?rx9EXyy% #"D,FB"I #=2ȀBvtQ `67O=@vxϯ>-o=i+p4 ZC.Ǿj5ž %zA!Il:hL:Dd;1!7* xN M !KT0uTĚW4 kT@?'h[t0K#$%f 2%10K,.P7T\1B$ @f7Mgc%' z 6=et3ol[C;wpk|IIO[ W,Ī}f@HVRE6iAĐQ"GVkJP*^Jҿv 1 LBXLpz_v~-Xy(g HDwu3&F\3,^ fijA7t2#H7#ts ƐK)ݙxӢې!QNe;ZJMDxVr"mbI`oXץ:$\+TͶD>=y[D$ZV#yɺ7<42{фgFEhb93XAgq4 W0,¡;/y^xۓ,j8xֲsz@Es6r01 LT/$#Q" 4hyjj)PऋHdCጔa"!H9 yB%Fb I/x7P䅏Q a*{}-b>XgޓyɋBzyK+P  Y=$O}XȞhE7':It$*xjTDڧLib-Eb$Řy $#~EٲY\<BH(1VjM31Z谈*s >d/(|f8;U8&$#ydb#=eRҿE7 e,Y%-`0I) &sCI~-.pQ;ѴCB)iM3"&PbaJ-{Ҹ> _EI9w!=9K؟䙓%y"h^6ﯬFj&p?d`1po  d2ԠIFSE%2"B;[ +#,%$1#c"Qޕ>cV!QyuSޓ,xaaIC S[D]LTgqլD83rѬ\Y©!IѰޔY>Q;Ŀaa 5c>!#$"^ɞG PfYw #!.d+c#I ^"ׇ`<.<.sT\?p>fy6o]8S &QBD-dIM7Mf#-Y@jaz<x}PO^` , A6X? ( @u A®!t⪱!T*%n( I^k뎀 Bz|tGܝXhzkX(0AHi ZMA+3* Fr p_miJF mf )2bkHlqޣ(g>jA,Gj |Uߤ2R*`iz> ,{^Ӆv\Q};H; G & T+>^ IDATAєX徑d6DB'wfs,2"r‘GВ4-BDu̾c4-[Rj >df]?|MQ^OHY wh0bU6``guƒ-w-NΒtsH/t3^D/klznNf^t3n >0.~"{6cRlc4 -kT%4=Vy(?gF8k㖃|xz]stBMϬTEIB7}Ձ&~/x =B~}Y^lh E /p^S,,^ٍ%zB'|oRy _KzoFڽ'go>n",YBkd2tB; |; 'eB5Lʝy0mxqK Da7 +$; Q^|)\aKXoH /`e8p`&wjt-Z'O?_|qpvij8c 7j~݄ ރ7`aoq4d5Ēb OQ"+K.uRҫ4i4• 3ZB):zMBxGhF0 ďTI |=.=QX{0odR~]uA/N[7xƱ=-sMjD~\{^HSbPx'y~d( T?5 Rk%2 D]%㙅=h3lto vH?tvRm 6WˮÃޮ@we_`Pέv2J?V.}SO`7 YGTۤYҭ"ϹWYV@D-]^!@<\!!C 'Pi5Ńp:u2x]{щaNUΓc/r֟\췀1M/}nωMOW`4~_eḺǦ$ͳ -@}~a, tr>8': ϞTfH|1 C' 4}S"`¢ˆ)_ kw.b xx3iZG|6ؠf{V;/%zq><>W~V&U <^aZǢʿ}ue95yә?;T2 Sl q0{hĞA 0*y'^SŮOn1ƿ}oi!']͠@ 8cL㙛& ~D":*jt~ Z(ZR2^o3YEfP9{&*M,be+b a5&e*|H: Ĺ=xkG&HV*q#@EX|m*ux(fop ʝ< WtjgGuG~õfr1!)lVS|x'7)&f"zIs#9 D/ b2ĝ/~i" 1;@}s }R1\~]ek;mFe1;wp`QaX9pL ;sA_L=O ^gbx73ޚEggnl7,n^H^xV}/jK@%PɡtIyJ xex ;@ҵ0㷝8OM俈B׮#730t '"{P烂@crDHjn0 ()7D5#wOv3f" ';=W=78 /JKXi>> 8v-OJ;O˹t=wžűkN֘!.R tL/ŧOoOٛ~fY@a~_zg1'_D?C.9LT &$,ȹH6At x[LrΜ]_ԠrexgseXU#׼;W p؋N<3*̥~__ wm٬bE]}8e$]˷k{%Ta"MQNg…9;G>agB0wq+ǫ NMˇ2h7⼝G].BQu?pp>!S}50I[GU80.ÿ ZivG`!ASBt~UNjf 9V//p-u+f/q^LQDqyFQ B;{{ob_zƚm2$Go럳Ch.#/`p{hAiw|p`V J`n-(A_H&| kNO$KAD a2+ g& LpEbG=w!'EDX(s $םa ֑Ws6\j+f @i(~Ze8\qԾ@&۸i.Ր_t [KG&v} "S> fJLAJ+A5-1>k9(G ɤΉ<̱K\ 9(3KV8"dADHlKO~@s1Bk8A _YNF;kǯ Y΋ pdWsȋ3s6wҳ6w9oߟ P= %BvqZefVrC3]ZY:nG d bZO}Y|#+Bo&jk7sz2B:7Hb?2P \@~(c#`l50058&\s  *;3׏ik' h@W3,[/R+DdO-A~ pD@.hzjUD` $yhcBzy!.k1,s2e9y!^!51ԋRBV 3.? 8|dd;|?y'짍ftKL}IKfP k'̕y 0 vÛ#=27{X藏Y']@J'br9B *UD'EMnsx|m${189)H@ALaV{O=ng{zobp?vۉU ύRZ)TG)І;6gfy>m׽p#=5WQ˶9xSS{GTܠHA DʴqM/cX¡pYU[BJsppD ;͝㥍Pp>kgޫ%̭ۏ ?\%QP\Pm0umh=heC^r`d7ݷ:Lj~%:[j|d׍:*XDDё*|#!'$A2b)k8&tW8q;P ɠ( 'y$/ @ D-?#e L Y>0k_xA&7~8R >[]@܅Nn;;zn S+psvk~\%K3gMԵ8A_P e:Z(԰|9Л"P8\1q@SHBn+'vjx2͸͸˸ˤ¾6;_0=& ޖx 6?{S?~Y9[6  O r-.|eD{֋'ZG"{jJ8J^#L[aSX^vbf:arNeΞ+Z $G'+xד,n&,N/@đFs03? @ٻNZ~NYuu _7~[+S݄ѻiGb}#Qp`_8l5d7m r=jIDrM5XK𓀟x]M / DdšyġP/cḢ+yIQ8]!y#+ Aѓ(o }hP'Ac=0p Y >z}nG^8aN7/z wԌd?9;My>ODpu084OZbdu/j9~Wly߭O֢ p.]aW1Ct/pA)aRPpZΩ7tJ!f4ԉ諪_wKi2% 5z<X3oQ5E >c8ep(.ɽm|բUH1MVO5"{ \@z c>xo~R=ç2; AU~B!3/KK<k$D1GR0=Sؼ`Y$w}gv]Aͺ+gog5__7/?z] W>D56sREEy'gЌ~0)Ecl7}# ·@dV%YP{ b!M Hbe ʚ?3rWsNgΑsowq5QHe"w# l[3,'o[܀⃨\>w5ƢkwmZKoٙ\%߻I#*n,)aMްÀ{p9GM}$T.@(a2U2|OSE51x!:Qk  %.5;yݝ%wa,?q?p;`u"Z׵Xe&`:y":gjx>6L.2e͠`L+]}&iВ??,[O8- `adNxM+oLW ̤%iDqB/B 0D1R) 04JJݴ,R?kp+7hMhd!\} }v"h[[. 4w#N  //{Iˉ}Y3p 9R;UqWV"LAGjC|-F$D *Lp:GoűNp! yjypҿE$rF_Y3K~{|ឡ7_w-/7d0F^ P-'գ\9g_`,|%~_ ƒ5Dr\l-c8"I r0uQ|gA9/"z30JsB@,d(J)ǰuՏqi*WR{F1i_-Q@hOgc>Sw.q:Pbg`8{7mDy"u77-}bڱn};u'ݴ+yO?^M슗>!v躔K\\:keu!Q̠sr)+C$̚{6c n޶ ޠ.zГY^G^zMmZ30,(ï\IK.>=?G9mgw`UZq,Kze9N}sPpK)xpŋ{>Vl9uWomg.{pdYkwFrK !LsF dPN $A ZqUi"L 3 _x# ҵږ5M;6\S\??totIBe.J?pSMm'3ue\'S5k54Zqܯ=ēuIҏu͋[z6~jC1Y4 FDrMw.[$S+&EΤ7i(7(?;'*NҎ&<~R=?F9A-~%X7IQV00o?DQ '4VݼMr׫ _<}γ?v˗Ibdn O_M2"Y ( \'a O8GR)Ck  R wF7Z@#%P^`/V q||edPWa5|7ǀ]:59YtY˯:蛃)wFI@")ĻiW$Lpl ]mb&̂Edg$qd3'>>Jkɜ8y?}m˃=}{ K@yp)rwK:)܈߹d{jؼ|eĹY6z+'Lop9HpS?[x@&g-W8k}X @QQFEF I0d{1M/wmԧ/&ssvPӡx ߢN߷vGG 7 R?,fd@cuw/3яzeOygmdpN)Fbyي@: ppGW 35 (X+=+p3wu7I7}/J]M{?@E72iI 2n]!Ʃ?@ XqF0zhrTu`EaHCN>zeꆪ>)鎢T1Ϳi|p5G]'t"3nNU .yUKx2B ZVBjVԮ%nbj fi9ҞQ3 R;=hd`?^'@}1(پۮ_W9FE91v8@kyȌi܂ңUC9i7x¥6 %ݑ)Ñ0QK(czG)'2y_AӽKi\=HRfCxF)]aZH3Mzű\drGAF9C8=#cm5WGly֏M0 2&*a0v(% [8eT{2B-H)L ѕN2=|`(5lҊҎ K%-)td |M55/Kyqv[U(vdԵѸ&cqd4.Ņ!k2 ߱ bqXZ={:2l<8J!y5Z+@Ms(8Ҁv'(y ,ݯy&K͞՛B]-ƌ&2"3ʭ#*vXN$lotvGq73,!U@ MtC!R-:j%7Nˋϊ+9_ 2}$,-1O*=C4 fk&U'62籸ql !5!ZT[8lN2pNM"ܸP⡖GvAV3hl?^u>!H?ɈM-Gxx7!ȘԳ M]*6:b_ߨ58U]V4_4Z˽n5jK) %i'0L檀"Rx}-9uX v;@^OK4E n[F~3nUT҉VǼ#9MJvzZA A (~@kEs8w$8HƱMQŴvܕ5nPgs}Gw즁?.ҏ5eu@GrCr O֟;OF֦TdOjwI ǚstwg$>C̝|"Waƴd̓QFh\V`5;u29mvoCuV{`v}hsU?X7ܜQkI]K?skt偊9o!NJx)DIwT20lK`_K?l_>[H7\w`LxHBj9g/ʉz}5'8 FGw$|_Rsf?o Mh )%}Tde#/w`Dl5u?%OðEJj\Vk 4GkTb"Z}QMS{yCޫL2}Qxe^EvɧlS9[vɮGK[ڿߨ OJ@bKS?\cq{R돟ʺƨ7yv߆eˑa^JFFM00CV,| yxlFv͑¿QOs]RpP>3>=[Z/T,?('%0_cR1hml;Z54]Gߛ$ZHee^j ۂx_,پqoLSi6ɞՁU-gc!zbTiXeO5|lFّ;*"TBymwfQ|g¡~,p,;;aUCdžh|fHCp_?3$]/9J4SfߧA8ӤiGc8N܎UԎսX׉Pbï9VW}YL?̠J=]AEz*wcK?n:4\]Y*߯.J4'o(ɟ]˟S_HeுY]ogoiW%O__$>wƞ_\G ##O7=]?N-|eqOkX?#oM?yKyCPHФhR9J9 ¾U+{<9oOd9/5#N{ϪlE?3Wl8==!*(8; fP:29E/ dRcMoOk Șw 0T Vq~ &9e$lwʀҥ |+QX < tn@w2PE:/Nzge (Ѓ#z}OWpAq \!W2q.s\!OJ=IENDB`netemul-1.0/images/switch.png0000644000175000017500000003567511261705352015375 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxy]u[k;0@ !")YhI$-%Q}v\[mku?qekl74Ǝhj'6R-khdIJH@=gks\.=^kָxvC)>;o+!-x㭔NE~ x'K@В &0g `[~]E!)"̄4(Xb@GDDH"`~6Я $QHV?=af0K0$A3X2$,%ɒф@R? FMfH)]ƿ/[S1m{Vle1>'$ ``7>ÿq?dK AIR&SA<:h jh hggL FRH2%I`JHf}&LF+̅ɐ` $4zٙtxTt` ?G--ZǭY.o5GdmQD$HvE&es b&".]) P*~Z$UhL4 ™@ˌlA$H U .Ye&s8vן.n{7 2I.Ņvħh08B@A0N@v(R$]:5 2*-Z YUME 7  4C2H2R$)QȔ En0(DC6l_r7%B {1N*\j"0$8D%P@:"@AG<рZj)ޏX L)9#$A L!Q!I((Be$,PSkDΎPf7矼^kݿHd79Q#Of& &P L8K ꦄ(*" P'E]wZ,]E˥ZLh&D3*eIRhQQa )ME@ `]`8Xj~'x;yNyex_kN}$ f lCi DE"TPUJjP@!P A:CQW'Q481CT -=ALJTAH"Q&JV93d"[D1IbϦ«XP^<5e8m n%-Œ.N8p-N@  _4J ڳZE턞W ̆k w$۫Jc%3e$`PH_[1h)iT4 , EɼQ/P>a4{@sSrq^9_0 ˬ5 6D9*#.RT;P B (!OlPH@ X/:(Fg>C70` @h TIo\40(DLHS\=;v}>v BwfO҇~[LU֐c0AD R J " QEFJy@MOm,pJq4&LDRKءً n{ܺL zڍ2P(ԥZ@J\-}u+\dqLlqi`ur8K"t/K Ě 0s#$ 7bP p "31B֥3ItV\I>0ti2o>_w#A}9&z`+гW"\_p/9s}%şVAD2h_Kzt@fΚlLu>c> B,̚!B71ˎw h]Lp!{m$Z55j$)%5Պ1DJ ϒIHQRQf/v8/l9 lHYn| < :ThT*oP(2gc3B(ђqcz Կ-YGI1'_@# m-~%b0QsxPMr!ۼ09Fb)1c4$)fL-bx|}'thz?6o"U%B|uW%fϙa:Pс PE0}+"@"h /(Y-pr<"Iѳ=9lIa#M"v@ISBf]GLMl4?e;  fsn7"2/_O{,sKl?`PO#v2D xPAtX9ܻQ%0I- bsJDM*-gÀʿj 4w7: YMC]ר4njMheķ/#KmByK1l㲠_a]xz%PZV)t ì]3WݼAݠd{?'|T4!zy4Pbh터VIzҕ(mடɘR򈺉tpZcgԈ;)|2yr=qc[@ m.zC .0=: :TGA3Q{W焢#jI햀 3Ny㾑rF/^۝2=ϞR }.qfKHKɒ$K)3iɴɄ锓ӺF=m0m 4QRJLMKHl}|r7㳃: 5Iv^%F% zK)Vq岥G(?>:k%" *6ə?‰!x)8ZY@S7QG[1ݷqO0S٭cuQdžd:Iͥɔii]sku, ZJH4K\T/6}ܟ; w@K.3f^mۅy$=.J2+$LDPm:< /S(>]>nW!RS 4͙X.GL ~м̍1l[׍MimK5&4paqbKit*M-GJE{$[w^:=z`ކy;?﫱t\A[5DtR 9] =0 "Z zSϋ|2E: 3jkNbeȖhy: LddY= cx!HH9T7Nk[\pa2҄ K.S8LY /)EXLbfd.&ް滦Gx\߆za }Ct\W<= @DG8jPsCd0(H9OPK~pF JA4AD5Bl,=B䗢[ut!_z薒Y2ClS$ƪA⴮MCe"5D҄$Pb@!Cd@2LhF2ھ W'j(B?+@.4*2 D/"bH )H+hh0x-_y"PHќS/Ԗ=p W(9DSkug)FZJSpcv~iuҤ mi:ikb ɒXJ$) 5lz|ksN"=?o$"N%׺i9F ~JSAr tUDLr͢@TW"%}ta#B<(b!ZdvӆҴdꏺdZg0Y #i]M ;p*α֌ɯ?ג~z5{]4"h[h}q8G?5iF&iݘ++<!_ڹh,خ_VC&Achdu9#&5'Ӧ{6i1JAWra^ x8w9"uYJN7 Br rZK_ۚr_zqR!ss@z$%ۓVP З̂ b u6ƥ5uq:I 1#H3{SIϯKURimzy{[@8|̥om;O̗yk*buA|#8'H%+^唳}S˩ <0ԓx 7̌![VϦicBDkbDS2ƔO+ Q [qZd~=$pu88In _^\aIz{0\ܼo,_7SE=3[SL0F&DD694lf6\ѓ)™#"EG wמU}9>RMpӝi^1#h.s95p9(7QuoTmߖzu: lw,f<{ n~l=CSw|}~йsX?pN p*"?:{UzOpc~s,tu7ox3r؅tCxK_ zQSÿWPUֿޖnϔqՎ+F.6P?iM׳ Z_@xi`fitoVRV X95ϟ gλh۟o?_|4vf4:$_[,,DcU ,kC?Ԝ/?c?++ɧЇ!Ϛl3 Zcc<~l[9NS ~x:Q`G <*g ?EK5Cs{eOxk2o "}k_9cyꜼy,E`wbx KeO)(HpD<"j㢘J TP4DuS_{;>cMW0:YT9ŁGZ&m 懎>]vE̚#yK+{~š[b&9 yR͐ho^MڒT/l,iIaKS,N'r~Iytə4hp_Qa-]|st(.,2]>z]l|Q;;՞sIv'Yw K,) iRM43gh6iiiy9m"Ii]ddjK)M5)eBO +SNvk$f@Ͻ3gPN$Y{rqip&)|FYB^kNtmE =c6@'b,f,}R~7oZ"|~ ;#;f#S}} gK|$R/Gft丢hRKO,^5Sn\F/(cmүcP3|3E ~@1ߝ~6cj>vGԎ)M`A&oi_n7݃kwZł\}Ly0K9s=su/Ţp^ǚ{G|dڬ0Q.{\|i٬@ph`}}Vm/.52Nk2c&~u0F+K--kMwPV;29ܩ  *)l'% z=[-Ҡ$ɼڥ$12+6W_}צG?p0f;%a%C*dzh>U daCLu(t*d L#&!ʈ#G4A6`Fjelw?['%F4M7ݵϹg㿺7Pľ5|4>j.IDATɭ7Ŀyr_7Y;(H6LFL-f6&l56[M`ll䔛m9{>q9ěK_O/}ϵ~僷|YEq_VZW0+aC_edZ! Cc!iO*4jl6pʍ6MÍom]qYՇV?fl*httB^ `+u("FzDG8W |\izO|.}t-_z F3AəN)(^N$WlzED?F'>U?6_0~z/VXp,lm`duf6ƃ_}rx#+ {*vC+ p+;3` C\yh*\Κ :e H k:to~CsMGΦO[tWxp&/86ϴazw>#%qƎ_$ZZtMTo{"R|bǯ<3zZs@珽sV i4|rs#oG>k9X?Kǯ@va[2].L}|sC矆 lZƨ4- 6v/x{&) <Ķjկ3!LaӮoR^vha$C(:~9 h/+`I/<i U,j+ށJx@:&TG sg/ f)sKR^YJRGd;o =gwMe6V{-* ZvRrR;ݒf`00 Ð{ |*͠Q(AnleϟL\F1-%]b Aͻ{c"S4&3<586wY`D*tY=@_{t+o]$p⫿owEw=^~oY ZO%&țqByW.K^]hMf£oܭ/@6<wsړ3?DL c WR@=oI BW+D|>K(:&=r0 9%L+[|S|gG)5̻zCk/[^H[S^зn9n<>H61ll uNn/ת|N\/' x| ,TK,{(Q^;/|mvsxd؝A-ǧ`EFR6)]:i7Mxc mWD!Z^*[%LULH`4w4;&`TE$. =vM2Vǰq)5r.ZAnk޸"ī6/Õ^qc[6mDOz'\&d*VmaHx<$?;V5o2X6,(p=sM?Aӯw祖9oqV)*úךZD|ά }?n $nt~\ | nc[ )EHsR*w,ʽ}5s :fwrNa[|jny>T%lQ*qEUlGea(QETp@VAe2DB PBhfV7c][>_ ~O`o\`mL?w7Z~ ECfF'<27B迟"eTAA4Tma[L%h(cfg_ї|w:>}: 2gLea<n +`8 Dn &4Qr,77.s4KCƆoҵu?x񇯔j5~{u>tAGcY FC5ޅh, C+iQj t1P0, +@RbhPY/zËlwA˞k{]yaHos~̓#kɧ.IGXЙp,̄:yyɂ|˂뢎0%JR$ۉIo|뉋,*F 1Qުbݣ)y RngGnI/KrzM?/P5Ǟ\M'unNu u DhhjiLH DUVkhw߇͟vLPI!#`1?0epx8idjhӀ ,ڀ lTbl;TX,ɷ嵵 i\xu5]Z~%_ HI^Cfǟ^vhb6IIKi&-řflbM ql lglIǛqbzUd hST0;{w| ؖ{)[UORe^dB̈o"Y'J];41IJd2 fjQ_5-G>%ò1rx׹lCd( ֍ձUCrG،R38JضϮW2nu}w} OZgrBIԆ&)RRfYh(yoпw׻f(WTBvy?bǼ#`) f_zݝ;~x'.;d6&& #Y7&MLc-@q/{\އI(K<Wk?+u!y+x1MNX1 ma$l߸?~׹&h_<g8O1 I~ҫ D nF$A똗X? o|?Ї^`h_29\޸OQ |# ʹQ&u'Z!FKwuß.׷ Tݯd^l |EG>|uFaX2$&4I$Nd:{!yʡB{;Lr20&8miC֍n)s i7e޶hߙƊs.B 4Q\A>z]So}5MtuvOFIdl`1ŲvG|קZWD@$BA T ! ^qW_>zhͻ~/}Կqm<%lv/=M1nM"b[꤮h˥9z_/V̒dFR~_@u&K8UJ| RYڧu %k(VV`sӱj91c7^蚖9߸}#u\bް" K 0&:'{[HߛV=][Lc %/a{S $y}9K.򲪎̗<3Qݗ,}p]>Sb D>I%[J)!=2Vx؆7|?s ]ς̀$z1o@mږ/+o?rmggevQurFU+}"Vk3b%.Jgk{x{m&KcY{3._autiûwZ kʔ "LD3V6.._ю]_|]tBA (ܨk[XQRdPso֍&yJu16$v6-{6@3\+7خNѥqo8o'U.2o+sю={ъ/2 ÙK/_Uj*%͙4мè`Ȓ.@'cd(s םeW0yzuߗ|ή 4c64 L _x^|Zme@<+\\:֎tC@`nuow\V9VU^!@\h˞@(YYߗwR;=oN\Fۇ.^q僃rm:c;wgrsqsJJOZ&)(_&d撫tOVL5,]Erɛ ren{$=;(^m_)=|q߮FDC89,'xJi?(+͹u 3pDЧN$Ή+E| pσ.+x=w|z.sU KO׈x䥫yҳv(.Js/lKS$omJ$P%Zы_nbk< >_wy.y)G{`m\8k g{3+Yxg>egxQOD^IENDB`netemul-1.0/images/redo.png0000644000175000017500000003447611261705352015023 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATx}y%WUvՙޞ;tNB4A09'H "FT|"0Ȑ0 2'3wP{{Wsn=u5]$"xb{nDۉݞ |{ <η'8}c{܀p]DnD Y,*"GWK%W#RHRDDXA)DZц :Ve1sϷ:h".t@OgwTrKT|u=t m3,ׇ%bU"j1TꯨR5D)@!f6 f6F:VG\c&f[fje[NNI`z^B5,.H(owo9ʧq%;~^"b*GP* TT(Q\-(VP!l0Xu/@,\m&Zf|fAOϷuG'h- "K03O@X!0qc#K8nض}o. UD WTy+T+QT(Ȃ,:ƅFX - ` 3٠Yh'<6LO:4-q\! DOO*cM=]w @HU_R9"E gawo Pœa6FZ OLvDw>@z@O8+*ݤ*v|Lǔ.6PHbReGQye= TT)$(Gkt`yԷa0 բr5I%tkYD, ϱ1 @`DDؐ40 !"j;ș@#:sн4 \B0ts0cQ'S|@p=*m,6(WEFYAYdO}=#3v@OX 0w"k r'~dϤ~HJ y@N{huT5_DG 꾨:`=AXٙs:@J4m[]k4գFQH0-Sʹ;l=>u%11FfmobVOms!K~(raa>Q#9!"jU7 jz 4?F$ A\_}VZ g%}5{LoXm 6ӓ3$"|ɞDr`׾TGOyՃ؎\nXbzĊqRmW1bEĦau0ҹCg7 U0Y ȓww0侙g{০ol.a 71ktXwrɞ|")H$!Օzđbw?r(UO*FQQ$6*xuړ>%VAG{7^0 ӓ~87[/il@}~߃H$L9Ҟ!|p%^ҏ!?l*7F, '%d)~O޲zTS@.\sgr0h@ Hu90vέm~[f-#J5P# >(ڏ>|yϑwDp MCFTVc]3z E p *{HPȑ%q@[K;x= bp#gM^{ wi$6ZpQHC!5Mf@!Yu%5xᑺ9e+KRIA2 Yo֯ߺ-e@UUT-O5^ē rV 4~{ۀnet{ Go}o|,ID)W8߀|!"ؐl #}̼w` #m2wPv})U#M_\(۲xA=UeȊD}~@5F@o  ~o7/< H 7>]Zl p0*}4,`k̩{($h`Vo~ˎ^a?%?PI+[uZL1j"b<X7gahԀ{PhDv̺7`!gcy7~jxцD )e喚kX  g2+ "*U&xƃby.%X/EQT]ՈVK)~՟hW 8rDpQugaN  + O ;]6H)Lzº+X(CI^~1cq 6Lwe>ݷ<<4tR/i;7[.y[poqZce#.m.76 FIŊ\H$B}OpRe귦>@(rGSBO!Qx\ܲ4p]vGN) @ﳏɌ(%Ze #$, M;̖rtE}NQP_w%;>{R1]x>5W_و*RU`'!Z۪GoYTv#~5PZW x:- Pk o*r@ewSqC<[3.,OL! NWg>v }(d-0%]/sn`UVr_IŶnL;g׭U Q_Z  @(udqKa޿(5o9(B&"K.Tq!HcBdu'b:ƓG2,W~ƟD2'9-hMWi{9 Sl塚*#R>Rœzz)U5[Gh_g P`W[ |~i(~Xr7-n`*֐ۀ>?o?ۨ_Z5dY l>#'fYsIJn79it.?}?TzTTDGF[7D;+6Uz(yѧA/4=O9-A4A0-`s@BkNzaHezݕw*)/ JCY!_rhIp![mDJT*)([Km֪[uk}{"0y٥tv\Mݝ2O~`#@ǁw>Za veѤ`8#@ԇ,iK>:r\xRǝnM#Kv,KQ_EECըTA@D3g?#ȁƁG3Q axWusy^ny΃oYS˵sN! Nl_|vؾūQV@I%!;B/ <5 fߏ [ ^yք֥4a>Ae Z[8 *i[46WG>piE_6 R]@Lk>vP cR}%+đ;W)UGʼW|>2sV fB Ϻj:~' {(O f†*0@Pt$w9E4R-:v{7pƀDhT귮|p:-|>[fu|@6NU_[nk@yE9wŒMLGa 6#@쩠^! Zě0~g4Fj T;.ϡ*C!̴a~?s^+$s `#6j'T%(D]*+\,̾Oxb|F]nҎJ=nofҒgZu\¼ @ 2")[S1jc+z/ϥ 4ZiGSd眷l٦"i"Izaft _#Թ}"T"Bɴ}_-C9BO6]u@ 9qGiTg4 ${m]4Y8w[Skthba cOUƘ K4P.[F6P*;`TJQ1WDy¦u•O .b| ~?3@<`>p6Jl (һK~+@'G;k&lAk01,إaveȯ "2mz]J%j(iv/Ӟ~=НUr@ F6fՒxoS\N,RAB!9H oa 5̰5u=Vs>|{dz ;g4o|LaDKGk1,0l 0YI F5U[߳võlԇͧL}*ؐZچ~Bt@XFVҽO޼S9M'iC`Q.u;'eKƠm}s'o0{@73ӯXuXk}ǚ&IцZ?Ɛv8303 1j[ߵԁGk6 F~sx+^3ɛ"! $z ?ނ8s?Q#o~?~V9كVp-m۾cZoŅ# QG/~z$ydOk?eE_C;I̿OaI-$Ɓo~0#`r:G-s>C{AO&$(v)T Ɒ8SɞSrC0?Mj3] xgysAJ VG~{տIg;?|s5NGIAbXn /"l-]2?KC)8T$Af?{CWݬ{@\4`Ԋɞ Ki NN?{%\ E2ݟ\DŽ _y4{OYmye] d{KBvU_FMOq 0f/SZ :@n&.=cܨC](HXͯMTbkkbIԷ=1zNqMg3 iӖMʤ߈-a- "@䉜3aM %D<9Q^Nd c0߱KuE%=I0u ,!1 pE}?/5˙.MJӽAsd0vN|4[M@[.ܚ%02 a-#((.#1[9˵!:d=F/0EyF Hz5.u9?5 ]2o(|ߟt8s7qܕs.#bC>c`bnw >f 6gf$Jۿ)bawUƴ,l' מE"pnNV .@2F$FI"f"0wȲ9~f)FA}ܼ 1.j;]ׯ$J ߐ1vG"9oαsfr: ,<w`(Eȹ_*h 4rnKZ]uLD\@@Xy'lHhU$jKߎLo30 s^dŝi#~ 1|o".DKcf(݌9P,@eD\I*n a P@6^pD5LD_H-\`X} )mQRf-C`y+m7wfc99&V1 Mt{˫ubM7gs9Hs:'cRB7#Z, )&k &d dhCo<Kw3g}iթ++ GN &@YdzV0 ,?a0YױYg^t#F >2lDkІ41ZSbYkk[/yͥYo]Q4\H>Ph>#jr)22I=siȀ`UAAw~S[>5Ү!]ElQ>kV^ . LWta5Q ;36|/M:t&a6`/Ow#F6nhv{05uD6hì5y a c-o_1kG=M ki5:NWLaB90CXFv\ (c7~˷yH#Z+5 }p*Qۙ/o´T¸#|FS >?P6gƈ fVP(.ľ[X'a՗>+n#(p *B_nj` !X7!d$@ZPP{=wS+7 v ŵa|"|F~:M@d}=S]uW4vDSLr7}̈́kw%KaRJ@-Fư6F#&,a- ,$ƊO|߸쎁=zi\p_?O0t2A' gkGitVr=6df2pq' $FԷ]<5ծth@laRt \1. "o' nAI@D`#F4l͆tbDʡ6`Xb+8ŊZ9{!t~G}+.kןzPo\JY-Xb*C B?Cn2 @M"nBa(6>lci(*1D:DrӞKxM=pn P'sN:(% ]hrD`%,lZÈ@'Z^5jjKYmv^:.^_#ėHNg\{W4ڑ1`:nzD|V)Fifrot@@O5I]RƤ[\ ; ''pC iҝ Ɇ]Og0Nt"˟tO F P}_vĺ 86Ò^dwmo泅2ŸԳ3 ?-3zz֭hǾ?Բ&UgYFEW?/`j`3 Z-}`rBl@>ss("Qg=Ze>)DK ~*w)=*j3`ߧ}" gنtW"f7fWe17bsf lBɯ%"NGX@"bkc͓լt7˒B JaZMqj|j냓3ݾ`rn0 %-&5w\{nzx{~d,l-TܦVGKQR2xs p# ύ gHo7cE@p n=ed ?r '].!'_.?V&2eq{!npVP.ermԯag#+:;_k/xӚ@W%2 A.=`!yxzeG6ݾ:R㶊)%"r$.bcw\""$;I-AjU8yu;d}|hSKwXʉEjRv~r?طʉ_GYwR8vڡ= џfVg܀Lib%X4 o]kZX cdH׵f[%f"HbE)"6Ef Դx0J; 2 )!VK8|2@^HY pZ# 7էiQ͵L_!BV15/08== 7~ln9'/#ÅT,VW X<}x" 3Ku($1ETH)B5I + 'Ɉ|;Ō9;Ux N&H/_{On\z|96˾v.2X=೮9uV>Q(ZYѩCa5!rN ~N`Tff S1HOȐ[L^I.?LJIHKҺKƆ[BD>GlH[@ ܽ? cOn{|5S꩓ZPC9$%Gl칒 |Ped KAvD}M"eIg+A`:ex鴴$6MhHb슔D 4.)]]WaAvJC.;w .Լ~6Ͼo7]yT9NWrm9+qKV/bEv2wIEVu~/S Ler<WA`|֧o񟷱?O_0Wf)VXk;I4 AmiOy3הF,`HIdb-^كm˸o (NJ 掇Hk\0W~s Zi5ܯ)@߾|喺o D2Ku`@M$f܈NEa*r~ Q"#ED1]mS1]YY->' 7sćZBp)Mi\>zg`bo|FM4]k8@\훋*Y*l \3YxS93͑ &]nvd#I$D#$hCZkDCZTy;,;F@"?]CY$+B5l܃U³~wQ'=NgF^AGOdAV#9ї!Q}#5lfZKb4Nĸ "M/G[@A`!$H-Y8>z/!"Ngz"!*VOpMnșY..d3H|z8zFv8y#XBqBN{dFv3-R;p_rH]$\I qCްh @i@EV}\E:B/}Qp79wr5+j}KPH d[S `@ܩX? p۟`(ܼ |x4n3g^>ܾY@FP!kt ̜% b.%o~lħ+x/#m%#Ɔ+('{}bp/(ZpJ?y쫍a 9dOv(|X9sS_8Xn{NjE]Af(BC!VÓ,}}Ij!]ϑ%?n}C 6#ǍpzAt 'ÃPbC/ {G+}Κp]ɞ~"x?{jO=߹H;" TyH2ӅdOQ#Q< =D_ C@z=5J/_}KNt>d>P=._nr vGc'w\wLT1@(Ď~[I jK-?@$g\_پh`wT?߮J4Z'-'e'/܎B'mn/- ~ɇvS_W_ D8 M$q/Tˬ@0+Syv|"3[.~o|Kfv7RR"ٳHID_OM?Zq.:'/듹kĘr+|/VGf']>#]J!bݿ}p 8xiԟEEї[+vz%A% .@3;guwמ]_#v 3^~틓7N{i8R3^~_C.ga|A)M,GS=3nj&W Z }c__D\@L8.3?_҇N)N*_אnξ>uӻ˚D ^dϢ9tg*Uug|<'vo'%vΝtf~OR'4jkOtow~e1vRo_'za%E`~_}9Tѷϋ>DTF2J1}"RW ݚ5=7"0%\${T}.n c_Ig ܶ[WLkn^>ߴWt]+rƍǵ҇vSqO4_|ii 'ĝZӚ_ͺSP-)*R{XEƿ>b"bۦ`4a^!<(Ř~@Ji(5E*~/~plj>c=.Ķv܋AOl'xoOq=A{Za@IENDB`netemul-1.0/images/print.png0000644000175000017500000002466711270115521015220 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATx}i$EYnznZ+` >:(,"zE#.̨ #8 3sgFEEwGDPpiz_g̈-2+*t޿~9U]Yo|$#"cvh8q;c܎887p0 Ovd/)U"@DJ@"5)"5ESDj<>Ǝnຍ :\Hh)s:# FJ1( * f"zO_PeG4mhNRR#RCѮ]P);< `g;հ_v`Ɓ"Wx-zC$sO ]G@F 8Hgw?o?ӴXq8_:]"a$\zVu"}Ҏ@0.~HD|Cjk8`xK:$)S"R("GH B-"MH!03}w UYvX X~x(O}p"ktkS-U0 fXw0a}f/p1RbΏ X$xF# ( ɹ*9527;U8pt.4ޯ}җ!s%cOt ?W5A+˓_dzZ`Ɓ>pf3ՈXu61F1(ƈ8#T))I)7)FRzɢOw ?+4H A+xqvj6R8FW5ub,|`PLb)f0 =78`AĤdKI#HUm ۑ$I/ZE{--=#_ `69>Y}XQ0#o/ -A `D R)8$G*:UQeۡ骜(WdU G9D2\5T:?s_Z{: uY^7G$87XN(9.Z-f渙LX1)6h7HERpPꨉrUɲ,W8dї[1Y#@`L p׵ u.3R %K3ZLynQ27081A)*7 CzΗ'3R)ؒ&+rx,ƦɊSul]4&U &]`FAiWGQjQAfcΈ%,N[Ea[̛N"\+/#n$EI )DՖ4]wtHDZRD"mF$)hr#F NQhs=^Hƽy͜wR鉖}^pv浈b㕜ˆS9g: H(#K+ٳ_?Y}f;/ $D9w7Z3u6VOcӳu78LVews[ĸeDe Pʁ3CXۮBi\: hQ)Z}W &D 9K.k^o'X伿-鴊%3~WV^wlFhY18>H”qfc{/Yi~3֒b^b2jhn#S <)έN6'o|Ga"Qa" (bՑ]W/geFv@o@FM;-ǍmF~iUfZ,f fRۨ>}_+¬6*;i7}@pZsܘfv%b/YK-RZ"a~$CDȮ\ԭ'~GoH7ӨymFnQY)|^0qIƎ5Q{!lEZF=^@1, ̞9}}>"P3çxu33:˱ %. kA+>W^V;;:w4$ZrG}]ts |,fGf.EFo ˜jJF`2L\0wM jN|Mt ʏs@dqAUc{)z4Eg9V0[\+Yur9A4Pv˛sf<@D tf\%~LA}4 Tw_r Mf.BE @༧(yF=-+|(Eڒrl Pǩ@ .6\ tȵ}XS}YV3U9+eRsYs -"E`ݨ #;.F/*͚o@zpU伷$r=%+\pBIs~j_22g&=/bjI'>ڌC3qI-V zz ѐ=}:WByx'6sp:, t[-VG[`\W)"?w/Պʯ uCzdO\dc >PTe]ٕ˲:~ (Ʌ { sb~`ZY[ߩ@MGr<˜ю%щv!CCuN[OIr48#Ð:s|;?1@unN5Q`ɞPEy_-Ѥ:';oFW!a[< 3o Hzܞ|o" ¼#<$LT,s4(DtRp2 e@obqC0 =xA᷄g"#< ׉̓=Z 7eqlCx[nX+a U˭7uP$T ɹ3~GDx-?i=?!= '.~GDB37,.ZMny^ka!T0'H֖_ |4è@NmZ1yFeHF },O^ȹYpj [LfM]<".6H)bK(oB_w,NPG#3}@/39|%a,V0a tdyTӣR\)UI_̟7h? AH sמ=46eo܄d /Fj܈b܍8>EY:<,{իsN{"FTzKW0M~?*m`etOB.pg 0zv?؄$(bm5 ;n߳NNDGc[ /[~a 5uB5$U-1e0p"Eʱ(Yw.͛(V7cy 3x/9V\%L_ du!$ ~\pgGT%%{O%re@@vXS\  ac4 wc\X{̮ :;;jh-ŚdOD (>QS[Ё<\s}=_5+2cxr:d`4ugX4'W>0b>*DSzGo>v+uA4U#btEG."էgw'a܍B`gs8FZ1 :=SZIN?s{l$\0SE "}Z}4A̛;i`o76W/\?X(8ZB#XfC_?&~DYpHZh0Qx?x j\.)~VK7]ӧ`ߠe7~䋽ިQbP>OLbpDGgGJ@0ذ, >X} M.qTUgmT&/x?AE vd.߮6P*!6AJI#Zko|2jl 8FO5dQD;im0 UMXoEo\ӎ Sd197ceV5uPؘmS;ȗvջv퉢O}?/A$&Z+>R };d :[ Y^˓_6$+3PSX]<}a1<\lc> .]c UQZ4s?-"Oto6>Z}TP'־Q(NQ! m?3p-)(/4]. >՛ʪ =oُLy\!Q,SF:j9C7f`J :kt[Y[?DJ]½n=S #ocC TZ1)Fp7~bp>ؾj"QYHOz0@DJ@)} 4iށtl8]pbHYvK/"o {О7dRN~\ 0 mit7 pu=㳿z V'N: QHUD5X{W#xzt \gmwv"F2.hu  &nLTh+mw;sX3 _oD1;[J/r{ke@ kr r Y\K>"]. f 4pMpE`!dЖ|h=%WIduC3Υҙ$\Lm9CTw*=WZ6X fWJvSfF+Dy?Ew~1 E5}@iPPqHuh3jп}1wj2 s?t8Hbkwk<6O p/i((}?/zRTcƯ"vqTm)Ǧ*{hu:/lKNm𡻯 2qؕk?/}^9+HIRHJ~& ɮeфGwu*~߻_4zmQ}mfgŏ>{߹:?54M.7U@Ml{Ź}^ ra6>? ?pѺAڂEarΜGZT FԽ´A{D/mxG1'R{ Zp8o(zΎ=#6^OFbulfD50V+/ $ÃށR).$ᓳI`Y=CʛvM{RJQ ,(W[O9 ;*H8a!(JǿV=$u?N3FϾr!N< m5_},O~C]:Fs< %y;ёP޼BRwIÌ$yR޶sli\Ӽξ"o/pfqxCޖ: O!(#glsߝ?P>;zYf 'FHEZM7k)¤i\AD!hoE6J(Mp  6jɄ\M B&ψG& HD["ֲx8>'ӯm+9o [jp*Zv-UӽPE `Q Zѣ ˦(Huz[wÏuW3Op|HQ:"xZ[09/;8>;_ `,[:OȾA3E֜~}?߷BφfOȷ^Äx&EEBA ƋGs)י6hgٳ'h7=k_eь,pU(y@kjV(HN{z8ky5GF[h,aZ-x@_#Lц+-zm鯘i?&ʎ>u~߲h_6\vMFm:#g׈ӸE_I߳'*}8/?cr{)2{bsʮDm1@є=~kI. -;W Z<~&Ju bX׎_|G}#7~~b+_1b-t.x? xJ83X)k|;O:봃|Dݖ3'")(dO£Wuw=LNSn;C X-'}ZN}aeEE^Sb ɢ։I-F4!|'so=_kl!oqӛkeҍ`r$ާ9WK΀Ē:ֲp͍;?n95aXy?}LJדr yb>6}1 i{oD4|y?9E R`²KWܙYg[~tap xu8LJ+n_kɼIxIɞTn'"tiY[3->vXeoۢ?P\#)#re2[:?۹5|[v'r7;S#AI#x?."U~Tye\ss)r۷P[;"۲+>'t&љ],dj}15{FK[.׳#-de<Ι},O%R@ 7fE_ 6lv?f:~nZw⪘ۉ\DU_JY^sey_9U K}& [J"Ws?#rl񗏚'\UH?{ )IiRv c`l1> 1n<϶8nv=Ď88q;c?a()IENDB`netemul-1.0/images/log.png0000644000175000017500000004342011237622236014642 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxi%u&̬]߾ H$J"ERHNZ#"a *;M4f2j7ZXX]˲m۰,+- RzeeQPVQVQTEFFF000b8,˂"B"1cC)0 > Ҷ?.Rǁm@/..SNFyBTKd2(Jp]"ͦH"A}u?r8/o]3}gϞ(u]8q^~esϱNsEF Àf$ &H[`W !2 <σ뺰m{nhZyW Q}ÛFԧe% _' FK/8u]d2!d7jr)fSRB)IH䙢xY<*7̛z,,^ L&BRRhZhZ`ebb۶O\{[CZ3^wE+#|OSW Jr'圏&_:΂1!l c}3ϝ9117gJk-R*)AR4TZFXt8 9З1͑M4af* mhZhۑ8W#dg?;.ȼYuÏS*P.8v2dn}'N@^GՆ7<_Uce{ XE϶15 ZK ֑THAXkaDzV TJIR"L.9bw>4bW"pADPJmBDݮ [*"RoG}賟/GnUOExQըJw+`ccݯʏ2y* {1^ksc]e)BGٽÅp1k1)Mbk+%Z+uE"jTzhw$)(kr,Le%!ǕR}4 axζBu}՛@gZ{WnǏO_\%!cǎ%cp{fe <4 K Һd*+MZ{ y@k"MTi qMuR)W2QDGsʍZG?1ٷ1h!4M8)f9>44o(֑|*QJazf&=&/ _%}kYHn5xRs;8ֿo['LIz1@AwmM4cBYT*m?TRڨ5nNţgg:UϚ{ d}s 4h4~Ʋ37o=G1uaIl&O? \oeYd6ZN> 뎳y;n?y׾ΉF5Պ@UiO߳ ZBkHZsAzŬnځTo5y^5::__gW߱1/cN@eqz~Dž ^B>:xrSh\;SurpI4CRdXH0(SÃ}`1P&۴JH[_1Ŗ& AgYƓ\- CU!"F/Ϭs"}gnŌ9 0U$0 3kkkƶW-˚ޯ{)ë:F}:K`ffLӄmۘC0۳?|n4MfbP= `"t/`(f> @iMj ""fCUjFe[ ~l^=qG ,QR&>fsZϿ2::|>MoK`eem0 l9&k40FFOήҗJjJ!QU/z­#Ҍ4ihMphmPV8I˶V7FQǖg>t }<~}|G> >w#o A%uutb_%HH n߮3^#n 90=uQ|+ Ы81;`DZX`Zi(!5xr3Q6VƷ^[;LGX[[CCCFE|zzoS<:xShG[q3]Ȣ\!5]E:o2[jht|u:H2? G X(P, (]-`p@) EpPLCJRh؎-[~po-%9w'`uukq( ٷo/D~tF^k>6#g-E5|3;fz/cZkIEJBT a-]bL1mo'hN Z PJi6YBO^.-aȖ߯=ϣjϟý{˖G; bo)û>y R@׊x% 5&cFjXvT*V*f7Jݖ.AeN4)siH A ifmhkg|>!* Rj\v__|i#=z"x@ʮuPW^efWk[} e|wێJnWB=z%"(DP 10G4# /L6Zgva|T5~BAf ˲`6R kPT v=9'R 6} u8RF(B(5" {W=2?!~JE?RuMlDZD:Z Z ޥo=x2 qT;}5L饱O_)e.\bCb{8=y:p P* .0HHJ_O|-@ '42W)vqPtlP@$-F %G)J(RA*+e:+$bO+t=[Fn:b {Alj4%#ݒ Mj??_/V 0 ;[/͎,*_(RJDQޭ{!~LK)R֑Ru,jCHkH((f PM% SW@lN7J.c.)n1ovA0 P">^wݲ@?LCGv\~@ D0 Z69ʝxI " 1(_c= 1-;mS['6Go48'(ŠA1@qw qc]BpRkr 2b<+ٌˢ(i*f#쉹[ɔI $(R&3Ҡ2Hk?"@)J#3_um]k=]?Vש{ t:9(%QTj/S]/ڜc1ƦшG `0s>]al/kDtl۞UJ0 O c g1Nu;R:4"0P@*d+r 3Ke+r)T `ù\ɳh}́\n$<:0Aa`\sy4H.wX>/rq2dr"`Tr ڂvs% + ({vXdO]!ĆiRJ,--%t:RBk߸s8>tK,C*44\7\.\.+0Ll\֭b9d9 C v=XNa+´zYd,%fr0L B!b> &'`0h0kRQ2gp|W.87=o=8=4%5|G^G+y19=KX2u_ 6Pw2 mtc"JcɤRPP1uuzκF 8#[׻@bNLra"}~wAAa_A0 " (BsHT\A: B@+lti Kp29el`q"K f fY[cɅBf*ER ϟ9N4 #%~V026w mB P*ΆKZC k%#FAƣi~kQ0L 'keBK-'\tG-Ña/-6 Vdp[ N08pMNsp'K0ֱZG?5AGC=$|U#7Ks[o$>SA4MxRJ|d6p"^HJJbG@H)0w" |H @oBfd$e`0HTF \`1 YLA0@(-,8'@h('tlnp\SVd1%s`@AptI|KÃw$̭׾/}K`ww/}r{|g&bi@!TVHx֯ | -AL\+d-8lA7`0"cL5 <'$FdnLRPJ߿Q594T I;xQuH3'z,$ڝj:ޞ1Eauug/~$nlWf5n+Fx8F!6חR]C S*dS{2V2O0C3!`.1dK9!7c;,63؀pL0"a $E8'*7#m,nZ;9~m";ń00X"萕$MkpYmӸ행-^xx!@6i){˭#9ƳK'> i0b15b}xxX ,J .`0v~CP ,fHWA@@kqN9C5V=9[S+kb(x ӂW(V_2I "<㘝h I&d9(^6:xyUDU`L6=RP7ޏe ġG"pA`6a2vwϥEc 3V t!f#=cFb moU[Ϝp;Q7/kfxvfh46CRfN<޽;Ao29pCg$Ժc͑uL$ciGtڌI>x qg9At><eı,Xkr^,\4!L-# sS#Z_G[ o̎RTJ09 ]7Ɛ^$2~i ơ$9Co,ZcO (!piDC,vfW}RtAHuuD0F0 0~*(B$ڢ'V8^W, ( Шl#!{׍UYeL(ؖ'srq㡇ylN4!0F3>Eh u%4xf涫8ȃ8T izB/bK^"`pӈ[EQ6|ǹw_}Z>Di4QB$dm DU~3=A+kW5Zj1>R&ؐ~r?0>|m ðx#OZeE: (B94CqOd)%=ӧO8rJɦinU1l\$QzHtN`! C-?C_^CASS!OMk@"MK;7^ǥ o ">|I}o,RyzpwJۥx3{$C>)7=k ~Pfst ULtM+SgFi;_ٯH Ӏ155ycϞ=D&a,"oE v{n^&Xv3:AGfNȻZDjf諏}4""n]fǹ^mٱ^>)u"BZq9 T*appL&lm ;I I $]?t:h buC_]:bk}151b;r(?ɢǾŁ5%q,U*̠p'm)î٫$L-Q_)ҏgz*I5=rJ4yMB1}zh;5u IDAT+%̈́juB_8 ?/\K1~9;`ee[ ]#i_|ut)hV6+56P]5ȶt_Z*hzz͗ut/vavdفc'NĩSw܁]W% .Ww Rm<" r*l |xhA0>|eW#qX>fFe~atZMdj}!%jL ?lyGy˽S/];ew^gzGw).~)pazL KK8xLsgc'og{/N>$gquuO?4N:%a܋\L ﯺ}RpJӺm&D(L fߦAG\"]w`Pv?p<(_TFdyׇGϽ3յ@WMlKg.pα{8vZJz ǎRj[Bmh3n{~|]{][PMȐtj2K.q/8 o񺁚2,X KVMJWz6wUvb0w]KQ-d=69Kq5YFꋧֻfn4gP^, CCCR/6nsrzߘUn*Z&Zwg@ď}jB nX__g~|7l}-Ve!n)UFV0ugn IOWUڄN}w 4蕈51pQ,S ~-n:=3={`mǏH@ }A]is Rg~_ᾔn* dw ?ZFwRbcO )`i[mU -i@TrM/E[W :.j-?}jZ5a.5t+sssh4ػw/,8* AW|ǁ`cgvOuu5|55. eT_{~~Jf\㤋Rq j5DQ|>Ipư|?&~)<?Ȯ wT|Њ2e@IJF HWۛ*Vodia{֫J/ܩ9rA~L蘁Ac(Lbg(Yi6^P߼cׅ"fr3|6ZC^fav(gf;^aK9s3-ce.ՊQH©Sp뭷qp199iLOg_O5gm.eƊPrrFl0>N 6'959 /BGp̓*Wp|N.mS 2,i4Y xUvxt>'U 7;&fplJq`x@Xi:WX;XV2\;&Z*,/d2d2p]ZX SPi'ƞ|Ϭ^+_Xh.8}pk C1p!>|v]On*͕0R 5F -ydj'=2:WK#NhDppxiN/lqohsc@<"0V "!(~r릭I@f'Obaa!u,|έ-M=%vz ˥Z%MM;0޳cƼ[cf7`oD_9Y!gW+@l/]86H2;L_@iY}k[fVjOD $Ec RSP Hή2Ʈn:ޘVxh ,Ur#]y \HZ'f p|v"emݿw`%ou"jЗ;X<>;~t|V֤SM^2??ԧf144-v&'q2 ։fD8quu@y纉kËż۲?Ο B\FŠHkDsa߫9 Ӝ):4P\ZM}﮷0c[Y~hDC#j)ZdgzaQJػw/ǁyp잁FvȑxqE}cC tyN:"#z[}[-wp"疱[3o[5EΒEêdZ=pߒ>~n/:WA LOOc<ہ ~ c4s™kYħo6QARlޱ;h8uf`:>>0t:L=\ u]gX][ *@ou_,l.W$4c,NJ^:|kN|"o2aY1JF Vj8qvڅ88ס+|53ӣ7:' C /۞nv/x塷59Zܟ'b2Ǡl^5Ο?z]v0 J%0#w[;VҤ+Z)c D5q`V- fz[vk?g.MXÍ x 8r* xQoZ#C!tKAb߼w=j~5(9vqe6Sӝyǥ\ft.vI055zݻw4MEe`Xym/m :˼Vn 欉W!^I{%I(JV*Bkp`D_{kkkhZسgrLVWWqA޳|G]6J-{f*#E鲁 Dq?ŃutX<dbN\K JNR̛c~y_),K I&;t:XZZJNb VVVP$.klA^V[JWRR 6(xWՅ\;>)ucuyӷۻZ֎`ccvwFPa*?KlC¯"IT~x{O0Fu]eVa?s{a_stIO:AhgbxxcccB`hhFT.ي^, եZ?HCnC'*% &/`"MӬ?rŝ|ɫZk4-afeii ZkLvIdYpαdZ3 "@o~-7nJ} &飷:Qȴu|(O2ċ2}>U 0>[] 25D#R`oFM̄?pɡ۲@r)έHR$a'Q!d ɓ7CV9nnv{S2r&7'AĖ;.f={GqB=H)%i*enhf?V`^P!h|g +Bx93d_|s\͕/MM^ST]^:؛ɵO>ԡyCig-$ h4p>|8!bnn]޲#RNjSGێQ%đotw8? R ˮ9 Dn==4R2l" Ձ:ɮ⽇ֲͿ>o =  l!=9*zޒd 8{,كL& Uov\чn9>YmKk:c$MU.qVBLyt]C%uAҎN.]3j6_??.wMN j Ґ}Y"F\{/_Zks{xc']n7uSӧ166Ap1<pn y|eޑa!D}sEt|,oXOV4~'gN\X3;^]r2{n7YE6Y+Ck!JDFX(arCBs@tC-/0E[e(mlw87_,F jEfz樓[) iG[jCEC$=츀 ?rξV\'-2y֨wǏ,&?Cls~䥅_z8-~h4.Eh6m(pr{vE~#DQd !rxEYB0ӖZI2bZ7S08c=6~\$jECΈ<#e@Q}"\Y'wfBp4^|cɗO  e&4c*&ַ 榿]{ \wA\̻^R`׮]m###((̯}k?ٟ\uH1I3b\ ijE<bccq϶Xs,f. Cd`.elg3ò #6]dΤ^ϱid`.E6YF''ηyL @oQ \T@RZ\y CY4%z˥A5( `aee_| \%S2MJR,$~L(QkeіBp*f]^\^eD)i0#gK˸Z`5x.P#,x63CAXH9(1n45pz*<ӕMPL Cixa,\T wj3g`bbbeattJگ...^$1q I+ $JŃGFQW7jF-Yu,-V`g @&z<2NwvфoǾK| y{\.nׅƆ3|yaaÿ⥞u94vfzI)[?(nY2Ou=3G,t?({3,o,}>-B}O +:Ѐ+B?p'%o/F& e;GiͶ~[0RDdTvĎ$x,?j8[ ѳ=^ߟH fff>ӟ;8; .7 .@Y4.Lb8ҿl&=ya˔14n\40pCsid̗9vx`ylb׈0[7 lׅ tV;.u&4Eq q`v|w%aara`mmwǥ;N?QtE 'dʔ![~ӾHkJǽq6J  |N`%0~rTzQ=mDz*M)S2 j%IC"}R ^,jt35Nxd{iP({<55tFR__033'|[>R^q/=|B/αm{Kt!e;ެ\:Y7. &i(74Ci>s PPcWzm&+TEav˘ݽ{upl;׮$yڒ}"g>OC3 ʹNJ^:%~6/g)fH{;vjQY0 #|? 'K$/" Hc,(Wu2w'ɶK4"Vfnu* x̐=9 HH P[ z Fw0wϟavf.Ib<^~K1Ra lVZ-e Zshwr׵r"RY=@15 )Ŷ((X_oLMM0|'$^~ZE^OG|Q{E"g#Dqf/~r b`ŋלB]nHMɮf_33]uuULv7EUꮪW>c@ݫ}J:#/K&KS; 0N u<A@+@Ϸl)],YVJ5@Ђ@6K.}UT<9;(g)h7dNIf5C2o1 5^ta pNҸ£ucĹ+Q ~Jn}|gu݇\Cfƀǫ8R[G@ {cd(.޹mq}m@wLn̙3:u󉉉tƟH}%j/--<ffKUE~omĪB}U|Ty]E@Nk ŽMsٻoKw. Bb8~ȑ׏?q&Z677#'xztmcMqٳ/A w͢3L8*cxi9|*/\>3.'9ChymfġGzÉuj tZ`bbc~~{ϟjmD('`J) 0@ 2\yv0.ЁddLdjrv,=,C^˸u.Dl&<ëf4wTZ _-..>+*tc /XԗC?x?k ZG~VX%|L,î&GmczzٟH/0\KS+O^ˊ5@:FajCZ Lb H ez~4gNvݼvfĈdEWS7g @BxL%iO;rQ Qj5t-?en^imafWt]k#^כwqx꭭5\^^aeeW[CJY`CߗSI@Z*| jH᫂>P 0&<-@]F0\[xg}5xv7=1!j'cQyl-|~@}i йp9-ZT:?+WV#@' /Z qs4_ 1VқʒWAeeSƥoA%!0U7ũ8jtԽ_ NW~yi10o+S(ώ/%xѰq<>, d<5l 떥 <,MUyZuB=z1ysia穩ıytNEH(=EQ<^c0ng #?JC|`Oe m}vJҶbH$ى|'*U!J"4HJ};Z!J}Kz`p/ P_YSbhIENDB`netemul-1.0/images/NetEmul.png0000644000175000017500000006663111257634326015450 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxܽy|]Wu/Lwԕt%KdExȉ۱8 B_\By=^[#-P ) !8Oqɶl˶dkpzsʼnc'8-~޻YkỾ{$"/]]]Ӄ\,XADKy- Re=gcRJuW5vwwl6 & rSwuukb%۷ogL&M0{zzDgg'Š Γ{wͿ.)e ,˪E:D1 #-pcb{e*}M%k4M1rɤ944Tߢ7 aIDyGD"8ty?Xl_?c~ֆgϞUUUm۶U ."N1L|p۶mK)Ue |o%V#mATaծ{,㘆a8RJs ȕR?JoD42{~fWJk)W*;w~kF0oWbWW [,˱d2+D829zJZ뉣GV>}ȷ,O[aTPͺ.A "{xI~߭1K1ZYٌ6ώbGA=T*(}?afbDZkW1s+sncDD0{aiuZk"ΖJRwwȻk~?.U1aBC)e3H"bֺ~|||HBҦi0'gWR*UD(̡C0; @kw'@,h16Y( @D[[YF0?BB>_Aih"[-5gVYCP(m@c$xvC_ZYWJF]o_u%'jPe9D ð1VK "ɓG~ζ?J2 $' Ì1$ֺ9`OLLvuMmݺ.\HK,AH$0 "r 0 LƘIDacVJٓ k:LeY+J;I`~)Mbkqh<O)s!"`H$,Xw}4$4MKpγJ&bbO=W ux#Fp .K) ,kϝ;6ϯ}ĚbD<﫮mkk;!cFa̲ڧncuM{XM3;1'&&Ğ={u[[ll</d2Q^2x:3Xi ۾y  % #ZFA-@DZKX躮عscyT r!))^kh0B˲©)' 'diUUUIu3|9|%,FF"bc`Cа[, Iʹ⚂"n*#"DDN,u#¸1IskA0Yִ=ǺF&N'_mab/."r lJc !b"V@1Zk߲\jEŋ/Sz}!DHDB !$t__r9f尣ӧy,3Rm1Ʀs.A8eY9'l):/x!J>4K ʛM " hY`rQu(HiX|^|f [ָ`}eAmuGbkdx$I ð8MDU . K ySO}οAD0 0 C˲B"R% hll)rex}:~mWjtuuID QkAk#H"ƈ(* &UQ$|g7@Cpi\[exu`7}cTaku۷K۶RE:DD3DdΝk?3#t* l6 y) p @sZǔR'Ob-zjٲe8N#cly\,E@Z?8AU1Mv/眳"c,ADՈXKDZX5Q8($Yl +!4(K`J(8ZkeBbddƲfb,3M2{{XUUuhҥ?Ađa_C'n?󪭭MG-TP~VWWǔR"U"shx9b1}ȑmjmm}"biBukcyg _w 'ǭśLissW_}RRq`saŕR՜,,$VB9wIDx R(G7[Xxڕ ī>=| 9LkcoիW+wS___X|====<뮻lǎzǎs(~hhr9dXe(< 344[Xj׆ >N%"FэR) R񚚚ҦM^*qGѣG%x;B(bS!*)z1#:XJk@D3MP4nPֆ9 .SNMMֺ %X0==/֎:akk블]ǎw]ʗvwwyd Ў>Bĉ(R*144t+__+J)AxDB !lDJo|˟'ZCR$"ڌi7?z߹a_[h1b 5;;0Ԇa`F9vϯBP<` o seyYͫqtA"Z;\DR$*eec (gD4ۻ@ `1|gbb99illgϞm%L&SR DISDTJ=}t{>oBGPiohJgD V >U{nB833M4 Ey8'Z멨6(O09z跿*,(n0:!300vԩ[]׽zMG""c.cB!ˁڶmJ)ֺoR^\chEQ-Zpot<Čf\zTʠֈ8o߾U^yA2DlA SBecoCţjg݉A~j~#%f+;3z'MAC9^bcmqx#ķmJ8c,I)cǎ]7<<|+" ?^lc0 Kon1,+fTWW]e23BZ:el쨬3R5i ZnJҫV?kYw׏[X(\ 81qֶs ŵ ᯥ|.aoi"Zk;o1@' x<[ V1ojj-ؾ}>Og|ѣGMMMmb=+VrCC)('tT1V2M-~* r\d0V#[P^ \W!(ȡ1ιCD1uʄ8c,V _{F7xcq_o_t&&&ƶr\J)"pր%02D8AD'}o~/_~b~;u@}-D#sxDARAc  Q @fYڸqgMӜ,kx˖-&Tqх{DT|nkkӍ===dXDĘy)42q1RF":^(<0iRR4M&v=eo7XCegyo?9?+䌱i0\(rT*響O^ Tm|3 gsKkm2B"}ߗDt՝wyT>d|G0D$UEcq3Ν[N499eΝ7tӗM,w|^% =UPBB2aI)eJQGD)eZ˲4__\"~qRNj.АJ$T5!P- 7dg:YW.|uF+Bv~_ƗK)۶iɒ%422@i!D1&;::Fz{{wa\xՅ{em 1_@رCwuuP822!bHDD###׮]gaC}G?3Š|ɤCJi!CDq"J0⌱$gggFFFnbWi *^ ?ףbMO "m"TXֵ5fggo]]]}v2Jj r9p7cK6JO$X,YCD62ƞXbرLԶmoFਦ O:bYh6TJ/Y]ǎ{nys|Ňah"PJ%cq3990 -YҥKd Dly#0FUg޲w %+ܹ++V{*CD\kmp ˲aax+">~)auyD7 cWJ1D 6 X}s'O;Ncxt,"yD9sև1 #6]>S 87MSahD~(N0Q f yƇ暯ٶ]9xes' R]'+}zllLBDp,ں#[, Pն&</@Du֭; s>+J܊z"S&''SAZ[[OAZv8588]|?J%#X0R*9ODnɓwJ)Ӎ.[i4KBB "l|?ʯ o շ j ƘAt?H'V{{{~ O>&&&_bŊs 2Rz"ZdXjy{X-ڣGn~G?>00pK[[o馏^uU|F`qY0V~E _!9C;vPPоWt]4M "RK\SnF&;,SxJ%cl6K00>-<l˲ x0pPIfffms֚!bw]wcvA4M '튈\Tqrr=e}rhh(lkkCj "*DY.AM>\Nljj /{ll֭ߐRx< `nVill\.zZ<ϟ4j5 !%J`"FEL\0K;tcG Gwn\Ϝ B*3}R_á!, EFxYGK6#D4JDZRRDCWըj3 ; ?[_{8_ɕmA!"\RJ D4u|,Z9:5cLG11x6{R0TʘBFirrRa!0)KJD<"`|hh˗4RRtGGXmmZO%7{eljjJQxP._/[;2*~RJyDJyL)u4cgΜ1ggg'cǴQ;U@|XOG&J=c[g'{cWODM)0 C(#>\9hqk \MdsSafT>Qf!^֒}YQCgm +Tl60Zk証SҞ癗 _tyZ !LڿJ &zÆ RE)$,555_w2\8PMJ)Gnmoo0< ZTMGGG]Z<3۳٬aRZ*R"JDe~8yPT:ӟ\.7R]a} axL)uLk}RItlrnw5):ǡDxY+G?;ۘa( 9c^|]hXWWǂ 5cp{b}}}/c,V dݺu/¯={>h[uuRkbDDZO>cWJo#A,"1Ji-0b,clX,v$DfꝬ_x3q7,?c<•rЈ6Xi/h?YQ3C99rD>1yUt*]Dɒ%*}_w0\zb{Q(EJ2w9 믿ݜ =qs" C4M[)%:14G^deZh D^֟}G1ιi0P"㩩) g>,L0¯iK,As1fG9D #J1fA80m}ᇫ. Gz"X. _pppB1*_wx S3up8an^xmmmRJbR$ {Yׯ_Ԋ+dkkk ( !fDTrAyPE"Qzbb/MMMm[Gm"s9߱yf]50 |ONN8EUP}"Rih]rʕ;?z0!=ֆ !JDF <4.l6;W9-2#oǩ<-pe0q 7윻]]]ܬcVJZQ]?~|âE~ BC֯NVWWUֺDDy,T$\hcDdOMMQ[[W&&&n޳gOQk=(L+\^aDx{{ĉb͵{\oU`a(OK_߅ ,QP. }y\@[osnF<ˇFݻ߼y@+p]0 'f1%!D~tt}XS+ivv)Q Aĉi}?v<̕+W+ܹswzx uKclדO>yq~sꫯǎc(p_*۰a$c셝;w캮y0pƘEeh0 P<5m0MпhҥA94)uFJJӓUUU0Lj b( 뮛a={lۖi172^JxSS7 󣣣JCFjJRJ&# ̆ZkRNݿ?d;Np++?U 좥"9Q慌1Ok(}4͹/V)\D, 0/777,C9~X+>|xڼwUHs))̕dSA4z$Xy4NZ8ia|ϻbs˖-ocq"Zk$4rHLVҹ.5iЖ /])q aT7f% <abΝ{Xkz2 CO)UB䣰Ya٬k?yL,Ea V%8_( mOJ, d|ݢw&6ܹ5_{H8ygů*u]aY euܳF8 {b5cdC٥ai A abii{HR7񾾾um۶0q* l6'""bWki5hd6  @yeLxS!U"ZZZxԩ.Z-I?ԄB J"NFe˖?wކuM9Sb\̰J[۞o__v*^haGjڷnrW+Xֱg!+۷c.3%Hjk`tlMndKn bAwwK3\ʓ@DTc1IӚʇRRKmmmRj45"Hsw-A}|r4˾=5X})MZW_=>88gϾKdrNl=#!D e#r]x<!⇃ p܄12Y]]cccwFtKUG.WBMJT b)!TU6+/-u !BhV{/|(oy[Z]#)r9Ȣj+i6k}Sp⚣ME{ +":kjjLmF:7sW ZDlC,ޢ83 3Lx{wչ%aPx y-"E7EyO{{RUm'4券V͜ =5 s .:v`ѢE_-"8X*)"΀rrg"c+z3Ƭc6^X_<}ŦO0ȗ>S vvvd2i !,p*zDG,uC?;xn2w<=v ihF4>͉Z{RʠT*-,s$I>ftMZ>^?C 1%viKRʢRSJaPD"/ŌYa׌1KpMZkWJYPJZ ߚL&姀&LL,qpEkqAx|AeP&h<=z})(w  h^5g gFyI^`Y+&ˋ%,TKH`H?^3x`֞䜻煼Nz稦FJWݛGu]{sFx @@4I $8h-ՖSMu>G4iW16YM3l98ǶXǖG")" 7{ϰ?}5P(щZXzxsgCxC!K n25"(#p3=xo ejbp<!Gs7䇆.^,[8cFDSnJV40@Rq@`:1+R#2b8Bg74)y7x⺮m[(&: 'RB)Ub"bhZBY\=`ly!.%X~_\0M#DV {`#Dč1=8;;&R8&03tU!J̄BQ?@V?JRIwww{հL&rU)U&ֺK)Lj5kJ)$`hWf"9˲Q!DC.s޶cй˦ XL%/pZ,n~!>+,So= d2z{{(dHPcHѐL4a|`r^U5۶K.=X,m۷p.6p%$ұ$BB/Abo/@8-s_VcڷoMuz¥"h"WqYCUD-[g>:-Boqܲ9k 8[Hp OBٗYN>)lYx%w^T*Z*пZ3"Ҝjj @/g+~VFk݉C[JWm)"HM@$_L2 :>>s=So~488Hu0ds{DŽ5HJp<93P1,BD,mNA*bE:PUˌa_Nv{W@4h˷U9h߈ނaP(h2|Q(v֓C 8BraC//^M_?ZVlռ%sBDaS  IDAT{͌jT__0P6 wIBDG9O /7젊τ@:Z_+bty|utZϜV{zmGO:W'NM3)_*6! ?'"ڸq#]:q9BOQD")0]e's˕W*|F"M@¼@2DUz,UU VՌ1&c0I!XD)ctVxr0k@ MBR@'g#gS޴?iC1P,+Zom0́}[ w^Ї>d1ʶ9? ꯳ X 9 kSZf@}z.{R&o~vffFd2!ňagѼ/%2șBZSS˖eζruK,yҶ\E]!3zmzzs~1H AXHC!a\oCi=~o͍&g|_Lff˄DXuc1V`͞>}Ѵ YD;,[CćtVmىe?97Ơ߻:;;BRi5@`B`:č wG<K?X߆$F[~37?~Ë/v.]JmCy=1^: ,>2ycӌ.\zsƍ\f͘8 Ƙ2^DD-r1w̙\.w"H<CDMRʥQ9/2Zv!D16W:_}yp|LLL܌mܸ|+fz4))ϯBcmb>'< } rs|m^شilii9A\J׵=f͚o)^ZRNxWR*uMʑ#GZ6^VsZmr JJ))R3gZT*{7Q*&kTV(RZ">8 (RRJZS8cAs~rĕJEAFWɷCH 䘤Yr?AkN`?؉e#wmDbڲ,op =g 8>@kmK)A4xܱcc_xzEJR<RzJ}m۞J)RJ1R2'sTV;xCR DYz&ƘMX- KBUfC8zx{F2 PLڬ&~kJm]xs  DҪNq/Z5y%"2OQƶfDq?,RSEq)L4V>y]}Xb Dj555y躮є5c`VՙgyfE\~!>Z6UV1SFQtp([@uyffutcH CQeE@ZkgY3BA-fua}Ӆڅk]n5tcm.؊)|߯iK(AJ> "j2dͻw~(N_vvB+Ǐ_;wp]]:e!juX,eP (T*ݗK岫MDT"CpB UJ]$<ifV.mťӷWG\F j۫ɤ_JY|N (hFEg9Bgm[jBƘ^2e ϧ֍z\.'x#,+ mZͮw^)Jo( 'HyZG ",,/ wmvUb W~%,tgJ.Y XȊdeYprM7f>|?r9'B86 s[&d ~̲oj5fiƍ.s CNED+lrض-#g\+~xLkk%@Dr1 _[%(h&I q™?ND 1FDL晣Gn?455醆Q?pJApW{{ulr#<"z/./'WTQS"Q~BX<=::: @ T_Ma1Pk7iHn7+A,+ ! <"",c ںuOrbrycH4=uر>Ty2d ~s=@Dzz@+(~8u:¯ ] |"ޫD4JDPmzάc-H-ƍirrx'JTRzRf뺣rkd"r-"&KOR\sBX,dp"A#AlB\.yt0^Y AF]D7o~tjj}Z3 @X),^*? ~>NVakk+duN`Mq0ŋO<.w}ƶX[1DDw9G ՅXI)ns?Ƙsc*z`dvU⻀YLb<ǶmZzꩧVyw^k=ʣenHM,\yI ={1v2t}OxWOcrff=xOc͚5?{; u{O8b%1*,x ˙ifQ!ۚ$`tt4mVҳK,E 2T~}倢rrsR MNN~XJY `BJyAk=fVBlt y >=2{agñrT*D9oP>qĎ%Kڽ{_ttt29޽{dÇ\. )twwl׮]hϞ=h"* ueYȕy(Q Zk0ʆ: bRJ5lݺ\bRz0b&"UgqY-2 x.]BFX claS)JÇ?o~_ZrD0k&6yNӧ:2Gj]5u)ZN @j1vJ?hZZZ cLCXsX" 9"bk2؎[nT*ug/SSSViiifggr9t])~VB gEΊCDtqw_ժbQQEh`৞{5k-{ 4#b'Ov$ܲejiiRcZVBx6eh!ͪB:Ƙ va "Z+i666=;;[d2@@d`YVP,@yy[>F5D _@;č11Ddy_BR<)(AcK)wwwcBӦ r<+J(YQeq& b2d2>q \uHo_JSYu.}_)%}_yevβ^~ bwS<̭Bk_X2^=xLF !,)e9Rk+1憦c/^3-p L^ ͸]MRJ})ٹshs<ȏcO|}ڵStuup<1P ~2rMq"kъGV}AX(EL 5!T65RLNDcȑc"eL u;_ٱc,˪@kq?QJp.}B2s cgyfyM۶mq\cL""pZ 1"JqΫ[lHDs閑K,mN9c]6Tj{tW=L"Y*Typ]}Z'RI GRƘ$:w˲6m!R*"xxgA,(, uhٿ8pྞ4|{{{H QjPj[ld,9''!ǰ!BPF'(vڵk2==~+V۰a9۶yT4v{-?; Qb$Yى岥v9quRW^ZVb5u@jU3)s(Qyٿom߾N8_o. D =`4Y]wݯEXٶ:o„lbn5ģ}k /|lɒ%եKNE| M6yɆ}VQ4#@2TiHcbJĉV;::aÆZb=\R(WZMG>5lfffX<CD1D" cO??'w~;+8Ng-BԲ٬t{I)+1N=[1)dv1qo۶qG9<11 .|(ɸ c [NKH6՗`j ^ ,Ƥ e%(* ~_sffz+QIJYI$Ո;X֛;o&RlRVJsO)EM!,!'~sۢE-lOz,hEA۶  ϛ\.y뺵mlsƘdtMѩAR1 A-ÞR*6m6`}<.YऄƘ4y7а׮];Q@)Us]2 d2 sonnRJ+Cjz@\.LJ_j.^W˗/QQGBˢfRd\UB \+X,J֕!2"Z1Kk"yIQ#Jι^H*'q~*FET1V2uݳ[nQD,cBJT3LDU\.l|^R) mcYV̄0)Xr… r ro_Dפ{O.\ 62DM1RY1 bMV*R)].u__r9u>i A7@ĸ1ƅ+}i;3*pa1Qy7|}W0@J4Qqtt̙3q?8#,I)KXm۫T*Ҳ,ḏcǠm7<r]XL)GXXl=wܶ|>1&|}{566!(Fk,Nކ >1%X(в,aFEӧ>}tAd:~b׮]/Cx:t\6&QD2i٬r2bH$*(9O`H<(]EN[^*G=0 KB' Яgyfy/_W]]]#bQk]BT|tT,#~d2C^GkB=X,6 lU)jllpljǡ 86/_"!$cjRmfP(pc6])"b,ꌎ@T*5 :==}Ru}5" |N%Ѣ\iصk}v;)ӟ4GD;a\i$䕯 MiBӾxby8` N<:mАB<ǟغuxgJ)2LBq1V5Ɣ(N"b1V V,Rc.WR Ui?L:Q"qZkmz=WJd29Zk7c\oUJٚNwuu}oٲe!d<15ιQ9m1!B ̞{L&iǎ?;~w ?3Ƭr yDYB+4 IDATRL\!ܸq4055;wbW;cOlٲeyx2ƸV,sI!D8-b]/[ibmzV^m^П%:!j1T[n}Y*ziɒ%W\y™Bs^tgAx<^oיL</D"RJ5Qkɦfgg+>Ν;Moo pg2cEхUL|$UcM;ք?MQl6Mk"sAaw RGf+yvv_?;;53FOe2osXj5f۶vmnH$KcݜDdtVi^ji-o8BMǰ 900Н{2LxC!dH18絈{MGH7n{޽{XBr8i)e3\A &v.UU揌mmmqX. }޳7%: 3,yuնk fzyrPcuex}Y%ցš>ܹs-###-Z6!1)eٳ<[H$^moo?jժ]n)s8zMx#G}u%%@)"g}033l]x%7Wݓ_Z2١UaE15SSQ\DcK PP. ɓ'OOOo}3mmhhݼyD"t]1v3#bf)8%qjo5GĘ:600Zmm<?vxկ0& (0za~8CL!Zd?]dƑ尫 Y=*ZkaYy p(g,+8N8Bc V&x fm`2hI!RJe뛱EyRnY9{GH˲\.'{{{ ܳgOֺɲ6D\bJ۶WYU.7q8Nɜ70`w M^Dt1 t___駟WF oTz}=J10ƈx<.<ϳc6c+l9[)ЋTU!boGBԔ0|̦YJdX?ORu]Gv2u8,˅-SZ>}---#nG_/A5HX<"1&bWi` }}}888([[[%I 8!$"'%z6+ x<*ZORRP_<J1ܻw/Ձ$ѹLG?F2ƚ1ckiݺug-ˊE1F@h 6w1Z +V"CWWX,f1ӅwXJƘJ\655@DLfz~ϟG? 8sιovղ@aD(s}Q"##i qz\^jUo|q޽ӟwww[A`9iD!B"|Rض]Bx<;6V ٳ'YTQ0<"m۪^mK$} `68CjRFJi8ڶmxb})yȥIcLVcpΫDTmfIYT/ɟeLDaIENDB`netemul-1.0/images/description.png0000644000175000017500000004046711277075354016423 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATx}yGuw:h,ɲxmf%ٌ@0@l !Y@NL 6xlْeI3YU?[Gyv~snu|T5ߡxd<xGa>QxD#~OO>1Y*uDẰC"܄HS`ip;/~@) S 뛽{/PP )} *tE?_Oy o_CJſ=r= 0qOu;|5KR%Q7o9ث/@_ xΦqpɟao^\}x[x'恾 [D" "fbcٺy&1,첁/ɟ3S h GqryT}Ͻ3{7T8yx>}} H1ń(&PdVE$ "d@3K7MSڈa6@_烾B-HKϤQe7db<( p-uop>8#HQ\IDW"RH$"(VP aFajnjku\ˍv]Z {pP ?{[Ϩ|iT| Pz[>m%b#1K UR(*EDQ "Aa 8ڰhfhcjiw5ϵfrm4ڦrp?-a Eq}=7n~ǥ<:P8y+B1SDLS< dzBq%QQ"B"fkl0^s6Y:VLεLSO7:4}="'BYTX!0q} 7,$<` p-, UD Ui*&#"B V̌:vď|jl}| !pOzDs767cXDHVsϜnt)^yBoQP? oEBs{Ѹo'Y@*)P5x%KkQyJeJJ)`'YDݣU>ڙ~=a[[Oq#ۆhcd=tמ9t9M57}= ΋ W.R_P:*#v ID.֢PJLQD ""#֥33W >DzP}ɞghCj#Ͷٹ3f^O_(.{̕Ej+ /y>P aGg#cF**TPDd`;q26/nX']޽h'~yӍɹ11-N${>/@!c RͥetD 87G'"TVԣ꒚*K*.)D6C™Y/5k_u{^8۟3yǤLL7Le#{x}yPR Q>[׋TO۰/E*9h8< #ըT(&y K.|\,"pϙe4ڲoS'O[Q/73/ R~0tkݜ9\Bc}|@X-J &Q^RqDP^,,µ \D \@2V>nJ '%V&\ypOrwJBQ@sSO3n1'.Tj|hn$UU"7s|k {o")wV rCy\?g><) +ݙ]/m1i&1|o"Qz pRD' x8"nź>X3A#@P <@3AgAS;޼>yiQq}0|o*Ej!:P$t}ǹPh1-+j;=q 5+^! #n=X::LnC_ŸZvOvđ _1%8zhCmL'wlKN s=_,F R4f2غ/>< `+{'?BJ]"0xgjz~++.X# ,β׮×;j~aQ*}RXAS<6Iwο?״ z+&M_woZMHG)*v@@ꅝEu׏]z`,;ŠɢSUą@t5{= OQAH)<;tŒz#Boz)ƌDS:7y/~~cR3^ڝs?s{3 @^a`צ. ~ ;` Zzc>=BRR> )(^xmշ=OǜvjOl{>XS_px)(m/}З>Q_M bԚ;T psy]^̂˼׶蚄R䳺"C$ ܽm= pOŲr'exwfYܢ/Ҷҧ=턕m&@9W*2@ XS8K!s< ys"q?w.r8$RQD Gn?i]} |UN}@)@x;ГBv]:wegn`<ʟ:V u\+mxJѬDw'6] "tаHˋ 3nk^ND*VL@wNw쵗r+wͪ`d'5o^pxLH@ݘ:c_iStgӇ"<ﭾ ;P9spL>}&eBH 0SE-^CRui',KG':s*hcGo~ż _r2("~UY΃ղVITJX),@\paLT%P|}( 0Os%q V~BBnݴ޹/״ <^ʟ> }?t@4O]Ҁ8ce`gnRȼ{LKMGDDʥIH"O Euk\޶\;I *ʑv|_b;u0QeOP|{M8=Kl9nIh݂GyS ԠZ?j *I'SA6Ew$LDr(J++ZpQ(ITH%qD$H-"R㚣3*TwsPP1%AtI$0z/^bI q5ie{{]DC^wA-Cy?h ofphwR⑭ WP# B *U*IU8fYLMcH)+CHu ߷nhnh]T<=AOHEexO)edStvbRZ9~\;CĽ3_ nΒpf]~p>ΈcJrj)*J1Ai`;l[MJٔ@z@J͏:Fa89HA%D=OyKuܝ޵Sߛ[pmY޿G4_k3_ yC \`Zfv Ur4/wxg Q)V_-G*JbE,8F̷u)@@nl4u!wz ޠZb^6QlbݚYHUn﬷Bl_e UVpXeTܛ 81v9$B1A*RXQ)+rrSߜ55w hN[-h#S;zBl;o[F0ӻ^7u b{ hVWCO[ԫR9MACz;E dP+*%UbY$N*"P90"ư%C9졼K&#:WJH=iեU_9r?3Wu8 5p_Hȣӝ{ %~amu$rD(U"+"EP\ `=φl$_2n={@ ш=Q ⑞ 9&5G8j]]3z5g{njǻcK,˧w㜽 CC[mYי^`a-ypElӶY!8?*CZf9bK 8V0+E T)J""KP ,\p^$`3hRcNh+Xc4îm[`cb[h7pǬ-0*!8JMw8j"$yXgZHWe4zB cҵ~CHxG |53]C ZF+eRX+\8x A[XoȃT.\ر}F-@N'Zʌ +tN |٘=G3e䶝Rv+pA W ]g~ W׃YE)z{@_1FBd]ݼ<rQ"EJŊ`efX6rZ1[E"v-Bgf Y!R]fTqL< @&JѰ`чblmD la>8x2^H Ȋ;}S>^!K@mvi +"RDx y5E @DT#+[|@q]†9G{d\:('ڻ~mhG+Ov)tRk)v > !cΧÑc@<Dcy=h\_^[1Joa[W9?__ 4 $DbO+iIc'H(QJ04:oW·VǘMGn c vwQߣ`2v! :$FkJ$4ZmYs~l_7%+BVPٸob3O^5#L a>23'g*eaQSr T,ꏔ8"[g U1-c3h snP/l (|!(E$h&!!ISƈ8DDn+%)dJ9`TϷX vJb0 Loy3B`pl{65{}"@\!(r-zB&|&>3tgxЛ;V9;ئTaar-+LXGʻc ߅-wMtZV*"., kڴ0H?)l68 "//H/×3A+Z!k/*8_>2wY!VRYw qobqY=Tg'xϖ pl0l=YX-a Z=a8%ȡaʓF NpkLȬݳ{~‡Dˏqei#In \ Ah })zH)$RֵB <fMTz#ՙ-+wzDۘ)>nze j65a!z6$N I%hV g6+GjbDX0 l(8x =E£8q pVakk{ @ ]>6S0TP gK "H)L>@xȦV05 mw 6KDL9o)ԲN H*m;z3Mx1ENmgrނW`&61 3im$Նb\j=,Rͱ$+ I]X (<o\ЪP<B&p`lӼ9gc!hʟpqݻQamL.|0a6lhN\ UնxKDjK9L< Y?t1wDʬ,] ^ le-DXFPk2Zچ[(W3,]YHray9!S!%oLX ^~?cNOP!_قOSC(.ǒ | @OBN8k+|c3\IcD@ (JmJv3)@}!1bdZ!ffC v_KZ2E|@v y;"E 6ziP:?2E {s|FZ5M[86'XE`"bQ+uduW@,. ʈp_s.|&6 eNh\PZ TN|i IDATWMƐl8}F|Fy !c#$PemjH)K BajvG'WWwM TI[8 +z"dFJܦ3vǞ\|@//2B Lm'Ekwd(N Ҫ @e's!0{{>0ckءo~İ1=Hž֠@-z„ _Um{3}ۘ\篈MEy/6b[ {E[΢Vio9`6|YB ,?4?ā[FƠeB‡0?z*nPUiԖTK|sF6p]X~rH|< !j5`z,=3og'MDsnN܈0wq+QPu =VJ)vnpB ??tA ~f{qm[4}.O$'YJ~n\yRO=kD  &iu; RJ5Kڈq|Bؙybh3hlz$J譂WOi%&ecă@ba'|{q׏`d {Rak"Y R"RSYɩ~߃?o=w^>Tz/+=~3w AR~ ,quqkyge'H,ZWm'|)Bվ&@!&`$nr=+q.5tR-vʖհ1Na+ Gch6dIu+fXt\Dzo`wb2=b1蹐躅E;NXvÅ"\Բzt& y 8>~0>Sljm5f4P 8 gCHuD8>Q];4TٵgXZ.wӔT0+@2ƶn{] MPɥ=d<׉٤Eyha 'q  )mZ7@ʹ5s#@=)Y7|luI5iR>gE{ӽ^~]^oXʣ˷u۞wWutޝ_ <*XWgf{k/񩕣V #թM%5ZD "D4ո{ҵ,ܹz<"ht"aI>%KLҦw%ј;఼5ׂ@H) ~j1p{:%wWϿXPأ)wuaM@K[)*DZU壃AFKV'+ƆzZjڲֵ;iۿt6RDN2 |odg>\-eϮypm a6?zɭF-_>;,BRC&>h FЮtxr-w|6&@Ofx' ,ZnYsObTحrc;} HUIDy~\RD+?~_d͉ODP[ս+x0'LbW~ ?ȱ[F8 ʮ"zCD5lTtbɥ?o+{0R@^wo_szQ^+@"2] 0W?&7̸7@ 1LԱiM?_jy~ "cWNV^x17cq@Q@ ʭI]t:IӮ%kafw[{?3Pcp+"JIKW>}`C(d`Ӏ1>FZD?4x{]aG>q?9{&#h QN>/"'vyam2s~^5GA,k *@YzG}'䉨W}h @.FQz'N^w@T[6toy;w oZ@N "ػ T##n&v P9OS#EawǮ^>8š? қgllKwP[}y.SѿiO`9x/ux;Tp:s>`Z hOX43.DHťnyt_8qϛ1v) WsH}ӏ/;WDʵH gł #c23'u˗5)`\{X . iwԾL:q+'%݉x%2,+ RfR%ՠdme.gy˝g!ʺe1USKnBB?>zWNIYîZmsNyc)_ymWo_ffDeW]vXT؃>wMkr܍+,X""Jԗvˈy @č[SO4}֚v{/Q vHWw?y%/Wʲu' [ÝEQ9@vtϖ?kKQ# l s^K'%q@ObvNߺ38 me$*x9(HQ7/6'jql-QjO}i݅,tnzٚ ݋_|fikjֲޓd/4QvҶ+p_ wZol"sGW'HKkk7jS7<|خjln7yR|mu(SnE}[)b#HBm[/V#̎[wE|Z߼}ټFSZ6v^wo#Oryb3`] @OaxD9VFu;νtTYW\ 3@a0j8„s!9݆a kH4?ỵJq$UkzOnٹJb\ ͌ك+X;/8iem"O; H@Sfp9U\0աBԂz>]{,(]\]Uћ)S?ҹ*EWȻ ɞO[ly-{U\QbXxkB-}=˸<Á.WZ4- ]P=0TY3o4QemE7-7tE /n9@MϻzS 5YX໋߉|\ӷ]Ewk?v\~=9OX< Vg=MR2K͙}v^׋W=_T.}d]]C{{3~C+*U*U.,9)ZB;Ck]0?_p>leBqpȞAma9IR"5ޯ/ 됀݂3+3?_@zpt>׆`rϏϾ!y`{~З~y{~')>s(ۓ~<GM~"Wߣ%_Vܧ‡c${b ,;W>q?"EC~G<0Ǎqiihɋrq>Ȟ^'@==o#׌>>C#oM&_'Ɣq |, u}ɞE~/Bzp U8ݐ9۴f}dy 5)z@_Q Tr]nX+_>t;+|K]Ξ{E/2g~TXo|g_j:)ºZWg$~r̠Wʒ5G{xxH)ߍ[ىSX~|ye*R= *ETRnWWKT?6okm;TN#HdOTUWnd`~yg<}0bH7_M 6q-.2הGV|=*Wr_Ppl<탣=j=9}H^Y|AixU߉#ǟȹ{p CNe|iϝGvcY0/6󾂾wĵdp>:p}n<=wlnpIDAT7zVvc9@,)x4*wGUޮJrw7?Wx+Xh?u <*<,ŘA@Ji(T|>= Xx<ŠGCk<<# 0(|?iV1 iIENDB`netemul-1.0/images/filesave.png0000644000175000017500000003463511261455471015671 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxw$WuV4=yvfv6GB$ c0QK dl01`,g# 3$#PҮ6ɡGUuUlPt;ns9-%"'\pͶ2pppVY.u?cjw|6{/pJݮ]xDDӓN.f[8x!p*C^pVJC}k(JШ_Bt0q'c~}ͯkc@7|'kiB? pEyչoa,4ZYhR6 4(#]Hev7wJ@))"K+m}GDnS g?zB ls}s'(N XF+EH0lfi3B|V#i4#{KDJq?c /\ |xC{R"5p11!#GL 2u c~9lQ9lQyU6yi1P8+>1;d T 1=: s)FO(Fe%@iDbŠ+R ١ Tj;ud(jf6ɽ^1P M-S[I#UWa(1Alc1.HLB,'G?{+^Xsoz\5l{%/,Ow4pK}5@?\\pͶ?qQJ sZ-wE'ThSІFAG#PcTP~7v['ߝ{4}z, l{9)`. leTVVwrn/_ZߓkU/fz K}P`Ԅ&/d>T9L jC\pͶ^}4*@hFih9e,eYJN_L=%Y?+BMp@pI) 2 g{o[ڿx+b @}'ŞF,쮢\w^r\Ki%(0G~@^gD$a8YQz!mx#kYg1B" bdJ{xS:W|_N>& |dc)]vnmE]-Y-K%(OOI`{&7}8-hBQدSc_>w>YXl-ND̿0y(h`9+:^-.ismvl0iYRFU'P?14+vMIFh`1}~j_P<:zk'LNDj}9OVv;i[N#]Ga o0Mډ}o@\ !BK8x>&ϯG,N( N9ZJlsrmVݼ, DA "b¿L'כg9@`gMjz`Oea THZ+4hf,gˆq"(*g+]nauSo%WۖBG |#& 0" hQ4X D7 Wڪ#>5)`SY4Hl0?95G'X/ՋoskN]:0 Y2<1FDDoe6`b=4BZ׮tcbR7"|-(Ze--_;f@^2* Btm[}7tH!2['Ѡ!VGF'&c#!DBTmd[].5q(g)b紽ίvKCNU1Gbp@c#[t /1sgkJS@ O_u b:^h1K+Ui{ɯrmv(;Gx8C)H&2M\ߤ1ǿ524q1Q@sз`O5`6SQ*C,QJNKN[yKYDj.bfb~!0%fBf* h_25ݏ)L|ʛ9gcbFo\@淹,۹nh =R1N0Q}ԍDG#ԙ6S:W?tvHM0@96j]B #{N L`O/ $2;,vIbq}o\{ş_W=2XorjklVv8žJ#(!T&A2V޺+QꑿO "YpKԦYi5uh{2E1 N=F~ kG]=+)\VV|Oܑ%wUu=a٥Ziϲ tYkDHRc"8DZ翃{w޹ ܿ6cc&ʹijI&>k%b۷>VxHG53(rmvnm[\Zv %W Ľxto~ʪް xai~]P >䈷_`rT[uW=#3?ʶ!3;S/oo~[pۿZvL68}XS@ CoS /i'7\Z-_jh;y^ZvKJv'^,aOe~v_닟g —*'yXBH#6&XIR`o>S0rgSzger {1>pk'~#q@uwT0Ei eZ(ݶ=o;.SrVQH=ƈ$^XKxr_K9åwO^ˈKѨG#QdG#n~țC%gG>|__c$жs{蹇R:1 H2ݗhrEF i0 e'?bhh׺h9Kv#][33&ܩ3?.\8*?ܻG(9ڝiH_,ȦW&w>}' y 4T'cӠRq/"H?Zs,J"B)BU.Z97tǗ4Lc1/]6>ɿ}^,esvۥn7/YeS atǨy&O~,9S%} OIb5KYh!/:Z\olmi>)K7KcdYm{_S܎v ..Q3KO7Q*S3;z宐M2|Gɂt`)S(JAe݋y *tR#9ڶTB N% bQbM N/Ϛ*_םv:5'_L@sӶB֪8q:󖓷z~3I6u]5v<W˶/s#?KO}rhǛ*]⡃~eVϼ`3zvx6+?s5SLF_w'DόBת][鎜崹ڶ&7Fݴ\jNo9-rnm5\j{G Cホ[.<3YB69޹z5yچʃ h/woeZL7vc/HĨ2u֊)k+(;guzNLf,3 uC ۡnR9\-uv-g47{} Jeffʏ?V[`ך-Z 줿ǚ ~ fl\}:7>POX.8T%h5^C:D jTQcfҮ_0ZP*cz[pqxO ǻ(KFLiVվ;˻_N/+粻rS0?{Fƛֽú-s?%]Ц񁙺7yy=4Fww7zFzF#_8֔ 6 b=~bbMm={ :g˦ _5Pol\r*>{{!Pm~@pgDŵ;~>jfa(&YsY;A{Y%\I|Rȋy1elPePnw92}fxxb$VnsV+ڮkʗZ4D5ޕc||[(>e+QFk$2|O}"6(Զӧukp%^'ͺfM?y׭(xĈO5H#,q7rR!tvnyZn{f,es1PX=HTkjT@$~ʡ~Zr;m0T4z`,+ 2X XM֡'!L8X EEGG{6*&ڟ vBIf%]\*{gO?^!`Oly3J(s3?(-7 Ax$"gУiK`QOŶ+ {)XPˁXtɳHEko;ZɎhzj3'Ǿ4мJ)A#JGҙsѴ.c0c{j!8(~|? ⏡^ʥ+ޏn:~_sQ´F@c葻-_ӏ+bH6Κ)8AX`O;HE c N ~tD(¡ae3?'s`@,B / gXEMzL!X;W J)?}={Y|CD2u'} | N7 G+;|>VDY1K G.%"*LÅ`N/l`/1 MT J`MQs7G9D0d~ @0Kゞ9܉B:, AU֕ž740`Db polIـV0#tv؊R,b=a~&y3slLޤаc|#zO_R#2 C,6K5@: 9c5@ AT+m`CG3K/!90/cL͌1z @~!_2)h"`A iz,RxQf*6k: dGԵ'+^s5g> 06↤W6"jogҹP@ն>j J3*L127 GݵLvig_úyԼ*7qpz;_'8`*NO4#EPOI3f!4 *"1&4 w#c|웯g)v^)>-/^Oo+Qr!t=g!X[xE{Ҡ/i%Ɵs& ijxvfjLT` )Qj`YeR6&'XW]h>.ѳWA`>#3|}JQSce-h:P08s wl˚NMͲ{2/5$%@s`:coH~]0!| P #FOGrֹHzBU~ -Ͱf| IDATzRBPh+,*dA+AtrM\ץPSSST*oY6|RDN.WT*>k`| |60>=L 8lK*&6{Y=؝MP3E^Ci=˪t'3#_7 +XVbϯմLWmӑSnge `pp)q'l"O/c¹hJFmubjIb "zR;&axp=~oY jU<KQ,h4" XlO1\Dwr$rg8}QX+oi `OŹT:Z fo c<*UO\g$9r.6Jު3) $*}V]HEmJV@ҸWBs0UShML+sh-t=-&C !N.)j<&@gF/ 74ySpq EBVӚc2'"#كx^-A\5`6ym` W  kԬ-jL[wD +9s}?mkzI9!sfn 2= ?OKaFZCUzDC LI`eМk@PX2 % a< U} ZU- E5A;`;!+]Zړc&d@_RN5gm|MA_,ff%U+ 2 1+oGGٿ9I4 =c|<<|yԪ5jW4o|A?:tZ_V jt):cd@_z I[Μ)?yI 4kf&4,G{6m\3#bgF|. Ewn+BPss 9r<\qll'фu}ZXB0М0/`ƱSׄau˖RS d@_Q_.Z=iЗFiңBa 3wB a`%&Gl!Gt-K՚&9-U4r3w"T9emXfY_Ta5A_Qv|< Ddld~iX49P6g:W5dVXVWqG˼6h1h}IGmG`Xb'-25 4"nK Z"H4}PSO1hwjDhwTN`h45.{fKbt~Isk4Qj\=3FHAMk롷@εղ.`O/m?jcv5 ̲i!Ha!{`)U%ƨY?&ge ~ PBt|P)}S2sFPՇsN]nKN-;q!pO#K0kc0j=04P 0 Ǟ8J/v#9 = бh*3g(?sܐB^M[+4U یɟ>!R,ۊy`'UCvcdCG-b=a X9ƩÎQcg7e9> I~nd>'+ݒ}=(zߧoMtM} :1A0 y.wA\v? DBnerb+ $d-g*rVjfad]j^w]M% f؋ZfQz(#`;ʷ)TG7xJ)poEڗseA֮p޼P.#8w @Ds{!:v]\ QfP~9"6LqZ<xg9`t[ WH=s AG6c88;Z! DaO/`p'Q Dv?p` .d{~bN+a܉N +NC韒wa*O31]b$[L Lbl0 @;J{%^i^tؗ+؅v`氢jV71h2L\m.Z{П+ؓ)Goܞyhy >"6 $v?1KP}z @f.pݜGSt-pjY2^ףl=6"*"@XQE4Zf@Q22Xf? ܕ`A|Lu?ՙ<O P9ź==1,^k(bކT E%LК'&n_LL$j{N.ۏRX.B̉I[P)Suba|.,tn\+Ҭ? ͂=1^{ׁ[.mj2E,B.,O J.o Ġ/|vFPp\q"7{2vZRɟ!FqKkuP 礋"Aȭ̀O%;l.^s^#NZŃGXr{[j`OlVֺ GRv?HYPe.swc5FvkB$]L)Z ъyZ).9tc.:|dF a5 $+m5MMݯ "(/\놁]lXpN8׋jB/t;S^类eYԤX[ Sm!y X+TrӶE Lvx5m|Oc9̌>Y?#[QGB߄zoFaeTe#BB V@h1FC0*mnpcJ}rSK1U% {Mg¿~Z~_'ױ{7rui5dOr=2/~;ڽ':YT̬Tvk/=--Hguo1~ݗAuʒCy @8gS6P,bIҪ-5/ao$Ls|~H ^eqfz(\m;غkd%=PY3=t_-+ʲ>ϯ({J_I)6z[w>ݽ=gM4Qf-&|G!1[񎣺ќt_zG _x u3>ÓcdJ';Y:#?BG~=Vl=1ɲxFVWىQe]voIH+1~F;Ǹ`){)Z(;)(o7LPO8 *x_r[qѶ㘆O <JQ%O.#pO{̘ 0Z^$ d¿ʲІ=v{Oy맿1/OBk طo?7ofɒ%lڴr m Ұ8r-LMMg=dI={իٸqc}Ic `͖oPAa`K VGlm_tNqdžJDl0Iz)f1y4zUAԏT@}+?twft<޴(kDR˾d>!I%}ض'u]?T}_=9'\P(d]~V\A\aQpzz# ؅vWg?.0| KV~"5(-~`ԾanP qU_YΏ-ãk~0Э"R9(g]x TY;Xŵ ]5szS! 'Q髎*x~P?kPGйefCz2x0PJ@Ȼ}Ϻ6b`Q?ީ s׏<5^/%n:>Ub i Jn:+}t.wnVȨDfz"F}ߨ< TGQ, O$@\wE"%TWucCɩ`(էw y \'"r_qsD)jUJK-ؠRې^z&T]=G8g̵cs%u=yS-J^ߥ޶{ Trl|_Ĕ@P"z3 St\B'p^w/ &aaQ(-IiIcJ&SӉ=v|^ȔeSӮbR)-4.D)gD@T6|D D4Ihk@ԃ狆|B EH`l$Pb™9+b۳dĀ"3i5cK`ĕ7ς"ufZ7}SmBPJKu䗷\EOՉ"d|]{Wor:o| (GԙfB(}4V4Y\u/w'l -1Wcy#0aH32vU7ς$zu|ϝp7XI!iZwkWck &#{`@ѷ#׽vӻNGO:H+>$N$L^OT45lscgAЗ]lv=ڥΛBu;9 FZ}韬11ά22oZX^ ,lРe{Vt\avY3?OzE.~J5bLc:eJqWJmwO4=%i.|)NO S8l>) IENDB`netemul-1.0/images/cogwheel.png0000644000175000017500000005533611257634326015674 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATx{mUsy}z_K1ƉI 좘2(6vdʊI!4BF:iŔ4qlJoI%Jk?+$d=;w^sߜ ~=>??^ gs3~^o/{yԻtП,h!Y /؟խF Ee`*CL0jS3[./|iS,A>ᎂ~7֩mrx\(լ*P5*Tf S!SEV2U V߱.͗~)P'_~vW 1q`%O &cGJD""FӺZݚb%Bf\PMf0[ ),Yg7Aɿvrs)P_{dQ/kdpƥOH'#ΔӮ5kլjĪ2T'iU5Q Ѭ" òdPM6^wc-13~o˽xKO dqp҃n =\/+\Ɓ=T`ZуJ䠦_EWQZ-mPS(L 0]ュ2 sl/~^;D*]& kA'{Q0R_)G{s"3R3OοCv+3iڴb` U&_hi_%ܫ-<5@c{m}R?UV$ ި̭pk%FziaKo.*.6z\˅ÌS@pqZ~KcmvgQgh#f es\M"rн^*_=rh{sYEbO} p B?&@FeVVߊG˽V_wd(X]3kOumwǵQmE!QM-vfב`n5HVJfDĸ<mۀcX(U /u##&F`ZoPhyhH-s+o7׃J0 4-!MJ o?}3ۛ˓Ǎh]6M@5gW}•kUZ 0ØHAFDdI(?zu~{p'S˪/k-O}3%/ p̔@7w6#U{즇R=8ߧo_k<ãz31-o폾 ! ;PpDr@<9.мg'?Nxs/=d'%DGIx,IzXv<9J )^>v7l $Nve{i-SZ u}FDEd33'gh[qlznyGٔ!}#^:3eW? ?`ȓ'g!x`ٿ4}B* ^ፋukpnXĸR:w%O=86j ꠏ``@pD1\3<2y&&lbU6kW_gcO{7Ohm%w/>qX} #DQRhX-,JSrQnoV^c#R<xLB\f䜃w *VMMB~^U \x287,ٍzί[as\XZ?Q߻ALa2tyU?p a~Idew;|qʥGaf 0d ~ +3#+J"U= y: ;zMG2o۾{yꄟ\A~gdUV LA/MDFL ، Ď c.|JᑆW0b'ayʱpqtPyN{4xH =v[on::phJ𒺀 ({D'^?:@`OZ>:~/(L`ʵsК;UV"jZ֐hFPN D@<,٭[z1~cTڷcGlzFown_ZcSE3fo8||7~QeY,/@pU_Jk_i(y[TDLt+BZE4《Krω?9=!y`eRLHy뿳v2=*⬀MkZX@(lGa xT:7*٭_xwrk:V@K#gܖao~dgo?0%ԓ31U\ٟ'~Ŵ~wM74ny1K0HD5#Wm z  @}0r~f IC.2meMJUO]طU rG㵾GVև6+ܯ̭LZrkN|velǧLF"iޟ|?ίeE҇_<RY k[#?2BR 8x {<-3%j{4v5`d & 8+Q-T0ZV&-*Y#FЯ8se}f__I3HNCcO@k$[˩'ozԭwAԻqp6ٛ{#?7N>:~Q }pD}މ5_Q9p+Y\ߩ|7ot +@{QIAq|RJkRbS@fY"NA(np+1iǯ?ug'xA;ՃI_O0rE  \qb5jX5,¡SÎ]_s :,% LI5&q~Y'@ {bi &r h^&*I6d.p󾏾F!A>4P_ѵs ff8g_ETLsDÂݑ+Nё @ʖR33_b#A\ˈ_yP]Ŗ΄Y F &<y> fe%Im;MۿvM\O>]~pA>mr8KiZ JDiv߼;ȣpr-H'VĊ!P $e2bujՒU߻e_ QA38qL5 ߤ'kÃ5>Sr%sL*\;-KUӺ! /~e1$8Y.%0a Ĺ&1t+8x}=}i;JƵtݪ]`U145Q!QЪ@.}+= ͏/3)!HC)VKvV}5peϑ3hty4 ~ f觯7C2e h&%vǸ:EiXCRKܯ/vŌFìߜw븳ﴪ*fĕ.r28OR<~ynmn[k$̠l޹OKU\ kM_$ȒnxdHY01 KvFa- 7\.iAARvyOGGӽǞv0Xve/~@h@"u|Gai']짹4S A; w:I$WЫ[V|Bz 譯x|5YΕSH3+ U;Z6Z%U!35Svs?O} 7̸sZ}1!*L-9S1@O|d^R h0+0??nz}7 fp&Exl)Оʁ^Y6 I'ka@Rk[D<&pPUĺ TRO.+RgFu&+%(f?"wD^өմɧݤY2`ǖR@[RL2Mn8Ȋɲ R]M38@: l~ KvFg 4.#[bU.{y$OȩZNC 3X pRп) NHl l *>ڤ:͙g~l Ʌh 2Nep]=P&d PGx{ecVMV6Z $jBB:S3a55w|ϏI ǿaJ@o?+7|Jn(Yq$Kzn! EcLO~=[e"Hv:DHu)w2Lrws4s2/$| ) fWr\ajQr9~#sFm46j &Z+bj Ughޞ{qH|/x$͌#0;v}a0s<@WLJOҏ\lh]G|>˙ސvCä NXd%!rYZpI3^ȋA *eEe.t325F4lbjd gPوYd#sy]tr*k9,Ȼz<-L#rPC^au[Mxő6|ɦ>BDHwׂܱ Y=[Ӷ/~i xa LCk{cyg ۸}8d3w}b[Yo]EeK]q:bgNG`f[#A+-u2Bj VGQ)[깚aE>·&HE dEhy:sֳ2W@ +cR~jK'/l7e]՞6Yڃ+c(@;\vҩ=5##GDi5HGVn?Ri[_nBJ$ԗ+ND9ЮȩBmkfYx8ynŚu*xЬnTq]mMOam,F D&`DROi8[p?_)k_R#+稿=F܉aQ4첪Zj0j$FvwlmӢkR] W4Q暽K_y;~`{KPgSc_ S$2:,6vCso x5)6t٣])CI>ext;'/r9+uhzw5j=hG2m2kF4T[~DZxVIRkHhsU[im]֍I2܅lNй_tp((A7 i4bxyj8p)r@/#Pdr~0ܕfI ÙmS@tᴤ2t2NX\6ܦ8X}izi6-3CT3U#fQK !&VF(3~ĕpNqN^o\ᔉ)[{6Ge,p$ K "L B$z?Q"0+L kDw~ 67pRIoI&4B& ĻV})q);2=װZl eSGYǎf"jky {w `URF^ڞNo.WIۗV$ĐZ*g3<7P`f&f" D3i_LX靲H]~0f{ VAST]閂64w .^u=sWψQ*0 #1[T;=Tlt|5O\"0<~~p[Y 9hK"/_o\X+q@w IDAT⧎>1689%sbΕ&}6".Jk7XM=ݬ8;7ޮ7ڦu&8u ]~ڙtC#̐IYQ"4ަjQM {j{p*n!L0 u. ue|ݖ=Z c鉎mT>zIIMNTef!u"|ZxUVQ2Qkkk!h!E<\_0[#COPms7`ïFzivzbrjl- J&ҿ$D3Q!UQI('@U)" D 1dҐ CR]ɦHLا>)5-:\u3fy c&Ϡ$&fy:Q>"Ww[dxf_HZGrJ _2I<3~ Wjkss Hi@{V܌F\'7Lozľ$ da5ER_~V/Oڨ6ʹ it5/nd}~Z$~ JtjY :1 #n^Å]s"uֶmQ7-֣i[HbRidu|h%zG~z3*xFDG ?TSB2}o0fh -.Y̟hN>999}zzr7$ I{t¿k`$|{35΅E,Fm1`; ]*I]\;XF6"AqITA~Q T{S #f133̺V֦?k<|ZO ֊ ?.=AvDk2_MsWg lMX(vZNA<7nvvvc߮Ilw.y/ ዐQgUŢť1DQA>r?3fg#tlYF8uI%9PW>0,ÛfuݢnZLʪ1nMӢmHY3F3?,/P1p(Da—d + uuWkrp?BΧ~h2j] ^2eh+z=[u6i sW*@ΤRgt!|2& DVHS/fQ䉋+e9f=ފ[s+.a暇쥌I[째a^>pVk+ͧZi&XSfUcӪltVaV65j5Y]p<3ܽD(qKdpZ@Qbhg쮸@okTr#ft^39M (OD]m/T'p[Gowv'@RNYxP1f˒1*DRla<=o?yU׬au#$ \(LԍA^~~|̠=s'uk̪֒+L&'33ވp.O| p Ȯ8+-5FAkڃR2">6kDُO3 J\捙czj]+͡Ru .7#ɦ=oԥL=4*fnRʨ&%e/yHDծu]g}P|-n-G[꺘:]$\'Ӱ7ss=k]56j;lW8P=CTRc8|Ā; _8)A*OURJ3J;Aۃڷ=& aU<-&st|"aNPE@lr:kQgH;\mg -KUb)ZL`UqBޔ-t(f*1ͫJTЧvzv(RGv[bGt =u Z(AßpHL+5ھ3%c! hD{qpO%FN @6Wo4%ߞ|HJLM(fb %E/dEtJMy™kBK^ܣxlc3x*)ݵ&.v;J[;bt \wFto#wL`њ-~?~<V<.s2&HMIU:E+aأ֩ 3ō)ʥQV^sm1-uܮqJT6|1@flQR2dwnK?_DzjR"N*]!9m䵦Lէ]J'a'*~,~q'+Sl}pdn8(0Ql:u<љsۯPzЈ{ɊEB 0#YAsqLQI~clJ]@5,H@úZ-l^3UQΠO%LCO &j" ݽEQ)PEU5 _$b:˓^Fmgef#SJ$5n}v}C4V`O^r)QjR05Mwg7z>JQ+X 2[EqŚsP8{xs61!j8ZDEک퓰y UM2WL!g90TQS@AB$zVr!DI`6.iզgk2ux´4B3Эa_Vß6g \.OLme"C3U8&x LjA@3+w J *`@tgՃA O3"4i(5[2L".KX(J H)uLc5_|#%'W.C,31%UI m#3'' CfF:fS3juXʕ .pXVuŔgg$|3,|%I(Z1sl3Xp:j ؍A0_7)@Rij7.?d'fw&iFm8~#)MEI Gv"KU(҉AH ͑_0s|:&\Ο&@.:Ey8WSdUtM3 &cok۟q0jTpﻓ{}~`>CH+l63(ݲg<=th.,HW1{i=|'?'r0OloIe#~K{5.rMӕ F0%3(pGܨ V l ̯(E{ 3L:{]*{"b~1'N2Z[텳n)aI?}c~%OЈcfreI a&=l>>t kKtnAHjؕIidt)Uc]`>ggH>Y3E=hm:c2m2b20l60k??*<`˷xATϒ+` yz~ޣZRz8́+ڱ\Z `4*fJz;9OBKBfnkbTEѶ2DfI{lgOȐ3v` BwX7r\qxa| yEW_l:{Q3]{.~2#e{ڤ6՘jTUY][UTU5uC_D+Nޗv~aɭ)J'==+6V  xn~xKiwOh~$pף$k !z!Kqoj@̾=Gbv}4f5Z I]<``svݸٿ&gXt}(5r m\rAn Dvꦀ&~dwaDsç9ΪU51UVU fun45&mZ1Rʕ;ADFz^0z?=Eէ{o*,vݼ&}1`dwCz9 ׯ_6 Uc&!FjU(1)Hq2w>4;+%쵥Q|qwtMuNÌ4Lg'ȃ(a0vfG>:U=YP]ImӢiԍmHQ1BLLE '3 QCHT *[)o)6%~sL\Ҕn3^%+A7w[8/.Ջ^'.Ir7o^_gêi`Q mڊJ~Š$5~!|{.2c 7%w CwA)x9Hق:KF|QqLQ7Ξӟ"{jwMZl"6-b[ʨͭZ`=\| @5|<*ֲ{%AAq i7O&.k1һ(bВ省Z,,Ldbk739'^[7bQLL:H8i(;^XELP*|u9v^+sR;{+?rvkaJԞ&X}`nVJ=j y6 I;NVVzJ i@D 3h<}$h.l&Tc>9d]Ou{"X ֬ $€!}&3 YL5Ifc;³֑??I Ul(2ZY/; ;lY@?f& !Wf{c%% Z'SŎ4 qk/}Z|U7]^r+åI!L5no{PX:䃄¯{r< _~>G#pH`OLy} DY5K\J e ;^]]#Hun٘!fRn^o u`YOx: aMXHK&O!4q/CIDAT5u'mgXis^mWAjI-T`W#oMAH %13[:GKܴ:Yp@ {&ۛkC {ْB_nij׉dOX -ؘ\8qLyk-^_=3j2V\尷fy(@PaH,vLrEbElD$lhywϏC"dʽV#H0qn2KٳO]{A 0UaUзEvӝoc4''N00gGv4u,e<8`JinO76oOTdyU/ xоl t9vV)_L@~/HEA"La`-;6)`("!H@:Tn?cM@gz ќT('YX# =İlȒgLRHO*KY;N޷d^Ȱ-[/PȲD_;HEuA$HBP7ؒ<ܠq`#Ywʾ}XjVzhel{Hmf@ ѨI%d!jN9DP cK&V;:l1pic>c= } }\J*ـ<[lӿO5Ohp'y5BU>/ O-3EZ!J֤T j# +c >PL@XЄ}ܿ?gC/ٟ82[ QK{뤃T7"Uyj HgÌXg^2+ P /}DaHq`{$$U W{*O`0?R?p6IUluaq#c fHƗ$7t6퉩rp5Ȇ6¯ zu2p] FDQap{(n h{hƚOۥ [Q]O׵}gԲ b?ѐr GG(%%&|bl!4v~W>;5ꛟ{ yF}/gcZe)F)8ދs`ڇQ(ieyyYK+&nBSMU6گSaGm!Q# B } ߓ,$`E$טEk7*PK|NR[Y!}ȪvsƁ/k.ch02&d\ɴ6N('wl(B0:].Ԏ1:u\Pg"r^֍;f`]R*D~]5|j[ĺw QT$ 5h0tI;lRX?SVLH>šqP=A 6+?<ŏL_7v._W| m-6t]*&lm6[pE̜8}m&bDpk AZAՈq;xhm~6(x̣zY8X:\z+S`]}~.1*/0p+/}T}nQ^d!Ff51v,ۗ:Bay$Y~/۴7>}cQ0ZxdZRrn> \a1ΊX;s2Fa՝R=GWmOW6ybd+WA,ѮeGt>.Uƞj}*vDYfNjaYqݩ:lZ+^hRv_(9}x ;?[Ql ;~Qp<CCIuW5UCQ.;JlW`Xh7OWfߢW|8vHԚ%s/{DW$bW(h8Pg+e+:8l(Qs@ m%h -|x90߹[kPۦJ{aa ?_ DG51kW?pX 5 vA1iU:z4ɆXڕꖽ;Zs4V.g; \:/^)-6aYrU fUM4oT6\wP u^12h1qD{MLl$!H`:-<)ɓ|)! 5>S< _*Q+TTf{VL`eI;$HJPg5 Ik Fq5e42ṃj$OP+Wu <LjB- yX7b۰(-r~IxEM;8*bXmoY_o&=Vuns.9;%p_;?}TZ~^ݭ*a"Xe kQ& 3eY"4sا*NQnz8X~c J'Z6S]NT2,5kU\o(^Je5MAeU"] krA,Q0xjDžoQw]=p]xr posxESi|^hFN+0NԶ+T .j犫UkR3.3\f*h6ZX^]VP\ Ygy[J#_2GTXH ZS~ar( ؀g]yƿT꼷| _`L{}<ljzTDP4 5fGzq5 xun6v'Ԕ _ !BZ 6G S ]b9{0piIf2PD7K^o4/gT $hsxI'9rWs/c. `_J>n|'{|aEKQ1&[6=E4*UHgV>BR./-s2" 3+.EBWrZ Qz5ocR}ϣ `,Ver$tX_xi pGiyd cx2I,%f;4AT0UCpaԲ$T\<<.>?S D&v oߥurNn 0 &/zji1˳]o e 3N*jPQ>p=swz\%7፝&C8/T ,+m0<37! =Dص)vmF>rdp{z=\yai^閩Bǔz i+v0`2XA(ԓH=$ !:] hT(BAic&^pվw`ҟkqߞ}IX{)# JqY**JY8/Jml XNXZoZ0 l1iw~^ 2fʢtR?VPj5f{MiMEYrHIJ~>:aڋzOW}핿}NtZq7rg:<{tTF`y KBnbɹ7?^xNxɮj@2f@nOMˇ u7as^fP jѦj#YNfRu: %?SF9o޽y׮_Qfp/lz/ /&Ȋ²gϣ #jLj|0\)uKR֧OGE܈O'ɖr/3v"DaVT3'B17zml+5ʛjEnKf|Mg Z׫>` ԟO~m,j5Īn3aǛ};<P׾]pX~Bx/Hfvv#f a@q(Ś6ֹߴ6So~24SoY:x\^2,͹(Y`SbŨ] $vq>?rO"?.\/eb[YyɓBO8( = $E/"%RD0qm]6,g?vwwZY:嗤JLGzWV*W~Ƞl.?њ oݕ'Aɓ*?RieR֪E0/_<"ߓJAGx0̃*N<3ô~gvKW=SPɶ׼a7e)$HXP)$ Id /)u04\\QY\z)$UK س=?r˰9mߚ~~LCPɶWїdߖ3Ȓ b-@EZVZVQ#_N$t8pg8u0_zd  /tkj%v.p=kWwC)n]ď((ckgkN}}ҹ2X%u07~d&̱PUn-vp$5c*xe={ל>+?1O,UR"ۡt)u:K*lh2cwJ6e8*x{d?':R6_ۛX[ؘi6jLQu`}"QHt!Dwk?[~& )yhy\OɓO2qy~) g\E 'GyIENDB`netemul-1.0/images/undo.png0000644000175000017500000003431111230253336015017 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATx}yWuwnUwK%򎍍 +N m` !@LH/a 1`&@bbL cc/1K,K޻R3{n{-uK{^||[$"xl{ndǶ=GcxoQ' W=1k ᆈ4!6M@!(‹`Y{;wE  f3:L"LĐ0Á,~D[♏ߺZۏ5v=b" a&a{6ٱ(x }oyI Ǵ` Wx: 7̠yn|!k|![@{ wR EJ}n/_0w/ϊ ع[ OP)cn ָֈ"{C:{kII>%"_;^lNZvJ`y.u\n~^}a@Q3c3 Ar.ق}Oݵ9.xIOA܇XTDBZ"D%@R0 36 KWtST|k]^hw5ЬELٸ\="7~:ޣQ}y+Otcw,7և%bU#1+ VUR(DDQ "AapaH7jow\L/B˩L/[U!CqsuvUN(vKPS%j$k*P\KT+BَBnXv/@,|c&좞YNC؟BE.0X!0qs>'',$0ع%ѼD*ƪ2ֈ*UEYkxvqia!a "`6F;)O̵zfcNzrQ@d<q}`k{d+}/ UI<ڈ:VS*% YDݣ@N7(, c 12NBzpz^/t@<H6%Um}|q+zX~EH"RpfTYۈCUJj1EDg Xn,"t$p10b^H̛NG y@Y >sJКzkZl:/8E+}oDjHUk#(i$$ sNl\w؈3 _aLNyr3 -N#=HA! D/!UW^{}qqi snX @Qi(5 lK &᪪$ [O//_{,~g""P-RQXȕ`{eR, b{ Bܦpnwg-[>V @%"5\WI}H2y8ԣJ-E%oHݝEfAf`A0aC& ,(jR6ƏQ|] Ȳ<$dn]g>Zu8"§TI5dpm4ij͊#$G1z8'~ DZ 0=HEkq#UHED%陱#ُlwLpdR2W(z¤秮:նתrr%TKoDCIm@T y.v̹+gk}k|dn|{87_i\vOuMVSZTUNCu89\ IKbOˤ0  ֿ[-,S!"jVTU6%q=e =9kwL?s۞z^9h^Z㒁Ol&.̿Q/F{Ł1퇶}s0+&'첅^g)҇B*#$ ,?Ưr;XKbE4XUiq>ވ" +Bvl=$/ ʾlɠW.m|bC Hon sv3f?tۓ~#`I($q5UC!+jkx?cj C3vHRoDZDX 7c𹸃̭ƗyVTi6z\󆡋>zo[Tw @P^G19M.}Ý~əv°߽ )dZәn/"v}ct^ ݡfXF}YB'R|Q ձWbckx/QhP\:RimF5k|t)K8'|4 1>:׬GQn@UTW1 n;wǶƮOwǾmNh?җe CN%8J|> 5̡Ԭh`\246j-&ɍ/>G`|;I\,5xo]Za8 ^WujrNUwL|p~6;nx|60_;MKOhu K!!O,!3rm!NKʣڎ7.XEFZ=_fa睨",dYHl3*HOmsE5-Pn/h 02w]v`3{\A!]<0 ?;{ֵ(l's0[G^_Q`ďTcRYcެPLwD@9[+Aň@Cd$zd_-Ѡ{>^71T<@,+{2Ϻ}s?- R92:x䍋+цc?H עx`R[׌kNd|~?:_A"#rYky|iEmDcjo9ï<MVscG`pp$ ~s2L/ <,`= )ig3ZuAy\sg D ,@`|ɍ2Ѧ̝5كOVj{7i@C(>}89jl3EqȎ#%}Vu̅,dNsW_޺"mh< [ׯx#J6ƵᚪNUUO ^? Hw4=ͽo3X:51Ѩ` 2 BJ= =A mg3dk17֬XH^/O>Zc|rMka-8t-̱'gUF3QqD=I^|x,OG#FH"P6q ^ djd\ߏp?V{!БB3) `9o?P;^ }?)Ͼ|ma6]EirֿUǛQ(56a,<`tqʦ$,1a>F_y#H)$q{ṇ{[{˺]wAL k|-4M5yG:΍~dm# ؑO,!]yk=q|Ժx4̓UuKZ*q@H|?0|/d' ! @HN*[&Y كÿsս#J=OB> n{k=W.ah͍hm3Ur.IT+Dp$-0`[;r %NxYLBA ͋(@J[?q esC9y}~u-ο3}ɚK2H5i?ȑl O?~ԢxUqot0\M :0F&"@dwL~1r]ЇIᡸ @) Ng5ʃӓ]'.* n[+F*DR }^r!;B, .;bͨ:TXA@BwYһ3R97/8~]by!ƫpmdZ=\DpBi8 -Ua!>&A4jz߼aXHq:;smyvJYdhZbdRߟ>;JXDM'֌U5X .xݑD&Qd6A`M 4.Σx"0 {\X|^"wL8by< 6L׼~o?el]̷~&"CukevD-WbR(8"Ry<}L[~){ylTd>Dw`5bH)cj*D ~P٪>=\(ϪZΖ ۝<`/j\sw IG# h>_E݂q2DEgUƲX Ev2w pʵzR/p_oް85Pa$ttnrg ?;`;BBYQ`ĥ}c Alc>OV 2 {O ċWo'pв) /#kLFᄎXfhXi v*+-c5˙ӊꐉ@9h=/@ L,;V\r@@Bq5X)+b bw-yWN.b->AŠEs A-K [ٰ LяDOf0 NYjEINA @bH?M FYa Gj^@E ID$" .kF1y?F%ΕMzvA\h TY`50ZWD,@ wľ6CF 6K<x/O>H;,vܽ#"F -g2w/ن; c+@he??ZcOW F!Dӂ|J=5 Q6~#2|ю(D8l, jO{dsjq?+A!8;Y;ObJ(tR TP-{Ϡ#+HP1,˞'^A4{x.)hzԅ5zrqHOGTkTOSJg5vуFuR!x&93ϒe3KN 2b+/{߻cb ׼c^)4gXr"ɑp2ELRʦ~Y__n,rllE{vˡ 8wFCn=A@ p+>{کIfFapCo޳e۔Y=m]իs}@N@.A6paez3 DjgL^|__d2BDj~S(0y3ߑHƇ"()J )F_P?A(ӗWe{=)S'(xJT&lhWOZjMlڀ!#vKAXoi֫~p*^1?$*M  BK4m["^r8H-RDukG p&<H\>AD*rr[Vօ,e*:IyXGA TQ ~y÷ 6S-]%Z::ejtStjubnxHTZų438k"~Wձ4٪V ddd<0[qSlϾ6lg`sO8_aJѦ]K!!K_1b̨Dm紿ݱ{ˈIٮ"Fk2̢SM6٘ [?u=}ĖI@2a,ҝgu)ʡnرs(z5*W2,aN}e0w}G~HmsrN^*YsѰMJ$bzM%gcȮ+ha)t;]ms_5=a~z=ic!,ɋcCy?Dd~5X}!W9 :Km0 u K75E}27^+ӽ`|ot F߳8SAPi|3| 쵍C_acH51v'Ha5tJ-7>6nțA͂SJ @98!ɇ\Km: }a8k!@ n0=Qr'0{Ěij,c{S)&J[!f`Ch?kӼ6\:IDAT]ɾh 2,C助%O>("Ea Vɽb!юtd a\c?AP%l[ƍ*N }wy9"6TڼvݏyϷ>So|߹`/Fru`OU̝{+~6J᳧t(~QW("YJb(.Q܊ L6re/,ad#Ad˱+s8 !sl9]7w_iGK7`7m/IVs07Bjjzɖj6{pe3̖]4>ū h6  5~ ߋ?yb?=Ӱ=k b 5pάqݝWz-OҝT1|?3!_< q0 ?|;( @VQ5,oDWt湸^a튭8j;R3+ =znB_Uڐ_(9{C3wSYo<Nu*h?w(Wb+ظDlJ2ki蜻x/PP,(R.r` "RKފfi CUg"i?+ @YE)BU+\EJ˰ݷ@$EjH>~U}Tڅtu* Rc lιy`0vijU?!Vu࿽¹|u5RlٮV wwܨxhc@nqjrWIϞYŽ)\yHi"#Xxc'O !"D"nN95{?GniPdK.tMn}|vز7F sܼ3nDĊ=> 0֨,$nRa&.'D*qjz&}Ho/hwí*{(cvR35efE/E-E~! v<`>|G{llFC:`6S=s#zsl3|i8l&T8XX8soCE9|0sNt%ǿ6صiMYĎ3PTk {{IC8n33G܏/a &> F<3n';kA;ƺm#bE(w>#ȏ.qǓ{M.xK!kή!~n[/y \ɧ^ͦL?ͤBD=G ^&}J`:]/Gduv% &w}]* } /QazTr І/=?;ym h{S(W5pcF?dπ=ɓ>E"JQ@fH ȥdd K8Hd?|njWX =Dn8j|՗|ۿlkس;7PQ{iLӢR] /3O?5=0m5N[nL~/Ⱥ1yfq$Y:Hy0>w\7 ^iF{baLO`L[+ew Ɍ/n :&_~b!v>qg~%2J8z'yB=TZOІպ PYǑ컜ɡ 3boJԡ싒SgLeћ Au/S;k=kwgŌ&{GoÒ-*SM6ru~ܚݛޛyB0:OǼW=ij+W3UyUZOx IEN"W;HI) ?E kA*@ XFC0Inߍlzw;wiuGs?rS'%HA) alpC&"%F>g#_<#vMJ^-`~h*/eJ|hw wEљ3׵m;vT0Aj{{vuZ'k-@O\Qc#YwY+>}ͅ!{/9[{ğB?$,zR~UKK'ᶧ7?ɎBE$6:?@"J"R_>c>N;@M c4e_Lϋs{{E[gs *M"D (1}m"=~qGrBw\c"OoYʷ trs?7gbG鮍{I.5].3)EGH$"lw{2;xk'{0:wvNZU^'”θٚ=߳zy6;{_9 ןy_r9v]ȕ$a#\ _7ĺGGstz=~օ/x%Ë.{ɹ2g/H ,`HId*!Vs=.7&%k.|V/~h<SzOi\=nϖ2װ:vڇk9x(:7`} "M8 kaHA4b""˱%s",b8+ EL ?køTBA&ހ~Pj.z Gk#; u/o/ؘla;6vݔ]ipa F!K䟋dbݴ+iT#jCv2f#휾w?=/%4:KܡbOE,hl:~O#ϫl>EἙҒ(ٸPKz=$}EOT+27φ6,ZkqA1ƈqL?S8[|p$'7 3J.ƅиA^_:wQɼ QN|%&]ny/uݹ䖳T%0L(݂5 7A;oyG,#=Y8@;Ӹr']{"t}K3DU&hu{CE6rdV۟0cw3DJs7+2!'hGPq[?Vjֿxq??7Pz;WpsKU=ρ%o~e~~$֋ߴ3̝0mQ( cJq_'&I_Vp}Iߪ=P<ar~GkǣP "`4S" iJ#돓CQlyp_Ak{w/S_5@ʹwH?n"g {=ڇG9ܶbᶋiB[ +|/tA ݷ?70уv![ B\#,=q_Şv?{~ű<@vg uMĞ2F6ʣ E!}?4H___/e==/pb3n5Nr^4Uj @n:({=%ҷbO[@$Cg_~n#aUߦ5e7U{rJ=ENz"h }yb 4w?Zv[5u`/*= S$}-@^ߺWf KW1KobOcӹߘ/Zm{:*Nn-?bO=Ğ~>P[m8:.Dߧ(8rO؃2;ĞȾou^3}nXv\wqc7y#=KUV"2bO_n=Cg]7|y+[Uj_,9)K^"4[(wϽtg hl<=xX%%p9۹/{۟Ź+~@XC.8VP=KrRj._ -rakqcj&7~o/0~%}CO}Lb> O>AoOV_D8 8Kq?1U0r/? Q*7⑅¹s. 18;te ~۵7WƟU7#=KTND>Ưm|$xp;oyU:?21R _ޑY}~Og~EXnGn5''pKt~/Lk eҗ_"[+wzCz؏B@ `1K;?gmw7N[}T?ogNg'^k5Ȋ7呚rkE/2gq?7=\srN/{[=tn9º^}I }Pp\D}fEj`ϧ=.qvJo[GtkUܡNz:{xH!', #wjn<oU;߶#'M\d}~rIߒqH)S]{Ց '?'-g@mџ_֋3gœ%*kmDysʹm?v^u =C/<޴ =WJ C;|N8m^w&w[?i\imn4^XϺk/K}J%/@QFDTmWTvoTm߽7羓KWo Km[-3yTXyXX1#R %R3PjT|O]d=*ضv‹AmcxoQ=G_)EIENDB`netemul-1.0/images/properties.png0000644000175000017500000004312611235657137016266 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxy$Gq6FVUs)i/ $! œqZ؀sڀ?0g@ Z6l0,1FH$ẌYU3{$P><3=S]odoDf;x~>0~x7-\pMD :D -D7!{޾ۃ_Jݴy "v'jv=383AG o$vk `'DvAxEg׾登zƯi 3,v B"h_"j.`scp!~ pLݴ~ iB( Ps@đ/aw(r/ =n!co_4sݴ8 Q2W{fVE!.xx$%c!]."y߼Hǯis <]E0' ”s!_߽}ݲ#\`@y~?+NOǐ, 5^6{_ܿ#Rg<@OyB_9 { mL_%+cnP$}eL!H_!>`1!t-߄@/*>o߫70nnڼ ug~ݴ~hKHĔ"1%DKʦ&&#"R^q> t",@X103V'}tiv)zl?1? " _{O="Pɀģ(YZK*4X!zÙEDW&ӊv̯ku| %Wxl:;;-ߙ4o]oYdѸ3`^$72\{m{UNW ;h$"S PGCrLfI-JN.U׎&R/8"%y@N= gSPcJ!B]~H%ASL 0U@1j%1 "M*ELx-{qYGaC$,<asSOXxu\ GE&L uډ#qmIT*13N"xY3DXR/ [A @a4\ T ӯhSpJb=3|wt {V_;NyfHYDr!@!tg>w f^{^ObC4P 6RJ%xh岱猼g#_7bqlSVq es4SG ?wwV^M=j↑N֚rJd> b@Z^9#C&i*r66FlXک~>kJƙ,>ី$Bݩ{^w=xv\^lqypRJ԰?>wK58_cU7u=FGVGD0.$Q :Hp3E8}l飷33) i锾wܼct 8o_u3:DCVuj. }d 3#ϸ9y4M8LmDUCI儑:^ʕ`kk돪23U%/y7)DeWg2 *v0Ld 0>$K(\ <`𒳷,^p[lY{v@ Ho~]}zѸ_H'p=c _}a3'c D2o^0&V~éwokg8XUZ}Ϊ=T ≂ &`] LJ Y#b[@HèJ&Z9WN)Ֆ֣0T<'W~S2bM`v1얩e:T!Fn @&P7Z3Sa aHw.x^_J-D"z7m\-j^wi1iR-؞S ;uϺh1<jf3!Pdqᤶ+1H/̂C#t@QcApG]: {љJhi*0KP0~oIK_K s y=o0Cbu.piŞB{F t|CyT VR|pR[Z˕"_<#Μ\vDxX:JNuVJa/D (9ujQ 0~Y c͐ds>7۸a{M bϢqzstny 7ۇ|48x~)"ECIeY=.W WriW\| Q=glvpeH\0Sbg"* <̠f <zbIĞBZC$AfopỾy:R,<p%W&eRM(&X9$]/`&s{ғWnw~!?fyO:R?=3'82$, ~7qc=01dK&g頋^GolyO## -Nk;/HO 剁\/y}Ct{{]3:U~4] Hz@;Lwۦon=lf:uf $h< Pi>*5 KUU( " ќv2s 0W]:"ҫ<;#Xcэۨߍg_ |f'c L`6p4Y8E3^qebJ 5Ѝgvg{lx֟[NnI!Ll@Hd6-f@9JsijY߰Q#H= U\gХvMmvهMЩ= {?;sn nݵ{8*]}7@9&31O+W JLJS {]Bʧ<نKn(]VVD\T15@[u̲6|8EQl OH;11s/;fǎYI|JN#KW@64R5RD&GԾl!*TcWԨ#SD<Mu8uWkDT6D&)1d"#&6&VX_|fv >;8&I }ev^x=/}RcbҬ!_څ~7O6":\":Üv~PO#(EZbfWǿ\?ȋ.U/V}Ϟе}z)+?=a!aG1qD&2eXVe><s"E03;g8fqN=<$?q}Q^*Z(U%n^Åb_ž43}T BRq5![Gr&XxtwTkA5@r"P>(RM?B䍢NKw>m|~bP92QGD(&1D3_ƬKι0lӰ 5'7_t[J#e>Z9 h+M@bO? wg>to;nݓg,CC&%cN)pkzvW)J[xVno =]I-+Cn|wnve7n|ј@~;bP:yA-' ImJTM(N"* _Vc`ڹ[; Hp5 npSk{N?ݮژ@IDDQdUBALܾcX];%'q '{s~ `d^1B?S75)p\2#׸nk[+TK ̵NNs)?! xtnc2s7m0#1FmB x+0,*rÛj p.?CbsEGYmox@)&VO3].p֑':ADWcrα ֵ4goBYxqNwU5TEFeۇQc[U@ȶfO|7l8n ObJ WszpLӪK~KDDLV we=O8fљ^q~;e81uNSCSub/J9XkF$+P+V(^EdBKAv#,Kx~Hx/Dڭg Ch.WP3yߞxͣ92n{n{3 1EIdLDZ ]D,L"$Vnڿ~ށ:f|MmLoc;aq?ހ3ƚ3;K(agR@NX۹6$"^abǵ^,RD;QW0Q^|M{=̼kԃq~VG׹A1w.9&DD(Ng;Qix@ uL 48K5ZWjV& _=,M[lBX1W|6.\SU-k/d0گNg%-xT5Mc"dH=aʽ{{["YGE <̚ )E=]X("5'E?zgACytR/\i>_IbOOϦ~烅oԨt :ed9ΖvA-KU_7h2 IDATKqI81F~p|ki}`(Ѕ`~(k|a}n)&"acȁ4+AP!/UM' Mv?~4/ؼ{Ÿ_$}E0k!j Yaa๎CeJV6>6j"z8^v!eV >i ~I8 $pz(TOJ}HSbҖ٣֬=,w܈Mf[$"Ȗ)b}O'iv{/)"H.9GdO9CTrqd-5ʖmȞJzŻ>(jub%t(.`#'}Ÿ_tI[qS͎D&ިo9 vK;_hf@0ju} {5u&ֹ|e!C<.dكo} u+(f5 T@t> ƹJ߾+$CCCv0^8d92h΢NݞF͎Բx9U򝻖9a^~K4RD.0W2|:&tc',ِ(VkZ vBǬkv7(mp?<@'D$a0.ڎs2+l!LZ WcάiL` ^&B-nzO%Ks{$ZjpZGi$:>0Õ>;#dAޱ#P"46DFoi`g Qw}í/_99S{t= DH(g{YHNThwKmkՉy%82HDewEB @šiDbR+NDsy;+> ;gEFwIpZ;aD1ܼ wkSL E<q `lri^f%%붜~s`nq!9EI_Ϟx̜@lpdz94lk3_1Ce/X@#4Z&yb?22ˋ7SWc(z!shDZ H_A qh=)q􍍱 N{Kn%fHugh@?CXIsc'5+:vNkx#$,ώ!jP\jj 묰U/ `H4LD H]:[E!Mn!)JI pkW}q􅸯-4D-Jn`AlļZnxǷ\Reh;OA <).TXC+{3' XKcfj態_+|u^7^@!e< _n_3T/ ~I\f=/}U0Qr]h?z̓&{/"R o_ s_s)7{^ ~|fYu-ztY[/3?#h۵|iov8kx]$Ƞ8gaʞ;z@O8#TҪ`CqjI!_ĞҗAPmW|#6`ޘŴ/bB|^<"fJ^TB c{k?j0 e5{e0~XHgd<̈e_Aye'("C5D&+IY0~GHm7P^b/z܃=WQzQD'}}J['YJۮm-Z)G+\o3;)p(W6ab\B>;HV+9ˮ2sms <ɓ "(JB˟Z@&q;æ~norݴSbOx Dˎg}G!"{/ A)wy]SKm*`!c@1Y\yZwW%4EP$хHK9}MǶ;:=!S 8W2Q'e\>. |AR:A#lu`䷼V9(}]ӑ==H! } ષ>f"7/&dqRC)<z: LԦ*ʐ- 5@4sշ<1S|[Z.ϷZ6l1g[*wy9Kgy\&V(=2G/xd ʧv&u:rLK8yda=H# ~ʣ[_;n[4!BX!SoDEa=3s0u7>5^ct;]tR+4:q w.[W>˔¦.{c1'P Mwj}?~!'/%}͞Z[Ap7RӌqbPa/2!x'>xɖly9ؔJ%^g3rL&"//_-(BC;Y~j(ac _q0Jeh$_3t텯~lM r.IS,Fz~!㒁я7=a= .* gt{~|O쬫WX F3\Ӄo}L趫^8?9?0j]:wQ$lO'Lh'1٫_x`و/]cZ&쮁6K,_bx`x*y/2T㾮+sQnSW ~8]P{g K񱣜. asg>}~F8 AG9'x* [kJ5ğsS5[MrUyvwJ|WQt4xgip%z֣V<3pꩲVu`ĄW{v.l#b2vDEc#5'Poi4[]@{J]TtFN}a+v_Z'V9,^픍[fqWMOHK:3G\* h:XZ$!& ϬH;?=i^yk}ك$ ⧝S?|n4M9Pԟ8RjXCw tw?_5t!S95RhpY_{<< /Ğ^=@?\[jߝ8{u/Qo2a:{O_ɓi:?u*M C;߃?8YڔjoUR} ͌&%?+n_C⽳#Z: KL xR(Ne iHU}cgX.N'l%֐-9E#{B܇-.G zx5l$Ӛp a0>o3g{0úf!)`‡R8~UKwxozX>0`MvE{Tx=O-tz8Ev "H_Oiا]@q'Ry*SgԽ@Q{;0@k8aC&h:Dc~<"UgS a32HsߌR2/yjT]|:Fh YJKV-Kq{Ց,l Wc `o¥ҙMQ)&=}@_5oW*`Hvd 5|E#bUvw;ih#p8UTՏl#f3u#./ln 2*k}fSA/K:yI.C=ykϼtǕ;d1\CهJyt?[4jbN 0Gb5ng;&S]u{en&SZvU'-Uej"M(2"d{PWG5 9|=W]qa/I_x&X}Y<4-㟛{[~tךkK4[SxeOVp`^/m~|-Z'_hZzX$9,Y >W1=87^4q+A ;://ܶf#RzP͢=HvfiwdۿYg_1Ƣʟ.&RX={q{jNkxu (Nɵ^W!ElB13;%Eͯ\o=ݰO߹7tǶIż>Ъ%߂gIDAT]sسebՉ=hǽb7~U. lfD)~,xrl ;]X8,Bͳj6CVkv]UiEP\h/x}ߋ<4{c+ ty;n8q:/?zQozyڜtgL)>dYzBvTk 횆=7jb#5!zgpt㝓鷯n?zw[OojbW5bQx=;S]v'q3k8G;!nɫ}kȪCoYʸ 5H5>rr2$'.m+{MitbZv-l^|"a0V~/0u㔋>j o|#ƃ^siw}DϊP@M}/&Ia- ʃxwO:H?g֟ʝ?oݗxg [6srޛIH\3{sORoG ddĞI7>P_קss޸Oq- YL_@P_8Ƹ/EKw?  Ny_K'}%yGDBBN8[b/9!n1u쾷ng QL~F?<>"y=UgN8닟︎_S.P5~[ژ@V{@9 }}!Ms/H/~o}r~ ƯqK>0bO/`ؓ&=sh$ʍ_/ Os>%406/km;G~Ğ\d`ۿ^ruJ@.|W6}mm߾Wl@q;Ni=wm͜eF\LǮ#ߏ_OoQ_kk;dNۧIܝ_ ]=ʾGXZ(Ө\krnSۗv~72.ŦyTyXsiY3M&co=~# qqZ ox~>VIENDB`netemul-1.0/images/router_fw.png0000644000175000017500000005076011230253336016074 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxܽwdu;Uގ/OL 2@B`IH"dVhYeK$Jz-{WkSi-jٲi9r{9GU`f0 zn}nI;IUw1i}/2ƕ(ń|r|*K )Qzm_Jmq[XV-?F! @F/żs"x~Ǜ7B|b;7ys.Yń7m]WU p)B(p9g.r~n|K[ +MovnPWJr &K̊/, }n |sZɍƠF<7(B6ˏy||rG[y(fi,=3tS{K35t4!2QAF ]A|JIPUhA |QetUoC YCp Șv~xD+M>X{hUTTХ١탍Ov7n+gR8G;JJNY~h}z]_|k (= >ȑʷ, hdrK&7D-Qf.?Y: y`b>TZ ܋.%v~yfk\n5=_9R@rRαz{W X{V+Sv?A\<.S .U6t !?ǖv}޷UHfYX2閇Qd6Qpg"K~kSCW$ vAAj<;.rH?VEGgw?߶M>:.?25Sk| c X=c*8ݟ/RbB"HBH`Q){ZAgO¢;*Ʒ^`c̯loofj>u~s?է+Z17tKLT tGYѤ~6Y|§.hMBHPc?Ab׳qx6n-Zv˷sVT5|O5)zٓsyD%{Oλ4/+c;_y/>.C 6S_]?6k4N5w>?ƀvX hF8ՙQ ??#YHֱW5~e֯l/5*iOR']1ǖR,^T5@ I)D$ruƐ<wC,c`1Ϗ|OD%f|D_&w[5 V,9%Qa 4|׵ٟw/~ޡ*֓*{ɥbA)`R .p$A0اǞsE|xt'N{jmG~ [Wa6Fb! 5ƀ1 gƿ#?PG)^|D432t:wfnL33[SݗU \yn1yQɬ!k e 360Vfm}<}k=UR 1Ѩ*( ZP3D2D֐1ƘP% %T,xgs4F6 铽̌mv d؛=?lw=ݜgc\bpUٴ5f?tϖc=G)\ YdzN[hGV;g~@,VWhwDcw|wƞbq~<v",LL#@,*T2 "DyW W`fr);OKxmLX`3H߭XV; -& c[YzabB/剢O~*oќ࿦Q^Ds!"F$"b,Um}vh >[0(O3|},ߞ?Ylϟ.&{N][EF"^:9i]n:A{r5q{GγshfQk~O{N\J}u^@˵%*, pc K6\onevD8j٘<^yW,:Lђ.3Qy[B!QA$ӊ@ˬ^y(:TB_RCw~ecDUɄL Hc0EKI^Oͻ?g~z:˝X/rGvs+.&BTQ{!g %"R *" VEPK2d#'ґ "ljؠpl26u7Zq DՄ*`ռDEjy{x3 ~ 3{_-un){О!R֙[m`Dx-iƾWﻆZN,nw/,lGfW_WAklZE&ndKjI86*BzΩrFƴ_@2 "kKd!cID;׹ u׊Z[tTE ,?P&ק)OOYZB0/2^h她~TSjUC͸ܑii~tua9[=4*iuJY<[aY&vաfx\uΧ>&0!bJc )g.#WQj\7'/WhY|@#ՠ}}bxNyD@֙8cm\k T^Vw쇜xQ**A`c=S X}!ןڿhCָ,}5$=gn}x[em/qond ik%9.}cאCm(n[>ŧ]R50=Q~t7>cUM8QeQZ bXE`oPVvnz%S~$i?\Ǐw>4(Fnm33&ό3k k(MfW|b/Ʌw}nVg^x[G_v*ɇAvtO=;X8[c|YGu~ٹjg[Jf^A4zVyRk:&bCW053ٽVVd1Kh6_jG~gЦ6",ʆ !VR yK-㴥6 #f̟v4+v6;ZmәKz@o6s=ΕYčֿ%%*BK^oǯ.*J1"%Q G [<_}$ eb峴M^XUv7WDNM_=#9rUc0T L (6Br-|WpIf?+QSbywwcٮ|O|wD{2o罭pؖo{^Uêfآs_ΕG@m OH^='A5ԉ޺G-7;N& BJD 5 Dg WGȯ'Q>]~0e&GN&J(5Z}g:00BjꩀE!bwt~ ?~4fx~b|Gg!۪kOC|v{; 3Omuͯrmԁ:k6[zc{Pb̕2wi}š߱4Dd (٫% VA!S0J!jR#MtlD΁Ibv wTÃQ1UQR٥Zx VK:Ѹ<*p* ̂j-&zU?yvdvh|qh|}l~/=+'ZW87ʅ{~laUE&g'ʐd^iϟα3 }ۋB'%`DLRIHSpD R27>Qr*XTY.:4 5LPD }5t"+2f $ǡ=ES./;±_g `RUɣͱϟ}YtY8T7,:\@( @2VrZJJu='zhx %UBIT kC ø3dC.PoeVe7 7שy5*G f=DQȷ4zD QA%(EY87 Z/]KCM@Z䶯;>vf_}m*kv8QTRnRz^XpwrD*9X'!CŀH ~0ikuW(vuB@L~Y_RP- YHDDJ9JE!TXEhE,@ʣUE2`ˈ#(\"{5y޴&". K0ׇET vHI /PǤΨ:Vu⬊L`/K2 0ӶϔNI!`bjG)ԁ jѫU5X#\x"F#h9j^hHXY#D ߛDC(e $80k>#)gQ2Y56K`ʽ5Cޝ8P#K~"!k)z,NH*V*Xcox&LW+;)NvF*Tu;H3"H(ΓC\>l&p E Z)[KTk6NJ̡ЅY( h XDLX_ !bbѐ M#XbȮL?0ų{ kI%qi)Bi(@h ("LaYRVUbϭk-t;;̭Qblgќ yq/A1Mi3/)jV[o㲸C6?nfp,6e8!h|K*a[Wg;oޒ"E,i* ?sV7;眫tk<}Rh<"*ՙ%-%4ϢYB!h'0^TY7DzVH)_l##je"Rm'AWª UMĺk[\/W,A #1 C\!dRp lxSq ,Jq!2+)b ͟pZ^9ib͝=q|;GfJL)<@EAH16je!aU#a{RL** ,*,ZMnɴ Sr;疉vJ֖Bؿ^)!/Ȱfpٝ)հnh&ckLD1{mW ?0kL b\E5 ֟,S{hLs(@U=n5Oﯮ4v̞:sݠ񞕽pTe/b뿒,`)jN:@uX4T)J*UR z _q҂VJnn9cdSY(J/MR E PP 7ND9F# γYEԋŋ1(Xl4˙ˍ<Q ܙk,/^,aw[XT6%3bE&sBʩP%!DjEaz |WtQ!r~fM,31̈́d8& $ J5dw"X9x07D>-Z&%Εvg+k++띫r O !Ajgִ4`6謢&qT#Wjـh)ɫ(HcCt'QUK"&xp( IDAT=PW_n8^$rÞ:OndUaaSn _G/^ ,EDX3{*GgjUeWz+Ake8tZfm- `)= $ 7ܧ0HJ*$!57>=}AM>d<u{1x4vªO?6 v^rNуێoX֌h3PFИL"* N\:,e.w\p“ F =?=,Qs;D@,=PHrʫK8N_#9NOb') KLsC~ si+w7&OsQ(L T1{>{UbJh-o9$Et'_+.~4 Sҡb&F!0 HYD Rh5Dv)L4*;IkTh^&K*pk.y0%"2i}.گqZz;sW0VIa"$Z5{5GPaBmELnV0" JX \z8!Mdj@tz P+͇?jibQ2k%9,?(KZ @Dmvn3)v7\63`E8Cp} SF8_l)^şÇ.*HW;XB@}0"ŮU+RQx{޻ݵ-5_jչԥ;XּΥVMQ/_D%Xw h_7"DM"A4 \ıHZwuNGJR*(!֓DuXұ8h[ϢY*^yҳVi| j2:/8{x&h6Zh7[0sk!32@ o8xmTޭ1שi G*-:uZ/vC_Oլ`ՕXt%Bo1rE5[؈:گJǃIr2pNA_Uܯ*TNKPyVD˲k++YeumU;fŬ+9$`̴ٿs_%T+3= eGKZgC Ckzop%pI 0z.懸Cp^tu_ 0Eq>5Ok| "‹jD^Tޠ^xPz^AdkY+y&yY= *ilo:$%=xd {O笱~Rg6ohփs+MkL13[5\lIi`PDWz"9# n")dDO /0pz7BrVkt+ AHNXħX| +K ^Gδ-XgGdo4wngRI"k XX;.N4 Gɮ<ӽP3vQ9 D("ص$2tUPIQ*J%ʎ# t#ĐbFX.}E6EkBZX0C&*R8h1t䩢jᎬCXº=+ "< *U/P㊺jW{xIb~-nuU̝9iϝJH$e@0$O2, {8Q&"<0fQnV$8Y;ߢ^o捏W'r0,VA3O Y5w\a'|/ n n\ S @C0IAZ˽4s6kRzҋr,}wñtn`s=4}@{@Ǥebc|UazPv?Ք'O{[6[( vݷ\&7 v`\|yX`Z9 ^\)VgZ/t6@xdįZ~X|WUtZLw]8|yoH- i_ 55%_} @00 UPhHHS#y#BNFzN˯|֝k>aMXY XPQ/B5X7N/d[$3‚>pyhƌ LʀJ ,A:)Z8 leN+g c3_yY:?;Ksz[zm_ɗ7ݴJ+@@dAuWU+NUL\KjR~;5Œ'1]!i_^ij?P"!VLu٨YCRl6X]12SPf蠇2׼]7M4 L|ȷqh3.`{@uZ"zQ'X?"2C#{>֞"X4`,@ -j9ܹ|SZYU^5vj2w٠u7x%ʯsx=? /I#EG@TNm$emUI,GhLaAA  Z-XaO+RAc-(g ʩ u 9$ @?z"n `dƛMLtĀ!`H &PIX`<5 r ,& rÌ߅lxНy{š븁:cuM bD/RDDx!pQ@  haɒ'CL0"!5ceVMf:TX2 YW6$0DPʣ36[o6u[6xc'c< 0Ā(84CŅa x4Cw]q6(% V.{vδ \lgD:i9 :=tdӅaCD%_@Eўrd(TqivL!SP"gP  ,;ZG!eE%UJP1 h+t<ӐA5='`fvf7DTP8DG4׏P)$ilۅN!Sxʢ୘̨1 qOIT(ǾٔT fKDUaH.1`ѕ ծEWF 04@01>\xN0P ? ޯ JK :PTOo[O@ erau82SΣ$\G+' Ĵsg݆f&z!k@p͘*_IGV.?.f[WGڦ;vV=ysUZ+ʐKt:PnA*L4tfڻ;>ۯkw3=E^ B| !B?I~GB@|@ RC1($Lav~9{qN 3[*[uު~PYH7\_:n<:P]? -7"X* 3v>x tq!zɍ\6?#.ʌP3<{3{3yӴFaP%Rgi`ZJ1L Z f 7"E~ca>__.k4@no]_~I_i#<.H=1̮4 au\4 dZc)l%UIDATCuDC:c!W3-dƀԹew D ÊĞ?;έe%&pJ"^< y> ^on8Ҟ/0zM-^<\ngM+3@O͜4^+)g>^æP xC7 KZNCVJ@A(5 EP#f~ᥖ&;`To |<1;7]~KȚM~\=ܥW=;"@^dZo=24nj+id)| }#lv  wR`q вt#t "6CM87]l;]e /84NiSLɶN>Z^ߺ8Qü+4b_9Gdc{+\_D Ɉ"@{Ilf4d8zȊaRv]M ~.^i%BwC!pg&Xp+'螽[!|qe=:L<Y>s%CQZ}D_MRv@QB+G*{Bya{qw`[㗶:%zu`n!"M['O[ZvnQB,4H }@V-\,@ lvZuojiQN i?QףVQ=Q k)<׻qgcճo^ A4i8z@RhOnK| |~u[Z<:y?"2J*:R/@9?GWݾ#*:BՁ; BC;I(gQ,m_o Msk[_T/e0AwfH,3 -KO!{hZs1#@%PC%p; Q(r>6UCKP|@0][97gwg{_=ߪz&hN<{O>;'?v/x.-][輭LNsl (+?Zh͍_Zz9=ƻf@ \@v_Vb7aEk9x?5'i#%KY: }oBXzgG.ܽ VDnjcr9 hb;@_A6+d <'#?sPD eհ|g#ߢà[[o9N}`XOm HPΥX8gϖaH3$JA""silEH!TÂ*UK%PM&p@9)LS3/NZb0殡NAZP y4\;0ZeBcx`M+ Pe {p NLhd=d_lY|0|7dck'/}n~@I0)Y dPqJy3 y6bHBPX. #D* >Tt:vfwu%R+g|ȯZ*Eem`&U3}HPA`20 h` P ~yf+ݹyBUUpΡJTU5'wvӻa6 "^–[dC B܅' L(e !ѝ%+:vca}kF&esӗCσ !vv.퍑A@{^n`03 f"Ȃ 4VK5l_ޡ|WUEY*lZsc<+lip7G ĪS-,6CALqmO\0>Ai*aG0DgLsĢ={]2f"hgC+fӼdp74J~Ab= QOcGEs(,nR Kʼn#y\ pv [@5((Djq@ )046 LR "d+ 25,5̲e@`̜&C`Y8!bRg)E|X|TSRbqls`6/ u!˸52F]x|ᄈozÃ_|/ ND}f.1EeXAƢiW>q}W @*n".ъ$"[q_j/@@- { @b)ҜFF1sfsKN6qnU*jT)MCa:1^DJ:ղlN@TS^zw|d3ƘrQh4 cLy/{*NKsfVE~"V ~dnZ5c44DVnMnsC[69̖,ɢZ C chVcA #EW9M6ԋqw֖\dYVcJkm̲-^wCS*qHxLEB*a[*q&TPK(5,Ffad d o96 Ql+jn@#)- *"6Y961qONI.˲ @eYe)T2˲J"*fi)Ce]^m(6ӻ?<Uena\w 9!n9"3DDL{?St0L;IcLPT:Lo Bfk}||^â䭵z"rDT˲b抈*cLeeU]pرw[Y9NCC*ᤊ`R%D!nfɚhq-&0$@APEh-|dԙ7<|f*,9j`f1cxcV5{*wO{JxJ80"@-Ynz$q T@d(InXC52&JMYnFXo43S/m}T7=ZTժbM U, ",,+eKۋҫ[c2ͱYp*TA aV%iM bAl"{X3e\]zC/ޱh4Z#vבt{/g'R蛂)Nя>h*#2Iꨊg>g-4Z}NvT닽s'^ 'x^:^:^:^:^:^ߙvDTIENDB`netemul-1.0/images/refresh.png0000644000175000017500000004140611261705352015517 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxyeUu/];ߚzfhfPT6A% <8b4>s&3iK%yjpl8D#TPqF 4<|t^}NnA۷֭[gM]kM"/Rxl=1%_)/zL~c KG<t D/"RpMX nB)M4Ex‡~~n޲}" SEx5DV V3h3AM $r>^;DG?q[OV[8.jaM@IX"$NQ k=~=~wDtǝԣxS[W< X+g@S D4 A~=s<R7ԗ4sB6oٮ\ #'(_c FVF";CzNy$"~H*|s뿼P?Xϵl޲7<҅^ q_=}kE0Xx4?cڏ-;s?b3q.A80BF|sϽ-Cf),HAfw,J?sԎ9\xqFX sz |?{ ⍪XyϓGQ[_/|y/Ais:@4zŗN ]z`恾\g-DD`"X43lܼh@o Wϙ=CE4=T}Oʝ'.n= ygx 1`} k@1@ L!APIuntK:443fFtQE^/A_&T$%DA~-}IXl޲5.;> ;w UI=}K U+7 .We=kzhfuknwLCXD90/TOgT{8+-7 ,6QFQ!J+~j%}_]6Zx(&AXy%q.?8|Wv^2Lu#W99( my=*-ۯWb!§,C7.?rP@!@>BS'tG ٨~ଉw\<LGDXqA.T0Ja#:#1ؼe,PU $+R,{ȿ[쭀 U4TZ@UhFT?̵Cf+lf@_h2# N@X}ߜ~{{Ҹ׎g @U¥a}FeʀTZ@  }ݼnU~}b-`f0ٸɃJjd>Nh7UG 'N> `?ibHRڨxYMBJԁP@:XE  .kk]#`nY7x>w`@^;5YY0H>48%pXI>')}>Y `T ;ҥ9s08T6B3B`2<P4OysYz^sҳ 3n< hƷwnxמQ&,h!MbxOO+>4gDH!A]{;)JpR7- ßYye)#A \#%@8h~'|x*Bn[%hZaz*bin}g9T~qYvβ}lxF3 S[7rՁ8IdBBP$ y 'K^c(>U~7v~eå@a{A|Æ$)l}ױeSI 1@Oy3 w"W]rk$"?c@=2XD3_HL k_:~xо"P)$ C+_vp[A2(0LO\~hA7W_> ]4Ǔ@| >ha m Jzy!'\?ߟ}Z`NhdW?Hз?q fuBp,?RTjY-,6^6{gY_VUVHK2O yD SVhmÀ*Xe,!!Hj]@ i!@PO;i0 ߿`$QzPZ?ڋ^v:%VSWZO{;gջGdmX@tM@4楠O9Ki(؆9>LJܷzebX%M$ k9@5`@˶gO؄"[Z6a+(S q+[T2ԮZ^JE GXpy.rBt3%%tƚү|h@uRUj*x՗zh+HjO%}XDž8N\9f?Gǥ_t/D#ՠzP핳d˰!zh 9\sIJO[Fn̻&"4H0A+|Ri]@ Թ_w)*[J%;$6A]83D\{v˦)PZnj M~o*"Q! 5P}h-T*D|yBe(^KFmJdY5,!?VuaF=8ñ?/*ᓉ`K87}^唤 1P5@W> Ϲ`G}iC #G+vS@Й[8L,bӆ)(5R @E,yސq#E@wUo:_{ա((k-HBH* BI ]4ՕM#sz\{◠%gXTb80\ݹiy[.zӄ>lYW U_R J\_M#XnވKNwwڍ\;:sr;95Bb"|1 Z UboZ>#hFmby}c)Tҗ"foOm|H.-di(Lzs^U:1ՃAՂRKkAii-(UBD8C7l@mo)qB6Jw/6JP3_qa݉b4 XP\ Z) KAP uwk @\j,dԲ_Y*S;/|/C(=52$·@R:[?>.Zls:1PVհX+0$ sM 6>l=;&c-$BEET TP)8_ BE,?f߄ζ35~8JЖG*5S z@6 <=u b!;}uWnx1]x zeɯPK*,r(_5P\i%)@[%4&;C{g@TR RPQ"f׍haharS50dcwc-4iB]x1$rEs^$9) z+6be~R aܚyɉTEbHjED 0 #tw%X9mw=|^ [Oڛ?aYdiS$BPQ)T**JbCDD3El*lL걽mc^6hkYod:|NZw@\!ٽʽSV40H 65V!w5>J/&]8GA8ūVTA_AJ F2O| Xų~q,ru]LDEQR bfZ- ZA?k_63V~zΩXya!]v%⎵byR(тA*my̔5$S\?@t{pT I  !T (_gnWδ6ݦY ( "@X ॆۜ7g~QE(,}bOoǮ( < d;&k\iҧv@)b-y2nbgVLYz5 Ouȶ;|˧_?7>XV Rgk2^x~Z(Y/Ѧ=~Vf'?쎨lhoAQҺ(>u{tX<mnǒ02(CAG5S yX5kТ}ju.\ eՉ )_2NEzy?@JeO%!@΢ȚgzΛq)SB*((Q& ЧYcͪj~*){0+qq,0/}⧓P l"#|L13f֢!YD8FLw={6=}7+Ƌm@ +0W߯@V1ߵfQ 1>LF:AVpLn7F))>1J) D@,`!lꡨf P@T+OZ۰z=aG:RFfKxH_8kɆaI ~^Јf=ye]jw.\`M 6qy]+`p'ʝлlqVZ%62q߯^@w[gI|GSUG>D)@AHYTvމ ֐?Ig9\oF6d)/:@"}}˷85K݂@h4&X!f.PZ wol~weÅ7ƭ}V`mwOͤ? FѦ%& HB8eܿ NBA:ĂD9\p`/}  ,,[L-obD&-S@e׎# {y`̤5C1^<#|m^+:fh`1kfhDZı&:dL_` 9$zêv@#'|i"۳G`ALc_ +>?OEUy(m?P'DEFI-ܡ}Skͤ3C[PE4QZCk-L:&֚bEǚX#7伙+vց_ݸ^.FjWhXEpܿIpJ0z0e`P;3O+qq y!k!Ibbq"DĤ&–7f3/||xmcKBGI;FcM]챘O$>v‡~,bk9F g&DhM.j1&^wвCe5{ ?{T9 2q1H;W tM+xca4^upcR# ?hwYDD 'o8'߼d`4V*aRi:(i$цxJNX ɹw'|]Ljc,O ŀ<jDYFqlo.2#ePn \,șy@*40<ЅCT l=y痊ATq1+@S!3,,<ۉvdb3Lqft.! 2սJ!J K^"x'7·i~@c (ILN1fD6RDXa7d.B,w}_x3U'{†"2o f 0Q J@_)"H8^Itn n$VtAA46'!.O5(B"D(Pp+|K~ z3V8eqioY}D& c٫'lpHlv[2{Vϝ:8[xU|XjCAV1&XdxDv+g !| k`nFQt9oU IDAT@XPdX'm@ymC)QS"c9~dsy**vtyWo9cjDAⷋ廆¼`#@(K?hh-눞A_IndX˅"_A)RPpO^gbw 8x }4a'|rl;$Vɱ3p^`bqIm\1k0mm]ºj1VO>ctFqI]U z:vc#f>` rx IN<7щHH ㌛7jn[Rf3}IH:\cRF.dEc2OlRigF$`;gddO0l ȗ\ҏ;`Gܟ{{Hq(y4m 5T-P)Z^xoH843qY0 XA.jGWlpPf/6sA3R] O>7Io־F!M8F8w 3)!D3.NIOy|/5:/֛ICQKR V4}g(dM;]wT]kr `yyoeyyO%7h&9!}~d@?FiG;ჵֱQ֩u yh>غ}@fHܼX|#dLI!wH%zud /}܀I*8v֭/3<5ް*Pt_Z̷CkOz[Wg2ƾX_E܎Ye =Vd][%VЋ#KaÁ'|Buܥ,s#H=g z=p/UHc<ЗN+ # 39mhOn㧛kԿ8pA:w51s3s8и䀡fm{ѱ[MzkmcaPH>q ưJ %{‰%}]vU( ej.(u2 4 {|gDjh"y#~\P D"(5R*V'WRҞ~OȶKfm6 cѢ3g8Flb/(ֱpl= ĥw͋+ A,9?'HzohUg,bxFѹi #}Q0f'F+Fo:FZ)i2ǹ,wq?\܇*bC{/ B$Ci鲮$WTvکI[ݐ'7>[&:KmfZC1V _ yD֒YW~{H_׸dϠk"?ϸZU.`Ӛ«֡?15K!0Y|6g@_u$BqLܓ\A#Xן0 }U*T @9I0ȷ"=q^1u|SS11 8c:(E3SǦ5 L7_C phyuuM+&_{-O~7kw{#-j#~߯:4E8 9g gwtya )p@mJh5YUdd1C+GgY頧dڗ ](ܑsG|cSF 3ZKGc!f3~Zā#\txTmt<3͵dۺC~u+gz)aV1T️9CJؑd|d"Hdô>;ؘ:8>j: n+8ZxJ0 m$}>eWoȭ{.;'FXkx65b#3 <XeOx\(7?i]Q9VV ]VfLp'd{P8~ ("b PsIh+kz&@&͑N E=aI.DD"w =mC[OΜE)Djo-,vY¦@\ѦFAL)ډh('PO8kڧ67pdȞ DP8nݽȞ rn|֊i_{Y'mʧz Fy?S.f]B2w@{j~tu3}ofj19+%{ٵCi%ejG'C TŎטyᰧVx|nX*ctNvg+@. {}&ZJX8g0@.׷^27Ac$&!;7iB fhOܱk;n}CcC]d*ض2OM>8LŤ(D STB7lj?j^GOmf+Y>j<S~rǭO;j͋+íJlȵRDAQҝREsgs =w5{~ʿnw҉ِka I:Hi y@\ZOVӽN 9*\)1LaQ-dx|>B@Xw `>8t~xx3kV) qXak3 9Ep^!"!]}Ox?~p 9e{w 6IܷRr!m >rK2 )Ik _88z付?΀>=~BDw?i\wBHfئdno1ec!R+5@q=P]5@auv2Bk~嶥NH 3VǤm+څtJ7 Gn_q#qWvpp1lgUZ}X\`#(o9p;X;*}ibc o9oIW$\qT (wc >`3!M\t^U?Xh%y["ouDD 0PqE`vM[?ZX^#vo!N )gS c OMGwiܛ}o!ׇ&:~:pw\B^ B#iL<+@ {j`*jP)U,jZU%#QyHNg]ت灾lOt=_r)7gɞ|ܷooq3nASf q˦F(H/xګ,ER*xKP)u];=Է~̣YL"=ꦅRψcdkH٠T Wկ1@JA_>ϓ!D3i& q' ^E{8Ej#9 '`zS>,?I3f8"K_-^kɩ+a}ି+S^Wpð&8:}~oٓ"LUg|bWNŸFU]:6TnLB.p?[{zk7J|O&{OW6^HRt( PDa@bꕲ:w*ly(yk !UXm?ٞ}gkoWDmTAP }KXDzLGo\ndw:'/;zÀS :n?E vM!cizM@qW> o9̑ ؑED@( T+]sLXj{r $G 93H`nڎ{Qgؽficj69Iq2=S,0P\WȲy89iHI:%]gM^,x < tDw M,~5T*Hwx2O(j`Ic\]uѼJr}ȼ{-_qsܝY{[K~/48̔q)wINovPJ \յڞ/xP2P u*1zNH ӎd_0Qonܛ7c>S"|0g;_㸛fT =@}yo6G:uv%Hxr3PǽozÑV85uJ~J~"F1d߽URz`\[Af2rifA*/<|GmO_p+g.侗gHjwZ.{Nf y;[nl< "T]佷>XO&_<[LE.=uf|Zwú˱&'`*ԮY] lhSEoqzfOg,~^y!d~;t9l <t4ݝ.iv1rq<`T=_rDH !5HՇ.X}W"-٢ܒ1+er4ǻ&ZA;/%9/(C|09[w!k5t#\w鉒 U8U}4?hXBLK*|bK'*Y%)Ãw}Wm:aYlr%@a$~8l \wPUtyJ/jos @lVԓ~y1X'3z$=sc?)׽Uw[q?)fv٩"`**?e/~KCEAN׺}uZCD0X~w_zDl ]gX#|;\m0qLzƆ.W9l/wa֍Gd:zfNmb7qeuR?x_ֻ۹52 n0茥c']]7**Zl/{U :˞ջEy|qVoH#fvw,]so}y,'Y`˯ t6ݞn$M~i=S$5Hg _m"Q;Ne:bn& b~ C-_DNseݣ=ՕV]w垓u3^򶿌JJ`CB@<2-εr^+_۴jr2Po@3b8O|/ tWvfOOw/k؏ۏ\13^^M\CNgx5,Fr?Kƥ&V~Q^u٫giᄝrW4Jhu!_A_÷ \^8mI]2ב="vѻ7<2y|>>x+G?ffGێ,Dyi0kΆW_S +f wBsm/fwm?zݱZ4Ӥ.N0賓<}3]/>xzۇ֭Kq?_=qعRvcݍͺTbeSP:kU#}XJ+k!τ2D;Xz<3?/ˣkWyBcYhv%u1Ϗ=ͧ3մBOě |ywfBQ}kϽGIV{Qw\+[qsyE`Orq?2qo})]^4cA7?~4b/kõ=g'zVܜ>͟G0?c}@8 =ҝ%+?ߵKsGZp Ӯy2innܲ!`^lN 42V' }w}8 oX38j;mQfYX!(T JT١Rݿĭ`?Y#q^0u DjD3DjJM ?ڟd_ xl-NȾ/zL~c KS_]+%GjIENDB`netemul-1.0/images/cable.png0000644000175000017500000003614711261705352015135 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATx}w|TE3lM$Y !z 7 "*Xa}}mXQDE4齷@ $!f2?Bx1w$gݣu_軖߻!IxYc5555UUUSNUoܸ1GæߣWK\K̬  Z's1&=X98m۶j 709Ji)sRIJcccSڥrMzҫ~Z" 'q @@Qu`=/)2 㤔zXeY.UT@* 7Ќr&!#J/ DInƻ&xPFo]J)R]\{o(\c}riJG.QCX՟RN"߁4\ !w9u^  Z~4𝿕),!IUaKiRJTjoH0iU\ځz-!~@N{ }\&V^K־?`KmJl҆G}z.aKSaX~ W 6\ZpZdO#xmGri{DeY.FkTд* $YըM@Iϸ+Jg^h MC.U]܇3HOtKU VWWKUUU #]s8k0˯F6o(\>1qЅς_۷o_ӕ͜0D `@RxZ\6 hh[ |х?qav NCTaiZ#\ }G>@L>*nn'"ːzۓR ~p&HZs^͏ZՕbc o|e-~)$`$X`vhTbH#%%L95/uV8ʭ 8FȈ6ٙ&(60FxxpWp#q-pJ af֢"M epr.gPȶC&@{Sc7dywK cEV [fTX[6ETrqC@~vUـ& s\Omoܾ~xVMxQľZ|my~(a-NW}ȉ>43yM%hc. m☂L[db1w{vm=?h} @E/yjοؙ|=\vS l1g[ ~[zP;wmK{ƭ01~m8mt>@L<-Deg$!E!rxQ\9;i!Gn XNihnR3#?~Zᡥ\J~ubN__''wNL}R"vfl$ ԡy4"%Xg|2Q Le q|q ׹Fz~= `c9˨~Yp Ӯ Sh2??uԔq)“ˆDjU>Ww{_|c޾b;ZF$xAd( fJ9UAI:փZ*Vrki[CeJbT`PHKQCliٶ45Pg)_+FK2RC-f\[[`it9+$-*ݟ/+;x_StbjOFE^t ;mwDe*LdArp@Y4oKY&U8W[[Q}uԜUlJX2iz=n7}.}IqfBn{5k/]gʍr4:d9.;_\mo>|bf0a^M3slG.b;<6SxAG06#B>-/~\ݣjcaT(K,u,TLj/qb}jx/lh#È%I';{/rټ+(4};kgKWl*Y+dq{q__D\.AႴnsT 8֡>@%-*ؔJEh%"I bMj/D BIwQ$9 &SPRQ.#ͯvH'¤km`+M.1\Asl ۷ ӽȤ7QxïU= o{uCG|cL+1OcDo-@ ?;k[wWJrvd)~HrhcD pܖz׿cNOlŤk*@onʆ>~wϝb&3@k7O27GV%["uL^K̡U"DF=OEkX}GWOb( 78 PQxNDnS"N PvR_ ιM9XL0<`vhmnM2NZ<Lbo΍,..-Ew(?O~z9[ϮOo⸻Ս y iY=[E$,݅ !6CQuU"( NυJ5&;(H&FerөY % ֺGyzRmchO܃m[ NT10){efa^FҾ=ɲ Ŝp {8QU+^0#tJ ȼN,ݹA;z%zV'W?p 7H( ݘ\\v<ŷ Fj #H `3 qElA#OleUo!4\w(ݻXMTP|5v>%}K$_y$` a~@MeUT5=Nyß!oPr.Mkv:UzXB\ሪw|>bc@$#}{7} MkUXΕ9WMO}=8w*siww}xrD@a}Yy>oG H9XPb7jcҲxFo:q4ۇ;oC\|~wKP^[,4&=Z*s׾CKvT|KyѹI ^y{;^I'2yNQ؏G֩$521:шsR|olibOS¤mpDq0?ā><5;ގ^:zzmQ*_m1$9Mu Z'ѩˇ9[x6qa>jH֕ 1@e3,c`[aݽ>3l~2ߎX.j7|7nKL15h͢OHyʒ]W78~PR.%Y5NG=%\ z 9ͣ9Y8<1'^W_wF\~~/~Z̩xu׺Ec%s/w+f|P-4d9W'h(f=2QPP'T15߸{,^旟hj]_s6՘0T}YzpMJoYB1IvGmJٲJ ָpPC%riIH6רc] ϖKEAj8_,i:՜zefmu[1 |lZH@,!\WBkH/Tj l1ήViZ 𾷽oΨU1'߲#o&0fآEUx.³| FxV6US:TmMn8Ep㹩vC֪P_l1GoGnQ Рg@ӑ6oV57ɢHox2ZHV//WTzɳZq&uh߮[GK&-0|0ώ=4X^GS?sͯk08C5ݽl;$΃;&^5GӾ`3﷿>EoF]kvx90?{o{7i.>fY1ykqeMN7wxvC=G}S[6籵 /3vi^bp;sfv7ƒXU-;_țC7h?R`Vڻz;y?zu>02k?eߊ cϿWNmZGŀ=F9yHUo6Vř)QzTӛG݇?d󲍮c4EKl1׳ybǫ*V+6i JDQsu^z9~2GTpId&Gb,7x}2+-f\᎔x*>⊸%˝Lyt8k^%l13x:嬨:/F߄|n3)O!>!7d wa@JWw9ޢ:hD6%BLd]&l=Ř=4?l2 ^WI$Ju~?Jnj6Ry e_ON?Kz1zsHV ԇ 0~ȋt֊*㩞5 Ò-T5JՋ MD{kj)&}5NboRAU#Ê-nϗ sEQf0vӨtJ$ˀ[TՎ m2m5Ejig*nEy3]&}}eNW+>́ZeL:b%Dڪ22GTe21{O?rXu#E|c8]t9[-xD!9CvA9!D ]K^m1+D-Ǐ0+!Lj!Yg8v~T:C(_ b6[p"zqg b&W͙0@lUr$: r[CۦW,{DpyVY P{P&By~|P}2tIDAT~aizj( ףlIoPɥ^R}: M1()WГk[8FNϣ*\*)t!,"')o\ۡ (Gm xTJu9} KF$W5Dz9G(-0^9+U{PQb\*J ƿ"hyQiPP)ϟ22{uB?9[c]Oub.bj fBYgܩ@&{Yhd97g\xP.APԙ5dt`qWBl&9&Ei@EN~vKF} #@T˔VH[/z^@8lJR>~~b7rS7O(d6*"l?l2^5 #@b,_y欈`[ =c 03TG-/+ٕ2`3v;Dd- d>p$3Ш <~nrke6b-(voɲP/ :r~霺}Q*_xSМ`iH ~垤tXh6ewqa4DnU}ChYXM`) H bF,S^~Ћ"EghKk5J+&KP9+Ш,x RhX^HM bn#fYÕ-1" ջȾc>tlse;b]t.$tzwo) !C^s3@9&E9 ]cGէD𹜤¨_oM&^rgS@%Ң{[3ջ] 2RGTOn۩Q ;* CE}T&=lR<-1q~OCOo˝z/<8m_u3+il8\T/`iP~ g8@asuE0g0iŎ9P%ʏN4v<^_,)M2y5{֟Yaƚ4x`!w{bV; 8WΝ{r5^4,#c2' l$-n'J;jج۟QGmA M\cKMQV%up."Rwӭ ͡["ܾ`#("D`PW?-\l1+Ol1<5ꅏ11ÛC]J>X3=PC]{./M_/v<ٯS樠kzS$2"Oϟ=fN #xSo75^gI彋@m'V$7t~n%Z>\}>OUg *puċ@# "_y1]E̟H`(^†W#PJ\QcYɷx`r .9LjoQ JᛙLv<)0Ga,#L'P0 ߌCF;5Z5/uVp|;n>9}m+=o?s͝-ްbas';gQ?W+U ]&*Nrx?I~s] I 2+o+Qċw,T@,m>._+ۄR9Q|f WCү!-÷.eル!\r , hTZ NC4:Pޙ+n?++Vt\AwC46橷wόp-?|dNjx=70ʭ17@%|g: W90f?r64ITނ#'.?{+ZeU?}扷6Ɉ_N+UQ#ݼZ)* x Fg :^ V&P!#c(d ؍f6(g$L/?'XpB}3u7s LI0$гwjr@+U+GM|kF;9QG?{*Xz{Z ^w٩ǭl轋F:dd L 3;dj9xz\L9t1'^|( 3U/ج-0s b@dlNޥS|  #Ro9'U52-?vl3Ol7Hwg/%|* yS}q6j.V:2yt$HIRż<`kL|;Μq-hn@*qsIN-*إ]X̓G'aS%Og/;گ )p)hcVdѾ% %Ex+~8Pܑqc;"׻ 'h]cW)qH=LtQfo]vp8JRjkAK&=ޢ08ٵˇb`Ohf ʉS;P:8CJXxǯ2W<=۫?j幆˵`vkz|y9\}>7݆]vr,[#wtC:hyLO=ER܉#'}S]5R-ݜ\p:^~&NsxVBf%\ˈ+ZG֚@3s$q4:|oG^ S2pv>7mrc剿٠q3XѦ{^v',Z:Xi'2>ռ|o{df^ogxu|M';b7`^\D{i UʹUArnUg ]>zD>>WDLD$`́6]t)DpQ,n !Ѭ?nloeUs"fآ%TV˸H:C cNo[W\:YU7.z4E l@߄3'#W몪䅏x#dS̪An%ו%QU3ȉ\QP"A"`!>CB ӟRYDz`A)VC0]58R!IK5A'#WC*ؙڐ̣gF\UhV.Nr;'S63:5׾Y>e/aZV2ߴV\ɾu :cCWT{_ <#C0rm"XPTdf"-a!N 9C#L =1 ?9-ׇlRK~NJҵY=ϰW d餟 9`zP[A\?0>5z`CLJW;[ԛz^<[϶򽱹j<èvQlL@ m3Lve3QF$Af H,enYQ."I. 5Fj'jOܥi+S^/*;ƀڽ_߲\*{?UIAƝxBݣ[oOg[OA'߳m~&4{;z9~FA#w>MޝkGXq7G wߺBJYV ye^|`Ra?y=óBVuse].u=̅ܺ],\Bh㩾vc p"yx.#,U5j_ۘޫCw_!g~zUeͿM6BJ-f 펪z@e3x` :1~N}w3vQF3Uw#`[c^bݮZ AZ4GapwW}0Ҳ&3 No?fڠ|wg #D&}pBΤCY>AE 8q8 ,kr[C>5uxUUQWM> j xHC5@D͉+  Рwg-2"ĵى՜Z_Ia)M[|\4  []]Xb9%DPʼҬm=N1g~ g\J)#;_uFZYɴv׭, E">z!|,%GJ<ayк µ\RDLjx9c1̓AL\6:Qmq@SǐsɅ S"A|k|:P>c ҉0ZO$zȓ=vk&g5"L# z]k[&'@dWV޷KD8㈖fzp98FF\fun[Z\cy@Paz-NKY>ݣ wi)el1Oy+tNSpãLzbt_N:ۥZ"ToYɾeSnTD̄L'TQF(.s ͊[gU0l1ڧN]``+l(VG4]w:+t;[.TVˤ.'$A<x赵.SGM^5"*s(I8'DbP@fƒ`vGN%fWZPm p%! @W˭r|VW$jBj}R@!D8ΖioRnn#Zl1k`Psu&=;^vWIENDB`netemul-1.0/images/play.png0000644000175000017500000003110311227717431015022 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATx}i$Guw#2ke{iff$a$#?1U6g0`g> Y, >Y@a$,-,"ifzzZ2}?""32+zYstWwVVw//ndx;|<x #:q"M7D ᦰiB"^˂Ck ߾у;Äͩ""ۅNtD !a 3 Xn"?]~*"qڽ]q<Ad!@ $laP߂"&=6?pGDW.:aM~6< Y,`ug zYpy [H+@K׽ٳx/A|ؠ? @x AL0+`3 w<%GJ_."߸ᯞoZ8 'x-R꥔9E}fǦ@0eZ"|fBI*7wZ蒭xpi.0>x? /NF)R(|t;3dPp3~@s_rL~FR@Yp9{y1k-U>*=2 >K4 B~K!Bl /tɞ{@tXWo_ nBg-DD`"X 31lӼv@ kRHf8[onۘ+;8\ҷ¤)"@~"$ "d1$a0tt]t# ؔ{E_*Jg ]vˁoC.`M/8}U4 54EXT#VQMhѱ&(RP aFI K'1tnu[옹V[t NDL1\=T?}רzcn(s?ppaPQQZt=*=\x&]DQ "Aa'5pÒ0#1F:DZZ392S-3p7ISrWV-daA`EDH}-^~:_%1[b&ML Ռ(T D!U2[/{冀`CZ\-V|+;Fyp\JȔE^."YEߋs@ʂlM&EVV*RD@8s%ޙ+n?}A_ž۴LwپM6'Xa'MjSFi⡝Q}S]Wj"| mvwAiEi%ApFD L3 7"jRwKӁG.? C;sU@F ,Ξ,\Zw8"TH7tkR?m,nlҵfEEYn\'|r8 >p_fiR fd?1)#Id);=?_x+\RO+m(4vmuUE]TfXfS>HY l44HP H\FJVwC*r}U!@@'C׽t=cnpz<PU6ƍM5]((8ʮOS><){w\@ bİ C@"DR+22@iyM|nBdozzm]a@#QJsH\PZN W/8 -D $,b߀YRj"7 =LУ BjȋB JW=X;:jOzea@ohE4\Uю{6՚1E@fxiZO[|ڦtH=l_0cvk(}qx_2*"2a:\[3ܒ@zaD]憮4i4_@I|W a&=3 8-$&H"Y/i .DbR'I8P~Q8j{/|Sc5\gb@kR5mk[QSD?y}s?c! |yfSlEwVCfΌ%ɶO~4֮6 wₕD1Đ2JP i(%4{y(Hn/Ltf4+^ t6ktth\3ViN4t5Rq}CK˶Lgߒ c_CO L6y#fG;[:??#O>80F^p" Ap%u Hb [>25op'I(I1llE[KW⒯]C)#{@G?J⹚ T |P6ZSH7.Z&j`Y^F_Ch<ȕP`U'+XbǾ4~ߝթ @ S‰"؇v `q=I\;p KFİߕ$]]l,:fFݑNGݮc=Aeq?G@(FIcqh}#;J3 >`U#VjKSW77u)K| /n&9)?vJk%zH~E-LG/jYSߝ`1 Q&JU٥BۍXՁhR*Va Qt52h@\3;~xK# *oոF~a&pw0.SXbGA: &= vkaMz?~~)C$ k(1DD(ĚbZT"EpXg(lbI [9W;҉Sl*(E&RdΆ=>EM:Ӈ~ ^91Hlǡ,='SDCU7t\Z[||:vphL ) Cb[6 -<"@ jc= EBGo9 }sY s%QE$ڏvb}y?-8Jg.@x"MA֟p?E,,Pa}w]8pY@ ۯTu\б|ShpEDJK?c?m~+G?N~/wE_ҙZ}e_}Efxrowu Xܭ^DGJTT;U@JPį@u![Ԭ)g PET=dxKꃉTs>M;Oyt/\:t@ihsogfEXE+Rk^:/p2a1vhcZjFz(^ ^(aKTde#(Ys2k{ 9=_}e2} a2.A( U"RC1EU-R3IwzsM). { Ёj/4ZNnfޞK*Nkqdax߽Eے%s^S ts3Yy<n<TSk U~np f} #@H*pmŠ8O)>!4xd=SpCzţkJl{i;7yr[88`r'MPU-ʶMg+|y&첍̩l cA&Қ(c#O.#,I4HiRO{6}aϼnHƇu5{V, B]OxAPDBRk߻|>T!4"+#AUxmPB̢qs^(&b6?SIWmJݻneGA̞W oZ T薣S>1EJ)[ D@v Hຆ<iAdKJ(dL R8VϽfs!KC3{riRIrS~Wi)_5ڻt :5T#ۇjp+7&MX5)lodQx+lg/pTH#i'\J&UՙD;_q.!"&g+|#j+})H`t8Xve}ap 1tI1L܉+<\MjAfj5e# F]DCȾ斚CaKDۮV.}[DٝF4{BїeD '}wMK>C̶fk1L!b1NuBD b,3fˀ: ť ')AX6:K6kb}Ӷἁ=KDaߕ^ӖmJezkf[$FRO_691(N=y"[A FFG;+~'QFR#j[ &Vuz=+H!}y}!)Ixid$]Rp|6xe~ HZĘQhg  硁䞇kZPB6 1 ŧ{o@O80S&, Kx$&Y'\Cۥ23]G:ó\+15z~?u@DhRRyhrҀ }$RQ+k eA3?sꃛ=ȉ>̞uh"NF]eW/uY݅l' 1U5e+^n&g۲"(]!PK !Hl6nP~?7ٓ}aAK`!~;G f mcdF80%IѺkRDP^N@ݬ cn(x9E/B n+`tv=|".${~릉R=@AҝaU =x?5- ZDtNGB;⑚kVCa۱"G ]M&baS| w3_z ӆV_(p pi`!"Mɉ>C@,=ǫe%A]LEq#VQQ:V+"4XSDIY̽h@aFEt:K{fmn `fcu/cC _~=0dxїܞ R+ =Q@fI D݁j`bM4R¤ Zb+JV4*ԬgK R[BlyƁg&Gmyg/}=Q43B ! shA7n@2P "Nk bRTPQ*RHy6Q圾\T{IBg\>f.fhcm.~X7ɉHϭt/9k1}eմQH촄@$"Q +nwYtYNÕ#Z6|7{f}!lwB[6:Bm9}Wj`˛=9їA;OV ~|h ~aóO(h ߳:N"Ě"mm:&gҋ=_˂=ӶIDAT/8JB7)">L%͞2W H@᥮҂Jnޗ}&B/ Rirs X(IVJFjUD$Jh)6;lr}gG1/5-e;! e=ssZrD_vyNQ TvP.q;""vJFp ϕs }=GϬ >LUWh뼎,聦 B7{r/ w=Y0+~oUXbDi+H,jMpE+U`<>>k@7zq/v IὈ֋?x{g"q3>M7"@[ D_89u~늢/CaSWt@  3ZmME#&cQ?u=`kt` R?\|UAbn=3$Ms#EAч }n?.Yf/=Y /-HA-_ƊXD+o Lk@1- (Œg}K=q}oov9g u7{;ju_K=}sQEY”F ZWI0eZVg[A,._|eϬI\ONoG=Nʦm/AlkR.oe:+)Q6F1hEu%ƸS&NĮǧx;w]Q{?xyWd|?wOe( _k0{|p nn:@l%fO/E_H&ab10õvi˳^ع mB-{ry:xpO/j~Ξv[Qg}`GhDz=nryP8tcSkUG7o٫5{*a@)tc${j"sVǶ~kpW!r6ViE_:H10d BwL /m;{M ;$𢑳 '=+'+2{2Xم-^G7q՞Sng=zx&0. PחWj炻ٓe@O<:Oo2R(:쎚{b7hdrly`gBspݞ|'F|o -/4oP'L٫4{zDr/ji%!u;xBN:\`Qv9Ǧ|\/0tG켳gzlT!i/ٯ3էOէϵmSOw|*PٓX*}/Zy?\ 9E+;l> ȳEj̞" Ei$Mau'/sr{/S#%[$TP'Z3C(:y>fOg h *Ip4Ͽ3/,}yq~("xOgW.neD\]<{N хZr\#wѽ[[_ab1"& HӸY:? P yrb*Ћd2O/rU,Hː0{_HsNtVھajT:%$7/bD8TFI Pb[,.EљږS/^M,Wɡ׾im=Yp6gErfOYlggb\Kq'6,bL"0q`.4sr+}`>1{ /=w#Z}[gWUQ-ȂKERG5{3"Y=2lsx-{ygїv)}QeT sd]7MG6kp;!Yٓ8_t}6I7 CŽxa .^OH>_`f>4wµpMϾ2{R"ȟ;-ܹ!ZnЌO,3{cǿns/k]g& a/Ȼ~tQH T\RHa* ޫ|9 i*Tp9 Qb{/;=ح)'oCago.Kg6 (!@ZxD ϻg >KDt;w(B!1:7M}Ҵ}DaVɃ67{G\z?~zm7~TOf=aVE yD;'/ >]WgK~*j̞bdi>Y =n) 9~?4{;^qzkůUQ|mnR~4_}!MȋBOA1>/7{zx?\*!Զ%?ecCKI[3wp'4{"#XO';'ҿ:<+?[.16p\ԊK.,k>Bz2{ !'Szx)[wY}VEZ|g^"OqA="ﯶih9?|XeC3@8nUo#0Y{y?G!0{E_k2{sHG^roc8 ݹwp978 1U0rx?Kx4;w;{tcxf_t?cc˯l ]_˘=}VN Jy$mo{c~ }ݹɋĘJ+|!WzgfKxg{aߣy_HG]vw? 8wޱ;7gfqEї][[Ξ (,=og?gm˩75N⻮:;>;sӞ@%{2ޗZ{_PJ͞y_ׇgN}[~O^q;Nޝzuwvᤞ}RҴ=g| OE_nft;\m?K3N(q |S8{qwtzyΞvl)xefO_,٣bsVF+>0Жc9NH7N:3֦٣͹{?;r`Cݼ~Mӓgv>l/*ڹQUKLub M'?r\Ň\q@8^5dni#n:Qspi~q@8N¯da\ӚZJ=+}sDxx_gnwKq@q/sui/ɦ5N@6jUTUjj_~x|o$1ḍɨ3 AY"5"5 HE?K}/=8N A<ǃxU1IENDB`netemul-1.0/images/computer_fw.png0000644000175000017500000004101211230253336016400 0ustar frostfrostPNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxieuϹÛ n4F7A8"25P)cgVWK.T[QJqRqTH#DHHby|sZ_~}ν daty5}[k-$xx7y;^ f>{F#[Qn'ty;M㭢w۽v v+s;H +BY{~goy|\> tMhQH=Q EhJ)Q )BBA RT tB@S )p31s#bbfps8 f)|tR(-}{ jsO) H0]$8 BwM.tAPD2҄H7I`nb1c g,)K}R,xx=Ug;~( B7a"0Y^WHq@*D "@*B*Pcɂ"n& hE F@ %h~D5H^{־=s"5Jz@!"""P(JOzB^H^@$M\.Qn*A7kL8Tbpޛ{y(=U xc+MrI!(DJ*P@ **A".Α  ]s8qW@# 2kogYp񊍷ﻗb3/]|"Kx D J $@(cj!QH!UEq€d.*nwE)$B 8yxx@   zJ "  R-M<"H]2RUG%'ɛ'$BDr& |Y=)6) }B+zAZ@B9`I{=a*. .ڪT&).. AJ%9:˞ʥ/6RfC^^o3hy\P@J*UBRe D]}x]B(3tO: Lob&KLt{Ktszgc| =SKkQɼ*$)J2 Dt/$hms3(Jb[!I" )NDNfS9:.~,{g/!tI= H:Ȃ)BRhBMVjǝ2@$Wk@QI8a悏'WtSŝ4̌f3lDr xB'b&r{H?PAuP2 BJ_H"*LLAIud`n [X %IfbtD3tx,DBzl2ΰf$n-$8h/xabȖ$rDBHE@MNi R]0$pԠZBNXRhp0w=Zdh-y-|1 - @)RA0,U:(55РB!PjQ$1g؟F pq8r&' GPѝhC#c03% HrwZGvsAhT/hx* ̵O*%#WstT $\?&YiffS7iw ) ,]Ṝ  :,$ J BàH!!O)Zh*"9H\L }HM D)3HӴ?tH .dEM[%t\XaĮ171+Ox8WaB)Rh_B°BWH(%B YE"'Hok H Ⱥ}j)l|2Ӏ{Uՠ#A#" Axkd}{"oӸ+0O9e ~/$$G)TPpQ$%IğH~5 >0p:: =&g]7hnKGѓf p _8_ <\Q [1IPwY@ YcZ3  x~g2H#judԬUՠkih1:izƬN,*@-5{ +4R'z'h}^PM!ڶ؃l1dLz$ w$Ѽ#ᤪ9*fԌfѐ:֋[i|&TZ^i_ҿ|L EP)RGфޤ+N$Xrרh5I([fz^jJ'TP"w@:Y7 I]h"_ TZ?xr@47(9@T)fh;. \oY5UIݰ#[9;ψ&{@`O\kc|vBJ^^ff$(ތֶgc ;&̜<rFɸQG󪎜5Ǔ'Ats33kI%DbR7߉`vt<{~Ϊ}NsmBSf7V"( Dt&/Ld!X7UݰNuLu3{AwC@ܮ^^A AYK%yб>iIeL_ÜludDꆩkn^&wM=Y@6V9tӽ,iSETsA WŚ <16u<@#ntw:-Bl'~nwxY94614"R U]j xHJN$TLBNipKVbyE:hL*b<`]2n7"sd54r#`S~;Ǟ+y[,b >hZ;ˋc> ]jQek. = ؾ1o' 0ZϚtkh vR-ç5 vm<+a8Nћ~G/0] #=n%kYmoz!HQ)TQBzBze!EP !@R8T!E>4"2Ռ͵91gJW G' ?-k]<Ý'1hRzB )+/ԾBP0* ( HBRa \iaTEBtL h̭j=+6뿙}śo鱷 Kz{}൩2Bmva8SoPN $R`bg ! D^MfǛi[uUDEi9]Qhҍ_iA$HP0S@}F~MKAxKQ62)>u3{i+Uwk2c=J)!m曔yvP#} A%*✀FMzZa˝tyiX ƓǓ'f6SV_Xy/w~|J ,W?Cu؏U ҚL+GOX\Io/|) 0TTjbbXvqץAiY\|Kj񲼜!âhԣɗ8ח~C݇'obݥM-x&<a5JgM?㹷/˾[m蔁mx+p7$3}haIxsb]'/A IOE]8݇g)b3@ U3GPvBk۹)uHJkm H97y#x)mkf |{6z)_xc_@~W~ C^=E>$pԺ}ʧdNY1#B;Krђx) ;v@(V 8GBo o<Gʏ>}۽?t| :@+p6zg1ldy&}3Y{`$-TpgBmd㭲5þ0*t]&gz~w{g\4ꮿ|NJ& 3d㞆F1%fSDO59{Do#Ν{3haoJ?8.N*-hmx_}M_m^*񙘚,3]ol'ഝح[-s(|i1/U>pA>̈~xS˯4Ouv#7fcY| ؒoz] r{)S67ڗ+[B]J.goFEa:.į[_j/~~K!f0@z}D*bط=0_-T6՟w+oeUHLIN]n S(g LlǬcIf{0\iN;I .;Ra}uᦻUzҹCs>l=xMf Gwe\E@?ao; y|3c/@{a ֆd9Und^^ŻTUL%n93HS<Ƞ;V$a@^ԩq^x}3K& _ >'0x^iK1D݇5~[X@}`?\n'uZ("roGP*gnH3skYT(f6z^>0V:KRo~3kK ?lN\?빎n71 kbGO?sY`8̧9 @|c/=Wxc/IfI.yjI{mfѝYj`'sX*yn^zcˏl ->zaiJqߣǵ/Z-~OChOjW 6@u@/}q4+ySy<e<ԸZ@w9>4ymDtZi'!R#꡸qR ȁh{kz4>f!c }!$ ;y}\ڪQL_ġӿ~>ЇgέiY|p^qe|ymDɭ& \ сh™zY8/{<'Pacp$ 8q7V{- SW๫䋯.J+ @rGc/b9DXB>Wpmk ihsC!D7\ڪ&O?Y$pNb -sWlqLxN`|X/p~fSODKV5$k@?nӼ3I_|ISZ4-%.2Zz,Ow Dr``N,eFv5g?qce} V X]qi9N<h0".xX=| &6 F`*w04">83d"'^:Y:_jܗXO_gk[ .Hӻ0XA {]/~ g>Ҟ{ 2f[Bk]MB"e& HicX2kpk_֯I5jCn#c) ~(A#oXY<428MLV,,-hC(agO,_IlPt[ , u彔͝ƞf7Dlw{6Ds2UbS?y+;al0eQr`$# u"-6sTdQ6vhs'isHHaϕlf jOnOdn A~ Q1Ј#se@svN,jKN x&@söow)l]Jet0VMR('tIJ2^wesps LoIѤ~[bRhnSx"hW1W]j&?؈Z?ub/ oI0Bbypߟ+!@]Z#9pH &t9G zYbh<up?<_i/etS7Z;uIFK;vFASq7y$=h lֆ`S<:Wz2x[ws>YQ4e~W;}Y<#h< w{u8" C0H߇uy?WdeԎ=mBJ=u&{E#3'v.p DBwE]Ɏ:-6(ڕ(O<+.pkl%=^l^| d~?z)(eۛ໛tIج!sg(G BХGP^qO RN}y{YCgs9bP&Hq"oId14 v}O!pNd N&(|8t ]XEyjس%12 M~0Hft?0P!=(c6\-gt&lk< 4lB+|^N 1T =Fvk AVBֻN'0((jDQ4P4 hBJUR@)Rh(F)+7 *XUF(~^yAߘz#__#16J&ݮYqct4)8XI |20ed KО {J0Q6 ZkZ+TGEшJ-AjRe0 BB"R@)P"{b){1" lXtO/Y :)x}pgp_7S@9>=EN7lmCG G0<"86ő%8@\Gqp={)vZAQC]|VBVȬB@B@AhXhB-C~K\_@ʂR~b9 =X|%Ѕ'rl@ $W$Bq z^P?$/`s+ХClouHJ?bn{!{B8 䛾@ӹ t D#A#&)F QIR(0C1\@| U|6apWk._ke*UQuqR&|# ݷ %/2@< U ; @bP4PKkQDPCtZhPDD1Q15 JYZYA D D!j7P_a&<~]Y] ~2|~y+Y7u!E~#OPE`t ;9 eI`LNRӉU:.&D"DnCXZW}ۿduy)h6[dܨ@%gzru@N#< /BKZDvZ*&A# -Ah@Zכn7-) "M2`XZ^@QugվqLExӠ\Zv^L\[&6Pli$ wp35/G; 1, +gC!^t6k7"BC GZD0 $7Ayza[al' fu# \>?}Np*b V1}Sޯ9_]I1$صI`eyZA8DsxsJ 3KW#N8W-76RȠAr`-G*(4J(Qr #e[5o.m(_}몑#+t)x`u} M lc ܲhW0\u4__0%Rī% 'A^GtQF `7J%vp0-y6&k/et(Ԥdwxr=l3?n[\(r&wK>\|/zjo8?&⟾֯FOdyuU Grv}2﵁ 5yTo^A3'.zUR4opa+;+ ]Knq^h[?-+aW@ ?pd x„cY Vd+1͋78Nr l|^6fkY4/7NRY<,_}{%ٱw UFGO`81gSn IcM0tmINҒ&;uvxLlS8|hoJ ehք]>m+{$Y~ ڌa\G=W1cv"O~YP>r^6rM7{=0H!Qy.øqRET0t.$ER:(HZ&Vϥ fp31wBX& hJ~չj4̩f>P߼ptbeg7#'I?rRCq?x*NE|&@{D7'1zODH\PZ$iSky4_C V3Gw'}ݎ=Ӷ+RMRIAK;ƥSN L ¶mO>ѩ'[:u|R@dBHY|ѓ27J; `@O  ^~N}מ/>[ʽ>W  q)%J,xNwg7v.{(do)9P8xnqn}:ٹ1:|# ~0c K-_#70AV_uK(OoVu j5 GEۼku!\Jmt;a^F}B!*brtK^cOF.0 B)Ǔ|; tt^#Owq3Yvqjb{t, LI~܁%x ݀N]-,Q>(~w=$`#kDA c8+ G:tl% S|u~?Ȼ$xu5PHQ5)ԤJ;s]mOݪu^ѓkɥ锰s|hYڿd7\]]-AJQ(CB1kGv3ı nծ!.Kg!7=EZ F8秫>36"qqZ>3|_Uuu˶B!'%S, N G7 yQ\9%܆ H@YPLDLkR}WDC޵!n,.xrdz7WoOwAvL͓;NӧZ )(r@M]"NN%  `&&FP,,<>>뎧i $"ڙYSD)5ͦ4'hAUgwCJ^U}.bH) D4TRu0޸q0oN4A"99W&Wl ֬lPQQ@.Mӣզ@>Wot:d-N: J ꄉR 3FX,,"9w*jf)"4"6nt@0QHSD| C%<0L),aZD.17p)xH`aA\9 [mB9͢ 89<܂'c5_~̚sv43af13130"Q#3sYUsJ)8ϟ?޽;'M{).7:a ^E|ZsMܝ-az߉HѣX,u xGs%yD]וvfy\Y9<üݼJ:~{э Qok5Sfi~Ae h!;F 21&SX' L0pk:zk* hoo߹Z/q}ܻw, +ɳ+靯rEw\q";.i9dIENDB`netemul-1.0/translation/0000755000175000017500000000000011305026152014430 5ustar frostfrostnetemul-1.0/translation/netemul_es.ts0000644000175000017500000030123411303443115017143 0ustar frostfrost MainWindow Exit Salir You want to go? Maybe teh english text should say something lik "Do you really want to exit the program?" ¿Realmente desea salir? New Nuevo Create new network Creaer nueva red Settings... Configuraciones... Settings Configuraciones Packet designer... Diseñador de paquetes... Open Abrir Open existing file Abrir archivo existente Save Guardar Save network Guardar red Save as... Guardar como... Save network as... Guardar red como... Close Cerrar Close current file Cerrar archivo actual Show grid Mostrar grilla Arp table Tabla arp Delete Borrar Deleting object Borrando objeto Programms Programas Programms installed on device Programas instalados en el dispositivo Do you really want to exit the program? ¿Realmente desea salir del programa? File was modified El archivo ha sido modificado File was modified, do you want to save changes? El archivo ha sido modificado ¿desea guardar los cambios? Open... Abrir... Programs Programas Programs installed on device Programas instalados en el dispositivo Setting Configuración Stop Parar Stop simulation Parar simulación Statistics Estadísticas Show scene statistics Mostrar las estadísticas de la escena Move Mover Move objects Mover objetos Netcards Tarjetas de red Edit netcards Editar tarjetas de red Cable Cable Create connection Crear conexión Note Nota Insert text comment Insertar comentario de texto NetEmul Help Ayuda de NetEmul Full help system program Really don't know if the english phrase is correct Ayuda completa del programa de sistema Unibus Unibus Add unibus Agregar unibus Computer Computadora Add computer Agregar computadora About NetEmul Acerca de NetEmul Hub Hub Add hub Agregar hub Switch Switch Add switch Agregar switch Router Router Add router Agregar router Send Enviar Send data Enviar datos Execute scripts Ejecutar scripts Run existing scripts Correr scripts existentes About Qt Acerca de Qt Properties Propiedades Show properties Mostrar propiedades Show log Mostrar el registro Show device log file Mostrar el archivo de registro del dispositivo About device Acerca del dispositivo Information about device Información sobre el dispositivo Create user's packet Crear paquete de usuario Print... Imprimir... Print user's network Imprimir la red del usuario Preview... Previsualizar... Preview network berfore printing Previsualizar la red antes de imprimir Configure VLAN... Configurar VLAN... Configure VLAN Configurar VLAN Set description... Establecer descripción... Set description of device Establecer descripción del dispositivo Show labels Show labels on cables File Archivo Edit Editar View Ver Object Objeto Service Servicio Scripts Scripts Help Ayuda Devices Dispositivos Controls Controles Ctrl+X Ctrl+X Ctrl+D Ctrl+D Ctrl+Alt+S Ctrl+Alt+S Ctrl+1 Ctrl+1 Ctrl+2 Ctrl+2 Ctrl+3 libqt4-dev Ctrl+4 Ctrl+4 Ctrl+5 Ctrl+5 Ctrl+6 Ctrl+6 Ctrl+7 Ctrl+7 Ctrl+8 Ctrl+8 Ctrl+Alt+P Ctrl+Alt+P Ctrl+T Ctrl+T Ctrl+I Ctrl+I Ctrl+P Ctrl+P Ctrl+Shift+A Ctrl+L Ctrl+L Ctrl+F1 Ctrl+F1 Save file as ... Guardar archivo como... Networks(*.net) Redes (*.net) Play Ejecutar Start simulation Empezar la simulación <h2>NetEmul 0.8.5</h2><p>NetEmul is a program for the simulation of the computer network. <h2>NetEmul 0.8.5</h2><p>NetEmul es un programa para simular redes de computadoras.</p> QObject LAN%1 LAN%1 The network is not working correctly La red no está funcionando correctamente The network found a matching IP address La red encontró una IP concordante The network found a match ip-address! ¡La red encontró una IP concordante! Ethernet, sender: %1 receiver: %2 Ethernet, transmisor: %1 receptor: %2 IP packet, sender: %1, receiver: %2 Paquete IP, transmisor: %1, receptor: %2 Static Estático Dinamic Dinámico RIP RIP Connected Conectado sender port: %1, receiver port: %2 puerto de envío: %1, puerto de recepción: %2 Received frames: %1 Frames recibidos: %1 Received packets: %1 Paquetes recibidos: %1 Sent frames: %1 Frames enviados: %1 Sent packets: %1 Paquetes enviados: %1 UDP Message user Usuario de mensajes UDP DHCP message Mensaje DHCP None Ninguno Add %1 Agregar %1 Delete Borrar Move Mover Error Error The device can't transmit data! ¡El dispositivo no puede transmitir datos! Add cable Agregar cable Add note Agregar nota IP packet, sender: %1, receiver: %2 TTL: %3 Paquete IP; transmisor: %1, receptor: %2 TTL: %3 Can't route packet! See adapter settings! Can't set this gateway! See adapter settings! ¡No puedo encontrar ésta puerta de enlace! ¡Ver la configuración del adaptador! The file is not a NetEmul file. Éste no es un archivo de NetEmul. aboutWindow About program Acerca del programa About Acerca de Program for simulating computer networks. (C) 2009 Semenov Pavel and Omilaeva Anastasia Programa para simular redes de computadoras (C) 2009 Semenov Pavel and Omilaeva Anastasia Authors Autores <a href="https://sourceforge.net/projects/netemul">Home Page</a><br><br> Semenov Pavel - Project admin. Developer.<br> <br> Omilaeva Anastasia - Developer. <a href="https://sourceforge.net/projects/netemul">Página del proyecto</a><br><br> Semenov Pavel - Administrador del proyecto. Desarrollador.<br> <br> Omilaeva Anastasia - Desarrollador. Thanks to Gracias a Konstantin Andreev - Author of the idea and creator of the icons, Arina Shelest - Author of the logotype. Lisandro Damián Nicanor Pérez Meyer Márcio Moraes Konstantin Andreev - Autor de la idea y creador de los iconos, Arina Shelest - Autor del logotipo. Lisandro Damián Nicanor Pérez Meyer Márcio Moraes Konstantin Andreev - Author of the idea and creator of the icons, Lisandro Damián Nicanor Pérez Meyer Márcio Moraes Konstantin Andreev - Autor de la idea de los iconos, Lisandro Damián Nicanor Pérez Meyer Márcio Moraes Translation Traducciones Семенов Павел - Русский Márcio Moraes - Português brasileiro Lisandro Damián Nicanor Pérez Meyer - Español Семенов Павел - Русский Márcio Moraes - Português brasileiro Lisandro Damián Nicanor Pérez Meyer - Español Close Cerrar adapterProperty Netcard Tarjeta de red Netcard name: Nombre de la tarjeta de red: Mac-address: Dirección MAC: Ip-address: Dirección IP: Mask: Máscara: Receive settings automatically Recibir configuraciones automáticamente Add Agregar Delete Borrar Reset statistics Limpiar estadísticas Error Error First, remove the cable! Primero elimine el cable! At least a netcard must exist Debe existir al menos una tarjeta de red Must be at least one netcard I think the english phrase is not good Debe ser al menos una tarjeta de red boxChip LAN%1 LAN%1 computer eth%1 eth%1 <b>Computer</b><!--You can use HTML.--> <b>Computadora</b><!--Puede utilizar HTML--> Computer Computadora computerProperty Proreties Propiedades Properties Propiedades Default gateway: Ruta de salida por defecto: Enable routing Activar el enrutado Description: Descripción: connectDilog Specify the initial preferences Especificar las preferencias iniciales Select the connected interfaces: Seleccionar las interfaces conectadas: Connect Conectar Cancel Cancelar designerDialog Main Principal Frame Trama Ip IP Arp ARP Tcp TCP Udp UDP Ok Ok Cancel Cancelar Packet designer Diseñador de paquetes Choose interface: Elegir interfaces: Count: Cuenta: Sender mac: MAC del transmisor: Receiver mac: MAC del receptor: Sender ip: IP del transmisor: Receiver ip: IP del receptor: Response Respuesta Request Pedido Sender port: Puerto del transmisor: Receiver port: Puerto del receptor: Sequence number: Número de secuencia: Ack number: Número de ACK: Flags Banderas SYN SYN ACK ACK RST RST FIN FIN deviceNoteDialog Description Descripción Description: Descripción: Ok Ok Cancel Cancelar dhcpClientProgramm DHCP client Cliente DHCP 0.0.0.0 0.0.0.0 dhcpClientProperty DHCP client property Propiedades del cliente DHCP Choose interfaces which must be under DHCP control: Elija las interfaces que deben estar bajo control de DHCP: Choose interfaces which must<br> be under DHCP control: Elija las interfaces bajo control<br> de DHCP: Waiting time for offers<br> from dhcp-server Tiempo de espera de oferta de un <br>servidor DHCP Ok Ok Cancel Cancelar dhcpServerModel Mac-address Dirección MAC Ip-address Dirección IP Mask Máscara Gateway Puerta de enlace Time Tiempo dhcpServerProgramm DHCP server Servidor DHCP Warning Advertencia Your DHCP server isn't configured. Su servidor DHCP no está configurado dhcpServerProperty From Desde to hacia Mask Máscara Gateway Puerta de enlace Mac MAC Ip IP Wrong range Rango incorrecto You have entered a wrong IP range. Ha ingresado un rango de IP erróneo. dhspServerProperty DHCP server's properties Propiedades del servidor DHCP Choose interface: Static: Estático: Add Agregar Delete Borrar Lease term: Tiempo de préstamo: s s Dynamic: Dinámico: Ip address Dirección IP The field for ip-address. El campo para la dirección IP. From: Desde: to: hacia: Mask: Máscara: Gateway: Puerta de enlace: Wating time for request from dhcp-client: Tiempo de espera de un cliente de DHCP: Ok Ok Cancel Cancelar dialogTemplate Cancel Cancelar Ok Ok Apply Aplicar hubChip LAN%1 LAN%1 hubDevice <b>Hub</b><!--You can use HTML.--> <b>Hub</b><!--Puede utilizar HTML--> Hub Hub hubProperty Number of ports: Número de puertos: Manage via SNMP: Manejar a través de SNMP: Properies Propiedades Properties Propiedades Mac-address: Dirección MAC: Ip-address: Dirección IP: Mask: Máscara: Reset statistics Limpiar estadísticas Description: Descripción: Number of collisions: %1 Número de colisiones: %1 Error Error First, remove the cables! Primero elimine los cables! installDialog Programms Programas Programs Programas Available programs: Programas disponibles: RIP RIP DHCP client Cliente DHCP DHCP server Servidor DHCP Install Instalar Close Cerrar Error Error Program already installed. Programa ya instalado. interfaceDialog Add adapter Agregar adaptador ethernet 10/100 ethernet 10/100 ethernet 10/100/1000 ethernet 10/100/1000 Add Agregar Add netcard Agregar tarjeta de red Cancel Cancelar Speed: 10/100 Mbit/s Velocidad: 10/100 Mbit/s Speed: 10/100/1000 Mbit/s Velocidad: 10/100/1000 Mbit/s logDialog sent enviado received recibido Type: Tipo: sequence number %1 ack number %2 número de secuencia %1 número de ack %2 flag: No flags bandera: sin banderas flag: Ack bandera: Ack flag: Fin bandera: Fin DHCP Message, Type: %1 Mensaje de DHCP, tipo: %1 Xid: %1, Yiaddr: %2 Xid: %1, Yiaddr: %2 Siaddr: %1, Chaddr: %2 Siaddr: %1, Chaddr: %2 ISN %1, ACK %2 ISN %1, ACK %2 flags: No flags banderas: sin banderas flags: Ack bandera: Ack flags: SYN bandera: Ack flags: SYN, ACK banderas: SYN, ACK flags: Fin bandera: Fin request pedir response respuesta search buscar found encontrado ARP-%1: ARP-%1: sender IP address: %1 dirección IP del transmisor: %1 sender MAC address: %1 dirección MAC del transmisor: %1 target IP address: %1 dirección IP destino: %1 target MAC address: %1 dirección MAC destino: %1 Form Formulario Time Tiempo All Todo Arp Arp TCP TCP UDP UDP Ip Ip Clear Limpiar myCanvas Opening file for reading is impossible No es posible abrir el archivo para lectura Error Error Outdated version of the file, file can't be opened Versión antigua del archivo, el mismo no puede ser abierto Scene opened from %1 Scene saved in %1 Opening file for writing is impossible %1 No es posible abrir el archivo para escritura %1 Opening file for writeng is impossible No es posible abrir el archivo para escritura The device can't transmit data! ¡El dispositivo no puede transmitir datos! The outdated version of the file, file can't be opened Versión vieja del archivo, no puede ser abierto Commentary Comentario programmDialog Programms Programas Installed programms Programas instalados Programs Programas Installed programs Programas instalados Add Agregar Settings Configuraciones Delete Borrar Ok Ok Cancel Cancelar ripProgramm RIP RIP ripProperty Rip programm property Propiedades del programa RIP Rip program property Split horizon: Dividir horizontalmente: Disable Deshabilitar Enable Habilitar With poison reverse Con envenenamiento reverso Turn On/Off triggered updates Encender/apagar actualizaciones automáticas Ok Ok Cancel Cancelar routeEditor Routing table Tabla de ruteo Destination: Destino: Mask: Máscara: Gateway: Puerta de enlace: Interface: Inetrfaz: Metric: Métrica: Add Agregar Delete Borrar Close Cerrar routeModel Destination Destino Mask Máscara Gateway Puerta de enlace Interface Interfaz Metric Métrica Source Fuente Connected Conectado routerDevice LAN%1 LAN%1 <b>Router</b><!--You can use HTML.--> <b>Router</b><!--Puede usar HTML--> Error Error To change the number of ports, disconnect all cables! ¡Para cambiar el número de puertos, desconecte todos los cables! Router Router routerProperty Properies Propiedades Properties Propiedades Number of ports: Número de puertos: Enable routing Activar el enrutado Description: Descripción: sendDialog Sending Enviando Cancel Cancelar Size KB Tamaño en KB KB KB Broadcast Broadcast Next Siguiente Choose protocol: Elija el protocolo: UDP UDP TCP TCP Select the network card receiver Elija la tarjeta de red receptora Send Enviar settingDialog Settings Configuraciones General General Computer Computadora Hub Hub Switch Switch Router Router Lifetime arp-entries: Tiempo de vida de las entradas arp: s s Netcard Tarjeta de red Tcp TCP Animation speed: Velocidad de la animación: Language: Idioma: English Inglés Russian Ruso Brazillian Portuguese Portugués de Brasil Spanish Español Turn on/off OpenGL Habilitar/deshabilitar OpenGL Autosave Autoguardar Interval: Intervalo: Nubmer of interfaces by default: Número de interfaces por defecto: 1 1 2 2 3 3 4 4 5 5 6 6 Number of ports by default Número de puertos por defecto 8 8 12 12 24 24 48 48 Number of ports by default: Número de puertos por defecto: 16 16 32 32 Switching table's records lifetime: Cambiar el tiempo de vida de la tabla de registros: Lifetime records of table switching Tiempo de vida de las entradas a la tabla de switcheo 7 7 9 9 Expectation time for arp-responce Tiempo de respuesta de arp esperado Number of repeat sendings: Número de repetición de envíos: Waiting confirmation time: Tiempo de espera de confirmación: Default Por defecto Apply Aplicar Ok Ok Cancel Cancelar smartDevice eth%1 eth%1 Error Error Such a program already installed. Programa ya instalado. Routing Table Tabla de ruteo staticsDialog Statistics Estadísticas Devices: Dispositivos: TextLabel EtiquetaDeTexto Traffic: Tráfico: Close Cerrar statisticsScene Number of devices: %1 Número de dispositivos: %1 Number of computers: %1 Número de computadoras: %1 Number of hubs: %1 Número de hubs: %1 Number of switchs: %1 Número de switchs: %1 Number of routers: %1 Número de routers: %1 Number of cables: %1 Número de cables: %1 switchChip LAN%1 LAN%1 switchDevice <b>Switch</b><!--You can use HTML.--> <b>Switch</b><!--Puede usar HTML.--> Table switching Tabla de switcheo Switch Switch Switching table Tabla de switcheo switchModel Mac-address Dirección MAC Port Puerto Record type Tipo de registro TTL TTL LAN%1 LAN%1 switchProperty Number of ports: Número de puertos: Managed via SNMP: Manejar por SNMP: Properies Propiedades Properties Propiedades Manageable Administrable Mac-address: Dirección MAC: Ip-address: Dirección IP: Mask: Máscara: Reset statistics Limpiar estadísticas Description: Descripción: Error Error First, remove the cables! ¡Primero elimine los cables! tableArp Arp table Tabla ARP Mac-address Dirección MAC Ip-address Dirección IP Record type Tipo de registro Netcard name Nombre de la tarjeta de red TTL TTL Mac-address: Dirección MAC: Ip-address: Dirección IP: Netcard Tarjeta de red Add Agregar Delete Borrar Close Cerrar tableSwitch LAN%1 LAN%1 Table switching Tabla de switcheo Switching table Tabla de switcheo Mac-address: Dirección MAC: HH:HH:HH:HH:HH:HH;_ HH:HH:HH:HH:HH:HH;_ 00:00:00:00:00:00 00:00:00:00:00:00 Port: Puerto: Add Agregar Delete Borrar Close Cerrar tcpSocket Error Error TCP: Data transmition error TCP: error de transmisión de datos testDialog Script finished correctly Script finalizado correctamente Script not correctly finished El script no terminó correctamente Choose a directory with scripts Elija un directorio con scripts Script finished is not correctly El script no terminó correctamente Scripts Scripts Start Empezar Cancel Cancelar Set path Elija el camino All Todo Click start Haga click en Empezar virtualNetwork LAN%1 LAN%1 virtualNetworkDialog Dialog Diálogo netemul-1.0/translation/netemul_es.qm0000644000175000017500000010660011303443115017132 0ustar frostfrost8\F FLaVE Vf2rUvtD8Da`5?5N7d5[ #.M&i3=0y65n;A4*F `G&2H&-aH;BHw9F-Hw9eeIy%zJ+MRJ6J6&J6J=J6ZJ6nJ6wMJ6zELb[Lb-.LbGLbJLbSLb^LbtLb{M'5M55M C P`P`0=P`FP`^>P`r_P`sP`{P`xSD4Z|K-ZF^Swk1kl1?lnqIy`R,g} aTR# #0h*u!H*i/QS!lpKV\U>rwJY(m]k:p# <9: =bfZz1@z1wȩ*lyգ}2RCDJJ^ZEYg#("SNgSa ak\(:zdfagzbkQGkQtI2tI4I:gI;IAIFcIVIXUI`If7I|HyEvRuue,,,,,B,VW,ZO,w{,zvWy%XΥYʘ.ʘiʘxր:7P7%O~M8.f8[F<]KK[Y v{y ^nkaȕ]QjE  ` lE sjJAhL5: ۘBa1M=>֥WwaR;jqGb3Gb1Gbfo[[e i@!l^r L6PzjLmO֣֣2/֣IC֣`&֣vI@Ldŵ;N*U4t;\4tJp[ (qCFPL~!h/hIhvi?mEoqo5"OCpC>@wT?9TJAeu!m>sx,(z 9?tD?ySN#R O*>UiZ}|o[ CB&U'ȼQ;ȼ8&^F0.0H=0u^0xn0{0 ; v~ tn@ &@Z Mg: ^3 ^3K ^3W laN  ~ L Q İa  ʟ.k υsN υ{ Y3q 4z  tb4 d} eK2 gR` hPl lW53 mT!Q s(*y :D  tf ȗ\ T @Z AR|+ ( yeX ms! #o* 64 7U:) }-0H }-0_ }-0u b#m ^ P . D s `8 !i< 8HiK ; > eS N0f RL e UUN b\pT gm8 uN$ z`h `8G bQj e Ee [| s sWO sk Oz Ϙn  _ 1 _w +x 0} DYJ `^ P? = \o s'" <g ˺q6j4  /9j>p@n?jPsjOjOH`-`whpW;9WhN07ĿWS2'>Kf:1aNA9>ix*"|on0h >i"Acerca de NetEmul About NetEmul MainWindowAcerca de QtAbout Qt MainWindow,Acerca del dispositivo About device MainWindow&Agregar computadora Add computer MainWindowAgregar hubAdd hub MainWindowAgregar router Add router MainWindowAgregar switch Add switch MainWindowAgregar unibus Add unibus MainWindowTabla arp Arp table MainWindow CableCable MainWindow CerrarClose MainWindow*Cerrar archivo actualClose current file MainWindowComputadoraComputer MainWindowConfigurar VLANConfigure VLAN MainWindow$Configurar VLAN...Configure VLAN... MainWindowControlesControls MainWindowCrear conexinCreate connection MainWindow Creaer nueva redCreate new network MainWindow0Crear paquete de usuarioCreate user's packet MainWindow Ctrl+1Ctrl+1 MainWindow Ctrl+2Ctrl+2 MainWindowlibqt4-devCtrl+3 MainWindow Ctrl+4Ctrl+4 MainWindow Ctrl+5Ctrl+5 MainWindow Ctrl+6Ctrl+6 MainWindow Ctrl+7Ctrl+7 MainWindow Ctrl+8Ctrl+8 MainWindowCtrl+Alt+P Ctrl+Alt+P MainWindowCtrl+Alt+S Ctrl+Alt+S MainWindow Ctrl+DCtrl+D MainWindowCtrl+F1Ctrl+F1 MainWindow Ctrl+ICtrl+I MainWindow Ctrl+LCtrl+L MainWindow Ctrl+PCtrl+P MainWindow Ctrl+Shift+A MainWindow Ctrl+TCtrl+T MainWindow Ctrl+XCtrl+X MainWindow BorrarDelete MainWindowBorrando objetoDeleting object MainWindowDispositivosDevices MainWindow EditarEdit MainWindow,Editar tarjetas de red Edit netcards MainWindow Ejecutar scriptsExecute scripts MainWindow SalirExit MainWindowArchivoFile MainWindow:El archivo ha sido modificadoFile was modified MainWindowrEl archivo ha sido modificado desea guardar los cambios?/File was modified, do you want to save changes? MainWindowLAyuda completa del programa de sistemaFull help system program MainWindow AyudaHelp MainWindowHubHub MainWindow@Informacin sobre el dispositivoInformation about device MainWindow8Insertar comentario de textoInsert text comment MainWindow MoverMove MainWindowMover objetos Move objects MainWindow Ayuda de NetEmul NetEmul Help MainWindowTarjetas de redNetcards MainWindow NuevoNew MainWindowNotaNote MainWindow ObjetoObject MainWindow AbrirOpen MainWindow.Abrir archivo existenteOpen existing file MainWindowAbrir...Open... MainWindow0Diseador de paquetes...Packet designer... MainWindowEjecutarPlay MainWindowLPrevisualizar la red antes de imprimir Preview network berfore printing MainWindow Previsualizar... Preview... MainWindow6Imprimir la red del usuarioPrint user's network MainWindowImprimir...Print... MainWindowProgramasPrograms MainWindowLProgramas instalados en el dispositivoPrograms installed on device MainWindowPropiedades Properties MainWindow RouterRouter MainWindow2Correr scripts existentesRun existing scripts MainWindowGuardarSave MainWindowGuardar como... Save as... MainWindow.Guardar archivo como...Save file as ... MainWindowGuardar red Save network MainWindow&Guardar red como...Save network as... MainWindowScriptsScripts MainWindow EnviarSend MainWindowEnviar datos Send data MainWindowServicioService MainWindowLEstablecer descripcin del dispositivoSet description of device MainWindow2Establecer descripcin...Set description... MainWindowConfiguracionesSettings MainWindow$Configuraciones... Settings... MainWindow\Mostrar el archivo de registro del dispositivoShow device log file MainWindowMostrar grilla Show grid MainWindow&Mostrar el registroShow log MainWindow&Mostrar propiedadesShow properties MainWindowJMostrar las estadsticas de la escenaShow scene statistics  MainWindow*Empezar la simulacinStart simulation MainWindowEstadsticas Statistics  MainWindow PararStop MainWindow Parar simulacinStop simulation MainWindow SwitchSwitch MainWindow UnibusUnibus MainWindowVerView MainWindowAgregar %1Add %1QObjectAgregar cable Add cableQObjectAgregar notaAdd noteQObjectNo puedo encontrar sta puerta de enlace! Ver la configuracin del adaptador!-Can't set this gateway! See adapter settings!QObjectConectado ConnectedQObjectMensaje DHCP DHCP messageQObject BorrarDeleteQObjectDinmicoDinamicQObject ErrorErrorQObjectJEthernet, transmisor: %1 receptor: %2!Ethernet, sender: %1 receiver: %2QObject`Paquete IP; transmisor: %1, receptor: %2 TTL: %3+IP packet, sender: %1, receiver: %2 TTL: %3QObject LAN%1LAN%1QObject MoverMoveQObjectNingunoNoneQObjectRIPRIPQObject(Frames recibidos: %1Received frames: %1 QObject,Paquetes recibidos: %1Received packets: %1 QObject(Frames enviados: %1 Sent frames: %1 QObject,Paquetes enviados: %1 Sent packets: %1 QObjectEstticoStaticQObjectTEl dispositivo no puede transmitir datos!The device can't transmit data!QObjectBste no es un archivo de NetEmul.The file is not a NetEmul file.QObjectDLa red encontr una IP concordante'The network found a matching IP addressQObjectPLa red no est funcionando correctamente$The network is not working correctlyQObject.Usuario de mensajes UDPUDP Message userQObjectXpuerto de envo: %1, puerto de recepcin: %2"sender port: %1, receiver port: %2QObjectt<a href="https://sourceforge.net/projects/netemul">Pgina del proyecto</a><br><br> Semenov Pavel - Administrador del proyecto. Desarrollador.<br> <br> Omilaeva Anastasia - Desarrollador.Home Page

Semenov Pavel - Project admin. Developer.

Omilaeva Anastasia - Developer. aboutWindowAcerca deAbout aboutWindow&Acerca del programa About program aboutWindowAutoresAuthors aboutWindow CerrarClose aboutWindow,Konstantin Andreev - Autor de la idea y creador de los iconos, Arina Shelest - Autor del logotipo. Lisandro Damin Nicanor Prez Meyer Mrcio MoraesKonstantin Andreev - Author of the idea and creator of the icons, Arina Shelest - Author of the logotype. Lisandro Damián Nicanor Pérez Meyer Márcio Moraes aboutWindowPrograma para simular redes de computadoras (C) 2009 Semenov Pavel and Omilaeva Anastasia ZProgram for simulating computer networks. (C) 2009 Semenov Pavel and Omilaeva Anastasia  aboutWindowGracias a Thanks to aboutWindowTraducciones Translation aboutWindow!5<5=>2 025; -  CAA:89 Mrcio Moraes - Portugus brasileiro Lisandro Damin Nicanor Prez Meyer - EspaolСеменов Павел - Русский Márcio Moraes - Português brasileiro Lisandro Damián Nicanor Pérez Meyer - Español aboutWindowAgregarAddadapterPropertyPDebe existir al menos una tarjeta de redAt least a netcard must existadapterProperty BorrarDeleteadapterProperty ErrorErroradapterProperty2Primero elimine el cable!First, remove the cable!adapterPropertyDireccin IP: Ip-address: adapterPropertyDireccin MAC: Mac-address: adapterPropertyMscara:Mask: adapterPropertyTarjeta de redNetcardadapterProperty8Nombre de la tarjeta de red:Netcard name: adapterPropertyNRecibir configuraciones automticamenteReceive settings automaticallyadapterProperty(Limpiar estadsticasReset statisticsadapterProperty LAN%1LAN%1boxChipX<b>Computadora</b><!--Puede utilizar HTML-->'ComputercomputerComputadoraComputercomputer eth%1eth%1computer6Ruta de salida por defecto:Default gateway:computerProperty&Activar el enrutadoEnable routingcomputerPropertyPropiedades PropertiescomputerPropertyCancelarCancel connectDilogConectarConnect connectDilogLSeleccionar las interfaces conectadas:!Select the connected interfaces:  connectDilogLEspecificar las preferencias iniciales Specify the initial preferences  connectDilogACKACKdesignerDialogNmero de ACK: Ack number: designerDialogARPArpdesignerDialogCancelarCanceldesignerDialog$Elegir interfaces:Choose interface: designerDialogCuenta:Count: designerDialogFINFINdesignerDialogBanderasFlagsdesignerDialog TramaFramedesignerDialogIPIpdesignerDialogPrincipalMaindesignerDialogOkOkdesignerDialog*Diseador de paquetesPacket designerdesignerDialogRSTRSTdesignerDialog IP del receptor: Receiver ip: designerDialog"MAC del receptor:Receiver mac: designerDialog(Puerto del receptor:Receiver port: designerDialog PedidoRequestdesignerDialogRespuestaResponsedesignerDialogSYNSYNdesignerDialog$IP del transmisor: Sender ip: designerDialog&MAC del transmisor: Sender mac: designerDialog,Puerto del transmisor: Sender port: designerDialog(Nmero de secuencia:Sequence number: designerDialogTCPTcpdesignerDialogUDPUdpdesignerDialogCancelarCanceldeviceNoteDialogDescripcin DescriptiondeviceNoteDialogDescripcin: Description:deviceNoteDialogOkOkdeviceNoteDialogCliente DHCP DHCP clientdhcpClientProgrammCancelarCanceldhcpClientProperty\Elija las interfaces bajo control<br> de DHCP:8Choose interfaces which must
be under DHCP control: dhcpClientProperty8Propiedades del cliente DHCPDHCP client propertydhcpClientPropertyOkOkdhcpClientPropertydTiempo de espera de oferta de un <br>servidor DHCP,Waiting time for offers
from dhcp-serverdhcpClientProperty Puerta de enlaceGatewaydhcpServerModelDireccin IP Ip-addressdhcpServerModelDireccin MAC Mac-addressdhcpServerModelMscaraMaskdhcpServerModel TiempoTimedhcpServerModelServidor DHCP DHCP serverdhcpServerProgrammAdvertenciaWarningdhcpServerProgrammHSu servidor DHCP no est configurado"Your DHCP server isn't configured.dhcpServerProgramm Rango incorrecto Wrong rangedhcpServerPropertyHHa ingresado un rango de IP errneo."You have entered a wrong IP range.dhcpServerProperty s sdhspServerPropertyAgregarAdddhspServerPropertyCancelarCanceldhspServerPropertyChoose interface:dhspServerProperty:Propiedades del servidor DHCPDHCP server's propertiesdhspServerProperty BorrarDeletedhspServerPropertyDinmico:Dynamic:dhspServerProperty Desde:From:dhspServerProperty"Puerta de enlace:Gateway:dhspServerPropertyDireccin IP Ip addressdhspServerProperty&Tiempo de prstamo: Lease term:dhspServerPropertyMscara:Mask:dhspServerPropertyOkOkdhspServerPropertyEsttico:Static:dhspServerProperty<El campo para la direccin IP.The field for ip-address.dhspServerPropertyNTiempo de espera de un cliente de DHCP:)Wating time for request from dhcp-client:dhspServerProperty hacia:to:dhspServerPropertyAplicarApplydialogTemplateCancelarCanceldialogTemplateOkOkdialogTemplate LAN%1LAN%1hubChipH<b>Hub</b><!--Puede utilizar HTML-->"Hub hubDeviceHubHub hubDevice ErrorError hubProperty6Primero elimine los cables!First, remove the cables! hubPropertyDireccin MAC: Mac-address:  hubProperty0Nmero de colisiones: %1Number of collisions: %1 hubProperty$Nmero de puertos:Number of ports:  hubPropertyPropiedades Properties hubProperty(Limpiar estadsticasReset statistics hubProperty,Programas disponibles:Available programs:  installDialog CerrarClose installDialogCliente DHCP DHCP client installDialogServidor DHCP DHCP server installDialog ErrorError installDialogInstalarInstall installDialog,Programa ya instalado.Program already installed. installDialogProgramasPrograms installDialogRIPRIP installDialog Tipo: Type:  logDialogencontrado found  logDialog buscar search  logDialogARP-%1:ARP-%1: logDialogTodoAll logDialogArpArp logDialogLimpiarClear logDialog2Mensaje de DHCP, tipo: %1DHCP Message, Type: %1 logDialogFormularioForm logDialogISN %1, ACK %2ISN %1, ACK %2 logDialog,Siaddr: %1, Chaddr: %2Siaddr: %1, Chaddr: %2 logDialogTCPTCP logDialog TiempoTime logDialogUDPUDP logDialog&Xid: %1, Yiaddr: %2Xid: %1, Yiaddr: %2 logDialogbandera: Ack flags: Ack logDialogbandera: Fin flags: Fin logDialog,banderas: sin banderasflags: No flags logDialogbandera: Ack flags: SYN logDialog$banderas: SYN, ACKflags: SYN, ACK logDialogrecibido received  logDialog pedirrequest logDialogrespuestaresponse logDialog>direccin IP del transmisor: %1sender IP address: %1 logDialog@direccin MAC del transmisor: %1sender MAC address: %1 logDialogenviadosent  logDialog0direccin IP destino: %1target IP address: %1 logDialog2direccin MAC destino: %1target MAC address: %1 logDialogComentario CommentarymyCanvas ErrorErrormyCanvasVNo es posible abrir el archivo para lectura&Opening file for reading is impossiblemyCanvas`No es posible abrir el archivo para escritura %1)Opening file for writing is impossible %1myCanvastVersin antigua del archivo, el mismo no puede ser abierto2Outdated version of the file, file can't be openedmyCanvasAgregarAddprogrammDialogCancelarCancelprogrammDialog BorrarDeleteprogrammDialog(Programas instaladosInstalled programsprogrammDialogOkOkprogrammDialogProgramasProgramsprogrammDialogConfiguracionesSettingsprogrammDialogRIPRIP ripProgrammVEncender/apagar actualizaciones automticas Turn On/Off triggered updates ripPropertyCancelarCancel ripPropertyDeshabilitarDisable ripPropertyHabilitarEnable ripPropertyOkOk ripProperty0Dividir horizontalmente:Split horizon: ripProperty4Con envenenamiento reversoWith poison reverse ripPropertyAgregarAdd routeEditor CerrarClose routeEditor BorrarDelete routeEditorDestino: Destination:  routeEditor"Puerta de enlace: Gateway:  routeEditorInetrfaz: Interface:  routeEditorMscara:Mask:  routeEditorMtrica:Metric:  routeEditorTabla de ruteo Routing table routeEditorConectado Connected routeModelDestino Destination routeModel Puerta de enlaceGateway routeModelInterfaz Interface routeModelMscaraMask routeModelMtricaMetric routeModel FuenteSource routeModelF<b>Router</b><!--Puede usar HTML-->%Router routerDevice ErrorError routerDevice LAN%1LAN%1 routerDevice RouterRouter routerDevicePara cambiar el nmero de puertos, desconecte todos los cables!5To change the number of ports, disconnect all cables! routerDevice&Activar el enrutadoEnable routingrouterProperty$Nmero de puertos:Number of ports: routerPropertyPropiedades PropertiesrouterPropertyKB KB sendDialogCancelarCancel sendDialog&Elija el protocolo:Choose protocol: sendDialogSiguienteNext sendDialogBElija la tarjeta de red receptora Select the network card receiver sendDialog EnviarSend sendDialogEnviandoSending sendDialogTamao en KBSize KB sendDialogTCPTCP sendDialogUDPUDP sendDialog s s settingDialog11 settingDialog1212 settingDialog1616 settingDialog22 settingDialog2424 settingDialog33 settingDialog3232 settingDialog44 settingDialog4848 settingDialog55 settingDialog66 settingDialog77 settingDialog88 settingDialog99 settingDialog4Velocidad de la animacin:Animation speed: settingDialogAplicarApply settingDialogAutoguardarAutosave settingDialog&Portugus de BrasilBrazillian Portuguese settingDialogCancelarCancel settingDialogComputadoraComputer settingDialogPor defectoDefault settingDialog InglsEnglish settingDialogFTiempo de respuesta de arp esperado!Expectation time for arp-responce settingDialogGeneralGeneral settingDialogHubHub settingDialogIntervalo: Interval:  settingDialogIdioma: Language:  settingDialogFTiempo de vida de las entradas arp:Lifetime arp-entries:  settingDialogTarjeta de redNetcard settingDialogBNmero de interfaces por defecto: Nubmer of interfaces by default: settingDialog:Nmero de puertos por defectoNumber of ports by default settingDialog<Nmero de puertos por defecto:Number of ports by default:  settingDialog>Nmero de repeticin de envos:Number of repeat sendings: settingDialogOkOk settingDialog RouterRouter settingDialogRusoRussian settingDialogConfiguracionesSettings settingDialogEspaolSpanish settingDialog SwitchSwitch settingDialogfCambiar el tiempo de vida de la tabla de registros:#Switching table's records lifetime: settingDialogTCPTcp settingDialog:Habilitar/deshabilitar OpenGLTurn on/off OpenGL settingDialogBTiempo de espera de confirmacin:Waiting confirmation time: settingDialogTabla de ruteo Routing Table smartDevice eth%1eth%1 smartDevice CerrarClose staticsDialogDispositivos:Devices: staticsDialogEstadsticas Statistics staticsDialogEtiquetaDeTexto TextLabel staticsDialogTrfico:Traffic: staticsDialog*Nmero de cables: %1 Number of cables: %1 statisticsScene6Nmero de computadoras: %1 Number of computers: %1 statisticsScene6Nmero de dispositivos: %1 Number of devices: %1 statisticsScene&Nmero de hubs: %1 Number of hubs: %1 statisticsScene,Nmero de routers: %1 Number of routers: %1 statisticsScene,Nmero de switchs: %1 Number of switchs: %1 statisticsScene LAN%1LAN%1 switchChipH<b>Switch</b><!--Puede usar HTML.-->%Switch switchDevice SwitchSwitch switchDevice"Tabla de switcheoSwitching table switchDevice LAN%1LAN%1 switchModelDireccin MAC Mac-address switchModel PuertoPort switchModel Tipo de registro Record type switchModelTTLTTL switchModel ErrorErrorswitchProperty8Primero elimine los cables!First, remove the cables!switchPropertyDireccin MAC: Mac-address: switchPropertyAdministrable ManageableswitchProperty$Nmero de puertos:Number of ports: switchPropertyPropiedades PropertiesswitchProperty(Limpiar estadsticasReset statisticsswitchPropertyAgregarAddtableArpTabla ARP Arp tabletableArp CerrarClosetableArp BorrarDeletetableArpDireccin IP Ip-addresstableArpDireccin IP: Ip-address: tableArpDireccin MAC Mac-addresstableArpDireccin MAC: Mac-address: tableArpTarjeta de redNetcardtableArp6Nombre de la tarjeta de red Netcard nametableArp Tipo de registro Record typetableArpTTLTTLtableArp"00:00:00:00:00:0000:00:00:00:00:00 tableSwitchAgregarAdd tableSwitch CerrarClose tableSwitch BorrarDelete tableSwitch&HH:HH:HH:HH:HH:HH;_HH:HH:HH:HH:HH:HH;_ tableSwitch LAN%1LAN%1 tableSwitchDireccin MAC: Mac-address:  tableSwitchPuerto:Port:  tableSwitch"Tabla de switcheoSwitching table tableSwitch ErrorError tcpSocketDTCP: error de transmisin de datosTCP: Data transmition error tcpSocketTodoAll testDialogCancelarCancel testDialog>Elija un directorio con scriptsChoose a directory with scripts testDialog*Haga click en Empezar Click start testDialog>Script finalizado correctamenteScript finished correctly testDialogDEl script no termin correctamenteScript not correctly finished testDialogScriptsScripts testDialogElija el caminoSet path testDialogEmpezarStart testDialog LAN%1LAN%1virtualNetworkDilogoDialogvirtualNetworkDialognetemul-1.0/translation/netemul_ru.qm0000644000175000017500000010531711303443115017155 0ustar frostfrostrivqD:D_`'5<5LM&55Y#.M&r3=0wg65kA2F ^G&7H&,pH;@Hw9CHw9cIy%J+KJ6J6&J6HJ6WJ6l{J6u5J6wLbnLb,;LbEhLbHLbPLb\ LbrLbyRM'4&M54XM AP`P`/P`DbP`\>P`p)P`qP`xeP`|SAZ|HZ|\^Sk0(l0llVqGy`O|+} aQdR#(#/%*u!Fg*i.(PqS S!bpKT"U>pMwJVm[Xk :nn# g<7]0R: =bfXOz1Pz1tȩ*jUգy}1OCDJ^ZCd("PrKP[ akb(:zbfamzbOkQEkQrI1!I32I8I9I?IDISIUI^IcIzp)Ns5Zuc,%,,,,@,S,X,ue,wW|y%VDΥWJʘ-ʘfʘvր9-7P5%O{s8-i8Y<ZKKYY  vxX\di)ȕ[#h    j pjJ?hJ : ۘ@a1KH;g֥+waO;joMGbIGb/Gbd3[[e i@l^r J5MIzhLk ֣֣0֣G"֣^&֣t3@J=ŵCN*U4t94tHE[ (qAFPL~!h.hG\htpi?m~~Em]o "LpAp{ &>% Mg8 ^3 ^3I ^3T laR  { Jp N İ_  ʟ.ik υq6 υx Y2 4z 2 t` dzI eK1T gR hPi lW3 mT!N s(*p :B`  tdo ȗZ  @X ARy 3 yeV ms") #l ,P 63g 7U:) }-0F }-0] }-0s b# \ M - B s! `7 !i: 8Hg ; > eP N0d RL UUK b\m gm8| uN$ z`e `6 bN u EcP YF s sT si Ox2 Ϙl  o 0 ]q +v 0z DY `^  P=n < Z[ s' <eb ˺nj^4  c9j>@n=jMjLjM X`,`uhp >W-;7f06,ĿUKS$'>I;:1_6A9> ix"|m00fb Li|& ?@>3@0<<5 NetEmul About NetEmul MainWindowAbout Qt MainWindow1 CAB@>9AB25 About device MainWindow$>1028BL ><?LNB5@ Add computer MainWindow*>1028BL >=F5=B@0B>@Add hub MainWindow,>1028BL 0@H@CB870B>@ Add router MainWindow&>1028BL ><<CB0B>@ Add switch MainWindow&>1028BL >1ICN H8=C Add unibus MainWindowArp B01;8F0 Arp table MainWindow 015;LCable MainWindow0:@KBLClose MainWindow(0:@KBL B5:CI89 D09;Close current file MainWindow><?LNB5@Computer MainWindow0AB@>9:0 VLANConfigure VLAN MainWindow"0AB@>9:0 VLAN...Configure VLAN... MainWindow#?@02;5=85Controls MainWindow$!>740BL A>548=5=85Create connection MainWindow$!>740BL =>2CN A5BLCreate new network MainWindow<!>740BL ?>;L7>20B5;LA:89 ?0:5BCreate user's packet MainWindowCtrl+1 MainWindowCtrl+2 MainWindowCtrl+3 MainWindowCtrl+4 MainWindowCtrl+5 MainWindowCtrl+6 MainWindowCtrl+7 MainWindowCtrl+8 MainWindow Ctrl+Alt+P MainWindow Ctrl+Alt+S MainWindowCtrl+D MainWindowCtrl+F1 MainWindowCtrl+I MainWindow Ctrl+LCtrl+L MainWindowCtrl+P MainWindow Ctrl+Shift+A MainWindowCtrl+T MainWindowCtrl+X MainWindow#40;8BLDelete MainWindow#40;8BL >1J5:BDeleting object MainWindow#AB@>9AB20Devices MainWindow @02:0Edit MainWindow0 540:B8@>20BL 8=B5@D59AK Edit netcards MainWindow&K?>;=8BL AF5=0@89Execute scripts MainWindow KE>4Exit MainWindow$09;File MainWindow $09; 1K; 87<5=5=File was modified MainWindow`$09; 1K; 87<5=5=, 2K E>B8B5 A>E@0=8BL 87<5=5=8O?/File was modified, do you want to save changes? MainWindow4>;=0O A?@02:0 > ?@>3@0<<5Full help system program MainWindow ><>ILHelp MainWindow>=F5=B@0B>@Hub MainWindow0=D>@<0F8O >1 CAB@>9AB25Information about device MainWindow4AB028BL B5:AB>2CN =04?8ALInsert text comment MainWindow5@5<5I5=85Move MainWindow(5@5<5I5=85 >1J5:B>2 Move objects MainWindow ><>IL NetEmul Help MainWindow=B5@D59AKNetcards MainWindow >2K9New MainWindow0?8A:8Note MainWindow 1J5:BObject MainWindowB:@KBLOpen MainWindow2B:@KBL ACI5AB2CNICN A5BLOpen existing file MainWindowB:@KBL...Open... MainWindow,>=AB@C:B>@ ?0:5B>2...Packet designer... MainWindow0?CAB8BLPlay MainWindow>@54?@>A<>B@ A5B8 ?5@54 ?5G0BLN Preview network berfore printing MainWindow@54?@>A<>B@... Preview... MainWindow<0?5G0BL ?>;L7>20B5;LA:CN A5BLPrint user's network MainWindow5G0BL...Print... MainWindow@>3@0<<KPrograms MainWindow.#AB0=>2;5==K5 ?@>3@0<<KPrograms installed on device MainWindow!2>9AB20 Properties MainWindow0@H@CB870B>@Router MainWindow40?CAB8BL 3>B>2K5 AF5=0@88Run existing scripts MainWindow!>E@0=8BLSave MainWindow !>E@0=8BL :0:... Save as... MainWindow*!>E@0=8BL D09; :0:...Save file as ... MainWindow!>E@0=8BL A5BL Save network MainWindow,!>E@0=8BL A5BL :0: ...Save network as... MainWindow!:@8?BKScripts MainWindowB?@02:0Send MainWindow B?@028BL 40==K5 Send data MainWindow !5@28AService MainWindow<040BL >?8A0=85 4;O CAB@>9AB20Set description of device MainWindow$040BL >?8A0=85...Set description... MainWindow0AB@>9:8Settings MainWindow0AB@>9:8... Settings... MainWindow4>:070BL 6C@=0; CAB@>9AB20Show device log file MainWindow >:07K20BL A5B:C Show grid MainWindow$>:07K20BL =04?8A8 Show labels MainWindow<>:07K20BL =04?8A8 =0 ?@>2>40EShow labels on cables MainWindow>:070BL 6C@=0;Show log MainWindow">:070BL A2>9AB20Show properties MainWindow2>:070BL AB0B8AB8:C AF5=KShow scene statistics  MainWindow&0?CAB8BL A8<C;OF8NStart simulation MainWindow!B0B8AB8:0 Statistics  MainWindowAB0=>28BLStop MainWindow(AB0=>28BL A8<C;OF8NStop simulation MainWindow><<CB0B>@Switch MainWindow1I0O H8=0Unibus MainWindow84View MainWindow>1028BL %1Add %1QObject>1028BL :015;L Add cableQObject(>1028BL :><<5=B0@89Add noteQObjectn52>7<>6=> <0@H@CB878@>20BL ?0:5B! @>25@LB5 =0AB@>9:8!)Can't route packet! See adapter settings!QObjectt52>7<>6=>2 2KAB028BL H;N7! @>25@LB5 =0AB@>9:8 040?B5@>2!-Can't set this gateway! See adapter settings!QObject>4:;NG5=0 ConnectedQObjectDHCP A>>1I5=85 DHCP messageQObject#40;8BLDeleteQObject8=0<8G5A:0ODinamicQObject H81:0ErrorQObjectPEthernet, >B?@028B5;L: %1 ?>;CG0B5;L: %2!Ethernet, sender: %1 receiver: %2QObject`IP ?0:5B, >B?@028B5;L: %1, ?>;CG0B5;L: %2 TTL %3+IP packet, sender: %1, receiver: %2 TTL: %3QObjectLAN%1QObject5@5<5I5=85MoveQObject5>?@545;5==>NoneQObjectRIPQObject(>;CG5=> :04@>2: %1 Received frames: %1 QObject*>;CG5=> ?0:5B>2: %1 Received packets: %1 QObject,B?@02;5=> :04@>2: %1 Sent frames: %1 QObject.B?@02;5=> ?0:5B>2: %1 Sent packets: %1 QObject!B0B8G5A:0OStaticQObjectL#AB@>9AB2> =5 <>65B >B?@02;OBL 40==K5!The device can't transmit data!QObjectJ-B>B D09; =5 O2;O5BAO D09;>< NetEmul.The file is not a NetEmul file.QObjectN A5B8 >1=0@C65=> A>2?045=85 IP 04@5A>2'The network found a matching IP addressQObject4!5BL @01>B05B =5 :>@@5:B=>$The network is not working correctlyQObject4UDP A>>1I5=85 ?>;L7>20B5;OUDP Message userQObjectR?>@B >B?@028B5;O: %1, ?>@B ?>;CG0B5;O: %2"sender port: %1, receiver port: %2QObject^<a href="https://sourceforge.net/projects/netemul">><0H=OO AB@0=8F0</a><br><br> !5<5=>2 ?025; - 4<8=8AB@0B>@ ?@>5:B0,  07@01>BG8:.<br> <br> <8;0520 =0AB0A8O -  07@01>BG8:.Home Page

Semenov Pavel - Project admin. Developer.

Omilaeva Anastasia - Developer. aboutWindow ?@>3@0<<5About aboutWindow ?@>3@0<<5 About program aboutWindow 2B>@KAuthors aboutWindow0:@KBLClose aboutWindow&>=AB0=B8= =4@552 - 02B>@ 8458 ?@>5:B0, 02B>@ 8:>=>:, @8=0 (5;5AB - 02B>@ ;>3>B8?0 ?@>3@0<<K. Lisandro Damin Nicanor Prez Meyer Mrcio MoraesKonstantin Andreev - Author of the idea and creator of the icons, Arina Shelest - Author of the logotype. Lisandro Damián Nicanor Pérez Meyer Márcio Moraes aboutWindow@>3@0<<0 4;O A8<C;OF88 :><?LNB5@=>9 A5B8. (C) 2009 !5<5=>2 025; 8 <8;0520 =0AB0A8O ZProgram for simulating computer networks. (C) 2009 Semenov Pavel and Omilaeva Anastasia  aboutWindow;03>40@=>AB8 Thanks to aboutWindow5@52>4 Translation aboutWindowСеменов Павел - Русский Márcio Moraes - Português brasileiro Lisandro Damián Nicanor Pérez Meyer - Español aboutWindow>1028BLAddadapterProperty@>;65= 1KBL E>BO 1K >48= 040?B5@At least a netcard must existadapterProperty#40;8BLDeleteadapterProperty H81:0ErroradapterProperty2!=0G0;0 872;5:8B5 :015;L!First, remove the cable!adapterPropertyIp-04@5A:  Ip-address: adapterProperty0A-04@5A:  Mac-address: adapterProperty 0A:0:Mask: adapterProperty=B5@D59ANetcardadapterProperty<O 040?B5@0:Netcard name: adapterProperty@>;CG0BL =0AB@>9:8 02B><0B8G5A:8Receive settings automaticallyadapterProperty&!1@>A8BL AB0B8AB8:CReset statisticsadapterPropertyLAN%1boxChipf<b>><?LNB5@</b><!--K <>65B5 8A?>;L7>20BL HTML.-->'Computercomputer><?LNB5@Computercomputereth%1computer&(;N7 ?> C<>;G0=8N: Default gateway:computerProperty,:;NG8BL <0@H@CB870F8NEnable routingcomputerProperty!2>9AB20 PropertiescomputerProperty B<5=0Cancel connectDilog!>548=8BLConnect connectDilog@K15@8B5 A>548=O5<K5 8=B5@D59AK:!Select the connected interfaces:  connectDilog6#:068B5 =0G0;L=K5 =0AB@>9:8 Specify the initial preferences  connectDilogACKdesignerDialog*>4B25@645=K9 =><5@:  Ack number: designerDialogArpArpdesignerDialog B<5=0CanceldesignerDialog$#:068B5 8=B5@D59A:Choose interface: designerDialog>;8G5AB2>:Count: designerDialogFINdesignerDialog $;038FlagsdesignerDialog04@FramedesignerDialogIpIpdesignerDialogA=>2=>5MaindesignerDialog:OkdesignerDialog&>=AB@C:B>@ ?0:5B>2Packet designerdesignerDialogRSTdesignerDialogIp ?>;CG0B5;O:  Receiver ip: designerDialogMac ?>;CG0B5;O:Receiver mac: designerDialog">@B ?>;CG0B5;O: Receiver port: designerDialog 0?@>ARequestdesignerDialog B25BResponsedesignerDialogSYNdesignerDialogIp >B?@028B5;O: Sender ip: designerDialog Mac >B?@028B5;O: Sender mac: designerDialog$>@B >B?@028B5;O:  Sender port: designerDialog0>A;54>20B5;L=K9 =><5@: Sequence number: designerDialogTcpTcpdesignerDialogUdpdesignerDialog B<5=0CanceldeviceNoteDialog?8A0=85 DescriptiondeviceNoteDialog?8A0=85: Description:deviceNoteDialog:OkdeviceNoteDialogDHCP :;85=B DHCP clientdhcpClientProgramm B<5=0CanceldhcpClientPropertyZ#:068B5 8=B5@D59AK, <br> :>=B@>;8@C5<K5 DHCP:8Choose interfaces which must
be under DHCP control: dhcpClientProperty*!2>9AB20 DHCP-:;85=B0DHCP client propertydhcpClientProperty:OkdhcpClientPropertyV@5<O >6840=8O <br>?@54;>65=8O dhcp-A5@25@0,Waiting time for offers
from dhcp-serverdhcpClientProperty(;N7GatewaydhcpServerModelIp-04@5A Ip-addressdhcpServerModel0A-04@5A Mac-addressdhcpServerModel 0A:0MaskdhcpServerModel @5<OTimedhcpServerModelDHCP A5@25@ DHCP serverdhcpServerProgramm=8<0=85WarningdhcpServerProgramm0DHCP A5@25@ =5 =0AB@>5=."Your DHCP server isn't configured.dhcpServerProgramm$H81>G=K9 480?07>= Wrong rangedhcpServerPropertyPK C:070;8 =525@=K9 480?07>= IP 04@5A>2."You have entered a wrong IP range.dhcpServerProperty A5: sdhspServerProperty>1028BLAdddhspServerProperty B<5=0CanceldhspServerProperty&#:068B5 8=B5@D59A: Choose interface:dhspServerProperty*0B@>9:8 DHCP A5@25@0DHCP server's propertiesdhspServerProperty#40;8BLDeletedhspServerProperty8=0<8G5A:85: Dynamic:dhspServerPropertyB:From:dhspServerProperty (;N7:Gateway:dhspServerPropertyIp 04@5A Ip addressdhspServerProperty!@>: 0@5=4K: Lease term:dhspServerProperty 0A:0:Mask:dhspServerProperty:OkdhspServerProperty!B0B8G5A:85:Static:dhspServerProperty>;5 ip 04@5A0.The field for ip-address.dhspServerPropertyF@5<O >6840=8O >B25B0 dhcp-:;85=B0:)Wating time for request from dhcp-client:dhspServerProperty4>:to:dhspServerProperty@8<5=8BLApplydialogTemplate B<5=0CanceldialogTemplate:OkdialogTemplateLAN%1hubChipl<b>>=F5=B@0B>@</b><!--K <>65B5 8A?>;L7>20BL HTML.-->"Hub hubDevice>=F5=B@0B>@Hub hubDevice H81:0Error hubPropertyR!=0G0;0 >BA>548=8B5 :015;O >B CAB@>9AB20!First, remove the cables! hubProperty0A-04@5A:  Mac-address:  hubProperty.>;8G5AB2> :>;;8789: %1Number of collisions: %1 hubProperty$>;8G5AB2> ?>@B>2:Number of ports:  hubProperty!2>9AB20 Properties hubProperty&!1@>A8BL AB0B8AB8:CReset statistics hubProperty(>ABC?=K5 ?@>3@0<<K:Available programs:  installDialog0:@KBLClose installDialogDHCP :;85=B DHCP client installDialogDHCP A5@25@ DHCP server installDialog H81:0Error installDialog#AB0=>28BLInstall installDialog4@>3@0<<0 C65 CAB0=>2;5=0.Program already installed. installDialog@>3@0<<KPrograms installDialogRIP installDialog "8?:  Type:  logDialog =0H5;  found  logDialog 8I5B  search  logDialogARP-%1: logDialogA5All logDialogArpArp logDialogG8AB8BLClear logDialog.DHCP A>>1I5=85, B8?: %1DHCP Message, Type: %1 logDialogForm logDialogISN %1, ACK %2 logDialogSiaddr: %1, Chaddr: %2 logDialogTCP logDialog @5<OTime logDialogUDPUDP logDialogXid: %1, Yiaddr: %2 logDialogD;038: ACK flags: Ack logDialogD;038: FIN flags: Fin logDialogD;038: No flagsflags: No flags logDialogD;038: SYN flags: SYN logDialogD;038: SYN, ACKflags: SYN, ACK logDialog?>;CG8;  received  logDialog 70?@>Arequest logDialog >B25Bresponse logDialog0IP 04@5A >B?@028B5;O: %1sender IP address: %1 logDialog2MAC 04@5A >B?@028B5;O: %1sender MAC address: %1 logDialog?>A;0; sent  logDialog.IP 04@5A =07=0G5=8O: %1target IP address: %1 logDialog0MAC 04@5A =07=0G5=8O: %1target MAC address: %1 logDialog><<5=B0@89 CommentarymyCanvas H81:0ErrormyCanvasD52>7<>6=> >B:@KBL D09; 4;O GB5=8O&Opening file for reading is impossiblemyCanvasJ52>7<>6=> >B:@KBL D09; 4;O 70?8A8 %1)Opening file for writing is impossible %1myCanvasz#AB0@52H0O 25@A8O D09;0 A>E@0=5=8O, D09; =5 <>65B 1KBL >B:@KB2Outdated version of the file, file can't be openedmyCanvas2!F5=0 >B:@KB0 87 D09;0 %1Scene opened from %1myCanvas2!F5=0 A>E@0=5=0 2 D09; %1Scene saved in %1myCanvas>1028BLAddprogrammDialog B<5=0CancelprogrammDialog#40;8BLDeleteprogrammDialog.#AB0=>2;5==K5 ?@>3@0<<KInstalled programsprogrammDialog:OkprogrammDialog@>3@0<<KProgramsprogrammDialog0AB@>9:8SettingsprogrammDialogRIP ripProgrammP:;NG8BL/2K:;NG8BL B@8335@=>5 >1=>2;5=85 Turn On/Off triggered updates ripProperty B<5=0Cancel ripPropertyK:;NG5=>Disable ripProperty:;NG5=>Enable ripProperty:Ok ripProperty0AB@>9:8 RIPRip program property ripProperty. 0AI8?;5=85 3>@87>=B>2:Split horizon: ripProperty8! >B@02;5=85< >1@0B=KE ?CB59With poison reverse ripProperty>1028BLAdd routeEditor0:@KBLClose routeEditor#40;8BLDelete routeEditor"4@5A =07=0G5=8O: Destination:  routeEditor (;N7:  Gateway:  routeEditor=B5@D59A:  Interface:  routeEditor 0A:0:Mask:  routeEditor5B@8:0: Metric:  routeEditor("01;8F0 <0@H@B870F88 Routing table routeEditor>4:;NG5=0 Connected routeModel 4@5A =07=0G5=8O Destination routeModel(;N7Gateway routeModel=B5@D59A Interface routeModel 0A:0Mask routeModel5B@8:0Metric routeModelAB>G=8:Source routeModeln<b>0@H@CB870B>@</b><!--K <>65B5 8A?>;L7>20BL HTML.-->%Router routerDevice H81:0Error routerDeviceLAN%1 routerDevice0@H@CB870B>@Router routerDevicev;O 87<5=5=8O :>;8G5AB20 ?>@B>2, A=0G0;0 >B:;NG8B5 ?@>2>40!5To change the number of ports, disconnect all cables! routerDevice,:;NG8BL <0@H@CB870F8NEnable routingrouterProperty$>;8G5AB2> ?>@B>2:Number of ports: routerProperty!2>9AB20 PropertiesrouterProperty KB sendDialog B<5=0Cancel sendDialog$K15@8B5 ?@>B>:>;:Choose protocol: sendDialog 0;55Next sendDialog6#:068B5 8=B5@D59A ?@85<=8:0 Select the network card receiver sendDialogB?@02:0Send sendDialogB?@02:0Sending sendDialog& 07<5@ 2 :8;>109B0ESize KB sendDialogTCP sendDialogUDP sendDialog A5: s settingDialog1 settingDialog12 settingDialog16 settingDialog2 settingDialog24 settingDialog3 settingDialog32 settingDialog4 settingDialog48 settingDialog5 settingDialog6 settingDialog7 settingDialog8 settingDialog9 settingDialog&!:>@>ABL 0=8<0F88: Animation speed: settingDialog@8<5=8BLApply settingDialog2B>A>E@0=5=85Autosave settingDialog2@078;LA:89 ?>@BC30;LA:89Brazillian Portuguese settingDialog B<5=0Cancel settingDialog><?LNB5@Computer settingDialog> C<>;G0=8NDefault settingDialog=3;89A:89English settingDialog2@5<O >6840=8O arp->B25B0!Expectation time for arp-responce settingDialog;02=K5General settingDialog>=F5=B@0B>@Hub settingDialog=B5@20;: Interval:  settingDialog"/7K: ?@8;>65=8O:  Language:  settingDialog0@5<O 687=8 arp-70?8A59:Lifetime arp-entries:  settingDialog=B5@D59AKNetcard settingDialogJ>;8G5AB2> 8=B5@D59A>2 ?> C<>;G0=8N:  Nubmer of interfaces by default: settingDialog<>;8G5AB2> ?>@B>2 ?> C<>;G0=8NNumber of ports by default settingDialog@>;8G5AB2> ?>@B>2 ?> C<>;G0=8N: Number of ports by default:  settingDialog<>;8G5AB2> ?>2B>@=KE >B?@02>::Number of repeat sendings: settingDialog:Ok settingDialog0@H@CB870B>@Router settingDialog CAA:89Russian settingDialog0AB@>9:8Settings settingDialogA?0=A:89Spanish settingDialog><<CB0B>@Switch settingDialogN@5<O 687=8 70?8A59 B01;8FK :><<CB0F88:#Switching table's records lifetime: settingDialogTcp settingDialog2:;NG8BL/K:;NG8BL OpenGLTurn on/off OpenGL settingDialogP@5<O >6840=8O ?>4B25@645=8O A>548=5=8O:Waiting confirmation time: settingDialog*"01;8F0 <0@H@CB870F88 Routing Table smartDeviceeth%1 smartDevice0:@KBLClose staticsDialog#AB@>9AB20:Devices: staticsDialog!B0B8AB8:0 Statistics staticsDialog TextLabel staticsDialog"@0D8::Traffic: staticsDialog0>;8G5AB2> ?@>2>4>2: %1 Number of cables: %1 statisticsScene6>;8G5AB2> :><?LNB5@>2: %1 Number of computers: %1 statisticsScene2>;8G5AB2> CAB@>9AB2: %1 Number of devices: %1 statisticsScene<>;8G5AB2> :>=F5=B@0B>@>2: %1 Number of hubs: %1 statisticsScene0>;8G5AB2> @>CB5@>2: %1 Number of routers: %1 statisticsScene8>;8G5AB2> :><<CB0B>@>2: %1 Number of switchs: %1 statisticsSceneLAN%1 switchChiph<b>><<CB0B>@</b><!--K <>65B5 8A?>;L7>20BL HTML.-->%Switch switchDevice><<CB0B>@Switch switchDevice$"01;8F0 :><<CB0F88Switching table switchDeviceLAN%1 switchModel0A-04@5A Mac-address switchModel>@BPort switchModel"8? 70?8A8 Record type switchModel@5<O 687=8TTL switchModel H81:0ErrorswitchPropertyR!=0G0;0 >BA>548=8B5 :015;O >B CAB@>9AB20!First, remove the cables!switchProperty0A-04@5A:  Mac-address: switchProperty#?@02;O5<K9 ManageableswitchProperty$>;8G5AB2> ?>@B>2:Number of ports: switchProperty!2>9AB20 PropertiesswitchProperty&!1@>A8BL AB0B8AB8:CReset statisticsswitchProperty>1028BLAddtableArpArp B01;8F0 Arp tabletableArp0:@KBLClosetableArp#40;8BLDeletetableArpIp-04@5A Ip-addresstableArpIp-04@5A:  Ip-address: tableArp0A-04@5A Mac-addresstableArp0A-04@5A:  Mac-address: tableArp 40?5@NetcardtableArp<O 040?B5@0 Netcard nametableArp"8? 70?8A8 Record typetableArp@5<O 687=8TTLtableArp00:00:00:00:00:00 tableSwitch>1028BLAdd tableSwitch0:@KBLClose tableSwitch#40;8BLDelete tableSwitchHH:HH:HH:HH:HH:HH;_ tableSwitchLAN%1 tableSwitch0A-04@5A:  Mac-address:  tableSwitch >@B: Port:  tableSwitch$"01;8F0 :><<CB0F88Switching table tableSwitch H81:0Error tcpSocket6TCP: H81:0 ?5@540G8 40==KETCP: Data transmition error tcpSocketA5All testDialog B<5=0Cancel testDialog:K15@8B5 :0B0;>3 A> A:@8?B0<8Choose a directory with scripts testDialog06<8B5 AB0@B Click start testDialog6!:@8?B 7025@H8;AO :>@@5:B=>Script finished correctly testDialog<!:@8?B 7025@H8;AO =5 :>@@5:B=>Script not correctly finished testDialog!:@8?BKScripts testDialog040BL ?CBLSet path testDialog0?CAB8BLStart testDialogLAN%1virtualNetwork0AB@>9:8DialogvirtualNetworkDialog ) , netemul-1.0/translation/netemul_pt_BR.ts0000644000175000017500000030016311303443115017542 0ustar frostfrost MainWindow Ctrl+X Ctrl+X Ctrl+D Ctrl+D Ctrl+Alt+S Ctrl+Alt+S Ctrl+Alt+P Ctrl+Alt+P Exit Sair You want to go? Você quer ir? New Nova Create new network Criar uma nova rede Packet designer... Open Abrir Open existing file Abrir arquivo existente Open... Save Salvar Save network Salvar rede Save as... Salvar como ... Save network as... Salvar rede como ... Close Fechar Close current file Fechar arquivo atual Show grid Mostrar grade Delete Excluir Deleting object Excluindo objeto Programs Programas Programs installed on device Programas instalados no dispositivo Setting Ajuste Statistics Estatísticas Show scene statistics Mostrar estatísticas do cenário Move Mover Move objects Mover objetos Cable Cabo Create connection Criar uma conexão Note Nota Insert text comment Inserir comentário de texto Unibus Gerar unibus Add unibus Adicionar um unibus Computer Computador Add computer Adicionar um computador Hub Hub Add hub Adicionar um hub Switch Switch Add switch Adicionar um switch Router Roteador Add router Adicionar um roteador Send Enviar Send data Enviar dados Execute scripts Executar scripts Run existing scripts Executar scripts existentes Properties Propriedades Show properties Mostrar propriedades <h2>NetEmul 0.8.5</h2><p>NetEmul is a program for the simulation of the computer network. <h2>NetEmul 0.8.5</h2><p>NetEmul é um programa para a simulação de rede de computadores. Ctrl+T Ctrl+T About Qt Sobre o QT File was modified Arquivo foi modificado File was modified, do you want to save changes? Arquivo foi modificado, você deseja salvar as alterações? About NetEmul Sobre NetEmul NetEmul Help Ajuda Full help system program Informações completas sobre o programa Netcards Adaptadores Edit netcards Editar placas de redes Stop Parar Stop simulation Parar simulação Programms Programas Programms installed on device Programas instalados no dispositivo Arp table Tabela arp Settings... Settings Configurações Show log Mostrar registro Show device log file Mostrar dispositivo do arquivo de registro About device Sobre o dispositivo Information about device Infomação sobre o dispositivo Create user's packet Print... Print user's network Preview... Preview network berfore printing Configure VLAN... Configure VLAN Set description... Set description of device Show labels Show labels on cables File Arquivo Edit Editar View Ver Object Objeto Service Serviço Scripts Scripts Help Ajuda Devices Dispositivos Controls Controles Ctrl+1 Ctrl+2 Ctrl+3 Ctrl+4 Ctrl+5 Ctrl+6 Ctrl+7 Ctrl+8 Ctrl+L Ctrl+F1 Ctrl+F1 Save file as ... Salvar arquivo como ... Networks(*.net) Redes (*.net) Play Reproduzir Start simulation Iniciar simulação Ctrl+I Ctrl+I Ctrl+P Ctrl+P Ctrl+Shift+A Ctrl+Shift+A QObject LAN%1 LAN%1 RIP RIP Connected Conectado Static Estático Dinamic Dinâmico Receive frames: %1 Receive packets: %1 Send frames: %1 Send packets: %1 The network is not working correctly A rede não está funcionando corretamente The network found a matching IP address A rede encontrou um endereço IP correspondente The network found a match ip-address! A rede encontrada corresponde ao endereço IP! Received frames: %1 Frames recebidos: %1 Received packets: %1 Pacotes recebidos: %1 Sent frames: %1 Frames enviados: %1 Sent packets: %1 Pacotes enviados: %1 Ethernet, sender: %1 receiver: %2 Ethernet, transmissor: %1, receptor %2 IP packet, sender: %1, receiver: %2 Pacote IP, transmissor: %1, receptor: %2 UDP Message user Mensagem UDP do usuário DHCP message Mensagem DHCP None Sem sender port: %1, receiver port: %2 Porta do transmissor: %1, porta do receptor: %2 Add %1 Adicionar %1 Delete Excluir Move Mover Error Erro The device can't transmit data! O dispositivo não pôde transmitir os dados! Add cable Adicionar cabo Add note Adicionar nota IP packet, sender: %1, receiver: %2 TTL: %3 Can't route packet! See adapter settings! Can't set this gateway! See adapter settings! The file is not a NetEmul file. aboutWindow About program Sobre o programa About Sobre Program for simulating computer networks. (C) 2009 Semenov Pavel and Omilaeva Anastasia Programa para simulação de redes de computadores. (C) 2009 Semenov Pavel e Omilaeva Anastasia Authors Autores <a href="https://sourceforge.net/projects/netemul">Home Page</a><br><br> Semenov Pavel - Project admin. Developer.<br> <br> Omilaeva Anastasia - Developer. <a href="https://sourceforge.net/projects/netemul">Página Pessoal</a><br><br> Semenov Pavel - Adiministrador do projeto. Desenvolvedor.<br> <br> Omilaeva Anastasia - Desenvolvedor. Thanks to Obrigado a Konstantin Andreev - Author of the idea and creator of the icons, Arina Shelest - Author of the logotype. Lisandro Damián Nicanor Pérez Meyer Márcio Moraes Konstantin Andreev - Autor da ideia e criador dos ícones, Arina Shelest - Autor do logotipo. Lisandro Damián Nicanor Pérez Meyer Translation Tradução Семенов Павел - Русский Márcio Moraes - Português brasileiro Lisandro Damián Nicanor Pérez Meyer - Español Семенов Павел - Русский Márcio Moraes - Português do Brasil Lisandro Damián Nicanor Pérez Meyer - Español Close Fechar adapterProperty Netcard Placa de rede Netcard name: Nome da interface: Mac-address: Endereço Mac: Ip-address: Endereço IP: Mask: Máscara de rede: Receive settings automatically Add Adicionar Delete Excluir Reset statistics Restaurar estatísticas Error Erro First, remove the cable! Primeiro, remova o cabo da interface! At least a netcard must exist Pelo menos uma placa de rede deve existir Must be at least one netcard Deve ser pelo menos uma placa de rede boxChip LAN%1 LAN%1 computer eth%1 eth%1 <b>Computer</b><!--You can use HTML.--> <b>Computador</b><!--Você pode utilizar HTML.--> Computer Computador computerProperty Proreties Propriedades Properties Propriedades Default gateway: Rota padrão: Enable routing Habilitar rota Description: Descrição: connectDilog Specify the initial preferences Especificar as preferências iniciais Select the connected interfaces: Selecionar as interfaces conectadas: Connect Conectar Cancel Cancelar designerDialog Main Frame Ip Arp Arp Tcp TCP Udp Ok Cancel Cancelar Packet designer Choose interface: Count: Sender mac: Receiver mac: Sender ip: Receiver ip: Response Request Sender port: Receiver port: Sequence number: Ack number: Flags SYN ACK RST FIN deviceNoteDialog Description Description: Descrição: Ok Cancel Cancelar dhcpClientProgramm DHCP client Cliente DHCP dhcpClientProperty DHCP client property Propriedade do cliente DHCP Choose interfaces which must be under DHCP control: Escolha as interfaces que devem estar sob controle do DHCP: Choose interfaces which must<br> be under DHCP control: Waiting time for offers<br> from dhcp-server Ok OK Cancel Cancelar dhcpServerModel Mac-address Endereço Mac Ip-address Endereço IP Mask Máscara de rede Gateway Rota padrão Time Tempo dhcpServerProgramm DHCP server Servidor DHCP Warning Your DHCP server isn't configured. dhcpServerProperty From De to para Mask Máscara de rede Gateway Rota padrão Mac Endereço MAC Ip IP Wrong range You have entered a wrong IP range. dhspServerProperty DHCP server's properties Propriedades do servidor DHCP Choose interface: Static: Estático: Add Adicionar Delete Excluir Lease term: Tempo de locação: s segundo Dynamic: Dinâmico: Ip address The field for ip-address. From: to: Mask: Gateway: Wating time for request from dhcp-client: Ok OK Cancel Cancelar dialogTemplate Cancel Cancelar Ok ОK Apply Aplicar hubChip LAN%1 LAN%1 hubDevice <b>Hub</b><!--You can use HTML.--> <b>Hub</b><!--Você pode utiliza HTML.--> Hub Hub hubProperty Number of ports: Número de portas: Manage via SNMP: Gerenciar via SNMP: Properies Propriedades Properties Propriedades Mac-address: Endereço Mac: Ip-address: Endereço IP: Mask: Máscara de rede: Reset statistics Restaurar estatísticas Description: Descrição: Number of collisions: %1 Número de colisões: %1 Error Erro First, remove the cables! Primeiro, remova os cabos da interface! installDialog RIP RIP Programms Programas Programs Programas Available programs: Programas disponíveis: DHCP client Cliente DHCP DHCP server Servidor DHCP Install Instalar Close Fechar Error Erro Program already installed. O programa já está instalado. interfaceDialog Add adapter Adicionar um adaptador ethernet 10/100 ethernet 10/100 ethernet 10/100/1000 ethernet 10/100/1000 Add Adicionar Add netcard Adicionar uma placa de rede Cancel Cancelar Speed: 10/100 Mbit/s Velocidade: 10/100 Mbit/s Speed: 10/100/1000 Mbit/s Velocidade: 10/100/1000 Мbit/s logDialog sent enviado received recebido Type: Type: DHCP Message, Type: %1 Mensagem DHCP, Tipo: %1 Xid: %1, Yiaddr: %2 Xid: %1, Yiaddr: %2 Siaddr: %1, Chaddr: %2 Siaddr: %1, Chaddr: %2 ISN %1, ACK %2 ISN %1, ACK %2 flags: No flags flags: Sem flags flags: Ack flags: Ack flags: SYN flags: SYN flags: SYN, ACK flags: SYN, ACK flags: Fin flags: Fin request pedido response resposta search localizar found encontrar ARP-%1: ARP-%1: sender IP address: %1 Endereço IP do transmissor: %1 sender MAC address: %1 Endereço MAC do transmissor: %1 target IP address: %1 Endereço IP do alvo: %1 target MAC address: %1 Endereço MAC do alvo: %1 Form De Time Tempo All Todos Arp Arp TCP TCP UDP UDP Ip Ip Clear Limpar myCanvas Opening file for reading is impossible Abrir arquivo para leitura é impossível Error Erro Outdated version of the file, file can't be opened Scene opened from %1 Scene saved in %1 Opening file for writing is impossible %1 Opening file for writeng is impossible Abrir arquivo para escrita é impossível The device can't transmit data! O dispositivo não pode transmitir os dados! The outdated version of the file, file can't be opened A versão desatualizada do arquivo, não pode ser aberto Commentary Comentário programmDialog Programms Programas Installed programms Programas instalados Programs Programas Installed programs Programas instalados Add Adicionar Settings Configurações Delete Excluir Ok OK Cancel Cancelar ripProgramm RIP RIP ripProperty Rip programm property Propriedade do programa Rip Rip program property Split horizon: Dividir horizontalmente: Disable Desabilitar Enable Habilitar With poison reverse Com veneno reverso Turn On/Off triggered updates Ativar/Desativar atualizações desencadeadas Ok OK Cancel Cancelar routeEditor Routing table Tabela de roteamento Destination: Para endereço: Mask: Мáscara de rede: Gateway: Rota padrão: Interface: Interface: Metric: Métrica: Add Adicionar Delete Excluir Close Fechar routeModel Destination Para endereço Mask Máscara de rede Gateway Rota padrão Interface Interface Metric Métrica Source Fonte Connected Conectado routerDevice LAN%1 <b>Router</b><!--You can use HTML.--> <b>Roteador</b><!--Você pode utilizar HTML.--> Error Erro To change the number of ports, disconnect all cables! Para alterar o número de portas, desconecte todos os cabos! Router Roteador routerProperty Properies Propriedades Properties Propriedades Number of ports: Número de portas: Enable routing Habilitar rota Description: Descrição: sendDialog KB KB Sending Enviando Cancel Cancelar Size KB O tamanho em KB Broadcast Broadcast Next Próximo Choose protocol: Escolher protocolo: UDP UDP TCP TCP Select the network card receiver Selecionar a placa de rede do receptor Send Enviar settingDialog Settings Configurações General Geral Computer Computador Hub Hub Switch Switch Router Roteador Lifetime arp-entries: Tempo de vida das entradas arp: s segundo Netcard Placa de rede Tcp TCP Animation speed: Velocidade da animação: Language: Idioma: English Inglês Russian Russo Brazillian Portuguese português brasileiro Spanish Espanhol Turn on/off OpenGL Ativar/Desativar OpenGL Autosave Interval: Nubmer of interfaces by default: O número de interfaces por padrão: 1 1 2 2 3 3 4 4 5 5 6 6 Number of ports by default O número de portas por padrão 8 8 12 12 24 24 48 48 Number of ports by default: O número de portas por padrão: 16 16 32 32 Switching table's records lifetime: Registro do tempo de vida da tabela do switch: Lifetime records of table switching Registros do tempo de vida da tabela do switch 7 7 9 9 Expectation time for arp-responce Expectativa do tempo para resposta do arp Number of repeat sendings: Número de envios de repetição: Waiting confirmation time: Tempo de espera da confirmação: Default Padrão Apply Aplicar Ok OK Cancel Cancelar smartDevice eth%1 eth%1 Error Erro Such a program already installed. Esse programa já está instalado. Routing Table Tabela de roteamento staticsDialog Statistics Estatísticas Devices: Dispositivos: TextLabel Texto Traffic: Tráfego: Close Fechar statisticsScene Number of devices: %1 Número de dispositivos: %1 Number of computers: %1 Número de computadores: %1 Number of hubs: %1 Número de hubs: %1 Number of switchs: %1 Número de switchs: %1 Number of routers: %1 Número de roteadores: %1 Number of cables: %1 Número de cablos: %1 Send packets: %1 switchChip LAN%1 LAN%1 switchDevice Table switching Tabela do switch <b>Switch</b><!--You can use HTML.--> <b>Switch</b><!--Você pode utilizar HTML.--> Switch Switch Switching table Tabela do switch switchModel Mac-address Endereço Mac Port Porta Record type Tipo de registro TTL Tempo de vida LAN%1 LAN%1 switchProperty Number of ports: Número de portas: Managed via SNMP: Gerenciado via SNMP: Properies Propriedades Properties Propriedades Manageable Mac-address: Endereço Mac: Ip-address: Endereço IP: Mask: Máscara de rede: Reset statistics Restaurar estatísticas Description: Descrição: Error Erro First, remove the cables! Primeiro, remova os cabos da interface! tableArp Arp table Tabela arp Mac-address Endereço Mac Ip-address Endereço IP Record type Tipo de registro Netcard name Nome do adaptador TTL Tempo de vida Mac-address: Endereço Mac: Ip-address: Endereço IP: Netcard Adaptador Add Adicionar Delete Excluir Close Fechar tableSwitch LAN%1 LAN%1 Table switching Tabela do switch Switching table Tabela switch Mac-address: Endereço Mac: HH:HH:HH:HH:HH:HH;_ HH:HH:HH:HH:HH:HH;_ 00:00:00:00:00:00 00:00:00:00:00:00 Port: Porta: Add Adicionar Delete Excluir Close Fechar tcpSocket Error Erro TCP: Data transmition error TCP: Erro ao transmitir dados testDialog Script finished correctly Script finalizado corretamente Script not correctly finished Script não concluído corretamente Choose a directory with scripts Escolha um diretório com scripts Script finished is not correctly O script não foi finalizado corretamente Scripts Scripts Start Iniciar Cancel Cancelar Set path Definir localização All Todos Click start Clique em iniciar virtualNetwork LAN%1 LAN%1 virtualNetworkDialog Dialog netemul-1.0/translation/qt_ru.qm0000644000175000017500000031720311271035563016137 0ustar frostfrost+O +O71E@FH4VHYLkH IJJeKLDցLPSxQLROWZr[`2[` \n_V_21?E@F 8] D[}$M2$,Խyss? 9M=qE6E DW%p%E׀֍5֍e֍s֍I00:70|0i00 55' D< DK+j,=,+ ~+8+B+S(+|T+ +į +įs+į+1n7і:9fZ;#@äC:F0i7Fn46Fn4zG8Hw9_Hw98HsI'M I/]IFJ+?J6J62vJ69)J6=>J6|J6IJ6J6.JcbKQKELZ֨LL2Lb>M5=MbMeEMNN)O|2PFE!oPFE~PFEQOGROR|ROS8^TTʴr]TU?^% U|6U}PV1V1^VlVVVVPW WTYWTWT)X~dX;*XbX˙;XYPY~YYHZgZklZQ[;^K\¬\]4i\]4\\;atgclGq|^caWv7v %&fZV4L 5P..H6CMXIA[;dIތyBɵn3ɵniɵnlɵnwɵnɵn&ɵnVɵn+ ]2 B* 'k=VMEpWaĠ_q- >GAH.<p5#Q%UT(ŎJW*42-ctB2W5v3R 7AicPJ) dytMPgy#FZnurl  ~Xp Yd "l),-["/=N1$u5~W< o?2E?NMNkytUiW~L%XLW]`4`Djtlg'lyzoCl}oivty3bvtyЎ1P "F*$ V648)m676{6 ^Zs`RsT=:~. aE΋E#εK{=>8AAY[yLRnwSt4y{m|M{\M EUmE^wmw:B~^E5 I 7f5 _!e%5&!)*/e5");pBybEc'F6OAZfE\c#`zb7dcփ0f"Ag&4]jCJ*mnQqUqI|tuu(Q{>_}kaQ#~#> Xy7t$B$aMm+,b(#ʁq2r^KKr֊2I ny$,jb;yOf-?An:s7^P=^&Hi./i?0IxS/M uR>$YMUYM^^>h^"i(sscs%wVBxL/^UK21Wۊ1at&$N.n]]I I(II8II6I I_Yڡiy%WٙIܱ۩-oguDYuDaD o,,s,%,,v]gI#?>rihɘe5$ 4e"fRPfRGG>ef g_]/NHNc%SP4Pq\V:nVfRBQ؟g N  O-l Xm/hd%C#&~On&))2o)-v*4<;+,}?"x?>uJ3dKN%MN>C*ROV|P]]h]kdIeSg4Wky^ {y5t?FHo:ΞBPG%Tn/صǥRw+` 64t {y/P R;QxARr9\QsQ"Ͼn%/{9C-5߾C^b.ƨzƨ˾kLҝziFէ?Z>#z@ߺOd?fq.i m\^!U $z~bGq~bKoMor!j)ў?j+u`q+3,8n%/)/1q4~ 6 ;? 2 ZAUDFGUGbJLAU]OrtPѧ9aQ`SnTYUmU^UThZ<ZbZՈZծ[ ]k*GI]- ^n_peiZiakQ$NoN!y;x={w}u}}w}w}w} #32nrψ"gBP\Pvt@tA..3@yPliUaDDYu_t*rt_It([-nh_ + FyCFʢ5UʢNƴd5dz ddd059jэ+fmNSUjdBhw$q 2C ?b j'V[+c,D/*2>42J6[d7Di:U?;DIN/gJ0CKPKU|V7=Y\arNt w;k|(^|D|}wZ}$}$}$ϗ6ZvVNHw\DeL>DdNaqK<:f+?·T· ý*%z׳ 8/`&Ur0ESHNYvku %5KJTTo e~>vi~ /iy9%w:b'X#}%!U'\-.Z."5kE==?t?w]CtIMP=V%HXU FkZO$`-`NX#bDbGpf5fdgAKhINi$@x1 z*2|QRdJYFQUԊ(.l5z?gc.c3rp6XmT^en($;iLC;ʴ5|ʴ5 `ʶ~>^ gYԄU۔#YD'NR;d`F5!4F5}[Ypf+>`I!IFAs y 5 }$z qe]c ڤ ڥ d/ Ex E hR Aci AcH U 35* W bl bb} b` b` gUv0 i3'6 laA uWg xq |o@ |^ Jr t tH .  I )< F>&\ @ * 9 4 Bm ҉ > j E l ya nv NU Y+H K K j 팤D l~1 %'  /) =p qQW  D | } o@ - ) */ө .>v 5H 7u ;qp =TK B Bn7 J" J" K2R Rۮz Ty T^Q Uj4t ] `h `ʆ bu bc c( cE d e eG e{҇ f1W f* g5U{ gn k, rD" t>R :0 f f C 4jL .Rm C s sEd AA[ 9 9 9{5  m, #-tJ 0N-- 5lZ A CUR E9 IN L L* L h Mc\<+ RH+ Sk- Vmd Wq ]$4z f) + f)C f=: io>B m`" w xR(/ yr6 >? O V H : HB ,4 n6 $D .@P U i   t  % J JE  t. k Ӈ  M2  N>p ̺S &j -DT .rP ۷ c>9 r< k ks U)bd  <! y 0ߘ   z+  Y}  aR INP %R NT   xHe w+ . .0; 7F >\5 >\ >] >eY >n0 >r > > ?t| DTS I/ P@ RVI[ RV 6 RV S.a SG S Y Y [b c`M hۮM j7oA p0 vW' +, .ɕ BlY N T4 Tx Tb T  l 5! Nz 3 )d Tvh  ;>Z .4= .iP .xw .R .m .9  t b) a y! T e.4 hNTa >D ҂ l  % u v . | Q  Xt^ nd 92 tj a 2 :bb UqX j O.1 ʜ/)  G #$l #=# %nU (I$2 (N) +>1 +k`5 0Er 64_ ;ɾ Fg. K9} Pt} Pt T>@I W 9y dBN| fe fel g iFCG iF iע jӮ kGn^_ m9 n" uV u v S v&{ v{ wr w{ w: w}͚ w} w}` |[% v V ^ %d Jg ^ }q RC P  xNK Uu ɰeS F\ " X. &%W Db HB + t5} t5` 6: J{ >_+ ~g  ) "gRhwh @aN-T+g do4gT+,**>* /E+</E=Bp#I_cAKrOOuXRuX+[ o[ a.9a.(gcnyG$vɅy$ȓ~d>8dS.4&R'343Sm^Ǘ)E:^B(rt]ݖ}[y^[v m  DG*lD!"#ˣ$U%4A!OE>bNAE4 E"~LLr+srky-Ln] BPt2-w|ʾdoUirxSwitching to the audio playback device %1
which just became available and has higher preference. AudioOutput^The audio playback device %1 does not work.
Falling back to %2. AudioOutputRevert back to device '%1' AudioOutput Close Tab CloseButton AccessibilityPhonon:: CommunicationPhonon::GamesPhonon::MusicPhonon:: NotificationsPhonon::VideoPhonon::~Warning: You do not seem to have the base GStreamer plugins installed. All audio and video support has been disabledPhonon::Gstreamer::BackendWarning: You do not seem to have the package gstreamer0.10-plugins-good installed. Some video features have been disabled.Phonon::Gstreamer::Backend`A required codec is missing. You need to install the following codec(s) to play this content: %0Phonon::Gstreamer::MediaObjectwCannot start playback. Check your Gstreamer installation and make sure you have libgstreamer-plugins-base installed.Phonon::Gstreamer::MediaObjectCould not decode media source.Phonon::Gstreamer::MediaObjectCould not locate media source.Phonon::Gstreamer::MediaObject:Could not open audio device. The device is already in use.Phonon::Gstreamer::MediaObjectCould not open media source.Phonon::Gstreamer::MediaObjectInvalid source type.Phonon::Gstreamer::MediaObjectWUse this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1%Phonon::VolumeSlider Volume: %1%Phonon::VolumeSlider%1, %2 not definedQ3AccelAmbiguous %1 not handledQ3Accel#40;8BLDelete Q3DataTable FalseFalse Q3DataTableAB028BLInsert Q3DataTableTrueTrue Q3DataTable1=>28BLUpdate Q3DataTablez%1 $09; =5 =0945=. @>25@LB5 ?@028;L=>ABL ?CB8 8 8<5=8 D09;0.+%1 File not found. Check path and filename. Q3FileDialog&#40;8BL&Delete Q3FileDialog&5B&No Q3FileDialog&OK&OK Q3FileDialog&B:@KBL&Open Q3FileDialog&5@58<5=>20BL&Rename Q3FileDialog&!>E@0=8BL&Save Q3FileDialog"&5 C?>@O4>G820BL &Unsorted Q3FileDialog&0&Yes Q3FileDialogb<qt>K 459AB28B5;L=> E>B8B5 C40;8BL %1 "%2"?</qt>1Are you sure you wish to delete %1 "%2"? Q3FileDialogA5 D09;K (*) All Files (*) Q3FileDialogA5 D09;K (*.*)All Files (*.*) Q3FileDialogB@81CBK Attributes Q3FileDialog 0704Back Q3FileDialog B<5=0Cancel Q3FileDialog>>?8@>20BL 8;8 ?5@5<5AB8BL D09;Copy or Move a File Q3FileDialog*!>740BL =>2K9 :0B0;>3Create New Folder Q3FileDialog0B0Date Q3FileDialog#40;8BL %1 Delete %1 Q3FileDialog5B0;L=K9 284 Detail View Q3FileDialog0B0;>3Dir Q3FileDialog0B0;>38 Directories Q3FileDialog0B0;>3: Directory: Q3FileDialog H81:0Error Q3FileDialog$09;File Q3FileDialog&<O D09;0: File &name: Q3FileDialog&"8? D09;0: File &type: Q3FileDialog09B8 :0B0;>3Find Directory Q3FileDialog5B 4>ABC?0 Inaccessible Q3FileDialog !?8A>: List View Q3FileDialog&!<>B@5BL 2: Look &in: Q3FileDialog<OName Q3FileDialog>2K9 :0B0;>3 New Folder Q3FileDialog >2K9 :0B0;>3 %1 New Folder %1 Q3FileDialog>2K9 :0B0;>3 1 New Folder 1 Q3FileDialog*25@E =0 >48= C@>25=LOne directory up Q3FileDialogB:@KBLOpen Q3FileDialogB:@KBLOpen  Q3FileDialog<@54?@>A<>B@ A>45@68<>3> D09;0Preview File Contents Q3FileDialog>@54?@>A<>B@ 8=D>@<0F88 > D09;5Preview File Info Q3FileDialog&1=>28BLR&eload Q3FileDialog">;L:> GB5=85 Read-only Q3FileDialog'B5=85-70?8AL Read-write Q3FileDialogB:@KB85: %1Read: %1 Q3FileDialog!>E@0=8BL :0:Save As Q3FileDialogK1@0BL :0B0;>3Select a Directory Q3FileDialog.>:070BL &A:@KBK5 D09;KShow &hidden files Q3FileDialog  07<5@Size Q3FileDialog#?>@O4>G8BLSort Q3FileDialog> &40B5 Sort by &Date Q3FileDialog> &8<5=8 Sort by &Name Q3FileDialog> &@07<5@C Sort by &Size Q3FileDialog!?5FD09;Special Q3FileDialog"!AK;:0 =0 :0B0;>3Symlink to Directory Q3FileDialog!AK;:0 =0 D09;Symlink to File Q3FileDialog$!AK;:0 =0 A?5FD09;Symlink to Special Q3FileDialog"8?Type Q3FileDialog">;L:> 70?8AL Write-only Q3FileDialog0?8AL: %1 Write: %1 Q3FileDialog:0B0;>3 the directory Q3FileDialogD09;the file Q3FileDialog AAK;:C the symlink Q3FileDialog:52>7<>6=> A>740BL :0B0;>3 %1Could not create directory %1 Q3LocalFs*52>7<>6=> >B:@KBL %1Could not open %1 Q3LocalFsB52>7<>6=> ?@>A<>B@5BL :0B0;>3 %1Could not read directory %1 Q3LocalFsL52>7<>6=> C40;8BL D09; 8;8 :0B0;>3 %1%Could not remove file or directory %1 Q3LocalFs@52>7<>6=> ?5@58<5=>20BL %1 2 %2Could not rename %1 to %2 Q3LocalFs,52>7<>6=> 70?8A0BL %1Could not write %1 Q3LocalFs0AB@>8BL... Customize... Q3MainWindowK@>2=OBLLine up Q3MainWindow>?5@0F8O ?@5@20=0 ?>;L7>20B5;5<Operation stopped by the userQ3NetworkProtocol B<5=0CancelQ3ProgressDialog@8<5=8BLApply Q3TabDialog B<5=0Cancel Q3TabDialog> C<>;G0=8NDefaults Q3TabDialog!?@02:0Help Q3TabDialogOKOK Q3TabDialog&>?8@>20BL&Copy Q3TextEdit&AB028BL&Paste Q3TextEdit&>2B>@8BL&Redo Q3TextEdit&B<5=8BL&Undo Q3TextEditG8AB8BLClear Q3TextEdit&K@570BLCu&t Q3TextEditK45;8BL 2A5 Select All Q3TextEdit0:@KBLClose Q3TitleBarCloses the window Q3TitleBar*Contains commands to manipulate the window Q3TitleBarFDisplays the name of the window and contains controls to manipulate it Q3TitleBarMakes the window full screen Q3TitleBar 0725@=CBLMaximize Q3TitleBar!25@=CBLMinimize Q3TitleBarMoves the window out of the way Q3TitleBar&Puts a maximized window back to normal Q3TitleBarPuts a minimized back to normal Q3TitleBar Restore down Q3TitleBar Restore up Q3TitleBarSystem Q3TitleBar>;LH5...More... Q3ToolBar(=58725AB=>) (unknown) Q3UrlOperator@>B>:>; `%1' =5 ?>445@68205B :>?8@>20=85 8;8 ?5@5<5I5=85 D09;>2 8 :0B0;>3>2IThe protocol `%1' does not support copying or moving files or directories Q3UrlOperatorl@>B>:>; `%1' =5 ?>445@68205B A>740=85 =>2KE :0B0;>3>2;The protocol `%1' does not support creating new directories Q3UrlOperatorZ@>B>:>; `%1' =5 ?>445@68205B 4>AB02:C D09;>20The protocol `%1' does not support getting files Q3UrlOperator`@>B>:>; `%1' =5 ?>445@68205B ?@>A<>B@ :0B0;>3>26The protocol `%1' does not support listing directories Q3UrlOperatorZ@>B>:>; `%1' =5 ?>445@68205B >B?@02:C D09;>20The protocol `%1' does not support putting files Q3UrlOperatorv@>B>:>; `%1' =5 ?>445@68205B C40;5=85 D09;>2 8;8 :0B0;>3>2@The protocol `%1' does not support removing files or directories Q3UrlOperator@>B>:>; `%1' =5 ?>445@68205B ?5@58<5=>20=85 D09;>2 8;8 :0B0;>3>2@The protocol `%1' does not support renaming files or directories Q3UrlOperator>@>B>:>; `%1' =5 ?>445@68205BAO"The protocol `%1' is not supported Q3UrlOperator&B<5=0&CancelQ3Wizard &$8=8H&FinishQ3Wizard&!?@02:0&HelpQ3Wizard&?5@54 >&Next >Q3Wizard< &0704< &BackQ3Wizard*B:070=> 2 A>548=5=88Connection refusedQAbstractSocketConnection timed outQAbstractSocketHost not foundQAbstractSocketNetwork unreachableQAbstractSocket$Operation on socket is not supportedQAbstractSocketSocket is not connectedQAbstractSocketSocket operation timed outQAbstractSocket &Select AllQAbstractSpinBox&Step upQAbstractSpinBox Step &downQAbstractSpinBoxActivate QApplication#Activates the program's main window QApplicationr@>3@0<<=K9 <>4C;L '%1' B@51C5B Qt %2, =0945=0 25@A8O %3.,Executable '%1' requires Qt %2, found Qt %3. QApplicationDH81:0 A>2<5AB8<>AB8 181;8>B5:8 QtIncompatible Qt Library Error QApplicationLTRQT_LAYOUT_DIRECTION QApplication&B<5=0&Cancel QAxSelect COM &Object: QAxSelectOKOK QAxSelectSelect ActiveX Control QAxSelectCheck QCheckBoxToggle QCheckBoxUncheck QCheckBox<&>1028BL : A>1AB25==K< F25B0<&Add to Custom Colors QColorDialog&A=>2=K5 F25B0 &Basic colors QColorDialog$&!>1AB25==K5 F25B0&Custom colors QColorDialog &5;:&Green: QColorDialog &@0A:&Red: QColorDialog &0A:&Sat: QColorDialog &/@::&Val: QColorDialog&;LD0-:0=0;:A&lpha channel: QColorDialog !&8=:Bl&ue: QColorDialog &">=:Hu&e: QColorDialog Select Color QColorDialog0:@KBLClose QComboBox FalseFalse QComboBoxB:@KBLOpen QComboBoxTrueTrue QComboBox%1: ftok failedQCoreApplication%1: key is emptyQCoreApplication%1: unable to make keyQCoreApplicationUnable to commit transaction QDB2DriverUnable to connect QDB2DriverUnable to rollback transaction QDB2DriverUnable to set autocommit QDB2DriverUnable to bind variable QDB2ResultUnable to execute statement QDB2ResultUnable to fetch first QDB2ResultUnable to fetch next QDB2ResultUnable to fetch record %1 QDB2ResultUnable to prepare statement QDB2ResultAM QDateTimeEditPM QDateTimeEditam QDateTimeEditpm QDateTimeEditQDialQDial SliderHandleQDial SpeedoMeterQDialDoneQDialog'B> MB>? What's This?QDialog&B<5=0&CancelQDialogButtonBox&0:@KBL&CloseQDialogButtonBox&5B&NoQDialogButtonBox&OK&OKQDialogButtonBox&!>E@0=8BL&SaveQDialogButtonBox&0&YesQDialogButtonBoxAbortQDialogButtonBox@8<5=8BLApplyQDialogButtonBox B<5=0CancelQDialogButtonBox0:@KBLCloseQDialogButtonBox*0:@KBL 157 87<5=5=89Close without SavingQDialogButtonBoxDiscardQDialogButtonBox5 A>E@0=OBL Don't SaveQDialogButtonBox!?@02:0HelpQDialogButtonBoxIgnoreQDialogButtonBox N&o to AllQDialogButtonBoxOKOKQDialogButtonBoxB:@KBLOpenQDialogButtonBox!1@>A8BLResetQDialogButtonBoxRestore DefaultsQDialogButtonBoxRetryQDialogButtonBox!>E@0=8BLSaveQDialogButtonBoxSave AllQDialogButtonBox0 4;O &2A5E Yes to &AllQDialogButtonBox Date Modified QDirModelKind QDirModel<OName QDirModel  07<5@Size QDirModel"8?Type QDirModel0:@KBLClose QDockWidgetDock QDockWidgetFloat QDockWidgetLessQDoubleSpinBoxMoreQDoubleSpinBox&OK&OK QErrorMessageL&>:07K20BL MB> A>>1I5=85 2 40;L=59H5<&Show this message again QErrorMessage*B;04>G=>5 A>>1I5=85:Debug Message: QErrorMessage&@8B8G5A:0O >H81:0: Fatal Error: QErrorMessage@54C?@5645=85:Warning: QErrorMessageCannot create %1 for outputQFileCannot open %1 for inputQFileCannot open for outputQFileCannot remove source fileQFileDestination file existsQFileFailure to write blockQFileK%1 Directory not found. Please verify the correct directory name was given. QFileDialogA%1 File not found. Please verify the correct file name was given. QFileDialog-%1 already exists. Do you want to replace it? QFileDialog&Choose QFileDialog&#40;8BL&Delete QFileDialog &New Folder QFileDialog&B:@KBL&Open QFileDialog&5@58<5=>20BL&Rename QFileDialog&!>E@0=8BL&Save QFileDialog9'%1' is write protected. Do you want to delete it anyway? QFileDialogA5 D09;K (*) All Files (*) QFileDialogA5 D09;K (*.*)All Files (*.*) QFileDialog!Are sure you want to delete '%1'? QFileDialog 0704Back QFileDialogCould not delete directory. QFileDialog*!>740BL =>2K9 :0B0;>3Create New Folder QFileDialog5B0;L=K9 284 Detail View QFileDialog0B0;>38 Directories QFileDialog0B0;>3: Directory: QFileDialogDrive QFileDialog$09;File QFileDialog&<O D09;0: File &name: QFileDialogFiles of type: QFileDialog09B8 :0B0;>3Find Directory QFileDialog ?5@54Forward QFileDialog !?8A>: List View QFileDialogLook in: QFileDialog My Computer QFileDialog>2K9 :0B0;>3 New Folder QFileDialogB:@KBLOpen QFileDialogParent Directory QFileDialog Recent Places QFileDialogRemove QFileDialog!>E@0=8BL :0:Save As QFileDialogShow  QFileDialog.>:070BL &A:@KBK5 D09;KShow &hidden files QFileDialogUnknown QFileDialog%1 GBQFileSystemModel%1 KBQFileSystemModel%1 MBQFileSystemModel%1 TBQFileSystemModel%1 bytesQFileSystemModeloThe name "%1" can not be used.