["..H$ ","!Zcomparator","UYGVXASCII Sort:XGG100FG50FGSR100GSR9GGXAlphanumeric Sort:XGG50FG100FGSR9GSR100XGGY8Y7;GY8Y7.CollectionsYIY9Y+G{GUY$U{GUUY?[] highwaysY_YXY?[]GUU{GUUUXV100FVX,GUUUXV50FVX,GUUUXVSR100VX,GUUUXVSR9VXGUU};XGGUUYcWe want to sort a Y? YL called highwaysYSan alphanumeric way.GUUY1Call the YN.Sort mYC.GUUXYN.Sort(highways, YXXAlphanumComparatorFastX());XGGUUY1Y. the Y:s.GUUXY2 (Y? hYShighways)GUU{GUUUY%h);GUU}GU}G}GGXGG50FG100FGSR9GSR100XImplementation of IComparer: C#XGGXYcNOTE: This code is free to useYSany program.GY1It was developed by Dot Net Perls.GGXY*Y9XAlphanumComparatorFastX : IComparerG{GUY*YZCompare(object x, object y)GU{GUUY? s1Y_x as Y?;GUUY[s1Y^null)GUU{GUUUY@ 0;GUU}GUUY? s2Y_y as Y?;GUUY[s2Y^null)GUU{GUUUY@ 0;GUU}GGUUYZlen1Y_s1.LYO;GUUYZlen2Y_s2.LYO;GUUYZmarker1Y_0;GUUYZmarker2Y_0;XGGUUYcWalk through two the Y?s with two markers.GUUXYQ (marker1 < len1 && marker2 < len2)GUU{GUUUchar ch1Y_s1[marker1];GUUUchar ch2Y_s2[marker2];XGGUUUYcSome buffers we can build up charactersYSYVeach chunk.GUUUXchar[] space1Y_YXchar[len1];GUUUYZloc1Y_0;GUUUchar[] space2Y_YXchar[len2];GUUUYZloc2Y_0;XGGUUUYcWalk through all following characters that are digits orGUUUYccharactersYSBOTH Y?s starting at the appropriate marker.GUUUYcCollect char YLs.GUUUXdoGUUU{GUUUUspace1[loc1++]Y_ch1;GUUUUmarker1++YIUUUUY[marker1 < len1)GUUUU{GUUUUUch1Y_s1[marker1];GUUUU}GUUUUelseGUUUU{GUUUUUY6GUUUU}GUUU} YQ (char.IsDigit(ch1)Y^char.IsDigit(space1[0]))YIUUUdoGUUU{GUUUUspace2[loc2++]Y_ch2;GUUUUmarker2++YIUUUUY[marker2 < len2)GUUUU{GUUUUUch2Y_s2[marker2];GUUUU}GUUUUelseGUUUU{GUUUUUY6GUUUU}GUUU} YQ (char.IsDigit(ch2)Y^char.IsDigit(space2[0]));XGGUUUYcIf we have collected Y5s, compare them numerically.GUUUYcOtherwise, if we have Y?s, compare them alphabetically.GUUUXY? str1Y_YXY?(space1);GUUUY? str2Y_YXY?(space2)YIUUUYZY:YIUUUY[char.IsDigit(space1[0]) && char.IsDigit(space2[0]))GUUU{GUUUUYZthisNumericChunkY_Yb.Parse(str1);GUUUUYZthatNumericChunkY_Yb.Parse(str2);GUUUUY:Y_thisNumericChunk.CompareTo(thatNumericChunk);GUUU}GUUUelseGUUU{GUUUUY:Y_str1.CompareTo(str2);GUUU}GGUUUY[Y: != 0)GUUU{GUUUUY@ Y:;GUUU}GUU}GUUY@ len1 - len2;GU}G}X","A+AECrrBf.+PFXC| 88656}X~~~CEP656666+CE]CCC/X","Alphanumeric sort."," This sorting algorithm logically handles numbers in strings. It makes sense to humans. Highway names like 50F and 100F will be sorted wrongly with ASCII sort.","Notes, sort results."," Consider the ASCII and alphanumeric sorting results for some example strings. These could be highway names or other types of strings. ","Example."," First we use the alphanumeric sorting comparer (AlphanumComparatorFast) to deal with strings containing numbers and regular characters in a human-friendly order. ","It is different from alphabetic, ASCII or numeric sorting. This algorithmic approach is used in file managers.","IComparer."," Here we see the comparator for alphanumeric sorting. I optimized this version of the code. It is over 40% faster on most data sets. ","Performance: ","This code has reduced memory usage and far better performance. It is accurate in my limited testing.","Return: ","The IComparer implementation returns an integer. This result indicates which string comes first.","Loop: ","It walks through both strings in a single loop. It tries to find equivalent chunks of those two strings at a position.","It uses char arrays for performance. Char arrays often improve string append performance in the .NET Framework.","Char Array ","char-array","Notes, above code."," It uses 2 comparisons. It selects either an alphabetical comparison or a numeric comparison, depending on the chunk type. ","Next: ","The code uses CompareTo, which indicates whether the first object is bigger or smaller than the second object.","CompareTo ","compareto","Discussion."," Alphanumeric sorting is often not ideal. If you have data that is formatted in a specific, known way, you can first parse it. Then, create objects based on the data. ","Finally: ","We can sort those objects based on a property. So we sort a parsed representation.","Using an object model may lead to clearer, simpler code. It may be easier to maintain. And it may execute faster.","However: ","An alphanumeric sorting implementation is helpful for many problems that may be less defined.","Summary."," We sorted strings alphanumerically. This results in a more natural presentation of lists for your users. Use this IComparer implementation for alphanumeric or natural sorting.","A review."," This code is neither the fastest nor clearest. But it works for small applications. Its results are predictable. It can be used in any program with no restrictions."]

%iVBORw0KG;)NSUhEUg?ALM?ABSCAM)o0hXm)MFBMVEVl4fzS:fO:by:3d9/7B8f74:6T6P145Pyp7fz::U9v3j:rq:zc:nW:hthqPe?AD9klEQVR4XtTZ2W7DIBQEUKS7sHjJ:9tq4RIjgEPBZza827rqLoaTxUTPsNSkdAZ6QmHvVlMRXrNpifSZp5uaPY3NLsbmg3f0Cw3NLt/NPtGs+H/M9tWs9zQbG9oNnQhM4uINThyFXOMPfs40H7RIwHnzGRqoieaj8gSovmbnxVs9ofknFn3j3iwk8aZcQ14ItLErEvyRpPNWWY+INt5mWdKzZIMTw9G9FAzuzLZ8bIsOfNeKIUD96eY9Yg8LYk5/xAFzb9htBlXBhXMU1LEpRfxWDOuDCqZk9Motp+MNePKKJpdZnUSOI5R5umAbKlo5izMgePoNuPKII3mZUG7zocw/jh4eoVjKiqDtWy22RbmwTuJfqO/qV4ZrE8z5cxUODU3dkQnZLgyEjM4jeILZYwZV0Y4MvuCagLH0W2ejslbs36atbSSdeyI3pBxZVj9MGswh6dhwbVJvxlXBoWtmcLO7EsmsJM6zWoPyBy2ZgrRXP4Ion+4+s24MrZmCtFc3EcOtuc0wiyAvDGHaIanMf44qsk+fJhDanbmr3GdZlwZW7OmZjY4eCexlJOYQWVo2Jo1pGYBPtB2+C02McPKiNH4QGK2DWbXafZ1PzVFcmIm0xJuN+PK2JpDzixNZmkx/6EylJ+Z+B3amm2T2baZcWWUikE2ZjVtoWYzgZbDZmk0S6tZLRhG2Owbzb7V7FHtY7MzjdEWM64MbE73Eaex4DiguZoMzGAfYY5vMTO4NmBG0xl9dVyDGVRGnZmrBpsbNKLV4mGEzQLaYOyI9mAY1Zlt1d+Ox4xoAcMImen1OU8e5Wc0Wt8x2Qg/E0VK5UCy510kYxa02uqnSDTTPM/rLvMrS/OwOd+8Jrm8ec3k4uY1m2Fm/Z55HWT2hMz6m0Hm9UvmSZ/pNsdc3vx459tmokbz4yPjzeN745FknHk5xRyZKXq+qnl5FDLMHGJ+KqejFQZCGAqiqCBQjP7/3xZiL92BkDbzuug9CDv3+mS3V9QwZn5ivsqZL6GhODnN1u3zn3zNti9a6vGHWQesTtYSi4bnAvlpXntLnbzdJFiVyVoK2DM2b+9c8xzevn3NN1kVvbpt+LfxL3lgiewx2Rwku9nObVPN56aSYnXOv+YVLBkLR47M1ogmOzfvp7hqJpsRDHJzc4Na/TJvgkvm51RNfJrMjhYbwQwtxFUzl1IvN5rMUJ/QvBnBuq5gpppwcimG2dHqh5leiWtmsPOwcc29qcMe5hVwKS6ZG1aysOF1N3eo2dDLABqAK+atpRwejnSZXa1ic+JVvWImm/RkpsvsNZSb6dVlJTPYeRiRGWoGM60El8yYSr1cgRnsyNxUCK6ag6mMyxl7A7N1SHHHRNQV)AElFTkSuQmCC%iVBORw0KG;)NSUhEUg?AIw?ABpCAM?ADflzs9)VFBMVEX::2+fju9PHy9/X0+Pbx9vTo8Ozj7ejZ5uDP4tmwz8Dd6uTL3dTV49x8sJe208Wuzr/P39drpoq61chopIecw7CSvahgn4F1rJFjoYOAsppyqo9IgRfD?ACtElEQVR4Xu3XyVKEMBSF4cxh7Hn2/d9TrtE+VUhTaJrcLPIvLGXjJyegiq/0ZfPIoIBRt2sOBYzLCePzwZiA+bgwtvnBaNES5iylYUlrLbffGGnlF+YiteJKNyPMWUjNkh0wu18YprTNCCM1PwZpZfLBmJwwumAKpmAKpmCSVzAFUzAF47oQvlgCcEMrYtxfMBboVTBtTpguG4wfDCoXjCXQNMb3g6/3Iwo1Bvlq3/Wti8aIfdfVwFCghtw8BnP3Jhbj.EMLMjNYhSAdSyGFO43Zk+KvuoJs39iTLhQDT0xNSm86wM7DiPCww0MoA6fvD7A6ueOtKSPxVSkGGPa502vCTuD8T9YQ8xYDDHUGENr+Oc362cw9LNYQRHGRmJoJz/GYBwoxxgcLmepeEwYov4/pkPxmDCEeRNGxGIsTTJ/ZtJhaPbqH08T2AqAaAzt5Be+ZwxhzOjR7u3bMEG16A2MWSqBlx6qojHYff53E2YhJy68GVMBA820RVjAoXkTBqz5v2eQaseXXRU2da7831QwBbNmUjapMPK4na1pds0lFcadrgtKhTlkhPH5YIxoCXM/ve5wSIXRAbNTbjLvvFKXK3VOgJEVYRqpJ7PWmPPTsjJG2m+MsFMpZRUsqTBbIScyRmhYEmJeBEsSTAvMjCUl5jhv4cfAwo+BhR8DSzKMUMBMWh4yIeblTE2wWJEQo19gtsGihGC+M7A4wYyBZaPA4JsJG/HfGVj4McfReeF66cGygYURc8RG3BicF34Mzgs/BueFGwOLEvwYbMSPgYUbsx2dF14MLPyYY4eNuDH3xwGW5BhkFDmw0SLMppls20S0o84nWJZhEgQLP+bmxTLMx/qWUy8WYjbX+7pdb5VYlFau7uq12g8NH71YilHGGLlKhpJieUZbtWbWavGH5MqJuEqfDRAN8iKPPjs)ASUVORK5CYII=%iVBORw0KG;)NSUhEUg?AMo?ABPCAM?ACdxqrx)YFBMVEX::m5uaTk5OoqKj09PRlZWUvLy/ExMS3t7e7u7vQ0NDs7u7d3d0?ADLy8ukzMxepqX4+PiQwcG52NhQnp3V1dVtrq1GmJfv9vZKm5pWoaDT5uaAuLdClpV8oqGgtrVqRzPm?AFRklEQVR4Xu3b63qyOBQFYHLm7Lnnb+b+73KSnYVuE6p1qgzOw/rltkHyNgECtUVRPi7FpPn/UxbKQlkoC2WhLJSFUj8uC2XIQul/nllTAHEXMqo51IfDnCgE+XMtr6+v7+/v+/3Hx8c6xkuQWVHcVQkg5HihkASZCSVI3PUxIQk5kAPPfCjVDwYlDAlBvmI8oA2BZQ4UL7lOgQSQbQhBTpiZUKry6qDs9yQZHKvVCg42MM9CgYQYPkQRPszyDBQaFJIQZEcRyDiGyskp7gcUDMr2r47FGHmABRiWGVOCBBQeyWbZk1DW6yBZgcJi+4YsqSaUc6QMg7L66nKLaAQwPPOkYH6FY/5vAhiKhUU2ZBFPQ6FBAaXxedO6ldEiQp1rhHgOytub9okWpRtgksyZsuOUzWbTUCm1BuZZKNsjJUjeNiEmlGajQ4BRkhhN08twOFkjWw5oZdjGyHoMUMpYOGlw4VLKJS1raTsry1gIX3RG6Rso6xdO8RBQFNXeRETn+28604QcghIxukDClERw4v?Kj2t9duS1jt4yIJWxw8wgn2abe9FKQaKDjVRagsGdgUJ+Vg4hbYNEtt9S3EnpdEaBSy3UFZjFN6dSmIfWiR9NpECyRjFSbTTkIxSuFLywtyZYruBorA3pTAHFE3z2Cq8a1OKHcinTZUx.Wbyy4v6l9ScNhHCmKVp1hMZx9hSBkoGDR6N1hsXdfJtkVh+YzMKTJsrvhB2Eb6byk2pZhq4yU9FXE5iV21w/xyOFkFQMk72RmH1vjBGEVGouWFJNUvKadfCCB98GF+yU3BdqUGL97Up74AEnusMIbjFMk/0upYOHL9kmKodANFbWI0vV8OlPLMy3tpThTF3TKhcFUOFhj2f0NBj0WU2NOOzij9QKnR63xUTN5JA9dlSk1VAr6Vkq+M1ZHSDxSACwTg/FiROcWizQSULMb3/Zyixygdn+HDdbBMKLyYnmIa6j4oBPmWIk7XlQ6qGVGk0JpRdA;WicUGhYeVcyFYowSOgYUfYGSr1xkMT0lX042zWdzDDrPKDan2F;y6/s01Py+5XPz09BGTBYGetYmghLT8anZa+RCtDRM1j5UAq/If702YkYaCKlQYhS6fQSiRnmCpaL1xUxAWW327UhwKQUhYVfsnBBF8QlioQbrkdQ+MOjnc+qZRaRUBxf3QqLPQ2q4hJFUaXx+jEU9nTSQ1YrPIGEBpRhwtnTcl4bcrHp016iYIUKyX0p/OnkNlJWPtu6HjBHSiWQRqY3WZj9Em/71G1.SzOb8p296bgbEyWI2W7/ep7slBSiuD353w9rpJn5yOUkjXAyvuuFAzLV6RsveTLcUtKEX32mGL07r5klLyJiRcodW9KsIDiTS8vzvX1yRI7BlfI2cMjUSA1CVlETtHmKCnMAyhkCRjKi0/lerIAwwLN8FxOYv+YX7KWzCOLkZShhSwf8keJV/6nboKs1xWGBZYxTNbFIEMhXIQWF/IgClkIQ5D1R1nhaPkGk1ME5gEvu+kosJx9K2QdJKBECzCpK6Gk18f/hgILYQiy34MCS5JRisF1HHGhNJNTyOIxiH/5D;sWUYpfGVWWiqnpcBCGMQXoFzAJBRcH61RPtLGQkxNgQUaevEKyjnm3JVQ2i5LOfG3KWAJGiQUoIwHl.ygVhXTE6BhudPQsmSU/jtMA6bB1DC7L0hvn@yqUUeZw0xDGyBOS+FLL8XENtvYRRZvQtvbJUtwWDMj+Kq6rytlSVmyGFLK66LQ6S2VEIc1t6n+f79nfOoDz/d/KR5T8lnpWyUBbKPxAW/dQ8mzhh)AElFTkSuQmCC%iVBORw0KG;)NSUhEUg?AMg?ABPCAM?ACZM3rM)YFBMVEX::/75TU1NTExMRvb2/u7u709PTt5K7Ly8uqqqp2dnaEhITl37vg28Lz6KX67Jy4uLjj4+P97pfR0dHX19ecnJz+/v78/Pz+75Xb29uRkZHk3r3b2Mr4+Pji3b/W1dBwG/St?AC/UlEQVR4Xt3aCXLiMBCG0dbqfd9YM/e/5cRUF3JKgYlGdtvKdwL+1CN?7ilFRClNGyY4g0Q1XAFWzU1nHIIbybYJH3mfyiH/OFnvQ0rXkSUQ6KCc7UJq5zRDmH5+rzun6wiRj2ERZ+87muzqtg8JAai4nkIqwreq1VZXdlcxAUQJXjE5q7IazVWOw1ZkZfqZ1Z7DVmN1zizOrE9h7DTzGv0ZoVW9xqCEpCXH6vdhyAvP1YtO8IQ1iIvD1Y7D/HnpXt+q9hxhrDqxnv9X6w+WnakIaz9QF6OrHJmVfJYERXzklnlyMuJVcnsTjdO1u3E7Erk5cEKl0Q5URHu8OA1Iatjhh9SPFjtmzsvhayOGvJSP/pEiwXMS589WBHzOuv3rCoWRBXyImFFz8tmFS4vPJQEVYUXPAJWtLzwrFuyACvxQEzAioaXzSpcXnh/Cza84IXLyjqxqP53DPkttMJ+slvn+rgL+d9vF+OM+yAzEe4Losjk8JDVZFLKtA71LUqdSimzBiBO5aMBeQXGapCP0hgEDpFZHN7b+DiTOEQgLRkeL2T1KGvwyY4NXUgfdTvzuPGMavEKjhVm8QqOlUkbXmEc6AwrDV8ahQyEF7LCxAgYAS8KVq682uiDqKh1ZWUaa4ldXvBqKb/oaV+wukisHuFV5ycv8eKrt/pCVM3Lf7A6w5v0c27y/ZehiSQq+f7L0OQ9K9P0hVd1pCGVxep9fbrgFR1nSMS5eD60Hn6QWvK6tscY0l4XrC4KMAdeRXWEIVWxZDXBT+PPVxzktecQZPV8veaAufM6mSG1IKo2Q07urEyTAdnt/1PAzvxdJ3CtM7z2/nGmYdWByZ1Xmuz7c9kktVh58SIf4sDKjRf1EH9WJpUteOXUQ5asMgVe3ZPFiaWgHVIsDiXJHXyLl7wohyxZxeCVfWIhHGIdSvxbXvDohlj3N6+sCx7dEPv+tiqvBIhKVmZleFEPWZ2V4UU/xLBalxfpEGS1RXqgHTJo2KhRUA4RI2xXUwNRtSOrv73beOZ5KrZY)AElFTkSuQmCC!B$/9j/2wCE?YEBQYFBAYGBQYHBwYIChAKCg@ChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSgBBwcHCggKEwoKEygaFhooKC;KC;KC;KC;KC;KC;KC;KC;KC;KC;KC;KC;KC;KC;KC;KC;KP/BABEIAOQAyAMAIgABEQECEQH/xABh?ACAwEBAQE)))?QIDBAUGBwgQ?EDAgMDBwcKAwcFAQ)ABAgMEEQUSIRMiMSNBUXGRsdEGF.yUmGBFTNCU3KSk6GywSVz0gc0NUNUY4IWF2Kis/D/2gAMAw?AQAC?A/AP1S)IZTUSpDBJI6+VjVd77IO19BEnOKnSIcKo8paX2Kj7rfE583lRTdFT91via2Ucvsle1Z0no6mpyZdekp88955WbylpZLbtT91viKnxykmnjiY2ozPcjeCcV+Jp8yfztI7Zt+J7BlUXtmQ86lQ5iO/8VNENW/oQodB0Frbu4HcSXh1k9ohxvOn9CFU2Jy29VnYpXsFXgTyqd7aITa48t8sS5vVZ2L4nUoq50rU0QH07mpdSPA7I0KYnlpmVLDG?I)?DiPkyInvXnUm1txKp2xWM0LtW9ZqIqgxWAYEb?ACjARjxRf4dVfyndymlxgxd/8Nq/5Tu4sjTeTrIu4KfPKlyZma7t9TZJhVDsNttpdlb1rpw7Dj1cnA9DE+P5FjdMzPHs27vSejkzMRqopgbZb3ObU4TSeYPqaeSV+l26pZdbdBgwyBflCl0/zW96HQmjdO1JaaF8dNb4cTThdN6ZT6f5je8e1VrF1uPLwOxJEvKac/7hKq09HPNl+bjc/rslzqPg3Xac/wC5F9K2WB8Uibj2q13x0OQ6U6MfAz/JtdyLflXD2Pm9SN1I6/C625XWxXJgldtth8r0G2y59n5m7Nlva/zvC/ON1JJ8u4HNUVMk+ylkjjzNa3K10L+hEv6rRYrDL/1bLU007oJ2UMUebKjt10kiqllTpaZkfJeyKNb8DhQ535s9szXvZupZFyuVt7fA72FouzaZYqNI25bq7VXZue6qqqvap16GHk26G2SS7ERSDjpU98pqTgZ4uBec13E.AB)AYHFfTSPc1ckmnuO0VtvpqvaTa6wlKIWOa5ujuPQayPPxUkRuM?B?lGJQApkORjjl+Sq3+S7uOvIc3FIFmoamJqpyjFYnRdTRCqI5FXpQg7gfKFlXatdq5L3sp3osdbkyeZtyezn07gd5LVd/nqb7y+BdD5M1V05Wn+8vgeikmp385hayROCGiPEEnp1hbTpG37XD8jo4XDy8X2k7yukwGo+sh+8vgdmiw6WJ7Mzo7XReK+BzZpY0RcilzWuvqdHJuqQymn6KlLkXoXsOaimtq2ObLyOKJUvpJ6nIxux2b28m/fRy2c5OKOtzlNY9azEKedlDU08l8sskj2b0aNfZtmvW+86/A6b0d7K9hS5HeyvYSRqXuNXJxKmxoboGbiFDEXoU1xeqg3uIK65awsIEihQJgQkVdm7qUyxtlkROVXX3qCNvqRc+y2sbQMVO9+3RrnO576m0HNygx+dLgVtdoWARJkMyadZMDI275X8q5u90iVxFz8tjWBhlc5jvnHO+IENoVLUJe1jcJRgWF5BxRNHuKaRWSxJFsBzPNk6CTadOg3ZQylm0FYoZGWtaTDUiq3ApqZNhA6SxzHYpL7MfYvibMXX+HS/DvQ83LKkUEkr77jVd77Ihz6mV7XojVNtNE17Fc5DpuxOb2Y/wAytcRm9lnYvifL/wDu/wCT/wDpMU/Cj/rPQeTPlpg3lJNsMPlkZU5c+xmZld77cUW3uUpWSdNbqW7OBeZD2TcRk9lnYp0qWfaxNfY82+508Pl9Hbr095opJXyPXNroZK2OOJiOYltTttcWXMCyLpqpZyntfmblMrHXTiaZF5J/2VMsVQjI0bl/OxNrnZ01Xj0mpAuiJZQexVW6KYqZfSU06ToERicuYcbMqWG?QJgYFerJ3OsnFTeBFzSD2ZrWU5jlzOXQDpgQ2fvKvN/e?BaaAENRDABDI3AQKIAUYjDjX+GTf8f1Ieeisegxtf4ZN/x/Uh5h75NhJsUTa5VyddtDm1fzqdR0qT5pes+A0dc7Cv7Wq+rioJa/Y11X6NC3ecnKJoll4Jrw4Idv8As0ghxv8AtBqcY2kNFs5JJ2UTb5rORUsmiJZM2vdqLAfJnyxo/LOPHZMLi2z6h8svLR5eUuj7JnvwdoWS+RvlJhXlRUz4RG3ZzOk2dQyRG5WPul+N0VE6Ofhcnpa1zO9VTWx9hlNdC/km/E5rMzIWMe5X5Wpve+3E3UfzTfj3kqJLSL1GDEZuTTrOrn4GqN/Jrvfmc9i8NUNMaL0odBTJBLexqjXfb1my5jibqmqGtpFxvR1yYyI0UiSGMQIAxgAC)G?ACEo?wEpEaiGIFIqNSKgRMmKxvmoJmRpvafkqKea82qf9PN9xT0WM1UlHh0k0CM2mZjd9F53InN1nO85xX6yh/Cf/UZ5qZJXZlWxY2uSnblXnMGxqPqZfuKQfHN9VJ91Tc+oxT6yi/Cd/UZpJsR9uk/Dd/ULzJvtGWbFW9CfmYnRyew7sN1I1dk3QyufX+3S/hu/qNWGyPqKVkkiNz3d6qWTRyp+xfFTtiW6KcmerWo3bcDY39icFXE5U1XVbIqppcVu4xU8cjGMds37r75cv5lqk4UO/FxTrNbTHCq7unwNiCU6kfAmNCKEiJcSASDESG?I)Y?AIQlGJRgRBQEqjIiIjUiMiczyk/wiT+ZF/8ARpSaMeZtMMk1+nH+tpVk94zBWIqqlizzRMubaJ2GCRvE6saehr1KYlgdlza9gzNPDomVOYwuaSwNn8OZ9uT9bi/Ze8lgkX8OZr9N/wCtRlVPDxLlRLpovwLmK3ocKRu+nUWOamVuglOgyMsjc3MmjuJqaYmeu3rQ2iNbUsTQZFCSESxCSDIoO4hjQYkGIY))hKMSjERUioyt7iLn2Cw7kVK3PI5yrboJWlGL/3B/2mfqQqLMQu+kflRXatXhdfWQzOn/2aj8J3gXMfmMdQxVVLGxJo8nquIPlZslY1FMfnH+xU/gu8CqWqXL8xU8fqXeBaUudJbh+RoJ4P/cGfaf8ArU5/nbvqKr8B3gacKdKyiZnRzFzO9Ztl1coXIwrlVbobpU5T4E2yLpo0sYiOa3MiXt0E0Y32W9gG5EKGeu3rQ2FaMbf1U7.iZO47kLhm0FYdy1B3KEepJHrfmEO5cMg1SZEmMB?DEox?imscrKd+q82qdZcY8Td6FJ8O9DLWyZKeR3Qi9xJiXciGF1Q/23dpBJ3677u0ybQ+c4H5SY1XNxSbztmxpHtzXjZfecqJbd14HjqeaWpu5rtE9685te1G6WPp6zO9pe0NqvtL2ni4cWxDzLzrbt2e02fqtvwv0HqKeRXwRuv8ARRV7AdNJHxUjlRTr07lyJqaDJSfNNNbeB6ygero29RhkSyqMpqU3E6y8rnYrmplTnOnzGd6XapTTqt8vMVyOW/5FiRSdC9obGS/D8xalFltYvjTcb1FiCYm63qJDNKJoBFSRFwDI50K56qOGNXSLlb1ErHMxxvojftp3KNbWMlTM6KJz05kNMeK0l/nF+6pY3E6W6cp/6qecpaeSeVI4k3u46MWFVDJW6s+C8Cs5cGIVcurWIqdS+J2o6yD217FNbHI5qOavE4bI1Y9W++x16ROQZ/8AucLnXpZ3yqqOQv?EbhkbgQc4AE5xgxZ/oEvw70NMjzn4o70KT4d6HGxh2Wkl+y7uJw/ON60OQxxy/KxY4fJqtyo1q7nNa++03tcYcWwGlx7Y+dyTs2GbLsnJ9K173RehD53hFS3bN2i6HVmYuVbGbyCe2bBpeF9uun/ABaekscjA/JqjwapfPSy1D3uYsfKOS3FF5kToO41p26hGySq6NbopnbdE1N9C3kGfHvNdiqjb6Oz495oPbUEeWFnUhz5NXKRULErBY6BURsBKwWALCGgwAYWFYkOwrhYqynNx5vobP5idynXsc3ygT0Jn8xO5RGOvb6M/q8Dm4MsjKh2zjz6b1lRLdp1oWxTTPlhc5kv0tO9Dj0M76Zztmjd5Og6VNWSuRGuRvXYicqgkY1jWOXnvw7lJoxdq7N06nSp/mmmNiLc3Q/NoB2KVtlVSY?G0qc5OlO0pkccvEqmaGphZE/de13Mi2tz6m6FVdAzeR65U3m8F95U2VVVNCxWJYpkl14p2mapTziB0bHNzac/vNMEEct8yuzarZOgpZEzzpNmq5eZVI1VOypjdE9NHIqL8TCyofma6ycTC3Cp/aj7V8DTTYVOzNvR9q+B1Y2l55+HyUoInZmo77y+B01rJXJZe45aYdL7TO1fAsbQydLO1TpAdKPBaVnMvaVbd6lMLFjja3QnYmKx1WNRjUanBClddSDlRqcdBIqW46BM1dmuVNVIbN1n6Zc3BCxLCsTa5OkSPbf1kIxsdnTSyIlusaR8qu7u2HoOxPM2/FAztsmqWUrkjc6TdTm0UFjdsmaLe911FoFi3O3L6ydAI9ll3ksnETW8nq3qQTWLsF3d61gsg7FjXNci6ppxKaiGGsj2T3c/wBFdSyKPd581uAoGObbM343TQVkE5jXtVrkuimJmGUt92STtTwNEdFAx6bzs3WhNrH582X6Sra5N6P2yuy/RtxDKhS2kgb6rUBY4mL63apc22VMpnmje565W81uPE0MRcjeF7cxHSxejUbwG?IkYpqGOVybWON/NvJcmyHI1GtRMtrIicxqsRIJG1FuNXqcdlXFG5ckzfuqv7EqWWGSduSRM2ttF8DxOP19RR1EWwfuujc5dxOKdfMeh8npdvLSyZmuzN1y8L5VueVpsdqZJY2ua2zlROfp6znNRLoemaWWESPXG5AFYkADIiJWCwxEQHYL?gHYLAIQErBYBisNEGAg?HYBg?I))YhDAjcSnmpcFpZno+RzXut6zoLrboNOHYfDSTRbJ+626NZs8vMp1I4uQ4JmsllK0iXaM4cf2U5seE0kb2vazVFumq+JQsaX0Q0NJkCVzqliEg?JgA7BYAEAWCw?BYL?AOwWABAM)B))D)OA7yoo/qan7rfEsw/yjpK6tjpYoqjaPv67URNEVen3GPBUWCqy8ns32z5vdfxK6XPN5UwyPybmZm5wWzXAdV1PBvbq6Je9/2senRi24p2CRi5k1TsLAFY5JBxFzkY1XOXmupYU1aeiTfYd3CkcrGOd0IvcpFdNSlMRpfrf/VfAugqoZ3K2J+bS9rKhiw2njdSN5Jua6rmcl7+AsLZ6XJonqr3ocaCtqnOi2iNs/oRdNPepBrnaX5zr?HbLQ))))?AY))?ABz1wmn9qTtTwJU+FwQVDZmLJu350twt0G4BFu2kXS4?AVAVVKejy+9q9xaBCX5t3URPOxHSw1OUd9k6AHl8MTlmlEfE?D1hp))))))))P:Z%iVBORw0KG;)NSUhEUg?ALw?AByC)ADMwOSz?ACe0lEQVR4Xu3csY7kMAgG4Lz/86Wkp6ZAokDy6RTfodVsTDSaxPy7/uux9a0LZpkEb20YNzNVEWYmItr/hYiYWcS8Tcw2cKv8DTPtoxCzqFfC+wGXgCchYlGvgDfp9MBd/xNsIj7otL8XHwC8x14Sq04/Yine4tRvwEvP6ypqPXp+dgneY+nbaZPwHscOh7eww+HDjoL/uJ1m4D3scPjYFw8fawDxUWjw8LErFP7TB7/z0/jYFA8fB4+Il1iQh47UwF:fvrfLPV/t0WEj+52Ev5yjWc96y/MNNrdR/EX6yRZuxb3Z/Ge10lu1/MsPm9auZXFS09iL4n3DE+tLD5vQrQsPi+U1ArjJcELAv7Og/eeAT4+cor3r2lbVPk7Sk30ODeEt3R/QcZ7YXxWbKgB47kyPis2;y3ynhP8K00frw9lcbbD8bz3fiFJ0S8jvEyCb/wioy30nhZ+Kz/Mz3CPa8S0h7hI9+AtMeOeIb3cBRswGO7UviFfwO48Au/8Au/8OhfUgu/8EkzUhqvNfELr8h4+cV477EuGvSw0sPnPaz06BHbDOJHp/UrMf6TkYVfD9RagndkvCI/vpfSeAN+9yDbn0rjPdnfEPCC+JpWS/BUGJ8PGWldfH46XBifzy1oXXw+qkOF8dE1wr2Cful4uC7epQdu7OLimBRpRfzlmkDiw1kjNRFmmjehto9DLJZNeT2P1zfG66jKbKAjDzbGCkS8Iw/zxhJAfGyLiI9aj4iPRYg3ToQeEB87EyLepQcLnyzEwIceER8VEwT/6fu0JuKDzwSA/yifWGbhIxb+y2wWm9DDJnc+UtE7HwOfXOTB/KX1o37bppq3efkDT4lpi2pYKzI)ASUVORK5CYII=%iVBORw0KG;)NSUhEUg?ANI)9C)AD94GjJ?ADQklEQVR4Xt3awW4yMQwE4P+heLq8VJ7HZ5/nOtf8DS61QIFJCt0I5kKlKM1+8tpit/3XLiEBd7cedwfYVG63kG1/WpAIt0H8PosYb8G0Cp7Bi0nJGcRHqNT8GsWrQ19L4ggijpM7ZGD2d6Rm6ya5Q5foWJI26R2qRAeTtMmliaJEf0ty01kmmSjRfhKWSRAl2k5y0QxyR248ggTLeET0RpDWu4lmh5HcAbJlCElyAPzZROi5DDuKRMq5dHsm2WQNMFg+inQvy2dStN9+EkS3q+YfcHeTKEiqTKJK2EBqgiR22Hgtq/4eJH9A4u0A3X3j4QlSehOwh4Rfk/yccaflQ+XuIc550t1nb2RBDiHpiazDCwg9Q7GzbSPR1o9EiHAOR+Rw7iHBfnffdVAtp9OpfOXxLs8cQKKbrY9wdpGjgyJtluR/QYI9SlsoUj1NkvATdx5NmjsQWSTrQFVbRtBzNIkr4w5fonoNsO+CfVu/f4yOc++fxdrtQrRk8QvAajlvsBaJX1fLKRjlfGp8SpLPipJUNOk2UAs/HZr6SJDqComzjRQmlG6qWCRVtVBPpUSdxqRYwJcRkmSYFQWpA84qihsPjdF3/aOohUgNQ5LKmRwWno8qLxkPud27qZwi/pBkeYXdLBauCp56XnVW3H9TJIMWJQm0GioqkiVJLbQYD9ckC07OhzJNMmhRmtgZHVVfSArP@TN1JmYJJkUJSlqw1eSAlfM6l2Sd6x114XEqwDDMmmRhWiKRHKWlM01IKXQY5T/Exe6+Nre6WZdVHM+tNDZmJQyRcIdUjZTSZJ+ujDO0Xk+PFLytIggyRsvBkQdkALdlz1JyoRJUV5/PlvYkASgWwCsjYcyIOUhLUmqANCicHtM21KZ8Pge9xSJtWuqlXukFt4kyTL5VI1W4hlne0WilZKkX+Rp0WZStNIzJKhv7Mc+1UbnrZCUaAHz+tcp+QVipZeUaCspW+mJiQd77pL2v+Y3vFi0/524cV60n0RqUZK0aD+J8XwNkg/+om4Pvv75newjDS5PPAPCprKVpMOPI3l7JxJmSPw4Etqnkbx9Gsnbm5Fc33XvRmpU/yf+fqQewsX/5r8bKUIiZe4A21vmP24hqdv1SRFy)AElFTkSuQmCC!