["$eXc9HashSet on duplicatesOverlapsSymmetricExceptWithtests HashSet performance","aA/AEDBrBDfEBXBWB| 6888649664VZBCBCBZC 776VCB 76VCBWBW F8ZC-","HashSet."," This is an optimized set collection. It helps eliminates duplicate strings or elements in an array. It is a set that hashes its contents.","With HashSet,"," we have a simple syntax for taking the union of elements in a set. This is performed in its constructor. More complex methods can be used on the HashSet. ","Constructor ","constructor","This program"," contains a source array that contains several duplicated strings. It eliminates duplicate strings in the array. The program calls the HashSet constructor. ","This internally calls the UnionWith method to eliminate the duplications. ToArray transforms the HashSet into a new array.","ToArray ","toarray","Notes, above example."," The input array contains six strings (four unique). The string \"cat\" is repeated three times. The HashSet constructor eliminates the non-unique elements.","Notes, continued."," The HashSet constructor receives a single parameter, which must implement the IEnumerable<string> generic interface. The constructor takes the union of elements. ","Generic Class ","generic","String Literal ","string-literal","The program displays string arrays onto the console or as single strings using the string.Join static method.","Static Method ","static","Join receives the result of the ToArray extension method, which was invoked on the HashSet instance.","Join ","string-join","Overlaps."," This method returns true or false. It tests to see if any of the HashSet's elements are contained in the IEnumerable argument's elements. Only one equal element is required. ","IEnumerable ","ienumerable","Next: ","The element 3 is in the HashSet. This means Overlaps returns true for array2, but false for array3.","SymmetricExceptWith."," HashSet has advanced set logic. SymmetricExceptWith changes HashSet so that it contains only the elements in one or the other collection\u2014not both. ","This example shows the use of the var-keyword. This simplifies the syntax of the HashSet declaration statement.","Var ","var","Dictionary."," Set logic can also be implemented by using a Dictionary instead of a HashSet. With a Dictionary you must specify a value type. This may lead to more confusing code. ","The Dictionary code will have more lines, but performance would be similar. The hash lookup loops are equivalent.","Dictionary ","dictionary","Allocations."," Using Dictionary and HashSet results in allocations on the managed heap. For small source inputs, the HashSet and Dictionary will be slower than simple nested loops. ","But: ","When the source input becomes large with thousands of elements, hashed collections are faster.","Dictionary Lookup Performance ","dictionary-time","Benchmark."," Is there any performance benefit to using HashSet instead of Dictionary? In the C# language, a Dictionary with bool values can work as a set. ","We test a HashSet(string) against a Dictionary(string, bool). We add strings as keys and see if those keys exist.","Notes, benchmark."," The Dictionary had slightly better performance in this test than did the HashSet. In most tests the Dictionary was faster. ","Dictionary StringComparer Optimization ","dictionary-stringcomparer","My guideline is that Dictionary should be used instead of HashSet in places where advanced HashSet functionality is not needed.","A summary."," HashSet can be applied to elegantly eliminate duplicates in an array. Its constructor takes a union of a collection that implements the IEnumerable generic interface."]

YBVXkVVBDBQ;VB BDBQ.LinqBbBJBAV{VYB%Y{kVYYB{Input BU that cB: three duplicate BPs.VYYkBP[] BU1 =VYY{VYYYkXcatXk,VYYYkXdogXk,VYYYkXcatXk,VYYYkXleopardXk,VYYYkXtigerXk,VYYYkXcatXkVYY};kVVYYB{B= the BU.VYYkB'BP.Join(kX,Xk, BU1));kVVYYB{Use HashSet constructorBjensure unique BPs.VYYkvar hashByBqkHashSet<BP>k(BU1);kVVYYB{CBNBjBU of BPs again.VYYkBP[] BU2Byhash.ToBS();kVVYYB{B= the BMing BU.VYYkB'BP.Join(kX,Xk, BU2));VY}V}VVkVVcat,dog,cat,leopard,tiger,catVcat,dog,leopard,tigerkVVBDBQ;VB VBJBAV{VYB%Y{VYYBz[] BU1By{ 1, 2, 3 };VYYBz[] BU2By{ 3, 4, 5 };VYYBz[] BU3By{ 9, 10, 11 }BbYYHashSet<Bz> setByBqHashSet<Bz>(BU1);VYYbool aByset.kOverlapsk(BU2);VYYbool bByset.kOverlapsk(BU3);kVVYYB{B= BMs.VYYkB'a);VYYB'b);VY}V}VVkVVTrueVFalsekVVBDBQ;VB BDBQ.LinqBbBJBAV{VYB%Y{VYYchar[] BU1By{ 'a', 'b', 'c' };VYYchar[] BU2By{ 'b', 'c', 'd' }BbYYvar hashByBqHashSet<char>(BU1);VYYhash.kSymmetricExceptWithk(BU2);kVVYYB{Ba char BU.VYYkB'hash.ToBS());VY}V}VVkVVadkVVBDBQ;VB B!VBJBAV{VYconst Bi_maxBy10000000;VYB%Y{VYYvar hByBqHashSet<BP>(BOComparer.Ordinal);VYYvar dByBqDB-<BP, bool>(BOComparer.Ordinal);VYYvar aByBqBP[] { XaX, XbX, XcX, XdX, XlongerX, XwordsX, XalsoX }BbYYvar s1ByB,.B`New();VYYBw(BiiBy0; i < _max; i++)VYY{VYYYB@ (BP sBpa)VYYY{VYYYYh.Bvs);VYYYYh.CB:(s);VYYY}VYY}VYYs1B3;VYYvar s2ByB,.B`New();VYYBw(BiiBy0; i < _max; i++)VYY{VYYYB@ (BP sBpa)VYYY{VYYYYd[s]Bytrue;VYYYYd.CB:Key(s);VYYY}VYY}VYYs2B3;VYYB'h.B]);VYYB'd.B])BbYYB'(B0(s1.B# * 1000000) /VYYY_max).ToBO(X0.00 nsX));VYYB'(B0(s2.B# * 1000000) /VYYY_max).ToBO(X0.00 nsX));VYYB5.Bu();VY}V}VVkResultskVV7V7Vk529.99 nskYHashSetVk517.05 nskYDB-k

%iVBORw0KG;)NSUhEUg?ANI)/CAM?ACinWYs)YFBMVEVEYcv:/9EjMuhuuGEsNvG2e1YltCtyOT0+fyE29l1qdf+:9Ey8nY5PJadNF1idhindLr8/ni6/WEldvY8vHw9Pv+/v/Hz+9Z0c902NfG7+5d0tDY3PLH8O9Xz8636Of0Bsv2?AB+UlEQVR4Xu3bWY7cMAxFUT1q9DzW2EP2v8sg+iBipxtoS0ZcFnR3cH5IV4ESACqtDG3NKF1hXfVR3Out3YuPCquut6kVW2un2xW?C4lhVVesMw96rAeDosunQiruwACl55C64el6K0O7W1YiFoRWjtAVCWFV1bgUD3q8B4VuGsnwuuuQlNMGhyedUxPcDcR000oikmBQxFFKsBNUaRJGIrJgMM9inQH10aRWkFxgUMdFzgR126kTMqkTMqkTMqkTMokZa1UCZFKDZ/TPZFt/iRDSPOXbSbJ92/qfkyy4Jwk+GwICV+2nYRvmn5K0vg7mQDJYtn5ScYlR5KsaKSSTRiJm+GbPaCIIHkrfHgXYtpC4tkwsjAZUkM+nQyJFWo/0mfh++8kCW6Qhqi3PhVN4gJX7YLU8ardPPG0NMSFk9zs+xVG4pjEhe0lrWJJ3HwQiTRWNersJLJYZ89Ool5jlT4viVF2xCJ52MSLJylfSdRL7cCNJybBN3iAkYyC2W3VHkSCWk8KtdsH0VE@/3eHZlUnp4EuEY3DhwlQFqmD/oJuPawKp6kTk8a/1lLpydZ04CDk5QAiUiO8GHQhs5KWtdLa60sE/6bP5MyKZMyKZMyKZMyaceryc8XuZpM8LY1wQvkBO/Eo675zSte86f45uIlXsY8d30Z8xtW/OAJtxR+1Q)BJRU5Er@ggg==$/9j/2wBD?cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwf/wQARCAC?PMDACI?RE?hEA/8QAOw?AwEBAQEB)))?ECAwQFBggQAQADAQE?gM?wE))BAhEDEiFhBBNBFDFRYv/a?wD?AB?I?D8A/SI?AIAGQ0tBmNTNkTYhjTSmzObJmwXjX0n0ym5e4PDxt6Hpz+1exgx0ejiXPFlRYYWN9PWMWaaRYo0wo0))))?AgUyDPSmUzZnNiVENJsibM5sztc4hUQ2myJuwm7K1/tpFTx0TdE3c1usMbdftUUVjrm/wBpm7hnsn9zSOR49D9hxf7eb+2F16fYmhY9GLta3edXo3rdnNUy74s0rLjrd00llaEumFMay1hMSiTAIyMENLQAWgaZgtGjQoEDIw?UomTmWVpJcQUyytcXs572aVhcQq12Frsr3c1+mN60XEOi3X7c9+zlv1+3Ffv9uivEO+/f7YW/Ij/AK8u/wCTn9clvyft0V4FNoh7NvyPsv3/AG8T/Imf9SqvaZVPHE+4e1Hb7bV6PGr0dVLsbVxXqJevS7ppd5lLOyk647zCZelzs66WcHN1Vs5L2RLsrZtFnDF2lbsvSYdmwXphFz9H7VjbRrPR6L0eNNDP0NP0MaaNRqtPSxRpNaTABkizKW0xpTUmkS5LxLlvEvSmjC/PWlbKiXj9Nhw9LTD2unGf+PL7cZ+XXytDSJeT1vjze3WYel25z8vMvxtefp6PLwz62yHFa9rz9CtJl2x+PMfxrTh8/wCmlu0RHw8+/adctOUy6acJdnPh9O2nH6cPX8jDraZedXh9OinHHo14rjk4r/k/+nRXXLSkw7aVVXnjelMcd++t4hdPhr6REDJck3VNVepXW0soquIlHtHlvWzWLOerWJP2cVbehrKJOJVFl4109ZqhrEjFxK4nWS4VEomGkHCFw0hEmAFpMEZgFMRJgBjfnEuLrwiYn4emm1dOLTC4s+Z7fjfTk/xM/j6a/GJc1+MOmv5E5jPr8w+cv+Pn8Z14/L3L8fplHH6XPb4cX6vlx05OunNtXnn8bRRw9rurlRjFIPw28njitaXXFWPlUQvDZzMtIgsPDw2cmWHgwyGA9SAMaRKqs4aVaVDRaIW3hnIXVKoaQiVfxcI/i4aQgwAYBaZTCkjTiU4ICl6CGmkTGsb0bCSDhtziUTziHbNYT4E2keYcfg/DpmiZqwt8rhy+UzDpmqZoymrSJc+DG3g/CZqcSxiFeWsUV4R5XrLynG/gpqXgemODGvksT5PUxCoGKrDSsCZVCyhUQ3hlJxC4KIXjSIRMg4JS0gGFYkEYMEDBAgYAI?FgwzGBMwzmrYsTNVRLGap8N8LynyesfA8NsGF4P0yih+WuAeIL0y8lNWxYJoPTCal5bTUvKJoqLMPKsaeTioiqvSIhcQcQpcVRMgxhrSDgYFJAMGQI?ADQYBaNLQYLT?Mj?BAgZ?AkgwAoAj.QMBSTMDAWA8PFYnSwwZgjAB?AP/9k=%iVBORw0KG;)NSUhEUg?AMg)9C)ADNbHno?ADxUlEQVR4XtWasYrjMBCG70nnCfQEegCXW6kMuEhnDrZyswRcpJlAGhcuVQU3KQxuDIaA7rRaZ+aId1bcLor8Nd5u9EX6pdHavy7ogUDjGOjZQcCJXBENLFQulqltjAGCRsCIHODPiMyIGha0i8OWQGQi4s5HICYXwW?MhSxFRBthEerIEuR3gBRuy/pAXITuYXYho;8BRfp1zlJzKER9AtyVpi3JHAS13Xr5668diniXQhI8GgDQ/rBG72fFgs1GlyAilFZnSeBjy65+XWmVs6c/TgXC4iI07+YcIy6QrwGEGkQ0QFgd7lI2LxShHZY/VVSHpEPNLulo9Ih5YiUi9j7MUJeaUJyUcEsbtHBBBbOSSh+J5yl43IhOjTXoJHI9ogUooiu6xEaMmPzoX07hDPIfVqcyIWES9Lw1Eh4lvwHrYm0iKiXSJyoB3ptDGRm3dtPyKiEO9przYmMqJn1uAp3kXC33pDIlTkIyIlN5+2JdIhUi4a9NRBpBVEqvxEzsgGZrlVHXGy22xEZuSxmNDTgXi5upIrVNmIXJFvVB/zU0ghCVOic+p+qUaz1AiJ2cvr5tbRfUT1GYhQ1n8vI79Q2qW+8dodYKHqf0xkvHjYBbp+awI7j5ZEkK8l50aeduMEKvgXZapPL72RA/wV5EBmXSSk+0zpRp43JzAoeKQaBHUQ+LZIj54D7bchJC8Rm+sJVlCnJ4lYfoqc7rl8FUIim8DpCSI0AbSVDjzt5f/8z7RNL7IWiRvfjpWTmZoVFTU9QWTkETFsjnTscdc2RguvFeJEvnmOPCaCUmMoNVHMeNgrCOgnHIiWR6RlPUsV3UpR2I6LSZ9epOUVBtZF1vTjxnFhLXGTXOTGB6243JHk4hhYssrkIgMtIypvedPSukhGliyTXORCwaYCPbevXSQ3VkklFSEUfE7hYhEqJRLpQWLajkgDEnY7IiVINNsR0SBhNiMygMwWRC6eGgL1X5rAfuehkOQuMuLKIUZ1FdXNXKTnDXvtiIG3kmX+IpbdRaB9aMFKOqYjmJmITidC3WG11h12KLy4FXqt4im91swt9WPh40rhyJfvaUUG/LTzvvL0VC4GSxMCp4Qi8s8+8/1MuxjOVAemtCIdj4hdic8O4i9XVzwU9GVnWhH0mHVJS2l/XCnjO3X9dmjuGAV3hrQiE78IFqtHjPjhjNBmphSRxypbyiKlSysirx535utuiheBckotIufZ8k+A2mgRRdVTidx4RNR66QOVjhLRzeSSi4xc3nzyAkixkMgi2lRN/91Xb38AHaHDzqTpdbk)ASUVORK5CYII=%iVBORw0KG;)NSUhEUg?ANY)3CAM?ABHJUQ7)MFBMVEX::7/f7y/f+38v:6en/1dX/tbX/xcXl+v/U9:G9f:qKiq8P+U7P+e7v:lJQSDb6d?AEaklEQVR4Xt2Z27KiMBBF050bN/X:3aQiBvZoeMZHoYz+8myKYtFeuWCDomfcY30n3EXTXh8xtnp7p+5KlbcYYXGYE1rCpZeFCvtsBpdOPiSFe6qXfjYJTWwlgBt+AVqteXSfgnQ/MXVSl/Jpd2Svu/6oUQvrVZ24zdy6RrXlUHrr4mFMcosV2Pc+jnXxArAioZcRj/qldUaPwjtSEzPi0RnMFWpFrcJIea0qpvyZ1GEfn77laieU8tZcm2IQ17ZRVXFKurzi1VZZAzLWEu56G13XN0VPO3ktNvZ628lvUP6W4mHWkBhuRgrJDA4ETGLQusHCERFSgvDafwknvaMNXRbrAEIhDqwWo7lYiw8+tAsLsyMheF8Um3Jq90hM5ZXh3QvhLtDbq90rJYpV+3G7KKNlYo2i5nCToO0YA0OkZVBifRWUYvkOoFFHVoFL/bBbzgNtQrWpIZctlok11ksfWGllOKcMCfDrtdw7SBKALpiddX5gUFZLVMuaqK43LlRLB22T6xgQS5Wa8XqDbkMtYjSwsrhxaNyUFzXNEcZ0fUL+o6C1HK6YEGuDYU21aKeJCwwoaAq9aKUHQgNF83m1HN0UcHy1so12GoBMx1hZdnte7mI/WLXMRY8qn9JU9dCBayaXJOhli1XvTu103pxhlqwXBurIpeQWndgcdMJmpLVYs42lhxhPY8sNSzMhcn4eVILWDRF0BRCallyHeCWNuPi8AywQsRed4dFcrFaHlgkV0stksvAkjaW908sLVv68cFJhnGkFrBYLlstastjLEFBD7A8sIzdU02uulo7LIVchlqP9M5IpIyl2j3dKfaohSVExVgsV9gYr1Usd3/LBbUmqHWcaGAtFs/xQ3+ANc1Y5XXA2MJiufLGeJ2pgFWRC2oNEOY4+RjrSdXCWmtxA7LsC2HRoVxQq2BNwCK5DLU4LBe1+3T/Civtl2rCIrnkozOKWpjlSK6KWlZCC+tuN2FRawQFY9XlglqMxXKxWtnEiuexeAlhLJZrq5bTwQOrJtdeLdg8pm1ILsIqE6EvC66FxSXG4pVlhKkL1gQslmt6q9XZG6XMcrE+iJzDYrneH2TFmqlWLJbr/UH2agk9NiI4jZVbWLDw47F2dSzMf/5IrfHgsUULCzFmQlmVQS0kPiOw6VCr9wXr7hBsBBFWKxvn13NYur3ZGGJODyRL+0/RdXJ63raQXIipFst1HiuaSwjLhQh2TrhxlqupFst1AgsLl43FcsE9wiK5EG+oRXKdwPpiuIIhF3ZOwLLk6ltqASH/Pdb9NVzmoh8suXAoYSyWC8X0CtuSUwmwrKudVIoz07C+ognb7hpzCKmOJTgY4bzfa+dvVSzxc96d6P5BQiyPKYZCEmLkR8TLmqis/8L7OeoQ3slfO5m8NjNArSuHNbVzx6HkwuG38XYUr9IuHajF+cVqpZ+p5f9PtW7/pVrdL1EL5/2vgvP+tTP+TK3pd6gVfqaWXlwtfk1jhl/TXDsxlcQvsXxJ75A/ZMHNEnLfXgI)ASUVORK5CYII=%iVBORw0KG;)NSUhEUg?AKo?ABvCAM?ABLjau3)GFBMVEX::x/fD4/vjp++eo6aHh+t7Z+NaD4XmmP1hX?ADzElEQVR4Xu3a247CMAwEUM/40v:41WXCIJTQulFDRLzask6dlewrpBH+BTZk7O72lRHru86PvVH/VF/1B/1R/1Rf9Qf9fsDgCUERu2aqTiFisGpPyo:Kvirq77qfKeijCz6RazCO7pmkMPu7fGritAY2qSena6doo2F8Jy581Ut2k5hr3USRBLjX0TlTU0J/ZSrdP4U6pO3Rg2U/uxj6n+tifOoU6xipql/eAc6qQfUbGmpZ1EtT51U9s4hzrpB9RY2RPnUO0D6uqe51AnrqbGAmpOa8U51Njc1Jwyh9FUdlHNIsIjmoqtpWpnxmzdSi3zl/hWajTS11bvU7duZy3V2gkfb/eZ5thLJbmwHl1FzRj9h2IOydzUdlFZ0tlAl6rZQqJkoekOKonHBmwLNfJ8BKBzgLapbqTmDcQWap6PLNJiTfWN1LwBT89yAxVSpMVKiUOoaQOi+6ksLd29UP0warUAYjM1t/Q5t6Zp/s3U+mGR3EJNEgJF6remOIaaH9ax1LLWA6n+XVQ/mKpzStORqWApEcduFSBJ4DAqqyKPo1ZtuY+aW5Yc9gnwnE3UXGJuqqNSKSlHfbHm7KfqmNQ+Zdnj41DtDRVXUrVPxZQ8F1LZ3KS9pfNSar5Ye4PEtdRP3gPotdTO2xVaqvFSKhqPBfO+S+Jq6gdvAolLqWmtnRhxNTVWUoFrqbp6rcGrqQpg7ePXy6n0FVIAei0V66ymHIGqANX6UvxLlZdS/WZFzxrEv9QvpdJv1s5iDSxSlyup4ncrNVqtRYHOUr2WqjerAgCZfrviIHGXOqQO6qhIr5ijqNOZoQ68WAv26RdBRAV1Z/PhUaKaNLmYo3W5oqJHpfsztq4VZ5F62sxTpF/slteeeuoVdubyAdUa6uhoXLrFHH9Bte4BjfBnbHk2D0VJsJ3xMYp0izlelx9UTF2qeIRnbWa6R2ijqdMv5ngdfXUgIVMREeH9RETwbGqWGiVHY84baEDOpkZzIEkTj3ipvdcWJ3yM0i/mRF3WfHSWKFoqo0pWZmkesKRfbKm5tzZSI2TR2o/zZGpMTRSQhdD7UpFTqWrLB5IsRjtSyMnUeHEgyXL4CqsiZ1PFlg8keRWqR45D5Hyq+PLZIZ0Qevd6uqVOjT1L+S9VGTFaS6NIh6PmtZqyHEiDUlGttEgdMvJarTrlnINSOUP16UKSURM3aDqQxkw+PDC+NB1Iw4Xqng+kMYP28O.ULbQgAwZRIaGyqC58TwdMUOGzdkxbrzz3/zIa4UMHU3X8cBhWun4a1X5hsxQyldEvwH6Bz+nryhZR9a7)AElFTkSuQmCC%iVBORw0KG;)NSUhEUg?ANI?ABFCAM)IJEiL)GFBMVEUAru+g2Pf:/8xt/BpxvPS6/vp9f0TtPCISbH1?ADCklEQVR4Xu2bwY7CMAxEPWM7/P8fr9baaNSG0lIQK6q8U2vhxk9ODD1gJBE3uwS3AEkjwy5EkCajqzgZ7GLAwi5G2M2uxceEJpPJZDKZTCYTzzCBsH8kAMCeA0OOJykNkLDP4iZAMu05UjkyYnMZveyEX3QJf9iVJN6npIC6FNTtWfSI/aeRfLsSpCAnup0nyF4nPqwkAwwV5ctKrS9G4qNKPtT/+nEK9t44/0EJ2mUiFTyr1EoEdSGlQGYi+t0vpRSFS6k+CZgwh5K1FJCJRkrJ7zYk7kQdiCeUUIskCSlFY8EWmiJCpy89WaRLiEruoLEjJfRNLxTesxRjdpB0r4ueB4p4rJTrQj0poHXuKG0UGsOcapXnh5WcJEDSajnNQWQJ+LaSUBG5Dsooc6EUW3W2laqziMNKlqVElFJ/ZLoavjkeCrhBn0OPRbm11VdeSknjZXfnPa0EsjUyuhLU5bp8rFQRnfqm5HIKXayVsmeLjfZBzT2mFCyslLSUtvUjJSwqVV810BRbKSkslBirOuHHvyb+Th/qLvtSUewqtVWl6rB6V7EYlRReo4TnycWaySqRgntKeU/JTNGm2FElzYfzSlFr9p7FaSVdKMozSvmykpPE+5TaQqmbfXbjWWoy6XCKUxtPUXxUqWmBrqTSTyvFYuItYu3cxItM2DE4KLk2zxmloLwxDnFQOUpaUwnjC8dZpdh+gMrZVjL2ZL2gVreaV4aUtCHF+GD1lvQTStCrE5kIiwio41nh3yjivpKqBiA5/IWS42+8ODLDWeC8Uq0lIGPFNpU82VFMAbnrYO3+HlJ393GSGJUMg1KRO0qDU7oVUJ5yNDfExhnzPKwUoxJWr3HMUAL2lAq0ITNaTxveanPndUmxtBeJACL8bvRQri9DgNIetcm1HYdp+w3kOMmgkHBW8BsInbhHX0Ge39EkGeRDI0DD4YucfLgTLOD2VU7QTRkNSgj7JkAogMHIIsK+DSwEZPR+JpPJZDKZTG7XEwq7GG6wi4Er/n+J7VJO0Wgk4Vf5L6CD5A+G4BPe8Jfzjg)BJRU5Er@ggg==!A$/9j/2wCE?gGBgYGBggGBggMCAcIDA4KCAgKDhANDQ4NDRARDA4NDQ4MEQ8SExQTEg8YGBoaGBgjIiIiIycnJycnJycnJycB.gI.oJCw@Cw4LDQsOEQ4ODg4REw0NDg0NExgRDw8PDxEYFhcUFBQXFhoaGBgaGiEhICEhJycnJycnJycnJ:BABEIAIwA0gMAIgABEQECEQH/xACG?ABBQEBAQ)))?AQIDBAUGBwgQ?EDAwEFBAYFCgUFAQ)I?QMEERIFBhMhIjEUQVFhByMyUnGBFUKRobEkMzRDYnJzgrLBFlODkrMlJjU30eER?ICAQQBAwQBBQ))ABAhEDBBIhMRNBUWEicYGRBSMyQlKx/9oADAM?AEBAgEAPwD3hNdk5I9kAREKhIHVl2b3lEYh77poqRVKN7pu681M4Rf5j/3TWGnt+cIU1yF2ob2Y/F0dlPxdITxA3LM5fBN3w/WInH48UlyF2xHtSvw4v9qnGDFrMowejvym+Xg7upWKn4c7u/mjdIHGI8Y2v1UuLeKjAo/FSXZPVjXQWZOHqkulThCS6LpjOi6AH3SZJl03JAEuSMlBmhjSWLRZZ0qhElIzoEHoSJUoAhCEACEIQBAmunOmugCI1XkurBquZJAKx3UXHxUxFxUefHuQIRcbpe5Sbz4JXkfy+xLfwJXyRM7M91ajMS+P;xl82+xOyjSWFfJaBWBJlRAm8VYBKCLLJ11EKezoFHXQ7pLpHdAojuoyJKTqE3TRUDmgTULunCm2OotASnF1WBWATkNZKycmsnJwgIQh?hCEAQEo3Uh9FARIAaarH8VJNNHGBHIYgAtzEb2ZmbvVYKiGoiGenlCaI25TjJiSCDSFMsnZJqSwESYuly8k8SjtzO/wBl0NhRHg6cwun5Bfg72807k7nuk3BtAGe/RWAd1AJMpRNku4KLIp+SgEx807NvFLYpNdI5KPNvFNzQFDiJQkgiTHTGx6QikBkwWViMUICUBU4smgKlZk8aKyVCEogIQh?hCEAVpuiquanrb4rgPSJq1VpemUBU0xwb+sjikKN8ScHYuCEt0lFeoPhN+xJti9TJWNEAtuCopRMH75HdsLMuS9HVFW0+1DSlC8cXYpAPjyMWQ28rrldR1asmrSOWtklmB3EZik6Nfh8kBquoHVNCVUfsMWUZOLO7/WuK0Fpn49hn5NS1NeyPfHd/BMz8l5FstWV57T6YHbZSDKXfRGZGJ8j8MXdest38FQzYnjltLeLLvjY/Jk5iBR8OCOCi4JSXJk5ndQod38UgqJ+N+ieJPx5WVZpHsnb7G5F0s6TkdwWmNreyyXPyWDs7Va3UUBlroCFYM0mGGPGHL1b8r+C12kS2G1FjNJkos0t0WFD0IFk/FAooK1GKiAVZBk5IayQWT2SMnJ40EIQgAQhCABCEIAp1/sCvHPS5XzxSaHQ4juCmeoIrXPIOTH4cy9i1F33Y/NeH+mEi+kdAxfntJw/mHinaf6tREdOP9CX2Z5/PUCdQZ7lgDJ/VXfm49/xU3aSPUIt0zRZAI7ofZazdFTnk9dlJI2WXErf2VoyAayP692Gx2td/FbldmLOr69Do9JrJKbUqSaBxCaKoiACtlfekwHl8nXt8jNk68EgIoqtsS5t9D7LcRLJsXXqugbUBq2qahoczEVXQM0g1RW9cP1uXucX4LI/kITU9/8AjRe0Dg043zdo6PJOuP;8nSZFZZm81ViTJeCFBd07IrfgjcxfCiS7WIu4RcvkzLxvWfSrVazplTpEGlPRdsZ4Tqmmzdo3fmxHFuJMvUdf1iDQdErtYqIjmipo+eKK2T5vhw/3L5tiJrgVn5i+y73V/RYvJcpLoqamXji6q30dLpQlpVfDW0hzb2mkA4hKUrcv1D7nZ16ZTekeOQvyrS5YuLZlFIJ/PHgvMwc8uZ+HR/G60KYSs/FunjxWhk0@Lr9GZj1uTcrpnrel7U6ZqMpx3OnxbISnZhYm8PiughKOYWOI2kD3he68k0QZJHbJm6r0/QBfs5R/UF7/N+qzc2Dxvs0cWVTXszVAE/FPBmsn4qNIe2ACpxZMFSsychByVIlSiAhCEACEIQAIQhAHA7cahqvaXpIDKlp4wGSCaN+c5OL/DFuHBeSbQz6rrMNLNqVfHXVdPLgEgiIYhfmDl717F6Q6RpIqGoF3ExNw693DqvItTphGIsYg/TN5wfhw81f0uPjeUtTn2y8ZkfRtN2OaedoyqbmQTiXq291i/us+WKo7THPyHGMTScj9RFuorZCBh0qois3M8pdbh8LrPj5WHlD9Bl7+LcPq+Kurgpt2WaCc5GGsyAcDAwzfhy9LrV2crm07aqh1He.VMxRTYPy4z8tr+T8Vz1IQ/RcZBYiBhVeqqjj3BRO0RcS8ne/cky41kxuPXAuBzjkuPFM971zX9I2biCfWqtqaKU3jiszmREzfsceiSDX9IrNKk1qkrRqKCKM5ZDjvkwxtz8ni3gvnuoOepN5p5CkM3yN5CcuZOoqmroIZoqWc4hlZxPB+DiXtN8+9Zz/jI/wC1mstc0uj3D/G+i/QFVtFAM0tNRkAHA44SkUlsLN4Pdcc3pI1iSnm7LEFPVzVDyb2T1kccNuSIR8fF1wxalVS0g0khNuRt7Hfbpn42VKWskx3YcvFi+xSY9Bhi7n9QzJrcjTUHTfr2d/r23lVq2y9doepUTFUVAiPb4C5LibFzx9W6Lz8MRIPJ2a6sTVByU3Mz91/NVGfiDl4srWPDHHxDi+Snly5Jpb3dHQxGXFuv4K3Qi+8bv49/VUYpBszd3RbOlxiUwlazKadJFWElfR2ez9K5xiZMu+0+LABYfuXLaEMYRCHHxvZdpRi2LLJzuzUwcGjC3IpLIjbkZPsq5ODMnskZOZ?yVDIQAIQh?hCEACEIQBzW2kLTadBw5t8P4OvH9WpS5vVAP5W/Llblt1+K9r2m/QA4frB/uvJ9bpmxl9WxflDmI363+sr+kl9P5M/WJb/ukcsMTlpdQG7H9Zy36+d1QGmYt1lGPJRSd/Hp0Zb0dN/wBKqN3Gw5bxsL+Kgp6LlH1Xs0hc1+n7Kt7qKqjf7MGmpS+jm5WL2fJQzaZJO8W5FsQZ+/8ABdFT6flQlycMh8u5EdFNvACPGNuPtcbJ29NJD4xmm692czNQSROOY+01+Hh5qvJC49y6up0+aI2ydjy93iyoy0R34gzv0+ChbptFmKbSbMKKnmmkwjH+VuCs02i9o1GKjrqmOgAvakku7Wbu5e9+5XW08x8fkgtOPz+fFMb+RdpDq+lwwX7G/qBfEd4TZm3cVlkjTFmL24LcDTSv0eysNphWbgpYzQyUWlRUp43J+Nvgy6TR4HkljDv8+iqQadjbgui0yiLMX7/HvTsk00QLGk+TsdJpnBhbh4LrqaNhFlzekAVmyLL49y6enbosvKaGHpF4W5WSoZuCWyhJwZOSWSoAVCEIAEIQgAQhCABCEIAyNoxy05/3x/FeYaxE1yDdtlvHfr969T17/wAcX7w/ivLtVjDfNkP1nLG6uaV0n9ylq420zJjh3mnzCcXvct+vHxVmhoWyjyF7FC4eOPxTqZoOzSw2fmvkPfZ/dV6q3NNolZWUpyBPBSzFD05TCMiEvtUuSZHiguiSn0KPcYSk27uz9ONlLLs5CWO6NhD3SZ3dczS1O2QbJx7XhqwVEAO5S6fLAHEBmeD27Xfx7v8A76fpjw6rplFqMYOI1UEc+Nr47wGLF/h0ULyFhQOaotDGnMj5TzG3Tosuv0ceTka/Nk7N14rpdtXl0rZ86uGrfTsZIx7Vut7wJ+mFu/op2oTKmhkNnPMBLO1r3ZkeUcoepwzaP+ylLRv2V1eozafo1Geoaie6p47c1nJ3d39kW4u7uoNE1PTNoglPTxl9SwZ76Nw4SZYuPc98X6I8gtHPQ6M2TcqtfQr29ldb2SKnhknkF8IgIyxbjytlwXN7E7UQ7SyVFJXR7uqGQ9xuIj3bwiw+2RkTZ3fojyPsHFDI9I4tyrWpdPcLcPuXSNp8OXIxY/BYGhSyVO0+t0HbnqApMMaLc4bj/Utz5Ieaxnh+Deooo7NiDs62oAe7cFDDTeSxK30gbMaVXTUFTPIUlKQhVyRRHJFCRPwGQxazPf;JPc/clikvg61KmxSxTxBPCbSRSixxyC/KQk3KTP4WVPWNXodCoJNS1EnCmiccyEXJ+cmBuHxdRkheSrnNN252d1Wvh06lnk39QLnT72I4wk6+wRt+y/2cF0aGmuwBCw9e2t0bZ2WCmrzkOrqWcoKWnjKWUh97EU/Z/ajSdpgqD0ozLspNHOMkZRuJFfhzJfwBsoQuX0v0gbMaxqMWk0NSR100ksIQFGQ8YQKUyfuxsL2fvdJyB1CELDi2t0WWLWJt4YjoJGOpZAWQYMXst9ZuR7W6ooDcQsSm2p0+rp4auniqDhnAZYj3drgbMQv172dCUDVqqWCtheCoHKMvksCfYTZ6e/qpBy64ynf73ddKhLGco/2v9DXGMu0mciPo70ESbmn8vWf/ij2j2Z0qg2W1uWnjLOPT6v2if8AyT4rs@fJP3YLHH2Pn6g2m0+o9HEWx2mwT1m0FRnF2eKIiEWOqKbL/Z4d69t2f0t9K0PTdNltvaSmhhlt0cwBhJ2+a1EJJS/7YqicD6YBb/A9V/Gg/5GXZadGH0fScG/Mx/0K4hIFHnXph0+WXZulq4IN9DQ1sVRWRiP6lhkAi+DZNf4rpNmtp9nNqo5/oR952Vo98JxFHhvGLEeb9x10KQQAOUBYR8msyXcFeojRh7rfYvLfRPqFHR1GtbN1ZPFqxV89R2XA/zQiA5ZY4L1RJZuJWb+6RPhr3ChGAfBl51sf/7J2z/0PwXo6EJ9/IV0Fl4i+q0uz2nbZ7MatHL9ManVVB6fFujPtAz/AJow/qXtySzXbh80J0DVmPsnR1On7M6TRVouFTDSxBKHulj7H8vRYnpVL/siv/fg/wCYF2iEJ8/kK4PLdZLDXfR1/DH+mHgvUkIR7AjzHaLUqbZv0m0mtayxhp02nvDBUDGUjb25cnJk+Xw8U70S1HaqraqpwOLfag8m7lbExyeQsTHuLxZeluzeHn82Spd3AVyC8x9DtLS9l1ut3Idq+kZYt/j6zDEXwz8ObovT@A9QXh23tRLou0e0ukUzPvNqaaiKm/f3owkP8zbxe4rgtun7RtXsTpkv6NJWTVR/wASmGMovvJ7pYBLo7S;oaChpqGIW3dLFHAFm4YxiwN9yFZQmin/9k=%iVBORw0KG;)NSUhEUg?AMg?ABJCAM?ABPapnR)MFBMVEX::9amn+z879o6Lx:rj:T/MTH95OP/9PT8ubj/?Dj0cTR/+3b6drx9O/W9ORYTpHN?AEfklEQVR4XtWa23KzOgyF0cFHkvT933Y3wa4QQYPr/RPqdUenhnwjLUUSmYYRs6tinqaQiACAvoVhIAp3q3KOHwmyFsQhMITi5pgf5PNWfoho3ETMHARDBGNxOGZOeU+kAqgOMLyFD4jC3+TIuAZRAWT2u+iewkUcjr8vJa+Alg+PSAQ52iCPbIniBT53yyVUjHDALiCYTflwFQcpSyiZFqH8F0g0R/TCcQjinOOV16HKX0HiKocKCDTB18sC/yVOCwk+XberZ/Vnwt+AxGIHd1vfLIDUuw+IdUBQAtJxSNstVhL6oNVZZ1bqSUcqkSqhkkLuPwhSL4ttYzu9HEKpZpowf84iTmc7TD1ej9IjsMq5HKTDdq5Uu+fTEgG8qh2lWAF4Ub0MiPM832/O8XL9OuLLiSOL0K9AgiSQAYI7cwJv5gTAdbSdThFauqdJnaF4nO19XrdB3hs69HkrCG8pwuwrCDMjGF2Dne19XhcQjZjf5p0AeUc+bUCYudzb7fYPEA+yferyugnij8MhoZN7O2YuaTszP4RDRKd43W4TCkd9VFJjCxHIdeQfEHeTdhT5sR/DeIrXBUTHitSYIBwwF+ZINURUQJ4cTkCkkgPGZ7mrIU1lU+LcnVYq1EAbpQ6vC2K+qz9XDj+r707d5jxju/JF5YC707cmSdfcIGrxup1ZBVzTwdf+V04J3eKmAgA1VYx7C/KBsMXrZvFNe2MCGN3qvC4L9ebelxAKSNq.AtIaPG6NdnAbpTibu3TIOWvRf6+sbOA6LWBLd/mdVcDonvfec82YToGkTgJogkScoPgf/Xwu3XsfabxqjDUI8JB+4/ll9zta/4WFtWn4Eahxes3xZF8Vk7X1D5ajbLXHCFXgfHYg2y3ZaeEcEiZz/BlPJ61oZLEbw2I0laZg5M9sTbOxsyq2ixCTFTQhGP7hBzZ6c9bj/iwCaz0Im7RDwi8FHrHXL2bOzIZPKw0lAobkMTRSQDVZOa7utj2veTBFypJAXDrFbGHH3njAOtlYersYv/Jbo5CiZ6E76DKp7cSAMcB6e/hNQjYGPptxWE7BGGzLZTqSyfM6y17eA8pKmjVDpmLe3swizZDfw+vsz5ssl5eN7aDeCDsWHueM68frYgdiwlpLcTYuWU7a15vX8eG9i3bwYET5vWmJ6h1XfsB/8ndXBdIf96et5vrAGl37RVe7wexvY7Xet12YejYqF/odfu/U6NrJx3uxlPhBK8b8YMO117rdVmr6OkpjeR14RaSKFv0Tte2nwr/lt7pgY9WrzbYKQikYLn2Qq+L9JYqeOl25zsv5sTy3gqNbvyDXu/9vY4WfsLr/fTtIwn2e91umPvp+0nwb3pdxBoFwQL5q163UchvIYBSOMHrZ/8Q97XMInhKZkRLnV4fTLbXB5M9HI8lu/kbTHYdHU66vY5+zMyyB57BZM87Y8j+oe+YAZF+geWt10gOcYvqUpleAul6aCxfGO/XB+CwRrUBODrmG4/TmCDTBGsMiqM1V1J1vVDgNJSYy0yzCJGIEH8H8R86J7+C+8H8W)ABJRU5Er@ggg==$/9j/2wCE?gGBgYGBggGBggMCAcIDA4KCAgKDhANDQ4NDRARDA4NDQ4MEQ8SExQTEg8YGBoaGBgjIiIiIycnJycnJycnJycB.gI.oJCw@Cw4LDQsOEQ4ODg4REw0NDg0NExgRDw8PDxEYFhcUFBQXFhoaGBgaGiEhICEhJycnJycnJycnJ:BABEIAKIAyAMAIgABEQECEQH/xABp?ADAQADAQE)))?QIDBAYIBwUQ?ICAgECAwYEBAc))BAgMEEQUGEhMhQQcUIjEyUSNSYXEVM4GRJGJjkqGx0REBAQEB?EF)))?ERAhIhMTJBYf/a?wD?ABAQIBAD8A+/gAgADYti2B4exbFsnYjxew2ZgB402GzMYDGmxmeytjLFDJ2MCM?C))))?CExslgcDZLYNk7EqQNktibJbBWK2LZDYtiVjUaZl3DQFY22NMy2UmNFaJlbMtj2NFrTYzM8/wDtF9rvOW8hlcHwHicXjY05U3ZEouGVZKL+L6vOqP218X6r5DwnoNzjFrukvi8opv5v9BniS+efm9+dkyuyPPVmTY5T/wB05f8Ap2no/wBpHUXSmbVL3q3M43aWRgXTc49n+l3v4JJfJr+uwwPWYbOLhZlHIYePnYsu/Hyq4XUz+8LIqcf+GcjYDVgTsYgY?G?ACWSxshiVCbIbG2Q2C4TZLYNmbYlyG5BshsWxLxpsrZjspMcT1GyY9maY0yox6a7Hsz2BcjLqtDqXUvs66b6q5PE5XkaZRvx5Lx/Cfb7xXr4a7v2+689eX7dq2TZZ4dc7NfRFy/sh4z8nTOtes+muhuIfFeBTbk2UuvE4eqMezs12/ix+UK/wDv09deYKKLsm6vHx65W3WyUKqoJylKUn9MdfNs25Lkcvls/I5LPsduVlWSttm235yfp9kvkl6I9DeynoXh+I4bB6isgsnls6mN8cia/kwtj/Lqj9+36pfN/sL3afGO8dL8ddw/TnFcXkv8fExaabvt3wgu7X6J+R+wZbK2GI1omVszRSYlSrGQmUJRgACNDM2aMzYlxDM2y2ZsTSIkyNlyMxNIlsWwZIlK2WmZlouM+qtMpMhDLjj9L2GyNhsuRh10s4HOcrDheGz+Wsg7Y4VFl/h/m7It9u/Tb8jmbMsnHozMe3Eyq1bj3wlVdVLzjKE12yj+zRWM/J5kv9qPWNud75DMrpj3d0cWFFXg6/J2yhtr93v9T0L0T1C+p+mcHmJ1Ki26MoW1QXwd9cnXLs/ytx2j57f7B+Lsz3bRy91ODt/4XwozsSe/hjd368v1gz6jxHF4PB8dj8VxtfhYmNHsrh6+bcpSk/Vyltt/cmc37X33xZPF+nsrZjstDsTK22UmZbLTJsaStEykZplolcUgBASpLM2aMgS4zM2atEaEuVi0Ro2aM2JpK6/1R1TxPSWAs/lZS7Zy7KKao91lk9fTHz1/VtI6hwftk4Hl+Tp42/EvwfeJqqi+xxnDuk+2Hf2/Tt/uj6DyXH4HIYzp5HGhl0QkrvCsiprvrfdF6+58b4zh+c9pvVv8Y5zHlxXGcV4SqxvDlXOVffKddUO+PxNuL75enohwu+uo+2IoBlSM++j?NY43fQFsGSzSRx+j2LYhFYjV7DZA9hg1rstGKNETYqVqmaJmKZomRjXWpaMkzREVpFoAQErDIaNCRLjPRDRq0Q0JUrJolmrJaEuVws7HtycPIxqLpY1t1U668iCXdXKUXGNkfTcX5nS/Z50Zz3Sj5D+M8ms73qUPBqhOycY9nd+Ju1LUpeqX92d/ZLQ4OmegL0LRcY91IitCZo4/SWQy2QzSMOi?KQ?ACkaIzRaJq40RojNGiIacrRojNGiM615WgBAS0UJlCEpGhNFi0I9Z6JaNGhAqVkyWjZk9oQWstCaNNCaLjLpk0S0atENGjDpmyGatEMuMuo4WdyGBxlPvHI5VOJTtR8XIsjXHb+S7pvRvXZXbCNtUlOuaUoTi04yT+Xn6pnXOvMKWVwNvu+G8rOg1DGnXjRy7avGaqssrrnKHn2b89+XzP2eI4vH4XjMXisRy93xK1VX4j7pvX5n9x76psmfuuYAxpDLAjREpGmiauRSLRKNEiK0kUi0TotEVrFoAQErU?IyDQwAJ0LRYtAeo0Jo00JoBWTRLRq0S0Uhk0S0atEtFazsYtEM2aJaLlZ2MdC0ai0PU4z0PReh6DRiUWkNIpIVqpDSLSEkWkRrTDSKQkikSuKQAgJUY?G))?AkTRTEMqholotoTQ02MmiWjVoTRUqMY6DRpoXaPUo0PRXaNINCUi0hpDSFarAkUkCRSRK5AkMBiVD?EY)))?AQwAJFooNDJGhaL0Ghkz0LRpoNAWM9D0XoNAMToeitBoDJIY9AIwMAEY))))))AEAwAiAYDBAMABDABG))?A:Z%iVBORw0KG;)NSUhEUg?AK)AxCAM?ABqK1L5)MFBMVEX:/+zzvd8rvO/1fj1+P4xiu5tpfFbnfDg6/xIk++ZvvWLtvSmxvbV5Pvr8v3K3PnaFXRJ)1ElEQVR4Xu3W7QbEMBBG4Xcm3/3a+7/bVZRlqEI5Vs7vhIcwE+3lQbrP4/kHN2LNfbW06zcAMDTWlFnA2LDMAsbGBwaMJTqwJDqw7HRgpQNLogOdDiwHHZjowEXqflXj7r56H2hmW43AevttMIVeA+qsRyILqE4HKrxyhwG3sO1gQPt34AQ6HJgHfMxsBQ081uBrGKC7txJbAcDbjA7scOAQHGhw4DjgQBMbWMUGtswG1iw0cMsiA5dDwgLbkrJEA/rZYpb2gGMAdRMZOIETOIETOIFfGWpGTAdlDEM)ASUVORK5CYII=#!