import  java.security.SecureRandom ; 
import  java.util.Random ; 
 
public  class  Main { 
 
    private  static  final  char [ ]  CHARSET_aZ =  "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" .toCharArray ( ) ; 
    private  static  final  char [ ]  CHARSET_AZ_09 =  "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" .toCharArray ( ) ; 
    private  static  final  char [ ]  CHARSET_HEX =  "0123456789ABCDEF" .toCharArray ( ) ; 
    private  static  final  char [ ]  CHARSET_SPECIAL =  {  '!' , 'A' , 'B'  } ; 
 
    public  static  String  randomString
( char [ ]  characterSet, 
int  length
)  {          char [ ]  result =  new  char [ length] ; 
        for  ( int  i =  0 ;  i <  result.length ;  i++ )  { 
            // picks a random index out of character set > random character 
            int  randomCharIndex =  random.nextInt ( characterSet.length ) ; 
            result[ i]  =  characterSet[ randomCharIndex] ; 
        } 
    } 
 
    public  static  void  main
( String [ ]  args
)  {          System .
out .
println ( "using a-z A-Z" ) ;          for  ( int  i =  0 ;  i <  5 ;  i++ ) 
            System .
out .
println ( randomString
( CHARSET_aZ, 
30 ) ) ;   
        System .
out .
println ( "\n using A-Z 0-9" ) ;          for  ( int  i =  0 ;  i <  5 ;  i++ ) 
            System .
out .
println ( randomString
( CHARSET_AZ_09, 
30 ) ) ;   
        System .
out .
println ( "\n using HEX" ) ;          for  ( int  i =  0 ;  i <  5 ;  i++ ) 
            System .
out .
println ( randomString
( CHARSET_HEX, 
30 ) ) ;   
        System .
out .
println ( "\n using SPECIAL" ) ;          for  ( int  i =  0 ;  i <  5 ;  i++ ) 
            System .
out .
println ( randomString
( CHARSET_SPECIAL, 
30 ) ) ;   
        System .
out .
println ( "\n increasing length" ) ;          for  ( int  i =  0 ;  i <  10 ;  i++ ) 
            System .
out .
println ( "len "  +  i 
+  " => "  +  randomString
( CHARSET_AZ_09, i
) ) ;      } 
} 
 
aW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tOwppbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKCnB1YmxpYyBjbGFzcyBNYWluIHsKCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gQ0hBUlNFVF9hWiA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIi50b0NoYXJBcnJheSgpOwogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIENIQVJTRVRfQVpfMDkgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5Ii50b0NoYXJBcnJheSgpOwogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIENIQVJTRVRfSEVYID0gIjAxMjM0NTY3ODlBQkNERUYiLnRvQ2hhckFycmF5KCk7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gQ0hBUlNFVF9TUEVDSUFMID0geyAnIScsICdBJywgJ0InIH07CgogICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmFuZG9tU3RyaW5nKGNoYXJbXSBjaGFyYWN0ZXJTZXQsIGludCBsZW5ndGgpIHsKICAgICAgICBSYW5kb20gcmFuZG9tID0gbmV3IFNlY3VyZVJhbmRvbSgpOwogICAgICAgIGNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5ndGhdOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIC8vIHBpY2tzIGEgcmFuZG9tIGluZGV4IG91dCBvZiBjaGFyYWN0ZXIgc2V0ID4gcmFuZG9tIGNoYXJhY3RlcgogICAgICAgICAgICBpbnQgcmFuZG9tQ2hhckluZGV4ID0gcmFuZG9tLm5leHRJbnQoY2hhcmFjdGVyU2V0Lmxlbmd0aCk7CiAgICAgICAgICAgIHJlc3VsdFtpXSA9IGNoYXJhY3RlclNldFtyYW5kb21DaGFySW5kZXhdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhyZXN1bHQpOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInVzaW5nIGEteiBBLVoiKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJhbmRvbVN0cmluZyhDSEFSU0VUX2FaLCAzMCkpOwoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxudXNpbmcgQS1aIDAtOSIpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKQogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmFuZG9tU3RyaW5nKENIQVJTRVRfQVpfMDksIDMwKSk7CiAgICAgICAgCiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbnVzaW5nIEhFWCIpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKQogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmFuZG9tU3RyaW5nKENIQVJTRVRfSEVYLCAzMCkpOwoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxudXNpbmcgU1BFQ0lBTCIpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKQogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmFuZG9tU3RyaW5nKENIQVJTRVRfU1BFQ0lBTCwgMzApKTsKCiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbmluY3JlYXNpbmcgbGVuZ3RoIik7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKQogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImxlbiAiICsgaSArICIgPT4gIiArIHJhbmRvbVN0cmluZyhDSEFSU0VUX0FaXzA5LCBpKSk7CiAgICB9Cn0K