base64对于图片的部分处理

来源:互联网 发布:方媛的淘宝店铺叫什么 编辑:程序博客网 时间:2024/04/29 12:42

(也不算不上原创,网上查了好多,代码也基本上都是别人的,不过凑齐整理还是花了点时间)

朋友问我前端传来base64的字符串怎么处理,在网上找了半天,勉强算是能完成任务了.

首先是把图片用base64处理.(代码原地址:http://www.tuicool.com/articles/RZRJ3a)

特别注意!!!!!用在线生成base64的时候 , 存储的过程中一定要把
“data:image-jpeg;base64,”去掉
地址:http://bbs.csdn.net/topics/391038262?list=lz

import java.awt.image.BufferedImage;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.net.MalformedURLException;import java.net.URL;import javax.imageio.ImageIO;import javax.servlet.http.HttpServletRequest;import org.junit.Test;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder;/** * @author cyt * @version 创建时间:2016-1-17 17:02:52 *  */@Controllerpublic class ImageUtils {     // 将图片文件转化为字节数组字符串,并对其进行Base64编码处理      @Test      public  void base64() throws MalformedURLException {          //将网络上的照片用base64处理          URL a= new URL("http://a.hiphotos.baidu.com/image/pic/item/0824ab18972bd407b576b9fc79899e510fb30979.jpg");         //将本地上的照片用base64处理         // File a = new File("D:\\meinv.png");          String str = encodeImgageToBase64(a) ;          System.out.println(str);//查看是否符合base64(有+和/)         // File file =new File("D:\\Users\\QPING\\Desktop\\JavaScript");    //如果文件夹不存在则创建    //if  (!file .exists()  && !file .isDirectory())      //{       //    System.out.println("//不存在");  //    file .mkdir();    //} else   //{  //    System.out.println("//目录存在");  //}           decodeBase64ToImage(str,"D:\\", "meinv.png");          }    /*           * 如果是接收前端传来的数据,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,     * 而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。     * 可以在前端传值时将“+”和“/”改成“!”和“-”,因为“+”,“/”在正则表达式中都可能具有特殊含义。     * 后台处理时再将“!”和“-”替换回来.          */      @RequestMapping("base64test")      @ResponseBody      public void base64test(HttpServletRequest request) throws Exception {          String str = request.getParameter("value");          System.out.println(str);//查看是否符合base64(有+和/)          str=str.replaceAll("!", "+").replaceAll("-", "/");          System.out.println(str);          decodeBase64ToImage(str,"D:\\","meinv.png");      }    //将网络上的照片用base64处理      public static String encodeImgageToBase64(URL imageUrl) {        ByteArrayOutputStream outputStream = null;        try {          BufferedImage bufferedImage = ImageIO.read(imageUrl);          outputStream = new ByteArrayOutputStream();          ImageIO.write(bufferedImage, "jpg", outputStream);        } catch (MalformedURLException e1) {          e1.printStackTrace();        } catch (IOException e) {          e.printStackTrace();        }        // 对字节数组Base64编码        BASE64Encoder encoder = new BASE64Encoder();        return encoder.encode(outputStream.toByteArray());// 返回Base64编码过的字节数组字符串      }    //将本地的图片用base64处理      public static String encodeImgageToBase64(File imageFile) {// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理         ByteArrayOutputStream outputStream = null;         try {           BufferedImage bufferedImage = ImageIO.read(imageFile);           outputStream = new ByteArrayOutputStream();           ImageIO.write(bufferedImage, "jpg", outputStream);         } catch (MalformedURLException e1) {           e1.printStackTrace();         } catch (IOException e) {           e.printStackTrace();         }         // 对字节数组Base64编码         BASE64Encoder encoder = new BASE64Encoder();         return encoder.encode(outputStream.toByteArray());// 返回Base64编码过的字节数组字符串       }    //把base64图片数据转为本地图片      public static void decodeBase64ToImage(String base64, String path,String imgName) {        BASE64Decoder decoder = new BASE64Decoder();        try {          FileOutputStream write = new FileOutputStream(new File(path              + imgName));          byte[] decoderBytes = decoder.decodeBuffer(base64);          write.write(decoderBytes);          write.close();        } catch (IOException e) {          e.printStackTrace();        }      }}

再把前端传来的图片数据放在这

iVBORw0KGgoAAAANSUhEUgAAAI0AAAA!CAYAAAAWAJh!AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAACIGSURBVHhe7Z13dNXXle-5J8TvJTMT562x39jJWpNkVuy4JBMYcGIn2M7LmF5EFwJJ9CqK6L2YXg2YYlFEBwkhOgIESAIkhJAEpnfRsY1tcEucut-!7HvP1e9efgKcOGCj0VrfdX!-U-c5!3v23uf8fveqwocffij3Gx988IHBL!9-cO8YNPEt4S--3McG7l3e1oNXQ9f8JXTvIbc!!kjOX7gkFy5elstXrsr16!-In-70J-nZz34mLVu2lB49esiwYcNk8uTJMnv2bFm8eLGsWbNGtm7dKrt375YDBw7IkSNH5EsnjSNEJN5---07wq8O8OvjfxDA15o0kYp2RLh27ZocPXpU9u7dK9u3b5d169ZJamqqrFixwsA1aeRRhrLUKYtIfn2XZ3wtSeNVqFP09evXpbi4WDZv3ixpaWmSm5srJ06ckCtXrshHKvQf--hHGwR-XJNGHmUoSx3q0gZt!RHIT5byiK8VabwKRKE3btyQixcvmrVA6TT!3nvvyV--!lf585--bOT4wx-!IJ9--rn8-ve-l9-97ncGrkkjjzKUpQ51aWP16tXWJm3TRySB-GQrT-hakMaPLFgDLASNHz9!3AiAIJDhxq2bsvXwPhm1PlmazB0qVcd2lB8NipYn!kYZuP6FpsUkjbQylP3go5tWlzZoizZpmz7oy5HHK4ufrOUBX2nSeBXkyAJwIcQmBw8eDFmLzz77TDIO5krb5PHyZL8oebRXbfmXnrXkn3rWlG8rvtWjRhhII48ylP1ev0ZWlzZoy1kp!qAv!sQSORkirU95wqAJc80y7zv7kYF7p7MHShqvkI4wKA23sWHDBitDxyg4bf8ueXlSgiq-jvxzkCg-GhYjL05OkHpzBkvL5DHSYcUU6ZYy3dBxxVRptWis5b2kZf5Dy1KHurRRbUI3a5O26YO!1q9fL3v27JF33nlH3n33XZPFSyIvkR52DFSS-OUvf5G8M7cM3JOOrjKKr4T0BrHuG2m8ZAEoBEXl5ORIdna2WQDikmMXz0m9mQPMUqD07w1qKq!!kShtlk40YnReOU26r35T!q19S0ZuWSwTtq!USZkpMmbrMhm8YYH0WjPbSNRJy7VeOsHq0gZt0SZt0wd9gYULF8q4ceNk6dKlsmzZMsPy5csNbmdWHtAkvqst3MlJKTJt4RqJbt-TFJyXlycrMg!artAbxII0N2-dknMlF-9xpPESxlkXhIAs!-btC1mXpXsz5Pv9Gpt1eEzd0Wsz!hpZIApk6LLqDUlInSFDNi6UObvXS8ax-XLw8hk5fv2i7Dl7RJYf2CHjtq2QxDVzjDRtl02y!oC2aJO26YO!nNXBXeGqcF-cE0QzOawqUN7!PtcFfOP9D!zI4tixY7J8XaasWrXK9IUeuyV0lw9v3pSz5y9IiVqbS5evaNnrXx5p7oUwn3zyiYzekCzfVTdCXPL86DYSkzxaYhePk-glE2T45kWSfmiPkQUrMmLzYlmyf7sUXjwlH3z2sXz2h8-l-PvXZPPRfJm6c7URrN3yyRK3ZLy00jYAbdEmbdMHLmvImiTrG7IwCORh2-7xxx-Lp5r!6aefGrHcDq28wFlhF1uygPg8c!aM7Ny5U5o1by5nz52TM!dK5Lxam4uXLhtpKPN3k8aPMMQPVMrKyjKhUFDiqpkhd-TLSd2k2YKR0jSIlhqnTM9aI!duXDNXBIm6KnGGbUo2a5NanG2EWpS-zfKxMliYGI15mi98PdSOA20TFzl3Rd-IgCzEN-n5!XJLTS-k!UTTIZUjT3mFIxNzBIFycnbL2rVrZeu2TCVPibqoS3L16rW-nzRlEYbCdIgQzsKgPFb-LyZ2lai3hkoDDxomDTerAUmIUaKShknjeSMkemHAEkEQQB5EgRjU8bYRCfqgr4DFqW0yIAura9OmTXL48GG5qebXWR1HHD-4TfLDDsgDduzcJVsytsrxEyflisY1pH1ppHEuidNaAk3SUcTSPRnmktguPzMqXmrO6i81fFBz1gCpPXuQbx4g3y-9TqAv!qRvZFiyZ4vJhLz4b2SGOFgdRxwHP-KUN0AeYr8jR47K-PkL7JNF99Of-lRiYmK!OGkirQyE4TCNnVJhYaF1evj8aQtIWe3-2reB7XJ!M-3!gj7pGxmQBZmQjaCYA0Dkv6njce7Ka3nKOxx5sC6nT5!R5ORk07UjTffu3Y00kyZNunfSRBKGIIqHinTECq47o7-tZP5Xj!ryn2PbaZzR7YGAvpEBWZAJ2ZCRAV64cMHGwZggjiMPxImE38SWF3DqzgPigoKCMNIMHTrUSDNr1qw7k8ZZGW8cw9Zt165dtn1j0lPyMi2W!N-qGh7tU1cqj!-4QIEMJovKhGzIyCMHLCNjcMQx8gRjHQc-Aj1opLVuLWk!6f9IQJz9!-fLj3-8Y2nRooUkJCSEkWbRokV3Jk2klSkpKbEDJBqnTLWJ3Wz38kj36vLkoCbyrG6DHySQAVmQqdrEBJMRWVNSUuTSpUsh4jjyYI3eL8qXkub-bXj-7cIwIt0L0uKryriD7v6gjKtaQSpUUFQdJwc17eC4qoF7h-g0!ejgOKmq1-FpnrbS4jXf21aaxAfbCJW5D2C!2Ny88MIL0qhRI!nWrZsMGTJEJk6ceGfSeAnDREOYq1ev2qkiYLI3FGTriq5jK-ub3V!T7w9pJj8a3vKBAhmQJWBt6piMyMrAkJtxMB5Hnnfz94QI43CjIDfkwu6M1RJvRFBFFwfTVqvi41fb9ep4JcVqb-lbUqwEqjquWG4VK2mq6rWSotjyipVs3Ie3ZWU99e8VjJnNyqlTp!Ttt9!WoqIii!-YTZJ2Jidb9nfrKOufeFTW-9t3pCChk1w9UGB1HXF4p6l69epGmsGDB4eRhrcWyiQNk4tbYrIvX75sDEMYVmnc-NctfmBlo6gnBzc1pT1IIAOyIBOyISOy4laR-arKzngAY7vQublc7N8pRJhLAzpbGpN!byiWsVWqyNjiwH3x2CpSZWxxIC8VAqV6yqYqyeIllevisVJF81Ljg3Uj762t!MA17YSslLc9f6AnRxQ-5K9Nl-RvVZB9P-kPOfHrFw1ck3b9yOEQ8YhxWrVqJe3atTPSTJgwQd58880QaTIyMm4nTaSVIQDGNdHg5XeuyxO6W2Gbi5IqKh4f0PC!oOqETvLb6b198wCyIBOyIeMlJQwyr1y5Us6ePWtjARDnho4PGGla1jKXDMkc-JQSjnDSpGJdUoN5EaQJI1SQJK6MI0spabTd!LFSbG2Wtn8nIC-jc!TYlH1QEucVS43RxfJfAwLgemaNFkaS069WC0PuUz!Uwr49w9rcuHGjNGvWTAYNGhQiDbsrX9I41!RiGdhLcEQQTN66gqxQAOxI8x0NQh-tUy8ML0-pIbtOFkuPlJnyaO-SfNKzTh205yMl71!X!MXjS!tpOcrf-OwTQ1jdxLpWr-6sQWHtOSCDI40LiJEVmTm55pSYsQCsD!N7V8dnpImpaeUgjoOXQP4oCpCmKHBfZMQoCuSlxkmFuNRguVSJqxAnqa5ekZLG8qivFqTKWCnS9NS4YFuh-OB10NLEpQbr!4BFDVn2HygyslTqXyy-fP2svDSxRH419aKB62Xf-Y5Zl0jSkIa78raJ0WjQoIH0799fxo8fLzNmzLAHw2WSxmtleEuOd3YPHTpkZBqalmTvujyiW1yUBL7Vq5Z824Mn!zeWogunjBg8G-p2j8C7M8!NjDcypB-IljoTE!01B-5emtDV6n1P69387GOpPSnRwDVp5NXWrfTOY4XyrS6vWVve-gAyOHmQDRmRFZmRHT-M9hvgZhnfdR2fc0!UY!wOXgL5o1DGKGnGFAbvUyBKil2nxKmSUwLphWOUTGMKg3UUhWOUFIFy5LlyKUoaa0vbcWmlSJG4KmMi0gIgyHeEaTGlWF4YfipElEgs!z93Jo23XYgzfPhw20HxBoEjDW9PQhp2pSHSeK0Mk8sk88jg9OnTRqaGutLdrskp6ZuqpEcSAsp6RO8nb1spO44UGCEGr54rj3T7b8ufv3ujnHv3ijwSX00eafOy-N8utaxc9FsjLL-mG32tzjfbVDPwRxr1dyhhakxOlEe6-DbQTwSQIUSa4C4KWZEZ2Ylrzp8-b2CizVWp1YEw59XSMGbG7uAl0O1YJbEu1lDEriKtQEZjOUirMloKQuViZZW3bsFoqRK7qvQ!iFWxVWR0AZ!l5VfFRvYRDuR0MQwWBsJgUcrC4Fdb!7qnvKd-JPsTE25rn51n27ZtZcyYMTJ9!nRZsGCBcE7nSxp3LsPkMsm8l8I1E1tlTAdb6c41hdD1t-ZZ-Y0!8uGnH8tTPRuZ0gcpaSxPlV1UclKSdq2TqqPay6D0JOm0eJI81q22VOz4quWTzt9jPesa!Hvh9Q7SXEkFaSq213JKoLB!fYBsyPhfo9ubzLgk3rXBjIMLJSVhrsoFyJSFZMBLoPsHJZkSbr9v3u3AC7gYBpfkR5TMox8buK7Tb2eZgfDpvNzb2ueNAZ5BjR49Wt54442ySRPpmgiwCIBcHPDDgc3DguAQVJn-2qeBEWZgyhz5RtyvTOkh0nT6jd0Xnj9hZSCB3SuRHtN6FTv-PyNFplqetANZBq4rtn1Zzr93TV5QQj2WWF86L58qXVZOs-dqwvr3ANmQ8QcDm5nMyM6A2XKCc!fO2dgA1pR8Rx7Ke8nzVcbJkyfDrMyLY8-dhr1nPjO4!zqJ22Xwy3Gy-Lv-Issf-WcNjqMlP32NtRXZPronGH799ddl2rRpMn-!fCPNli1b7LUYTo-DSONcEytz3rx5NpFM6uOqYF-SKDFWBxX9DXU9Fdu9bKQIkabDq3Z-7p0r8njnmlIx7tfyi2FtLA2rY6RRYHkgHXi8ay2zRvOyN8g32r0imccOSFqhEkqx80SRVEzwtzqONMiKzIznrbfekhPHjxsYE4eVIOSqFJTzWp2vOojVIA07IwJfPzjS!OUB6tIGbUW2z9w0btxYRo0aJVOnTjUe4LL4SlEYaSjM5GG6mVRWZlJSkqWBskhTY1ofIwDuZ2DaXBmUFngzHhJhHVA6FmbQqtl2XbHjb5Rc1WTH0QMB1wNpIIFaJPKtjFoerMxTA6LlqYHR1t7jXWoa!PvxkJgwGRy8pEFmrMjcuXPl2NGjBmdtnMW5omMF165eC43TkeerDJQN2FJ7iYA72nvqU1!Q5y1LXddOZPtwoWHDhmGk4e0BX9IwyS6eYYIx7Uwu6WW5p6oj2wUIYCQ4YGThD8syKWOFWR7SJm5ervGLEoR6ShDinLSCXaVpEAfLpOi0dLJZGchTY0pva492nBWrPjXR19o40uCekBnZsTRHDh82nDxxwkwvcNYGeF2VI89XGZz0OtLgnhzuRhpvWS9p-PqANCNGjJApU6aY8YA0vK8URhoY5kjDSsTX8XQTk44JrzK6ndTa1VaaFncKQ73tsVJnc0ups7GFfsZI7fTmptj5h5ZJvcw4qb8rXmYeXiCf-PFTGXFksjQt7CizTyVbmRmH5knj-R1CbTVTxBX2sLLt9-SRhnvaSoe9AUvWYV9fg13n9pEm2g7lvbIAZERWZEZ2-DE7DcCDTHZUgIXh4husq3NVjjxfZYTc0!tKmsGlRHg2fqU8E7vM4Mji7skLkUbreN1TZPvon2dQkIZ3alh4ZZKGSWMSWYl8PRY-xrML0pvMGiLV1raSpkWqnBA6SsPcdtIor51E7W1rSq63vZUpduGxFXZPfr3MWMm4sNPS3V-KyXVSd1usNDnQUZUNOul1B1l8NlXSzm!U!lmtpZESqn5WvKScXi-XPlVSK7huoGnUa4IMkEXlcJ8vr40zWZGZCVm6ZIm9fA54BSAUFOsY2U0BZ22AI89XGZAfhRMIVx5wNECcCDjS!OVRh7q0QVuR7aNzYhrOa3jSDWk4Xb8n0vDdIh76MZkDNSaplBytikJZDp2ksSmv9D5KiVJnS0upq0RplN9B8ztoWhuprWmtt3WXgXtHS-y2BC3TyohmbQTrQ5JeB4ZLdFZnaZineWpNGioh625rJd13DzbUUaJFWZ6STOsGUCpDpUXRJisy850son7MOWCguKhjx4-J00lNDc7iuK24I8!DwtKYGFnqk!4F!kHhbsvtRwzckbkknzzqUJc2aCuyfZ4CNG-eXEYESUNcyOMkRxqeFBhp8GORpOHtdYIfJjN17zb54YQoaVyoRFDlNFaF!qHR-vYSldtWovapBSoIlG0EcTSt3q44szr11GWh!MbkB!tBEMpbXc2jTqCutqf39dS6hOppmreeu6Y8MiIrMkN6BsrkAFYQu6ijx44aYZ6f19xMMbtFF9848twRS2JCh28VKo!QPfeSv2eEVNb7mCWR5SrLiD0ubYnE!LXnAywnYyrL2jwbu8IQme61MrTh1zZhSWxsbOjtPS9peDRzR9IUHjhgR8hM5slzZ!XJAQ2kfl57aaTEaaRK8n4amezaweUFFOr9LE0vreP9JD0yP9BHaT1vWZeObMh4QmMZZGawu4OvqQKLa44dMzjSMFaCYsYNHHnuFYtjlAiL-fNAKH!3kqZyZcUI2W15u2WE3StpdgfLL46RyiN2h9UvC8RrKN49RijLTXlBGcpSh7q04df2gAEDpH379nckDQvQ1z29rTEBrGOyaSxm7nCpurKFKdCg1sD72TDiPgTvvV2rkvk0BK8tL0AOPhu6e82z6yDowxC6p0ygHrIhI7IiM4PNy8018gPGwxuIANI8lxQgDS7KPZ9y5Lk35MhwVfrwHL884MnPGS6VWyySRS3KuNfyOcNbBK4XtSi1VFrm9nYDYByOOFgP3I4feUgjjzKOMNT1a5N4r27dutI9IeFvJI1OPAV56Ed6Sk6GfH9UlESpe3CKCynRo0zvfZTnOoBg3SBuz-dCXVMZ6eGfHaRBQXuTDRmRldPLFI34IQ3H3oDA!FfJ7ULxjMOvF7UPHfo58twVOcOkkik1!d7yuec6WQmhn8ktKsmwnAuhzwsXcmRYi2GSo2VL0!4M5HXEAaFXI3RXxZYasEsizcUwjjBljRUjUb9!-dA3Eu7onvy23Jxt8ByCbStpdPTimE5SbX2sKSpKY5CAYh1IC1w3JD4hze6D6QqrR74nLVAuSAIr4-JL00rbCpSN7Lvaulh5aVxnkxHS8x5IZmamfTMhRJrgDqruip4hwjRK6WM7KawNoP4XQfawSlJpWLZvHgjlZytpopM1LVuGVVIyVRom2ZqfHK0EydayofzgddDSRCeHt!cHdOVinDuBMlgSvzYA4!fxQXR0tJHmroGw3!HeUc0gFuCxOAyj4YWZ6!R7I!tLvfxSJbLKGzgFksZ98NOuKePJCy8XIA!f7joSgTw!3X046uW3M5mQDRkhy6LkZMlWmcMsDaTRMR0!-LYR5rl50XLq9CkjGYsCfFHiJEdXCJImWaIrREtyWfkeUkAkR4YQaXRnejtBtE0lV3ha2TCd6aKAHC6O49odNfjV8YKT31deeUXi4!Kkp5Lmrltuv8cIdAZDKUiDBE5Mas2pveXni6ODSmsX!NRdk1eR-tCy!z3lrQ73wXRDsKy3nPc!1F9p2Z8vbiY1Jvcy2ZARK8MbaMidl5t3G2kA7pcxAuo40jji3AlZQyuVxhyVhkqWpS800iwsKz9rqJJm4W1tLVTSDM3iM1A3kBasq4heGF7!HwXmgKC8Zo0aEh8fL7169rz74Z7fA0u2p0w05oiDPuIEOthdXCDf79dIfrM1TuoHFV7fFNrePuvbvSJICu4DJEHhgbKWFixTWi6YziftuXvNC1wH7l2fpCEDsiATsrHNXrhggWRu3y45OsB9eXmhQJiYpizSYG28Fuf!YoFalKGyyzfv-oCfKvnBD35gQXBrSNOr190fIzjSeIPhU!orCYaZcF7z49t2HJLRyazNKfLEsHpSI6d1QJEKXJZ9Bu8jr7339qlupayyXHvvvenuupb2-cSw!iYLMmEVeYN!sw5ux44dtt0mJnOm2kij1hOwIBxpeKwAcbzkKU-gDU1eVnv6qaekfr160qZ1a0lMTLz7A0tevvEGw6xaJpRViTKY-HVr19q5DekoqdfSabpjqS!197QJKrmtxRdO4Qbu89sqQSLyuHf5Li2E0rKOWJFpdbRP!kYGZCEY5OsWSzT635qRIbt27gz9koQLBFkAYaTROsBLmvIGYtWpU6dJ7t698hSk0Z1T2zZtpHfv3nd-NQLSuLjGz0Ud0IJ7VQlE0TQAQ8nvnDzRlFedE1sjRoAMdd21InQdTK9ryieNe70OksHSFIG0YD27D5R17dXIibc!6dsNfrGSJUl9L1Zm!7ZtNhlMBK61WAkDIkkD0cDpU4GHmOWNPBkZW2WSxixr164zHf-k6aclqkEDe9WzT58!d38Ji3dDI12UW8FsvTHvWBsq8Qol7w874vRf8aa5qlcz4kzBdfcFwXVQ0dwHiBAkTijfESmIYHo9Txul9drJyxrD0BcWhr6RAdOJ69yg8UyGDmyH7p54LZHnZpD9oLpUwIGUe7eGmMaRxrmo8gIeUi5bvkLmvpUk6elr1ZXvtLl5WknTMCrKToP79u1799c9IY3X2rhdFJ1wGOSsDas3a9cuW9npaWmWj-JmblxpAel-LmomtXIDyq7j4Aig4N59ku7KuPwQeRyCZWrntbW26YO!6JO!2QrO0t3S2vR02aQ7pm1bt6pr2hVwTfvyA7GMyg4gP2MBkaQpL8BTcO4yRwmzYf1Gydi6TbKzss3yPvOTn0jjRo2kQ4cO0q9fv7u-WM7XFyBNWdbGxTbECFTcqYEm37xDCJiLErMO7JMaUxLtzOTF9Bipta91kDBtAgQxUui1kqCOfgYIQR5pwXRP2QBZ2shL6S2tTdqmD-qiT95hfnPmm7JGyYuVwXxyRoM15FCvQF2TxTIaAAMG6keah504jJeHz3xRoEaNmvb123XrN8imzWqV1crk7s2VM7oAn3nmGXslomPHjva9p7t!hQXSOBdFQBxpbWAiE89Oim0sisENYHFgLg1RDiGTMtLkxbGd5MmRUVJpWbRUz1byqPINRoo2UtsRw1Ca7u6pQ90nRzaQX47uaG3SNn3gUzGbnMek6WAI0Illtmksw2P9Pbv3mCtFJtwSsYyLZ8oizcOCI0ePSf5!9Qi6aFDylDmLTPFYC44hGjdpanO0YdMWna9Mycpmh5kv59U4PPfss9KkSRPp1KmTDBw48O5flnOkibQ27rECCmPSI90UgsBgoux0dRFYAEeeZTs2SPTsofJkvwby7!Oj5Pn5TeQXaS3klYyW8pqSomZuAK9lx2tarOX9VMtQljrUpQ1HFvwu5pJ3PfC7ib16SV8N2AboqmCQ-NIBZwsEcJhWVgpfLeVUE3DmgJwOBHkPA2o2amkHcAPGTJdBY2dK7SaxtpA5FR81Y4kddKLwfF1IzZo1l93qurdu3S47d2XJ3tw8KSosMj0-q6Rp2rSpdOnSxb6WC2nu!LVcvlnnJU7kToqAEybjpli97ErYTUEcVvjGDRtkgUbZKJWtGeRB2eCg1lm6c4P0XjJN6r7RV34!so38!4Cm9tUUwHXlUW0kavoA6bN0upWljquPgOzY!mlwhtmcoGSYqlH-dJ2wN2fOlNm61Z6nk5asq4kt9-JlyyzWwQ-juoh3ABbJYb2aaFzaw4CWHRPtkcmcFZsVW6Rlp952EIe7npK8zvRDOFGk8V10ixgjD4TJ2c3uskANQeCVz!eee86ePXXt2vXefgDAkcYb27hzG!emiCUw6wSULr7xEgdBcRdsfVnJ!EHchFP!FwEERUCI0F!DMjOXY8fKNLUW03FNdyALMqSvWWPkYFIhNEA!B4jtBRP8dUWrLn0t8E9K3S7zVmdKbNd!5gEIH2Yu22z6IRZBbzEtW5nuIAxuqaiYZ1PHTN!QBit!zz81AmnKsjbeAz!LbzzE8VocBEUBKIpVPi8pyZ5dTFTGLlK-yBE-ARmdcjqLNQJc0w6nuBANQQcNHGRuB3djVkWJMlP9KzuluXPmyHxtmzYhCz8gybYbqxIiippkJpTVAaEdkNFN6MOC1gkDLehPTs!S5LXZ0qb7INMHcefslEwLJWzx6kKMjY0zheft2687y2I59PZhXaCnTO-PP-!8PeG!5x818pLGjzguvimLOAiGkJhBFIXSUCCKRKlYHxSPySPm4AkqguE7Aczm-Q1OIYlFnDWBJFiUJPXREAWrslgHsWzpUtu5QU5cD!7GEQVyMJmcCgMm0KAmHBkfNrTtOcSeZi-dlGtonzjMnu6zYUlKzw48e1PXVKK6a926jZGnQAlTfPBtOXb8hHqQs-bDRvzm3hf!!TQ-4mC27kQcF!O4XRWNoihWMwrELTjyYA1WatDMNwSwEIs1wIIECzUWWjBvnpHCgXvSjSRajvIcKjqi4H4cUSAp-TmCYIqRAyK7yQtBV9zDhg59RpjFTtleKKmZRdK576gQURZtzLNdL3oiPm3brr39YnnxocO60zouJ0-xdZ4S!0Gjv!mHGv1I441vIolDjGPBse6qbDuuQhLnOKsTRh5VLkrGKhBzENgSf7DzIhbBcoRB0yCIN6B1roeYhAE4a0JfuEhIQf-s7mzSghOHNYyEOyV!GNB1wBizImuzj8i6nKPSdeBY8wIQZfm2IlvcxInosX2HjnJR9XdY45jjJ07JmbN82-SS-bbw3-yTsF!EOATH7KoQiHMcBGUQKMuRh1WPYlEwnRLzQCCUDwkARMJyOLidjlmSYADr3A7uz1kTsyK60owkSg765kiAMxk3ae5Z08MCd87kRcLgCWZFNuedkk37Tkv3IRNtMaOXlF2HTUccm-BLVx07dZarGqMeO675pzVdrcylS5f-vh!fvhtxvMExuyq24wiEu0JQBoHSHHmId1AulgCLgMJRPBYIEiAI7sUL0rxxCXW81oQ2aRuLYSe9EEQnFOKyqtyE!QE5Hzb0HD7ZdLO1sMTQa8RU0wneIG33CdMRixwX1LlLV13876pbOmNWpuQCv6DxJfzMvRd3Iw4M91odBuHIgzJZ!SjXEQjL4EiEAFgMCOHg4hHyXTziSII1cZYEK!KeVDsy4C7dqmLCAHI97EgcOc1!Y3DHoSuG3qOmm05Y1OvyAl!rRldYE0jz3ns35PSZcxrbnP-y-qFGJLzEceSBOF53hYA8q2IQjjwoE8ViBSAQViFEIiWAESGIsDgERLgbSAIRnX!mffpxxGA10b!bLD9A8IcRfUfPsF9qzzryjmQffVf6jplpJEE3G-aft090BTG6dO1m-w-q9Nnz6pp0ztQ1Xf2y-nVPJBxxyrI6fuRhxXsJhFWARCjffLR27Iug7460JF6SeAnCxLnV5CarPKH-2Fn2q!N7Ttww9B83y0iCbjYduGh6AvwTja5dE!SDD2!qa1JLXKJzeFnn7sv8J2GR8COOI4!zOgAFokiU6giEsh2JcCOQwJHJwaVFuhmvFfESxPVH326SyhMcGQaMn2NKzz39oYF7p5stRZdCHoL-99StG7-qftP!1xP-We7yZZ3LB-Uvlt0AGIxTJop1BMIiOBIBiOAHl!9nRbwk8U6amyAHN0nlBV-kH59Cmps3b5lruq!kcfASBzilOfJ4rY8jkSNSWXBlvATxksSPGE6O8oov8i!WvzzSHJH-DwTu5gRp9aR0AAAAAElFTkSuQmCC
1 0