| 
					
				 | 
			
			
				@@ -0,0 +1,715 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+package nckd.jimin.jyyy.fi.plugin.operate; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.io.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.nio.ByteBuffer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//import java.nio.charset.StandardCharsets; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.Arrays; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+public class SRMBase64Util 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private static class DecInputStream extends InputStream 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public int read() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throws IOException 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return read(sbBuf, 0, 1) != -1 ? sbBuf[0] & 255 : -1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public int read(byte abyte0[], int i, int j) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throws IOException 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(closed) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                throw new IOException("Stream is closed"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(eof && nextout < 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return -1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(i < 0 || j < 0 || j > abyte0.length - i) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                throw new IndexOutOfBoundsException(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            int k = i; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(nextout >= 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                do 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if(j == 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        return i - k; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    abyte0[i++] = (byte)(bits >> nextout); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    j--; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    nextout -= 8; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } while(nextout >= 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                bits = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            do 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(j <= 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                int l = is.read(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(l == -1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    eof = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if(nextin != 18) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if(nextin == 12) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            throw new IOException("Base64 stream has one un-decoded dangling byte."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        abyte0[i++] = (byte)(bits >> 16); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        j--; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if(nextin == 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            if(j == 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                bits >>= 8; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                nextout = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            } else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                abyte0[i++] = (byte)(bits >> 8); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if(i == k) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        return -1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        return i - k; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(l == 61) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if(nextin == 18 || nextin == 12 || nextin == 6 && is.read() != 61) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        throw new IOException((new StringBuilder()).append("Illegal base64 ending sequence:").append(nextin).toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    abyte0[i++] = (byte)(bits >> 16); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    j--; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if(nextin == 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if(j == 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            bits >>= 8; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            nextout = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            abyte0[i++] = (byte)(bits >> 8); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    eof = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if((l = base64[l]) == -1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if(!isMIME) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        throw new IOException((new StringBuilder()).append("Illegal base64 character ").append(Integer.toString(l, 16)).toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                bits |= l << nextin; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(nextin == 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    nextin = 18; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    for(nextout = 16; nextout >= 0;) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        abyte0[i++] = (byte)(bits >> nextout); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        j--; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        nextout -= 8; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if(j == 0 && nextout >= 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            return i - k; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    bits = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                nextin -= 6; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } while(true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return i - k; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public int available() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throws IOException 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(closed) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                throw new IOException("Stream is closed"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return is.available(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void close() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throws IOException 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(!closed) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                closed = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                is.close(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private final InputStream is; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private final boolean isMIME; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private final int base64[]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private int bits; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private int nextin; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private int nextout; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private boolean eof; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private boolean closed; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private byte sbBuf[]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        DecInputStream(InputStream inputstream, int ai[], boolean flag) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            bits = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            nextin = 18; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            nextout = -8; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            eof = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            closed = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            sbBuf = new byte[1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            is = inputstream; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            base64 = ai; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            isMIME = flag; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static class Decoder 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public byte[] decode(byte abyte0[]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            byte abyte1[] = new byte[outLength(abyte0, 0, abyte0.length)]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            int i = decode0(abyte0, 0, abyte0.length, abyte1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(i != abyte1.length) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                abyte1 = Arrays.copyOf(abyte1, i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return abyte1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public byte[] decode(String s) throws UnsupportedEncodingException 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return decode(s.getBytes("ISO-8859-1"));//StandardCharsets.ISO_8859_1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public int decode(byte abyte0[], byte abyte1[]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            int i = outLength(abyte0, 0, abyte0.length); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(abyte1.length < i) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                throw new IllegalArgumentException("Output byte array is too small for decoding all input bytes"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return decode0(abyte0, 0, abyte0.length, abyte1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public ByteBuffer decode(ByteBuffer bytebuffer) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            int i = bytebuffer.position(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                byte abyte0[]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                int j; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                int k; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(bytebuffer.hasArray()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    abyte0 = bytebuffer.array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    j = bytebuffer.arrayOffset() + bytebuffer.position(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    k = bytebuffer.arrayOffset() + bytebuffer.limit(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    bytebuffer.position(bytebuffer.limit()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    abyte0 = new byte[bytebuffer.remaining()]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    bytebuffer.get(abyte0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    j = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    k = abyte0.length; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                byte abyte1[] = new byte[outLength(abyte0, j, k)]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return ByteBuffer.wrap(abyte1, 0, decode0(abyte0, j, k, abyte1)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            catch(IllegalArgumentException illegalargumentexception) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                bytebuffer.position(i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                throw illegalargumentexception; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public InputStream wrap(InputStream inputstream) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            requireNonNull(inputstream); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return new DecInputStream(inputstream, isURL ? fromBase64URL : fromBase64, isMIME); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private int outLength(byte abyte0[], int i, int j) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            int ai[] = isURL ? fromBase64URL : fromBase64; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            int k = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            int l = j - i; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(l == 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(l < 2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(isMIME && ai[0] == -1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    throw new IllegalArgumentException("Input byte[] should at least have 2 bytes for base64 bytes"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(isMIME) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                int i1 = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                do 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if(i >= j) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    int j1 = abyte0[i++] & 255; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if(j1 == 61) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        l -= (j - i) + 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if((j1 = ai[j1]) == -1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        i1++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } while(true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                l -= i1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(abyte0[j - 1] == 61) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                k++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(abyte0[j - 2] == 61) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    k++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(k == 0 && (l & 3) != 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                k = 4 - (l & 3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return 3 * ((l + 3) / 4) - k; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private int decode0(byte abyte0[], int i, int j, byte abyte1[]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            int ai[] = isURL ? fromBase64URL : fromBase64; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            int k = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            int l = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            int i1 = 18; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            do 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(i >= j) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                int j1 = abyte0[i++] & 255; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if((j1 = ai[j1]) < 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if(j1 == -2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if(i1 == 6 && (i == j || abyte0[i++] != 61) || i1 == 18) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            throw new IllegalArgumentException("Input byte array has wrong 4-byte ending unit"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if(!isMIME) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        throw new IllegalArgumentException((new StringBuilder()).append("Illegal base64 character ").append(Integer.toString(abyte0[i - 1], 16)).toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    l |= j1 << i1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if((i1 -= 6) < 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        abyte1[k++] = (byte)(l >> 16); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        abyte1[k++] = (byte)(l >> 8); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        abyte1[k++] = (byte)l; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        i1 = 18; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        l = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } while(true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(i1 == 6) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                abyte1[k++] = (byte)(l >> 16); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(i1 == 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                abyte1[k++] = (byte)(l >> 16); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                abyte1[k++] = (byte)(l >> 8); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(i1 == 12) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                throw new IllegalArgumentException("Last unit does not have enough valid bits"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            while(i < j)  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(!isMIME || ai[abyte0[i++]] >= 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    throw new IllegalArgumentException((new StringBuilder()).append("Input byte array has incorrect ending byte at ").append(i).toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return k; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private final boolean isURL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private final boolean isMIME; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private static final int fromBase64[]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private static final int fromBase64URL[]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        static final Decoder RFC4648 = new Decoder(false, false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        static final Decoder RFC4648_URLSAFE = new Decoder(true, false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        static final Decoder RFC2045 = new Decoder(false, true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        static  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            fromBase64 = new int[256]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Arrays.fill(fromBase64, -1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for(int i = 0; i < Encoder.toBase64.length; i++) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                fromBase64[Encoder.toBase64[i]] = i; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            fromBase64[61] = -2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            fromBase64URL = new int[256]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Arrays.fill(fromBase64URL, -1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for(int j = 0; j < Encoder.toBase64URL.length; j++) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                fromBase64URL[Encoder.toBase64URL[j]] = j; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            fromBase64URL[61] = -2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private Decoder(boolean flag, boolean flag1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            isURL = flag; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            isMIME = flag1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private static class EncOutputStream extends FilterOutputStream 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void write(int i) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throws IOException 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            byte abyte0[] = new byte[1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            abyte0[0] = (byte)(i & 255); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            write(abyte0, 0, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private void checkNewline() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throws IOException 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(linepos == linemax) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                out.write(newline); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                linepos = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void write(byte abyte0[], int i, int j) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throws IOException 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(closed) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                throw new IOException("Stream is closed"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(i < 0 || j < 0 || j > abyte0.length - i) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                throw new ArrayIndexOutOfBoundsException(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(j == 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(leftover != 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(leftover == 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    b1 = abyte0[i++] & 255; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if(--j == 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        leftover++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                b2 = abyte0[i++] & 255; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                j--; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                checkNewline(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                out.write(base64[b0 >> 2]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                out.write(base64[b0 << 4 & 63 | b1 >> 4]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                out.write(base64[b1 << 2 & 63 | b2 >> 6]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                out.write(base64[b2 & 63]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                linepos += 4; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            int k = j / 3; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            leftover = j - k * 3; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            while(k-- > 0)  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                checkNewline(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                int l = (abyte0[i++] & 255) << 16 | (abyte0[i++] & 255) << 8 | abyte0[i++] & 255; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                out.write(base64[l >>> 18 & 63]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                out.write(base64[l >>> 12 & 63]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                out.write(base64[l >>> 6 & 63]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                out.write(base64[l & 63]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                linepos += 4; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(leftover == 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                b0 = abyte0[i++] & 255; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(leftover == 2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                b0 = abyte0[i++] & 255; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                b1 = abyte0[i++] & 255; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void close() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throws IOException 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(!closed) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                closed = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(leftover == 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    checkNewline(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    out.write(base64[b0 >> 2]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    out.write(base64[b0 << 4 & 63]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if(doPadding) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        out.write(61); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        out.write(61); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(leftover == 2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    checkNewline(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    out.write(base64[b0 >> 2]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    out.write(base64[b0 << 4 & 63 | b1 >> 4]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    out.write(base64[b1 << 2 & 63]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if(doPadding) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        out.write(61); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                leftover = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                out.close(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private int leftover; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private int b0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private int b1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private int b2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private boolean closed; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private final char base64[]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private final byte newline[]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private final int linemax; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private final boolean doPadding; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private int linepos; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        EncOutputStream(OutputStream outputstream, char ac[], byte abyte0[], int i, boolean flag) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            super(outputstream); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            leftover = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            closed = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            linepos = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            base64 = ac; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            newline = abyte0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            linemax = i; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            doPadding = flag; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static class Encoder 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private final int outLength(int i) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            int j = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(doPadding) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                j = 4 * ((i + 2) / 3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                int k = i % 3; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                j = 4 * (i / 3) + (k != 0 ? k + 1 : 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(linemax > 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                j += ((j - 1) / linemax) * newline.length; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return j; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public byte[] encode(byte abyte0[]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            int i = outLength(abyte0.length); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            byte abyte1[] = new byte[i]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            int j = encode0(abyte0, 0, abyte0.length, abyte1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(j != abyte1.length) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return Arrays.copyOf(abyte1, j); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return abyte1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public int encode(byte abyte0[], byte abyte1[]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            int i = outLength(abyte0.length); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(abyte1.length < i) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                throw new IllegalArgumentException("Output byte array is too small for encoding all input bytes"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return encode0(abyte0, 0, abyte0.length, abyte1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public String encodeToString(byte abyte0[]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            byte abyte1[] = encode(abyte0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return new String(abyte1, 0, 0, abyte1.length); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public ByteBuffer encode(ByteBuffer bytebuffer) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            int i = outLength(bytebuffer.remaining()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            byte abyte0[] = new byte[i]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            int j = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(bytebuffer.hasArray()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                j = encode0(bytebuffer.array(), bytebuffer.arrayOffset() + bytebuffer.position(), bytebuffer.arrayOffset() + bytebuffer.limit(), abyte0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                bytebuffer.position(bytebuffer.limit()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                byte abyte1[] = new byte[bytebuffer.remaining()]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                bytebuffer.get(abyte1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                j = encode0(abyte1, 0, abyte1.length, abyte0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(j != abyte0.length) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                abyte0 = Arrays.copyOf(abyte0, j); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return ByteBuffer.wrap(abyte0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public OutputStream wrap(OutputStream outputstream) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            requireNonNull(outputstream); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return new EncOutputStream(outputstream, isURL ? toBase64URL : toBase64, newline, linemax, doPadding); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public Encoder withoutPadding() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(!doPadding) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return new Encoder(isURL, newline, linemax, false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private int encode0(byte abyte0[], int i, int j, byte abyte1[]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            char ac[] = isURL ? toBase64URL : toBase64; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            int k = i; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            int l = ((j - i) / 3) * 3; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            int i1 = i + l; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(linemax > 0 && l > (linemax / 4) * 3) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                l = (linemax / 4) * 3; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            int j1 = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            do 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(k >= i1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                int k1 = Math.min(k + l, i1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                int i2 = k; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                int k2 = j1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                while(i2 < k1)  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    int l2 = (abyte0[i2++] & 255) << 16 | (abyte0[i2++] & 255) << 8 | abyte0[i2++] & 255; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    abyte1[k2++] = (byte)ac[l2 >>> 18 & 63]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    abyte1[k2++] = (byte)ac[l2 >>> 12 & 63]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    abyte1[k2++] = (byte)ac[l2 >>> 6 & 63]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    abyte1[k2++] = (byte)ac[l2 & 63]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                i2 = ((k1 - k) / 3) * 4; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                j1 += i2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                k = k1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(i2 == linemax && k < j) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    byte abyte2[] = newline; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    int i3 = abyte2.length; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    int j3 = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    while(j3 < i3)  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        byte byte0 = abyte2[j3]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        abyte1[j1++] = byte0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        j3++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } while(true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(k < j) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                int l1 = abyte0[k++] & 255; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                abyte1[j1++] = (byte)ac[l1 >> 2]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(k == j) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    abyte1[j1++] = (byte)ac[l1 << 4 & 63]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if(doPadding) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        abyte1[j1++] = 61; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        abyte1[j1++] = 61; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    int j2 = abyte0[k++] & 255; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    abyte1[j1++] = (byte)ac[l1 << 4 & 63 | j2 >> 4]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    abyte1[j1++] = (byte)ac[j2 << 2 & 63]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if(doPadding) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        abyte1[j1++] = 61; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return j1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private final byte newline[]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private final int linemax; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private final boolean isURL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private final boolean doPadding; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private static final char toBase64[] = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7',  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            '8', '9', '+', '/' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private static final char toBase64URL[] = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7',  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            '8', '9', '-', '_' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private static final int MIMELINEMAX = 76; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private static final byte CRLF[] = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            13, 10 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        static final Encoder RFC4648 = new Encoder(false, null, -1, true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        static final Encoder RFC4648_URLSAFE = new Encoder(true, null, -1, true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        static final Encoder RFC2045 = new Encoder(false, CRLF, 76, true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private Encoder(boolean flag, byte abyte0[], int i, boolean flag1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            isURL = flag; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            newline = abyte0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            linemax = i; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            doPadding = flag1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private SRMBase64Util() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static Encoder getEncoder() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return Encoder.RFC4648; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static Encoder getUrlEncoder() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return Encoder.RFC4648_URLSAFE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static Encoder getMimeEncoder() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return Encoder.RFC2045; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static Encoder getMimeEncoder(int i, byte abyte0[]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        requireNonNull(abyte0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        int ai[] = Decoder.fromBase64; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        byte abyte1[] = abyte0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        int j = abyte1.length; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for(int k = 0; k < j; k++) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            byte byte0 = abyte1[k]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(ai[byte0 & 255] != -1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                throw new IllegalArgumentException((new StringBuilder()).append("Illegal base64 line separator character 0x").append(Integer.toString(byte0, 16)).toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(i <= 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return Encoder.RFC4648; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return new Encoder(false, abyte0, (i >> 2) << 2, true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static Object requireNonNull(Object obj) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(obj == null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throw new NullPointerException(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return obj; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static Decoder getDecoder() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return Decoder.RFC4648; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static Decoder getUrlDecoder() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return Decoder.RFC4648_URLSAFE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static Decoder getMimeDecoder() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return Decoder.RFC2045; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |