diff --git a/.vs/MDserver/v14/.suo b/.vs/MDserver/v14/.suo index cdd60db..b80862c 100644 Binary files a/.vs/MDserver/v14/.suo and b/.vs/MDserver/v14/.suo differ diff --git a/MDserver/AboutForm.Designer.cs b/MDserver/AboutForm.Designer.cs index 4a26093..67f8cf3 100644 --- a/MDserver/AboutForm.Designer.cs +++ b/MDserver/AboutForm.Designer.cs @@ -83,11 +83,15 @@ private void InitializeComponent() this.Controls.Add(this.label2); this.Controls.Add(this.pictureBox1); this.Controls.Add(this.label1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.KeyPreview = true; this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "AboutForm"; this.ShowIcon = false; this.Text = "MDserver"; + this.TopMost = true; ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); diff --git a/MDserver/AboutForm.resx b/MDserver/AboutForm.resx index 106d961..7079589 100644 --- a/MDserver/AboutForm.resx +++ b/MDserver/AboutForm.resx @@ -121,202 +121,342 @@ iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAC3GSURBVHhe7V0HeBZV1p50mjQLKCgoWFfFjqKIBUSUKF1CS8AIwSSUJJSQQEIIECAhoYsUAQVB - sWABFRV10dVdXSzrut1d/XcFETsIIfne/8wXghBCzpzcmQ+S7+R5hgDn3HPPPeW95965M2MBsPRSG2gM - BGcMaPIrAGoMBHEMqPOD2Pk66wfnrH+k3xUAFAA0BoI4BtT5Qex8rQC0AlAAUADQGAjiGFDnB7HztQLQ - CkABQAFAYyCIY0CdH8TO1wpAKwAFAAUAjYEgjgF1fhA7XysArQBOGADsjrVSv46zfHRBL7VBEMeAb9dQ - K+1EgXFAAeDroVZ6EDtagU7B3kkMTAokGAQEAAjhdmvi6yyvMeA8BuycCQQQeAoAX8da09Tpzp2utlJb - HRMDQ61cL4HAMwDQYNZg1hhwLwa8AgHXAeDbeOtydbx7jldbqi3LY2DXMKud20DgKgCQoo9rwGrAagx4 - GgPr3QQB1wCAnP4Xdbynjneyg6w8wXGn4S9ugYArAED39LcaJv8Tbg1I5ejhlpM9Bv433KpH+bLDJGd2 - xVmvujFOYwDYE2d1qc5ACDQGujEAlaEJX9NjYDclc3VyaM8w6w7TsZsBQLYVKlX8f0Otq0yV1vaa9LUx - BiiXXpDmEygHTWxhBAASZQnl9pgoqm016YMlBiR5ZfOa2KXaAEAdf+RY0aFWkomS2laTP9higCbMbx3n - V5z1cXXtYwIAjnacaa1/dXWV03aa+MEcA7uHWn92CgLVtVO1AMCpUjSAmOoqpu00+TUGYFGu/eA036pj - L+8AINb6e3UU0jaa+BoDR8fASQUApMyPThRSJ2oiawy4FwNOco54fpbaXFwBOFEEdNBBqojyuxcsasva - Z0s6+POeo9wTvuHKGwAQKqEBW/sCVn3qvk9POACQAns5JT6Ps+qo8913vtpUbUq3Bj/l8o/o+ySxIqoA - HHRudChBorjyakIEYwy4nYNuA8DOYHSKjlnBKFAxcFIDwP9irNMCZQjtR5MuGGOAXrPHvl9TYhdXKwBJ - x8qrCawxII8BerN2LFcFSOzqGAAIeTLc7FiipPLKA0VtVnttxuUhgUSmU/9LAOAPXMdOO1W+2huc6lvv - fcvlId0teN+pH5wDQJz1Fdex006Vz/sgURvXXhtzeUj0XU79rwCgh5Ycx4DToFI+b8FHAUCTVpM2iGNA - ASCIna+zq7eza02wrwKAAoBWAEEcAwoAQez8mjBDqY7eVikKAAoAWgEEcQwoAASx83V29XZ2rQn2VQBQ - ANAKIIhjQAGAnE8/9h8BuyrODFzfHD9Hl8rn5J3sMxs33op0bjxSeab8nD5u0hUAFAAonqouhaUJw8nz - mi5NQE4fqTxTfk4fN+kKAAoACgBCADRNcK69mwnOyVIAUABQAFAAqOrDPLX/WQCvS1xOPkfnUNztGcVU - HjeeQMvn7MfRufFw7Tm61/Kr6l8rgEoqAM5hUjrnYI7O9WeaUNymn1Q/jt9UX6l8zn4cneuPa8/RvZav - ACAs8TiHSemcgzk6159pQikAnNhNUFP/c/GhAKAAILrXbwooXEAHWr5JgthtufGc7PIVAAwBgAtYLkDc - ppvKc3vG5+S5nSDS8XP8nH5ce6/jg9PPhK57AA4Q3msHmwaYaQJy45MGGDceU3mc/ECPh+tPqq/UPib8 - CgAKAMeUuFzAcgFn2p4DNE4+l5Cc/lz/HF3aPzceqb4SfgUABQAFgJN8iShJaCmvAsBJAABSp3EzECdP - OkNx8jh9uP6kMyAnz1RfbjwcXaqfdPzS8ekmYC1HeGkASQNUGnCcfI7O9WfanktgU7pUP6n/OPtI6FoB - aAVwzFOQkgCqjJdLAI7O9W/a3jTBufZS/RQA4qxjziJzQeAmnXMA51Bpezd1t2Vx/UsD1lQ/qb1OtP5c - /1I6N37OH6b2l7TXCsBBAnEOlQaIxEFOeDn9uIDj9HeiQ1U8pvLdbi+Vx/Fz9pe2N7W3pL0CgAKA60sA - DnAkAVqdCofrn0tIrj1H5wCBay+1jwm/AoACgAJALd8krgogFAAUABQAFAD0fQBHlm0mJZWTXXHTElBa - YnL9SUviE20fqb4cvynd1B5c/6bytQIwRHhTB3AO5uhuJ7ApgJjagxsPRze1FydfSje1h3Q8pv0d2V6X - AA6WAKYG5xzM0bmADHR7U3tw4+HopuPl5EvppvaQjse0PwWAChWB1w7g5HN0LiAD3d7NALRlcfqbVixS - +Zy9Az1+t/tTAGAAgAs4U7o0wLwOYJV/9DchOP+Y+p9r72XCV5StS4CT8K3AXAAq/ehXeAUawLgENqUr - ANDR4EAawdRh0vaawCc2gU3tL/W3lD+Qsa8VgFYA4jW4aQLV9PbShJbyKwAEuAIIpMEr6+tEBwhXQnP2 - cVt/t+VJ9ef4axNdKwDmjEAgnB3ogJfOwJwN3NbfbXlS/Tn+2kRXAFAAYJcAXMC7nbBuy5Pqz/HXJroC - gAKAAkCFT8PXpgTnxqIA4AAATGckbo3tNZ0LAq5/bsnAtefsJ9VP2p+pfK/158bD6W9CVwBQABBXANKE - kPK7DThcgnD6cXS35XPy3KQrACgAKABUWAJwCS+dsd2WpwDgIGndNJKpA7mA8ZrO2YLr3+0ZOdD9Scdv - 6m+pvaT24MYjoWsF4OAgkNShEgc44TUNSK/bc2Pg+je1b6Dlc/py9BOZ8BV1UwBQAGDfCCRNMNMEkPYX - aH5ufBxdASDO+opDHm5WcZPudQCZ6srpxwWU1+258XH9myZMoOVz+nJ0zl+cPd2kc3lI9F1O+3P8DXoS - qgAg2MfgApwLKK/bcwHC9W+aMIGWz+nL0Tl/cfZ0k64AUI0XUnAO4AJSSjcNKK4/Tn6gx8vpK00gjt9r - utR+HL+bdAUABQCKJ9njuRy/NIFN+bmE8DrBOfmm+nHtTegKAAoACgDMUWAuwTk6l6Cm7Tn5VdEVABQA - FAAUAPS7AFWVoVzJ6zbdBNEraystsU37l85oUv04fs4fXHuOztmHG7+pfK5/CV0rABfOAXABJ6VLHOiE - lws4LmCd9HEkj1SeVD+On7M3156jc/bgxm8qn+tfQlcAUABgDwJJAsrm5RIg0AnKJZyUztmDGz/XHyff - TboCgAKAAoDwYSAuARUAmEMuJ9tBIG5G4ugcopsGhLS9VF+vA9rUPpx+0vFy+nDyOH28ls/1L6FrBVAJ - WEkTjnO42/KkAcrpxwWM2/qb6iPVl+tPOj7T/qX+4/ozoSsAKABQ/Bx9EEgaoNIE4/g5fTg6J5+jS8fP - 8bsNMNz4JXQFAAUABQDDcwAKAGUTSI19GEiCmP6BGgaMdAbyOsA4faR0Tl/O3tL+OH9w/Un15fRzuz+p - PAm/VgCCp/LKDcsFnJTO8XMByrWX0rkA5+icvlyAcvI5Oiefo5vai5Nvah+p/Kr4FQAUAI6paLgE4+im - Ac7J5+imCaIAYB15NLj2vw9AGjDSAOESgpNn2p6TzyWUlM7py9lb2h83Pq4/qb6cfm73J5Un4dcKoBpr - emnAcQETaHlcf1K66fik/UkCvDp7Nqb6mLaXjs+EXwFAAYDiR/Y+AGnCmyYE155LAK49Nx5T+0jbc+Nx - k64AEFwAYCd7jf0pT1RpAigAHP+chwKAAkCNAQQFgKoPbEmB0eZXAPDgIFB1HCFpI53RjpBdY5L9OIpW - etbEwB6Ozq5I5Uv5Jb53m1cBQAGgJoGCAkA1bltXBRoKAAoAhwGgpLQU+at/i0v7zcFpPbMRFp2GiG7j - 0TQ+H/VjsnHeXZNxXcxSNO6YjcjGY2GFDkeDJuPQL/ZhrC0qQNaEGZgUPxv9ehVifPaLKJryKuo3HorI - JkPRpHMqwi4bgcjWyah3djpCWo5Dm9vHo1fKWkzKfRx23w5+FAAUANxfB0l3aaW7xm6XbQYl5nFz7JTo - DLSNTkermCxcdX8uuiQWodvkx1D36smof2MGwi+dCuvCNFhnpMJqRsl/WiLCmqTAajgaTZo9gNm5c1GQ - vxDrcwoxsXcm8keOwX13puLCS6cgNCwO1ik9YJ13P9p2fQj1LhwHq9WDqHcdybpkBAYnz0WLngU4pX02 - hwEKAAoAgQcALuE4AOEAg5PPtef65/YAOiRNw4AZhdj20RbcNiELMYsLcf3ACWjVLQOhHSbg7K6FCDsv - C5fftwRR7QgEmo/FGR3yEHLRBIS0TkGTjjMwZ8kS9H5wIvp1zcHg6EyM6JuF66+fiFMbDYLVIB3zJj6E - ZrdMhEVtmt00GzeNWIl6N6XDajcOF94zCyG3ZSLiunSE3VwlCFRrzR5A+5Y9FMO8YMTtCcFEni4BHCwB - uADiEpALCE4+157rvyoAuGF8Lm5InYmkqbn4dt8ruC07Fc1jB2Lsujz0mjkH10ycivArkhF5QTpOvYOq - hPuKcObtc1CHSnir8RiqAtJwwb2PoE7z3jj97EFIjsnEWWfF4ebLk9Hu+nSsHZCO3p0TMa1zOuJGzUN4 - hxzUvyMHp92YjTZ9Z+CK6ELU75CClr2m4LT78hHaejyiLkw/XiWgAKAVgFYAUsA4HgD4fD60ii/ATZNW - 47bEqfjDxxtg0Szcpv9EhN3aDy0HjMbFE1MxeMlSWC2HI+risQhvOR4hDakKqDcGVlQyze6ZsMJHw4q0 - 9wQeQGjICDQ8LQnXtUtFjy5Z2BE3Ff3P7IGMG0Zg6/rVOPfumWjQJQ8DEqdjeN5stOuWhEUf7MTpXSfB - OpuWBJEJdI1CSUmlewIKAAoACgBuAcDy136PTlOXoc2EHMQsmInNnxYie9vTuDFjEgasmoF60YPR+LYR - aNsvHaGnjKDEHI6IyEkIjRiFqHqUrKG0DxBOZX0oAYENAtZAhNQdj/DICf5/R50xDku6zcQQ6w50bdEP - B15biu3vvY1OE9filCuTabYfgjM7zUDU+bTHcEUGWnaZjpBGBCwNEzEp85nKqgAFAAUA7wFAUFKfkE0p - bs13vCVDxYzqvegZXBudipS1qzByTQ4um5SCfsuycN/8TFyaRCX+qXfAChuEiKghsEL6IyQ0FmGhDyIk - 5P6yyxruv8JCkhBqERiEjMYp9WldH5ZIAJBEwDASlzQfhe9jF6Nv+1RsG1OALnGFtKGYhpALx+D8O5bA - Op+qiUuozRW059AzH+d0KaLlxmSE1o2vNgBw/uMAVNqek8ct4bj2nL9N6LoH4ABRpQ7i+Dm6iUOr2oSq - mFGXJxeh5aAcXB47CpeMSkbM0qk4J2EEwi8bitDzqZQ/lxI87B6a2QccugZTwidQoo9CRNgYAoQh/ssG - B/9l0YaffYUNpeSPI5B4gP5NpX/PeejTqAf6NOyOlCkLUedyqhBof6Be5zQMfvRVnBGTSwDwAHrGp9Le - wAyENU/FGVfMVABwEJumsaIA4MDI0oTl+Dm6qVOdVgBt+ubhUtqYa5+aAavTYNTvMRZ1bhpFt/kG4PTr - JlOy96A1fU9K7n6UyJT85TO/f/ZPOlwBWBYlPIFEqB8o7vW3CbUOgYIfGO7Cg5enIfnWxfj82eW4pFMO - rNZ0a7BlKs5LzMS1Kbm4ZspqrN/8Ic5sTxXCxelocskUBQAHsWkaKwoADowsTViOn6ObOtUpANySmovJ - L69Ch/TZtKPfH41upA249pTsTQcjNNRO3DvLrpC76eqDsDB7Ro+la2gZANizvz3j+5P83kMX8Yd2OtSW - /i+UAIR4mtH+QNZ10/HB+NeInyqHsAfRoONEXDSyEL0Xr0PzIYVo3SMNN/YvgtUkAae3yVQAcBCbprGi - AODCfVuv13icfC4IyttXzKjm905Hayq/LxqZhcbn0qZeRAyiLqDNPkrYUKsP/Y4+dNml/X3+CsAGgfK1 - f1n534dmfDv5y3l//R1q9S5bOoTZv4chucMszLyANv8iB9O/CUzOSsAlAxcgvPWDtGFI+wa/mYrOcXlo - fVMhml6UcVwAkAKolJ/bA5DSOf+cSLoCQBADQK/589FxciY6TsvAGbdS6X9Vb4Q2e5AS1k5+mvUJBMIo - 8S3r0KZf+RKgfOb3z/4EAFY/P5992X8/fIUNxg1RCTT79/IDRLerMzCw+Qg8+/CbsOwDQs3i6dYfJf4N - KbjwbrrVeGUKQtsmol30LDSvYgkgTWgpvzTBTeUrAMQd9Q4y//vIAmkUt2ZYTs4RM7Gj21nlNuDkcrY6 - XgXQLjkHDfvR7buL76Kym2bxFn2pZLdn60PlPCW3vfb3r//9m3+0s+8v9w9tCobaewODcGvkGCRGxmMA - PRtwM/G1J6DoFjkacQ3H4D8JC/CfrHXUvi/qhQ/Col5L8J9ldBio2ww0vTkLoWcNo5k/DXUunoHzrqfN - QKsn2rSgvQjaSKzkp9KTdk7H75b9pQDB6Xci6VoBBHEFcFNaARrcMwphjWPR8HyaicMOzeD2Jt7hzb9Y - /+0/GwAsmt3Lkz8sfAhOCbsfKWEj8f4Vk7CrYzr+e81E/PWycXipRQo+umocSgZPx4G5i4Ety7Ep8y3/ - 3kF257l4sVM6Lh+QhWa3FeH0y3Nw8+3J2Pv19+jVIQmtmw3H3JGP4NwGPRUAdA8gMPf8uRJOSjfl59pz - M0YV7Y9Kqjp30oGee2nGHplPD/pQqR9KM7694+/f9bc3+8pm/7DQBP+6v/zf4URrHzEc266Zjt23ZaC4 - /2TsTc/F3rwClKYXoWRYLnwphSjJKIAvYRHS6VZgXttJOJv2GK6JGoCNdxahsXU77Tl0o+VCMvImLMGq - +fOwYuxCXHbaaNzTfRWW0bMDFX+q2Nz0tKLi/MHRT+aKQSuASioAqcOkJTrHLw0ogb5H5dQ5AzLRetRE - NO2Wgsi2dJqPDt/4n9yjBLdn/MMXrfnDwu3/LwMEu+y/u/4wYMxMHJyWCzz9MLDhGay9JQlLmyfgs2sm - AIMKgD5Z+FfHORgekoiXWo7Gm/fOwSZ64q//TUWYdvsEvLbyMUSFJ2LLa5/hH1+8gxfmLMDGsStwbv04 - 7MqlyqHCjwKA+xOiAkAwA8BAuv13Nc30TWmTLpJu10UOoWO+dLLP3umndbxdskdEjDh8/7+8/A8N64yu - BATInotfnp6Lb+mhoTEECrmNMzC40f1YVHck/t12DHZfNR4z66Ti4vCeaEig8hQdC8b8Vfhs2nxspFOI - U2KnoNOtKZiYEo8FE+fgu3Uv4807x+Jzejz4x9GFCgC6BHAf8Sorn7kZV0o35efau7UEiOo6DlG0B1D3 - ioH++/URLWhXPmrQrwlffsLv8Em/Q5t/YdEYRgnvy8kHti7HL8Py8PapY1HQNBmZdH+/IDIJfz1/NPYP - moon6f/iCUhKe1BCr1mA+NvmIvrqFLyxJAOle7fjny+txR8TxuFvJOPnjHzsyy7C9xlzUErVgFYA3se/ - VgAOKgCDhHO0ay1NeOkS4nh3AdreNRaRPRPQMXMq6pxLewBnDkLUOfZOPwHCodN9/ln/MBCUnQi07/un - Rw0HJs6lKmAJvqBHf3vYt/rq9EOXhrF4rP5wFA+ZTpt/q4C1q7G3Oy0Hhi0isFgC38438cMXW8mkT8Hn - exfwvYe92TOA2UtRMncesHQ5SgsfwjcpsxxvAnL2M6VzS6zq+qO6dyW4eJTQFQCCGACadx+A5n1oD+Ci - VISH0Bt7oug2oH0GwP774fP/Zcd7/Sf6Dp0ItAFgYaM4ICkHvm7ZmGfdg/VtxuOPN8zBD63G4xeqLPY/ - NBv49DGU7N+EfX9cgf3rCQTeWAXfni2U9G/iIN4HSgkAiqkKWDoD+6fS8iB7AX6ZSiBQtBS+bAKMY3+q - 9cINBQB9LXiVu8RcgHCIyrU3pbs1A1XMp6hzhiK8bSwuGJmL8Jup/G/Yiw7z2Ed3o/2HeazQQWjg/20f - CrJP+NlHg3uikRWHzzpOpkSlsp5eAYbcIiCNqoHkRfAlU+Ivm4+DO1YCezah5MBGerb/Bfz85ZO0WTgX - P3+6jtTYBl/pa/Dht/4Ln78FzFqBEnpQCNMK8f1Y2ljMUQDg4s4NulYAQVwBWGH0/H69e+klH1T6n2rv - /NuzfOdfAYAOAnWq1wNnWt2oMrjtMAB0CRtACTsLJVsWw7d9IQ6+vQTFryzBvhfptt/TS4Dty1Hy0iKU - /N96oOQZYO8mYOcWHFz3CPatmoeSg1txYP9LKEHZhY9fARasxe4J9DqwCQuxJz4HyKQ7C1oBiG5vVgcQ - FABc2GnlZnjpDM7xc46u4nbZUSkV1che3/dCCK3dLfs8v13m+x/eoZOBtKaPiLgX79BewIZzMtDUopd3 - UEVgLwdSGsQCj81H6e+WAp88Bvx5JQ6+sxx4m9b8by1DyRoChOlzgL+8gOLlG+mWYD6+u24S9vXMwJ6C - ufAd2ILS/ZvLqgC6sG8TvkykfQBa/xfPKsCBcbOxM/7Yh4HcWjNz/uLW9F75x63xcfFxJF0BIIgBoHVH - etNveD//Y78R4bT29ye/fQyYXgQS2pFm/Wj82H4K9naYiriIeHwbXUTn+vsgIXIgfsnKA56cDzxDZftm - mvWfpOu5FfDNo99p+SgeORvfX5aB5U3H4vWzxuKnYXRIaN48fL2igGb9V/xXOQAcwAZ8nDULB7Jp/Z+z - ED9nLsLSO1KOexdAEuCV8SoA/LonoAAQxADQpHEfSn77QR37zD/N+nb5718C0Jo/ktb84QOQ2LAviunF - IcVX0pq/ew5+TF6OwXSuv3golevTCQRm0m493bIrzZqNkgm0/k+YigP9qYSfQZt+U4rgS6TNvfEEEuPX - YN9woj9MVUPJNtoIfJ5A4AXgwEso/fxRHNz8DHbmLcDXhXPxwUOr0L87bTJW+HFrhlQAUABwdW3FBRRX - MnLtObpT+RUTam1MHuLaj0aD+jFHP/4beQ9CT41BZAg9GBTRF6/0W4yfXliE4t8+jOIVtNk3k5I4iUr2 - 1QtROn0eiimxfcNoTyAhGwdG0Is84ggcHqAZfRTdCpy8Gm+Fx2NZg/F4qtlQfLONNgdLXkQxbfxtWDIL - 3zw7B7teWIO8cROQl5aNL17bgpdzsvBiIYGDAoCrcVpZNaQVgIMKQLom5BKSo3MJz+lTRfujU+qHT+jf - 7+HmG3rg3PPpceCIAfRCT3sZQFWBfTuw/LHgyH44h87t++htvr+0SqMDPWuAeQUo3kg79StoIzA1D74H - 8+EbPZXOBtCMH5uJDy+chMWRIxBN1cV0ejvQnvMJGNY+D9+6+fhg/SK8OG868nPmYETvXkiIzsWaqWPw - ySOrMa77KBTdPwlpXemcwXEAQDp+qT25JYa0f07eiaQrAAQzAGAHxd5HZQdysB3x949EhytuxNOU2JGn - DUZd+qyXvRwIt5cEdEfguTvH0/n/HHyXTjP747TL/8RC+BYVUqlPy4A0uibRNWYa0G0cvrl0HEDv+N97 - VTb2daFz/a1m4Meek7BpyiQ8lJaGHYvpzMCKZXjuvjg0aZOMrAFzMez+QjQ+/WraUliBT+njJAoAehLQ - 8xLICfpyiM/JkM5ApvxOKwAf3ikDAPrt/7uProOvoRM9q281pFt/4fZ+AFUCkbfS7/txqXUNDq6hdf1s - 2uF/hBJ0RRFKZ9GGX2IWDtplfwLN/nSV3DkR6JEFDJkBX/tMvFwnBm/9ZhSwcRXeH5OKzcMy8YfMiZgV - l4+LWyXg6vNi8EL+Eryxeh12LJ+Fr9c/hK9X0oagVgCex79WAEFcAfjsAzmHkv8wAOBNrHtiAXKzl9Gh - oDvw3LpXaX/g0jIgoCUB1qyli9b90+yTezOp9KfEH5SF0ugpKO1FSd+fqoN7qNzvnYP99J1B34w8lDxO - 5/qX092Bh+j3K2/QrcPtaNokGhfdNBYzqP1HBbORPyQR/145H9+tzcNP6+fhi7XHHgXmgNgpnVuCSQGd - 65eTdyLpCgAuHASSBpTpDF/d/irOqOUn8cqAwL7epp35V1Hqo1t0+16kauBt+vur1Owpuj7Blzs+xP/d - O5pmf5qd1xVgf/wUFHeahn/S47+76AUgX19BtA7j8EuXcTh49yQcHDQdB1PojsDQcdhzfQY2XjEK3eiF - nwefXof3H3kY22fPwM5H5mL3qgL8rmA5/vXoIux+rAh/XZ2H4SSnkh9XvsPAJSxHl9rflN9LgFAAUAA4 - lPzbUOKjQzl0Rt8GAOwvO7NfvHs99u6kk3w/vYrvbHBYvgAleTQ7P0rr/4KZ+Ibe7FtAL/+cSAeGptKj - w/n1H8CmRil48pRRtPOfgBUNEjEyJB4pLWMw/vJcbExYhtvp4aKDG57E5qRYfLOkCD/ScuKzxfPx7qrV - aEePJkd3XU0Vx+0KAA6qU1NwUAAIagCgWd+/AbgNxcWv4MC+57HPR+fy7fP5B7bCt2sdPbTzOv37beC/ - z9ODO6/hwI4V+GnlbBTTXQAfPd6LdHokuPt0PEovDOlFu/3n0vHi1nROoC09O3BVnUFIpDsKGDsfux5+ - BKsGjsGfJxZhI32PIL5tBj7PXogrI1ri+cxH0b51HyxOXYZzmsaj4VnxaFCP3jdw7I9WAC6DggJAEANA - ie/1MgA4SMm9/1lKt9+hZM9G7N/5FIphVwMEBF+8jK+enY+9Tz+BH56l8/mbH6XbefT7YdrZz6eHgPLz - cXBkJnzXj8d7TR9AUt3huIWS/3orBu3D+iOL3iaExIX4F30A5LOFc/DfogLsWVaAWXdNwANtcrHwygS8 - MXsNmtefUPYJMnopyanhffHFB7QEUQDQTUDTEsdJe27Nx63ZuTUe197t/qsY89Ep5fsHSoup1P9hE3zf - 0Zl939P46sN1+P3Whfjz83Pw886F+OXfK1D8wTo8k7sE6yfk45sXtmDzgiexdsxyvDhgAd4fSGf/x6wA - oqdh33Up2NJoFCZHxCKGvikYS28KTquTjA975uLAbKoW3l2PXasX4Mvla7D0gcfRrklPXBsxEsvuoA3F - TzajdOenwC9vAt//jh4bts8oHPNTrfcrcPbl/Oc2XSrPSQxXl0crAAdvBeYSmHMo154LUK69wPkVMspH - b+N9omym972BKRn0bsBmI3Fas+5I6p+KTx/fgMK+ifjvu5uxeeVCbFu6GP/YtBpfbXkSHz2+nh76W4Hn - 8lZiacojyLs2HTuuz8Kec8Zje6MkPEVvCFpIXxGe2yIOX85bhD+NLcAPy/LxcT59BuyUBEyPX4ZRXdNw - d4v70KfVWCQ0p9eA/20rErpnofut01Ba6lMAcLncryxOFACCGgCAb16no7jvLsMvf9qI09vSgZ8o++3A - 3fGbDmPR6eqxdCswGhOS12DbmsfwzvInsGNVPt5bswwfb3gK7y1fjcenFSAj9SHcdx/9HvUoknvMxsr+ - S/A8zepvXTsB/3mAZvftc/F6zHR8OzsPb02agb8s3EAHi+gjpCEDSH4MrHpdccMpSYhtSa8C/+r3qB91 - T2XJb/+fVgAug4ICQJADgJ1VS1OmIyVuDE49x/7STwxCIu5BRN3eCIkciqhzk9C5ewY+e307FhY+gzNO - pVeGWWn07cAp9O7AGHS8ip4UHLQBDyYtQtfu+Rg2fB1i4hajf4+lGDVoMR5NfwT5CSn4+dmlKM5diL/T - A0SfzpyJunUT6YSh/W3BW/DktBXY/faruDRiCHo2rPR7AOWAoACgAOD98UhBSe0oILklAtcft0Rw2v54 - 06r9/xe2GIRwevDH/9pv++tAdIU3ikXLdplo3iITna5Jx4urN+Lbj57B569swodbt2NC6lq0bJlJoEFv - E7LGoNUl6ejWfR5uj56PdtfPxKC4x9H57nkYFFOEycOn4b8bXsQXc+fiw+mzsSl3rf8jofYR43C6a1A3 - dCTOOvXY8/9H6ny8pwG5JZJb9nPav1Qfzn9e0rUCcAFROYfXBACwE62kpBSTJj+FKNqNb9FyPJXmI+nv - IzGkTyxKfnoaB3/civ3fb8MPf9uEA188i592PIMvX92GxqHxaHbGKoQ1oA+M0ufBLrhsOq7rlI82N+Si - b7/16HzXSpx27kx0uGsJZqcvw7sbtuKP8/JxNn2RKCqqJzIyn/T3zf04TUDO3m77Swow0v4VAFxIUi+N - KHWoKX9123MJdrLTFQDcr361AnABXKqbkMcLaK9msJM9wTn9FAAUADw5GMGVcBydqy6kAMEBAEevoj8u - x05qOueHEwUQnP85f0nbu8mvFUA17gJIE1rKLw0YLjGOkHdSJzinHDdOBQB5haAAEFwA4OiuhdNEC/QS - xqleHgKoKxWo6YSgFYAL6/Yjjeg0sI7HxznE1OFce05/txOC04frz+32nDwpnePn/M3RvZbP9X8kXSuA - SsCEcxCXcFx7txOEk8fRpeNxe3wnW/+SBLJ5Of05+0v7c5NfAUABwI5go4sLSFP5XHu3++fkcQnNASRH - l/Zvwq8AoABglPx2MHMByCWwKd3t/jl5CgCVbzY63iAh1PmKQx6pE9zk5xBaGrCcbpw8rj0XkByd65+j - c/px7U3pbvfPyZPak+OX9ucmP5eHRN/ltL8aCwDShOccygU0Z1Bpe46fo3P6mI7X1L5u9++2Pqb6Se3v - Jr8CgIM3AkkDxjThpO05fo4uDShOHkfnEobTh5MvpZvqw7Xn9OHG6yVdAUABgOJLdoCEC2iOziUMpw8n - X0o31Ydrz+nDjddLugKAAoACQAUA5Co+LiG5hDeVz/UvoSsAVOM+Lof4nAOkAcIFDCeP04cbD9e/qXyu - vdvj48brtj6c/Tg6p48JXQFAAeCYzduannDShJAmoNQ+nHyOLh2PhF8BQAFAAaDCQSgugRQAatk5AKlD - vS4hpfpI+d0OcE6e1/aS9h9ofbgZnqObjq+q9loBuLAJyDnI6wQ17V8agNx43KZzCcvpz+ljKp9rL6Vz - /nSTrgCgAHDMUWAuwLiEcpvOJZACgOw27pH2VABQAFAAYG4DcgDDAZSUzgGwm3QFAAUABQAFAFQBBPos - AIe4XMkb6PbS/kxnKG6G5Oicvm7rx/lLSvdaf6l8Cb9WAA4qAM6gXMAEur20P7cTzFSeqf5c/5y/pHRO - X04faXs3+RUAFAAono7eRJLO2Bw/R5cGtFSeNKGl/F7rL5Uv4VcAUABQAPD4jUimACtJaCmvAoAHAMA5 - 3O0ZRjojmuonbc8FpVR/jl9qX7f53bYPZz8TugKAAgDFv+ydgG4HOJfQXH8cXTo+U36pPiYJbNpWAUAB - QAFACIAcQCgAMC+YONneCSidgTgHc3QugKT6SPlN9ZO252Ypqf4cv9S+bvO7bR/OfiZ0rQCEb8MxMfbx - 2nIByAUURzdNGG7MUv05faV0jp/Tj7OPdPycPlI6178JXQFAAYBdAnABxiWYtL1pgnD6cHROX6l+HMBw - dKk+En4FAAUABQDh+wAUAGrZ+wAkiOkFr3RG4mYMU3mcfC4BTNtz8jkfcOPn6Jx8qX6cPTi6VB8Jv1YA - Dt4IxAWMlC5xkBu8JzLAbP2l/Zvak+uPk2+a4Fz/bvjULRkKAAoAjj/oUt2gkyYEl6CcPCldys8BBCev - unb0op0CgAKAAgCzB8AlNAdYXiSuWzIVABQAFAAUAPR9AEeiuFvoWi6Hm0FM++PkS2cojp+jcyWydLym - /UntY6qftP2J5NcKoBqbVFKHcQEolSdNMLcTyFSedLym/XH25+icvqbtOfle0hUAFAAovqp+HwCXgFwC - cHQuwLn+pfpz/Jw+breX9ucmvwKAAoACgMcHgdxMWLdlKQA4AABuBuJmOCmd608aBFJ5HD9H5/Tj7CFt - 77U8brxu07nxu0lXAFAA8LwCcLtk5hJOmiCcvEDTpfqb8CsAKAAoALj8PgBTwDBJaGlbBQAFAAUABQA9 - B3AkanMlK4fwXHspnUN1t9fAUv24/jm6tD+pPTh/cXSpfpw8js6Nz026VgAnYQUgdbA0wUwD2u32Unmc - fbgEk9Kl+knlm/qPs0dVdAUABQCKv6NfCmoa8NL2pvxce7cTUmovaf8mCS1tqwCgAKAAwOwBcADD0RUA - Kpw0q2kvBTV1oHTG4AKKo5v2J5XP9cfJ42Ytzv5S+Zy+XH8cndOH65+zh5t0rQBqQAXABYxpQHIBxcnn - 9OMSwrR/qXxOX+l4TeVx4/eSrgCgAEDxVfk73sr/X5oQUnlSfmnCmQKE6fi59tz4vaQrACgAKAAE+GEo - DsC8TPiKshUAHACAqUNMHS5t7zY/N4NJ++PsyfVnOqN73Z7T3217cfasiq4AoAAgvgvABbhJQNptpfK5 - hAo0ndOf08fUfpL2CgAKAAoALp+DUAAIsm8DcohrivjS9m7zBzqguf68LuFN5XP6S/3DxZcJXSsAByWn - 1KEcP+cwaYBw/BzdNODdbs/J48bD0Tn7c3RT/3LyA0lXAFAAOOatwFwCeU1XAKj6tqybAKEAoACgACD8 - PqRWALXs24CcQ92mcwjOzbDcDCmlS/k5/UzpnD5uy+f8YaqPVH4g+bUCEKJ/IJ2jfQWuFA5WWysAKAB4 - /mWgYE2umjBuBQAFAAWAII4BBYAgdn5NmKFUR2+XQQoACgBaAQRxDCgABLHzdXb1dnatCfZVAFAA0Aog - iGNAASCInV8TZijV0dsqRQFAAUArgCCOgRMFAJ9xHSvye4v8al+1rx0DXB7uirP+6jRWHM8ku4Za+VzH - TjtVPg1kjYHqxwCXhwQABU7t6xgA9gy0GnIdO+1U+arvfLVdcNvu2zirI5eHdq46jRPHAOCk9EC2Feq0 - Y+UL7kBW/1fP/1/HWn/nAEBiW1cBYHec9amkc+WtXhCo3YLXblzy23RJfLgKANLOJYoqb/AGvfr+V9+f - UACgzYUDnALqLE1UjQFvYoAq7Ge5/CN6scT+ogqA7kCEsArEWgclCiivN8Gidq19dmVzz1/+WyES3wsB - gL8HqcuA2hd4koBSXm/8T7N/jjMAkPVfHQAo9UIRDRyZ49RewWUvJzlHPD5pXIgBwMntQFvZXbHWXKky - yh9cQa3+duZvh8kv2v0vt71nAGAr/c/hViN1sjMnq53UTpXFAOXRcycdANCX4PjNQAIA/34A8Wpwa3Br - DMhjgPJntOPkr2aeVasCcLoMKFf+8zirsQaAPADUZsFrM9r0e9hp8ptsvFcbAKQgQEcY52lAB29Aq++d - +54S+udAJL/tEyMA+H6k1USiqAlSaQA5DyC1Vc201e5h1oXSfPrhfqupib+NAMBfBQy1XpcqTfwlJkpr - 25oZ4Oq3yv32VZzVuho5hN2Ue6Y2NQYA8VLg0ObgEQP+DH2tMNOBaHsFhZoUA/8bbF0jLfUrgoQb43UF - AFwAAf8dA73UBhoDzmLAjeQ33gOoqIQ6z5nz1E5qJ5MYcCv5XQeAQ5XAyyaD07aaHBoDx42BV9xMfk8A - wBb6LZ0AVCdqImsMuBcDXp2lcW0PoDJk0gBwLwDUlsFrS7dn/SPleQoA/o4Ex4Y1yIM3yNX3x/o+EMfo - vQeAIz7gQE72qaM1yTUGqowB8SO9JhVCQAHgSEWdvF5MA0XBIhhiwM4FkyQ2aXvCAKCi0p/2tSLpeYEZ - dH1CTt+ll9qgtsUAvSPjT99QjNuxbpK0brY9aQDAzUGpLD0VqDHgLAYUAIL4I5OaJM6SpDbbSQFAAUBj - IIhjQJ0fxM6vzTObjs1ZdaMAoACgMRDEMaDOD2Ln6yzpbJaszXZSAFAA0BgI4hhQ5wex82vzzKZjc1bd - KAAoAGgMBHEMqPOD2Pk6SzqbJWuznf4fmUpL2pYvI7wAAAAASUVORK5CYII= + YQUAADDbSURBVHhe7d0JfFXVtQbwkxkBmRxARcWqtfqcqlYUReosCsosYUrACEEIQxhDImOAAAnzIAIK + KIgVB6pi61ittvU9W7U+a4f3nq/2tRUQ6wQyhHxv35DgzcfKXdmcc24g2ef3+xc961v73ENY+54bY/UA + OI5TT4knHcepH8STjuPUD+JJx3HqB/Gk4zj1g3jScZz6QTzpOE79IJ50HKd+EE86jlM/iCcdx6kfxJOO + 49QP4sl42JHhjdme6ZUZcJx6rGzbQG+sNCPxIJ4My/aBXp7wG+A4zncmSbMTFvFk0MwOt0O4UcdxqhGZ + GWmWgiaeDMr2DG+GdHOO49TQQK9Qmq2giCeDIN6M4zhHhOcrKOJJPz7P8i6WbsBxHH+2DfIukWbOD/Hk + kTIv8jF+0Y7jBGqTNHtHSjx5JMwL+yO9UMdxwvFHaQaPhHjS1o4M7yXhRdr4ibSu49RF/xjsNTR/5t+l + GbCyLdN7WVrblnjSxs5M72bpBWrMptFXWs9x6psdZpilGdHsHOTdIq1nQzxZY1O9ROmFxfKPgd5l4lqO + U8+Z+XiO50UTmUFprZoST9aU9IKqY3a5ndIajuNUJc1PLNxvQzxZE+bC7/MLqdZAb7i0huM4MvOG+bk4 + S7LfS2vUhHiyJoQXITKf9S+X+h3HiW3HQO8P0kxJuLemxJMa6QVIzA2kS/2O49SMmaMvea6qw701IZ7U + SBc/TIb3F6nXcRw74nwJuK8mxJOxmAt9xReWcJ/jOEdOmjHBN1JvLOLJWISLHgaDvYZSr+M4R2Zbpve2 + NGuM+zTiyVikizLucRzHP2nWGPdoxJPVMRfYxRdkH2d6DaRex3H82ZHpfSjNHNkt9VZHPFkd4WKH4R7H + cYIjzRzjnljEk9WRLkY+lfocxwmGMHOH4Z5YxJPVkS4W7R/p3olSn+M4wdieof//a3JPLOLJ6kgXi8Z5 + x3GCtX2glyHNXjTuiUU8KTE7T750sWjc4zhO8KTZq2KgVyD1ScSTErMB/Id4sSjc4zhO8KTZi7Yj03tH + 6pOIJyVm4X/yhRj3OI4TPGn2yDapTyKelJhF3QbgOEcBafaI2wAcp66SZo+4DcBx6ipp9ojbABynrpJm + j7gNwHHqKmn2iNsAHKeukmaPuA3AceoqafaI2wAcp66SZo/U/Q3AHJH/iRvb62t5ra7hfmabr238ejXc + zzgfNr5+mKTZI24DCJrt9bW8VtdwP7PN1zZ+vRruZ5wPG18/TNLsEbcBBM32+lpeq2u4n9nmaxu/Xg33 + M86Hja8fJmn2iNsAgmZ7fS2v1TXcz2zztY1fr4b7GefDxtcPkzR7pP5tAFz3S1tfq2u4n3Few/2M80zL + c51xnml5rW4r6PVY2OvHIs0ecRuAX9r6Wl3D/YzzGu5nnGdanuuM80zLa3VbQa/Hwl4/Fmn2iNsA/NLW + 1+oa7mec13A/4zzT8lxnnGdaXqvbCno9Fvb6sUizR9wG4Je2vlbXcD/jvIb7GeeZluc64zzT8lrdVtDr + sbDXj0WaPeI2AK5rtH6/dabluc44zziv8dvPeD3mN6/R+rmu0fq5HiZp9ojbALiu0fr91pmW5zrjPOO8 + xm8/4/WY37xG6+e6Ruvnepik2SNuA+C6Ruv3W2danuuM84zzGr/9jNdjfvMarZ/rGq2f62GSZo+4DYDr + Gq3fb51pea4zzjPOa/z2M16P+c1rtH6ua7R+rodJmj3iNgCua7R+rvtluz7nGedt8Xq2eD3GecZ5jdZv + W9do/VwPkzR7xG0AXNdo/Vz3y3Z9zjPO2+L1bPF6jPOM8xqt37au0fq5HiZp9ojbALiu0fq57pft+pxn + nLfF69ni9RjnGec1Wr9tXaP1cz1M0uwRtwFwXaP1c90v2/U5zzhvi9ezxesxzjPOa7R+27pG6+d6mKTZ + I24D4LpG6+e6X7w+85v3y+/6QfczzjMtz3WN1s/1MEmzR9wGwHWN1s91v3h95jfvl9/1g+5n0deSaHmu + a7R+rodJmj3iNgCua7R+rvvF6zO/eb/8rh90P+M80/Jc12j9XA+TNHvEbQBc12j9XPeL12d+8375XT/o + fsZ5puW5rtH6uR4mafaI2wD80tbX6ozzjPOM84zzYdOuz3XGeabl/db9Cnv9WKTZI24D8EtbX6szzjPO + M84zzodNuz7XGeeZlvdb9yvs9WORZo+4DcAvbX2tzjjPOM84zzgfNu36XGecZ1reb92vsNePRZo94jYA + v7T1tTrjPOM84zzjfNi063OdcZ5peb91v8JePxZp9kj92wDCpl3f1Y/uetj4+mGSZo+4DSBo2vVd/eiu + h42vHyZp9ojbAIKmXd/Vj+562Pj6YZJmj7gNIGja9V396K6Hja8fJmn2SN3fAGob/wHQcL9fftfnfg33 + M85ruN9W0OsdS6TZI24DCBv/AdRwv19+1+d+Dfczzmu431bQ6x1LpNkjbgMIG/8B1HC/X37X534N9zPO + a7jfVtDrHUuk2SNuAwgb/wHUcL9fftfnfg33M85ruN9W0OsdS6TZI24D4D8gGq0/3nWNbT/nmd884zzT + 8lxnnLfF6zHOa7g/TNLsEbcB8BdIo/XHu66x7ec885tnnGdanuuM87Z4PcZ5DfeHSZo94jYA/gJptP54 + 1zW2/ZxnfvOM80zLc51x3havxziv4f4wSbNH3AbAXyCN1h/vusa2n/PMb55xnml5rjPO2+L1GOc13B8m + afZI3d8A+AvA/Ob94vU18e7nPOM8O9byfuuM8/EkzR5xG4DfvF+8vibe/ZxnnGfHWt5vnXE+nqTZI24D + 8Jv3i9fXxLuf84zz7FjL+60zzseTNHvEbQB+837x+pp493OecZ4da3m/dcb5eJJmj9S/DcC2zjjvl+36 + Qee5zjgfb/x6mJYPu67x2++HNHvEbQBanXHeL9v1g85znXE+3vj1MC0fdl3jt98PafaI2wC0OuO8X7br + B53nOuN8vPHrYVo+7LrGb78f0uwRtwFodcZ5v2zXDzrPdcb5eOPXw7R82HWN334/pNkj7puAWj7oetD4 + ehrut2W7Huf9ivf6TMtznXE+TNLsEbcBaPmg60Hj62m435btepz3K97rMy3Pdcb5MEmzR9wGoOWDrgeN + r6fhflu263Her3ivz7Q81xnnwyTNHnEbgJYPuh40vp6G+23Zrsd5v+K9PtPyXGecD5M0e6TubwBM+4Jw + 3Zbf9bR+rc44z7Q81/3i9W3xera09bjOOM+0PNfDJM0ecRuAVrfldz2tX6szzjMtz3W/eH1bvJ4tbT2u + M84zLc/1MEmzR9wGoNVt+V1P69fqjPNMy3PdL17fFq9nS1uP64zzTMtzPUzS7BG3AWh1W37X0/q1OuM8 + 0/Jc94vXt8Xr2dLW4zrjPNPyXA+TNHuk/m0AGu0LZltnnGecZ1peq/ulrc91xnlbvJ4tbT2uM85r/Pb7 + Ic0ecRsA075gtnXGecZ5puW1ul/a+lxnnLfF69nS1uM647zGb78f0uwRtwEw7QtmW2ecZ5xnWl6r+6Wt + z3XGeVu8ni1tPa4zzmv89vshzR5xGwDTvmC2dcZ5xnmm5bW6X9r6XGect8Xr2dLW4zrjvMZvvx/S7JG6 + vwFoXwCuM84zzmu4n3Feo/X7rdvS1rOta7R+rjMtH3Q9nqTZI24D4DrjPOO8hvsZ5zVav9+6LW0927pG + 6+c60/JB1+NJmj3iNgCuM84zzmu4n3FeE9V7TB/C/dRIZV91/VxnWj7oejxJs0fcBsB1xnnGeQ33M85r + onqP6UO4nxqp7Kuun+tMywddjydp9kj9+yag9gXiOuN80LTrxagf68ehe4wW435rVNdo/VxnWp7r8STN + HnEbgFZnnA+adr0Y9WP9OHSP0WLcb43qGq2f60zLcz2epNkjbgPQ6ozzQdOuF6Me8yg9cADF636JC3vN + w4ldpyKp81ikdByPFlnFaJQ+Fd+7/X5cmb4SzdpPRWqz0fASB6Nx83HolfEgNiwswZQJszApay56dVuA + 8VOfx8LJL6NRs4FIbT4QzW8ag6SLhiC1TQ4anp6HhNbjcPaN49EtdwMmFT5Wfu0aHIfuMVqM+61RXaP1 + c51pea7HkzR7xG0AWp1xPmja9WLUqz2O75yPczrn4cz0KbjsnkLcPGwhOt7/KI67/H40uiYfyRdOg3fe + WHgnj4HX0gz/icOQ1DwXXpORaN7yXswtnI+S4qXYNH0BJnYvQPHQUbj7tjE478LJSEzKhHd8F3jfuwfn + 3PoAGp43Dt6Z96HhlWatC4agf858nNa1BMe3nVrxaqo9Dt1jtBj3W6O6RuvnOtPyXI8nafaI2wAY5xnn + bdmup+WjauLRbvgM9Jm1AK+9/wJumDAF6csX4Kq+E3Bmx3wktpuA029dgKTvTcHFd69A2iVmE2g1Gie3 + K0LCDyYgoU0umrefhXkrVqD7fRPR69bp6N+5AEN6TsFVV03ECU37wWuch0UTH0DLH0+EZ3paXjsX1w55 + CA2vzYN3yTicd+ccJNxQgJQr85B0XcxN4NA9xsL3z4LOa3XG+dokzR5xGwDjPOO8Ldv1tHxU7bDj6vGF + uHrMbAyfVojPd7+IG6aOQauMvhi9sQjdZs/DFROnIfnSHKR+Pw8n3GKeEu5eiFNunIcG5hHeazbKPAWM + xffvehgNWnXHSaf3Q056AU49NRPXXZyDS67Kw4Y+eeh+0zDMuCkPmSMWIbnddDS6ZTpOvGYqzu45C5d2 + XoBG7XLRuttknHh3MRLbjEfaeXkVr+6w49A9xsL3z4LOa3XG+dokzR5xGwDjPOO8Ldv1tHxUrcpRVlaG + M7NKcO2kdbhh2DT8x+8fh2fehc/uPRFJ1/dC6z4jcf7EMei/YiW81oORdv5oJLcej4Qm5img4Sh4aTnm + 3b0AXvJIeKmR7wnci8SEIWhy4nBceckYdLl5Ct7NnIbep3RB/tVD8NKmdTjrjtlofHMR+gybicFFc3FJ + x+FY9ttPcdKtk+Cdbj4SpGYbI1BaKn5P4NA9xsL3z4LOa3XG+dokzR5xGwDjPOO8Ldv1tHxUrcqx+pV/ + R4dpq3D2hOlIXzIbWz9cgKmvPYVr8iehz9pZaNi5P5rdMATn9MpD4vFDzGAORkrqJCSmjEBaQzOsicOQ + lGwe6xPNRhDZBLy+SDhuPJJTJ5T/fdrJ47Ci42wM8G7Braf1wt5XVuLNt99Ch4kbcPwPc8y7/QCc0mEW + 0s7NN08Z+Wh980wkNDUbS5NhmFTwdMWrrHIcusdY+P5Z0Hmtzjhfm6TZI/VvA2C2X0Atr9X94vUr8dF9 + 2dP4UecxyN2wFkPXT8dFk3LRa9UU3L24ABcON4/4J9wCL6kfUtIGwEvojYTEDCQl3oeEhHsO8gaXS0oY + jkTPbAYJI3F8I/O5PmmY2QCGm41hKC5oNQJfZCxHz7Zj8NqoEtycuQDJF45FwnmjcO4tK+Cda54mLjA9 + l07AmV2LccbNC83HjfuReFxWxauschx2rzXBvw+M84zzmqD7wyTNHnEbgO0XSMtrdb94/Up8XJyzEK37 + TcfFGSNwwYgcpK+chjOyhyD5ooFIPNc8yp9lBjzpTtPbp0J/M/DZZtBHICVplNkQBpSLbA7lvH4HJQ00 + w59pNol7zd+bR/+ui9CjaRf0aNIJuZOXosHF5gnhqjw0vGks+j/yMk5OLzQbwL3omjUGJ14zC0mtxuDk + S2dXvMoqx2H3WhP8+8A4zzivCbo/TNLsEbcB2H6BtLxW94vXr8TH2T2LcOGIRWg7Jh9eh/5o1GU0Glw7 + Al7LPjjpyvvNsHcxn+m7muHuZfrN8Fe+85e/+w8/9ATgeWbgzQaRWL5J3FXek+hVbArlG8PtuO/isci5 + fjk+fmY1LugwHV6bTHitx+B7wwrwo9xCXDF5HTZtfQ+ntDVPCOfnofkFkyteZZXjsHutCf59YJxnnNcE + 3R8mafaI2wBsv0BaXqv7xetX4uPHYwpx/8/Xol3eXHjNeqPpNdnw2pphb9EfiYmRwb3toIQ7jB5ISoq8 + o2cYAw9uAJF3/8g7fvmQ31XB5BM7HPw18veJZgMxmZZeX0y5ciZ+O/4VkzdPDkn3oXH7ifjB0AXovnwj + Wg1YgDZdxuKa3gvhNc/GSWcXVLzKKsdh91oT/PvAOM84rwm6P0zS7JG6vwHwF4BxnnFew/0a7mecZ1G5 + Kkeru2aijXn8/sHQKWh21hh4KelI+/4Qk+1n3sF7mF87V4g82t9d/s4f2QQq3/kPPv73MO/4kcGvzH4n + 0etufjVPBUmRXwchp90czP5+DhJT+5u/N5vJqdm4oO8SJLe5D2knD4P3b9NwU2YR2ly7AC1+kF/xKqsc + Ve4n6r4O3avENs+0fq1+NJNmj7gNgPOM8xru13A/4zyLylU5ui1ejPb3F6D9jHycfL159L+sOxJb3mcG + NjL85l3fbAJJZvA9L+rRP6Lynb/83d9sAF6v8lxE5K8PSeqPq9Oyzbt/N5PtjI6X56NvqyF45sHX4UV+ + QKhlFrzTzeBfnYvz7lgJ74e5SDxnGC7pPAetYnwEqLyfqPs6dK8S2zzT+rX60UyaPeI2AM4zzmu4X8P9 + jPMsKlfluCRnOpr0Ggnv/NvNY7d5Fz+tp3lkj7xbVzzOm+GOfPb/7pt/wyse9yu+KZgY+d5AP1yfOgrD + UrPQJ3EwrjO5tmaT6Jg6EplNRuGv2Uvw1ykbTX9PNEzuh2XdVuCvq6ajUcdZaHHdFCSeOsi8849Fg/Nn + 4XtXFZr1uuLs00ajQdLAildZ5ahyP1H3deheJbZ5pvVr9aOZNHvEbQCcZ5zXcL+G+xnnWVSuynHt2BI0 + vnMEkpploMm55p04qeIdPPJNvEPf/Msw7/iGGWzP1CqHPyl5AI5Puge5SUPxzqWTsK19Hv5+xUT86aJx + +NlpuXj/snEo7T8Te+cvB15YjS0Fb5i+gZh603w83yEPF/eZgpY3LMRJF0/HdTfmYNf2L9Ct3XC0aTkY + 84c+jLMad614lVWOKvcTdV+H7lVim2dav1Y/mkmzR+rfBuC3zmzzjPs1MfqrHA1uG4G0u8w79tBieOeZ + R/1E844fGfqKwa98909KzC7/zF/598mm1jZlMF67YiZ23JCPfb3vx668QuwqKsGBvIUoHVSIstwFKM0v + QVn2MuR5Q1B0ziScnpKOK9L6YPNtC9HMuxFeSkez4eSgaMIKrF28CGtGL8VFJ47EnZ3WYtXEBype5XcH + 31elSMkG9zMtb1tntvkwSbNH3AZgW2e2ecb9mhj9VY4z+hSgzYiJaNExF6nn5MA7Luvgv7kXedc37/iH + mM/8ScmR8wc3gMhj/x2NBgGjZmP/jELgqQeBx5/Ghh8Px8pW2fjoiglAvxKgxxT8T/t5GJwwDD9rPRKv + 3zUPW9pORe9rF2LGjRPwykOPIi15GF545SP81ye/wnPzlmDz6DU4q1EmthWaJwc6+L4qRUo2uJ9peds6 + s82HSZo94jYA2zqzzTPu18Tor3Kc0XcuvMvNO32LbvBSzSN/6gAkmnf28u/0m8/xkUf2lJQhh775V/n4 + n5h0E241GwGmzse3T83H57PnYZTZFAqb5aN/03uw7Lih+N9zRmHHZeMxu8EYnJ/cFU3MpvJkx9nA4rX4 + aMZibF72NCZnTEaH63MxMTcLSybOw782/hyv3zYaH+fMx1cjF1S8yu8Ovq9KkZIN7mda3rbObPNhkmaP + uA3Ats5s84z7NTH6qxxpt45D2p0jcNylfcv/eX3KaVnw0vp9N/CVP8hTqWID8JI6Y5AZ+LLpxcBLq/Ht + oCK8dcJolLTIQUHSfShJHY4/nTsSe/pNwxPmXJbZSA50MQO9fgmybpiPzpfn4hcr8nFg15v4759twO+y + x+HPZo1v8ouxe+pCfJE/DwfM0wAffF+VIiUb3M+0vG2d2ebDJM0ecRuARuv3W2ecryk+zrl9NFK7ZqN9 + wTQ0OOtueKf0Q9oZke/0mw2h4qf7yh3aBCLfG+hf/s/989IGAxPnm6eAFfjk4hx0ifyjvga9cHOTDDza + aDD2DZgJvLAW2LAOuzqZjwODlpnNYgXKPn0dX37ykrn6kygr+w1Q9jZ2TZ0FzF2J0vmLgJWrcWDBA/gs + d87BF1n1qNH9V+aqy9vWGef94vXjSZo94jYAjdbvt844X1N8tOrUB616TESLH4xBckIX8+7f8+DPAET+ + unL4y1X8RF/FTwRGNoClTTOB4dNR1nEqFnl3YtPZ4/G7q+fhyzPH41vzZLHngbnAh4+idM8W7P7dGuzZ + ZDaBX6xF2c4XzNC/jv14BzhgNoB95ilg5SzsmWY+Hkxdgm+nmU1g4UqUTTUbxuFHje6/Mldd3rbOotcK + Aq8fT9LsEbcBaLR+v3XG+ZriI+2MgUg+JwPfH1qI5OvM43+TbkjyIj+6G/kpPvNun9gPjct/jfxQUOSn + +yI/3tsVTb1MfNT+fjOo5rF+ulG4EBhrngZylqEsxwz+qsXY/+5DwM4tKN27GaWlz+Gbvz0BPDUf33y4 + 0Vz5NZQdeAVl+GU5fPwGMGcNSicvBWYswBejC826bgOIB2n2iNsANFq/3zrjfE3x4SX1RULDu5Dc2jz6 + nxD5zn/kXf4mk63YAMy7fYeGXXCK19FkbzDnD24ANyf1MQM7B6UvLEfZm0ux/60V2PfiCux+vgRlT60A + 3lyN0p8tQ+n/bQJKnwZ2bQE+fQH7Nz6M3WsXoXT/S9i752coxUH4/YvAkg3YMWEqMGEpdmZNBwoerHiV + VY4a3X9lrrq8bZ1x3i9eP56k2SN1fwPwy/YLynmm5bnOOF+Jj7Smkc/33ZBgPrt7kZ/njzzml//LO7cb + 3ZCSchd+5Q3E42fko4U3AKeYJ4LIx4HcxhnAo4tx4NcrgQ8eBf7wEPb/ajXwlvnM/8YqlK43G8LMecAf + n8O+1ZuBfsX415WTsLtrPnaWzEfZ3hdwYM/Wg08BBnZvwd+GzSr//L9vTgn2jpuLT7MO/5eBou6jyv3a + qlynuvW4zrQ81xnnGefDJM0ecRuAxvYLyHmm5bnOOF+Jjzbtp8FL7mXe+bsgJdl89i8f/siPAd9i/rp9 + +Xf7v2o7GbvaTUNmShY+77wQLb0eyE7ti2+nFAFPLAaeNo/tW827/hPGT9egbJH5dWwx9g2diy8uysfq + FqPx6qmj8fWgEhxYtAjb15SYd/0Xy1VuAHvxOH4/ZQ72TjWf/6cvxTcFy7DyltyKV/ndEXUfVe7XVuU6 + 1a3Hdabluc44zzgfJmn2iNsANLZfQM4zLc91xvlKfDRv1sMMf+Rf1In8zL951488/pd/BDCf+VPNZ/7k + PhjWpCf25SzEvh+az/ydpuOrnNXo75lzA83j+kyzCcyeA8xbggNT5qJ0gvn8nz0Ne3ubR/hZJcDkhSgb + NhsYbzaJ8euxe7CpP2ieGkpfA8qeNZvAc8Den+HAx49g/9an8WnREmxfMB+/fWAtenfKrHiV3x1R91Hl + fm1VrlPdelxnWp7rjPOM82GSZo+4DUBj+wXkPNPyXGecr8THhvQiZLYdicaN0s1n/sgmUPGv8qbeicQT + 0pGa0B1eSk+82Gs5vn5uGfb98kHsWzPfDL0Z4uHmkX3dUhyYuQj7zGCXDZqD0uyp2DtkMpBpNod7zTv6 + iJnA/evwRnIWVjUejydbDsRnrz1kNoDnse/jN/D4ijn47Jl52PbcehSNm4CisVPxySsv4OfTp+D5BWZz + oCPqPqrcr63Kdapbj+tMy3OdcZ5xPkzS7BG3AfAXiHGeaXmuM9s8i+qtenz5gfmft3Hd1V1w1rkjzLD3 + QXLkJwIjTwWRfxxY+a8Fp/bCGSkdUXZzEb49cyywfj2wqAT7Ni8D1ixH2ZgilN1XjLKR04CJ5h0/owDv + nTcJy1OHoLPZWGZ6vbHzXLMxbHgWZRsX47ebluH5RTNRPH0ehnTvhuzOhVg/bRQ+eHgdxnUagYX3TMLY + WwcffI1Rh3RvRyKyVDStzjiv4f6jiTR7xG0A/AVlnGdanuvMNs+ieul413j/4A/k4E1k3TMU7S69Bk+Z + wU49sT+Oaxb5YaA7kBzZBBJ64Ke3jQdGTce/8sw7+2PLUPqTpShbtsA86puPAWONScaoGUDHcfjswnFA + m/HYddlU7L55OXDmLHzVdRK2TJ6EB8aOxbvL5+HLNavw07sz0fzsHEzpMx+D7lmAZiddjq0r1uDD5TX/ + UWBbkaWiaXXGeQ33H02k2SNuA+AvKOM80/JcZ7Z5FtVb5SjDr8z/mg3A/Fr+12XG/lfQoeMseE06wkuO + fD/APAWkXm9+vQcXeldg/3rzuX7uPOBhM6BrFuLAnGLsGzYF+yOP/dnm3d8ovW0i0GUKMGAWytoW4OcN + 0vHGv40ANq/FO6PGYOugAvxHwUTMySzG+Wdm4/LvpeO54hX4xbqNeHf1HGzf9AC2P7To4IuMOqR7OxKR + paJpdcZ5DfcfTaTZI24D4C8o4zzT8lxntnkW1VvlKIv8QE7F8B/aAPA6Nv5kCQqnrkKSdwt+uvFlJHoX + mnUOfiTA+g2G+dw/I/KTe7PNo78Z/H5TcKDzZBzoZoa+t3k6uNM87nefjj3pU1A2qwiljy0BVq8AHjC/ + vvgL4IM30aJ5Z/zg2tGYZfrfL5mL4gHD8L8PLca/NhTh602L8MmGw38UWLq3IxFZKppWZ5zXcP/RRJo9 + Uvc3gKC/YNp6tnWm5aur81H5k3gHN4KIt1CKl3Gg7EWU7X7ePA28Zf76ZZN80vgAf3v3PfzfXSPNu795 + d95Ygj1Zk7Gvwwz89xUTsO2ycdh+qam1G4dvbx6H/XdMwv5+M7E/dzowcBx2XpWPzZeOQMfm2dj/1Ea8 + 8/CDeHPuLHz68HzsWFuCX5esxv88sgw7Hl2IP60rwmCzjnBUua9KlfdXSav7pa3PdWabD5M0e8RtALa0 + 9WzrTMtXV+eDN4DSslfM2XfKNwDsOfgz+/t2bMKuT7cAX7+Mf0U2h9VLUFpk3p0fMZ//S2bjs/YTUeJ1 + x0RvIKalDEFxo3uxpWkunjh+BFY1zsaaxsMwNCELua3TMf7iQmzOXoUbE3pj/+NPYOvwDHy2YiG+Mh8n + Plq+GL9Zuw6XtOiGzreuM6/3xoMvsupR5b4qVd5f1H3GrPulrc91ZpsPkzR7xG0AtrT1bOtMy1dX56N8 + 8Mu/Afga9u17EXt3P4vdZW+Yv/8lsPcllG3biP141fz9W8DfnwX2vYK9767B1w/Nxb5FJShbbx7p84qB + TjPxSHImunm9cVZSX7TxeuIcrzMua9APw7xuwOjF2Pbgw1jbdxT+MHEhNvcsQtY5+fh46lL8MKU1ni14 + BG3b9MDyMatwRossNDk1C40b9o+8RD6q3FelyvuLus+Ydb+09bnObPNhkmaPuA3AlraebZ1p+erqfJSW + vXpwA9hvhnvPM+bMr1G6czP2fPok9iHyNGA2gk9+jn8+sxi7nvoJvnzmQWDrI8AG8+uDy4HihUYx9g8t + QNlV4/F2i3sx/LjB+LEZ/qu8dLRN6o0piQOAYUvxP8MK8NHSefj7whLsXFWCObdPwL1nF2LpD7Pxi7nr + 0arRhIP/CbLUATghuSc++a35CHL4UeW+KlXeX9R9xqz7pa3PdWabD5M0e6T+bQAa7mecZ7Z5xv0Wqh5l + /4UD+8yj/pdbUPavzebvn8I/39uIf39pKf7w7Dx88+lSfPu/a7DvtxvxdOEKbJpQjM+eewFblzyBDaNW + 4/k+S/BO31UoHbUG6DwDu6/MxQtNR+D+lAykJ/VDRmoWxjbIwXtdC7F3rnla+M0mbFu3BH9bvR4r730M + lzTvih+lDMWqW2YDH2zFgU8/BL59Hfji1yjbGfkZhcOO8vvQfj+4rtH6g64z23yQpNkjbgNg3M84z2zz + jPst0FGGXdt/Yn417/Rlv8Dk/FykthyKE1t2wvDeY/DhY49jQc9h+PtvtmLrQ0vx2srl+K8t6/DPF57A + +49twpur1+CnRQ9hZe7DKPpRHt69agp2njEebzYdjidPGI2lKSMw/7RM/G3RMvzn6BJ8uaoYvy8uxBXH + Z2Nm1iqMuHUs7jjtbvQ4czSyWw0E/vwSsjtNQafrZ+DAgbKDL7HqUX4f2u8H1zVaf9B1ZpsPkjR7xG0A + jPsZ55ltnnG/hcOOz16dh22/WYVv/3MzTjrnDnhpkf934E74t3aj0eHy0Ugyj/MTctbjtfWP4lerf4J3 + 1xbj7fWr8PvHn8Tbq9fhsRklyB/zAO6+2/w64hHkdJmLh3qvwLPmXf2NH03AX+817+5vzser6TPx+dwi + vDFpFv649HF4CUOQnNDHrJ8Or+GtuPr44cho3RX457+jUdqdFa/usKP8PrTfD65rtP6g68w2HyRp9ojb + ABj3M84z2zzjfgvisTJ3JnIzR+GEMyL/pZ90JKTciZTjuiMhdSDSzhqOmzrl46NX38TSBU/j5BOGm9cw + FomJk5Fgsu0vm4bMfo/jvuHLcGunYgwavBHpmcvRu8tKjOi3HI/kPYzi7Fx888xK7Ctcir/MLMKHs2fj + uOOGIdmL/BeGfownZqzBjrdexoUpA9C1ifjfA6g8yu9D+/3gukbrD7rObPNBkmaP1P0NwC/bL6DfPOM8 + i8pVe5x3Wj8kp/Q0uf7mCaB7ueSmGWh9SQFanVaADlfk4fl1m/H5+0/j4xe34L2X3sSEMRvQunWB2TSy + TN8onHlBHjp2WoQbOy/GJVfNRr/Mx3DTHYvQL30h7h88A39//Hl8Mn8+3ps5F1sKN5i+g/9twWSvJ45L + HIpTTzj85/+jj+rut/J8TeuM80zLc51pea7HkzR7xG0AGtsvqN884zyLysU8SksPYNL9TyItbQBOaz3e + PJoPNX89FAN6ZKD066ew/6uXsOeL1/Dln7dg7yfP4Ot3n8bfXn4NzRKz0PLktUhqPMZsHIPx/Ytm4soO + xTj76kL07LUJN93+EE48azba3b4Cc/NW4TePv4TfLSrG6c0yzPpdkV/wRPm1taO6+608X9M64zzT8lxn + Wp7r8STNHnEbgMb2C+o3zzjPonLH9FHd/Vaer2mdcZ5pea4zLc/1eJJmj7gNQGP7BfWbZ5xnUblj+qju + fivP17TOOM+0PNeZlud6PEmzR9w3ATW8HrPNM62f6ywqe0wf0r1JItFotnXGeb/CXt+GNHvEbQAaXo/Z + 5pnWz3UWlT2mD+neJJFoNNs647xfYa9vQ5o94jYADa/HbPNM6+c60/JaXcP9jPOM84zzGq1fqzPO+xX2 + +jak2SNuA9Dwesw2z7R+rjMtr9U13M84zzjPOK/R+rU647xfYa9vQ5o9Uv++Cah9gbiu4X7GecZ5jdbP + db94fcb5oPH1GOc13K/hfqbluR5P0uwRtwFodQ33M84zzmu0fq77xeszzgeNr8c4r+F+DfczLc/1eJJm + j7gNQKtruJ9xnnFeo/Vz3S9en3E+aHw9xnkN92u4n2l5rseTNHvEbQBaXcP9jPOM8xqtn+t+8fqM80Hj + 6zHOa7hfw/1My3M9nqTZI/Xvm4B+6xruZ5xntnkNr6fhflvaelxnnPdLW5/rGu7XcH88SbNH3AZgW9dw + P+M8s81reD0N99vS1uM647xf2vpc13C/hvvjSZo94jYA27qG+xnnmW1ew+tpuN+Wth7XGef90tbnuob7 + NdwfT9LsEbcB2NY13M84z2zzGl5Pw/22tPW4zjjvl7Y+1zXcr+H+eJJmj9S/DYBxnvnN27Jdj/Ma7mec + t2W7HucZ523Zrsd5puVt62GSZo+4DYDzzG/elu16nNdwP+O8Ldv1OM84b8t2Pc4zLW9bD5M0e8RtAJxn + fvO2bNfjvIb7Gedt2a7HecZ5W7brcZ5pedt6mKTZI24D4Dzzm7dlux7nNdzPOG/Ldj3OM87bsl2P80zL + 29bDJM0ecd8E1Ooa7mec19j2c17D/YzzYbO9frzzTMtr9XiSZo+4DUCra7ifcV5j2895DfczzofN9vrx + zjMtr9XjSZo94jYAra7hfsZ5jW0/5zXczzgfNtvrxzvPtLxWjydp9ojbALS6hvsZ5zW2/ZzXcD/jfNhs + rx/vPNPyWj2epNkjbgPQcD/jPOM84zwLOq/VmZbX6rZs1+N80Ph6Gr/9QZJmj7gNQMP9jPOM84zzLOi8 + VmdaXqvbsl2P80Hj62n89gdJmj3iNgAN9zPOM84zzrOg81qdaXmtbst2Pc4Hja+n8dsfJGn2iNsANNzP + OM84zzjPgs5rdabltbot2/U4HzS+nsZvf5Ck2SNuA9Bo/Vy3xesx2zzjfo1tP+dZ0Hmux5vt6+F8PEmz + R9wGoNH6uW6L12O2ecb9Gtt+zrOg81yPN9vXw/l4kmaPuA1Ao/Vz3Ravx2zzjPs1tv2cZ0HnuR5vtq+H + 8/EkzR5xG4BG6+e6LV6P2eYZ92ts+znPgs5zPd5sXw/n40maPVL3N4Daxn8gmJbX6sxvnnGecZ5pea3O + OG+L19No/X7rYZJmj7gNIGz8B4Bpea3O/OYZ5xnnmZbX6ozztng9jdbvtx4mafaI2wDCxn8AmJbX6sxv + nnGecZ5pea3OOG+L19No/X7rYZJmj7gNIGz8B4Bpea3O/OYZ5xnnmZbX6ozztng9jdbvtx4mafZI/fsm + YNj4+mE71q7PeY3Wr9WZltfqjPNHE2n2iNsAgsbXD9uxdn3Oa7R+rc60vFZnnD+aSLNH3AYQNL5+2I61 + 63Neo/VrdabltTrj/NFEmj3iNoCg8fXDdqxdn/MarV+rMy2v1RnnjybS7JH6twFw3a/aXp/rzDav0dbj + uob7WdB5rmv89tcmafaI2wD8qu31uc5s8xptPa5ruJ8Fnee6xm9/bZJmj7gNwK/aXp/rzDav0dbjuob7 + WdB5rmv89tcmafaI2wD8qu31uc5s8xptPa5ruJ8Fnee6xm9/bZJmj7gNgOsarV+ra7hfw/3MNq/h9Zht + nnE/47yG+2sbv74wSbNH3AbAdY3Wr9U13K/hfmab1/B6zDbPuJ9xXsP9tY1fX5ik2SNuA+C6RuvX6hru + 13A/s81reD1mm2fczziv4f7axq8vTNLsEbcBcF2j9Wt1DfdruJ/Z5jW8HrPNM+5nnNdwf23j1xcmafaI + 2wC4rtH6beuasPvDrjPbPON+v7T1tbotXi9M0uwRtwFwXaP129Y1YfeHXWe2ecb9fmnra3VbvF6YpNkj + bgPgukbrt61rwu4Pu85s84z7/dLW1+q2eL0wSbNH3AbAdY3Wb1vXhN0fdp3Z5hn3+6Wtr9Vt8XphkmaP + uA2A6xqtP+w60/JcZ5zXcD/zm2da3m/dlu16nI8nafaI2wC4rtH6w64zLc91xnkN9zO/eabl/dZt2a7H + +XiSZo+4DYDrGq0/7DrT8lxnnNdwP/ObZ1reb92W7Xqcjydp9ojbALiu0frDrjMtz3XGeQ33M795puX9 + 1m3Zrsf5eJJmj7gNwC+/69v2B53nuob7bfF6TMvXdt0WrxdP0uwRtwH45Xd92/6g81zXcL8tXo9p+dqu + 2+L14kmaPeI2AL/8rm/bH3Se6xrut8XrMS1f23VbvF48SbNH3Abgl9/1bfuDznNdw/22eD2m5Wu7bovX + iydp9kj92wDCxtdnQee1OtPyYdcZ55mW57pfvD7j/NFMmj3iNoCg8fVZ0HmtzrR82HXGeablue4Xr884 + fzSTZo+4DSBofH0WdF6rMy0fdp1xnml5rvvF6zPOH82k2SNuAwgaX58FndfqTMuHXWecZ1qe637x+ozz + RzNp9kjd3wAcp76SZo+4DcBx6ipp9ojbABynrpJmj7gNwHHqKmn2iNsAHKeukmaPuA3AceoqafaI2wAc + p66SZo+4DcBx6ipp9ojbABynrpJmj4SyAXxEFzkM9ziOEzxp9qJty/T+JPVJxJOSbQO9Yuli0bjHcZzg + SbMXzWwAJVKfRDwp2dnXayJdLBr3OI4TrM8zvfbS7EWLzKrUKxFPVke6WDRM9RKlPsdxgrE9w/uLNHvR + uCcW8WR1pItF25HpfSj1OY4TDGnuGPfEIp6sjnQxxj2O4wRHmjnGPbGIJ6uzLdPbK10wGvc4jhMM84T9 + jDRzZJ/UWx3xZPW8BOGCVWV4++Vex3H8EOeNmFgC98UinoxFuijjHsdx/DHv/tOlWWPcpxFPxmIucoAv + KuE+x3GOnDRjgjKpNxbxpEa48GG2ZXjzpV7HcexI8yXhvpoQT2qki0v+e7DXVOp3HKdmzBz9lOeqOtxb + E+JJlVeDbwZWiGTFNRzHicnMz0iep+oc6ZyJJ2tCehHV+TjTayat4TiObEem96A0S9Xh/poST9aU9EKq + leEtktZwHKcqMy/fHDY/MXC/DfFkTX0x1GsuvaBYeA3HcQ7aMcg7T5qZWL68x2shrVVT4kkb2wd6r0ov + TFEqreU49dE/M702woyodpjZk9azIZ60Jb04Cx+hp5ckres4ddU/+ntXmD/7Vo/6jNc8EuLJIyG9QMdx + wsHzd6TEk0dKeqGO4wSL584P8aQf5gX+nF+w4ziBeFGaOT/Ek359PthrKrx4x3GOUFg/SyOeDIp0I47j + 2OG5CpJ4MlAWPzbsOM53IrMjzlSAxJNhMTdVxjfpOE4V1v9Krx/iyXioyf+9mOPUB5FZkGYkHsSTteHD + nl7q9gxvlvGB+U3Z5jh1zbYM7z8/M3/GI3/WpRmoDeJJx3HqB/Gk4zj1g3jScZz6QTzpOE79IJ50HKd+ + EE86jlM/iCcdx6kfxJOO49QP4knHceoH8aTjOPUBvP8HmUpL2pArQt8AAAAASUVORK5CYII= + + + + + AAABAAEAMDAAAAAAAACoHAAAFgAAACgAAAAwAAAAYAAAAAEAGAAAAAAAgBwAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAmFxM3GRQ0FhE3GRQyFA80FhE1FxI2GBMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAArGRAyFg82FhA/GxU0FA49HRdAIBo9HRc7GxU6GhQ8HBY6FhA7GRMvFBAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxGw82FhA4GBI6GhQ8HBY9HRc/HxlCHBdDHRhE + HhlFHxpDHRhEHhlEHhlBHRc9GxU4GBI1FQ81GBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiEQstEQpAIRg+ + HRRAHxZCIRhFJBtGJRxIJx5OKSFOKSFPKiJQKyNNKCBNKCBOKSFKJh5IJBxCIRg6GRA/IBc3GA88HxYi + DgsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAtFg46HRQ9Fg5CGhVFIRlIJBxKJh5NKSFOKiJQLCRULSVVLiZWLydWLydVLiZTLCRS + KyNPKiJNKCBJJR1MKCA8GxI9HBM9HBNDIBwvGRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjBwBBHhBAGQpFGQxJHBhKIBtQJx5RKB9VLCNZMCdb + MileNSxhNi1hNi1iNy5jOC9gNSxfNCtfNCtgMipdMilVLCNTKiFPKB9KIxpJIhlAIBNCHBA/GBAmBAQA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqBQA4EwtHHxNG + HBBHHhVNIxxNJh5XKh9cLyRfMidhNCljNitnOi9nOi9oOzBpPDFpPDFpPDFoOzBnOi9lNyxjNSpdMCVZ + LyNXLSFSKBxOJhpCIxRGHhJHGg9HHhs4GBMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAApEQs9Ewc+FQxDHRhBGRRDHBROJB1WKCBZKyBgMidjNSpoOi9qPDFtPzRuQDVvQTZw + QjdwQjduQDVsPjNqPDFrOjBqOS9iNClgMiddMCVZLCFXKh9OJBdLIRVGHRRDHBM/GxMwEwwAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAmAwA/FgdGHRRGIyBeOzhVLytVJyBeLSNj + MihkMyloNy1tPDJvPjRyQTdyRDlzRTp0Rjt0RjtzRTpxQzhuQDVvPDJuOzFmNStiNClhMyhbLiNZLCFb + JhxQIxhFIxY/HxJCHxVCGRAPDw8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtCAU5CQM/ + FAs5Fgg9HA1NHBRMHRVLKB5jQTRTJRpgMSllRTp0MyVtQjFrODV9PzR/RTl6Rjl+QjZtQzZoRjlzQjh2 + PzZ0QDNyPDFtOS1mNyliNiVlMiJjLyNZKB5WJRtRIxhLIRVGHhJAGg4+GAwvFAsAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAuBwBAFA1EFg5OEwlPGQ5THhFPGw5cKBtkKR9mKB5PVlN2e341XF5SR1dM + O0R9SCd3QzJ7RTR/QjR6PjJ1QDZ0PjdyPDV/Nzd3NzNtNyxqNippNShlMiJkMSFgKyFaJx1WJRtQIhdM + HxRGHBBDGhE+GhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3EQ1EGRA3DANCEQlKFgpJHA5bHRNb + JRpDKR1IIBtsKSxgkIpRM0BJSEx4UFFCWVRlW2xcSD1kRDlpQDd1QDZ0PTBuPS1sOyt0NDNyNStsNSZt + MydtMSVrLSJqLh5iKh9dJxxZJRlVIxdRIRVKHRBBFwtCGAw6GhUAAAAAAAAAAAAAAAAAAAAAAAAAAAAd + BwA4CgM9EAU+EQZIEQpJGApQGw5jHhRYIhtrYVpOXFsnLjFhTkdcVF5Qi5VVRlRBQUdERlBmhI9vg45a + Y2ZgSEhtOTJjNihqOCZvMCx0NSdsLhxoMB9gLSNdLSFbLB5gJRtkKR9XHxRYJBhSIBRNHRFIGxBGFw88 + EworEw0AAAAAAAAAAAAAAAAAAAAAAAAjBgA6DgE9EAI+EQRIEQhMFwpcGAtcHQ9WHRRVJSQrJyxKZGt/ + a3dpOTVNMSpELzFWdXRHaW90Z2lgTFEuNDlcTlpHSlhScn9WdYRkVFtLLillMSFiLiFXJxthKRZsMBpq + LCFiJhpfJRlZIhVVIBNQHA9LGhBIFw08FAgxFAsAAAAAAAAAAAAAAAAAAAAAAAAuCgA0DQA8EQBBEAJJ + EglPFQlYFwlTHQxZHg5pGxX/+PrSvbw7Mi9FgoZsgZBgNzVSLBpBPThHXWk5RVFJbXN1cXxmS1SJgoVf + TE9UjJdRXFpeNSxgNi9PJiRmKiRmHhZhIRZjJRpcIBRZHxNXIBNRHA9PGhBIGAw6FQc1FQgAAAAAAAAA + AAAAAAAAAAAiBwAxDQUzCgE+DwFDDwJIEQJMFQZQFwhXGApcHQ9cHQ9cHxH+w7T7//n//v/QopdTepBb + HxlxLBtRHx9NUEdCKTczKTVfKBtlIBdlLRphJRVgKhluODFOOzRjLitcKCKTgHhZGgxcHxFbIBFXHRFW + HhNQGg9JGwpMGAtGEgs6Ewo0FQwAAAAAAAAAAAA2HRcrEAYtCQE1DAM9DgBDDwJHEAFLFAVRFgdWFwlX + FghdHA5YGQt2OSv5/Pr+/v7//fd0hJRFHx1eGQpdHhZWLzF6Z3CJe31KIR5tIhpmJxNgGg1uJhyegXr4 + 9u7/+/ZYIRpXJhxeHxFfIBJbHhBYHBBUHBFPGQ5IGglLFwpFEQo5EgkuDQQAAAAAAAAAAAAhBQAkBwAr + BgAzCgE7DgBADwFEEQFOEwRQEwVWFQdeGg1YFwlaGQtaGw3//v////z/+/l/b3YmMTlkHxBKEwb/9f/M + xco6GhtJTk9sGhleHQhpIhRkFhD///z+/flmU1BVFw1dFAZdHA5aGw1YGw1WGg5UGQ9OFgtFGApHFghC + EQk3EAc0FAkdCQUAAAAAAAAkCAEmCQAwCwM1DAM6DQA/DgBDEABNEAJPEgRXEwZbFwpYFAdXFghVFgj/ + 9/74/fT4/P1MJB9HcHlaFQZNHhD//v/z9/j/+PdWeoBcJClfGQJMDwH/3Nv/////9/suKilUEQhkFgVa + FglaGQtQEQNUFgtTFgxMFAlDFghGFAg9Dwc2EAQtCwAhBwAAAAAAAAAlCAEnCAAwCQEyCQA5DgA9DgBA + DwBLEAFNEAJSEQNWEgVUEwVUFQdUFQf/9f3///vz//9cLiNhipNaFwhhLSb5//n3/P3///4PISx/h45U + DABUGgf//vv7////8vkvQj9WGBJfFwVYFwlWFwlUFwlRFQlOEwlLEwhBFgdDEwc7EAc3EQUxDgAmCQAA + AAAbAAEpBwEsBwAwCQEyCQA4DQA6DQA7DwBDDwBFDgBKDwBMDwFLEAFJEAFJEAGRbmD7///7///g1NBl + TkxMDwFbTUf///z/+vv///z/3uQqNDtjeX5MHAr/+fv0//n///kiExsQFRRREAdRFgdPFgdNFgdJFAdI + FAhEEgY7EQQ+EAU2DQQxDgAyCwAuCwAZAAAmBQkpBwEsBwAwCQEyCQA4DQA5DAA8DgA+DQBCDgBHDgBK + DwBIDwBHEAFHEAFLIA/9/f////73//9HFQ9VGQ2hlo75+v7z//zv5d71//t/Rk9EcoM3EwH/6vH6//b0 + //d3SlosSU1IDglKEQJIEQJGEgJFEQRCEAQ/DwM5DwI7DgM2CwIuDQAzCwAsCQAkCAAwEAonBwEnCAAw + CQE0CQA4CwA3DQE4DgJDDQA8DAA+DABECgA6BgBMQz90goBBLCT6//f4//z/+/9JKSpIPDq4s6r/9//2 + +/mYjHr/9P76+/8wCAoDNz6+joz6//////fl1NdffodDEgo/EQBDDwJGDwA/EQA8EQJBEAI5DAA4DAAv + DgAtDgAqCgApDQImDAAlBQAnBwEnCAAwCQE0CQA4CwA2DAA3DQE3DwA1DgA8CwFCCQBEDgf/9/f/8vlZ + KSedgHv///7//v/j1tRmWlbi3tn/9//2/fpFNCdmTFL++vn/5eh5i5ImFA3+/f////v//vxze4InEhFB + EABBEAJBEAI+DQA6DQA8DQA5DAA2DAAvDgAvDQAtCgAoCgAlCwAkBAAnBwEnCAAwCQE0CQA3CgA2DAA2 + DAA8DgA8CwE8CgQtBgD/7+n++fv//f//4t4sBgL///7//f////tUNjH9/vr+9v/4//xHMSskBAX46+P/ + +vgmFxsmLyX//P7//v////lINj0hQks9DAA5DAA2DQA8DAA6DQA5DQA5DAA2DAAwDQAvDQAsCQAnCAAh + CAAiAgAmBgAmBwAvCAAzCAA1CAAzCQAzCQAwDQA2CwIeAAD///v0//7y9/j//v////c4Ewvr8ez//f/y + //gkAAD9/////v/4//kzDhI5CQg4FAT///zf19BANzP///z//f/0//UiEQhrjJ89DwhAFgMyDwE8CgQ8 + DAA5CwM2DAAyDAAwDAIyCwIqBQAnCgMcBQAnBwEmBgAmBwAvCAAzCAA1CAAzCQAzCQA2BwA6CQFJJyH/ + //v9/f3//f7//PuKXFE7DgN6cmv99Pfw+/M0Dwv///7//v/3//ooAgg9DAo8EQBaPTj///tXOTjNw7z/ + /v/4//iDfnVxdIInBwE7DQA1DQE8CQY8DAA6CgQ0CwIyCwIxCgExCgIyCgUjBgAdBgAfAAAmBgAmBwAv + CAAzCAA1CAAzCQAzCQAvCQQyCAFmSkP///vz4+QwCgY8CAI1AQAzCAA/GRX//v////6Ha2v//fr9/v/7 + //xEJCU+Dg08DgAyBQD//f///vtpUkr///7///zq6uRSOkIgEApADQA6DQA+CAg5DQA+CgQ0CwIyCwIw + CQExBwAvBwItEAkYAwAAAAAmBgAmBwAvCAAzCAA1CAAzCQAzCQBBCwo6CAJbRDz//vsoIR4iCQA1DgA+ + CwA2CwBJEA7//f///v36/////vv5/P/3+PRdPz44DQo7CgA+CQCUd4D///tMJB////v/+vz///w9FxUu + Jh9PFQJBDgRABwg5DQBACQYyCwIxCgEvCAAvBQAuBgEgAgAAAAAAAAApDAAnCgAqBgAyCAM2BgA1CAA3 + CwA9EwAwDQBDJiL//v89GyEwMjI8Bg1HEgBDDABMGhT9+fTr+vL//PP//f/6//+xta94ZV1OFA5RFxFO + GBFAEwj/9+3j5OLSycz//v7///uJgHdgXW0/CQk0EQBFCgAzDwA+DQA2DAA4DAA1CwAuCwA4CAQpAwEA + AAAAAAAsDgMuCgI0CAE2BgI3CAA3CgA5DABSEgc/DgA+CQDy59/r3Np6i45FPUdUKylZKSiPaGb//vn/ + /f75//77//7///xPNzFlQTdlMiheKyFkMSdgLyFLJx3///v5/vz5+/z//v//+PhdhYo/CRBLCgE8DABH + CwA8DgA5DAE6DAE2DAAzCwAuBgEbAAAAAAAAAAA2HBYmAgA1BQE7BwE6CQA6CgA8DQBFDgE5DgBOEAU5 + HRL//PtVUluQkZtIY2A+PTlhSEZuQkGBVVv/+////v3//PV8VE90RT1yRjl0Rjt5SD59TD6ATEX//Pb3 + //36/////v///P85XF8xHyZZDgxDDABFCwA6DQA9DAI6DAE4CwA2CwIuCQUAAAAAAAAAAAAAAAArDQg6 + BwQ5AwA7CwA9DQFCDgFDCwBDFAZICABdLyewjYr/7fVpYGp5fIGdmJmWg4CEbWv//Pvv/////vrYxb6M + XVmNWVJ/V0t/Vk2BVk2JWEqJUkuWgHr5/fj4/P39+vz//f9UWVplaG1NBw1OCgA/CgA6DQA+CgM7DAQ4 + CQE1BwAmCAMAAAAAAAAAAAAAAAAAAAA0BAA2AgA8DQA/DgBEDQBIBQBLDgSVX1Sndm6Qc261lpn/9/v/ + /f/3+Pb///z+/vj9//zv5eWVhIGRdHCbbGikdG6bdGuZdGyZc26dcGWfb2mKamXSw8D///79/P7//v+r + mZqKpq15UFVSCgA+CQA9DABBCwQ8CwM4CQE5BgMwGxYAAAAAAAAAAAAAAAAAAAA0BgBBDwM8DQBBDQBH + CwBVEwhGBQC0kIi5joueiIKpiYSmjojItbDm29fq5eLo39y0n524iIesioqqh4S1ioexh4KviYSuiYWu + iIazi4ashoGuiIaggYD/+vf////7/f3u2Np1mKKdjZRJCwBODQVDCwBDCwY8CgQ6CAI6CAIAAAAAAAAA + AAAAAAAAAAAAAAAaAQA0BQE9CgBACgBKCQBCCgCQZVy+pJ69opjCope9oZq5oZu9oJu9oJu9oJu9oJu9 + oJu9oJu9oJu9oJu9oJu9oJu9oJu9oJu9oJu5oZu9oJu+oJu+pJ66qKH///j///j/9PyipKWYuLc/Ih5U + DwVTDgRDDwBFCwBACwggBgEAAAAAAAAAAAAAAAAAAAAAAAAAAAA4Dww8AQBHDAJGDwJHCgDTqaLItbDJ + tKzQs6rLs63Hs67Ls63Ls63Ls63Ls63Ls63Ls63Ls63Ls63Ls63Ls63Ls63Ls63Ls63HtK3Ns63Ns63J + savCsKn/+/L///f//f7h1dWksbNpZ2Y8BwBEDAE+BwBDDQI8Eg0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABODglEBwA+DQBLBwDdt7LNwr7VxMHcw7/XxMHTxMLXxL/XxL/XxL/XxL/XxL/XxL/XxL/XxL/X + xL/XxL/XxL/XxL/XxL/Txb/YxL/axL/VwbzRvrnOxL3d1c799e7//fvt4+mRoaAvDgU8CAFKEQg9CgAu + FQ8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAABABQBEEABLBACJY17h29bl2dns19nq2Nnj2dno + 2dbo2dbo2dbo2dbo2dbo2dbo2dbo2dbo2dbo2dbo2dbo2dbo2dbl2tbm2tbq2dbo19To2dbj19Pg1dHm + 3dTr2NPd0dc8ODcxAQA/CgA+CwEsAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6CgQ7 + AwBNCAU6EAvs4tvq3t7v4OT05urt5ebr4t/r4t/r4t/r4t/r4t/r4t/r4t/r4t/r4t/r4t/r4t/r4t/r + 4t/p4t/r4t/u4d/u4d/u4d/t4d/t4d/x3tv27enk3N1JEhVJBgBBBwA0CgUAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkDgpGCwFLEAawgX3/6+7y6O758PP67O317e717e717e717e71 + 7e717e717e717e717e717e717e717e717e717e7z7e7z7e7z7e7z7e7z7e7z7e705eP///R+VUxKCwND + BQAvCgsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AQBJCQAzAACx + kpX/+v//9vn/9fP88/b88/b88/b88/b88/b88/b88/b88/b88/b88/b88/b88/b88/b88/b88/b59Pb5 + 9Pb59Pb59Pb59Pb+9fF3TD1HAgA1CgAwCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAiAwBJCABLDQNrPDT//Pn7/f739vj/+/3/9/r/9vn/+vz4/P399fb/+Pn9 + 9fb/+fr+9vf99fb/+Pn79Pf/+Pv79vj++fv9+Pr79Pf/+PtaLBtTEAdGBwAhAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEHRZBCwRBDQY3CgdoQT// + +vj/+/v///7//v/9///7/v/9/v/8/f/9/v/6+//8/f/8/f/7/P/9/P79///+//3++/f//vtLLCkuBwVN + DwdECwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAzBgBHBgBRDAMwCgVgRD3g0Mr///7//P789/n//f///P///f///P///f///f// + /f///fz//Pm+qqU8IBk3EAg/CgBKDwZDEAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9Dwg/DgZEDwVHDwRB + CwA9DABCDQNDDgRLFgxJFApFEAZBDAI/CgBFDQJHCQFGCgQ+BwI5DQYAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAArGRAwDwZDDgRFDQJCCwBGDwJDDABGDwJDDABDDABEDQBCCwBDCgFADwUpCgEd + CQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqCgU0DAcxCQQ1 + DQgzCwYyCgUvBwIvBwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///AP//8AAP//gAH//wAA//wAAH//AAD/8AAAD/8AAP/gAAAH/wAA/4AAAAH/ + AAD/AAAAAP8AAP4AAAAAfwAA/AAAAAA/AAD4AAAAAB8AAPgAAAAAHwAA8AAAAAAPAADgAAAAAAcAAOAA + AAAABwAA4AAAAAAHAADAAAAAAAMAAIAAAAAAAwAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAA + AAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAwAAwAAAAAADAADgAAAAAAMAAOAAAAAABwAA4AAAAAAH + AADwAAAAAA8AAPgAAAAADwAA+AAAAAAfAAD8AAAAAD8AAP4AAAAAfwAA/wAAAAD/AAD/gAAAAf8AAP/A + AAAH/wAA//AAAA//AAD//gAAf/8AAP//AAD//wAA///wD///AAA= \ No newline at end of file diff --git a/MDserver/Form_MDserver.Designer.cs b/MDserver/Form_MDserver.Designer.cs index 26b117b..2d7e450 100644 --- a/MDserver/Form_MDserver.Designer.cs +++ b/MDserver/Form_MDserver.Designer.cs @@ -103,6 +103,7 @@ private void InitializeComponent() this.ToolStripMenuItem_exit = new System.Windows.Forms.ToolStripMenuItem(); this.radioButton_Apache = new System.Windows.Forms.RadioButton(); this.groupBox_webserver = new System.Windows.Forms.GroupBox(); + this.button_host = new System.Windows.Forms.Button(); this.statusStrip_main.SuspendLayout(); this.groupBox_manage.SuspendLayout(); this.groupBox_sql.SuspendLayout(); @@ -481,12 +482,13 @@ private void InitializeComponent() this.button_mod_host.Name = "button_mod_host"; this.button_mod_host.Size = new System.Drawing.Size(66, 23); this.button_mod_host.TabIndex = 5; - this.button_mod_host.Text = "HOST文件"; + this.button_mod_host.Text = "WEB管理"; this.button_mod_host.UseVisualStyleBackColor = true; this.button_mod_host.Click += new System.EventHandler(this.button_mod_host_Click); // // groupBox_usually // + this.groupBox_usually.Controls.Add(this.button_host); this.groupBox_usually.Controls.Add(this.button_OP_lweb); this.groupBox_usually.Controls.Add(this.button_author); this.groupBox_usually.Controls.Add(this.button_mod_host); @@ -501,7 +503,7 @@ private void InitializeComponent() // this.button_OP_lweb.FlatStyle = System.Windows.Forms.FlatStyle.Popup; this.button_OP_lweb.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); - this.button_OP_lweb.Location = new System.Drawing.Point(12, 75); + this.button_OP_lweb.Location = new System.Drawing.Point(12, 100); this.button_OP_lweb.Name = "button_OP_lweb"; this.button_OP_lweb.Size = new System.Drawing.Size(66, 22); this.button_OP_lweb.TabIndex = 8; @@ -512,7 +514,7 @@ private void InitializeComponent() // button_author // this.button_author.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.button_author.Location = new System.Drawing.Point(12, 46); + this.button_author.Location = new System.Drawing.Point(12, 71); this.button_author.Name = "button_author"; this.button_author.Size = new System.Drawing.Size(66, 22); this.button_author.TabIndex = 7; @@ -808,6 +810,23 @@ private void InitializeComponent() this.groupBox_webserver.TabStop = false; this.groupBox_webserver.Text = "WebServer"; // + // button_host + // + this.button_host.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; + this.button_host.FlatAppearance.BorderColor = System.Drawing.Color.White; + this.button_host.FlatAppearance.BorderSize = 0; + this.button_host.FlatAppearance.MouseDownBackColor = System.Drawing.Color.White; + this.button_host.FlatAppearance.MouseOverBackColor = System.Drawing.Color.White; + this.button_host.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.button_host.ForeColor = System.Drawing.SystemColors.ActiveCaptionText; + this.button_host.Location = new System.Drawing.Point(12, 46); + this.button_host.Name = "button_host"; + this.button_host.Size = new System.Drawing.Size(66, 23); + this.button_host.TabIndex = 9; + this.button_host.Text = "HOST查看"; + this.button_host.UseVisualStyleBackColor = true; + this.button_host.Click += new System.EventHandler(this.button_host_Click); + // // MDserv // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); @@ -878,7 +897,7 @@ private void InitializeComponent() private System.Windows.Forms.GroupBox groupBox_usually; private System.Windows.Forms.ListBox listBox_listen; private System.Windows.Forms.GroupBox groupBox_status; - private System.Windows.Forms.Button button_start; + public System.Windows.Forms.Button button_start; private System.Windows.Forms.Button button_regedit; private System.ServiceProcess.ServiceController serviceController_main; private System.Windows.Forms.Button button_author; @@ -928,6 +947,7 @@ private void InitializeComponent() private System.Windows.Forms.MenuItem menuItem_php_list_0; private System.Windows.Forms.RadioButton radioButton_Apache; private System.Windows.Forms.GroupBox groupBox_webserver; + private System.Windows.Forms.Button button_host; } } diff --git a/MDserver/Form_MDserver.cs b/MDserver/Form_MDserver.cs index 4008ded..6720879 100644 --- a/MDserver/Form_MDserver.cs +++ b/MDserver/Form_MDserver.cs @@ -22,14 +22,14 @@ //self class using MDserver; - - +using System.Xml; +using System.Text.RegularExpressions; namespace MDserver { public partial class MDserv : Form { - //private static string version = "1.1.5"; + //private static string version = "2.0.0"; //PID 进程显示时钟 private System.Timers.Timer timer = new System.Timers.Timer(3000); @@ -68,26 +68,30 @@ public static extern IntPtr CreateService(IntPtr SC_HANDLE, string lpSvcName, st private static string MD_MongoDB = "MDserver-MongoDB"; //默认php版本 - private static string PHP_VERSION = "php5.5"; + private static string PHP_VERSION = "php55"; + + private static string HOSTS_NOTES = "#MDserver Hosts Don`t Remove and Change"; private SystemINI ini; + private SystemXml iniXml; public MDserv() { InitializeComponent(); this.ini = new SystemINI(BaseDir + "md.ini"); + this.iniXml = new SystemXml(BaseDir + "host.xml"); //拦截标题栏的关闭事件 this.Closing += new CancelEventHandler(MDserv_Closing); //延迟执行 - System.Timers.Timer timers = new System.Timers.Timer(500); + System.Timers.Timer timers = new System.Timers.Timer(200); timers.Elapsed += new System.Timers.ElapsedEventHandler(_MDserv_start); timers.Enabled = true; timers.AutoReset = false; Control.CheckForIllegalCrossThreadCalls = false; - + addPHPMenulist(); } @@ -181,16 +185,19 @@ private void _MDserv_start(object sender, System.Timers.ElapsedEventArgs e) { //检查原有的服务 string[] service = { MD_ApacheName, MD_MySQL, MD_Redis }; - System.Timers.Timer timer = new System.Timers.Timer(3000); + System.Timers.Timer timer = new System.Timers.Timer(1000); foreach (string s in service) { if (WServiceIsExisted(s) && !WQueryServiceIsStart(s)) { - button_start.Enabled = false; + if (!WQueryServiceIsStart(s)) { + if (s == MD_ApacheName) { + button_start.Enabled = false; + radioButton_Apache.Checked = true; WStart(MD_ApacheName); @@ -205,8 +212,9 @@ private void _MDserv_start(object sender, System.Timers.ElapsedEventArgs e) timer.Elapsed += new System.Timers.ElapsedEventHandler(_start_mysql_lazy); timer.Enabled = true; timer.AutoReset = false; - } + } } + } //线程检查 @@ -238,7 +246,8 @@ private void _check_status(object sender, System.Timers.ElapsedEventArgs e) } //MD_MySQL - if (WQueryServiceIsStart(MD_MySQL)) { + if (WQueryServiceIsStart(MD_MySQL)) + { checkBox_MySQL.Checked = true; } @@ -270,7 +279,8 @@ private void _check_ws_status() } //添加PHP列表 - private void addPHPMenulist() { + private void addPHPMenulist() + { //查看PHP版本 string php_list = BaseDir.Replace("/", "\\") + @"bin\PHP"; //当前默认php版本 @@ -286,7 +296,8 @@ private void addPHPMenulist() { _pversion.Index = 1; _pversion.Click += new System.EventHandler(this.php_list_click); - if(_pvn.Equals(php_cver)){ + if (_pvn.Equals(php_cver)) + { _pversion.Checked = true; } @@ -297,11 +308,32 @@ private void addPHPMenulist() { } } - private void php_list_click(object sender, EventArgs e){ - foreach (MenuItem i in this.menuItem_php_list.MenuItems) { + //重新启动 + public void restart() + { + + bool ret = WStop_S(MD_ApacheName); + if (ret) + { + _stop_apache(); + + after_stop_SERVICE(); + + Thread.Sleep(3000); + + _clear_record(); + pre_start_SERVICE(); + _start_Apache(); + } + } + + private void php_list_click(object sender, EventArgs e) + { + foreach (MenuItem i in this.menuItem_php_list.MenuItems) + { i.Checked = false; } - + MenuItem pitem = (MenuItem)sender; pitem.Checked = true; @@ -322,7 +354,7 @@ private void php_list_click(object sender, EventArgs e){ } after_stop_SERVICE(); this.ini.WriteString("MDSERVER", "PHP_DIR", pitem.Text); - + Thread.Sleep(3000); //this.PHPCurlFixAndPath(pitem.Text); @@ -330,18 +362,19 @@ private void php_list_click(object sender, EventArgs e){ pre_start_SERVICE(); _start_Apache(); } - else + else { - this.after_stop_SERVICE(); + this.after_stop_SERVICE(); } } - else + else { this.ini.WriteString("MDSERVER", "PHP_DIR", pitem.Text); } } - private void PHPCurlFixAndPath(string s) { + private void PHPCurlFixAndPath(string s) + { string php_list = BaseDir.Replace("/", "\\") + @"bin\PHP"; @@ -354,9 +387,12 @@ private void PHPCurlFixAndPath(string s) { ArrayList new_list = new ArrayList(); foreach (string i in list) { - if(i == php_pos_s){ + if (i == php_pos_s) + { continue; - } else if(i==php_pos_m){ + } + else if (i == php_pos_m) + { continue; } new_list.Add(i); @@ -364,10 +400,11 @@ private void PHPCurlFixAndPath(string s) { } string t = ""; - foreach (string i2 in new_list) { - t += i2 +";"; + foreach (string i2 in new_list) + { + t += i2 + ";"; } - + //设置Path System.Environment.SetEnvironmentVariable("PATH", t + php_pos_m + ";"); @@ -415,7 +452,8 @@ private void MDserv_Load(object sender, EventArgs e) Wstatus("欢迎使用MDsever(PHP开发环境)..."); listBox_listen_init(); - if (checkedIsHasSelfRun()) { + if (checkedIsHasSelfRun()) + { MessageBox.Show("已经在运行了!!!"); Application.Exit(); } @@ -426,7 +464,8 @@ private void MDserv_Load(object sender, EventArgs e) } //检查是自己已经运行了 - private bool checkedIsHasSelfRun() { + private bool checkedIsHasSelfRun() + { string cmdtext = "tasklist | findstr MDserver.exe"; Process Tcmd = new Process(); Tcmd.StartInfo.FileName = "cmd.exe";//设定程序名 @@ -473,7 +512,7 @@ private void menuItem_a_conf_Click(object sender, EventArgs e) { string apache_dir = this.ini.ReadString(@"MDSERVER", @"APACHE_DIR", @"Apache24"); string vim = BaseDir + @"tool\Vim\vim73\gvim.exe"; - string httpd_conf = BaseDir + @"bin\"+ apache_dir + @"\conf\httpd.conf"; + string httpd_conf = BaseDir + @"bin\" + apache_dir + @"\conf\httpd.conf"; Wcmd_Exe(vim, httpd_conf); } @@ -482,7 +521,7 @@ private void menuItem_a_log_Click(object sender, EventArgs e) { string apache_dir = this.ini.ReadString(@"MDSERVER", @"APACHE_DIR", @"Apache24"); string vim = BaseDir + @"tool\Vim\vim73\gvim.exe"; - string httpd_log = BaseDir + @"bin\"+ apache_dir + @"\logs\access.log"; + string httpd_log = BaseDir + @"bin\" + apache_dir + @"\logs\access.log"; Wcmd_Exe(vim, httpd_log); } @@ -491,7 +530,7 @@ private void menuItem_a_error_Click(object sender, EventArgs e) { string apache_dir = this.ini.ReadString(@"MDSERVER", @"APACHE_DIR", @"Apache24"); string vim = BaseDir + @"tool\Vim\vim73\gvim.exe"; - string httpd_log = BaseDir + @"bin\" + apache_dir + @"\logs\error.log"; + string httpd_log = BaseDir + @"bin\" + apache_dir + @"\logs\error.log"; Wcmd_Exe(vim, httpd_log); } @@ -519,7 +558,7 @@ private void menuItem_php_conf_Click(object sender, EventArgs e) string php_dir = this.ini.ReadString(@"MDSERVER", @"PHP_DIR", PHP_VERSION); string vim = BaseDir + @"tool\Vim\vim73\gvim.exe"; - string php = BaseDir + @"bin\PHP\"+ php_dir + @"\php.ini"; + string php = BaseDir + @"bin\PHP\" + php_dir + @"\php.ini"; Wcmd_Exe(vim, php); } @@ -528,8 +567,8 @@ private void menuItem_PHPext_Click(object sender, EventArgs e) { string dir_E = "explorer.exe"; string php_dir = this.ini.ReadString(@"MDSERVER", @"PHP_DIR", PHP_VERSION); - string dir = BaseDir.Replace("/", "\\")+ @"bin\PHP\" + php_dir + @"\ext"; - Wcmd_Exe(dir_E, dir); + string dir = BaseDir.Replace("/", "\\") + @"bin\PHP\" + php_dir + @"\ext"; + Wcmd_Exe(dir_E, dir); } //www/htdocs @@ -553,7 +592,7 @@ private void menuItem_scan_cgi_bin_Click(object sender, EventArgs e) //帮助信息 private void menuItem_help_Click(object sender, EventArgs e) { - System.Diagnostics.Process.Start("http://midoks.duapp.com/p/mdserver.html"); + System.Diagnostics.Process.Start("http://midoks.cachecha.com/2014/09/30/mdserver.html"); } @@ -585,6 +624,14 @@ private void menuItem_alipay_Click(object sender, EventArgs e) */ //修改host private void button_mod_host_Click(object sender, EventArgs e) + { + + WebSite ws = new WebSite(); + ws.mainUI = this; + ws.ShowDialog(); + } + + private void button_host_Click(object sender, EventArgs e) { string vim = BaseDir + @"tool\Vim\vim73\gvim.exe"; string path = @"C:\Windows\System32\drivers\etc\hosts"; @@ -598,9 +645,9 @@ private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) if (timer.Enabled) { ArrayList str = new ArrayList(); - string[] nn = { + string[] nn = { "MDserver", "memcached","mongod", - "redis","mysql","php", "httpd" + "redis","mysql","php", "httpd" }; foreach (string i in nn) { @@ -659,10 +706,12 @@ private ArrayList listen_process_name(string name) private void checkBox_MySQL_CheckedChanged(object sender, EventArgs e) { + System.Timers.Timer timer = new System.Timers.Timer(1000); timer.Elapsed += new System.Timers.ElapsedEventHandler(_mysql_status); timer.Enabled = true; timer.AutoReset = false; + } private void _mysql_status(object sender, System.Timers.ElapsedEventArgs e) @@ -675,9 +724,14 @@ private void _mysql_status(object sender, System.Timers.ElapsedEventArgs e) { if (checkBox_MySQL.Checked) { + pre_start_mysql(); _start_mysql(); - } else { + } + else + { + Wstatus("MySQL: 停止中..."); _stop_mysql(); + after_stop_msyql(); } } catch (Exception ex) @@ -761,7 +815,8 @@ private void _MongoDB_status(object sender, System.Timers.ElapsedEventArgs e) else { bool ret = WStop_S(MD_MongoDB); - if(ret){ + if (ret) + { Wcmd_Exe(mdir_Exe, @" --logpath " + mdir + @"log\log.txt --dbpath " + mdir + @"data --serviceName " + MD_MongoDB + " --remove"); } } @@ -801,7 +856,8 @@ private void _Redis_status(object sender, System.Timers.ElapsedEventArgs e) else { bool ret = WStop_S(MD_Redis); - if(ret){ + if (ret) + { Wcmd_Exe(mdir_Exe, " --service-uninstall " + mdir + @"redis.conf --service-name " + MD_Redis); } } @@ -842,14 +898,88 @@ private void button_listen_Click(object sender, EventArgs e) //启动服务之前的初始化配置 private void pre_start_SERVICE() { + + string php_dir = this.ini.ReadString(@"MDSERVER", @"PHP_DIR", PHP_VERSION); string php_dir_pos = BaseDir + "bin/PHP/" + php_dir; string apache_dir = this.ini.ReadString(@"MDSERVER", @"APACHE_DIR", @"Apache24"); - //httpd.conf,my.ini,php.ini替换 - string[] conf = { + //make apache vhost conf + XmlNode hostXml = this.iniXml.rootNode(); + string tplFile = (BaseDir.Replace("/", "\\") + @"bin\" + apache_dir + @"\conf\vhost\host.tpl"); + //修改hosts + string hosts = @"C:\Windows\System32\drivers\etc\HOSTS"; + + if (System.IO.File.Exists(tplFile)) + { + string hostsContent = _ReadContent(hosts); + hostsContent = hostsContent.Trim(); + + string vhostDir = (BaseDir.Replace("/", "\\") + @"bin\" + apache_dir + @"\conf\vhost\"); + if (hostXml.HasChildNodes) + { + ArrayList portList = new ArrayList(); + + foreach (XmlNode host in hostXml) + { + string hostname = host.Attributes["name"].Value; + + string port = host.Attributes["port"].Value; + string root_dir = host.Attributes["root_dir"].Value; + + string c = _ReadContent(tplFile); + + c = c.Replace("{HOSTNAME}", hostname.Trim()); + c = c.Replace("{ROOTDIR}", root_dir.Trim()); + c = c.Replace("{PORT}", port.Trim()); + + if (System.IO.File.Exists(vhostDir + "own_" + hostname.Trim().Replace(".", "_") + ".conf")) + { + continue; + } + + //写入vhost + _WriteContent(vhostDir + "tmp_" + hostname.Trim().Replace(".", "_") + ".conf", c); + + //host组装 + hostsContent += "\r\n127.0.0.1\t\t" + hostname + "\t" + HOSTS_NOTES; + + //log(port); + //监听端口组装 + if (port.Equals("80") || port.Equals("8080")) + { + + } + else + { + if (portList.IndexOf(port) == -1) + { + portList.Add(port); + } + } + } + + string portContent = ""; + foreach (string portv in portList) + { + portContent += "Listen " + portv + "\r\n"; + } + + _WriteContent(vhostDir + "tmp_listen.conf", portContent); + } + else + { + _WriteContent(vhostDir + "tmp_listen.conf", ""); + } + + _WriteContent(hosts, hostsContent); + //log(hostsContent); + } + + + //httpd.conf,php.ini替换 + string[] conf = { @"bin/"+ apache_dir + @"/conf/httpd.conf", - @"bin/MySQL/my.ini", @"bin/PHP/"+ php_dir + @"/php.ini"}; //apache2_4.dll 找到 @@ -875,7 +1005,7 @@ private void pre_start_SERVICE() } //conf替换 - string[] conf_v_list = { + string[] conf_v_list = { BaseDir.Replace("/", "\\") + @"bin\" + apache_dir + @"\conf\vhost", BaseDir.Replace("/", "\\") + @"bin\" + apache_dir + @"\conf\alias" }; @@ -894,26 +1024,75 @@ private void pre_start_SERVICE() } } + private void pre_start_mysql() + { + string[] conf = { @"bin/MySQL/my.ini" }; + foreach (string i in conf) + { + string r = _ReadContent(BaseDir + i); + r = r.Replace("MD:/", BaseDir); + _WriteContent(BaseDir + i, r, System.Text.Encoding.ASCII); + } + } + + private void after_stop_msyql() + { + string[] conf = { @"bin/MySQL/my.ini" }; + + foreach (string i in conf) + { + string r = _ReadContent(BaseDir + i); + r = r.Replace(BaseDir, "MD:/"); + _WriteContent(BaseDir + i, r, System.Text.Encoding.ASCII); + } + } + //停止后配置恢复原状 private void after_stop_SERVICE() { - + string php_dir = this.ini.ReadString(@"MDSERVER", @"PHP_DIR", PHP_VERSION); string php_dir_pos = BaseDir + "bin/PHP/" + php_dir; string apache_dir = this.ini.ReadString(@"MDSERVER", @"APACHE_DIR", @"Apache24"); + + //删除自动生成的配置(apache vhost conf ) + string vhostDir = (BaseDir.Replace("/", "\\") + @"bin\" + apache_dir + @"\conf\vhost\"); + var tmpVhost = Directory.GetFiles(vhostDir, "tmp_*.conf"); + foreach (var tV in tmpVhost) + { + System.IO.File.Delete(tV); + } + + //删除APACHE的日志 + string apacheLogPath = (BaseDir.Replace("/", "\\") + @"bin\" + apache_dir + @"\logs\"); + var apacheLogPathFiles = Directory.GetFiles(apacheLogPath, "tmp_*.log"); + foreach (var logFile in apacheLogPathFiles) + { + System.IO.File.Delete(logFile); + } + + //删除HOSTS + string hosts = @"C:\Windows\System32\drivers\etc\HOSTS"; + string hostsContent = _ReadContent(hosts); + + Regex reg = new Regex("(.*)" + HOSTS_NOTES); + hostsContent = reg.Replace(hostsContent, ""); + hostsContent = hostsContent.Trim(); + _WriteContent(hosts, hostsContent); + //log(hostsContent); + + //apache2_4.dll 找到 string[] php_apache_dll_list = Directory.GetFiles(php_dir_pos, "*apache2_4.dll"); string php_apache_dll = System.IO.Path.GetFileName(php_apache_dll_list[0]); - - //httpd.conf,my.ini,php.ini替换 - string[] conf = { + + //httpd.conf,php.ini替换 + string[] conf = { @"bin/" + apache_dir + "/conf/httpd.conf", - @"bin/MySQL/my.ini", @"bin/PHP/"+ php_dir +@"/php.ini"}; - foreach (string i in conf) { string r = _ReadContent(BaseDir + i); @@ -928,7 +1107,7 @@ private void after_stop_SERVICE() } //conf替换 - string[] conf_v_list = { + string[] conf_v_list = { BaseDir.Replace("/", "\\") + @"bin\" + apache_dir + @"\conf\vhost", BaseDir.Replace("/", "\\") + @"bin\" + apache_dir + @"\conf\alias" }; @@ -952,7 +1131,7 @@ private void _clear_record() { string apache_dir = this.ini.ReadString(@"MDSERVER", @"APACHE_DIR", @"Apache24"); - string[] file = { + string[] file = { BaseDir + @"bin\"+ apache_dir + @"\logs\access.log", BaseDir + @"bin\" + apache_dir + @"\logs\error.log", }; @@ -961,12 +1140,7 @@ private void _clear_record() { _clear_file_log(f); } - //__Delete(BaseDir + @"bin\Nginx\myapp.err.log"); - //__Delete(BaseDir + @"bin\Nginx\myapp.err.log.old"); - //__Delete(BaseDir + @"bin\Nginx\myapp.out.log"); - //__Delete(BaseDir + @"bin\Nginx\myapp.out.log.old"); - //__Delete(BaseDir + @"bin\Nginx\myapp.wrapper.log"); - //__Delete(BaseDir + @"bin\Nginx\myapp.xml"); + } //清楚文件 @@ -1014,8 +1188,9 @@ private void _start_Apache() string arg = "-k install -n " + MD_ApacheName; log(apache + " " + arg); Wcmd(apache + " " + arg); + Thread.Sleep(3000); - + //延迟执行 System.Timers.Timer timer = new System.Timers.Timer(1500); timer.Elapsed += new System.Timers.ElapsedEventHandler(_start_Apache_lazy); @@ -1026,6 +1201,8 @@ private void _start_Apache() private void _start_Apache_lazy(object sender, System.Timers.ElapsedEventArgs e) { WStart_S(MD_ApacheName); + //不可以点击启动按钮 + button_start.Enabled = false; } //MySQL @@ -1058,18 +1235,17 @@ private void button_stop_Click(object sender, EventArgs e) _stop_apache(); after_stop_SERVICE(); - this.button_start.Enabled = true; this.ini.WriteInteger("MDSERVER", "MD_RUN", 0); this.ini.WriteString("MDSERVER", "RUN_DIR", ""); } - + //停止卸载Apache private void _stop_apache() { if (WServiceIsExisted(MD_ApacheName)) - { + { //延迟执行 System.Timers.Timer timer = new System.Timers.Timer(1000); timer.Elapsed += new System.Timers.ElapsedEventHandler(_stop_apache_lazy); @@ -1079,6 +1255,8 @@ private void _stop_apache() else { Wstatus(MD_ApacheName + "已经停止!"); + //可以点击启动按钮 + button_start.Enabled = true; } } @@ -1093,6 +1271,8 @@ private void _stop_apache_lazy(object sender, System.Timers.ElapsedEventArgs e) string arg = "-k uninstall -n " + MD_ApacheName; Wcmd(apache + " " + arg); } + //可以点击启动按钮 + button_start.Enabled = true; } //停止mysql @@ -1103,7 +1283,7 @@ private void _stop_mysql() { //string installName = dir + @"bin\mysqld " + "remove " + MD_MySQL; //Wcmd(installName); - + //延迟执行 System.Timers.Timer timer = new System.Timers.Timer(500); timer.Elapsed += new System.Timers.ElapsedEventHandler(_stop_mysql_lazy); @@ -1119,8 +1299,12 @@ private void _stop_mysql_lazy(object sender, System.Timers.ElapsedEventArgs e) { WUninstall(MD_MySQL); } + else + { + Wstatus("MySQL: 停止失败!"); + } } - + /** * 小工具配置 @@ -1140,14 +1324,21 @@ private void button_author_Click(object sender, EventArgs e) //打开数据管理地址 private void button_MySQL_Click(object sender, EventArgs e) { - if (WQueryServiceIsStart(MD_ApacheName)) + if (checkHttp()) { System.Diagnostics.Process.Start("http://127.0.0.1/phpMyAdmin"); } - else + } + + public Boolean checkHttp() + { + bool isRun = !button_start.Enabled; + if (!isRun) { - MessageBox.Show("尚未开启服务!!!"); + MessageBox.Show("HTTP服务没有启动!!!"); + return false; } + return true; } /// @@ -1157,7 +1348,11 @@ private void button_MySQL_Click(object sender, EventArgs e) /// private void button_memcached_admin_Click(object sender, EventArgs e) { - System.Diagnostics.Process.Start("http://127.0.0.1/memadmin"); + if (checkHttp()) + { + System.Diagnostics.Process.Start("http://127.0.0.1/memadmin"); + } + } /// @@ -1167,7 +1362,11 @@ private void button_memcached_admin_Click(object sender, EventArgs e) /// private void button_redis_admin_Click(object sender, EventArgs e) { - System.Diagnostics.Process.Start("http://127.0.0.1/phpRedisAdmin"); + if (checkHttp()) + { + System.Diagnostics.Process.Start("http://127.0.0.1/phpRedisAdmin"); + } + } /// @@ -1177,7 +1376,10 @@ private void button_redis_admin_Click(object sender, EventArgs e) /// private void button_mongo_admin_Click(object sender, EventArgs e) { - System.Diagnostics.Process.Start("http://127.0.0.1/phpMongodb"); + if (checkHttp()) + { + System.Diagnostics.Process.Start("http://127.0.0.1/phpMongodb"); + } } @@ -1257,7 +1459,7 @@ private void button_VIM_Click(object sender, EventArgs e) private void button_WinCacheGrind_Click(object sender, EventArgs e) { //MessageBox.Show(BaseDir.Replace("/", "\\") + @"tool\WinCacheGrind\WinCacheGrind.exe"); - System.Diagnostics.Process.Start(BaseDir.Replace("/","\\") + @"tool\kcachegrind\kcachegrind.exe"); + System.Diagnostics.Process.Start(BaseDir.Replace("/", "\\") + @"tool\kcachegrind\kcachegrind.exe"); //string dir_E = "explorer.exe"; //string dir = BaseDir + @"tool/kcachegrind/kcachegrind"; //Wcmd_Exe(dir_E, dir.Replace("/", "\\")); @@ -1288,7 +1490,7 @@ private bool runWhenStartExist(string exeName) { bool ok = false; RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);//打开注册表子项 - + if (key == null) { } else if (exeName != "") { @@ -1615,7 +1817,9 @@ private bool WStart_S(string serviceName) { Wstatus(serviceName + "启动成功!!!"); return true; - } if (i == 19) { + } + if (i == 19) + { Wstatus(serviceName + "启动失败!!!"); } service.Refresh(); @@ -1651,7 +1855,9 @@ private bool WStop_S(string serviceName) { Wstatus(serviceName + "停止成功!!!"); return true; - } if (i == 19) { + } + if (i == 19) + { Wstatus(serviceName + "停止失败!!!"); } service.Refresh(); @@ -1713,10 +1919,24 @@ private void WsetDesc(string serviceName, string DescInfo) } //写入内容 - private bool _WriteContent(string path, string content) + public bool _WriteContent(string path, string content) + { + bool ok = false; + System.IO.StreamWriter sw = new System.IO.StreamWriter(path, false, System.Text.Encoding.UTF8); //System.Text.Encoding.UTF8 + try + { + sw.Write(content); + ok = true; + sw.Close(); + } + catch { } + return ok; + } + + public bool _WriteContent(string path, string content, Encoding code) { bool ok = false; - System.IO.StreamWriter sw = new System.IO.StreamWriter(path, false, System.Text.Encoding.Default); + System.IO.StreamWriter sw = new System.IO.StreamWriter(path, false, code); try { sw.Write(content); @@ -1727,6 +1947,8 @@ private bool _WriteContent(string path, string content) return ok; } + + //读取内容 private string _ReadContent(string path) { @@ -1792,13 +2014,13 @@ private void button_FSCapture_Click(object sender, EventArgs e) } private void menuItem_apache_Click(object sender, EventArgs e) - {} + { } private void groupBox_tool_Enter(object sender, EventArgs e) { } - + } } \ No newline at end of file diff --git a/MDserver/MDserver.csproj b/MDserver/MDserver.csproj index 77b71e9..349f823 100644 --- a/MDserver/MDserver.csproj +++ b/MDserver/MDserver.csproj @@ -1,4 +1,4 @@ - + Debug @@ -66,6 +66,13 @@ + + + Form + + + WebSite.cs + Designer AboutForm.cs @@ -84,6 +91,9 @@ Resources.resx True + + WebSite.cs + SettingsSingleFileGenerator Settings.Designer.cs @@ -109,6 +119,12 @@ + + + + + + + @@ -68,9 +69,10 @@ - + + @@ -85,9 +87,10 @@ - + + @@ -114,4 +117,11 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\docs.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\goto.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/MDserver/Resources/docs.png b/MDserver/Resources/docs.png new file mode 100644 index 0000000..4f946b6 Binary files /dev/null and b/MDserver/Resources/docs.png differ diff --git a/MDserver/Resources/goto.png b/MDserver/Resources/goto.png new file mode 100644 index 0000000..d85f663 Binary files /dev/null and b/MDserver/Resources/goto.png differ diff --git a/MDserver/Resources/host_info.png b/MDserver/Resources/host_info.png new file mode 100644 index 0000000..31659ac Binary files /dev/null and b/MDserver/Resources/host_info.png differ diff --git a/MDserver/SystemINI.cs b/MDserver/SystemINI.cs index 360bbfd..cbb1cc3 100644 --- a/MDserver/SystemINI.cs +++ b/MDserver/SystemINI.cs @@ -35,8 +35,8 @@ public SystemINI(string AFileName) sw.Write("#MDserverļ,벻޸\r\n"); sw.Write("[MDSERVER]\r\n"); sw.Write("#PHP汾,PHP汾,ƵbinĿдļ\r\n"); - sw.Write("#PHP5.4\r\n"); - sw.Write("PHP_DIR=php5.5\r\n"); + sw.Write("#php55\r\n"); + sw.Write("PHP_DIR=php55\r\n"); sw.Write("#apacheĿ¼ַ\r\n"); sw.Write("APACHE_DIR=Apache24\r\n"); sw.Close(); diff --git a/MDserver/SystemXml.cs b/MDserver/SystemXml.cs new file mode 100644 index 0000000..e501470 --- /dev/null +++ b/MDserver/SystemXml.cs @@ -0,0 +1,114 @@ +using System; +using System.IO; +using System.Xml; + +namespace MDserver +{ + class SystemXml + { + public string filename; + + public SystemXml(string AFileName) + { + filename = AFileName; + + if (!File.Exists(AFileName)) + { + var xmldoc = new XmlDocument(); + var xmldecl = xmldoc.CreateXmlDeclaration("1.0", "gb2312", null); + xmldoc.AppendChild(xmldecl); + + var xmlelem = xmldoc.CreateElement("", "root", ""); + xmldoc.AppendChild(xmlelem); + + xmldoc.Save(AFileName); + } + } + + public XmlNode rootNode() + { + XmlDocument xmldoc = new XmlDocument(); + xmldoc.Load(filename); + XmlNode root = xmldoc.SelectSingleNode("root"); + return root; + } + + public XmlNode selectedNode(int index) + { + XmlDocument xmldoc = new XmlDocument(); + xmldoc.Load(filename); + + XmlNode root = xmldoc.SelectSingleNode("root"); + XmlNode ch = root.ChildNodes.Item(index); + + xmldoc.Save(filename); + return ch; + } + + + public Boolean updateNode(int index, string key, string value) + { + XmlDocument xmldoc = new XmlDocument(); + xmldoc.Load(filename); + + XmlNode root = xmldoc.SelectSingleNode("root"); + XmlElement ch = (XmlElement)root.ChildNodes.Item(index); + + ch.SetAttribute(key,value); + + xmldoc.Save(filename); + return true; + } + + + public Boolean addNode(string nodeName, string childKey, string childValue) { + XmlDocument xmldoc = new XmlDocument(); + xmldoc.Load(filename); + + XmlElement n = xmldoc.CreateElement("pn"); + n.SetAttribute("name", nodeName); + n.SetAttribute(childKey, childValue); + + XmlNode root = xmldoc.SelectSingleNode("root"); + root.AppendChild(n); + + xmldoc.Save(filename); + return true; + } + + public Boolean removeNode(string nodeName) { + XmlDocument xmldoc = new XmlDocument(); + xmldoc.Load(filename); + + + XmlNode root = xmldoc.SelectSingleNode("root"); + + XmlNode selectedNdoe = root.SelectSingleNode(nodeName); ; + root.ParentNode.RemoveChild(selectedNdoe); + + xmldoc.Save(filename); + return true; + } + + public Boolean removeNode(int index) { + if (index < 0) { + return false; + } + + XmlDocument xmldoc = new XmlDocument(); + xmldoc.Load(filename); + + + XmlNode root = xmldoc.SelectSingleNode("root"); + + XmlNode selectedNdoe = root.ChildNodes.Item(index); + root.RemoveChild(selectedNdoe); + + xmldoc.Save(filename); + + return true; + } + + + } +} diff --git a/MDserver/WebSite.Designer.cs b/MDserver/WebSite.Designer.cs new file mode 100644 index 0000000..2491bf6 --- /dev/null +++ b/MDserver/WebSite.Designer.cs @@ -0,0 +1,308 @@ +namespace MDserver +{ + partial class WebSite + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(WebSite)); + this.domainList = new System.Windows.Forms.DataGridView(); + this.hostname = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.port = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.groupList = new System.Windows.Forms.GroupBox(); + this.buttonDel = new System.Windows.Forms.Button(); + this.buttonAdd = new System.Windows.Forms.Button(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.button_RestartServer = new System.Windows.Forms.Button(); + this.textBox_rootDir = new System.Windows.Forms.TextBox(); + this.buttonSelectDir = new System.Windows.Forms.Button(); + this.buttonRootGo = new System.Windows.Forms.Button(); + this.label3 = new System.Windows.Forms.Label(); + this.buttonInfo = new System.Windows.Forms.Button(); + this.buttonGo = new System.Windows.Forms.Button(); + this.textBox_Port = new System.Windows.Forms.TextBox(); + this.textBox_hostname = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.domainList)).BeginInit(); + this.groupList.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // domainList + // + this.domainList.AllowUserToAddRows = false; + this.domainList.AllowUserToDeleteRows = false; + this.domainList.BackgroundColor = System.Drawing.SystemColors.Control; + this.domainList.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.domainList.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.domainList.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.hostname, + this.port}); + this.domainList.GridColor = System.Drawing.SystemColors.ButtonFace; + this.domainList.Location = new System.Drawing.Point(15, 20); + this.domainList.Name = "domainList"; + this.domainList.ReadOnly = true; + this.domainList.RowTemplate.Height = 23; + this.domainList.Size = new System.Drawing.Size(286, 197); + this.domainList.TabIndex = 0; + this.domainList.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.domainList_CellContentClick); + // + // hostname + // + this.hostname.HeaderText = "hostname"; + this.hostname.Name = "hostname"; + this.hostname.ReadOnly = true; + this.hostname.Resizable = System.Windows.Forms.DataGridViewTriState.False; + // + // port + // + this.port.HeaderText = "port"; + this.port.MaxInputLength = 10; + this.port.Name = "port"; + this.port.ReadOnly = true; + this.port.Resizable = System.Windows.Forms.DataGridViewTriState.False; + this.port.Width = 80; + // + // groupList + // + this.groupList.Controls.Add(this.buttonDel); + this.groupList.Controls.Add(this.buttonAdd); + this.groupList.Controls.Add(this.domainList); + this.groupList.Location = new System.Drawing.Point(12, 12); + this.groupList.Name = "groupList"; + this.groupList.Size = new System.Drawing.Size(307, 257); + this.groupList.TabIndex = 1; + this.groupList.TabStop = false; + this.groupList.Text = "List"; + // + // buttonDel + // + this.buttonDel.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; + this.buttonDel.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.buttonDel.Location = new System.Drawing.Point(47, 223); + this.buttonDel.Name = "buttonDel"; + this.buttonDel.Size = new System.Drawing.Size(28, 28); + this.buttonDel.TabIndex = 11; + this.buttonDel.Text = " -"; + this.buttonDel.UseVisualStyleBackColor = true; + this.buttonDel.Click += new System.EventHandler(this.buttonDel_Click); + // + // buttonAdd + // + this.buttonAdd.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; + this.buttonAdd.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.buttonAdd.Location = new System.Drawing.Point(15, 223); + this.buttonAdd.Name = "buttonAdd"; + this.buttonAdd.Size = new System.Drawing.Size(28, 28); + this.buttonAdd.TabIndex = 10; + this.buttonAdd.Text = " +"; + this.buttonAdd.UseVisualStyleBackColor = true; + this.buttonAdd.Click += new System.EventHandler(this.buttonAdd_Click); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.button_RestartServer); + this.groupBox1.Controls.Add(this.textBox_rootDir); + this.groupBox1.Controls.Add(this.buttonSelectDir); + this.groupBox1.Controls.Add(this.buttonRootGo); + this.groupBox1.Controls.Add(this.label3); + this.groupBox1.Controls.Add(this.buttonInfo); + this.groupBox1.Controls.Add(this.buttonGo); + this.groupBox1.Controls.Add(this.textBox_Port); + this.groupBox1.Controls.Add(this.textBox_hostname); + this.groupBox1.Controls.Add(this.label2); + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Location = new System.Drawing.Point(325, 12); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(259, 257); + this.groupBox1.TabIndex = 2; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Setting"; + // + // button_RestartServer + // + this.button_RestartServer.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; + this.button_RestartServer.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.button_RestartServer.Location = new System.Drawing.Point(15, 223); + this.button_RestartServer.Name = "button_RestartServer"; + this.button_RestartServer.Size = new System.Drawing.Size(106, 23); + this.button_RestartServer.TabIndex = 10; + this.button_RestartServer.Text = "Restart Server"; + this.button_RestartServer.UseVisualStyleBackColor = true; + this.button_RestartServer.Click += new System.EventHandler(this.button_RestartServer_Click); + // + // textBox_rootDir + // + this.textBox_rootDir.Location = new System.Drawing.Point(14, 143); + this.textBox_rootDir.Name = "textBox_rootDir"; + this.textBox_rootDir.ReadOnly = true; + this.textBox_rootDir.Size = new System.Drawing.Size(224, 21); + this.textBox_rootDir.TabIndex = 9; + // + // buttonSelectDir + // + this.buttonSelectDir.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; + this.buttonSelectDir.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.buttonSelectDir.Location = new System.Drawing.Point(164, 114); + this.buttonSelectDir.Name = "buttonSelectDir"; + this.buttonSelectDir.Size = new System.Drawing.Size(74, 23); + this.buttonSelectDir.TabIndex = 8; + this.buttonSelectDir.Text = "SelectDir"; + this.buttonSelectDir.UseVisualStyleBackColor = true; + this.buttonSelectDir.Click += new System.EventHandler(this.buttonSelectDir_Click); + // + // buttonRootGo + // + this.buttonRootGo.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; + this.buttonRootGo.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.buttonRootGo.Location = new System.Drawing.Point(128, 114); + this.buttonRootGo.Name = "buttonRootGo"; + this.buttonRootGo.Size = new System.Drawing.Size(28, 23); + this.buttonRootGo.TabIndex = 7; + this.buttonRootGo.Text = "Go"; + this.buttonRootGo.UseVisualStyleBackColor = true; + this.buttonRootGo.Click += new System.EventHandler(this.buttonRootGo_Click); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.ForeColor = System.Drawing.Color.Black; + this.label3.Location = new System.Drawing.Point(12, 119); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(89, 12); + this.label3.TabIndex = 6; + this.label3.Text = "Doucment Root:"; + // + // buttonInfo + // + this.buttonInfo.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; + this.buttonInfo.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.buttonInfo.Location = new System.Drawing.Point(226, 29); + this.buttonInfo.Name = "buttonInfo"; + this.buttonInfo.Size = new System.Drawing.Size(28, 23); + this.buttonInfo.TabIndex = 5; + this.buttonInfo.Text = "i"; + this.buttonInfo.UseVisualStyleBackColor = true; + this.buttonInfo.Click += new System.EventHandler(this.buttonInfo_Click); + // + // buttonGo + // + this.buttonGo.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; + this.buttonGo.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.buttonGo.Location = new System.Drawing.Point(196, 29); + this.buttonGo.Name = "buttonGo"; + this.buttonGo.Size = new System.Drawing.Size(28, 23); + this.buttonGo.TabIndex = 4; + this.buttonGo.Text = "Go"; + this.buttonGo.UseVisualStyleBackColor = true; + this.buttonGo.Click += new System.EventHandler(this.buttonGo_Click); + // + // textBox_Port + // + this.textBox_Port.Location = new System.Drawing.Point(91, 56); + this.textBox_Port.Name = "textBox_Port"; + this.textBox_Port.Size = new System.Drawing.Size(65, 21); + this.textBox_Port.TabIndex = 3; + this.textBox_Port.Text = "80"; + this.textBox_Port.TextChanged += new System.EventHandler(this.textBox_Port_TextChanged); + // + // textBox_hostname + // + this.textBox_hostname.Location = new System.Drawing.Point(91, 30); + this.textBox_hostname.Name = "textBox_hostname"; + this.textBox_hostname.Size = new System.Drawing.Size(100, 21); + this.textBox_hostname.TabIndex = 2; + this.textBox_hostname.Text = "localhost"; + this.textBox_hostname.TextChanged += new System.EventHandler(this.textBox_hostname_TextChanged); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.ForeColor = System.Drawing.Color.Black; + this.label2.Location = new System.Drawing.Point(12, 59); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(77, 12); + this.label2.TabIndex = 1; + this.label2.Text = "Port Number:"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.ForeColor = System.Drawing.Color.Black; + this.label1.Location = new System.Drawing.Point(12, 33); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(77, 12); + this.label1.TabIndex = 0; + this.label1.Text = "Server Name:"; + // + // WebSite + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(606, 301); + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.groupList); + this.ForeColor = System.Drawing.Color.Black; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "WebSite"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Web管理"; + this.TopMost = true; + this.Load += new System.EventHandler(this.WebSite_Load); + ((System.ComponentModel.ISupportInitialize)(this.domainList)).EndInit(); + this.groupList.ResumeLayout(false); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.DataGridView domainList; + private System.Windows.Forms.GroupBox groupList; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox textBox_Port; + private System.Windows.Forms.TextBox textBox_hostname; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button buttonGo; + private System.Windows.Forms.Button buttonInfo; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Button buttonSelectDir; + private System.Windows.Forms.Button buttonRootGo; + private System.Windows.Forms.TextBox textBox_rootDir; + private System.Windows.Forms.Button buttonAdd; + private System.Windows.Forms.Button buttonDel; + private System.Windows.Forms.Button button_RestartServer; + private System.Windows.Forms.DataGridViewTextBoxColumn hostname; + private System.Windows.Forms.DataGridViewTextBoxColumn port; + } +} \ No newline at end of file diff --git a/MDserver/WebSite.cs b/MDserver/WebSite.cs new file mode 100644 index 0000000..c49c944 --- /dev/null +++ b/MDserver/WebSite.cs @@ -0,0 +1,409 @@ +using System; +using System.IO; +using System.Timers; +using System.Windows.Forms; +using System.Xml; +using System.Threading; +using System.Text.RegularExpressions; + +namespace MDserver +{ + public partial class WebSite : Form + { + private static string BaseDir = System.AppDomain.CurrentDomain.BaseDirectory.Replace("\\", "/"); + + private SystemXml iniXml; + public MDserv mainUI; + + //port总长度 + private int PORTLEN = 10; + //域名长度 + private int DOMAINLEN = 30; + + public WebSite() + { + InitializeComponent(); + this.iniXml = new SystemXml(BaseDir + "host.xml"); + Control.CheckForIllegalCrossThreadCalls = false; + } + + //设置为有一定 + public string setLenValue(string value, int len) + { + int vlen = value.Length; + int padLen = len - vlen; + //this.mainUI.log(padLen.ToString() + ":"); + if (padLen > 0) + { + value = value.PadRight(padLen, ' '); + } + return value; + } + public string getRealValue(string value) + { + return value.Trim(); + } + + + private void WebSite_Load(object sender, EventArgs e) + { + InitUI(); + } + + public void InitUI() + { + domainList.SelectionMode = DataGridViewSelectionMode.CellSelect; + + //禁止排序 + for (int i = 0; i < this.domainList.Columns.Count; i++) + { + this.domainList.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable; + this.domainList.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells; + } + + string hostname = setLenValue("localhost", DOMAINLEN); + string port = setLenValue("80", PORTLEN); + string root_dir = BaseDir + "www/htdocs"; + + DataGridViewRow Row = new DataGridViewRow(); + int index = domainList.Rows.Add(Row); + domainList.Rows[index].Cells[0].Value = hostname; + domainList.Rows[index].Cells[1].Value = port; + + textBox_hostname.Text = getRealValue(hostname); + textBox_Port.Text = getRealValue(port); + textBox_rootDir.Text = root_dir; + + + + XmlNode r = this.iniXml.rootNode(); + foreach (XmlNode r_one in r) + { + DataGridViewRow Rt = new DataGridViewRow(); + int t = domainList.Rows.Add(Rt); + domainList.Rows[t].Cells[0].Value = setLenValue(r_one.Attributes["name"].Value, DOMAINLEN); + domainList.Rows[t].Cells[1].Value = setLenValue(r_one.Attributes["port"].Value, PORTLEN); + + //this.mainUI.log(domainList.Rows[t].Cells[0].Value+ ":"); + //this.mainUI.log(domainList.Rows[t].Cells[1].Value + ":"); + } + + } + + + private void domainList_CellContentClick(object sender, DataGridViewCellEventArgs e) + { + int index = domainList.CurrentRow.Index; + + string hostname = domainList.Rows[index].Cells[0].Value.ToString(); + string port = domainList.Rows[index].Cells[1].Value.ToString(); + textBox_hostname.Text = getRealValue(hostname); + textBox_Port.Text = getRealValue(port); + + if (index > 0) + { + XmlNode ch = this.iniXml.selectedNode(index - 1); + + string v = ch.Attributes["root_dir"].Value; + textBox_rootDir.Text = v; + } + else + { + string root_dir = BaseDir + "www/htdocs"; + textBox_rootDir.Text = root_dir; + } + + } + + + private void buttonAdd_Click(object sender, EventArgs e) + { + int count = domainList.RowCount; + + DataGridViewRow Row = new DataGridViewRow(); + //domainList.RowHeadersWidth = 45; + + string hostname = Guid.NewGuid().ToString().Substring(0, 8) + ".com"; ; + string port = "80"; + + hostname = setLenValue(hostname, 30); + port = setLenValue(port, 10); + + string root_dir = BaseDir + "www/htdocs"; + + int index = domainList.Rows.Add(Row); + domainList.Rows[index].Cells[0].Value = hostname; + domainList.Rows[index].Cells[1].Value = port; + + this.iniXml.addNode(getRealValue(hostname), "port", getRealValue(port)); + this.iniXml.updateNode(index - 1, "root_dir", getRealValue(root_dir)); + + + restart(); + + } + + private void buttonDel_Click(object sender, EventArgs e) + { + int index = domainList.CurrentRow.Index; + if (index > 0) + { + domainList.Rows.RemoveAt(index); + this.iniXml.removeNode(index - 1); + + restart(); + } + else + { + MessageBox.Show("localhost不可修改"); + } + + } + + private void buttonInfo_Click(object sender, EventArgs e) + { + var ok = checkFunc(); + if (ok) + { + int index = domainList.CurrentRow.Index; + + string hostname = getRealValue(domainList.Rows[index].Cells[0].Value.ToString()); + string port = getRealValue(domainList.Rows[index].Cells[1].Value.ToString()); + + string root_dir = BaseDir + "www/htdocs"; + if (index > 0) + { + XmlNode ch = this.iniXml.selectedNode(index - 1); + root_dir = ch.Attributes["root_dir"].Value.ToString(); + } + + string php_tmp = "tmp_" + Guid.NewGuid().ToString().Replace("-", "_") + ".php"; + var cbool = this.mainUI._WriteContent(root_dir + "/" + php_tmp, ""); + if (cbool) + { + System.Diagnostics.Process.Start("http://" + hostname + ":" + port + "/" + php_tmp); + + + Thread delfile = new Thread(() => + { + Thread.Sleep(3000); + //删除临时文件 + File.Delete(root_dir + "/" + php_tmp); + }); + delfile.Start(); + } + else + { + MessageBox.Show("创建临时文件失败!"); + } + } + } + + private void buttonGo_Click(object sender, EventArgs e) + { + var ok = checkFunc(); + if (ok) + { + int index = domainList.CurrentRow.Index; + string hostname = getRealValue(domainList.Rows[index].Cells[0].Value.ToString()); + string port = getRealValue(domainList.Rows[index].Cells[1].Value.ToString()); + + System.Diagnostics.Process.Start("http://" + hostname + ":" + port + "/"); + } + } + + private void buttonSelectDir_Click(object sender, EventArgs e) + { + int index = domainList.CurrentRow.Index; + if (index > 0) + { + FolderBrowserDialog dir = new FolderBrowserDialog(); + dir.RootFolder = Environment.SpecialFolder.Desktop; + if (dir.ShowDialog() == DialogResult.OK) + { + if (index > 0) + { + this.iniXml.updateNode(index - 1, "root_dir", dir.SelectedPath); + textBox_rootDir.Text = dir.SelectedPath; + } + } + + restart(); + } + else + { + MessageBox.Show("localhost不可修改"); + } + } + + private void buttonRootGo_Click(object sender, EventArgs e) + { + string dir = textBox_rootDir.Text; + //dir = getDirPath(dir); + if (Directory.Exists(dir)) + { + System.Diagnostics.Process.Start(dir); + } + else + { + MessageBox.Show(dir + "目录不存在!"); + } + + } + + private void textBox_hostname_TextChanged(object sender, EventArgs e) + { + int index = domainList.CurrentRow.Index; + string conf_hostname; + string hostname = textBox_hostname.Text.Trim(); + + if (index > 0) + { + bool isRepeat = false; + + //检查是否为空 + if (hostname.Equals("")) + { + MessageBox.Show("端口不能为空!!"); + textBox_hostname.Text = Guid.NewGuid().ToString().Substring(0, 8) + ".com"; + return; + } + + //检查是否重复 + XmlNode hostXml = this.iniXml.rootNode(); + int hostIndex = 1; + foreach (XmlNode host in hostXml) + { + conf_hostname = host.Attributes["name"].Value; + + if (hostname.Equals(conf_hostname) && index != hostIndex) + { + isRepeat = true; + break; + } + hostIndex++; + } + + if (isRepeat) + { + MessageBox.Show("域名不要重复!!"); + textBox_hostname.Text = Guid.NewGuid().ToString().Substring(0, 8) + ".com"; + return; + } + + domainList.Rows[index].Cells[0].Value = setLenValue(textBox_hostname.Text.Trim(), DOMAINLEN); + this.iniXml.updateNode(index - 1, "name", textBox_hostname.Text.Trim()); + + } + else + { + if (textBox_hostname.Text == "localhost") + { + } + else + { + MessageBox.Show("localhost不可修改!"); + textBox_hostname.Text = "localhost"; + } + return; + } + } + + public bool IsInt(string value) + { + return Regex.IsMatch(value, @"^[+-]?\d*$"); + } + + private void textBox_Port_TextChanged(object sender, EventArgs e) + { + int index = domainList.CurrentRow.Index; + string port = textBox_Port.Text; + if (index > 0) + { + + + if (port.Equals("")) + { + MessageBox.Show("端口不能为空!!"); + textBox_Port.Text = "80"; + return; + } + + if (!IsInt(port)) { + MessageBox.Show("请输入数字!!"); + textBox_Port.Text = "80"; + domainList.Rows[index].Cells[1].Value = setLenValue("80", PORTLEN); + return; + } + + int portInt = Convert.ToInt32(port); + //this.mainUI.log(portInt.ToString()); + if (portInt > 0 && portInt < 65536) + { + textBox_Port.Text = portInt.ToString(); + port = textBox_Port.Text; + domainList.Rows[index].Cells[1].Value = setLenValue(port, PORTLEN); + this.iniXml.updateNode(index - 1, "port", textBox_Port.Text); + } + else + { + MessageBox.Show("端口范围在0~65536之内"); + textBox_Port.Text = "80"; + return; + } + + } + else + { + if (port != "80") + { + MessageBox.Show("localhost端口不可修改!"); + textBox_Port.Text = "80"; + return; + } + } + } + + + //私有方法 + public Boolean checkFunc() + { + bool isRun = !this.mainUI.button_start.Enabled; + int index = domainList.CurrentRow.Index; + + if (!isRun) + { + MessageBox.Show("HTTP服务没有启动!!!"); + return false; + } + //else if (index == 0) { + // MessageBox.Show("localhost不可修改"); + // return false; + //} + + return true; + } + + public void restart() + { + var isRun = !this.mainUI.button_start.Enabled; + if (isRun) + { + DialogResult qa = MessageBox.Show("要想立即生效需要重新启动,是否重新启动!!!", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question); + if (qa == DialogResult.Yes) + { + Thread re = new Thread(() => + { + this.mainUI.restart(); + }); + re.Start(); + } + } + } + + private void button_RestartServer_Click(object sender, EventArgs e) + { + restart(); + } + } +} diff --git a/MDserver/WebSite.resx b/MDserver/WebSite.resx new file mode 100644 index 0000000..c4d5afc --- /dev/null +++ b/MDserver/WebSite.resx @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + True + + + + + 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 + CwA8DgA5DAE6DAE2DAAzCwAuBgEbAAAAAAAAAAA2HBYmAgA1BQE7BwE6CQA6CgA8DQBFDgE5DgBOEAU5 + HRL//PtVUluQkZtIY2A+PTlhSEZuQkGBVVv/+////v3//PV8VE90RT1yRjl0Rjt5SD59TD6ATEX//Pb3 + //36/////v///P85XF8xHyZZDgxDDABFCwA6DQA9DAI6DAE4CwA2CwIuCQUAAAAAAAAAAAAAAAArDQg6 + BwQ5AwA7CwA9DQFCDgFDCwBDFAZICABdLyewjYr/7fVpYGp5fIGdmJmWg4CEbWv//Pvv/////vrYxb6M + XVmNWVJ/V0t/Vk2BVk2JWEqJUkuWgHr5/fj4/P39+vz//f9UWVplaG1NBw1OCgA/CgA6DQA+CgM7DAQ4 + CQE1BwAmCAMAAAAAAAAAAAAAAAAAAAA0BAA2AgA8DQA/DgBEDQBIBQBLDgSVX1Sndm6Qc261lpn/9/v/ + /f/3+Pb///z+/vj9//zv5eWVhIGRdHCbbGikdG6bdGuZdGyZc26dcGWfb2mKamXSw8D///79/P7//v+r + mZqKpq15UFVSCgA+CQA9DABBCwQ8CwM4CQE5BgMwGxYAAAAAAAAAAAAAAAAAAAA0BgBBDwM8DQBBDQBH + CwBVEwhGBQC0kIi5joueiIKpiYSmjojItbDm29fq5eLo39y0n524iIesioqqh4S1ioexh4KviYSuiYWu + iIazi4ashoGuiIaggYD/+vf////7/f3u2Np1mKKdjZRJCwBODQVDCwBDCwY8CgQ6CAI6CAIAAAAAAAAA + AAAAAAAAAAAAAAAaAQA0BQE9CgBACgBKCQBCCgCQZVy+pJ69opjCope9oZq5oZu9oJu9oJu9oJu9oJu9 + oJu9oJu9oJu9oJu9oJu9oJu9oJu9oJu9oJu5oZu9oJu+oJu+pJ66qKH///j///j/9PyipKWYuLc/Ih5U + DwVTDgRDDwBFCwBACwggBgEAAAAAAAAAAAAAAAAAAAAAAAAAAAA4Dww8AQBHDAJGDwJHCgDTqaLItbDJ + tKzQs6rLs63Hs67Ls63Ls63Ls63Ls63Ls63Ls63Ls63Ls63Ls63Ls63Ls63Ls63Ls63HtK3Ns63Ns63J + savCsKn/+/L///f//f7h1dWksbNpZ2Y8BwBEDAE+BwBDDQI8Eg0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABODglEBwA+DQBLBwDdt7LNwr7VxMHcw7/XxMHTxMLXxL/XxL/XxL/XxL/XxL/XxL/XxL/XxL/X + xL/XxL/XxL/XxL/XxL/Txb/YxL/axL/VwbzRvrnOxL3d1c799e7//fvt4+mRoaAvDgU8CAFKEQg9CgAu + FQ8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAABABQBEEABLBACJY17h29bl2dns19nq2Nnj2dno + 2dbo2dbo2dbo2dbo2dbo2dbo2dbo2dbo2dbo2dbo2dbo2dbo2dbl2tbm2tbq2dbo19To2dbj19Pg1dHm + 3dTr2NPd0dc8ODcxAQA/CgA+CwEsAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6CgQ7 + AwBNCAU6EAvs4tvq3t7v4OT05urt5ebr4t/r4t/r4t/r4t/r4t/r4t/r4t/r4t/r4t/r4t/r4t/r4t/r + 4t/p4t/r4t/u4d/u4d/u4d/t4d/t4d/x3tv27enk3N1JEhVJBgBBBwA0CgUAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkDgpGCwFLEAawgX3/6+7y6O758PP67O317e717e717e717e71 + 7e717e717e717e717e717e717e717e717e717e7z7e7z7e7z7e7z7e7z7e7z7e705eP///R+VUxKCwND + BQAvCgsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AQBJCQAzAACx + kpX/+v//9vn/9fP88/b88/b88/b88/b88/b88/b88/b88/b88/b88/b88/b88/b88/b88/b88/b59Pb5 + 9Pb59Pb59Pb59Pb+9fF3TD1HAgA1CgAwCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAiAwBJCABLDQNrPDT//Pn7/f739vj/+/3/9/r/9vn/+vz4/P399fb/+Pn9 + 9fb/+fr+9vf99fb/+Pn79Pf/+Pv79vj++fv9+Pr79Pf/+PtaLBtTEAdGBwAhAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEHRZBCwRBDQY3CgdoQT// + +vj/+/v///7//v/9///7/v/9/v/8/f/9/v/6+//8/f/8/f/7/P/9/P79///+//3++/f//vtLLCkuBwVN + DwdECwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAzBgBHBgBRDAMwCgVgRD3g0Mr///7//P789/n//f///P///f///P///f///f// + /f///fz//Pm+qqU8IBk3EAg/CgBKDwZDEAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9Dwg/DgZEDwVHDwRB + CwA9DABCDQNDDgRLFgxJFApFEAZBDAI/CgBFDQJHCQFGCgQ+BwI5DQYAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAArGRAwDwZDDgRFDQJCCwBGDwJDDABGDwJDDABDDABEDQBCCwBDCgFADwUpCgEd + CQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqCgU0DAcxCQQ1 + DQgzCwYyCgUvBwIvBwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///AP//8AAP//gAH//wAA//wAAH//AAD/8AAAD/8AAP/gAAAH/wAA/4AAAAH/ + AAD/AAAAAP8AAP4AAAAAfwAA/AAAAAA/AAD4AAAAAB8AAPgAAAAAHwAA8AAAAAAPAADgAAAAAAcAAOAA + AAAABwAA4AAAAAAHAADAAAAAAAMAAIAAAAAAAwAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAA + AAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAwAAwAAAAAADAADgAAAAAAMAAOAAAAAABwAA4AAAAAAH + AADwAAAAAA8AAPgAAAAADwAA+AAAAAAfAAD8AAAAAD8AAP4AAAAAfwAA/wAAAAD/AAD/gAAAAf8AAP/A + AAAH/wAA//AAAA//AAD//gAAf/8AAP//AAD//wAA///wD///AAA= + + + \ No newline at end of file