ref: segregate chat sytem

This commit is contained in:
semenov
2025-07-31 10:21:47 +03:00
parent 88239e8491
commit 5a07c144a1
24 changed files with 585 additions and 144 deletions

34
DOCS/ChatSystem.md Normal file
View File

@@ -0,0 +1,34 @@
---
excalidraw-plugin: parsed
tags: [excalidraw]
---
==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠== You can decompress Drawing data with the command palette: 'Decompress current Excalidraw file'. For more info check in plugin settings under 'Saving'
# Excalidraw Data
## Text Elements
Отправка ^yf1UxnG5
%%
## Drawing
```compressed-json
N4KAkARALgngDgUwgLgAQQQDwMYEMA2AlgCYBOuA7hADTgQBuCpAzoQPYB2KqATLZMzYBXUtiRoIACyhQ4zZAHoFAc0JRJQgEYA6bGwC2CgF7N6hbEcK4OCtptbErHALRY8RMpWdx8Q1TdIEfARcZgRmBShcZQUebQB2bR4aOiCEfQQOKGZuAG1wMFAwYogSbggASWdJTXoARRwKQgAlQgB1ZShCAGtuzABZZpTiyFhEcsDsKI5lYOGSzG5nADYA
ZgBGJIAGHfWeHi34rY2+AsgYJfWAFkSeAE5V+NWH9YAOV5vl5f4SpuJ1bh7V7aV47LZXd48V57ACsP0gkgQhGU0m4V02yzBW2W62OMPWMOWPDhZwg1lm4lQW3hEGYUFIbG6CAAwmx8GxSOUAMTrBC83nzSCaXDYbrKBlCDjEVnszkSenWZhwXCBLKCiAAM0I+HwAGVYHMJIIPOq6QymW0SAC0KcRrT6YyEPqYIb0MayjSJSiOOEcmh1jS2MrsGoL
v6djTxcI4BViH7ULkALo0jXkDKx7gcIQ6mmEKVYcq4LbqiVSn3MeNFO1jSmrM4AXxpYQQxG4dx48Rhrxh+KuNMYLHYXDQV1tJQHrE4ADlOGJAdc7kTQfE+6TCMwACJpKAt7gaghhGmaYRSgCiwQyWXjWZzpKEcGIuB3rf9ndWry+PauWxhY8gRA4bpM2zfAaXZUVdzQfd8DCApGwKKtIDKCQYA1dYAFVMA4ABxGF1Rrcod0wKB1UWNAVnWVZtExH
ZVi+HhcQeV4aTDVBnEou5qIeJ5VgYmFVl444aT+a1UDuTYeGeO4rhkrsdniaEaURZFURtEk7XJV1qVJM1HRlDluX5PkkCPEUxVLaU2QM+VyA4JUVUyEiU21PUDUpWk2Q9HSHQtK1JG4P97XNJ03PKd1W09YRvV9QFA2DUNAQjUko3vWN4yTFM0wQDM0BvUC13zMj0FwdYSxPYhy2vECmwQSDUD2Z54kXeIFP7JhJ2HVBRzawdp1nSk1hXd4rjubS
7XXLdgmfPcDwQI9yvPdJHKq287XvR9ptffiP2WGEjmk1c7QAoDcuq0lwKZF9UGgw9SSIkiJEAPBBACEQQB+EEAARBAAYQQAmEEALhBPpLSgABUsAe9AXo+n7/vVDVOCgXVCCMSkDhTOGADFcH0bVWPUkp7oAQSIZROogYINSc0kBy6dxCeREmoCDdU9CyXA8yYHLUDywNSGRPMCBB4jyghr6/oBmlcCEBnmnCRHKXpIQ5vOtmAAkkRRMGJJhODwG
TOhcDgOB9SfSkq2gREMnKInUR+BhCAQCgACEzJSqV9LldAuQ1L3vfmCBsBEVUoAqHd9H1YK3cM4yBRt/3SED4P0id0UXcs2VCNs+zA992P45DtGXOdV0PJNGOA8chPQ58hBLX+fybVLuPy5DsPHUL9zwuzsusgr5ooskSrYoKP2u6DkOAHl4tgRKxsgHOm/SNH0cx7HuFx4fG+7vO4YRpGApn9fc/SAWoFp4nLYQcnO430f0iN0gT7jtgKERXArq
5oe5839JTylfHH+fkIV0yT/yvoffQf8GQUCBvAdyFlfbMGwAyHUAANbg3YAxDwQUg/AABNVe6xlgJGxJJFq7ZFzvBtkYNgBhuCIQYAQBWgI4INzAb3SUFUYoSDgTbcUJAd7I33rw4g+oEBwFXjwnmxB+hsGIAgH+uBNDBCujdRWJQhERzQHQh2bIgGkGUMKAAFAxeI1BeDrBMWYixWxtAwgAJTqmlsobMKoJj6NwEY1Y1JeCeNMZJLx1i7EQGYR/
EeLcmQTy6JwFa+USipkxggaW+YeYzFoaSTICilHcHlqoko2AiBiLQNkmkHB4lZNIArQMksAJy3KQgYJJQ7AACsEBTGYLqEpcBpGyPkYouqKibYii6IwIG1D8CpOrDAsKaQphDiZkIOkBhoHjFOqtEoF0+mzTAqEE+MzhmjOAjqbWYB4KQC1MESs9YQD1iAA=
```
%%

View File

@@ -80,7 +80,7 @@ Mainthread:
*processingSystem *processingSystem
*dataParser *dataParser
*MultiThreadServer *MultiThreadServer
* commonClientHandler *commonClientHandler
^ite9vjus ^ite9vjus
@@ -175,6 +175,100 @@ ConnectionThread:
*TaskPreparation *TaskPreparation
*FIMTaskWidget ^O3pqGffr *FIMTaskWidget ^O3pqGffr
*chatSystem ^b7EqD2zH
*processParser ^QEHpQT3C
Порядок приема! ^IhrFmEwa
ClientHandler ^hA67NX92
пришел пакет ^vwSug0iv
recognizeSystem ^gYoRaFjM
signal ^s3BggWax
PacketType ^eiUwEZk1
TYPE_QT ^bzVkNpgQ
TYPE_UNITY ^lkF2Hfrk
Client ^cZL9Lm6G
TYPE_COMMAND ^c2enziXT
TYPE_UPDATE ^aQlbZQfR
TYPE_CHECKVERSION ^JjIbDSjq
TYPE_XMLANSWER ^U6aCFgOm
TYPE_BIGXML ^kIrvUW3G
TYPE_FOLDER ^OaoJWB2v
TYPE_FILESIZE ^jjh2X7VX
TYPE_FILE ^kz1hpduO
TYPE_FINISH ^DPK0X3mc
CHANGE_DATA_VERSION ^hD9JlNEL
COPY_VERSION ^Kj1GcL4q
DELETE_DATA_VERSION ^R6Jr1xck
TYPE_DISABLE ^FqZC4poj
? ^kS0XE2js
SendSystem ^d1FGddrv
UpdateController ^O98uEJQE
signal ^1sdwEl6p
signal ^XbE1h3aA
IO ^RoEr0kzs
continue ^eTnS6u7E
IO ^qfdbTB5d
signal ^7zjZjI4t
UpdateController ^97Le7A78
signal ^6OX2J6Ot
UpdateController ^AECBhhHd
signal ^dySrkXCr
UpdateController ^ZeVz0UiF
signal ^21vfbgpr
UpdateController ^SlSJmLFk
clientHandler ^vuFNvZ7S
ProcessParser ^8cdlwzg0
ProcessingSystem ^sQJhZ7It
ClientHandler ^IEdXlIQV
send ^CUe8xVmm
TYPE_COMMAND ^Qljc4T07
TYPE_DISABLE ^IIrBIFHt
%% %%
## Drawing ## Drawing
```compressed-json ```compressed-json
@@ -330,160 +424,352 @@ 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= Ay4ZIiJXFrdaBmIMmBsSMrNAABCAZwdor2TyabtGY8PtEHwmyaDIIZAnQQ3jqwnxF1lLVGMXZ5F6og2EGokJEDo2uRDox2Qjo01Fu1c1EQQ/Ihe4U8gjAW3AB4CgDKAdVQAgZcC3Aa3BsCDdjKAB4C6VWYYusXATWFKIAbiX4IEPCHZqQcmQ7cS0z46Q0AlwRiAlgVmj5dFQzQobSAXDBqZP9R+aelcHjmlAlEHAnpHtQvpGkogZGDgoZEKjCmF+
nGlH0InOHwAzgq5olT6MwwZ4NfBbAFCI0GJheLb6gCuG7mEoYTlF4z7FeLr8o3E6z3Rba17dYAlRBSD9AYPjJAalJl/ZBxMCBUwxgDTbB8XdBGAa3CkAcYB6bIEAO4CoBGAS8jOAGJqS5OJo+EBJpnuRtGzAWmiNiVtFzrLJFHdC9TwpbjH2oiv7W+X2ad5Y4ZOwXvpsg+CByMKPrqZBromCdcEf2Q7ytPUbDzUed6dIvGGEoxDH/bBwEoYom5oY
/sEYYjOFYYj36ZoyW7agnNGimBeD5opC4zgvQwlpRhROvES7zQ9c5FHLDTVYDx56/BQEvyeuHTvN2jqYjuAL+VuEEA9uEeFZHJyohnYG1MrEC5NVE3I7xH4AudEChagFKvWgGELfWHELA9FHok9Fnot4AXoq9E3ou9EPo3gEkSAwqZFWsr2PFmZ23HdGAIm2H5Eb4BsAZgCXkUjIxocYBwAR0DKAAmyxWSHSnorTZGY1X6/BVODOo+XIXuFBrneT
6wzYf9FqeGmDl8MLgXKLDhgBVCCrfLOBtgkPYygqP7cQxOGulMlFKgilFBYtNEhYhYGjgis74YqLEpWHIbEYmr7xLI0EooLSB7CajHqhFbaqQ03gaOWhpCNVaH9ePt4sYzsZsYswYUAN4B+AVladHFTHdHDdL3aEfghhUWHYXXvYSuWEEj/fd55eVygUaJ7GZwRf7BoR6HrvTPovQypaJg6Y7X3Af49bSVY/Quyhpg9YD0APHEE41RZ7Ytf4UKGN
QBhEsBgVNbrLIs7H/Sa8ahwBtLyQXkFdWSVAzYB6B3QxiE6GeDFvYkhG3LbsFfY1DECQ5NHaAl/bqgya5A40e4g4vAzcwGLEy3QtEqRPHRpRHb5mg1LEKYechy2JjFCPERH2+YALTQD6LaYiVEkSIdGo8KTRDaRLTuaXFaEDKPGe2F2Sx43W4vtQ+H1Y4+H8hOOzCfJ5Fc/CABifdrF4zebGLY5bGrY9bGbY8ojbY5QC7Yi26FA7lYJ46PHJ4i8K
p4iq6TYxX7lAmbEWo/IiCYuADCYh4CiY8TGSYtw4yYuTEKYp9FKYyVZuw9Tyd3VaCUaUfJWY1DKyIepB1ga5AOLWsF0MRZIOQJIaQYlsFEgSRhAYkqDORH+yG4mNGrtGP4nAkyL+Yi3FTAq3Hk3HWYjguC64Y2mETgqLG/AZ3FvAyHFkYuZFpkVor1XJSCcwrmgpYRBr+4mOZY4lc5NfakDtAMyTKAT4C4ASUCN/QVxGCWtLv/OwwHI1eoqxWnFF
9eb4mkNdzXQbfETrRlD74jy5h+egjHVB6GjfGMH1bKLwHdU9L7ow9HHo09Hnoy9HXot4C3o+9E3qKbrH1UBqctTvaOkXDAXuP9hLdW+oBtBPr7PJPq7dBMHvQ/yGfQgXEdsIXFhAEXGQE6AmwElhFz3cGFSgI4hBweLYCEM+o8sS0xcwg4iDcEwQQWDp6btUDF0EKDi2XY6r3jA3GeYhDFtQnzEdQvzH8QzQGW4oSH/YrJ6hYl4HSiXNG/AXMFEY
thH93U3jr9DeBotbmZe4pHERwQrqf5LSEIqXLHVZMnG8UGKph47Kpa3VgA90AgADOdImrya5FSPEn5oDRrHZ45rGc/ZV50Avk5BIiQA94vvED4iTFSYkfHyY4bFusbImZE0CHTY215AIxtDzZZcAXoC9CyTfoBAgSQCXkB4AAgDdgHADdiylAPCFIl6Ivo8mi6CV2D/BCzFwoQRDuvWL6fWAZJeos4pgVdTzBwzDTCZMQhIg+Nb00BrAVeSaAawR
ZF2Eo3GxosH4X48/7uEqlGjIrwkVfLNZ0wqLGjGZlF15BrykYoVjbQ77Ar4pZGI4yuHmXVuoaZdsSxEnLGjPAmrY4yZ75EZQDIMa3C4AF4BboWgQIEtTH3aW1SLIP4GKE9ACwk8tgIkpElS4xr5AWKhRIIPYLqteCzbjazHHwAXSbEb0oUodhQf2YTJtuTUAKebPYeYohGcQhwmjJeNEwnEmFJom/F3EpHQPEwHGP4rNERY0Ti5os84BEllEBzFL
AeOOXrcNKWgqQwEmy4S4rHcbmLyAo/5Y/YvINwhtFokyxi2wYrHwjV+FnInj7Gkq5Fjo0k6xAz66ZA9GYaPHnZaPHn7iffIiVNZgDdE3olGAfomDE4YmjE8Ym7oSYmNEv15Dw6jomkq17pI3T7tE2bHrAX4DW4HwDjACoC3AZQCXqfABGAGAAVAbED8EQgCT2AkmqDKFFFWG4Yz4oXpqZY2C/o1KKXYhWhnYXDD+VMrz8ID7qmwRLBq2HI7BnFqD
kQvZB7TE/GtQ2h4JwshFJw77G6LQLGvHTDGeE4UkRLJ/GMIvywqgd/EQ4g0G29Is5CIEMKQWC7QpYpHH9cBxBPAeUkak+0F1ogWH8cRtHKpYh6GkzAnnPI6H2casnffWslSUJL4sqJskRow1ChQNGHkEnv4Z9WMFd/VoSSEqY4fQ7yGpgwFHGpKmq1ESQAUAYYwVAZwAbsDgDKLO0AUg2ogB4H27TEyiazEvOp0EGWhgoSdIDJN84GA+XwbEuDSd
QaYC3YzDTYIjnyfedYSYhZqARo0rqw4uzZhcWOFJHOwGOE5DGX4lwmTAw9YQvVNH3E9NHYYsLFag3OGRYx3E3fKUkfE8XxfE4Hw/sLqgCEIZbw4u4RYYbXoWgjcH6/PmEQk5JZQkiAmQMChbYgAFLKADe4ZzOMYlOArFowhcFiw/6YPvPdFpEZSmqU3bZFI3MmoYYnqtJAsAlxPHQRnT6wntWzFx0FODJE8qHCZUHytQegrhbVsHtkuOGckrsHck
8hG9kwZH9k4D6Dk3QGIFCZEO4o9SXofwkzIzH4PAlL7hgstHiA4/ZiOcjBlQjclrQrck6k3CjaU3QioEysLU4iWEkSZogu4GNDLgBpRcDTK4lUsqkVUqqmxA3AEZ4u5EnwpCY54nVFfggvGvI5dFapX8n/kwCnAU0ClTAcCntASCnQUkxJyHCAClU8qmVU8q7mdP+FTYtmYRkrvH4tQgCXkOuK81cmzj44zFuhJfDOonYiBhbKS/o/NqXY6vCBQK
+pVkyuDqtQIREYcMFInF7EhHS4ln444F4vOikpw/km9QjwnhUjSaRUl4mO40GGsI6UlKiJxCOLFFoe41942XVKIl1dHHZVeIlaUxIkHGWK7MfLopa3VbLOFZoh3UHj6o05jro0htAWk964zohrHRFedFnwhIr5A86ITUrGk7kHGmd2CbHCbP5EcLIcoGOBAAUAbEBr3ZUrWnegBAw24ApwNgAjAIQC4MPQDZkmYlvo+CmfIRWzYYciyoUpyK0WE6
nR0ZyljAHCkMiPCn+CAin4ImSTEUiGkkPTmAl1SikoWbzFck3zGvUvkmMUtOEZPMKmgfD6o/Ul/GO4iFG8UzerxuASmI/ZOD5tEkhHHDyzlo1DKtiQdyAyMEmyU0v6Qk8AmV/fIj4AHSq2nKoB3gFEmk4xBp7CemSYk78nhiUOnceaTrZk6Srstb6jqwBdp/SM0Duo6WlI9evQuqUgi/UD+zrEb/pnQdKjuA95b3UhyKPUup7ygnkkUI/z6/Ygcn
BYockP4kcmikzinikqLEyHAGlBxF5Rv+E3rqkxiY8w516lgRdqncEAnBAwPEFYuFBK4rAHoE8PFusKakVUy8j9AW4ClUgZzL0hpSr09ekdXJ8FeIq0mvg3xGtU4omfgvPGdUsUIVE9ADM01mmYAdmm3ATmn6Abmk2DPmkC0uQEnSCalb0nekb01omLUp6IczAxyhQZ3AIAB3AuAAEAnodoA/uX7RdZGYB70zmY4QzwZowFyLcVYUwdYOylYYF/ol
wem5ZfF27lQ1xy7cGwRcg53pEaPWbRojsmygrsmm4mGpBUgLFN00Kkt0r6njIulESQvx7RUx9Hg48aE9vOSHFScP4aZf/AFKCInKkzmwI1ERCT0xl71o3Klk45VDHcA8nD/LAlmQhAiucT0qEMtck9pCKiRgigkeQ61peQ7Z4+QnRlEOXnFHPfnFzHb6HL/X6EdEiQDOAN4C4MR0BwAZogPAYgANKNgAxoCoBcpN4Bk8N4DtAQpJC02Cki0x1ESM
RWxEFbOZwfLab2UkWBcQOmBd3P4Lq/Vy42sZnGOQNGxEaagqToydG+hXWlgHJDEkoo2mN0twkfUlikA4tulW0vOGO44cbvE+2koOR2mFo7hCNvJLGMTCGomfHljOeAWJiM/KL1fSFHQkm4AbselIO4fQC/AYcaR0/LFk4ijhrKFIkGU3TGdM7pm9M0plmU5twOkLiBWzE7AHFQDi/owKCOU7BmdIdfHPFPJAvzBJCsQsl5sk1lpkM3ymdk4lG7XZ
wlvUk2kpos2kMMi2kRU5hnDQqLFTEu2nacWfSvQJiADYAEm7mKSkTlb/qEwYUwtM7Ul5YnclDMyxi8Ipj7io1IlmiU7Im1ZDy5Et66E7OIHNUrPEUbO0k0A3nZlE/IEQAKxk2MuxkOMpxkuMtxkeMrxkyXD+lqfaFm/0m17/0rEn4zKYA7+foCSATADT2BxC24cogVATQBe4DgBTAOAAxoXX6tRYWlLEZtzrwAsmYUKuqofUuoGAlSJeosTDOgnS
ArEzxY4WVpIq0wISEUlmIa0yCxa08ik+UqilEozJlnM7JndQ3Jnkwm5k24nB5FMrinRU5O6908pmtsSplBEkOClfCzECMrlEe0tVD/scu4As5NpFrB1H8Y/Ih+bTICWAHoFE49fiqYqOlPIZUC44OOkWM8Iw8Af1mWDWamB0tfoCQN/698H2CNgbX6hM6Pq4sDXC2+Dqie3WJmPYouCgbUKp3UrVl60vymkIqhknTGhnX4y5m34t373423Eik8LG
d0nwlRYpZbPMouFu0cQx91ARnvPIRnngYwj7BX2m1ozZE7g9TG7AiNmjMhFRa3Len01ZRFe8HunVUpem1UhpRzswSae7OFmNUw+kaw4+lNY1FktY9FltYrqnELaYB0shllMsn3iss9lmcs7lm8s0ll149ACzs08jzsjdkUsgBFLUwyng3fABIQNgDxAKwb9A0gCBdTFIwATQCC1GADsMmClQTOCmjtSsEKgRGHqgBxbeOX9FX1E6nrMq+qK0hPAD
cCIQrCZVlq0isRqs25RV1bWkUU17Gn42ulEws3FX41wnvUo1mfU25nfU+5mTIqLEE3fUEO07hnfGd7biOd2ncmVL4AEksDGoPkAes0hpes7alZZXAC1EFZgB8CoDQKAZnAstUjPzI/CRsyMlv0CTmaAKTmPgtQmuwzwZIQS+zFgDhHV1Uh4ZsmaBrjd+DDpfQQZU6yafofYi0WDxzBLSumlsjJk0UrJm3EvJmCk1imPEzUFjgvDG/U6KnHbDtl0Z
F5RTlWmTOsnjkmnZ16qRem51IITnGtXUnychVaG8PSl1bNuFf0to4IQiDlLs9YApcg4Bpczdlqw2FZIs5vxyo3PGlEo9mX0/VFapb9nxAX9n/svjBAcyQAgcsDnpc+9lXwzLkrsv+rZc5ohNcuakOPf+FOPXdHjMiQAFbZwBsAdoCJQ4bzEQa3DYAC9ARPX4Be4CO5XHFUL8s+gFr9afHybEkgWgOSC/orpAnU+KJLMyNHys/DIRCCAbOgw5Dxrb
FzAoM5blWQ3jpM7F5OcvVkuc2jn5M1umNs9unNs7znW06Km0gu2lYVW1kw7X+jXvKzx9sgUohcpHEJRS4o9sGIlyXOIlyUkTnCXdfzYgomoHAN4CblINkKFTSmIEsnECxAVhKc5akSABHmaAJHko8ralw80xZvwA4jRCE3qJ5LTEZsiVJ+CPigHwA5D5dPhzpYtGEznA5lRotL73c73bs9Q1nUIp7mMM2lGjk+lGsM8dilZMpkvM0jhYUBIjrkxi
b99AAlfiburVorLGakoIHiM7cm6kxBpY8s+yRAvHaQsmqnTUx0DfANQG7oB8FvAW4CnkVVYZciQCzso3mOgE3mJAs3kW83LkH0l8E7swokosorntU8+mOkwvG0rIbkjcsbkJRSbnTcg4Czc+bkBk63krsw3nG803nm8y3mt4umlmozvGfs9ADLgT4CoqLdCXJW4BEgtjzFgVcrlEP3hdAnxlQcvxkrcyuAQ7eSCilJm5S087GWjOmCnMXFy0jC5R
Yc/Cm4c8AHq0vhCa0ojmasi4lkcv/510wKnm46jm1sgUnF6Apkvcs1ld0x3FbrDhl55finscozBWsW3z7TApRII194rkzxwWc6SnZYv2l1nMAnQIn1kzmX4Ca+Re6nkVvYaUxKYJEzXkawWqFTs8xnKc+BTH8x0Cn8u9kKU0dp/QfN7g7WqjFfVYkjxO/xAae1AYsZUAPLeL6XFCvhvDdnmwvTnkNPfVnko3nmUotznj801mMcqKmi8pTaz8vulz
odp7tIFFBw2MSkm8CSy2wMVnQ07SHZUoFka8lODsoDXCGkmdkrsvl5e8N4CfAECHwzfXkVU+gX9ARgXMC/enp47dmzooml7sz3ls8XIEX0wyxX0ulbp88oiZ83ADZ8/AC5813B+8Qvl+c5rlGwrensCzgUachPl8XJPkfsgbnoAAtBvkSQW4MDgD0ATQAvANdgQItgCOgIXamsYnkSAJbmd2dlpcwRCnRCaMy1M8VlORNmheo8bBrGSoybtFvlKs
sAHxrAjmkUnlqagEjkPUvvkfY7smUc+ik+7Gjl88xAXPc5AVC8lhl7/NIjxAUylWsn7kL8o8ABCQixuC7Qah48GkCxezGUCYdmnUTHFtMzTklrAxzYgW4CmpS8ifAdoD9Mi/mCo9TECZRhQ48lPkQAOoUNCpoXTM9pl51dVpd1JZAm9YuC/oqjG2YmmBhLRMJVkpUChZJbhj0wIWEfDnnEIq4nn4l6kPchIVj8pIUwvSfmtsx3EaCxAHxUoj5WeX
BxPAT5ky4ePbVtIVrcUUS4kC6Hmjs6elk4joW+hRLkbPWgXTU8oi3AAPB8vTekrs74W/C7BLO8ngWu8vgX3Ioon7skomtY5bllc7qkQqQcTlEQwXGC0wXmC+1hWCtgA2C2Q5qfLemAiv4VvsvrnJ83QUQAWoh2w5wD9AeIC/aF3BagU8gHAZoh/szQAUAdoAO4LrlV2ewXmUpfbEyeTaPAJL4JlCYVN1F5AvIYqH14PwXK0j7xt8oIWd89Vnd8sI
UOc27kG0pwmwCn7HwCv7H88+jlMMlIUPMx3GX7OKmcMkjE5CscoDcXYSXCoMoBpB0gVmE3rRcwtbjPUTkGOU8hY3XBifAcog8AbYCycigXohAbgZVNAkwDEKEP8iAD2itgCOi50UMw1jHNuP5CWXbYytQAukTCx7HY7U8TBQTuCbtY8wKgfDIIWTpAqs+zm988hnvYyhkBUnslD8hilmbVUWJCgXk4Yjunvc4pnRU2amFwgLlu0NUjcwVGzPvWjH
lo7KT+SfbkPC8ElPCiRlfRF4W8UKSnvCqRFmiLekvAQN4HALgVW8x9krskcUO4McVHC9VH5E3QqFc2srFcmEXlE8rkkiskUUiqkU0iukUMipkUsiiPmTi6anTi2cXbov+nqDP0XfAZog/vIEBboGMnlEfQCssi9AwAb4AqqVoCdAsalCpdkWCsrkWuRcjTJfFF6fWCy4yMeWgCwCemiixVnii5YWqsqUWEcsimyirMXHMihmnMmAVbChAU7C0sXs
UrznP4ysWi8hblZCoZ6/co0GBwdPJD0qVaKKRG7FWeLpQ08oXUfM56w86XFB09YBboHdA8AMbkEGN0WSMxBrYQAsCU470XIbTb7EiliWSANiXxAIEAkst/mJslpDy0Z5CwaGJm/8tlB3+Zyk74ZVD0k1GGcQEuAP/Ul7uYzMXsk7pHlsk3F5imIUXMosXN0ujkmsvYUoCnzmi82KnHCwIl/clrzJCJzzNiqTYSIjX4UaZ+Z93bfkq8wR4oA7sXbI
7iVbGPiWFUo8GL01rnHixO7LgM3kbsLrmVYyPkRSlkXRSrrnzi25Gk/CEUe85cVe8krmwi0QXriq8U3iu8VwAB8VPil8Vvij8WHiyalTiyKVJSs8WUsi8W489ABAwwgCSAeFIVRDdgjAZgCwMqYAVAaTG4MHgC2M4vmvogVnwU38W1IFVCx0I5ZGlNtyy0q+q4EJnmQSnDnQSp/rBCjVkISvSVeYgyVxow2loS4sUYS9UWC88sU4S81mi8vc4ES/
UWTQ1TDMQE+Ll8EHl/yOXnOvYkmOkLyUdi3fnMYqoWhixSk9CowCtASQC7gIQBdiTiU9i7iUsoTLHgs3XljM+TJMCbEDfS36XEAf6Up09QlFWZym2QGvDoIhWkUkhTCq4377qectJp0D+z1QojASpcyAQXXGHrS+wknM3VmoS7nl2rUyX0M8yUNs5IWHSscmmnP9mTk+yWzknkVt4PYrPvMGmb/JzIYUUGUzzGSkjsgVFjsl4Ugy4KVxXadlDiqq
UHinj7DiyKUgimEapSgon8CyEWCCgq48nDFkXwxqVRoFqX9ANqUdSrqU9SoN79SjSLsXI8UVUvRFyy0MmOPDJHgQ4kW1EZwCmhX4COgHgAO4FtpvAB4BA6doC805wCVMdtlfi3xnDSmDmQwZ1FUY8tI7EfQk82CJlV9YM4WQJCDzS7Dmc+CAXLS2CUhC4jlyi6ikKi2ik7SsyVqiiyWW0qyUfc0XlwM3UVz8tjkXSxfk7EHPi3SlJKNrTmFH5EKq
ssK0WhTG0Vw8yKYxoXdBTAW3DtAfQABWQGUBSobjLIDf5io8GW+ihqUQAA4BdynuV9y52GDC9/mEvSOVTQNbqU6M7HvMhCC5STYnkcF1RVk39iR+Bfy4oqOEQA1YUckimV3cqmUTAuIUj81zl7SwuV3MzUVMcx3Fo3DAW4mI9oncU5jQ7YeZA8gdhN2QrrhsxXw1oioVkCq/nDyu7RQDKnGhSvXnLsiKVr0t4BPMii4KoyqWwK24DwKpWWWksEWE
09KVUAqEVn07KVri+EVOyl2Vuyj2WVEb2XEAX2UjAf2X2/CqUKyuBUIK7rlt4oQEd4nQWQy/IgXoegD9AOmqkAXBhCANgAvAXdCnkF4DHsSqL+dT4DHlRbnBynKWOC1qi44Q64ooZ3q7GW5CXYwJzBhRCybMmJxqwCNF+oLUBs3eJhEaEaD7E5b6IS7Vn60/ynbS6mWz9UflQuJAWWSx+WoC9IWfiuyUVyipkGi3CSmmOuDcc+5zACkz7POFVBJR
IBV0Sz1ntyxiWH8iQCSAA4APAXBj4AL+qlbVoViyxBogKQTl384XHx09AARKqJUxK5cBKCySXLTadwrXBzH/jfblKKiaL/87wWTAZHBF0zDSkwAiAC6d7aAhEmW2EsmU10/vkUc6hkFi6+W0ymYH0y5N4T84uW4S9IXwPV+US8xfn+SGuFis7Qa0jblEJ+CEKty+s7uipJWSypGnSykbHfAL3hB4BpQdci9ANKWPlO8nj6G89ZUVUrZU7Kh3lx89
BX40/LlpSlqkCCzKVCCjqk+849mC7ThXcK3hX8KwRXCK3ACiKoEDiKiqUHK/oAbK45W7K+PmMKxPltEqllpK/PGDGCMZiYoQDNEA4Cm/GAA8pB4DSAEYD9AE75BykvkhyxNkCVcWnWxTWgL4+CwbE2gp2bNSBJy1vlLS3fF60dOWrSnWmkc7MXG4raWKivOV0yguUMyuxVMy4XlpCidAOwtmUuKm1luKlZTmkKZXNeLCifRAdw82D7pzK/fnes9f
y7oMmwB4bAAO4GYAAxQeVB49yJ14RGkQsiGXP0JgRyq1oAKqpVUtAmZlDCpvDCIE+LCIRxZKKiwSOUyCyRIW/lNI/YhKYK6X0yXeIrCqAVrCp6kD8/MVUcwsVP7efp343pWMyt7lHSqfnRUqFwFou1k82bir2mJsWCMxuzClHNk9pMBi0SrUkgDUBV/sCaJsvEKXiwsKWFuU8gxoF3AnK8O5nK/ZX5qwtVAq85UIs60maom5Uk03ugiCujb4LKFX
j9a3Cwq+FVwARFWtGFFVoq35VlqotWO84FW00rQVgq+qXdC5QA8AWohwAfoxiAdciaAfQCgU4yTKAf3haAQaXQclbmyKou69PUhCTSvhhTwQdKF3FFBX2DDmhRS7wRol+bNgkUFeLf+AnmarbBom7nZy8xVMqyxUjXJinXMnpXDgvpX2K6yXpCzuysc1xVVyoBgTwMFB1yq4XtvdflFgVaBA/ZXmbk/2nyUhNnr+a3C/AfBitAHAAR0+JXPCxJXu
3JZVaqieXdCxDXIa1DUIyrTlFWMnmYwMCrYiIoWHiXdWQWOnlnYP9gJwDRVMsXDhBzMJY5nEtkmKstnnynOXOc59VpPDS7+q+tmBq9lXBq5mVe3HJH3BK1kjKt25nEt7zw4okCNIzf7YwHkWWiwJWpqn8YLKrDU0Cs0RjilkWdczZUIQ7ZUVqnj46a5cB6awFWnKvZWeI0EUE0zPFLiutX4LB5Vwi4hbjqydXTquJ5GAOdULqwYrLqoZWqfB9lTy
7JWmao5UGa/tUlq22W9c+2X9cthX4tZwBe4OACfAP8kjFPqXbldoAu4TQC7oWO7tHVdWl8vJWYQAsn7TIdBhcqjWoYSJASQZaGqgemjSUKpXeCFmFEU/CAEMgQiqM2NRZynVkXygAHMq7pWsqoTVFyr9Uly9IVWfM6WfEtxULkSJBJYdf4SAoRmnMavB/E1TWq81pl8YheVhKlK5e4DdiOgGYA/gBZ7oa/yVqqoqiisLoXEiqMara9bVsAdFW5K0
xamIJaDGwDmg2CMDXFa7jJho3HBehWKiOLD+wvFa9bBpe0x+wN1X3q1rXcarnlXynnnxC9CU2K3YU9ajlWpC3NGnamsVxY3/BXSxITKpApReK5UkD0we7PSlNVzawFnpq3bX9iyBU5q6BXhSo5WoKv3g2yvW4E6zZVE68ogk6tPHKypqlXK5Fk4KjWWifRzW5S+EUIAWLXxaxLW4MZLVe4VLXpazLXAqi2XIKwnVvAYnVdcodVQ3EdUAoqNk9Ct4
A9y5cA8ALdAqleDWmLdMI1pZITrQWWg5023KtUJVJ1WfFzOg/ypb8/FEcaxzl/ay+WKgvsl0MzrUli/aVlikTWcq3NG9eYZWdsw/BHILN5K86XIdIh6XiZVvD3C9HW+SqenbaowTy5IKQJc3HX6UlZVusOngsCqPWVqxK62avxH2kgJFOau1Lk0tT7R6tJF2y8Mngq6XUzATEAsCGYAxS/dDEATQC5ZKADW4BeDpap3VItMqbstODQoZCjTmYxMp
3axiBf3avluzJAbps1y4puY4nR9UDgKxJyb0ITmyvLXf4/asxUVsoyXtKn1WdKv1VazalEecu3Gdvb9Xcq87rlyvik1nADXz4dC6eKuzpKk+NUQOGy61wGwEvSkWW4nNoVk4rqj7M+ek+il+SHkr0Gj/IbaCoDxB6cvvVnE3Bn1UIfWgnFMIPk0EG9/Kgkvk+MF6MrRmGMrd5fQwXFmM1JXS64gCkwa3AVAcogu4ICkvAYgBGAF4DDTEOgcAOADO
AXzV8sqRUOCzwaIWA4g98fUDd1cozIc1eC/fFCjwotwUhw/Bn/eRrVRCHSWUqpdbJUQiDD6t/rhC6umRC3MUWKgHU0y2fUZ3dznDk/YWysXNGv8v9X8qzfWEYe7o91EfhXCb5nloq0Bl8BHWzagPVq8nKk9iuLk3QCBX8SnC6CS6LUSAYgCtAF4CTFMgAhis7XstERgwHC8Dq6rfm7GLST+IOHDh/CyCVgnYmQiR7EXvVkQKVM6DfaulVISnMUoS
9rW8akm6m0gTXm0++UMc3rUDK7lVmdaHXAbTYQ7cTAHS5dcF8NSGDowbJBuCk/XAKrsXq8riX9wOYBoILTUkSPj4hk0nXg3Ejo/IvGlVqo+nu83RLaou5V54l5Ep64q5sXambFG80nhahal1SqXV+i63Be4V3YmADgDlEI3kwAegCLLZQCOgLdAZgoEC1ldKHNubOkowAITiZFCiAS11TDYNqAKeRPJHEQ3XP683hUKN/X6Kw7Sf688AV0w5nQCw
I28GqxW3ykHWYS7wkiGqLHv05xXr6ye5uK5uoKVWuVDLCbX763+iioXZlkSzI1BK9TW5GzJzS9fZHZqiPW36uRlHkh/U+gxzidpE6AnE/vXv6iahHGkfU3vDRmPksb4GMrnFvk8EEgGnPomM8A277SA1+ij07aVKeivAA4CGbF4BiAZQBApaUwcAB41si3A0cirHllPbETp5QrFbc0SxM3QDgKeQlybtUOFgYxhSAhbAppy66CINNjUta8fWGSng
0W64KlW65ik268I0ai8HVai6KlGqwbXz8yQ0+IRt45vZ27cI8tGo2UKClSKVXvS3JVZZU8hPAHlK4MYFGo8kNmDMxBrx+dlD7a/Q3oAS028TApK2m2wWEknZbhCHxDmkarZC9LbkehBsXH9WVl86KsnptP46COdjXNKrg0BGm4lBGs8qvq0I3GstlVg6+3UQ6qLF6g6cHAbRqgryn+VrbNJIK0wJBo4/3UMvbH5B6oZkr46HYDittFmiGZoZoear
tVCrGUXRs0nAZs0qdWrF5ElWWLip1yn0lcWHsnKWNqiQCkm7EDkml4CUm6Yo0muk3LAB42C69s3UYIDqLVWqXvsnPV+itDrOAbADroCgBGAM7oPAQgCmgCgBJQpUBvATIXwMlk1ioNk1EWGwT0NDNnJwQg0+wQQwisRjVoXCdGpMw3h5nFE1v9KumIuFpVRCytkeLatnD8rpWKmu+Xpmh+Wqmp+XRUqcEw+LhmSGvuDIQapl2dONW/yi/R3aTJA+
0qHmdivflmm+DVZZVoDMAYgB1xfAC/APaSqq9TEIcoWyyM/rbyM48mKM5JkpMuTAKkDiD/wNg3f6xc5s4zRnj7Brb6MwA0vQokrJgz8lgGuQkQGhQkQqwi3EW1cBkWojXFIoqymgYDSXrDCCngH/nuC87HC9OHBPCIrxe61y7mEvgiOISUE2Ezh5SmzaXXEzYVJmpSb8aufVCkwpn9K46XpC6SEArGHV/EVI1UKYVXcmA02pYv2CxUeBFYWzcFZG
0WUYa8FDhnQo1NEiegtEmPUogcK2r6nKp5conYJ6k+m4Kwc0Ok7WVOk9jGfK7c0HAXc37mw83B3E808AM80VS5okxW8XWWwwkWsKnVWDeF0CXkN4BdyhAA8ASQAGrWogUAXBisjU8hYGjSKzGvOqKgCSCBOdpCaW/KGfWMbCPmmKh+oExCG6xi1MWkKqfmw42sGr/XsPU+X6SrjWPq3OUWW9DH5ypU0QWiI1QWhxXcqsw3iG5awIWhrof/IRootd
iGvvPWDHDY6qmmhbXVCnHGSvTQDLgH6WXJDr5banI1AylOA6EryV1mjAmQm+/X04x/VqESa1TWjdwlUb80cWwB6JTdnFiEqY7YmoA08Wj8m6MwKFlTeQkbMCFW24R63PW+O6yWy81owWTwhwaLjR0bXl2GzCCyIOHCkwRMgVKvGXKGYbAWEoSmGWnw0RC+lXrC56kJo3kk5MoHW7S64226rCXA45fWQMeIAFw3M0uNceB+oBDkCMgNJPrY6p+W4W
UBWs/UJKz63hstyVgyjl7466kDRWrIka2yo3x6grn9mpK1ZS1cWYsjdjVW2q0DiBq1NWlq1tWjq1FWrW0dG9vH/IzhaumiAC7oX4AVAXdAVAF4CxQ08hwAPmnRkvdCXqF3CnkbA1CpL2p16q6BzxPYq8WH54KS6gq/fHzD5Ul7Us6c7nffEFAvISgUzWmSSkMs42Jmi40vqkI3WWwQ22WyI32W7lXTIx43Wsw60zk2fSwHWsBR7ES74CkVQYZJ5Q
e6oWU780/UB4qs3cS5kkNy6/UCSrop36w6HQm46GXgIFAp2y7np29RlmEaG1ggjd7aM5d5vQ98nSE4S2yE/0Co26lmkzSQBfAIEC3AVCHOAd3AVAIQDjAF4DhAX4AAgRdkYqoaXSK/A2uOBxadIZ5z0EGMX4QOO1OG0hBFayzlMTKFAu6G/m7xLykQOFg0c0VlCgOQEImW5a0T62U2Jojm03yx7mbW7rWQWzM1qm8djTAXlVPGiQ1V2udCFLUMyi
oqVaMGy0GF4Ogh91UEnYW16Ud2961Dy6MzAkAqlSy+/mTy63BsAZcCkAWlkmAHG0PnUVjXmxWi3mlY0WQ25SBSn2DUGzDQvdIiB8sUm0XqkNHGWk3Xyila08a3O18a9B5vqrrUfqoNUcUisUl2yBhWgZB1vy1TDhslm4FC4YZ76tC26kkFCcguZXn6tEJwVWoE681W3I0s0Tm8gZw2O7W0aozWFYjBdENGpdFidNPX+aux1225hUO2xmnqVXAAu4
LdA/CjdgbsfoD9AKJWBO+PYUARprNERk3YQy80jQSEjH4DXGGclvUSqR81oID7qwwx4aoULfHHXHfGXq63Jj60y0bCtm0N0g1mc2ja3gW2B3bW+B3QWxB2EYtfUV2qepoOxfntQTCh8o+q4TLXB1RcZaCt2MImt2nyUVmzHVw00x1SwTVXjyiE20WqE0A2mE2bYHJ32QfAklealTom3/VPk//UL20Y4AGtMaI218lTfVhymMok3iW6XWkAU8iYAA
EDYgakEAgUiCGrGYD9AbEDYAZS5xTGfmQcy+14G7Sbh2rmiR211m/otrjP2r0yv21w2YcvChCmwRqONVVm/mvbz/m7g1Pq6R3BGq5mpm99VL9BfVNspR0hqg4VHqE0DqO7IWSGsODOGkvhI6mjGfG/R2kCHk1AcG60B0g/nr+BADNENgQ43XJF2mknEOmobjTlL0Vgm22zUs6l20uoQD0u701PvPOrrEgcbWCHkiDWq0iNsJOD/Olw2G6+L5cWRM
j4ZSOFvzE+Xuqs+XISymXnGuU20MlUWVO7m3Kmg6W1O3a2qOsHGSal3X0xTxxYOnhGS2rlrslfp3eSmDWBWzu1DcCp4KaseWWOyPXkTLIDLAAtADONNgeuzuwpS2nWqy7BUcnAc0G2oc0EK4hYnOs50XOx0BXOhxnYgW533Ox53wy2vEtc8CbB0H12rm8q3rmyeUe8KYDYAN4COgZwACK4gC1EBpQKqt4DwQ5wBNNVQkh22vWIMyOhrEQ2hXSpTC
/o7upiu+7r+SSsHbGuE0v6vY1UYg42Z2kB0qutrU529V01s0C1yOmB0KO4TWou0TUMomsBYu+C0tOnEJy2M7BDLAl3EuxyXiZEfLJqoh3t2vyWkOoPGMKLmCUO5ZWTOs57/W+EF5eHvUMQBE37Gye2uQ7i084uG0CWgc584gKEiW1e1iWtG3HOyQAAgUgAHAYhhEpW3DMASYlboHlnLAQgAJpbLVYq5aY96yEgRwWMwbGFt01KuO0iuXizHqv4jz
CkbAWYwDg+K5aUQu9RpQuhM3mW2F3Jm/O0CG2xUZmmd0O60UxaQBd3nSpd1/iC4U4CuzrrusYYXFPTmCym11ZU2DUMSn03r+L3AVAEvXNEcoiY2Bl3o81ElohFQg2An637HYkWCe4T2ie/BTK65CjMQeUDfUIy6GOkV2YUNt1oehWj5dAR2EysSivzWM2nGj1Xkcz7FT62IWA6qB3bC7V1bWlU16u/m0bALSC2S2I2+Xd0Yt2qVZLkybXwVE7A7u
/y0AmmLm5GlFxQalW2HItW0Y3Z50TiiACeO7gU063gVYK65Xqy25Way7n6pW33mweOVi/u/92Aeo9Ege74BgegMSQeiRV+alN1RejN2RaokVO2mxnC/DzUO4IMDAw/omCSBpS0m9w5mGrq2jtPFhsmxt3l8Nfl3apJx3Gcm3e5WVkowoRSEIpg1Z28z2tKyz1VsjpU2e8d0Iu+R1IuoQ12W0NWIOt4mvyiaGMe6VZioH2Ami864BpTGC98TTwqGo
Z3BK8v4dygxzxAIwBboDdiBOvPXiey/kjOobiFgKaKye7KoD28c7YEoZgdIe91Q2x93PQrZ3c4qQlVzd90r29lRfu6lk3eu70PerCEyq0xYfo+SA/IG7yWq5FwSZBIDDeym1isi5R6Ws6AGW6wmM2zg3M2z1VtKub3T6hb38Gy/6F2z9U7W5z2aASYDqOqTU9Ow/qnW5ryeW0HkTwH4lYO/41qa4L0fWjJDwWcZ0uul+RpE222lGkCji+6nUYKmz
W62xK2M64QXM6kc3oAWr2YAer2Ne251AgFr1te4wU22jIklW6iYRa7PWjq4kU2nAWnOACoD/CcYrKATPmzPCoDKAW4CZgc+03Ob8V51O7ooZVvAduPNmrE95kvdcUi8WdD3Va4LLAuiMzCmyJCmEsU0OQCU1s8uM0k+iz3RCqz0mSqn06Anm23GphG0eoERbewiUvGhXFrEUS4otanmb/RIQmICjTkuuDWUukMa1/dowXoDUBPekx2cxDJAvvcL0
L0vQ2VW9YDEQB3DV+2v28u1On4GmyAXDEBjF1LL7Ryh5B/HV1RyMNaBqS4HbdwG6n57SAVFO0B0ymmF2jukC3J+63EOe3V3UerM14GcYA8Uxp3M+oo7RCNmgTK5rxkSicpM3CVSUaYx0K2uBDtPUK2FVKJidmlc08fRc1P+q7Jx6hx27slL32arWWlclnXELM33YAC31W+mYA2+9oB2+h31O+iqWv+5TrP+rx300mG7Ei9oDwgB4C1EeIDhjYyJb
oTACXkA4D4AGNBboXrG24MuU67S82v/EVi1pG5A7/fQm32cGBM3T62JhLY2PDCb0FOqb3Ku/w2qukd0QO8p22e4HWbeHV126rf0IOtIgttej2f43nQS08Nkgav4ioWtRyMiexjQOMv18evl1MSiQC/AdpQ8AXBhqBhv5vW9Q1Dyvhad7BEzh6pLl9bc92D2mZ3D25gPmBlZ1rvGG24m591bOwS1vumQkEm0S2HO791+itQO24DQNaB5h151eLqp/
SJBIDKrYL40pXRE+gO8OwF3/kPH2WEq6ZGW7yniOh9VgO5f1cBuAUVOllWTulb1F2un19aidDjAW2n7+411hCAdKRfC7S8zHQkhhMoW7uuW0kO3QOHug6nGfXu26Gqx0kSYq2a2/X0f+hcVCfYN31G/BWYs5AP4AVAPoBgECYB7AO4B/AOEB4gOC61oMEiqr0VWvGwNKPQAvi+IAunNbVsAZwAXoAWJQUtTYSanA2Yqq+3aTXCyvzfZD7FfHoDe4
0y0BoDjv5Y7j7cmg1d8JhBh+62KgBDvnimpVIx+sz1sBhlVmW0p3AW31XpPJb0ZBxcZwOwQN1O4QPO+g607MIiWBc88ADuKQNjlS4V3CUxARwbNxne5AGZbPC0V+gxwXoNQHlESQCSAJCF1+m/04aUroumtv0SALEOOgHEN4h5T2Uu0xa2lFGBZvRBryYLXXs0X6BY+t15je3RhRm2f14csR2x+vw2fBkp310n4Mz6v4MF2yj1Ah7CWzukXnCB2K
XC2h4FtIGGC2XI47whm7SCcWVlSU3n0Y6tNUve/QPEhlJWScLW4wB5c3v+l/1KdY0Nyov12JehK21q/xEOajL2PK2lYLBtgBLBlYMzANYMbBiYBbBtdDQBs0MUdOVGlWsMnCAqLWkh9AAwATADj9X4BQAfABOfGYDdkJUDicqn4NKGNDUhifEIM+S2YokVhZfWsk18gbCtJBRQAESjQNB7vXMB0R2q0VgNLWod1m6tV0pB5UVpB63VVOqd1UeyUM
0enf3sjLP3vAtxU9pHlrcy524yBm7S98f53H68s2ohzPzSq20XqVYgAwAN4DSdUezugCi1ok0MI4yD7392v61mBy92A2jiCWB9cNLnAH0YmyglYm4H04m2e14mkqYuBz91uB6lmTh6cPYgWcO+Brr3OYwEqMQO+zMh8MyCMK5BHmfyT+VaIP02wn3z+3w2mK4p2s2oUPzevg2ihij2g6iUN82nIOqOgYX+c5y16gOXwSyeQ08clUPh6PdT/sWkaa
h1Q2Vmg927kyvkDce/3q29oM8faYNWahL2YK60Pf+20O/+4c38nP0Lhh/SJRhmMNxhngAJh3ABJh/BRTBqX2aCiXXni7o2Ty5ojKAZohW/LdCAgeIDfAV07xAIYnu8Spo8AVkXPo5k3NuQNRIDauC0Wa63rym5QjWl5apGrzbv2wU2h+0F2PBoilSi4JA58ZNaDu9gPDukj0r+34NWW8CM3Gp4kVHdb3CBhhXghz6huKj8Rhmrj08I1CN/yxhA6K
yHmBevn3Wiy72hK9fwbsFBRGAKYBLYygzzht5CLh7DUTO4k2TyiKNAgKKMxRu8M7LL2DuWTDBHGRI0++9Qxh5e/yisYNaRmmf3viOf26S94MVhyyNVhzgPs27gOLesUMQRmp3Ah/V0uey1lwRlGrnYJKDJUlAwg0j2nEvAh28ygZ22u+W1BW9yyniRKMi+0/SGh30MtmvUFtm+aNdmjoO9mroP62noOG2nWWTUoSMiRsSMSR0gBSRh4AyRmAByRn
0OP+2AMmh+APaCrN3dCmNCNW8kGjvEWAB4F3he4cqA2+z4C8QUr0Xm5tyTCpAYNdHiXnE0JloIdYw8mg74hqSIMPue7EDuhIO/ayR3/amyMihuyPU+8UOtR5sPb+jF2By8u3beqHHAlWlCb9OzpEutRwE6avBctRQMhK/j1ZZCiD0ANlnKAYtAEhiaNa0aPo0W0wPfehRkmkP70PPKe2A+2G2Hh+G084nZ2AG5G0HO4B64a4kXUx2mP0xnv2Iyiy
m/fBL4XFPupv+HMNBSIqOZIQOoQxr8O02/S1WEpJxE+v83xmjgPWRmsOW6zV3pBhsOZB2n1Oe6CMueljlyhwo525IJCcwUoOcwuqzujA3Uoh2GkY8+KPe5f/GNBoqm5qyX3ERyK1ERnIn2OzoM2kxV7Qi0N2Ys+6Mu4R6OAiCYqvR96M9KL6N6+0OPXRyXWO2kMOxe23AwAWKzowS8gwQ74ChoT4Axob4DKIoQBJWaD37BiynohTu7a2ATJWefQn
2QC4Oew9yzEIB5Yh++4OGR0U1MGtVmmRyU2wx6U2Mq1a2keyy2yO/4PmxwENoxqCNRG1R05KtyPDSF42VPe+Bn+w/YR+zf7EIN4rS9cmOhRymMGON4AIgXBj6ASO5oaro4Se0Nl1IOfSsuqh3JR7oWHx6xknxl4DV6u62zM13zC2TKTH9RIbNxkM2OGiV2iXV7XlRmM16xyF0GxqyPfBkCOXG6B1Txq7a82+3H0+8YBfcgoO1iozAEWTfo2AlFon
+ry0ooWNRkuj2MgKnUNMx5vXOuiL3NBt1hGhv0OLRpBUUJhaOrR/119m+X2pepnX2hpo1Ze24C5x/OM8AQuOwQkuNlxiuNVx5N1GwmhMrRmYPG+/iPdC+gAj4Y/kVAB8y1EZQDtKZcDsAH3iOgDA06ikgO/R48RzxCjhc0OekDelDliYcf2FhnHbd6j0pxRDrx0Nft3l2cG0LWpV01RgUNARwfkU+0CPIxlP38BuBNL662MM+4FWLxuJZf49B0NI
SgWFmrxZpJY/2BISoNBRrUOAmgX0UoXfAsx2b5sx+i0cx0xMJG+KIJDduqEEaxMg2W95cWvcPAG+wMbO48OCx4zjCxwk2ix6h3dCh4C+AIQD9ALnWfAcSXfAN4DKAB3BCAN4DOAfAA8eJXUKRvYNvO2uN8wBxZ/ScslyspRW1UNt1O5GwRT+4P1Si5ZCgWaQGYhEaKZJmOH/hzjWVh+GPm642Pym02P1h+z3VOxz1tRhBPRexp3Yunb1QwMVRsoI
JMuvANL4iaymOLLCPne4TkUx5QNLahgBCAMwX0Ad3hVKOKNFUY0C3QEkN42egAvJ/oBvJo9CZR5aYdYVSBtuVsVVI5FwoIwro/2SdJ7apMVbYR+auYvig4O0sPT6CyP2Jr1XGS42lNR+yOp+xyMF/O407+9AVGulBMKRBSo3QA73vXCcqHIYl5Twa/0TRzyY/J/UOnULW7YAarFXRiX1jyTlMWhurFWhuX02hpPV2hv/3K+0cZVJmpOOi+pONJ5p
OtJ9pPgpCqUcp9IqGFf0OG+zo1rmk31O2owDgo5UqCK5gCYAB8i9Y2mADiAPCSAW4CjQyRXdJlk3vMoazy+PYpH4FY2PLD4oMmTvYheNXoL+ZOWq09vmZKRj6LWjaWL+keNSOxGOU+sCMoxlqO7J9GNCB3INHCnxO4SDyPOG3jINiXyN9oI0DMoGiVVBoL0hRhr6PJnibYAS7K7m5QAmbXjGQky1HYgcohCAGAAXoYUA/CJojzNTEUXoOuJboEMU
XmuKNnFIJnTR0hNixp23jAPNP4AAtNMo41Uf7EQwvncf1yIX9GwwMPLCuV1MlDD+wDIMbA+WYwmAbP8NM2/kMs27FOJ+3FNr+gNWNhyCPwJzxPjANRPuexH6Vg8ozkyIZZ9h8PTpJeXw3J4cOexyT1tp0M6ERiGTSolVHsdAZxZoZVHMAE1FhxtaMRxtqmbR6OPbR7VOOgXVMgFA1MFWgEDGphACmp81MVSj9PGot9OiJoMPVe7OPaVctOVp6tOe
fMwD2sIwANp5cBNp7Mmh29UYg7W+2QkUaydJI0o1YEa2t4Eaz2QB5ZewIxVNYXSPopvWgKgEe0fdFGyOITFNrpsn1AWyBN52+F3NRhyOec2eMqOlz34S77mLu3GN6GUjCt4alPVbeSo98adK7fUaM8eu124RqRjIEssBxJkyEJJoe32cAh6MZ86C6RzkhH6jjP7TRxA/6mwMz2znF66Ggn2tfIjAZ0DP6pw1OQZ/vHQZs1MWpw+oB9bgm2lE9r60
XF3MISNE31CPqf20TI7xBRDoXN2KkZdd7J9OzOjdL3oSAbEDfAdprOhzACDE3BjKqX4BqI1glsAGjzTzPAI+Z70wVQXKBy0N6AWY6+rLdKLqBtWLOGg191GM8H1nhyH0XhiFXJZ1LNhhjLNZZnLPG2/LPVxnpPSgbr1zxIVrniGvkiserWmwdfqRCc62uXfy7xMwxCWJ0xg1K+hA3qpqEEe63JEew2MQJpxNQJuz18Bjf0CByNMgh3INuemSHZ+h
C0Va7ion4ARl6Ou4R1ZYEhja/BO8eh5Pz3AxzMAWojZcd3iGxYtPyU0tPoZqtP4AGtPYZ+tONp5tM1u5TFRzH7P7bIEAAgTQCiR/AD6AVoCrsLdAzASJ6tAbz4agQOUtpnQPkCyRmgbBTxee5cNdp7ONvZj7PxAQ2LSx4jWEyBWCS9P5ApfN2Yiuz8qY+yp7RCf9iDJEOG8+HkUFgAdw4YfXG8h6qP+plZNJB0ePBp5xMTxoTMEpkTN7pueMueoE
AnZpy1iyadLbxdd2CqG7M3aT87gWZJXQatTPjRzu0Pp1d2spuaLwZmbI05do3cpo3PfZE3MVGsiMy+y5UBu5L0ZSn/3pe0VN0RtrMMmjrOXkTLP9AbLO9KHrMB4Am6C683PU5M9Gm5sSLzU+20M0gBnqVLdDQ52HNtJhHNI5lHNjAdHP/CQjO1u7tyD3F+5a0bOCK48dN0qX74kfDSDYiSGOfoVFj8IGPrrCBsnvycsMC52qOrJ6sMNR1IM8Brm1
7ZnZOb+w7PtRhn2nSyTMdhhC2CGO7NyavUA+er428AQVpFdcJOy2zNMY7OTmMIF1SduP2NQKlcNTOi93UqE8ml5777l5wsB8VbcPZJjtbWZv/UHhj3pSORLPoAV3NpZzrNe57rN5Zv3OcEjvI+QbUamXJzwYsJ7qfoQqARIYRAkxiszx9SfK2BkNq29EH2L2sH3OB2+5BQqH0Qq8oiXkU8gwAW4BpoF3BNEDtqki1o48YGhYSZi+1rqt0Juwf4IX
wZVIJwYvbK4n9hiu+Ui7A374PLcJll57CkZipg2BhObMRo36gL+wXNL+4XPrJjV11hsC3bJndMzxqXNiZhn0SS2NOQh6iyxUPgjnJ5aCS2hfx0wTCO3pmHnPZ4MaE1ZcAJQ/AC3AWohjiecPyc16C+pix2dp8pOm+2Qu24eQuKFkFM25UFAewxt3FwfPiqWuw1AON8MrPetJs5rqz8g3My2lFknyYEBOEesBN1Ro2MN52sNN5rV0t59gsRp0TPOR
3IO24OXMRqhyX5YE7BAOOQ1D5jd2BwOFCAOAL0T54KNT52LniZVQsdplv1kJqrHKpsbHmwmL2jY8rGkAHIsNUuK2IsunV2a6iNO52iNiC8AuQF6Av6rOAtboBAstHZgDIF35W8pgouVesRNZxvGyOgS8gIAcYCYAVBSv8lT3cGVvBlPCoNkQKhQTC/UCPmi4bl3SPJB+/8ivbR+bqQc9WNKvnN+p8mX0FwNMIxpgtjurdOCa3wtt5/wvouxB0vys
lPwRoo6BhEe1rx7kxoQMVXBIWZiBRhIuRJ/n0BSvXO1mowMfCs0S/tQ1SUXH4t0JgVOlFxPVos0mk6y9x3le9WwrADovIZuYPr+fN0M1GQDjFfABTAJdUB4EWANKU8jSY5ohthl51oFxH24WU7gKwCeBv+S0xjxVaY91LizRcXRPv2/wVQS1OV9x6lUyi2lUrpgCMBpr4PAR7bMCZutlhG/bPuJyr5HZ1R1OK3gtuK7JA1wVSKI6tj03aUVCjUE0
DxFtu3VB0AnohmVVZZCTlboR2FZg0YzfZgJoCHfAC1EKADGOYSOEAS9HsAaohaLJdW/CRTH2vCrLY5hIl8sF+Y5IVlPUs1UvqljSD6F9lqMQQ0CFvDWCb9OylAa76wsoRhQ4xV80yYAtn3Qf1C/25GpDxwCPrp8n3We0XMpm8XNuJtP1+WcYDB28u0H++mQnLU2AFKNn1eW7ipUKE9qMpqs12lrCj7AwnOi+mWUG859nrssEOUXJ9kvs532WhiiO
CpqiPCpmiNhuvGbwl74CIlmYDIl1EvolzEsO4bEu0KqPnVlhdnQllhW3R4kWXfPUsGl2ohGlx31sAU0uzeZ0Xw+q0tphwmQVKoaztYaQ00vM7EEcYDS8WLrjBORa6uXRRT79YqBy2SgUpOgp2/QbCnngNbo3IVDLcZ0n2zevjOclmR0Jl/FNJlwlPZogIuqO+eXd5sQOCUt0aNogfNMTYs093K/2PZ+3qicW0v+RxIZh6nQ3+xz72rhvTPmBk8kg
VVMV/IJ4TLQrpZD3B8s9sFL7YQKzPUODnHPkw/Nb1Q7rGpSJo9lvsuttActYlnEsXdLgl5gH6woUftyrIlYQTRZ/NFHZFFqx+OAo2epnXpGLM/5uLOUV8GzH5iACfAbAD0APSIWSMQDXqR0B/CPUuDgDpgDaliu35nvj7TY03C2epBCEiPpP24hBgVDXH7qJv3/pWrMzk+rOgGiH1e6FrPS6mStyVowAKVnchGAZSvjAVSv6AdSt9ZjkX+XYbBDc
ALMV3Qa1jxRIB+oUhA381mjBlm/Q92vuP1aug3jKtp5rZo5mslrYvslxxNxlnbO8ByzY/lyXMeJ6XMM+8NWpbf9XHJ5CA82V+AXaEDVqOTxyj5OrK7x7NMvZ9Sq3AeoXfCl4Ddl1Hk/JT6Uzl/UuCSecvGlpcsHAM0urly0uq/ZQv+RoSonunDWaFp21NVndi3AVqtrlknkHDUsCS9P6S8sUVCklw7FqkeUi1YQRrU24HZs6Jt4fantg6Wgp1q2O
gu15oXNBp3Yur+0NOuJ3kvJl006hvJn2FB/+Rc0U2DWuytoLgvhoV8dyLcwJ4vylyfPzK3HNh/VZ5PpoXXk6kXWU62KV1lldkHACnVU6oosu82X1AlxhOO5/PFK+uiOOV+StwARStuVlStRALyvluQRMhIrelw1yGsI1kFXDqviO5GcADVQYvBwAPdhRAE4B55aADpgDIDRsNXj1ABgDdmUyRmWj0AQIgWs7BseQiAfjDGRdIAOiVdMyGYWsdMU9
J/ZcohpVnsHS10Wt/ZF4D8ZriQi12Wvi15UFK1zWv6ACWsTuiPg61+1p/ZWh2Zwo2tQAMWsBvQHHm1y2sqzeK3VqG2sq1urGO19IBBsATqfMF2t616ytW0T2saLPZ37YgoCe1sYTU0v15LgaEAPoeprAdAgxRcQHz3bOqz03XdoHiCOvtVKyQyYaA7MQRPJPIR2MkUCABGANgAGAOfkMAAgCeu5DIAEbWx+cT2um1zzxcFcOvBgEgAl+GKsRLeus
nAd9IIIJuuJWIHQIADRa4ATQDBALALt1iijP0aJ74AfIikAZQDMYAAAUe+H0C09bsYV4BPqIwAAAlP6BT6MoB00GPgx65PWLYjPW0ojuMBQAvXl6xXWTYjLWgeP0RvbbfC2Eee1T6DrgheDa1tnj3W+63bKlU++kVBiLx2axFrhAFGHCjFAYK63YAt0JRNmAG8AReDqtO693Xe64Q5i8PPDGADE6XQIXWq7GEBggPPDLXvGIaolPR9ACHXT3ZJEw
0BegoG9S7860vYUSFWhwAI/RCbpdRmOJ1FK0EAA=
``` ```
%% %%

View File

@@ -139,6 +139,14 @@ void SendSystem::sendChangeVersion(StreamingVersionData *streamingVersion)
socket->waitForReadyRead(100); socket->waitForReadyRead(100);
} }
void SendSystem::sendOldMessages()
{
QDataStream stream(socket);
stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);
stream << PacketType::TYPE_GET_OLD_MESSAGES;
socket->waitForReadyRead(100);
}
void SendSystem::sendDeleteVersion(StreamingVersionData *streamingVersion) void SendSystem::sendDeleteVersion(StreamingVersionData *streamingVersion)
{ {
QDataStream stream(socket); QDataStream stream(socket);

View File

@@ -27,6 +27,7 @@ public:
void sendCopyVersion(QString versionName); void sendCopyVersion(QString versionName);
void sendPacketType(PacketType packetType); void sendPacketType(PacketType packetType);
void sendOldMessages();
signals: signals:
void sigSend(); void sigSend();
QByteArray sigGetXmlAnswer(QString); QByteArray sigGetXmlAnswer(QString);

View File

@@ -35,6 +35,7 @@ enum PacketType{
TYPE_QT = 9, TYPE_QT = 9,
TYPE_DISABLE = 11, TYPE_DISABLE = 11,
TYPE_CHECKVERSION = 13, TYPE_CHECKVERSION = 13,
TYPE_GET_OLD_MESSAGES = 22,
TYPE_XMLANSWER_MESSAGE_FOR_GUI = 90, TYPE_XMLANSWER_MESSAGE_FOR_GUI = 90,

View File

@@ -471,3 +471,8 @@ void ConnectorToServer::clearListModelDB()
listTaskFimArray.clear(); listTaskFimArray.clear();
listTaskAmmArray.clear(); listTaskAmmArray.clear();
} }
SendSystem *ConnectorToServer::getSendSystem() const
{
return sendSystem;
}

View File

@@ -67,6 +67,8 @@ public:
ServerSettings getServerSettings(); ServerSettings getServerSettings();
bool getIsConnected(); bool getIsConnected();
SendSystem *getSendSystem() const;
public slots: public slots:
void slot_AnswerQueryToDB_ListInstructors(QList<Instructor> listInstructors); void slot_AnswerQueryToDB_ListInstructors(QList<Instructor> listInstructors);
void slot_AnswerQueryToDB_ListGroups(QList<Group> listGroups); void slot_AnswerQueryToDB_ListGroups(QList<Group> listGroups);

View File

@@ -218,7 +218,6 @@ void InstructorsAndTraineesWidget::checkLoginResult(ServerAuthorization *serverA
connectorToServer->sendQueryTasksXML("fim"); connectorToServer->sendQueryTasksXML("fim");
connectorToServer->sendQueryTasksXML("amm"); connectorToServer->sendQueryTasksXML("amm");
messangerWidget->initialize(idInstructorLoggedInLocal);
//QMessageBox::information(this, tr("Instructor authorization"), tr("Successfully!")); //QMessageBox::information(this, tr("Instructor authorization"), tr("Successfully!"));
} }
else else

View File

@@ -11,8 +11,8 @@
MessangerWidget::MessangerWidget(QWidget *parent) : MessangerWidget::MessangerWidget(QWidget *parent) :
QWidget(parent), QWidget(parent),
ui(new Ui::MessangerWidget), ui(new Ui::MessangerWidget),
currLogin(""), selectedUserLogin(""),
currId("") selectedUserId("")
{ {
ui->setupUi(this); ui->setupUi(this);
@@ -38,7 +38,7 @@ void MessangerWidget::addMsgFromClient(Trainee trainee, QString text)
QString login = trainee.getLogin(); QString login = trainee.getLogin();
foreach(TabDialogMessenger* tabDialog, listTabDialogMessenger) foreach(TabDialogMessenger* tabDialog, listTabDialogMessenger)
{//Есть такой {//Есть такой
if(tabDialog->getLogin() == trainee.getLogin()) if(tabDialog->getUserLogin() == trainee.getLogin())
{ {
//Добавляем в существующую вкладку //Добавляем в существующую вкладку
ui->tabWidget->setCurrentIndex(getIndexTab(login)); ui->tabWidget->setCurrentIndex(getIndexTab(login));
@@ -46,8 +46,8 @@ void MessangerWidget::addMsgFromClient(Trainee trainee, QString text)
//Делаем ее текущей //Делаем ее текущей
ui->tabWidget->setCurrentIndex(getIndexTab(login)); ui->tabWidget->setCurrentIndex(getIndexTab(login));
currLogin = login; selectedUserLogin = login;
currId = QString::number(trainee.getID()); selectedUserId = QString::number(trainee.getID());
return; return;
} }
} }
@@ -62,9 +62,9 @@ void MessangerWidget::addTabDialogMessenger(Trainee trainee)
{ {
if(listTabDialogMessenger.count() == 0) if(listTabDialogMessenger.count() == 0)
{//Самая первая вкладка, делаем ее активной {//Самая первая вкладка, делаем ее активной
currLogin = trainee.getLogin(); selectedUserLogin = trainee.getLogin();
currId = QString::number(trainee.getID()); selectedUserId = QString::number(trainee.getID());
emit signal_tabMessengerChanged(currLogin); emit signal_tabMessengerChanged(selectedUserLogin);
ui->btnSend->setEnabled(true); ui->btnSend->setEnabled(true);
ui->editMsg->setEnabled(true); ui->editMsg->setEnabled(true);
} }
@@ -72,7 +72,7 @@ void MessangerWidget::addTabDialogMessenger(Trainee trainee)
//Проверяем наличие диалога с этим клиентом //Проверяем наличие диалога с этим клиентом
foreach(TabDialogMessenger* dialogMsg, listTabDialogMessenger) foreach(TabDialogMessenger* dialogMsg, listTabDialogMessenger)
{ {
if(dialogMsg->getLogin() == trainee.getLogin()) if(dialogMsg->getUserLogin() == trainee.getLogin())
{//Диалог для этого клиента уже существует {//Диалог для этого клиента уже существует
//Обновляем статус залогинивания //Обновляем статус залогинивания
if(trainee.getLoggedIn()) if(trainee.getLoggedIn())
@@ -86,7 +86,7 @@ void MessangerWidget::addTabDialogMessenger(Trainee trainee)
//Диалога для этого клиента еще не существует //Диалога для этого клиента еще не существует
//Помещаем новый диалог в список диалогов //Помещаем новый диалог в список диалогов
TabDialogMessenger* tabDialog = new TabDialogMessenger(0 /*TODO доделать передачу реального ID*/, trainee.getLogin(), this); TabDialogMessenger* tabDialog = new TabDialogMessenger(trainee.getLogin(),QString::number(trainee.getID()), this);
listTabDialogMessenger.append(tabDialog); listTabDialogMessenger.append(tabDialog);
//Добавляем новую вкладку диалога //Добавляем новую вкладку диалога
@@ -103,7 +103,7 @@ void MessangerWidget::actualizationTabsDialogMessenger()
{ {
foreach(TabDialogMessenger* tabDialog, listTabDialogMessenger) foreach(TabDialogMessenger* tabDialog, listTabDialogMessenger)
{ {
QString login = tabDialog->getLogin(); QString login = tabDialog->getUserLogin();
bool exist = false; bool exist = false;
for(Trainee trainee : listTrainees) for(Trainee trainee : listTrainees)
@@ -136,7 +136,7 @@ int MessangerWidget::getIndexTab(QString login)
for(int index = 0; index < ui->tabWidget->count(); index++) for(int index = 0; index < ui->tabWidget->count(); index++)
{ {
TabDialogMessenger* tabDialogMessenger = static_cast<TabDialogMessenger*>(ui->tabWidget->widget(index)); TabDialogMessenger* tabDialogMessenger = static_cast<TabDialogMessenger*>(ui->tabWidget->widget(index));
if(tabDialogMessenger->getLogin() == login) if(tabDialogMessenger->getUserLogin() == login)
return index; return index;
} }
return -1; return -1;
@@ -154,19 +154,19 @@ void MessangerWidget::on_btnSend_clicked()
{ {
QString text = ui->editMsg->toPlainText(); QString text = ui->editMsg->toPlainText();
emit signal_sendMessage(currClientId, currId, text); emit signal_sendMessage(currClientId, selectedUserId, text);
ui->editMsg->clear(); ui->editMsg->clear();
//Ищем нужный диалог //Ищем нужный диалог
foreach(TabDialogMessenger* tabDialog, listTabDialogMessenger) foreach(TabDialogMessenger* tabDialog, listTabDialogMessenger)
{ {
if(tabDialog->getLogin() == currLogin) if(tabDialog->getUserLogin() == selectedUserLogin)
{ {
//Добавляем в существующую вкладку //Добавляем в существующую вкладку
tabDialog->addMsgWidgetLocal(text); tabDialog->addMsgWidgetLocal(text);
//Делаем ее активной //Делаем ее активной
ui->tabWidget->setCurrentIndex(getIndexTab(currLogin)); ui->tabWidget->setCurrentIndex(getIndexTab(selectedUserLogin));
return; return;
} }
@@ -178,10 +178,12 @@ void MessangerWidget::on_tabWidget_currentChanged(int index)
//Ищем нужный диалог //Ищем нужный диалог
foreach(TabDialogMessenger* tabDialog, listTabDialogMessenger) foreach(TabDialogMessenger* tabDialog, listTabDialogMessenger)
{ {
if(getIndexTab(tabDialog->getLogin()) == index)
if(getIndexTab(tabDialog->getUserLogin()) == index)
{ {
currLogin = tabDialog->getLogin(); selectedUserLogin = tabDialog->getUserLogin();
emit signal_tabMessengerChanged(currLogin); selectedUserId = tabDialog->getUserId();
emit signal_tabMessengerChanged(selectedUserLogin);
return; return;
} }
} }
@@ -192,7 +194,7 @@ void MessangerWidget::slot_traineeSelected(QString login)
//Ищем нужный диалог //Ищем нужный диалог
foreach(TabDialogMessenger* tabDialog, listTabDialogMessenger) foreach(TabDialogMessenger* tabDialog, listTabDialogMessenger)
{ {
if(tabDialog->getLogin() == login) if(tabDialog->getUserLogin() == login)
{ {
//Активируем нужную вкладку //Активируем нужную вкладку
ui->tabWidget->setCurrentIndex(getIndexTab(login)); ui->tabWidget->setCurrentIndex(getIndexTab(login));

View File

@@ -67,8 +67,8 @@ private:
Ui::MessangerWidget *ui; Ui::MessangerWidget *ui;
QList <TabDialogMessenger*> listTabDialogMessenger; QList <TabDialogMessenger*> listTabDialogMessenger;
QList<Trainee> listTrainees; QList<Trainee> listTrainees;
QString currLogin; //Логин клиента текущего диалога QString selectedUserLogin; //Логин клиента текущего диалога
QString currId; //id клиента текущего диалога QString selectedUserId; //id клиента текущего диалога
QString currClientId; //id этого клиента QString currClientId; //id этого клиента
QTranslator qtLanguageTranslator; QTranslator qtLanguageTranslator;
}; };

View File

@@ -3,12 +3,12 @@
#include "msgwidget.h" #include "msgwidget.h"
TabDialogMessenger::TabDialogMessenger(int id, QString login, QWidget *parent): TabDialogMessenger::TabDialogMessenger(QString login , QString userId, QWidget *parent):
QListWidget(parent), QListWidget(parent),
login(""), login(""),
id(0) userId("")
{ {
this->id = id; this->userId = userId;
this->login = login; this->login = login;
setWordWrap(true); setWordWrap(true);

View File

@@ -12,18 +12,18 @@ class TabDialogMessenger : public QListWidget
Q_OBJECT Q_OBJECT
public: public:
TabDialogMessenger(int id, QString login, QWidget *parent = nullptr); TabDialogMessenger(QString userLogin, QString userId, QWidget *parent = nullptr);
~TabDialogMessenger(); ~TabDialogMessenger();
QString getLogin() {return login;}; QString getUserLogin() {return login;};
int getID() {return id;}; QString getUserId() {return userId;}
void addMsgWidgetLocal(QString text); void addMsgWidgetLocal(QString text);
void addMsgWidgetRemote(QString text); void addMsgWidgetRemote(QString text);
private: private:
QString login; QString login;
int id; QString userId;
}; };
#endif // TABDIALOGMESSENGER_H #endif // TABDIALOGMESSENGER_H

View File

@@ -39,6 +39,8 @@ add_library(ServerLMS SHARED
Systems/sendsystem.h Systems/sendsystem.h
Systems/tools.cpp Systems/tools.cpp
Systems/tools.h Systems/tools.h
Systems/chatsystem.cpp
Systems/chatsystem.h
providerdblms.cpp providerdblms.cpp
providerdblms.h providerdblms.h
resources.qrc resources.qrc

View File

@@ -101,6 +101,14 @@ public:
QString From; QString From;
QString To; QString To;
QString Text; QString Text;
ClientMessage(){}
ClientMessage(QString from,QString to,QString text)
{
From = from;
To = to;
Text = text;
}
}; };
class ServerTask class ServerTask

View File

@@ -1,7 +1,7 @@
#include "processparser.h" #include "processparser.h"
#include "tasksAmmFim.h" #include "tasksAmmFim.h"
ProcessParser::ProcessParser(QObject *parent) : QObject(parent) ProcessParser::ProcessParser(QObject *parent) : QObject(parent) //TODO: переименовать в XMLProcessParser?
{ {
} }
@@ -500,7 +500,7 @@ void ProcessParser::clientMessage(QXmlStreamReader &xmlReader,ClientHandler *cli
clientMessage.To = value; clientMessage.To = value;
} }
processingSystem->processingSendMessage(client, clientMessage); processingSystem->processingSendMessage(clientMessage);
} }

View File

@@ -0,0 +1,83 @@
#include "chatsystem.h"
ChatSystem::ChatSystem()
{
}
void ChatSystem::initialize(CommonClientHandler *commonClientHandler, DataParser *dataParser, QMap<int, ClientHandler*> *clientsMap)
{
this->commonClientHandler = commonClientHandler;
this->dataParser = dataParser;
this->clientsMap = clientsMap;
clientNotSendedMessage = new QMap<QString,QStack<ClientMessage>*>;
auto stack = new QStack<ClientMessage>;
auto clientMessage1 = ClientMessage("1","102","Сообщение 1");
stack->append(clientMessage1);
auto clientMessage2 = ClientMessage("1","102","Сообщение 2");
stack->append(clientMessage2);
clientNotSendedMessage->insert("102", stack);
}
bool ChatSystem::sendTo(ClientMessage message)
{
QByteArray byteArrayMsg = dataParser->ClientAnswer()->message(message.From,message.To,message.Text);
foreach(int idSocket, clientsMap->keys())
{
ClientHandler *handler = clientsMap->value(idSocket);
if(handler->getClient()->getId() == message.To)
{
handler->sendXmlAnswer(byteArrayMsg, PacketType::TYPE_XMLANSWER);
QString str = "Msg From Client [" + message.From + " to " + message.To + "] : " + message.Text;
return true;
}
}
return false;
}
bool ChatSystem::sendMessage(ClientMessage message)
{
bool isSended = false;
isSended = sendTo(message);
if (!isSended)
{
if (clientNotSendedMessage->contains(message.To))
{
clientNotSendedMessage->find(message.To).value()->append(message);
}
else
{
auto stack = new QStack<ClientMessage>;
stack->append(message);
clientNotSendedMessage->insert(message.To, stack);
}
qDebug() << "Message stack count: " + QString::number(clientNotSendedMessage->count());
}
return true;
}
void ChatSystem::sendOldMessages(QString id)
{
if (clientNotSendedMessage->contains(id))
{
auto stack = clientNotSendedMessage->find(id).value();
while (!stack->isEmpty())
{
auto message = stack->pop();
sendTo(message);
}
}
else
{
qDebug() << "client empty";
}
}

View File

@@ -0,0 +1,27 @@
#ifndef CHATSYSTEM_H
#define CHATSYSTEM_H
#include "commonclienthandler.h"
#include <QObject>
#include <Data/typesDataServerClient.h>
class ChatSystem : public QObject
{
Q_OBJECT
public:
ChatSystem();
void initialize(CommonClientHandler *commonClientHandler, DataParser *dataParser, QMap<int, ClientHandler*> *clientsMap);
bool sendMessage(ClientMessage message);
//логика хранения отложенных сообщений
//хендлеры для отправки и приема
void sendOldMessages(QString id);
private:
CommonClientHandler *commonClientHandler;
DataParser *dataParser;
QMap<int, ClientHandler*> *clientsMap;
QMap<QString,QStack<ClientMessage>*> *clientNotSendedMessage;
bool sendTo(ClientMessage message);
};
#endif // CHATSYSTEM_H

View File

@@ -120,26 +120,7 @@ void CommonClientHandler::slot_sendPacketToAllClients(PacketType packetType)
} }
} }
void CommonClientHandler::slotSendMessage(QString idFrom, QString idTo, QString text)
{
QString textMsg = text;
QByteArray byteArrayMsg = dataParser->ClientAnswer()->message(idFrom,idTo,text);
//Проходим все открытые сокеты, ищем нужный
foreach(int idSocket, clientsMap->keys())
{
ClientHandler *handler = clientsMap->value(idSocket);
if(handler->getClient()->getId() == idTo)
{
handler->sendXmlAnswer(byteArrayMsg, PacketType::TYPE_XMLANSWER);
QString str = "Msg From Client [" + idFrom + " to " + idTo + "] : " + textMsg;
emit sigSendToLogger(str);
break;
}
}
}
void CommonClientHandler::slot_sendTaskToClient(QString fullNameClient,QString textTask) void CommonClientHandler::slot_sendTaskToClient(QString fullNameClient,QString textTask)
{ {

View File

@@ -24,7 +24,7 @@ public:
void slot_StatusTasksAMMofTraineeChanged(int trainee_id); void slot_StatusTasksAMMofTraineeChanged(int trainee_id);
void slot_StatusTasksFIMofTraineeChanged(int trainee_id); void slot_StatusTasksFIMofTraineeChanged(int trainee_id);
void slot_sendPacketToAllClients(PacketType packetType); void slot_sendPacketToAllClients(PacketType packetType);
void slotSendMessage(QString loginFrom, QString loginTo, QString text); bool slotSendMessage(QString loginFrom, QString loginTo, QString text);
void slot_sendTaskToClient(QString fullNameClient, QString textTask); void slot_sendTaskToClient(QString fullNameClient, QString textTask);
signals: signals:
void sigSendToLogger(QString text); void sigSendToLogger(QString text);

View File

@@ -15,12 +15,14 @@ void ProcessingSystem::initialize(ServerLMSWidget *server,
DataParser *dataParser, DataParser *dataParser,
CommonClientHandler *commonClientHandler, CommonClientHandler *commonClientHandler,
Logger *logger, Logger *logger,
UpdateController *updateController) UpdateController *updateController,
ChatSystem *chatSystem)
{ {
this->commonClientServer = commonClientHandler; this->commonClientServer = commonClientHandler;
this->dataParser = dataParser; this->dataParser = dataParser;
this->server = server; this->server = server;
this->updateController = updateController; this->updateController = updateController;
this->chatSystem = chatSystem;
connect(this,&ProcessingSystem::sigListsInstructorsTraineesChanged,commonClientHandler, &CommonClientHandler::slot_ListsInstructorsTraineesChanged,Qt::AutoConnection); connect(this,&ProcessingSystem::sigListsInstructorsTraineesChanged,commonClientHandler, &CommonClientHandler::slot_ListsInstructorsTraineesChanged,Qt::AutoConnection);
@@ -29,7 +31,6 @@ void ProcessingSystem::initialize(ServerLMSWidget *server,
connect(this,&ProcessingSystem::sigUpdateListClients,server, &ServerLMSWidget::slotUpdateListClients,Qt::AutoConnection); connect(this,&ProcessingSystem::sigUpdateListClients,server, &ServerLMSWidget::slotUpdateListClients,Qt::AutoConnection);
connect(this,&ProcessingSystem::sigSetData,updateController,&UpdateController::setDataInfo,Qt::AutoConnection); connect(this,&ProcessingSystem::sigSetData,updateController,&UpdateController::setDataInfo,Qt::AutoConnection);
connect(this,&ProcessingSystem::sigSendMessage,commonClientHandler, &CommonClientHandler::slotSendMessage,Qt::AutoConnection);
connect(this,&ProcessingSystem::sigLogMessage,logger,&Logger::addTextToLogger,Qt::QueuedConnection); connect(this,&ProcessingSystem::sigLogMessage,logger,&Logger::addTextToLogger,Qt::QueuedConnection);
} }
@@ -95,7 +96,6 @@ void ProcessingSystem::processingClientAutorization(ClientHandler *client, Clien
QString str = QString(arrayAnswer); QString str = QString(arrayAnswer);
//logger->addTextToLogger("To Client: " + str); //logger->addTextToLogger("To Client: " + str);
//Извещаем об изменениях в авторизации //Извещаем об изменениях в авторизации
emit sigListsInstructorsTraineesChanged(); emit sigListsInstructorsTraineesChanged();
} }
@@ -474,9 +474,9 @@ void ProcessingSystem::processingClientQueryTasksXML(ClientHandler *client, Clie
} }
} }
void ProcessingSystem::processingSendMessage(ClientHandler *client, ClientMessage clientMessage) void ProcessingSystem::processingSendMessage(ClientMessage clientMessage)
{ {
emit sigSendMessage(clientMessage.From, clientMessage.To, clientMessage.Text); chatSystem->sendMessage(clientMessage);
} }
void ProcessingSystem::processingClientNotify(ClientHandler *client, ClientNotify clientNotify) void ProcessingSystem::processingClientNotify(ClientHandler *client, ClientNotify clientNotify)

View File

@@ -7,6 +7,7 @@
#include <clienthandler.h> #include <clienthandler.h>
#include <serverlmswidget.h> #include <serverlmswidget.h>
//#include "instructorsandtraineeswidget.h" //#include "instructorsandtraineeswidget.h"
#include "chatsystem.h"
#include "providerdblms.h" #include "providerdblms.h"
class SendSystem; class SendSystem;
@@ -27,14 +28,15 @@ public:
DataParser* dataParser, DataParser* dataParser,
CommonClientHandler *commonClientServer, CommonClientHandler *commonClientServer,
Logger *logger, Logger *logger,
UpdateController *updateComtroller); UpdateController *updateComtroller,
ChatSystem *chatSystem);
void processingClientAutorization(ClientHandler *client, ClientAutorization clientAutorization); void processingClientAutorization(ClientHandler *client, ClientAutorization clientAutorization);
void processingClientDeAutorization(ClientHandler *client, ClientDeAutorization clientDeAutorization); void processingClientDeAutorization(ClientHandler *client, ClientDeAutorization clientDeAutorization);
void processingClientQueryToDB(ClientHandler *client, ClientQueryToDB clientQueryToDB, int id = 0, void* data = nullptr); void processingClientQueryToDB(ClientHandler *client, ClientQueryToDB clientQueryToDB, int id = 0, void* data = nullptr);
void processingClientQueryTasksXML(ClientHandler *client, ClientQueryTasksXML clientQueryTasksXML); void processingClientQueryTasksXML(ClientHandler *client, ClientQueryTasksXML clientQueryTasksXML);
void processingSendMessage(ClientHandler *client, ClientMessage clientMessage); void processingSendMessage(ClientMessage clientMessage);
void processingClientNotify(ClientHandler *client, ClientNotify clientNotify); void processingClientNotify(ClientHandler *client, ClientNotify clientNotify);
void setCurrentDataInfo(DataInfo *dataInfo); void setCurrentDataInfo(DataInfo *dataInfo);
@@ -57,7 +59,6 @@ signals:
void sigStatusTasksFIMofTraineeChanged(int trainee_id); void sigStatusTasksFIMofTraineeChanged(int trainee_id);
void sigLogMessage(QString log); void sigLogMessage(QString log);
void sigAddToMessanger(QString login,QString text); void sigAddToMessanger(QString login,QString text);
void sigSendMessage(QString loginFrom, QString loginTo, QString text);
void sigSetData(DataInfo *dataInfo); void sigSetData(DataInfo *dataInfo);
private: private:
@@ -66,6 +67,7 @@ private:
DataParser *dataParser; DataParser *dataParser;
UpdateController *updateController; UpdateController *updateController;
ProviderDBLMS* providerDBLMS; ProviderDBLMS* providerDBLMS;
ChatSystem *chatSystem;
void sendTaskListToUnity(ClientHandler *client); void sendTaskListToUnity(ClientHandler *client);
}; };

View File

@@ -24,7 +24,6 @@ void RecognizeSystem::initialize(UpdateController *updateController,DataParser*
socket = handler->getSocket(); socket = handler->getSocket();
connect(this,&RecognizeSystem::sigCalculateHash,updateController,&UpdateController::calculateFullHashWithSetup,Qt::AutoConnection); connect(this,&RecognizeSystem::sigCalculateHash,updateController,&UpdateController::calculateFullHashWithSetup,Qt::AutoConnection);
//connect(this,&RecognizeSystem::sigCalculateHash,updateController,&UpdateController::setUpCurrentServerHash,Qt::AutoConnection);
connect(this,&RecognizeSystem::sigChangeVersion,updateController,&UpdateController::changeAssetVersion,Qt::AutoConnection); connect(this,&RecognizeSystem::sigChangeVersion,updateController,&UpdateController::changeAssetVersion,Qt::AutoConnection);
connect(this,&RecognizeSystem::sigDeleteVersion,updateController,&UpdateController::deleteAssetVersion,Qt::AutoConnection); connect(this,&RecognizeSystem::sigDeleteVersion,updateController,&UpdateController::deleteAssetVersion,Qt::AutoConnection);
connect(this,&RecognizeSystem::sigCopyVersion,updateController,&UpdateController::createCopyVersion,Qt::AutoConnection); connect(this,&RecognizeSystem::sigCopyVersion,updateController,&UpdateController::createCopyVersion,Qt::AutoConnection);
@@ -51,10 +50,6 @@ void RecognizeSystem::recognize()
if(!isPackageTypeInited) //первичная инициализация для типа клиента if(!isPackageTypeInited) //первичная инициализация для типа клиента
{ {
// char *read = new char[0];
// stream.readRawData(read,1);
// packetType = static_cast<PacketType>(QString(read[0]).toInt());
char *read = new char[4]; char *read = new char[4];
stream.readRawData(read,4); stream.readRawData(read,4);

View File

@@ -43,6 +43,7 @@ ServerLMSWidget::ServerLMSWidget(QWidget *parent) :
providerDBLMS->deAuthorizationAll(); providerDBLMS->deAuthorizationAll();
logger = new Logger(); logger = new Logger();
chatSystem = new ChatSystem();
connect(providerDBLMS, &ProviderDBLMS::signal_BlockAutorization, this, &ServerLMSWidget::slot_BlockAutorization); connect(providerDBLMS, &ProviderDBLMS::signal_BlockAutorization, this, &ServerLMSWidget::slot_BlockAutorization);
connect(logger,&Logger::sigSendTextToLogger,this,&ServerLMSWidget::slotAddToLog,Qt::AutoConnection); connect(logger,&Logger::sigSendTextToLogger,this,&ServerLMSWidget::slotAddToLog,Qt::AutoConnection);
@@ -66,7 +67,8 @@ ServerLMSWidget::ServerLMSWidget(QWidget *parent) :
updateThread->start(); updateThread->start();
commonClientHandler->initialize(&clientsMap,processingSystem,dataParser,logger); commonClientHandler->initialize(&clientsMap,processingSystem,dataParser,logger);
processingSystem->initialize(this,dataParser,commonClientHandler,logger,updateController); processingSystem->initialize(this,dataParser,commonClientHandler,logger,updateController,chatSystem);
chatSystem->initialize(commonClientHandler,dataParser,&clientsMap);
logger->setTypeLog("widget"); logger->setTypeLog("widget");
connect(dataParser,&DataParser::sigLogMessage,logger,&Logger::addTextToLogger); connect(dataParser,&DataParser::sigLogMessage,logger,&Logger::addTextToLogger);

View File

@@ -19,6 +19,7 @@
#include <Systems/recognizesystem.h> #include <Systems/recognizesystem.h>
#include <Systems/logger.h> #include <Systems/logger.h>
#include <Systems/commonclienthandler.h> #include <Systems/commonclienthandler.h>
#include <Systems/assetsmanager.h>
#include <Data/typesDataServerClient.h> #include <Data/typesDataServerClient.h>
#include <Data/Client.h> #include <Data/Client.h>
@@ -38,6 +39,7 @@ class RecognizeSystem;
class ClientHandler; class ClientHandler;
class MultiThreadServer; class MultiThreadServer;
class AssetsManager; class AssetsManager;
class ChatSystem;
class SERVERLMS_EXPORT ServerLMSWidget : public QWidget class SERVERLMS_EXPORT ServerLMSWidget : public QWidget
{ {
@@ -125,6 +127,7 @@ private:
AssetsManager *assetsManager; AssetsManager *assetsManager;
Logger *logger; Logger *logger;
CommonClientHandler *commonClientHandler; CommonClientHandler *commonClientHandler;
ChatSystem *chatSystem;
ProviderDBLMS* providerDBLMS; ProviderDBLMS* providerDBLMS;