Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

generating password string from specific Rule does not function #65

Closed
ZingerDerGOD opened this issue Apr 11, 2021 · 6 comments
Closed
Assignees
Labels
bug Something isn't working

Comments

@ZingerDerGOD
Copy link

Describe the bug
Consider a common use-case:
We have a regex, used to validate a "password" string.
F.e. ^(?=.*[A-Z])(?=.*[!@#$&*])(?=.*[0-9])(?=.*[a-z])[A-Za-z0-9@$!*#&]{8,25}$
Limits:

  • 1+ lower-case eng char
  • 1+ uppercase eng char
  • 1+ digit
  • 1+ special char, from the subset (!@#$&*)
  • limited to overall length from 8 to 25 chars

Then, if we try to feed it to the library, and afterwards generate a password, we are getting passwords which are

  • containing special characters, that where not mentioned in the regex
  • does not qualify the length restrictions.
    F.e. 7'lP|EyCt"S*00?]7A,<(hhjkR9u82v$!TnIs$$RG*x, or +~WioK%R#6=6IU]r23Y@Zm&GN@#!6nH3ng1s0&vH4.

THen, for the sake of experiment, if we would consider simplifying the workflow by introducing another pattern, which would be used only for generating the password, with something more simple, like that: ^[A-Za-z0-9@$!*#&]{8,25}$ - we do actually get proper passwords generated, but not every time.
As this regex does not qualify any occurrence-times-per-group restrictions, only the overall pattern - generated password might have inclusions from all groups, or might not have...
F.e.
7GgDIEFsD, lZcYX6IpgGwOMOO5vQD#pT.
Both generated from single run, using simplified regex.

Honestly - I have no ideas of how to tackle this issue nicely, and any advisory/workaround would be as welcomed as the fix.

To Reproduce
Steps to reproduce the behavior:

  1. With regex pattern ^(?=.*[A-Z])(?=.*[!@#$&*])(?=.*[0-9])(?=.*[a-z])[A-Za-z0-9@$!*#&]{8,25}$
  2. Use code/API
val rgxGen:RgxGen = new RgxGen("^(?=.*[A-Z])(?=.*[!@#$&*])(?=.*[0-9])(?=.*[a-z])[A-Za-z0-9@$!*#&]{8,25}$");
rgxGen.generate();
  1. See error
    Semantic: Generated string does not match the regex restrictions.

Expected behavior
Generated string would follow original Regex restrictions.

Environment (please complete the following information):

  • OS: [e.g. iOS]
    Ubuntu 20.10
  • JDK/JRE version
    JDK 8
  • RgxGen Version or commit id
    Latest.
@ZingerDerGOD ZingerDerGOD added the bug Something isn't working label Apr 11, 2021
@ZingerDerGOD
Copy link
Author

Just to clarify few things:

This is scala code, but should be no difference from java.

Specific version is: "com.github.curious-odd-man" % "rgxgen" % "1.3"

I have also tried playing around with settings (specificly generation.infinite.repeat), as with default settings generated strings are reeeally looong...
But overall - it does not solve the issue, as with default regexp generated strings still have inclusion of non-valid characters.

Perfect solution for me would be - using same regex for checking, and for generating the passwords. But in case this issue is "solvable" with just adding custom regexp, used for generating the password - I'm fine wht that too :)

And - yes, apologies, I'm not that good with regexps in general, so I might be overlooking obvious things here. Sorry :)

@ZingerDerGOD
Copy link
Author

ZingerDerGOD commented Apr 11, 2021

Atm "solved" the issue by re-generating password...
ugly, but will do as a temporary solution, until I'll get some help form you, sir :)

For the reference, my working code:

    val rgxGen:RgxGen = new RgxGen(getPasswordRule().passwordGenerationRule);
    var props:RgxGenProperties = new RgxGenProperties()
    props.setProperty("generation.infinite.repeat", "10");
    rgxGen.setProperties(props);
    var newPassword = "";
    var matches:Boolean = false;
    var attempts = 0;
    do {
      newPassword = rgxGen.generate();
      matches = checkStrength(newPassword);
      attempts = attempts + 1;
    }
    while (!matches && attempts < RANDOM_PASSWORD_GENERATION_ATTEMPTS)
    if (!matches) {
      throw new Exception("ERROR: Password generator failed to generate proper password after " + RANDOM_PASSWORD_GENERATION_ATTEMPTS + " attempts. Please try again.")
    }
    newPassword

I guess it can be used as a pseudocode, if somebody would need it.

Checking with RANDOM_PASSWORD_GENERATION_ATTEMPTS < 5 showed quite high error rate (up to 10%), but with 8+ error rate is close to 0% (with 10 attempts - out of 100.000 password generation requests all resulted in success).
Be wary tho that these rates should be valid only for described above strength checks.

@curious-odd-man
Copy link
Owner

Hello!

Thank you for reaching out and reporting this issue.
The issue you've described is a known one and it is mentioned among limitations here. Moreover there is already opened ticked for this kind of issue - #63.

The long story short - the problem is that it is quite hard at the moment to handle situation when lookbehind/lookahead should influence/limit possible variations of other parts of expression.

From my current view your case is particularly complex. And most probably will be solved (if I will not find any nicer approach), by just brute-force:

  1. Generate text by: [A-Za-z0-9@$!*#&]{8,25}
  2. Check that each other lookahead is satisfied.
    This is because even though it is possible to "understand" that you require to have all of these characters at least once in generated text, though I would need to tamper with randomness to enforce this kind of rule. And this complicates things a lot, which I probably would like to avoid.

Let's keep this ticket open for now and I will think about the solution for this and the previously mentioned ticket, though I don't want to promise that the solution will be in a nearest time available.

I will need to think more about approaching this issue, but most probably I will have quite limited solution with a brute-force approach and some configuration options to fine-tune the process.

In the meantime - regarding your solution:

The approach you've taken works only by a miracle. The fact is that it currently works as follows:

  1. Generate value matching (?=.*[A-Z]) - first positive lookahead
  2. Generate value matching (?=.*[!@#$&*])
  3. Generate value matching (?=.*[0-9])
  4. Generate value matching (?=.*[a-z])
  5. Generate value matching [A-Za-z0-9@$!*#&]{8,25}
  6. Concatenate all values

This is obviously incorrect approach and the results are also only occasionally might be valid.

There are few ways I see how you can improve this:
First
Generate by final part - [A-Za-z0-9@$!*#&]{8,25} - and then validate with your whole pattern, if does not match - regenerate. I think it will result in a more successes.
Alternatively
You can change a pattern a bit:

Java test:

 String newPattern = "(?=.*[A-Z])(?=.*[!@#$&*])(?=.*[0-9])(?=.*[a-z])([A-Z]|[a-z]|[0-9]|[!@#$&*]){8,25}";

Pattern compile = Pattern.compile(newPattern);
RgxGen rgxGen = new RgxGen(newPattern);
RgxGenProperties props = new RgxGenProperties();
props.setProperty("generation.infinite.repeat", "0");             // NOTE this 0 !!!
rgxGen.setProperties(props);
String text;
do {
    text = rgxGen.generate();
    System.out.println(text);
} while(compile.matcher(text).find());

This tricks RgxGen with the fact, that each alternative has equal probability to be selected for each character generation.
And given that you have at least 8 character long password and only 4 groups - the probability for each group to appear is quite high. Though you still need your check.
I've ran this sample code above for a several seconds and it did not stop - meaning all generated values matched.

Hope that helps. :)

@ZingerDerGOD
Copy link
Author

ZingerDerGOD commented Apr 11, 2021

Good day :)

Ok, then let's hope this will get resolved with the version, that will contain that #63 fix :)

Meanwhile, my 5 cents on your latest comment:

First of all I totally understand that this is a really complicated case of regex for generating a string.
But this regex is actually quite common for the task it is designed for: validating password complexity.
So - I'm not saying that you have to get it working or something sir :)
But I do think, that this is (imho) one of the most common use-cases for the generate string out of RegEx in general :)
Just a couple of cents on why this feature even required :)

Then, about your last comment.

String newPattern = "(?=.[A-Z])(?=.[!@#$&])(?=.[0-9])(?=.[a-z])([A-Z]|[a-z]|[0-9]|[!@#$&]){8,25}";

First of all - thank you very much for this new RegEx. It works properly for generating, and validating passwords, both way :)
But, just for the information - it does yield wrong passwords sometimes.
Same as with simplified RegEx (^[A-Za-z0-9@$!*#&]{8,25}$), which I've tried before, and to which I've provided some statistics on errors.
And error rate of new Regex is pretty much the same.

But anyways, it does bring a benefit of using single regex for both generator, and validator, which simplifies things on my end a lot :)

I will need to think more about approaching this issue, but most probably I will have quite limited solution with a brute-force approach and some configuration options to fine-tune the process.

I can speak for myself at least - this would be good enough approach for me, because then I would just rely on the Library to deliver a password, without taking care of these extra checks and complexities.
And as Password Generation (at least in my case) is not a streamlined process, but manual on-demand - delays implied by this additional complexity should be more than acceptable.

Thank you very much for your product sir, and I wish you best of luck!

@curious-odd-man
Copy link
Owner

curious-odd-man commented Apr 12, 2021

That is very strange that you say it provides same rate of errors. Please check it once again. Because for me it can generate 1000 values without a single one failing in a row.

I'm not sure how do you check pattern in Scala, but in Java there are 2 methods:

  1. matches- for patterns without lookaround
  2. find - for patterns with lookaround.
    In other words matches does not work correctly for pattern with lookahead, as you have.

For this code:

        String newPattern = "(?=.*[A-Z])(?=.*[!@#$&*])(?=.*[0-9])(?=.*[a-z])([A-Z]|[a-z]|[0-9]|[!@#$&*]){8,25}";

        Pattern compile = Pattern.compile(newPattern);
        RgxGen rgxGen = new RgxGen(newPattern);
        RgxGenProperties props = new RgxGenProperties();
        props.setProperty("generation.infinite.repeat", "0");
        rgxGen.setProperties(props);
        String text;
        for (int i = 0; i < 1000; i++) {
            text = rgxGen.generate();
            System.out.println(compile.matcher(text).find() + "\t" + text);
        }

I get output like:

true W6qI62wg3OICn4
true V&4u#UHVtr#5MfrjcxftJ5Tmf&#T
true B#1i#Oy@l
$s@Hn9T153
true X$2yppUDj0n2#0M85
true J!3oIW10!P51!$41$WG47K3
true V5pk@5H6rNC!zo
true C#3iH$06I@2UFX9
true B#8v2y69fM&NgZEu
true E$4fc881jRSM69375lLMZ
true N
4m&hn$hW7nR#W@6f!9LY3
true F&7cc2k!$95I$@2zWsvXV9MB
true N@3y$sAfZqjv$UX
true A&3lot7m&
$#
true X@5mBiK9$lfy2
true V!1i83Yz**9@B&$RlH@eY
ZJqk@3@
true Y$5u92@1A4#6k7@992#X@#
true A2xTZ4El&P2e@$CA&z
true E#4gP
e5k7lG!v$4w85M
true S!2du&6#n$#FFj&f
true E#9mdPzz9#@q@9&91
true K!4i@EJ@#8YsDd
true K#3m$Ky*&ak7bn*
true W#1t&#N7mx$o@!bxMYuqPXa
true Z!5hjFDao1#v4RD!L6FH6iKT
true V&2p@#ksE5&4!c&
true V@2b!8R@W80texS90n
true M&0sUk&9$S!!lD@2O3N10$8dL0
true F$9k!88Q5@@$#$qG$UBnI8V
w82e@
true O@9bX!762vBc@iFxX!5683Tu#U#8
true X@7pN
T942Ki26Ygf!Hd!
true W$6xtLtO4@v!
true N&7e$95pqF56
true M!5mHAgv&L51SDP76N!34iz
true I$9dK5hG179jykbQP@3a
true H&7a#!Cr$3S3j545V@&lm3N!3
true B$3jI56e6RT$j@t!f
true A&3m3$LaN9#XY1!v63!A1m7@k
true S&2ol66@6WW0i$$3wIZ$D#1d@0&N
true D#5chI##&dRKcDcB
true O!4jQk@4pr@Z#@&5AQ$nJL
true E#6k8t#xD@35!x
true P
0cIaT9#yVRPa4fJik!$WO
true W$4bqU5n6C1SQ$m5
xw6&7Qb#3no5
true D3q8eVJ&a#!l!KU67144I#S#k8
true N#3y8K3GIdP7c7Gcht$VR@eR
true N&2qKU#5!4K24$#xo90
true X@9l$871U2!A
true L!2qgreY#Bm0!4Lh
!80#5ct4bkVO
true L#6e5D@B&&m&!lz6
true S@4m#58&3&$$J5zl&#Twp1
true V#0b1iA$qQX4p$#@3919zh4
true D@1pon2##z@4S0D&rcTf$
true P@7aX4hkRgxcD&f
true W&0q&&637ARJq@Y!P**r$gBcS
true D!4eDgG@C
hZch&G0#*
true T!3s!4E0c58&51d$hfP7P9
true O$7g0l
$&0D*!6
true R$7uDmwP9UZVPYW6eRK8o7
true V4hATM5$K#!uKQ#Rt1x9@d7
true U!2u80Ul&P
#
true Q#4sO53xe@!Ye&
true W$4l3a1UU7e37#F9cDIW7T
5041
true N#5ib!J$!gHu1VUNUOEWrX
true P&2lwa$S$vk0iTnrH&a
true X$3pM#lo5@6@z$@j
true E@5dfAWJsmm62xv
true H&4k1Q@4x@&5Q8zJlqY7&H
true D!7r0!24e19A2PS&18r
true O$2t6Sq&63JD0
true Q$6a@!CcsTAAY
true H!6oo5O6DqH#G
true K#7v&c4t74l#&@k5z6p1&3gJ
true F!6hyguQ#JeVx5&Fr
true G!5h6vH3aM34I14rdeo9E#A
true T&5kDv#1#YWL20i5267j!
true E&3s
HdR7C3!$085$lJ7
true Z$7u!#A7844$ko!V7WI4qic*!UU
true L#0ls7q4$m4&l@6@a*@w
true V&8dBn1ty9T0JW61S#c
true E6od73n6@@5G#
true V$5lJ&e$vy5Y
4#2n#q6$107lf
true I!7hiyz5@$aX#6rt
!3w$0Sne1D
true B$2vnCs$Q$#@r9i
true J#1g4UO&qz73#OL2H!
true L&4gg2x$!$&Jxn!A38#
true Q5ba@H!c2713i0SzOi$G4@993
true L$9e&W01D&E88!ZlQGjd$6@5z6J
true G6vU8MOfa!Dno5@1LucFt&
true J$9ziDkEjJ72ioLDrkY&lD
true L#9z71QU#2tCv0
v
true W$4uwc6t6@l9x6r@$1&$n
true F$5m
yvf#7@7q74vAJT
true H#6a
Ef#0WZ@7nVv&7Z8!U2H3
true S&1o#bV13!I@7qf@3!
true M$4qt#w2P#YS2*
true B&0kSDHr@@09d#
true T$8sf3Bra8bp8V0EJF0#5Lc
true D!2oYy#$setrYy@38f
true E#0x8s@Q9!#a#5H@8fW0#Tk$Kp
true H#0l50R&YYf#
true L#2a1Q&FVt5&&RDTs4m2X32r
true T$4xc#JOZ#E&!@&N7wHc@
true R&5u6j
modMq1#KX21#&#
true Q&8lD1Te!8402&@@oc
true R$3b5x&@1GNFA&Rr
true V&3z832&a&V6
true F@2bzBVS!C&48mc46cn&07DSGs2h
true Z$9mXLx@c3$qy
i&@#BYi5#4G1
true X
3z8j2D45!@g
true Y@5j!xig46M8CqXUfq0@BZ
true P
0dR&&c#JI9*#d@vIV13#J4z8$pd
true P@2z!6l#bta&v
true H&9ivp4e!r4j5y#&qSJYCaT83
true F
4dFa$IFY&5QI$041to&n2*
true Z&5lMpc&TzY2VE8q&eV8
true Q#8dC
cVd!xg$wnqVl$ZD08H
true L!8l&P##7#P2y!d
true B$4ua2e&JW!v!!IIoX6@&eD
true J7m$r0!yj!qholu651R
true J#1vO#@1
@vdao!0ij!
true T@8u2$8IL9s02
true O@9jqwe!XE@2ka6
true P&0f@364VirTxKJJP
true F@6b25xf
9umb06a58r88xu5Z5P@
true N
9j!@ZS4f9AE
true Y&5fsj!8$80ZY7Vk@Ao7
z!@9zOY1
true Z$9l1lddxvtBnmm#A&q71
true U#2f$$js@UO85E6q
true K&9oH&5aY9&ch8
true T!4gFtf7&3337
&E
true B&4nZWCn00WF!Aoqs#vAn
true X!4skX@@sncH9N
true E!0l$s6A
&lMLY@rzNZTe

true I!9j1Bt5!O5D7@AA&4r@@Q95Qm&
true P!3gX1q#B742L
true E@4x$Uzentm&
true K$2qyE2x9!#tp46!
true Y$4e
I6exV1N&2&j
true O&6b!H662Lx&3
true A!7s!#Hcr&Aq3z3G9
true T@0i$9!#ktbs800Xj&5
true Q@9ptNu&J93&q@WbP14
5E
true L5ko8@#MC&h*!MA$@D202Q9
true K$3wnce8
1ZZ
true P$2bleu!g83$08!@r86&2XAp$
true H#5nNP03e@3@
true S!6b!c9wng&Ib$Frd!Dj
true Z$4x9KNg&7jO$932#$$pY
true Q$1yBfqdyT!Exn$K$!#Z$!4!Nr$l
true M!7k@c#774OfO0gNNoL$xn6TpFeQ0
true C#5hb&L!o@A0l0V$4#H!$@4!!
true P
4tw4##v6!sZm9R06
true H@2j19nFvk&fnxPL4s499
true M#3h#5m5#vn@0#!5einJ
true W
6hM70729049lq839f!
true H#3xY&ZI@HDBN6nE!s$m
true F!8vDD$@!K71&y44&A5$
true S&4s@
#&!jyFT38&kPB12xs
true P!6y$@ob5&ba3&VU79
true K@2wa@@9g8x#7OHi722!2s
true O#7eGF@52cNU6B$37
true F$6a0I@k!8#QHY3Uuu8vi
true S&3w#n1Te@c@85x
mmXY
true D&2des90j83f5rfG!BJl9
true Z4cA7v6S!6q$STq6!q#Vl6$6
true Q@3g!n94$D@iRa13eH
true T!0r84qng8aW8!@6#2@z5
true N!1eY&&32t7&yNj30$3H8LyIA6@
true E4d6Z8rCnefh$UP6IuRr1XOBNkQc
true Q&0zXYl816OSWB@@9rr@#N75x
true O
7pi#4!D9*&!TgkH@$2l
true M#8o93Wx$!T2AE@@$kvm
true G@4gKL@X4f8a9auVRk!7x&8cZ&#
true Q!8k36BMoW84
true I#2m3vx$NhS&9$
true U!7na$9022!oN
true J&4x
Yo&cB9sx#eO
true N
5l&zV!c&zDDv
true M!6ik$WA@2fp44@tU&54#L!9@
true K$2j59&4k0@@&XS43@j31
true Y!5nLN2v3#mgO93!09a8A$
true I#5dMc2!OtbP45EJz#2H**y#lxPV2
true A#0g61JD
Q4LE3L0
true I!8a39@3*$1zONDgv
true F@9kw3jRI07WR$285
true C@0odU3@Ppgn#nT8
&E#nP&$y
true T#2c6K&i!&4C!
true K3ePYrr&d$NGN#$2doEgP**A
true Y&3n#Ko9h8484FCD1!WENF0
true B!8w9d3$@f@#8O!P#@3m$@5h
true N@7iu5@GPtJ!W@I6
true B$0f$5@4!JR3!S1
true Z#3i64vap!N9&oV#zJ5AGc1g
T2
true H#6q&un!!br2
true P6fIC3&!@&F7uT**0!r!d73Lp$0
true V@0u0
R6z#s$hN@V&@n
true S@8pMXe2h#dd1
true Z$2b5@J@LZU&#4U&rl35Zq#1
true Z$0p1Z990N4j
w
true Z#1fed89OY714#$$G!Z2qvP
true B4jy$#Y9&jJ1YP3$3ar!$Y5
true J5n9**#8fGwk&7!82T0LFHP661$
true C
8m5CGPm8yjX@J19&#DbZz
true B@1u!4B@M28XE9*$M4Y2EvR
true C3m2405$6&&TFwFz#85$&&0@h
true E$1urT#F6f3e&6KPBTg10d2yY22yi
true R#4bm@$b7b#grn9@Z
true T#8tM#r
4A6WG0LKoj
true T!0k77#JZ0$9#X4TUGu
z#B
true N@9fUEn*!&AkuV!@!#W04@7
true J$5rmi3782t&F0tB2$z!Om@$us&
true T0s@d0@DMrS4h07&5b!$
true A&9i&8E!z&pp#C!p$vIP9!72X97I
true Y&8po48!s0#4D5
true L!6fVx$aelT#H&1FmC7R
NclY3A#
true B#4vlaIb$&bXq64B$1*&#62D5tf
true N5haH9l#G2!Z
true C#2gfA!4rUkB5#5FFmMg0@
true F$3n0#g!ytuH6gw493
true U8t$b1!792C869&@U!0d
true G6dPV4q$@XVYG&np70NM5N6T2G
true P3t82DY#tph7Rqw9SeZF742I
true X#7e583#o#6oJS5C118L2J60n6
true M8n&3&09iXG@QVGQHq0dG79b
true K
3q$rg#B2PSG
true K$2rA!iYZ!Xe@@7h#4bfg$#
true D&5d130G&&Lbp9mj!wcBmw2Qz
true G
3pfdEk@Rti
true X@8lZz8lY5My4K#qdc6
true H#9m&Yay#uoAnV@4NAv277Q
true J$8bP*#k3I!fTi3y#7$ofZ#V
true A#3d0wfKrb#I8!F4hy1#D#9
true U3dlvtB57ci!!A2i8DE@0
true R
8sj3Ya@hCN@33TT&pZomG2
true I0l1I**X84&
true I$2sO1b4!8#4#48OG
true Y
2gwD#&62gedWfOKwNV6lt96$P4l
true N@7vY6U&!C@F5rh!mJNJ$a#K5
true L$4k@C@2!a&4LMf0Vf@&!wh&
true U@0zGQU4!&@seJx$17O&!TsY$8jb
true C
8t3$qYqVXwJC$avj@
true W
0rpm36@3$kW50Ekmeu3@cn4QI
true W@6vU!pdAr33@pW@QMP$$&
true N&0u0D8@M279B#v
true W@0iLNDn3@c1$GH#
true W#8cNlp8993V$
true L&9jUMO&45g1fh
a
true F$3a1&3Z1y@!qI4oGw797Ga!Z&
true I#6p
@$I1L&3l!48$T#
true S!4nC&5U!QZqyCr41Q85txU$78$!n
true K$6uX1!&!1#d9u#EW#a#&fG!7h
true U@2tK2rSrLTK4uO615ov!
$Xo!
true H@4rB!BW9!*e1#1
true G@1f#92#@q$QGA0b1
true I&4n8qCm6rjrmtA2$5!vR
true Q&9aUS8$#jjK59o
true W$8e4&zyv$3qmG3&TVw
@#$8&
true S#1i@K!OZ08yW0A
true V&1oQT$or!rb@2#
true R&0sH5E5#a0j
vH
M!Z!S
true K&9hu9#Op$#j09!Q!&2E3E3
true F$2zv8@&89S#ups&@!HTu#0#k9
true L&3k2T@dUU10kO
true F@6rz88p2okP5st4fW
true Y!7x5PX0!#6rCu
true D$7ai4@dCk535$
true R$9iXD&tZ2CzX$9
true E$3p3Al1644n345Cjvx@c9u
true W@8r#vBrL#I
v3ej*
true O!8m#!cz8#$6r6qH7Ol8F4P!DNC
true T!4jf5F1Tl!riB20!n&!
true P!7lqFYvL8t@1Y$J
true X#4vM94
@1Z6Zwr&F2E@4E2GqboQ8
true E#1hI8$@XPOzC

true K0a6EoMn#K#uG&@KF1
true D&3v$NkJn78zBx#y3$53!B6B
true M!8b5uM
7X9$@tN6bJrq56mDv85
true S$3cp88jkVov
true O&0h$GSE78fk8H$$&p@5cvC&i*
true T&5ux&y8!i@#T$20dMP56LBk5Z
true L!6rbB7$IY006d
true Y&7y$8!E!tU!67QXI
true A6x&&!RyC$TPlt#94R7!oq
true R@5n$6
&7P$9&2mED
true L&7nr7FG5!w
true S
9k80AC5!gYZX61S!!msuq
true T&5s7&39jgapW8@d
true H#3t90w!6@COWRezN601
true Q@1o
$JJw5e#&riw9oQ&l$Tx$!X@$
true M!7ut5!j9&sL$@n$Q
A&Z
true S5eSH&$!D0zp!1Mm
true L7zB8@t21@p0A0R!A
true C
8k891V2jch
true K@3uk3jQ2jIOJ3t0&0E&TLgcqG
true E$4moA#@OzLp40y&x3H!D
true S$9jZAoj4$46mE@3p865
true Z$6ufHR
#7B6B65&pZ&$uu$6$9P
true E@7p!Xw5&$Kt$#4#&a7#
true M$6qMk!11$oB8!0G
true V&9j1h!aOQVl!8&$GXc506
true M#9s1J24HzK@3@@@@91a$e&H$&3
W
true C$6j#X7F9yHvgo&zw
true U!6mwpj$G66r
true N!5v0K@f@9r4z&weVPq#nD$##
&iW
true M7n02gk@U8g4C1QJ1ZtaEu
true Z&3a69321WQ
QtxEd$
true R$7paPqkQ##5L@#&3Fkj
true K$0ot8xu9&48JfQZ!1WO
true U6tP!69s5h0s@U!7
true C@3liZ349n#1Z6#$sTkAcc5
true M
7d@sc0p$2N299bYzZY2$9PX
true Q!3m#&&V2$EIuk
true H7vj09#W4N0G
true D&8qst77Nvt@
true F
8fl!j&2@$!I85WbwiN86ILkJ
true J
3v#@62IQ2uze$Zhb9q
true T!1sm2vn5pr#tffBCj8#r5L#
true Q&0iek5!EH4!#e6@0
true Y&8chbQfl0S*$pe15wkb
true T!5tf6tCd$oX#mX@3u6$@@$
true N4q624b&Nu#6nTpaunW
true E$8l##K2F$h0783I#dP4
true W$8gw7A8ryu1zS41Nz@&V42!
true E$0emFx3&sJT@jJ94Z#
true W!3a0Aio7A$P
true K!7f93!f2v7DY
!#
true T
8c5&$C7#!N&d&b282y9pfy
true D@2z$b
n71WjLzSt
true M@2coZ#&#R5BOUn3
true U@2zDrkKEaxNwC4l1#Z7g
true M!1z05&2oLU8
yM6#9QOHgCbI6@Ix
true O&9qkdG&O#o0ZR$$Z
true B
5k05OO6B#0v
true L&4e$6!&n!0w28IfiLs0!#K
true Y@1o5J2iH8X0f8K9Fc&
true S!0q@#3&#0@9U&rN@@24QKxG
true G!2x#WE@xG5h21h
K!G&XwfYqc$Eg
true H#4t&Fji$!aTD5mr@$n#H4S6U
true A8l!Dr!&gK@t8cY3*
true U&6otd!7!01MT
true M$5a39$REiSsA0
true Y#2m#o8j&IJ@Y&&&U!K@
true A
3qC&H9$eV&&GVoO1oD4#7GV
true R&9q$&L7Z9f824s
true W8z7J0e69mY&yG4$Rg&@
true L
0tTqO8rB$1BV!Z3xK&Xl69
true F!5sUV#n#cZc#&$0n
true U#4sj*$8i3!5
true B@8xGLg@@FFB
true R#6f74&g95Keww89@9gw5!7pGT
true I&9u8kBM8&j
WCc7
true V$7v&!$qk2#w
true C
5me7QYm#Z6sG1
true A&1hs72856jJ5qc4m3y
true N&6j8keIE49j7#C#
true T#6t#$OmqONu#x
true M@5rpwC!u!1371#$w5#G
true Q$6i$0FM5sr40z2$808psgj4pgdM
true L#3pGU8&Hf2iH3
true O$6e6si55tVh#k66o4i@1Mp@E6@
true J@8e!YJ
T&GX2o8ZjqwIT52
true V@2n$2$3#&$Cewc#1537a81USNTE
true B$3mAx6R0@#IB98Z$2
true S
6e6$4!u$R4v2@fTsZ!@
true R$4i6AqxHh904
true M@0vifMIK4p1&77rG
true Q$3dsb8!QaE&
true H&4f8vdxJGrqKCH&$b5Aet
true Q@9rpZUR9!ALV2$r@
!wyy40#A84&
true G#9uIU!3a$E#&3m1q1I
true G#3s7!#33qK02oND*!0
true M#0ll!WJqQ5&C860#G3Na56L19
true W&7ofl!#z&e4yH1RXW6FpVZ#
true L$0fDt@TN@24916
true M!7j3!6WM0xj!920$m!1@&XfQZhB
true I@5y9GR97e!J9AV5o@aC

true K@8zk&2Bz@Ax3l7CD&a
true K&4vs4&#rWK$y@0&5m!AD8pf2q
true X0uvk9!U&BL0V&#4#ap7vk
true Y5pu@HDO2c81L0H72a
true U$2zj$36ZY7

true B!4z@3niD9$rV@6X5j
true Y$0i0Jx@z3S2d@huW8B7&&WK1@
true J&1dMNmiun9M&w1
true U!9n7X@@d
#a
true G6aO1#4ZwF8@oY@1KUs3vI
true O&6xAr&&!j2Pa5*@5g9@335NGm4
true U$3lb3NnJO5bxY6AsEB@Po6!$
true L&2m8ZFwhXRMF&@b
true R&3b&l
KBl4UY5U&p$$8W4!0i
true R$9x@3@cHt@5fN&&p
true Q
0o&z0
@9Di!K!9r!d@d
true V$8lT$02ex5mTCs@C&uG581yo$
true C1joa!4kXV4
true P&6s72hyXP$#Iv!$c
true W#3e1C$Xi#xP8N2
true O@5vQM&603t$!3&jI$4$gt3e!Db
true C#1v$s@39q0j$CwVL
true P0oE#c$Fl$HJo
true F$2qF@&ChN3$$HQ969675Alzz6j&
true F@4tjVxQ5$go7442@#gMk#0Hc
true G7wkU9i6z!D2u&W#4JG0P0LcMG#
true B!9c*#x!&Ka#M$f61&4GE7R0$
true T$1b2Hu6Y@$K1
true O@8zry!Y0!@$lX63p40&UJKbxuhE
true J$1z7g5yl80D
$VN
true S&4jb@G3327Qrj4O2222D$FMv9F
true M8emIT0ik7&r7@O3A8
true M#5k9DM7C$cik$if!YPq&b82!
true N@1qP#84iW@@@5&#3!15xx3rX!ky4
true X&2yesCrz@k$lrN
true Q$5sU&M&qvb$&txRi0RD7AZ
true R!3n78#6WnK$&2
3Xbi2n95&5
true T&4nk3J17J3$5886D4u#Dq$xN
true J&4m8&C5L64rx8y$$7#1&
!7j3
true W$0j!smO&Fise$yuF8sQ6G1
true P#2bNF#$rfmUr##qYO
true D$5zb#fK4$xluE!x8
true E@6h#ivQcExhf$UO*
true G2oC9@DtCV40Au7&WR@F30a
true U&8zD
662!12K##&#y0*&7W
true X7r81&8#3g$5C7#id
true S$9q6YWFV4$#v@3v#Yt$B9c
true L@2z9Z5X@LI2#Rhp4TV604!S
&
true O$8byzoK2y8
6$HM2003h#N7CY
true W@2rusf4@nlMP6Q8AJO2
n
true W&6pAe5$aMUE7
true O!3x5h22YX1uRD3WFId1t&#H!#M
true K!8is2Ct3##@
true V$3lTqnq!4hs
true R@2pK4!7lSOmvRc!
true M#5p!$M4A!$a

true E@0j6ih$!roGj6Q3@9$#Md!CV
true P#8k@@ig$T9mf2L!b#9
true K@4r2#UIF0j!i!vC7
true L$8x7fu42392dE@Xr
UrQtB
true U8l1cmtr!P&5J$yKq282$
true P!3c$yRIx8W8e$
true R
9mK$B4!wFLp1L$7q$9o
true D&9kYN2
wN&xZi1b#C
m&8e&374V
true I&8l&w&&LNr2#Gwrd&7fo7
true D0yu#P1RU$$SaQ16
true W@3chv3938q6Kog&&95&&$Lk7
true Q
9o&t
*#4qo5$
true H5ou49x6k$@k$
true N@1eau9v254S&rCQb233Tg
true O!8w4341yTr@aKABV&U389&
true U!1w5DvrI@Yz$
!E9ZIjX$
true P#9e6G@KZ!5I!Lg!agRT1#Xf!PR
true D
8o41#TxgI#ZKj
true W$1p#9n44QHAQ9Qn
true E#2c
C1!aLd@vp5
true F$5itaJttw9weExK1wB!4K0o12K@
true T
8bkLQ22AvwC3OsSKhPc3&z@
true B#7lGLq$71#XQ3$9
true A&4sL
!h6G&2@71sxwjv@
true K!2mO@$@gw3Ba1ul!@#0H@oi
true P&1imFiHyvT@3&eq$$@i!M
true R#4i&wSbImb#5CvuFjr08
true K@7wFBx$z2H&@$5gA2@hKp&iA
true T#1weJNE!r!H
true C$9eS#AGw7F!0242#!yy@
@APN
true Z!9yV&$#k5HAt6
true J@1mR&TsHX9ci@FmBYr$s3&2K
true W$6p&Ys2!$mWv@p2Y
true P
6xP
!mvjN24P9#d&93vEO26L
true C@8nf$#!#&l@ql!o5EK&B!
true J9w8P&$8vbt8@!Z#L
true Z#5z4&Y4WG&$A!*
true G@2wiv$D$dfC8p8EOp
true N&1kg#a7fD6
true T@5deLX6@JHYQ5xjX
true B&0jcausz8NbK&jXiC@38f3cp
true Y#7yf43n7Bfl
true D!2ahAI0r77TUSAUN@4C
true U
1v7&R9m$p@4@12L@
true H$3j2o88va#7#7&6qw@tfltChB!
true Q@7l&3g10#Vs
true Z!2m$IdfL#iZ!2
true K
1iLdmv549@JU$z9dvcYz682L0Y9
true P&3kj$$!@12
true G
0tyavu##HDn@LQitn$UNkaE#7
true E@3hH6DGiX5AoKxQ8$haYMZ1
true I@7j739&KLC3d#V9dT5X2
true P&8qN11wH2q1na#ES3a*
true W@7iAsM#I5Wi
true V6yCSd#!SHz$$6#Xq71F7
true C
7fXAw9O!$5x0D2Eq9W9!q!$n
true N!9v91v
o89&!Q$fIn&u$zwT!75
true P!6o!9@3E4Uqc!$NT&2!#I
true X&4g!3K9InhP#xYud2##md
true M!3k6fO@43!Qd3#0@LUo511ok63
true C!8bYRTylm#Mk
true A#6c
8eE&iPR
true H!0tMTB3ZWjjf14Z$$!18tkX
true V
6q#IxkiVK7c!V
true P&0rXnZ&XB2#
true M#8c8BiM9q6QZgS94z5Y
true A#2e$02!@!g2oP#1&Nu
true G!0m5T4gpB4@DF8
true M
9wIs0&b!$T0iI46#C
true X@6n$jnFJbM&9#A&kRq@r0t7
true X@0g&!5@0s@v
true X&6z70I$HjPqQA1u#j5k96
true T#7oe0H$!S&cRUeaG!N0
true Z!7m8@$04BnSu$Vh3d61itEU
true T$7z4@7@@k$9903@ZO
true O!9tAP5l!qo@ReI##
true B@3z8CM!#1EGG37h!0
true I!6iFLK!R19!Q3&53$667Ds0x3
true R&8xhyhT
r7s&n!yC1823
true S@4dYn&6M9HL!ss
true E4t&#z&oVG#nn12L!H$3
true C#0t@2Nlz
Kb@Q@898lE7Y$bCN
true S@0ueJ#$Q@khsm3
true X#4y$&0#M#rfyv6@2#3K#N
true S&7mC033l#an
true X@7vr!9BY5o8X#E0V
true P#5aERKe3dAv4qY!3R0VY@j2b#*
true G!0b2D!HB4Fwso@Yp5
true D$4fzb21##O@AbuVLZxG
Xe8
true U#3y2MQrT1H63rYIw*
true S#1g8!!R!QAt@pE!
true U
6uQcp6C$Kd#@a7L4NsL#!7c*
true L!1e5&d#@!0lEbwv
true I@7hbl0$$m8y4@YsNKT06k5f!BQ8s
true M4n74$rNmn7#10!E4$8GQC@K
true P@0ehmLXO$n87&
true K&4g#$D$5#mLP$&vW&49oeT79jps
true M!7n#!Og0A2S0SU
true Z#4by!67!3#
true A
9k$#!!W3FKl#&3u6
CqKN&ECQ4
true Y!1v3$K1eKkJE!mWm1
true O&3rO29xWZIGS
true X!9mrQZBX#v38g3HcK$tB61
FF1XD
true I@3y$PI8yP96!cl&vc@@4p#1
true Z&9bv#X5000$C8$LUJO
true J$9ie2@75@6!0g&
@
true P@3kP2IeYq!0$
true F@8ewkxG9X!2$1y5$3iES4$z
true G!9hn
@TA##vWSi22976
true E
8wF@I8U0k7c*!V3ixOB02&
true D&1escU4Hl7$XIzxxryWS@VoU*
true K&8dhiv3H@P!k4
true L$9t9
wom&H1812@
true L
6o1IL91!@@
true E!7m1RWz@J*&1LnJ9
true X7wsg5wdp88cq1LQz4da8
true P$5b@5S
7p39me
true Q#0p4v2nRwJ5BmN2u
true D@4l&f&@E
p@EJ&9Rf6&j0!9&!b3
true N&5cA8j#duZ6&tT9sw1D$
true H!9soqu0grWrmp$4$Ftnm$b
true Z&0ys7L&#p&!#Y9
true G
7n5Z#vM91iO
true Y#0jg2Qdq@$s@1mVJa#R
true D$8dxbN#$bof$21Pq124
true Q$4o64wg8I$CkR48D

true T#0w2v@r3L1d@vLE@#nm0lse
true O&8tg4oj93p6!z
true A#1p5@Je#@@F1#h7Ag25Em4
true U#8c&9!Zu944N
Mq4JA1!9@$K
true O$2w#o5FEu9KdLD0dH
true D$3s$IAdc!&R&A
true J!3dmJ4!@6fn5fZ
true R$4jnVw9@peI
true H$4p6WMX2cVi1Qp@!556vqejS0
true Z@9suB@ZT8UB5#3WR
&
true J$5u30Mqfz1tHkT781$8h8Qp#87*
true L!8h&#08u!CLkd907&m@6@mnr
true R$1jJ4I1!y&&5#9JYP&m&k@S
true E$7h5xu@M2Aq
true A$6qls$6fg4801!q0@5
true W@5u334#zz3kkD!G8!89
true C#2t!73&h7I#!
true X$9vg@Z67pOm#&wiN
931z6
true F#3cN@7ju6j*$#
true V!6y@4f3&0L&y1&z91R50T#5G6@O
true Y$6a693R1n8yb1&dyp@AY7&8
true S$2j@tL1Wt7OiJ$pyCG0o#9&slo2
true G@2qOH!Qpu!WjQS
true K@7l3r@D6j#S
3
true S
7r9@1X@9&89Fl6LQ!x
true Z@7c7SM
k!!7cETh13$
true E!9nQv#526EeF33y
true S#4f11RPPG@4C1
true W&9u#&6S22qf$er#2Z@
true S
3rBR0T2IjC6IR#sA#9R
true C#3t3iGOwBf!J!fL#m@W77#CCh
true L&8sL
90#haz@dm2SX$!wHQ
true R&9zH&BDn@2&q
bqftBq&8v5#xZ
true T$9tJ9!PCxG4SB
true M$0br7J&q$3gewdsUoI5j
true P!6hyM5D31NaC&934E8@w3QY7j742
true I#2jDeqGy!5s1K!Z@N$$n3
true B!5vLxC2pic&k
true B!1wz0fQwmeN
true D!7pz!#62wQm
R!@XxNyn!d
&B$a
true W#4vUWP1CX$ykk
ZjI
true B$9cJ7#L#07ii46#P6DaFCyd&17
true M#3pJJ#C5l286JlA2Z
true J@5d@5qoI@&j85Q66#
true J#3tO6AR$@Wh
D!Q@Y3$4nY
true Z$8d6P88@Z@e
true O$4j$BxgjO7Gg$w1A9R!X
true B@1cD!7Uv4y#w$t@LNwL5nR
true W3xd#Ttv!@1Ts@S9G&5V
true C#4f7@v0$UCFM5r&11F1@TddYY4
true Y!3ix570@BcRj
true N$1g4sz&j0t!C6W0
true R&3q0i
Ogy6438tx6Q!!&f25X9y6
true E@3vwYkHELbg$54
true S#8oesEBqK6$!6n2zd$#
true Z@9w2vZg6LXNY0Zbt$lH20
true N@1zoS543lG@#&!&v#0mTu@E
true S@3nz9#b1P5

true T3i1qCu$@773St2#NW5*7
true O&4tebv#8#w

true U!9e@70Ex$94j$O
true I7ekp0S0B21$B#ap7A&r!ubJk
true U@2o5GN2&hC
PDr
true S#7z@45jVm49
true I&0h&j&ps!Iptm#Q5234
true F!0zVv@fq9b3T
true M!9bw!&@$0Mc211
true J
8toR#w$YRg$l2
true U3krHAUBa61
true G@6bY&0
71!1tu68317Ul#
true L
8p25jx&HR!93MT5kG
true A
5w$@d$f$9gwy54Q!SQL6
true T@2hrub87tWE6LacM!84
true M#7ve8b&w&6Q**
true M$8lqVP@45W0Tc0j!3D
true O7gkD827bbDK&Re0$fNFcPR
true D@7q!$OrV75R
true N@9s2tL$&f$X!wl5pJT@5D2MD7
true Z
2eBnl&cbo9YDutY933$9#Ki
true C$8me98!Cm86W5
true H#1n&6h#1LoUj&c@GMPf2Zy8@
true B#1a!y
#r9iS6pd12Q
bvjV
true G#2w&L2i!Sd@!Hn
true W&5q7&WYDxAzvV@&04&@r@S
true G&7ma!!Sy!w4##se
u#qK8$zU5
B
true W!9kRl
6CiNkF
true K@5i7#6g87s!$#9@
true U@2uUHZq03#AQ8y3d
true K!1zy9$M!SK$!#9!9dlF!$5Shs0
true N&9x5ex7#H69q$0leR
true J@3rnFsulq!8&d
true E&3x$@Jx03Vf&a#p9L!T
true Q$4z9zg&@nf8x57!8W
true K$2w4!Py6B
X!Bw10c17Nc$1M$ahn
true P#7lc!e
&b@OA39
true Y#3ypmZZ$VZseiH12EpL5$V
true L&1b32uF9I
Thhj&Xv@
true U@1j7PRwj&O$A51
true J1hs86@c&d4#2h46T2@fL
true B@8n!373!hFT@pp#rgwR817rY
true L!9rw0RUqj$3$tJi#@pWq#!@J3Y
true Q$4iBxZ@&iIQ#$G0V
true S#1bg7YT!bA!@PEm#2
true G&1ym206J!&9
true I
0r@&8pT4hj
Q7!TY4P#7
true W!9cq&oU!@29$5Py&1Kx&4ER5s!g
true A
1bQnXY299o7BPIB9JOZSJBXm
true C&4znA!f0aL8!4tDp
true B@9nY#@399$5v2SKDlVic
true B$9ki4Q
!#VB!noq1Qdo&!@
true B&7yS@dG$DLA$BB**33!@
true V#1f#Xk9*&$uDBPnE##
true X!9g1N3A69E#b4UlXR$mdk!E
true H@5j25@6E7oHG8daW6rk2&i9
true C
5w!u&4jNgY$&$
true H#9pIDq4!0$3$4fJNB3HkY7h2@2i2
true R&8n#dIx7ztE4mV
true B$9cg4&W0MTB04!j7#ma3H7
true W$3v
O$WA3d@!32c$
true J$9r&2
37zW7oNS**u$J5L5P#p
true B!0i2$d0x3u6YO!Z&W$!W
true L$0sF@9d3!MrM9b@6EE
zjH3b@&6
true T!4kfi6$fS3
i66$e#ltX4
true F&2f0qtj&n2jw
true Y@3oF8Jb9m3I
true I4u#5@@07G1$05VT@FSb6U!N@c0
true F!0t!9f!$DI#k2T$ad0x&w&2
true X!8t
Nb#94z7i#
true V@2eFbt@b9mO&0MW!17!#$F
true T!8h$@2oa#!jw59K&P
true K$5o!o!@&xwtx
96Y@EXL&
true U&0iLMjy97#YN#08ePPI1L5
true V!0px1$$D8i7MzPB#@
true A
8dXc#337&K1
true X7g&l23fI7z8Ggv#84A
true B&5eU1&D6@h6PWe5
o!r@
true H$3v#d3tkg$Z8vT!15hx#qC9
true N!4ovm446m225234LjWY!RQ9@79
true B&8uT4$1V7b00&DvWBs1A#!SIE!
true L$8e@E&ru10y!oN7mHqt@$@
true V!0m$lj70fWuIRT#7c@ob!4
true L#1vbf@65&N@RjC5$7@MZLJ
true J!1b@M@j73$gcRA96E4$016sn$@
true S$9x#kTO!dL
3Il3a**&1
true F
7m6R0Ju8&9@N&@wp0wGYv5QFf3C
true O&2w@b$6q#&!8TL3IY8e150
true R$1n1G$8vD$2cB49$@r
true H
0jtb0CvsXqvi$cM
true J&5i5ZYl1&&@L#Lv!@GxgoifVG
true X@0rrs
7!&k&D@Lf9t$#0
true A
6ghw7pwa2j&94M
true G$4xa6e4c8TGO843AU5&05cJZ
true N!9tA$zHY&!q!
true S$2n&&o&tb
45$Wq8pZETDRyP!
true R&9d@7$7
43@u$!
true S#6lo3@!ioMUQso0
true W!4uf1cVIL0T#@Hy8W1!#Y0
true B&4ce
RPpl$a#!@B1wW9V@6
true U$4n02Tjb!Tme2m5$Bn$f@@a5As
true W@2eh95B2Aq3@4!
true H!6y85W#p0&4zC70F2$&dGF3#2w$
true F@8hRlG!##
&!
true D5b96b4Jik&
true D&8oO5DM8BKfLXR02
true N
8b4mlv31mpXQI&0
true S&9s3@8g#H5s!G*
true E@4j*#2h@hli&H#p9@OvSq
true D$6fdA0A6U1fo
true S$5o2hnPm#4VPZ&tf2AS4!8315
true N$3m41a$@L0@@L8
true Y&0u1@$Pu$o$N!!7@9f1k#B
true A@9fMhhm59vV$oRZ9Wc3OO3y0eU
true F
5eLQ806YRs#F##&#zg&
true O&9b185fn@WnBjz08D3845d
true U&8i6&$9t!0c6Ut845
true R@7g#@p2VpQ@@8!
true N
7u20C9p48Y
true N@4owu$6ef9T7TpG&J3F
true P$0h#PYz$C9&Vab!74AJt$9NM6G#
true F&1e#j4rr&N!iDEa4Rr690$dub
true F
1ue778bCCOHks&91iIZSxW#RHX
true A#4aR38!#tGVRS
true H#5o
jC4v9x7E7FA0k&u
true H&6p&E#N56Cf&BC
*!9fn66V!Y
true X@1gTgc#!Sli5
30eWY2K30#M
true F$3lYb13RDE1Hs
true S#8e0!RQKrFckT58r9!&$
true K$5u#8sZFus&I
true Z@4kf#48F2$l&lc$2!
true Y$3dq$7@Z8ubc9K$K
4CRxh3u3L@
true E@0i!O7@N$9V#lN$
true I&4j7d95myhQz9Ux2
true M!7kP6ayI3
1&o7EA&SD&TsA2001
true D!2kj1@j#l5&3RdXk!u$B!K0ryWpi
true R#7u71R8MVK#um#$S$Z@l0TF
true Q@7mK1coj#@7q37xv$@JEM
true T$1u55G8R3O*
true O6p$2#38hm$88M9bI3iWgi7!1
true R5iQJ@qW9x9rXHR&6DiR
true C#7t6T5#lkma2q
true K
9i06A$2De58@&2#5
true E#9vTso7uy6ud@d6
true D!2cK9#m9L#1442##3kn#mjk&@
true F&9ze9#uM0&&vd@Y
true U&1l4&70F@C@!!Wlxn2s8aC20vA
true S#1j$E63@vZbTPO!B
true Q4i#Ua!Kx#BVxKI0
true I@8wJjP74s0w2P6#bR!5is52!Lq9
true R#0d568tR0JI4L
true V#6o3$H&NUj#
true C!7s!4y1WGdM8**V
true V0m@BMsb#sVMr49r&yU17f6a!
true B!5p2W$@4##EMp3P3QTi#aU2Ny
true W
6jU
grilZr1mldezro@
true I&5r&141H&QVd8Ju
true J
4bq1NVY!
true R#0tJ90pxR7IJO2r7@$L!!oY25
true R3rWcE5CtH53VPL#D&t
true E@7uAK@j!$o@1jMa!23P
true G$4m5!y2z7QZ!!!bf!Z2$
true O@7bMFaKkgD1
true M!2clUnZP3V4yLW!Rzmy
y8b$#
true L&6uYuCd5e@#5U7
true W$0ock#3a96l
true F&2q3An@&ZyG$QPV
true M@2fH#3#Ul@d16&5@*
true P4fxqAs*e!6Hd$&J1dw9
true Z&7lY83FERr#*h6$f&*1&*8yxh
true H@1a!pK$cE7R
B@O2oLA4xFgh1
true P7w$Ahi8#q&T
true E#7p@50Vf6h1@4R$0
LMW
true P$0g&&&#@n#S!R4&Y!
true H@8tKlA$1Xaq$
true B8gk4cMI2N$QAGdgo
true D#5h$25I7ab3qXR9W$
true T
0ziP6n!Vjct!Q9ygd5Kp$
true S#9p1Os@@5Qq#S27f@@k9
true D@6jlJ9$rq5@U
1*@
true A!4s!7l6#haz!d23EE0@lz8@
true D$0k6lt99&MAw$01#2MX8#Kk0
true B&9yZ4UW1PxLq6y
true R#6be
85A892
true H4p$aQ5@m72$3
true O$6e!#6eXqw$@1!@d$@2
true W&2yx4$#s!Yp3002TKKF2e
true H&7o71l6L574#$x4#
true H#7l!$IJ#7!W2!
true R
9e#Gc4GtBZJr&024q
true H!5a$rzF@R&*
true V!8u!PDBh861
true L$4pN@IX!kf1$m6w3
true N
5q$3x!6B8!7RUD!
true X
9gm
67$6o22$s
true I$4j7#yhh$5@
true U&8cDI&kb1$3635
true T$7y!$MBbcW!l7&u
true N#2ebN7nW&L1V8i
true U
5w5@D7Ce*$4RQn
true P@3gV!&$$r$u&0&@420
true C!2yd90#3s78whC8
true P&1bY#g&&aUs0kt
7&5$
true B@7kz03@5w@1G1&mWY
true U&5jk94GLmVIW
true A$6epUXy27O#S9
true J$6leTr&0aM#5@7
true D
7e&&#U&@uLv0#P!waT*
true W!6r!hZeJ4$16iz@W7T$l@t#0
true M$1h!M@7@t5&a3V$
true J$2oK!W
v2rj@R!q#!m4t2&aJc8*
true D8ixPX$0&4CP3p1
true O@7lk15Xbbbf#16$5k
true J@6m7NE4@21l@!qQV0
nO0nO0es
true X2vKJ$6@oFhp5UwIV&$Fq47bo0#
true Q#1lsaG61o&k56p$l
true Y$9qRNj!2M
wE5&9ZC848!
true F#7sMp9$GC!g!t
#EG&@
true S!0fs$u##$D1ARyM
true F#7cdtA#0h82$!9jREOa9
true M$3nh98C&PLt39&Mg!p9$!
true M
7zO#0@v858N50QgL1TZ!@O
true P!1i5zSU75i@$rmCVC1P#VU$
true D
6d9GY9WdNe!&AVkT$
true Z$6d50N@0&B
true B
5yueQq!C&@#k!@8hM3
true I$3gkB4m!&Q97@ak2x@qS*&96@$V
true F!6vf#4&N@4r
true P@6gc&iG513@
true L#1cGT57Iq@iiv&!&C&2ql
true U$2i61J2b4&Y$n
true P
5ls8w$@d!C1d$
true S#7k@!&Dh$YS2L
FI
true S&2xf!$#1!7H&1&afixG$Eg8
true G!6i38Am
34b7Hmy#2
true W@1qV9T0$2**2YRL&i9mJfWf5r
true H$1mx!6619ah!#@U
$g
5!9F7Qa&*
true P&7d!S@dM0AR6z
true T&5m6Vz7t&6L5p2nkS
true I
7i5$6g&8q5en3C9#e3t53m@H
true U!1v&mXK@lhePd
true I!3mk3&R15o&U
V5Ne#
true U&4uVBab4@V5#lDUc7LA0B60&
true Z
0h$$6V@$bQ$UI94aI7F1
true Z#2v#@3tpk#b6#U!F4095
true X9w57iw&!w#ipfm@Q34c9@QM!5As
true N#1g0sy
$I4!Z3&K8#0&qN96*
true T#1z#o$9V$$wCb6#
true H$3gVL*#Z3ncC467l4i0
true U&1hI@lSNqx2LakUwZ
true P$2lxc5&1#jp70&@#s!9hc
true D#9zHv
Yi@1D$2S7zaU2VVEx
true U$1t95###2&@
true P@8yPnD76T@bAj!!8G
true E@9lb$T@gcVU4v&$V7!
true Q&5t7Q#&X@H&fj5PXV
true C!2d5HT3SD$A
true O!6lj3ixMkR1qXZw
Rkon&Nj$36
true Z
9k@m4@H!C7SM!s@
true Q$7iu17k&h#nBw@0
true G@5k
8vV5&Vp&a#11@N549LCs@
true D#3bKV80d9efmXjvXC
true J#9wF2e0F$5gu&1i&!v6!9E5ju
true D$5r@ewYsHf
true B$1h!85y@
&LRq2&&riA!6!
true T#5itt#DAUHOd2@4N
true K@1oVt@XC!9H
true G#1clB#3&rpD#X#e6#74#72o!!4
true U#7w6k4@Ulf@F6O9u
7#o
true E$8gVxZ32!$s1nV&C22uR$d6
true W
7pEjnVDfv1@v7JyjiiUvG
true E!5lB8
QiepxqYR4&
true G#2w0inR&L6pn&4S&kh3f
true P!7iGNr#x##n1#@nF!XE@7hP$G8
c
true R!8c&Ckq6&7tE$B@6N73W4
true W6gJE1a3!$95c#C
true U!7t&Y73&g46#TEi!1TA$6ULneY&K
true R!2qr3lzZt32rM
true M
4b!k*$5ev!n98U@RZ!2e3W9Rf$#
true O&9pYeoej&EPRFMHhv28Ly*&
true C@2iMa&6jj9Y7&
true E&6oMb5&fN3D93K6&k!
true F&2k5Wt!&0@Oo$66r$
true I!7sCYuwG2V$c8a@k#
&8M@
true R!8kX&2!X7O!!fV6
true O!7s$0R0G!#k#8061!YPdC&
true K$1g0!O890R#4@
true X&8p&p$3
$6jfWU&e7MT234
true L#2jwY&U1!#$24@0cN!&&G!
true M&8ayl#NCZ!t0
true G
2sKBnns0Vka$mD2Qi#$W&N40
true W#6h#3l3Bxa5wA!#8BT7a#2iq5rZr
true E!1uy6$z@9hZ
true K@2g$n@G5xqN
true O&2z!uX$q@j!2vnWI@nC
true Q
0fU6$mYz$t#
true D!5l@!u60VCd
true Q@6b80&!P!
@EzWfYn!ui$2a!&@
true H!3p4810&D3szP1r@#@U3mo#!
true Y!6qpc8E6Jm!EBy@9pbGJZGA#&lw1
true U6zZf$S6GAJ&17mcS
true K$2jGBfY1&45
3N8&@5ZpqQ@
true X5nrNWqCg72Y
true L$4i093@to#223@8Ta3iH2&95zp
true R$4l2J4u!vL1#31WM
true J!7c5X&wH0p&4k32m
true L&0g3Li03F6N6X2b
true F@7e9@GS!xKo$Nn@1z$YB5Nib*#
true A@1f@4sJesV&vf$@HW&cX
true S@5kdM!U8
4#L5Oq4ZpKP2$5KX
true V!2oLP
@GhaadYnL77q6!5$w
true X!1n4i@7ajF@w$kU3Qyx820
true D&3fl#97@M!@0Js1S!H0toRL3&K9*
true A!0mMZynU&R9!@uBGLA25D02v
true X!5eWC#gU256@j7dC
true S&0uCq0&Oz#Ripm#n
true N
8gF#bR0PM37i9$EqCK26Dj!k
true Z#2l@on91T77K8B$&!e$y!5
true A!5w5Dkl9#@C4xh0410*&0Vn!U
true U&4z@G#4SS#m
true Q@7f$1&sp2v472D1$Ia3@AJrn6K9j
true R$1eVlh&aZ$i@6&!3
true K!8x$OeI&@bU3NFQm23$Pw8#RR
true K!3nI$8hu!79p0gq
true T#2eQux92gy&
true J
2vK!#H!#G$7&4KoR0v9@A&y6@
true X$8fR@@#vRni@d&l#RgUVn8M
true G#0fNGM$sm&c$L99C!J&5
true V$2q#b@8DPy&&Y83Q$mKF!$zt3$j
true Y@0t4s#1wgOE
p7oV&50E#Z88yNj7
true N!9tMHOEo@fYh2#M5@xx0HmoD
true V@2tdm&CkdPPK84!@f7U
true Z
7r#Wn$I!so#&R!Bc@fiAs
true Z&3dbukDBGs*#30j#e&$Lmjw
true H$6h3$RP7edUW@
true U@5yATf1bk@@k2nm199M&$
true P!3o4&sg&F2N3R7c
true Z!1u56b&3I#75&q!&ANF

true S#3ni4x!27M6@uvhRJ7a8E32N
true P&0a3!O7!UQoZ&0o1bFTyNCgg46
true H&1wAZ92#$U!0&DE#u
true B!3t9A7jw&d@k@QJ!X!
true Y$4gS7A@323&8dMfos#Cg7
true K0a913Ym675D9!!bvDv4$gZZsP77
true S$0r@ORq@yD
1O3$ml13&#9T8cP
true F!3h#fhGL@j$xeV
true J$2h6EKY!0BS8N$&0j57!
true I!9fQ28B2!Ntkv&J#!$55
true L&6q@p7$c9f&Cc&NT$Ky&f!
true L@3g#7!#&3@GQ3
vQy!!99#45uP#
true T!2x1@GBq#4!K51l
true N$9gf82TF#SZ
true A#9sQo$!7o88&tl
31QVk$2$
true B@3yqSiJY#pv6@B#5X@d5hFh1i$C
true U$5a#9Xq5&#7Uqj#st#h
true Y#3y#J7AB1L1v#8bU7@crcX
true V@1aH@TL6803#l
!
true D!0apZlQG#Rhh4!nig#34
true P1fPQJ20bZ#$RA#PdL9nC5
true Z!4d!BXyG3@#38@O
true P$9h6bxKR3Ua3e@#S3k#
true V!8z9XjQ95aB
true F$6d2M2exvuzWmse0
true N!0i!3$#I4&I&19q78!4SIBW3
true K&6hrECd0vf1WJ#xU!0
HxEtZgn3
true B$8g@rIVQzzI#EfUR$P!2wT#7V67
true Y@3bS#V0Q!9$w1r0521&
true I@9h6941tk9r2jH8Q##7#@1
true N&2e1b
J&n!@42pkXnrWUi9c6pF$
true J#0c5qJ$$QuE7!HoEei9SI9Jmu
true I@5hL3Zt!@3UVS5
true V!7q8N&PL$F2GYNTeL6z0t&
true O@1wU$pht!nat
@Hn@J
true V#2g3&&gle$5zN2FMztMw4k1@@P
true D&6rj0LMZJ&5o$76ip

true H$5iN$bq2$Tw@@03ean7LwN@xLa
true U$4r5b52W9$8g3w1@8r5
true T&5g5UK
np7!$7@!O619M
true V&3zf!#$9V2528j&DYi&a1a
t!@
true E#1g!h@y!5#U5#5V7$M8!aOL
true C@1xv#s
wXI7I
true Z@8g4Q@iy7JS4!uXTKdZn4!#7I
true P!3biJ05Ram4@S14OBeyZH
true A!2fRKX9VXf0@24

Process finished with exit code 0

@Unrealman1
Copy link

Unrealman1 commented Apr 15, 2021

can confirm Adapted Pattern as described above works like a charm if you use Java
Pattern compile = Pattern.compile(newPattern); compile.matcher(text).find() to validate your string instead of
String.match(text).
P.S. thank you for your hard work.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

3 participants