["#:a9removes duplicate elementsIEqualityComparerbenchmarks dedupe methods","aA,rrEAreCXBZCBC| G596VBCB 5659G5V~~C 5656666F55WCX","Distinct."," This removes all duplicate elements in a collection. It returns only distinct (or unique) elements. The System.Linq namespace provides this extension method.","Distinct"," returns an IEnumerable collection. We can loop over the collection returned by Distinct, or invoke other extension methods upon it. ","IEnumerable ","ienumerable","An example."," We declare and allocate an array on the managed heap. The array contains 6 elements, but only 4 different numbers. Two are repeated. This fact is key to the program's output. ","Int Array ","int-array","Next: ","We apply the Distinct extension method to the array reference, and then assign the result to an implicitly typed local variable.","Var ","var","Finally: ","We loop over the result and display the distinct elements in the processed array.","IEqualityComparer."," We can specify an IEqualityComparer to compare elements in the Distinct call. This is probably not useful in many programs. ","IEqualityComparer ","iequalitycomparer","We can \"transform\" elements in an IEqualityComparer. Here we treat each int as its parity (whether it is even or odd).","Odd, Even ","odd","Benchmark duplicate methods."," Usually a simple loop can be written to remove duplicates. A nested for-loop can execute much faster than the Distinct method on an int array. ","Version 1: ","We use the Distinct method. Note how the code is short and easy to read. This is a benefit.","Version 2: ","A nested loop scans following elements for a duplicate. An element is added only if no following elements are the same.","Result: ","On a short int array, the nested loops are faster. But this will depend on the data given to the methods.","Discussion."," The Distinct method is not ideal for all purposes. Internally, the Distinct method is implemented in terms of iterators that are automatically generated by the C# compiler. ","Therefore: ","Heap allocations occur when you invoke Distinct. For optimum performance, you could use loops on small collections.","With small data sets, the overhead of using iterators and allocations likely overshadows any asymptotic advantage.","A summary."," We used the Distinct extension method from System.Linq. This method provides a declarative, function-oriented syntax for a typically imperative processing task.","The Distinct extension"," incurs practical performance drawbacks in some programs. For performance, a for-loop is probably better (but may be harder to maintain)."]

OFYBXYYFDFQ;YFDFQ.LinqFbFJFAY{YOF%O{XYOOF{Declare an FU with some duplicated F8sFpit.YOOXFz[]X FU1Fy{ 1, 2, 2, 3, 4, 4 };XYOOF{Invoke Distinct extension mFg.YOOXvar FMFyFU1.XDistinctX();XYOOF{F= FMs.YOOXF@ (FiFhFpFM)YOO{YOOOF'Fh);YOO}YO}Y}YYXYY1Y2Y3Y4XYYFDFQ;YFDFQ.Linq;YF YFJXEqualityParityX : IEqualityComparer<Fz>Y{YOFBbool Equals(Fix, Fiy)YO{XYOOF{Consider all even FEs the same,FVall odd the same.YOOXFK (x % 2)Fx(y % 2);YO}YYOFBFiGetHashCode(Fiobj)YO{YOOFK (obj % 2).GetHashCode();YO}Y}YYFJFAY{YOF%O{YOOXFz[]X FU1Fy{ 9, 11, 13, 15, 2, 4, 6, 8 };XYOOF{This will remove all except the first eventFVodd.YOOXvar distinctResultFyFU1.XDistinctX(FqEqualityParity());XYOOF{F= FMs.YOOXF@X (var FMFpdistinctResult)YOO{YOOOF'FM);YOO}YO}Y}YYXYY9Y2XYYFDFQ;YFDFQ.Linq;YF F!YFJFAY{YOF?IEnumerable<Fz> XTest1X(Fz[] FU)YO{XYOOF{Use distinctFjcheck Fwduplicates.YOOXFK FU.Distinct();YO}YYOF?IEnumerable<Fz> XTest2X(Fz[] FU)YO{XYOOF{Use nested loopFjcheck Fwduplicates.YOOXFo<Fz> FMFyFqFo<Fz>();YOOFw(FiiFy0; i < FU.LF^; i++)YOO{XYOOOF{Check FwduplicatesFpall following F8s.YOOOXbool isDuplicateFyfalse;YOOOFw(FiyFyiF}1; y < FU.LF^; y++)YOOO{YOOOOFmFU[i]FxFU[y])YOOOO{YOOOOOisDuplicateFytrue;YOOOOOFGYOOOO}YOOO}YOOOFm!isDuplicate)YOOO{YOOOOFM.FvFU[i]);YOOO}YOO}YOOFK FM;YO}YYOF%O{YOOFz[] FU1Fy{ 1, 2, 2, 3, 4, 4 };YOOconst Fi_maxFy1000000;YOOvar s1FyF,.F`New();YOOFw(FiiFy0; i < _max; i++)YOO{XYOOOF{Version 1: benchmark distinct.YOOOXvar FMFyTest1(FU1);YOOOFmFM.F]() != 4)YOOO{YOOOOFGYOOO}YOO}YOOs1F3;YOOvar s2FyF,.F`New();YOOFw(FiiFy0; i < _max; i++)YOO{XYOOOF{Version 2: benchmark nested loop.YOOOXvar FMFyTest2(FU1);YOOOFmFM.F]() != 4)YOOO{YOOOOFGYOOO}YOO}YOOs2F3;YOOF'(F0(s1.F# * 1000000) /YOOO_max).ToFO(B0.00 nsB));YOOF'(F0(s2.F# * 1000000) /YOOO_max).ToFO(B0.00 nsB));YOOF5.Fu();YO}Y}YYXResultsXYYX185.44 nsXODistinct mFgYX 51.11 nsXONested F|-loopsX

%iVBORw0KG;)NSUhEUg?ALw?ABGC)ABTK6EI?ACe0lEQVR4XtXa4XHCMAyG4W7iQTSPxvEu2kWTaIL0aO69a48kwjnsIv0PPMjoIzj+8kdtY8U1Cyrcump7lGo3j9+Or/aoQUB2TaPs5gsgN20U1W0VXu7hobfDUluDb3Yf79LOSmMJXm/jrVGq9lNdBb34Cnzzm3hHbvEL4AyBxFz8/v79Hj5kp/sTwIQlnYrf9AGIW/i+J8vRxa5M01S88SbD+NjtV6uik/Gb@ZDeBovcTkPNhVP68fxge6kdG/9RDwIHccbjb9sfczEs/w+jO/k1GXrbTLeUYzhhc98uTR9Lp60HMKTNZH9hOlcPCM7hoeWRmnMxJPJOoTnS5ELfCoeiI3hO9dkEzsXT1qO4fVD8KTlON4vBbYCT1oO4duLeJ2NJy1L4lnhIXxO8iV40nKAF5+DZ2Rfx/ur+DYdT1rWxDOyFfFoekU8rZcoiSctS+JJy5p40rIknrSsiSctK+IB9VK3B09pOXBjFh+DJy0L3RI/j2xNPGlZ52/gwci+6w94X4mHFEW2Po5X+h2bTuB9GZ60fMN2H4JYh6f1OT4w/etG62laJrr2CVvcJ2@/u7EMtIr8aQl+KSxmu5wr8STluAznGcfbiWekQWfJWFPUn4tnrTM8Ubrrx4WrsbT+rRjiu/iGfJaPGmZ4gGqH9mFxq/Fk5bgszBsYgfHn5hm8HZc/na8NyrBh+5I/YNwE05QgT8tezt+0xyPHoVo56TTH9h6vOV49P2MJb4txlOS4ynThLUcby/h4R92XwL89tkVvn/XOdEqNLUA/mThoiKeuFLwJVvv4Eu2viae+7KaeM4tlsRzYhR8zZmtiOf5HPh6rRcGtqI+fgDfESNWSoHcSIU)ASUVORK5CYII=$/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=$/9j/2wBD?@.@.@.kLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwv/wQARCACRANwDACI?RE?hEA/8QAZg?AQUBAQE)))?AEDBAUGAgcIE?BAwIDBAQKBgUJ.E)B?IDBBEFEiETMUFRBiIygRQjM0JhcYKxssIkUmJyg6EVQ1NjkSUmNHWSs8HS8AcWJzVUc4aTo8X/2gAMAw?AQAC?A/APcUibfIxls7rX3Jp1VA3tSAetcGRgNi4C3Ny6DHHcCVIuElwooqoXEhsgJG+xSbe97Wt6+KTaNO4g+pdiN3EWUvMEmcKEZXXtcWTbnvJvnsEZ12IlYZwkMzPrD+KrCSd5um3MuNNCjOuth6VaeExfXC4NXEN1yqgtISZSur+lJsVbmsZyXBrRyCq8pSZCi4SbJWnhnpSGrHNVhYVyWOS3CTZq08LCPDAqgtcmzmCLBJkK0cE4lz24W/PMpN1RYe4ja3+x86sg8pCbGyTZlS7pVGD10HozJCxPpU1mSgpbrktKcQuUqW6SyVCRCEiVCRCEKtr3AGIHQnPbuyqDKI3tyPAObRS8SliY6CN++TPbTQ2y396gMHXjDR1QCAeKqqg+PkGmuX4VOi8m07u0mdlsDoNOfMDcu4pQHZgdDvBUt4a9pa/cVXSMEBsLkE6FNWym6fb1t+9TiATnBP+CR1iLHUFRBLJkOQXsNAU+y7mNflIJGoO8FSGO4i/NLl5qNURujGdj3Bo3kvOn8VFZO9xs2ckjWwfdQOmJv0Wxg7vo278RiyFF0Mwyp6PUFfRslpcRkoIahlZFUVOZlRsc98m1LMr3drZtZ+7U2OS7etz3lR5Ac9mjhftWXoW1mH6wo8JlByiTW17aXt6lnuieJzYvglLVVJvO0vhmfu2joj5TS3WezK5321VsH/ABAk/qQf37E5ccguc2gIvqtsKmUHLnBNr20vbnZKayVgu5zAObtFk7fz5/8AG/8A9NR+nw/m3U/92m/vkacgkLjYnlmWzbXvdo0xutvDTf5l34c/9m1eNYzTdFKLD2VOAVTWYsH0/gwo6ueeV8jpGbS7NrL5mb2/Fr1enErqeAzi0pijMg3WkLG5xb7yWzeSQOcSRf8AhqpgxAPFxG0jcS199U7FIJw45LWt+a886Ci+H4p/XFX/AHNMvQ6QaSd3zIdlDbgWKVhLrX4qZRFt5Q1wNiwGxvY9bep9/SvOOgWkvSz+vKr3uXfTCWavxXo90ZZM+GmxGSaWu2T8sktPAy+wv+zf4zN+H+zTR3pb9XNZehMlY8Ese1wBsS0hwuOGidzLAt6JDCcVwyv6NBlHE1wixOmkqJ9lVUlu11mz5qlnWdFmyZ3+UkW4LwxrnuIDWguJOgAGpJSXRbmLJ8SszZM7c43tuL/wTmcAEkgAaknQBeBNlnpcRwvp/I92xxHGqqnmDrxtjwyQNpKXafcignk+o/JAvcKumgr6SooqlmeCpifFK0EtL45BleM7XBzeqfNSnRN2vfRTBUQfto:AGMTzXhwBa4EHcQbheES9EMAZ07pMEFG4UEmFmpfF4RPczA1HW2u12v6tvVzL2nDqKmwyjp6CijMdPTtyRMLzIQ27nWzvcXO3+clvZNkKaZ4bnxrBw1eP8y7a9rxdjgRzabj8l8/YTT9B5sR6Tf707Lwj9NV2w2tRWw+I2z/APpZWM7f1l7ZgdFhVBhlLFgsYjoJGiop8sk0oe2o8btM875Jcr8+brOXQXCt0ISrpIs10icyKKKoeCREHk232OTcmqKeKWKORj87XDM08dead6QQTzmkEUrox4wuygHP2LA3UCEx00QY?9oN7iwsPhVRU6VDj934VYRC8LfaVq4sOhINju36rlwaRZ2oK8jjxerjrJKlszsxeSRfqkX3WXomGYrFiMNxo8aSRnffmPso1B1G9OZbcbqeYjHcjclD32OQj0XUhpBFgmZGFpzNG9dgWFwuwb71RdK4Z6no9isFPE+eWSnAZFEwySPO0Zo1jWlzllaPGcbbgVJg1B0ZxZtdHRR0u3q6bwakjc2NsT5tpK72mtdkXoQe4kgaEcVKa4OG/XiE8x4tltfW64fGc2YOtpbRZzAMEOBYRSUBeJJW55J3N7JmlOZ+Xqjqt8m37iy+MNr8J6TQ4/Dh1RX0klD4HO2lZtJ4nCTNm2f1fJ:T8T0q5uQR3pqWMEFw0ICeZJr1ly6MZRl4ZbdywuEeG4nj1Rj89BUUNOMOZh9PHVgRzy3qfCHymLtMa1w87trvpvT1FX0fqIKWCWeUy05EcMb5ZCBI0khjGl3VWpLkhcpGVMkDKRffxVfSYThdNspoMMo4Jg0eMipYIpQbNv12sDlZEpvMkzJcpRoNy8zwDEq/Aoa+lm6O4xPtcQqalskNFJs9nJsmfU/d5l6lhM5qqRlQ6CSAysY8wTMyzRXzdWRh7LmpjMp1GdJO75kjwcpSRixAvdZroVS1VNL0m8Jpp4NtjNTLFtYnxbWJx8rHnb143fWau+l2HYj4Tg2P4VAamowmV7pKRvlKimmy7TZDzpGtzN6vX6/wC7Wxg1L+75k+AmeN13lGXLdYSDGcdx3EsOZh2HV+E0EEm1xGfEKaOJ1Q0D+hwRyNlzZ/Olb12eU8X+suelb639BVsGHU8s9VVtZRxthY9xYKk7OSV2RpyRsi2jtr5i0aEItpZeZYj0Fqf0HNQRY7iFQ2CmzU9E/Y+DvlgZniiybLO1ufs9ZbPozU1dTgWGvr6eogqmwMinjqYnwTbSDxW02b+t43JtG/fV2EqEmUA6crLCTUdYf9o1FXCkqDSNwh8TqkQyGnEt6nxZmy7Laat6uZehgplOBKuC3f6V5DgtbUYFWdI2VvRLGq7wrGKuogmp8LfNHsXSdTxkmTq/V8xeq4RXnEaGOp/R9Xh4JfGKWth8HnjEZyi8Xmtdbq/YUwFOpU0WpwJVyul2myqvFGF0Ol72I03i+XUKnnjvRZJBZxaQXEA2FnalaCriZKGZr6XtYkKqrInR08hvnaGm994BFrqumjJnJ4HKOf5KXE+0YHLMV4Y4Fj3jk4+jiptLVvge18UhY8EEEHkrHGaWIMM7NJLhthueqKkhM0rWSP2bTptHC4Cenh2Li1xBFrg+hORTCZoe0EX0IPNeo4TjMVXlY99pTvDha/qWjJ0XmmG0bIJxI+o2rB+yu1b6KqimDWwuJIA046c1FzBpsDcJ6x32snnM48kyblwcDYg6EJ8uIO64K4LCRdm/klulDuadZKHktIII58fUlINyCNOajFxBt2SNxCmNN2i+p4pxr76cQkOiq5YHhxyC7TqFFJIJB0I3hXrm3t6FEnpRLqNHDjwPrUyOfUB+7mmHx6Xbv5KrzJC9cStfE4seLEJrMpoaLKIXkHVP5lZUBu2Xu+ZUuZW+GG7JvY+ZcyN6hXUcl3hWtOLmTu+ZSbJikFzJ7HzKbZRSNU9mTVkWTtktkWRmTVkoCcslsiyTMuAF2AgBdAIXJKE4uQF2AlXBK6C7XC7XQTZTE/m96rqwXpKgfu3+5WM/m96hVIvBMOcb/corzacH0tTrfJ9zl5bicW0pHkC5ZZ47t6iYY6lfSTskZGJWuvHJJp2uH5KXiRlETWxRzuJN7w2uLfWuqFkO3iklkrGMmYfGU72bMnL531XOT+JtGdp3XFrooHeLIv59wPQttgW1a6aOTIGNsQRaxvyK0jMrZbZRq3MDx3rFYY91U6OJlK8xi1ptoY9SNbsy9dathMV4852gGXrMJt6LhUxNnaqefekqcRgpngTzANe/Zi/mO4g/ZTnhAa5paQ5jxcEFYTpTFPBPG98jDHawY0+MzHV8j;WFY2+JzIZ3jZAZQXDVnrIT2V2TMNUml16k0MlbfimyS021B4JKJ4fE1wc1wOoLTcWUkxF7ncLAWXNyQCN6TNqm4JzmEU4Acey8dl/+VymgKrkBzbJ4sL6n/EKwgkZkDC/UaXcbkjnddxya5fekfzCocU0qbfZCrC5XWMxtBjmB1d1fRYahUBK0FNZ0MZHK38FUzuIldfjqnMyvMIN2VHsfMs8StBgmrKn8P513M3xZ9n4lxE/xg9pXtELmb2PnU+yh0AuZ/Y+dWNlAI1UvMmrIsnbIsksjMmrJbJyyLIsjMuAEoC6slslSZkgCUBLZKhc3SALpF@UiYn8zvUWUXjkHNpH5KVP5nemCLtcPQVDk8r/ZTzOyF524akekrKxQMNfKwRbZrnkBl9+vMrXPFnv9Z96pIgGYu0N?JBNuZF1YYn/RgRwPyqPh5tNIPR7nLW4dRyQEGOlawEWyCW4HFXIY5jzK+AjTXLZ3eiiNz3K1toqKNgcL3O9WL32O5eQ9KYJnyyzMnvD1DsnHj9lZigpYZ3PE9TsALWJYXAk81qOllJJ4fJLFmc25zsB6rLBuoYqaJ8VVBBTDqTDOBZgs/kHEdbgpkwDA1rQG9Rmch1xfLmukjJdcuN9XWu22nJa3CBU4XLsGP8Jje0vy3ta31b/WWxop2SsJyujcSbskIzA9zisNDYUe3ll2NRJEII8t9p4s5dyk0cVXTUsgfI4ve7OXA6799/uqvzkHgnywEclupIWzDJI3Xg/jdVr4pYi4PaC3g4cQq3DOktLUyvopntjnjdkjJI2cwGmh/aLTg5wQ8dQjjvCcIDhyd/remszm6Hd/rcs7Uxl8TWZjkYbgbyy/xNVM9jmGxHqPMc1qJ6Z7D1OuzeDxVRUtb@IB4EHeDwLVNoKySF7aeQEtcbMtvBPyqNV07ZGmVps5oueRA5qrutFgXk6r8P51nCFpMC8nVfh/Or2fyTvZ+JVUJ8YPa+FaCgHWn/D+dWSr8P7U/wCH86slXkaqcCuUWXSElkXSWRZKhFkXSWRZKhFkIshCEqRCVCEITE/m96ZOoPqT0/md6Y4KFL5VPs7IWBmFpJB9o+9UQ0xZvd7lopxaWQfbf71nrfysO74FYYifof8AZ+FR6IfSJB6HfEvQ6A6D1K2G5U9B2R6lcNVJB2FOk7RXnHSqnllkqTEdW9YtsCSLcD5uVZHCogRtmxgzMkAab2vfth1+11V6HjTCamoDTYlvr4LKYFSRPne2QEhpFg.L89PUrCusIIHjjG0Huypqkdd0zTua+456rWUtPnY0ysBLDmjOSxHoXOKsfHh1TNs25Nm/PklMTvZ6uVaGmo6YN6sZF/tlQcdp7YdLGw3El2WPC4UCKEvdGOZaNNVIdIG3PLmvB2SOa8Wve+nMHhZep9GcZxGQtoq2CRwyjZzOABAHBxLussHFSUt5mzbRszXDZ5N172IK2ODxsglqGF7g2N7Cwyk3sRwJ+0klIB3WIXYFwb6rfEgOBGjTvHDVZvES0TuZGeqNSPSeCsJPHsD4JHAggHL1mm3oVewPrTIwxZZ49d+8DnftZk/RTRMqGmUaHRh3gOPwqNUxyOgcIz98cbBVtlosC8nVfh/OqIsIJBFiNCPStBgg6lV+H860MxvEfZ+JVEItIPaV/h/an/D+dWSrqDtT/h/OrJQFNCEIQkQhCEIQhCEIQhCEIQhCEIQmJ/N70ynZ/M700NyhS+VPs/Cn2dkLE1bbVEw+2/3rNn/AJuO74Fqq0fSZ/vlZZw/lcd3wKbXH6EPZ+FM0Y+ky+p/xLf0HZVw3cqeg3K5A0VRB2ApknaKymLgeEyHmwH8llsD0qJD6R73LW4yPpD/AExj3LJ4J5eTu+ZTa8/RKb1f5U1SDxtT62/MvSaY3Y31KJjAvRn0PYVIpfJt9SbxUXopPQWe9NUZ8ZD62omHUk9Tl5FJHHUYpJG3Ox2Y2LRYMcA2x/tLX00Ms4Mbo+oCLl5OtuICz3gxfi7htC0ucHFzNDazdF6Hh9FGwDrvOmuY3TNZd1VI37bviUiMhsMZv5jfhS0TO1FHTuaG+dca+pVle90dQcnU0uCNCtWyMtJ13qgxOAyVZIHmhSqCJu08YA6wcdWqLVSOyHISCS3c5UJBJJNyTrdaHBWkMqb8cnzJiKgcbaLQUFJsWSC2+35ZlbTSNLC0fZUCKM5w4p6iaWmYnjk+dT02xgZe3FOKIpKEIQhCEIQhCEIQhCEIQhCEIQhCjz+Z3poKRIwuyrgRnkokkbjISBp1U81wDQFjq9p8Jm+8sq5h/S17cvgXodTQPkmkeGkgneqsYM7wzbZDbTW3oUmq69K2Mb+r8Kbp+pPI87iHfEp9CDYK4aDZcQU2QDRSwwBQYoHBoBT8kgJWVxiIma4H6v8AzLKYNA9s0hI5e9el1NKJTe3Cyr6bC2QuJDVIqWGSGKMb2rmF4Y6Vx87Kn6Vp2bUtfEX0sjQNTb3qwZFlC6dGHNII0K5hiLMp+rl/JcyPDrjnmXnMOGv/AEk6TL/qzVt6aAsaBZSGUrGvL7aqU?LBK6APldKeJulMlmNYOAaE2GJh9M1789uACmoT7W5dyaJumGQNbwTw?slQukiEIQhCEIQhCEIQhCEIQhCEIQhCEIQhCEIQhCEiVCEIQhCEJFwN5TiFyV0NyRKhC6XK54rpCEiVCRKhKkSJUIQhCEIQhCEIQhCEIQhCEIQhCEIQhCEIQhf:Z%iVBORw0KG;)NSUhEUg?ALE?ACZCAM?ABXCCus)YFBMVEX:/8DBQft9P7+6vkQKUmZkPG2fPApT3ix1P+Ht/Juzva4rfXD4/3a7P0zeativfX/zflmZ6nGl8dsh/T/sfdKp+n0mZ:fPH72NrZ0/b4tLg9ldPxbbdMs/lSmLaOjo5FLXJz?AI6klEQVR4Xu2Z2XIiOxAFkXpf2cH7/P9fXpDtjEatQmo57G4i7nlieMo5kVUS8mqc/5M8GvDmsHk04MNhM6g5SRYPbLIBIFl244kB/kTmi2TJwAdyMYP/QLJ0YJgpPFm0wuR8PgP/CMBnE+pePPCZLBY5sXhF5OUDg5wsFvg8zvKQNxbv4pE3Ii9B5WUBn+9lOciJxbt45AReb2ZXWetWG2B4vZkNWeuua8tL2g28C0QGtjWwJg28E5DngAW4gXcC8+bvLC?Z3AsBplinbx5fo7K5i9hyZU3XwAyrMBKwHkuEGf5HyJTrDdZLhFnWRjyX8FSsECcZ1kocvILu+COwWQMHMp8SH6zWFKZFTGMBQzyb2w5xis8VdVgBMQWcDAyr3PxFviB39+zX.GVmCOv2QAOxF3/f7uJAY4BnkTRBzDe8E1OQrEeeaKFznMDD0Zt/7iFUoG2FNz9CVfx9hA9jYxwNHIfjPamHqJTQywED+yv+Y2ol5ZC2YuruagJ64uDleaPdB+D1lH2UCyYF7iQfaaoSPqlWZvv9/DFVFz6ONnG1UvuQWG+OfIiUwcWS9aACwQNxOZDz4zuihcsgdYIG5Wz4HIEHvM6H7CS8nZXiK+zkoMsmyGjsSFmIKdyNrUMs2MA0mCRA7HZSXvReJnAxyPvBGI4+ql5L1I3NDLcwSyZEYXh0v2WwcxwKSbtOcOghkQs3oj0hcuYoCJ/jRjtwtEls3Q1BuRY58qtQ0gRubTySATmViuGdzJeS2UUqkKKBmZdycbOZ+IrLv2J/Wq4vWolCyytpCvwDD7kN1mdHW9jsI19fbHC3qBFuJ6I8nLaQcyEZCFmluIp9pQvH6NnkpFYpDJizEjqOaDUHNdR9rAN6kaEzeyzNHICSVH2kD6m9n7avZZljkTmD3EmKHrCTZ81mu3rqySjQqdaIZu4pCpuVxPseGmXrTY3hA3gAkyN9Qc1XK7Dh623q7XMXsDcwWZZTNCF0YdWq/Yv1JDYrz1yCzV7D+uy/u8DJvV+uCLYjh7nQ1mskssmZ3IWdhvki5i2C7f9wP6gRY4eyvz6fRkE4s1+18E6onD9tqnlxTu2SsdU2bIdjcy070X2QaWtXjFBnslX3EvJb+6V7I0ZcwfQykwi4+eghbUiA2WJWlqWn+lZGslu6bsm0lbwGE1c9wRvXbZINf7CZmm1H97HRofGTuInql9zCwi07CsRU+9Nu5A6j7t3SvZdf85seY4DonXDNYEGR8iqTo6hm14gqDF+DokHBkga7hsZtsM+SG8q0clF4INgzB71kqWj4wsf8uzBom9ZsgvtF05vtwcR8NmpxdW8hdC5zgy3i6Byc8sP8PpEi2orL9X7/fsOVeyfP95M8nDkeX3obKCg8rA7aEStLBnT7r/HAwwNQfYLP+ibsvxDbIXbPDPXiYhP11Y80k1NwNki7i2RC6UwgYx1kouICbW/CVXPSfV3AhPLR1aMGxKCfX6Z2/Y2ZPjkhFeM8AgQ9w06yFxmvapgkbM0X0duikMZFact+bTNXjsRtZNU1nlsZKJd/bGWlzbamzg8JoPLmJEbqzFxUq+r0VB3/u9Uhbw532i0UhMgmp2/y6FuFxb5RVo4Z+9oyEt1HZU1WAzW1ABu/nk5uVN1lpcZiUHzd7xq9itSu2iBocJO0uuWUaGl+iSktEiVUh6byUPLEgVn3HCJD+tDrB4aubsOJnA6yCePnvrdZVigim5sJ2gTVg8NQP8zQyvlXasxd3ZW19S2ZCZUi4nMpoMqBlgkF9WArF/9oCtL6mqMWRG4/xQEiuWa+bYgPnJRdw5tGD2YDWwhhe?khmT3TCXzPAzNuLqTlxEd+dPWCp14JEi2AnpOPE3mcvghi6pGS06AtVYAEBF8j9kH8rORFY82ifiSaXpXP2oB3jokUx/IdBlpzw2zzkpWJ59IwWWJCqdaE+gMUGK3u02Jo3ma3ohL/mHbxcqRk8p8hGCyzoVfGhCqlee0HsP1/otpYTLILAmuG95wTEbdvWg6xVeu35Hi7nxjY19bInJIn9NR/gxQkhutNXm4fIFyd61cMrRpkUDOBUJ1gS57c3NpnHCdINiS9OHFXqazhV2GAy3Qm22mZze2AkOHEn9TBKXbT4uIdcKIs3wgmAE6MBlDhxP+2tFtfrEB676sVegKOcaJi3hJpx4n70kPjixFopAy/WC0CUEwAjLzWHOcHsla2+frg48b2S/fXGO9FsABjUHOAEs9dqI8jXSk5rEwk33gnXcxc1I4c3umz5WF+dYCULNghOBANX2kHxxM04IJ0eKMJKNshivfFOVKWAcSVG7gmprrOXfu9nod54J6paAn7BialJ1fFr9vqUk41EOgFv3QoATzgxOf/U9nod+hBsiHIC3rpb3XFiFZdOpa1Sn/WuWRg/cgLeWq/inZBTqK2p9+ui/HMn4K0BEJyIzM7YsOaW/EMn4GXmJCeio7f/NHc6Gdl+UMk9vACLTsSn41IHcrQT8LIk/E7EpwXZ87COExIvSyLMifhgRiYi36+4AlivIpyICcgyM8ACLwrHOBFvRnUHeSc4AS/Av+oE6UAWmanYzVu3HmDBifiUXuSTwMvM/ZETpPUj7wReZu5vnCDaOX0sNpDhHQSA+EtxvBnCq07O0oA3bOZ4eP2VtC5kHlRAhhfgGZzADFtl7hPo3IDKkpjJCcyohHdragaWJTGTE6zmSvwrTFUZ5spaEvM4QTTIds0GtKJmlsSMTjCAzv32zUnNzNxsTpBujIwO1MzMzeoEKS1eOAc1P6/mdUJGZv/aNb8kS3CCPNu81Ayy9zqW4MSfZNPAS6i55D14ERKDDK9dc2k9u8/rBEk2Se3IDk5qnt0JkM2hPUoD5+qJmmd3grRjYg0nNS/BCaJt4BWciVgzTsyT0nEZ9tcM8BzpXJdhOMGXHlRmMgNgkkg14woA85nRAeCreV5gzNArIts8vxMg07CnZpyYnZiK/TUDvKjINSc4sazINSPKw9SME49SM58epeaEuh+j5sR+n1h+zQA/Ss2Ll1i+xT9OzTjxOMhRTvwHpcRLGhkmF4g)ASUVORK5CYII=%iVBORw0KG;)NSUhEUg?ANw?ACNCAM?ADrVuTh)YFBMVEX::4x9v2s9D85e761OP97fP++fvEwIH0msH+8/fe2HbRy3zq4XH71I6VlZWhoZq9vKWxsbHNzc3PzKXi4uKxr5Lx8fH28bD4+Pjd2anp5a3/+rP06HCa9NH/9Gj/9429Bui2?AD/0lEQVR4AdzYa4viMBTG8bwr1OE5J9dexul+/2+5GGZhbepYY8Rn+n9hQAj05wnWal5REkmXNYgzh8sBWWWB0RytUWxGOag5Xi7@Vjz3j5fkfq8+Ly8r5fidDowTubj4gZ8/grcMHnVGKOqn3aMI2bcJL8AN6ngqujnPTiv7Lghy4rED3dx0XPjBsWtxN/DYaLGTYIfkpsXn+EzZmLcoLiT/oTzGHhxg+Bucfv6ccGpfNLisq1Sl0cqkQlXYQO2BAM0v9DiIna2QZgvb3penMfupsIWIaqyH4f/+3qiP9eZ7RL2J+P1Vot/2dHsqhluPbntLB7Irv5iQKGjwgU8VLi50xLiLFA3ulEKNxsuAZWjc4WbDueAutGNWCd0OIvK0TkUseESUDk6yz85h8dL26cSyoazeDx34w6S2HCoKB8/3TCT4RJyFV8pglXWsOEcarLFp7L/t+VXERkOyYTSRoezqMoZVz4tHAUn643BHAeH4oGAESeoa7XP8ePq0yPjLCXOEkyOHecoce7IuIAmJUpcQovEUOKMoEGOFKdoUCLFhSZ3ORpc+3MZaHGuweBocO1Hl+hwQa3knrY5Q4ZLFq1S86bWuOW7s6BVcXmu9rjY0EaHQ6u6hQ/XoU39Qohb+oink+68EOJy54++P526rosxijwKi6ePJUeJKztfuP3pG5zJcgUSiTF23akvJsaB4+tvu3WX4zYMAwGYpH4wfmhP0Pufs6VKrdiFoZdULjadeXAUmA73A1aUiSOOOOKI+zK47zl4IcdwL+Rv4YgjjjjiiCOOOOKIIw45xBFHHHHE/Y84HuLEEUccccQRRxxxxBH3ZIg7hWsKmJX3xBk874kreGNcBdBi/ZY4+ZK4CkANsCqe6/e6iwiA2tRgGHFfUYzKdNcXpuOZq/qzxeuqGeJ3vMG4oX010Jp7ncRFdG0vWBNBZOFmrfV1NxYpVcQQsfFQeqwhkns9gEORPpqZX25wF2Z0h4OIYqZJvWfnXkdxpY8P9av1OUGCph97Tr1Uun/0ddcfbNIwfqdrGqtteEaDS4pXyxX/Fb3kXj9O4uIsM7/o3FB+sdJFconG31zibtSG3PfR+Br5wMksKGvwpl7fzuJCMIbAr0xcTdNyMha9LsHnoqqGkZobIA3e1esxXORVnCKyx0Wex5UXcA1j2tcXcAf3nGTL7Z7b4nzdY71wt3vu/CEerTXmoQNKxt1Pyz3uusWtaZl7PXPOlfXlBpfPuS2uzCPMkRmXzrnc66E3FN3h0hvKHrcIQPkT19JJ/xwu3i2LGmBW6x1Oms7KPa6r+Y8UtU+49W6Zex3FSWvyL3MW91iII46450PcPsQRRxxxxBFHHHHEEUccccT9BMmBXcwVjbcY)AElFTkSuQmCC%iVBORw0KG;)NSUhEUg?AJg?ABZCAM?AD1qB0C)GFBMVEX:/+vr6/Nzc1kZGSNjY3k5OQxMTE?ABgpITo?ADeUlEQVR4Xu1Z23YcIQxbX/n/P273lMYJRSilM4d5qB5DwAIJe7y8NqEi+noeIttPpD6S1xvyMGLZOvKGACqyu19pHTccmfwyyR41L2JGJuwunbEz224jVlv2bWJ4/j4USHGlx454JO66la3g/3Ytr82w0ZAU0hGUWc2+x2ItpolTuZpu5pT/vndzfpSvM3BkMakbcQSGlPTDpTmBksRi9wMoedxiAZQ8bjFFSnqd4xFIKTm3mBwnFnPvxek0ZnOJ83U6jcmOxRTUUj5JKbFBMu34Tdi18JVBSJ8LG7cQz7cW8ir0SfVnhEFJbQv4JABMwlEUmkU1Fx20Ex2UlIZR4SsAcqJWCa5th8Gt4jQWpSxEjLNg42azcUEiYGJ1J62jdaQV/EuOMTMcoI2wfp1cVFWMtwkyH4/1PJEYhLdBBxsJhH2OolkDa2KAL0uvNicWU0ktZh2MLVd21AKzukG8IlDtsqmuiAk4Cf8uMVlZGIfAMfogTCKXERM8tCDmaBIpHNSLupB6qaXOhwRuBnqR98K4SkNiiebYdxsGZ8TIdw2Y6JsW4140EhsO+lTJwALggsZPFLsf6JxcAKJUsk5Htog5UB9YjKY7fqKcWAlGBCAWo5d2h1hyAbjF+IlyYuOY86zJLcZPFBNLsLL+lQC8YeEFhKcLGcNzAXhPzG83/zLxCr+RXoNITgqIL+LYoOReBc+9gmWLOLUqEGDfYryAkGzhWIB7LRYL74eZ6WUW4+mVe5/Hu99izvZ1v8UE0y4lOfwKi/GCpZA2FeAmi/FRLsC+xfjt5mF4+8AtRkLvbAtflssspmA2HlQNLEBuZxV+u2vQkRSmSADjku9X8E;Z?llBLjkvM8ZVjIJA81VEojJxYV?opQIiZZgLX47888BcXbjBrBbIeI2b0fVYJL/QbqaKjlLcIoeK+INYvUKgL8ErLoO+znJi2AezMCzJYrJA1pInfLLCUtVMcsgQZEYsNprxHVSZXFS7rLGA63lvBZGox08lOU8ltLwNAZulokcjP3AO3gFLUypMYVrwGhH8cuC/X6BHNg1Rw+Vgxnb/ViZUrR0R/a2OI+i/2kahvvI6j+oHD4N/n53H+pX+/BTxvsfbfYhst4KPQznufpddnwU97n/bgT81i9lQl83nZ9XnpItSH78x4ACnLNoPJcQ0B9HiWALhAzR98s0wlubKPew)BJRU5Er@ggg==!C#!