Reverse Engineering
Last updated
Last updated
Challenge | Link |
---|---|
Our Administrator needs your help!
Vaints, ex-CEO of Gemastik Branch Office, fluttish.org
company has just been fired since he was caught becoming a black hat hacker. However, the corporate's files and directories need a masterkey which he embeds on the binary file that triggers some kind of an API call to our database.
Sadly, our administrator has blacklisted his email yet the binary requires to have other attributes information related to Vaints, as his account already deleted and blacklisted. Are you able to reverse engineer this binary app and finds a way to get that masterkey (flag.txt
) ?
A gentle reminder from the Administrator, this mission does not require you to:
Do Brute Force
Do a Service Exploitation
Yet, there might be a chance of security misconfiguration from the corp's backend which may aid you to complete the objective, unfortunately no backend source provided so it's blackbox.
Running the executable, we got unauthorized response like image below
Looking at main function on decompiler, we can see that there is string "--new_gen_growth_factor=4" and wgen we search about it we found that it is part of "Dart VM"
Reading some articles such as https://blog.tst.sh/reverse-engineering-flutter-apps-part-1/ , we know that Dart VM store our code as a snapshot. We can dump those snapshot using python
import pefile
pe = pefile.PE('./fluttish.exe')
for section in pe.sections:
if(section.Name == b'snapshot'):
out = open("dump.snapshot", "wb")
out.write(section.get_data())
out.close()
Running the file we got segfault
Looking at decompiler we found something weird, since the decompiler shows short code with jmp r11
To make the pseudo code correct, i patch the jmp instruction with nop
TBU
Like usual flag checker. Nothing new, but now running as a service
Given ELF bit file, then open it using IDA
From the main
function we can see that the program receive user input using scanf
and store it on v13
.
v13
values are processed with xor operation and stored in dest
variable. Function sub_14bb
use dest variable as argument and when we dive on the function we can see that the function actually RC4
algorithm
Since we know the key we can reimplement it on our main programming language, in this case i reimplement it on python
.
The last function called on main function is executing file located on memory, we can check the syscall
on link below https://github.com/torvalds/linux/blob/master/arch/x86/entry/syscalls/syscall_64.tbl
So actually the RC4
algorithm used to decrypt the actual binary that validate the flag. Here is script i use to decrypt the binary
def rc4(key, data):
S = list(range(256))
j = 0
for i in range(256):
j = (j + S[i] + key[i % len(key)]) % 256
S[i], S[j] = S[j], S[i]
i = j = 0
result = []
for byte in data:
i = (i + 1) % 256
j = (j + S[i]) % 256
S[i], S[j] = S[j], S[i]
t = (S[i] + S[j]) % 256
result.append(byte ^ S[t])
return bytes(result)
v6 = [0 for _ in range(12)]
v6[0] = 103;
v6[1] = 101;
v6[2] = 109;
v6[3] = 97;
v6[4] = 115;
v6[5] = 116;
v6[6] = 105;
v6[7] = 107;
v6[8] = 50;
v6[9] = 48;
v6[10] = 50;
v6[11] = 51;
v7 = [0 for _ in range(47)]
v8 = [0 for _ in range(47)]
v9 = [0 for _ in range(47)]
v10 = [0 for _ in range(47)]
v11 = [0 for _ in range(47)]
v12 = [0 for _ in range(47)]
v7[0] = 7561;
v7[1] = 9309;
v7[2] = 11821;
v7[3] = 6059;
v7[4] = 10569;
v7[5] = 9057;
v7[6] = 13325;
v7[7] = 10317;
v7[8] = 7061;
v7[9] = 10065;
v7[10] = 8059;
v7[11] = 12573;
v7[12] = 12073;
v7[13] = 9561;
v7[14] = 14073;
v7[15] = 16073;
v7[16] = 15823;
v7[17] = 15073;
v7[18] = 15571;
v7[19] = 11573;
v7[20] = 5057;
v7[21] = 12821;
v7[22] = 13073;
v7[23] = 5557;
v7[24] = 8307;
v7[25] = 7809;
v7[26] = 7311;
v7[27] = 10817;
v7[28] = 8555;
v7[29] = 11067;
v7[30] = 13821;
v7[31] = 14573;
v7[32] = 9815;
v7[33] = 13573;
v7[34] = 14323;
v7[35] = 6311;
v7[36] = 12325;
v7[37] = 15323;
v7[38] = 11321;
v7[39] = 8807;
v7[40] = 6813;
v7[41] = 5305;
v7[42] = 6561;
v7[43] = 16325;
v7[44] = 5809;
v7[45] = 4809;
v7[46] = 14823;
v8[0] = 11;
v8[1] = 18;
v8[2] = 28;
v8[3] = 5;
v8[4] = 23;
v8[5] = 17;
v8[6] = 34;
v8[7] = 22;
v8[8] = 9;
v8[9] = 21;
v8[10] = 13;
v8[11] = 31;
v8[12] = 29;
v8[13] = 19;
v8[14] = 37;
v8[15] = 45;
v8[16] = 44;
v8[17] = 41;
v8[18] = 43;
v8[19] = 27;
v8[20] = 1;
v8[21] = 32;
v8[22] = 33;
v8[23] = 3;
v8[24] = 14;
v8[25] = 12;
v8[26] = 10;
v8[27] = 24;
v8[28] = 15;
v8[29] = 25;
v8[30] = 36;
v8[31] = 39;
v8[32] = 20;
v8[33] = 35;
v8[34] = 38;
v8[35] = 6;
v8[36] = 30;
v8[37] = 42;
v8[38] = 26;
v8[39] = 16;
v8[40] = 8;
v8[41] = 2;
v8[42] = 7;
v8[43] = 46;
v8[44] = 4;
v8[45] = 0;
v8[46] = 40;
v9[0] = 165;
v9[1] = 232;
v9[2] = 233;
v9[3] = 1;
v9[4] = 194;
v9[5] = 47;
v9[6] = 170;
v9[7] = 71;
v9[8] = 129;
v9[9] = 182;
v9[10] = 107;
v9[11] = 130;
v9[12] = 219;
v9[13] = 12;
v9[14] = 71;
v9[15] = 224;
v9[16] = 54;
v9[17] = 172;
v9[18] = 188;
v9[19] = 138;
v9[20] = 7;
v9[21] = 123;
v9[22] = 111;
v9[23] = 187;
v9[24] = 45;
v9[25] = 182;
v9[26] = 133;
v9[27] = 64;
v9[28] = 87;
v9[29] = 115;
v9[30] = 227;
v9[31] = 19;
v9[32] = 208;
v9[33] = 188;
v9[34] = 70;
v9[35] = 151;
v9[36] = 58;
v9[37] = 254;
v9[38] = 114;
v9[39] = 31;
v9[40] = 189;
v9[41] = 125;
v9[42] = 137;
v9[43] = 157;
v9[44] = 234;
v9[45] = 26;
v9[46] = 197;
v10[0] = 4910;
v10[1] = 5158;
v10[2] = 5406;
v10[3] = 5660;
v10[4] = 5910;
v10[5] = 6160;
v10[6] = 6412;
v10[7] = 6664;
v10[8] = 6914;
v10[9] = 7162;
v10[10] = 7412;
v10[11] = 7662;
v10[12] = 7910;
v10[13] = 8160;
v10[14] = 8408;
v10[15] = 8656;
v10[16] = 8908;
v10[17] = 9160;
v10[18] = 9412;
v10[19] = 9662;
v10[20] = 9918;
v10[21] = 10166;
v10[22] = 10418;
v10[23] = 10670;
v10[24] = 10918;
v10[25] = 11170;
v10[26] = 11424;
v10[27] = 11674;
v10[28] = 11922;
v10[29] = 12174;
v10[30] = 12426;
v10[31] = 12674;
v10[32] = 12922;
v10[33] = 13163;
v10[34] = 13426;
v10[35] = 13674;
v10[36] = 13922;
v10[37] = 14174;
v10[38] = 14424;
v10[39] = 14676;
v10[40] = 14926;
v10[41] = 15174;
v10[42] = 15424;
v10[43] = 15672;
v10[44] = 15924;
v10[45] = 16176;
v10[46] = 16428;
v11[0] = 37;
v11[1] = 34;
v11[2] = 43;
v11[3] = 46;
v11[4] = 41;
v11[5] = 18;
v11[6] = 44;
v11[7] = 42;
v11[8] = 45;
v11[9] = 22;
v11[10] = 19;
v11[11] = 31;
v11[12] = 7;
v11[13] = 9;
v11[14] = 27;
v11[15] = 40;
v11[16] = 0;
v11[17] = 17;
v11[18] = 1;
v11[19] = 6;
v11[20] = 32;
v11[21] = 20;
v11[22] = 38;
v11[23] = 23;
v11[24] = 4;
v11[25] = 29;
v11[26] = 2;
v11[27] = 14;
v11[28] = 36;
v11[29] = 13;
v11[30] = 12;
v11[31] = 39;
v11[32] = 24;
v11[33] = 8;
v11[34] = 25;
v11[35] = 3;
v11[36] = 26;
v11[37] = 21;
v11[38] = 5;
v11[39] = 35;
v11[40] = 16;
v11[41] = 15;
v11[42] = 11;
v11[43] = 33;
v11[44] = 30;
v11[45] = 10;
v11[46] = 28;
v12[0] = 121;
v12[1] = 255;
v12[2] = 199;
v12[3] = 153;
v12[4] = 77;
v12[5] = 143;
v12[6] = 20;
v12[7] = 12;
v12[8] = 47;
v12[9] = 63;
v12[10] = 47;
v12[11] = 111;
v12[12] = 149;
v12[13] = 229;
v12[14] = 224;
v12[15] = 211;
v12[16] = 140;
v12[17] = 92;
v12[18] = 252;
v12[19] = 124;
v12[20] = 200;
v12[21] = 33;
v12[22] = 116;
v12[23] = 118;
v12[24] = 25;
v12[25] = 234;
v12[26] = 59;
v12[27] = 7;
v12[28] = 33;
v12[29] = 193;
v12[30] = 151;
v12[31] = 70;
v12[32] = 242;
v12[33] = 179;
v12[34] = 255;
v12[35] = 244;
v12[36] = 204;
v12[37] = 39;
v12[38] = 163;
v12[39] = 224;
v12[40] = 126;
v12[41] = 117;
v12[42] = 216;
v12[43] = 70;
v12[44] = 249;
v12[45] = 213;
v12[46] = 76;
# input
v13 = b"gemastik{AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA}"
dest = list(bytes.fromhex("743F39293B69B824DF32445C57DCEB67D5A50FB7BB30740B9FCDF8DA25D325AD581B425747477ECD8870F93DCAA32F6CA234730AAE4C8E90E5352323FC6F344146FD44FC03BE9237700ED193C3DCDBD630E3F077403C137D98EB81C94D03105AC4018F77DE5EBAFFA237DF9511638492C56DBBE6E7DF1C326AE84E6751CC814152CF33A4149B7563534BFB8E0B572E68280F2E94F9AB257EAA2B62B0D1A296B22B97D4AACA2EE2D24699FE4724B75DC89A8DAC4E21B3B6285469B19D3C72FA2AA6D9FD28823D9F172FE7A378BF7C21D46FFE4BB375B86328E47B3D7A4E8901C3757BD150872BD08AB5CD443F5655C66767F7AAD1A9EEB46B27B22A92BFA17AC60DD2BFC4CB6BF7E70AE2FB3872BE689FEDE537265E6D052BF97DD362314A22DD70F6A482905C7D7F04DF75D797FD24DC6A889F23F19543E517B535C6A9A2DE7BF69E604267011563BADFBB858A64CA0212EA62DF565D8B46ED1043151EC3E310EE20775FB671D8F56EAA4AEDB64B7A710339B30CB011F32B3DCD8EDDD70C49A1FFA685A2A3E9D4568D94F0A3663FD4F7CA66BD6AACB4DB0B2337D2DACB046BB7B70636350235157276597A20F1D97F09970D32D31E04592E3E539533FA38E06AB26A7EC8C61BE8FC70A54D56BF9B84F408042AC1C3281BC8D7ED44C03F94D65DA3FE6561BC97C9E5D0EFD8FE926AB3AC5DF4BA64575978B4A94FA8CDE0D683FBCF6F4A854831E5B419120029823D102D9F7072D154327EA605CAB735E466893076749DA5EB1DBA373286A5623543E166D920DF44083BB967561AEC40709818B3D21F2FF74BAA301E8D383BA5B3445F71A95657AED8F5C0C2F2A4E73448BF76B5C8EEC9276A6706EF7D5C46E440B243EFC51D40B3C39F6230513F95942F4E274FEDE78DED6000D9C28FF3AECEDCFD3E4C500614DA1BE6068A6E8A598DFB95F8B786796758FC3FBF621A962375FE937849F5D88A18B4D1BE86FF67F5CBB346E774A1F597EA89BE821D8FCAB44E03C7DE74EAEF9A758A847866FB50A74709F5C6B8A0403F33499E9BCED9EC323CD2B341A1B7B95DEE13C3A95E699398522366966FB2F1DC039E0FF169D83C60D5258018FD855A288FE3F4D007944BF8AC9FCEDFE1367AD0F190E9F941E9238CE956007F1CA8486357D2FB017F736CD0D755614FEEED89D70A8AEF8A6AEBE835DBEE6FC540311662479379E28F60F80236CA2F6B3D6C3DDDD3F99B20EDB7BA4C71D8429A62A6855139A546514BD5C62B413F639702638D242963BE46E49C5A5AFB82847FF6AA817923BE39D80CBC3E0857F0253323B102224FAD58EEDA8EF2A31B851BFFC8DA513CD4EADD6670B98070A77C6D3A3E963AD336AB131E7A022C63FFD2F8349538AFF518DC0EA8731AD2DC0B9325690609DAFEA5492C68213BD7D11DF9DCA5B5B4998AB354C127C7BC95BD0AE9A435D357F1EAAA9E335F80BCAB8E5FCF0319282A5267656F3AFBA71289229F162E109FC59282F20F8F72AD62D3FD3AC4424D7B2B764542E6260E027C6C146E43B217989270744AE63B589136BE00BEF69FB97D5CC8A2F32D64FFDAECFF445513BD861A93D737A6BA9C5906729581E29A6B772B06FAF56C91740B1CBD64A55AED444EA40A3BC97245EA8E0B6BD3240B9CDA7BD0D9A2A24F1822274366B2D4F9061AFA873F36C423938CE83A83D715157B186221A46AFBD5FA78F5C2F13DB5E10D0BD20D02CCC05288E4E9C058955600AAFE5A13D4BD4CC99A644102E35E5C6A05BADDD8E2CA7FCD20F61967240B314558B9EF4BDD91D3024F5402E52AC86ADB2650054227A4F6E8550F8B573CA72D8D0FD091511C68568A18ED3C9589E71FF86D335505A4E5FE284481C356C0C7CCC0AADD945C1A202A10E7C1F78BC8997F187B66ADD6ED30AFB344640663ACD242CB1D6032619CBC29F39605954B12542B605BB50F3FF21F40EDCFFBD1589EA2FA83F6481D56DEDAC1E1D3AA08816C3C695192B6B588CA1E709A207127CD1BA6C413DE05380BBAFEDA5F1F5DCBEAF90A1942FBE8ABD8DBA7A455E3A9CB755968B9C2A3C4F7DA6043AF9FEE74E75418CA89541A1DEEC4CAFBC410FAABAAE03CC4DF137DDB0F0FA9E5F4F9EE567E0F0601680693C7BABCE19137B104E78E4C59BBD05BD1AF95CF140BA4A6CE7B29E8F231CE373660F305FBF279C5D73A0F84664939E442A5F3987DDD27466D84BE785FD617A552441EDF107B33E5ECB3ADBB98366253EA43D29813E78A3CE7412DF32CDACE0DE8D5E0FF5B9422396A9CEA1F7BC1A0675921083BBE29F87452E27E457EB357521E1B5C7448A7E48FBBE44CA7437BDB7D44BF7D75DB18C807A489790F696EC70A8EA3659B06FD8A4B6EA365C00BF612115D29722D59F1E553CE9CC8AACD890CA77304BA8F78702716964E42630958D2E88C49C8C33322B96E1653315DF3907574B02455B5D3850A3B44A22F15959C781A17A026DA90578EA664DEF7848241EEA4D5DA3CC12E60E7CF6C19964C2254E788BBC9712D0391B39A47458FD4B6E19AEF738CCA8D7B2C325A5D2A917C6C530BF56827BB8CA28849E3C31D48AE351162ED07936A04E13D13B0CCDDE39F0162B24BB871DFAFD999C7E3AB651072D8D3730406C7C4C7240E24581ACB5463A5E2C81CB4E1BEF7190FB59129324CE19F162746DA226AEF9B8953B5585410A6A6E5BB619215D7ACC10C4EEEFB176C6491BF0AC78EBF520744A734FD452CA6A0BCB392A494CC7BA7DADF450E404ACFBD1E17E695A06A58A333DC17CBDD8E6A77BCDD1E33FF656C7465793969A4528FB7D738DA0AD2D473E0FE31D264BD8CCF3A9744E716704CA8D00BB9CF6983AB3B9BAF2DDDB2FB6BCECC32E4873967DABF46A9AD8ED284C367BDE0B968C811B355081E82B82C454B4A47769F430BA58B3D3903F3C53181F4675EA6718A174486D707ED3329BCFE70EA4F0895CA3FBE1A276B2458FC8F3D3B653A84491B487039B9FC74FF8D261B846837A31A0A31EE24D6477BF8FB918A935AFA999303F6ED26F17C6334A361025B6877FC3AC3688D45D5B70E5A4670C549FC2D8A9A942F813FAB80A0E36996F91C4F28A8704BA797BE3CFA82255BF3EB26E58973D718FB07ED5D255201333536A30895953BA9D7EF74EB0D20F2D3BD9483ADC93AC9569CCE215C01668BC94B899B10C64B5A667C1F394C3CE46E33F3EE7607BA928D6B86B9ADB1EC11FAA8FD7AA2B1C1AFB758597E211F8E3ED0C4124943FFBC14371638D62E941DF9447CA4940B13F85E162C2D24721489E3DCC02D64A75CE13DE8B44A64FBA452034F6FCFFF0D033BEB4D5380F6BAFFD397A0C23D779BB523A96D3372AC118A69B0C0F5F58A862A69C9106A2F8C4FDD96E273D62C50E3309AA43BC543B03182E16868201510EDDE00928B921FCF54B18106632344D0E900CA6496A7B34A593D3DD48FE7BAEF4A69F58ED5E19B48EDA33D71754E6EDBC816037C654CC3F725EE97EC8BEB23FF426F75E579A0A68A4E34023D90C786373660A978E3E50DAD5C6CA5E55389852C209334D9AEB1AA4FC018A551426EB48D16E9040E589DF36325FCD4E37A25D221701844C27BA82F5E7794D362BD6537058DAF101E8025738C8045274E1C81AEF6813BDD659298083E5AD70B587B7135B7A92789D6FC9561449AB24A0D545C4189BB31F1B1A882487A88A763343130C7B476365C6B3471F98B380D4E91700C0D81CA1EBE1A05DCE508B49A249D2E983092682CFF1551F722DB3ECCA96512AC31DBCE5BFA3B67A8677615372FB91FCBF3232B5C4EF40CB8D23806CC47602DEFD5A545F164BBE23FD0426E1DC6BFB7001E5989CB7F832D161A87564850F8E086DFFBE826F8715CDB29C29919FF9A615C0D6F8BA8C6E668585A448C45A3E9BE15C65BD001EA5640DA0EEC676AEFDDFAB406CD464CE7B340D8B98E58D5E1601E8AA628D7BE27ADB95C681C05AB4287849585878D3631FB0270D4631D59EF8E93A514E3BB64AB9710067AC7992A1412A37765EBA0C2F4842FFF32E903943CAA58045E3041A2252978E86FF17CBFC91D18C126026A32A65AF1331AB523D7C50F0E0DB0EEAB7E6C81E73F2FE3F6594ABC819F35A9767E47E0751CEA010D1814252E79D893A45BF3200C72CF80FBFCFB5866A214BCF880A238D75ABE5855842E466C4F8DEBF9F6FE3E5128580BDEC6DCE6DDF120AF7DD1CE455F3AA236AE81808DE4E7DA5F9B52F6A7CF0034280EC75087B0AD1B14A83DF0651E998AAE3A7D0F87B2591E464AEC1E1BDF2F76C938EA3FEF25EBB3E38267B1FA2E2072BDB7512531ADD535D90A61CCA3E4957188D4A9DC2A3B79B49AE0485F06180800AEFAB01FC88444985E707BD24BA380AAB4AA8F2B652609B5E997FC071E802A7BE8B853D4FFC2B38A5AD461066B33155D9C705FE82187B8F4A06DD86510CAD17A502F29C4B6F5957CE9DD18D5F9FD1BC10B16EA5650B58B7DA17F9F655FF47DA13F944A1F39801CF5F3CDDA3824E64FEE8BDA5E8DAEF7B2FC9D0A1FB85C77D3058362D5E62B0A2B84A9CC5E915B215E239080BA1433DF4621C98D6FD9BA5CC0CF9F99A9828E16D0018C90758B5E480D82B45F66D36AB36FDDFA5A13E69496F2B19F398A6CD4DA2A76A15E3E00DB9B7958F74A9E2F15FD75758C08A6BDE8FE414062A46549BCA28076D000F9751CBE3F5638BB002F6A7FDB6771906D655A54FE493B715025628EF0494F0DE3CDAEF8D795732F9B9B2914898F345C77A6CFBB2B54DA6B70DB4C8D9587C76C4FCD5ED32FD2E12835ADE1EBB735EF2E10D485528A5651D67C04505F03215BA60B3901B2FC0D477BCD88ED88251E04CA55C8DDB27DB8B4A341589823F2B14B8883F50D5970383F62BCB0F9CBC66BBEDE6CC433D5AC1318C9042EA995D9D6446C55480C284EFEA903BEF5986A3FE10F2D72EC7E090BB0E918C0064579343F0DFFC53BACCEDCFEA3F859E9BB8A4BE729D3E0D14626727B9F6C2DD2E0F668DA4C054D1C90D14BEE8851AA98E06C3CE9DFC390A0264C3AC8F9378D0E822F8A653F8DE8E18AB78A80A3FB10C1382FB6A4E35926A80B79AF9C9C103133A372CB646217A3CDCDE2B029ED3D9480618AAE63E304E06F1A29BDA1BE11805C7B69F73B7C2E8442417C5E421AD560EA6C38DB71C4D897E787526EA0EF02EF41EBA09AA20E3CF2144987C9AFB8A0A3AA0DB5BE057ED131F12AFAB4948324D1049969F68BD54DBFC29B6E61415180F61A5C4572D1189A5D57917CBF1C1FCC62EAA4E35C982844CF4F05DE56E1C32A10A62FF221508761925FBE5708D825A771C5D18EB864795CDF658722D1C116D8F74C2E0E805502DE06B997C65AC1A202B3C3481E66E5FB781687BE378AA44C6EB2E6CF22E0B21B4D0432D32085E20109F68D02E26A6C435B54386E855A44E50A54456815B9DA8F03059E3493A36E25C109B42AF7C478B65FC2B5A05A411390B3489F390A07868421B9788B83909B7AF0BD55B5278E4E8207EA476EB1D5D345CC0D52D0F2151A575D14AD8C708876DBC20B0C5E60AD6EE131BFC6A5EEA6CFD3820B3AF108EAA1911131E0451569FFB22D38BD5B86175249190E4247E66F575723867176E0BDDB7407FEACBFCF759519E1B420128A3370EDCD90F696B05556F290DBF7014B2E7EE99867FA3241813EC4F66E750D549E51128FF774DDB87410C08A316DE82DD170D56009D9D49FF20D379AF01E37DD8A9134BEE677C06322E9CDEF6438549E3F90A9D63EFC36D32A49D81F329E080131F75D1168872FC8A365E076D7C0EEC11344C2A1A5E2B81F27A1000B60582E4B28B4C2260A2730774DAAC2B127BC716F3EC2E053997B9C7B74E2E16D96BFB31A40547124EAF77D22E86CDD4A0E8D6B14D01FE10AD606B223343074F4A63F835BD721B08ED5B6F916862BD78087948D03B16D2E087BD27F7FBDBD9F2655F248304EE4052671905468440F3E32299A511827905B3B2100BBCEAF07C63A285A83102A864A23E94D0500580E2C7C70BA8BF470EB06DADD51BAFD5174BEC357DE332B616E3DD63D7274BF280A77A49B47CDDE9CDC4FEB78A676AED57FDE230C70D0D74EED15D86733BD75478248F28D4BD30F6AFE9D2084FC386E5B4F0B3619C1382515DE4D505BC0720C0B17849D774A9EBF135A3C6F63A12569FE3A20D581DC8C6679DFB1F09FCC062A251E1E091BF23E17DA778518CE2BB496707D07858836EC73537643972C9D9A5BB18C9A7B4BDA2A952519C68D285F0D7F42E6DC574B33ADFDDE97ACE30F7177508564FDFBED75B65903A1904DA0D21323CF824E8BD9612DEE0D18FE38BD3A33D42F59CBACCF444E844BBD72BF32C491B46F518F521ECD69956CF9AF30EDCAF5385748278CCCFFB2C1FE97C80B95444FB4ED5A990CF413E5FECAD722AE7B29B43030BCCF506C02514E4672F0E41BB531554BF2EE14C2394EB7D1F7FA411FBFE33289BD97FB0E8862A32DDA7BCD347530882149D0334302095E39285506D41D3600A4BBC11F8DFB080F18235A12ED9DB5E0E0BF2CBB9CE5F5E64E451F1DBB02A78CA0E8B7E18AE67B60B9782D3B2DE194AE986D4A8BB10F2AFE30219467C6BFCE999A10FCB767C06FE758054035D7F13C137A1A5545F065F1BD2EDA15B94DA8648D80DAFBDA9E78E51F07063093A0476AF384D7F0832E434160DD5E7BE21D9186C4636EBD94E033D4C7DCCB025AE73C58DDA3341E77C0931923146EBE4A6DEBDD230AC128030E5D2396DAFF127CAF8B20A7716D636040D6C982B46A4A4715D322583D0B49E8DBBAF95992E14F546E6146FBCC2149E003C11B49B0231CF09AC25A2C6C33C23CAB459E5B5D68B1496BB7596DE18AB09BFEF446C74902F205C28E0AAF5E2D8171CA218152915B8822F31A7AC4A08015C2DBA8AC8504BA9B0E4FC8ED114BAB21D9A2D767579D475710839FEE529187DA63404DEC518C85F4D75EF204200B37ABDD42B18637736F59C938F792C456AE4FC408CD81F2D45CFBC523B1724D2BC174E00416191BD23CEE3FEA5F380FC97A483A5E9CA614B8B328D34C2ACB2C9D08E70B8D3E51F0324B4A8112B9A716BD78DB3078AA1522D228B4D1E721E942354C3D1466BDD589132DE29C963242CD3E86A5969CCFF7975B4521093BEBAEAC0D726F00E9008DF9C047599AD65C96E81CA69FB48D6F5636502EE1442798DF46E7D75B564D9C85196ECAA2DCD61BD35227F3052C64E8FA1B6817C989FF59AB77735EE1C5868E0ECEBE16EA3AF5B60A07BC5079EBD51EC8A8A5C46CA4251406CDAC0785BA364F5F516B30B65278CDC2628DD35B2CA518290F747AF485B3D94AA2164D44EDBE61528DDB8C0832338F27CDC0280199E25646FD16EAD2F0CFF164B55E3751F56E5A9E5304E0F34059275C76F67C5FCF25487BF7A6F3623B90792382D09AF5C6CC7A07B84BFB152F8D6526DDB6E0C383C7EB49D2DDB01A591925B756BFD09733E215336788B4AABDCE53F3D2CBB6566D9733031C92E0C651352C5FB17F89E50749F14C317F131B03E09A77C6E988F7ED16C16F3CA6444631E007972A7A57D4C83756C764158134442F4F66C190EF5AFC4A625B66F063B057C5E75A4EAFC872E71DCD8C261694141FAE1F24AD4A4859A49450FDED6B81900183BFA67C6F0463546087F76B3E78DE1226C084BCD7B78AF5738792866F5ECB1686689943FD16B18626ECD6CA293D511042192504B778EA103D96EF12A12258C6BC33FC88D0CF21F013A941C5B73DE2A3DB4DA83DEA1FB71F8201A8866747D49C7F4673B4C5030EBB4323FDD7BED2D2F6B219BAF1F8FAA3D932D15E6C1C0FCF1455D42829D84DA572497C3F95E7C7333A4E1AC3BF3BBBD960D4C68E6468E200F0133288FF7B3663212D59F242B484531AA26389EDF9DE11FA14A08072319AB1266AD387E4C4905C5ACDB32A64A97A891E2253F9097B90F5AFBFA61EDED3C222D97F5BD0E70CF1F7149EA6AEC27061549C46A29F56455360A34905E556650867199C9895BA03700EB92198385CFFF6301FCACB056CAC5007DB9B8FD025EB30D8298750FF2AAD4002DCBBE54DA4E63AA4A3A9645F236E60D928337C43FF4ED669F62C6F032BD3C34FC4D8E89B24071BFFF7BCA45D8A67942C179E57B36045A05ADA4CA4EDA5FBAA135116F2D7FEBEEF25EC122E2FBC9BC01931DB82D1C837A08AB8DDE6AA14273C78AF3A53B8CAD8E0B287D1F5C245717201C3E51DCD5F5A347920597ECE1B7CB2B8415B6A9CBC307CC8ED4FC2CFAB29289F8C1B7E2FC9A3BB27E2AEB21D77E17C7473C5042CAC8D96ED35FC5D4F1438D736CEDA954A9410280BE9985B27D88123ACCCACA24C392A65C9D48F8EF910B544996E1D1677D3A6A20E8DAF42639D68AC693A9CE054BDDA1062169F3615B2DD2131EE0C993AD23B0E32DAC5940218A6B9BBAA573707827175DFC487F21AB81903C5DA876E9EB9C4C25EDCFCCEADB91522A6ACC37980BA011F5851DCC5F4A189903B107000722A18E1F93318C37BCFC264F35D17C476DBC42C224AAC396C326B9A003DA7790CC8053A51ACEBFD6C7427E0536C7F9F08766D470BEE61732F4E7C123D66245648882B38F295A6AF92C91EA31C51D94F84C6BF40B1470407EFB848BA2F3BF2C4B435BB8FFC5FDFFAA163DF1C47FA3C0876DE84EAA29AE632FC5A0275342FCF45707E8DA9337BF95A58C8707C2B9FEEA7201EFA2F5590E7F9EE91CB540BF5D5592C4BE258811039945E70FF18E08EC7AD0406F8DC9C7DFCE2CE7A01BFE5C4C9125F2BF5373483CFE247D5E38AB8231C1FC2568602AE50BB8B869FAB7219C328DB35F07E28721607D32CD6B8A16C3BA59A53A20C76B8D4B0D178B6CB0DB9D4043259CF6CB894C34D08C6BB9FF18E69DD45AF8E6D5DAA36F86AB7406FFFF58BDF9F9B3193AA69667B88AC63A3994CEE37A0A032F199896E8775508B461349524A9AFC533C48A1542FECA292AD6EF21144D61683F0301ED6DD6885C756ABD14DEB7D67DA7DD611D8466053B882D11B2C785B2D836F49E4A97508CFAEAC64BCE8D71D8DF42713DF2FD4F1032418728C9AAFF12D5EA89DE8BC7E2E011C918398070BBF49BC574C3E0AF31D2AD25F0102F5D2239A4B44CA55FD026A039FFBBD485EDD9875A2AD8DA0AB55F5F0F3C013CE480AD473FE3C1C3CD8B0F5214F06C7A30713AC1A2E1B032DF7BCD765C6CF9D771BC73C62FFA93354721F278070A8D8A8D13BC97EC80DA6B769E67DA27ED50BFF6D50EEA3D13A3454639160DD8724C334597C4FB899E7CE6D4415B1EF18970068F79BFB651C0902B5C4BC165BE79731193AB7832385F0889413265449C89EF13EBFFBE1FDB9E5F29BBD67D5C4254145BF2F35D90B32E0B494A43D554D85EF2A5696AE6E8B7A367C2750A1D9DE4A257EFEA3A26D51FD94B38F3185EB7A0767F6D621CF334A36CEEED98887708F8D52948D5AFC23AFE300251FF3A005417D17BBEFC5990F4D37C1F41A7525D86E7F38E2BB3CBE8A896F99F3ABD34A0DACCC74928732FAD82F9F5BEE225CEF3BED7D8D38B398422BA064D18318A1AAB94C47B6D64122A2596651A82B26953E09C1677FF5F3A9AB5E3B96F96A0734565B5CFCAFEFA706068C9F318BA7246B43B6D1040492E3FB5DD9BE6AE7C270B97CDA21B55565EB6A7336307483C2C5FC6F549FB3D0EA6BD703A5D041920042FC756D574310E0457609452D440B1D731346EA806F0FEF839DC5A6DA66396339F55F260AE0CD0D12468823A5C57DFBF9D69DAEC62540088D5D3092EC1A2933C08370A9C01B48F65942F3946EE175D25C6D967D8095283972C344AF2CF22EF52EF112E80E796E3E4A2F33F29D78FFAE6EB485AC1C848102BA54E6B792275D77816ADAD93FD36590DB93CA120335E079415B986EC74F6B5F1868D71ED669D28591EA5E6E89F9DA7D369186CD51FDB4E1E7C35BB1C999CF884D85F8C615D6DBEA4BEF45F6701EDE12B2145FD2C7688FCB21E576F43D00B89D9418538AA4B8379A93029EB9DCB4D888A6464DE2D5B2D44F6CD58C5603CD86A0E5C050F5C0B6AEDC7BA074B70303ACD7F6709E67965BD16863238E33B12928D91348E961099F159D1354F80DDF2535314BB8A940587A78F271E282D486B9227DA26049F6BB33A8CDF08ED9A3918244F76488A49AE97B2E57CD0966946F5073C1959C692556C27E0A319439DBF72D887C4D6C10D36A4CAAF9E159D12EE51401004F1E7815D995988C396DAAA782E5CFEF452E1A50E26B20D3163EE5A1263A725A0A7BCD27C11E8FEA8CDD8807222EBD36367907586ED5CD1AA01119B5C2B5732ADEE7551736E2147CA48FB6BB8055A70D435F0D582FF4D810BA28227500584F13B25C804E51912113C3E4F1E0C1B099B9BA8FB020808B54FF708FB8C42FF19AEF6F43C9151F048B080A62020A7470D85C445F1C8F6F8A1043A4722AD3B85E213335BF738A628231021EA0C6C6744F221E4AF44D95EFAEFCB504C8D31A800BC240EE8B4A9867A8C7E4349C685BB7DFBDBB2D7721763644076E755247E17FBCD6146EB3C9DFC9897034FB4646FEF937172DE0955E4E6F3BDECC57286172C051F05E519631DD989E7FB34DB42396D66C2CF56B8D0DAC4F5E71F970156D5BB824AE1E45F1B432638FA7A7618F9F3DC31D48BBBFC30ED0A9770FA4E999A0492906A448B983D3962CA0F34E58A3EF512DE0A188E1E86AE644363D665ABEEFAA24444A36F19058BA49049FE55368F2302FED62EAA4C4B13363E4F69106227A7DBD01DACD3EC4DBAE242BBA633E9ACCF468FCB3B1ADA1950C200717F74D02248F28F89108C8119B7617FCB79C7779FB8ABD5F717285507C60E607B0C4714D1816F5B6A1F756134BDEBD9C96EF183A94127E7904BB015DE0A655101E1974802E2CF009E0CAE989C2204279213AABB646524F3A11B74A88AFA60492D2C842FEF8F56AF182AA2710ACD6CEAC729B7E4ED73CB41E16C51FD87DFB892A32CC42F96E12C0DAB455626F8AEAB98FFB1605EB5F22B3CE25BE468785A05FA02417C66E4B7DE87D871CAFD6F735AE07E9919F27B1A1DE8AD50AB141A6FFD7EE0F3F70F223C361DA13FA7434886408B61E54C5111185BEF7A3DF100AF1982DEC77764DBA0C1A8232E043E5BA8422CCF405AA565EA88B37DD735CCF06014D668648564EFEB98CFC80A567982F4192EEF9CA34FEE2764D0DF710BFF448A754459980DF1540DC1512FAB8A59A0B1BC363046FCC22C8E7840818B0444939D484B13FDA0A395FE73C80399A7CCA6C200B2151A37E2095AB8CC8367E72B7994BAB184719C995C2381D86B4DFAD23CFD13F6FC9B249DD5321D3EE992635B72819919FB19C7307D909C9009E02D572137FE2F996597B180820E0149593E016B152C251DE7C016C5CB58AF3B466BA9CDD569329723F2B0EDD212AFDA7EE90D60590FF77A6F567B1DD83F8426572BFFEC594B70A68AF2A245D6E77693D9A165DF807BFB0D3E326EA4FBE004E19979794D160AE1FB6B82D2E91D741C8DCBEC6F50A3F4E225AC24C893A19866BE11E7CE3379E3ABE271DD65A931B994CDCF3990A8C86A14B703B82AE154A92A646FEBF8FDAB2422F375828CC100A3CA4F3EE81633A886F0917C8D1488C565BA63F5C992DAB8D12C4B13271E2A222B0A7531A11702E94652643BA7E4C44F91C1EE47F9F1DC7C554943DA8E9419A4B07DE8A293788F970524C119794BBA9B57F8DE0846992E9C017120AA2B15AD765585CD458D4B57436F6D0A495604C5FED1F3C7590EBB0C9FA3BEC8F82AA9FA916145968903321CC23595D0FC26F657E3479D778E76C5A7319F9D604645E0B041688994F967717BF33C400CC5FDFED73CDFA38C4AF0FA79F1E28A6752B426EC28B3F9D32964AEE25A8C2CEC56B8D985034ECB835B4482C46117AA5BC85DEB2F3DA5A205D158B7C7F3925B8286FDCEA140814661284074FBBB448A177A6D0107F88ECF1F4963CBD05666BA27D49B184DA19DA4645A43EA29CDD38C032CA7435CFFFD9131155081DE398AEBCA5631A20DA860AF3E06A7289DEEE0614907CD0EF1DCE94B359F1F282A9A3015B5742189CF6ADCB902F72A5C2F712D2161729EB912FF6682912B79F7F563719DEC2BE299F8E3AAA090C3D002A0D271BF2DFB57CA5B93378A9BBA5CD8FD1C8FC3DBA26164CF18A13AF912906212896F26AF42B1FD79744E678759C4F4500800C1DD0467D5F2F3A4FE0129BC2DB3B36EE3D8C8B6D746AC9FC991BE8C7421083CA4C3B81869BB51F7C3E2F09BD56AFC74A75B389A09988F4DB879C3EFF4140202A9D447B8B8A0020AC924FF15BDB62E34E295234AE684A56CC15A4B1AF66590414CF584BE1FA05813FE9299CC77A8E947B78A4E4C945E6E3209BCB5107E1BA94D2AEAB5CC17D425242E7B6D03BF62D03008A5B804FBD7C0EED5E8ABFEC8EC49FA16FAC4D04ADA76919E84F4312D61377A01D5C40205C2982CD862F005927016F56B94A541E9F07044F763DCF1274EC48505AA9BD68D5EDA0FEDC6FABE42054735E434364E99BC60FEE2E1112F6BCEEEE8F4CDD1F6072D07845AB25276C12862209DD95494A85E0601B409AAE42B86F9DB36AB1965078421EBAF3D89D161AF9492D440CC879216ECE643BF84EC3B0E6B7373CFD8FAF4C6F7BF4BC0E3EF36FC0FC72E02F176ECD1F75B9EC5C1E222EC6CF6E9A662E65D1D7E1D13ECC00B775DEF410A86ABEDD2478EEDAB8F9860A69E7CF11D35F0797D92CFC708CD1B8713123246F21AAE5324CA4900AD91492344BBABF42400FD0D899D026BBDB7AEA023DE5075E1D76E370DE8C615E5789C8B0674F70B0A3309A7BA6A1EA32D64E3767B50FB496182F62FDEF16F02B83190ABCEBA31DED8063798D7D0FCCF3D86E0A04DA2DC600D0C47F2E18DE7E0E1FF9A0774163C8F00BFCCB339FC6BA330462CDFC8F66C6556FD94556878A1C943D3F1E00B5046A202F9BA1D75CAA2D4D3D194FE471B6931AA3E6BDBD9B87A084C1AC65F90251D41C8E845E41EBC1A05141DC177F6DABE4E61D4E2117C51387EC25ABC430087DA69B815385E16B6CB0759FFE007DA9B2534CA258AC55FA098DAC8BB7F562E1CB444FC5826DB07346D0ECF18DE8E97814B6735384972363233092F1E505F34F20490CC934D6EB428B669E07CC662FDC9FD391336178F615F8D6229D17ED475FE633E006B254B75C378D1187A2587385F1C63A41BAB607077A0DD51F19A7B534EE26720C9CBF2D53A9528A78EE20FB6AEFFED173C2DB5314A0F2B81F94C3E9783637AC1668533B5D3D96C42DA970A68AE7BE5D73EE10EB24410F8F0B1D1BB6707541880D0D77743DB69D7BB01B332925E6F50B802A61C41186EB517051A92A9A5B060406B395C246BC5958A37C4149BDCEC19281E34B85407F5E2670C2ADA55A959627BBD7076D6673F2E6F2E617C0EFF84E667BCEF2C332FAFCAEEF4FC1D8C0AC3B1CF13ECE0D828C6130418B539590363203B8DA0A43FD46F79B8C9A26FBFF4C5E72C1AE054D1BEBD6E4A47F5BF3DC07CA866C8CBA10475F090EF5CC5382826F28A66326CA26D50628DB12F807693919F53584DC70A270FD7EA760B3974ABD8DF976CD4DA98C4D89B989AB5B5F3D54166FA7BCBD2CB1903667D71E81781113C5B76FE04C71047B38A7D149FD2F1654F17F7C2B6DB53B2C2BFFB8335F68742994C12C6E32FC48BC790E5B5CB845C35704FF6D72A03E8BA8FC3727EA24FE5D009B7123443D5CBD74F63DBF74948A1B64A08BE34DEB4F3512CBE65DEF6497114FBF3C155691707C026F6270CE7E88445C9CAA182194D7C4B5EB03F60DBB6267A1D6C87784A37088480C3ECB236CC066EF45421C552D327D76DA0078274B4611408B7A281B95085A1973870B7784BBE2A4F75363B920C8849244A00D97C43E6A58A19A47988757C5762C22EBCEF692AC6DC76273E3FE0DA75E44EFDC984FC75EC3DDF791B314C66B57C5A2C510F850E78B5F75D5F8B836F73436E5AACD046B60E63CC2C0E35B5790B50200DBAE003A1BECB4C7218C02DD7E2796D1A18F68F47E14985D3192DD7A1F4E1096F6789402B4A57C374AF30828C55101EC40F3211D0CC70489E69CF132081EDA895F9A2AB87D32387FB26DBD0769A5DB600F17B7F0DEE50E8DF8C927B585BE63F90B15899A9081936D3674A8F27197C102A8E43472F66D00D050409AD6F222D6FD72E59E9D14E47FA0EB48048B5E4E1866019314381FBC38AAC6D55B093847781C8F719AF5E53FE0F475728F0E1BAFBCBC325EC57CCE17BB31A6DA998C2D8A2C6658F33487776334FA9E6F07A38A8F7242CE7DF739E4EA868793740DEA79D43F99FD2D92FAD48ED2C638855D55495B806C9964E7A5A633B5BC5625312A95C512E076F9A4640CA8977EA5DB91B7D31456C0474286BB50FA9A2A7006B051E6B22900D27470650AD92CCAE8D84FCAF9DA4DE930F15D51FF48B160AD2B15117228E112016EBD97458804390E968358B4AD3F8598F1E44D74F8261B1930B0AEF6667CDBC986A3EFFF267E468979B6168A45AF7E7C49E4DC5611005700DA8A01D0139B4D06C4932810FCB9D208DCA1ADD923AF50613C9113344A50AC3963CF03E60EEDA63FB11E50A224B262E6D8D06913D1A4BD880B47D6905AC040A82376E062DDDD27B59207BFFC3CD439F7903CAA34940659036A65F180F04341309BAC5CE2F81BF445267D60BAF29E01D78AEB0C70D7F3AF6D345819C8ED26D2EB6421E2472E5EB559AF623598EEE834191FD7C8B6C2C0A8548CC2722C77909DE56A61D2CB58ECC842089DFE3893A42E0B87B9B337D5AC1D751A0A35D5F33FAF503F99FF73938B2FCAECEE87B45DB2D1CCB829705A7E413A70EA8B329B0D9F52DE56898B986FA38BAAA70CD8EC06BAD7E2628CD202E0647A70E20C1ABBB01F38EA6C03FF1BB1C2F2DCA1D83F1428DFCE0BF5F4BF0E7DD4E20E01051722E40F3D947DC6512B3A61C7750A6B86B8ABFD0257ECCBD88DBDB5A8694A4A604AA048BC5E974B2879DD924A9B88B171C12A477DA8F383722E3EC97736476CC027012BAF28C4DB44BA588459014E2E6580459982077121F2E45C01558CE52025A66F24131DB1CAFCDA5D19B2371E55C680913F4883F3EB1163D6A20894D5E7B0E5A2452D067190D607E6A8D81A12D8D753D44DD8F133E2C9BC129E37C7D43D36ACD115DE7E8C69A03748F3682F94D03F7F0C87F096D68532E6B79A4811315FF17A26ECA67EFAF0F8AE8D3A87715E1C5C8D5C454D8A2E252555A76D33E14FA0F8103FF6CED590EBB01BB923DA081C01A1A76D6E340006B7B7F149D7E52D5EF6296775E8BC4098297B1B8C67F8CA36592BBFDEE88D7702536160DEAB3395F8689F5F6DE9AD3C8D43AA002D7B3C8F0D018C8AAA11BBC64B8FF8A0525DF5942A7E5D18CF4D49930EAC2852FCD145CAD8F550EDB130013AB15997374C869E1EE7697471E62EECDD79E128BC5A49F19CAF2FEEBF50D85459E58D627D8DD8949FD25BB9961CE1D05458F9613CDAE41BD245BE8921398D58ABF912FECC2FFD3D91AE388540FDFD9F6B4026E00C908893EDD410C21D32EBC79E9ECB767D42DA71FDBC3C3F4181243834FE9E444340E43F3DC40B864ED02CF071992DF2B8DE295C18CB73B20A8B5607A50AD55950A50FEF028389F8F4767AD36404CCE8A026B2246105285CCC119EB760F1F5BB9E97F178B7491D948E5A6F32F624BEC5991F178AF109B2C33736021B60D1183E3295A685B33B8FC4A9E242D35AFE0933578CFFCB56F6D7617C05FC4583DFC7F52ADC1EFB11D837C80C1E1A0EE1B29E1A35485F47261BECFFBA48968D34CE80B860AED7F828D4E59C791EE0367C8A8A72C83CF11151EBA70C15AC062CFB889AFCA3DDFB530949F4ABC7B8CF51998485E393A5603A9DBD2114ED221A5E7A7F4E8DFDDED839D226DB5162D1FB2CB44899A1F2D701F7CFA4CBACC36F74E0B2C516A8535B4531C61AFF2142A7767D5AAB962F592A82430D93802FE329084BCDA6E696FC55525BE10629AB86F37EC5FEBA10FA2C98EB25D5114C44B28706750AED2EE45C2CFF958487C59660B83791B5B70D6515B837A8D243E16EA92D7BDD11DA334B689FE9C8585C9D6A8CE25071614954A272197F15428F1279B5C83DC9099CF7D0B6831A4EDB6A07F8863641649A71CC57CDF3A08FB32C553228274035EEC207C511529352A8EFBDB76B9D3BA51957E12A60D724AAA949CE0108227571B6D1E9C1BFC689BBA17AF40A92E4555737F4D70F6E97951714128786A7DE95D31436024B3CC35F294BCD4AE4A6008F2BE2C651EF72C39BF44ABBB189F8122C8616CD10B95078B7F4F267C6BC8AB4DDEA39845A75A3E91B30054ADE08A265BF1BA8082914514DF171C43310302752E97B4A1D2244B3CD9D58A7C72EA9AB67DB5DF18F9D29825E25F5BD0252CF8ECBB8D08C84A46884EE5DC7A2175035DDA6CB15109BA8D87517FE9D63821AD33835580702C6714D9953AE068A3F750F27412C9732AE9A83EE74A986580CEE73988CF74033AEE617F6A1B6B1709886070EF05B134A4B316B573BA85AF3453750509090B96F1F5E611F78457ECF74D81ED3F85F3D9E479D46F89822D2CEE044CE590225DCCDF18C2B08D613F2E710EE05029C99A8F05D73141C6261644426CFDD22DAF85235642F3ED62C88EB5A59B5AF47E01D8F84CECEDEFCD8D1F32A2E5A56C47DF9CF6E64D1B11B8CDABA89B97E996FF9BC7C8C9619CCBF773237FE5835BD36B0E31C424DB785A5E0E894988C7914669735D91F3002E4C3D58B5D4ACBB1BE71B2A778510839B621B1A811481C3FEC4AD95E814BB641B97C1F26F6E7EE3325C31DB7AF2F6D5B6254C7BD837E316A16D103FD247ACD7AD37D0C1865B14C91C6343A9AD6F2A84123A6744F24E18B2079BBCDB2A80E05394FBA0FEFEB5E4CF7C723F97453C66B1C1010BE5AFD204B9160B29C7D0D252F8DE452BF93D06952369B842B7489294137440EBE95C236010E4AF9FB7251ED4FFBDC75896C375DB5715F11CD5B1291467BF36BD2EF83612B6722D1C12B68ED9EBEAB63BC8A208C05D24477677B6E92AC533AB334EDDA9E3D844D5E1EBB1765AEA44AC47B6CE43DED8AFE52C73932726DAF9FA36ABA3B6975CC6EE88DA652014B3469F9FA29AD636E572CC5F2C999603F9AF3D070AED8339F1F6CCCD7B49795919D6CB0453C4063D4781E2133AD29292E0945C44681724FDD5B7789991D9D73D2F94754F806715CA0B5317ED6B6567A9062143FC561F452E1694EBBA336E975D797607C3C4C1A42359FF9C05E21118684C868C8FFA180A82586881D4EBEA1A89F84C79DDBC6C48754F8113300D2D6EDCF2450A00E4D954A32EBB1353A54D3C44B45E1E1E9455D0F2E90FAC23ABD3E1CC75CF8CE965A97E8AEF889EF9652CD9AD7E768D5422F891193E1EEA5EE39B861EF214BC6ADEC75D07B72EFB644D2D33769F46C74B36DD4F534BB0B10AB1DB09D4BB13EC61C395AAC8F9A7DCFBF1031B528EAD1B6400E299F0BC97234817B804EBD7582A782B1D1B26FD358D17FFC6CF406269F7002A63BFFB43277BF7C949F79942BF25A519A73549C4EDA05D08A4641891A63D3E3B1A991E2C6D684B9BF58CF88B5B0279F2A7FD9E8225345C061A3D09BE2D7B34DA3990CD65646CB839EA695B9ECD6096099E9A5CDC62971E09991EDFD0227A3A6128D5A7B68F032AC7BD10ABDACA0C432E0DD9A08E50128ACD907239ACC15C1E3003FB23CA9EB8766EA62AD68A8E0F93A9A7BB9E71523F34503F1AB8A1E68745E8CD3CF63F37BF9ACA166DCF4FBB1C3C472632F64058EF20F41D1467D99E4F14745D1C2B86A9C405E50BA69DDF8C7E90A5ADA164BFB5DBEC96E58E6839B0A134AC306B3825E3CECB28BCBF8B0839A824BFB189E70B78987F1657FA1E8341161001F08657D4E10635B12F4A3CA8948FDDCB73034DC26754D526C492C1821E693E2FA0B205CEA0F653625D7EA0C49C1B2BC100514057E3F078911E9C720685E648E6EC007CAE507476B99856DFB019864DD694F99B9A34B0550E542C18801FDE4A3D724BCD0C61A3C3EEFB8EC0D27988E098E85DC090B980619002622EE2DE31337072FEE745A9460AE04AE333DBF928240869070990E18EC6B0DB01A5A82F28A0275EB6B81A0415AFC858A5DBAA966B44B2F6B1D7710F4E91AE7A1AA2611B6717F3E15E1D54DAE912F7495AE738DC1A9BA23C37F5BDA40C50B3A280AD1EA0648409C00411CB66551EEA82C4293EB29F586986A61D5FAEA78CBA1AB9499D090A07FFF4055BB647654983E5B27245FBAC3370E3B681C8ABBDF2DAF878A1BFF0AB660EC17EFAE0DA4846396BB24E8133FA02308B903AC9D768C5A44F0D7572EB30F5F9F26189957906A5AC3077C8C5A484299433484CBE6059040CC897782AC057684CD31E2C3F47E1B345788DF35E347AD23E61AF42D09D4D4977B30CC2E180E173EB18E67364FE80510377547FE8F878613F321D58FF828D9314C337079CEE08A03848ACAFD7E04C9C970B60C11A4F22BF00C2E0B643ED381565A129E9B214DB3BD2E7F248DC3D01E8BD97DFCDB9A14493EE43D3F972E78875EC1134460E619C8100B5159F3628BD25D19254E5A0BABA4CD0E3D31835B6FE354EBB06A007CF73915E739F2860D03C402E535828F4CA8ECDB468DCD9524DA2BABCF1E08CC06A76A698B4BBC28FCCE2BBFDC1B026E25CFF28751BF01E9472EBAEDCBBAF124A9F466BCFCFE73E16FC00593ED2B0F91ABD21454F215904F1E7B57C28FBFEDC8611AC18F3E0F1E136DC92C05F546C265F512CBA04AE552E86A2C38AB8610771036B0EACB558B5617FE3BDF0D72B5BD54E0BB2666EC2CC97C278E2BCBAAB70B3B3C3ABDFE7416A90CD8528CC316C18E14CBA009F7C91FE94DA58CB8665276A4AC12F90C58366CF1D68A4A96F743F225ACD3B3A233EBB9DC5F638C812D84FE0A26D96F0F60B2D09979A4D43058C690A6F0A9891D391FD9EDE14F2AAE2A4CEBB17E6B99CA9780537F73B2C2377BA79014978CD9851953CA1F36ED1AC27A2D5F807DA95C0BED0DB86D8EFB1C4BA55A3EA36F0E842E2434D5C9DECBBE16BC7F2F9A8848E52A6E26DABB74EFB863FC622D8F75204FB0FAE4E3C3901498575BCD296D6E255ADF5679CEDFECFA548F6ED63363ED5C113231ED7D87FD7076E26C49310D1FB3A4B5EF0DF9AC6F8A73A9A5C321201AA44F7206ED75E8C96C988220BF5471BE76510D6436D69AF892A853B4E1A62014E6381CDC92213D15AB6F3CCCF873F16EE2D2CD6834B510A6AE4C8ABEFDCEDA5CB2A0327783911CE85BDF0751766648E743AA3E34F8ECAE1F4C7B9602435B55EADF7DFA9048EE30E42C2CA8CAA15C13587C06BC9C3A523609BBDBD32F7216F2325DF465D4F21AFA49578A8DCAE7CEAAEF095CA0E1C5EA1FF19B76B2715187C02703B5E2FC391BF844F813BEA4ADA3D9DBABEEE65677C1A63C7B6102AE8E7FB8AC4572016B3137F2526C006B30199A7B56B3BA906E83D9B2841356DEEF940C6F2483D778A5EE129468CE6D2A889B5A1990C6C7BAA397FE96E46D44F54438258738B290BEFF41019817BED77451F5123EAC348EF48A1EC0003FCEFCD5B84899213278AD6AC4F78B8BD0FC2CE57AC630CBF891FF9E1CA281E9D95E49094BBE16B8148667C78A294D43FC023DEF41BA14248D860209D5AF2551962D47EF7BBFBCDA4DA4F9CB54420A7DF0E0945903ADD0C483B13D7EFBA18F921904EFFA85FEE9231126B98367D29F41FBE394A4635561123ACE79CA1B24A7786F5E8D8F3C23FC6F70132EE9FCA9D6AC38A67D90A4DA4C7E480C9BD574DE2FA6CF6528326B6304A8B345A6E2580D735FE89045B420BFD70F6BCFD8728CAD998A80B15AFF88AFC415C7CE4F3BE8FEDA7BDF2A0DCC4E9C9C39FD091F651E4D1422269539573844B3C316E13A8DDA7B66F99A90D0A12AE2E341EEE74009C61560FD82EBC9EBE4D27D44AD38B469B581E5ECA6B147D71AAB853AEB068454EB4D90AFF6D033BF103A83E6FD9F4963F068603165DCE1938944A628DC02BC56160E52D0E20A5BC79B1F14DD11208762F65508F99727CDA1C9AB41D0E11130D65B3FE1F544A812AD964E97FCA7A4EDDA04FCF034A334E46E8B17C718F006D98E58F066BDFE67E8F0952A8DC26C1D575E015785107DAF483E374BE5255190717ECEC624BCA16D857B742D64DC25D00B997993866C6C8B196D7AEC00A5907ED0A01ABE3FFC5E9D89AD7878B499C33949F18D8E39C09ED4FA1B2B4702942682DC6C9161C442F458D4C0059220A8E4B4B3349EC3658756A5C9096AA9668E561056972A6C9E06CC49F565D97D90677FB82D98621C46BC85CABC07E7E84B636D967BCDC5A7890B8824E6E790312E190683FEA7B8D33AE87BAA8924A95E3311ADC3DD5AE1E4276551BCF6C063AB7161101A441C40843AB398C11788688AEF4BCA498379DAEFE16C07190DE9AF4037FB777C540D4A0A5BDB7618D01EA2F806F9E2AE6AE37602028FEF986DC126A7623933FA0B3719BCB805D22CE2EE5C32B1ACD87AD0525D8ABF47D2CF5D5B534ECD3ACD79F35C7A87AA85D5CD1239A37D83D6E3C862FBD62D36FE34F8BD2AF033D51B529FC2D96EBB04D764B985ACB89AC2008CDABA10E04DEE76122D62E00A82FDA6B494DAE8B868BB176F5C8480D4185FCF84294ED877E70A89C67C5E0DF8A764B422906F5BD0527FBA42427CE989A32F3789CF211217B97BB04E89943A73F11B88401DCD45B6BAF667A5763B386974EC3AB9D9920EF063BC6B799FB846B24C370178E5AD70FD49DB5AD8897EA6D726AD506EC684CD90E662E3AAC3E3131ACA53C503C8AC57FC1B4A780833326DA17719576F9B985E66DF3F8DA7A8DBEC733E78A0AAF6C46BFB4A69C96D821D2B41ABFC37AEBC616B60460583F651FAEBE61A813EF73B9ED64BC74ABEF150FFC445DE8A359791993A8CAFE47F7C8BBDE9A6529434F3A463783327451042809E93995C03140DB99896CBEB66454BBA54E789819B1E2D14B49E321BEE01D5CF702B1C5F94F964999A7B7A35EEEFD88ED4635A883B844627BCD912DF2C1EBDE5A50A16C6E2280B020283C1C6F512A11BA3BD78D1A6B1DB591FD4ACC4A450219AE8C02C9C0ACC71E5926C429C17A41A7D306DBFD96DE4377CB83C47D801CA94FD836A53C6041A5F7258EE9F6E724900F2D72213FEA7218A9BBD64BA043FFEE57A74642E128F4E12C889A7A7677375CF5B84062078C62B439AA452CE5E2062A816643319CE5CC65D6789384E33FDCF648DFB74D0611FE5B5285EFB64E16A8273165B2DFEAAF7E7134163849DADC8C5898462296252DED0C6E576EBBC7F0421B159232C8E5688390DD21601FBC118D42F4F2E0DBF5A8EF32AEAD0E73827BD852CCA280A6E00C31B0599A198C539CAD704EDF6DA3A6A87642678E7B75B8B673C86B7EC0B613733CFB825697EE674127EAF9352AEBFE804AB96DE984639F365025511B521D3D6B783B867C2A99E1E960BD8824DBCC4F44D91387B912B753FC44E2EA7E3BC3F536C33D0FCE0F2D857B85A9FE488E3D9D8346DB13BC00A63244A9B33C97967C26B977D9DF5CC4CA9F87FE179C9FCF1EEF5608E1F3CEF1EC1A8F86914D46DE12D22AA7C5431A8BB23607B125D0182E757D5010F58FBEE2328A301B3C135E1C79B9B8EBDD55BA3C40E3C009B52C143981A0B4DBD807B43FD72CC1892968780AEB6DAD37DC1A23018987B721534BFD21BACD6C02C806A038C4DD020FF081A1B239DD14EB1EFB20FBF9C455F90574C5752EE9DDE35C94A11AD51C54FB0A3A28921CE849BC340CC50E0F12D1191583A9375E196CCDCAEC303959648AFDEAB63D8DBB63D23A6C1C87E1B39A60A63E0C0FD5057C75DFB8B1D564C7FBBE5BB03F81D4AB987D98FEC8B5DA2CB0D6FC499F37F7B8442C30A961311F8266714ED076BDA1529D9D55409793B24D157020CC7AB7F24CA31D265E8879B5AA5DE23359B1FB8DE4E15533342ACEDA62370F12A465D50F5AD1B4C77BB9A2C95AC084DA8AB3D1789C805D65F7CDB2658635C2C2D701C1A4AC5A1D1314FCCDDC1B768F4D88E4DEC4442BAA384A313435A4F97BC2EE50832F8CFF12455254D579604BC55FF0AA30EFD40D517024EBDE08E000F5FA9A5A3468AEF193E39C5CA4369F3A117F3A97D66554681F94EB2F242791977D4476D7D94B94ABCD19ADFA8AE4749832098A7C7917D9E9CBEF1AE4AEF45A089ACDB573BCF0F6650FB257FF336D94CEECC8B2DEC880C3474EBDF0740DC0E526B9B9FCABE8A36C9D131EBA3D794A8A0AE498AD49F25E18B739FC2461C7FB1903312614A82963FC1FA6B2DF7EA5E455F72FCEC9FF6C2E6669DC5A664B7D1372B2AD70151308EAE635D7890A68C3E7E347245E4E282A09F41FA0F4092E96862E01D0B9E8FFC7D7B6BB8B73A8C3049C4F75D262FFFED0E6FB40A1CD29467EE9BDF85790F181653F17DBBF31887E38CDCA4547E77B1A3078D5254EEC1824B19ACAB0B8EE7205A776FA79DBDEC04B1F730DC09B0D0FCCCB53029059737B963BA84219F52D726825A864E3FC40A380085C96E2EE9A48CCD7D12ECAB278057B6DA2F9FE751B0B4391195FD5C96F7FEE7E227A36149B664680953B8A9E2345EA6221EA59D016B4918B560378A5622622E3E3F5E16F8475B32231B034B17B6B0EC27CD04B78C8DEF677DDE808BB820FC0CE5903EBE75005BA9FCE01C16E22B08FB20A211B3D1F6CEBA22CDB2D295C6AF32FA1197E783859ABB79673DA7805650BA18C8DA497E3F6AB23AB89B55CD537DB3AF50D0BACADB452BB8C9B536CFA3819CF5B5694F99D149A181EF0317739508A116E4B4795DB0E4019F3F6E474107737DDE5EA36F33419AA4573B0AD1F3E9C93547E9F898E604D8CBF921B58B0C4C42C2F1E3480DE335DFCDBDC820675CE0B887B41761A28FA78C130603A63EA97B0F5C01171E66C8A12EAAFA04280864E94729E98004B94A2C94194BCE29EC18AA9CE067BED2365C9B8078915662520482006EB9378CCB006C2F1640E5EE66031DC747084DBA5EA2A830A6AAC9FDF169F77D83975E9C83A6BAB1D42E7DA273FCB0AD7320AD3CD0504EC9A34764345CA0618EC25E4823AAD74A59F63EE1E6E379AC689EE34400B79132ADA1AC5E1F39FD9E475EA0DFE640508770655DC20DDC13F112C06FE81A7E0DE15E61601FDEDCD428C5BEDC0D120E810AF0A714179F62916B5129E0563FDD0369BEDF16526388308B262A3E68A61814B1839B5351A0E0CA887CAD85CD3AC6116928E6F8B20859FD7C92FB183974CCBE38C7A18B9D3EFEC8E76F0A698F6E14C8B0F99AD42351BF5813FA8A448E0DA6A01F73182EDE895A3DB1B51F46385FFE13AFC2AB63413B3E84CCA515834E623A0C9BC9BE7B9BED20F1D5AAD2B8E89748698F8D68F5E33369D12D99304F0E5FEFE87A9DD30E54ACDD5AF723D93F69634025BAF85C35A2BC063B04CCA540CFAA9D93AC8F27CAB0EBE60EF53D83B76DE8D9422355E01955E9329DFD0C06ECFF68D01233752512D105237C2BAEAC7AE8148DFAA5B22AC9A16FBC3F74F8D3A1DD00C4C07041A30B89C3ED9042CA96721B791BB5B0D131BE8DF587CD28FB3DAC87EF3A940AD846C7B7F04D73342EE98B4F5F0B7343E9ABBE75822C9869ED0A2236E709B6F3DB4725914E58F97C9939EBE45B821B66D0BF275EAB41B6480FF94DAFD1130D704AA2C4DCBF7147AB64E8D3D07468CEFD16786DE3841E5BD0C762437AFE914A348BD4906380F9709866C46794E28C5988CFA7894867330C0429159FDA9EAC0FEEF6E4608D405D89F556E274D857A15A4323427287F945A0A4297876ECEF1CCB964BD665126D476D9D10A32BCB1C1F14DCBB8BA847AA85733D76C06C68791021A91767CDAB132A9A238FDCECE76BBBFE17A525839BE719AD3C5EAC05BE5AB3FDAF353B1BFE7A295C3C9C7F7D6AACDDB4DCFD74DAD5C5CCC3B9931C55A0E98EACA12F67E92B64B6D1BBC89BAFEAD978FB159B46A50289CE316F07B7B734BE46D8609E18C22D4A009DE301436DFF9F12E32356B81630FF5FBF6035CD92182C15B1F6556A10275038CDEFBC9B72805BA0B7BEF58F3EE214A0EA12FB80CB0DCAA928C8A651073478482AC1ECC1F1F6F9D1BD46A0FE31427B6CD2B7418EF76041BDD8F502261B305527A58EA5F01D183682A65A8CD43BEA3E795F7CD582ACF42D07181429A9E303BE901F30258C84B2538AC0D102EFEDD23FB7D4659E527D941DFA650D350F0AE43CF87EED9D073BB23DBD7EF90CD1CF933AB0B5FC7F3C16A79684278DA7B16F69E56A4C1EB3BF0322F3DFB2F57553925F60EFA961AC96B40DE95A99908D7A29CF31869D6AF2BDD9123C4161ED9781F84459681A262E0A4C3F088ABBB80342B898853B77E96A88A1E0FEDE26A722DBFFF4979BA9F858DC4FA1C42FB299A37B4B22C6244BD6C6FE4298585FF84211CD0A89319F01A2248A9A7266FCB1DD4A8A3FF2DA5ED734D69C279939AF6B4E63855566239D8290DD5CB345FC9DB124A00B5FA352A53C81ECFEF84602B70D8B13E7727B2B68FAA1DEE4BF4288C8F7A86B1358484F34251E92AB3181D34FE2E4992031CEFECBAFA15F13069DE477E0FE9072AC8287627B2C74A02AF0E6A55AE1E2FE39D87F4A58C8BD6CDD93568C5F856244E67C2981713C3E6A4BA289CA44B0BED667E6A36CC6734DA1A6232AC86BD2CDA59B061BAF1F30C6905D37A0784404D7454CF44D131A37B1E6F14D3A61A3F025A033682B503BD7F94B0494E592E4A9ECF981079FD4AF570512371FEA9F75EB69191D36F2707C597E180E751A4B27F575DBC232E8F219BB0C2B67C198086F4C798F4F6113492687693B53413F27C46237D0F261D9FF4737A2FA517129885FA03E3921E4E4A8A6A2AC6036B5E6CFFAA1F36C8561EE6DE5F295D48EFA383AE2AF133803D6D3A2B93EE6330D8EF70A426C4440837459DEF6F74EE4BDDC2B789254F33238E85A136D5472B77AB7BCDE351E971A74D821A533DCAA20FABA3F3C568FFFD02B41091FB71A7BC32B69FDE8B51AAAF2ADAEE127B9B8E4319FA8F1CF6C56F96E288F69639388893841AFE4EC4194444F96CD5628897FDE5B2B806697344D19587A1FFE5C52A165EBFF81AB2082198B163DF54E19F58204EEA5483D8D8A1EA60E91E35FFE69DE2E0E92E68AB624BC6D1C4A33239A44FF9F6C6519725186668B3249ABAA0D14D23637F7A6C8EECA148EAB1AD1C8E5B1EE3E0B2BC018F1C88E9EB2FE051F2894A8997A3A5C6EC8BAC4F48829B37B3654A49FFE9A3F1AF8D682AAEE57C3457C1B45C82887C6146B2E50452417A89FA7A25AA005AE3E641C834412ED322A151D597017E8C14446C02A475F413BDC2936148D1CB874D657C4DFB17812C6FB4655142291F1469D8FCFAF302A5A707CD16DBF0F9E5031A82E7263D249BB3EBC114249C5CA525C839399C2D32201FF9565AF82C1349C244F363A60735E63981BD44EED6447E8782359B866AC6302D78F5A1F90709B26D2AFF15BDBEC259879928E6BF69B98577FF630A286C21FE62FB20F0D25C86502F71E1808F7B9ED502DDA2A2924856D1934B4D68EE54760889A0D7B60378856BB6443350ABDEAAE226DACE0AE37B74DE4398F8D752DEA2F702CAAF21084ECEE918CB75391905C16754B873824E7171BC35BFFA27FD052D69B11EDED179B9566933F6F2E79069D08CAF6A9F8D5F247758932E9AEF2797ED43A2F3572F9BF86246AB10EC1F9F4A277D83FB2599F869066A0213B45301D5099AC7E614207731648C95EAA957D977ED53CC8FF980EF4A7384D7D9D006905179CB0B3F97D22D720543813F51E39F5CD47A3FCFDF2773434C1C89D121BDFB97B6F427BC1C76770458B85F014E7991DD3D6C5B691E36F3463A861A41A870F2AEEB0706C5C1D31D6E1C2BAB8919673F237C38E762B7C3E89AD4D4D9378E54211F5C0AAC3145F5DBF9341A6BEA3C8EF4DA245E12C8D24FF8E46DD203F73644566115BC4E8D6CB0CFE12222ABAA17216968F487676A1A74871003311B51E7F97111B0C7C96C48E02D277007665447E0FE24060443AF91EA90C8263EF093CBB63694E4EE31DCA6D5CB96D220491F1A85B812312481CE1F3E090C3DACEAA25728C6441F7EF976B55FD4ED637D41110EE77B863461EF839F0875D1A4A7385CB66418C76313CC5AD28621054506BA713948FF7D149624E3484EBD37829695F3020A7BA933C3F679FA291A67418CE80E7E98EE275813DA54920F499C3635D69FC92B7E0BA96E7F70F5C99BDA5B06E336C9E61330C353880B7E2F52980E19CEDCDD766D42546EE0FDB9DC6F60617807F6E99842A37B349B8F5B25317D4D1316CC903ED56AE93D060D36F9D089C843888389C4841941D645539BC0251F1E3E2FBAE1F172C8C902AEA27F0365CE6B81B4E4821A62FD582F9308FEE1155B57A8101929A925039C0B81D1B66BFAB81F558A4E7810FC649422ADBF80D16F5F9AB2781A32AD33C6DDDB4602CFC747FA4AA41671AA987B3ECF027C4226F2DACD882F8FB0E0FCB3134AEDD926D49D2D19CF34BBB7002AF7DD156090C465C0347E58193ED96717E18861F3DFC0E19E51FE31697C8C8E82874EB2DB31C1CE3C61FE16CB64992B76F6238F0BF8F1C1D7F3F422E9B548395C9517708E039D7BE62D598DF71BAAC629933347E3A8226F22F8A36F24406E9725029F490BCAD7227C396A8EADA8AA8B7AD87195ECFE2CC105F6548079895E8489204AA3FFC4726E11488878E319252A55C006B67DE79CC724AC72B3F31EA08337216DCE329281D28D919D106D408A109D944BE63B0760733FF1292F1F0365ACC6CBCBC31598ECBF8FC93FDD40414C634F92D7406C0C53F44ABC719D44E53D7D6399413DAB2C795A2EF6B097AC9EDF80A9AFFD000992EBBC9ADC1702C9BF114C4189E4DBFB7115DB1E9A1C54DE0A0CED5172EA1798AE220895B97B5F45ACDA99B1DC23E09FFFAEC1DC4D4360F7D3C91F7D413F25FE3EC3C32C9BE56FADA718B7D31D85EF560D6BFE46A1E018EB6589C7142502FE0608F0B82F6C1F1090AF4A9C6B05ED0A0115C16A1E47279776BF230870408E79D17A51F4759F6BCB13DFFE356CCE73243A3505F9E9C45A01B0C906A5791D1B477FA7CFA9E2DB8D4E1DAA0D6978FDBE4062A57D784475BB5B9AA077A4FCC4EC3CB23F0334BE1B9C1E9967564560A686C42A931586E1A63F7565887144EB3A709773EE4A6F8C991A77CD9629323F60B7D629765D167BAD12C3BA768CC9EB19CDEF21BEA41937DAE637B9501C5FD96A05F686A164D6591F03ACFAFD2A18D942D53E3E7081B7EDA589AF2F9649FC90CCB6A6CC5A110931E520E6D88E24382A92FDD42D484748943E34B71BB41071577EC23B47773738279324A0426C20763D44F25AC25C8C4E05E9D8769D45D72257E2CE034A5A72BC97B0B9DF462F4DB4D0E5755AFF4D54402770958AD3124FAEA27E6B622DBF7D5948FE4E1F72688AAAF2723E5C10161B94EFF233BB93E07360C8AAC7647E323490337166512AC9BC8CF8794192BC907C2416A81B85F6B1B590EEE2A64EEF5FAE52B717ADC7D57F1C39CCCCAEE744E5C1478CD6758078F9B351DA5671826E7E78BF60FA4FE83162E342B03E1135EAE50034413F570A63E535EB498533290F049BC5A20E0B05D243D3AD766E0806E406DE43278D1EB5ADDA781AD329D66E170EE492DACD09D86D93243430FE97397A5F84E0012C90B6EC718DEAADAF85E95626DE42136CF64869017CC7C23A7FA7014177C4B1A55F33759C159FADFDFEDC51EF3F53DAE8351999FD7DE9F59099017F2672389E2DB26DDA34C213FEE77105F4AC9D653CED20572BC483E3180D5F31D647769AAD938DBA9C379F8B80804D7AC483879748A8A582278473EFF52A9103D60B8559F3518007AD6487DBAF4F31085A5A04C1F9984BD6256B2B16ED07A425013F45B7D590D36417555FCFAD5575C0F734057075DC1F1B324470F0BEA0F7CCBF5B605588932A9D83A9DF36346535987E2441177E4DC107591227311DB3036BDBC2A5FB1DE147B7CA6883C54EE00F4D93608584DFA3CB7D234D5C0BC7B83A3912204A22966F2B3E7ED9B68C683D18D90C17CB9C9D2B84035E26BB6343597D1516BB6316397BEBC3A7FCE5EE37E10B2E24F964DD79F05CD1889848FB1C7E3AF24EA53E7933886B02C0063A69AE51113A1AA0D8782D42F4BC30FA8DC67764D5E47178D4249B9CA90F69E451B0538ECD8B12C181268AAC727CF5D632F5D28B7DB3B5A703D4DD9A2C7644FBEAE8C61B06903CA317BA3F05BB7E99B69264396596609AA760952F34D6B2F8800DCDD597169446A9FD2DB551990A78E11D30290FAF5DF12F70A59408EA319B323BD28235B0D419D0A152BA957ACCF7B43BD1B86EC7CBD493A45A4446056B6D712B6D973BC8B1D40689266E522A6CF52D97459178C36508AE16B9481A51EC1EC8320365C56376D4D47E74B5BF6EE9AFC945DD193335B3E88D17066BF9308FC3B8B4F7DFD756A07DFC2A32CD0F06F43A2FEC70D95DC31371BAEA8E49ECC4EFD172DE63FEC2EC495E7F914FFB92ABA59489417D5F4AD6BBC0F9ADC20C7D6B72453755271BB94BF3223481752C6D462FC39AB32F9CFC75D36B411BC2249609BBB8724876C6B14023D016DD4669F58A575BE9B8C16434F06A4F1A788E9159F540B7799C63F3A14A11B7AA582F12DB9275E833B3E4FA85B9EF8E0152691AB8A13D7D70A72913B24A81D7085D0D9F131AF976FFBC8CB1C4BCDDAAC145AE4AA1E62E75F6817C302C9EC3BD84AE6046884905E016C404B56251FA81AEBD0217A9232B1AD86C63919359D131439E7F8982066D8D2A33276AD2C574F9D4B8E614E6238288941B21E76A698449FFB65FA9EF4C5CAC24F1A9E7C317A39B9844BCBBC24D24C7874BF81DCF2841F293C287F3EB7499FCFEFCBBBDB6C5B42C23B29F05ACBE718C122E80FEF7A5BA0E8CAE51E2487CCA0477EC3C84CC3376D7777ECE75677F1820AD7556ADEF1559054EDFA26A6EB9627F32E4F43BBBC949D2A5EDEE9D7828E7EBB7FC7B4D8D74A51DF1991DAEB476AAF6DC82E816010D229996208E4147EA9C62578839E22DD1939BE94149E10A02E6792CC7E920570E2FCD7EF59E98A8E30E1AAF556CBE4C32E64261A5BCD212615ABAD9901692A9C1958CA5B02C11499F9F7BDC50701FA7DD121999BD248F7CE7FA595DEF4D7C408C31306FD0818FA246B40E66DC06430600F1DCBB4756FF7E9772884A89B987365E60E3FF34229049A083A65E8DAC9AF225782D6E941088C2E8D3B06C1AFBC34F6FCB3B5346B3DCD441D815A9F6947D94A831D7C06EE368329839C23655BC928D529761C0A1A63B28AF4BF5995A915CF21410FAD1246922378F6CB8F10AD33FD7F97245A94B2451E01FB1F3B821D3D3068A3387C83B7412718AE72AA128D5748466A9697E4520B9346198C0F4DAB87A9A97C8D89D47DFCE3AE730994D68516F068D55CB5F41AEAA6DB771930D7CED12A0C5F9B438DBC5B822DA2DB5712456A0F52765A9AFB6E7EAEAAB170CF9E40002AE8D3C15BBBCAC437C34DF9BC5647287214F13594FE9C91E1225353956CD0A334D8A91863F2814D35F117307A614D8F720B6785BDD9C31F2C7207112F208B1B9DC1416D45A1424AFF1F108E6DA38988F950BAFD355FCCEF19E6C09577C1955F5060EF4B601BD020AFE6B3BD59950840B4D378D6AB424F28B267C0BA39232BC9E27174F891E319415143FD8D1672D3B171D0F3E1E768EE11B85D3281F0B745D1CC0CC4E3D04104318D465F9EF44D622DECB23866109DC541DD670D73740E8DBBADF46A5E2BF9A0370EBE2F517CF18DAC0D5294973F441C0E05BC37D4A5C08E014AFC00C12212A710B37B1E5A62F5B442E52BC88839102B0A82DEE77DB0FF25F37A0661C4509036DAE9E7FE0F623920BC35E83C36031C08AEE7E9C6D474FA71ADD263784B165DE10C24C56C01FBA749AC130F5F8B191E44E975A4172E7A887AB63616A9F9F5F401A6C793297609966988B19FE838A1E37158BC4386938A584E249C479D4422AFE029FD975BF908EFD55484503A57F15AAAE1D33C0D218B680787E8FBAAA9FD26AF0F77BB79296C6A83324C6FFCB1ABB95364DBE662CA32E5961EFE094ED9C30E2976AD3CA39DDB1E24FD9ED56E96BA0E27BDB10DF3E01F2C6B3E598547E1163E294C5E3912111F55E1F3413010D37639BC6263E47885C6F8F85E8457E54C1F328D5A1451008516F33AE73CDF04B73ACEA258245A8D5CD8882059F20688636669C761437256F3DD7009CBDCEA4A5B2BC5616FBB85CC8CD4BCB0439BAF3541D819B3C68F3CC9E2108A5D5BB1F6B447FE3A882D81687C5197D0562FF6884E78ABAF7BF90457B8FF25DFED9624ABCB801162F35F0A59CC74DB12E892C9C7BA75DEEA30198131F71651A2528246E6F897CA8EDFB85C681E225BBD0EE3E25AC23538CF369B4F744A707E017B1482D5ABCF9429637E00DECDF6DD1CD4B29E824DADFE293B600131C2BFDAF8D7491B433387F0A29B13D831F6B786EE649AFE37A118259920378B8FD1AC1D63782FEEEDDD174576A685ACE3C1E418626A6ACDE81D306C1335AB4B6A8A7AD198DE0029948E4A0868640AC214EAB8E23759BCFF7A7B882C970D9BF1BBA052CA58918A502B995C64E9581B613739BE5DB78E99DEF1B94F0950D477CC3843B8FDD9D13DF2EE43128C0EC25EDDB112EA2EF7DD4C53185BBF53E51177844080205DBDEA18FB1FA371A98F9F828FCF78C7E874017071CC5B93E660370C3E1994C63CFC5FFFD46D56E59D2B0DC622AEA65CD58831AAD726DDB030CFCCBEE41C5317114CA7E4559989016F4AD868E2788837ACBAAD6303047DDED5BF975F1F2DB5841F44FA33727069DF00E406E4D098525B4D5743C50F9D7F56B3D585AB612792A3F2328A0A83E67E5F3969D12FAC5AA9B87AA19FF2769D9F1DB4F8EB99AE9DD1473DD1D4261F7B95156B50F3AF8C5C2434EB2A0438C76D6B12EC38BD6F0D2A329324D5ACF220CD147B2BE54957C86CAEFF19C6C9D2B5AC3174B15556A0C62B758F4FFE4FC4A709FDA5789CEF3A0BD9C80AE1AC2DBB2E298E6651B181CD530C7F485AFCB27C6E70CEEDD2FA084C2763BFB23248F1B1DAEC5981B0F9E67B40DDDDCB1329BDB7BEFF2154208DF2DDC5D641340F12FDE620E5E85CA3DF453558E4CBBF3DED366D95DDED94AFB2443186F8859387FC4E75B6F02BE09A6B332A6835692E386027FAE762F0E16EA1BF426B83AB6FB1D9B1BEACF6F8D07208DECAE360B3C6A29790DB06F01EF9E4C3D71B268DCB4B123461B3E5209771BC02C98C5B9F946ABB526DAB1EBFF00147A7BB248BA8ECADF78D60E56DFB435B33739BE341FE0CCC2DDCCBBED79EF4B5999E478EC46AB60F728376BA8B99416307AB3990D4B7BA916BA395A9B41CD9C1B9E62BE3D6EE33BC5A38B2239F19A0049AA261AA4BBFB0FE0C49844DD51668011B0CC98067010A402FECFA1C0E2C6EE8D34B7B12ED05172DCEDEF401B894AF9C70B43935DBB78CDDE9180FA9A3376AB1B1CAD2C1E70E6DE5C41090B4EAD294EAB97C037FD77C3219C6D24034EDC05603D2E5A5EEA3C70D8BD6295D938A814AD9031F5C310FB56D27DF49D4F7E8194B3930E44B0330F2C3793ACD00E87085D4BD1B58AFCD9BCFB56CF4D15D7CC76346F43923EC2E2E278F2D9FAA44C495DCE00B2239D87E379399D7B9273AA2133E3A4D2B8AC374BFDFA36E7EF315FAC33206718FD5A37FD4808735F433CE39D0D693B1EEF78E9BA56CA950BF320D3992C8FD1F36C3936510E7EB61648E60F42407E64545E0E68FE4264B03E3503561F11BBD144049D6014DE13DA8F74EC427D6F0FB84D581313B3B914512FFAFDE908BD5F592F191756790FE6EDD6DA6B704638128030EED44E365132A87ED7F05C0FEA9CCECD32F34341FC18725F0D6399EE1C7AF90C1560AD89493C338F97A7FC2875F643EB96C0189F353E3BD9051716B67D5DB40BC01D21B7085B3C98598B044F2127B40A7F3337AC95592238F9F22F1F40022CB5B553044460F4652B30405BCCFAA1FACDC40E2866509FF0304E8863D1D5EA245F7A742F3265B3D075CB58630D72FA830E618943AF677B4F625A98E3E455F400690375C89F6D3FFE4CD1D426CAB0807B894EFD350E9ADC329B5BDA1EDB0E1844485FA9A7EEEA8106E4CA2D34449255A1CADA034AED6B9E42167DF3502231910067FC5E57E145DB81B82BA9CF04B1DA233773ED458FC1EFC8F41A1D5D68742E0C24DA812465876A7729F1C86AD5B47563517D17658D4CCE1516A18676AEA2D69B1A9CC3C39599095936ECB3381D6D4D5760C7038DD3F356C81B3E68D3F68851919B3E496C9879013C6F63010317263A08734F10157101429621C61143A56E980211E2108E4AF0EDF6483E56F061D03D0ADE2A6291C69FBDE7377D2C6FF9FECFAB05B5AFB66AC7F9BA5E8FC5260AAE0F8616296D8CCBCBFECA57E55040CF924EF1902F25ACF5F0003B56A42B4F4C360DC102439BC7BB4B48906A37E15F38162480A774A775A5B6EDD19E246A59A0650C195651171F2A823D53871841E82C601D85495CA1EE0866C2ECAE0A6A363E5B7F906893BCB2E38226296A236B37E549DC750C0815674FFAAEF28E15136AB00A1BD8193AC52F1C266465C4FD89B73D36F8D09696BA8C553B7D1C32DE56A53B365157821D4D04AF1ABDE3AC745B708DE664723E4D74E0A8C10BB19094C818111CD6942D8354D5440430EBAF2B1746B19F03A44F3D8DEB69436E6CF5285D4170A91867926E3ED5521619B71560BA544BE5F9D682EDD33A7F08E9254427567576BF725CA3B7F987C40AE911A2B432093D64AA78375DB42871885266ECB2DC24D9AE976901A214EE1F565C223F95E4D66F8E0119ACC6B50D1A6123687F48D592378E0D99AB219D75DE9B919C075C5E74CAB14DD567A34A131ABDF08475AF8687F6689F8B401E7124248C747E65395327AC4B525A058141BC11A08400964F08BF4513432B2BB6523E783EE0E75BF4571C09D85F99A856DB3E622F04BC29B61F8ABE9204725A18633A17DBB8C419BEA1780F89CF509A0C21C8D7B4D9366EC2E85361084294A4FDFA436C547EFC2A233B9AFE49E252F4A73B081822CD3BA71906AAD11E8733D5E400812A92B162FB248CAA12C80B968382EF125A6A6F452FDA3D0FA3CF391628F3613B86D2BB8300343061E07F4B77C4CD9E9C5977CB5532DD4155BE4580519F7F516FD6FC3F47DCD7BD877C070CD496383CF494C83855B987D4CC31111E60C16F1F849C216E58554A2E45A3AE75B294B37E876B316EEAF4D2B9E4703D9344D61216853FE8D7D7C8191DE06BA17C73DA1D1921EF6EC6F5167D2CD00BD98BE1BB1DDE1DE786A011BF0EB022DD520A2B2AD31BBD5E9FCBCC1B0752D32658CE351BF84EAD66AF2FD4576BE6D5563CF00617C23E338BFFBBE8D14DD2E96CC3B48E0F74ABE7FB685630DD1E84C6499CD4FE9525D3C2E2F7218D72976F4E3AB070348DA3C96579328CC2B5C251213DB769761443B0C00351973390D0FE7A70D1D6A8854D39A48CA556313DDC415498714B05CEB8BE51F0FE4AE4F1346A09185E592E0B84311FAB4EEBB9478E21E9ED2AB78CE8E32AED96FAACBF972710DDF957135D955D657DF605800E7168E94446965B8E254E5A2ACBC8252A82937788ACB5D4263696C3CE97C65F75A1679A80A31220F2AC2D86913DDC624DF06DC24ED58FF463CDC0F601B8560E330A521B87A0A2409F91D52CCC16EEBC671B25045D2C3F5DAC67909A0409919EC6840EFF0AD53F9A58C609ED2087957D5CBF0B232EA6B793A5C5379497DCA2223E5690A3355B3A470D58602DD098ED1A471C62AFF09533408D1DF0184F0E17B285128724E3D442EDD90B13531FCDF9414C18DA5139DD954C93F8DFC4DB41078D2913F014BAFEB90EC783F2070324CB595FBF110359A345B3E4713E4D1559131E55B28C4E78717E8198FBDE4F0B6D4823E8ED306A1B7DB7519BAD12E50A7D43A61FD3110C8368B31167AC44CD4B98EBDCEDBA036FEDAA68208DAEED17048D2B17AD2905B6D727D1E9AEA23AF47AA3F87BAE9013C3B95E55474F332D278BAE3BD69FBEEC64EC24454F478C5C7754B937F9E2266097CC9599C5C4A63BF30271177D8D6890009D091B094D49AE41D13E9A285522DC108572D03515A0D8D77E7FE2874D4E7E82FC18235B872AEADD20309AF88009E83A83EDA0764B347DE5B9F1ADBE08E52214AF5FE5674ED6DC438DEDE6BA20A36087670B2A0B91BB5A91764D96CE74C19B09974DD7F111D9CE747A7E5E3FA7FB13B65B4E706EE2A5D66566516757EB61AA7F44D91B37BF6EDB2C285FE1BCB22E24A1F5B533CEDC8B31FDB29D944190246BB631AA620E7E43436127E57D571FD823DFC136401B460CA4EE13B3B30F516C4480ED241D0B627EE3A45F489997850E3459CE4CD723EC8C41A5E06A2D7C32C1933642F2B7D19465F742A8D8DD3717D0CCBBBF90DC8A04F6348A97A19A808980F6F37BBA07BF53ECDF6E5365ED9D4BBAC098BD18D83236B5BF474E857B74470C399056425EC09349F159F3CD9AC387409A5AB4701FAC93C6F1F2C697B6746FF2F01990EF0626C85B8B5678F6BCDB3FA6E8CA482EAC28E9199776F36CCB392C2A84B40788A7B968971FCE2568D62BAB54D5245887CCFF1D20E95A120F14234C0485C3FAB038AC990AF8BFE623F989C80B08C58E7ADB8C35866920BF6B6CEAAFD0BEFCECD726182DF775D3E01633F604E73D7C152559CB9F61B17DBCBA53CB8D66AD9D4EFEF681993F6F694DD03F2781CDD50E7B55B0A373800B66B78C7B8E95D6121261C801F716C3843859513450D43E5C2978D38BCF1D79CCFCDBC39351AA56201C2F62356F63BF66A6A1BDFACE5E9D1BD5F759B861ACF7BB12FC0BE72DA080D361918B811C23EED787C131E93EA0EE1DDEE55F28C30EF856BA190439EDB21D2500A8A317DA0567DEB9EEA3F195B8E2301D7CA5E5E2E10ECDA035BD0FDA7BA011CE5CEC0A32E04FB4E50907701042D6A4999338CA1D05EAFE50B075D43CA6A6C33C972782D785D155AE15D9503EFCA4D23256EFFA2E00ADE4A9362CD516BAEB3D48AF84E5A62A8B949F1654775A96D83BE3A4369FC07BDAFD53D2D1C4C56E7506A94CD3D485DE622EDA80F2EE52D9AA25B58BDB01BCE8DB56FA7AFA19B9A9216E54ACD88CDE331A54DADE341D9A039E2CB2E51806CB6E2A6E789D7CBD7B07C0CDD26D55747E83BE28BFEB52D62846E95CA991D384C3F50EDC80C1F42B924EAF26FA9EBDAC95F1085663C1C77E5723E41C926090B4187E99B0065991E710B92F5B87D85201AB22EFD756BE3298B10192E121AA7F9FD2B60F913745BD56F9566090D93AEBB4918F884D296FAA0948FD3512BBFE9A373365F3755A039905FC51FE79B069E935867C8865A47F4662EAEADC99730328BE2A1B451B1C09440178EF7B9BA14DAD4EE6E0FE534C94C9A536990C0DA27D56093E7E04DC704391030A7491D1593021F353B634BAEFF1823839D1D2DE7C8F714B713FA13678668CB7B640377C248B7155DB06F6686F5FF7FBF1C1446B623F837A6F1684E6BB08EFC3D04007E151F7C806CF8DCD4996C3B19B5A56D2F08E5865DAC9F64B68D17277BB1266D27DF60D554BBC70C93F57029399CD6F086396A442431C69D91B5F84188C00C372A6B49A13C3813BCB7AC005BA8DD37B28E701077B26BA991F2E7379FA04F4BE197F3C3ABD3906ED90A83EDD479DE0B4EE00D23DFD00F581D61EB0C264BB0CE6E3993E960D94EDAE798405B335B9BCFD6B1297114728F196474D20DC67E7961472606D8460F8707EB2D99393C874680E8791C522767FC6BC121C2D895140E3447C8B0642349675F378B466771DECB16542C362E531097F69A0A03EB62099A2FB040FEA525AAF317862AB043F9AA661482F725CA410F463DAC04C6516143918434FD9DD01C9B87F12CF6D4901575342503EA3E02BF9C47BDB0ACCC974FCD3CD28C9D269F4DC4FB0A260FA26349457AA83A3C59BD3D2C548E7C05F459C628DBF11E6B98AE95E0F47821DE2F213B137C6892B2FF57E16AF1907E5DC5634E9D391BF670973C30AAB51AB60A430CACB2D852C10735C1DCE416A08F1EEDD9DB3650A96C30123B1AADB4C1CB392A6022100267D899C3617C7A9AA16BD7AE311B92FF2CF2FAB242BD3117BB72F35F16CD52A3138287252A71FFB27A48BC9EF9FC17238631EF224DE56501B575C949A9BF802509B8E054AD961F69A21C9B6C2CCDB366CB97AAC5C7A50F793377E47F5FFF0687B802B2F389B947AA6C1707D41F0DFF0012901C4BFF2C7B681B50AB7F7D648746F4C5F574A8858F9DB160805BB737A1761EAC7A8216DC84BADEBE6DD9F449737BFAA701A050C81FCDC3E5E73035766B538E7B331A63A0FF890C5D7AD230582B1DDDD4F5823D1633C46C5C9D09D78E8B44F1993EF48932871CF82AE3CA9EB883FAC22303C47DF2C26239AB9E2296F6C27E5A255CDEC57ED9A588E78F0AB763272225F123B405FE318C322B68C803AEC6A48EE11629CB66D27935C93121FD3D67C792264DEE330F84D78BE1B66703A42AF0702243284B9ACA72CE5A92967D1932653A8A4EA27453E9F321791E6DCF9C247EF838650640F7D4C9A841AEA86E772EDD824BCD2795B2CE10806044E57AB39124EE47099261CC4B83579FC6BCFD94435635AB2C030C041378375EE4B1012EEC9ADFB4E93D4BAA76E7FAA3EAAB8E6C2E9E536DD776D0BF52E10B64C4330843F6241523A00A80D6316FCF61E5779EEC20FB9FFFD9B28C482D430785315BFC7A9F957B1D8F8981C778328003DFB4ECB37C5FD824248593C891B74886832F182C56AD912279AD23A6539B17AC9B64E761D2BBE54A2BCE7A1A7512CCBE9D5D5E31DEC91FFC2182EBE723EDA4D71AC14059CC7B91954EEAF353B88EEDED25D183E4C7E9BF6E5BB02F567E3A6A43480D39CC6205EBE5A8370D373E87B66AC74B4DA655B5B367D329C0D40E4C8280CC40F889CA8C504C5E18C8E376528C622771F4EE364CDC19F8B82D45E8AE6363709BD5E7238197605F6E420BC67FCB7D9C04C77E656D4D925B18FFDB197942093DB82B6025B57AB3ED731FC6D3D440CB1D1DF7BCDB2D203004D647F6590ACAF996A75DAD78F9647B7363A889FBFB4B784469DE61B13EFBCB4010EDC71ABCA0EA6F58018E721955C5B82D39F40D1FABCFC02F1083C7252E4A09629419554EF4502AE1795A19252E5C5841077BD2907BB7489B6930E04791D7F9DD8E7E8B78AF3F88EC1A739B179BBD8CBA6786A633DBE366B7CBD3A3F03F1D724A0CEA87D95715AA605E2C8A3B55A13C4DF08590BF5E3FEE16F821ECC6429B75538E5CF126E81ACA2617141C1BC3D9479324217D83E55A712FF5531840BEB67DBF5358A884A54F97DBF360685214EFA3573C62EF9E0B54AC4100CC8CC2AF0E9EE497FF1FFF76857D6154AA1F683D6ABFA5C4C8F31C74F7D9F8FDEF38EA227E3B3D05C82B30FF64B73BD1F020C5DDFC8589E7B9CFE4D4AF265F848D3D6B02A83A3CD1847C36C38B323E3DCF01EC8DA5C29F57CAE66AF4E88688897B3C84F58A56EB24FEAD37E7DE60CCA2BE61782123DFCB803F416439871C7FE10FA4E8915F5BEB99B3937028DAA2F8E8A6A72C11B3947647576342969ADCD665FEF5A46B85A8D599E5E3053C4B918924FEFCCAB3C0E2F4801EE014B83D212E57655E12980E7FA5BB0A1B4DEEAFC9844BE0E5E57CCEC43EF421A58DF20D76423E9E2695399D172256C75304751EC7E47EF42E016313CC8D7D19DD02635242A2F2690CB56E4287A4C36D8950BF6029937169323E984A60B3C1B3869A09739849DB0731332A6EF975491978C163050B27832C53312216BDCF4B10DF2A4147C66C0087CDBC7D90B10329026640F9C8C7D7651DB8459964D83BFC7202C75F35ABCF0F14E362DCE7B8F7E223E92D7D107629FADA01F72B84288E5C5A12D15B890302DC46CEF2BA5A2F5877B9D1212770C07B80E9EEAAC58C3F62BEC43A7067131FAB90DBCFE72BFFE59E3F09F3A317BF18976FFE789702C780D318E31A292A19A4FC90D4B040EE5364C046B900512D396827F794BEFD39CFD2DEF267545EDB5488F9227CC60337E965580F396C8545CA8F7F3C14F2BF050DE797EB814D24A9B1B5566FFA4DA10D021CB80B60FA13A6D9166D17BE201B7E67C07F16F06050546345408A1F90D796C530CBB00DC5C6F8203E7318D1EA49713FF5E4C071448077E039DD13D7DDF87D9B6583C54E7C403035C687E435EB7A27A5335AD300490D0B9500A420BCEC1995E86DD5ECEAD7C24127474F7D317B8228D05F8CC5201B87929528D089BB3EBEFB2F71132782E5F940AB125FD5EB09DE4EC503376465D36C96A63AB63B9F374F061FD9039A91306A2E7F1A1FA5EAFBEFA6135BA7C33A0C09A0C60EC6A2CDD7C9799BD8EFC5B01D05F7B5B78FA028B6E4A1C7C648EA75F8CE17663F3F8FB1A7058760546573F582812C992065D598B0ACD0B8D7CDC0FCB528BDA99B6865F511BAADBC18B20C85F27B344173032352C74ACAEB5128AED9362352BD155B452E2D45A1971850C9B55B628A951AF23B46048E416EB1C421A1411A5E3E78277236CA6BD053F4BE9B356FEA117270E6236F1C706C5F1ADC57188BAAA1AB5EF6CE2CA564A05E121C4FFB641649EC577B48F75EC65D12C9F2387B4E5EC3A83D40B3C68D2320693D8BE07C2259DF0D5201FBAA548701E8EE4E056DAC8FBAC6D18DB1B0D236E653EC7EE4A00CC066"))
for j in range(47):
dest[v7[j]] = v9[j] ^ v13[v8[j]]
dest[v10[j]] = v12[j] ^ v13[v11[j]]
pt = rc4(v6, dest)
out = open("newbin", "wb")
out.write(pt)
out.close()
Running the new elf we can see that there is no output but we can confirm that it is valid elf
Now the question is how can the binary validate the flag? and where is our input stored?
When we decompile the new binary we can see that there are some values that looks like our input which is gemastik2023{AA...AA}.
Take a look on assembly code we can see that 0x67
or g stored on address 0x12c9
On initial binary, we found the same value (0x12c9
or 4809
)
and we can confirm that v8[45]
value is 0
, so line 330
with j =
45
produce dest[3809] = v9[0] ^ v13[0]
. Line 331
do the same thing but with different value which is dest[16176] = v13[10]^v12[9]
. Checking value on address 16176
or 0x3f30
on new binary we found that it also store constant (0x41
)
Now we know how is our input stored in second binary. So the next step is understanding how the second binary validate our input.
So actually there are 3 functions that process our input, so take a look on each function.
From the constant stored on each function we can confirm that those 3 function generate md5
hash. After knowing all functions we can rewrite flow like below
...
for ( j = 0; j <= 15; ++j )
result[j] ^= init[j] ^ input[x1];
v55 = md5(result);
check[a] = v54[b] ^ input[x2];
check[c] = v54[d] ^ e;
check[f] = v54[g] ^ h;
check[i] = v54[j] ^ k;
for ( j = 0; j <= 15; ++j )
result[j] ^= v54[j] ^ input[x3];
...
We know all the variable values except the input. So basically we can bruteforce each byte by validating with md5
result stored in check variable (each input can be validated with 3 bytes
hash). After getting valid input on index x1
we can recover another value on index x2
and so on. Here is final script to recover the flag by bruteforcing
import hashlib
import string
def get_hash(a1, a2):
tmp = []
for i in range(len(a1)):
tmp.append(a1[i] ^ a2)
return hashlib.md5(bytes(tmp)).digest(), tmp
def xor_op(a1, a2):
tmp = []
for i in range(len(a1)):
tmp.append(a1[i]^a2[i])
return tmp
known = b"gemastik{"
index_flag = [37, 34, 43, 46, 41, 18, 44, 42, 45, 22, 19, 31, 7, 9, 27, 40, 0, 17, 1, 6, 32, 20, 38, 23, 4, 29, 2, 14, 36, 13, 12, 39, 24, 8, 25, 3, 26, 21, 5, 35, 16, 15, 11, 33, 30, 10, 28]
index_digest = [[9, 4, 13, 0], [13, 1, 6, 11], [11, 1, 4, 6], [3, 15, 2, 12], [8, 13, 15, 10], [5, 8, 15, 9], [6, 14, 0, 1], [0, 12, 15, 1], [8, 15, 12, 9], [0, 14, 15, 7], [12, 5, 15, 7], [11, 9, 8, 2], [5, 2, 11, 1], [10, 6, 3, 15], [13, 2, 6, 3], [6, 8, 7, 14], [9, 13, 11, 12], [12, 11, 9, 2], [7, 0, 5, 4], [13, 0, 4, 2], [3, 10, 4, 11], [14, 13, 3, 12], [9, 3, 12, 5], [15, 0, 8, 6], [14, 0, 11, 7], [4, 2, 12, 14], [5, 11, 6, 8], [12, 5, 4, 9], [14, 1, 7, 5], [0, 15, 14, 2], [13, 9, 2, 12], [15, 9, 2, 13], [4, 9, 11, 10], [14, 5, 0, 3], [10, 2, 5, 9], [5, 2, 7, 14], [0, 1, 4, 2], [1, 2, 8, 0], [9, 5, 15, 13], [10, 8, 12, 0], [13, 4, 5, 8], [5, 0, 6, 11], [8, 10, 14, 1], [1, 9, 11, 6], [7, 4, 12, 0], [9, 14, 15, 6], [9, 4, 12, 2]]
index_result = [121, 83, 60, 4, 116, 77, 84, 28, 128, 104, 163, 182, 160, 135, 40, 15, 103, 33, 70, 156, 8, 142, 147, 53, 127, 120, 174, 54, 149, 68, 76, 134, 45, 2, 57, 107, 73, 9, 58, 168, 27, 43, 167, 38, 17, 80, 112, 75, 125, 85, 82, 183, 99, 87, 26, 34, 20, 18, 51, 106, 59, 161, 150, 101, 110, 86, 44, 137, 154, 29, 146, 56, 138, 166, 100, 113, 69, 145, 186, 184, 159, 22, 66, 109, 55, 170, 63, 132, 117, 181, 122, 131, 32, 25, 6, 50, 119, 148, 31, 78, 158, 36, 171, 187, 162, 47, 92, 172, 114, 118, 94, 35, 64, 16, 139, 151, 12, 175, 177, 62, 5, 46, 3, 1, 7, 126, 97, 115, 67, 108, 179, 185, 0, 144, 140, 136, 81, 88, 41, 37, 30, 61, 48, 10, 74, 130, 96, 176, 91, 178, 19, 13, 93, 152, 105, 98, 165, 90, 49, 14, 141, 102, 95, 124, 89, 71, 164, 72, 11, 123, 23, 21, 65, 173, 143, 79, 111, 153, 39, 24, 133, 129, 52, 42, 180, 157, 155, 169]
check = [0xc3, 0x5f, 0x71, 0x9f, 0x9c, 0x9a, 0x1e, 0xd5, 0x6b, 0x66, 0xfd, 0xb2, 0xb1, 0x24, 0x97, 0xd1, 0x71, 0xae, 0xf1, 0xc2, 0xa2, 0xc8, 0xab, 0x68, 0xb8, 0x1f, 0x5, 0x9b, 0x5c, 0xb3, 0x26, 0xe8, 0x8e, 0x8b, 0x9c, 0x9d, 0x5c, 0x90, 0x4c, 0x43, 0x7a, 0xb9, 0x3, 0xca, 0x45, 0x6b, 0xa1, 0x4d, 0x72, 0x6d, 0x52, 0x5d, 0x18, 0x7a, 0x74, 0x3f, 0xb2, 0x8d, 0x32, 0xcf, 0x91, 0xf6, 0xff, 0x4a, 0xd0, 0x7, 0x58, 0x63, 0xa7, 0xad, 0x22, 0x5e, 0x1d, 0xb7, 0x80, 0x96, 0xbf, 0xfa, 0x49, 0x9c, 0x6d, 0xf8, 0xec, 0xb9, 0x92, 0x3f, 0xea, 0xa3, 0x1a, 0x7c, 0xa5, 0xf8, 0x5d, 0x8b, 0x7b, 0xaf, 0x13, 0x96, 0x6a, 0xbe, 0x14, 0x32, 0x7f, 0x38, 0x30, 0x9, 0x40, 0xec, 0xea, 0x96, 0x6a, 0xaa, 0x8d, 0xa2, 0xb4, 0xa2, 0x1a, 0x32, 0x15, 0x52, 0xd2, 0x18, 0xab, 0x18, 0x69, 0x44, 0x29, 0xe5, 0x99, 0x3a, 0xb7, 0xe1, 0x95, 0xb5, 0x8f, 0x80, 0x6d, 0x9c, 0x76, 0xc5, 0x4b, 0x4a, 0x3, 0xc, 0xbc, 0xb4, 0x97, 0xad, 0xf1, 0x5c, 0x97, 0xf6, 0x8f, 0x80, 0xda, 0x20, 0x14, 0x19, 0xe0, 0x74, 0x3b, 0x4e, 0x93, 0xa0, 0x46, 0x6f, 0xca, 0xf1, 0xed, 0x46, 0xef, 0x21, 0xda, 0x74, 0x82, 0xb5, 0xd9, 0x92, 0x1f, 0x35, 0x50, 0x45, 0x5a, 0x9b, 0xd4, 0x36, 0x7c, 0x8e]
flag = [0 for _ in range(47)]
for i in range(len(known)):
flag[i] = known[i]
leaked_hash = b"\x8e" * 16
last_pt = xor_op(b"\x00"*16, leaked_hash)
for i in range(len(known)):
hash_val, xor_val = get_hash(last_pt, flag[i])
flag[index_flag[i]] = hash_val[index_digest[i][0]] ^ check[index_result[i*4]]
last_pt = xor_op(xor_val, hash_val)
for i in range(len(known), 47):
if(flag[i] == 0):
for j in string.printable[:-6]:
hash_val, xor_val = get_hash(last_pt, ord(j))
tmp = [(hash_val[index_digest[i][1]] ^ index_result[i*4 + 1] == check[index_result[i*4 + 1]])]
tmp.append((hash_val[index_digest[i][2]] ^ index_result[i*4 + 2] == check[index_result[i*4 + 2]]))
tmp.append((hash_val[index_digest[i][3]] ^ index_result[i*4 + 3] == check[index_result[i*4 + 3]]))
if(all(tmp) == True):
flag[index_flag[i]] = hash_val[index_digest[i][0]] ^ check[index_result[i*4]]
flag[i] = ord(j)
last_pt = xor_op(xor_val, hash_val)
print(i, bytes(flag))
break
else:
hash_val, xor_val = get_hash(last_pt, flag[i])
last_pt = xor_op(xor_val, hash_val)
print(bytes(flag))
Flag : gemastik{you_know_the_pattern_you_got_the_flag}