-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
892 lines (762 loc) · 146 KB
/
Copy pathindex.html
File metadata and controls
892 lines (762 loc) · 146 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
<!DOCTYPE html>
<html class="staticrypt-html">
<head>
<meta charset="utf-8" />
<title>Protected Page</title>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!-- do not cache this page -->
<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
<meta http-equiv="pragma" content="no-cache" />
<style>
.staticrypt-hr {
margin-top: 20px;
margin-bottom: 20px;
border: 0;
border-top: 1px solid #eee;
}
.staticrypt-page {
width: 360px;
padding: 8% 0 0;
margin: auto;
box-sizing: border-box;
}
.staticrypt-form {
position: relative;
z-index: 1;
background: #ffffff;
max-width: 360px;
margin: 0 auto 100px;
padding: 45px;
text-align: center;
box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.2), 0 5px 5px 0 rgba(0, 0, 0, 0.24);
}
.staticrypt-form input[type="password"],
input[type="text"] {
background: inherit;
border: 0;
box-sizing: border-box; /* This ensures padding is included in the total width */
font-size: 14px;
outline: 0;
padding: 15px 30px 15px 15px; /* Adjust the padding to ensure there is space for the icon */
width: 100%;
}
.staticrypt-password-container {
position: relative;
outline: 0;
background: #f2f2f2;
width: 100%;
border: 0;
margin: 0 0 15px;
box-sizing: border-box;
}
.staticrypt-toggle-password-visibility {
cursor: pointer;
height: 20px;
opacity: 60%;
padding: 13px;
position: absolute;
right: 0;
top: 50%;
transform: translateY(-50%);
width: 20px;
}
.staticrypt-form .staticrypt-decrypt-button {
text-transform: uppercase;
outline: 0;
background: #4CAF50;
width: 100%;
border: 0;
padding: 15px;
color: #ffffff;
font-size: 14px;
cursor: pointer;
}
.staticrypt-form .staticrypt-decrypt-button:hover,
.staticrypt-form .staticrypt-decrypt-button:active,
.staticrypt-form .staticrypt-decrypt-button:focus {
background: #4CAF50;
filter: brightness(92%);
}
.staticrypt-html {
height: 100%;
}
.staticrypt-body {
height: 100%;
margin: 0;
}
.staticrypt-content {
height: 100%;
margin-bottom: 1em;
background: #76B852;
font-family: "Arial", sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.staticrypt-instructions {
margin-top: -1em;
margin-bottom: 1em;
}
.staticrypt-title {
font-size: 1.5em;
}
label.staticrypt-remember {
display: flex;
align-items: center;
margin-bottom: 1em;
}
.staticrypt-remember input[type="checkbox"] {
transform: scale(1.5);
margin-right: 1em;
}
.hidden {
display: none !important;
}
.staticrypt-spinner-container {
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
.staticrypt-spinner {
display: inline-block;
width: 2rem;
height: 2rem;
vertical-align: text-bottom;
border: 0.25em solid gray;
border-right-color: transparent;
border-radius: 50%;
-webkit-animation: spinner-border 0.75s linear infinite;
animation: spinner-border 0.75s linear infinite;
animation-duration: 0.75s;
animation-timing-function: linear;
animation-delay: 0s;
animation-iteration-count: infinite;
animation-direction: normal;
animation-fill-mode: none;
animation-play-state: running;
animation-name: spinner-border;
}
@keyframes spinner-border {
100% {
transform: rotate(360deg);
}
}
@media screen and (-webkit-min-device-pixel-ratio: 0) {
.staticrypt-form input[type="password"],
input[type="text"] {
font-size: 16px;
}
}
</style>
</head>
<body class="staticrypt-body">
<div id="staticrypt_loading" class="staticrypt-spinner-container">
<div class="staticrypt-spinner"></div>
</div>
<div id="staticrypt_content" class="staticrypt-content hidden">
<div class="staticrypt-page">
<div class="staticrypt-form">
<div class="staticrypt-instructions">
<p class="staticrypt-title">Protected Page</p>
<p></p>
</div>
<hr class="staticrypt-hr" />
<form id="staticrypt-form" action="#" method="post">
<div class="staticrypt-password-container">
<input
id="staticrypt-password"
type="password"
name="password"
placeholder="Password"
autofocus
/>
<img
class="staticrypt-toggle-password-visibility"
alt="Show password"
title="Show password"
src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NDAgNTEyIj48IS0tIUZvbnQgQXdlc29tZSBGcmVlIDYuNS4yIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlL2ZyZWUgQ29weXJpZ2h0IDIwMjQgRm9udGljb25zLCBJbmMuLS0+PHBhdGggZD0iTTM4LjggNS4xQzI4LjQtMy4xIDEzLjMtMS4yIDUuMSA5LjJTLTEuMiAzNC43IDkuMiA0Mi45bDU5MiA0NjRjMTAuNCA4LjIgMjUuNSA2LjMgMzMuNy00LjFzNi4zLTI1LjUtNC4xLTMzLjdMNTI1LjYgMzg2LjdjMzkuNi00MC42IDY2LjQtODYuMSA3OS45LTExOC40YzMuMy03LjkgMy4zLTE2LjcgMC0yNC42Yy0xNC45LTM1LjctNDYuMi04Ny43LTkzLTEzMS4xQzQ2NS41IDY4LjggNDAwLjggMzIgMzIwIDMyYy02OC4yIDAtMTI1IDI2LjMtMTY5LjMgNjAuOEwzOC44IDUuMXpNMjIzLjEgMTQ5LjVDMjQ4LjYgMTI2LjIgMjgyLjcgMTEyIDMyMCAxMTJjNzkuNSAwIDE0NCA2NC41IDE0NCAxNDRjMCAyNC45LTYuMyA0OC4zLTE3LjQgNjguN0w0MDggMjk0LjVjOC40LTE5LjMgMTAuNi00MS40IDQuOC02My4zYy0xMS4xLTQxLjUtNDcuOC02OS40LTg4LjYtNzEuMWMtNS44LS4yLTkuMiA2LjEtNy40IDExLjdjMi4xIDYuNCAzLjMgMTMuMiAzLjMgMjAuM2MwIDEwLjItMi40IDE5LjgtNi42IDI4LjNsLTkwLjMtNzAuOHpNMzczIDM4OS45Yy0xNi40IDYuNS0zNC4zIDEwLjEtNTMgMTAuMWMtNzkuNSAwLTE0NC02NC41LTE0NC0xNDRjMC02LjkgLjUtMTMuNiAxLjQtMjAuMkw4My4xIDE2MS41QzYwLjMgMTkxLjIgNDQgMjIwLjggMzQuNSAyNDMuN2MtMy4zIDcuOS0zLjMgMTYuNyAwIDI0LjZjMTQuOSAzNS43IDQ2LjIgODcuNyA5MyAxMzEuMUMxNzQuNSA0NDMuMiAyMzkuMiA0ODAgMzIwIDQ4MGM0Ny44IDAgODkuOS0xMi45IDEyNi4yLTMyLjVMMzczIDM4OS45eiIvPjwvc3ZnPg=="
/>
</div>
<label id="staticrypt-remember-label" class="staticrypt-remember hidden">
<input id="staticrypt-remember" type="checkbox" name="remember" />
Remember me
</label>
<input type="submit" class="staticrypt-decrypt-button" value="DECRYPT" />
</form>
</div>
</div>
</div>
<script>
// these variables will be filled when generating the file - the template format is 'variable_name'
const staticryptInitiator = ((function(){
const exports = {};
const cryptoEngine = ((function(){
const exports = {};
const { subtle } = crypto;
const IV_BITS = 16 * 8;
const HEX_BITS = 4;
const ENCRYPTION_ALGO = "AES-CBC";
/**
* Translates between utf8 encoded hexadecimal strings
* and Uint8Array bytes.
*/
const HexEncoder = {
/**
* hex string -> bytes
* @param {string} hexString
* @returns {Uint8Array}
*/
parse: function (hexString) {
if (hexString.length % 2 !== 0) throw "Invalid hexString";
const arrayBuffer = new Uint8Array(hexString.length / 2);
for (let i = 0; i < hexString.length; i += 2) {
const byteValue = parseInt(hexString.substring(i, i + 2), 16);
if (isNaN(byteValue)) {
throw "Invalid hexString";
}
arrayBuffer[i / 2] = byteValue;
}
return arrayBuffer;
},
/**
* bytes -> hex string
* @param {Uint8Array} bytes
* @returns {string}
*/
stringify: function (bytes) {
const hexBytes = [];
for (let i = 0; i < bytes.length; ++i) {
let byteString = bytes[i].toString(16);
if (byteString.length < 2) {
byteString = "0" + byteString;
}
hexBytes.push(byteString);
}
return hexBytes.join("");
},
};
/**
* Translates between utf8 strings and Uint8Array bytes.
*/
const UTF8Encoder = {
parse: function (str) {
return new TextEncoder().encode(str);
},
stringify: function (bytes) {
return new TextDecoder().decode(bytes);
},
};
/**
* Salt and encrypt a msg with a password.
*/
async function encrypt(msg, hashedPassword) {
// Must be 16 bytes, unpredictable, and preferably cryptographically random. However, it need not be secret.
// https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/encrypt#parameters
const iv = crypto.getRandomValues(new Uint8Array(IV_BITS / 8));
const key = await subtle.importKey("raw", HexEncoder.parse(hashedPassword), ENCRYPTION_ALGO, false, ["encrypt"]);
const encrypted = await subtle.encrypt(
{
name: ENCRYPTION_ALGO,
iv: iv,
},
key,
UTF8Encoder.parse(msg)
);
// iv will be 32 hex characters, we prepend it to the ciphertext for use in decryption
return HexEncoder.stringify(iv) + HexEncoder.stringify(new Uint8Array(encrypted));
}
exports.encrypt = encrypt;
/**
* Decrypt a salted msg using a password.
*
* @param {string} encryptedMsg
* @param {string} hashedPassword
* @returns {Promise<string>}
*/
async function decrypt(encryptedMsg, hashedPassword) {
const ivLength = IV_BITS / HEX_BITS;
const iv = HexEncoder.parse(encryptedMsg.substring(0, ivLength));
const encrypted = encryptedMsg.substring(ivLength);
const key = await subtle.importKey("raw", HexEncoder.parse(hashedPassword), ENCRYPTION_ALGO, false, ["decrypt"]);
const outBuffer = await subtle.decrypt(
{
name: ENCRYPTION_ALGO,
iv: iv,
},
key,
HexEncoder.parse(encrypted)
);
return UTF8Encoder.stringify(new Uint8Array(outBuffer));
}
exports.decrypt = decrypt;
/**
* Salt and hash the password so it can be stored in localStorage without opening a password reuse vulnerability.
*
* @param {string} password
* @param {string} salt
* @returns {Promise<string>}
*/
async function hashPassword(password, salt) {
// we hash the password in multiple steps, each adding more iterations. This is because we used to allow less
// iterations, so for backward compatibility reasons, we need to support going from that to more iterations.
let hashedPassword = await hashLegacyRound(password, salt);
hashedPassword = await hashSecondRound(hashedPassword, salt);
return hashThirdRound(hashedPassword, salt);
}
exports.hashPassword = hashPassword;
/**
* This hashes the password with 1k iterations. This is a low number, we need this function to support backwards
* compatibility.
*
* @param {string} password
* @param {string} salt
* @returns {Promise<string>}
*/
function hashLegacyRound(password, salt) {
return pbkdf2(password, salt, 1000, "SHA-1");
}
exports.hashLegacyRound = hashLegacyRound;
/**
* Add a second round of iterations. This is because we used to use 1k, so for backwards compatibility with
* remember-me/autodecrypt links, we need to support going from that to more iterations.
*
* @param hashedPassword
* @param salt
* @returns {Promise<string>}
*/
function hashSecondRound(hashedPassword, salt) {
return pbkdf2(hashedPassword, salt, 14000, "SHA-256");
}
exports.hashSecondRound = hashSecondRound;
/**
* Add a third round of iterations to bring total number to 600k. This is because we used to use 1k, then 15k, so for
* backwards compatibility with remember-me/autodecrypt links, we need to support going from that to more iterations.
*
* @param hashedPassword
* @param salt
* @returns {Promise<string>}
*/
function hashThirdRound(hashedPassword, salt) {
return pbkdf2(hashedPassword, salt, 585000, "SHA-256");
}
exports.hashThirdRound = hashThirdRound;
/**
* Salt and hash the password so it can be stored in localStorage without opening a password reuse vulnerability.
*
* @param {string} password
* @param {string} salt
* @param {int} iterations
* @param {string} hashAlgorithm
* @returns {Promise<string>}
*/
async function pbkdf2(password, salt, iterations, hashAlgorithm) {
const key = await subtle.importKey("raw", UTF8Encoder.parse(password), "PBKDF2", false, ["deriveBits"]);
const keyBytes = await subtle.deriveBits(
{
name: "PBKDF2",
hash: hashAlgorithm,
iterations,
salt: UTF8Encoder.parse(salt),
},
key,
256
);
return HexEncoder.stringify(new Uint8Array(keyBytes));
}
function generateRandomSalt() {
const bytes = crypto.getRandomValues(new Uint8Array(128 / 8));
return HexEncoder.stringify(new Uint8Array(bytes));
}
exports.generateRandomSalt = generateRandomSalt;
async function signMessage(hashedPassword, message) {
const key = await subtle.importKey(
"raw",
HexEncoder.parse(hashedPassword),
{
name: "HMAC",
hash: "SHA-256",
},
false,
["sign"]
);
const signature = await subtle.sign("HMAC", key, UTF8Encoder.parse(message));
return HexEncoder.stringify(new Uint8Array(signature));
}
exports.signMessage = signMessage;
function getRandomAlphanum() {
const possibleCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
let byteArray;
let parsedInt;
// Keep generating new random bytes until we get a value that falls
// within a range that can be evenly divided by possibleCharacters.length
do {
byteArray = crypto.getRandomValues(new Uint8Array(1));
// extract the lowest byte to get an int from 0 to 255 (probably unnecessary, since we're only generating 1 byte)
parsedInt = byteArray[0] & 0xff;
} while (parsedInt >= 256 - (256 % possibleCharacters.length));
// Take the modulo of the parsed integer to get a random number between 0 and totalLength - 1
const randomIndex = parsedInt % possibleCharacters.length;
return possibleCharacters[randomIndex];
}
/**
* Generate a random string of a given length.
*
* @param {int} length
* @returns {string}
*/
function generateRandomString(length) {
let randomString = "";
for (let i = 0; i < length; i++) {
randomString += getRandomAlphanum();
}
return randomString;
}
exports.generateRandomString = generateRandomString;
return exports;
})());
const codec = ((function(){
const exports = {};
/**
* Initialize the codec with the provided cryptoEngine - this return functions to encode and decode messages.
*
* @param cryptoEngine - the engine to use for encryption / decryption
*/
function init(cryptoEngine) {
const exports = {};
/**
* Top-level function for encoding a message.
* Includes password hashing, encryption, and signing.
*
* @param {string} msg
* @param {string} password
* @param {string} salt
*
* @returns {string} The encoded text
*/
async function encode(msg, password, salt) {
const hashedPassword = await cryptoEngine.hashPassword(password, salt);
const encrypted = await cryptoEngine.encrypt(msg, hashedPassword);
// we use the hashed password in the HMAC because this is effectively what will be used a password (so we can store
// it in localStorage safely, we don't use the clear text password)
const hmac = await cryptoEngine.signMessage(hashedPassword, encrypted);
return hmac + encrypted;
}
exports.encode = encode;
/**
* Encode using a password that has already been hashed. This is useful to encode multiple messages in a row, that way
* we don't need to hash the password multiple times.
*
* @param {string} msg
* @param {string} hashedPassword
*
* @returns {string} The encoded text
*/
async function encodeWithHashedPassword(msg, hashedPassword) {
const encrypted = await cryptoEngine.encrypt(msg, hashedPassword);
// we use the hashed password in the HMAC because this is effectively what will be used a password (so we can store
// it in localStorage safely, we don't use the clear text password)
const hmac = await cryptoEngine.signMessage(hashedPassword, encrypted);
return hmac + encrypted;
}
exports.encodeWithHashedPassword = encodeWithHashedPassword;
/**
* Top-level function for decoding a message.
* Includes signature check and decryption.
*
* @param {string} signedMsg
* @param {string} hashedPassword
* @param {string} salt
* @param {int} backwardCompatibleAttempt
* @param {string} originalPassword
*
* @returns {Object} {success: true, decoded: string} | {success: false, message: string}
*/
async function decode(signedMsg, hashedPassword, salt, backwardCompatibleAttempt = 0, originalPassword = "") {
const encryptedHMAC = signedMsg.substring(0, 64);
const encryptedMsg = signedMsg.substring(64);
const decryptedHMAC = await cryptoEngine.signMessage(hashedPassword, encryptedMsg);
if (decryptedHMAC !== encryptedHMAC) {
// we have been raising the number of iterations in the hashing algorithm multiple times, so to support the old
// remember-me/autodecrypt links we need to try bringing the old hashes up to speed.
originalPassword = originalPassword || hashedPassword;
if (backwardCompatibleAttempt === 0) {
const updatedHashedPassword = await cryptoEngine.hashThirdRound(originalPassword, salt);
return decode(signedMsg, updatedHashedPassword, salt, backwardCompatibleAttempt + 1, originalPassword);
}
if (backwardCompatibleAttempt === 1) {
let updatedHashedPassword = await cryptoEngine.hashSecondRound(originalPassword, salt);
updatedHashedPassword = await cryptoEngine.hashThirdRound(updatedHashedPassword, salt);
return decode(signedMsg, updatedHashedPassword, salt, backwardCompatibleAttempt + 1, originalPassword);
}
return { success: false, message: "Signature mismatch" };
}
return {
success: true,
decoded: await cryptoEngine.decrypt(encryptedMsg, hashedPassword),
};
}
exports.decode = decode;
return exports;
}
exports.init = init;
return exports;
})());
const decode = codec.init(cryptoEngine).decode;
/**
* Initialize the staticrypt module, that exposes functions callbable by the password_template.
*
* @param {{
* staticryptEncryptedMsgUniqueVariableName: string,
* isRememberEnabled: boolean,
* rememberDurationInDays: number,
* staticryptSaltUniqueVariableName: string,
* }} staticryptConfig - object of data that is stored on the password_template at encryption time.
*
* @param {{
* rememberExpirationKey: string,
* rememberPassphraseKey: string,
* replaceHtmlCallback: function,
* clearLocalStorageCallback: function,
* }} templateConfig - object of data that can be configured by a custom password_template.
*/
function init(staticryptConfig, templateConfig) {
const exports = {};
/**
* Decrypt our encrypted page, replace the whole HTML.
*
* @param {string} hashedPassword
* @returns {Promise<boolean>}
*/
async function decryptAndReplaceHtml(hashedPassword) {
const { staticryptEncryptedMsgUniqueVariableName, staticryptSaltUniqueVariableName } = staticryptConfig;
const { replaceHtmlCallback } = templateConfig;
const result = await decode(
staticryptEncryptedMsgUniqueVariableName,
hashedPassword,
staticryptSaltUniqueVariableName
);
if (!result.success) {
return false;
}
const plainHTML = result.decoded;
// if the user configured a callback call it, otherwise just replace the whole HTML
if (typeof replaceHtmlCallback === "function") {
replaceHtmlCallback(plainHTML);
} else {
document.write(plainHTML);
document.close();
}
return true;
}
/**
* Attempt to decrypt the page and replace the whole HTML.
*
* @param {string} password
* @param {boolean} isRememberChecked
*
* @returns {Promise<{isSuccessful: boolean, hashedPassword?: string}>} - we return an object, so that if we want to
* expose more information in the future we can do it without breaking the password_template
*/
async function handleDecryptionOfPage(password, isRememberChecked) {
const { staticryptSaltUniqueVariableName } = staticryptConfig;
// decrypt and replace the whole page
const hashedPassword = await cryptoEngine.hashPassword(password, staticryptSaltUniqueVariableName);
return handleDecryptionOfPageFromHash(hashedPassword, isRememberChecked);
}
exports.handleDecryptionOfPage = handleDecryptionOfPage;
async function handleDecryptionOfPageFromHash(hashedPassword, isRememberChecked) {
const { isRememberEnabled, rememberDurationInDays } = staticryptConfig;
const { rememberExpirationKey, rememberPassphraseKey } = templateConfig;
const isDecryptionSuccessful = await decryptAndReplaceHtml(hashedPassword);
if (!isDecryptionSuccessful) {
return {
isSuccessful: false,
hashedPassword,
};
}
// remember the hashedPassword and set its expiration if necessary
if (isRememberEnabled && isRememberChecked) {
window.localStorage.setItem(rememberPassphraseKey, hashedPassword);
// set the expiration if the duration isn't 0 (meaning no expiration)
if (rememberDurationInDays > 0) {
window.localStorage.setItem(
rememberExpirationKey,
(new Date().getTime() + rememberDurationInDays * 24 * 60 * 60 * 1000).toString()
);
}
}
return {
isSuccessful: true,
hashedPassword,
};
}
exports.handleDecryptionOfPageFromHash = handleDecryptionOfPageFromHash;
/**
* Clear localstorage from staticrypt related values
*/
function clearLocalStorage() {
const { clearLocalStorageCallback, rememberExpirationKey, rememberPassphraseKey } = templateConfig;
if (typeof clearLocalStorageCallback === "function") {
clearLocalStorageCallback();
} else {
localStorage.removeItem(rememberPassphraseKey);
localStorage.removeItem(rememberExpirationKey);
}
}
async function handleDecryptOnLoad() {
let isSuccessful = await decryptOnLoadFromUrl();
if (!isSuccessful) {
isSuccessful = await decryptOnLoadFromRememberMe();
}
return { isSuccessful };
}
exports.handleDecryptOnLoad = handleDecryptOnLoad;
/**
* Clear storage if we are logging out
*
* @returns {boolean} - whether we logged out
*/
function logoutIfNeeded() {
const logoutKey = "staticrypt_logout";
// handle logout through query param
const queryParams = new URLSearchParams(window.location.search);
if (queryParams.has(logoutKey)) {
clearLocalStorage();
return true;
}
// handle logout through URL fragment
const hash = window.location.hash.substring(1);
if (hash.includes(logoutKey)) {
clearLocalStorage();
return true;
}
return false;
}
/**
* To be called on load: check if we want to try to decrypt and replace the HTML with the decrypted content, and
* try to do it if needed.
*
* @returns {Promise<boolean>} true if we derypted and replaced the whole page, false otherwise
*/
async function decryptOnLoadFromRememberMe() {
const { rememberDurationInDays } = staticryptConfig;
const { rememberExpirationKey, rememberPassphraseKey } = templateConfig;
// if we are login out, terminate
if (logoutIfNeeded()) {
return false;
}
// if there is expiration configured, check if we're not beyond the expiration
if (rememberDurationInDays && rememberDurationInDays > 0) {
const expiration = localStorage.getItem(rememberExpirationKey),
isExpired = expiration && new Date().getTime() > parseInt(expiration);
if (isExpired) {
clearLocalStorage();
return false;
}
}
const hashedPassword = localStorage.getItem(rememberPassphraseKey);
if (hashedPassword) {
// try to decrypt
const isDecryptionSuccessful = await decryptAndReplaceHtml(hashedPassword);
// if the decryption is unsuccessful the password might be wrong - silently clear the saved data and let
// the user fill the password form again
if (!isDecryptionSuccessful) {
clearLocalStorage();
return false;
}
return true;
}
return false;
}
async function decryptOnLoadFromUrl() {
const passwordKey = "staticrypt_pwd";
const rememberMeKey = "remember_me";
// try to get the password from the query param (for backward compatibility - we now want to avoid this method,
// since it sends the hashed password to the server which isn't needed)
const queryParams = new URLSearchParams(window.location.search);
const hashedPasswordQuery = queryParams.get(passwordKey);
const rememberMeQuery = queryParams.get(rememberMeKey);
const urlFragment = window.location.hash.substring(1);
// get the password from the url fragment
const hashedPasswordRegexMatch = urlFragment.match(new RegExp(passwordKey + "=([^&]*)"));
const hashedPasswordFragment = hashedPasswordRegexMatch ? hashedPasswordRegexMatch[1] : null;
const rememberMeFragment = urlFragment.includes(rememberMeKey);
const hashedPassword = hashedPasswordFragment || hashedPasswordQuery;
const rememberMe = rememberMeFragment || rememberMeQuery;
if (hashedPassword) {
return handleDecryptionOfPageFromHash(hashedPassword, rememberMe);
}
return false;
}
return exports;
}
exports.init = init;
return exports;
})());
const templateError = "Bad password!",
templateToggleAltShow = "Show password",
templateToggleAltHide = "Hide password",
isRememberEnabled = true,
staticryptConfig = {"staticryptEncryptedMsgUniqueVariableName":"b22da7869719991641d472cc2c8b2aa9abdaa30f3b00cbe0b13b3230d0286424ffc86aa0d1ba45a63ee921713d2ff10e44b1a8744e67f72939bfc1a9239d160c8b636e1cd3882df7ad94196b593dc671cd0ced1bd40d19cd8f5b2bc6c5da9f5c194bc1c76270ec1c562e851a9ecd791dc9f7ce735ad894c31b76c649be323f56b95e98405f23fbb1b4cc15165572e6ac7b99ec368d177a1fb29b500a1355af55c26e6416618f13e19a4af819a5cedc23cc411f629b9e22047e19e69873a249b91e773669b1c67666aa5c49e234e2bfa02ffee953b6677cea3c387d79ae394764aa3e3d5a246332c9441df88e64ecca4091c962d3ceb2977d51ea63961fc127a100b745f6ce13a9f2df461044fe13684bc6bb8d1ff3abace73be6ca442efe8cffa5f2727941c9e7561afde25b63134e3ef9cebf144d3cfb32bb9b588aebb17b79982a45cade83740534d2bb434aa4966f48bec75fa4b1ccf57452b207128d8081a914c2da01a0777fc65ab41dd5615288f674eb28610a78e759b8a2d76039555e2ccc5c9299a152de5dda86080a9883efa45b4435bf3919728dbec6edf1f737cfed9069486d60930534e2aeb85f3f2ad5ceb2b2c06662c3daed20b07a09d73f34b50442ac247f9eea7c7bfa9bba87b1c2a2052af15431c3808094331ba4dcb6b115921fb0a8fdbeaa7613f54630011596c73f1d9f592c64dc9b702a32a1f649d53d66cd7a3ad3cd0ce24e6580490183465f39ab698969e507526bc0fc6b00c500810c42d66129bd17c3cb52499debdbba4b55efa965cbff602c19c2ba229baa918dbbaf583384efe10e23225c3ec21106788e0108fa6c6b3ed2fe06f50d4a05e042939c0ddec7dd409d81953157ca6c710a3514c1dcbb8620ff26d56b728fcdbf444aefbb4120d0570483087d9e20123907f8842f615ccced91d1349b860eb6e70020b9652c349bdec4753ecdd83445016d5c3eb228a7100a982051b5054af151d8335d4c0be33e94ea072835a9a7eacd35c1b737efcf68a4c17b0155ae4ec8fdeb09efbaedcacd080d1a1f0999abbb1188a3560de483d052ab9ead072ec0c32207bb3ea8522772cfbc3ba37d9bcb3802629d3fb1073033e87de20569ca3b3ae6d64e6c82cb85fb6b0c4bed335452f8ca936bb23b3834a5c624b49220851bdd6a636e33efb0dd50a81c2a926e995b41147dd984e3d828dc5e2051ce8a5cda5ec25fc95ae594d76e28bd43b17752fb82b460ba4743f1e3d7a12d9e62a7f87e8904560b330c9400406e10049569dc7c066696ae38b5fbda639430da799e7d805b4000d8ac9491ae63fe9fcee42237f14f1d5e616e84086b884276df11f592d2a54048864499127769465ee5fd0098f7e679e96701c83bedee5e87764efd5a5cf27175373a030651c0cfc56057aa590bae5b27323670bcf0ba021efa0f2b300e99d1cf770d4d5e0f9ec796a494c15944c7d5d52985a84e67806b366c3967e8b36f6e418ec081bbd5c049b8276958d2b8426d4afe4b181f7509f9772b16a01172db39605dabddfa1475b2e2433541bc56171a934f3e2de251f5087607da627836b0678bf79a302798c72d2fd858a8271eaacf736802830c8637a63c2d23390ded3e5450ad347a34417dbb0885e16bd16ff50f6694d669540177280218a4d444964024afc8193e9f5d2127eb2139aa0b3dcf14447e11d152d97fc5b8415e28abe35f7bb0ef1d8fe97236901d68c8c66ed0f51baf58ed441a69c1ac6cc8d09e7ad63bc9d85e9697474d53e18bba2d04641fa67aa958e46c45fdfc03eeea237e0a092f54fed766f409aee3c71a7924c5b998d18a0414f63513599a747d1f14d5d7eb3e7959d3e9b3da6737e4a3b8ea683d1e1a954e164ea40711372172da869dbaea2ed9953703d05e0466e7ca8f8b5fd7d0e59784c734b9c8e2c8b4ddb963aad13593905b6ebc7175184e8b91b8076ea4f9c3db701a2207d25c6dac7c23e2793c70fc3849a6689530bc956cb2b8432e2ba8fb23fed1399b855f89f344fef7ed23cbb6f9c42b6535878ddff11b4e3ad30be0944ca81fd43af195a8cac8d19ae28ad0b6ae5eb94d665f98862f56bbe60572ac23477a2885b8ddcd7c303c74982d6000416677be9eae9c24d1d58e59efe20a5a89aa7e71a9ebe5c0acde88563fdf68248fd369c5a06250c0ed7d58ab03074992c54da03ab88276c6a84a2ec79d821f3586a1f8da42e1a42f1b07477e66b2703d647ee05a35c01a6de89ff46b06ffdd90f00acb99895f40e7c0415c09bee3d5a403854e423c4f965d152870179dcf8caed4ef981a2eb5a78c704719ddc1f3bb979b7be0149384c1b29dd0f9f0f350b9a82fef7754eea01a5ab11c9cdda16ee74665bc93327a0995928a034c260f358fff98fa5911233b1ad16ee4e2b0f49ccf4eb1f8224d7ef447677b507ac08e1f2e5f00f54e8102b65995ad711889113ab8bc571abe0f195d33e0f06f813f9df662227dda5555f73b7a27e18d19bca93c4d74ecd6c5fcd786bae5b848b3ac9e89d479c61f7614cb504ddfda38cf4a45c1afbfd31cfa77059d8d8e2aef8a601f47e7252b98bcf0ce0da7009389d2d1352bd2eaeca300f372c0d41fa1fcecff5fd404691b5863a054208e4867ffdd0a434edb0ea730266b97bd8ec029adb50cdab354640efbfc802fce3729b8da508c4ab57e9ad89dcd848b06f11bfceaac8d3414c5f5d5307f43c7a8fa18cfd2ec226fc8213dc3ae6a0d55fb0d7fff3cb04dfc1fd2f134a1678adb12178c3c1efd3a83600e405602c7ca34ef6eabc788f541f13d0e61ec72662a9bf7493f36f473c626c775c5b0fa48c582e911a1c69f0369e8569dde7e7472127408c49b057321ee0296a0e080e73ac67a98fb00e5309a60133a1707a71459af16442dd4cf5237f5aa59f849774b9f4fab9a335b04eaf8bce66e0dadeb82765c987c3935d5501d3e9671c5b53fc70be58bcb943965be6632c28dd67484ba992a8a7fae27ae7a4fe30d940e42aa263b8c206f03598475570a976f2d6a07986a485312c18847c823518f0368683062561b2659f69b12b536423b8faf284831cb9bb050a4bfb406c544b08be3444feed8576d66927aabf970098b6647ce2778c78e8070c9f272b8375166b059adcb885065f3698ef1680c51c8571e7aa768a9c8ad93409a1ee1d355658501b47ba769834da2cfb75aba9792cc4086c6111e1a2bd58f476b7d22fbe5f5612ac0b68be9d758b51945a166d9642d1afac04d6ed77b86f0d4cef5b6abb71337ddde535f61ee3587bff108ff97a0b6052686e527ed9914cf9bcceda6953cffb1c489e55d5e06cb81f36eccec4b56535b4f0e37d092bf1d1c185ff7da9f40903b6a33eebf0aa88a52a7a561767aad5eedbb2a3632f2e72c9b682a8082a0162f586060482f2e6edcb2f9794307d313cc0b6a95f2a94860356f225a757d3112eec0069b44932a2f88ae8b2254e2286f6ec3052c5138b5a693f71d4e48f63f8178655822ef66dbb3ce360d6379a8b734908510445b1354d9093c4035bf591627b8cc8172d05487de2876f22cce5197c05e2e43db8fd759cd8a161dd5d91eb904ee60f37b1b1f9c83d26622aee2ba76dc693545da4d152eb92e79c09f0f8cbf23a358a3df0bd9bdf2e2d3565624b94e3af754bc48628cddf02e65f6ceaa5e527c83b90b393ae1540cb891e7a77811017c0dc1396910c8e70057779901fa3ad3dc022af6becb3451e68923bff01d2b367aaed34b97205340aaeba82ecb6e081dba3a8469b8646f768aaff74d650687b66e3b612211088d80e41e6f31dcd46dfca9340bb975109c418cba0434dcf2d16fe4e31190447845386e5955736c8beb4d95643411581fd377eb81cb0fe368845c0828af9258144d2f87bc2adc6d6d743b604ec4795ea3eff3ddd3a7b8cf44bbadf3472c4d606230b4a117b3216cc1bd1160aa886ee813260dfc5e2e04f9ce3c5758772d28dabbc758f99ac37c18840037197afc39e48db01b5ec880638da82d39dbc45dc4207c1d39e31d40c2896d635fb37ae89b241f6e5ab83df1b1bcd51ee7edec174109f391cfb1715909c1606f1da1f4ea562b987075c894d4606909b8bc915cdaaacc5ea3512976ba7561f38592fd9dfd640123693f5033743906a3cd4200766a64ae44e0e126397b534c6be8b2608f2c90d6b85435bfe3cb71d968e5236a79d7167f9327c269908d8c20448d387796b41383bcedef9d19d7b635c6e5970687d7905bf84cd38e1461337bd2960d4d31aa3ef68dd0c76367f6f96bc597baf7f0dfe447a412948fa6097c016ca954eaa2e4f7d31d7d8b28b7fe84972ebb208679f68eb9168932670820807dd01bb2bd177039550397c71b74efdf34f2105a6edea45c5dccf9e9f5166dbab911701652238712454843bf80bac004d0305ca59e17b3da0f39abcfb9d7cd16eadd070a3aeb65edee563a2497ba6e14b012441296d0f3bbf96927a03a3505e9f66691cd45975d1699188be4b9257ecb3f812234cdc39f0e84396fb1438dcaa105c061b166eefbc718d67f249af7608bbe101d583384e0e43c5e44127441ef71579ef6593bda08b19e142e036af182ee2f9026365530cb733784323bb29423c88ad9e53014081d91466c233d68c20e7632739c30168c5162e7f94eb3340ca47a31759b39ab3221c59a868198c7937ae2cd3b9ce8322715ff742c3cff78970aa155016b4baa38c5269a3972444f2fb6aff478e66e706d46470aa8283486125cb2428fd0a93c7a9d858023d7bd172e539d0758de0a601bdf2db4a3a9ea54f092c8fb9fe66ee7052cdf19c197b6b109aa69146a3d0d7234ca282f76b52662c00f8b5dbc2ca146904b110078569d1d531f8ac007026c97b9444a7429d24bffd793088f684277931662722f6798b11933475db75ceb1571dde328a104152accadc8ded5d3bd6f4f9eeba986f47b40c3010596e8322e588a85fe98c91c6aa4c680b4aeb566243d50c3f02bd7d5d1dd0a3a1891094c7c8c7eaa3c1c8fcdeb5756dc3e1f46c3a4a7f59edb4a7bc24847c8243c62501a2ab9ba164776acef8e98c409777067d3de1d87af91bb46c5b0ff3df0b9096202845d0fd6d457620aba89c1b8925f52a5f9d4ff551e61f92dccff395f9bb35757b72a4157d06e6dc47b9e9e79d05a63993343e837df4c6a13589eee4e9c8f3ff0c8035fabe79e9358b704bd38b0d7f2eb1e145ef5035b7b6c119c8f039a72fc652ea9557c72964e78aba9e5c0cf5d49f7ce285b1fe3ce3c533769be8f53a7156a9bf299f6269a9788779fafc7af03e959d369c5bbbb631883ead7b9c783ce5276c96935d181f5f4c029e2d7123164af056b3c01707f0f875218b5275401433e46be29cf705c825c42f62a649f6247f84507fda185dfb9cbff5eda410d6d4182c49853c86063aac392a9bf23e1402786aadeb5a0278ccfbb4f59b2c4baf53f079c974933b6c4b2cf266b0bd86854d21c031eb7647b2a300d89d027fd7c19ddff91c3f6daf9c06124d6ff85a821d445ff191898a438c85315927990f7bdbafa5ea97d99d1be684687def7a54cd64c5360946c80ee7867183880408dc82a7dc4c9a9b151657faf225dbaf1ba1bfa144a76e67d2329e012a1d0c15e8febd599f2335830dac128da111948d1c39e0bffcebc0849c0617278d4f0d4e500e7867789606cb5818427655ccbb7526e89032f5ef1bc1b991a7d06db744c17a590e7ee09b95c70eaef16a6d9d3b3fd5a6c46862a1589a86dd256a5d3ffe2e48731ceca4cbe9327afde0d4bfc4813fb7ac2492fd007ab8ae269b1826f3ffa0533e46f0880398d2bb2dd1e8721a3393aaabbd5f7907e16031be1db7db5ac66bdd2c69a28a58542eebea8a46f2a1d524346229fc2825fc7e4b35ff675dfb5f42794b1f175d33359b95760cbe46db15b014b48f23f5f6e6b53b334abb58633058a7a5cd3e625594511fe70dea76683f77cc5e1012cf7747eaf70583a0899ecff07f6d85da6769a87fed027689d4b5111ac7bf34a1206fa2f12cf4e9426bbab320aab54d170cf902f350ca4d07c79156de82f0caf3974e68508a5181399f382cd1ba813b53943a9d48a51034b1127081c4da8b8a97abdf81abe30dc7801bfd668582adb9aac3b7e85e07aed186f710e832d34abc4fba9d22bdc83bb1e12ca6d86a5d6ffb61c2bb1655155fe07c4d22a4efed2a1095175820c9ae78458277695369baf621615bc1b9a1ce0c03b233595995989425eba8d59d603bd90e94b28d0ca5a8cf2c528a487753875c552834fd1f41b7d64882d6ca4d64ba9375c711230fa511350c9fbae830cfba74eca27fbbb9c4c8639fad328b9a3cf29bd163c61b112fb576b7a5f8f77bddcd4c8468a7eb4de981be07e6ea0aad408a0c51c059b9b4e6690a52227a793fe77f664c23002acad7e3b83e3f0d7708a5d0b6e86059882d2a271fd7a03413d2fbeca44bdbe25e9bea0007d2a62b6c84326adca14012759490a7bf0f17ea1f18e0af1b7f8871a8b71bcc704a1a9b23b46924f04f0b89e96c8f9a6d483342c3803ac9762f5950b9250b27a02b2d4d9b0648ab9102758b32a48d3b4b7c77bfecae110996ec48d26ac667ba4fe4637a1804ca10e6e360f0a3b8a3aad23d6692a55e868dc06f34b637ca6ae7acc507fafa4f2b2d1d6c840cd32279d2bae2ed690810df34d1738b9633c785fec46259f9a58859ce658305a48442a9e3321e53343834a6371c1850242f7d2c6595c87faf2b82c0aa8fd94a1de4b90a42faf5ced62234a52e4dc58fe29fb025bb71a80030670194fcf6fc649df95d1f24ffe1513eddf74249d9319bab4d8ff81241def442a248ad06b8e4eba3f2deb58b2f29e71863c399dfae53ee9b7761e10580409fa8034c062bfa00423d36b358f03d7d8353ef312acfad44bc22a24df57e1a395539993441e4bcd0b214badda6bdaecefd366d222b0a60b4174276c37cfc872894a15f18613c21612479bd60162e981cb226458acfe2764f5b8109ef5bec082fefc60bd835f994ea6b030209c68443b77799b251f7b2d84c0ca277871939f4e9871cdb6a5a98696ecc5f90f4850c182d1bf384997701f1f9d05ccbed3db57a9644895e4c6eab056dbe787c85bf4c8a018df74a0ca3fe69c7f8a7bf83437132127ce75ee8ed3daf55c8ce894907a1e7546ac44b15cfc3bb704bfcaeeeb71b4384d68b6091980df2d1f000f1f2bdef1e515a213c788a1716fe75f865d9f0c8751511573a6272b9d9cf369d716a6b8b8f94c2a5ca26062b4ddc37a650a825eb13b5acfcb6e129011c6287a747c5e9a6bacfc7755ae3935e31378ee4b19c607dbd0266e09344151e3f7eaf02c5a731913f5cfdcfb30bc5f4517919b3d1f6aa76a54ac7f15ffc361891c921b64e45081e9b95898e4f3af9ec154cb1ab56bb21790c2782e097b1c93500ac58c987d195c5d8253ee077ae583dd95ce71621a7c248f9a717a97388f8ba89dd033421e3f5abb9bb3cee60825413f7ebda9c55cdcc4cccc64cf220ebf8fc72b3e86bccaf5f0d14016bfccf9a1ba67f84944ba121568c3272d50e11476fcdae75ba7b99a7c22a46ecc34a5368ded77b0fbbeec12fa7808df44696f216ab2f0569f80aecd88e28628067c6902ccce279a697ed6a1c0ca122d832c4732489ebb89b0a1c10a4153534f8f365aa8062ed75585c625acd8a166c15e3503c3a9a9e191286595728bba1ca423be545ac01bf17962f5466fb23b7b363de756e30ad1543cf7ab57ea0194d3b24d7c52af4b267525bc20ef5855e4cd1603c46f6a5fde711976dfe491c302e0b2c1c25b651869e2ad4cbd9a92a43371ce94c88c7d89ddcff14d2e291c7b61a4273b81e250254d9f89c40d2f68fa53c6b182c4579c0ebc1440177c15a586f41c3292842acf9edd73f81edec8dcbceb516939e58d58aa525e4abe0b3d28e61da1157c2640ac90e1941963f164d51bd3e3365efd00cb082e6b0f2daa5e1eedd27b41037ad684909fad52d05242e94a62db40cced01d1566ec6d62ea297e66c23f610a8f6eb722863fbb0aecd707e8a3a96d7c1caae2ab1477ba8b7f92a044be703541377d9501bb8bb658eacb9ff01cd5cba3480abb617eb56ba0e04aeb3790176104922909923b3598671c9a6ddea6f794b04afbc90e2ee779252d520407bc751ea0f9d6aaaecd030a503778dd35ad4856be76c7baaefee3fce7169d96c84ff3f59bca6a5a94cbfc4cb866f6ea39847bb9d0fc98f67b6041ec9ef4c368f1ea876606b6424191757109e45fc95a1bf16e2b25db0e6496bdcac67ba66baf30ac6b030ae495b43ecd5a9e4d72c7b6802f471238a8eb4976298d8d93963f3a2d6ceff6ea706b8d4482bf951b9e6570b2c428c909ed7dbc9afcd421d4bf0dba5f2a99f1b67daee2dfcd0e0634e667aace95e995bbd95da6fe06eaef6b2df5ae7aa03b9499a9bc2773e192648ab918b42be9ead96047ab4c1be22e1e9f7d1d5956c31f9fefaeeb6406e42091c4e2eb81c5b91906f6766f0f06cec65db39fb6d6556c04046e2b9655abe46895e8582a659d5c5afb47c052a3ec5a31d1a00533f4d03c09d025de8009120fd3737c930e2efcfe69ff521fa375bc5c5229fb31bdd8dadb9df98b195add27796e40a465426730e91100d46897cfa3f7a5b175ff1137aaa7fd47796dffbd6eea7e97cef52c897fc725038d8b985bb14d1ec0f5df7028645ee4102143449a2a411755de27a77393784929c4d1c1b129af07481a35a087b5ada32100b9e03d79a0422d55a119adcf1677d4bb2e64294d79043ad1011fa8b5823f44b16ab6da620511ab302aaf3c3ac6f76a80db87eca5ea907954b21702b4857b51558e4cfa61dfd99002347a375c6d58cd40548cc905d09d90093e2b7c0b764a0639b8c96e1d6b04a4edd3c0024b6b7f92fc5caa71cdd4a5e443b11e540729d83463748da560bba75ee78f441a1e89907c7d408303a56e533f800b1a677586b9a7f26ba1805bf9e5ab9574bb96826c0675fadedae7fdc4ce1c8858a3da5dce0318640c5c74fe0248607cd499561af0dc271dd165cca3b1317399ccc917c13ebc9abacc3b701e2b16c5a6d5fad64cedacfa34ed47f9a1acecadd7aee434c3f7290e140a5c26db0bfbe7a36d0e5b94768298320748cca4aae6fe514acdfd7fc6cc7ea983a0f9c6f0e5d8f905459d58d4a1403c59e324dae5a45ed1bf301c98d105203b032868f521dba25da19cc1da5f04a3972a11c5fc52c721d745a79337d86e03bec80ff2289a33188a617a4fa13e3cc491c2540e8c0c22228a80ddb677168cb44e3394c727e3382e544594cbf3d80b6c208897484319849f4b4cb9071e460b2107d69acce9aa68fa3f4f777e1bfc3acd9b85dfdcd04af8f241f5ed44d3c286f781dcc5fc291eb6b38697dc02459d860d83a20a7f97e6b277ae6ddb5832b2213dcd402cae0aa1b144610de10dc7a38709ec8a21fb65952e05f3dd1d3dc7612f67af22c526ea3b44e3b604cb906d1e153535bca932ec7a372b71b6e9e2538a9fc78320f979b486fb412a27ddc3d22ab47896d68605f775c13f87718ffb6fbe218094390cf5c82aadc3ae3920e2026d367201d8f321c38cfdca6e06f2e33e9758cfd27aad42576bc6cd9f42b676c05bc187d57bcb5b2bbac6826260f16fce2e9c34ffdfde9f902f81807721423b297e09da3f272478c9622e188d3e61cb21ab8ef71538252d141341995588b0721ba62d08ce32d47da4887f28f73a96f0f0da6ed2510986e1ced2943ae1a572a1478fbd4d8ae3cf21fd5351b86301147bc1b148bffb535e2455e68b4b8a10cc830679e1285363469c33dfb4af8ee15bd1b4b0f710311585949925addf433a3fdf6a5fa711f5e4697827bab3a41dcad804f5f451606383688722dd8d443f3defb528eba2df744d953c0d5939204588bfa8f4a06737787c20c54be9e479e6f200549633bd16d81473463d9ec423b005ff0f4b562534787af6e25b0d0ecaba704012cff2eb941a9718b27846d925b86b3524485f8c24084513bd7147b26b3c07ce5dddf766bc39b597fae9ce9052524a798fa3d1b5acc41026107c7e5a0b1ca2839d568b1768927a11c1804a01e1af3d55d9e351e537e5b94e21e1e906afe99f1aff1cae59b4c53a160f433f94dff3ecd1796da977a4431d83caa48e2e87c92f53ef1d9ebbe58d4c8a93c203c432a12f213e2ca9819a2a31df1f82460238a3092ce23506aa4970c9f8d3d7d7e955e63c580fd068bdfeb9db67eeac36033c87bdc8d06b4b30841ebd17849b4873ea0c6e09dc831afb058e26e98fafc1266248bce641335438bf4fb176e0214e3aa65fe65436ffdc76680c6e614b738fb9e0ad690c4c0a3edef5aaf150e6c3ea59ba9048d6ec753be2161d40ee92676a3cd87fad51edaff88caf5c1b102241c556e1d1d2a45b5d3c564cbdf420226bc744bdb2c43b4b927869ce1d688b814a9d28951b4e01b37fa03be83bc64c559947d5d44a4c723228b68ae46885f31fe48c74b564f55604590fd708cb050c51c25a39dd2a0d74323ac75b299745d1108eaabce9051dce06ffe54cc13398f76b599b36fca2a96db7b0014a45dace97acba06f9867259d42073a7dd2374fc222e3fee50ebfb3a7eb2a39b8c43f7a578cd6f0c49f01f0a50dcc5b85d0977086949e42607420e07d63a2f427fa512488df951a0d8c8821d3987c15f6a3a43cd4a9ce168dad56d9a4ce64506939e8408218395a625f53b5f3a136ab21a94e452ec0bb937df15480f88bbb23b838d953cab16ec973aef9be09cfe963c8cadc1d55743e2d37957f558631649d60e940a58c1e4184b1f0f1fbaa1c3b7ef02f77c14abacaba7b33f61db5cf01faf05a54df066e2cda8257fb877431c816de3e8fc5a47d080f45d9d1a62e13a6e62ca83af1db0df00f83524ac083c68e628468857a26400b104f38560a36b18a5d9e77ffbff8eb4e7f8cd47d8a8818de5b44ae8bb572800b9b02b9f4a9ed8a95a404931713f30a3713a8442e42f72ce637d975edd16835dac6480bbb07c857e2a2b4af7ae3050182d25d831f57c5753902b08ca4c411734c0b0857446ecaadd57c42e4342f976fc51000dcb7b7d416c655d682a1a78e86fbfa3c97abea2dc6a7858bfd6d2bb0bb3d26ce5e071011058f8cda9c605d726821f1e61c4283debb9336711a7961960943e127ef87841058b815e14215ad9a69bdaf0dcdb11632bd3446b8e029905946112fb0645f8953def4055423e9ab91fa3a79fe400b66f505de33725628b8802718aa4b6d1f33ce3e6b4bb55164ed6567a0fc9ae0da7afadaefc9a82d1fe897e7f0a36bba7f69f35725e5b2dcf0f82d6b2581619d9c8e96f804727fe5a5ef8be0d3ace17dd5ee6702fb2650c38dfbfc86b2c9bdeb58add857387b1c157291231ff9d589563f95f59bb3fc66daa8533e7699768dd1b299d1319c551d2f72cb8976fd4e9be927a30ece11d5ecb8a9038025a35045146bed934655ce24407d78e0e6dc6d3c8a5181307e41fad02df887cbea8fa1596e5207b7d82cd622e7e54e1a5209fd14ebe246c205be9d218c889cbe23eea5b264d368507d72102a090b05907cdf7d44278ef383ef9fa38c2f28a4d62eaad6c6f901f5d3e41d473a5bf75ba1459f3f637f41c0a8d9d246e505876ef25e63e86f52f2c51d1657eb1635e70a6b0f3b7c72f8ef254b681c852f60161d2f20f01178397e4d81811807c1385ddffc8b578a97bbf58665d1a66502deddbbbbde66d5bc6751281895cc0f3601ab7affc23ad2b5d0a5b4edefbf81831cd876f2348e30e02bacf5f47f091af20c5c54ee360553c7ad89c643a24c285844ba17765507ab0ef7f7e8d888c9f5a51ecaf5b8a4859515780d3887bd21fa1483e67763fa8364ece07d2873b684ae91e76cdd0d13a2dc471827abb9d14878ba56c8e4ed79fba95b16cee7be597435a9bd43832969c3604f1db8ee656a443ba1ec075d5e4e0929249c16974ca935bcfd9e42a3c84e568a78359414510d7a1c411204394a1ea647023eaea26103fd113c5b8099b93d00974bce58aff6536d6c467be1fef54aa4640e3aa11e365a539c2c74e09520b4c7afc7fd3b052b5f200aafed815f28030db4c5d9717ef056a23b01c01de28d07dd58af28357fd3bea4d88eba22f7f0f9bac079cb703397bf6a7daaa9f9028a5b4e5fb1f818a6bd6447d3fbef36009d947e23aa86b28d0705a59830d07fe3510e8c70bd9f32f1034704f2d1f9ab3cc8fffe7dc29a5983d9dff9ea5ba0194950c45297f5fe7ae99f1afd6c50a2adac4521dbef771de26651d68e41d8384a54021f077ac314f7590f5b14ed5682651b15df893b9f0f17c52bf930aaf9e105a6474fab224b82c7f92726318fe9102e07025c107c69e8adabefd0f7c8cb66f7e9a721d144d02c9e9c8b399bb0d4d37e5a1e346d9c7bd4c931a7cd9f3838ba95936cae32225b8c8506045ca5c05a574d3ce3979059317c488fa678fd5b49514dbb615b808baf4364d9d73ba3dd779387a9d73369c6ae4efbaefc92d63b6dde4a1cd6d4dabc942b5a014d97f106eb4cd2fee254781485c28aeefd231473f3ad4180a1385a50e503b23e5310c77df6ec53f144dfe8e682af1cf6e636b6a9e07cc2edf5cb77601b42cca85b43a4318bc69bd63c725cd0aae25b9f6d0fd4af12a303996a265957e6e8aa6576bbd35b1b3d487c6ec5d23ee99f4cd0305f3c9bb5953cc1c0697f3633ce194889a1891b2e79236ba9929a59d1f497b70fb5029b35d39f1c0c422de690fd0aba39b86db0749b0a5fd228f5e3875dbb169d2a869e59933e77a59d4eb6ee8847ba206dcc01a69436b2a3b0ce49d9edbd57158a667f7029f37748492af3d9008ba3e495c17c78e6123a0897bfcf5f11e170e4d9a03f9f54b5504cb3f18bd6780c8f94ef3ab95fd2f7919799e3cd41ae56f8b10007c46e3b85cf676a258f3ac0a77643142379d721e27ec276a107b11a388bf2c4d575cb9b8eb94de822de13e0d284a3b68dc9b26fd202ba24ecf71fc87732ce76aa708a75e3ce38b661c8f51e5c2c1dd43f687b6e958cd05eeb5f4e750d9f4cfddfbff4f3dcc0bc82786a1362a62aa559e3970cd617328b2882970709799b46e68f8426a15f2a7dcded21107d7ce60a8e3173b8883566535a0efbe45054d8025a34192cf713bd0bab122ef62d8b9b7e9d3d3540ecb72e4873a7920dda91cf0cc6960a83a7970b5f0dc8f9f6fc8bd2e6130d0bad44517a7b79c5dd28370ad9d624bb9ef37de3e2f3bcb9a4fe480cd7866376ff47916655c13dd02b37f763a96c4a348b2cbff5c3955eeeb6d6007ca72d09a10a7f877b77d05fb16d01b7111437dc5e34e0edbe6f2d3534667390dfd8a0f4bfd90c3cff99922144f5fdfff1917cbd5037469e432ba948bee86501dccf773b7209bb72918a90d64aabe7d26ae92002cf5030a940a43327c28330e5ead6797e252be87f2292cfc9388db11afe919fb5a7d08f26258364802a5d89c79e1d1c7b49d378d837f8ebc08dc8f44b100a16535687c41ae929ef8933d9942893a43fb7ac59ee2de8ffe4671b206ffad29b531c537b807c7bdea736d92c8b11c573c4c4de4e6c6b4ad6b3e303fdb471041c80e976f11128906095ac1218e9fbff66cae8ed52a76403a8e33fc6506b24e863a0c2295ebda3b39130b5ad4ec1db61954a089124024a5cb0ce0aed3c7ed57b6bf0db4bfa909a238b915e053d003df9191c5d5ebbfafdbd3096ba7474c1a8f0eb8cfd4ca934ce6796d556977f4e28c233b99774bb5da73c4bb543c010dc859b1fd15515ae527a9b7773cb5a271f11ced19bc1289b135e9e57e2b1b8426d221ee90c61276bc5ff299a626b8813d49670af79e7bb834edd769025d7391331afaa5114555d862a0d383f03fdc85931ae4a0316f216c49741a733d9fa1f4a1c3ea330342a326c8fd63653b4a81177a81888f62655fba2310ac0633c0ad756527bc96672b08bf6dd7a5f6831d0e3116772fdbf45d41f973f20d6bac737abbc3dace7be770426d23c35c7569ad4f3072199d931efb1b55e487fed8582430fa39dec405a644b6254d23f8705fbb25a25d72583689494cde7d1a0aaa5a17e1e24ceacb9cea7278ce0e2aa5cfc9bc91806ce17da61a0496aa536a470b625819688bd66241d579366e026dd13b13b238bbf244734619444096ecfa8139a0e5879b49032fb90bf420c1990c9fb276b176d93a861f552bdc5c70c83ac767441dd41921ebbbe6f447d8af9b15b0a028f4347b17b4bf131e0a92acb545fa788fb3f145da03087204e0298f0aee5441835ca8a55b31bd90995e408dbd29d5578b3143f1ff36a3f48e2486477b3fe28c5db38d5266a83936af5d7426f5a0f95d110c2d76685512e23e12055764538cac3fa356b069c4bae15629ba16b5264f47b3a645882bcc15a52eb4c251718d71a364205d453878686f82b7fa7f3ea07f689f3c7a071d4f0edb812726ef7a7d8ac0629d9f85119dfbec1fd532d2fd92693313e7aef193ad26e882217924ae3254a3828a6e2998e133d91845ab73dedcd9e6f486633207bdf692d2d54f46b4c015b35bf4270a9227ea43e454c0eac71dc3a70ea888c9978d74d19e4806fcad4848248ccc20ac485da72a0c9b59fc9860038a26231c3b11d124b740b1d0dde7c69dafee0a9ed0eec5ff91a6da8707dfb623b3470de394e64b843dd1446d8dd9ec2b5cb337bcab23a7b83afea8a01f3a8141b65a9b79ad659e1317822af2f57df35ebf8a4a2b54dfb860108f32564bdfdf3cf00995386fbc8a9d6262f2a6c21186611833f116838b8ce9523fca10102ae9c42c69d6a02e1bae0d2d1d2c60d84557ae2940da8e6e0e0eb93e74d04a3fd2582b05a22bf8327541ea9c382d4d0ed15d1ecee6f6a9778a6b1a912d74dd7b838a85f526c33302eca60d6557651273000dd18230cefc7965bd695f7fce06e2a8c1d6f90f3f50662ff95b649901748d4722fe4771348c6fa8d2725349bd5b31a7fe6a7735a58a0b2e1a125bbb0a6f1c5b93ddf314e3037a3dcf42bd63622dab49a8db7473c7d96bb91c0ece263e76df4fa69be8acbc347974c0ed6e344997b458b25103531a5adfee5fbdf37306be4c5070a5ff1b9d9f6ffa0e408b5d502eb2cafef53c0163f140d96fd66626ba56c125cc14224da47939a429b186956d5249cee32805c0f27c09141afe09947aacd520b47cfe8df6d7a4066e00058b64bfc84ed820587bbbd5b4229ce6c61a55888266fd4dbc655c625b7785f9e1895a0979ae77897c960adb9dfa13dc0a1d485d2427d70cc48fe7469b2096261f6809d29feadd2cb41928c4a4b288b8d693a9e9b2c2f2ab92f72a62d245a29238ef379e86ea680f10e5ef389ffeb76ae62bce41b3014196996bbbf33951995b0fe6fb0dfbd105cd17e494e6a21978101c5c426d0923ead7f072f16df123dde6f4a510c472f6a61a6104651d9b5d50a7205c488f9e524b35de125341cf85cafa728ce5717f2fe82c8cdefab7250f4b9ced89b187d3f6130645a4fee54021d16b986d32491456753bc23e2dddc79e74a60c11c3ec9cdf316f5666a1acc6a81c1141e2776d531d3d9c66c5dcb134105a44ec1b4d84458d013efe1024c1039f4bcd9f54dd75c5a8cb7994771019888addf764f59ce9ecffcadf2c01a235b408ea48782ebd2fd37fdfdc3ff9c9b7c564a799b88d399e6f3d32df7725a3a0e3b1a4e8e8d0f6df30cf77bf9e2aa8d207c5bcaaff0a80e709d2bef1ac51e4de0316041759c7ab917fc797dab2998bd36a579c95786309844d269d0eacbe2ac354748baba030a1ed3e1403d31bef66d45fe41192d018a98cbd6a65d03bc0ccd396cd876563490014c3ed2f0a9b1324f0ccab988ff986e843895b7e1acc16de9ea9679fb95a6a8d7abeacd47f152df735f7d1af43a073c39c7f83f49b39664331a199acccccae6dfb3a08983e80316327c35ed74d3598cd4d0817331168b04954596ad0d49c0fb49a50b9cc1bba1343063bd4e922c7daec3f70983383e5056213e05811b01dfe73c7b2c36684d70bb2eb85709ba9b22a754173117a88890b1b16a5d4709ffa67ffeef3726a93e7750896e98b6d2281ecef2e5b7a8c23044b846dd4b77c74c9d9a0b89c80cdd385e4330a0afab3de5eb31758e049f6b785a5df5c3b72491572e0929d624dc92adef07cee96b126a6384b11523e15c3c3847b408ea25a8fa299941caff4596e1a85ad85a452c5c10d044188dd63e07c19c53f322ac76b832e75f3b61688df96b4cde62343b363464ef4af6e257e7be36f9d72248c9ac9ff4ccc66e07a2b4ec233164a0460cefa676ea4ceee6de089f9f15330854443bfa419ee854385ac93b6f7ead4a9a4628f55a109f0d8a73d2bf3a0c4bce50969df31fa516b7028e140ae87e125383b36ce8c8a76ca4f27b16f41c30bb453f14f8fb21f097e196b9401e83bb20935666a09b3e68e8727994a715ff0484b483ef50ce6f9ae59cbb3147c0ec26521fba498f8f3f2a2ece09d4ad59dfa7a86d3d4fc2b3a2e6e2594d42cf29e1a28b46fbca0c5e2007ecffa947808d77f48470664decc4645aab798aebd015f2311b9bc1e5d75ecf42f718439a4a4f9887b2393c1b8991e6aa997c55447c29a87700fbddebde987d2a3fc63a45a9e24e28e9c779f6a53580f4043a8c5b168072ad73fc280107d51c81d9e1abb89755d07e148b7f44d44fbeba373d4672779cf8c69d740871a1b41ffb4de84d208402a1e780902950673dacb825f92c098590f9d0f5c1c654660eaf405e45f3aec85f05f2e30fa856db45f93614b7e5e0b1186b75c3aa546eb5fb2401145191be0c961f6ee05369e9b777820edc485c801e333a5a18164daf42695b28072ef7a264da61f3d46144f0a00d16719e01bce54daae1f106ccd59db4c7d8ae9de559631e9fd571523514d1c2e5956a03b919aa762bb066b4ed4fd357796d2ed8c8595136bfae60f50b3e37ed4b2d396f022096d97416ea76a0242c8134e3597fbd26adfa41e891f723b1fad9fa4389885159242263fedafa93f34ce4cb60cc095da4027684d14e57a32493bfa8a1357c05e1c38d89e12c3a19c0f31e909bb95c276dc6e1f34d2d01bbe419b07b94eff1958d23243c8810467b13bc377053ee9a0bd9ac1e2e5c187e496dc04cf7bf418aa3bc194097eabc7b3d84284c76f3743dfc5295c8c3c96bf563775e45dac446f2169252877a7e306238eb2b274c347232c5050fdde400f91f8f4a0a7b9c0cd0cda0853aad4400652b4e87d9d77a86261dec55f102843221fef37187e2900ce88efd7cbe24938cd0f4409c1a6306b0bc98dd63d40c768f33774343300064faac03f953497387e091ac5ac2827b9bd276dccb7029e77b0f78e85b4b3222158282d2edcc3b8be3206af209bb0247b21cae6fc10d094496b14067c86fb88f77c72933056417748ff79f275863f2ef68de0a5fdfb5411d0c82f49c9bb960ac199ee064f65aaa498ca1f17fb726a6db01d6c02b2d88ee43dd87d5495bb1fd833beaf9335379ac8db0dc9c46610b2db47aff3771981e4bff20ae90a06dd90edc378b5b8b2b109f5e95c99ee5cd0deb12bd14a5aec05cafbd60d9c9ed6752fc14915df12a480ca5ff354951dbf2974323e350b3ad04439492faee81bf3edac0ad3ebe148a52dcec2025f018f58c182dc00d93ebf04b3e32e8df1c9194a393d8383d9d2779cf9e18732b728886a4f08859a367659aa2e50de0b5f53523fb4974cd650c56c93e21214d11615615ea0658ec61812eac81b08713dce9a4519ed9cf9ebc873f4980816d0a4bdc5c04bf3cc6a80cc51c69f4582c78c13ca4be9abc0974582549bc6fc9fda9334b8b8fb11a38185a080b7a55633e71c8ffc8155dec1fb0834f5d6453d0769ac0961474c34e3b33414ce6b1a4bd43ef10b3247ec2a8c7fba3acd3b83398fa9c969b510ee009cfa34da04ddbc5be55770805a10137dba9603d4a796e1b3db6a05e72544f76e30ceb00a1d23de9f5783939e59f0b0bc7f380e35bae47cce83883be74c09eb519ce08820d273fdb7a8dcc7766d3e92df6fa839ce8083ea3833993a4da01cf819b94317de50212470bc8de7a1ba39b7bc27677cf015233187948258686bd4d02ec13627a835a7f1be5c1bbbfc629082a998c22b3ab35115bbb26e44c1049e3890b4afd36c2a1d06d5834a384dd90b5c975250a9ad38fd61375091c577cb27ec478dea7de2b9e3c9ee51442aa5ae8fa1206fed5ce098f484c5af72c71a735e7a97bcc10ecadc4f8c1eee1b34cc7f5d01ca189da220222fdafb70c9d24aa3d9176cd29ac4a5519a2586f9d45fd120ded6a5f2c07f0d2fb5cbbaf61645ddedf593b6f28f6ba9b58ca9b0939e9342cba451144006ec0ac001f7a4f3258faafba09c95a0446d2c31787e7f7548adf93025934cdeed086b35396f6858cf3759d0add1f77e4bf6073409c92e0d7712dd128622bf3a1b4f8a218b0d4e19f5888cd4bd2ce8bfa1a5d7c929ce0536315f226d09b26ca11eac92861b417c10062c1bf3a23437c1b66183e83165abdd4e00e4975fd4ab71752460b71cc211f1b3abec8031041e5c41c6031d0600a3aa9673a2ec543ba80bc210654478f1760b4da4adfecbeed3c490019510cf84e3803a51586a618fb8a4aa4561619ccaea87506119e2c6da9e210c025da9f4265d6e7a55a4ca2c2a75dccba885a6c134241bb1831fa9a79fbbb930c7a270f1a2743088f2003bf5086ff1f0d704c0e81ed8863731fc06ccf4d78050a51d174f90002b386b5bc464daa1abd557188b962091b8e0b76d5d0c1735b24f369fd579d61af585555b25edea1e2e4cfeb989b7c58885db117ed46a5f66ce2f0ab22dbd33fe0435a0b32de5a962754be24244882988eab27e664336b4255ea6149317eafc16671b6d1c415cc1a8cb4a13bd687b2c49af6a240a6ff8c54bb618e4ef88508023c6c1a7b70d3395e0c9c3856d1d8e2079caf46e8ea311499b9b71b4784b461d3ed515656846489fb6362972aec77f7ede65dc629c1f113d0c5db23ccbfa16ccb633e770486b33fae876d5fc01d736177bea800e1d49096a8c52078079d5fd438eaf3eb1106372b567bd8f5d5fb0216771d0f7f1dab8f1afe7db1d21c6fdbd3b4563dd750f3a7587cc9c85e20d3d2d1742756fcc8e7ca2f46455d7fdaaef8b3d54fb39aa8c6bc6e752a37e424ece23c73d80694e1e9f393ab1660f7d200976aa8e9554b4b84c1b80e3dd4d8a5431d12f550e773bb7a6c6cbb4b4dbfa2e83e1cdc69cb2a0507a0693225e0be3fbc13b76d70ef22abb013714e52bb8f657f7bf3f66138f920660d6c5bfbc12de219bb1933e55ec67f71f4f0d7e8ed74cc24082a8fb24722d067985df958f522216e213fee09fd04b833454b6cec75096d0ab8d7a7671800cc45097be615ae4ef2e196ef37abc0660ce5e5f01321bd71b93fa060f41316f89edc539dee37f65894bb4f70a444043ee8704eab6ff61a586a477ee3fddeb77eb15a755ef58e63cdb55aac127d172628966fd70666352abcd5bfe5547e04be19b83293c2a58dfbad18b3acb4e5ae21dd2f4f2ee5f8108a6053aa2076635634f07613ad22841833b1ba1df1389f30cfdf56b6a1f8a6d1d1424d80633839fed2afd77f89f6101686493724750c657999fbf8917b697284178bc15b40f416f2b9e046bd9c7cb07f845e47bcaf70b7b15a2c785122bcbef6da6ea041ce8da8376ad53d6766d33606d7beaf795bec9e40b9b88773477a4fd3789bbdcaf20705fd5e664edbee0dd449db381f1a384f8d0b384ea7bec348ce27d9e9796ac8dc3536ae6966b57fce47d2f0aef80e0932ff11734ab9d8a14c46bcc844ae30ba0a2da6d84cbf1c45c6bd6b6ea4b3219fd832f71b66629c75321ab4e0ade6e720deca0c0f5f21f2abc8a00dbec5b570b2a68b2a6dcb51cfa28fbb40f128a495a80abf3e745321f63489cb50ae4940e28f0266a8d07b1f23e05cf7064c271fd5158051c9106c737aaba60b5573bd759096a828b9ba180b3798af10c18545cf6937d64d67cb2a68f1af2d6aaf52e4bbfe5872d38cab7fdeb70671de9009e1ead71f33a84386026471f39c45d97f6b66612aeabf5867889a7b9f262fd3278a92b9cee6ca57b314b0104d0d4e5ef54493476e2736a931be82b604ccb58018497e8d075d0a9ac564deb57825db08a957da742f1ab993f26ca83966d84d69b97fd2776946a9cd0c3053d1e913e815ad6bf4f5484e96f1085888a00376c9387f837c93e9e58aea6e54268aca38c81b591e063a16d49e9df07c26270af470959aa7e760b3d9376ab365b13e424333929602ebac8444adc08a396b66c74a074370266f5249e4640accf7380bc85346fb17ac4b01ef36587e46c6326f6e1fa0d663a1dbf9f0a307e6204c155d8c2fc72a8ea2fb1d1624f8f0a06c93700e885f1351215e3b02eec6b2db8bd2210f1be2b0b3b1c2ef829ab7826a6910a02c09ec26df8268043eba0d8c6332e92db0693e1ec1a8947f319635e598cfb7a4b18595f23d0420040f67e38568c9ca0d376652df5d2698b8b50677e2805fec83a59e51689e3b3706ece57cd78b82704829bb11e8213b7956fc5c16a96ae1663b4c9f5b29c29044fdc390990b71dc98dcd6872ba58da01a6fd7dfbab98c0ebb888817514844f8b008344b292eeb7c2b9f9e143224ad29953ea4dab2d9f7065551f80a0e233d134d144c909d95e1d341218c86558e177f3a0783bb0fa58bc11e0fae43efd67ef812d2412aa137a7cd8189860ffee595afd8c7f45c694d83d74508f1ade71ac735de5198e19a42ae36e65e63e6aecd6799f53599c871ddf2d1b59ef53f32b0db139c3887038f4a04395ecc02e19eb399e35d7e379bb4c71495c7efcdac6ff4048538c1c4bbf5a60a5dfb653eefd3bdee2f7cc0ea56fcd16cfbc1f2d87ac07ade205a0b8867625665898842434bc4985e731e263aef5cced64692eb58969147c5254a41c95928f5693fa0ea37173521102842ea1533100a55edb73f7d88ead6d9c0b0ea5747164336414ec689df93b53bee0fe32fc90577a91dda819541c54623a21db3b39db22664c7d6c812a190a9ef79ca77fafbb24f59bdf93dd9105863a934128f5cd417e515446e14c1c56464457d00ec8dfed44f50f54485a05b0aee00d8f696f5c900b311db03d05e5656ba306f6a5c8f26605a21f49a458f82e57257eea15b7b6e6a3ad3bce6354c697549281cc2aadf15819fc11c7871e44fa86c5c9399653a18f21dfb95e6defd189b769628987ff9e32606d5998d5bab2733af001c5370035f745fdb74a60af86542da760af5344000be69a760f8b3293cfbeb6c55faa380b4fea351e077abbfb96ae14ad5fef5c4b30c45f8ea29d343d6ce8205b96485356f484c2ef5afa60f11b0e840f43e00d198238df422f3b2e46a2caf8ea29f15bf82b02f97f33eec125d68eefcacd7e70cd66129760ee8a697417c52623b56cf83954c229e710f36e9f8d7de124a0d15d06f02d692a94eae1a409067cecbcf7400c7fef9c69feada60a1888921179b49e100413aa815adca5e993eaf9f0aa4f4f24d45803f9838e6d8061417f31ebb274cfc5bfcc6bbe21bd4be21be37d10169170f56c8d74a7ee016f73feef72c0b9954d94961b7b43d5b2b4268e3294a61d682afb10c0b4fe41f88c4498d4a82f70c04b8e0ce7117f76364f791e2bedce25881fd255935b713c8314b40738fbd92cd766f71da34c5b1d56a334da356d9b22d570d46f6c8a6448b6b1bb8a2d38e04f01f531ba71323dcdf877c89ce2f8b2bd2a3f158fb41263d239adb3527758c4ca2f06827d8dfa55439c80510cdeb44a258f1c35286e46aa366c938fc8c879364c3ec712169e7f9d9416c724b6921a77c8f5c39cd6c99a49abca549bdeb57a22a6abc4f92b8efdbd19242026860351d7d91e5913c47e23238689a396cc37da583b08c9790aadd5851799588cf9df823793f231b8b6d0fba53bcd2aa2ae402d8d29c7a9b3b4f979d9015745a0486d51e3a9d1fba0180e343606c7ae1a3ef8ee0038e9e42ee235fa8abb60c4cd119943b05769645a746a6b4da666ebc4015d247ae4b1cb6df7b9d8144e48075710a651d9629f9ced80694cac27439b8efe893e0b36ed028597c18dbbea1e99814f758d2d8937326cb15127f77dd645cd0c51221c06e27e6c8b199a2302e055e3ecda89618123453c3e4d75baee01623cdf9f1a1ab73011e61a402b4a543baeae1fb3a69f4fd84a663dc043edd9b3850b8ae8b37a49212fc494df40edd55a23b06c586e91b54a855ff9aba9171b68d83170e1ab444bec0102676647677b02e6acf6fd4bd2f1b1a413b04a9a4aa2f66eaf02b7a547e57b8ddbba0d3d9c7dfeaa5a55a48144c91d8e35439dd5de157915b4b7bd1290540c84539792f8e69146bcfaca77d20ef08f5208f6bd4365df0dbe8161516bb887b5be90f114d9761c9ead0458801f31431905a1be6a13df39e8c66e158f544a03e97b4a95228ece14a20a474c36663b854403910ae849a36157b73eabdac98ee448a1e8df7052bfd6a47e194dfe1c8f92178d81816514a0ed38436c6b2f33840c2c164bf202653ea586441d5aa4530b76e1758550f348e57f64f4470f3653211ada33d2d1e504719297354c2c20e4159d4eb70d2d60398896b160369a4bcdb60a5b22e1c838bafd8098298131a8558685e1de86210a4bab8e532b21004ba150c9f4b5fcf676907520887460e4c1b903ad9f4e70973459804a627a54cf5929e0d76c532b5a3cda6ae738a2c8875f22e66c468bbfebf9af2928ed82319bb74d4b58dd8dee571f1924a9aab06cf769562f18e208919fdc991e3cfb4743d2284bbf6e394b8e963c530729bfb9db8bc0c8ca650f202f05631a8b600e64e917d812158cc0d20c7c6f12db8ff152a5d39959920b83ef615f47a0f4080b0bb77792476481733562cf8fb358488e80a2baab4a0ad684675dc3ebd7eee840c3c21c0830d991475ee8ee0283720623f9d0411a173e5b63fe37e2442193b12887e9e92871cbb989e5b83e8d363848ef53b977a12803db1186950fa14ba422777a71c86916a92ed9e72cdb49701b2d7f9530966f0564a7c76d0f3573a887aee7f321d23e7e82b307570e4c85272a885d52788fd34ad28617ade5c6a14ed1b85d22bcb7e0b879f43efca082600fb51e791867a94e1d06f8b759e8d8469e145528011535567f09fce1fd43f089ebd5f546fb8c4f6383b48e7baa4ab05e9dda53a2e2666a90199079e03bab1707315a4825d26587582bc8aeae8bd18aee3e4219f2f64504e4b5b02d0cee8c5e6b92c34d93adc3ad73675c7a8ef426accec9c30704030fe8750e6b39c4f8d277574ea9c2f2cf6c3eb3e222838bfc8d079a4d60ec00140672ec980cf49a37d8693ea9e907ef3359a10a05790e52e4027e6712b91d0c5cff565cebf044555d0828cd49adb5fe3cf725655395b0b8403d75a04a9be183787c48c82fa6903b30a4059a9fc9bfd3c080aee184e3b11fa594d3b31c9e5121733491cb9e345aad54cb8e673a58e30a6ecc3842fa9e2a12fb07b1016ca1ece02a6dff0cb126c8d9a9b151694b596a94230ea1f9c529e4d15014ed53fd1b3273599cf8492c7546e70f4f1e806fc14fdc48d9c65f22611d58448d7039bc7b5b465960925071880463486226337a97199823290b718f1d9cd4be47bf2aa036a1fd9574d91eb04514a2ae03e24363289d231ad2d1346cb0e43d4b386e53636f565fc90497254c79721af03c9c9a1083cdbe5ef6ae08582778f074dcdf12f2e90ebd2171599b39deb71b452e0930e07df04255726c149e37b2658939a03768bf3013c577929585cd31235d45b37b41da1ca6ea0bbbb8f5c5ad7d7823ab85143b1cd99e13c70625b3b843fe9ef256aa891d52a481ec605294eb11b7fd3f5a83e83e04bae04664ac9fbfde814695a84afa96c68def91cc1542ea1443ed3ea49c8e207546fb287e928bd62c6a093148880fe5471050caccf7409e1dcb4bf7500e8323c532e33452d85fc491f7cd9b297e52034a6a3a789ac964d24c1863f28d28c3124e4175adaae69805d6f8e2185890d12f13b3416ac25cceba0f484d02aaef696adefde892b5f9a5f7bcc2ee5f76c387adcdae2264eff859bd45b7f7ef4e5fda9edbf7e56856c4de55149bcc8a8fd00bc204e04b51753e1bc99b14ebcfdd7657665301f1c6411f5334a4a140f62d96675a09a2036548f3b8fe3a1a83f1da60bdd3cdf32d98e135b29c5df729eed408ce16b87ed1225da5319e535cb0b113b77ca74ebc5f3e3d86ff1cc0a14e33052b5021dd8559f025aa892921bffbd9bf72ef82cb564d76fb2783e85652b4c28849e02a998d2ad3c4bcd1d6a85e9e685218a0ea218357b3024ea6880c7f2ab3a7eef4c567c753834e049d3aa1d07222768522ed1a3953d0084ce3524a8b384ea2139c0228a3a1dc900b6cfd9e8bdda49b58136b16be42e155918fdbe34baa9447156050b595d8385381feee3fffc087af2d681d5e08b5707f21447854de13b66f3bc6888ba5762a9fb238ccb7945bf61a65da6a625af18b145d4dd30a7a1c5c7052a59c302b988a23e4e1b41efb5b5c0e99812c5eb32546c0fb866b65c404352c6ac8a5f65bedbcbd641a03ddba9c2f1f5e35424e081db9b43b3aa42a6657f205a0017cae40a30c6e8de62d9af39255b2e9e942049ec6a598edae753e2a93f176a508266c34b2503467a54e7e73f5dfae00d3e53de134dc8089f9e588342a2c0ced372725b4820236af939ee20178e8b6b1d916159a6e4e420285f693e89a441f05d3f08b804d8a69ae07be47195f10fc1bd8a15113235aed4afe07b89c3f3f18d193387df0001665a8b0e9ddfd7d18e6be18812cddfc125323db50b5434554a61c1a91f2b74c4f3cc5049ee504a5cad8a42b54011d8e53dd910c76946b4893371b33e6cc5e3ccbbe6d06abd5e6cdd89cb4d2f67b83ffc71c16def351b3e3299313efc722d9fa296999548381349656fba3951c591be8a592fe638a420771ad340fae305068d6a81a0654bb1db92d4de64c6881a2850a8f992a755c1a5bb79c15bf4e5dc1fe9adc9372f2e2d819f12bac1bb42361ba96e2eebb01b8ed083ec24f9fbd93e4f6b3873f7ca3486cb26fcc9b103445376c7c1bd0413b7752b501d251ece27cffcfe610287ef90984afa736e6af051e0ee26089049b3c0e8a5cee45239177efa7c6eab5a7c490dd71f61dfa3211b1448681facfbd964159e9c1beb1521f4e46e08104b6803324b7dc9054f1a2d059cebbaa20aed68996066ed338e84e7923b5f70d19d923ce3654453a07c858b736389f677b3a78c722dd1a11a6ec1003dcce694c46321f3907417f44c71efcc6c197a908c90fa2316654d2803e30ccbd1a8ea1856873df73cbcb308c16015bb7f0b64cf69cc871df8345bab1d6a886140046537a03c330b3f7eb8c64665b769705fff5f258f8ef70cb6eb570051f3b35ac3c302181c44188b8ae9dc6e83e04964e3f0806ca285bce184fa9748636fb41848eff416a3ebd401628eb207479ad05492e3cf17474a778208fe2f15376fc155d50b2d9e9522f698d811d681da07e5b612ef828e789e38fb3f38d4dd5e93ba647cdd7bbffed57bc8a8fc04ebb6661494588d04f5a9036c981ec51f30c8e9ada08f212d1e2588c5141fe176b87a1ba9bf69566d4ca7e35fb50665cc25eb591804b855d64891b300f8fb9b053d3bc944bea020a70066a7e1896493dab23b4994ed807030eac726d4a57a6e740d73f2ab25ac3a638f8935e3b0f139d79141a4ff4de61ab5aeaffb3cab8b23db5584b52b7d0c3cf9a447ece35dfe7532a72d4da07af49f7d3139ee77d3046d9dca583c4278abb3057ea83369f74993aaf3a70f542a1fb5a5f0b6a69a3aa6909510a8bfb6950947f3907457a2848de9fe3466bbb5ac221d5ed570e8b922b9a836033ace71f490e31582b09fa07d04aed7a8d6ae73e2799f2841b090d66adae48502a04c199802c99b5fc93c73626a7a380b77ebe99efb57ed25ea0f0c673ec981c0268d905b46aedb78992692d2a3dd32830cb9be647e970c0b8dae0d41473b27a654284d223b394f534bb3ee3c99e89d6caa83e734b4566e55ae690edf36e0ca6462b2abeac6e93d1fd9b8daa3b2dcc84f67eb1dc58c5c8d1098a7e7b728d901cc1034a0adf86debeaf7bea622e2d965e9869e55d2961ca8137672fd40f3e27d512daf88b4789abaef84f0025d2e90fe6ee24104e74563e50d18950d4d99426d322bc641e876f8073f724968e6a673960d22e0426e301b0da0230dfb38091cf8ba3eba13a519c4eacb03adb0d93ba6ecdf53a31cb6dbd6499be93fba3b71ce74efcdf1fc27779214383ef4a8cae0dfa857d33b2255ef3095eb30c99a17ff0f40936853f3a7b234d15ba1e2ca0984eda3e86e462d129065130c85f3f2d7a7bd3579e94c32b05fcc31c18e32eb0c9b932a14db05082f38f8464a710d2ac8cb04060069823c4b481bb4342ce09839002767f2b4eb107089ae08cc79693ac8b9784575cfb389d504f69f2709e3adaf94283e6a0fccc54fbee86e037e5d91df99cc985263f5e2d372932361278a44f9b5c05d1d921a179310d11f54e2628421ec8d80dc47759a388552ac61a82b22a2124590c35952f35ef48b6e871146dc272b1080c96ad8a39c4d4bd9f026b6a77403bc8ed59c85deb70758f3fd2561646af63ff55a0047639311353cd3737c8c2f2bb6a3f5f87d963923e7c51449256d97bfaad3b12432c7cc8b09d8a18e8c80aa21b86d9d345e0e4a51f65e3b1c35fad73d7ade83c8579948e7fab3fdfa2cba7f9d3f7eeea0c66f8759dedc25a86f27b6233496b5d61bc1c4248ac9f58afc6323d679a7d7cf82917b2fedd6dfde4ff33ef342b7e31b9e18027d01e7148f0cdabc9f8a1b012ab786a16e37a2b0ebefde8dae56a04573d4f26968cf5c5cb756a08ed9ab77b69f17c93bc2c927cf9ead5dda92afe8ef357aacb37f462ec49b6ebc87dc6d8c83c604cf121907cc69303f3ea43eae3fea84e00d50d8e4a53526db0ce9aa217842c840ebe167fccc09180fc47287b04a59bc59af8abd63a276793a663073b73e9d2afc8df62ccc8008a5d01e0bcd792a52cd5a6a0622a4ddfbd6c55ad4043bd421d9248ccfd21798edac439284233e37e243c70e37798c68e695af98234b07757d28e3b1f06c632f8af1bd386a70ce65b25b076d1730e79eb5d0015540c151229518328c1b05d55492694cc3dba79945684e9a9cd266b97dceaef479c614ef1866cb6f0f907ff8d3547e63671c1064f9c436ebe4edd8b42c30b4c8997d3b570d5f29ed363663e3fcc3ed801dc6994abe2bf32b8f8958c5dccdf65f03aaaabd446a9688f63cd558fd903c33dfef3c3d474a575954cf84d9d92bd476e07c2e7aa03587c13830b25b24d541cc7e887aed994ef8aed84986e68044c13fcdf1fb7fb82eb00c1653fb7501723c0b3dea4e8d5eaad084819469a3d766c4023d1a39317d0db7e98fdde5e92bfb3a087492417ea11da8c03ff4da6522d7b90b4b7d715d79a56291968dc1d89b55abdc2e62ef490d8de3ff3f084c5b8b3393039b6fa9649dc2d413054eb89a9db3143bc1d3f8523f3c52174e5e45da28782cda18bbe917016d75282cf0be66cd0e25019085f2895aede18933ade4b5c82f731f65760cf57f611411a8dc9e741914b0af555ffbfab07d218badd1a273cd60014e1a8d0529387a957703bf415ea5a0404d04f1e4038b71a96ae4f2983e0b4eae0e61617238abbdd0d58dfe5cbdb04e4a44c17d6878520793d4a8cfa7181c9d39cb82da420e215f6b9dd1bd3fde2c14655c1ac8761a50555c401676cbf8d66bf4f2ef4ea5582c5cedfc517e6dfc38b870030cf22edc02f747b8db7e01180230267de73827f91466929eba2f6e639350ddb032ec8efc05cb700504b5f3685a31e4aa8250ed8ce95bf7656ba76fc0e15f1f044788f30fb23af0f024a8e55e12f0a27139a1092c3e6f8391bac12795cf464b4f770caeb1aeed7333ae7a958b7ece547178190c97dca3540533e827fa1574c39daff81b7d16575c57eae3b450fd9983e1698b74de5004b8e5fe8ba7b27515277fa7687272601b286e9a22d2ad8c798ab4cbee73ae3289188e430644d75c61c8e295eff1622ff9c13c6e7bbb75f9f58d5733660c8f1c63b96e3ca25eb312c9ead43569219a6b17b75a3b25dc62070ddfd410459a747f61e78149df35a9f9c1c5cf2114be11e8d5c9bfde48caee0a77c576e95afd581b9cf35f0f7d8f130a6d0db70e538bbbe1fc90816422ec6633750cb231113d9ba4bf5f840185ff649342c2304c96beaf6844a213689bd49a5c1ba06585d94b234fb8c33147eb78e2da1c70f58eeab690761ca585f38367c29da3d798500b475be0fc4db8cd3a63f82fd64c5c70e3d67ecad8a641c1cd1fdc225434dc1bd582f620936fd1800ea131c3605933631e65492c57160b88b2a236ee7e57cccaf776d262759ca5aac33beb1bee1eeffe8b5d48480790d1cde7febbb8920a9fd09cf9705d258d9ed4db060742cfa2b208583ae115d401e9747816d3ad3ee1ea61d588e19ddfa32692353c1214ecfc585889da786295a9bb99107d94d8802cbcfb388191980ba322412448b25d93ffdee84f46b849dfdd1b5dc5b9ccd4595db32d7f475d03570dc4a7ef55f23d027beabc51dd896966a47a2129df7cec457e55efb44bc0cc6a81217eb823609a0bb727cb9c4b48e9eb7d28d8643cee32f77082c87dce58ff003cd3002eadce30c223fe30d90c308a9ba5c852d113243825cd9f54f2a5572e805ab2197e836ffe31bd9a8ac15592f3f22dc502cb1b9b4e0ca872c0049a0b9eff4cdf42ab45ab50037bf5c91435a9b5158ab52e377f7ffa2c575d81dde751261c3143128881bd163b6ef694ef5837e10bdbb09408bc9fbf15c4e86a2c095a90477aeff26b5cab2c941de48b9fe5fcaf84d43872d8880f7c680fc7b32958832db086e8686d0c75ecd800ea3eace6bacd8259b2ab52dec8412a580b3eae5d2739d673b2ebcf803f8d528232db11423146a58618934070f27bfc8cb3be7cb49b3841a4717fcabf691a3fd26339dbdf79ab63c86d0c21981730bb04686bdfa41344a68472a32babb982f792ac360bbfc575fd536595d1d4fb52ca726e404250a75380cae4292383e28ed987f703d8e2941a9cf51162e8e800a2a50acdbe810bc8ea9aac7e34a2cd24bb272e8eec0ec0e3b294bf22999403817954cdf9e095a67a41feb6faf83ee212b73cdc4d5d4d08b84464369dde77f77c95ac414a8b1907826a086dec7ffdd6a703c5f926c0105e54e7a66767bb73eedc06744e597d684bca8c17c2db3e551e73fb2de81f919570800a2da86ce80fd09461bfe48e5b2f4dbd8a1047997fdcdd1c84f08038a7c595760bf780b64daadf454f7736237a3f24f14e2fd8c5e4d8ae429ad449728702a27f3ac94c459403bf5f6539c1aeea3e561963717dfdfea3902f23d18f878a3b8ad4be82b657cfaf1a6243b190254d4a16ad9e8df14a7e187a945815030de546a8d67bb8c20e6452ad0a273de3713823d3cfd5be8f1c729d4bd6662a99e9027c58d36e3e44d13b688f3484971200dbbd93332a7bc6b962036f82aef874c4cfee1df92fca94dbe5193589f2441f427c066072f07bc0724478a98fcf304657363b38672b45830f9f03ffce55833c0623856b8cb01ee5c433a414cbcd4226b807ec6dfbaae5d55fda2e1b5a4d9c37fcc4db597d9ee8dc6e8121cfd8c5843abf845b64d96dd75a3e76740c5321543d62d7a228709a40523e40a32eb49f8833c8b10b05bae0a8701da98ab09a8c4eae4a2ac06348659ca66a3e939ff77653ae0d838c627723565f96954972cf30971a5ee63f2fa6bfb6c86cef008db31f3a362b94626e882e157d757b464d6832c584086e5b2531a5f2733c59a55a5c8826d41d9f7c0e2ebe3124dea3e0443838e30c20551f051ef0c68b7b5ace5b01dd65190eaa87fee096a4108bccbfb8fd94b39225e0b3481f3025813ad0a2012d7e97a6d45dd8c19847eeb3dd7c56c635ef819c67ff12516f6a51cff0167bd9156f3b702345aba305e757e379c18ab85ca697810d863d6b3a267c74bdf3adbae7352d4ac4b464c8b412be058b993d67df575cb4a1f14bd3b6ac57e9a5844275a2733cd84d4755eee0d1a59781bbdcae182b8a33d6ec97482703faf65ca3cbe0f517134b3d024303ff5dd941606e226bbd75276be69bee80ef8b523df1c6d1c1544dcb4d8abe4dc1c653f81a3d0af5bee16ee9cbb7e0440680917eeec4267f18f5560dc7beb69f47a116da2f9cd604b39ce8a3766230d3e5a202371aa4e8e647291fbccf5efad053a8a5f9f2eb8c3099cc8208469f7fd86267656270d67c86734e8f228ed40059ddb6a12f791d442a3707ecd9c8be2172836bc6647ed521069f120995ab0953ac0dded651c09c5245c87868a3158016b32052382e1f2b58928c9278060137a311785debee0d2c4fca26719b138da0a7ef9c48f9fe7d2c7a66dba5535dbe4ad61df4fee899c10fe6898b7fba599741a14fabbff7625aaff29cd92d5890cbb6cc703b8d237a3a553cdf3be9dd788a847f7dbdf412eaf5bc80618e8168043b0a268c87b7402f38a525349263608258b30d8c93f1aa6be1bdaf26d4efa3e1fc0a1cc0483f20ecb603ba05492152fb35d1a897a6c9f020d2a5008d4b7240c691be4932d88dc3c48c4e3f003963428a475a5d9ec81ca7dca9dc5e61cac82ea0a78c1fab08c1c0e7d0b0d038f0ae87f478fe9e22b17e1b8104408fa4cc12f83a06098f46238980822a3ee090ddf27d72230c619ee32db2582f9eb32961c5eca7a0bf306eb3360b52285d18c595e5217d8d1e74408f8daec8ef7dbfeb3973b80f3a2e9da57119a2eaf3558136ef73401f3ead3506fff4b59fa16c0fb04045f01c767095f2321536db5ded33cbc1cfeeb63004a1455539bf04afcd7516e6dbc0c519ebde0714a780051e4ae1e6c686e283eb91038c22444fc6d6ba8604f2e8dc5f510e0bb46a7f321befbc39b99f634470b68879df53ddf231540c0a152b1fe923da80d8d4c7fde0e1ef931689353a3a9d16aa05fbae382b4e297015fd7ae1fea01ee549c8f44efbec6d61f77aa48e36e0eef12636d0ba8443e17be97ce978505fb1534a81049f1015caa6ee4de4aaeda653ace9b055666d1e2cce142740c0db6c5b39320cd1cacec0ab08f0a19e43efe0e15a2528dbd5caed599b7e179b2c64ee2078e71efe2b413afba5601968a25f9978c9d3f334a26e441f7cd97676fa0ec79182cf68e827339f8b7437eca8451496068e5eb2965b7b83736365d9709d0cb1501df79d6bc647cfad00fbd80d6df064f937c74ffb080d96a75e932514a471c33c66a79e1b574fa5d8e7a44cc46086e62a20dd509d68da5140a64fcdd1042a0b92ea90a86120dd3569a5ef12ae8b7d53da52e9e5b2a2dafd599018ee533b26e2c68bcb62bf2850481d4d1f1251b032f8717e73d5bcc2ac029164690b8916a17eb212a10138b78852903da21822e96f7d85b1be1dfc932f4541ea42d9672e0215a771eff6f2137f186d393bdd523a16b591350f6223d9578373382abdce93a1ab3401fbaad600966d7df1f84f844b630dc699372f1d4082fd7447f78107359ff9c74f32bde935addfec09fbf571c10f02ca5a33a9d0fe5ccff9fb778b5b328e4202a0c5ed5e46aa8b6a903229666413913b0d99046e9b8a5546e08400c12050c9fcde62aff10cd4964864769c3ade75cce5272f0d8331c5828c21c1e8a4b28f9620f9ba735683777f7643d0d213e670cfd5efbb6cd6589a440f00c31e0cdbefe488f61c83c4d1533294512a1f1707948c1ff762e3c3905374f0c8a08b14dc41048529a72e47bc977ee20a4e31fad60e0f097859b7b07189bf3b9e1f345aee7cc5e41481794734e6214dd4817b9283bdf9933e6757467e8e226d5c08914c2225b3b4682a979197eb4c6066afff018056f0ae2f93e5116b175ddb248d54de3c03b65cd5d848090bc5a6e71f6a76b74830ea86fcd33ac9e7d662ccceb225e604e588695d70e06261ac2c6935dfb46f06c0e2c3a65d94e08692da5680829e9bf03d8efcb6604b809397087e76a9f711bcfcdf3d36b61d644f438cfc700a8038b747db2ae2291981930d7488520cc4de9bf873286b1f87679626f2999ff5765b930b4e593ff2b651e2398d40e2bdbc5363054f215b35aae7e536be7cdef31c7537391fc39bacf2fc1f1540e716ec05ae199aead24e0b07dfa4786062b8e1398b5f146f5fbc8e10fd4cdeeefaad63547ed33c113b1a1ba83bed50fd98963b81a0e1e0373e393c4c2cb47c268be5997505e709097d2171227ab0eb200bb155399a0873cb9236dc8aa2ebc452ef27a376644f92633209e74c98870695eb73235f700031ab7b31c969abc0b9c28a9e493e44157cc033a85fc19bbf0f899e8a79f86ccd0b3bfaef9c0a876ea7776cf8bb582bd57dbcf60ab8e256a39c2ce6d68bca4db980d8ee553cdf8ab7229f1a00bb920b4d5409aad2f1e98208adf2773ef1608c55a692c6ed4c28320f489a0bf8c8c00d3e5114b66ec45239574717b804e5b0326d89d9ebbb5395772571dbf196e7eb8020ef8907978070ab29f3e517fb53ca29fb4162c6373f4efad1b81ab134c52a8d15c062ba70cc6d6a90e20bc8abb951081d5c0431b7ee5d4b7c8c253c1994cdd7fd91ce344a3026aee56acd3e7023a0f1d7c1497a7639c12feb94aa9f3db8207e53e8c320cdabbbaf59ba3c53f5ef3b0bab2977f05aaed95cd650045e58f0e06ad7672ce207646dfd24b130d696a7a7558a9ec1ddc277221a42b8a31a3c7582e510a2bea76a60c8a88b1c99f8773d179ac18f029998b8b7b19d9f112402f9a73efa8d07ee38facf2529784480e8097433e245032e6c4c1222b42e7e9c7d8d22caaaed7b288253dade7aa468b7c3e797c1981c02788419a16125c83d160ab40cf9981834ebe37a62b0c88b6131ec1db50c79c7a962f33f25043c10e4e46ddc46be119c415e8f0a99c21b0f771554640e0267ab9a26a077ab2a534f983bdb2520ffba0e47e1f27cf9b86e2e83d26c7093af62ef4a30d1501292faf86a547fbacdabc749c44c73ff4d0c15d66c9953112d29f950b5f1490dc138d7d2f9a212bc766ce4b69119f02aadf94602e737235a71de8f696f30dc960805474203e4960e372a8544dd5bf6d2c8f06a1737e27d376850b7d45a7d6f1bc8f4c81f6ba9b67e4b852c2f0253c24703427c3ea588fda06a1c5ddb4c663d5060f6a21d58ed06995fe8adf7fa0ecd5697b09ae257350fd7cad97a022d12fb8e80d5289e20974e415e8a56cfef5db7f7abc6c4bca8184e4f3d9d1c175a8a7e664aa61d4e18b44254a2b6b135e5974fccdc74701e4b306edd8764749ae8486449ddf453a1aed8aea93a5db4f7928feb0b2b29f348fee3def7869fde16966a692ff181c5b6cf6e3e872a076a56dfb0c93d5343d0a78c70683444afc3ce257e339d1308f819e53e21e02175b3ddb79ae86e19d784dc8a9d8a3d02bba4b8445302e2b62c95108a884fb6f74ea5a57fb9db6dade93258787ced0b87a22d478fc5142da9d9ebad5a40ccafd39a02bf9df1c64accbae8be370b52f74d773f45a43d0b218e950716104c406ea5df4f1e27911454c06ae95bd104e3bcd085dee0dd1f1bb58cf99c30fd639ab02634f02c9bc71899d8dc38ff3a38ea22841c1eae67b39974e8e0a37325dc0189e0ed4a1a24e57a3c17f17d09c603931b8ad641541a4fed5689883c45266f5777b2114ff053b7f10c5591e8e9e7d72b16aa4d94ddd18cbcaacc0da97e93481771011aa2ee9b8d0d222b92bf6d13848799484da7ea60415d07f00de2bc58e79fe7acf0f1b7cc54e8f075086f3052700bae937e5aaacd0e0fd21b1270fc4a1f6b60f15abc235c91637d9f1bd85d2c13d29f5566e8caffadbf7312935f33b59647bee86fdbabacd8351409f84373b91626b4ce7fd3dc7ed3c110144dbd67757c6699391423234d92e42662f28ed60127339f037377656250a3dea25a6b02ac1f4888e80c90e5ffa4533073549e92505ae764a04f7d502c24f4159367076b5d9f5a267a24ea9fb0ff4e1c283c6f0481ec5f6f980ab2801dc076e487b7dcfac739ce18ef6f5b9c7690ab5d1d439ad22ffe49e470c8d8f4e0c23ae85887432b3e9d2fd81c41c47d69c88fcf60afafbaf00645b9c4d71c6e22ee1613df283fdbbde5542f0a43afbcc88e343a19299e2f40d014d259ce1f510c2febf43db12609937d93fc1981b4ac612565c3685e175b2aab2c178602ecc9c8c8dcf5823b7353d65c46631751c94f8be278c987e8c2405044373851ec85a30fa8569935a79cb2c523e3edb6e82d3f019fcd9630d80fc0c8ff95dd76b589a6b08dc4fcbccc4feed1601bdc8380b9450a6e45d08595a3623d0bc4cc647e718973c3110897026d85b4a88b6e06de5c7bd33fbc2b19d402b44860984e865f1591ea38d497b700f6f3c18126d8a72edd39fbc1d86a56fb023b370fb668d99d2b6fc0e46486dc5d7a86d126e98fdd8072f6626ba8a7517dde91a2d71ae14a5fe708d6a80c76a7b17e5feb0a6d191035703f4bd2e3cce4d08a129417030dbc809af8d96c464180c827227738273b537cf4493383941fe3bcc8cda7744aeae30100d4b6ccda48bd37ecc7330e9c00331df194544acf54720422b397e990483afeac0fe749f7c48f799aa31b8f9975e11d39de9ff83df815ba59382554e33dea6b04b3b1e06310597b0a7c8426d61ed8a411e72d7931c3bdf7737c2a41f5092657de8e091f78212e30ae8a58c54399d5ad3285b2daf6f4978fdd8bde5bb80cf4f19fa691a0888d11085482bf394c06a02e9833da534ff919e22437b7084d5321e34ddd51f461efe5a8619b2c37e99ea1bdae8b56c2a6498127287be22c13ba6a453609c5cb849546adf075ecb92cf0fd11cab30d12435addc02c592ed66b75fef184e92bfde02d55e939fe8306745a2699598d2f505125a39c07cb177d87c5c9aea10471767742c2249ebe310a894a17ec340f7d348616f74d5fc6bec53232f3efba126439cbb178acf231b4c075ea11988271bc9a49962d00ce349466eaa4274476f921e2c8101c0b8d031ca5cc87e37753b4570ac267c844fe8c908429f790999063e115a98732ba08f3fe567de884b3e24e1cf45cecfa3b62eaa0ca4702b586c576c2fc4dace2b7c7871700f30373f0845974282cb655f50d8b3156b6c6faab0f863bff1efb2f2dc606eae926635b156211b9dbf745cba0a8a5b5a79ce8bd09f30989a73b6d03af737dc236d13ea7673f7b6f9de45160ea47035f799dc110738327f5d3a06596eff49c5c03456537196cb03889b6d41f7d0eb4db09b97ffaae84d096cf8487de0eacb6db0858dd81138f3e25ecfc4944d6597592ddac4d6d792e128eb7676d707c08ebe0b51cbf86244f1d1a366217a37815fe3b144401e935f948ed61ade351d99a584c6e8ec53215ef2519004ae6136577948b79c71dc38376fb44fbcbd79acdfdf012d9ca84b73d5895a788f107bfee465aae1f17ac4bfd2d6a5efd27d9b8c85bd5966f225a8ce08b44efc559e836a66704b8827e10c16c815a792017fa51d2b2f40c4356cdd6eec0dfa110a14718d8823ded9c4c8ca46cef887f4c1fc61bf4fc47e72b2c049c8113e3c2da550337df65e8ca8423ba7e10e0b4fb157a7027971fae44701ab55caffcb958c3e3d31a67391de1c5506d001ef44bea57d5d319939be3d3ccab83bcea9254c20776771f536ed6a12053a0bd8af4106fff2d2e22b6b4b573a109b6dc04a1d5888ba5a59a921b9de8e4de3a9fbbdcfe154bb741a1be7955ffec63c21e7702cd1dc7ee2ea9e9654a5634c7528d900e2bf8afe68a744032af2b0e7540ca930648a5689490cdcd34e9e27f2a8a8948e07af2490e360d3a595b353eaf4f1414f602030261a49df0fc89cdc386dbca02c16bb96a13aa960ccec88c39c73f7c99b11c98e77beaafd439e8072f14e595816a3584a7e59101ad271307abd924a202a26ab842945701433cc97795605ff0bc49ad7e97656b605a2284a771f91aa2c9bd95a874e3f28c36ebe2aa5d364d9891e0d0b931b97333e129b14a1edd0497af514449083dc0dc2970b772bb82c8a64cfc674803b95f5227274231c35323bcf02aab9cb6316537e9ebfc074301ca847882ebdd3ba9773c16d501e5e780fc921e741391740a716a2ac2913195a022d589c70fa226ce16c6ea901b0f5160d60f3a3859cfe0a3d34428d11350384f5d58e6bd6c1feec6545a75ecd3fd6614739e6deac85d52c0d1374d64f020aead30fd754dacea82551cd23f7185e31a28ef57e7f9eb34e64a373fa509124b9e79a080f3e128e84bf84b6b4e36fcf6bb2227423597f293c0b278706718c9fa37cb9d61a6d14f716cadff1ac599858dd06f63ddb865357e4186ec6525175ab9a4b4d7560cdd1e997af0cd1fef280e4f15524d4eb5e4aac8540488f66241b204e9e9c701e91a3da9cc1d2c71b00b6475f3235a2afe5f75b656935b7a4a2564ba51fa5e9008cd85dc483da5278b9858a8777e1c38544cdc26549622c0e3ed278c8b7af9d7295fa236dbd9ce7894b54826e7a28273f009d377f9bfb7cd9adf04ab3bb5cd2739dd6db12c09301c735d42925bd865e6cb5a15e93ab9ffc7758e614743fb159bb870d87a61be3c3c16a1e8c5703310869b6dc5350ea3c1a75114993e00219d58340826086b5007991e3b76651668fb04910b259ae3ff27020f86e24108e3815ec11d8945c32237895269f40817b71bc4e179bbb6c294fd4f8659a254fea36c482ca4c5b904d98eb3680e30a8f6b75558c97539f3ac46469ebd70508905ec582e74d1b4c02f2578741f55e53f0e1a71697ceebbcca63ac719093ffe5d88add7e35edf6274e623aa298e12e7bb0fe51a2d17defde6368f1ca447eec9dc243026e6b7e462c8f04c8a07aecb7fb9a54bc94191b98b3f50f777714ee963d261de3bdee746ac94b61e4bd9b5b0395772e1a2ee70816bf93038413880dbdb9fe3d0f26003beba6fc11d13efd48c5df4462e83894fbe7f2c00b9ecac6e24a248f17757eb03416a7b6308c72d0dfad5f1a15ee5ba1f04ea844282df10d9f606db999816c7873a794cba5f99530eb02f255f49960b7102081a1fbc82a9470fa4fb1c29aaed2155115f11ae02763c89bae2ca4b40ea3352cc47ada0d3c0788c46160e910c3b8f59ec61d6e5092c43b9f2c9a871ceafdf16ae65729ace7f6d329efb24d882035f75a6165093e4b4f9ffc8bb57f910d6dc982c14912e556176adc73ded271a7b5f603ebb64241c8f070747385a4402ba0e325c2bcd60bca11a7c566b10b90f599f0858d0227f440ee8aa5b35bd5b58802240bf987539434d2258ae3f246a3101f02fe69288e630e7aba700df2dd08e8319d68cf6084d73838646a97b5af01b0401f0d4f124936914c1f4d4630a99a0a08f08ef8d7e63129f63ec4a8f962dd46990bf14ff8438bae75a764684ab6a6edbe9f1432cc927ea1c59d0bdd96d0e15f6cb074f219e209ff1a5b9a389a4dfbd412516f4dd94fd1fad38660dfaf14c700350c0424848f1a807e490fefa9d7520171f9960d2ff67b73a17388081a96b54351d562785eed215234c68abca9326bed4b90aed13036dc12bbf79d952a4a5cf6f19f9a77d20a4ee85106f82db8e1439c3ca15d21251a721be2a7f9eda51d996dc337896aee6e747635ad43985892cabd6029d696e1fa76595419febc043d3176ee4d88f45cef10eb3ffc143c5a4b28a2aa3df39374ddf5460f7a5e726c2ad27de7947b98cb2f37806be98e44d58364a93f81ae73c137314194e69d168b739585edb6d95e20bdffd82f78b207018cd7b93bcb7d261bacb41c5b2269bba0d55494a08ef7145a8723b728cf8b9ced2174b7639bb82994b79839b66b78e069ffa88471c02ceeb64ad280f2ecfeffa21a359368bad44acd27dd2bc39929962ea0e499e1ba4c5596f9d721cad5c1e9828a67869b3f4cbaeb9c0e470f018e951af478ca94e1b0583cfd32e0fd1751277f80b54a5fdef647e9e295634682c31f1d7f195dd5b04da32821d760301b3c2ee57dac423423262009636c20ea84b9d43c4e914b09f038ac592685893eb761718fb9b54f36b88b8a37d7d63a7d1050cf74459a8f2db4bddb97ed6239834fa513485977cbfaaeab1535e58ebb44d07223c5f28cc00a7b7dee9c9397565f2403c21d9bd3b7f832d15aa73fbdb8015ea6e92cc5aecda3d5f046cd87ac8f4e2dddd5d451d59b0cd60c12903ef4c6aaafd1010129176f04c526c6bf2de2b82df674cc2696f41f0512eeac2de462894bd68f3971a1eba7ff08af2cbd4651eb978c755936795711302c7eed4f9e15d9a4dde95ffd99e9e3f6b282ca539caced126553a152d5b3c993c001c4e2407d7898b0d89720d6b137e3b5788bc9268de9254a6bf4b2c4c82ef96307ddfa36428ed73b5ad95a739e5c812daa579d804ec07868dc8ba9850f359e7254a49cce42a9691224e6b229f545f940fbe9e889686ef5a12122bf14dd473617900b6403e09a19ac0e7d1ec702b42afa822afaadafc0706adfb9602c925429a92daa73d215b829e77648674355306de3b5e3c1266e9677f3453e0dd8778ab5e1a6574df2ef8c2519f2e1eea50f5829ec74e6ad573cae8edaa4973608a5ff11a2b2190d174c099cbb5297ae3dac0177032cd8b1222ef5c150133835de6f6c7a04ef3c4696d8f253078f93c60b290f319ab4691aa1ea80845a20442b5b1e7e49d41950f7324b28d4cff5b577cece7436810b3e1c748740996e78e847b74989760ede4448cdb1230b258482fde6ac9e2b55d703220f9dc189f73722ab3df15b4526d62bfb0e734660b82b444366568b2f4dfd605d2e1f9d75d3ab51551a0dfc33fb8fbc75c517a9ed5f1a1d2809f0479d928ba58e5087b67f1386407cdfc2a29ec53ec22c8e9b62f8ac1933d93b0a41787046b8e210fd9999ec4513a337756fc39d18ae6ac0093617af4b07ccccbe3055b93374334f482e1322db710c2741187eac96390a216a7e2202a2a198155fb85d0091f497d8861e574c5b2ffa5fc205ad0c79dbd07de29d2e39152696ddb1272d20835caad1f1072e73191030afaf57ab924750c65c304e4e333f887192767a2383fa4b33ef2327dbe111422b2e686f9dbe7b08cd5b876f54dd2bf0c39047992ea0a16ebe868e849407761d526d4fdb83d3f82a4e002dfe0b0b9f8eea97188f2edc9b683c705d06c672c334ee831fe3e43cdd5754e89a82b7ab5e2fd02cce1d1ec0ea7a2300008e4ade17e6d129f2856c6f5f625d0f400d48db0b49588491c9fc00301da1e79fb071ede1dcd6cdb522759eefe9eb74d1d3f66928fa31461e109139bc148ccf94a706e816b767a087c9407d975d1675375427d6603fc4e2d9706b091aa675ceeb56177e842aacde8026414dbb04e6d31119efb0ca6953f20ea23ca9b4ab27bbbfe9f11ad7786db056132bc388e689b148d64c50d21cd6b72019e23458acff7d71e378142ca53d4da1530f64eba63cf00fa37fef930c2127f25cdb14fa552b22d216b8f2c7313a3f135e09408f64146250ce13370839cc574a8a488caa361bd83d45c73f6f614d97399e1800b64063026f9f23809f8188ecd5eeee2cb91aeb4e04571f741656d48b00cc1f4798affdf6cbae9291d37d8e955da1dfe6d287cf3575da7ab69d6cf0649fef9339336d9aef6ac962ba20913275f1d6f3ab2872a74874f674ee114fe24ddd77a4030dfa14e3a848136118e4e0a1f7e043732722d273804f9f79c62f6c313076ccdacf549433848c8fcd0f61e8fecfcb836b67bcd3d843dbd4ce664e866575225a463c0ad682f575de37d5906a2bd583b6b33cd60eeea48a3059653d1dea248fa7fbd39753fb2053fd90a238a3942be666179bca1788cf887177bca485c7e2cfcc406f50beead96afb4ae2ecd824a3114c3abd15eecf7a2bf250cbbfc899b95fdbbf9098fa763ba3d6fb1eb21478f4405cfb7ab4ef6586628245922c186fe64b4d6ba45c29f4670a6a0f71e614d8ea72f6032f357a843bceaa8e9cfb1e16c4c0b3069cdf247f48f34d717424edef587222264614033806ddeaa21e7eab01ef82effd6c0d87e307e55a8aeaf579f8db284db25d42ab3ad9cd3c8261b894b5ef133092012efde5c2e5db15d3b113f7698c5ca91cbba8aeca979b511ef26ec4d729848443ce5e5911ecbf4ff1f11310f19df5db7b56fdd70736fa19d0240875418e45c934e55ddad390f5c2da23889eaf2ba2156a92d33a97078a58519ee25e5500d9cfac5afe34192acbe14ae240b788c4b8d82fcf1a4c47a4d1ccaa2b9ed94829ff2c5398c72bd48a8f6365490636876da35ce00ec3053e989bfed86fedfb41f5339569c8812d9538db45c8b3e3d8b433937dde1f70f9a2b7c5d3437c34414410a672cf1cfa674747f929abccf3b127a767252063da86ae78ae2c5bf81eba65ae2e085a8af14f7f4a49f5b35fc5db7bd367cf11ba8fc5dbfda18c09aee128595c6558901000bd45db6aba01e19ab8f4746c9338429e13bd934fb48f4e2f98a77e8ce87f6f79e0ca2a09c79f493a0b691d87fbf44f365a7235feef2f8eb60bc28d9cd9c7a4fd2c1b149f32c956bd97a8d01dc3c59698c3ecd17fe73fe40f5a8eb94328239efdda1f8060cf6feac63565e7441c267d0b2053a8d95957d180d3b70c175978ad14379a4379ca3349ad944c5bb08f9056dcf3585fd4f285790c7c93619c9d167c1a600422aaaa428a02f707a89c9343debddd47fe6d4f8ddeee3f93ecefe0d85f75484f46370334ee8282cde2940a015bc11a9160e3ef03c8482327ce5fb53691702ffda2aa21e0740142b8a59c2c7dc5719f6a17ec5edfa93f52b0da40aaa7b777e459cd753e1d33ef3357175f6e4cfed31b428e81533d51336208543ba1676c7fb5562e419bc5afb37a6623894b4877cecfe4bc8e698569d0d0955c689e4b57a56086d2de0d660b8d433307fab7e0f1d5fe260190e1c1ff81272f0d00a61417879d705263b7b8cf0d5c6ce9e8a0b6cf481f02468b2ab6e4ce34946306bd95b6a05aad10f213ece8dcc235395f0199f17feb74aeb7f4d24938e431cbd83d5c675b574f0febaf6b5b299f3ef080b96fdc7e2048a0250f2e9903674a9f75d189a3a3a9ed47fde5b214e9289580e45b0991a82c2deed572b3cdc5754fd9951a059b921ef25b8485f377a1997d6f27df284cf212e283c1af35f97885fef7e7743a3f4f7f5068448df536e25f5cd2039bf8ea377f0ebd0fa8a3de250cb803efff3c89a6ca2612e9d2f0025555346985bcf9c33755f897f6e2f56c8bf6e18738cc397f2cb6db6963630b2a7ccf93ee90a090113aaadfa2ef23929cd18ac19bd94840d659fa6dc26abe2a6bf52a54ae3499861911b12a54ca9d7172bce03f5fb7de201b5713ef4773b99aa5a934685df635353f531d30acf493037ef1efa7c9f0b37df76c1d3a69a67cb6666f7fd58a2aed4cb63944004ee395bcef7bc029c9d762ab332d40cf873f4f1992d58b6d0fd247c66a746de3fcc6b9cb94a3150f70680994756742e6ea03ab0f64e0ae73eac75b71e401ebd9f1082bf6d646ecd8bdd9367635152dcb27a359b62696cf2e37aa339fd2457ddf448bbc84a23ede51fdbf9989998a202d2e90d15372e3a7936c1c344c75d00fb91fcbe235f965206143c8d462f343268d04ddbb5a45243920469c792f22652309dd80b3aebd027e1b81d4b3bedd70ec29ea0bd0d10497f3711efb295f5ba5bfc1e62dd731ce91be3962684be4550832b6093095f79fe9555d798f804a277078fdae6c52446860718d8b487fde768d6a1710080e78b243829b02578208bca6e30ed12a6d4dc1f93b9e8829687916694a6f32e5723c15c28d88552cfcf0cc90194af4d1f9ccd03cfeeb0f8fec94ffdff7149329feaf60e8f52ca7fe1904f288926a52f64599ca72b6e9d44cffe4cdba5956198ff64a0d884f70bdc77d4957e91b51630d9f945e4ba09aebecd27d010850e454e367ece5d4613c9872e93fcdab3d5d9962234fe198aa721c0ff1a902fb9903efa2a73461bf2ca4a4a93a1844d9a766e79c7ed9c806bf93be34ff8373cdd18804f41289f58ebe9d96167c7e174daa2a605ef4cdf55792dacf2b8bcdf9cf413ad7db29f584ae603082223966d99e90521265cb08d07c5f3c618f03c8ed2cb1dd6f54458bdad2ebf1377ff30124ec6345ed826597111e225e6f58dd3821d1361247d52379ae2e5e530b0d9f1c0d50649627381c4d6d44a986d5cdabb8e69a4843d55152ff0da2e1ce73d67809e8c118b04d05178f70b66aa06e2971da91fc8f385d235116b71a9b7415c70debc7db766178855c6291de3ed46afc20c1eeacb7156322ebb0988f0f97b249103a6e5ee8205483b49832058aad34258c00845b54a87c8b22d6cb0c1ad47b59cd487a1c15d96a7682170e41678376dd2fd783dd247d7c44ce7d30705e14a65b15815722fd2f627b09cdcfb8cf5cf74199656774505a2e988f08de96e307c54e8b54a081d142739b2d6582d77bcf7f1acd9276ae99adf379c320724a8f1549dfe0fa004760e7002592a16eefbd394216e6416698b88d311ec1cc721196686929e0b6d0605b0d65bd3e735fac7ec7375dc734209c98268904905775690685fe8ce7adb48802d18291c66e991587df4c97620bdcdabfe55b29f9cd5e700c05fabe4147b82cf3c546d9d54a73d01c6fed1b0b19dec848e2c535aaa781744d1d45825c19d4ff0bd70c3e3c33882373e718f7b1663a02077dd7f66c3c19481c81d541c54c7143c3a7b1032cfe4b2d5e66247d4bc45fb770ff808a18e2a8657113d91ca69a56bae64dd301836ca5557cf8d35a252546a648f0cd88d90213735a0c89a4d324e323649b3cb5b5fcb1aed004bd86fd9716783e512ec3519eb492c29116692f0e07903704b9d2b506d6925cdc5eaadd3796f35f2bd63e3993d4de4db93cdc5709ae348aef1d1b5a6578e745169c52b489da23772af9269a9055dd3070d7797f6f249dfe0e56d4559be01f2e914fef67d7db30c06250222abd4efd9f55514803c80d734cf951f4a9303ca16cf443646c411449f0664c93c8d17be5c885b0932c48c58fed4320bd472c9710398bbbce83c269ce9db6b45fbc38d8d8185e24238692d224467842df6ad85fb6f77ec728de415d48f10fe5babafcd1b244c4f504e9b3838a695c8f893aec721826bc108849b3c8840e01cb7d4964cdd5fb7a4e1d4c1f05fdb275bc2a9b31ce92d7d0397c351308ecfb101b212248ab592011525c70b215d2b1830ab7e752981ce6befb1206359daac4a8e1fcd18f88d51cc14da98a45bccd7545f15299f263b5e74b9479b7f228c8fef3ba4b701b277b1d238ba8aee434939253a203f24d30a0b71b1ba62b88c7fb03ab776dc6b0aede59eb09fccf8dcb6555392c80045fe2ceacc3d2491e02462eb8633675def263d78a10ca779fd052b156404f4507ae93927d14978b67fd0025cde330378cf5f68e4d3499631ba2151ed534675f79b4dd428ba691be52aa645a6d37fff9737f389ede8decc3b8cd07e360f2d2bf6a9ac7135c171468e7092eb8b166914c913d944966678a462514da81612a746fc5f0f8451abd6b92368d88f83143cd28ac110046e1ddb0e40a57e1a42ed0300377c7125250da976259e364f4335b048be9bb4bc6c8376ad4db43defe0574911504bf639db7925cbd0fda8e1b1c80b031d3d02f7752fe5db8396e7415a1d1c91801ecc41702825f4309936a61c59f18ed3100564685f0ce5a50ba5f468bc2924b49f34c177b5151f647ef8cb9417cf63826f10eb364c51317fb74aac2fb35ada27b10a533958636c5eeee6de16e1e48a4b6fa7f009d8d8fca86ac19b2b9db0b1c110cb34bbeb927f4bfbc9781923490e5bd46f0a2f65596eafc3e5299a430ccd04dde66d90abac787439f44aa424c35c409eecc4a2ec393cd73d3d32f76ba6866ac6df8a6e8cfac94f3e236379d441dfe6152abaebf1354f49600d19677204d21a5014f829032b4a1d8bfef9ad1339787eab11818e541428e9df0b6f25e61ce3c13688e80259d2240636e656d87df726220559e7d0b172703a98a409aaa252f69a774ac45f2eb1e4c23bc3782f0e4f13bb1c9f641ff0c810bf21678269a1c78b5232207a1bb95774628fb7360375a6e2c7ba00c428836039d73e5720a3e36756d14b2e92141a4e9b15736bb81836fca8bdd537df53658c66e06d3800d19c40f78e6e2f505172108ca39b1ea69098130bbd4ed8d00f85981ee9fec3d3b9774a22af2d4ee6a2f73357bf1a819e2e617fcb1b5098e0573fd0013a5e760907190e4130ac1fc8be65bae67e271d1b09041f99b7829e45f985d2dfbee0ee3d8ec03d2fe37cb451b68645dce1c59eac9c8dd205ae9c008ac75a5b2ff7aafa9c3e025984ea4d07ab34d4013efccb09a74a98d08a8ce0ce4896a2aaf86850f99f0a1f11cd45e1abe1415bd59e83a98148b0cfd1a725e8456f230062b59c7ce7607379ee1d528232740606233914954368cb559d1018340d3aa255e6da079a56cd2040d95ab5978e38034a07cbead33bb5290878cec0ee3f4c5d88f36a13f8be4122d130be1f92726c2554ea90b017fc6717a2ab7563e363ea61a40f18474ef5d24d6a94ceaae54c983db677020f483131a2cb1773d0c606f7a7868cad37b2fd3a9c8239e724d554056ef3dbb615a006107f47c33d5e852cc7d314d209dfd203e25f98b073bb0e4c1c4659ab28e67d986534fc8cfcaac34058538c41a02ef7c7ad8cd8b7f852cd3e4b5131db65b72d16fa34ddf0dfcc74478ae9bfc25e0d5d448e96b36289ab6cf286603bfa20e3ad0fe18b2457f9cb79c1238da9fc0d900d558e2ba58c77f91cab7b4b2cd8bf4e7673485ea681f350064a106aa3c8821561ffc65f8368cd63f9c9df64d8938ab9e50a2e084ef813d820d04ca08add9bc0c51036cf93a845a84b3ca7be26beec2fd484716130b827853e609c6dabf708ac15fe5b88c8545d93668fa103a878afadfdbd249ce4327363a184479d1b7e87d5d54d98d495672592daf6eb867dde776025d4444e4068db7e8ce8d4256251f06195a288e6aaed52ce1c9fe6351abc4f3f28b5359e565bc66a1b85bdfcd50f83cf97d7f68eedf0c8834965a4940a24ec6f99faa637f694af3ae1b007ead0d322614b180fdefecf42c6de55065c8c0b3390ea5c274c3995ff3408d70279e97244bf8bb624c1d38e8de838eff52f944850a69051992670a881492b94e11580210713a5544103cfbbeb84dff8885e337f49eae3c8fdfe9d91bd5867789b84a735158c773a1f23ab0ee6ba8eb604dba5cb77c8837ba7a4d7a98b9b7fcc73f41cad1ac5098548f5092ccf2396da322634594a70ddff6f3213ac931c958e6cd337e666c9092ef268637756248e2ad6acbf83730115ce1ffe8a31bc34668ae31a61378336de12ad7036a1bdc4e0b7206c016d7e9a08d45b02fc669b62502e5cadb3d9c6dcf28aa61a9117c59d88fe20cd5a92412aac704d970f7887be07b4c848ebe0d85b028f1d40fa2e9b2c505fc587002263c1a4bec61e61b45b413cf34eb824442bd3fd421b8686d92dfbba0a36f83cfc934fe91b0cfdbb53a82a2703b5ad64d6177c6d629f0e3d333d9b40b4fb4f6f59523f043aec1efa3f2c31d2865379d1700c43a902dc3c8067f3f3a6170946e12d2ee8af58383bbb7c3dc0f25d1431cea9f92b47e643689ba8c23f4815724d4fa081adf6219b459ccfdde5f23fe4c2cea4ad39f96bfbb81739b0dcace2080bd51088e451492d613e42e71a782e70ade16f2500b261ea601689a5307ab52a78b47c00ef61400954b13247a27690070339df58d3007d00070532207694502b1c7a3c5457f2faf669844d1881bfdefbd103b3d4d048b578fe9013f4d27b090bae9f79d518ad5c29c68ada9f47669ca3182f6221940648e038f67e61aa2afcb115ac0aeca9ee8bd5a93433fceec19ac26d02b7fe56fe730a2dd7a4acf3b8caeb25811b742b7943ea6cc586a0eef326b3d2f028bf53c5762712b62fd5d26d01faeb82354a821367656b57591b22179c23fbd8730c7aa62a57e2c54911819dc4fbcd8333309044bfafec19cef23ce6300a258a83da2946ff83d6d084acc39f052b0fd3d9745e3082e2527469697ab22665af04b5c6271f886a906e3bd0b3b5ce0fba0b5929c0ac1be352630cc3aafa670c8f622788f4b6d545c0abed740a43a40cdaf5ce60ffde9571cee79868d0c4f8e217b02c0325ec94439bd2760bfdc398f4de32d906101524512fb07635af35c3e7612d1d08f2146f8459dc703b333fa2d804a9f6348924de366f1367df85d8abbda360e2cd3af9fdd8e65f4d9c98b56b7678c6e0ccb30252cd0441d87275bafaf108739ef7ac4768afd98cc03101fdd1fed15647d42ac18a889b57a83a01c6d676fba02024bc77cd212afb8a61eae2859b8c47fb1414fe4ba7e6799f47d78cff9f399536edf8f6470d57eb2a63a7854b20664b1a80dc4750f0a14c0e76127a2e01012b5ad5ef5f275999b738606460ff8f1e2cf5df03478de0dfdf700836c483aa709dddc878b0cbe29f31a63ed0734787efb52b1ac1b87b192d5a0b61e4be7fc8fa00a3fd8ae2c5197ace2e28a99ed3e764c91a64cd03cece5c1b6d8b87e8f8c0a792db6df3dbef33f96848fbfbf254cb41801c9ac1b3a735e5ea0b424aae9c557fd7b507957cb90b6aac4f43a13236931409fac9926e064d524334f631d6bff600fad17ea115c45c55cd973ecb4675b780e463eb03f966e068fd8d49f19378fab13619a1d169b3db960fea593e208e2acebda0553bd37b4dcb845cfba8a479a25270026216e2d930848283cfbd1fc219924842b976d5dd63b641d8dbadaea844238542242f50449147f17b94361ed25ec0f740ad6fe3cca7d69de0cce8db61606afb4d6f60b507732a6edf39137e0e3a2ecba9e48ff2e488f05da1e62e7df83553b190896f2bbc76bc94aabe4315270b54607a6a3f16c6ba466be0219508f1013291b19f3471d4844583fae382595f7e7b03ddb7231a3d9aac66bc24db0100607659af45f1e262c39fb5e2c3d2f58fad2a504e52404bf87b17e48338828fc74fb9ce7fbe568dd54f92471fe1500ed8fc75f6755322fc0ede0b58841c3922ef6a7c9e4c12260ee0119837e2d58ad63f806764460541463386cb5ab60dba56f2a21cf8adc73475301c3db638631d2267c26813dbb230f9ea804c4edf1bb9534e7660aacc08d52e9d650ce23e25b01fd768d617222a3d8252c63e877f92a61f20d693456179efe593c493348cd4bb48b5687793bd2ff38cfe5f8116d34e7eb854186b83411d5d9ba904eca6c5f66077c24b673f7988240895550b17f6e0d53ea09c5076b97d510eb1793c5b2329046d2df9302b2c835b452390c095d4a6c2bb178498aa43649625f908ac5301cf61c9997aad6fdb12fa5ee410c152bec14ed60a5a7f9104a3f341fe196c3cd48b59974ce962cafae71b20678c0c97a18e11ebcec6601109acec8b6ab4b119d37129c05300e6a954dc662468301ef59df9fc05993552828318a20204bd847914c17a2b68b23d13917681a5df90434f174d566921854476009b7141475e285827cfd7ad280211a9a26b1539bd783b00bbc347e275b5167350adb01f5165aad610c9711d93574c42f7a16bbd2d1f90102c1a88cb12d097246ff2105d7f0d0ee989c68d16c6294e6302132471904217331e72803447d43d1ffa978a4e1c578df1a7dd40b3c23c12f91dfe20feaaad79c03992987bb6f946db351ece094124aa27a0ce93045520c2948d0d2deeee6e7759d17ea627edaf78ca54928584e639822a4ebd951bd4d6b8bfa5e87e4e63c04031de89be07b40672947d16cd9b0af1ef4b77f5a7a9830fa95b6a84888cc2997257a8733615db123f09e7992628944fbc5c0b404d5b089bfbc31328f549bd5e581b27c7b31ac63e4b5431f84900a85366b8e656a1c38784c810a71230d6b6a431ad457541c95222631f9c7ff41a2687d8730a516980108fc2a19905f26ee722858c54e06aa156921bfa69eb9b4314b4b1fd9a64802234378019408b26be20a35d4c3e7ff36a0c94b5e2f8b200328d6ae19f6d29c0d92d79743e000a3a27b0961e83cdcf18acb5375ba5aa3dc661b5cdacc77ce913ed91936e6ee5fbc50843ee3b703167c385d472c1d73001386bd7e251c1edaa25243979d101e5c5dd19d544eb26d37a6dd619bebadb7f929be74ab9c8de5471cb9a4acd1aa9d4ce767e79d0916746510ce4b53378b17d40542a97581d68055d36bfcb75621fd6c22c4ec81fc79e7dc272a03f3f6c31218e16f92e0a32ca1b42ac848476f02c65ddab6b83940f3dc072560f379957ed88119d276cccdd2531017324162b0d66ebba2b515c5c626ef018435acf049be11dd5a9c0879803da82bcafe45f58c1e6a811349525667f5455599e542ca44ec771298e8529af9d9001aaa918c8345cac820dbca7e04f0168ed04dda377b6ec75d9f4045bce16a054ca9c2abab3445e51186da7ef6a8449e33d6a118484f6e583b2470adbd61236bc8940fcdc94bad216edd4816209e3cdc02b58dcdf764013d58c401fc2c10e9d115928fa0929bb46f2551f4b75f9b9274633e7aa89b448dc83221da2ddd0fcc4296d4d474e1eb86bf85264cd8148cf4457aa7a2f73ad23af59d676671f3ca8bb057a208ce59b838a12511fcdaabc15ef8fb85d1276ba22e0e74d3dba66034712f543cc287b719a1ff14cb0f2ecf25d7361f4a8665d1d2ce9087a5123aa043f0784c4225d73d80116138e4a765e01fa1cd1f7701282f56c0e9b17b9b3852a25fbe99e0726c6abe09fe183ac84494d0691141c67ead08af0c4826933b622eee0699fd2517d37fc8e9d179ab0b9bed9779ab64659c5d9c1767c8bf09c522c9b09dd869bb64f28b07baf46ddc8b741f49588a60b72eeeddc3d99a4ceee4930e2917109dbccb7672cb1776e57debe880f05b864b21ca704200f14b4e78e10920ca79973917a88ecc44dfa401924dcd877c0066e94c6e97992a0755681d6f8deef8e3dea3cff496b04cca8cd588fd6f179f49707d0599a6bec571ccc39aa91bd54285e2e591ddb72fd9ce017d6295af753f755e09f1586543ea340df356bbe0054702f7ccf08aa484bce942ccbf32c41a3c0807bdfa19ceb7afa2521505705e97503edc2f4b713030595a7681ef9b154ec2544e23a731775767e99d2beee3a4d71ad9c8283aa8fd8063b1c6a02ca258878eea88e216382829f18b56741cf98536b40e90d75e90e52916faeab817fb78dc39bb64b285a5f7d4283c5aaf87bbc9486039ae20b563effe99e4a4d969e5d576b31491c5e4304d056b252211fc6bef01a8a8895a7f9fd965cb73c5c9c0c616c1b2273c929396e097c06b098c899cc8bd7a6ab0d5ab640d0c8353da79e91c9ca263f2e025725980d50ebe1b540994acbd86f0a79c9b57241708da8bcc18b8767b5925c80b61c06ee8d27dcd89fef1bc1102e4d66796f13385419059362542afa3ec4619af5ba927886f6e2672df132b0eaad1524565813dcf9d7e17f6251414ebaff9eca46ea1f05b4155dff529aba0e36dda205b0968390906bdaeb967a254751c5f7d1fc099e3fe7b5dc8e381e70ab0b794cc63bdbd2662af93f5fe9027ed01a4729d2455fb5b886de60d5e1c4266bda04383d233851107fcaaed58bf63c792421fea04f3024000c8b871374f717652ce94c2966caf2b25f0d1775da52d8bc56a566e616aa3be912ecf96564c4343edbf49a739486e73e91f76e1bc17da11d086368b813d470ee70e001e5d23c063aeeace3f31b9e5ad6f1812821decef40762200733dca77fd500a035cbd8ed1b96ebca641eea7440f11807fc47e5ef864221833e5016ddbabed56e7779003b4471fb3361d209baa4f994109745d51ff7110cf3c59240f8b91f9771b3dd2537e367e41afc72c25c407c818177721034b21f0cc398ec324e5afad5750e811b754aff921e53b5a95e60aa88e14c2eb08ccc5999824bc1df763a986e7d84553ccb4977f391393177e1ef0c0322d8c46231a13613b3b453e2befbfe9a56f82760df37726aa750cc6c603e9ba00361e3842e9f559b4355a174abffea45c1b37766c119b4f966d1ba1b191f7c4e2075fb3e170a60653c53d156229e0be5c314eeedf08faf27359d5e2cef3a9020577119cb7558305ff4415255fe56337e4dbbbcfe86533ef71b480f6b597b5d07859d0b9172b67d9cef666c11fc5c847f1868dbf715b652d0c077a7ca0fcbbff75c8494f65e934cac2f18d01fd8f1e5f087f8a1dbdbf9114a1dc1bb404a0e2f919878c0cc073f161ecd25d0262470c9ae31d47806f4c27c7f7299fcced7102dc92e98630cbebe79f55f54ed31b2f7884083453f66e91cd6c2774bf5fdc3872ecc49184c548f956151ac2c0441c982fdcd8c457db1a76d6de0a7c0865f5e978ec1c62cc8288f3e534066083da9ac587d5fc4650b0c495506c5eced8d8604dc1741f9d5f931f178e742f6eeedf1affa5ce91bb617765bd52239475b2f9a03fa9b66efb9dc79a3dfa9054330c5f305858980adf55d3464cfb67cce5e2e7b1891266bc31a1a31224595b07f99f5e560dc8f942af754ab09b4c7960a10b9bb7f44fd764ea532e291911459e268e035fb27a2a086aa05fdf0b58c96872e957831a3120c928931aeed11e8f001215bae2e17d38cc6393554c703fd4bc24742f2321fdb65ef0fbdfd4722bf5bcbdf624e4517c0256e53ade5fda0d11a5fa7b7ed640b43c06bbc5e7a5d0e2b1e2a781c2f967f802a69c0008519094a6db4f05090cf803d739f44bab7f8ff7cb8b82f66afc05ef745a5a87e6614dd8dde74bbfb915e6d14cf283490d296d6806ed7257a0897407da4d972122fd4aa9660540d01387b268f5f78e8492d84bf2ea623b3a399718724be17ca00941ee9d0bb9e31bd6514e0bd37bf47f22ba0c4047a39c932aa2b501c1932c4475310738f988829cd10dab28a06f11ad106b14a91a646077051ddd45e9cdce7168a619936f6eaf93168f49c8dbd436fe70cfe66edd9581d1b137c2280c114a5033200b1d154a68be585ccc0e71093962cab118c82e8b736c563006537ed11e1fa52ed6e7aed545fe0a93293c8aded39a26644366087ef89a3dfc7eaa4d72f1d8d916d246c14785dd67029275d6ec884b9e480b8d6e81c26ba3ba13fcfaaf30a7042456170c1d432b913842849ff538bb657dc341df849680f49f5f819545fd0e9d3f9ce44bab340cdc8c7bd7d4d60e90fca0c315a18d466168790e346a6b450dad8f8e2c6c6a2ccb79def4108157dc92962d6fd8911d765ffeea37d07043efc1646c4280eb21edf1993adc7c519e5e99c81a771b773834662861c2224ad169552d663dd5752c24e7c0c02cdbb1974c3faca650ce53eea2f84faaa0046918a1c6522b53cf9f08fd26bead62062e7a1e5e4e765fe974f4c92f3e0fc5fc32fcad320eed6c23e07d37ce35c4ff76dcb8d49eec07f39d230a0d8ff6cf4b17e6f59bb2f16e3128c1660cbffae5e46e565d1e96b5bc4352ca01cb42a1d1e1b9cb230ddae98e1366415c034f86808ec7efbccc395a37406dd4a4bdaedeb00057e8e87b5a33ef9402d121dd103374127b6535c0c2b36e730307cdc617ebc012080c0d101340b49bb615ef875cfad8bcd10b13e0c65cb42363b38dc6fe5b3554d03aa549d55f6ab1812b596fc61044c3e923b1b6513f37765a3de29f3f3c09a6f57016472b3e384be55f850bf5d8cda913a7b20bd669a2ab5c57d9ff777297db88b418fbd4770a58de633d4b7e99f95d2150dcdbb0374842be2775e4164ba0255f709f483d95d8dfea8cc3ff84e88b72ff9c97621a7564215a325ba8e1c13cac424b2e7234e890843742c773ccfe608a667a1285d52c9de4d028093a62e4dae116d526d8d9e3ec8bdd8ec6951c1612de6b95a5a5550979e29a318102e9959f1e6b4a1a189c1a41bc5dc25ec91f19b4fc0852f9b03972132a20ad090dbbefad9b31f3a5409f619aef409316023f6373c22014d0e2619b37b7718a6a05528b992a522c4c9464f935d78c639f43b8117093b64c29f5985bd065e1906860c0b8c2c50864338a808468b2ac2fd480cdfb38956f8c82baaad6f5f2085e063af36b80c1d4fc150912b17c39424c730ecf089232b366ac34fe7638fd74fc9ea5a3268c8a494c00673bc0fcb3d79117031c00503eff334390bc19acaf202111abf65d550961d3b1b3a0ba8b4360225923ea76644dd400492f6ee29e0425e0db908a09fa1eacdc1d7bc91fc08612a4ee0b2b610dd3784d9f2985a0215fedbab94f50d5d0ee260cdc3f5f3e3d7bb44da7ab1ec55d3111afc1398c99d66357d02ca31879b15a106968df25c357118f87fd0f8842f16ad7fde2fde7c197430d0c844eef87af1aec2d3c7cd7d50b4f468b99e151eadc385db8758eae23d7a0a903d3f7ba3175386956bedc7953e59789a6775110ea63ff5d290b88b2582fdd5935480995b71e4f826c5ede520a8cabea62c376dbef67a50b760de1e0c50e7cf2ae16129a400f3f198b5f89c6337065bd6b836a4f1f4cc9df6f6fa083f02575f8d254835767b87bc2c2cdd792b3fdbcf88798794f8627e63938e23e5be544a48ab6801198e3e0f0726a706be981b9c6c801592912e4e6d5786c7f04088edf871f016490ddb3892bfaf58a269d996824c4a66620c05388663d48381dafe11f988fed5a77bc1d2acd08def5a8a51e03f34970519a5ee9280c334d40712de82b78db4f564becac5d4245bcfefb65ddd8d7a5b62312f94524a00e7fa4281783bdacf85dfed6bce789f4a3f8d7d79cde2a1055ad136d20e1700ca12069261aaf78c33654d51f0012ec29f9bb6d9d9f25985b99caf0089926724979747ec98b6dd3e002a7586f342f2fde5e28381de608562adcffa292f947a940c00d42a82309d8d5211fafceca1d3ce36e9456ca739641fb84f878e55c51394b9d21ab1dc6ddd4137efac7b8fb16c4474b1e49d1ea86912e13195ff6f97d40c1c0d9a6ec9e06060eb8129bdf0cad843b997bb9b28e427ae77d733fd8d3145a0ca19e72e789ea4690b34f5fa2d8af4375b085f264402a1da889399db05b31a8276058161b6ca5949ac142c63fcbb071920127807a9cb98486772d62ef871587b5e4d208b074980268d6b9f747b277de0a422791c74fa554a67c05622f6f9d8a0f9ca139f9fa7dab8a420edf9ce4da7a4204a75ad54e99a2b8de1bd05eed7ab639bc1b9d768cb786f27ee8c7382caa1550123ae64521150d771d49fee2c326de8c0945568125038d37cab5defc28529649a7f46a14fc0a89084bdbf0b308521ae620e1737ddbef33b757373a93f31b55d93470253681bf15e323ced69bc37484d000d3b9f036ccfa29a67cc459f0ab53ea2626bd988e547ae09690aa2ff52c3af168b374fc8d8efc5574b70aac62d7d6e2b55b9bdaafebe4afe5ac48ec613a530cd51f6428024add5d8b5b31660f850b5fc2a1815ffd0d4d6ff299bce84225299647af2ac85e1408698cc65331c6384ec79643a1185310172fc16fb429dae4fa6edb1ec2c77859e0b8681abae3d2b2b29fcfaca64a1e32f551901cbf426ce25e6442ea65fe7a12ff8de9ea03cf23bc061009513f88190cf051663e6cffdd78a21e6fb00876168ad6fc77afce91d4d39f85d2148f887a3a118e7ea132979d6b2fba25c726be55845b12ace302af81e26b9bfadc4bbd8e9e65f868b0623b54f41fc0f0965c41a922f8811ed9a437ca25cfa10e4f41b1b670bb68cb2c7635073e5f0e7b177484e8df8918141157f259a6c554608f11dfc29a2fae9768d7e21236e86a7fd649f248a2148c2c184f4ec5f41c4bed91f00bcd1b11b8e8738e856678c98c13bcaa988fad1b036192180037a565a004860963b8db8818d4fc6917b015d6b151a92d0330bcb6ef1f321fbf836bb07d19928329fccad1cb290128f15565ed41c5348e865db9f54f2b662ce093ee5167056304a23c3deed70a2bbcf2e33218f5a711522fbc8c65c0684030b816bdcbb279b4e547a2e6c23f752eae043d8c57ef5bdacd9371fd3f98d9e978f860c8f4ee4b9e362cc658a9a6536d14a94ba189f0a9bbadbba066349b0e356a85103a15b4b7810214cb245b5996285edc83c85bb8610e97af99e40ffa6a33b993ae771ea60ff78467e1bdfaadb5490940c62ef7185d884f7b5cb86bc6bdfa49e5aa6a1e61e6215d04bd1fe4fa844943bc164f779da745694abc2841d8b4fdb927bb5011b8cdf1ff5c9ff2cf66ece10ec287171ebc58243e5b95814f4d9e0a5190773ade5cb6a4a0e9a3e7a5de3ffaa975b974949e937b4d2f3e669267a438fae4e18e7f0934bf54830ebe3645eb482b63bf7b670bc2765c7d36857c3d816b31a1708d0c37dabc272cc7dfbacbe5487f9abc38e6209a3001f4628b2c7da9656df4564aec0237af095371c8120227e4c24aeeaca9865906af4cadb71a861928a36ad952361e01920f556e473896a5d436c347dc9b3b512448ab14cecef0fa001c8bac6f026aaf980be7be635e2e990b1eb4cc90eff84f8c9e2ef8b4526e1c5b4d1f07210278dfbedcd49da5c9d215fa7e1e17a7ee33448f8469701ea5597da8fdf2283601ff9632a41c4cd39daff884207966b6af19b05bf2485771e62bd1e33d1edbfed84891d467860dd1b1019759350685f38796129876ff231271e85d2148332a9cf48a2860909cee4efd1807286df60cc3fe440bd55da7420b3287efe969d0e50972f3b89620b9b1f8f5ef58e13cc7117e02393ef2ede05aabe69c221a453330a1ea339bcad527cfc73a07527d94a6f153ddd3b8762da70a3b872a880b253b10c26881373af531d5c90c5a5b2f3ca25d0cf73d450091a529848087da1a0eb6f6d8fb0c2fc3c14930bfe3829136b1dbfc45835e6d91a5559dd797d17c50ca618562c8f17f093f4f2a533d4ccb2af18d65e54e03b3fae5f5a59ebde002cbb101155818c40b092977b284102ac783105d3674cfeb4d773f78459785927cba02e519ae328257422bd05e03705888341c4de136367f961261398b32f9db4db41d8d644a179438b9da77527543ca10484d7ee68de6595143e4a7a8ca1f4b25d4c5edcf3b476f0f1ba98ec5ccb2542cbbf77371d152d1a8d4523c6f005650a0cd107176d3a0b72675f784e5f668046fc04eae65dac219c540f99afe323757e39282e4a1120e9949b23071930f1e1c4522dfac392cd2998c911427da6dc6ac04a38488f084957ab4a1d518fd2146898699aab0771b13cd24f55536345a8eae302cb5883a002e8772e24d210f69dd526b252b1fc8e275a14a7e65592a62536b64918ff69af9f44baa9367a30acd60c6cd8c34966341640c80456c2226dc817b2e9f16b67a8ce3fdfdb97d77e22b807e0704f041b4c05364080ed2cd4c2382c65145eee2c2f522307911d52352bdb96f70ebfbfdc0a8ae692c8abf651c3a9be85f79c92e047b0cc4f814c4ef9a0d60adf783b2d56ae8db2f47d3756faa6ff6ddc308ea9529bc65de41965fffc2267ae56805035a85c4d1d44030d1cfb3565b8ea0054e43d28b7aea8b55ce0d00be4f47ecaa04ac8a0855bf34c320d5493ffa994f9b0a234a366d30a43a85207ea02614591bbb2f47ba4250b41ea768c54005f695101773f97eab6ff7cfd2aa41c13e77f22bed8d258b54edb0a166770ace3b7d46c06e34ab533cbe6a94bd106f7b805f13a1352a303a6b1857dfd1d0e0a9ca498c264ae283b59ac238af560fc1dc251b1f7749e4fcc840400a387579e26635897a1dbc67652f58b945a1b338ec552f7f9c06b18596cebb97fc4256bb99cc015bedafc826d463109e47c589e9b9a5fee15d8866b375447d329b63fd72eeb771e1f9df6aa440e5f369d264f74a8ae7b19378ad6e04382f284fbd64460bc5fecdc78754c2eb89303b524018a2f0b44bffc945cc40a666b7c7ac12dc3d4f6875a73bb9d6ba974517c760731e463a89a299af17b0683367ecd622eb4c981d98c8f018654fc2c757e6499044f19df4539ecce9d547546646edba3fee4ee621e13fb09fd33023f62359b047a62a6f4fd80b1eb841f2d25cc17f9b48e3227bb4c7b3b1f2c9b88289fd24228ada283b8a4b8819455af0e8b7056008667673acaca9b043882525556cf1e77b8a941a7aa274f0dbb7a0233a39620711b55ad8b499bf6bba8bec862e9e8e61fc4583fe00cd3716021ee24fed4866d2c197fa2137036f203b25fdfd83dd00a5cfe3dab3521e7fdd86d8f98f15de50541c46796f474eda1b0b252b6d31fcde1643453daff3a25866998eecbd18e18f62a46f216b7b6741ab0f8399aa88bdc5dc664100ef22fd396263585417d03c447ec661133ef3db286f32e9a46a1f9d7722892ca59de638007fc289997cb0146b919b8f3865874b6b273cd5402eeae6794291c420651c9ed0ed550853fc4e8068c8466b335eb618f36eb05c415fd87e0013e851b45094dd3b4ed4b340a483b7e7bce3432349cb40b8e6e69eaad0ef2966a012aca041821520541c6f54abfeeaedeb5fcf6fea5d9f9c9cb55c5866f531a92ecf21ce1828a941cd58d51d265524d7786bf28c26ffe3988ab466a4f72d6e50621bd4f9b099f1022c4d33d2ba58c3537cd6cc1555252fa4f56194654899cc21912ba366849bbec7d4f8509b21d0370e808478c5f59d61ac1810795eadacaa835f3a8825e9283b633eb89fd12d754c094bb6091be42171168953324ef59486a9bc501548c1ed4747ea9abc17262cc57f419959e5bf3c42c78c27fc6a20acf67e4f9f0b112f8b9031cf7cd8b1c5411bd641e36e13f84ed385288f14db0c383d78d8b5bd3b47178b6f590d19e7dcc440f2f0e06bf925d73fcd897062d8202608abbf06fdd603a898d5c6213375a2e4685657e5b25b9f4d7beaaa8328718f9b7a3b7fa2792a727400f463ebcb9cc34e237dadf2a80275d6220cac83f9c0e3db9a43e1b4a1e7a51ed446032d144072b1bf47db57199798fb53a2406af4363f26ba2b8512564fe55f549d8a2de61f25eb46017e7ffe42bff153c811a362dd7d66d43daa721fc13f9f83268873fdac4c5a2ce1c9a80f084bb1d8bd9e02dffde0bfd941ebbb3b4d639cd28c0224440f919c057b912076bf1a77ec34f55bb2c6aef6d3e5c512f5baf18a59bc78fc6559c52e1d0498854dae1aef7055c13ebfd37dd3ba82357399ff2dcce288c18e29dd48c7ddfcd4812455551cc7ef8096096879b550248b8221d9b329c26faab84e1339d0cbb7b444fc3adf90b1e4d4afbc54db8f12f4d1e6f1a9aa5f875ad05f2f1aec349182d0af09af375101cef4621aa392feada0b57c2f43ddc946196fa6a7ffd8e2bd8d68d2021f1bb08772b1df63a4fc6af8cf53bc66b8963eb45b7d1dbfd858e853ddbd5123b5b4101680d227c833ff3a924429d7b46eae784f822731aa4dcc23e99a724bae8724eba1e7b65e32dd302cfdcb313e5ef29eb2256be5d38ebc84106f480877f666ba20443f23e27b523bd166fbf6a710e0ccb0e4bee5775f51fc1700c1409adfea92d37bd8354f0106ba5f7907d69b656f6c276e4fa85aa8cbfa06c995dd1637a50f50796d3d03f9fea045bea3832ec2f693f67664cae1e1e83bdf83ce0776963a5f3170a579106fd57e35deca8f5287b29cd708de5ccdc27a960a69f8d74a4651c9ab56981f5a2d1972aa52a4543d908c6ba5727011562fb7e7c8c8a0927e49cc8e871fe8faa78dd9bfe63db90d3cc233f6ff7ddd081ec9c6dc838b2545d657ab434c200da30b05fdbcb9e268a6ab6e27297c2db15b297e5e83dcfaea552179229d78b1f12bd70c81055c53a43767b475fcba88c3d595ecca960d7f3e261b32b66d6f5a1d59c5203ddb5794c2b91769ed9cf99cc51e369bfe3d383be58f9cac834c48c4639f066417b9a6a4d2643c6f6b6e7f1a7504da8e50c8f828d79ef1ba2010d3c5757cfa6c00bdf5e1b6d2009512b291b1a06ba5ecf09a5fbeb7d01a0b757d126e39e9d53f338f7f286257a8daca2e4f8f287a471bb361501d57d82ed43df715db5e5041708b94ba1def6edfb58bebfc7fbfadabc6dec698f770fd429a9e9a57515c16acaf7886b4efde1870694ec191520d7001b1bf9871bb3258bc886017472a793463a4a044018b4a5207207b11c6610357164fcaf8ae4f984419c68eac5ad9eb5b0fe94b73344086d64737b494f5318ee977c0d1c4093be2fe75a8194cf78096aae5481e449330eef0252c03222c009f532d16bc48307aacc6c0e275a60c0ec01b9f93826482fde4218138dfe8ad3023e7694857e19f87d41de93472d4aae1567390d813b9f08a411ede886b530406b2a81c3262dcb6ed0a66273be801e8818cff4857feed54b6e46a512d51d1e7ebc33bf6d4fb4831bc362701e0fbd0b5b759eed1f59b8ca8d23937cddb552ff60835dd03ff79400d5f1f4f47215702df3caea5f09cd084e890286ee2ef8b2486dfe95305bb059fec4d9249f0cec2ed79cd4e0faf9d5f4e823f1681d7c883a11939cd5bfb9ef29d1499e42956a881d3fb010baea7f67b7792d15112e260e054c44e4facb8958d20e567f1c140caf87096e856a706e3d505ca69e5729b88aa3b2f8c5a411abe09b6d4c0825f452b8d1176b0e63fa4d97f1673fbe844d701db33d7cfb525f49c586a46ec4d9f0d79a186a459eb17a8d2efbad50ee1de4c524ffe679307f66830ee14d8181abfafdeb884e58e6bbb8a4c7d482be28a71d12c4eabf4516a7152f3169453230694b2902a2867564d983ec87ffe5be02fa26e9e0ee2a9a24308a0fecfaa9dfc20fceba630b0b1185b88ae35757b6432f11ec58c3e03a56fe307e171429f98d753235a9eba72712c05471c1aa92170fd3d0f2847425f4c379c9586cca6b4dfe4035ac2afecf64e99bde736aac85b7d758c8dbbe098ecb907cb5b39bb156a4da033fe6a52fb46034cb3da251bab3c12033d66fb45661878379b714356dc358c8555153a5b3a30671c99f72d16a6819022a41661cf0f20867c6f735ca9bbe7342019ebae10d5b379bfce208d31f4da78710552473e64cde96c5fefca37bff1234502c529c7db9d102160d5035491eb7334b1df47537d3603e7c374d275af86e7d0fa512d82c14568ce612e1b3af98ca2b46a33700690992e5358a3ef1695c35ae90ed21af6da7eecc7babdea0a4961e58adf59e188eb4a920756e45dc4bc4533db5c80cd22777a209c6ea8cbe2b5d04f5f1eb82e94a6772d7975f3e69302ee938b23a3b8fe0df8108489a5f5e930bb779b9f281b32001cefb9c84898c8a061327034bf2e8ad86eaa9fcd0d28bb048d0cc733ca031bd7579532349ace5b50ba426e25323235aedc78dd372df952ec28ce4446b076c4600bc0720f2db365205b995236f174ec7ba7dd97a74c1a4d062c18e824142a3c292ea132da65645f2aec6d7488c74ea4fbe7e8d26ee035e4c0908ccbcf889136001769158512968f922d2f479f777d3089f7ee91fa16329030ef6d46c4e90385cd92268ebdefc4696925806dae07497524d77e16834ae20e03997d28ea10c0390350627eac70cabc10a36cb72abe1db91002d93ed7efca2c16f0486b03fb639ea450f79bb39b95f1d6bd4d46762f5d65b5f196c21addb92d0fdcff0a57e12c706caf0020bc4d0708297059b8d77ca41e5132ef606792043c8365741adbe1185f4659771a7feeb70c6b935ee7489456362e7c035b8acea9cc2cef5f8382168c78970c8c95ee58e229ec91ca90f6c9f641d4774411b1c933b93ab0a7c387c47226533acb24d5e1b399878d88cf1a7448d18f8dff7226ec2666f6c2d042f99e8d379399738a21177556718e900ceb623fd4ceffc25b0785c335a8ffee4bb0aafc1232ef97a91a768dfc6af2cba969938faf6b1cf13674b1a6f8d316985e04149bcd52ccb212494c27c3cec49b1fb0898d295c04571ad25ccd8967c4d7ba4501dedef35629035fc9d3f7f9240293bc03ff2843683747734690379bfca64b1546c9c7dde20791e89c73e4621757207e5200fdaf02857a6666849d682f0f1126d731e1ba6f25f357f0323082f5190cf37ad60d4dbf388b6661464dc6fb9f22d4caac26c09576fbba73d8b3941c10a4e34eeec7a9c55d0e0fefb6dd305b16d4e77bf4831ca7b27285227b3f516114437671a650c0229a8b67605f2327854799d910e1552a01f543b7eff53524c5f776075b38d629636f79fe869531458a24aca107b43563e70fb6dc19b6402c5bfc1944b8cda08d7dec97549b35151ba4c8a9f4507b5ed23e4b869efac00129846f68f7cde6a5ae5986e5050000ba07f1d3d5ef83a15a14e5fc9a602a5451190d5ac00a69860bdd4d170655adf19b1f01468d72e7d8be0393f3336978af453376dde2726f280e722d27d25d7ef8379e62604f4927e5e1533b70f8df340d3e403e8da718753441ba5e8e84141fd5093c620b3687022e844c2593fe8a2450802a895a8611ccee3df03cea3d94ba9d45129583562af84cd6dad402c664d4f122c8a078b3f098b29755df66059595ce3e1424339ebc722de94b32efd984875648535f729ca14b863621518d6911e43e7fe34caa225dd5e7fc1e9a623bcd91662383632da2d0fb1d1c1e091ff25e41e3e34699c168d354afd748514c98a21ea0b3bd27258f251caf174e914ffa6fc0e1482cc7d9cafb116e401462bdb7e7b0b07f03bab7c8758e91fa5b9f3c8ae2d4874dd6e75626da7552fa03168fac5a804c834368dbe36ffbe313f2f126a4f104b47088f625f751794485f083b74a2b00d40700f4728fff3230d84c7cf6099e835d95fc2adee07ad3505a1a11b32f9b5bbf347ce85c8d3db9e3122ce623e89028d33c120ca54d13bca6584e369a23af07b28017cad2ce1bc966902c705da53d0524c8fb80b2ba6044b5551c444024e55d95af8ff87b78e3972036a73bf01f88ec4911409da7151fbbed7fa3b209c2522476103a68675cd110ebb93bb3a123bc5987a97a7f4407bfebeb692861074be0e45bc7110668336bea95fc626ce10dc9cbb9bb2bfa9528823767a7a4c09d64d1ca73814c336358566397194c4d9cdf1eb2db6e31da624812645362777b552feb6e641548a7044d95ff3cdfbe3d8f12f55fad1d110f2890989d159f50c2a59ccc53e36f3ce7a6a0c8acd00db28bd4b5b09d2f1f1b4a2a23a6f6cffb6ac1ee7a94ee4ec01e41f1174b1cd241c42748f5999679338444bc58f3ddf46e453a4d22eda79d5955304fc40f5037a2f6f2e42f05c40122218481a6f074d9dc6817caaade208a391dbf012c07094c5cea7f344bfe7485f210633c30ca9ced8340ac1a0b019bc66f1ff6a6c004407756b7c954f4ca68b09e5aabf47dc867b58ff6ebc43e86eef14f8e2a88ba324e244b0062c8964b66ef9ebd949cb79f8116ea9199e5a9a725581c612eb6e21ed764d046602bbbf4c98749315a476ae443e4763f85fbda92ad7b49da560f3d821d7d1fcccd775d3bb370aac83c6fd2f6a33cc43fb9ba9814d79fff3df8b05c5c801c3de7f31d8bbd8eef1197be8ecad0b0702b84dc0a183be156e3ac45ba22fa5b96b8a54ce741048867df9f7257d659bb3420915d68b98ee08947fdeb24a1ce5ac46bfbd9f603ec9cc287dda405067383b2aadd43ebe8b54b84142f33118692a2fd01ad79cf2797b95114602866cc9b60a0bb47a66672611c9ae6a6b9d743d668eb522befc26673cd6fe27e9ac743d97d1030ad2e04fb07a3f89b35264c6b327f013ea02d0646e8860b554fc08a6a4fc1f3f11ff607b82ffc89b5454ef634e0d94df4d0af32089b43b5d62fdcebc6f2be95e2a19597a4ae11485d363e27a4e56b5b9dba4979ad94e8b320b1ad4117c5f88a438b3a976bf922abd532aae7346fa80ab1c41d9f30dfa982caec50a349bea99462f209c8c64adc8cc221a5809778b081e332c6c2c4825fff96b87c7079cba76f0ffdea5d0423adb7a79a7da2c82f4b8aa6930d943cbe4e1b33254a83543a85b94685e97e80591e768f9f9a6a2d4dd84c43a429d030fc44fd677d2da34f9811841dddc88e0fbd5654eacf48a1a200f3dcce8024ca1bd152f903f35d71249806ee3aa8aef7587b3fb864e42ba3997c688bbd5a7d5672fb113d248148d445a085897fc9f64d2a1f1c6097b4c0cdfef4ff98f9d7cfa330afc82162d978e76f706aa50514e883d72ab1e00f24470334fbc3bbdc746485c5649158e3d5d8b18189e8dc0b15e817aa66a8abcf8396c4377282bcd7661e34fbfe488a380dcfdb9bc09480063ad0b2ab2a66af6780262da7728a2be042fc0434af16bfab113329adbfba05754841d8f7fc40689a08556fed38770d3c5120ce1111831dbc778f5c63ae3fe633231dec130e76cc9013299c7839eb1b58e72bea2e7e044a6bedefc1165f94e3d8de52def4a489f9093d421924906cf62dee7ad22c325982d6968738b83ea0b76d08f5a3c3cd309829f99b47b51ce4ce107c2d9fe925910343dbe5ec825102093de17ee4e06b7643aaa351d48ef2a24009fc3ac978f58b81cb54d810d78c38d39e8a30717935941c7be8110e4c3b6e7c076421cdf19028ad4da6a6e919591366cf815c9e448e428e6fac9bd18fccfbdaf5a890a8fdf52f218115a5d0fac20c8f17971de7608ce874bde2b612b1d973c2975c8d0eec42b9ed55f9b8af7f34b681a2ddee222b61bef1eda53760f1aaf4d853b2cdea21ae52fa9d21af11f339dd68d9d8eb6c304604d68aa491ed643de409db3e1b961d778e0d3561f0f35d867d0e8a63918a3f66e0891bebaf9aaf9ed38396ba57f8c24542ff962762e4d26002a6d6c9189f2c2fabe3d9126b367334b6de024a69541689b611f51e33ccfeda5fa96bf4f70e9b9a332d3690f8a71183e8466798dea11ab71583f63ed5b620b2922912ffb83022ab848989f57b5d32ea8340d8c19d1ba4a592e2350190db23205215917110924937fd49a39e58aa531573674d1d676d744e212babf31f5f575d65376995178483cb594a993cc9900cc6d309f0b890c2bcfe517c0e70d0675421db2ef418b303cb8d176bbfcaf3a01d7fea42b9b8c8032bf7c4c950e5162e3a346b736d7839a8cc3b748e63231b575be1c1d49e80f3e5267b904a48a3c1db530b643d60917b26a64c8a504dd8b1b3461fb9ece942503f2aa0dcab37850b80d1edd90d9bc0d1d2a645e88eeff5bff4e0f2bef966eebe4207b88a35490c26d6b1ed46249064097e6785129d79906b953a305f279910e4b3129815b503bec04c21eade902342cfbed175676bb8c0e0dc3197cf6e1f2b1ae04f44b8568eeb373c67e2aa618757b8b589a1a826abfd25516dcd5dbae071ac0166d7b838eb3deb320b77cdbc9100f6a31144f4d0ee77c43cb5258521b1d4a0a8b98986c35a51759fae32d102217abf2408c1d19e555117eb9b27e654a28a508bc490adce3e14a9328afeebb290bad535885f2a2aba5b8d42005ffafb18132eaa3979e6628cab104d7f9e387ed1775c9f0826786d4300181b9431d663e1f039b80e6fef332d484f274ad15a9888aa04f84a6478c78e2e86eb2b0d2316a9e3d82de32feeaad06e971c59e4536a281ca5aeea91ae072a07a47883e26dc5477f6a0b4f101ed93f91658e4290726229be6bbd1e9ee659cabee8aecdf913ceb3e57d3050c97e548a3908e994278bef1eb0050101d30bb5c07dbdd99593b96fe70a57b1d86c5377c77164f83e6989d682fe6664a9ba3ed5b751c87a143dead37d437beb74a9465bdebf8e6594e0d0c3e0c6101ce6b4226ef2f7018ee5d29f6f490c5acb063831b980b80b56cfa65476ffd10349314dcb013ac8b9cb2be20be12f51842fb1d21c7188fc6a223b8d8af6aa21e1ca554029525ad182fcb562ab81abe531e7abd8538b155a76dfdfe26706506da931a46cc7a2a1cc04a64d87ba920b3cb79009270c7a56b310a1397c01477177760b356584f6c76b03abf22ae7a4922d58098bfef7148be079c671cf97aae93848bd13a2367dcbf87676eaaea2b117bb56f19fe5fdfea37b0f81159bb6c0fc10ebf567d508fc11f0913d5d6fc914ef1406ca26a98def10e55344976e95cfe31c19f5dba18505435ee17b8057a1837c9001709b051b675b07a1e1c1cc97a69dab56c04ca6302a057b77a8b68a1e771d2d0d862d48f5022adb8fa34ff20a77145172e10ea0d5f0b343903417ff284ccaa5aa98207c142adc04ab6636fd5cc5bbcf84dba2dcb6e441713df7f77045408c19813f2c461c9087b49c37ee695c4da73625c243f4a23b61dce50653cf5ec812dc68222cbddf1001250906c5b08741dd444281c4c685cfe187e97144eb46ed0e50d81f19e2eda1e3ea75012f24c7d64914176b9559bb244978b864dee49e27b5ced662e7dc1c7cc315461dc80addfe9e2242a1b53de952bd8cc73ca0b876182eb544da8c6a6a0d18de0f87aeec2ec2c0698686bfc9d70df9a2a507a7f2555c93a677be1ea774f64a97e2c15bdacc1e984a4fc5739a72438f5ac140c7226c3bcd6e91852c9f00b6b6fddeae2eeb9fd8c09eedc69afa01125252dd9d5a32e1c5a327b6f20c874ba75cb1b80674c0c3a274e27ebbed8a83906d03d5acfdb74048f5363614677daec68ae01eaf4e2f1809ef47a9ba1340bfee2bc1dea6e5a10624324eb3a873d1356231da027f57ecccef9eda5bf163eeb97c1180723318e92eab5b8d8bc852f646ee8ccc2f6a23a0f2554d9e57dc41e00bbbef97729312cdb410446b0f92c85eec99d3a3fbff349033836fc7aa5f64ec66150c77a02513a351dd625d86b59a58564398b2545b9c8273465da4959b2cb74a134b4849090bcfb72e60cd28077d6bcc36bae80f0ffccea269e18f8a9917ec0398e1ded8e6927ded3941e87de8e5e7580281b42066d7965a1a7647c70f6ded6beb512b833f7e49ac4de6a5c0a99c9b0d307ec4ef7a241d1f34179885b3b349d2bb2c215f4eff790391cd7b70dce87ab2cacb56a3017f5132c2880a6a87a1dc0c9f44169b788a656e3202df310e655f7569693de49bec14132423951fda4e768914a78f9b33733fe3b1ed87d575d21ecfea542784f7a3a07be7a59bd5e208c25b87d9ee66f4d690230fab794700ae55c5ee3e69c95b0c3aa15f11d5bda2057e3c057719c0812c78d63e11358411a36edcba174ddc16cbb5208a4ee806878b62734675f57fb146824265ac9d0e1bc606755183f9d71451e3449e460ebe3276c209af835d4c2b6e9d3470a22eb2046ac80406bd147110ca9e31cb3f6dc7b46c82b05f10306184f8470eb4bc53462d3dcaa51e0602e3a9048c1c848fc51245d246f819d999c297ed255a292b678555df768037eda7d7dd36c5f544a046de2e5a86ad1caa51e3a69d215bf4506a0e7375337cc75d54ffb8c3cfcecadf3a30bf98f529ee1fa7bf7d0e437cda0f259675b1f4f6dddfd0ec5fd921a8a8801275d09298203f371db2222da4089323ea0cb4b2e22b6065b0b7b6820f23f20d3432a5255f4e9179c69f3ae77642b546ffa2197f32e5826ee3b835d5b8d73eb7a628f9caa59b6581833d23d959171d178b1b8768a9cf088ac969d2ad48f1f3e1f6add3a41cc86cf3dfe7f89498ad091882079c5e78e0d468d719fab40c644d741c49b285434c26450223f0352ea95aaf2d96bd1b01154e39e97e0546c57179c5969434c88ccd92fe426357fb9d9f8849a075bef46ea70292af7ef079825f4276d8fb90157a1e606bceb485ee43a25fbd2752c4548f8748aaeecef8012f9fce521e0e404ed389232dc625c1f48737c7b97582acca01220dede672bfd8d1fd205bba1147cda6ce237a8bdd2058437dab0262f77d8ccbbec9cbb3d5acce4cfa66b397793a2161ae485c4011a23678f3aed4a125a002d2282aa41967b833bee7b2c6e7543180220331751219dd94b439f5df683f64045420cb8fb80917677f92ce69de558b187a43f6eeb2667ee11347dfb62bd7a7399a5a79ad357f4a038c92fa77bb21498fa0292642e45946e0cfe94b2f0631583e7d9ad39b99f347901639857636ecfca962ff3f012032e07a05f8ea4a6a6c19d3bc1a6c5f6680ab981152508c4b879f7bf4641ea377daf039f761b0903beee97559d5d315739bcb28d393f99604c2009ffe8c17695d4f22c5caf8c20038ec9e2c33c42bbb15c3b623e4eed9320e715cb28130406bb462462ecaba368c418a0250dfcba2094f5882edc2d2e46ae403ee8987bfd0411fe44961f0d2589c1889c88870a0b440c9dc0e4ee4b83e648af78a8e23a5991b0dc6c3d5e43ab54bec55f672bbd078ec5749893baec27dba4422445ea06425808d484f83bd4cee0373a80e60c0f498005e92adb0137e45320bc5767fbcc8b8cfa52d135c1ea3a0da0344be1b3607c06a13467b881fab2b7a1672bf42d1a0b328fa0fe0302142e4d28c862cab0b5c8ef70f99075bf5bef51dde80630d042845e284e81e7d3949ecce2e1cb68d4bc1e4aa83ac74e8a0d1c9995bd0aef2076e1d8ca9272ac96a939d36b3073fbdb020596327aa73be854ed2a6440d27e8389e478139afd16de23fa0d1ab2a3b79dbaff16ffc9dfcd12b17466bbc878cb2d85dd1a070802df7d07db0df06b6d03037d3d4d88701942dadc076e0edb94ed986385d62f8a68f24d3445b66fc9d4318b63cf51834fd32083e8d9f62b0c03560ac81e301be83d384db0319e961c07c8db6eff2b74b46eed8128357654ebfa87325a8450af7a526a8c3b6b2d157e51ff3fe9cd58803464869a10ac6ec5821338884d1c6176e8eea10aa4026cbdfe31dda5a780b5125ccc075c01897bde1ac762affc10ef168161c1384119acaebc8fc5042f9ed00893b704eab471549f77a5d0e6b5b81f0d80e9c05330ab21813dab60d60cbf7f8f33adf4062b29c3a2f6bc758cf096f1916efff745ebc6cb8d104149ed14236c70bc61a9749e947b48e782e0448a3f8f7d4aaa0409ebe9395f6e06f4bdf170f832b217d3515fa8261c4715193b5ede8a8f733063216091d945168cbfd8313a405a6a22619a1dfaadd694c09b32f0ec51276702455ed9abe52c4b9c37a9cc36442cc26e4670d39de8e119ef43af895860fd251c629ac13f913ea5673297771bef2b121e5ca7e502b24dfc4546af150fa8bcedfb3fb6b8bb14b98d32079c1ce61541ed0eb006db50d25119b6a9ff08216028422a41c9bba1bb7d80dd341a1969f514722a0a76b637dfd456987143c939dfed37c3c109f2de3a45a89529b139593948cd704667aaa400c5911579115f653a06057bed9f501c43fb8dd4ef7756c8c25f2bfdbe2c251c09e655f9d408ce52fa85550f1f12884f0527c6c4599c753854cf1acd92ce8be2f1016550eccff159e08f7192fb8ea651fbbc58142597fd3b29eb7829dfe034287e3dcfc87e0d4aae90a71d8c94292bd083a644aefee71c001b29c762f10ac67751092e64adf8ca1d8a9ee42070911f7412fa258ad02afa603d552c8ed7253053fb6ef69b80d7c4a1a89de49e5f775b0dc954726039d3a71bf228b6470d1f303f69cbe0e81ee79472f4243416d52ca15ed78b309b731c2a1891dc4654e20a34bd0b06c37bb1cadb2212e1caede8fe74883e59d2a0da0b5b4c33d577a092ffc3a4efce09b4d85a73c7bbae4f7462cb449f7aba4d1e4d0680e84c3a083dfae68416f9227102cf115e6075780e4d8e350f0c41180c1f80439ebb71652e07641d9e27b73a509aebfe67772cb68b5ce23a938e95784f0ce8296c38cd76ba7d629a6ffc93f0aabd02bf1a8e773312e096a4f458598cb66b72dd443c4e35b7e647c0999375348b908927071902e406efb308d09a511f695f90716358bf2ce6a3effc0e88388381e37b3eea9e804101e2bcc56f98361da3d3c27ae0e3e016bf94197c35c81cdc041f8ba77d8d07a1689241c13677805cc5c5c8edbc8a3367afd2cac2ce6fbc319e31f589916a8948cbde473dd919610b0873f392098dffb14274711c2bbe275980bf5e07d2c93714c570d8f4f3c5cfff6dc40924e3a4f37916ddc95a658b40172e3dc93552c9a91d4bdf8a3094df592d005ead9818195f82c3cab3191f6e82c5aa001ff548dcaa2f22aadd6e120aebd6f9f9f3e4b1706072b696cc3d20a0907c74ecbd1359f7656a3f4193cbdcf38b4de3957a8b2e2b4356f4cb36cd3ff6a684e2f08be379c00cb307afddb9b6a8b2732a71982946e683bf2ea4f14b05a70a7ad5fe23636c0fb4eb9da6dedc4c854b170131b32484dd2cd2f311708cf1e569b57c5898aaee025b0f3b788055f0154cb7a0b233982241e0a238cd6d0dd7a79ef6fa96b7cef5d3c39a228a823518c6a3dc4a132d0d22550c7f45bc1a890cd1976327ec0ba3d287a27c106f464c815865a2051460b54aa158d9c57d854f94e30a18e09f12d1576575481129bd79691554e2530c4544412a9f1be673726df5c63284d0c0a2c620efc6cc1ecbb51ce73432e83e7fe83e806eaf3c4342ba070ccc13584c5c082609433780e878c9b4048bddeef693cf0c28e662e73f72d147242329d9c4b64c2ce022126b41d6e16fc4dd30a81783da62024e1278f0463c1c9f811cd595b3b93ca64244cc52fc2b1b8efa1ed7b444334500e53e77ec583836c9913a02d98881c85c63309ba9f8c2edde0567d660f70df5732ef4af771828863323cb0a4560127a36951e7399d8cc9ca58fd356baf5149d58560c1dd014b5cc9cb9f5bcf1afc0bccc0a6339ff917863a09160cb6fb6675fda4fa5525c10b98913c3bc8856f3b095b36383f5006108faa5c709fe4673edcd03290e7e550b58b87816f04bc742cc919f0db5d433446cae701b5d92571e89e650ab499ec79562583f33dcb5af10090bb130b39aae8a5a70cd4627cf2781692c9d9aea760cc0b398c9d4ff8a850ab97179a2ceed1e8572ac128e7c472960598854aaefe6aeb6ea59f3c9429949b2f727d13dae609a0d968ef31dcf9d83719332358e82dc1dc7a50508bf51e72287f18320bc74b2b77789856c5ea802d9cf196c3fb35f47c6e3efed72347fd306eae67ae3871945b69b8e154c591fc18881494a598d9bfbf73f2959059a28e5df796dc2e6ad7d16684101eb109ee2c1000042988895ecd5ed117b05355baa5a748112c39f95a54bdf7af9fda551f1237dfe064af8246c8e63d2a824594f5ec2343cf35d35b314ce931e666fa9b996952d3beb32d0e0f5488c6ebac757172a0417ebf0854aa691744d68b221b038fc89ac7aa2ff9cee72290a7beb76cf46f32753364745d3cc1e6d9ac044ec35ca39cfe58ff97723215041840c03d580771f86ad9ca203788e9bdfb0091259191011d6b5fd7d3044793e95e3d3577c0d4aaa38919f41f717c8e851cab642063f903bbd2281d9014e3500f84766f55d9c7aaffcc637e83ceaf7715b06186315176a78601ce078660ee617a18e59ea702b602aa0957bd2a9becf4cc004c54e271ad0a65682f409175b5abaee46def9fe528cb859adc683afb4b6b4f88a7ef245313386ee83997abbe4933e16972e0171663acf295ad781569f71042d6db86facabf70129777de293850d790c1ff6ca6bd252c3f9aaec4fc7a825a8eb050c8f7cd90c78cc62898658eaa6a32ccec79c6b28ca2d58dd7fd56be8af2e26d7c14cc10e03c1c3f9b54e778019b814f84a83bfea6e1e8ec65357a006fea139749690e7822af82202bdce39b31eadd451b712f953c165af39d902cfc4d3497b15478f3847ca366762b6318a4e6f1b4d068fb25133b204c1fe9df18bead25df2436d829d1d054557264bc0e95aa6e0e3f527e84ba2cb98c56775ddcce779d0e9b973fda17681738f113a714f535f81559a6e356fbe2208f502f3499bb115c3ef5e8b36362cb37e3c70bbb05e5c2ef0db76b76abc83019b7812b34004a6f7fba6d87fe15a6cb8164baedbadf7c323f89accfc570a46fcd3cf113de3784a6543c0864a03e6e351ca99d4c9de287a72f04be00866b2a273af49805b9edcc672807ff9c4bffb8e8adc6b9abe5f833a198b0ab68c64ff4e31aeaad76aa2180225416505ff8ee019521ea9486ebef0b11988e5c7356349b856c0cf46335d636beab97e6e16b095460474b6e28ef435b6ec145c47351c5167b46844bfc12db73dfe53c9ad63cc5f45275ddbcd183ddd17ed1b50e4d631da4747a33d5b3e1f161e4175af07772a598b1cafc5cf7dcb5ef55f3a24fa0df0a42a56e1890c089dd374a13a63c48bfb27ae3d68e021f567186c362fc1ebd24b56f3263c3063a6bf30dbc7791892490fd362495f97e2077bbe0bb82ced285afd90a8850602fe664a2c56305cc97dce4891a6cfdff912f889fcdd1b08816a37d4410d7df0efbeaff8db9f1cea1db62e1257fa5545a59c1af6df9c0d202bcea33b3e54340ea3bd5cb5aea44d26edc1ac4efb399946f48aba3c5f9880b67d0a226b57318db0cf42d9ab147e72cbf38596bec2d792592ebd569c7262cbafeca2b72222f1e24ca9685263154a0067a2497b92cd7d74d8ff55f89f4976f2390e8444e9c3776ea73b9c28834329b2ba216ca385c6ba95b986f614818c2f07670a799ca86d2a9fa83f721430b30d885244f8db43dd3ad5bafe53978db92034dad3cd404e4b30dd002ebde5ec233ef244ab3cdcebb2be4a0d393a0c233c18f8790fa4892ff0c4b0a6871ba2d984ae77a7606f2742cfdd8784fe2a80813a2c3e8e95938b08fc8422d37c21a8232d1824f6789441e18a0373394d7f2492d41dda18c4fc285f8fb053b4fc3b1a136ee6def9ea8020c03e2df19d99fb16dd710e148074fd8e59182e0615c8ea804688ffd0e1f42879f54133220b7f227f22753efcf62373d8809a896c9d9ef40f942844e1663b855309927a13ebe1b19d0b514d371bfb9d58ed20be48785bb6b518cec63ab5a37cbca48e40fd44d251ff79f9a4857e273478a57c4baf3deed16467a9654e03d967ea2c95ad6cd53d8b268f448a1e99d0618d1a754a5745e0b51c3bb1d06c4c635089d32732cbf825786ef364f96d06c2b32a3d9db283a4eeafe9d4f6cda1e954176ff95e9784f0d85a40284960111da503198cbbc5f4451a9270d5070265de73895153c95e48fb80992a8cc9013e04aff093d4b60b98d50d33ca270651ee4db03217233c82b199c2e92c0732ddad4d2ac1c09cc8a3e6829566a960b379d8d72db24b74b131e4817a5f1062997f6d35b210aa94933c9762312131cff1d86f7fcd74cb25be229228f4e0e61926ddcee9d630f82ec0bdce389165c2067d98499302e61eb66d779d46850050aa270b077d308625651fbfa7eb540520b1b3c3018221d91eb9eba8a2239a96a515862f3ca8fa87d7fcd482e260a20f279de48a7edc5657173582ed95fbcaf0f72bf1f3609c597c1f19cba3e731d01ae7ed2402b5a07b1f777c7a7d25bd2631aed9544dd9e399ecb2feb9a604a0c382963e6532fece250684a3752fad25e52a35f5c9a9ee307b0b70b98444531e4233753b60c7078f372e6025160f2fe45260d056837b2e25ddbe536a5d88eb655fd94f0fb3cbe4cee44927ceb1f511dacee320502e8c29d5ab29e6cb324e553ef470e442e37cc14e66d98ae531275987ce93e45e173760dc01f18d22e8c4de6c6bf20c5dde113e2b92452e197f0ff4eb08079f450e1b51fcfe58dc42f13f654bd4c3850cf7be0fdcb5f49f045f266a75b0f24f905d4a4e543018fd5dbe7f24b0cc19ead661a31d2d6a6f7d8f07304bd936295d7a72da93547b3158d8dfebe17be70637157b67ddc4311656b29c4d3379bfaac3140a23ac76b4d0f20c397dfa1eb0ea2cb9af7a3c356a0f7174769e8aed7cf04dee7e40c955ede083fff1851e15fd2b84e1197af76cf69656d0c25255a5632c394198bd7aa95672034ac26d66a18669d2db8791137a1251ad685301c70a4b48188b8aace2187ec2319936b62332151316d613a80d1c5ea33b92a9b79fd94c580dfec0b8093023f9a2adc908a087683b1f58559309ffd6025144b111a513a7f877c3192c30b73ba25d105989f568b62ae0741b8a4e581317f2b9c62a3deda80de8338052094745681f6bc3dabbdab698b4f9c77d8d6fe538d04997eab81ced904197b79a711d0c23278ba71661aa0c0ad7c6925ef8d97018bdbfa9638588ba933cc77b6887464b7f7353e73ea4f972bf79f810e0ecd64e85b05d92f6186212a02da6a1649559e5abeada44711c38fe3350410207263af7185e84a4e84948ed7de31d09d5cb48737faaab349ae1f44cd74567e763173e3f9dab3f2114a684c4a44aa263481b87335f233396536d8c6fcac9510e9d4a73f954f9cc796830b3e42d418c425aee6a37e540165a7063479184bb9f66541a042df62fd3c40f7b5c51570d45e6999d65e58fe7575f9e439cf9be58400d826df4526ff17eb3ae16fd4ec1e2e628a8bb32024d7616c7c8223bc28324bd69861529c54d08a34992fb5552c09aaa1b99304e93a214edc6a25147860b6dc4f7d149440ba43c699a95056eedec559a8e78f004a85183e3eb3b76b044621fda0da5fe8b0401608d961a7357c1a8de87627382a74abe81170941a993a1f5307aaadeaa2be052328702c7da9c9464676262c80c19f559303b6fc632bccc6f87c135ba57825a5b433f772e953e7752e9a4826ee02605293d321f36d367dd4b45cd2abf2af32bea4949159fd3827fa5675a9561fb6a1550f3c0472a301031b4c09e72093bb2e5bc0d4a5d923bdda96981d201c06d5ea7df1489a1e5a49d576d25fe2ebc574ff08d7353bb09a181af0d0d21aad8a8fcfe5de8dfef3052ccf3b2cb890aaa19d6c17ec2cf3e339387b813986fef7edd22feafaf36b93fb3f738029f4cae5159860eb2bfc12d9725056a798613e9c26d3adf630806193d152bcf66eafd262c0fb599a8b614ed01a977d88bda72bd430e821215f003d1255460fb5533d34603d4e50e2ab091ca15467d76663eff60109efb276b83cc891e8aed61d65e7594e05def3b44cf1120f78fce7255db9965ffc07c2db2a1239ad039e4db6d20971e153375f7b02e0fb55b53086296726ea352ebe804636ddc5755febf9d36b7e39b39164c96b9342ae4246ed6bfb17f5d30ff5dd980a087042c7bc48cf56b28cec6613165271f2995b3acd4ac1f348979ff5a04999c18d75e60d4a31e19c35c47b3974a056f4adee5c39620b795ff65afef8a61146d0494426e2e06da04dfc0b1eac6527a0c1953c593fed027f688e6027e7b13ce2fc79a7acd87e6cec73c1fcab97e1e8d02c65bde42ce11229fb194f5461f5c05632c1cd9688db4223d981bf9d7d35638707100c10dcd5411a8effb4136d8b5b1f1ea1109ab913d43749ea1b2af82024d587c0cc1a208a6cc1761396aa3dafc934fb46ade29e2ffc6e8c902bfea594e79bc350a773286aa871aa32771cd8daff993249a991ea6a8800b6129f358f88ded316fb816093e991809f8365571b8b6ea360a4bd54666792e76ab17bf8fccf112f62a07d782b5717546511513629b15b0090c419cedb6e5ebb287a03199beff67dbadd25e8e810b9d42953277ec6eb3244da9b789531c95b7af9f62d476fe831d7c61cbaa982d08621c1de1e8f40cd01d283e89113a829e2a54cff3347a934f105d943ce5993aa51bbe31ed71c0658ac8575b80872c7bdf4f8030a768030bcb70d19c989d78c250522b10a328b5c18f4042ba447c3f9c9fbd7dad68268a68f2646e95555b079df70969ddf7bd045484afbfe8cb1d6ccadd7aa344fa2e1dab8f472fdb1716998fc15a2a73f8729391002e528d76ab90c49a350a8209072d2a6552a209786f365bc42f4d0dde9da6aecab7980346cb980ddb3d535848132a4bc1e3007c58471a7aadde3f47b898bc0bdef3e2805a490ad6562fa32907c8f0e6bc9e3f25808c5ff556f1569192d699ad0ebdac7f732e7d12d83e416652b56d21bcadf6552678e5e648500667cc4173819a2172a591eec912f2cdeb7c17c3ce2f859cf8d68004f87d02457170c49419059b336fc1b2ae976d32aaf8315543b3a1ce2987f9f9ea2e4ccc62ee95892e8a22d570297674f6592a9ba25ab4e8ee9f64d7d1ca2b26cf7284fba680f499ee6b7cf17bddcc4b779f2daa54deed133cb99833fd646cd2df1af8f44d47e6d4b734c0beb6d9025b5ff0ff35b6c68aa74f2208f2d5bc0c88e59c147b93a4fc954c1cb838eaae8de1fc0420d558e77dbe3d731a15d897c7e9d198ec61d03ca7f13abeaa69c4bd61a4c71f1949ed5ddb733eb66c6bed9fa9abdc56bc7818ead8a5a4a02bbb1283c19972d9b475e603fcd1857b0af084eb58d990f791dda3d0621d8bd2802d516effd03afdefc432625500704e1238c229493f88e51d677fb0613eed8f561dccc49b060a489982d9b6152fbc50b9beef1ed3b35167e50ff5e7abeea3bfc2127ed5a8885e09a467cd75491d104d8426ce25eca49e877674462279beb23456b2b6a07ce98a2e745da5c84d14a8069b6f4d1663dbb2a0eb2c2b789881537fef67ecea3972b6b0c78710e4211c1abd38431afb130f1f807c0b4d982f82ed4c3f0391c1d71a517629cd98565cfd1928038136d57d2c5d60d8d49100455d09568240ce0ba97d9552dedea1d67638aedf0da2151961e0bfd5ed34524ac250dcb49bb6862c80455d17b3d1fb4f27d748f1b32d565f10e8070d1fa90946bcc94a56ce2dbc1c962ae11c94acb85ae2219fd1a8acc390ad1d672f136a40541470da048c6aac6da2be764609a0e64c66a09a1e94084fb72a75ba85316e8b0db7a4572bb26929150ab970f1f3e5b00c1af177438bd67416f31592651500f843f3a9a810fbea59bf42af1ef7276a43659ca338541db3d3ed1d0e7f68a31e524c2fab57a416a097ff6c312c320c4427866419d067b2f525db487b6d6230509f8e6310a747d4fe3e3b9f2808332165e0ee30bdcade74e817d835fdb5b4163352dadc00f09a7d1bf09e81ef1b79cd402236171653bc238e4603313cee38b30b6ed8a0561da06659a241680f536373134af88317165ddb0065cf3dd3b1651795d3f3eee1ce90eeccb462cbae03954cac1bb104ed971d03e2e4ed87f66698c31632030c13b9c6416ef2bdc37d01f8b19f13bd1ff58960d5f2c25d738ca9edd3a83a74c05f9907162434180b91ceb02b53db122d5f534937701579cb79d202c771275a4bcd82bfb0fad3df54605b9632792eff4fb4db4565db865c985db4262d63762bce201a995ed0174e1b79b60115786c1128912c73415e955191b3c238e076ab8fab4baeb5bf42d23e59a78e924cfcebf45a0bfbccbf037e0d0c5da60e87a8f204d57590fd37612996bafe2d978a817582e46a3be8fe5209f72e4debef1377a14734bb4079caa6d0db06d32c2e3caf5c289efebca51cc93f0769852b8bf56a2f7ff87803af078a6eeb56d0fa1ef4f6930630732c8598ffbfb3ba98596728a37ab2e0fe2cb9caa992d36ca9452fdbcb53e6182316e2ed1194a9ec8b02ff5929fd61f76e9fe1cf400d6830a4189ca928e88deb98b6dcb4fbce077c7177f037128c7217d2eb2501cfac52e257644f3a08e4ddb2bef529f0f4b92173898816cceabb09963520ef2bb678a7b7b72a45a75217df71e78a89c2bad2e85ccd0b90e511bf427fb9bce9646023a2bb40a048d51db55bb75ee774a26492f0ad22b179b0f6a1f9de930a6985ec8740636bc8e8c6e6fbaa4c0c4e234f8dfa1294b0f52c18ae48b08702c3bfc35bb52f5630328214f2df5087b79ecee2023b7a60e24c1a17f7f49ea18e3540048d5929fb123f92a4bbb21a18b2e73a2de5f8011533b41fe8bf88fb0a542c857af64a818c8f94a140a32b4eadb3508b8e994f73bbd2d5d09e4117f0eaeba2a650e73dee6cb6586b679a5f75f389843619f10a246c4c8e707ad3ac5f05eddeae6ba3f94a225e193ed8be7a0b904966a903c39601b4e7d5332622dc82ff61dad707fd65fa594018b318bb4d0b8f57dfdd39e209a783b71dee57b1d384cb7887032fc4f1b580f972d0ec5c0e3865ab6a53bca65c58f237ebc32a4f661924f6d4bb32d840e4e0d3e6f1fc85195259f55c81588b6a23042517f449074052d34a457541920de50eec27d0726936df31e16baade19aadaed74c8fa56d643a8c8b6bd196025faacd6b16ddaef51154e0020a53f3eec332b4aaea9f0524c6fbd4ee723eb4cdad6e69df307c1e10cce2b3d78200074a26d7e6fded221fbadc4def8a9d5c7fdda0e9f1efe213fda57d3e2253e441ce177cdbdf5c13b5c5b5d71083cd5a2906f2d39a72c5474b0167f72e555181fd4bac25d7335c7dbdce66ac88acc56e93e16828b402af918fdec9473f5bd8e3e3adbecc84a8c7ef57f371242e0f4bb841254a1cc3eeda52b22ecc2a530ab1214ecc54a6e1fd60054d1137150c4d808a43bdfc4850c440e44b2f767c75851e25dbe0197e22d335e47d940d2280966679a31738f2edc583e65c2cbcd927c2ae97343af8f56f21eba94993e803f5025ac77e2101e517dadbea26aab4d19e11cd583d4b372b9bcf32e317a1f372166c90ce8c54d0c2f9e5734178d474f9aa1b2aa8444de686d279a7f6ef9e9a43105f70fec42bc2077ff96b7477d4f1d65e1dad81c63447f8ed8953839189744c9fb7668e6453f355fcfe9b90b75146c4c1ad31d8dfd5afa1df68f9998d218cc6ca7ca01668f2bf3f9cf29bc39a4756854290a08a6a914646a854073d342f1f1026eea0f6347f9be47b394971b79b1f394e1c6c28e16d69835538dd90468f902425ad433ded638afd185c686bc49f9bedb7c625f5eb081ca15955b22e8d7f77774905bd7ee8f0feb760657e199866bec4bdb17974fee8b782938860e2e22b841308959d97cb2d23b0b413c813218a0f3ef088b4272fd8f9d7f95f2ba2c40dfd5120a06cdcf3d6a299c5c35c70084bb3fa0462b404884c5c67e29d4d419964ad155f5f777689d4a7535325a301f6600aec25281dc0d5dfba1bb5c7e5a1c998a326a03e0ac6be8f454d39fa7b4d3b81e7420216e862f61c655ee3c32b821974b383736f6bfaaba4f22f151d1e8702c6ca07fd41c93d4a81d59ad6551b63536a2c558064e22231b7d2fa29700f02a87c253fea3e8f7810a7ed1861fee7595afbe6f3f6634e6c0c1355d71ae52b9f51f7165623cdb3b0af3d924a593df21a4d5031c3e309cf4d1648899a46a4b89b6457fced0e817a06c622f6f974cb99fab378a6457ca78aa50f602a4257e117f582740e300c9b9827bd2c2393a2ab4d65b2101d5bbae0c2cf279277189562c899edd36e3c3a8f6497be244803573e6a3b7eb9c02988f7fd0b5ffa382fa541e9fc3e0ff3230efc3fb536d3e896c576f444c6c94d3f2d5d5c1d29a844ef0a5989f255c555523e6e4b3cbdf4d330aba1660ff450934373beb920847b0f08e4417aae61548204fb7c457569540de51eda5d322d1cd843e04bf4f410486d2163d4400746079757e637020f3f18b0d36ec2cfc5f9415c40bfa6aa19c74f31f13f943996535c1a593358d0844d0055c07e1274215b8925bac7de8518802f986d81251052fded43fe24705f6d59d70c04fc1b4d473784e8c7646731032e8ab60f10ff85eff9366c96ae742ace98398f4bbfc6a6ec8bd10f399a89db4cbf3637a794255e39809bcfef241b81e44e08549b0059370a772e79f0a92698f9c1f99b6ed2d3ba0a7f830d071cb08a420cc671b4af3da2b76f4348c9b472ee310af7ed1a77b183d98c87d85a7b2677996e5b232bc119fcc5df035fd0cefe2b71c35d4101d610ac2d05673df1e9213b8735edf0f210ba75fbed869b38800f4ecd64d9bba06d3f17083dd8a06cb2b094f47290e2338dc594e50e0c4f2b370c971cbaead404c2d95a92c80582bd3680033b36a8b39ac4f85903991014bcfc6a4845b5dbe3cd84233253317ffc7ab1650560fbb6a08a2ef2e860aef5023ad02e1273b8a6772b6172d05263bb8ec29ddd14a748a69e120208b088a9c110edd2fe14751b51f9bcb0f740538913ba8032b50154134f2cdd0130a25feca056a093dc5ce002735a3ffcce12fa9591820c8f0e2308392447bb37d923bb6a65ba5f3d333172f0a6f607ec6eadd5969a22029081a00c8465f6580d5f3cae4cd9f85157f34aa4e3d0566928a665bf3acf1c9d509833b5d6aa0dbed8f7bf82273fe1fa193be5a9b4be1dc6e910b6be413dffca3217e6632b9b48cec95b6e092d67bb6f80af581377a4c902f3a4112957a24ceb1f0a7bb7e34c0e529b47b829365a2ba7d6e2940eccf54eab95ead892ae4dee6e23caaba1614df7d85fa212a045ef4594ce8a40df8c0bc3b28a82e6be33423711b5ba3d5d731da81e4b0080cabd60c48e9ddcb1d9e09d05d377b9f9004f9bd74481f96ad9ce42031ccc670037fa81dadd4f377e6640183c95ffef153ccc4fd5801add567774bd69c255206b23c8c1e02294edcf7f2d6ef420f5f236d7a956292aef3e0b4770af4b661b6f67bba32f61aaf86c8f54b66fadf5cc46dbb2e097e64a46aa75252ff81d8fa30b2379b697162148f600dc33362811d98955451b0531992c42df63634ac5c89e991a0eaa2a7dc564153ede80f15ffadd3cbd4a952b1c616068e0f064d3daf26ea9924c322676f12708af5abb4471715d009d608d7e43733a5922df9250cb13db73591f771e51f4ca15b7f64ab5169038b39f193f41fc4901605e12b4f34fbb87a6818fcf1462aac24fadc7fb9b80685d375ca7b80b47a8e5f771d0cff1ae4b832ca7b3acfb98bd05a5484ef46a71fe02bd40878af71d25df291f03224bdbdb7b68831c47a8b355b719d4a278478b88e1dc36f804d874979108541a06710e080b0d873dedbaf0b645429a188240e8d07796df563bf1356ed7ae05a859b032da3c23b278778c48b83cb6fcf8d2c5172e840bb5ba2356b6d3f0c7d4ee460acfb49ef7945bde9ccea11eddd94116968e1b1d47d4cabaab3aa97438fe9a49f29e76b8aff78d4ccf70199d970c4c72087dd3241d376f7afca7352f9563c789a1ca8d8873c24ae81dae8f8e642ebe3132f947efddc0928c8a5f1f0e5b7b0767eadd47e8ed6d81605c1f46da89abbccef322fcc645573c684fd16650dd638dfedafd71481958db07d46325eea7e9a9b952f0587b953392a1ee0e01d4346143e6bcd58ab88a592b6fa8fd5870aa2b3e6ad1495236ec1d219d58737c168ff0683ee37a207cc1f12375685186476ea9418c140208870bc04b330f3c82b6761cfbb0a8d44062e6a600cf38494658ec527828567f228ffdbab2546feaa4f9745313d3a6bf3efa31f63c8fd1fdf70670526e27c85ed6ec4c4916eaf9e6005c99c704c447d28ab2ba5e58acaba6678d32ab307f85a481c1b56f20a5ab8f80337055742856a1be031f673b1232aa6b04ecd0a667c25f0e52b26c98b109f7c725be7c9f482091ec2bf7f04b7c382d1be446e4d198ff3f6393ad2dc7740d7cc0950a325ba03b10a23a14704587deb2371d2b6dfdb0cfaed8c4b38cdb1d1a6785713a8105aac20f4bb68aea8f3cc5bb7956096a0a39eacdfae82e278db3e242b1ef0ea80dd824f3387388d3cf789294fc595fe0ab11f40d415342755db24abc8a62b6f2a0e9b7bc6ccdf32f4381427e90c1286d8bf7ea0d904b5761e9f8301b3f16af1d7edb72f46bd38e30443d89a1a091b3de1b0122ade04fbc33c10661589c8569d2e495c78ee90e2f7eef30f9a72723482837239c522f49f8c5e30de258efe2f6835d6d208c34d6c9474e0f4145b9e2e688ace1903fbd02228490018fe34b8f0b12260df0857280c02c0c3d73c169ce24eb0c6bd89b043b3060d335b7819008e1c5ac05afdf2413929aff84b5b382560f1c7d795da5a609ccd42470eb8f341dc582e46554720e0f7eb102cad3c8cac39e143ce3a5aec2df6b9cd491c8fc02d5c280fd2c81e8d902d6488be19d7ba59b7d29c18c6ea374aee9694ebb54a04b6c11a02534412c8418a4b8788336ffbfbed919b46c11f4af459433ef4a219843fe89b0cbe16ce81c944bd6386f193294be2f499eb1c2383c2ae158f5636eb1fd43f1446b529343feb3cc62f896c7a1fc3b4a641de78dfaf8f0e56fa48de66e4d9c3734b5911fc3bcbe946d725918da7358622aa1633f69c454b19de4d7fa7418f206efc63a5ac18a33efaddde7e421ba4cf0405a9d6ef1fdd7ad3267c3e2cfd41b01ca760c4f8d705ba8c5650cb64dfee672faa5625c70ad4b7eac30ad6fc8cd38507abd0f4b3b47c492e1a069cd8f66be5c8150f596f327f75ef37cb98034e77ab0808dbb1621e8111036f6bb0422db20374a98063bd924d5f81127570e3f9eab7456cf2f68d113b43535ea915349834050e923254f2e3919fe39e66924b259b8335c28108ff7786c3c34adb65369db4da13cffa8ea39f4e03d8591723a44bf7d4c0d77713be9329a36834df39ebf147b3b39be1927bbc108d131a3c49fde96fe3756e541742d5d299642d41436c0c265ba494a09e714d3d83e2df1e12fe713d411b0285812cf1b4b94098cd635d186ee184ae15ab3e1d28d1cdba2efd0778e4330cd046eba1c119d5bbca217b3f3010ac4960b2088ffe2f2294b7b9f2aec79ddbe7b9af8516e98b109128568b488dbd443d3236b2329eca4127685f78036b1de45b251a6b7d49a6127da460716d8fbf47bbe1d529c718aa2a956b463796370090b81d51b1b0ea79c26ab13454a01e4a64472fee5a95f8ca404ccb9978750a4f4c09afb2b179d6f4b048bb64a3a5bdc1d3ee40ae9c6781c5a9c99a42b889a6b1e9ccaa8163a895d583a5c470bbbd9238dc110c955d384f42f6c8fab1b62f7991be2038145f953b47f5325a17f112d73d4d274438b499edbad489794ba465bc995064f807e69a03b6fba2a9bf44cbf727d1b8fc8f6bda0321d5c9f0976c2088de739487486eeb50a00081c4a2d8e56836bd55afc8260fde3c52e324ce2112bb949569e7cc35af69aa5431a21af71aad6775dc52f693967afd72856815a3aba7f7dfb35783af5161b11fbf87799d7e1ba779e1c7916c161c01b81d76afe3cebdd437ed8c5956136ed79effe96cd7ff0036402b125d4195eb9e738054edf0a73531fbccf662e1952feceb5a3cbe40dd9f208eb88397affde867fa5430e29f31980eda301aec06581307dd0b0beb7477f45dab21a816e4264f12e912eeaba17dfb62c21469df68a3077a4901","isRememberEnabled":true,"rememberDurationInDays":0,"staticryptSaltUniqueVariableName":"6b0b74cd224f5fe6749a65e350d0642b"};
// you can edit these values to customize some of the behavior of StatiCrypt
const templateConfig = {
rememberExpirationKey: "staticrypt_expiration",
rememberPassphraseKey: "staticrypt_passphrase",
replaceHtmlCallback: null,
clearLocalStorageCallback: null,
};
// init the staticrypt engine
const staticrypt = staticryptInitiator.init(staticryptConfig, templateConfig);
// try to automatically decrypt on load if there is a saved password
window.onload = async function () {
const { isSuccessful } = await staticrypt.handleDecryptOnLoad();
// if we didn't decrypt anything on load, show the password prompt. Otherwise the content has already been
// replaced, no need to do anything
if (!isSuccessful) {
// hide loading screen
document.getElementById("staticrypt_loading").classList.add("hidden");
document.getElementById("staticrypt_content").classList.remove("hidden");
document.getElementById("staticrypt-password").focus();
// show the remember me checkbox
if (isRememberEnabled) {
document.getElementById("staticrypt-remember-label").classList.remove("hidden");
}
}
};
// toggle password visibility
const toggleIcon = document.querySelector(".staticrypt-toggle-password-visibility");
// these two icons are coming from FontAwesome
const imgSrcEyeClosed =
"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NDAgNTEyIj48IS0tIUZvbnQgQXdlc29tZSBGcmVlIDYuNS4yIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlL2ZyZWUgQ29weXJpZ2h0IDIwMjQgRm9udGljb25zLCBJbmMuLS0+PHBhdGggZD0iTTM4LjggNS4xQzI4LjQtMy4xIDEzLjMtMS4yIDUuMSA5LjJTLTEuMiAzNC43IDkuMiA0Mi45bDU5MiA0NjRjMTAuNCA4LjIgMjUuNSA2LjMgMzMuNy00LjFzNi4zLTI1LjUtNC4xLTMzLjdMNTI1LjYgMzg2LjdjMzkuNi00MC42IDY2LjQtODYuMSA3OS45LTExOC40YzMuMy03LjkgMy4zLTE2LjcgMC0yNC42Yy0xNC45LTM1LjctNDYuMi04Ny43LTkzLTEzMS4xQzQ2NS41IDY4LjggNDAwLjggMzIgMzIwIDMyYy02OC4yIDAtMTI1IDI2LjMtMTY5LjMgNjAuOEwzOC44IDUuMXpNMjIzLjEgMTQ5LjVDMjQ4LjYgMTI2LjIgMjgyLjcgMTEyIDMyMCAxMTJjNzkuNSAwIDE0NCA2NC41IDE0NCAxNDRjMCAyNC45LTYuMyA0OC4zLTE3LjQgNjguN0w0MDggMjk0LjVjOC40LTE5LjMgMTAuNi00MS40IDQuOC02My4zYy0xMS4xLTQxLjUtNDcuOC02OS40LTg4LjYtNzEuMWMtNS44LS4yLTkuMiA2LjEtNy40IDExLjdjMi4xIDYuNCAzLjMgMTMuMiAzLjMgMjAuM2MwIDEwLjItMi40IDE5LjgtNi42IDI4LjNsLTkwLjMtNzAuOHpNMzczIDM4OS45Yy0xNi40IDYuNS0zNC4zIDEwLjEtNTMgMTAuMWMtNzkuNSAwLTE0NC02NC41LTE0NC0xNDRjMC02LjkgLjUtMTMuNiAxLjQtMjAuMkw4My4xIDE2MS41QzYwLjMgMTkxLjIgNDQgMjIwLjggMzQuNSAyNDMuN2MtMy4zIDcuOS0zLjMgMTYuNyAwIDI0LjZjMTQuOSAzNS43IDQ2LjIgODcuNyA5MyAxMzEuMUMxNzQuNSA0NDMuMiAyMzkuMiA0ODAgMzIwIDQ4MGM0Ny44IDAgODkuOS0xMi45IDEyNi4yLTMyLjVMMzczIDM4OS45eiIvPjwvc3ZnPg==";
const imgSrcEyeOpened =
"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1NzYgNTEyIj48IS0tIUZvbnQgQXdlc29tZSBGcmVlIDYuNS4yIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlL2ZyZWUgQ29weXJpZ2h0IDIwMjQgRm9udGljb25zLCBJbmMuLS0+PHBhdGggZD0iTTI4OCAzMmMtODAuOCAwLTE0NS41IDM2LjgtMTkyLjYgODAuNkM0OC42IDE1NiAxNy4zIDIwOCAyLjUgMjQzLjdjLTMuMyA3LjktMy4zIDE2LjcgMCAyNC42QzE3LjMgMzA0IDQ4LjYgMzU2IDk1LjQgMzk5LjRDMTQyLjUgNDQzLjIgMjA3LjIgNDgwIDI4OCA0ODBzMTQ1LjUtMzYuOCAxOTIuNi04MC42YzQ2LjgtNDMuNSA3OC4xLTk1LjQgOTMtMTMxLjFjMy4zLTcuOSAzLjMtMTYuNyAwLTI0LjZjLTE0LjktMzUuNy00Ni4yLTg3LjctOTMtMTMxLjFDNDMzLjUgNjguOCAzNjguOCAzMiAyODggMzJ6TTE0NCAyNTZhMTQ0IDE0NCAwIDEgMSAyODggMCAxNDQgMTQ0IDAgMSAxIC0yODggMHptMTQ0LTY0YzAgMzUuMy0yOC43IDY0LTY0IDY0Yy03LjEgMC0xMy45LTEuMi0yMC4zLTMuM2MtNS41LTEuOC0xMS45IDEuNi0xMS43IDcuNGMuMyA2LjkgMS4zIDEzLjggMy4yIDIwLjdjMTMuNyA1MS4yIDY2LjQgODEuNiAxMTcuNiA2Ny45czgxLjYtNjYuNCA2Ny45LTExNy42Yy0xMS4xLTQxLjUtNDcuOC02OS40LTg4LjYtNzEuMWMtNS44LS4yLTkuMiA2LjEtNy40IDExLjdjMi4xIDYuNCAzLjMgMTMuMiAzLjMgMjAuM3oiLz48L3N2Zz4=";
toggleIcon.addEventListener("click", function () {
const passwordInput = document.getElementById("staticrypt-password");
if (passwordInput.type === "password") {
passwordInput.type = "text";
toggleIcon.src = imgSrcEyeOpened;
toggleIcon.alt = templateToggleAltHide;
toggleIcon.title = templateToggleAltHide;
} else {
passwordInput.type = "password";
toggleIcon.src = imgSrcEyeClosed;
toggleIcon.alt = templateToggleAltShow;
toggleIcon.title = templateToggleAltShow;
}
});
// handle password form submission
document.getElementById("staticrypt-form").addEventListener("submit", async function (e) {
e.preventDefault();
const password = document.getElementById("staticrypt-password").value,
isRememberChecked = document.getElementById("staticrypt-remember").checked;
const { isSuccessful } = await staticrypt.handleDecryptionOfPage(password, isRememberChecked);
if (!isSuccessful) {
alert(templateError);
}
});
</script>
</body>
</html>