forked from fredlapolla/RScience2021_libr
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRScienceLibr_8_HypothesisTests.html
909 lines (895 loc) · 261 KB
/
RScienceLibr_8_HypothesisTests.html
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
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta name="generator" content="pandoc" />
<meta name="author" content="Fred LaPolla" />
<meta name="date" content="2021-06-24" />
<title>Hypothesis Testing</title>
<style type="text/css">
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
span.underline{text-decoration: underline;}
div.column{display: inline-block; vertical-align: top; width: 50%;}
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
ul.task-list{list-style: none;}
code.sourceCode > span { display: inline-block; line-height: 1.25; }
code.sourceCode > span { color: inherit; text-decoration: inherit; }
code.sourceCode > span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode { white-space: pre; position: relative; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
code.sourceCode { white-space: pre-wrap; }
code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
{ counter-reset: source-line 0; }
pre.numberSource code > span
{ position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code > span > a:first-child::before
{ content: counter(source-line);
position: relative; left: -1em; text-align: right; vertical-align: baseline;
border: none; display: inline-block;
-webkit-touch-callout: none; -webkit-user-select: none;
-khtml-user-select: none; -moz-user-select: none;
-ms-user-select: none; user-select: none;
padding: 0 4px; width: 4em;
color: #aaaaaa;
}
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
div.sourceCode
{ }
@media screen {
code.sourceCode > span > a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ff0000; font-weight: bold; } /* Alert */
code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
code span.at { color: #7d9029; } /* Attribute */
code span.bn { color: #40a070; } /* BaseN */
code span.bu { } /* BuiltIn */
code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
code span.ch { color: #4070a0; } /* Char */
code span.cn { color: #880000; } /* Constant */
code span.co { color: #60a0b0; font-style: italic; } /* Comment */
code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
code span.do { color: #ba2121; font-style: italic; } /* Documentation */
code span.dt { color: #902000; } /* DataType */
code span.dv { color: #40a070; } /* DecVal */
code span.er { color: #ff0000; font-weight: bold; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #40a070; } /* Float */
code span.fu { color: #06287e; } /* Function */
code span.im { } /* Import */
code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
code span.kw { color: #007020; font-weight: bold; } /* Keyword */
code span.op { color: #666666; } /* Operator */
code span.ot { color: #007020; } /* Other */
code span.pp { color: #bc7a00; } /* Preprocessor */
code span.sc { color: #4070a0; } /* SpecialChar */
code span.ss { color: #bb6688; } /* SpecialString */
code span.st { color: #4070a0; } /* String */
code span.va { color: #19177c; } /* Variable */
code span.vs { color: #4070a0; } /* VerbatimString */
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
</style>
<style type="text/css">
code.sourceCode > span { display: inline-block; line-height: 1.25; }
code.sourceCode > span { color: inherit; text-decoration: inherit; }
code.sourceCode > span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode { white-space: pre; position: relative; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
code.sourceCode { white-space: pre-wrap; }
code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
{ counter-reset: source-line 0; }
pre.numberSource code > span
{ position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code > span > a:first-child::before
{ content: counter(source-line);
position: relative; left: -1em; text-align: right; vertical-align: baseline;
border: none; display: inline-block;
-webkit-touch-callout: none; -webkit-user-select: none;
-khtml-user-select: none; -moz-user-select: none;
-ms-user-select: none; user-select: none;
padding: 0 4px; width: 4em;
color: #aaaaaa;
}
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
div.sourceCode
{ }
@media screen {
code.sourceCode > span > a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ff0000; font-weight: bold; } /* Alert */
code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
code span.at { color: #7d9029; } /* Attribute */
code span.bn { color: #40a070; } /* BaseN */
code span.bu { } /* BuiltIn */
code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
code span.ch { color: #4070a0; } /* Char */
code span.cn { color: #880000; } /* Constant */
code span.co { color: #60a0b0; font-style: italic; } /* Comment */
code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
code span.do { color: #ba2121; font-style: italic; } /* Documentation */
code span.dt { color: #902000; } /* DataType */
code span.dv { color: #40a070; } /* DecVal */
code span.er { color: #ff0000; font-weight: bold; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #40a070; } /* Float */
code span.fu { color: #06287e; } /* Function */
code span.im { } /* Import */
code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
code span.kw { color: #007020; font-weight: bold; } /* Keyword */
code span.op { color: #666666; } /* Operator */
code span.ot { color: #007020; } /* Other */
code span.pp { color: #bc7a00; } /* Preprocessor */
code span.sc { color: #4070a0; } /* SpecialChar */
code span.ss { color: #bb6688; } /* SpecialString */
code span.st { color: #4070a0; } /* String */
code span.va { color: #19177c; } /* Variable */
code span.vs { color: #4070a0; } /* VerbatimString */
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
</style>
<style type="text/css">
body
{
margin: 0 0 0 0;
padding: 0 0 0 0;
width: 100%;
height: 100%;
color: black;
background-color: white;
font-family: "Gill Sans MT", "Gill Sans", GillSans, sans-serif;
font-size: 14pt;
}
div.toolbar {
position: fixed; z-index: 200;
top: auto; bottom: 0; left: 0; right: 0;
height: 1.2em; text-align: right;
padding-left: 1em;
padding-right: 1em; font-size: 60%;
color: DimGray;
background-color: rgb(240,240,240);
border-top: solid 1px rgb(180,180,180);
}
div.toolbar span.copyright {
color: DimGray;
margin-left: 0.5em;
}
div.initial_prompt {
position: absolute;
z-index: 1000;
bottom: 1.2em;
width: 100%;
background-color: rgb(200,200,200);
opacity: 0.35;
background-color: rgb(200,200,200, 0.35);
cursor: pointer;
}
div.initial_prompt p.help {
text-align: center;
}
div.initial_prompt p.close {
text-align: right;
font-style: italic;
}
div.slidy_toc {
position: absolute;
z-index: 300;
width: 60%;
max-width: 30em;
height: 30em;
overflow: auto;
top: auto;
right: auto;
left: 4em;
bottom: 4em;
padding: 1em;
background: rgb(240,240,240);
border-style: solid;
border-width: 2px;
font-size: 60%;
}
div.slidy_toc .toc_heading {
text-align: center;
width: 100%;
margin: 0;
margin-bottom: 1em;
border-bottom-style: solid;
border-bottom-color: rgb(180,180,180);
border-bottom-width: 1px;
}
div.slide {
z-index: 20;
margin: 0 0 0 0;
padding-top: 0;
padding-bottom: 0;
padding-left: 20px;
padding-right: 20px;
border-width: 0;
clear: both;
top: 0;
bottom: 0;
left: 0;
right: 0;
line-height: 120%;
background-color: transparent;
}
div.background {
display: none;
}
div.handout {
margin-left: 20px;
margin-right: 20px;
}
div.slide.titlepage {
text-align: center;
}
div.slide.titlepage h1 {
padding-top: 10%;
margin-right: 0;
}
div.slide h1 {
padding-left: 0;
padding-right: 20pt;
padding-top: 4pt;
padding-bottom: 4pt;
margin-top: 0;
margin-left: 0;
margin-right: 60pt;
margin-bottom: 0.5em;
display: block; font-size: 160%;
line-height: 1.2em;
background: transparent;
}
@media screen and (max-device-width: 1024px)
{
div.slide { font-size: 100%; }
}
@media screen and (max-device-width: 800px)
{
div.slide { font-size: 200%; }
div.slidy_toc {
top: 1em;
left: 1em;
right: auto;
width: 80%;
font-size: 180%;
}
}
div.toc-heading {
width: 100%;
border-bottom: solid 1px rgb(180,180,180);
margin-bottom: 1em;
text-align: center;
}
img {
image-rendering: optimize-quality;
}
pre {
font-size: 80%;
font-weight: bold;
line-height: 120%;
padding-top: 0.2em;
padding-bottom: 0.2em;
padding-left: 1em;
padding-right: 1em;
border-style: solid;
border-left-width: 1em;
border-top-width: thin;
border-right-width: thin;
border-bottom-width: thin;
border-color: #95ABD0;
color: #00428C;
background-color: #E4E5E7;
}
li pre { margin-left: 0; }
blockquote { font-style: italic }
img { background-color: transparent }
p.copyright { font-size: smaller }
.center { text-align: center }
.footnote { font-size: smaller; margin-left: 2em; }
a img { border-width: 0; border-style: none }
a:visited { color: navy }
a:link { color: navy }
a:hover { color: red; text-decoration: underline }
a:active { color: red; text-decoration: underline }
a {text-decoration: none}
.toolbar a:link {color: blue}
.toolbar a:visited {color: blue}
.toolbar a:active {color: red}
.toolbar a:hover {color: red}
ul { list-style-type: square; }
ul ul { list-style-type: disc; }
ul ul ul { list-style-type: circle; }
ul ul ul ul { list-style-type: disc; }
li { margin-left: 0.5em; margin-top: 0.5em; }
li li { font-size: 85%; font-style: italic }
li li li { font-size: 85%; font-style: normal }
div dt
{
margin-left: 0;
margin-top: 1em;
margin-bottom: 0.5em;
font-weight: bold;
}
div dd
{
margin-left: 2em;
margin-bottom: 0.5em;
}
p,pre,ul,ol,blockquote,h2,h3,h4,h5,h6,dl,table {
margin-left: 1em;
margin-right: 1em;
}
p.subhead { font-weight: bold; margin-top: 2em; }
.smaller { font-size: smaller }
.bigger { font-size: 130% }
td,th { padding: 0.2em }
ul {
margin: 0.5em 1.5em 0.5em 1.5em;
padding: 0;
}
ol {
margin: 0.5em 1.5em 0.5em 1.5em;
padding: 0;
}
ul { list-style-type: square; }
ul ul { list-style-type: disc; }
ul ul ul { list-style-type: circle; }
ul ul ul ul { list-style-type: disc; }
ul li { list-style: square;
margin: 0.1em 0em 0.6em 0;
padding: 0 0 0 0;
line-height: 140%;
}
ol li { margin: 0.1em 0em 0.6em 1.5em;
padding: 0 0 0 0px;
line-height: 140%;
list-style-type: decimal;
}
li ul li { font-size: 85%; font-style: italic;
list-style-type: disc;
background: transparent;
padding: 0 0 0 0;
}
li li ul li { font-size: 85%; font-style: normal;
list-style-type: circle;
background: transparent;
padding: 0 0 0 0;
}
li li li ul li {
list-style-type: disc;
background: transparent;
padding: 0 0 0 0;
}
li ol li {
list-style-type: decimal;
}
li li ol li {
list-style-type: decimal;
}
ol.outline li:hover { cursor: pointer }
ol.outline li.nofold:hover { cursor: default }
ul.outline li:hover { cursor: pointer }
ul.outline li.nofold:hover { cursor: default }
ol.outline { list-style:decimal; }
ol.outline ol { list-style-type:lower-alpha }
ol.outline li.nofold {
padding: 0 0 0 20px;
background: transparent url(data:image/gif;base64,R0lGODdhCQAJAIACAMzMzOvr/ywAAAAACQAJAAACD4SPoRvG614Dctb4MEMcFAA7) no-repeat 0px 0.5em;
}
ol.outline li.unfolded {
padding: 0 0 0 20px;
background: transparent url(data:image/gif;base64,R0lGODdhCQAJAKEDAMPD/8zMzOvr/////ywAAAAACQAJAAACEYyPoivG614LAlg7ZZbxoR8UADs=) no-repeat 0px 0.5em;
}
ol.outline li.folded {
padding: 0 0 0 20px;
background: transparent url(data:image/gif;base64,R0lGODdhCQAJAKEDAMPD/8zMzOvr/////ywAAAAACQAJAAACFIyPoiu2sJyCyoF7W3hxz850CFIAADs=) no-repeat 0px 0.5em;
}
ol.outline li.unfolded:hover {
padding: 0 0 0 20px;
background: transparent url(data:image/gif;base64,R0lGODdhCQAJAKEDAAAAAAAA/8PD/////ywAAAAACQAJAAACEYSPoivG614DIlg7ZZbxoQ8UADs=) no-repeat 0px 0.5em;
}
ol.outline li.folded:hover {
padding: 0 0 0 20px;
background: transparent url(data:image/gif;base64,R0lGODdhCQAJAKEDAAAAAAAA/8PD/////ywAAAAACQAJAAACFISPoiu2sZyCyoV7G3hxz850CFIAADs=) no-repeat 0px 0.5em;
}
ul.outline li.nofold {
padding: 0 0 0 20px;
background: transparent url(data:image/gif;base64,R0lGODdhCQAJAIACAMzMzOvr/ywAAAAACQAJAAACD4SPoRvG614Dctb4MEMcFAA7) no-repeat 0px 0.5em;
}
ul.outline li.unfolded {
padding: 0 0 0 20px;
background: transparent url(data:image/gif;base64,R0lGODdhCQAJAKEDAMPD/8zMzOvr/////ywAAAAACQAJAAACEYyPoivG614LAlg7ZZbxoR8UADs=) no-repeat 0px 0.5em;
}
ul.outline li.folded {
padding: 0 0 0 20px;
background: transparent url(data:image/gif;base64,R0lGODdhCQAJAKEDAMPD/8zMzOvr/////ywAAAAACQAJAAACFIyPoiu2sJyCyoF7W3hxz850CFIAADs=) no-repeat 0px 0.5em;
}
ul.outline li.unfolded:hover {
padding: 0 0 0 20px;
background: transparent url(data:image/gif;base64,R0lGODdhCQAJAKEDAAAAAAAA/8PD/////ywAAAAACQAJAAACEYSPoivG614DIlg7ZZbxoQ8UADs=) no-repeat 0px 0.5em;
}
ul.outline li.folded:hover {
padding: 0 0 0 20px;
background: transparent url(data:image/gif;base64,R0lGODdhCQAJAKEDAAAAAAAA/8PD/////ywAAAAACQAJAAACFISPoiu2sZyCyoV7G3hxz850CFIAADs=) no-repeat 0px 0.5em;
}
a.titleslide { font-weight: bold; font-style: italic }
img.hidden { display: none; visibility: hidden }
div.initial_prompt { display: none; visibility: hidden }
div.slide {
visibility: visible;
position: inherit;
}
div.handout {
border-top-style: solid;
border-top-width: thin;
border-top-color: black;
}
@media screen {
.hidden { display: none; visibility: visible }
div.slide.hidden { display: block; visibility: visible }
div.handout.hidden { display: block; visibility: visible }
div.background { display: none; visibility: hidden }
body.single_slide div.initial_prompt { display: block; visibility: visible }
body.single_slide div.background { display: block; visibility: visible }
body.single_slide div.background.hidden { display: none; visibility: hidden }
body.single_slide .invisible { visibility: hidden }
body.single_slide .hidden { display: none; visibility: hidden }
body.single_slide div.slide { position: absolute }
body.single_slide div.handout { display: none; visibility: hidden }
}
@media print {
.hidden { display: block; visibility: visible }
div.slide pre { font-size: 60%; padding-left: 0.5em; }
div.toolbar { display: none; visibility: hidden; }
div.slidy_toc { display: none; visibility: hidden; }
div.background { display: none; visibility: hidden; }
div.slide { page-break-before: always }
div.slide.first-slide { page-break-before: avoid }
}
.jslider table {
margin-left: 0em;
margin-right: 0em;
}
table.dataTable, .shiny-datatable-output div {
font-size: 14pt;
}
.dataTables_info, .dataTables_paginate {
font-size: 19px;
}
pre.sourceCode, code.sourceCode {
font-size: 80%;
}
label, button, input, select, textarea {
font-size: 14pt;
}
ul.nav, ul.nav li {
list-style-type: none;
}
</style>
<script src="data:application/javascript;base64,Lyogc2xpZHkuanMKCiAgIENvcHlyaWdodCAoYykgMjAwNS0yMDEzIFczQyAoTUlULCBFUkNJTSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgIFczQyBsaWFiaWxpdHksIHRyYWRlbWFyaywgZG9jdW1lbnQgdXNlIGFuZCBzb2Z0d2FyZSBsaWNlbnNpbmcKICAgcnVsZXMgYXBwbHksIHNlZToKCiAgIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvY29weXJpZ2h0LWRvY3VtZW50cwogICBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL2NvcHlyaWdodC1zb2Z0d2FyZQoKICAgRGVmaW5lcyBzaW5nbGUgbmFtZSAidzNjX3NsaWR5IiBpbiBnbG9iYWwgbmFtZXNwYWNlCiAgIEFkZHMgZXZlbnQgaGFuZGxlcnMgd2l0aG91dCB0cmFtcGxpbmcgb24gYW55IG90aGVycwoqLwoKLy8gdGhlIHNsaWR5IG9iamVjdCBpbXBsZW1lbnRhdGlvbgp2YXIgdzNjX3NsaWR5ID0gewogIC8vIGNsYXNzaWZ5IHdoaWNoIGtpbmQgb2YgYnJvd3NlciB3ZSdyZSBydW5uaW5nIHVuZGVyCiAgbnNfcG9zOiAodHlwZW9mIHdpbmRvdy5wYWdlWU9mZnNldCE9J3VuZGVmaW5lZCcpLAogIGtodG1sOiAoKG5hdmlnYXRvci51c2VyQWdlbnQpLmluZGV4T2YoIktIVE1MIikgPj0gMCA/IHRydWUgOiBmYWxzZSksCiAgb3BlcmE6ICgobmF2aWdhdG9yLnVzZXJBZ2VudCkuaW5kZXhPZigiT3BlcmEiKSA+PSAwID8gdHJ1ZSA6IGZhbHNlKSwKICBpcGFkOiAoKG5hdmlnYXRvci51c2VyQWdlbnQpLmluZGV4T2YoImlQYWQiKSA+PSAwID8gdHJ1ZSA6IGZhbHNlKSwKICBpcGhvbmU6ICgobmF2aWdhdG9yLnVzZXJBZ2VudCkuaW5kZXhPZigiaVBob25lIikgPj0gMCA/IHRydWUgOiBmYWxzZSksCiAgYW5kcm9pZDogKChuYXZpZ2F0b3IudXNlckFnZW50KS5pbmRleE9mKCJBbmRyb2lkIikgPj0gMCA/IHRydWUgOiBmYWxzZSksCiAgaWU6ICh0eXBlb2YgZG9jdW1lbnQuYWxsICE9ICJ1bmRlZmluZWQiICYmICF0aGlzLm9wZXJhKSwKICBpZTY6ICghdGhpcy5uc19wb3MgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIDYiKSAhPSAtMSksCiAgaWU3OiAoIXRoaXMubnNfcG9zICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSA3IikgIT0gLTEpLAogIGllODogKCF0aGlzLm5zX3BvcyAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUgOCIpICE9IC0xKSwKICBpZTk6ICghdGhpcy5uc19wb3MgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIDkiKSAhPSAtMSksCgogIC8vIGRhdGEgZm9yIHN3aXBlIGFuZCBkb3VibGUgdGFwIGRldGVjdGlvbiBvbiB0b3VjaCBzY3JlZW5zCiAgbGFzdF90YXA6IDAsCiAgcHJldl90YXA6IDAsCiAgc3RhcnRfeDogMCwKICBzdGFydF95OiAwLAogIGRlbHRhX3g6IDAsCiAgZGVsdGFfeTogMCwKCiAgLy8gYXJlIHdlIHJ1bm5pbmcgYXMgWEhUTUw/IChkb2Vzbid0IHdvcmsgb24gT3BlcmEpCiAgaXNfeGh0bWw6IC94bWwvLnRlc3QoZG9jdW1lbnQuY29udGVudFR5cGUpLAoKICBzbGlkZV9udW1iZXI6IDAsIC8vIGludGVnZXIgc2xpZGUgY291bnQ6IDAsIDEsIDIsIC4uLgogIHNsaWRlX251bWJlcl9lbGVtZW50OiBudWxsLCAvLyBlbGVtZW50IGNvbnRhaW5pbmcgc2xpZGUgbnVtYmVyCiAgc2xpZGVzOiBbXSwgLy8gc2V0IHRvIGFycmF5IG9mIHNsaWRlIGRpdidzCiAgbm90ZXM6IFtdLCAvLyBzZXQgdG8gYXJyYXkgb2YgaGFuZG91dCBkaXYncwogIGJhY2tncm91bmRzOiBbXSwgLy8gc2V0IHRvIGFycmF5IG9mIGJhY2tncm91bmQgZGl2J3MKICBvYnNlcnZlcnM6IFtdLCAvLyBsaXN0IG9mIG9ic2VydmVyIGZ1bmN0aW9ucwogIHRvb2xiYXI6IG51bGwsIC8vIGVsZW1lbnQgY29udGFpbmluZyB0b29sYmFyCiAgdGl0bGU6IG51bGwsIC8vIGRvY3VtZW50IHRpdGxlCiAgbGFzdF9zaG93bjogbnVsbCwgLy8gbGFzdCBpbmNyZW1lbnRhbGx5IHNob3duIGl0ZW0KICBlb3M6IG51bGwsICAvLyBzcGFuIGVsZW1lbnQgZm9yIGVuZCBvZiBzbGlkZSBpbmRpY2F0b3IKICB0b2M6IG51bGwsIC8vIHRhYmxlIG9mIGNvbnRlbnRzCiAgb3V0bGluZTogbnVsbCwgLy8gb3V0bGluZSBlbGVtZW50IHdpdGggdGhlIGZvY3VzCiAgc2VsZWN0ZWRfdGV4dF9sZW46IDAsIC8vIGxlbmd0aCBvZiBkcmFnIHNlbGVjdGlvbiBvbiBkb2N1bWVudAogIHZpZXdfYWxsOiAwLCAgLy8gMSB0byB2aWV3IGFsbCBzbGlkZXMgKyBoYW5kb3V0cwogIHdhbnRfdG9vbGJhcjogdHJ1ZSwgIC8vIHVzZXIgcHJlZmVyZW5jZSB0byBzaG93L2hpZGUgdG9vbGJhcgogIG1vdXNlX2NsaWNrX2VuYWJsZWQ6IHRydWUsIC8vIGVuYWJsZXMgbGVmdCBjbGljayBmb3IgbmV4dCBzbGlkZQogIHNjcm9sbF9oYWNrOiAwLCAvLyBJRSB3b3JrIGFyb3VuZCBmb3IgcG9zaXRpb246IGZpeGVkCiAgZGlzYWJsZV9zbGlkZV9jbGljazogZmFsc2UsICAvLyB1c2VkIGJ5IGNsaWNrZWQgYW5jaG9ycwoKICBsYW5nOiAiZW4iLCAvLyB1cGRhdGVkIHRvIGxhbmd1YWdlIHNwZWNpZmllZCBieSBodG1sIGZpbGUKCiAgaGVscF9hbmNob3I6IG51bGwsIC8vIHVzZWQgZm9yIGtleWJvYXJkIGZvY3VzIGhhY2sgaW4gc2hvd1Rvb2xiYXIoKQogIGhlbHBfcGFnZTogImh0dHA6Ly93d3cudzMub3JnL1RhbGtzL1Rvb2xzL1NsaWR5Mi9oZWxwL2hlbHAuaHRtbCIsCiAgaGVscF90ZXh0OiAiTmF2aWdhdGUgd2l0aCBtb3VzZSBjbGljaywgc3BhY2UgYmFyLCBDdXJzb3IgTGVmdC9SaWdodCwgIiArCiAgICAgICAgICAgICAib3IgUGcgVXAgYW5kIFBnIERuLiBVc2UgUyBhbmQgQiB0byBjaGFuZ2UgZm9udCBzaXplLiIsCgogIHNpemVfaW5kZXg6IDAsCiAgc2l6ZV9hZGp1c3RtZW50OiAwLAogIHNpemVzOiAgbmV3IEFycmF5KCIxMHB0IiwgIjEycHQiLCAiMTRwdCIsICIxNnB0IiwgIjE4cHQiLCAiMjBwdCIsCiAgICAgICAgICAgICAgICAgICAgIjIycHQiLCAiMjRwdCIsICIyNnB0IiwgIjI4cHQiLCAiMzBwdCIsICIzMnB0IiksCgogIC8vIG5lZWRlZCBmb3IgZWZmaWNpZW50IHJlc2l6aW5nCiAgbGFzdF93aWR0aDogMCwKICBsYXN0X2hlaWdodDogMCwKCgogIC8vIE5lZWRlZCBmb3IgY3Jvc3MgYnJvd3NlciBzdXBwb3J0IGZvciByZWxhdGl2ZSB3aWR0aC9oZWlnaHQgb24KICAvLyBvYmplY3QgZWxlbWVudHMuIFRoZSB3b3JrIGFyb3VuZCBpcyB0byBzYXZlIHdpZHRoL2hlaWdodCBhdHRyaWJ1dGVzCiAgLy8gYW5kIHRoZW4gdG8gcmVjb21wdXRlIGFic29sdXRlIHdpZHRoL2hlaWdodCBkaW1lbnNpb25zIG9uIHJlc2l6aW5nCiAgIG9iamVjdHM6IFtdLAoKICAvLyBhdHRhY2ggaW5pdGlhbGlhdGlvbiBldmVudCBoYW5kbGVycwogIHNldF91cDogZnVuY3Rpb24gKCkgewogICAgdmFyIGluaXQgPSBmdW5jdGlvbigpIHsgdzNjX3NsaWR5LmluaXQoKTsgfTsKICAgIGlmICh0eXBlb2Ygd2luZG93LmFkZEV2ZW50TGlzdGVuZXIgIT0gInVuZGVmaW5lZCIpCiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgaW5pdCwgZmFsc2UpOwogICAgZWxzZQogICAgICB3aW5kb3cuYXR0YWNoRXZlbnQoIm9ubG9hZCIsIGluaXQpOwogIH0sCgogIGhpZGVfc2xpZGVzOiBmdW5jdGlvbiAoKSB7CiAgICBpZiAoZG9jdW1lbnQuYm9keSAmJiAhdzNjX3NsaWR5LmluaXRpYWxpemVkKQogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsKICAgIGVsc2UKICAgICAgc2V0VGltZW91dCh3M2Nfc2xpZHkuaGlkZV9zbGlkZXMsIDUwKTsKICB9LAoKICAvLyBoYWNrIHRvIHBlcnN1YWRlIElFIHRvIGNvbXB1dGUgY29ycmVjdCBkb2N1bWVudCBoZWlnaHQKICAvLyBhcyBuZWVkZWQgZm9yIHNpbXVsYXRpbmcgZml4ZWQgcG9zaXRpb25pbmcgb2YgdG9vbGJhcgogIGllX2hhY2s6IGZ1bmN0aW9uICgpIHsKICAgIHdpbmRvdy5yZXNpemVCeSgwLC0xKTsKICAgIHdpbmRvdy5yZXNpemVCeSgwLCAxKTsKICB9LAoKICBpbml0OiBmdW5jdGlvbiAoKSB7CiAgICAvL2FsZXJ0KCJzbGlkeSBzdGFydGluZyB0ZXN0IDEwIik7CiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7CiAgICB0aGlzLmluaXRfbG9jYWxpemF0aW9uKCk7CiAgICB0aGlzLmFkZF90b29sYmFyKCk7CiAgICB0aGlzLndyYXBfaW1wbGljaXRfc2xpZGVzKCk7CiAgICB0aGlzLmNvbGxlY3Rfc2xpZGVzKCk7CiAgICB0aGlzLmNvbGxlY3Rfbm90ZXMoKTsKICAgIHRoaXMuY29sbGVjdF9iYWNrZ3JvdW5kcygpOwogICAgdGhpcy5vYmplY3RzID0gZG9jdW1lbnQuYm9keS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7CiAgICB0aGlzLnBhdGNoX2FuY2hvcnMoKTsKICAgIHRoaXMuc2xpZGVfbnVtYmVyID0gdGhpcy5maW5kX3NsaWRlX251bWJlcihsb2NhdGlvbi5ocmVmKTsKICAgIHdpbmRvdy5vZmZzY3JlZW5idWZmZXJpbmcgPSB0cnVlOwogICAgdGhpcy5zaXplX2FkanVzdG1lbnQgPSB0aGlzLmZpbmRfc2l6ZV9hZGp1c3QoKTsKICAgIHRoaXMudGltZV9sZWZ0ID0gdGhpcy5maW5kX2R1cmF0aW9uKCk7CiAgICB0aGlzLmhpZGVfaW1hZ2VfdG9vbGJhcigpOyAgLy8gc3VwcHJlc3MgSUUgaW1hZ2UgdG9vbGJhciBwb3B1cAogICAgdGhpcy5pbml0X291dGxpbmVyKCk7ICAvLyBhY3RpdmF0ZSBmb2xkL3VuZm9sZCBzdXBwb3J0CiAgICB0aGlzLnRpdGxlID0gZG9jdW1lbnQudGl0bGU7CiAgICB0aGlzLmtleWJvYXJkbGVzcyA9ICh0aGlzLmlwYWR8fHRoaXMuaXBob25lfHx0aGlzLmFuZHJvaWQpOwoKICAgIGlmICh0aGlzLmtleWJvYXJkbGVzcykKICAgIHsKICAgICAgdzNjX3NsaWR5LnJlbW92ZV9jbGFzcyh3M2Nfc2xpZHkudG9vbGJhciwgImhpZGRlbiIpCiAgICAgIHRoaXMud2FudF90b29sYmFyID0gMDsKICAgIH0KCiAgICAvLyB3b3JrIGFyb3VuZCBmb3Igb3BlcmEgYnVnCiAgICB0aGlzLmlzX3hodG1sID0gKGRvY3VtZW50LmJvZHkudGFnTmFtZSA9PSAiQk9EWSIgPyBmYWxzZSA6IHRydWUpOwoKICAgIGlmICh0aGlzLnNsaWRlcy5sZW5ndGggPiAwKQogICAgewogICAgICB2YXIgc2xpZGUgPSB0aGlzLnNsaWRlc1t0aGlzLnNsaWRlX251bWJlcl07CiAgIAogICAgICBpZiAodGhpcy5zbGlkZV9udW1iZXIgPiAwKQogICAgICB7CiAgICAgICAgdGhpcy5zZXRfdmlzaWJpbGl0eV9hbGxfaW5jcmVtZW50YWwoInZpc2libGUiKTsKICAgICAgICB0aGlzLmxhc3Rfc2hvd24gPSB0aGlzLnByZXZpb3VzX2luY3JlbWVudGFsX2l0ZW0obnVsbCk7CiAgICAgICAgdGhpcy5zZXRfZW9zX3N0YXR1cyh0cnVlKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICB0aGlzLmxhc3Rfc2hvd24gPSBudWxsOwogICAgICAgIHRoaXMuc2V0X3Zpc2liaWxpdHlfYWxsX2luY3JlbWVudGFsKCJoaWRkZW4iKTsKICAgICAgICB0aGlzLnNldF9lb3Nfc3RhdHVzKCF0aGlzLm5leHRfaW5jcmVtZW50YWxfaXRlbSh0aGlzLmxhc3Rfc2hvd24pKTsKICAgICAgfQoKICAgICAgdGhpcy5zZXRfbG9jYXRpb24oKTsKICAgICAgdGhpcy5hZGRfY2xhc3ModGhpcy5zbGlkZXNbMF0sICJmaXJzdC1zbGlkZSIpOwogICAgICB3M2Nfc2xpZHkuc2hvd19zbGlkZShzbGlkZSk7CiAgICB9CgogICAgdGhpcy50b2MgPSB0aGlzLnRhYmxlX29mX2NvbnRlbnRzKCk7CgogICAgdGhpcy5hZGRfaW5pdGlhbF9wcm9tcHQoKTsKCiAgICAvLyBiaW5kIGV2ZW50IGhhbmRsZXJzIHdpdGhvdXQgaW50ZXJmZXJpbmcgd2l0aCBjdXN0b20gcGFnZSBzY3JpcHRzCiAgICAvLyBUYXAgZXZlbnRzIGJlaGF2ZSB0b28gd2VpcmRseSB0byBzdXBwb3J0IGNsaWNrcyByZWxpYWJseSBvbgogICAgLy8gaVBob25lIGFuZCBpUGFkLCBzbyBleGNsdWRlIHRoZXNlIGZyb20gY2xpY2sgaGFuZGxlcgoKICAgIGlmICghdGhpcy5rZXlib2FyZGxlc3MpCiAgICB7CiAgICAgIHRoaXMuYWRkX2xpc3RlbmVyKGRvY3VtZW50LmJvZHksICJjbGljayIsIHRoaXMubW91c2VfYnV0dG9uX2NsaWNrKTsKICAgICAgdGhpcy5hZGRfbGlzdGVuZXIoZG9jdW1lbnQuYm9keSwgIm1vdXNlZG93biIsIHRoaXMubW91c2VfYnV0dG9uX2Rvd24pOwogICAgfQoKICAgIHRoaXMuYWRkX2xpc3RlbmVyKGRvY3VtZW50LCAia2V5ZG93biIsIHRoaXMua2V5X2Rvd24pOwogICAgdGhpcy5hZGRfbGlzdGVuZXIoZG9jdW1lbnQsICJrZXlwcmVzcyIsIHRoaXMua2V5X3ByZXNzKTsKICAgIHRoaXMuYWRkX2xpc3RlbmVyKHdpbmRvdywgInJlc2l6ZSIsIHRoaXMucmVzaXplZCk7CiAgICB0aGlzLmFkZF9saXN0ZW5lcih3aW5kb3csICJzY3JvbGwiLCB0aGlzLnNjcm9sbGVkKTsKICAgIHRoaXMuYWRkX2xpc3RlbmVyKHdpbmRvdywgInVubG9hZCIsIHRoaXMudW5sb2FkZWQpOwoKICAgIHRoaXMuYWRkX2xpc3RlbmVyKGRvY3VtZW50LCAiZ2VzdHVyZWNoYW5nZSIsIGZ1bmN0aW9uICgpCiAgICB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwoKICAgIHRoaXMuYXR0YWNoX3RvdWNoX2hhbmRlcnModGhpcy5zbGlkZXMpOwoKICAgIC8vIHRoaXMgc2VlbXMgdG8gYmUgYSBkZWJ1Z2dpbmcgaGFjawogICAgLy9pZiAoIWRvY3VtZW50LmJvZHkub25jbGljaykKICAgIC8vICBkb2N1bWVudC5ib2R5Lm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7IH07CgogICAgdGhpcy5zaW5nbGVfc2xpZGVfdmlldygpOwoKICAgIC8vdGhpcy5zZXRfbG9jYXRpb24oKTsKCiAgICB0aGlzLnJlc2l6ZWQoKTsKCiAgICBpZiAodGhpcy5pZTcpCiAgICAgIHNldFRpbWVvdXQodzNjX3NsaWR5LmllX2hhY2ssIDEwMCk7CgogICAgdGhpcy5zaG93X3Rvb2xiYXIoKTsKCiAgICAvLyBmb3IgYmFjayBidXR0b24gZGV0ZWN0aW9uCiAgICBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7IHczY19zbGlkeS5jaGVja19sb2NhdGlvbigpOyB9LCAyMDApOwogICAgdzNjX3NsaWR5LmluaXRpYWxpemVkID0gdHJ1ZTsKICB9LAoKICAvLyBjcmVhdGUgZGl2IGVsZW1lbnQgd2l0aCBsaW5rcyB0byBlYWNoIHNsaWRlCiAgdGFibGVfb2ZfY29udGVudHM6IGZ1bmN0aW9uICgpIHsKICAgIHZhciB0b2MgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJkaXYiKTsKICAgIHRoaXMuYWRkX2NsYXNzKHRvYywgInNsaWR5X3RvYyBoaWRkZW4iKTsKICAgIC8vdG9jLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCAiMCIpOwoKICAgIHZhciBoZWFkaW5nID0gdGhpcy5jcmVhdGVfZWxlbWVudCgiZGl2Iik7CiAgICB0aGlzLmFkZF9jbGFzcyhoZWFkaW5nLCAidG9jLWhlYWRpbmciKTsKICAgIGhlYWRpbmcuaW5uZXJIVE1MID0gdGhpcy5sb2NhbGl6ZSgiVGFibGUgb2YgQ29udGVudHMiKTsKCiAgICB0b2MuYXBwZW5kQ2hpbGQoaGVhZGluZyk7CiAgICB2YXIgcHJldmlvdXMgPSBudWxsOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zbGlkZXMubGVuZ3RoOyArK2kpCiAgICB7CiAgICAgIHZhciB0aXRsZSA9IHRoaXMuaGFzX2NsYXNzKHRoaXMuc2xpZGVzW2ldLCAidGl0bGUiKTsKICAgICAgdmFyIG51bSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKChpICsgMSkgKyAiLiAiKTsKCiAgICAgIHRvYy5hcHBlbmRDaGlsZChudW0pOwoKICAgICAgdmFyIGEgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJhIik7CiAgICAgIGEuc2V0QXR0cmlidXRlKCJocmVmIiwgIiMoIiArIChpKzEpICsgIikiKTsKCiAgICAgIGlmICh0aXRsZSkKICAgICAgICB0aGlzLmFkZF9jbGFzcyhhLCAidGl0bGVzbGlkZSIpOwoKICAgICAgdmFyIG5hbWUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLnNsaWRlX25hbWUoaSkpOwogICAgICBhLmFwcGVuZENoaWxkKG5hbWUpOwogICAgICBhLm9uY2xpY2sgPSB3M2Nfc2xpZHkudG9jX2NsaWNrOwogICAgICBhLm9ua2V5ZG93biA9IHczY19zbGlkeS50b2Nfa2V5X2Rvd247CiAgICAgIGEucHJldmlvdXMgPSBwcmV2aW91czsKCiAgICAgIGlmIChwcmV2aW91cykKICAgICAgICBwcmV2aW91cy5uZXh0ID0gYTsKCiAgICAgIHRvYy5hcHBlbmRDaGlsZChhKTsKCiAgICAgIGlmIChpID09IDApCiAgICAgICAgdG9jLmZpcnN0ID0gYTsKCiAgICAgIGlmIChpIDwgdGhpcy5zbGlkZXMubGVuZ3RoIC0gMSkKICAgICAgewogICAgICAgIHZhciBiciA9IHRoaXMuY3JlYXRlX2VsZW1lbnQoImJyIik7CiAgICAgICAgdG9jLmFwcGVuZENoaWxkKGJyKTsKICAgICAgfQoKICAgICAgcHJldmlvdXMgPSBhOwogICAgfQoKICAgIHRvYy5mb2N1cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKHRoaXMuZmlyc3QpCiAgICAgICAgdGhpcy5maXJzdC5mb2N1cygpOwogICAgfQoKICAgIHRvYy5vbm1vdXNldXAgPSB3M2Nfc2xpZHkubW91c2VfYnV0dG9uX3VwOwoKICAgIHRvYy5vbmNsaWNrID0gZnVuY3Rpb24gKGUpIHsKICAgICAgZXx8KGU9d2luZG93LmV2ZW50KTsKCiAgICAgIGlmICh3M2Nfc2xpZHkuc2VsZWN0ZWRfdGV4dF9sZW4gPD0gMCkKICAgICAgICAgdzNjX3NsaWR5LmhpZGVfdGFibGVfb2ZfY29udGVudHModHJ1ZSk7CgogICAgICB3M2Nfc2xpZHkuc3RvcF9wcm9wYWdhdGlvbihlKTsKICAgIAogICAgICBpZiAoZS5jYW5jZWwgIT0gdW5kZWZpbmVkKQogICAgICAgIGUuY2FuY2VsID0gdHJ1ZTsKICAgICAgCiAgICAgIGlmIChlLnJldHVyblZhbHVlICE9IHVuZGVmaW5lZCkKICAgICAgICBlLnJldHVyblZhbHVlID0gZmFsc2U7CiAgICAgIAogICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwoKICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QmVmb3JlKHRvYywgZG9jdW1lbnQuYm9keS5maXJzdENoaWxkKTsKICAgIHJldHVybiB0b2M7CiAgfSwKCiAgaXNfc2hvd25fdG9jOiBmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gIXczY19zbGlkeS5oYXNfY2xhc3ModzNjX3NsaWR5LnRvYywgImhpZGRlbiIpOwogIH0sCgogIHNob3dfdGFibGVfb2ZfY29udGVudHM6IGZ1bmN0aW9uICgpIHsKICAgIHczY19zbGlkeS5yZW1vdmVfY2xhc3ModzNjX3NsaWR5LnRvYywgImhpZGRlbiIpOwogICAgdmFyIHRvYyA9IHczY19zbGlkeS50b2M7CiAgICB0b2MuZm9jdXMoKTsKCiAgICBpZiAodzNjX3NsaWR5LmllNyAmJiB3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyID09IDApCiAgICAgIHNldFRpbWVvdXQodzNjX3NsaWR5LmllX2hhY2ssIDEwMCk7CiAgfSwKCiAgaGlkZV90YWJsZV9vZl9jb250ZW50czogZnVuY3Rpb24gKGZvY3VzKSB7CiAgICB3M2Nfc2xpZHkuYWRkX2NsYXNzKHczY19zbGlkeS50b2MsICJoaWRkZW4iKTsKCiAgICBpZiAoZm9jdXMgJiYgIXczY19zbGlkeS5vcGVyYSAmJgogICAgICAgICF3M2Nfc2xpZHkuaGFzX2NsYXNzKHczY19zbGlkeS50b2MsICJoaWRkZW4iKSkKICAgICAgdzNjX3NsaWR5LnNldF9mb2N1cygpOwogIH0sCgogIHRvZ2dsZV90YWJsZV9vZl9jb250ZW50czogZnVuY3Rpb24gKCkgewogICAgaWYgKHczY19zbGlkeS5pc19zaG93bl90b2MoKSkKICAgICAgdzNjX3NsaWR5LmhpZGVfdGFibGVfb2ZfY29udGVudHModHJ1ZSk7CiAgICBlbHNlCiAgICAgIHczY19zbGlkeS5zaG93X3RhYmxlX29mX2NvbnRlbnRzKCk7CiAgfSwKCiAgLy8gY2FsbGVkIG9uIGNsaWNraW5nIHRvYyBlbnRyeQogIHRvY19jbGljazogZnVuY3Rpb24gKGUpIHsKICAgIGlmICghZSkKICAgICAgZSA9IHdpbmRvdy5ldmVudDsKCiAgICB2YXIgdGFyZ2V0ID0gdzNjX3NsaWR5LmdldF90YXJnZXQoZSk7CgogICAgaWYgKHRhcmdldCAmJiB0YXJnZXQubm9kZVR5cGUgPT0gMSkKICAgIHsKICAgICAgdmFyIHVyaSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKCiAgICAgIGlmICh1cmkpCiAgICAgIHsKICAgICAgICAvL2FsZXJ0KCJnb2luZyB0byAiICsgdXJpKTsKICAgICAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgICAgIHczY19zbGlkeS5oaWRlX3NsaWRlKHNsaWRlKTsKICAgICAgICB3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyID0gdzNjX3NsaWR5LmZpbmRfc2xpZGVfbnVtYmVyKHVyaSk7CiAgICAgICAgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgICAgIHczY19zbGlkeS5sYXN0X3Nob3duID0gbnVsbDsKICAgICAgICB3M2Nfc2xpZHkuc2V0X2xvY2F0aW9uKCk7CiAgICAgICAgdzNjX3NsaWR5LnNldF92aXNpYmlsaXR5X2FsbF9pbmNyZW1lbnRhbCgiaGlkZGVuIik7CiAgICAgICAgdzNjX3NsaWR5LnNldF9lb3Nfc3RhdHVzKCF3M2Nfc2xpZHkubmV4dF9pbmNyZW1lbnRhbF9pdGVtKHczY19zbGlkeS5sYXN0X3Nob3duKSk7CiAgICAgICAgdzNjX3NsaWR5LnNob3dfc2xpZGUoc2xpZGUpOwogICAgICAgIC8vdGFyZ2V0LmZvY3VzKCk7CgogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgIGlmICghdzNjX3NsaWR5Lm9wZXJhKQogICAgICAgICAgICB3M2Nfc2xpZHkuc2V0X2ZvY3VzKCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlKQogICAgICAgIHsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICB3M2Nfc2xpZHkuaGlkZV90YWJsZV9vZl9jb250ZW50cyh0cnVlKTsKICAgIGlmICh3M2Nfc2xpZHkuaWU3KSB3M2Nfc2xpZHkuaWVfaGFjaygpOwogICAgdzNjX3NsaWR5LnN0b3BfcHJvcGFnYXRpb24oZSk7CiAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChlKTsKICB9LAoKICAvLyBjYWxsZWQgb25rZXlkb3duIGZvciB0b2MgZW50cnkKICB0b2Nfa2V5X2Rvd246IGZ1bmN0aW9uIChldmVudCkgewogICAgdmFyIGtleTsKCiAgICBpZiAoIWV2ZW50KQogICAgICB2YXIgZXZlbnQgPSB3aW5kb3cuZXZlbnQ7CgogICAgLy8ga2x1ZGdlIGFyb3VuZCBOUy9JRSBkaWZmZXJlbmNlcyAKICAgIGlmICh3aW5kb3cuZXZlbnQpCiAgICAgIGtleSA9IHdpbmRvdy5ldmVudC5rZXlDb2RlOwogICAgZWxzZSBpZiAoZXZlbnQud2hpY2gpCiAgICAgIGtleSA9IGV2ZW50LndoaWNoOwogICAgZWxzZQogICAgICByZXR1cm4gdHJ1ZTsgLy8gWWlrZXMhIHVua25vd24gYnJvd3NlcgoKICAgIC8vIGlnbm9yZSBldmVudCBpZiBrZXkgdmFsdWUgaXMgemVybwogICAgLy8gYXMgZm9yIGFsdCBvbiBPcGVyYSBhbmQgS29ucXVlcm9yCiAgICBpZiAoIWtleSkKICAgICAgcmV0dXJuIHRydWU7CgogICAgLy8gY2hlY2sgZm9yIGNvbmN1cnJlbnQgY29udHJvbC9jb21tYW5kL2FsdCBrZXkKICAgIC8vIGJ1dCBhcmUgdGhlc2Ugb25seSBwcmVzZW50IG9uIG1vdXNlIGV2ZW50cz8KCiAgICBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5hbHRLZXkpCiAgICAgIHJldHVybiB0cnVlOwoKICAgIGlmIChrZXkgPT0gMTMpCiAgICB7CiAgICAgIHZhciB1cmkgPSB0aGlzLmdldEF0dHJpYnV0ZSgiaHJlZiIpOwoKICAgICAgaWYgKHVyaSkKICAgICAgewogICAgICAgIC8vYWxlcnQoImdvaW5nIHRvICIgKyB1cmkpOwogICAgICAgdmFyIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICB3M2Nfc2xpZHkuaGlkZV9zbGlkZShzbGlkZSk7CiAgICAgICAgdzNjX3NsaWR5LnNsaWRlX251bWJlciA9IHczY19zbGlkeS5maW5kX3NsaWRlX251bWJlcih1cmkpOwogICAgICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICB3M2Nfc2xpZHkubGFzdF9zaG93biA9IG51bGw7CiAgICAgICAgdzNjX3NsaWR5LnNldF9sb2NhdGlvbigpOwogICAgICAgIHczY19zbGlkeS5zZXRfdmlzaWJpbGl0eV9hbGxfaW5jcmVtZW50YWwoImhpZGRlbiIpOwogICAgICAgIHczY19zbGlkeS5zZXRfZW9zX3N0YXR1cyghdzNjX3NsaWR5Lm5leHRfaW5jcmVtZW50YWxfaXRlbSh3M2Nfc2xpZHkubGFzdF9zaG93bikpOwogICAgICAgIHczY19zbGlkeS5zaG93X3NsaWRlKHNsaWRlKTsKICAgICAgICAvL3RhcmdldC5mb2N1cygpOwoKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICBpZiAoIXczY19zbGlkeS5vcGVyYSkKICAgICAgICAgICAgdzNjX3NsaWR5LnNldF9mb2N1cygpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZSkKICAgICAgICB7CiAgICAgICAgfQogICAgICB9CgogICAgICB3M2Nfc2xpZHkuaGlkZV90YWJsZV9vZl9jb250ZW50cyh0cnVlKTsKCiAgICAgIGlmIChzZWxmLmllNykKICAgICAgIHczY19zbGlkeS5pZV9oYWNrKCk7CgogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CgogICAgaWYgKGtleSA9PSA0MCAmJiB0aGlzLm5leHQpCiAgICB7CiAgICAgIHRoaXMubmV4dC5mb2N1cygpOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CgogICAgaWYgKGtleSA9PSAzOCAmJiB0aGlzLnByZXZpb3VzKQogICAgewogICAgICB0aGlzLnByZXZpb3VzLmZvY3VzKCk7CiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KCiAgICByZXR1cm4gdHJ1ZTsKICB9LAoKICB0b3VjaHN0YXJ0OiBmdW5jdGlvbiAoZSkKICB7CiAgICAvLyBhIGRvdWJsZSB0b3VjaCBvZnRlbiBzdGFydHMgd2l0aCBhCiAgICAvLyBzaW5nbGUgdG91Y2ggZHVlIHRvIGZpbmdlcnMgdG91Y2hpbmcKICAgIC8vIGRvd24gYXQgc2xpZ2h0bHkgZGlmZmVyZW50IHRpbWVzCiAgICAvLyB0aHVzIGF2b2lkIGNhbGxpbmcgcHJldmVudERlZmF1bHQgaGVyZQogICAgdGhpcy5wcmV2X3RhcCA9IHRoaXMubGFzdF90YXA7CiAgICB0aGlzLmxhc3RfdGFwID0gKG5ldyBEYXRlKS5nZXRUaW1lKCk7CgogICAgdmFyIHRhcF9kZWxheSA9IHRoaXMubGFzdF90YXAgLSB0aGlzLnByZXZfdGFwOwoKICAgIGlmICh0YXBfZGVsYXkgPD0gMjAwKQogICAgewogICAgICAvLyBkb3VibGUgdGFwCiAgICB9CgogICAgdmFyIHRvdWNoID0gZS50b3VjaGVzWzBdOwoKICAgIHRoaXMucGFnZVggPSB0b3VjaC5wYWdlWDsKICAgIHRoaXMucGFnZVkgPSB0b3VjaC5wYWdlWTsKICAgIHRoaXMuc2NyZWVuWCA9IHRvdWNoLnNjcmVlblg7CiAgICB0aGlzLnNjcmVlblkgPSB0b3VjaC5zY3JlZW5ZOwogICAgdGhpcy5jbGllbnRYID0gdG91Y2guY2xpZW50WDsKICAgIHRoaXMuY2xpZW50WSA9IHRvdWNoLmNsaWVudFk7CgogICAgdGhpcy5kZWx0YV94ID0gdGhpcy5kZWx0YV95ID0gMDsKICB9LAoKICB0b3VjaG1vdmU6IGZ1bmN0aW9uIChlKQogIHsKICAgIC8vIG92ZXJyaWRlIG5hdGl2ZSBnZXN0dXJlcyBmb3Igc2luZ2xlIHRvdWNoCiAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCA+IDEpCiAgICAgIHJldHVybjsKCiAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICB2YXIgdG91Y2ggPSBlLnRvdWNoZXNbMF07CiAgICB0aGlzLmRlbHRhX3ggPSB0b3VjaC5wYWdlWCAtIHRoaXMucGFnZVg7CiAgICB0aGlzLmRlbHRhX3kgPSB0b3VjaC5wYWdlWSAtIHRoaXMucGFnZVk7CiAgfSwKCiAgdG91Y2hlbmQ6IGZ1bmN0aW9uIChlKQogIHsKICAgIC8vIGRlZmF1bHQgYmVoYXZpb3IgZm9yIG11bHRpLXRvdWNoCiAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCA+IDEpCiAgICAgIHJldHVybjsKCiAgICB2YXIgZGVsYXkgPSAobmV3IERhdGUpLmdldFRpbWUoKSAtIHRoaXMubGFzdF90YXA7CiAgICB2YXIgZHggPSB0aGlzLmRlbHRhX3g7CiAgICB2YXIgZHkgPSB0aGlzLmRlbHRhX3k7CiAgICB2YXIgYWJzX2R4ID0gTWF0aC5hYnMoZHgpOwogICAgdmFyIGFic19keSA9IE1hdGguYWJzKGR5KTsKCiAgICBpZiAoZGVsYXkgPCA1MDAgJiYgKGFic19keCA+IDEwMCB8fCBhYnNfZHkgPiAxMDApKQogICAgewogICAgICBpZiAoYWJzX2R4ID4gMC41ICogYWJzX2R5KQogICAgICB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwoKICAgICAgICBpZiAoZHggPCAwKQogICAgICAgICAgdzNjX3NsaWR5Lm5leHRfc2xpZGUodHJ1ZSk7CiAgICAgICAgZWxzZQogICAgICAgICAgdzNjX3NsaWR5LnByZXZpb3VzX3NsaWRlKHRydWUpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGFic19keSA+IDIgKiBhYnNfZHgpCiAgICAgIHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdzNjX3NsaWR5LnRvZ2dsZV90YWJsZV9vZl9jb250ZW50cygpOwogICAgICB9CiAgICB9CiAgfSwKCiAgLy8gIyMjIE9CU09MRVRFICMjIwogIGJlZm9yZV9wcmludDogZnVuY3Rpb24gKCkgewogICAgdGhpcy5zaG93X2FsbF9zbGlkZXMoKTsKICAgIHRoaXMuaGlkZV90b29sYmFyKCk7CiAgICBhbGVydCgiYmVmb3JlIHByaW50Iik7CiAgfSwKCiAgLy8gIyMjIE9CU09MRVRFICMjIwogIGFmdGVyX3ByaW50OiBmdW5jdGlvbiAoKSB7CiAgICBpZiAoIXRoaXMudmlld19hbGwpCiAgICB7CiAgICAgIHRoaXMuc2luZ2xlX3NsaWRlX3ZpZXcoKTsKICAgICAgdGhpcy5zaG93X3Rvb2xiYXIoKTsKICAgIH0KICAgIGFsZXJ0KCJhZnRlciBwcmludCIpOwogIH0sCgogIC8vICMjIyBPQlNPTEVURSAjIyMKICBwcmludF9zbGlkZXM6IGZ1bmN0aW9uICgpIHsKICAgIHRoaXMuYmVmb3JlX3ByaW50KCk7CiAgICB3aW5kb3cucHJpbnQoKTsKICAgIHRoaXMuYWZ0ZXJfcHJpbnQoKTsKICB9LAoKICAvLyAjIyMgT0JTT0xFVEUgPz8gIyMjCiAgdG9nZ2xlX3ZpZXc6IGZ1bmN0aW9uICgpIHsKICAgIGlmICh0aGlzLnZpZXdfYWxsKQogICAgewogICAgICB0aGlzLnNpbmdsZV9zbGlkZV92aWV3KCk7CiAgICAgIHRoaXMuc2hvd190b29sYmFyKCk7CiAgICAgIHRoaXMudmlld19hbGwgPSAwOwogICAgfQogICAgZWxzZQogICAgewogICAgICB0aGlzLnNob3dfYWxsX3NsaWRlcygpOwogICAgICB0aGlzLmhpZGVfdG9vbGJhcigpOwogICAgICB0aGlzLnZpZXdfYWxsID0gMTsKICAgIH0KICB9LAoKICAvLyBwcmVwYXJlIGZvciBwcmludGluZyAgIyMjIE9CU09MRVRFICMjIwogIHNob3dfYWxsX3NsaWRlczogZnVuY3Rpb24gKCkgewogICAgdGhpcy5yZW1vdmVfY2xhc3MoZG9jdW1lbnQuYm9keSwgInNpbmdsZV9zbGlkZSIpOwogICAgdGhpcy5zZXRfdmlzaWJpbGl0eV9hbGxfaW5jcmVtZW50YWwoInZpc2libGUiKTsKICB9LAoKICAvLyByZXN0b3JlIGFmdGVyIHByaW50aW5nICAjIyMgT0JTT0xFVEUgIyMjCiAgc2luZ2xlX3NsaWRlX3ZpZXc6IGZ1bmN0aW9uICgpIHsKICAgIHRoaXMuYWRkX2NsYXNzKGRvY3VtZW50LmJvZHksICJzaW5nbGVfc2xpZGUiKTsKICAgIHRoaXMuc2V0X3Zpc2liaWxpdHlfYWxsX2luY3JlbWVudGFsKCJ2aXNpYmxlIik7CiAgICB0aGlzLmxhc3Rfc2hvd24gPSB0aGlzLnByZXZpb3VzX2luY3JlbWVudGFsX2l0ZW0obnVsbCk7CiAgfSwKCiAgLy8gc3VwcHJlc3MgSUUncyBpbWFnZSB0b29sYmFyIHBvcCB1cAogIGhpZGVfaW1hZ2VfdG9vbGJhcjogZnVuY3Rpb24gKCkgewogICAgaWYgKCF0aGlzLm5zX3BvcykKICAgIHsKICAgICAgdmFyIGltYWdlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJTUciKTsKCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgKytpKQogICAgICAgIGltYWdlc1tpXS5zZXRBdHRyaWJ1dGUoImdhbGxlcnlpbWciLCAibm8iKTsKICAgIH0KICB9LAoKICB1bmxvYWRlZDogZnVuY3Rpb24gKGUpIHsKICAgIC8vYWxlcnQoInVubG9hZGVkIik7CiAgfSwKCiAgLy8gU2FmYXJpIGFuZCBLb25xdWVyb3IgZG9uJ3QgeWV0IHN1cHBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSgpCiAgLy8gYW5kIHRoZXkgYWx3YXlzIHJlbG9hZCBwYWdlIHdoZW4gbG9jYXRpb24uaHJlZiBpcyB1cGRhdGVkCiAgaXNfS0hUTUw6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBhZ2VudCA9IG5hdmlnYXRvci51c2VyQWdlbnQ7CiAgICByZXR1cm4gKGFnZW50LmluZGV4T2YoIktIVE1MIikgPj0gMCA/IHRydWUgOiBmYWxzZSk7CiAgfSwKCiAgLy8gZmluZCBzbGlkZSBuYW1lIGZyb20gZmlyc3QgaDEgZWxlbWVudAogIC8vIGRlZmF1bHQgdG8gZG9jdW1lbnQgdGl0bGUgKyBzbGlkZSBudW1iZXIKICBzbGlkZV9uYW1lOiBmdW5jdGlvbiAoaW5kZXgpIHsKICAgIHZhciBuYW1lID0gbnVsbDsKICAgIHZhciBzbGlkZSA9IHRoaXMuc2xpZGVzW2luZGV4XTsKCiAgICB2YXIgaGVhZGluZyA9IHRoaXMuZmluZF9oZWFkaW5nKHNsaWRlKTsKCiAgICBpZiAoaGVhZGluZykKICAgICAgbmFtZSA9IHRoaXMuZXh0cmFjdF90ZXh0KGhlYWRpbmcpOwoKICAgIGlmICghbmFtZSkKICAgICAgbmFtZSA9IHRoaXMudGl0bGUgKyAiKCIgKyAoaW5kZXggKyAxKSArICIpIjsKCiAgICBuYW1lLnJlcGxhY2UoL1wmL2csICImYW1wOyIpOwogICAgbmFtZS5yZXBsYWNlKC9cPC9nLCAiJmx0OyIpOwogICAgbmFtZS5yZXBsYWNlKC9cPi9nLCAiJmd0OyIpOwoKICAgIHJldHVybiBuYW1lOwogIH0sCgogIC8vIGZpbmQgZmlyc3QgaDEgZWxlbWVudCBpbiBET00gdHJlZQogIGZpbmRfaGVhZGluZzogZnVuY3Rpb24gKG5vZGUpIHsKICAgIGlmICghbm9kZSB8fCBub2RlLm5vZGVUeXBlICE9IDEpCiAgICAgIHJldHVybiBudWxsOwoKICAgIGlmIChub2RlLm5vZGVOYW1lID09ICJIMSIgfHwgbm9kZS5ub2RlTmFtZSA9PSAiaDEiKQogICAgICByZXR1cm4gbm9kZTsKCiAgICB2YXIgY2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7CgogICAgd2hpbGUgKGNoaWxkKQogICAgewogICAgICBub2RlID0gdGhpcy5maW5kX2hlYWRpbmcoY2hpbGQpOwoKICAgICAgaWYgKG5vZGUpCiAgICAgICAgcmV0dXJuIG5vZGU7CgogICAgICBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nOwogICAgfQoKICAgIHJldHVybiBudWxsOwogIH0sCgogIC8vIHJlY3Vyc2l2ZWx5IGV4dHJhY3QgdGV4dCBmcm9tIERPTSB0cmVlCiAgZXh0cmFjdF90ZXh0OiBmdW5jdGlvbiAobm9kZSkgewogICAgaWYgKCFub2RlKQogICAgICByZXR1cm4gIiI7CgogICAgLy8gdGV4dCBub2RlcwogICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMykKICAgICAgcmV0dXJuIG5vZGUubm9kZVZhbHVlOwoKICAgIC8vIGVsZW1lbnRzCiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxKQogICAgewogICAgICBub2RlID0gbm9kZS5maXJzdENoaWxkOwogICAgICB2YXIgdGV4dCA9ICIiOwoKICAgICAgd2hpbGUgKG5vZGUpCiAgICAgIHsKICAgICAgICB0ZXh0ID0gdGV4dCArIHRoaXMuZXh0cmFjdF90ZXh0KG5vZGUpOwogICAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nOwogICAgICB9CgogICAgICByZXR1cm4gdGV4dDsKICAgIH0KCiAgICByZXR1cm4gIiI7CiAgfSwKCiAgLy8gZmluZCBjb3B5cmlnaHQgdGV4dCBmcm9tIG1ldGEgZWxlbWVudAogIGZpbmRfY29weXJpZ2h0OiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgbmFtZSwgY29udGVudDsKICAgIHZhciBtZXRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm1ldGEiKTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1ldGEubGVuZ3RoOyArK2kpCiAgICB7CiAgICAgIG5hbWUgPSBtZXRhW2ldLmdldEF0dHJpYnV0ZSgibmFtZSIpOwogICAgICBjb250ZW50ID0gbWV0YVtpXS5nZXRBdHRyaWJ1dGUoImNvbnRlbnQiKTsKCiAgICAgIGlmIChuYW1lID09ICJjb3B5cmlnaHQiKQogICAgICAgIHJldHVybiBjb250ZW50OwogICAgfQoKICAgIHJldHVybiBudWxsOwogIH0sCgogIGZpbmRfc2l6ZV9hZGp1c3Q6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBuYW1lLCBjb250ZW50LCBvZmZzZXQ7CiAgICB2YXIgbWV0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJtZXRhIik7CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZXRhLmxlbmd0aDsgKytpKQogICAgewogICAgICBuYW1lID0gbWV0YVtpXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKICAgICAgY29udGVudCA9IG1ldGFbaV0uZ2V0QXR0cmlidXRlKCJjb250ZW50Iik7CgogICAgICBpZiAobmFtZSA9PSAiZm9udC1zaXplLWFkanVzdG1lbnQiKQogICAgICAgIHJldHVybiAxICogY29udGVudDsKICAgIH0KCiAgICByZXR1cm4gMTsKICB9LAoKICAvLyA8bWV0YSBuYW1lPSJkdXJhdGlvbiIgY29udGVudD0iMjAiIC8+ICBmb3IgMjAgbWludXRlcwogIGZpbmRfZHVyYXRpb246IGZ1bmN0aW9uICgpIHsKICAgIHZhciBuYW1lLCBjb250ZW50LCBvZmZzZXQ7CiAgICB2YXIgbWV0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJtZXRhIik7CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZXRhLmxlbmd0aDsgKytpKQogICAgewogICAgICBuYW1lID0gbWV0YVtpXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKICAgICAgY29udGVudCA9IG1ldGFbaV0uZ2V0QXR0cmlidXRlKCJjb250ZW50Iik7CgogICAgICBpZiAobmFtZSA9PSAiZHVyYXRpb24iKQogICAgICAgIHJldHVybiA2MDAwMCAqIGNvbnRlbnQ7CiAgICB9CgogICAgcmV0dXJuIG51bGw7CiAgfSwKCiAgcmVwbGFjZV9ieV9ub25fYnJlYWtpbmdfc3BhY2U6IGZ1bmN0aW9uIChzdHIpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKQogICAgICBzdHJbaV0gPSAxNjA7CiAgfSwKCiAgLy8gIyMjIENIRUNLIE1FICMjIyBpcyB1c2Ugb2YgImxpIiBva2F5IGZvciB0ZXh0L2h0bWw/CiAgLy8gZm9yIFhIVE1MIGRvIHdlIGFsc28gbmVlZCB0byBzcGVjaWZ5IG5hbWVzcGFjZT8KICBpbml0X291dGxpbmVyOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgaXRlbXMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGkiKTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKQogICAgewogICAgICB2YXIgdGFyZ2V0ID0gaXRlbXNbaV07CgogICAgICBpZiAoIXRoaXMuaGFzX2NsYXNzKHRhcmdldC5wYXJlbnROb2RlLCAib3V0bGluZSIpKQogICAgICAgIGNvbnRpbnVlOwoKICAgICAgdGFyZ2V0Lm9uY2xpY2sgPSB0aGlzLm91dGxpbmVfY2xpY2s7Ci8qICMjIyBtb3JlIHdvcmsgbmVlZGVkIGZvciBJRTYKICAgICAgaWYgKCF0aGlzLm5zX3BvcykKICAgICAgewogICAgICAgIHRhcmdldC5vbm1vdXNlb3ZlciA9IHRoaXMuaG92ZXJfb3V0bGluZTsKICAgICAgICB0YXJnZXQub25tb3VzZW91dCA9IHRoaXMudW5ob3Zlcl9vdXRsaW5lOwogICAgICB9CiovCiAgICAgIGlmICh0aGlzLmZvbGRhYmxlKHRhcmdldCkpCiAgICAgIHsKICAgICAgICB0YXJnZXQuZm9sZGFibGUgPSB0cnVlOwogICAgICAgIHRhcmdldC5vbmZvY3VzID0gZnVuY3Rpb24gKCkge3czY19zbGlkeS5vdXRsaW5lID0gdGhpczt9OwogICAgICAgIHRhcmdldC5vbmJsdXIgPSBmdW5jdGlvbiAoKSB7dzNjX3NsaWR5Lm91dGxpbmUgPSBudWxsO307CgogICAgICAgIGlmICghdGFyZ2V0LmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKSkKICAgICAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwgIjAiKTsKCiAgICAgICAgaWYgKHRoaXMuaGFzX2NsYXNzKHRhcmdldCwgImV4cGFuZCIpKQogICAgICAgICAgdGhpcy51bmZvbGQodGFyZ2V0KTsKICAgICAgICBlbHNlCiAgICAgICAgICB0aGlzLmZvbGQodGFyZ2V0KTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICB0aGlzLmFkZF9jbGFzcyh0YXJnZXQsICJub2ZvbGQiKTsKICAgICAgICB0YXJnZXQudmlzaWJsZSA9IHRydWU7CiAgICAgICAgdGFyZ2V0LmZvbGRhYmxlID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICB9LAoKICBmb2xkYWJsZTogZnVuY3Rpb24gKGl0ZW0pIHsKICAgIGlmICghaXRlbSB8fCBpdGVtLm5vZGVUeXBlICE9IDEpCiAgICAgIHJldHVybiBmYWxzZTsKCiAgICB2YXIgbm9kZSA9IGl0ZW0uZmlyc3RDaGlsZDsKCiAgICB3aGlsZSAobm9kZSkKICAgIHsKICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiB0aGlzLmlzX2Jsb2NrKG5vZGUpKQogICAgICAgIHJldHVybiB0cnVlOwoKICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0sCgogIC8vICMjIyBDSEVDSyBNRSAjIyMgc3dpdGNoIHRvIGFkZC9yZW1vdmUgImhpZGRlbiIgY2xhc3MKICBmb2xkOiBmdW5jdGlvbiAoaXRlbSkgewogICAgaWYgKGl0ZW0pCiAgICB7CiAgICAgIHRoaXMucmVtb3ZlX2NsYXNzKGl0ZW0sICJ1bmZvbGRlZCIpOwogICAgICB0aGlzLmFkZF9jbGFzcyhpdGVtLCAiZm9sZGVkIik7CiAgICB9CgogICAgdmFyIG5vZGUgPSBpdGVtID8gaXRlbS5maXJzdENoaWxkIDogbnVsbDsKCiAgICB3aGlsZSAobm9kZSkKICAgIHsKICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiB0aGlzLmlzX2Jsb2NrKG5vZGUpKSAvLyBlbGVtZW50CiAgICAgIHsKICAgICAgICAgdzNjX3NsaWR5LmFkZF9jbGFzcyhub2RlLCAiaGlkZGVuIik7CiAgICAgIH0KCiAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nOwogICAgfQoKICAgIGl0ZW0udmlzaWJsZSA9IGZhbHNlOwogIH0sCgogIC8vICMjIyBDSEVDSyBNRSAjIyMgc3dpdGNoIHRvIGFkZC9yZW1vdmUgImhpZGRlbiIgY2xhc3MKICB1bmZvbGQ6IGZ1bmN0aW9uIChpdGVtKSB7CiAgICBpZiAoaXRlbSkKICAgIHsKICAgICAgdGhpcy5hZGRfY2xhc3MoaXRlbSwgInVuZm9sZGVkIik7CiAgICAgIHRoaXMucmVtb3ZlX2NsYXNzKGl0ZW0sICJmb2xkZWQiKTsKICAgIH0KCiAgICB2YXIgbm9kZSA9IGl0ZW0gPyBpdGVtLmZpcnN0Q2hpbGQgOiBudWxsOwoKICAgIHdoaWxlIChub2RlKQogICAgewogICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmIHRoaXMuaXNfYmxvY2sobm9kZSkpIC8vIGVsZW1lbnQKICAgICAgewogICAgICAgIHczY19zbGlkeS5yZW1vdmVfY2xhc3Mobm9kZSwgImhpZGRlbiIpOwogICAgICB9CgogICAgICBub2RlID0gbm9kZS5uZXh0U2libGluZzsKICAgIH0KCiAgICBpdGVtLnZpc2libGUgPSB0cnVlOwogIH0sCgogIG91dGxpbmVfY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICBpZiAoIWUpCiAgICAgIGUgPSB3aW5kb3cuZXZlbnQ7CgogICAgdmFyIHJpZ2h0Y2xpY2sgPSBmYWxzZTsKICAgIHZhciB0YXJnZXQgPSB3M2Nfc2xpZHkuZ2V0X3RhcmdldChlKTsKCiAgICB3aGlsZSAodGFyZ2V0ICYmIHRhcmdldC52aXNpYmxlID09IHVuZGVmaW5lZCkKICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7CgogICAgaWYgKCF0YXJnZXQpCiAgICAgIHJldHVybiB0cnVlOwoKICAgIGlmIChlLndoaWNoKQogICAgICByaWdodGNsaWNrID0gKGUud2hpY2ggPT0gMyk7CiAgICBlbHNlIGlmIChlLmJ1dHRvbikKICAgICAgcmlnaHRjbGljayA9IChlLmJ1dHRvbiA9PSAyKTsKCiAgICBpZiAoIXJpZ2h0Y2xpY2sgJiYgdGFyZ2V0LnZpc2libGUgIT0gdW5kZWZpbmVkKQogICAgewogICAgICBpZiAodGFyZ2V0LmZvbGRhYmxlKQogICAgICB7CiAgICAgICAgaWYgKHRhcmdldC52aXNpYmxlKQogICAgICAgICAgdzNjX3NsaWR5LmZvbGQodGFyZ2V0KTsKICAgICAgICBlbHNlCiAgICAgICAgICB3M2Nfc2xpZHkudW5mb2xkKHRhcmdldCk7CiAgICAgIH0KCiAgICAgIHczY19zbGlkeS5zdG9wX3Byb3BhZ2F0aW9uKGUpOwogICAgICBlLmNhbmNlbCA9IHRydWU7CiAgICAgIGUucmV0dXJuVmFsdWUgPSBmYWxzZTsKICAgIH0KCiAgICByZXR1cm4gZmFsc2U7CiAgfSwKCiAgYWRkX2luaXRpYWxfcHJvbXB0OiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgcHJvbXB0ID0gdGhpcy5jcmVhdGVfZWxlbWVudCgiZGl2Iik7CiAgICBwcm9tcHQuc2V0QXR0cmlidXRlKCJjbGFzcyIsICJpbml0aWFsX3Byb21wdCIpOwoKICAgIHZhciBwMSA9IHRoaXMuY3JlYXRlX2VsZW1lbnQoInAiKTsKICAgIHByb21wdC5hcHBlbmRDaGlsZChwMSk7CiAgICBwMS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwgImhlbHAiKTsKCiAgICBpZiAodGhpcy5rZXlib2FyZGxlc3MpCiAgICAgIHAxLmlubmVySFRNTCA9ICJzd2lwZSBsZWZ0IHRvIG1vdmUgdG8gbmV4dCBzbGlkZSI7CiAgICBlbHNlCiAgICAgIHAxLmlubmVySFRNTCA9ICJTcGFjZSwgUmlnaHQgQXJyb3cgb3Igc3dpcGUgbGVmdCB0byBtb3ZlIHRvICIgKwogICAgICAgICAgICAgICAgICAgICAibmV4dCBzbGlkZSwgY2xpY2sgaGVscCBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzIjsKCiAgICB0aGlzLmFkZF9saXN0ZW5lcihwcm9tcHQsICJjbGljayIsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQocHJvbXB0KTsKICAgICAgdzNjX3NsaWR5LnN0b3BfcHJvcGFnYXRpb24oZSk7CiAgICAKICAgICAgaWYgKGUuY2FuY2VsICE9IHVuZGVmaW5lZCkKICAgICAgICBlLmNhbmNlbCA9IHRydWU7CiAgICAgIAogICAgICBpZiAoZS5yZXR1cm5WYWx1ZSAhPSB1bmRlZmluZWQpCiAgICAgICAgZS5yZXR1cm5WYWx1ZSA9IGZhbHNlOwogICAgICAKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7CgogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChwcm9tcHQpOwogICAgdGhpcy5pbml0aWFsX3Byb21wdCA9IHByb21wdDsKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChwcm9tcHQpO30sIDUwMDApOwogIH0sCgogIGFkZF90b29sYmFyOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgY291bnRlciwgcGFnZTsKCiAgICAgdGhpcy50b29sYmFyID0gdGhpcy5jcmVhdGVfZWxlbWVudCgiZGl2Iik7CiAgICAgdGhpcy50b29sYmFyLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCAidG9vbGJhciIpOwoKICAgICAvLyBhIHJlYXNvbmFibHkgYmVoYXZlZCBicm93c2VyCiAgICAgaWYgKHRoaXMubnNfcG9zIHx8ICF0aGlzLmllNikKICAgICB7CiAgICAgICB2YXIgcmlnaHQgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJkaXYiKTsKICAgICAgIHJpZ2h0LnNldEF0dHJpYnV0ZSgic3R5bGUiLCAiZmxvYXQ6IHJpZ2h0OyB0ZXh0LWFsaWduOiByaWdodCIpOwoKICAgICAgIGNvdW50ZXIgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJzcGFuIikKICAgICAgIGNvdW50ZXIuaW5uZXJIVE1MID0gdGhpcy5sb2NhbGl6ZSgic2xpZGUiKSArICIgbi9tIjsKICAgICAgIHJpZ2h0LmFwcGVuZENoaWxkKGNvdW50ZXIpOwogICAgICAgdGhpcy50b29sYmFyLmFwcGVuZENoaWxkKHJpZ2h0KTsKCiAgICAgICB2YXIgbGVmdCA9IHRoaXMuY3JlYXRlX2VsZW1lbnQoImRpdiIpOwogICAgICAgbGVmdC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwgInRleHQtYWxpZ246IGxlZnQiKTsKCiAgICAgICAvLyBnbG9iYWwgZW5kIG9mIHNsaWRlIGluZGljYXRvcgogICAgICAgdGhpcy5lb3MgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJzcGFuIik7CiAgICAgICB0aGlzLmVvcy5pbm5lckhUTUwgPSAiKiAiOwogICAgICAgbGVmdC5hcHBlbmRDaGlsZCh0aGlzLmVvcyk7CgogICAgICAgdmFyIGhlbHAgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJhIik7CiAgICAgICBoZWxwLnNldEF0dHJpYnV0ZSgiaHJlZiIsIHRoaXMuaGVscF9wYWdlKTsKICAgICAgIGhlbHAuc2V0QXR0cmlidXRlKCJ0aXRsZSIsIHRoaXMubG9jYWxpemUodGhpcy5oZWxwX3RleHQpKTsKICAgICAgIGhlbHAuaW5uZXJIVE1MID0gdGhpcy5sb2NhbGl6ZSgiaGVscD8iKTsKICAgICAgIGxlZnQuYXBwZW5kQ2hpbGQoaGVscCk7CiAgICAgICBoZWxwLnN0eWxlLmRpc3BsYXk9Im5vbmUiOyAKICAgICAgIHRoaXMuaGVscF9hbmNob3IgPSBoZWxwOyAgLy8gc2F2ZSBmb3IgZm9jdXMgaGFjawoKICAgICAgIHZhciBnYXAxID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiAiKTsKICAgICAgIGxlZnQuYXBwZW5kQ2hpbGQoZ2FwMSk7CgogICAgICAgdmFyIGNvbnRlbnRzID0gdGhpcy5jcmVhdGVfZWxlbWVudCgiYSIpOwogICAgICAgY29udGVudHMuc2V0QXR0cmlidXRlKCJocmVmIiwgImphdmFzY3JpcHQ6dzNjX3NsaWR5LnRvZ2dsZV90YWJsZV9vZl9jb250ZW50cygpIik7CiAgICAgICBjb250ZW50cy5zZXRBdHRyaWJ1dGUoInRpdGxlIiwgdGhpcy5sb2NhbGl6ZSgidGFibGUgb2YgY29udGVudHMiKSk7CiAgICAgICBjb250ZW50cy5pbm5lckhUTUwgPSB0aGlzLmxvY2FsaXplKCJDb250ZW50cyIpOwogICAgICAgbGVmdC5hcHBlbmRDaGlsZChjb250ZW50cyk7CgogICAgICAgdmFyIGdhcDIgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiICIpOwogICAgICAgbGVmdC5hcHBlbmRDaGlsZChnYXAyKTsKCiAgICAgICB2YXIgY29weXJpZ2h0ID0gdGhpcy5maW5kX2NvcHlyaWdodCgpOwoKICAgICAgIGlmIChjb3B5cmlnaHQpCiAgICAgICB7CiAgICAgICAgIHZhciBzcGFuID0gdGhpcy5jcmVhdGVfZWxlbWVudCgic3BhbiIpOwogICAgICAgICBzcGFuLmNsYXNzTmFtZSA9ICJjb3B5cmlnaHQiOwogICAgICAgICBzcGFuLmlubmVySFRNTCA9IGNvcHlyaWdodDsKICAgICAgICAgbGVmdC5hcHBlbmRDaGlsZChzcGFuKTsKICAgICAgIH0KCiAgICAgICB0aGlzLnRvb2xiYXIuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsICIwIik7CiAgICAgICB0aGlzLnRvb2xiYXIuYXBwZW5kQ2hpbGQobGVmdCk7CiAgICAgfQogICAgIGVsc2UgLy8gSUU2IHNvIG5lZWQgdG8gd29yayBhcm91bmQgaXRzIHBvb3IgQ1NTIHN1cHBvcnQKICAgICB7CiAgICAgICB0aGlzLnRvb2xiYXIuc3R5bGUucG9zaXRpb24gPSAodGhpcy5pZTcgPyAiZml4ZWQiIDogImFic29sdXRlIik7CiAgICAgICB0aGlzLnRvb2xiYXIuc3R5bGUuekluZGV4ID0gIjIwMCI7CiAgICAgICB0aGlzLnRvb2xiYXIuc3R5bGUud2lkdGggPSAiOTkuOSUiOwogICAgICAgdGhpcy50b29sYmFyLnN0eWxlLmhlaWdodCA9ICIxLjJlbSI7CiAgICAgICB0aGlzLnRvb2xiYXIuc3R5bGUudG9wID0gImF1dG8iOwogICAgICAgdGhpcy50b29sYmFyLnN0eWxlLmJvdHRvbSA9ICIwIjsKICAgICAgIHRoaXMudG9vbGJhci5zdHlsZS5sZWZ0ID0gIjAiOwogICAgICAgdGhpcy50b29sYmFyLnN0eWxlLnJpZ2h0ID0gIjAiOwogICAgICAgdGhpcy50b29sYmFyLnN0eWxlLnRleHRBbGlnbiA9ICJsZWZ0IjsKICAgICAgIHRoaXMudG9vbGJhci5zdHlsZS5mb250U2l6ZSA9ICI2MCUiOwogICAgICAgdGhpcy50b29sYmFyLnN0eWxlLmNvbG9yID0gInJlZCI7CiAgICAgICB0aGlzLnRvb2xiYXIuYm9yZGVyV2lkdGggPSAwOwogICAgICAgdGhpcy50b29sYmFyLmNsYXNzTmFtZSA9ICJ0b29sYmFyIjsKICAgICAgIHRoaXMudG9vbGJhci5zdHlsZS5iYWNrZ3JvdW5kID0gInJnYigyNDAsMjQwLDI0MCkiOwoKICAgICAgIC8vIHdvdWxkIGxpa2UgdG8gaGF2ZSBoZWxwIHRleHQgbGVmdCBhbGlnbmVkCiAgICAgICAvLyBhbmQgcGFnZSBjb3VudGVyIHJpZ2h0IGFsaWduZWQsIGZsb2F0aW5nCiAgICAgICAvLyBkaXYncyBkb24ndCB3b3JrLCBzbyBpbnN0ZWFkIHVzZSBuZXN0ZWQKICAgICAgIC8vIGFic29sdXRlbHkgcG9zaXRpb25lZCBkaXYncy4KCiAgICAgICB2YXIgc3AgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJzcGFuIik7CiAgICAgICBzcC5pbm5lckhUTUwgPSAiJm5ic3A7Jm5ic3A7KiZuYnNwOyI7CiAgICAgICB0aGlzLnRvb2xiYXIuYXBwZW5kQ2hpbGQoc3ApOwogICAgICAgdGhpcy5lb3MgPSBzcDsgIC8vIGVuZCBvZiBzbGlkZSBpbmRpY2F0b3IKCiAgICAgICB2YXIgaGVscCA9IHRoaXMuY3JlYXRlX2VsZW1lbnQoImEiKTsKICAgICAgIGhlbHAuc2V0QXR0cmlidXRlKCJocmVmIiwgdGhpcy5oZWxwX3BhZ2UpOwogICAgICAgaGVscC5zZXRBdHRyaWJ1dGUoInRpdGxlIiwgdGhpcy5sb2NhbGl6ZSh0aGlzLmhlbHBfdGV4dCkpOwogICAgICAgaGVscC5pbm5lckhUTUwgPSB0aGlzLmxvY2FsaXplKCJoZWxwPyIpOwogICAgICAgdGhpcy50b29sYmFyLmFwcGVuZENoaWxkKGhlbHApOwogICAgICAgdGhpcy5oZWxwX2FuY2hvciA9IGhlbHA7ICAvLyBzYXZlIGZvciBmb2N1cyBoYWNrCgogICAgICAgdmFyIGdhcDEgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiICIpOwogICAgICAgdGhpcy50b29sYmFyLmFwcGVuZENoaWxkKGdhcDEpOwoKICAgICAgIHZhciBjb250ZW50cyA9IHRoaXMuY3JlYXRlX2VsZW1lbnQoImEiKTsKICAgICAgIGNvbnRlbnRzLnNldEF0dHJpYnV0ZSgiaHJlZiIsICJqYXZhc2NyaXB0OnRvZ2dsZVRhYmxlT2ZDb250ZW50cygpIik7CiAgICAgICBjb250ZW50cy5zZXRBdHRyaWJ1dGUoInRpdGxlIiwgdGhpcy5sb2NhbGl6ZSgidGFibGUgb2YgY29udGVudHMiLmxvY2FsaXplKSk7CiAgICAgICBjb250ZW50cy5pbm5lckhUTUwgPSB0aGlzLmxvY2FsaXplKCJjb250ZW50cz8iKTsKICAgICAgIHRoaXMudG9vbGJhci5hcHBlbmRDaGlsZChjb250ZW50cyk7CgogICAgICAgdmFyIGdhcDIgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiICIpOwogICAgICAgdGhpcy50b29sYmFyLmFwcGVuZENoaWxkKGdhcDIpOwoKICAgICAgIHZhciBjb3B5cmlnaHQgPSB0aGlzLmZpbmRfY29weXJpZ2h0KCk7CgogICAgICAgaWYgKGNvcHlyaWdodCkKICAgICAgIHsKICAgICAgICAgdmFyIHNwYW4gPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJzcGFuIik7CiAgICAgICAgIHNwYW4uaW5uZXJIVE1MID0gY29weXJpZ2h0OwogICAgICAgICBzcGFuLnN0eWxlLmNvbG9yID0gImJsYWNrIjsKICAgICAgICAgc3Bhbi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjAuNWVtIjsKICAgICAgICAgdGhpcy50b29sYmFyLmFwcGVuZENoaWxkKHNwYW4pOwogICAgICAgfQoKICAgICAgIGNvdW50ZXIgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJkaXYiKQogICAgICAgY291bnRlci5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CiAgICAgICBjb3VudGVyLnN0eWxlLndpZHRoID0gImF1dG8iOyAvLyIyMCUiOwogICAgICAgY291bnRlci5zdHlsZS5oZWlnaHQgPSAiMS4yZW0iOwogICAgICAgY291bnRlci5zdHlsZS50b3AgPSAiYXV0byI7CiAgICAgICBjb3VudGVyLnN0eWxlLmJvdHRvbSA9IDA7CiAgICAgICBjb3VudGVyLnN0eWxlLnJpZ2h0ID0gIjAiOwogICAgICAgY291bnRlci5zdHlsZS50ZXh0QWxpZ24gPSAicmlnaHQiOwogICAgICAgY291bnRlci5zdHlsZS5jb2xvciA9ICJyZWQiOwogICAgICAgY291bnRlci5zdHlsZS5iYWNrZ3JvdW5kID0gInJnYigyNDAsMjQwLDI0MCkiOwoKICAgICAgIGNvdW50ZXIuaW5uZXJIVE1MID0gdGhpcy5sb2NhbGl6ZSgic2xpZGUiKSArICIgbi9tIjsKICAgICAgIHRoaXMudG9vbGJhci5hcHBlbmRDaGlsZChjb3VudGVyKTsKICAgICB9CgogICAgIC8vIGVuc3VyZSB0aGF0IGNsaWNrIGlzbid0IHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBwYWdlCiAgICAgdGhpcy50b29sYmFyLm9uY2xpY2sgPQogICAgICAgICBmdW5jdGlvbiAoZSkgewogICAgICAgICAgIGlmICghZSkKICAgICAgICAgICAgIGUgPSB3aW5kb3cuZXZlbnQ7CgogICAgICAgICAgIHZhciB0YXJnZXQgPSBlLnRhcmdldDsKCiAgICAgICAgICAgaWYgKCF0YXJnZXQgJiYgZS5zcmNFbGVtZW50KQogICAgICAgICAgICAgdGFyZ2V0ID0gZS5zcmNFbGVtZW50OwoKICAgICAgICAgICAvLyB3b3JrIGFyb3VuZCBTYWZhcmkgYnVnCiAgICAgICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQubm9kZVR5cGUgPT0gMykKICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlOwoKICAgICAgICAgICB3M2Nfc2xpZHkuc3RvcF9wcm9wYWdhdGlvbihlKTsKCiAgICAgICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSAiYSIpCiAgICAgICAgICAgICB3M2Nfc2xpZHkubW91c2VfYnV0dG9uX2NsaWNrKGUpOwogICAgICAgICB9OwoKICAgICB0aGlzLnNsaWRlX251bWJlcl9lbGVtZW50ID0gY291bnRlcjsKICAgICB0aGlzLnNldF9lb3Nfc3RhdHVzKGZhbHNlKTsKICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMudG9vbGJhcik7CiAgfSwKCiAgLy8gd3lzaXd5ZyBlZGl0b3JzIG1ha2UgaXQgaGFyZCB0byB1c2UgZGl2IGVsZW1lbnRzCiAgLy8gZS5nLiBhbWF5YSBsb3NlcyB0aGUgZGl2IHdoZW4geW91IGNvcHkgYW5kIHBhc3RlCiAgLy8gdGhpcyBmdW5jdGlvbiB3cmFwcyBkaXYgZWxlbWVudHMgYXJvdW5kIGltcGxpY2l0CiAgLy8gc2xpZGVzIHdoaWNoIHN0YXJ0IHdpdGggYW4gaDEgZWxlbWVudCBhbmQgY29udGludWUKICAvLyB1cCB0byB0aGUgbmV4dCBoZWFkaW5nIG9yIGRpdiBlbGVtZW50CiAgd3JhcF9pbXBsaWNpdF9zbGlkZXM6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBpLCBoZWFkaW5nLCBub2RlLCBuZXh0LCBkaXY7CiAgICB2YXIgaGVhZGluZ3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaDEiKTsKCiAgICBpZiAoIWhlYWRpbmdzKQogICAgICByZXR1cm47CgogICAgZm9yIChpID0gMDsgaSA8IGhlYWRpbmdzLmxlbmd0aDsgKytpKQogICAgewogICAgICBoZWFkaW5nID0gaGVhZGluZ3NbaV07CgogICAgICBpZiAoaGVhZGluZy5wYXJlbnROb2RlICE9IGRvY3VtZW50LmJvZHkpCiAgICAgICAgY29udGludWU7CgogICAgICBub2RlID0gaGVhZGluZy5uZXh0U2libGluZzsKCiAgICAgIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICB0aGlzLmFkZF9jbGFzcyhkaXYsICJzbGlkZSIpOwogICAgICBkb2N1bWVudC5ib2R5LnJlcGxhY2VDaGlsZChkaXYsIGhlYWRpbmcpOwogICAgICBkaXYuYXBwZW5kQ2hpbGQoaGVhZGluZyk7CgogICAgICB3aGlsZSAobm9kZSkKICAgICAgewogICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEpIC8vIGFuIGVsZW1lbnQKICAgICAgICB7CiAgICAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT0gIkgxIiB8fCBub2RlLm5vZGVOYW1lID09ICJoMSIpCiAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT0gIkRJViIgfHwgbm9kZS5ub2RlTmFtZSA9PSAiZGl2IikKICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAodGhpcy5oYXNfY2xhc3Mobm9kZSwgInNsaWRlIikpCiAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgIGlmICh0aGlzLmhhc19jbGFzcyhub2RlLCAiaGFuZG91dCIpKQogICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBuZXh0ID0gbm9kZS5uZXh0U2libGluZzsKICAgICAgICBub2RlID0gZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChub2RlKTsKICAgICAgICBkaXYuYXBwZW5kQ2hpbGQobm9kZSk7CiAgICAgICAgbm9kZSA9IG5leHQ7CiAgICAgIH0gCiAgICB9CiAgfSwKCiAgYXR0YWNoX3RvdWNoX2hhbmRlcnM6IGZ1bmN0aW9uKHNsaWRlcykKICB7CiAgICB2YXIgaSwgc2xpZGU7CgogICAgZm9yIChpID0gMDsgaSA8IHNsaWRlcy5sZW5ndGg7ICsraSkKICAgIHsKICAgICAgc2xpZGUgPSBzbGlkZXNbaV07CiAgICAgIHRoaXMuYWRkX2xpc3RlbmVyKHNsaWRlLCAidG91Y2hzdGFydCIsIHRoaXMudG91Y2hzdGFydCk7CiAgICAgIHRoaXMuYWRkX2xpc3RlbmVyKHNsaWRlLCAidG91Y2htb3ZlIiwgdGhpcy50b3VjaG1vdmUpOwogICAgICB0aGlzLmFkZF9saXN0ZW5lcihzbGlkZSwgInRvdWNoZW5kIiwgdGhpcy50b3VjaGVuZCk7CiAgICB9CiAgfSwKCi8vIHJldHVybiBuZXcgYXJyYXkgb2YgYWxsIHNsaWRlcwogIGNvbGxlY3Rfc2xpZGVzOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2xpZGVzID0gbmV3IEFycmF5KCk7CiAgICB2YXIgZGl2cyA9IGRvY3VtZW50LmJvZHkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGl2cy5sZW5ndGg7ICsraSkKICAgIHsKICAgICAgZGl2ID0gZGl2cy5pdGVtKGkpOwoKICAgICAgaWYgKHRoaXMuaGFzX2NsYXNzKGRpdiwgInNsaWRlIikpCiAgICAgIHsKICAgICAgICAvLyBhZGQgc2xpZGUgdG8gY29sbGVjdGlvbgogICAgICAgIHNsaWRlc1tzbGlkZXMubGVuZ3RoXSA9IGRpdjsKCiAgICAgICAgLy8gaGlkZSBlYWNoIHNsaWRlIGFzIGl0IGlzIGZvdW5kCiAgICAgICAgdGhpcy5hZGRfY2xhc3MoZGl2LCAiaGlkZGVuIik7CgogICAgICAgIC8vIGFkZCBkdW1teSA8YnIvPiBhdCBlbmQgZm9yIHNjcm9sbGluZyBoYWNrCiAgICAgICAgdmFyIG5vZGUxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnIiKTsKICAgICAgICBkaXYuYXBwZW5kQ2hpbGQobm9kZTEpOwogICAgICAgIHZhciBub2RlMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIik7CiAgICAgICAgZGl2LmFwcGVuZENoaWxkKG5vZGUyKTsKICAgICAgfQogICAgICBlbHNlIGlmICh0aGlzLmhhc19jbGFzcyhkaXYsICJiYWNrZ3JvdW5kIikpCiAgICAgIHsgIC8vIHdvcmsgYXJvdW5kIGZvciBGaXJlZm94IFNWRyByZWxvYWQgYnVnCiAgICAgICAgLy8gd2hpY2ggb3RoZXJ3aXNlIHJlcGxhY2VzIDFzdCBTVkcgZ3JhcGhpYyB3aXRoIDJuZAogICAgICAgIGRpdi5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKICAgICAgfQogICAgfQoKICAgIHRoaXMuc2xpZGVzID0gc2xpZGVzOwogIH0sCgogIC8vIHJldHVybiBuZXcgYXJyYXkgb2YgYWxsIDxkaXYgY2xhc3M9ImhhbmRvdXQiPgogIGNvbGxlY3Rfbm90ZXM6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBub3RlcyA9IG5ldyBBcnJheSgpOwogICAgdmFyIGRpdnMgPSBkb2N1bWVudC5ib2R5LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpdnMubGVuZ3RoOyArK2kpCiAgICB7CiAgICAgIGRpdiA9IGRpdnMuaXRlbShpKTsKCiAgICAgIGlmICh0aGlzLmhhc19jbGFzcyhkaXYsICJoYW5kb3V0IikpCiAgICAgIHsKICAgICAgICAvLyBhZGQgbm90ZSB0byBjb2xsZWN0aW9uCiAgICAgICAgbm90ZXNbbm90ZXMubGVuZ3RoXSA9IGRpdjsKCiAgICAgICAgLy8gYW5kIGhpZGUgaXQKICAgICAgICB0aGlzLmFkZF9jbGFzcyhkaXYsICJoaWRkZW4iKTsKICAgICAgfQogICAgfQoKICAgIHRoaXMubm90ZXMgPSBub3RlczsKICB9LAoKICAvLyByZXR1cm4gbmV3IGFycmF5IG9mIGFsbCA8ZGl2IGNsYXNzPSJiYWNrZ3JvdW5kIj4KICAvLyBpbmNsdWRpbmcgbmFtZWQgYmFja2dyb3VuZHMgZS5nLiBjbGFzcz0iYmFja2dyb3VuZCB0aXRsZXBhZ2UiCiAgY29sbGVjdF9iYWNrZ3JvdW5kczogZnVuY3Rpb24gKCkgewogICAgdmFyIGJhY2tncm91bmRzID0gbmV3IEFycmF5KCk7CiAgICB2YXIgZGl2cyA9IGRvY3VtZW50LmJvZHkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGl2cy5sZW5ndGg7ICsraSkKICAgIHsKICAgICAgZGl2ID0gZGl2cy5pdGVtKGkpOwoKICAgICAgaWYgKHRoaXMuaGFzX2NsYXNzKGRpdiwgImJhY2tncm91bmQiKSkKICAgICAgewogICAgICAgIC8vIGFkZCBiYWNrZ3JvdW5kIHRvIGNvbGxlY3Rpb24KICAgICAgICBiYWNrZ3JvdW5kc1tiYWNrZ3JvdW5kcy5sZW5ndGhdID0gZGl2OwoKICAgICAgICAvLyBhbmQgaGlkZSBpdAogICAgICAgIHRoaXMuYWRkX2NsYXNzKGRpdiwgImhpZGRlbiIpOwogICAgICB9CiAgICB9CgogICAgdGhpcy5iYWNrZ3JvdW5kcyA9IGJhY2tncm91bmRzOwogIH0sCgogIC8vIHNldCBjbGljayBoYW5kbGVycyBvbiBhbGwgYW5jaG9ycwogIHBhdGNoX2FuY2hvcnM6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzZWxmID0gdzNjX3NsaWR5OwogICAgdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgLy8gY29tcGFyZSB0aGlzLmhyZWYgd2l0aCBsb2NhdGlvbi5ocmVmCiAgICAgIC8vIGZvciBsaW5rIHRvIGFub3RoZXIgc2xpZGUgaW4gdGhpcyBkb2MKCiAgICAgIGlmIChzZWxmLnBhZ2VfYWRkcmVzcyh0aGlzLmhyZWYpID09IHNlbGYucGFnZV9hZGRyZXNzKGxvY2F0aW9uLmhyZWYpKQogICAgICB7CiAgICAgICAgLy8geWVzLCBzbyBmaW5kIG5ldyBzbGlkZSBudW1iZXIKICAgICAgICB2YXIgbmV3c2xpZGVudW0gPSBzZWxmLmZpbmRfc2xpZGVfbnVtYmVyKHRoaXMuaHJlZik7CgogICAgICAgIGlmIChuZXdzbGlkZW51bSAhPSBzZWxmLnNsaWRlX251bWJlcikKICAgICAgICB7CiAgICAgICAgICB2YXIgc2xpZGUgPSBzZWxmLnNsaWRlc1tzZWxmLnNsaWRlX251bWJlcl07CiAgICAgICAgICBzZWxmLmhpZGVfc2xpZGUoc2xpZGUpOwogICAgICAgICAgc2VsZi5zbGlkZV9udW1iZXIgPSBuZXdzbGlkZW51bTsKICAgICAgICAgIHNsaWRlID0gc2VsZi5zbGlkZXNbc2VsZi5zbGlkZV9udW1iZXJdOwogICAgICAgICAgc2VsZi5zaG93X3NsaWRlKHNsaWRlKTsKICAgICAgICAgIHNlbGYuc2V0X2xvY2F0aW9uKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UKICAgICAgICB3M2Nfc2xpZHkuc3RvcF9wcm9wYWdhdGlvbihldmVudCk7CgovLyAgICAgIGVsc2UgaWYgKHRoaXMudGFyZ2V0ID09IG51bGwpCi8vICAgICAgICBsb2NhdGlvbi5ocmVmID0gdGhpcy5ocmVmOwoKICAgICAgdGhpcy5ibHVyKCk7CiAgICAgIHNlbGYuZGlzYWJsZV9zbGlkZV9jbGljayA9IHRydWU7CiAgICB9OwoKICAgIHZhciBhbmNob3JzID0gZG9jdW1lbnQuYm9keS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYW5jaG9ycy5sZW5ndGg7ICsraSkKICAgIHsKICAgICAgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKQogICAgICAgIGFuY2hvcnNbaV0uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBoYW5kbGVyLCBmYWxzZSk7CiAgICAgIGVsc2UKICAgICAgICBhbmNob3JzW2ldLmF0dGFjaEV2ZW50KCJvbmNsaWNrIiwgaGFuZGxlcik7CiAgICB9CiAgfSwKCiAgLy8gIyMjIENIRUNLIE1FICMjIyBzZWUgd2hpY2ggZnVuY3Rpb25zIGFyZSBpbnZva2VkIHZpYSBzZXRUaW1lb3V0CiAgLy8gZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgZm9yIHVzZSBvZiB3M2Nfc2xpZHkgdnMgdGhpcwogIHNob3dfc2xpZGVfbnVtYmVyOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgdGltZXIgPSB3M2Nfc2xpZHkuZ2V0X3RpbWVyKCk7CiAgICB3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyX2VsZW1lbnQuaW5uZXJIVE1MID0gdGltZXIgKyB3M2Nfc2xpZHkubG9jYWxpemUoInNsaWRlIikgKyAiICIgKwogICAgICAgICAgICh3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyICsgMSkgKyAiLyIgKyB3M2Nfc2xpZHkuc2xpZGVzLmxlbmd0aDsKICB9LAoKICAvLyBldmVyeSAyMDBtUyBjaGVjayBpZiB0aGUgbG9jYXRpb24gaGFzIGJlZW4gY2hhbmdlZCBhcyBhCiAgLy8gcmVzdWx0IG9mIHRoZSB1c2VyIGFjdGl2YXRpbmcgdGhlIEJhY2sgYnV0dG9uL21lbnUgaXRlbQogIC8vIGRvZXNuJ3Qgd29yayBmb3IgT3BlcmEgPCA5LjUKICBjaGVja19sb2NhdGlvbjogZnVuY3Rpb24gKCkgewogICAgdmFyIGhhc2ggPSBsb2NhdGlvbi5oYXNoOwoKICAgIGlmICh3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyID4gMCAmJiAoaGFzaCA9PSAiIiB8fCBoYXNoID09ICIjIikpCiAgICAgIHczY19zbGlkeS5nb3RvX3NsaWRlKDApOwogICAgZWxzZSBpZiAoaGFzaC5sZW5ndGggPiAyICYmIGhhc2ggIT0gIiMoIisodzNjX3NsaWR5LnNsaWRlX251bWJlcisxKSsiKSIpCiAgICB7CiAgICAgIHZhciBudW0gPSBwYXJzZUludChsb2NhdGlvbi5oYXNoLnN1YnN0cigyKSk7CgogICAgICBpZiAoIWlzTmFOKG51bSkpCiAgICAgICAgdzNjX3NsaWR5LmdvdG9fc2xpZGUobnVtLTEpOwogICAgfQoKICAgIGlmICh3M2Nfc2xpZHkudGltZV9sZWZ0ICYmIHczY19zbGlkeS5zbGlkZV9udW1iZXIgPiAwKQogICAgewogICAgICB3M2Nfc2xpZHkuc2hvd19zbGlkZV9udW1iZXIoKTsKCiAgICAgIGlmICh3M2Nfc2xpZHkudGltZV9sZWZ0ID4gMCkKICAgICAgICB3M2Nfc2xpZHkudGltZV9sZWZ0IC09IDIwMDsKICAgIH0gCiAgfSwKCiAgZ2V0X3RpbWVyOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgdGltZXIgPSAiIjsKICAgIGlmICh3M2Nfc2xpZHkudGltZV9sZWZ0KQogICAgewogICAgICB2YXIgbWlucywgc2VjczsKICAgICAgc2VjcyA9IE1hdGguZmxvb3IodzNjX3NsaWR5LnRpbWVfbGVmdC8xMDAwKTsKICAgICAgbWlucyA9IE1hdGguZmxvb3Ioc2VjcyAvIDYwKTsKICAgICAgc2VjcyA9IHNlY3MgJSA2MDsKICAgICAgdGltZXIgPSAobWlucyA/IG1pbnMrIm0iIDogIiIpICsgc2VjcyArICJzICI7CiAgICB9CgogICAgcmV0dXJuIHRpbWVyOwogIH0sCgogIC8vIHRoaXMgZG9lc24ndCBwdXNoIGxvY2F0aW9uIG9udG8gaGlzdG9yeSBzdGFjayBmb3IgSUUKICAvLyBmb3Igd2hpY2ggYSBoaWRkZW4gaWZyYW1lIGhhY2sgaXMgbmVlZGVkOiBsb2FkIHBhZ2UgaW50bwogIC8vIHRoZSBpZnJhbWUgd2l0aCBzY3JpcHQgdGhhdCBzZXQncyBwYXJlbnQncyBsb2NhdGlvbi5oYXNoCiAgLy8gYnV0IHRoYXQgd29uJ3Qgd29yayBmb3Igc3RhbmRhbG9uZSB1c2UgdW5sZXNzIHdlIGNhbgogIC8vIGNyZWF0ZSB0aGUgcGFnZSBkeW5hbWljYWxseSB2aWEgYSBqYXZhc2NyaXB0OiBVUkwKICAvLyAjIyMgdXNlIGhpc3RvcnkucHVzaFN0YXRlIGlmIGF2YWlsYWJsZQogIHNldF9sb2NhdGlvbjogZnVuY3Rpb24gKCkgewogICAgIHZhciB1cmkgPSB3M2Nfc2xpZHkucGFnZV9hZGRyZXNzKGxvY2F0aW9uLmhyZWYpOwogICAgIHZhciBoYXNoID0gIiMoIiArICh3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyKzEpICsgIikiOwoKICAgICBpZiAodzNjX3NsaWR5LnNsaWRlX251bWJlciA+PSAwKQogICAgICAgdXJpID0gdXJpICsgaGFzaDsKCiAgICAgaWYgKHR5cGVvZihoaXN0b3J5LnB1c2hTdGF0ZSkgIT0gInVuZGVmaW5lZCIgJiYgbG9jYXRpb24ucHJvdG9jb2wgIT09ICJmaWxlOiIpCiAgICAgewogICAgICAgZG9jdW1lbnQudGl0bGUgPSB3M2Nfc2xpZHkudGl0bGUgKyAiICgiICsgKHczY19zbGlkeS5zbGlkZV9udW1iZXIrMSkgKyAiKSI7CiAgICAgICBoaXN0b3J5LnB1c2hTdGF0ZSgwLCBkb2N1bWVudC50aXRsZSwgaGFzaCk7CiAgICAgICB3M2Nfc2xpZHkuc2hvd19zbGlkZV9udW1iZXIoKTsKICAgICAgIHczY19zbGlkeS5ub3RpZnlfb2JzZXJ2ZXJzKCk7CiAgICAgICByZXR1cm47CiAgICAgfQoKICAgICBpZiAodzNjX3NsaWR5LmllICYmICh3M2Nfc2xpZHkuaWU2IHx8IHczY19zbGlkeS5pZTcpKQogICAgICAgdzNjX3NsaWR5LnB1c2hfaGFzaChoYXNoKTsKCiAgICAgaWYgKHVyaSAhPSBsb2NhdGlvbi5ocmVmKSAvLyAmJiAha2h0bWwKICAgICAgICBsb2NhdGlvbi5ocmVmID0gdXJpOwoKICAgICBpZiAodGhpcy5raHRtbCkKICAgICAgICBoYXNoID0gIigiICsgKHczY19zbGlkeS5zbGlkZV9udW1iZXIrMSkgKyAiKSI7CgogICAgIGlmICghdGhpcy5pZSAmJiBsb2NhdGlvbi5oYXNoICE9IGhhc2ggJiYgbG9jYXRpb24uaGFzaCAhPSAiIikKICAgICAgIGxvY2F0aW9uLmhhc2ggPSBoYXNoOwoKICAgICBkb2N1bWVudC50aXRsZSA9IHczY19zbGlkeS50aXRsZSArICIgKCIgKyAodzNjX3NsaWR5LnNsaWRlX251bWJlcisxKSArICIpIjsKICAgICB3M2Nfc2xpZHkuc2hvd19zbGlkZV9udW1iZXIoKTsKICAgICB3M2Nfc2xpZHkubm90aWZ5X29ic2VydmVycygpOwogIH0sCgogIG5vdGlmeV9vYnNlcnZlcnM6IGZ1bmN0aW9uICgpCiAgewogICAgdmFyIHNsaWRlID0gdGhpcy5zbGlkZXNbdGhpcy5zbGlkZV9udW1iZXJdOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vYnNlcnZlcnMubGVuZ3RoOyArK2kpCiAgICAgIHRoaXMub2JzZXJ2ZXJzW2ldKHRoaXMuc2xpZGVfbnVtYmVyKzEsIHRoaXMuZmluZF9oZWFkaW5nKHNsaWRlKS5pbm5lclRleHQsIGxvY2F0aW9uLmhyZWYpOwogIH0sCgogIGFkZF9vYnNlcnZlcjogZnVuY3Rpb24gKG9ic2VydmVyKQogIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vYnNlcnZlcnMubGVuZ3RoOyArK2kpCiAgICB7CiAgICAgIGlmIChvYnNlcnZlciA9PSB0aGlzLm9ic2VydmVyc1tpXSkKICAgICAgICByZXR1cm47CiAgICB9CgogICAgdGhpcy5vYnNlcnZlcnMucHVzaChvYnNlcnZlcik7CiAgfSwKCiAgcmVtb3ZlX29ic2VydmVyOiBmdW5jdGlvbiAobykKICB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub2JzZXJ2ZXJzLmxlbmd0aDsgKytpKQogICAgewogICAgICBpZiAob2JzZXJ2ZXIgPT0gdGhpcy5vYnNlcnZlcnNbaV0pCiAgICAgIHsKICAgICAgICB0aGlzLm9ic2VydmVycy5zcGxpY2UoaSwxKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0sCgogIHBhZ2VfYWRkcmVzczogZnVuY3Rpb24gKHVyaSkgewogICAgdmFyIGkgPSB1cmkuaW5kZXhPZigiIyIpOwoKICAgIGlmIChpIDwgMCkKICAgICAgaSA9IHVyaS5pbmRleE9mKCIlMjMiKTsKCiAgICAvLyBjaGVjayBpZiBhbmNob3IgaXMgZW50aXJlIHBhZ2UKCiAgICBpZiAoaSA8IDApCiAgICAgIHJldHVybiB1cmk7ICAvLyB5ZXMKCiAgICByZXR1cm4gdXJpLnN1YnN0cigwLCBpKTsKICB9LAoKICAvLyBvbmx5IHVzZWQgZm9yIElFNiBhbmQgSUU3CiAgb25fZnJhbWVfbG9hZGVkOiBmdW5jdGlvbiAoaGFzaCkgewogICAgbG9jYXRpb24uaGFzaCA9IGhhc2g7CiAgICB2YXIgdXJpID0gdzNjX3NsaWR5LnBhZ2VfYWRkcmVzcyhsb2NhdGlvbi5ocmVmKTsKICAgIGxvY2F0aW9uLmhyZWYgPSB1cmkgKyBoYXNoOwogIH0sCgogIC8vIGhpc3RvcnkgaGFjayB3aXRoIHRoYW5rcyB0byBCZXJ0cmFuZCBMZSBSb3kKICBwdXNoX2hhc2g6IGZ1bmN0aW9uIChoYXNoKSB7CiAgICBpZiAoaGFzaCA9PSAiIikgaGFzaCA9ICIjKDEpIjsKICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSBoYXNoOwoKICAgIHZhciBkb2MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaGlzdG9yeUZyYW1lIikuY29udGVudFdpbmRvdy5kb2N1bWVudDsKICAgIGRvYy5vcGVuKCJqYXZhc2NyaXB0Oic8aHRtbD48L2h0bWw+JyIpOwogICAgZG9jLndyaXRlKCI8aHRtbD48aGVhZD48c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIj53aW5kb3cucGFyZW50LnczY19zbGlkeS5vbl9mcmFtZV9sb2FkZWQoJyIrCiAgICAgIChoYXNoKSArICInKTs8L3NjcmlwdD48L2hlYWQ+PGJvZHk+aGVsbG8gbXVtPC9ib2R5PjwvaHRtbD4iKTsKICAgICAgZG9jLmNsb3NlKCk7CiAgfSwKCiAgLy8gZmluZCBjdXJyZW50IHNsaWRlIGJhc2VkIHVwb24gbG9jYXRpb24KICAvLyBmaXJzdCBmaW5kIHRhcmdldCBhbmNob3IgYW5kIHRoZW4gbG9vawogIC8vIGZvciBhc3NvY2lhdGVkIGRpdiBlbGVtZW50IGVuY2xvc2luZyBpdAogIC8vIGZpbmFsbHkgbWFwIHRoYXQgdG8gc2xpZGUgbnVtYmVyCiAgZmluZF9zbGlkZV9udW1iZXI6IGZ1bmN0aW9uICh1cmkpIHsKICAgIC8vIGZpcnN0IGdldCBhbmNob3IgZnJvbSBwYWdlIGxvY2F0aW9uCgogICAgdmFyIGkgPSB1cmkuaW5kZXhPZigiIyIpOwoKICAgIC8vIGNoZWNrIGlmIGFuY2hvciBpcyBlbnRpcmUgcGFnZQogICAgaWYgKGkgPCAwKQogICAgICByZXR1cm4gMDsgIC8vIHllcwoKICAgIHZhciBhbmNob3IgPSB1bmVzY2FwZSh1cmkuc3Vic3RyKGkrMSkpOwoKICAgIC8vIG5vdyB1c2UgYW5jaG9yIGFzIFhNTCBJRCB0byBmaW5kIHRhcmdldAogICAgdmFyIHRhcmdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFuY2hvcik7CgogICAgaWYgKCF0YXJnZXQpCiAgICB7CiAgICAgIC8vIGRvZXMgYW5jaG9yIGxvb2sgbGlrZSAiKDIpIiBmb3Igc2xpZGUgMiA/PwogICAgICAvLyB3aGVyZSBmaXJzdCBzbGlkZSBpcyAoMSkKICAgICAgdmFyIHJlID0gL1woKFxkKStcKS87CgogICAgICBpZiAoYW5jaG9yLm1hdGNoKHJlKSkKICAgICAgewogICAgICAgIHZhciBudW0gPSBwYXJzZUludChhbmNob3Iuc3Vic3RyaW5nKDEsIGFuY2hvci5sZW5ndGgtMSkpOwoKICAgICAgICBpZiAobnVtID4gdGhpcy5zbGlkZXMubGVuZ3RoKQogICAgICAgICAgbnVtID0gMTsKCiAgICAgICAgaWYgKC0tbnVtIDwgMCkKICAgICAgICAgIG51bSA9IDA7CgogICAgICAgIHJldHVybiBudW07CiAgICAgIH0KCiAgICAgIC8vIGFjY2VwdCBbMl0gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CiAgICAgIHJlID0gL1xbKFxkKStcXS87CgogICAgICBpZiAoYW5jaG9yLm1hdGNoKHJlKSkKICAgICAgewogICAgICAgICB2YXIgbnVtID0gcGFyc2VJbnQoYW5jaG9yLnN1YnN0cmluZygxLCBhbmNob3IubGVuZ3RoLTEpKTsKCiAgICAgICAgIGlmIChudW0gPiB0aGlzLnNsaWRlcy5sZW5ndGgpCiAgICAgICAgICAgIG51bSA9IDE7CgogICAgICAgICBpZiAoLS1udW0gPCAwKQogICAgICAgICAgICBudW0gPSAwOwoKICAgICAgICAgcmV0dXJuIG51bTsKICAgICAgfQoKICAgICAgLy8gb2ggZGVhciB1bmtub3duIGFuY2hvcgogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvLyBzZWFyY2ggZm9yIGVuY2xvc2luZyBzbGlkZQoKICAgIHdoaWxlICh0cnVlKQogICAgewogICAgICAvLyBicm93c2VyIGNvZXJjZXMgaHRtbCBlbGVtZW50cyB0byB1cHBlcmNhc2UhCiAgICAgIGlmICh0YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSAiZGl2IiAmJgogICAgICAgICAgICB0aGlzLmhhc19jbGFzcyh0YXJnZXQsICJzbGlkZSIpKQogICAgICB7CiAgICAgICAgLy8gZm91bmQgdGhlIHNsaWRlIGVsZW1lbnQKICAgICAgICBicmVhazsKICAgICAgfQoKICAgICAgLy8gb3RoZXJ3aXNlIHRyeSBwYXJlbnQgZWxlbWVudCBpZiBhbnkKCiAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlOwoKICAgICAgaWYgKCF0YXJnZXQpCiAgICAgIHsKICAgICAgICByZXR1cm4gMDsgICAvLyBubyBsdWNrIQogICAgICB9CiAgICB9OwoKICAgIGZvciAoaSA9IDA7IGkgPCBzbGlkZXMubGVuZ3RoOyArK2kpCiAgICB7CiAgICAgIGlmIChzbGlkZXNbaV0gPT0gdGFyZ2V0KQogICAgICAgIHJldHVybiBpOyAgLy8gc3VjY2VzcwogICAgfQoKICAgIC8vIG9oIGRlYXIgc3RpbGwgbm8gbHVjawogICAgcmV0dXJuIDA7CiAgfSwKCiAgcHJldmlvdXNfc2xpZGU6IGZ1bmN0aW9uIChpbmNyZW1lbnRhbCkgewogICAgaWYgKCF3M2Nfc2xpZHkudmlld19hbGwpCiAgICB7CiAgICAgIHZhciBzbGlkZTsKCiAgICAgIGlmICgoaW5jcmVtZW50YWwgfHwgdzNjX3NsaWR5LnNsaWRlX251bWJlciA9PSAwKSAmJiB3M2Nfc2xpZHkubGFzdF9zaG93biAhPSBudWxsKQogICAgICB7CiAgICAgICAgdzNjX3NsaWR5Lmxhc3Rfc2hvd24gPSB3M2Nfc2xpZHkuaGlkZV9wcmV2aW91c19pdGVtKHczY19zbGlkeS5sYXN0X3Nob3duKTsKICAgICAgICB3M2Nfc2xpZHkuc2V0X2Vvc19zdGF0dXMoZmFsc2UpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKHczY19zbGlkeS5zbGlkZV9udW1iZXIgPiAwKQogICAgICB7CiAgICAgICAgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgICAgIHczY19zbGlkeS5oaWRlX3NsaWRlKHNsaWRlKTsKCiAgICAgICAgdzNjX3NsaWR5LnNsaWRlX251bWJlciA9IHczY19zbGlkeS5zbGlkZV9udW1iZXIgLSAxOwogICAgICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICB3M2Nfc2xpZHkuc2V0X3Zpc2liaWxpdHlfYWxsX2luY3JlbWVudGFsKCJ2aXNpYmxlIik7CiAgICAgICAgdzNjX3NsaWR5Lmxhc3Rfc2hvd24gPSB3M2Nfc2xpZHkucHJldmlvdXNfaW5jcmVtZW50YWxfaXRlbShudWxsKTsKICAgICAgICB3M2Nfc2xpZHkuc2V0X2Vvc19zdGF0dXModHJ1ZSk7CiAgICAgICAgdzNjX3NsaWR5LnNob3dfc2xpZGUoc2xpZGUpOwogICAgICB9CgogICAgICB3M2Nfc2xpZHkuc2V0X2xvY2F0aW9uKCk7CgogICAgICBpZiAoIXczY19zbGlkeS5uc19wb3MpCiAgICAgICAgdzNjX3NsaWR5LnJlZnJlc2hfdG9vbGJhcigyMDApOwogICAgfQogIH0sCgogIG5leHRfc2xpZGU6IGZ1bmN0aW9uIChpbmNyZW1lbnRhbCkgewogICAgaWYgKCF3M2Nfc2xpZHkudmlld19hbGwpCiAgICB7CiAgICAgIHZhciBzbGlkZSwgbGFzdCA9IHczY19zbGlkeS5sYXN0X3Nob3duOwoKICAgICAgaWYgKGluY3JlbWVudGFsIHx8IHczY19zbGlkeS5zbGlkZV9udW1iZXIgPT0gdzNjX3NsaWR5LnNsaWRlcy5sZW5ndGggLSAxKQogICAgICAgICB3M2Nfc2xpZHkubGFzdF9zaG93biA9IHczY19zbGlkeS5yZXZlYWxfbmV4dF9pdGVtKHczY19zbGlkeS5sYXN0X3Nob3duKTsKCiAgICAgIGlmICgoIWluY3JlbWVudGFsIHx8IHczY19zbGlkeS5sYXN0X3Nob3duID09IG51bGwpICYmCiAgICAgICAgICAgICB3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyIDwgdzNjX3NsaWR5LnNsaWRlcy5sZW5ndGggLSAxKQogICAgICB7CiAgICAgICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICAgdzNjX3NsaWR5LmhpZGVfc2xpZGUoc2xpZGUpOwoKICAgICAgICAgdzNjX3NsaWR5LnNsaWRlX251bWJlciA9IHczY19zbGlkeS5zbGlkZV9udW1iZXIgKyAxOwogICAgICAgICBzbGlkZSA9IHczY19zbGlkeS5zbGlkZXNbdzNjX3NsaWR5LnNsaWRlX251bWJlcl07CiAgICAgICAgIHczY19zbGlkeS5sYXN0X3Nob3duID0gbnVsbDsKICAgICAgICAgdzNjX3NsaWR5LnNldF92aXNpYmlsaXR5X2FsbF9pbmNyZW1lbnRhbCgiaGlkZGVuIik7CiAgICAgICAgIHczY19zbGlkeS5zaG93X3NsaWRlKHNsaWRlKTsKICAgICAgfQogICAgICBlbHNlIGlmICghdzNjX3NsaWR5Lmxhc3Rfc2hvd24pCiAgICAgIHsKICAgICAgICAgaWYgKGxhc3QgJiYgaW5jcmVtZW50YWwpCiAgICAgICAgICAgdzNjX3NsaWR5Lmxhc3Rfc2hvd24gPSBsYXN0OwogICAgICB9CgogICAgICB3M2Nfc2xpZHkuc2V0X2xvY2F0aW9uKCk7CgogICAgICB3M2Nfc2xpZHkuc2V0X2Vvc19zdGF0dXMoIXczY19zbGlkeS5uZXh0X2luY3JlbWVudGFsX2l0ZW0odzNjX3NsaWR5Lmxhc3Rfc2hvd24pKTsKCiAgICAgIGlmICghdzNjX3NsaWR5Lm5zX3BvcykKICAgICAgICAgdzNjX3NsaWR5LnJlZnJlc2hfdG9vbGJhcigyMDApOwogICAgIH0KICB9LAoKICAvLyB0byBmaXJzdCBzbGlkZSB3aXRoIG5vdGhpbmcgcmV2ZWFsZWQKICAvLyBpLmUuIHN0YXRlIGF0IHN0YXJ0IG9mIHByZXNlbnRhdGlvbgogIGZpcnN0X3NsaWRlOiBmdW5jdGlvbiAoKSB7CiAgICAgaWYgKCF3M2Nfc2xpZHkudmlld19hbGwpCiAgICAgewogICAgICAgdmFyIHNsaWRlOwoKICAgICAgIGlmICh3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyICE9IDApCiAgICAgICB7CiAgICAgICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICAgdzNjX3NsaWR5LmhpZGVfc2xpZGUoc2xpZGUpOwoKICAgICAgICAgdzNjX3NsaWR5LnNsaWRlX251bWJlciA9IDA7CiAgICAgICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICAgdzNjX3NsaWR5Lmxhc3Rfc2hvd24gPSBudWxsOwogICAgICAgICB3M2Nfc2xpZHkuc2V0X3Zpc2liaWxpdHlfYWxsX2luY3JlbWVudGFsKCJoaWRkZW4iKTsKICAgICAgICAgdzNjX3NsaWR5LnNob3dfc2xpZGUoc2xpZGUpOwogICAgICAgfQoKICAgICAgIHczY19zbGlkeS5zZXRfZW9zX3N0YXR1cygKICAgICAgICAgIXczY19zbGlkeS5uZXh0X2luY3JlbWVudGFsX2l0ZW0odzNjX3NsaWR5Lmxhc3Rfc2hvd24pKTsKICAgICAgIHczY19zbGlkeS5zZXRfbG9jYXRpb24oKTsKICAgICB9CiAgfSwKCiAgLy8gZ290byBsYXN0IHNsaWRlIHdpdGggZXZlcnl0aGluZyByZXZlYWxlZAogIC8vIGkuZS4gc3RhdGUgYXQgZW5kIG9mIHByZXNlbnRhdGlvbgogIGxhc3Rfc2xpZGU6IGZ1bmN0aW9uICgpIHsKICAgIGlmICghdzNjX3NsaWR5LnZpZXdfYWxsKQogICAgewogICAgICB2YXIgc2xpZGU7CgogICAgICB3M2Nfc2xpZHkubGFzdF9zaG93biA9IG51bGw7IC8vcmV2ZWFsTmV4dEl0ZW0obGFzdFNob3duKTsKCiAgICAgIGlmICh3M2Nfc2xpZHkubGFzdF9zaG93biA9PSBudWxsICYmCiAgICAgICAgICB3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyIDwgdzNjX3NsaWR5LnNsaWRlcy5sZW5ndGggLSAxKQogICAgICB7CiAgICAgICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICAgdzNjX3NsaWR5LmhpZGVfc2xpZGUoc2xpZGUpOwogICAgICAgICB3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyID0gdzNjX3NsaWR5LnNsaWRlcy5sZW5ndGggLSAxOwogICAgICAgICBzbGlkZSA9IHczY19zbGlkeS5zbGlkZXNbdzNjX3NsaWR5LnNsaWRlX251bWJlcl07CiAgICAgICAgIHczY19zbGlkeS5zZXRfdmlzaWJpbGl0eV9hbGxfaW5jcmVtZW50YWwoInZpc2libGUiKTsKICAgICAgICAgdzNjX3NsaWR5Lmxhc3Rfc2hvd24gPSB3M2Nfc2xpZHkucHJldmlvdXNfaW5jcmVtZW50YWxfaXRlbShudWxsKTsKCiAgICAgICAgIHczY19zbGlkeS5zaG93X3NsaWRlKHNsaWRlKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAgdzNjX3NsaWR5LnNldF92aXNpYmlsaXR5X2FsbF9pbmNyZW1lbnRhbCgidmlzaWJsZSIpOwogICAgICAgICB3M2Nfc2xpZHkubGFzdF9zaG93biA9IHczY19zbGlkeS5wcmV2aW91c19pbmNyZW1lbnRhbF9pdGVtKG51bGwpOwogICAgICB9CgogICAgICB3M2Nfc2xpZHkuc2V0X2Vvc19zdGF0dXModHJ1ZSk7CiAgICAgIHczY19zbGlkeS5zZXRfbG9jYXRpb24oKTsKICAgIH0KICB9LAoKCiAgLy8gIyMjIGNoZWNrIHRoaXMgYW5kIGNvbnNpZGVyIGFkZC9yZW1vdmUgY2xhc3MKICBzZXRfZW9zX3N0YXR1czogZnVuY3Rpb24gKHN0YXRlKSB7CiAgICBpZiAodGhpcy5lb3MpCiAgICAgIHRoaXMuZW9zLnN0eWxlLmNvbG9yID0gKHN0YXRlID8gInJnYigyNDAsMjQwLDI0MCkiIDogInJlZCIpOwogIH0sCgogIC8vIGZpcnN0IHNsaWRlIGlzIDAKICBnb3RvX3NsaWRlOiBmdW5jdGlvbiAobnVtKSB7CiAgICAvL2FsZXJ0KCJnb2luZyB0byBzbGlkZSAiICsgKG51bSsxKSk7CiAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgdzNjX3NsaWR5LmhpZGVfc2xpZGUoc2xpZGUpOwogICAgdzNjX3NsaWR5LnNsaWRlX251bWJlciA9IG51bTsKICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgIHczY19zbGlkeS5sYXN0X3Nob3duID0gbnVsbDsKICAgIHczY19zbGlkeS5zZXRfdmlzaWJpbGl0eV9hbGxfaW5jcmVtZW50YWwoImhpZGRlbiIpOwogICAgdzNjX3NsaWR5LnNldF9lb3Nfc3RhdHVzKCF3M2Nfc2xpZHkubmV4dF9pbmNyZW1lbnRhbF9pdGVtKHczY19zbGlkeS5sYXN0X3Nob3duKSk7CiAgICBkb2N1bWVudC50aXRsZSA9IHczY19zbGlkeS50aXRsZSArICIgKCIgKyAodzNjX3NsaWR5LnNsaWRlX251bWJlcisxKSArICIpIjsKICAgIHczY19zbGlkeS5zaG93X3NsaWRlKHNsaWRlKTsKICAgIHczY19zbGlkeS5zaG93X3NsaWRlX251bWJlcigpOwogIH0sCgoKICBzaG93X3NsaWRlOiBmdW5jdGlvbiAoc2xpZGUpIHsKICAgIHRoaXMuc3luY19iYWNrZ3JvdW5kKHNsaWRlKTsKICAgIHRoaXMucmVtb3ZlX2NsYXNzKHNsaWRlLCAiaGlkZGVuIik7CgogICAgLy8gd29yayBhcm91bmQgSUU5IG9iamVjdCByZW5kZXJpbmcgYnVnCiAgICBzZXRUaW1lb3V0KCJ3aW5kb3cuc2Nyb2xsVG8oMCwwKTsiLCAxKTsKICB9LAoKICBoaWRlX3NsaWRlOiBmdW5jdGlvbiAoc2xpZGUpIHsKICAgIHRoaXMuYWRkX2NsYXNzKHNsaWRlLCAiaGlkZGVuIik7CiAgfSwKCiAgc2V0X2ZvY3VzOiBmdW5jdGlvbiAoZWxlbWVudCkKICB7CiAgICBpZiAoZWxlbWVudCkKICAgICAgZWxlbWVudC5mb2N1cygpOwogICAgZWxzZQogICAgewogICAgICB3M2Nfc2xpZHkuaGVscF9hbmNob3IuZm9jdXMoKTsKCiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgdzNjX3NsaWR5LmhlbHBfYW5jaG9yLmJsdXIoKTsKICAgICAgfSwgMSk7CiAgICB9CiAgfSwKCiAgLy8gc2hvdyBqdXN0IHRoZSBiYWNrZ3JvdW5kcyBwZXJ0aW5lbnQgdG8gdGhpcyBzbGlkZQogIC8vIHdoZW4gc2xpZGUgYmFja2dyb3VuZC1jb2xvciBpcyB0cmFuc3BhcmVudAogIC8vIHRoaXMgc2hvdWxkIG5vdyB3b3JrIHdpdGggcmdiYSBjb2xvciB2YWx1ZXMKICBzeW5jX2JhY2tncm91bmQ6IGZ1bmN0aW9uIChzbGlkZSkgewogICAgdmFyIGJhY2tncm91bmQ7CiAgICB2YXIgYmdDb2xvcjsKCiAgICBpZiAoc2xpZGUuY3VycmVudFN0eWxlKQogICAgICBiZ0NvbG9yID0gc2xpZGUuY3VycmVudFN0eWxlWyJiYWNrZ3JvdW5kQ29sb3IiXTsKICAgIGVsc2UgaWYgKGRvY3VtZW50LmRlZmF1bHRWaWV3KQogICAgewogICAgICB2YXIgc3R5bGVzID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShzbGlkZSxudWxsKTsKCiAgICAgIGlmIChzdHlsZXMpCiAgICAgICAgYmdDb2xvciA9IHN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKCJiYWNrZ3JvdW5kLWNvbG9yIik7CiAgICAgIGVsc2UgLy8gYnJva2VuIGltcGxlbWVudGF0aW9uIHByb2JhYmx5IGR1ZSBTYWZhcmkgb3IgS29ucXVlcm9yCiAgICAgIHsKICAgICAgICAvL2FsZXJ0KCJkZWZlY3RpdmUgaW1wbGVtZW50YXRpb24gb2YgZ2V0Q29tcHV0ZWRTdHlsZSgpIik7CiAgICAgICAgYmdDb2xvciA9ICJ0cmFuc3BhcmVudCI7CiAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgICAgYmdDb2xvciA9PSAidHJhbnNwYXJlbnQiOwoKICAgIGlmIChiZ0NvbG9yID09ICJ0cmFuc3BhcmVudCIgfHwKICAgICAgICBiZ0NvbG9yLmluZGV4T2YoInJnYmEiKSA+PSAwIHx8CiAgICAgICAgYmdDb2xvci5pbmRleE9mKCJvcGFjaXR5IikgPj0gMCkKICAgIHsKICAgICAgdmFyIHNsaWRlQ2xhc3MgPSB0aGlzLmdldF9jbGFzc19saXN0KHNsaWRlKTsKCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5iYWNrZ3JvdW5kcy5sZW5ndGg7IGkrKykKICAgICAgewogICAgICAgIGJhY2tncm91bmQgPSB0aGlzLmJhY2tncm91bmRzW2ldOwoKICAgICAgICB2YXIgYmdDbGFzcyA9IHRoaXMuZ2V0X2NsYXNzX2xpc3QoYmFja2dyb3VuZCk7CgogICAgICAgIGlmICh0aGlzLm1hdGNoaW5nX2JhY2tncm91bmQoc2xpZGVDbGFzcywgYmdDbGFzcykpCiAgICAgICAgICB0aGlzLnJlbW92ZV9jbGFzcyhiYWNrZ3JvdW5kLCAiaGlkZGVuIik7CiAgICAgICAgZWxzZQogICAgICAgICAgdGhpcy5hZGRfY2xhc3MoYmFja2dyb3VuZCwgImhpZGRlbiIpOwogICAgICB9CiAgICB9CiAgICBlbHNlIC8vIGZvcmNpYmx5IGhpZGUgYWxsIGJhY2tncm91bmRzCiAgICAgIHRoaXMuaGlkZV9iYWNrZ3JvdW5kcygpOwogIH0sCgogIGhpZGVfYmFja2dyb3VuZHM6IGZ1bmN0aW9uICgpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5iYWNrZ3JvdW5kcy5sZW5ndGg7IGkrKykKICAgIHsKICAgICAgYmFja2dyb3VuZCA9IHRoaXMuYmFja2dyb3VuZHNbaV07CiAgICAgIHRoaXMuYWRkX2NsYXNzKGJhY2tncm91bmQsICJoaWRkZW4iKTsKICAgIH0KICB9LAoKICAvLyBjb21wYXJlIGNsYXNzZXMgZm9yIHNsaWRlIGFuZCBiYWNrZ3JvdW5kCiAgbWF0Y2hpbmdfYmFja2dyb3VuZDogZnVuY3Rpb24gKHNsaWRlQ2xhc3MsIGJnQ2xhc3MpIHsKICAgIHZhciBpLCBjb3VudCwgcGF0dGVybiwgcmVzdWx0OwoKICAgIC8vIGRlZmluZSBwYXR0ZXJuIGFzIHJlZ3VsYXIgZXhwcmVzc2lvbgogICAgcGF0dGVybiA9IC9cdysvZzsKCiAgICAvLyBjaGVjayBiYWNrZ3JvdW5kIGNsYXNzIG5hbWVzCiAgICByZXN1bHQgPSBiZ0NsYXNzLm1hdGNoKHBhdHRlcm4pOwoKICAgIGZvciAoaSA9IGNvdW50ID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykKICAgIHsKICAgICAgaWYgKHJlc3VsdFtpXSA9PSAiaGlkZGVuIikKICAgICAgICBjb250aW51ZTsKCiAgICAgIGlmIChyZXN1bHRbaV0gPT0gImJhY2tncm91bmQiKQoJY29udGludWU7CgogICAgICArK2NvdW50OwogICAgfQoKICAgIGlmIChjb3VudCA9PSAwKSAgLy8gZGVmYXVsdCBtYXRjaAogICAgICByZXR1cm4gdHJ1ZTsKCiAgICAvLyBjaGVjayBmb3IgbWF0Y2hlcyBhbmQgcGxhY2UgcmVzdWx0IGluIGFycmF5CiAgICByZXN1bHQgPSBzbGlkZUNsYXNzLm1hdGNoKHBhdHRlcm4pOwoKICAgIC8vIG5vdyBjaGVjayBpZiBkZXNpcmVkIG5hbWUgaXMgcHJlc2VudCBmb3IgYmFja2dyb3VuZAogICAgZm9yIChpID0gY291bnQgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKQogICAgewogICAgICBpZiAocmVzdWx0W2ldID09ICJoaWRkZW4iKQogICAgICAgIGNvbnRpbnVlOwoKICAgICAgaWYgKHRoaXMuaGFzX3Rva2VuKGJnQ2xhc3MsIHJlc3VsdFtpXSkpCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0sCgogIHJlc2l6ZWQ6IGZ1bmN0aW9uICgpIHsKICAgICB2YXIgd2lkdGggPSAwOwoKICAgICBpZiAoIHR5cGVvZiggd2luZG93LmlubmVyV2lkdGggKSA9PSAnbnVtYmVyJyApCiAgICAgICB3aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoOyAgLy8gTm9uIElFIGJyb3dzZXIKICAgICBlbHNlIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKQogICAgICAgd2lkdGggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7ICAvLyBJRTYKICAgICBlbHNlIGlmIChkb2N1bWVudC5ib2R5ICYmIGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgpCiAgICAgICB3aWR0aCA9IGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGg7IC8vIElFNAoKICAgICB2YXIgaGVpZ2h0ID0gMDsKCiAgICAgaWYgKCB0eXBlb2YoIHdpbmRvdy5pbm5lckhlaWdodCApID09ICdudW1iZXInICkKICAgICAgIGhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDsgIC8vIE5vbiBJRSBicm93c2VyCiAgICAgZWxzZSBpZiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpCiAgICAgICBoZWlnaHQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0OyAgLy8gSUU2CiAgICAgZWxzZSBpZiAoZG9jdW1lbnQuYm9keSAmJiBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCkKICAgICAgIGhlaWdodCA9IGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0OyAvLyBJRTQKCiAgICAgaWYgKGhlaWdodCAmJiAod2lkdGgvaGVpZ2h0ID4gMS4wNSoxMDI0Lzc2OCkpCiAgICAgewogICAgICAgd2lkdGggPSBoZWlnaHQgKiAxMDI0LjAvNzY4OwogICAgIH0KCiAgICAgLy8gSUUgZmlyZXMgb25yZXNpemUgZXZlbiB3aGVuIG9ubHkgZm9udCBzaXplIGlzIGNoYW5nZWQhCiAgICAgLy8gc28gd2UgZG8gYSBjaGVjayB0byBhdm9pZCBibG9ja2luZyA8IGFuZCA+IGFjdGlvbnMKICAgICBpZiAod2lkdGggIT0gdzNjX3NsaWR5Lmxhc3Rfd2lkdGggfHwgaGVpZ2h0ICE9IHczY19zbGlkeS5sYXN0X2hlaWdodCkKICAgICB7CiAgICAgICBpZiAod2lkdGggPj0gMTEwMCkKICAgICAgICAgdzNjX3NsaWR5LnNpemVfaW5kZXggPSA1OyAgICAvLyA0CiAgICAgICBlbHNlIGlmICh3aWR0aCA+PSAxMDAwKQogICAgICAgICB3M2Nfc2xpZHkuc2l6ZV9pbmRleCA9IDQ7ICAgIC8vIDMKICAgICAgIGVsc2UgaWYgKHdpZHRoID49IDgwMCkKICAgICAgICAgdzNjX3NsaWR5LnNpemVfaW5kZXggPSAzOyAgICAvLyAyCiAgICAgICBlbHNlIGlmICh3aWR0aCA+PSA2MDApCiAgICAgICAgIHczY19zbGlkeS5zaXplX2luZGV4ID0gMjsgICAgLy8gMQogICAgICAgZWxzZSBpZiAod2lkdGgpCiAgICAgICAgIHczY19zbGlkeS5zaXplX2luZGV4ID0gMDsKCiAgICAgICAvLyBhZGQgaW4gZm9udCBzaXplIGFkanVzdG1lbnQgZnJvbSBtZXRhIGVsZW1lbnQgZS5nLgogICAgICAgLy8gPG1ldGEgbmFtZT0iZm9udC1zaXplLWFkanVzdG1lbnQiIGNvbnRlbnQ9Ii0yIiAvPgogICAgICAgLy8gdXNlZnVsIHdoZW4gc2xpZGVzIGhhdmUgdG9vIG11Y2ggY29udGVudCA7LSkKCiAgICAgICBpZiAoMCA8PSB3M2Nfc2xpZHkuc2l6ZV9pbmRleCArIHczY19zbGlkeS5zaXplX2FkanVzdG1lbnQgJiYKICAgICAgICAgICAgIHczY19zbGlkeS5zaXplX2luZGV4ICsgdzNjX3NsaWR5LnNpemVfYWRqdXN0bWVudCA8IHczY19zbGlkeS5zaXplcy5sZW5ndGgpCiAgICAgICAgIHczY19zbGlkeS5zaXplX2luZGV4ID0gdzNjX3NsaWR5LnNpemVfaW5kZXggKyB3M2Nfc2xpZHkuc2l6ZV9hZGp1c3RtZW50OwoKICAgICAgIC8vIGVuYWJsZXMgY3Jvc3MgYnJvd3NlciB1c2Ugb2YgcmVsYXRpdmUgd2lkdGgvaGVpZ2h0CiAgICAgICAvLyBvbiBvYmplY3QgZWxlbWVudHMgZm9yIHVzZSB3aXRoIFNWRyBhbmQgRmxhc2ggbWVkaWEKICAgICAgIHczY19zbGlkeS5hZGp1c3Rfb2JqZWN0X2RpbWVuc2lvbnMod2lkdGgsIGhlaWdodCk7CgogICAgICAgaWYgKGRvY3VtZW50LmJvZHkuc3R5bGUuZm9udFNpemUgIT0gdzNjX3NsaWR5LnNpemVzW3czY19zbGlkeS5zaXplX2luZGV4XSkKICAgICAgIHsKICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5mb250U2l6ZSA9IHczY19zbGlkeS5zaXplc1t3M2Nfc2xpZHkuc2l6ZV9pbmRleF07CiAgICAgICB9CgogICAgICAgdzNjX3NsaWR5Lmxhc3Rfd2lkdGggPSB3aWR0aDsKICAgICAgIHczY19zbGlkeS5sYXN0X2hlaWdodCA9IGhlaWdodDsKCiAgICAgICAvLyBmb3JjZSByZWZsb3cgdG8gd29yayBhcm91bmQgTW96aWxsYSBidWcKICAgICAgIGlmICh3M2Nfc2xpZHkubnNfcG9zKQogICAgICAgewogICAgICAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgICAgICB3M2Nfc2xpZHkuaGlkZV9zbGlkZShzbGlkZSk7CiAgICAgICAgIHczY19zbGlkeS5zaG93X3NsaWRlKHNsaWRlKTsKICAgICAgIH0KCiAgICAgICAvLyBmb3JjZSBjb3JyZWN0IHBvc2l0aW9uaW5nIG9mIHRvb2xiYXIKICAgICAgIHczY19zbGlkeS5yZWZyZXNoX3Rvb2xiYXIoMjAwKTsKICAgICB9CiAgfSwKCiAgc2Nyb2xsZWQ6IGZ1bmN0aW9uICgpIHsKICAgIGlmICh3M2Nfc2xpZHkudG9vbGJhciAmJiAhdzNjX3NsaWR5Lm5zX3BvcyAmJiAhdzNjX3NsaWR5LmllNykKICAgIHsKICAgICAgdzNjX3NsaWR5LmhhY2tfb2Zmc2V0ID0gdzNjX3NsaWR5LnNjcm9sbF94X29mZnNldCgpOwogICAgICAvLyBoaWRlIHRvb2xiYXIKICAgICAgdzNjX3NsaWR5LnRvb2xiYXIuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKCiAgICAgIC8vIG1ha2UgaXQgcmVhcHBlYXIgbGF0ZXIKICAgICAgaWYgKHczY19zbGlkeS5zY3JvbGxoYWNrID09IDAgJiYgIXczY19zbGlkeS52aWV3X2FsbCkKICAgICAgewogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge3czY19zbGlkeS5zaG93X3Rvb2xiYXIoKTsgfSwgMTAwMCk7CiAgICAgICAgdzNjX3NsaWR5LnNjcm9sbGhhY2sgPSAxOwogICAgICB9CiAgICB9CiAgfSwKCiAgaGlkZV90b29sYmFyOiBmdW5jdGlvbiAoKSB7CiAgICB3M2Nfc2xpZHkuYWRkX2NsYXNzKHczY19zbGlkeS50b29sYmFyLCAiaGlkZGVuIik7CiAgICB3aW5kb3cuZm9jdXMoKTsKICB9LAoKICAvLyB1c2VkIHRvIGVuc3VyZSBJRSByZWZyZXNoZXMgdG9vbGJhciBpbiBjb3JyZWN0IHBvc2l0aW9uCiAgcmVmcmVzaF90b29sYmFyOiBmdW5jdGlvbiAoaW50ZXJ2YWwpIHsKICAgIGlmICghdzNjX3NsaWR5Lm5zX3BvcyAmJiAhdzNjX3NsaWR5LmllNykKICAgIHsKICAgICAgdzNjX3NsaWR5LmhpZGVfdG9vbGJhcigpOwogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHt3M2Nfc2xpZHkuc2hvd190b29sYmFyKCk7fSwgaW50ZXJ2YWwpOwogICAgfQogIH0sCgogIC8vIHJlc3RvcmVzIHRvb2xiYXIgYWZ0ZXIgc2hvcnQgZGVsYXkKICBzaG93X3Rvb2xiYXI6IGZ1bmN0aW9uICgpIHsKICAgIGlmICh3M2Nfc2xpZHkud2FudF90b29sYmFyKQogICAgewogICAgICB3M2Nfc2xpZHkudG9vbGJhci5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKCiAgICAgIGlmICghdzNjX3NsaWR5Lm5zX3BvcykKICAgICAgewogICAgICAgIC8vIGFkanVzdCBwb3NpdGlvbiB0byBhbGxvdyBmb3Igc2Nyb2xsaW5nCiAgICAgICAgdmFyIHhvZmZzZXQgPSB3M2Nfc2xpZHkuc2Nyb2xsX3hfb2Zmc2V0KCk7CiAgICAgICAgdzNjX3NsaWR5LnRvb2xiYXIuc3R5bGUubGVmdCA9IHhvZmZzZXQ7CiAgICAgICAgdzNjX3NsaWR5LnRvb2xiYXIuc3R5bGUucmlnaHQgPSB4b2Zmc2V0OwoKICAgICAgICAvLyBkZXRlcm1pbmUgdmVydGljYWwgc2Nyb2xsIG9mZnNldAogICAgICAgIC8vdmFyIHlvZmZzZXQgPSBzY3JvbGxZT2Zmc2V0KCk7CgogICAgICAgIC8vIGJvdHRvbSBpcyBkb2MgaGVpZ2h0IC0gd2luZG93IGhlaWdodCAtIHNjcm9sbCBvZmZzZXQKICAgICAgICAvL3ZhciBib3R0b20gPSBkb2N1bWVudEhlaWdodCgpIC0gbGFzdEhlaWdodCAtIHlvZmZzZXQKCiAgICAgICAgLy9pZiAoeW9mZnNldCA+IDAgfHwgZG9jdW1lbnRIZWlnaHQoKSA+IGxhc3RIZWlnaHQpCiAgICAgICAgLy8gICBib3R0b20gKz0gMTY7ICAvLyBhbGxvdyBmb3IgaGVpZ2h0IG9mIHNjcm9sbGJhcgoKICAgICAgICB3M2Nfc2xpZHkudG9vbGJhci5zdHlsZS5ib3R0b20gPSAwOyAvL2JvdHRvbTsKICAgICAgfQoKICAgICAgdzNjX3NsaWR5LnJlbW92ZV9jbGFzcyh3M2Nfc2xpZHkudG9vbGJhciwgImhpZGRlbiIpOwogICAgfQoKICAgIHczY19zbGlkeS5zY3JvbGxoYWNrID0gMDsKCgogICAgLy8gc2V0IHRoZSBrZXlib2FyZCBmb2N1cyB0byB0aGUgaGVscCBsaW5rIG9uIHRoZQogICAgLy8gdG9vbGJhciB0byBlbnN1cmUgdGhhdCBkb2N1bWVudCBoYXMgdGhlIGZvY3VzCiAgICAvLyBJRSBkb2Vzbid0IGFsd2F5cyB3b3JrIHdpdGggd2luZG93LmZvY3VzKCkKICAgIC8vIGFuZCB0aGlzIGhhY2sgaGFzIGJlbmVmaXQgb2YgRW50ZXIgZm9yIGhlbHAKCiAgICB0cnkKICAgIHsKICAgICAgaWYgKCF3M2Nfc2xpZHkub3BlcmEpCiAgICAgICAgdzNjX3NsaWR5LnNldF9mb2N1cygpOwogICAgfQogICAgY2F0Y2ggKGUpCiAgICB7CiAgICB9CiAgfSwKCi8vIGludm9rZWQgdmlhIEYga2V5CiAgdG9nZ2xlX3Rvb2xiYXI6IGZ1bmN0aW9uICgpIHsKICAgIGlmICghdzNjX3NsaWR5LnZpZXdfYWxsKQogICAgewogICAgICBpZiAodzNjX3NsaWR5Lmhhc19jbGFzcyh3M2Nfc2xpZHkudG9vbGJhciwgImhpZGRlbiIpKQogICAgICB7CiAgICAgICAgdzNjX3NsaWR5LnJlbW92ZV9jbGFzcyh3M2Nfc2xpZHkudG9vbGJhciwgImhpZGRlbiIpCiAgICAgICAgdzNjX3NsaWR5LndhbnRfdG9vbGJhciA9IDE7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgdzNjX3NsaWR5LmFkZF9jbGFzcyh3M2Nfc2xpZHkudG9vbGJhciwgImhpZGRlbiIpCiAgICAgICAgdzNjX3NsaWR5LndhbnRfdG9vbGJhciA9IDA7CiAgICAgIH0KICAgIH0KICB9LAoKICBzY3JvbGxfeF9vZmZzZXQ6IGZ1bmN0aW9uICgpIHsKICAgIGlmICh3aW5kb3cucGFnZVhPZmZzZXQpCiAgICAgIHJldHVybiBzZWxmLnBhZ2VYT2Zmc2V0OwoKICAgIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgCiAgICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCkKICAgICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0OwoKICAgIGlmIChkb2N1bWVudC5ib2R5KQogICAgICByZXR1cm4gZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0OwoKICAgIHJldHVybiAwOwogIH0sCgogIHNjcm9sbF95X29mZnNldDogZnVuY3Rpb24gKCkgewogICAgaWYgKHdpbmRvdy5wYWdlWU9mZnNldCkKICAgICAgcmV0dXJuIHNlbGYucGFnZVlPZmZzZXQ7CgogICAgaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiAKICAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3ApCiAgICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wOwoKICAgIGlmIChkb2N1bWVudC5ib2R5KQogICAgICByZXR1cm4gZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7CgogICAgcmV0dXJuIDA7CiAgfSwKCiAgLy8gbG9va2luZyBmb3IgYSB3YXkgdG8gZGV0ZXJtaW5lIGhlaWdodCBvZiBzbGlkZSBjb250ZW50CiAgLy8gdGhlIHNsaWRlIGl0c2VsZiBpcyBzZXQgdG8gdGhlIGhlaWdodCBvZiB0aGUgd2luZG93CiAgb3B0aW1pemVfZm9udF9zaXplOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwoKICAgIC8vdmFyIGRoID0gZG9jdW1lbnRIZWlnaHQoKTsgLy9nZXREb2NIZWlnaHQoZG9jdW1lbnQpOwogICAgdmFyIGRoID0gc2xpZGUuc2Nyb2xsSGVpZ2h0OwogICAgdmFyIHdoID0gZ2V0V2luZG93SGVpZ2h0KCk7CiAgICB2YXIgdSA9IDEwMCAqIGRoIC8gd2g7CgogICAgYWxlcnQoIndpbmRvdyB1dGlsaXphdGlvbiA9ICIgKyB1ICsgIiUgKGRvYyAiCiAgICAgICsgZGggKyAiIHdpbiAiICsgd2ggKyAiKSIpOwogIH0sCgogIC8vIGZyb20gZG9jdW1lbnQgb2JqZWN0CiAgZ2V0X2RvY19oZWlnaHQ6IGZ1bmN0aW9uIChkb2MpIHsKICAgIGlmICghZG9jKQogICAgICBkb2MgPSBkb2N1bWVudDsKCiAgICBpZiAoZG9jICYmIGRvYy5ib2R5ICYmIGRvYy5ib2R5Lm9mZnNldEhlaWdodCkKICAgICAgcmV0dXJuIGRvYy5ib2R5Lm9mZnNldEhlaWdodDsgIC8vIG5zL2dlY2tvIHN5bnRheAoKICAgIGlmIChkb2MgJiYgZG9jLmJvZHkgJiYgZG9jLmJvZHkuc2Nyb2xsSGVpZ2h0KQogICAgICByZXR1cm4gZG9jLmJvZHkuc2Nyb2xsSGVpZ2h0OwoKICAgIGFsZXJ0KCJjb3VsZG4ndCBkZXRlcm1pbmUgZG9jdW1lbnQgaGVpZ2h0Iik7CiAgfSwKCiAgZ2V0X3dpbmRvd19oZWlnaHQ6IGZ1bmN0aW9uICgpIHsKICAgIGlmICggdHlwZW9mKCB3aW5kb3cuaW5uZXJIZWlnaHQgKSA9PSAnbnVtYmVyJyApCiAgICAgIHJldHVybiB3aW5kb3cuaW5uZXJIZWlnaHQ7ICAvLyBOb24gSUUgYnJvd3NlcgoKICAgIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkKICAgICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7ICAvLyBJRTYKCiAgICBpZiAoZG9jdW1lbnQuYm9keSAmJiBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCkKICAgICAgcmV0dXJuIGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0OyAvLyBJRTQKICB9LAoKICBkb2N1bWVudF9oZWlnaHQ6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzaCwgb2g7CgogICAgc2ggPSBkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodDsKICAgIG9oID0gZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQ7CgogICAgaWYgKHNoICYmIG9oKQogICAgewogICAgICByZXR1cm4gKHNoID4gb2ggPyBzaCA6IG9oKTsKICAgIH0KCiAgICAvLyBubyBpZGVhIQogICAgcmV0dXJuIDA7CiAgfSwKCiAgc21hbGxlcjogZnVuY3Rpb24gKCkgewogICAgaWYgKHczY19zbGlkeS5zaXplX2luZGV4ID4gMCkKICAgIHsKICAgICAgLS13M2Nfc2xpZHkuc2l6ZV9pbmRleDsKICAgIH0KCiAgICB3M2Nfc2xpZHkudG9vbGJhci5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgZG9jdW1lbnQuYm9keS5zdHlsZS5mb250U2l6ZSA9IHczY19zbGlkeS5zaXplc1t3M2Nfc2xpZHkuc2l6ZV9pbmRleF07CiAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgdzNjX3NsaWR5LmhpZGVfc2xpZGUoc2xpZGUpOwogICAgdzNjX3NsaWR5LnNob3dfc2xpZGUoc2xpZGUpOwogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7dzNjX3NsaWR5LnNob3dfdG9vbGJhcigpOyB9LCA1MCk7CiAgfSwKCiAgYmlnZ2VyOiBmdW5jdGlvbiAoKSB7CiAgICBpZiAodzNjX3NsaWR5LnNpemVfaW5kZXggPCB3M2Nfc2xpZHkuc2l6ZXMubGVuZ3RoIC0gMSkKICAgIHsKICAgICAgKyt3M2Nfc2xpZHkuc2l6ZV9pbmRleDsKICAgIH0KCiAgICB3M2Nfc2xpZHkudG9vbGJhci5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgZG9jdW1lbnQuYm9keS5zdHlsZS5mb250U2l6ZSA9IHczY19zbGlkeS5zaXplc1t3M2Nfc2xpZHkuc2l6ZV9pbmRleF07CiAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgdzNjX3NsaWR5LmhpZGVfc2xpZGUoc2xpZGUpOwogICAgdzNjX3NsaWR5LnNob3dfc2xpZGUoc2xpZGUpOwogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7dzNjX3NsaWR5LnNob3dfdG9vbGJhcigpOyB9LCA1MCk7CiAgfSwKCiAgLy8gZW5hYmxlcyBjcm9zcyBicm93c2VyIHVzZSBvZiByZWxhdGl2ZSB3aWR0aC9oZWlnaHQKICAvLyBvbiBvYmplY3QgZWxlbWVudHMgZm9yIHVzZSB3aXRoIFNWRyBhbmQgRmxhc2ggbWVkaWEKICAvLyB3aXRoIHRoYW5rcyB0byBJdmFuIEhlcm1hbiBmb3IgdGhlIHN1Z2dlc3Rpb24KICBhZGp1c3Rfb2JqZWN0X2RpbWVuc2lvbnM6IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KSB7CiAgICBmb3IoIHZhciBpID0gMDsgaSA8IHczY19zbGlkeS5vYmplY3RzLmxlbmd0aDsgaSsrICkKICAgIHsKICAgICAgdmFyIG9iaiA9IHRoaXMub2JqZWN0c1tpXTsKICAgICAgdmFyIG1pbWVUeXBlID0gb2JqLmdldEF0dHJpYnV0ZSgidHlwZSIpOwoKICAgICAgaWYgKG1pbWVUeXBlID09ICJpbWFnZS9zdmcreG1sIiB8fCBtaW1lVHlwZSA9PSAiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKQogICAgICB7CiAgICAgICAgaWYgKCAhb2JqLmluaXRpYWxXaWR0aCApIAogICAgICAgICAgb2JqLmluaXRpYWxXaWR0aCA9IG9iai5nZXRBdHRyaWJ1dGUoIndpZHRoIik7CgogICAgICAgIGlmICggIW9iai5pbml0aWFsSGVpZ2h0ICkgCiAgICAgICAgICBvYmouaW5pdGlhbEhlaWdodCA9IG9iai5nZXRBdHRyaWJ1dGUoImhlaWdodCIpOwoKICAgICAgICBpZiAoIG9iai5pbml0aWFsV2lkdGggJiYgb2JqLmluaXRpYWxXaWR0aC5jaGFyQXQob2JqLmluaXRpYWxXaWR0aC5sZW5ndGgtMSkgPT0gIiUiICkKICAgICAgICB7CiAgICAgICAgICB2YXIgdyA9IHBhcnNlSW50KG9iai5pbml0aWFsV2lkdGguc2xpY2UoMCwgb2JqLmluaXRpYWxXaWR0aC5sZW5ndGgtMSkpOwogICAgICAgICAgdmFyIG5ld1cgPSB3aWR0aCAqICh3LzEwMC4wKTsKICAgICAgICAgIG9iai5zZXRBdHRyaWJ1dGUoIndpZHRoIixuZXdXKTsKICAgICAgICB9CgogICAgICAgIGlmICggb2JqLmluaXRpYWxIZWlnaHQgJiYKICAgICAgICAgICAgIG9iai5pbml0aWFsSGVpZ2h0LmNoYXJBdChvYmouaW5pdGlhbEhlaWdodC5sZW5ndGgtMSkgPT0gIiUiICkKICAgICAgICB7CiAgICAgICAgICB2YXIgaCA9IHBhcnNlSW50KG9iai5pbml0aWFsSGVpZ2h0LnNsaWNlKDAsIG9iai5pbml0aWFsSGVpZ2h0Lmxlbmd0aC0xKSk7CiAgICAgICAgICB2YXIgbmV3SCA9IGhlaWdodCAqIChoLzEwMC4wKTsKICAgICAgICAgIG9iai5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIG5ld0gpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0sCgogIC8vIG5lZWRlZCBmb3IgT3BlcmEgdG8gaW5oaWJpdCBkZWZhdWx0IGJlaGF2aW9yCiAgLy8gc2luY2UgT3BlcmEgZGVsaXZlcnMga2V5UHJlc3MgZXZlbiBpZiBrZXlEb3duCiAgLy8gd2FzIGNhbmNlbGxlZAogIGtleV9wcmVzczogZnVuY3Rpb24gKGV2ZW50KSB7CiAgICBpZiAoIWV2ZW50KQogICAgICBldmVudCA9IHdpbmRvdy5ldmVudDsKCiAgICBpZiAoIXczY19zbGlkeS5rZXlfd2FudGVkKQogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CgogICAgcmV0dXJuIHRydWU7CiAgfSwKCiAgLy8gIFNlZSBlLmcuIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvanMvZXZlbnRzL2tleXMuaHRtbCBmb3Iga2V5Y29kZXMKICBrZXlfZG93bjogZnVuY3Rpb24gKGV2ZW50KSB7CiAgICB2YXIga2V5LCB0YXJnZXQsIHRhZzsKCiAgICB3M2Nfc2xpZHkua2V5X3dhbnRlZCA9IHRydWU7CgogICAgaWYgKCFldmVudCkKICAgICAgZXZlbnQgPSB3aW5kb3cuZXZlbnQ7CgogICAgLy8ga2x1ZGdlIGFyb3VuZCBOUy9JRSBkaWZmZXJlbmNlcyAKICAgIGlmICh3aW5kb3cuZXZlbnQpCiAgICB7CiAgICAgIGtleSA9IHdpbmRvdy5ldmVudC5rZXlDb2RlOwogICAgICB0YXJnZXQgPSB3aW5kb3cuZXZlbnQuc3JjRWxlbWVudDsKICAgIH0KICAgIGVsc2UgaWYgKGV2ZW50LndoaWNoKQogICAgewogICAgICBrZXkgPSBldmVudC53aGljaDsKICAgICAgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0OwogICAgfQogICAgZWxzZQogICAgICByZXR1cm4gdHJ1ZTsgLy8gWWlrZXMhIHVua25vd24gYnJvd3NlcgoKICAgIC8vIGlnbm9yZSBldmVudCBpZiBrZXkgdmFsdWUgaXMgemVybwogICAgLy8gYXMgZm9yIGFsdCBvbiBPcGVyYSBhbmQgS29ucXVlcm9yCiAgICBpZiAoIWtleSkKICAgICAgIHJldHVybiB0cnVlOwoKICAgIC8vIGF2b2lkIGludGVyZmVyaW5nIHdpdGgga2V5c3Ryb2tlCiAgICAvLyBiZWhhdmlvciBmb3Igbm9uLXNsaWR5IGNocm9tZSBlbGVtZW50cwogICAgaWYgKCF3M2Nfc2xpZHkuc2xpZHlfY2hyb21lKHRhcmdldCkgJiYKICAgICAgICB3M2Nfc2xpZHkuc3BlY2lhbF9lbGVtZW50KHRhcmdldCkpCiAgICAgIHJldHVybiB0cnVlOwoKICAgIC8vIGNoZWNrIGZvciBjb25jdXJyZW50IGNvbnRyb2wvY29tbWFuZC9hbHQga2V5CiAgICAvLyBidXQgYXJlIHRoZXNlIG9ubHkgcHJlc2VudCBvbiBtb3VzZSBldmVudHM/CgogICAgaWYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQuYWx0S2V5IHx8IGV2ZW50Lm1ldGFLZXkpCiAgICAgICByZXR1cm4gdHJ1ZTsKCiAgICAvLyBkaXNtaXNzIHRhYmxlIG9mIGNvbnRlbnRzIGlmIHZpc2libGUKICAgIGlmICh3M2Nfc2xpZHkuaXNfc2hvd25fdG9jKCkgJiYga2V5ICE9IDkgJiYga2V5ICE9IDE2ICYmIGtleSAhPSAzOCAmJiBrZXkgIT0gNDApCiAgICB7CiAgICAgIHczY19zbGlkeS5oaWRlX3RhYmxlX29mX2NvbnRlbnRzKHRydWUpOwoKICAgICAgaWYgKGtleSA9PSAyNyB8fCBrZXkgPT0gODQgfHwga2V5ID09IDY3KQogICAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KCiAgICBpZiAoa2V5ID09IDM0KSAvLyBQYWdlIERvd24KICAgIHsKICAgICAgaWYgKHczY19zbGlkeS52aWV3X2FsbCkKICAgICAgICByZXR1cm4gdHJ1ZTsKCiAgICAgIHczY19zbGlkeS5uZXh0X3NsaWRlKGZhbHNlKTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDMzKSAvLyBQYWdlIFVwCiAgICB7CiAgICAgIGlmICh3M2Nfc2xpZHkudmlld19hbGwpCiAgICAgICAgcmV0dXJuIHRydWU7CgogICAgICB3M2Nfc2xpZHkucHJldmlvdXNfc2xpZGUoZmFsc2UpOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CiAgICBlbHNlIGlmIChrZXkgPT0gMzIpIC8vIHNwYWNlIGJhcgogICAgewogICAgICB3M2Nfc2xpZHkubmV4dF9zbGlkZSh0cnVlKTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDM3KSAvLyBMZWZ0IGFycm93CiAgICB7CiAgICAgIHczY19zbGlkeS5wcmV2aW91c19zbGlkZSghZXZlbnQuc2hpZnRLZXkpOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CiAgICBlbHNlIGlmIChrZXkgPT0gMzYpIC8vIEhvbWUKICAgIHsKICAgICAgdzNjX3NsaWR5LmZpcnN0X3NsaWRlKCk7CiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KICAgIGVsc2UgaWYgKGtleSA9PSAzNSkgLy8gRW5kCiAgICB7CiAgICAgIHczY19zbGlkeS5sYXN0X3NsaWRlKCk7CiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KICAgIGVsc2UgaWYgKGtleSA9PSAzOSkgLy8gUmlnaHQgYXJyb3cKICAgIHsKICAgICAgdzNjX3NsaWR5Lm5leHRfc2xpZGUoIWV2ZW50LnNoaWZ0S2V5KTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDEzKSAvLyBFbnRlcgogICAgewogICAgICBpZiAodzNjX3NsaWR5Lm91dGxpbmUpCiAgICAgIHsKICAgICAgICBpZiAodzNjX3NsaWR5Lm91dGxpbmUudmlzaWJsZSkKICAgICAgICAgIHczY19zbGlkeS5mb2xkKHczY19zbGlkeS5vdXRsaW5lKTsKICAgICAgICBlbHNlCiAgICAgICAgICB3M2Nfc2xpZHkudW5mb2xkKHczY19zbGlkeS5vdXRsaW5lKTsKICAgICAgICAgIAogICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgICB9CiAgICB9CiAgICBlbHNlIGlmIChrZXkgPT0gMTg4KSAgLy8gPCBmb3Igc21hbGxlciBmb250cwogICAgewogICAgICB3M2Nfc2xpZHkuc21hbGxlcigpOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CiAgICBlbHNlIGlmIChrZXkgPT0gMTkwKSAgLy8gPiBmb3IgbGFyZ2VyIGZvbnRzCiAgICB7CiAgICAgIHczY19zbGlkeS5iaWdnZXIoKTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDE4OSB8fCBrZXkgPT0gMTA5KSAgLy8gLSBmb3Igc21hbGxlciBmb250cwogICAgewogICAgICB3M2Nfc2xpZHkuc21hbGxlcigpOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CiAgICBlbHNlIGlmIChrZXkgPT0gMTg3IHx8IGtleSA9PSAxOTEgfHwga2V5ID09IDEwNykgIC8vID0gKyAgZm9yIGxhcmdlciBmb250cwogICAgewogICAgICB3M2Nfc2xpZHkuYmlnZ2VyKCk7CiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KICAgIGVsc2UgaWYgKGtleSA9PSA4MykgIC8vIFMgZm9yIHNtYWxsZXIgZm9udHMKICAgIHsKICAgICAgdzNjX3NsaWR5LnNtYWxsZXIoKTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDY2KSAgLy8gQiBmb3IgbGFyZ2VyIGZvbnRzCiAgICB7CiAgICAgIHczY19zbGlkeS5iaWdnZXIoKTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDkwKSAgLy8gWiBmb3IgbGFzdCBzbGlkZQogICAgewogICAgICB3M2Nfc2xpZHkubGFzdF9zbGlkZSgpOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CiAgICBlbHNlIGlmIChrZXkgPT0gNzApICAvLyBGIGZvciB0b2dnbGUgdG9vbGJhcgogICAgewogICAgICB3M2Nfc2xpZHkudG9nZ2xlX3Rvb2xiYXIoKTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDY1KSAgLy8gQSBmb3IgdG9nZ2xlIHZpZXcgc2luZ2xlL2FsbCBzbGlkZXMKICAgIHsKICAgICAgdzNjX3NsaWR5LnRvZ2dsZV92aWV3KCk7CiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KICAgIGVsc2UgaWYgKGtleSA9PSA3NSkgIC8vIHRvZ2dsZSBhY3Rpb24gb2YgbGVmdCBjbGljayBmb3IgbmV4dCBwYWdlCiAgICB7CiAgICAgIHczY19zbGlkeS5tb3VzZV9jbGlja19lbmFibGVkID0gIXczY19zbGlkeS5tb3VzZV9jbGlja19lbmFibGVkOwogICAgICB2YXIgYWxlcnRfbXNnID0gKHczY19zbGlkeS5tb3VzZV9jbGlja19lbmFibGVkID8KICAgICAgICAgICAgICAgICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpICsgICIgbW91c2UgY2xpY2sgYWR2YW5jZSI7CgogICAgICBhbGVydCh3M2Nfc2xpZHkubG9jYWxpemUoYWxlcnRfbXNnKSk7CiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KICAgIGVsc2UgaWYgKGtleSA9PSA4NCB8fCBrZXkgPT0gNjcpICAvLyBUIG9yIEMgZm9yIHRhYmxlIG9mIGNvbnRlbnRzCiAgICB7CiAgICAgIGlmICh3M2Nfc2xpZHkudG9jKQogICAgICAgIHczY19zbGlkeS50b2dnbGVfdGFibGVfb2ZfY29udGVudHMoKTsKCiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KICAgIGVsc2UgaWYgKGtleSA9PSA3MikgLy8gSCBmb3IgaGVscAogICAgewogICAgICB3aW5kb3cubG9jYXRpb24gPSB3M2Nfc2xpZHkuaGVscF9wYWdlOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CiAgICAvL2Vsc2UgYWxlcnQoImtleSBjb2RlIGlzICIrIGtleSk7CgogICAgcmV0dXJuIHRydWU7CiAgfSwKCiAgLy8gc2FmZSBmb3IgYm90aCB0ZXh0L2h0bWwgYW5kIGFwcGxpY2F0aW9uL3hodG1sK3htbAogIGNyZWF0ZV9lbGVtZW50OiBmdW5jdGlvbiAobmFtZSkgewogICAgaWYgKHRoaXMueGh0bWwgJiYgKHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMgIT0gJ3VuZGVmaW5lZCcpKQogICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwgbmFtZSkKCiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKTsKICB9LAoKICBnZXRfZWxlbWVudF9zdHlsZTogZnVuY3Rpb24gKGVsZW0sIElFU3R5bGVQcm9wLCBDU1NTdHlsZVByb3ApIHsKICAgIGlmIChlbGVtLmN1cnJlbnRTdHlsZSkKICAgIHsKICAgICAgcmV0dXJuIGVsZW0uY3VycmVudFN0eWxlW0lFU3R5bGVQcm9wXTsKICAgIH0KICAgIGVsc2UgaWYgKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKQogICAgewogICAgICB2YXIgY29tcFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbSwgIiIpOwogICAgICByZXR1cm4gY29tcFN0eWxlLmdldFByb3BlcnR5VmFsdWUoQ1NTU3R5bGVQcm9wKTsKICAgIH0KICAgIHJldHVybiAiIjsKICB9LAoKICAvLyB0aGUgc3RyaW5nIHN0ciBpcyBhIHdoaXRlc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgdG9rZW5zCiAgLy8gdGVzdCBpZiBzdHIgY29udGFpbnMgYSBwYXJ0aWN1bGFyIHRva2VuLCBlLmcuICJzbGlkZSIKICBoYXNfdG9rZW46IGZ1bmN0aW9uIChzdHIsIHRva2VuKSB7CiAgICBpZiAoc3RyKQogICAgewogICAgICAvLyBkZWZpbmUgcGF0dGVybiBhcyByZWd1bGFyIGV4cHJlc3Npb24KICAgICAgdmFyIHBhdHRlcm4gPSAvXHcrL2c7CgogICAgICAvLyBjaGVjayBmb3IgbWF0Y2hlcwogICAgICAvLyBwbGFjZSByZXN1bHQgaW4gYXJyYXkKICAgICAgdmFyIHJlc3VsdCA9IHN0ci5tYXRjaChwYXR0ZXJuKTsKCiAgICAgIC8vIG5vdyBjaGVjayBpZiBkZXNpcmVkIHRva2VuIGlzIHByZXNlbnQKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspCiAgICAgIHsKICAgICAgICBpZiAocmVzdWx0W2ldID09IHRva2VuKQogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZmFsc2U7CiAgfSwKCiAgZ2V0X2NsYXNzX2xpc3Q6IGZ1bmN0aW9uIChlbGVtZW50KSB7CiAgICBpZiAodHlwZW9mIGVsZW1lbnQuY2xhc3NOYW1lICE9ICd1bmRlZmluZWQnKQogICAgICByZXR1cm4gZWxlbWVudC5jbGFzc05hbWU7CgogICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOwogIH0sCgogIGhhc19jbGFzczogZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWUpIHsKICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlICE9IDEpCiAgICAgIHJldHVybiBmYWxzZTsKCiAgICB2YXIgcmVnZXhwID0gbmV3IFJlZ0V4cCgiKF58ICkiICsgbmFtZSArICJcVyoiKTsKCiAgICBpZiAodHlwZW9mIGVsZW1lbnQuY2xhc3NOYW1lICE9ICd1bmRlZmluZWQnKQogICAgICByZXR1cm4gcmVnZXhwLnRlc3QoZWxlbWVudC5jbGFzc05hbWUpOwoKICAgIHJldHVybiByZWdleHAudGVzdChlbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKSk7CiAgfSwKCiAgcmVtb3ZlX2NsYXNzOiBmdW5jdGlvbiAoZWxlbWVudCwgbmFtZSkgewogICAgdmFyIHJlZ2V4cCA9IG5ldyBSZWdFeHAoIihefCApIiArIG5hbWUgKyAiXFcqIik7CiAgICB2YXIgY2xzdmFsID0gIiI7CgogICAgaWYgKHR5cGVvZiBlbGVtZW50LmNsYXNzTmFtZSAhPSAndW5kZWZpbmVkJykKICAgIHsKICAgICAgY2xzdmFsID0gZWxlbWVudC5jbGFzc05hbWU7CgogICAgICBpZiAoY2xzdmFsKQogICAgICB7CiAgICAgICAgY2xzdmFsID0gY2xzdmFsLnJlcGxhY2UocmVnZXhwLCAiIik7CiAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgPSBjbHN2YWw7CiAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgY2xzdmFsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7CgogICAgICBpZiAoY2xzdmFsKQogICAgICB7CiAgICAgICAgY2xzdmFsID0gY2xzdmFsLnJlcGxhY2UocmVnZXhwLCAiIik7CiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoImNsYXNzIiwgY2xzdmFsKTsKICAgICAgfQogICAgfQogIH0sCgogIGFkZF9jbGFzczogZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWUpIHsKICAgIGlmICghdGhpcy5oYXNfY2xhc3MoZWxlbWVudCwgbmFtZSkpCiAgICB7CiAgICAgIGlmICh0eXBlb2YgZWxlbWVudC5jbGFzc05hbWUgIT0gJ3VuZGVmaW5lZCcpCiAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgKz0gIiAiICsgbmFtZTsKICAgICAgZWxzZQogICAgICB7CiAgICAgICAgdmFyIGNsc3ZhbCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOwogICAgICAgIGNsc3ZhbCA9IGNsc3ZhbCA/IGNsc3ZhbCArICIgIiArIG5hbWUgOiBuYW1lOwogICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJjbGFzcyIsIGNsc3ZhbCk7CiAgICAgIH0KICAgIH0KICB9LAoKICAvLyBIVE1MIGVsZW1lbnRzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBjbGFzcz0iaW5jcmVtZW50YWwiCiAgLy8gbm90ZSB0aGF0IHlvdSBjYW4gYWxzbyBwdXQgdGhlIGNsYXNzIG9uIGNvbnRhaW5lcnMgbGlrZQogIC8vIHVwLCBvbCwgZGwsIGFuZCBkaXYgdG8gbWFrZSB0aGVpciBjb250ZW50cyBhcHBlYXIKICAvLyBpbmNyZW1lbnRhbGx5LiBVcHBlciBjYXNlIGlzIHVzZWQgc2luY2UgdGhpcyBpcyB3aGF0CiAgLy8gYnJvd3NlcnMgcmVwb3J0IGZvciBIVE1MIG5vZGUgbmFtZXMgKHRleHQvaHRtbCkuCiAgaW5jcmVtZW50YWxfZWxlbWVudHM6IG51bGwsCiAgb2theV9mb3JfaW5jcmVtZW50YWw6IGZ1bmN0aW9uIChuYW1lKSB7CiAgICBpZiAoIXRoaXMuaW5jcmVtZW50YWxfZWxlbWVudHMpCiAgICB7CiAgICAgIHZhciBpbmNsaXN0ID0gbmV3IEFycmF5KCk7CiAgICAgIGluY2xpc3RbInAiXSA9IHRydWU7CiAgICAgIGluY2xpc3RbInByZSJdID0gdHJ1ZTsKICAgICAgaW5jbGlzdFsibGkiXSA9IHRydWU7CiAgICAgIGluY2xpc3RbImJsb2NrcXVvdGUiXSA9IHRydWU7CiAgICAgIGluY2xpc3RbImR0Il0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJkZCJdID0gdHJ1ZTsKICAgICAgaW5jbGlzdFsiaDIiXSA9IHRydWU7CiAgICAgIGluY2xpc3RbImgzIl0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJoNCJdID0gdHJ1ZTsKICAgICAgaW5jbGlzdFsiaDUiXSA9IHRydWU7CiAgICAgIGluY2xpc3RbImg2Il0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJzcGFuIl0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJhZGRyZXNzIl0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJ0YWJsZSJdID0gdHJ1ZTsKICAgICAgaW5jbGlzdFsidHIiXSA9IHRydWU7CiAgICAgIGluY2xpc3RbInRoIl0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJ0ZCJdID0gdHJ1ZTsKICAgICAgaW5jbGlzdFsiaW1nIl0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJvYmplY3QiXSA9IHRydWU7CiAgICAgIHRoaXMuaW5jcmVtZW50YWxfZWxlbWVudHMgPSBpbmNsaXN0OwogICAgfQogICAgcmV0dXJuIHRoaXMuaW5jcmVtZW50YWxfZWxlbWVudHNbbmFtZS50b0xvd2VyQ2FzZSgpXTsKICB9LAoKICBuZXh0X2luY3JlbWVudGFsX2l0ZW06IGZ1bmN0aW9uIChub2RlKSB7CiAgICB2YXIgYnIgPSB0aGlzLmlzX3hodG1sID8gImJyIiA6ICJCUiI7CiAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwoKICAgIGZvciAoOzspCiAgICB7CiAgICAgIG5vZGUgPSB3M2Nfc2xpZHkubmV4dF9ub2RlKHNsaWRlLCBub2RlKTsKCiAgICAgIGlmIChub2RlID09IG51bGwgfHwgbm9kZS5wYXJlbnROb2RlID09IG51bGwpCiAgICAgICAgYnJlYWs7CgogICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxKSAgLy8gRUxFTUVOVAogICAgICB7CiAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT0gYnIpCiAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgaWYgKHczY19zbGlkeS5oYXNfY2xhc3Mobm9kZSwgImluY3JlbWVudGFsIikKICAgICAgICAgICAgICYmIHczY19zbGlkeS5va2F5X2Zvcl9pbmNyZW1lbnRhbChub2RlLm5vZGVOYW1lKSkKICAgICAgICAgIHJldHVybiBub2RlOwoKICAgICAgICBpZiAodzNjX3NsaWR5Lmhhc19jbGFzcyhub2RlLnBhcmVudE5vZGUsICJpbmNyZW1lbnRhbCIpCiAgICAgICAgICAgICAmJiAhdzNjX3NsaWR5Lmhhc19jbGFzcyhub2RlLCAibm9uLWluY3JlbWVudGFsIikpCiAgICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBub2RlOwogIH0sCgogIHByZXZpb3VzX2luY3JlbWVudGFsX2l0ZW06IGZ1bmN0aW9uIChub2RlKSB7CiAgICB2YXIgYnIgPSB0aGlzLmlzX3hodG1sID8gImJyIiA6ICJCUiI7CiAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwoKICAgIGZvciAoOzspCiAgICB7CiAgICAgIG5vZGUgPSB3M2Nfc2xpZHkucHJldmlvdXNfbm9kZShzbGlkZSwgbm9kZSk7CgogICAgICBpZiAobm9kZSA9PSBudWxsIHx8IG5vZGUucGFyZW50Tm9kZSA9PSBudWxsKQogICAgICAgIGJyZWFrOwoKICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSkKICAgICAgewogICAgICAgIGlmIChub2RlLm5vZGVOYW1lID09IGJyKQogICAgICAgICAgY29udGludWU7CgogICAgICAgIGlmICh3M2Nfc2xpZHkuaGFzX2NsYXNzKG5vZGUsICJpbmNyZW1lbnRhbCIpCiAgICAgICAgICAgICAmJiB3M2Nfc2xpZHkub2theV9mb3JfaW5jcmVtZW50YWwobm9kZS5ub2RlTmFtZSkpCiAgICAgICAgICByZXR1cm4gbm9kZTsKCiAgICAgICAgaWYgKHczY19zbGlkeS5oYXNfY2xhc3Mobm9kZS5wYXJlbnROb2RlLCAiaW5jcmVtZW50YWwiKQogICAgICAgICAgICAgJiYgIXczY19zbGlkeS5oYXNfY2xhc3Mobm9kZSwgIm5vbi1pbmNyZW1lbnRhbCIpKQogICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbm9kZTsKICB9LAoKICAvLyBzZXQgdmlzaWJpbGl0eSBmb3IgYWxsIGVsZW1lbnRzIG9uIGN1cnJlbnQgc2xpZGUgd2l0aAogIC8vIGEgcGFyZW50IGVsZW1lbnQgd2l0aCBhdHRyaWJ1dGUgY2xhc3M9ImluY3JlbWVudGFsIgogIHNldF92aXNpYmlsaXR5X2FsbF9pbmNyZW1lbnRhbDogZnVuY3Rpb24gKHZhbHVlKSB7CiAgICB2YXIgbm9kZSA9IHRoaXMubmV4dF9pbmNyZW1lbnRhbF9pdGVtKG51bGwpOwoKICAgIGlmICh2YWx1ZSA9PSAiaGlkZGVuIikKICAgIHsKICAgICAgd2hpbGUgKG5vZGUpCiAgICAgIHsKICAgICAgICB3M2Nfc2xpZHkuYWRkX2NsYXNzKG5vZGUsICJpbnZpc2libGUiKTsKICAgICAgICBub2RlID0gdzNjX3NsaWR5Lm5leHRfaW5jcmVtZW50YWxfaXRlbShub2RlKTsKICAgICAgfQogICAgfQogICAgZWxzZSAvLyB2YWx1ZSA9PSAidmlzaWJsZSIKICAgIHsKICAgICAgd2hpbGUgKG5vZGUpCiAgICAgIHsKICAgICAgICB3M2Nfc2xpZHkucmVtb3ZlX2NsYXNzKG5vZGUsICJpbnZpc2libGUiKTsKICAgICAgICBub2RlID0gdzNjX3NsaWR5Lm5leHRfaW5jcmVtZW50YWxfaXRlbShub2RlKTsKICAgICAgfQogICAgfQogIH0sCgogIC8vIHJldmVhbCB0aGUgbmV4dCBoaWRkZW4gaXRlbSBvbiB0aGUgc2xpZGUKICAvLyBub2RlIGlzIG51bGwgb3IgdGhlIG5vZGUgdGhhdCB3YXMgbGFzdCByZXZlYWxlZAogIHJldmVhbF9uZXh0X2l0ZW06IGZ1bmN0aW9uIChub2RlKSB7CiAgICBub2RlID0gdzNjX3NsaWR5Lm5leHRfaW5jcmVtZW50YWxfaXRlbShub2RlKTsKCiAgICBpZiAobm9kZSAmJiBub2RlLm5vZGVUeXBlID09IDEpICAvLyBhbiBlbGVtZW50CiAgICAgIHczY19zbGlkeS5yZW1vdmVfY2xhc3Mobm9kZSwgImludmlzaWJsZSIpOwoKICAgIHJldHVybiBub2RlOwogIH0sCgogIC8vIGV4YWN0IGludmVyc2Ugb2YgcmV2ZWFsTmV4dEl0ZW0obm9kZSkKICBoaWRlX3ByZXZpb3VzX2l0ZW06IGZ1bmN0aW9uIChub2RlKSB7CiAgICBpZiAobm9kZSAmJiBub2RlLm5vZGVUeXBlID09IDEpICAvLyBhbiBlbGVtZW50CiAgICAgIHczY19zbGlkeS5hZGRfY2xhc3Mobm9kZSwgImludmlzaWJsZSIpOwoKICAgIHJldHVybiB0aGlzLnByZXZpb3VzX2luY3JlbWVudGFsX2l0ZW0obm9kZSk7CiAgfSwKCiAgLy8gbGVmdCB0byByaWdodCB0cmF2ZXJzYWwgb2Ygcm9vdCdzIGNvbnRlbnQKICBuZXh0X25vZGU6IGZ1bmN0aW9uIChyb290LCBub2RlKSB7CiAgICBpZiAobm9kZSA9PSBudWxsKQogICAgICByZXR1cm4gcm9vdC5maXJzdENoaWxkOwoKICAgIGlmIChub2RlLmZpcnN0Q2hpbGQpCiAgICAgIHJldHVybiBub2RlLmZpcnN0Q2hpbGQ7CgogICAgaWYgKG5vZGUubmV4dFNpYmxpbmcpCiAgICAgIHJldHVybiBub2RlLm5leHRTaWJsaW5nOwoKICAgIGZvciAoOzspCiAgICB7CiAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7CgogICAgICBpZiAoIW5vZGUgfHwgbm9kZSA9PSByb290KQogICAgICAgIGJyZWFrOwoKICAgICAgaWYgKG5vZGUgJiYgbm9kZS5uZXh0U2libGluZykKICAgICAgICByZXR1cm4gbm9kZS5uZXh0U2libGluZzsKICAgIH0KCiAgICByZXR1cm4gbnVsbDsKICB9LAoKICAvLyByaWdodCB0byBsZWZ0IHRyYXZlcnNhbCBvZiByb290J3MgY29udGVudAogIHByZXZpb3VzX25vZGU6IGZ1bmN0aW9uIChyb290LCBub2RlKSB7CiAgICBpZiAobm9kZSA9PSBudWxsKQogICAgewogICAgICBub2RlID0gcm9vdC5sYXN0Q2hpbGQ7CgogICAgICBpZiAobm9kZSkKICAgICAgewogICAgICAgIHdoaWxlIChub2RlLmxhc3RDaGlsZCkKICAgICAgICAgIG5vZGUgPSBub2RlLmxhc3RDaGlsZDsKICAgICAgfQoKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CgogICAgaWYgKG5vZGUucHJldmlvdXNTaWJsaW5nKQogICAgewogICAgICBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmc7CgogICAgICB3aGlsZSAobm9kZS5sYXN0Q2hpbGQpCiAgICAgICAgbm9kZSA9IG5vZGUubGFzdENoaWxkOwoKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CgogICAgaWYgKG5vZGUucGFyZW50Tm9kZSAhPSByb290KQogICAgICByZXR1cm4gbm9kZS5wYXJlbnROb2RlOwoKICAgIHJldHVybiBudWxsOwogIH0sCgogIHByZXZpb3VzX3NpYmxpbmdfZWxlbWVudDogZnVuY3Rpb24gKGVsKSB7CiAgICBlbCA9IGVsLnByZXZpb3VzU2libGluZzsKCiAgICB3aGlsZSAoZWwgJiYgZWwubm9kZVR5cGUgIT0gMSkKICAgICAgZWwgPSBlbC5wcmV2aW91c1NpYmxpbmc7CgogICAgcmV0dXJuIGVsOwogIH0sCgogIG5leHRfc2libGluZ19lbGVtZW50OiBmdW5jdGlvbiAoZWwpIHsKICAgIGVsID0gZWwubmV4dFNpYmxpbmc7CgogICAgd2hpbGUgKGVsICYmIGVsLm5vZGVUeXBlICE9IDEpCiAgICAgIGVsID0gZWwubmV4dFNpYmxpbmc7CgogICAgcmV0dXJuIGVsOwogIH0sCgogIGZpcnN0X2NoaWxkX2VsZW1lbnQ6IGZ1bmN0aW9uIChlbCkgewogICAgdmFyIG5vZGU7CgogICAgZm9yIChub2RlID0gZWwuZmlyc3RDaGlsZDsgbm9kZTsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpCiAgICB7CiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEpCiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0dXJuIG5vZGU7CiAgfSwKCiAgZmlyc3RfdGFnOiBmdW5jdGlvbiAoZWxlbWVudCwgdGFnKSB7CiAgICB2YXIgbm9kZTsKCiAgICBpZiAoIXRoaXMuaXNfeGh0bWwpCiAgICAgIHRhZyA9IHRhZy50b1VwcGVyQ2FzZSgpOwoKICAgIGZvciAobm9kZSA9IGVsZW1lbnQuZmlyc3RDaGlsZDsgbm9kZTsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpCiAgICB7CiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEgJiYgbm9kZS5ub2RlTmFtZSA9PSB0YWcpCiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0dXJuIG5vZGU7CiAgfSwKCiAgaGlkZV9zZWxlY3Rpb246IGZ1bmN0aW9uICgpIHsKICAgIGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uKSAvLyBGaXJlZm94LCBDaHJvbWl1bSwgU2FmYXJpLCBPcGVyYQogICAgewogICAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpOwoKICAgICAgaWYgKHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkKICAgICAgewogICAgICAgIHZhciByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApOwogICAgICAgIHJhbmdlLmNvbGxhcHNlIChmYWxzZSk7CiAgICAgIH0KICAgIH0KICAgIGVsc2UgLy8gSW50ZXJuZXQgRXhwbG9yZXIKICAgIHsKICAgICAgdmFyIHRleHRSYW5nZSA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSAoKTsKICAgICAgdGV4dFJhbmdlLmNvbGxhcHNlIChmYWxzZSk7CiAgICB9CiAgfSwKCiAgZ2V0X3NlbGVjdGVkX3RleHQ6IGZ1bmN0aW9uICgpIHsKICAgIHRyeQogICAgewogICAgICBpZiAod2luZG93LmdldFNlbGVjdGlvbikKICAgICAgICByZXR1cm4gd2luZG93LmdldFNlbGVjdGlvbigpLnRvU3RyaW5nKCk7CgogICAgICBpZiAoZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKQogICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKS50b1N0cmluZygpOwoKICAgICAgaWYgKGRvY3VtZW50LnNlbGVjdGlvbikKICAgICAgICByZXR1cm4gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkudGV4dDsKICAgIH0KICAgIGNhdGNoIChlKQogICAgewogICAgfQoKICAgIHJldHVybiAiIjsKICB9LAoKICAvLyBtYWtlIG5vdGUgb2YgbGVuZ3RoIG9mIHNlbGVjdGVkIHRleHQKICAvLyBhcyB0aGlzIGV2YWx1YXRlcyB0byB6ZXJvIGluIGNsaWNrIGV2ZW50CiAgbW91c2VfYnV0dG9uX3VwOiBmdW5jdGlvbiAoZSkgewogICAgdzNjX3NsaWR5LnNlbGVjdGVkX3RleHRfbGVuID0gdzNjX3NsaWR5LmdldF9zZWxlY3RlZF90ZXh0KCkubGVuZ3RoOwogIH0sCgogIG1vdXNlX2J1dHRvbl9kb3duOiBmdW5jdGlvbiAoZSkgewogICAgdzNjX3NsaWR5LnNlbGVjdGVkX3RleHRfbGVuID0gdzNjX3NsaWR5LmdldF9zZWxlY3RlZF90ZXh0KCkubGVuZ3RoOwogICAgdzNjX3NsaWR5Lm1vdXNlX3ggPSBlLmNsaWVudFg7CiAgICB3M2Nfc2xpZHkubW91c2VfeSA9IGUuY2xpZW50WTsKICB9LAoKICAvLyByaWdodCBtb3VzZSBidXR0b24gY2xpY2sgaXMgcmVzZXJ2ZWQgZm9yIGNvbnRleHQgbWVudXMKICAvLyBpdCBpcyBtb3JlIHJlbGlhYmxlIHRvIGRldGVjdCByaWdodGNsaWNrIHRoYW4gbGVmdGNsaWNrCiAgbW91c2VfYnV0dG9uX2NsaWNrOiBmdW5jdGlvbiAoZSkgewogICAgaWYgKCFlKQogICAgICB2YXIgZSA9IHdpbmRvdy5ldmVudDsKCiAgICBpZiAoTWF0aC5hYnMoZS5jbGllbnRYIC13M2Nfc2xpZHkubW91c2VfeCkgKwogICAgICAgIE1hdGguYWJzKGUuY2xpZW50WSAtdzNjX3NsaWR5Lm1vdXNlX3kpID4gMTApCiAgICAgIHJldHVybiB0cnVlOwoKICAgIGlmICh3M2Nfc2xpZHkuc2VsZWN0ZWRfdGV4dF9sZW4gPiAwKQogICAgICByZXR1cm4gdHJ1ZTsKCiAgICB2YXIgcmlnaHRjbGljayA9IGZhbHNlOwogICAgdmFyIGxlZnRjbGljayA9IGZhbHNlOwogICAgdmFyIG1pZGRsZWNsaWNrID0gZmFsc2U7CiAgICB2YXIgdGFyZ2V0OwoKICAgIGlmICghZSkKICAgICAgdmFyIGUgPSB3aW5kb3cuZXZlbnQ7CgogICAgaWYgKGUudGFyZ2V0KQogICAgICB0YXJnZXQgPSBlLnRhcmdldDsKICAgIGVsc2UgaWYgKGUuc3JjRWxlbWVudCkKICAgICAgdGFyZ2V0ID0gZS5zcmNFbGVtZW50OwoKICAgIC8vIHdvcmsgYXJvdW5kIFNhZmFyaSBidWcKICAgIGlmICh0YXJnZXQubm9kZVR5cGUgPT0gMykKICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7CgogICAgaWYgKGUud2hpY2gpIC8vIGFsbCBicm93c2VycyBleGNlcHQgSUUKICAgIHsKICAgICAgbGVmdGNsaWNrID0gKGUud2hpY2ggPT0gMSk7CiAgICAgIG1pZGRsZWNsaWNrID0gKGUud2hpY2ggPT0gMik7CiAgICAgIHJpZ2h0Y2xpY2sgPSAoZS53aGljaCA9PSAzKTsKICAgIH0KICAgIGVsc2UgaWYgKGUuYnV0dG9uKQogICAgewogICAgICAvLyBLb25xdWVyb3IgZ2l2ZXMgMSBmb3IgbGVmdCwgNCBmb3IgbWlkZGxlCiAgICAgIC8vIElFNiBnaXZlcyAwIGZvciBsZWZ0IGFuZCBub3QgMSBhcyBJIGV4cGVjdGVkCgogICAgICBpZiAoZS5idXR0b24gPT0gNCkKICAgICAgICBtaWRkbGVjbGljayA9IHRydWU7CgogICAgICAvLyBhbGwgYnJvd3NlcnMgYWdyZWUgb24gMiBmb3IgcmlnaHQgYnV0dG9uCiAgICAgIHJpZ2h0Y2xpY2sgPSAoZS5idXR0b24gPT0gMik7CiAgICB9CiAgICBlbHNlCiAgICAgIGxlZnRjbGljayA9IHRydWU7CgogICAgaWYgKHczY19zbGlkeS5zZWxlY3RlZF90ZXh0X2xlbiA+IDApCiAgICB7CiAgICAgIHczY19zbGlkeS5zdG9wX3Byb3BhZ2F0aW9uKGUpOwogICAgICBlLmNhbmNlbCA9IHRydWU7CiAgICAgIGUucmV0dXJuVmFsdWUgPSBmYWxzZTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIGRpc21pc3MgdGFibGUgb2YgY29udGVudHMKICAgIHczY19zbGlkeS5oaWRlX3RhYmxlX29mX2NvbnRlbnRzKGZhbHNlKTsKCiAgICAvLyBjaGVjayBpZiB0YXJnZXQgaXMgc29tZXRoaW5nIHRoYXQgcHJvYmFibHkgd2FudCdzIGNsaWNrcwogICAgLy8gZS5nLiBhLCBlbWJlZCwgb2JqZWN0LCBpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCwgb3B0aW9uCiAgICB2YXIgdGFnID0gdGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgogICAgaWYgKHczY19zbGlkeS5tb3VzZV9jbGlja19lbmFibGVkICYmIGxlZnRjbGljayAmJgogICAgICAgICF3M2Nfc2xpZHkuc3BlY2lhbF9lbGVtZW50KHRhcmdldCkgJiYKICAgICAgICAhdGFyZ2V0Lm9uY2xpY2spCiAgICB7CiAgICAgIHczY19zbGlkeS5uZXh0X3NsaWRlKHRydWUpOwogICAgICB3M2Nfc2xpZHkuc3RvcF9wcm9wYWdhdGlvbihlKTsKICAgICAgZS5jYW5jZWwgPSB0cnVlOwogICAgICBlLnJldHVyblZhbHVlID0gZmFsc2U7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICByZXR1cm4gdHJ1ZTsKICB9LAoKICBzcGVjaWFsX2VsZW1lbnQ6IGZ1bmN0aW9uIChlbGVtZW50KSB7CiAgICBpZiAodGhpcy5oYXNfY2xhc3MoZWxlbWVudCwgIm5vbi1pbnRlcmFjdGl2ZSIpKQogICAgICByZXR1cm4gZmFsc2U7CgogICAgdmFyIHRhZyA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCiAgICByZXR1cm4gZWxlbWVudC5vbmtleWRvd24gfHwKICAgICAgZWxlbWVudC5vbmNsaWNrIHx8CiAgICAgIHRhZyA9PSAiYSIgfHwKICAgICAgdGFnID09ICJlbWJlZCIgfHwKICAgICAgdGFnID09ICJvYmplY3QiIHx8CiAgICAgIHRhZyA9PSAidmlkZW8iIHx8CiAgICAgIHRhZyA9PSAiYXVkaW8iIHx8CiAgICAgIHRhZyA9PSAic3ZnIiB8fAogICAgICB0YWcgPT0gImNhbnZhcyIgfHwKICAgICAgdGFnID09ICJpbnB1dCIgfHwKICAgICAgdGFnID09ICJ0ZXh0YXJlYSIgfHwKICAgICAgdGFnID09ICJzZWxlY3QiIHx8CiAgICAgIHRhZyA9PSAib3B0aW9uIjsKICB9LAoKICBzbGlkeV9jaHJvbWU6IGZ1bmN0aW9uIChlbCkgewogICAgd2hpbGUgKGVsKQogICAgewogICAgICBpZiAoZWwgPT0gdzNjX3NsaWR5LnRvYyB8fAogICAgICAgICAgZWwgPT0gdzNjX3NsaWR5LnRvb2xiYXIgfHwKICAgICAgICAgIHczY19zbGlkeS5oYXNfY2xhc3MoZWwsICJvdXRsaW5lIikpCiAgICAgICAgcmV0dXJuIHRydWU7CgogICAgICBlbCA9IGVsLnBhcmVudE5vZGU7CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0sCgogIGdldF9rZXk6IGZ1bmN0aW9uIChlKQogIHsKICAgIHZhciBrZXk7CgogICAgLy8ga2x1ZGdlIGFyb3VuZCBOUy9JRSBkaWZmZXJlbmNlcyAKICAgIGlmICh0eXBlb2Ygd2luZG93LmV2ZW50ICE9ICJ1bmRlZmluZWQiKQogICAgICBrZXkgPSB3aW5kb3cuZXZlbnQua2V5Q29kZTsKICAgIGVsc2UgaWYgKGUud2hpY2gpCiAgICAgIGtleSA9IGUud2hpY2g7CgogICAgcmV0dXJuIGtleTsKICB9LAoKICBnZXRfdGFyZ2V0OiBmdW5jdGlvbiAoZSkgewogICAgdmFyIHRhcmdldDsKCiAgICBpZiAoIWUpCiAgICAgIGUgPSB3aW5kb3cuZXZlbnQ7CgogICAgaWYgKGUudGFyZ2V0KQogICAgICB0YXJnZXQgPSBlLnRhcmdldDsKICAgIGVsc2UgaWYgKGUuc3JjRWxlbWVudCkKICAgICAgdGFyZ2V0ID0gZS5zcmNFbGVtZW50OwoKICAgIGlmICh0YXJnZXQubm9kZVR5cGUgIT0gMSkKICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7CgogICAgcmV0dXJuIHRhcmdldDsKICB9LAoKICAvLyBkb2VzIGRpc3BsYXkgcHJvcGVydHkgcHJvdmlkZSBjb3JyZWN0IGRlZmF1bHRzPwogIGlzX2Jsb2NrOiBmdW5jdGlvbiAoZWxlbSkgewogICAgdmFyIHRhZyA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCiAgICByZXR1cm4gdGFnID09ICJvbCIgfHwgdGFnID09ICJ1bCIgfHwgdGFnID09ICJwIiB8fCB0YWcgPT0gImRsIiB8fAogICAgICAgICAgIHRhZyA9PSAibGkiIHx8IHRhZyA9PSAidGFibGUiIHx8IHRhZyA9PSAicHJlIiB8fAogICAgICAgICAgIHRhZyA9PSAiaDEiIHx8IHRhZyA9PSAiaDIiIHx8IHRhZyA9PSAiaDMiIHx8CiAgICAgICAgICAgdGFnID09ICJoNCIgfHwgdGFnID09ICJoNSIgfHwgdGFnID09ICJoNiIgfHwKICAgICAgICAgICB0YWcgPT0gImJsb2NrcXVvdGUiIHx8IHRhZyA9PSAiYWRkcmVzcyI7IAogIH0sCgogIGFkZF9saXN0ZW5lcjogZnVuY3Rpb24gKGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyKSB7CiAgICBpZiAod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpCiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgZmFsc2UpOwogICAgZWxzZQogICAgICBlbGVtZW50LmF0dGFjaEV2ZW50KCJvbiIrZXZlbnQsIGhhbmRsZXIpOwogIH0sCgogIC8vIHVzZWQgdG8gcHJldmVudCBldmVudCBwcm9wYWdhdGlvbiBmcm9tIGZpZWxkIGNvbnRyb2xzCiAgc3RvcF9wcm9wYWdhdGlvbjogZnVuY3Rpb24gKGV2ZW50KSB7CiAgICBldmVudCA9IGV2ZW50ID8gZXZlbnQgOiB3aW5kb3cuZXZlbnQ7CiAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlOyAgLy8gZm9yIElFCgogICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikKICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CgogICAgcmV0dXJuIHRydWU7CiAgfSwKCiAgY2FuY2VsOiBmdW5jdGlvbiAoZXZlbnQpIHsKICAgIGlmIChldmVudCkKICAgIHsKICAgICAgIGV2ZW50LmNhbmNlbCA9IHRydWU7CiAgICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlOwoKICAgICAgaWYgKGV2ZW50LnByZXZlbnREZWZhdWx0KQogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICB9CgogICAgdzNjX3NsaWR5LmtleV93YW50ZWQgPSBmYWxzZTsKICAgIHJldHVybiBmYWxzZTsKICB9LAoKLy8gZm9yIGVhY2ggbGFuZ3VhZ2UgZGVmaW5lIGFuIGFzc29jaWF0aXZlIGFycmF5Ci8vIGFuZCBhbHNvIHRoZSBoZWxwIHRleHQgd2hpY2ggaXMgbG9uZ2VyCgogIHN0cmluZ3NfZXM6IHsKICAgICJzbGlkZSI6InDDoWcuIiwKICAgICJoZWxwPyI6IkF5dWRhIiwKICAgICJjb250ZW50cz8iOiLDjW5kaWNlIiwKICAgICJ0YWJsZSBvZiBjb250ZW50cyI6InRhYmxhIGRlIGNvbnRlbmlkb3MiLAogICAgIlRhYmxlIG9mIENvbnRlbnRzIjoiVGFibGEgZGUgQ29udGVuaWRvcyIsCiAgICAicmVzdGFydCBwcmVzZW50YXRpb24iOiJSZWluaWNpYXIgcHJlc2VudGFjacOzbiIsCiAgICAicmVzdGFydD8iOiJJbmljaW8iCiAgfSwKICBoZWxwX2VzOgogICAgIlV0aWxpY2UgZWwgcmF0w7NuLCBiYXJyYSBlc3BhY2lhZG9yYSwgdGVjbGFzIEl6ZGEvRGNoYSwgIiArCiAgICAibyBSZSBww6FnIHkgQXYgcMOhZy4gVXNlIFMgeSBCIHBhcmEgY2FtYmlhciBlbCB0YW1hw7FvIGRlIGZ1ZW50ZS4iLAoKICBzdHJpbmdzX2NhOiB7CiAgICAic2xpZGUiOiJww6BnLi4iLAogICAgImhlbHA/IjoiQWp1ZGEiLAogICAgImNvbnRlbnRzPyI6IsONbmRleCIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiJ0YXVsYSBkZSBjb250aW5ndXRzIiwKICAgICJUYWJsZSBvZiBDb250ZW50cyI6IlRhdWxhIGRlIENvbnRpbmd1dHMiLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoiUmVpbmljaWFyIHByZXNlbnRhY2nDsyIsCiAgICAicmVzdGFydD8iOiJJbmljaSIKICB9LAogIGhlbHBfY2E6CiAgICAiVXRpbGl0emkgZWwgcmF0b2zDrSwgYmFycmEgZXNwYWlhZG9yYSwgdGVjbGVzIEVzcS4vRHRhLiAiICsKICAgICJvIFJlIHDDoGcgeSBBdiBww6BnLiBVc2kgUyBpIEIgcGVyIGNhbnZpYXIgZ3JhbmTDoHJpYSBkZSBmb250LiIsCgogIHN0cmluZ3NfY3M6IHsKICAgICJzbGlkZSI6InNuw61tZWsiLAogICAgImhlbHA/IjoibsOhcG92xJtkYSIsCiAgICAiY29udGVudHM/Ijoib2JzYWgiLAogICAgInRhYmxlIG9mIGNvbnRlbnRzIjoib2JzYWggcHJlemVudGFjZSIsCiAgICAiVGFibGUgb2YgQ29udGVudHMiOiJPYnNhaCBwcmV6ZW50YWNlIiwKICAgICJyZXN0YXJ0IHByZXNlbnRhdGlvbiI6Inpub3Z1IHNwdXN0aXQgcHJlemVudGFjaSIsCiAgICAicmVzdGFydD8iOiJyZXN0YXJ0IgogIH0sCiAgaGVscF9jczoKICAgICJQcmV6ZW50YWNpIG3Fr8W+ZXRlIHByb2Now6F6ZXQgcG9tb2PDrSBrbGlrbnV0w60gbXnFoWksIG1lemVybsOta3UsICIgKwogICAgIsWhaXBlayB2bGV2byBhIHZwcmF2byBuZWJvIGtsw6F2ZXMgUGFnZVVwIGEgUGFnZURvd24uIFDDrXNtbyBzZSAiICsKICAgICJkw6EgenbEm3TFoWl0IGEgem1lbsWhaXQgcG9tb2PDrSBrbMOhdmVzIEIgYSBTLiIsCgogIHN0cmluZ3Nfbmw6IHsKICAgICJzbGlkZSI6InBhZ2luYSIsCiAgICAiaGVscD8iOiJIZWxwPyIsCiAgICAiY29udGVudHM/IjoiSW5ob3VkPyIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiJpbmhvdWRzb3BnYXZlIiwKICAgICJUYWJsZSBvZiBDb250ZW50cyI6IkluaG91ZHNvcGdhdmUiLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoiaGVyc3RhcnQgcHJlc2VudGF0aWUiLAogICAgInJlc3RhcnQ/IjoiSGVyc3RhcnQ/IgogIH0sCiAgaGVscF9ubDoKICAgICAiTmF2aWdlZXIgZC5tLnYuIGhldCBtdWlzLCBzcGF0aWViYXIsIExpbmtzL1JlY2h0cyB0b2V0c2VuLCAiICsKICAgICAib2YgUGdVcCBlbiBQZ0RuLiBHZWJydWlrIFMgZW4gQiBvbSBkZSBrYXJha3Rlcmdyb290dGUgdGUgdmVyYW5kZXJlbi4iLAoKICBzdHJpbmdzX2RlOiB7CiAgICAic2xpZGUiOiJTZWl0ZSIsCiAgICAiaGVscD8iOiJIaWxmZSIsCiAgICAiY29udGVudHM/Ijoiw5xiZXJzaWNodCIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiJJbmhhbHRzdmVyemVpY2huaXMiLAogICAgIlRhYmxlIG9mIENvbnRlbnRzIjoiSW5oYWx0c3ZlcnplaWNobmlzIiwKICAgICJyZXN0YXJ0IHByZXNlbnRhdGlvbiI6IlByw6RzZW50YXRpb24gbmV1IHN0YXJ0ZW4iLAogICAgInJlc3RhcnQ/IjoiTmV1c3RhcnQiCiAgfSwKICBoZWxwX2RlOgogICAgIkJlbnV0emVuIFNpZSBkaWUgTWF1cywgTGVlcnNjaGxhZywgZGllIEN1cnNvcnRhc3RlbiBsaW5rcy9yZWNodHMgb2RlciAiICsKICAgICJQYWdlIHVwL1BhZ2UgRG93biB6dW0gV2VjaHNlbG4gZGVyIFNlaXRlbiB1bmQgUyB1bmQgQiBmw7xyIGRpZSBTY2hyaWZ0Z3LDtnNzZS4iLAoKICBzdHJpbmdzX3BsOiB7CiAgICAic2xpZGUiOiJzbGFqZCIsCiAgICAiaGVscD8iOiJwb21vYz8iLAogICAgImNvbnRlbnRzPyI6InNwaXMgdHJlxZtjaT8iLAogICAgInRhYmxlIG9mIGNvbnRlbnRzIjoic3BpcyB0cmXFm2NpIiwKICAgICJUYWJsZSBvZiBDb250ZW50cyI6IlNwaXMgVHJlxZtjaSIsCiAgICAicmVzdGFydCBwcmVzZW50YXRpb24iOiJSZXN0YXJ0dWogcHJlemVudGFjasSZIiwKICAgICJyZXN0YXJ0PyI6InJlc3RhcnQ/IgogIH0sCiAgaGVscF9wbDoKICAgICJabWllbmlhaiBzbGFqZHkga2xpa2FqxIVjIG15c3rEhSwgbmFjaXNrYWrEhWMgc3BhY2rEmSwgc3RyemHFgmtpIGxld28vcHJhd28iICsKICAgICJsdWIgUGdVcCAvIFBnRG4uIFXFvHlqIGtsYXdpc3p5IFMgaSBCLCBhYnkgem1pZW5pxIcgcm96bWlhciBjemN6aW9ua2kuIiwKCiAgc3RyaW5nc19mcjogewogICAgInNsaWRlIjoicGFnZSIsCiAgICAiaGVscD8iOiJBaWRlIiwKICAgICJjb250ZW50cz8iOiJJbmRleCIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiJ0YWJsZSBkZXMgbWF0acOocmVzIiwKICAgICJUYWJsZSBvZiBDb250ZW50cyI6IlRhYmxlIGRlcyBtYXRpw6hyZXMiLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoiUmVjb21tZW5jZXIgbCdleHBvc8OpIiwKICAgICJyZXN0YXJ0PyI6IkTDqWJ1dCIKICB9LAogIGhlbHBfZnI6CiAgICAiTmF2aWd1ZXogYXZlYyBsYSBzb3VyaXMsIGxhIGJhcnJlIGQnZXNwYWNlLCBsZXMgZmzDqGNoZXMgIiArCiAgICAiZ2F1Y2hlL2Ryb2l0ZSBvdSBsZXMgdG91Y2hlcyBQZyBVcCwgUGcgRG4uIFV0aWxpc2V6ICIgKwogICAgImxlcyB0b3VjaGVzIFMgZXQgQiBwb3VyIG1vZGlmaWVyIGxhIHRhaWxsZSBkZSBsYSBwb2xpY2UuIiwKCiAgc3RyaW5nc19odTogewogICAgInNsaWRlIjoib2xkYWwiLAogICAgImhlbHA/Ijoic2Vnw610c8OpZyIsCiAgICAiY29udGVudHM/IjoidGFydGFsb20iLAogICAgInRhYmxlIG9mIGNvbnRlbnRzIjoidGFydGFsb21qZWd5esOpayIsCiAgICAiVGFibGUgb2YgQ29udGVudHMiOiJUYXJ0YWxvbWplZ3l6w6lrIiwKICAgICJyZXN0YXJ0IHByZXNlbnRhdGlvbiI6ImJlbXV0YXTDsyDDumpyYWluZMOtdMOhc2EiLAogICAgInJlc3RhcnQ/Ijoiw7pqcmFpbmTDrXTDoXMiCiAgfSwKICBoZWxwX2h1OgogICAgIkF6IG9sZGFsYWsga8O2enRpIGzDqXBrZWTDqXNoZXoga2F0dGludHNvbiBheiBlZ8OpcnJlbCwgdmFneSAiICsKICAgICJoYXN6bsOhbGphIGEgc3rDs2vDtnosIGEgYmFsLCB2YWd5IGEgam9iYiBuecOtbCwgaWxsZXR2ZSBhIFBhZ2UgRG93biwgIiArCiAgICAiUGFnZSBVcCBiaWxsZW50ecWxa2V0LiBBeiBTIMOpcyBhIEIgYmlsbGVudHnFsWtrZWwgdsOhbHRvenRhdGhhdGphICIgKwogICAgImEgc3rDtnZlZyBtw6lyZXTDqXQuIiwKCiAgc3RyaW5nc19pdDogewogICAgInNsaWRlIjoicGFnLiIsCiAgICAiaGVscD8iOiJBaXV0byIsCiAgICAiY29udGVudHM/IjoiSW5kaWNlIiwKICAgICJ0YWJsZSBvZiBjb250ZW50cyI6ImluZGljZSIsCiAgICAiVGFibGUgb2YgQ29udGVudHMiOiJJbmRpY2UiLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoiUmljb21pbmNpYXJlIGxhIHByZXNlbnRhemlvbmUiLAogICAgInJlc3RhcnQ/IjoiSW5pemlvIgogIH0sCiAgaGVscF9pdDoKICAgICJOYXZpZ2FyZSBjb24gbW91c2UsIGJhcnJhIHNwYXppbywgZnJlY2NlIHNpbmlzdHJhL2Rlc3RyYSBvICIgKwogICAgIlBnVXAgZSBQZ0RuLiBVc2FyZSBTIGUgQiBwZXIgY2FtYmlhcmUgbGEgZGltZW5zaW9uZSBkZWkgY2FyYXR0ZXJpLiIsCgogIHN0cmluZ3NfZWw6IHsKICAgICJzbGlkZSI6Is+DzrXOu86vzrTOsSIsCiAgICAiaGVscD8iOiLOss6/zq7OuM61zrnOsTsiLAogICAgImNvbnRlbnRzPyI6Is+AzrXPgc65zrXPh8+MzrzOtc69zrE7IiwKICAgICJ0YWJsZSBvZiBjb250ZW50cyI6Is+Azq/Ovc6xzrrOsc+CIM+AzrXPgc65zrXPh86/zrzOrc69z4nOvSIsCiAgICAiVGFibGUgb2YgQ29udGVudHMiOiLOoM6vzr3Osc66zrHPgiDOoM61z4HOuc61z4fOv868zq3Ovc+Jzr0iLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoizrXPgM6xzr3Otc66zrrOr869zrfPg863IM+AzrHPgc6/z4XPg86vzrHPg863z4IiLAogICAgInJlc3RhcnQ/IjoizrXPgM6xzr3Otc66zrrOr869zrfPg863OyIKICB9LAogIGhlbHBfZWw6CiAgICAizqDOu86/zrfOs863zrjOtc6vz4TOtSDOvM61IM+Ezr8gzrrOu86vzrogz4TOv8+FIM+Azr/Ovc+EzrnOus65zr/PjSwgz4TOvyBzcGFjZSwgz4TOsSDOss6tzrvOtyDOsc+BzrnPg8+EzrXPgc6sL860zrXOvs65zqwsICIgKwogICAgIs6uIFBhZ2UgVXAgzrrOsc65IFBhZ2UgRG93bi4gzqfPgc63z4POuc68zr/PgM6/zrnOrs+Dz4TOtSDPhM6xIM+AzrvOrs66z4TPgc6xIFMgzrrOsc65IEIgzrPOuc6xIM69zrEgzrHOu867zqzOvs61z4TOtSAiICsKICAgICLPhM6/IM68zq3Os861zrjOv8+CIM+EzrfPgiDOs8+BzrHOvM68zrHPhM6/z4POtc65z4HOrM+CLiIsCgogIHN0cmluZ3NfamE6IHsKICAgICJzbGlkZSI6IuOCueODqeOCpOODiSIsCiAgICAiaGVscD8iOiLjg5jjg6vjg5ciLAogICAgImNvbnRlbnRzPyI6IuebruasoSIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiLnm67mrKHjgpLooajnpLoiLAogICAgIlRhYmxlIG9mIENvbnRlbnRzIjoi55uu5qyhIiwKICAgICJyZXN0YXJ0IHByZXNlbnRhdGlvbiI6IuacgOWIneOBi+OCieWGjeeUnyIsCiAgICAicmVzdGFydD8iOiLmnIDliJ3jgYvjgokiCiAgfSwKICBoZWxwX2phOgogICAgICLjg57jgqbjgrnlt6bjgq/jg6rjg4Pjgq8g44O7IOOCueODmuODvOOCuSDjg7sg5bem5Y+z44Kt44O8ICIgKwogICAgICLjgb7jgZ/jga8gUGFnZSBVcCDjg7sgUGFnZSBEb3du44Gn5pON5L2c77yMIFMg44O7IELjgafjg5Xjgqnjg7Pjg4jjgrXjgqTjgrrlpInmm7QiLAoKICBzdHJpbmdzX3poOiB7CiAgICAic2xpZGUiOiLlubvnga/niYciLAogICAgImhlbHA/Ijoi5biu5YqpPyIsCiAgICAiY29udGVudHM/Ijoi5YaF5a65PyIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiLnm67lvZUiLAogICAgIlRhYmxlIG9mIENvbnRlbnRzIjoi55uu5b2VIiwKICAgICJyZXN0YXJ0IHByZXNlbnRhdGlvbiI6IumHjeaWsOWQr+WKqOWxleekuiIsCiAgICAicmVzdGFydD8iOiLph43mlrDlkK/liqg/IgogIH0sCiAgaGVscF96aDoKICAgICLnlKjpvKDmoIfngrnlh7ssIOepuuagvOadoSwg5bem5Y+z566t5aS0LCBQZyBVcCDlkowgUGcgRG4g5a+86IiqLiAiICsKICAgICLnlKggUywgQiDmlLnlj5jlrZfkvZPlpKflsI8uIiwKCiAgc3RyaW5nc19ydTogewogICAgInNsaWRlIjoi0YHQu9Cw0LnQtCIsCiAgICAiaGVscD8iOiLQv9C+0LzQvtGJ0Yw/IiwKICAgICJjb250ZW50cz8iOiLRgdC+0LTQtdGA0LbQsNC90LjQtT8iLAogICAgInRhYmxlIG9mIGNvbnRlbnRzIjoi0L7Qs9C70LDQstC70LXQvdC40LUiLAogICAgIlRhYmxlIG9mIENvbnRlbnRzIjoi0J7Qs9C70LDQstC70LXQvdC40LUiLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoi0L/QtdGA0LXQt9Cw0L/Rg9GB0YLQuNGC0Ywg0L/RgNC10LfQtdC90YLQsNGG0LjRjiIsCiAgICAicmVzdGFydD8iOiLQv9C10YDQtdC30LDQv9GD0YHQuj8iCiAgfSwKICBoZWxwX3J1OgogICAgItCf0LXRgNC10LzQtdGJ0LDQudGC0LXRgdGMINC60LvQuNC60LDRjyDQvNGL0YjQutC+0LksINC40YHQv9C+0LvRjNC30YPRjyDQutC70LDQstC40YjRgyDQv9GA0L7QsdC10LssINGB0YLRgNC10LvQutC4IiArCiAgICAi0LLQu9C10LLQvi/QstC/0YDQsNCy0L4g0LjQu9C4IFBnIFVwINC4IFBnIERuLiDQmtC70LDQstC40YjQuCBTINC4IEIg0LzQtdC90Y/RjtGCINGA0LDQt9C80LXRgCDRiNGA0LjRhNGC0LAuIiwKCiAgc3RyaW5nc19zdjogewogICAgInNsaWRlIjoic2lkYSIsCiAgICAiaGVscD8iOiJoasOkbHAiLAogICAgImNvbnRlbnRzPyI6ImlubmVow6VsbCIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiJpbm5laMOlbGxzZsO2cnRlY2tuaW5nIiwKICAgICJUYWJsZSBvZiBDb250ZW50cyI6IklubmVow6VsbHNmw7ZydGVja25pbmciLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoidmlzYSBwcmVzZW50YXRpb25lbiBmcsOlbiBiw7ZyamFuIiwKICAgICJyZXN0YXJ0PyI6ImLDtnJqYSBvbSIKICB9LAogIGhlbHBfc3Y6CiAgICAiQmzDpGRkcmEgbWVkIGV0dCBrbGljayBtZWQgdsOkbnN0cmEgbXVza25hcHBlbiwgbWVsbGFuc2xhZ3N0YW5nZW50ZW4sICIgKwogICAgInbDpG5zdGVyLSBvY2ggaMO2Z2VycGlsdGFuZ2VudGVybmEgZWxsZXIgdGFuZ2VudGVybmEgUGcgVXAsIFBnIERuLiAiICsKICAgICJBbnbDpG5kIHRhbmdlbnRlcm5hIFMgb2NoIEIgZsO2ciBhdHQgw6RuZHJhIHRleHRlbnMgc3Rvcmxlay4iLAoKICBzdHJpbmdzOiB7IH0sCgogIGxvY2FsaXplOiBmdW5jdGlvbiAoc3JjKSB7CiAgICBpZiAoc3JjID09ICIiKQogICAgICByZXR1cm4gc3JjOwoKICAgICAvLyB0cnkgZnVsbCBsYW5ndWFnZSBjb2RlLCBlLmcuIGVuLVVTCiAgICAgdmFyIHMsIGxvb2t1cCA9IHczY19zbGlkeS5zdHJpbmdzW3czY19zbGlkeS5sYW5nXTsKCiAgICAgaWYgKGxvb2t1cCkKICAgICB7CiAgICAgICBzID0gbG9va3VwW3NyY107CgogICAgICAgaWYgKHMpCiAgICAgICAgcmV0dXJuIHM7CiAgICAgfQoKICAgICAvLyBzdHJpcCBjb3VudHJ5IGNvZGUgc3VmZml4LCBlLmcuCiAgICAgLy8gdHJ5IGVuIGlmIHVuZGVmaW5lZCBmb3IgZW4tVVMKICAgICB2YXIgbGcgPSB3M2Nfc2xpZHkubGFuZy5zcGxpdCgiLSIpOwoKICAgICBpZiAobGcubGVuZ3RoID4gMSkKICAgICB7CiAgICAgICBsb29rdXAgPSB3M2Nfc2xpZHkuc3RyaW5nc1tsZ1swXV07CgogICAgICAgaWYgKGxvb2t1cCkKICAgICAgIHsKICAgICAgICAgcyA9IGxvb2t1cFtzcmNdOwoKICAgICAgICAgaWYgKHMpCiAgICAgICAgICByZXR1cm4gczsKICAgICAgIH0KICAgICB9CgogICAgIC8vIG90aGVyd2lzZSBzdHJpbmcgYXMgaXMKICAgICByZXR1cm4gc3JjOwogIH0sCgogIGluaXRfbG9jYWxpemF0aW9uOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgaTE4biA9IHczY19zbGlkeTsKICAgIHZhciBoZWxwX3RleHQgPSB3M2Nfc2xpZHkuaGVscF90ZXh0OwoKICAgIC8vIGVhY2ggc3VjaCBsYW5ndWFnZSBhcnJheSBpcyBkZWNsYXJlZCBpbiB0aGUgbG9jYWxpemUgYXJyYXkKICAgIC8vIHRoaXMgaXMgdXNlZCBhcyBpbiAgdzNjX3NsaWR5LmxvY2FsaXplKCJmb28iKTsKICAgIHRoaXMuc3RyaW5ncyA9IHsKICAgICAgImVzIjp0aGlzLnN0cmluZ3NfZXMsCiAgICAgICJjYSI6dGhpcy5zdHJpbmdzX2NhLAogICAgICAiY3MiOnRoaXMuc3RyaW5nc19jcywKICAgICAgIm5sIjp0aGlzLnN0cmluZ3NfbmwsCiAgICAgICJkZSI6dGhpcy5zdHJpbmdzX2RlLAogICAgICAicGwiOnRoaXMuc3RyaW5nc19wbCwKICAgICAgImZyIjp0aGlzLnN0cmluZ3NfZnIsCiAgICAgICJodSI6dGhpcy5zdHJpbmdzX2h1LAogICAgICAiaXQiOnRoaXMuc3RyaW5nc19pdCwKICAgICAgImVsIjp0aGlzLnN0cmluZ3NfZWwsCiAgICAgICJqcCI6dGhpcy5zdHJpbmdzX2phLAogICAgICAiemgiOnRoaXMuc3RyaW5nc196aCwKICAgICAgInJ1Ijp0aGlzLnN0cmluZ3NfcnUsCiAgICAgICJzdiI6dGhpcy5zdHJpbmdzX3N2CiAgICB9LAoKICAgIGkxOG4uc3RyaW5nc19lc1toZWxwX3RleHRdID0gaTE4bi5oZWxwX2VzOwogICAgaTE4bi5zdHJpbmdzX2NhW2hlbHBfdGV4dF0gPSBpMThuLmhlbHBfY2E7CiAgICBpMThuLnN0cmluZ3NfY3NbaGVscF90ZXh0XSA9IGkxOG4uaGVscF9jczsKICAgIGkxOG4uc3RyaW5nc19ubFtoZWxwX3RleHRdID0gaTE4bi5oZWxwX25sOwogICAgaTE4bi5zdHJpbmdzX2RlW2hlbHBfdGV4dF0gPSBpMThuLmhlbHBfZGU7CiAgICBpMThuLnN0cmluZ3NfcGxbaGVscF90ZXh0XSA9IGkxOG4uaGVscF9wbDsKICAgIGkxOG4uc3RyaW5nc19mcltoZWxwX3RleHRdID0gaTE4bi5oZWxwX2ZyOwogICAgaTE4bi5zdHJpbmdzX2h1W2hlbHBfdGV4dF0gPSBpMThuLmhlbHBfaHU7CiAgICBpMThuLnN0cmluZ3NfaXRbaGVscF90ZXh0XSA9IGkxOG4uaGVscF9pdDsKICAgIGkxOG4uc3RyaW5nc19lbFtoZWxwX3RleHRdID0gaTE4bi5oZWxwX2VsOwogICAgaTE4bi5zdHJpbmdzX2phW2hlbHBfdGV4dF0gPSBpMThuLmhlbHBfamE7CiAgICBpMThuLnN0cmluZ3NfemhbaGVscF90ZXh0XSA9IGkxOG4uaGVscF96aDsKICAgIGkxOG4uc3RyaW5nc19ydVtoZWxwX3RleHRdID0gaTE4bi5oZWxwX3J1OwogICAgaTE4bi5zdHJpbmdzX3N2W2hlbHBfdGV4dF0gPSBpMThuLmhlbHBfc3Y7CgogICAgdzNjX3NsaWR5LmxhbmcgPSBkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUuZ2V0QXR0cmlidXRlKCJsYW5nIik7CgogICAgaWYgKCF3M2Nfc2xpZHkubGFuZykKICAgICAgdzNjX3NsaWR5LmxhbmcgPSBkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpOwoKICAgIGlmICghdzNjX3NsaWR5LmxhbmcpCiAgICAgIHczY19zbGlkeS5sYW5nID0gImVuIjsKICB9Cn07CgovLyBoYWNrIGZvciBiYWNrIGJ1dHRvbiBiZWhhdmlvcgppZiAodzNjX3NsaWR5LmllNiB8fCB3M2Nfc2xpZHkuaWU3KQp7CiAgZG9jdW1lbnQud3JpdGUoIjxpZnJhbWUgaWQ9J2hpc3RvcnlGcmFtZScgIiArCiAgInNyYz0namF2YXNjcmlwdDpcIjxodG1sIisiPjwvIisiaHRtbD5cIicgIiArCiAgImhlaWdodD0nMScgd2lkdGg9JzEnICIgKwogICJzdHlsZT0ncG9zaXRpb246YWJzb2x1dGU7bGVmdDotODAwcHgnPjwvaWZyYW1lPiIpOwp9CgovLyBhdHRhY2ggZXZlbnQgbGlzdGVuZXJzIGZvciBpbml0aWFsaXphdGlvbgp3M2Nfc2xpZHkuc2V0X3VwKCk7CgovLyBoaWRlIHRoZSBzbGlkZXMgYXMgc29vbiBhcyBib2R5IGVsZW1lbnQgaXMgYXZhaWxhYmxlCi8vIHRvIHJlZHVjZSBhbm5veWluZyBzY3JlZW4gbWVzcyBiZWZvcmUgdGhlIG9ubG9hZCBldmVudApzZXRUaW1lb3V0KHczY19zbGlkeS5oaWRlX3NsaWRlcywgNTApOwoK"></script>
<script>(function() {
if (!window.w3c_slidy) return;
if (!window.Shiny) return;
if (!window.$) return;
// whenever a slide changes, tell shiny to recalculate what is displayed
window.w3c_slidy.add_observer(function (slide_num) {
// slide_num starts at position 1
$(w3c_slidy.slides[slide_num - 1]).trigger("shown");
});
})()
</script>
</head>
<body>
<div class="slide titlepage">
<h1 class="title">Hypothesis Testing</h1>
<p class="author">
Fred LaPolla
</p>
<p class="date">June 24, 2021</p>
</div>
<div class="slide section level2">
<div class="sourceCode" id="cb1"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb1-1"><a href="#cb1-1"></a>knitr<span class="op">::</span>opts_chunk<span class="op">$</span><span class="kw">set</span>(<span class="dt">echo =</span> <span class="ot">TRUE</span>)</span></code></pre></div>
</div>
<div id="hypothesis-testing" class="slide section level2">
<h1>Hypothesis Testing</h1>
<p>Tests to see if differences appear in groups we are analyzing.</p>
<p>Typically we want to see if the null hypothesis is true or can be rejected.</p>
<p>Results are termed in rejection of the null or failure to reject the null.</p>
<div class="sourceCode" id="cb2"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb2-1"><a href="#cb2-1"></a><span class="kw">library</span>(RCurl)</span>
<span id="cb2-2"><a href="#cb2-2"></a>url <-<span class="kw">getURL</span>(<span class="st">"https://raw.githubusercontent.com/fredlapolla/RScience2021_libr/master/NYC_HANES_DIAB.csv"</span>)</span>
<span id="cb2-3"><a href="#cb2-3"></a>nyc <-<span class="st"> </span><span class="kw">read.csv</span>(<span class="dt">text =</span> url)</span>
<span id="cb2-4"><a href="#cb2-4"></a>nyc <-<span class="st"> </span><span class="kw">na.omit</span>(nyc)</span>
<span id="cb2-5"><a href="#cb2-5"></a>nyc<span class="op">$</span>AGEGROUP <-<span class="st"> </span><span class="kw">factor</span>(nyc<span class="op">$</span>AGEGROUP, <span class="dt">levels =</span> <span class="dv">1</span><span class="op">:</span><span class="dv">3</span>, <span class="dt">labels =</span> <span class="kw">c</span>(<span class="st">"Youngest"</span>, <span class="st">"Middle"</span>, <span class="st">"Aged"</span>))</span>
<span id="cb2-6"><a href="#cb2-6"></a>nyc<span class="op">$</span>GENDER <-<span class="st"> </span><span class="kw">factor</span>(nyc<span class="op">$</span>GENDER, <span class="dt">levels =</span> <span class="dv">1</span><span class="op">:</span><span class="dv">2</span>, <span class="dt">labels =</span> <span class="kw">c</span>(<span class="st">"male"</span>, <span class="st">"female"</span>))</span>
<span id="cb2-7"><a href="#cb2-7"></a><span class="co"># Rename the HSQ_1 factor for identification</span></span>
<span id="cb2-8"><a href="#cb2-8"></a> nyc<span class="op">$</span>HSQ_<span class="dv">1</span> <-<span class="st"> </span><span class="kw">factor</span>(nyc<span class="op">$</span>HSQ_<span class="dv">1</span>, <span class="dt">levels =</span> <span class="dv">1</span><span class="op">:</span><span class="dv">5</span>, <span class="dt">labels=</span><span class="kw">c</span>(<span class="st">"Excellent"</span>,<span class="st">"Very Good"</span>,<span class="st">"Good"</span>, <span class="st">"Fair"</span>, <span class="st">"Poor"</span>))</span>
<span id="cb2-9"><a href="#cb2-9"></a> <span class="co"># Rename the DX_DBTS as a factor</span></span>
<span id="cb2-10"><a href="#cb2-10"></a> nyc<span class="op">$</span>DX_DBTS <-<span class="st"> </span><span class="kw">factor</span>(nyc<span class="op">$</span>DX_DBTS,<span class="dt">levels =</span> <span class="dv">1</span><span class="op">:</span><span class="dv">3</span>, <span class="dt">labels=</span><span class="kw">c</span>(<span class="st">"Diabetes with DX"</span>,<span class="st">"Diabetes with no DX"</span>,<span class="st">"No Diabetes"</span>))</span></code></pre></div>
</div>
<div id="p-values" class="slide section level2">
<h1>P Values</h1>
<p>Important to note that a P value is just the odds of finding a result as “far” from the mean of the control group assuming the null hypothesis was true. So .05 means that only 5% of the time we would assume a result as far from the control group’s mean assuming there is no difference.</p>
<p>This is important because in data like RNA Seq Analysis, we may have 1000s of rows, simply see which results are significant at .05 is <strong>Not</strong> going to be meaningful.</p>
<p><strong>Remember</strong> a P value < .05, does not mean either that your finding is “true” and it definitely does not mean it is biologically or scientifically significant.</p>
<p>A p value should be only one part of a broader context, including confidence intervals and honest assessment of how likely the findings were in the first place.</p>
<p>There is an on-going push among statisticians to de-emphasize the p value.</p>
<p>If you have a very small p in r, you get a value like “p-value < 2.2e-16” but for publishing you should write something like “p < .001”</p>
</div>
<div id="contingency-tables-and-chi-squared-x2" class="slide section level2">
<h1>Contingency tables and Chi Squared X^2</h1>
<p>Used for assessing if the proportions of of nominal (factor) variables are what we would expect if the groups were equal of not.</p>
<p>Chi square assumes > 5 observations per cell. Null hypothesis is that rows and columns are independent.</p>
<div class="sourceCode" id="cb3"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb3-1"><a href="#cb3-1"></a><span class="kw">chisq.test</span>(nyc<span class="op">$</span>AGEGROUP, nyc<span class="op">$</span>DX_DBTS)</span></code></pre></div>
<pre><code>##
## Pearson's Chi-squared test
##
## data: nyc$AGEGROUP and nyc$DX_DBTS
## X-squared = 88.936, df = 4, p-value < 2.2e-16</code></pre>
<p>We can get the effect size by taking the square root of (X^2/n*degrees of freedom), which is called Cranmer’s V.</p>
</div>
<div id="adding-contingency-tables" class="slide section level2">
<h1>Adding contingency tables</h1>
<p>Typically we will also want to see the actual tables. Creating a table will show us the total nubers, prop.table will tell us the percentage by either row (setting the margin to 1) or column (setting the margin to 2)</p>
<div class="sourceCode" id="cb5"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb5-1"><a href="#cb5-1"></a>AgeDxTable <-<span class="st"> </span><span class="kw">table</span>(nyc<span class="op">$</span>AGEGROUP, nyc<span class="op">$</span>DX_DBTS)</span>
<span id="cb5-2"><a href="#cb5-2"></a>AgeDxTable</span></code></pre></div>
<pre><code>##
## Diabetes with DX Diabetes with no DX No Diabetes
## Youngest 8 3 487
## Middle 53 18 320
## Aged 43 10 170</code></pre>
<div class="sourceCode" id="cb7"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb7-1"><a href="#cb7-1"></a> <span class="co"># Proportions of Age by DX per row</span></span>
<span id="cb7-2"><a href="#cb7-2"></a> <span class="kw">prop.table</span>(AgeDxTable, <span class="dv">1</span>)</span></code></pre></div>
<pre><code>##
## Diabetes with DX Diabetes with no DX No Diabetes
## Youngest 0.016064257 0.006024096 0.977911647
## Middle 0.135549872 0.046035806 0.818414322
## Aged 0.192825112 0.044843049 0.762331839</code></pre>
<div class="sourceCode" id="cb9"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb9-1"><a href="#cb9-1"></a> <span class="co"># Proportions of Age by DX per column</span></span>
<span id="cb9-2"><a href="#cb9-2"></a> <span class="kw">prop.table</span>(AgeDxTable, <span class="dv">2</span>)</span></code></pre></div>
<pre><code>##
## Diabetes with DX Diabetes with no DX No Diabetes
## Youngest 0.07692308 0.09677419 0.49846469
## Middle 0.50961538 0.58064516 0.32753327
## Aged 0.41346154 0.32258065 0.17400205</code></pre>
<div class="sourceCode" id="cb11"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb11-1"><a href="#cb11-1"></a><span class="kw">chisq.test</span>(nyc<span class="op">$</span>AGEGROUP, nyc<span class="op">$</span>DX_DBTS)</span></code></pre></div>
<pre><code>##
## Pearson's Chi-squared test
##
## data: nyc$AGEGROUP and nyc$DX_DBTS
## X-squared = 88.936, df = 4, p-value < 2.2e-16</code></pre>
</div>
<div id="contingency-test-with-small-values" class="slide section level2">
<h1>Contingency test with small values</h1>
<p>For small n (less than 5 observations in a cell), the test for fisher’s exact test is:</p>
<p>fisher.test()</p>
<div class="sourceCode" id="cb13"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb13-1"><a href="#cb13-1"></a><span class="kw">fisher.test</span>(nyc<span class="op">$</span>AGEGROUP, nyc<span class="op">$</span>DX_DBTS)</span></code></pre></div>
<pre><code>##
## Fisher's Exact Test for Count Data
##
## data: nyc$AGEGROUP and nyc$DX_DBTS
## p-value < 2.2e-16
## alternative hypothesis: two.sided</code></pre>
</div>
<div id="on-your-own" class="slide section level2">
<h1>On your own</h1>
<p>Make a contingency table of HSQ1 vs a dichotomized Has or does not have diabetes. Run a chi square test and look up the Cranmer’s V (square-root of X square divided by n * df). We can then look up online a table to see if this is a small, moderate or large effect.</p>
</div>
<div id="parametric-tests" class="slide section level2">
<h1>Parametric Tests</h1>
<p>Parametric tests assume normality of our data.</p>
<p>We can visually assess this with histograms. We can also use the Sharpiro-Wilk test that comes in pastecs::stat.desc(norm = TRUE) to see a p value for if the data is normal</p>
<div class="sourceCode" id="cb15"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb15-1"><a href="#cb15-1"></a><span class="kw">library</span>(pastecs)</span>
<span id="cb15-2"><a href="#cb15-2"></a><span class="kw">stat.desc</span>(nyc<span class="op">$</span>UCREATININE, <span class="dt">norm =</span> <span class="ot">TRUE</span>)</span></code></pre></div>
<pre><code>## nbr.val nbr.null nbr.na min max range
## 1.112000e+03 0.000000e+00 0.000000e+00 1.000000e+00 6.120000e+02 6.110000e+02
## sum median mean SE.mean CI.mean.0.95 var
## 1.544280e+05 1.280000e+02 1.388741e+02 2.593517e+00 5.088744e+00 7.479680e+03
## std.dev coef.var skewness skew.2SE kurtosis kurt.2SE
## 8.648514e+01 6.227593e-01 1.063545e+00 7.249154e+00 1.852644e+00 6.319477e+00
## normtest.W normtest.p
## 9.378843e-01 3.863051e-21</code></pre>
<p>We can also run this test on its own:</p>
<div class="sourceCode" id="cb17"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb17-1"><a href="#cb17-1"></a><span class="kw">shapiro.test</span>(nyc<span class="op">$</span>CHOLESTEROLTOTAL)</span></code></pre></div>
<pre><code>##
## Shapiro-Wilk normality test
##
## data: nyc$CHOLESTEROLTOTAL
## W = 0.98776, p-value = 5.092e-08</code></pre>
<p>The normtest.p test tells us if data is likely to differ significantly from a normal distribution. p < .05 means it is not normally distributed, but a caveat is that very large sets of data will often have a “significant” p value since they are powered to detect very small differences.</p>
<p>We can also run the Kolmogorov-Smirnov Test:</p>
<div class="sourceCode" id="cb19"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb19-1"><a href="#cb19-1"></a><span class="kw">ks.test</span>(nyc<span class="op">$</span>CHOLESTEROLTOTAL, pnorm, <span class="kw">mean</span>(nyc<span class="op">$</span>CHOLESTEROLTOTAL, <span class="dt">na.rm =</span> <span class="ot">TRUE</span>), <span class="kw">sd</span>(nyc<span class="op">$</span>CHOLESTEROLTOTAL, <span class="dt">na.rm =</span> <span class="ot">TRUE</span>))</span></code></pre></div>
<pre><code>## Warning in ks.test(nyc$CHOLESTEROLTOTAL, pnorm, mean(nyc$CHOLESTEROLTOTAL, :
## ties should not be present for the Kolmogorov-Smirnov test</code></pre>
<pre><code>##
## One-sample Kolmogorov-Smirnov test
##
## data: nyc$CHOLESTEROLTOTAL
## D = 0.039853, p-value = 0.05848
## alternative hypothesis: two-sided</code></pre>
</div>
<div id="homogenity-of-variance" class="slide section level2">
<h1>Homogenity of Variance</h1>
<p>We also want to test the assumption of homogeneity of variance. This basically means that at all levels going up of a variable, the amount of variation remains consistently the same. For example, we would want to know if the amount of variation in, say, cholesterol, was similar in diabetics and non-diabetics to compare. We can test this with a command called</p>
<p>leveneTest(VariableOfInterest, groups, center = median/mean)</p>
<div class="sourceCode" id="cb22"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb22-1"><a href="#cb22-1"></a><span class="kw">library</span>(car)</span></code></pre></div>
<pre><code>## Loading required package: carData</code></pre>
<div class="sourceCode" id="cb24"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb24-1"><a href="#cb24-1"></a><span class="kw">leveneTest</span>(nyc<span class="op">$</span>CHOLESTEROLTOTAL, nyc<span class="op">$</span>GENDER, <span class="dt">center =</span> mean)</span></code></pre></div>
<pre><code>## Levene's Test for Homogeneity of Variance (center = mean)
## Df F value Pr(>F)
## group 1 0.0271 0.8692
## 1110</code></pre>
<p>Like with the Shapiro-Wilk, a significant p < .05 means this does not match the assumption of equality of variance.</p>
</div>
<div id="t-test" class="slide section level2">
<h1>T Test</h1>
<p>T Test is used for comparing the means between two normally distributed groups. The null hypothesis says there is no difference between means of the groups.</p>
<p>First we will review assessing normality.</p>
<div class="sourceCode" id="cb26"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb26-1"><a href="#cb26-1"></a><span class="kw">par</span>(<span class="dt">mfrow =</span> <span class="kw">c</span>(<span class="dv">1</span>,<span class="dv">2</span>))</span>
<span id="cb26-2"><a href="#cb26-2"></a><span class="kw">library</span>(psych)</span></code></pre></div>
<pre><code>##
## Attaching package: 'psych'</code></pre>
<pre><code>## The following object is masked from 'package:car':
##
## logit</code></pre>
<div class="sourceCode" id="cb29"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb29-1"><a href="#cb29-1"></a><span class="kw">library</span>(dplyr)</span></code></pre></div>
<pre><code>##
## Attaching package: 'dplyr'</code></pre>
<pre><code>## The following object is masked from 'package:car':
##
## recode</code></pre>
<pre><code>## The following objects are masked from 'package:pastecs':
##
## first, last</code></pre>
<pre><code>## The following objects are masked from 'package:stats':
##
## filter, lag</code></pre>
<pre><code>## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union</code></pre>
<div class="sourceCode" id="cb35"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb35-1"><a href="#cb35-1"></a><span class="kw">by</span>( nyc<span class="op">$</span>CHOLESTEROLTOTAL,nyc<span class="op">$</span>GENDER, hist)</span></code></pre></div>
<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABgAAAASACAYAAAA5wYaaAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAAA4ZVhJZk1NACoAAAAIAAGHaQAEAAAAAQAAABoAAAAAAAKgAgAEAAAAAQAABgCgAwAEAAAAAQAABIAAAAAARCcTNgAAQABJREFUeAHs3Qm8XdO9OPBfBhmIBGlqVpEOhsZQNEWLmp4hpX1oqdZDlbZo1dCi1RGlNb7y0BZFUZ62VBWlXkUjaV5ViqKGRoQ8aopESCJy/mft/u917xnuPefec07OOfnuz+f07GGttdf+rhNdd//2XmtALr+EhQABAgQIECBAgAABAgQIECBAgAABAgQIEGgrgYFtdTUuhgABAgQIECBAgAABAgQIECBAgAABAgQIEMgEBAD8EAgQIECAAAECBAgQIECAAAECBAgQIECAQBsKCAC0YaO6JAIECBAgQIAAAQIECBAgQIAAAQIECBAgIADgN0CAAAECBAgQIECAAAECBAgQIECAAAECBNpQQACgDRvVJREgQIAAAQIECBAgQIAAAQIECBAgQIAAAQEAvwECBAgQIECAAAECBAgQIECAAAECBAgQINCGAgIAbdioLokAAQIECBAgQIAAAQIECBAgQIAAAQIECAgA+A0QIECAAAECBAgQIECAAAECBAgQIECAAIE2FBAAaMNGdUkECBAgQIAAAQIECBAgQIAAAQIECBAgQEAAwG+AAAECBAgQIECAAAECBAgQIECAAAECBAi0oYAAQBs2qksiQIAAAQIECBAgQIAAAQIECBAgQIAAAQICAH4DBAgQIECAAAECBAgQIECAAAECBAgQIECgDQUEANqwUV0SAQIECBAgQIAAAQIECBAgQIAAAQIECBAQAPAbIECAAAECBAgQIECAAAECBAgQIECAAAECbSggANCGjeqSCBAgQIAAAQIECBAgQIAAAQIECBAgQICAAIDfAAECBAgQIECAAAECBAgQIECAAAECBAgQaEMBAYA2bFSXRIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBAD8BggQIECAAAECBAgQIECAAAECBAgQIECAQBsKCAC0YaO6JAIECBAgQIAAAQIECBAgQIAAAQIECBAgIADgN0CAAAECBAgQIECAAAECBAgQIECAAAECBNpQQACgDRvVJREgQIAAAQIECBAgQIAAAQIECBAgQIAAAQEAvwECBAgQIECAAAECBAgQIECAAAECBAgQINCGAgIAbdioLokAAQIECBAgQIAAAQIECBAgQIAAAQIECAgA+A0QIECAAAECBAgQIECAAAECBAgQIECAAIE2FBAAaMNGdUkECBAgQIAAAQIECBAgQIAAAQIECBAgQEAAwG+AAAECBAgQIECAAAECBAgQIECAAAECBAi0oYAAQBs2qksiQIAAAQIECBAgQIAAAQIECBAgQIAAAQICAH4DBAgQIECAAAECBAgQIECAAAECBAgQIECgDQUEANqwUV0SAQIECBAgQIAAAQIECBAgQIAAAQIECBAQAPAbIECAAAECBAgQIECAAAECBAgQIECAAAECbSggANCGjeqSCBAgQIAAAQIECBAgQIAAAQIECBAgQICAAIDfAAECBAgQIECAAAECBAgQIECAAAECBAgQaEMBAYA2bFSXRIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBAD8BggQIECAAAECBAgQIECAAAECBAgQIECAQBsKCAC0YaO6JAIECBAgQIAAAQIECBAgQIAAAQIECBAgIADgN0CAAAECBAgQIECAAAECBAgQIECAAAECBNpQQACgDRvVJREgQIAAAQIECBAgQIAAAQIECBAgQIAAAQEAvwECBAgQIECAAAECBAgQIECAAAECBAgQINCGAgIAbdioLokAAQIECBAgQIAAAQIECBAgQIAAAQIECAgA+A0QIECAAAECBAgQIECAAAECBAgQIECAAIE2FBAAaMNGdUkECBAgQIAAAQIECBAgQIAAAQIECBAgQEAAwG+AAAECBAgQIECAAAECBAgQIECAAAECBAi0oYAAQBs2qksiQIAAAQIECBAgQIAAAQIECBAgQIAAAQICAH4DBAgQIECAAAECBAgQIECAAAECBAgQIECgDQUEANqwUV0SAQIECBAgQIAAAQIECBAgQIAAAQIECBAQAPAbIECAAAECBAgQIECAAAECBAgQIECAAAECbSggANCGjeqSCBAgQIAAAQIECBAgQIAAAQIECBAgQICAAIDfAAECBAgQIECAAAECBAgQIECAAAECBAgQaEMBAYA2bFSXRIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBAD8BggQIECAAAECBAgQIECAAAECBAgQIECAQBsKCAC0YaO6JAIECBAgQIAAAQIECBAgQIAAAQIECBAgIADgN0CAAAECBAgQIECAAAECBAgQIECAAAECBNpQQACgDRvVJREgQIAAAQIECBAgQIAAAQIECBAgQIAAAQEAvwECBAgQIECAAAECBAgQIECAAAECBAgQINCGAgIAbdioLokAAQIECBAgQIAAAQIECBAgQIAAAQIECAgA+A0QIECAAAECBAgQIECAAAECBAgQIECAAIE2FBAAaMNGdUkECBAgQIAAAQIECBAgQIAAAQIECBAgQEAAwG+AAAECBAgQIECAAAECBAgQIECAAAECBAi0oYAAQBs2qksiQIAAAQIECBAgQIAAAQIECBAgQIAAAQICAH4DBAgQIECAAAECBAgQIECAAAECBAgQIECgDQUEANqwUV0SAQIECBAgQIAAAQIECBAgQIAAAQIECBAQAPAbIECAAAECBAgQIECAAAECBAgQIECAAAECbSggANCGjeqSCBAgQIAAAQIECBAgQIAAAQIECBAgQICAAIDfAAECBAgQIECAAAECBAgQIECAAAECBAgQaEOBwW14TS6JwDIp8Nxzz8WPf/zjomvfa6+9Yvz48UX7S+24/PLLY9asWd0OrbHGGnHIIYd02/fUU0/FFVdc0W1f2jjxxBNj0KBBRfvtILAsCcyfPz/uuOOO+NOf/pR9/va3v8Waa64Z73nPe7LPJptsEh/96EfrSjJz5sy48sori85x0kknxcCB/Y/9V1r+k08+GT/72c+K6lG449hjj43hw4cX7m7K7SeeeCKuueaaXuv2la98JYYMGdJrOgkIECBAgEBfBfT/+yonH4HaCuj/v/X3hf6//n9t/3UprVYCA3L5pVaFKYcAgaUn8Ne//jU23XTTogqkm4Cf+tSnivaX2vGhD30o/vjHP3Y79P73vz+7idl156RJk2K77bbruitbX7hw4VK54bVgwYI488wzI9W/VL2KKmoHgToJPPzww9nN/UcffbTsGdLvNP0bqudy1113xfbbb190ijfeeCMGD+5/7L/S8n//+9/HTjvtVFSPwh0vvPBCjB49unB3U27fcsstsfvuu/dat3nz5sWIESN6TScBAQIECBDoq4D+v/5/X3878tVOQP+/+98X+v/6/7X716WkWgq8FaarZanKIkCAQIMEfvnLX8YGG2wQJ598crz22msNOqvTECgWWLRoUeyzzz7R083/lGuzzTYrzmwPAQIECBAgQIBARQL6/xUxSdQAAf3/BiA7BQECNRHo/2OANamGQggQIFCdwIMPPhhf+tKX4s4776wuo9QE6iSQ3p556KGHei39fe97X69pJCBAgAABAgQIEOguoP/f3cPW0hfQ/1/6baAGBAhUJiAAUJmTVAQINJlAGu7ozTffbLJaqc6yLDBlypSSl3/CCSfEvvvumw29k8bEnDBhQsl0y8rOt7/97bHDDjt0u9yhQ4d2227mjbXWWisOPvjgblVMQ60tXry42z4bBAgQIECAQG0F9P9r66m0/gvo/1dmqP9fmZNUBOopIABQT11lE2hTgXe/+93xk5/8pOjqajG2eFGhZXa4+V8Gxu6lJpDGsS9cttxyy/je977XuXvjjTfuXF9WVzbaaKOKJtFtVp80qfqll17arXrXXXedAEA3ERsECBAg0G4C+v/t1qKupxYC+v+VKer/V+YkFYF6CggA1FNX2QTaVGC11VaLz3zmM216dS6LQN8E5s6dW5Rx3XXXLdpnBwECBAgQIECg1QT0/1utxdS3EQL6/41Qdg4CBGohIABQC0VlECBQlcCcOXPiqaeeipkzZ2bD+Ky66qqR/qhYffXVY9iwYVWVVYvEzz77bFafp59+OtLriekJ31GjRtWi6Hj55Zfj3nvvjddffz3SzeD3vve9MWDAgJqU3VFIehti6tSpkTqg73nPe2K99dbrOFTye968eTF79uzs889//jNWWGGFWGWVVWLMmDHxrne9q2Sevux8/PHH4+GHH4405v2aa67ZYxFp+JT77rsvUhuktBtuuGGMGDGixzy1Olir9l+yZElRlYYMGVK0r1Y7XnrppfjLX/4S6RxbbLFFLL/88rUqOiun3uXXtLIKI0CAAAECBJpaQP9f/7/wB6r/XyjS+3a9++f1Lr/3K5SCAIG6CeQsBAi0hcD06dNz+f9QFH3yY1NXfH0f/OAHi/K///3vL8qfH+swl79RXvRZtGhRUdqOHS+++GLuxBNPzK28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IECAAAECBAgQIECAQKsICAC0SkupJwECBAgQIECAAAECBAgQIECAAAECBAgQqEJAAKAKLEkJECBAgAABAgQIECBAgAABAgQIECBAgECrCAgAtEpLqScBAgQIECBAgAABAgQIECBAgAABAgQIEKhCQACgCixJCRAgQIAAAQIECBAgQIAAAQIECBAgQIBAqwgIALRKS6knAQIECBAgQIAAAQIECBAgQIAAAQIECBCoQkAAoAosSQkQIECAAAECBAgQIECAAAECBAgQIECAQKsICAC0SkupJwECBAgQIECAAAECBAgQIECAAAECBAgQqEJAAKAKLEkJECBAgAABAgQIECBAgAABAgQIECBAgECrCAgAtEpLqScBAgQIECBAgAABAgQIECBAgAABAgQIEKhCQACgCixJCRAgQIAAAQIECBAgQIAAAQIECBAgQIBAqwgIALRKS6knAQIECBAgQIAAAQIECBAgQIAAAQIECBCoQkAAoAosSQkQIECAAAECBAgQIECAAAECBAgQIECAQKsICAC0SkupJwECBAgQIECAAAECBAgQIECAAAECBAgQqEJAAKAKLEkJECBAgAABAgQIECBAgAABAgQIECBAgECrCAgAtEpLqScBAgQIECBAgAABAgQIECBAgAABAgQIEKhCQACgCixJCRAgQIAAAQIECBAgQIAAAQIECBAgQIBAqwgIALRKS6knAQIECBAgQIAAAQIECBAgQIAAAQIECBCoQkAAoAosSQkQIECAAAECBAgQIECAAAECBAgQIECAQKsICAC0SkupJwECBAgQIECAAAECBAgQIECAAAECBAgQqEJAAKAKLEkJECBAgAABAgQIECBAgAABAgQIECBAgECrCAgAtEpLqScBAgQIECBAgAABAgQIECBAgAABAgQIEKhCQACgCixJCRAgQIAAAQIECBAgQIAAAQIECBAgQIBAqwgIALRKS6knAQIECBAgQIAAAQIECBAgQIAAAQIECBCoQkAAoAosSQkQIECAAAECBAgQIECAAAECBAgQIECAQKsICAC0SkupJwECBAgQIECAAAECBAgQIECAAAECBAgQqEJAAKAKLEkJECBAgAABAgQIECBAgAABAgQIECBAgECrCAgAtEpLqScBAgQIECBAgAABAgQIECBAgAABAgQIEKhCQACgCixJCRAgQIAAAQIECBAgQIAAAQIECBAgQIBAqwgIALRKS6knAQIECBAgQIAAAQIECBAgQIAAAQIECBCoQkAAoAosSQkQIECAAAECBAgQIECAAAECBAgQIECAQKsICAC0SkupJwECBAgQIECAAAECBAgQIECAAAECBAgQqEJAAKAKLEkJECBAgAABAgQIECBAgAABAgQIECBAgECrCAgAtEpLqScBAgQIECBAgAABAgQIECBAgAABAgQIEKhCQACgCixJCRAgQIAAAQIECBAgQIAAAQIECBAgQIBAqwgIALRKS6knAQIECBAgQIAAAQIECBAgQIAAAQIECBCoQkAAoAosSQkQIECAAAECBAgQIECAAAECBAgQIECAQKsICAC0SkupJwECBAgQIECAAAECBAgQIECAAAECBAgQqEJAAKAKLEkJECBAgAABAgQIECBAgAABAgQIECBAgECrCAgAtEpLqScBAgQIECBAgAABAgQIECBAgAABAgQIEKhCQACgCixJCRAgQIAAAQIECBAgQIAAAQIECBAgQIBAqwgIALRKS6knAQIECBAgQIAAAQIECBAgQIAAAQIECBCoQkAAoAosSQkQIECAAAECBAgQIECAAAECBAgQIECAQKsICAC0SkupJwECBAgQIECAAAECBAgQIECAAAECBAgQqEJAAKAKLEkJECBAgAABAgQIECBAgAABAgQIECBAgECrCAgAtEpLqScBAgQIECBAgAABAgQIECBAgAABAgQIEKhCQACgCixJCRAgQIAAAQIECBAgQIAAAQIECBAgQIBAqwgIALRKS6knAQIECBAgQIAAAQIECBAgQIAAAQIECBCoQkAAoAosSQkQIECAAAECBAgQIECAAAECBAgQIECAQKsICAC0SkupJwECBAgQIECAAAECBAgQIECAAAECBAgQqEJAAKAKLEkJECBAgAABAgQIECBAgAABAgQIECBAgECrCAxulYqqJwECBAgQIECAAAECBFpdYPbs2fHSSy/Fa6+9ln2GDRsWo0aNipEjR8bo0aMjbVsIECBAgAABAgQI1EpAAKBWksohQIAAAQIECBAgQIBAgcC8efPiiiuuiKuuuioefPDBSNvllsGDB8f48eNjwoQJMXHixNh9991jwIAB5ZLbT4AAAQIECBAgQKBXgQG5/NJrKgkIECBAgAABAgQIECBAoGKB5557Lr7zne/ElVde2eNN/54KfO973xunn3567LHHHj0lc4wAAQIECBAgQIBAWQEBgLI0DhAgQIAAAQIECBAgQKB6gZdffjm22267eOCBBzozpyf5V1999VhnnXVizJgxMXz48Bg6dGgsXrw4FixYEHPnzo1Zs2bFzJkzY+HChZ35Bg4cGGeddVYcffTRnfusECBAgAABAgQIEKhUQACgUinpCBAgQIAAAQIECBAg0IvA/PnzY+edd44pU6ZkKbfccss45phjYscdd8xu/PeSPd54442YNm1aNmzQZZddlm2nPDfffHM2JFBv+R0nQIAAAQIECBAg0FVAAKCrhnUCBAgQIECAAAECBAj0QyDdtD/kkEOyEvbbb79s7P/0FH9flt/+9rfx0Y9+NAsCpLkBpk+fHn0tqy/nl4cAAQIECBAgQKD1BfrWE23963YFBAgQIECAAAECBAgQqLnAPffck5W58cYbZ0/x9+eGfZoE+Mwzz8zKS8MJzZgxo+b1VSABAgQIECBAgEB7CwgAtHf7ujoCBAgQIECAAAECBBooMHny5OxsH/nIR2K55Zbr95n33nvvzjIeffTRznUrBAgQIECAAAECBCoREACoREkaAgQIECBAgAABAgQIVCDw9NNPZ6nWXnvtClL3nmT06NGdgYTXX3+99wxSECBAgAABAgQIEOgiIADQBcMqAQIECBAgQIAAAQIE+iMwbty4LHvHJMD9KSvlTUMKpYmB07LZZptl3/6HAAECBAgQIECAQKUCAgCVSklHgAABAgQIECBAgACBXgQ233zzLMW1114bd911Vy+pez48Z86cOPbYY7NEq6yySowdO7bnDI4SIECAAAECBAgQKBAQACgAsUmAAAECBAgQIECAAIG+Cpx44onZkD0LFiyIvfbaKy6++OJYtGhR1cVNnz49dtlll0jfafnc5z5XdRkyECBAgAABAgQIEBiQyy8YCBAgQIAAAQIECBAgQKA2AmeeeWYcf/zxnYWtuOKKsd1228Wmm26aPcW/6qqrxvDhw2PYsGGxePHiSMGCuXPnxqxZs+Lxxx+PSZMmxYMPPtiZPwUCbrnllhg40PNbnShWCBAgQIAAAQIEKhIQAKiISSICBAgQIECAAAECBAhULnDZZZfFEUccEf2duHfXXXeNq666KtIQQBYCBAgQIECAAAEC1QoIAFQrJj0BAgQIECBAgAABAgQqEHj++efj3HPPjUsvvTSeffbZCnL8K8nQoUMj3fg/9NBDY+LEiRXnk5AAAQIECBAgQIBAoYAAQKGIbQIECBAgQIAAAQIECNRY4Mknn4ypU6fGY489lg3388orr8S8efOy+QJGjBgRI0eOjHHjxsWGG24Ym2yySaR9FgIECBAgQIAAAQL9FRAA6K+g/AQIECBAgAABAgQIECBAgAABAgQIECBAoAkFzCLVhI2iSgQIECBAgAABAgQIECBAgAABAgQIECBAoL8Cg/tbgPwECBAgQIAAAQIECBAg0D+BN998M+6+++6skHe84x0xduzY/hUoNwECBAgQIECAAIG8gDcA/AwIECBAgAABAgQIECCwlAVeffXV+PCHP5x9LrnkkqVcG6cnQIAAAQIECBBoFwEBgHZpSddBgAABAgQIECBAgAABAgQIECBAgAABAgS6CBgCqAuGVQIECBAgQIAAAQIECPRH4PHHH4/FixdXXcS8efM687z44ovxyCOPdG53rKy//vodq74JECBAgAABAgQIVCQwIJdfKkopEQECBAgQIECAAAECBAj0KLD66qvHs88+22Oavh70p1tf5eQjQIAAAQIECCy7AoYAWnbb3pUTIECAAAECBAgQIECAAAECBAgQIECAQBsLGAKojRvXpREgQIAAAQIECBAg0FiBk08+OY499thYsGBBduIVV1wxdt999xgwYECPFVm0aFH88pe/zNJsuOGGsfHGG/eYvp4HX3rppZg6dWosWbKk36d54403YubMmXHkkUfG4MH+/Ow3qAIIECBAgAABAlUKGAKoSjDJCRAgQIAAAQIECBAg0JPAQw89FAcccEBMnz49S/Zv//Zvcemll8Yaa6xRNtsrr7wSK620Unb8a1/7Wpxyyill09b7wN57790ZjKjVuQ4//PC46KKLalWccggQIECAAAECBCoU8AhGhVCSESBAgAABAgQIECBAoBKB9AT/n/70p/j6178eZ511Vtx2220xfvz4uPDCC+PjH/94JUUs1TSf/vSnIz25X4s5B/72t7/FjBkz4u1vf/tSvSYnJ0CAAAECBAgsqwICAMtqy7tuAgQIECBAgAABAgTqJjBkyJD4/ve/nw3/c+CBB8asWbPiE5/4RPz617+OCy64IEaNGlW3c/e34I9+9KORPrVYvvzlL8e5554bq6yySi2KUwYBAgQIECBAgECVAiYBrhJMcgIECBAgQIAAAQIECFQqsP3228f9998f+++/f5blqquuyt4GuPPOOystQjoCBAgQIECAAAECfRYQAOgznYwECBAgQIAAAQIECBDoXSCN7X/11VfHz372s+zJ//Q2wE477RTHHHNM52TBvZciBQECBAgQIECAAIHqBQQAqjeTgwCBZUBg4sSJkV7db7bP0KFD46tf/eoy0AIukQABAgQItJ9Amhg4vQ2w7bbbZuPrn3POObHFFlvEfffd134X64oIEFjqAr/73e9i5MiRTfc3TeHfWGmIsD//+c9L3UsFCBAg0K4C5gBo15Z1XQQI9Evgf/7nf7LJ7/pVSJ0y33XXXXUqWbEECBAgQIBAvQXWWWedSP2MND/AN77xjUiT5E6YMCGOPfbYep9a+QQILGMCaTLyefPmNf1Vv/zyy/GXv/wlC4g2fWVVkAABAi0oIADQgo2mygQINE7g97//fQwbNqxxJ+zhTOkGwWGHHdZDCocIECBAgACBVhAYOHBgnHDCCbHLLrtEeivgkUceidNPP70Vqq6OBAi0oMBBBx0Un/3sZ5uy5meccUY2OXpTVk6lCBAg0CYCAgBt0pAugwCB+ggMHjw40qcZlkGDBjVDNdSBAAECBAgQqJHA+973vuyp1+OPPz4uuOCCGpWqGAIECHQXSEHHZvmbpnvNIlLdLAQIECBQX4HmuKtV32tUOgECBAgQIECAAAECBJpSYPjw4XH++efHHnvsETfeeGNWx/e///1NWVeVIkCAAAECBAgQaD0BAYDWazM1JkCAAAECBAgQIECgzQR22223SB8LAQIECBAgQIAAgVoKeNeqlprKIkCAAAECBAgQIECAAAECBAgQIECAAAECTSIgANAkDaEaBAgQIECAAAECBAgQIECAAAECBAgQIECglgICALXUVBYBAgQIECBAgAABAgQIECBAgAABAgQIEGgSAQGAJmkI1SBAgAABAgQIECBAgAABAgQIECBAgAABArUUEACopaayCBAgQIAAAQIECBAgQIAAAQIECBAgQIBAkwgMbpJ6qAYBAgQIECBAgAABAgRaXmDMmDGRy+Xqch0vvPBCXcpVKAECBAgQIECAQPsKCAC0b9u6MgIECBAgQIAAAQIEGizw0ksvxZIlSxp8VqcjQIAAAQIECBAgUFpAAKC0i70ECBAgQIAAAQIECBCoWuDuu++Ogw8+OB599NHOvKuttloMGjSoc9sKAQIECBAgQIAAgUYJCAA0Stp5CBAgQIAAAQIECBBoe4Gtt946pk6dGrvuumtMmzYtu95DDjkkTj311La/dhdIgAABAgQIECDQfAImAW6+NlEjAgQIECBAgAABAgRaWGDllVeO22+/PTbYYIPsKk4//fS48847W/iKVJ0AAQIECBAgQKBVBQQAWrXl1JsAAQIECBAgQIAAgaYVGDlyZFxyySUxcODAbE6AT3/60zF37tymra+KESBAgAABAgQItKeAAEB7tqurIkCAAAECBAgQIEBgKQtstdVWcdRRR2W1mD17dpx//vlLuUZOT4AAAQIECBAgsKwJCAAsay3uegkQIECAAAECBAgQaJhAGvt/7Nix2fnOPvvsePXVVxt2biciQIAAAQIECBAgYBJgvwECBAgQIECAAAECBAjUSWCFFVaIa665Jm666absDDNmzIjx48fX6WyKJUCAAAECBAgQINBdQACgu4ctAgQIECBAgAABAgQI1FRgwoQJkT4WAgQIECBAgAABAo0WMARQo8WdjwABAgQIECBAgAABAgQIECBAgAABAgQINEBAAKAByE5BgAABAgQIECBAgAABAgQIECBAgAABAgQaLSAA0Ghx5yNAgAABAgQIECBAgAABAgQIECBAgAABAg0QEABoALJTECBAgAABAgQIECBAgAABAgQIECBAgACBRgsIADRa3PkIECBAgAABAgQIECBAgAABAgQIECBAgEADBAQAGoDsFAQIECBAgAABAgQIECBAgAABAgQIECBAoNECAgCNFnc+AgQIECBAgAABAgQIECBAgAABAgQIECDQAAEBgAYgOwUBAgQIECBAgAABAgQIECBAgAABAgQIEGi0gABAo8WdjwABAgQIECBAgAABAgQIECBAgAABAgQINEBAAKAByE5BgAABAgQIECBAgAABAgQIECBAgAABAgQaLSAA0Ghx5yNAgAABAgQIECBAgAABAgQIECBAgAABAg0QEABoALJTECBAgAABAgQIECBAgAABAgQIECBAgACBRgsIADRa3PkIECBAgAABAgQIECBAgAABAgQIECBAgEADBAQAGoDsFAQIECBAgAABAgQIECBAgAABAgQIECBAoNECAgCNFnc+AgQIECBAgAABAgQIECBAgAABAgQIECDQAAEBgAYgOwUBAgQIECBAgAABAgQIECBAgAABAgQIEGi0gABAo8WdjwABAgQIECBAgAABAgQIECBAgAABAgQINEBAAKAByE5BgAABAgQIECBAgAABAgQIECBAgAABAgQaLSAA0Ghx5yNAgAABAgQIECBAgAABAgQIECBAgAABAg0QEABoALJTECBAgAABAgQIECBAgAABAgQIECBAgACBRgsIADRa3PkIECBAgAABAgQIECBAgAABAgQIECBAgEADBAQAGoDsFAQIECBAgAABAgQIECBAgAABAgQIECBAoNECAgCNFnc+AgQIECBAgAABAgQIECBAgAABAgQIECDQAAEBgAYgOwUBAgQIECBAgAABAgQIECBAgAABAgQIEGi0gABAo8WdjwABAgQIECBAgAABAgQIECBAgAABAgQINEBgcAPO4RQECBAgUAOBRYsWZaU89NBDsd1229WgxNoVMWTIkPj+978fm222We0KVRIBAgQIECBAgAABAgQIECBAgEC/BAQA+sUnMwECBBon8Mwzz2QnmzdvXkyaNKlxJ67wTNdff70AQIVWkhEgQIAAAQIECBAgQIAAAQIEGiEgANAIZecgQIBADQRyuVxWyrrrrn0AVyoAAEAASURBVBsnnHBCDUqsTRG33npr3HDDDbFkyZLaFKgUAgQIECBAgAABAgQIECBAgACBmggIANSEUSEECBBonMAKK6zQVE/a33///Y27eGciQIAAAQIECBAgQIAAAQIECBCoWMAkwBVTSUiAAAECBAgQIECAAAECBAgQIECAAAECBFpHQACgddpKTQkQIECAAAECBAgQIECAAAECBAgQIECAQMUCAgAVU0lIgAABAgQIECBAgAABAgQIECBAgAABAgRaR8AcAK3TVmpKoG0F5s+f33QTyHZMuNu26C6MAAECBAgQIECAAAECBAgQIECg7QUEANq+iV0ggeYWOPnkk+OUU05p7kqqHQECBAgQIECAAAECBAgQIECAAIEWFBAAaMFGU2UC7SQwffr07HKGDh0agwYNappLe+2115qmLipCgAABAgQIECBAgAABAgQIECBAoC8CAgB9UZOHAIGaC5x22mnxwQ9+sObl9rXACRMm9DWrfAQIECBAgAABAgQIECBAgAABAgSaQsAkwE3RDCpBgAABAgQIECBAgAABAgQIECBAgAABAgRqKyAAUFtPpREgQIAAAQIECBAgQIAAAQIECBAgQIAAgaYQEABoimZQCQIECBAgQIAAAQIECBAgQIAAAQIECBAgUFsBAYDaeiqNAAECBAgQIECAAAECBAgQIECAAAECBAg0hYAAQFM0g0oQIECAAAECBAgQIECAAAECBAgQIECAAIHaCggA1NZTaQQIECBAgAABAgQIECBAgAABAgQIECBAoCkEBACaohlUggABAgQIECBAgAABAgQIECBAgAABAgQI1FZAAKC2nkojQIAAAQIECBAgQIAAAQIECBAgQIAAAQJNISAA0BTNoBIECBAgQIAAAQIECBAgQIAAAQIECBAgQKC2AgIAtfVUGgECBAgQIECAAAECBAgQIECAAAECBAgQaAoBAYCmaAaVIECAAAECBAgQIECAAAECBAgQIECAAAECtRUQAKitp9IIECBAgAABAgQIECBAgAABAgQIECBAgEBTCAgANEUzqAQBAgQIECBAgAABAgQIECBAgAABAgQIEKitgABAbT2VRoAAAQIECBAgQIAAAQIECBAgQIAAAQIEmkJAAKApmkElCBAgQIAAAQIECBAgQIAAAQIECBAgQIBAbQUEAGrrqTQCBAgQIECAAAECBAgQIECAAAECBAgQINAUAgIATdEMKkGAAAECBAgQIECAAAECBAgQIECAAAECBGorIABQW0+lESBAgAABAgQIECBAgAABAgQIECBAgACBphAQAGiKZlAJAgQIECBAgAABAgQIECBAgAABAgQIECBQWwEBgNp6Ko0AAQIECBAgQIAAAQIECBAgQIAAAQIECDSFwOCmqIVKECBAgAABAgQIECBAYBkQmD17drz00kvx2muvZZ9hw4bFqFGjYuTIkTF69OhI2xYCBAgQIECAAAECtRIQAKiVpHIIECBAgAABAgQIECBQIDBv3ry44oor4qqrrooHH3ww0na5ZfDgwTF+/PiYMGFCTJw4MXbfffcYMGBAueT2EyBAgAABAgQIEOhVwBBAvRJJQIAAAQIECBAgQIAAgeoEnnvuuTjiiCNizTXXjCOPPDKmTJnS483/VPrixYvjvvvui4suuigLAGy88cZx8803V3diqQkQIECAAAECBAh0EfAGQBcMqwQIECBAgAABAgQIEOivwMsvvxw777xzPPDAA51FpSf5V1999VhnnXVizJgxMXz48Bg6dGh203/BggUxd+7cmDVrVsycOTMWLlyY5UtvDOy5555x1llnxdFHH91ZlhUCBAgQIECAAAEClQoIAFQqJR0BAgQIECBAgAABAgR6EZg/f37ssccenTf/t9xyyzjmmGNixx13zG7895I93njjjZg2bVo2bNBll12WbX/5y1+Od7/73dmQQL3ld5wAAQIECBAgQIBAVwFDAHXVsE6AAAECBAgQIECAAIF+CFx33XXZcD+piP322y+mTp2afaen/itZlltuudhmm23i4osvjhtuuCHSdlpOOOGEWLJkSSVFSEOAAAECBAgQIECgU0AAoJPCCgECBAgQIECAAAECBPoncM8992QFpPH70+S/Awf2/U+uNAnwmWeemZWXhhOaMWNG/yonNwECBAgQIECAwDIn0Pfe6DJH5YIJECBAgAABAgQIECDQs8DkyZOzBB/5yEc6n97vOUfPR/fee+/OBI8++mjnuhUCBAgQIECAAAEClQgIAFSiJA0BAgQIECBAgAABAgQqEHj66aezVGuvvXYFqXtPMnr06M5Awuuvv957BikIECBAgAABAgQIdBEQAOiCYZUAAQIECBAgQIAAAQL9ERg3blyWfcqUKf0ppjNvGlIoTQycls0226xzvxUCBAgQIECAAAEClQgIAFSiJA0BAgQIECBAgAABAgQqENh8882zVNdee23cddddFeQon2TOnDlx7LHHZglWWWWVGDt2bPnEjhAgQIAAAQIECBAoISAAUALFLgIECBAgQIAAAQIECPRF4MQTT8yG7FmwYEHstddecfHFF8eiRYuqLmr69Omxyy67RPpOy+c+97mqy5CBAAECBAgQIECAwGAEBAgQIECAAAECBAgQIFAbgTQE0GmnnRbHH398vPLKK9mN+7S+3Xbbxaabbpo9xb/qqqvG8OHDY9iwYbF48eJIwYK5c+fGrFmz4vHHH49JkybFgw8+2FmhFAj47ne/27lthQABAgQIECBAgEClAgIAlUpJR4AAAQIECBAgQIAAgQoEjjvuuEiT9x5xxBGRJu6dN29e/OY3v8k+FWTvlmTXXXeNq666KgYO9PJ2NxgbBJaywGuvvRbnnntu9u97KVel7OknT55c9pgDBAgQILDsCAgALDtt7UoJECBAgAABAgQIEGiQwMEHHxwTJ07MbhBeeuml8eyzz1Z85qFDh0a68X/ooYdmZVScUUICBBomcMMNN8TXvva1hp3PiQgQIECAQF8FBAD6KicfAQIECBAgQIAAAQIEehAYM2ZMnHrqqdnnySefjKlTp8Zjjz2WDfeThgdKbwYst9xyMWLEiBg5cmSk4YM23HDD2GSTTbJ9PRTtEAECS1mgY26P9ddfP3bYYYelXJvSp7/xxhvjmWeeKX3QXgIECBBYZgQEAJaZpnahBAgQIECAAAECBAgsLYF111030sdCgEB7CaTA3X/8x3805UVNmzZNAKApW0alCBAg0FgBA0k21tvZCBAgQIAAAQIECBAgQIAAAQIECBAgQIBAQwS8AdAQZichQIAAAQIECBAgQGBZFli4cGGksf2rXV588cVsIuGUb6211qo2u/QECBAgQIAAAQLLuIA3AJbxH4DLJ0CAAAECBAgQIECgPgLXX3997LbbbrHqqqvG8OHDY4MNNogDDzwwJk+eXPEJDzrooFh77bWzT8WZJCRAgAABAgQIECDw/wUEAPwUCBAgQIAAAQIECBAgUEOB+fPnZ2OC77vvvnHrrbfGP//5z8jlcvHII4/ElVdeGdtuu20cc8wxnU/21/DUiiJAgAABAgQIECDQTUAAoBuHDQIECBAgQIAAAQIECPRP4KSTToorrriis5AVVlghxo4dGwMGDMj2LVmyJM4555zYdNNNY8aMGZ3prBAgQIAAAQIECBCotYAAQK1FlUeAAAECBAgQIECAwDIrMH369Ljggguy609D/9x4440xd+7c+Mc//hEvv/xyfP/7349Ro0Zlxx999NHYfvvtBQGW2V+LCydAgAABAgQI1F9AAKD+xs5AgAABAgQIECBAgMAyInDhhRfGm2++GYMHD47bbrst9txzzxg48F9/dqUb/8cff3w8/PDDsckmm2QiTz31VOy4447x3HPPLSNCLpMAAQIECBAgQKCRAoMbeTLnIkCAAAECBAgQIECAQDsLpJv7afnkJz/ZeZO/8HpXX331mDRpUhYcuOuuu7I3APbYY49I62m4oKW9nH322XHeeedFGqqov8ucOXOyImbNmtXfouQnQIAAAQIECBDog4AAQB/QZCFAgAABAgQIECBAgEApgb///e/Z7s0337zU4c59I0eOjFtuuSV7+n/KlClx7733xsc//vH49a9/HYMGDepMtzRWUhAjvZlQy2XevHm1LE5ZBAgQIECAAAECFQoIAFQIJRkBAgQIECBAgAABAgR6E1i0aFGWZPnll+8taQwfPjy74b/VVlvF448/Hr/97W/jqKOOiv/6r//qNW89E1x88cXxrW99K3K5XL9Pk8q55JJLYsMNN+x3WQogQIAAAQIECBCoXkAAoHozOQgQIECAAAECBAgQIFBS4F3velf87//+bzz00EMljxfufNvb3ha33nprpCDA888/H2kOgXe+851xzDHHFCZt2Haas2DNNdesyflWXHHFmpSjEAIECBAgQIAAgb4JmAS4b25yESBAgAABAgQIECBAoEggBQDSctVVV8VLL71UdLzUjnHjxmVvAqQ3AtJy3HHHxRVXXFEqqX0ECBAgQIAAAQIEqhIQAKiKS2ICBAgQIECAAAECBAiUF0iT/6bln//8ZzYR8HPPPVc+cZcjH/jAB7KgQXr6Pg29c/DBB8e3v/3tmkzE2+U0VgkQIECAAAECBJYxAQGAZazBXS4BAgQIECBAgAABAvUT2GOPPWKnnXbKTnDbbbfFBhtskN3MP//883s96cc+9rFs/P8BAwZkN/7T+PlpeCALAQIECBAgQIAAgb4KmAOgr3I1yjd79uzs1eDXXnst0mfYsGExatSoGDlyZIwePTrbrtGpFEOAAAECBAgQIECAQAME0iS6H/3oR+OBBx6Il19+OX76059m8wIceeSRvZ798MMPj6FDh8ZnP/vZWLx4sTcAehWTgAABAgQIECBAoCcBAYCedOpwbN68edl4nmlM0AcffDDSdrll8ODBMX78+JgwYUJMnDgxdt9990hPA1kIECBAgAABAgQIEGhegfXWWy+mTZuWjeWfbv7Pnz8/1lhjjYorfNBBB8UWW2wRX/jCF+Luu++uOJ+EBAgQIECAAAECBAoFDAFUKFKn7TT25xFHHBFrrrlmpCd/pkyZ0uPN/1SN9MTPfffdFxdddFEWANh4443j5ptvrlMNFUuAAAECBAgQIECAQK0E0pu9adifOXPmZH3/NLFvNct73/vemDRpUlx++eWR5gdIbwhbCBAgQIAAAQIECFQr4A2AasX6kD699rvzzjtnrwB3ZE9P8q+++uqxzjrrxJgxY2L48OHZq77ppv+CBQti7ty5MWvWrJg5c2YsXLgwy5beGNhzzz3jrLPOiqOPPrqjKN8ECBAgQIAAAQIECDSpQHqrN93A7+ty4IEHRvpYCBAgQIAAAQIECPRFQACgL2pV5Emv+6aJwNL4n2nZcsst45hjjokdd9wxu/HfW1FvvPFG9vrwFVdcEZdddlmk7S9/+cvx7ne/OxsSqLf8jhMgQIAAAQIECBAgQIAAAQIECBAgQIDAsilgCKA6t/t1112XvfKbTrPffvvF1KlTs+/01H8ly3LLLRfbbLNNpInEbrjhhkjbaTnhhBNMCFYJoDQECBAgQIAAAQIECBAgQIAAAQIECBBYRgUEAOrc8Pfcc092hjR+f3qKf+DAvpOnSYDPPPPMrLz0RsGMGTPqXHvFEyBAgAABAgQIECBAgAABAgQIECBAgECrCvT9bnSrXnGD6z158uTsjB/5yEc6n97vTxX23nvvzuyPPvpo57oVAgQIECBAgAABAgQIECBAgAABAgQIECDQVUAAoKtGHdaffvrprNS11167JqWPHj26M5Dw+uuv16RMhRAgQIAAAQIECBAgQIAAAQIECBAgQIBA+wmYBLjObTpu3LiYPn16Ng/A4Ycf3u+zpSGF0kTAadlss836XZ4CCBAgQIAAAQIECBConUCa6yuXy9WuwC4lvfDCC122rBIgQIAAAQIECBDoXUAAoHejfqXYfPPNswDAtddeGwcffHBst912fS5vzpw5ceyxx2b5V1lllRg7dmyfy5KRAAECBAgQIECAAIHaC7z00kuxZMmS2hesRAIECBAgQIAAAQJ9EBAA6ANaNVlOPPHEbPLfBQsWxF577RVnnHFGFggYMmRINcVkQYTDDjss+04ZP/e5z1WVX2ICBAgQIECAAAECBOovcPfdd2f9/a7zda222moxaNCg+p/cGQgQIECAAAECBAgUCAgAFIDUejMNAXTaaafF8ccfH6+88kp24z6tpzcBNt100+wp/lVXXTWGDx8ew4YNi8WLF0cKFsydOzdmzZoVjz/+eEyaNCkefPDBzqrtsssu8d3vfrdz2woBAgQIECBAgAABAs0hsPXWW8fUqVNj1113jWnTpmWVOuSQQ+LUU09tjgqqBQECBAgQIECAwDIlIADQgOY+7rjjIk3ee8QRR0SauHfevHnxm9/8JvtUe/r0h8RVV10VAweav7laO+kJECBAgAABAgQINEJg5ZVXjttvvz0+8IEPxMMPPxynn3567LjjjrHDDjs04vTOQYAAAQIECBAgQKBTwF3kTor6rqTx/2fOnBknnXRSpFeAq1mGDh2aDR900003xS233BJp/H8LAQIECBAgQIAAAQLNKzBy5Mi45JJLsgd30pwAn/70p7O3fJu3xmpGgAABAgQIECDQjgLeAGhgq44ZMyZ79Te9/vvkk09mrwY/9thj2R8CaXig9GbAcsstFyNGjIj0B0MaPmjDDTeMTTbZJNvXwKp2O9UvfvGL7I+XXC7XbX9fNtJ1PvXUU/Hzn/88PvjBD/alCHkIECBAgAABAgQItITAVlttFUcddVScd955MXv27Dj//POzB4JaovIqSYAAAQIECBAg0BYCAgBLqRnXXXfdSJ9WWK655prszYNa1vVHP/qRAEAtQZVFgAABAgQIECDQlALp4Z9f//rXMWPGjDj77LPji1/84lJ9uKcpkVSKAAECBAgQIECgbgICAHWjbZ+Cf/KTn8Rhhx0W6dXl/i4XX3xx3HDDDbHZZpv1tyj5CRAgQIAAAQIECDS9wAorrBDpgZo0nGdaUiBg/PjxTV9vFSRAgAABAgQIEGgPAQGAJm3H5557Lh566KFI3+uvv35stNFG2fBAS6O6K620Uuyyyy41OfVtt92WlTNgwICalKcQAgQIECBAgAABAs0uMGHChEgfCwECBAgQIECAAIFGCwgANFA8PUH/6KOPxr333huLFi2KTTfdtOhJ+KeffjobF/Tqq6+ON998s7N2Q4YMif333z/+8z//M5sfoPOAFQIECBAgQIAAAQIECBAgQIAAAQIECBAgUEJAAKAESj12TZ8+PT75yU/Gww8/3K34nXfeOa699tpYeeWV45lnnontttsu/vGPf3RLkzZSwODyyy+PP/zhD3H99dfHFltsUZTGDgIECBAgQIAAAQIECBAgQIAAAQIECBAg0CEgANAhUcfvNOnXvvvum93ELzzN7bffHrvttlvcc889cdBBB3Xe/F9jjTWySXLXW2+9eOKJJ2LSpEnZcEAzZ86M/fbbLx544IEYPnx4YXG2CRAgQIAAAQIECBAgQIAAAQIECBAgQIBAJiAAUOcfwrx58+Lzn/98583/NPbnDjvskA3vc+utt8b9998ff/rTn+Loo4+OO+64I6tNSv+DH/wg0oRhHcvcuXPjS1/6Uvz0pz/NAgKnnHJKnHrqqR2HfRMgQIAAAQIECBAgQIAAAQIECBAgQIAAgW4CA7tt2ai5QLqRP3v27Kzc733vezFlypQ47bTT4owzzsjmAvjCF76QHfvhD3+Yfe+1117xX//1X91u/qcDI0eOjEsvvTQbIihtp7kAcrlcWrUQIECAAAECBAgQIECAAAECBAgQIECAAIEiAQGAIpLa7khP96dlp512ihNOOCEGDBjQeYLBgwfHOeecE+PGjevcd/bZZ3euF66kvCl4kJZXX301Zs2aVZjENgECBAgQIECAAAECBAgQIECAAAECBAgQyAQEAOr8Q3jooYeyM0ycOLHkmYYMGRLbb799dmz06NGRxvzvadl0001j4MB/NVtH2T2ld4wAAQIECBAgQIAAAQIECBAgQIAAAQIElk0BAYA6t/srr7ySnWHUqFFlzzRixIjs2Morr1w2TdcDgwYNyjbTWwAWAgQIECBAgAABAgQIECBAgAABAgQIECBQSkAAoJRKDfe95z3vyUq79957y5b6l7/8JTv2j3/8I1577bWy6dKByZMnxxtvvJGl2WCDDXpM6yABAgQIECBAgAABAgQIECBAgAABAgQILLsCAgB1bvuOm/Q//vGP4+GHHy4624033hh33313tn/JkiWR0vW0XHfdddnhNH/Au971rp6SOkaAAAECBAgQIECAAAECBAgQIECAAAECy7CAAECdG/+oo47KxuxfuHBhbL311nHhhRdmgYA0OfDXv/712HfffbMabL755tn3SSedFJMmTSpZq5T+Jz/5SXZs1113jTR/gIUAAQIECBAgQIAAAQIECBAgQIAAAQIECJQSGFxqp321E9hyyy3jsMMOi4suuijmzJkTX/jCF4oKX2WVVeKWW26J8ePHx3PPPZdNCnzIIYfEjjvuGGussUZMmzYtfve738Udd9yR5V1++eXjhz/8YVE5dhAgQIAAAQIECBAgQIAAgVYXWLBgQZx44onx/PPPN+2lPPHEE01bNxUjQIAAAQJdBQQAumrUaf28886LFVZYIc4+++zI5XLdzrLiiivGTTfdFGPGjIlzzjknDjjggCzNJZdcEulTuAwcODDOPPPMWHfddQsP2SZAgAABAgQIECBAgAABAi0vMGXKlDj33HNb/jpcAAECBAgQaAYBAYAGtEIaqifdtN97773j1ltvjY5JfzfbbLPsjYDVVlstq8X+++8f8+fPj+OOOy5eeeWVopqlm/6XX355bLvttkXH7CBAgAABAgQIECBAgAABAu0g8Oabb2aXMXbs2DjooIOa8pJuuOGGuO+++5qybipFgAABAgS6CggAdNWo8/pWW20V6dPTcuihh8Y+++wTP/vZz7K5Al588cXYaKONYtNNN40Pf/jDMWLEiJ6yO0aAAAECBAgQIECAAAECBNpC4G1ve1uk+e+acfnzn/8sANCMDaNOBAgQIFAkIABQRLL0d6y00kpx5JFHLv2KqAEBAgQIECBAgAABAgQIECBAgAABAgQItKzAwJatuYoTIECAAAECBAgQIECAAAECBAgQIECAAAECZQUEAMrSOECAAAECBAgQIECAAAECBAgQIECAAAECBFpXQACgddtOzQkQIECAAAECBAgQIECAAAECBAgQIECAQFkBAYCyNA4QIECAAAECBAgQIECAAAECBAgQIECAAIHWFRAAaN22U3MCBAgQIECAAAECBAgQIECAAAECBAgQIFBWQACgLI0DBAgQIECAAAECBAgQIECAAAECBAgQIECgdQUEAFq37dScAAECBAgQIECAAAECBAgQIECAAAECBAiUFRAAKEvjAAECBAgQIECAAAECBAgQIECAAAECBAgQaF0BAYDWbTs1J0CAAAECBAgQIECAAAECBAgQIECAAAECZQUEAMrSOECAAAECBAgQIECAAAECBAgQIECAAAECBFpXQACgddtOzQkQIECAAAECBAgQIECAAAECBAgQIECAQFkBAYCyNA4QIECAAAECBAgQIECAAAECBAgQIECAAIHWFRAAaN22U3MCBAgQIECAAAECBAgQIECAAAECBAgQIFBWQACgLI0DBAgQIECAAAECBAgQIECAAAECBAgQIECgdQUEAFq37dScAAECBAgQIECAAAECBAgQIECAAAECBAiUFRAAKEvjAAECBAgQIECAAAECBAgQIECAAAECBAgQaF0BAYDWbTs1J0CAAAECBAgQIECAAAECBAgQIECAAAECZQUEAMrSOECAAAECBAgQIECAAAECBAgQIECAAAECBFpXQACgddtOzf8fe3cCbVVxJgr4Z5JJwYAoiiA4EMUgICoqJkZxIIISY9qh1UTUZ4wQRRGjtnkJUdBuUZP4ohKnOJA4LG0S8WHiEAcQBBFaSFRAATFEnoKMMsPr2t33NMMdzoXDvefCV2ttzx5qV9X+ipXU3bWrigABAgQIECBAgAABAgQIECBAgAABAgQIlCmgA6BMGhcIECBAgAABAgQIECBAgAABAgQIECBAgEDNFdABUHPrTskJECBAgAABAgQIECBAgAABAgQIECBAgECZAjoAyqRxgQABAgQIECBAgAABAgQIECBAgAABAgQI1FwBHQA1t+6UnAABAgQIECBAgAABAgQIECBAgAABAgQIlCmgA6BMGhcIECBAgAABAgQIECBAgAABAgQIECBAgEDNFdABUHPrTskJECBAgAABAgQIECBAgAABAgQIECBAgECZAjoAyqRxgQABAgQIECBAgAABAgQIECBAgAABAgQI1FwBHQA1t+6UnAABAgQIECBAgAABAgQIECBAgAABAgQIlCmgA6BMGhcIECBAgAABAgQIECBAgAABAgQIECBAgEDNFdABUHPrTskJECBAgAABAgQIECBAgAABAgQIECBAgECZAjoAyqRxgQABAgQIECBAgAABAgQIECBAgAABAgQI1FwBHQA1t+6UnAABAgQIECBAgAABAgQIECBAgAABAgQIlCmgA6BMGhcIECBAgAABAgQIECBAgAABAgQIECBAgEDNFdABUHPrTskJECBAgAABAgQIECBAgAABAgQIECBAgECZAjoAyqRxgQABAgQIECBAgAABAgQIECBAgAABAgQI1FyBujW36EpOgAABAsUgsGDBgqwYv/3tb+Pll18uhiLlyrDHHnvE7373u9h9991z5+wQIECAAAECBAgQIECAAAECBHYWAR0AO0tNe04CBAhsJ4E5c+ZkKX/66aeRtmILb7/9dpx00knFVizlIUCAAAECBAgQIECAAAECBAhsdwEdANudWAYECBDYOQROO+20+Kd/+qeiedhhw4bFX//619iwYUPRlElBCBAgQIAAAQIECBAgQIAAAQJVKaADoCq15UWAAIEdWCBNt9OhQ4eiecLGjRsXTVkUhAABAgQIECBAgAABAgQIECBQHQIWAa4OdXkSIECAAAECBAgQIECAAAECBAgQIECAAIHtLKADYDsDS54AAQIECBAgQIAAAQIECBAgQIAAAQIECFSHgCmAqkNdngQIECBAgAABAgQI7JQC8+bNi4ULF8aXX36ZbQ0aNIimTZtGkyZNonnz5pGOBQIECBAgQIAAAQKFEtABUChJ6RAgQIAAAQIECBAgQGAzgaVLl8ajjz4aI0aMiGnTpkU6LivUrVs3OnbsGN26dYvevXvHaaedFrVq1SoruvMECBAgQIAAAQIEKhQwBVCFRCIQIECAAAEC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YzOA008/Pff1/raInHXWWVkHQEpj+vTpVdIBcN111xV88eEpU6ZsC4N7CRAgQIAAAQIEtlJAB8BWwrmNAAECBAgQIECAAAECmwt88skn2anWrVtvfmmrjps3b551JKS1AVasWLFVaVT2pptvvjk6d+5ckBEAL730UkycODHSiAiBAAECBAgQIECg6gV0AFS9uRwJECBAgAABAgQIENhBBdIUPelr93HjxsUPfvCDbX7KNKVQevmfQpcuXbY5vXwSSPkUKq/UaZE6ABo2bJhP1uIQIECAAAECBAgUWGDrJ6QscEEkR4AAAQIECBAgQIAAgZou0LVr1+wRnnzyyXjttde26XEWLVoUAwcOzNJo1qxZtGvXbpvSczMBAgQIECBAgMDOJ6ADYOerc09MgAABAgQIECBAgMB2ErjhhhuyKXtWrlwZffr0ieHDh8fq1asrnVsaRXDKKadkownSzZdffnml03ADAQIECBAgQIAAAVMA+TdAgAABAgQIECBAgACBAgmkKYCGDh0agwYNisWLF2cv7tP+8ccfn82rn77i32uvvbIpcRo0aBBr166N1FmwZMmSmDt3bsycOTNef/31mDZtWq5EqSMgzcsvECBAgAABAgQIEKisgA6AyoqJT4AAAQIECBAgQIAAgXIErr322kiL9/br1y9buHfp0qUxatSobCvntlIv9ezZM0aMGBG1axu8XSqQkwQIECBAgAABAuUKaEWWy+MiAQIECBAgQIAAAQIEKi/Qt2/fmDNnTtx4443RsmXLSiVQv379bPqg5557LkaPHh1p/n+BAAECBAgQIECAwNYIGAGwNWruIUCAAAECBAgQIECAQAUCLVq0iCFDhmTb7NmzY/z48TFjxoxsup80PVAaGVCvXr3Yddddo0mTJpGmD+rQoUN06tQpO1dB8i4TIECAAAECBAgQqFBAB0CFRCIQIECAAAECBAgQIEBg2wTatm0baRMIECBAgAABAgQIVKWAKYCqUlteBAgQIECAAAECBAgQIECAAAECBAgQIECgigR0AFQRtGwIECBAgAABAgQIECBAgAABAgQIECBAgEBVCugAqEpteREgQIAAAQIECBAgQIAAAQIECBAgQIAAgSoS0AFQRdCyIUCAAAECBAgQIECAAAECBAgQIECAAAECVSmgA6AqteVFgAABAgQIECBAgAABAgQIECBAgAABAgSqSEAHQBVBy4YAAQIECBAgQIAAAQIECBAgQIAAAQIECFSlQN2qzExeBAgQIECAAAECBAgQ2JEFWrRoERs2bNguj/j5559vl3QlSoAAAQIECBAgsOMK6ADYcevWkxEgQIAAAQIECBAgUMUCCxcujPXr11dxrrIjQIAAAQIECBAgULqADoDSXZwlQIAAAQIECBAgQIBApQXeeOON6Nu3b0yfPj13b8uWLaNOnTq5YzsECBAgQIAAAQIEqkpAB0BVScuHAAECBAgQIECAAIEdXuDYY4+N8ePHR8+ePWPChAnZ81588cUxZMiQHf7ZPSABAgQIECBAgEDxCVgEuPjqRIkIECBAgAABAgQIEKjBAl/5ylfixRdfjEMOOSR7ittuuy1eeeWVGvxEik6AAAECBAgQIFBTBXQA1NSaU24CBAgQIECAAAECBIpWoEmTJvHggw9G7dq1szUBLrzwwliyZEnRllfBCBAgQIAAAQIEdkwBHQA7Zr16KgIECBAgQIAAAQIEqlngmGOOiR/96EdZKebNmxf/5//8n2oukewJECBAgAABAgR2NgEdADtbjXteAgQIECBAgAABAgSqTCDN/d+uXbssvzvvvDOWLVtWZXnLiAABAgQIECBAgIBFgP0bIECAAAECBAgQIECAwHYSaNy4cfz+97+P5557Lsth1qxZ0bFjx+2Um2QJECBAgAABAgQIbCqgA2BTD0cECBAgQIAAAQIECBAoqEC3bt0ibQIBAgQIECBAgACBqhYwBVBVi8uPAAECBAgQIECAAAECBAgQIECAAAECBAhUgYAOgCpAlgUBAgQIECBAgAABAgQIECBAgAABAgQIEKhqAR0AVS0uPwIECBAgQIAAAQIECBAgQIAAAQIECBAgUAUCOgCqAFkWBAgQIECAAAECBAgQIECAAAECBAgQIECgqgV0AFS1uPwIECBAgAABAgQIECBAgAABAgQIECBAgEAVCNStgjxkQYAAAQIECBAgQIAAAQIECBAgQGATgeXLl2fHTz/9dHzwwQebXCumg+bNm8egQYOiXr16xVQsZSFAgEBeAjoA8mISiQABAgQIECBAgAABAgQIECBAoJACM2fOzJJ76aWXIm3FHI466qg46aSTirmIykaAAIFSBXQAlMriJAECBAgQIECAAAECBAgQIECAwPYU2LBhQ5b8iSeeGB07dtyeWW112iNHjow5c+bE6tWrtzoNNxIgQKA6BXQAVKe+vAkQIECAAAECBAgQIECAAAECO7lA+rr+zDPPLEqFCRMmZB0ARVk4hSJAgEAeAhYBzgNJFAIECBAgQIAAAQIECBAgQIAAAQIECBAgUNMEdADUtBpTXgIECBAgQIAAAQIECBAgQIAAAQIECBAgkIeADoA8kEQhQIAAAQIECBAgQIAAAQIECBAgQIAAAQI1TUAHQE2rMeUlQIAAAQIECBAgQIAAAQIECBAgQIAAAQJ5COgAyANJFAIECBAgQIAAAQIECBAgQIAAAQIECBAgUNMEdADUtBpTXgIECBAgQIAAAQIECBAgQIAAAQIECBAgkIeADoA8kEQhQIAAAQIECBAgQIAAAQIECBAgQIAAAQI1TUAHQE2rMeUlQIAAAQIECBAgQIAAAQIECBAgQIAAAQJ5COgAyANJFAIECBAgQIAAAQIECBAgQIAAAQIECBAgUNMEdADUtBpTXgIECBAgQIAAAQIECBAgQIAAAQIECBAgkIeADoA8kEQhQIAAAQIECBAgQIAAAQIECBAgQIAAAQI1TUAHQE2rMeUlQIAAAQIECBAgQIAAAQIECBAgQIAAAQJ5COgAyANJFAIECBAgQIAAAQIECBAgQIAAAQIECBAgUNMEdADUtBpTXgIECBAgQIAAAQIECBAgQIAAAQIECBAgkIeADoA8kEQhQIAAAQIECBAgQIAAAQIECBAgQIAAAQI1TUAHQE2rMeUlQIAAAQIECBAgQIAAAQIECBAgQIAAAQJ5COgAyANJFAIECBAgQIAAAQIECBAgQIAAAQIECBAgUNMEdADUtBpTXgIECBAgQIAAAQIECBAgQIAAAQIECBAgkIeADoA8kEQhQIAAAQIECBAgQIAAAQIECBAgQIAAAQI1TaBuTSvwjlbeefPmxcKFC+PLL7/MtgYNGkTTpk2jSZMm0bx580jHAgECBAgQIECAAAECBAgQIECAAAECBAgQqKyADoDKim1j/KVLl8ajjz4aI0aMiGnTpkU6LivUrVs3OnbsGN26dYvevXvHaaedFrVq1SoruvMECBAgQIAAAQIECBAgQIAAAQIECBAgQCAnYAqgHMX23Zk/f37069cvWrVqFf37949x48aV+/I/lWbt2rUxefLkuO+++7IOgMMOOyyef/757VtQqRMgQIAAAQIECBAgQIAAAQIECBAgQIDADiFgBEAVVOMXX3wRJ598ckydOjWXW/qSf++99442bdpEixYtomHDhlG/fv3spf/KlStjyZIlMXfu3JgzZ06sWrUquy+NGDjjjDPijjvuiAEDBuTSskOAAAECBAgQIECAAAECBAgQIECAAAECBDYX0AGwuUiBj5cvXx69evXKvfw/8sgj45prrokePXpkL/4rym7NmjUxYcKEbNqghx9+ONLx1VdfHe3bt8+mBKroftcJECBAgAABAgQIECBAgAABAgQIECBAYOcUMAXQdq73p556KpvuJ2Vz7rnnxvjx47Pf9NV/PqFevXrRvXv3GD58eIwcOTLScQrXX399rF+/Pp8kxCFAgAABAgQIECBAgAABAgQIECBAgACBnVBAB8B2rvQ333wzyyHN358W/61de+vJ0yLAw4YNy9JL0wnNmjVrO5de8gQIECBAgAABAgQIECBAgAABAgQIECBQUwW2/m10TX3iKi732LFjsxxPP/303Nf721KEs846K3f79OnTc/t2CBAgQIAAAQIECBAgQIAAAQIECBAgQIDAxgI6ADbW2A77n3zySZZq69atC5J68+bNcx0JK1asKEiaEiFAgAABAgQIECBAgAABAgQIECBAgACBHU9AB8B2rtMDDjggy2HcuHEFySlNKZQWAk6hS5cuBUlTIgQIECBAgAABAgQIECBAgAABAgQIECCw4wnoANjOddq1a9cshyeffDJee+21bcpt0aJFMXDgwCyNZs2aRbt27bYpPTcTIECAAAECBAgQIECAAAECBAgQIECAwI4roANgO9ftDTfckE3Zs3LlyujTp08MHz48Vq9eXelcp0yZEqecckqk3xQuv/zySqfhBgIECBAgQIAAAQIECBAgQIAAAQIECBDYeQTq7jyPWj1PmqYAGjp0aAwaNCgWL16cvbhP+8cff3x07tw5+4p/r732ioYNG0aDBg1i7dq1kToLlixZEnPnzo2ZM2fG66+/HtOmTcs9QOoIuPnmm3PHdggQIECAAAECBAgQIECAAAECBAgQIECAwOYCOgA2F9kOx9dee22kxXv79esXaeHepUuXxqhRo7Ktstn17NkzRowYEbVrG7xRWTvxCRAgQIAAAQIECBAgQIAAAQIECBAgsDMJeItcRbXdt2/fmDNnTtx4443RsmXLSuVav379bPqg5557LkaPHh1p/n+BAAECBAgQIECAAAECBAgQIECAAAECBAiUJ2AEQHk6Bb7WokWLGDJkSLbNnj07xo8fHzNmzMim+0nTA6WRAfXq1Ytdd901mjRpEmn6oA4dOkSnTp2ycwUuTt7J/fnPf47HHnss1q9fn/c9ZUWcNGlSdik9r0CAAAECBAgQIECAAAECBAgQIECAAAEC209AB8D2sy035bZt20baakK455574g9/+ENBizp9+vSCpicxAgQIECBAgAABAgQIECBAgAABAgQIENhUQAfAph6OShG4995745xzzinICIDHH388XnjhhTj88MNLyckpAgQIECBAgAABAgQIECBAgAABAgQIECiUgA6AQkkWMJ1169bFhx9+GDNnzoyvfOUr0a5du0qvG1DA4sTee+8d5513XkGSfPvtt7MOgDp16hQkPYkQIECAAAECBAgQIECAAAECBAgQIECAQOkCOgBKd9kuZ1955ZUYOXJkfPnll/HAAw9skcfUqVNjwIABMXbs2Fi1atUm14866qi49NJL45JLLonata3dvAmOAwIECBAgQIAAAQIECBAgQIAAAQIECBDYQsCb5C1ICn9i5cqVcdlll0WPHj3i7rvvjvQV/ObhJz/5STYtTuok2Pzlf4o7YcKELI3jjz8+Pvnkk81vd0yAAAECBAgQIECAAAECBAgQIECAAAECBDYRMAJgE47tc3D++efHs88+m0t8yZIluf20k0YD3HLLLblze+yxR3Tu3DkOPPDA+OKLL2LGjBkxZcqUbA7+MWPGRK9eveLNN9+Mxo0b5+6xQ4AAAQIECBAgQIAAAQIECBAgQIAAAQIENhYwAmBjje2w//LLL+de/u+zzz7x2GOPRZrqpySkef7TtD8ppHnxb7rpppgzZ068+OKLkRbffeKJJ2LSpEnZdtxxx2Xx3n333fjpT3+a7fsPAQIECBAgQIAAAQIECBAgQIAAAQIECBAoTUAHQGkqBTx3zz33ZKk1atQoUmfABRdcsMmX+08//XQsX748i5OmAbr55psjxd08pBEBqVMg/abw4IMPZmsJbB7PMQECBAgQIECAAAECBAgQIECAAAECBAgQSAI6ALbzv4P3338/yyEt4HvwwQdvkVv6uj+FNO1P+vq/vNCgQYP41a9+lUVZtGhRpJEAAgECBAgQIECAAAECBAgQIECAAAECBAgQKE1AB0BpKgU8l6bzSaFLly6lpjpr1qzsfNeuXbMpgEqNtNHJo446KurVq5edKUl7o8t2CRAgQIAAAQIECBAgQIAAAQIECBAgQIBAJqADYDv/Q0gL+aaw8bz/G2d5xBFHbHxY4f7nn38ea9asyeLtueeeFcYXgQABAgQIECBAgAABAgQIECBAgAABAgR2TgEdANu53kte8P/7v/97qTl94xvfyM6/8847sW7dulLjbHxy1KhR2WGtWrXi8MMP3/iSfQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBPQAZCj2D47acqeFNJUP7fffvsWmfTo0SOaNm0an332Wdx2221bXN/4xMcffxx33XVXdiqNLEj3CQQIECBAgAABAgQIECBAgAABAgQIECBAoDQBHQClqRTw3Pe///048sgjsxSvu+666N+/fyxYsCCXQ8uWLSN91d+wYcMYPHhw3HnnnaWOBHjrrbcidSZ88MEH2b0//vGPc2nYIUCAAAECBAgQIECAAAECBAgQIECAAAECmwvoANhcpMDH9evXj2eeeSb22GOPLOVf//rXccABB8SFF14YDz/8cEyePDnatGmT7W/YsCEGDhwYhx56aFxyySVxyy23xAUXXJDFP/roo2P+/PlZGqlTIV0XCBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWQJ1y7rgfOEEWrdunX3ln176z5gxIxYvXhyPP/54tpWWS/rKv+RL/82vpzUD7rnnns1POyZAgAABAgQIECBAgAABAgQIECBAgAABApsIGAGwCcf2O+jWrVtMnTo17rjjjujUqVOlMzrkkEPi3nvvjVdffTUaNWpU6fvdQIAAAQIECBAgQIAAAQIECBAgQIAAAQI7l4ARAFVY32k6oGuuuSbbpk+fHpMmTYpp06bFRx99FEuWLIlly5bF6tWro3HjxrHbbrvFvvvuGx07dozUebA1nQZV+GiyIkCAAAECBAgQIECAAAECBAgQIECAAIEiEyhIB8CiRYvil7/8ZaS56du2bVtkj1icxWnfvn2kTSBAgAABAgQIECBQ0wS0/2tajSkvAQIECBAgQIDAzipQkCmAVq1aFT/72c9i//33jxNOOCEeeeSRWL58+c5q6rkJECBAgAABAgQI7NAC2v87dPV6OAIECBAgQIAAgR1IoCAdACUeGzZsyOaov+iii2KvvfaK9JvmrE/nBQIECBAgQIAAAQIEdiwB7f/K1+e8efOyaUAnTJiQ/a00fvz4eO+99+Lvf/97rFy5svIJuoMAAQIECBAgQIBAOQIF6QBo0aJFjBw5Mr7zne/ELrvskmWXRgCkkQBpREAaGZBGCKS57gUCBAgQIECAAAECBGq2gPZ//vW3dOnS+PWvfx3HHntsNGnSJFq1apVb5yv9rXTMMcdEhw4dsvW/0jpghx9+ePzwhz+M559/3odU+TOLSYAAAQIECBAgUIZAQToAateuHX369Ilnnnkm/vGPf8Q999wTRx99dC7L2bNnx+DBg+PAAw+M448/Ph5++OFswdtcBDsECBAgQIAAAQIECNQYAe3/iqtq/vz50a9fv+yFf//+/WPcuHGROgPKC2vXro3JkyfHfffdF717947DDjss6wgo7x7XCBAgQIAAAQIECJQnUJAOgI0zaNasWfbFSmrgTp8+PW666abcwsBpiPDrr78eF198cbRs2TK+973vxSuvvOLLlo0B7RMgQIAAAQIECBCoQQLa/1tW1hdffBEnn3xy9mFUyUv/WrVqxT777JN9KHX66afH2WefHRdeeGGcd955ceaZZ0aPHj2iffv2Ub9+/VyC06ZNizPOOCN+8Ytf5M7ZIUCAAAECBAgQIFAZgYJ3AGyc+UEHHRQ333xzNvXPa6+9FpdeemnsueeeWZQ0RdBjjz2WNXTbtWsX//t//++YNWvWxrfbJ0CAAAECBAgQIECgBglo/0ekv3N69eoVU6dOzWruyCOPjN///veRRgSkef7Th1J//OMf48knn4xHH300fve738Wzzz4bL730UnzwwQfZKIExY8bEZZddFvXq1Yv169fH1VdfHf/3//7fGvQvQVEJECCqwGISAABAAElEQVRAgAABAgSKRWC7dgCUPGT62uUb3/hG3H///dkUQWPHjo1rr702GjVqlEWZM2dO1lFwwAEHxEknnZStJ2Dh4BI9vwQIECBAgAABAgRqlsDO3P5/6qmnspf8qcbOPffcSIv8pt+0bkI+Ib307969ewwfPjz7uygdp3D99ddnnQH5pCEOAQIECBAgQIAAgRKBKukAKMlsxYoVMWrUqHjggQfit7/9bXz55Zcll7Lf9NL/5ZdfzobAHnHEEfHxxx9vct0BAQIECBAgQIAAAQI1R2BnbP+/+eabWQWl+fvTF/5pvYStDaeddloMGzYsuz2NKDBiemsl3UeAAAECBAgQ2HkFtr41mqfZunXr4s9//nM233+a/ictFpwWAf7888+zFNKcoWlRrBdeeCEbFZDWBkjhnXfeiaOOOiomTpyYHfsPAQIECBAgQIAAAQLFL7Czt//TaOcU0jz/JV/vb0utnXXWWbnb0xprAgECBAgQIECAAIHKCGy3DoD0Av+aa66JfffdN0499dRsvv9ly5ZlZatTp05861vfijQ8dt68eXH33XdncW6//fbsq/8bb7wxi5fmyUxTBQkECBAgQIAAAQIECBS3gPb/f9XPJ598ku20bt26IBXWvHnzXEdCGlEhECBAgAABAgQIEKiMQN3KRK4obprLf8SIEfH444/He++9t0X09u3bR9++fePCCy+MVq1abXE9nUhfyQwZMiReffXVSMNn07ZkyZJo0qRJqfGdJECAAAECBAgQIECgegS0/7d0T+uaTZkyJVsH4Ac/+MGWESp5Jv09tGbNmuyuLl26VPJu0QkQIECAAAECBHZ2gYJ0ACxdujR69eoVY8aMic0X791tt93inHPOyV78H3vssXl7p+l/UmN37dq1MXfu3Dj00EPzvldEAgQIECBAgAABAgS2n4D2f9m2Xbt2zToAnnzyyexvoOOPP77syBVcWbRoUQwcODCLlaZObdeuXQV3uEyAAAECBAgQIEBgU4GCTAGUFvN94403ci//a9WqFSeccEK26NWnn34a999/f1Tm5X8qYmrsplC/fv346le/mu37DwECBAgQIECAAAEC1S+g/V92Hdxwww3ZqOaVK1dm658NHz48Vq9eXfYNZVxJowhOOeWUrDMhRbn88svLiOk0AQIECBAgQIAAgbIFCjICoCT5tm3bxve///1s29avU/r16xdXX3117LffflG3bkGLWVJcvwQIECBAgAABAgQIbIOA9v+WeGkKoKFDh8agQYNi8eLF2Yv7tJ9GAnTu3Dn7in+vvfaKhg0bRoMGDbIRz6mzIE17mkY+z5w5M15//fWYNm1aLvHUEXDzzTfnju0QIECAAAECBAgQyFegIG/Wd91113j55Zezr/7T1/+FCEcccUQhkpEGAQIECBAgQIAAAQIFFtD+Lx/02muvjbR4b/qoKS3cm6ZMGjVqVLaVf+eWV3v27Jmts1a7dkEGb2+ZgTMECBAgQIAAAQI7tEBBWpGNGzeOE088MUpe/qdG7muvvVYq3NSpU+PWW2+N999/v9TrThIgQIAAAQIECBAgUNwC2v8V10/fvn0jLZJ84403RsuWLSu+YaMYaRrUPn36xHPPPRejR4+ONP+/QIAAAQIECBAgQGBrBAoyAqAk47Rg7/XXXx+/+c1vsnkvFyxYUHIp9ztp0qSsEZwawj169Ijf/e53seeee+au2yFAgAABAgQIECBAoGYIaP+XX08tWrSIIUOGZNvs2bNj/PjxMWPGjGy6nzQ9UBoZUK9evUgjKpo0aRJp+qAOHTpEp06dsnPlp759r6bybdiwYZszSdMbCQQIECBAgAABAtUnULAOgLQQ2Le//e148cUXc0/z+eefxx577JE7TjuzZs3KHadpg7p27Rp/+tOfsoZu7oIdAgQIECBAgAABAgSKWkD7v3LVk9ZLSFtNCP37949f//rXBS3qBx98UND0JEaAAAECBAgQIJCfQME6AO68887cy/80RDUtBpy+Ztk8/OhHP4r27dvHQw89FK+88kp88skncdlll8WYMWM2j+qYAAECBAgQIECAAIEiFdD+L9KKKUCx9t5772zaofXr129zaml62FWrVmULHm9zYhIgQIAAAQIECBCotEBB1gBIQ1eHDRuWZX7ooYfGlClTIv1B0LRp0y0KlEYEnH/++fHSSy/Fv/zLv2TXx44dG0899dQWcZ0gQIAAAQIECBAgQKD4BLT/C18n8+fPj7/85S/xxBNPZH9PrVmzpvCZ5Jli+jstTef6xRdfbPP2wx/+MMt1v/32yzN30QgQIECAAAECBAopUJAOgHfffTfSHJEp3H///dG6desKy5gWDB48eHB87Wtfy+Km6YAEAgQIECBAgAABAgSKX0D7P786Sl/Qv//++zFixIh4+OGHY/LkyVvcmEZEf+9734tWrVrFiSeeGOedd1506dIlWwPgoosuytYL2OImJwgQIECAAAECBAjkKVCQDoCZM2dm2e2+++5xzDHH5Jl1RJ06deKkk07K4r/33nt53yciAQIECBAgQIAAAQLVJ6D9X7F9GhWdPnY65JBD4oILLoiLL744Dj/88DjllFOyr+pTCn//+9/j+OOPj8ceeyzWrVu3SaKrV6+ORx55JA477LB4++23N7nmgAABAgQIECBAgEC+AgVZAyANAU6hdu3K9yeUTBO0ZMmSfMssHgECBAgQIECAAAEC1Sig/V8+/h//+Mf4p3/6p0gv8TcPL774YnzrW9+KN998M9IX/h999FEWZZ999onjjjsu9t9///jwww/j9ddfjzQt0Jw5c+Lcc8+NqVOnRsOGDTdPzjEBAgQIECBAgACBcgUK0gHQpk2bLJOFCxfG7Nmzo23btuVmuvHFkmGwHTt23Pi0fQIECBAgQIAAAQIEilRA+7/sikmdI2ne+5KX/926dcum9klf+L/wwguRpk966623YsCAAdm6aCmlFP/222+Pxo0b5xJOH0hdddVV8dvf/jbrELjllltiyJAhuet2CBAgQIAAAQIECOQjUPlP9ktJNc1RWfL1/2233VZKjNJP/e1vf8s1etPQVoEAAQIECBAgQIAAgeIX0P4vu47Si/x58+ZlEW699dYYN25cDB06NP71X/81Jk2aFFdccUV27e67785++/TpE/fcc88mL//ThSZNmsRDDz2UTRGUjn/1q1/Fhg0b0q5AgAABAgQIECBAIG+BgnQApEV/Tz755CzT4cOHZ1+vrFmzptxCpDn/zzrrrPjyyy9jl112iV69epUb30UCBAgQIECAAAECBIpDQPu/7HpIX/enkNY6u/7666NWrVq5yHXr1o277rorDjjggNy5O++8M7e/+U66N3UepLBs2bKYO3fu5lEcEyBAgAABAgQIEChXoCBTAKUc0pDUV199NVatWhXXXXdd9hXLZZddljVu0xDhRo0aZYtcffLJJ/HnP/85nnnmmdwXLD//+c+jQ4cO5RbURQIECBAgQIAAAQIEikdA+7/0ukijnFPo3bt3qRHSx0/f/OY3s2l9mjdvns35X2rE/z7ZuXPnbLT1+vXrI6VdMv1Sefe4RoAAAQIECBAgQKBEoGAdAEcccUTcd999cemll0aa3zKtBXDjjTeW5FPm72mnnRaDBg0q87oLBAgQIECAAAECBAgUn4D2f+l1snjx4uxC06ZNS4/wn2d33XXX7NpXvvKVMuNsfKFOnTqROgDSKACBAAECBAgQIECAQGUECjIFUEmGF110UUyYMCGOOuqoklNl/u63337x5JNPxvPPP59bP6DMyC4QIECAAAECBAgQIFB0Atr/W1bJV7/61exkmu+/rPDOO+9klz766KNsStSy4qXzY8eOjZLpVQ855JDyorpGgAABAgQIECBAYAuBgo0AKEn58MMPjzTv5YwZM2LUqFExffr0mD9/fjY10P777x8HHnhgtvXo0SMaNGhQcptfAgQIECBAgAABAgRqoID2/6aVll7Sv/3223H//fdnC/5u/tL+D3/4Q7zxxhvZTemr/hTvqquu2jSRjY6eeuqp7CitH3DQQQdtdMUuAQIECBAgQIAAgYoFCt4BUJJlapxeffXVJYd+CRAgQIAAAQIECBDYgQW0//+rcn/0ox/FiBEjsg+gjj322GwR3zTn/5IlS+K5556Lf/u3f8sidu3aNdIogTRtapcuXeIb3/jGFv86brrppnjggQey8z179oy0foBAgAABAgQIECBAoDIC260DoDKFEJcAAQIECBAgQIAAAQI7gsCRRx4Zl112WbY+2qJFi7JRAJs/V7NmzWL06NHRsWPHbLR06iC4+OKLI42S3meffbJpVf/85z/HSy+9lN3aqFGjuPvuuzdPxjEBAgQIECBAgACBCgV0AFRIJAIBAgQIECBAgAABAgTyF/jlL38ZjRs3jjvvvDM2bNiwyY277bZbNhKgRYsWcdddd8X555+fxXnwwQcjbZuH2rVrx7Bhw6Jt27abX3JMgAABAgQIECBAoEKBgncALFu2LJ5++un44IMPYvny5bF27dotGr2llap3796RNoEAAQIECBAgQIAAgZojoP2/ZV2lqXrSS/uzzjorXnjhhShZ9DdN9XPFFVdEy5Yts5vOO++87G+ma6+9NhYvXrxFQuml/yOPPFLq9EBbRHaCAAECBAgQIECAQCkCBe0ASPNZDhkyJJvfspS8yj2VGsE6AMolcpEAAQIECBAgQIBAUQlo/5dfHcccc0ykrbxw6aWXxne/+914/PHH47333osFCxbEoYceGp07d44TTjghdt111/Jud40AAQIECBAgQIBAuQIF6wAYOXJk/PjHPy43MxcJECBAgAABAgQIENgxBLT/C1ePu+++e/Tv379wCUqJAAECBAgQIECAwH8LFKQDYP369XHJJZfkUA8//PC4/PLLo127dtncl7Vq1cpdK2tn3333LeuS8wQIECBAgAABAgQIFJGA9n8RVYaiECBAgAABAgQIEChHoCAdAGm+/4ULF2bZnHrqqfHss89Go0aNysnWJQIECBAgQIAAAQIEaqqA9n9NrTnlJkCAAAECBAgQ2NkEahfigUsWtUppDRw40Mv/QqBKgwABAgQIECBAgECRCmj/F2nFKBYBAgQIECBAgACBzQQK0gGwdu3aLNk01U/37t03y8IhAQIECBAgQIAAAQI7koD2/45Um56FAAECBAgQIEBgRxYoSAfAMccckxlt2LAhNxXQjozm2QgQIECAAAECBAjszALa/ztz7Xt2AgQIECBAgACBmiRQkA6A9u3bR/PmzbPnfvnll2vS8ysrAQIECBAgQIAAAQKVFND+rySY6AQIECBAgAABAgSqSaAgHQCp7D/5yU+yR7jxxhvj888/r6bHkS0BAgQIECBAgAABAlUhoP1fFcryIECAAAECBAgQILBtAgXrALjqqqsivfyfN29eHHzwwXHPPffE+++/HytWrNi2ErqbAAECBAgQIECAAIGiE9D+L7oqUSACBAgQIECAAAECWwjU3eLMVpxYvHhx9OvXL7uzYcOGsWDBgtxxOrn77rtHnTp1yk35uuuui7QJBAgQIECAAAECBAgUt4D2f3HXj9IRIECAAAECBAgQKBEoSAfAypUrY8SIESVpbvG7aNGiLc5tfsJIgc1FHBMgQIAAAQIECBAoTgHt/+KsF6UiQIAAAQIECBAgsLlAQToAateuHfvuu+/maVfquEmTJpWKLzIBAgQIECBAgAABAtUjoP1fPe5yJUCAAAECBAgQIFBZgYJ0ALRo0SLmzp1b2bzFJ0CAAAECBAgQIECgBgpo/9fASlNkAgQIECBAgACBnVKgYIsA75R6HpoAAQIECBAgQIAAAQIECBAgQIAAAQIECBSpQEFGAJT1bJ999lnMmDEj25YuXRr9+/fPon744YfRqlWraNCgQVm3Ok+AAAECBAgQIECAQA0T0P6vYRWmuAQIECBAgAABAju8wHYZAfDEE09E27ZtY88994zu3bvHRRddFD/72c9ymMOGDYs2bdpk59asWZM7b4cAAQIECBAgQIAAgZonoP1f8+pMiQkQIECAAAECBHYOgYJ2AMyaNSu+/vWvx3nnnRdz5swpU3D27NmRvg4aPHhwnHnmmbFixYoy47pAgAABAgQIECBAgEBxCmj/F2e9KBUBAgQIECBAgACBEoGCdQCsXbs2zjnnnBgzZkyW9m677RY9e/aMk046qSSv3G/r1q1z+88//3xcccUVuWM7BAgQIECAAAECBAgUv4D2f/HXkRISIECAAAECBAgQKFgHQPqaf+LEiZnoxRdfHOkr/9GjR8e55567hfJvfvObeOutt2LvvffOrj322GPZOgFbRHSCAAECBAgQIECAAIGiFND+L8pqUSgCBAgQIECAAAECmwgUpAMgff2T5vVP4dRTT437778/mjVrtklGmx8cddRR8dJLL0WdOnVi3bp18cADD2wexTEBAgQIECBAgAABAkUooP1fhJWiSAQIECBAgAABAgRKEShIB8D7778fK1euzJK/4447onbt/JLt0KFD9OnTJ7tv+vTppRTPKQIECBAgQIAAAQIEik1A+7/YakR5CBAgQIAAAQIECJQukN+b+tLvzZ2dMmVKtp/m/T/kkENy5/PZOeyww7JoH330UT7RxSFAgAABAgQIECBAoJoFtP+ruQJkT4AAAQIECBAgQCBPgYJ0AKxatSrLbpdddsn76/+S8i1dujTbbdy4cckpvwQIECBAgAABAgQIFLGA9n8RV46iESBAgAABAgQIENhIoCAdAJ06dcqSXLBgQcydO3ej5CvenTRpUhbpa1/7WsWRxSBAgAABAgQIECBAoNoFtP+rvQoUgAABAgQIECBAgEBeAgXpAEgv79NivikMHjw4r4xTpBdeeCFeffXVLL4OgIzBfwgQIECAAAECBAgUvYD2f9FXkQISIECAAAECBAgQyAQK0gHQoEGD+M53vpMl+OCDD8btt98e69evL5f4L3/5S/Tt2zeL06hRo+jdu3e58V0kQIAAAQIECBAgQKA4BLT/i6MelIIAAQIECBAgQIBARQJ1K4qQ7/V77703xowZE//4xz/iuuuui6effjr69OkTn376aZbEhg0bIi0WNnny5Bg9enR2vSTtoUOHxv77719y6JcAAQIECBAgQIAAgSIX0P4v8gpSPAIECBAgQIAAAQL/KVCwDoDmzZvHI488ko0EWLZsWUycODHbSpQXLlwYXbp0KTnM/Z522mlx5ZVX5o7tECBAgAABAgQIECBQ/ALa/8VfR0pIgAABAgQIECBAoCBTAJUwnnzyyfHBBx/EhRdeGLVq1So5Xepvy5Ytsw6DUaNGVRi31AScJECAAAECBAgQIECgWgW0/6uVX+YECBAgQIAAAQIEKhQo2AiAkpz22WefePTRR+Oaa66JN998M2bMmJFtn332WbRr1y7at2+fbWeccUY0adKk5Da/BAgQIECAAAECBAjUQAHt/xpYaYpMgAABAgQIECCw0wgUvAOgRK5z586RNoEAAQIECBAgQIAAgR1fQPt/x69jT0iAAAECBAgQIFDzBAo6BVDNe3wlJkCAAAECBAgQIECAAAECBAgQIECAAAECO6aADoAds149FQECBAgQIECAAAECBAgQIECAAAECBAjs5AIFmQJo+fLlcfvtt28T5Te/+c1Im0CAAAECBAgQIECAQHELaP8Xd/0oHQECBAgQIECAAIESgYJ0ACxbtiwGDx5ckuZW/daqVUsHwFbJuYkAAQIECBAgQIBA1Qpo/1ett9wIECBAgAABAgQIbK2AKYC2Vs59BAgQIECAAAECBAgQIECAAAECBAgQIECgiAUKMgJg9913j5EjR5b7mBs2bIgvv/wyFixYEBMmTIhnnnkmVqxYETfccEPcfPPNUbu2vohyAV0kQIAAAQIECBAgUCQC2v9FUhGKQYAAAQIECBAgQKACgYJ0ANSvXz/69OlTQVabXu7Xr1/07t07br311mjZsmVceeWVm0ZwRIAAAQIECBAgQIBAUQpo/xdltSgUAQIECBAgQIAAgS0Equ2z+6OPPjr+9Kc/ZQUaMGBATJ48eYvCOUGAAAECBAgQIECAwI4hoP2/Y9SjpyBAgAABAgQIEKhZAtXWAZCYunbtGm3atIk0PdDLL79cs+SUlgABAgQIECBAgACBSglo/1eKS2QCBAgQIECAAAEC2yxQrR0AqfTf/OY3s4cYM2ZM9us/BAgQIECAAAECBAjsuALa/ztu3XoyAgQIECBAgACB4hOo9g6A6dOnZypz5swpPh0lIkCAAAECBAgQIECgoALa/wXllBgBAgQIECBAgACBcgWqtQPgH//4R0yYMCErYOfOncstqIsECBAgQIAAAQIECNRsAe3/ml1/Sk+AAAECBAgQIFDzBKqtA+CPf/xjHHnkkbF+/fpM7Ygjjqh5ekpMgAABAgQIECBAgEBeAtr/eTGJRIAAAQIECBAgQKCgAnULkdrnn38eRx99dIVJpZf9q1evjoULF8aKFSty8Vu3bh3nnXde7tgOAQIECBAgQIAAAQLFK6D9X7x1o2QECBAgQIAAAQIENhYoSAfAunXr4sMPP9w43bz3d9lll3jiiSeiWbNmed8jIgECBAgQIECAAAEC1Seg/V999nImQIAAAQIECBAgUBmBgnQA1KpVK3bddde88q1du3Y0aNAg9t577/jOd74T/+t//a9sP6+bRSJAgAABAgQIECBAoNoFtP+rvQoUgAABAgQIECBAgEBeAgXpANhzzz1j6dKleWUoEgECBAgQIECAAAECNVtA+79m15/SEyBAgAABAgQI7DwC1bYI8M5D7EkJECBAgAABAgQIECBAgAABAgQIECBAgEDVC+gAqHpzORIgQIAAAQIECBAgQIAAAQIECBAgQIAAge0uoANguxPLgAABAgQIECBAgAABAgQIECBAgAABAgQIVL1AQdYAWL58edx+++3bpfTNmjWLK6+8crukLVECBAgQIECAAAECBCovoP1feTN3ECBAgAABAgQIEKgOgYJ0ACxbtiwGDx68Xcp/4IEH6gDYLrISJUCAAAECBAgQILB1Atr/W+fmLgIECBAgQIAAAQJVLWAKoKoWlx8BAgQIECBAgAABAgQIECBAgAABAgQIEKgCgYKMANhrr71i5cqV8cwzz8SFF14Y69evj4MOOiiuuuqq6NChQ7Rp0yb22GOPmDdvXnz88cfx4osvxj333BMrVqyIRo0axb333htNmzYt9XEbN25c6nknCRAgQIAAAQIECBCoHgHt/+pxlysBAgQIECBAgACBygoUpAMgZfrGG29E3759Y8OGDXH33XfHD3/4w6hTp84m5Ukv+Q855JA49dRTY9CgQXH66afHxIkT44knnojnnntui/ib3OyAAAECBAgQIECAAIGiEdD+L5qqUBACBAgQIECAAAECZQoUbAqg733ve7F69er46U9/Gv3796/wZX76aujZZ5+NtMjv6NGj4+mnny6zkC4QIECAAAECBAgQIFBcAtr/xVUfSkOAAAECBAgQIECgNIGCdADMnDkz/vGPf0S9evWyL/tLy6i0c/vuu2/07Nkzu/Tqq6+WFsU5AgQIECBAgAABAgSKTED7v8gqRHEIECBAgAABAgQIlCFQkA6AMWPGZMmn+f7TnP6VCV/96lez6G+99VZlbhOXAAECBAgQIECAAIFqEtD+ryZ42RIgQIAAAQIECBCopEBBOgDSor8pzJo1K1sAuDJlmDx5chY9LRQsECBAgAABAgQIECBQ/ALa/8VfR0pIgAABAgQIECBAIAkUpAPgoIMOyjSXLFmSzeufL+3f/va3ePHFF7Po3bp1y/c28QgQIECAAAECBAgQqEYB7f9qxJc1AQIECBAgQIAAgUoIFKQD4Nhjj422bdtm2fbt2zfGjh1bYRHSvKF9+vSJ5cuXR926daNXr14V3iMCAQIECBAgQIAAAQLVL6D9X/11oAQECBAgQIAAAQIE8hEoSAdAnTp14qabbsryW7ZsWRx33HHxrW99K5555pmYNGlS/L//9/9i8eLFMXXq1Hj++ecjdRIcfPDBkToBUrj11lujU6dO2b7/ECBAgAABAgQIECBQ3ALa/8VdP0pHgAABAgQIECBAoESgbsnOtv5ecskl8e6778avfvWrLKkXXngh0lZROPvss2PgwIEVRXOdAAECBAgQIECAAIEiEtD+L6LKUBQCBAgQIECAAAECZQgUZARASdq//OUv47HHHou99tqr5FSZv/vvv382QuDJJ5+MWrVqlRnPBQIECBAgQIAAAQIEilNA+78460WpCBAgQIAAAQIECJQIFGwEQEmCF1xwQXz3u9+Nl19+OUaNGpVN8/Ppp59m8/ynxcLat28fhxxySBanfv36Jbf5JUCAAAECBAgQIECgBgpo/9fASlNkAgQIECBAgACBnUag4B0ASa5BgwbZor4W9t1p/h15UAIECBAgQIAAgZ1YQPt/J658j06AAAECBAgQIFDUAgWdAqion1ThCBAgQIAAAQIECBAgQIAAAQIECBAgQIDATiSwXUYAlPh99tlnMWPGjGxbunRp9O/fP7v04YcfRqtWrbKRAiVx/RIgQIAAAQIECBAgULMFtP9rdv0pPQECBAgQIECAwI4nsF1GADzxxBPRtm3b2HPPPaN79+5x0UUXxc9+9rOc3rBhw6JNmzbZuTVr1uTO2yFAgAABAgQIECBAoOYJaP/XvDpTYgIECBAgQIAAgZ1DoKAdALNmzYqvf/3rcd5558WcOXPKFJw9e3akr4MGDx4cZ555ZqxYsaLMuC4QIECAAAECBAgQIFCcAtr/xVkvSkWAAAECBAgQIECgRKBgHQBr166Nc845J8aMGZOlvdtuu0XPnj3jpJNOKskr99u6devc/vPPPx9XXHFF7tgOAQIECBAgQIAAAQLFL6D9X/x1pIQECBAgQIAAAQIECtYBkL7mnzhxYiZ68cUXR/rKf/To0XHuueduofyb3/wm3nrrrdh7772za4899li2TsAWEZ0gQIAAAQIECBAgQKAoBbT/i7JaFIoAAQIECBAgQIDAJgIF6QBIX/+kef1TOPXUU+P++++PZs2abZLR5gdHHXVUvPTSS1GnTp1Yt25dPPDAA5tHcUyAAAECBAgQIECAQBEKaP9vfaXMmzcvpk2bFhMmTIhXX301xo8fH++99178/e9/j5UrV259wu4kQIAAAQIECBAgUIpA3VLOVfrU+++/n2us3nHHHVG7dn79Ch06dIg+ffrEs88+G9OnT690vm4gQIAAAQIECBAgQKDqBbT/8zdfunRpPProozFixIjsxX86LivUrVs3OnbsGN26dYvevXvHaaedFrVq1SoruvMECBAgQIAAAQIEKhTI7019BclMmTIli5Hm/T/kkEMqiL3p5cMOOyw78dFHH216wREBAgQIECBAgAABAkUpoP1fcbXMnz8/+vXrF61atYr+/fvHuHHjoryX/ynFNLJi8uTJcd9992UdAOlvpbRmmkCAAAECBAgQIEBgawUKMgJg1apVWf677LJL3l//lxS4pBHcuHHjklN+CRAgQIAAAQIECBAoYgHt//Ir54svvoiTTz45pk6dmouYvuRPa6C1adMmWrRoEQ0bNoz69etnL/3T1D9LliyJuXPnxpw5c6LEN00VdMYZZ0QaZT1gwIBcWnYIECBAgAABAgQI5CtQkA6ATp06ZfktWLAga7S2bt063/xj0qRJWdyvfe1red8jIgECBAgQIECAAAEC1Seg/V+2/fLly6NXr165l/9HHnlkXHPNNdGjR4/sxX/Zd/7XlTVr1mTrA6Rpgx5++OFIx1dffXW0b98+mxKoovtdJ0CAAAECBAgQILCxQEGmAEov79NivikMHjx44/TL3X/hhReyha9SJB0A5VK5SIAAAQIECBAgQKBoBLT/y66Kp556KpvuJ8U499xzs0V+02/66j+fUK9evejevXsMHz48Ro4cGek4heuvvz7Wr1+fTxLiECBAgAABAgQIEMgJFKQDoEGDBvGd73wnS/TBBx+M22+/vcLG6V/+8pfo27dvdk+jRo2yOS5zpbJDgAABAgQIECBAgEDRCmj/l101b775ZnYxzd+fvuKvXXvr/+RKiwAPGzYsSy9NJzRr1qyyM3aFAAECBAgQIECAQCkCW98a3Syxe++9N5vTMp2+7rrr4uijj44hQ4ZEyQJhGzZsyPbTMNazzz47TjzxxPj000+zVIYOHRr777//Zik6JECAAAECBAgQIECgWAW0/0uvmbFjx2YXTj/99NzX+6XHzO/sWWedlYs4ffr03L4dAgQIECBAgAABAvkIFGQNgJRR8+bN45FHHslGAixbtiwmTpyYbSWFWLhwYXTp0qXkMPebvmq58sorc8d2CBAgQIAAAQIECBAofgHt/9Lr6JNPPskuVGZdtNJT+q+zyTlNA5TWAlixYkV5UV0jQIAAAQIECBAgsIVAwUYApJRPPvnk+OCDD+LCCy+MWrVqbZHZxidatmyZdRiMGjWqwrgb32efAAECBAgQIECAAIHiEND+37IeDjjggOzkuHHjtry4FWfSlELp5X8KpX1QtRVJuoUAAQIECBAgQGAnEijYCIB169ZlCwHvs88+2VyX11xzTaTG6owZM7Lts88+i3bt2kX79u2z7YwzzogmTZrsRNQelQABAgQIECBAgMCOI6D9X3pddu3aNZv69Mknn8zWPDv++ONLj5jH2UWLFsXAgQOzmM2aNcv+nsrjNlEIECBAgAABAgQI5AQK0gGQ5vdPDd00zPX73/9+pHkqO3funG25nOyUKjBv3rxI0yN9+eWX2ZYWVGvatGnWOZKG+6ZjgQABAgQIECBAgEAxCWj/l10bN9xwQ/ZB1MqVK6NPnz7xr//6r1lHwC677FL2TaVcSWupXXbZZbk11S6//PJSYjlFgAABAgQIECBAoHyBgnQAvPHGG/Ef//Ef2fbee+/Fd7/73fJz3YmvLl26NPuDYMSIETFt2rRIx2WFunXrRseOHaNbt27Ru3fvSOslVDS1UllpOU+AAAECBAgQIECgUALa/2VLpimAhg4dGoMGDYrFixdHenGf9tNIgPSRVBoVvddee0XDhg2zj33Wrl0bqbNgyZIlMXfu3Jg5c2a8/vrr2d8KJbmccsopcfPNN5cc+iVAgAABAgQIECCQt0BBOgD++te/5jLs1atXbt/O/wjMnz8/fv7zn8djjz1W7kv//7kjIv0xMHny5Gy777774mtf+1rcdtttwXhjJfsECBAgQIAAAQJVLaD9X774tddeG2k0b79+/bKFe9NHP2nts7RVNvTs2TPSx0O1axd0+bbKFkN8AgQIECBAgACBGipQkA6ADh065B4/feUibCrwxRdfZAskT506NXchfcm/9957R5s2baJFixbZF0D169fPXvpv/AXQnDlzYtWqVdl9acRAWjvhjjvuiAEDBuTSskOAAAECBAgQIECgKgW0/yvW7tu3bzaK9xe/+EU89NBD8emnn1Z803/HSH8XpBf/l156aZZG3jeK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v5Op8p9x48ZFWsQ4LUK2rSFNZ5RCybDnbU3P/QQIECBAgAABAtUvoP3/P3WQFvL9j//4j03m/f+fqxFHHHFEvPPOOxufKnf/888/j/TyP4U999yz3LguEiBAgEDhBdL0zCmcccYZhU+8gCm2atUqmz569913L2CqkiJAYEcQ2C4dADsCzPZ+hrZt20baakJIaxikKYsKGTZe06CQ6UqLAAECBAgQIECAQHUKpBf8qQPg3//93+OOO+7YoihpOp/f/OY3WSdA+pK0oi82S9rhtWrVisMPP3yL9JwgQIAAge0rULIWZvrf4bQVY0gfbP7973/P1pLUAVCMNaRMBKpXQAdA9frXiNzTtEWnnnpqQUYAPPvss5GGiPvjpUZUvUISIECAAAECBAhUUiBN2ZMW7E1T/dx+++0xaNCgTVLo0aNHNG3aND777LO47bbb4l/+5V82ub7xwccffxx33XVXdiqNLEj3CQQIECBQPQKpU7d79+7Vk3kFuf7zP/9zfPjhhxXEcpkAgZ1VQAdAkdZ8+hrojTfeyEq33377Rbt27aqtpGkqov79+xck//SHUOoASFMdCQQIECBAgAABAgR2NIG0BlqaDnXixIlx3XXXZfP2Dx48OJo3b549asuWLbPRtaecckqk8w0bNoyrrrpqi5EAb731VvTp0yfmz5+f3ffjH/94R6PyPAQIECBAgAABAlUgULsK8pDFVgikIWYnnHBCtqUviAQCBAgQIECAAAECBIpfoH79+vHMM8/EHnvskRX217/+dba214UXXhgPP/xwTJ48Odq0aZPtb9iwIQYOHBiHHnpoXHLJJXHLLbfEBRdckMVPi/2WvPxPnQrpukCAAAECBAgQIECgsgJGAFRWTHwCBAgQIECAAAECBAiUI9C6devsK//00n/GjBmxePHiSAslp6208MEHH0TaSgtpzYB77rmntEvOESBAgAABAgQIEKhQQAdAhUTbFmHmzJmxdu3aSieydOnS3D0LFiyI999/P3dcsnPwwQeX7PolQIAAAQIECBAgQKCIBLp16xZTp06NNALg0UcfzRYGrkzxDjnkkLjyyivjBz/4QdEuOlmZ5xGXAAECBAgQIECgegR0AGxn969//evx6aefblMu9913X6Rt85CGDAsECBAgQIAAAQIECBSnQJoO6Jprrsm26dOnx6RJk2LatGnx0UcfxZIlSyJN+7l69epo3Lhx7LbbbrHvvvtGx44dI3UedOrUqTgfSqkIECBAgAABAgRqlIAOgBpVXQpLgAABAgQIECBAgEBNFGjfvn2kTSBAgAABAgQIECBQlQI6ALaz9k9+8pNsYa+VK1dmOaUve0477bQKh/GmL4GeffbZ7J4OHTrEYYcdtp1LKnkCBAgQIECAAAECBAgQIECAAAECBAgQ2JEEtroD4N/+7d/KXMRq4sSJOaPLL788GjRokDsua+e73/1upG1HC1dccUV885vfjPPPPz+mTJkSaW7/RYsWxUMPPRT77LNPmY+bFgor6QA488wz45ZbbikzrgsECBAgQIAAAQIEtreA9v/2FpY+AQIECBAgQIAAgcILbHUHwBtvvJFXaf7whz/kFS8tcrUjdgCkh09f8L/11ltx0003xR133BF/+tOfsrk977333jj77LPz8hGJAAECBAgQIECAQHUKaP9Xp768CRAgQIAAAQIECGydQO2tu81dlRXYZZddIn019fLLL0fr1q1j4cKFcc4558QFF1wQ6Wt/gQABAgQIECBAgAABAgQIECBAgAABAgQIFFKgUiMATjjhhPjtb39byPxzaXXu3Dm3vyPvpOmA3n333UhTA/3+97+PESNGxOuvv565nnjiiTvyo3s2AgQIECBAgACBGiag/V/DKkxxCRAgQIAAAQIECGwmUKkOgPbt20fahG0T2H333eN3v/td9OrVK/r16xdz586Nk046KQYMGBBDhw7Na82EbSuBuwkQIECAAAECBAhULKD9X7GRGAQIECBAgAABAgSKWcAUQNVYO2lh4DQa4Bvf+EZs2LAh7rrrrjjiiCNi8uTJ1VgqWRMgQIAAAQIECBAgQIAAAQIECBAgQIDAjiCgA6Caa7FNmzbxl7/8JW699daoV69e/PWvf41u3brFbbfdVs0lkz0BAgQIECBAgAABAgQIECBAgAABAgQI1GQBHQBFUHu1a9eO66+/PsaPHx8HH3xwrFmzRgdAEdSLIhAgQIAAAQIECPx/9u4ESq6qTBz4lyYh3SR0lBDDDgFkiSZsAiLDJstAAkHliAw6LOOGBkfWGUA9ruAyLHoETFQW0egBGVkUAcdRiUJilAQkApJACMFAUBKSkJCEkP7XfU7VvxPS3dXV1d2vqn7vnE5X1bv3vu/+7kt11fveu48AAQIECBAgQIAAAQK1LCABkKPR23fffWPmzJnZfQFyFJZQCBAgQIAAAQIECBAgQIAAAQIECBAgQKAGBbp1E+Aa7F/NhdzS0hJXX311doPgO+64I4v/gAMOqLl+CJgAAQIECBAgQIAAAQIECBAgQIAAAQIE+ldAAqB//Tvc+nHHHRfpx0KAAAECBAgQIECAAAECBAgQIECAAAECBCoRMAVQJWrqECBAgAABAgQIECBAgAABAgQIECBAgACBnAtIAOR8gIRHgAABAgQIECBAgAABAgQIECBAgAABAgQqEZAAqERNHQIECBAgQIAAAQIECBAgQIAAAQIECBAgkHMBCYCcD5DwCBAgQIAAAQIECBAgQIAAAQIECBAgQIBAJQISAJWoqUOAAAECBAgQIECAAAECBAgQIECAAAECBHIuIAGQ8wESHgECBAgQIECAAAECBAgQIECAAAECBAgQqERAAqASNXUIECBAgAABAgQIECBAgAABAgQIECBAgEDOBSQAcj5AwiNAgAABAgQIECBAgAABAgQIECBAgAABApUISABUoqYOAQIECBAgQIAAAQIECBAgQIAAAQIECBDIuYAEQM4HSHgECBAgQIAAAQIECBAgQIAAAQIECBAgQKASAQmAStTUIUCAAAECBAgQIECAAAECBAgQIECAAAECOReQAMj5AAmPAAECBAgQIECAAAECBAgQIECAAAECBAhUIiABUImaOgQIECBAgAABAgQIECBAgAABAgQIECBAIOcCEgA5HyDhESBAgAABAgQIECBAgAABAgQIECBAgACBSgQkACpRU4cAAQIECBAgQIAAAQIECBAgQIAAAQIECORcQAIg5wMkPAIECBAgQIAAAQIECBAgQIAAAQIECBAgUImABEAlauoQIECAAAECBAgQIECAAAECBAgQIECAAIGcC0gA5HyAhEeAAAECBAgQIECAAAECBAgQIECAAAECBCoRkACoRE0dAgQIECBAgAABAgQIECBAgAABAgQIECCQcwEJgJwPkPAIECBAgAABAgQIECBAgAABAgQIECBAgEAlAhIAlaipQ4AAAQIECBAgQIAAAQIECBAgQIAAAQIEci4gAZDzARIeAQIECBAgQIAAAQIECBAgQIAAAQIECBCoREACoBI1dQgQIECAAAECBAgQIECAAAECBAgQIECAQM4FJAByPkDCI0CAAAECBAgQIECAAAECBAgQIECAAAEClQhIAFSipg4BAgQIECBAgAABAgQIECBAgAABAgQIEMi5gARAzgdIeAQIECBAgAABAgQIECBAgAABAgQIECBAoBIBCYBK1NQhQIAAAQIECBAgQIAAAQIECBAgQIAAAQI5F5AAyPkACY8AAQIECBAgQIAAAQIECBAgQIAAAQIECFQiIAFQiZo6BAgQIECAAAECBAgQIECAAAECBAgQIEAg5wISADkfIOERIECAAAECBAgQIECAAAECBAgQIECAAIFKBCQAKlFThwABAgQIECBAgAABAgQIECBAgAABAgQI5FxAAiDnAyQ8AgQIECBAgAABAgQIECBAgAABAgQIECBQiYAEQCVq6hAgQIAAAQIECBAgQIAAAQIECBAgQIAAgZwLSADkfICER4AAAQIECBAgQIAAAQIECBAgQIAAAQIEKhGQAKhETR0CBAgQIECAAAECBAgQIECAAAECBAgQIJBzAQmAnA+Q8AgQIECAAAECBAgQIECAAAECBAgQIECAQCUCEgCVqKlDgAABAgQIECBAgAABAgQIECBAgAABAgRyLiABkPMBEh4BAgQIECBAgAABAgQIECBAgAABAgQIEKhEQAKgEjV1CBAgQIAAAQIECBAgQIAAAQIECBAgQIBAzgUkAHI+QMIjQIAAAQIECBAgQIAAAQIECBAgQIAAAQKVCEgAVKKmDgECBAgQIECAAAECBAgQIECAAAECBAgQyLmABEDOB0h4BAgQIECAAAECBAgQIECAAAECBAgQIECgEgEJgErU1CFAgAABAgQIECBAgAABAgQIECBAgAABAjkXkADI+QAJjwABAgQIECBAgAABAgQIECBAgAABAgQIVCIgAVCJmjoECBAgQIAAAQIECBAgQIAAAQIECBAgQCDnAhIAOR8g4REgQIAAAQIECBAgQIAAAQIECBAgQIAAgUoEJAAqUVOHAAECBAgQIECAAAECBAgQIECAAAECBAjkXEACIOcDJDwCBAgQIECAAAECBAgQIECAAAECBAgQIFCJgARAJWrqECBAgAABAgQIECBAgAABAgQIECBAgACBnAtIAOR8gIRHgAABAgQIECBAgAABAgQIECBAgAABAgQqEZAAqERNHQIECBAgQIAAAQIECBAgQIAAAQIECBAgkHMBCYCcD5DwCBAgQIAAAQIECBAgQIAAAQIECBAgQIBAJQISAJWoqUOAAAECBAgQIECAAAECBAgQIECAAAECBHIuIAGQ8wESHgECBAgQIECAAAECBAgQIECAAAECBAgQqERAAqASNXUIECBAgAABAgQIECBAgAABAgQIECBAgEDOBSQAcj5AwiNAgAABAgQIECBAgAABAgQIECBAgAABApUISABUoqYOAQIECBAgQIAAAQIECBAgQIAAAQIECBDIuYAEQM4HSHgECBAgQIAAAQIECBAgQIAAAQIECBAgQKASAQmAStTUIUCAAAECBAgQIECAAAECBAgQIECAAAECORcYmPP4hEeAAAECBAgQIECAAIG6EVi4cGEsXrw4Vq5cmf00NzfHsGHDorW1NYYPHx7puYUAAQIECBAgQIBAtQQkAKolqR0CBAgQIECAAAECBAhsILB8+fK46aabYsqUKTF79uxIzztaBg4cGGPGjIkDDzwwjj/++Bg3blwMGDCgo+JeJ0CAAAECBAgQINClgCmAuiRSgAABAgQIECBAgAABAt0TWLRoUUycODG23XbbOPvss2PatGmdHvxPra9duzZmzZoVkyZNyhIAY8eOjbvuuqt7G1aaAAECBAgQIECAQDsBVwC0w/CQAAECBAgQIECAAAECPRVYsmRJHH300fHII4+Umkpn8m+99daxww47xIgRI6KlpSUGDx6cHfRftWpVLFu2LBYsWBDz58+P1atXZ/XSFQMTJkyIK664Is4555xSWx4QIECAAAECBAgQKFdAAqBcKeUIECBAgAABAgQIECDQhcCKFSti/PjxpYP/+++/f5x33nlx5JFHZgf+u6ger776asyYMSObNuiGG27Inp977rmx2267ZVMCdVXfegIECBAgQIAAAQLtBUwB1F7DYwIECBAgQIAAAQIECPRA4JZbbsmm+0lNnHLKKTF9+vTsdzrrv5xl0KBBcfDBB8fkyZPj9ttvj/Q8LRdddFGsW7eunCaUIUCAAAECBAgQIFASkAAoUXhAgAABAgQIECBAgACBngk88MADWQNp/v5089+mpsq/cqWbAF9++eVZe2k6oXnz5vUsOLUJECBAgAABAgQaTqDyT6MNR6XDBAgQIECAAAECBAgQ6Fzg/vvvzwqccMIJpbP3O6/R+dqTTjqpR4uvzQAAQABJREFUVOCJJ54oPfaAAAECBAgQIECAQDkCEgDlKClDgAABAgQIECBAgACBMgSeffbZrNT2229fRumuiwwfPryUSHjllVe6rqAEAQIECBAgQIAAgXYCEgDtMDwkQIAAAQIECBAgQIBATwR22WWXrPq0adN60kypbppSKN0YOC377LNP6XUPCBAgQIAAAQIECJQjMLCcQsoQIECAAAECBAgQIECAQNcC++23Xzz00ENx8803x5lnnhmHHXZY15U6KPHSSy/F+eefn63dYostYtSoUR2U9DKB7gl84xvfyPU9JZ555pnudUhpAgQIECBAoEMBCYAOaawgQIAAAQIECBAgQIBA9wQuvvji7Oa/q1atihNPPDG++tWvZomATTfdtFsNpSTCRz7ykSyZkCqeddZZ3aqvMIGOBJ566qk455xzOlrtdQIECBAgQKDOBCQA6mxAdYdAZwKLFi2KvM0du3Llys5Cto4AAQIECBAgUFMCaQqgyy67LC688MJYunRpduA+PU5XAuy9997ZWfwjR46MlpaWaG5ujrVr10ZKFixbtiwWLFgQc+fOjalTp8bs2bNL/T7mmGPii1/8Yum5BwR6IlCcUuqNb3xjnHHGGT1pqtfq/uEPf4jf/e53vda+hgkQIECAQCMJSAA00mjra0ML3HnnndlZaA2NoPMECBAgQIAAgT4QuOCCCyLdvHfixInZyRfLly+Pn/3sZ9lPdzd/7LHHxpQpU6Kpye3bumunfOcCm2++eZxyyimdF+qntWvWrJEA6Cd7myVAgACB+hOQAKi/MdUjAhsVSGeTpWXIkCHR2tq60TL98WK6KmHdunX9sWnbJECAAAECBAj0mkCa///444+Pr3/963H99dfH888/X/a2Bg8eHOnA/4c+9KGsjbIrKkiAAAECBAgQIEBgAwEJgA1APCVQ7wITJkzI1Zyf6cvtkiVL6p1d/wgQIECAAIEGFBgxYkRceuml2c/TTz8d06dPjzlz5mTT/aTpgdKVAYMGDYqhQ4dmJ2ik6YNGjx4de+21V/Zaf5G9/PLL2b0HqnGSxrPPPttf3bBdAgQIECBAgACBgoAEgN2AAAECBAgQIECAAAECvSyw0047RfqpheXf/u3f4sc//nFVQ501a1ZV29MYAQIECBAgQIBAeQISAOU5KUWAAAECBAgQIECAAIGGEHjXu94VL7zwQrS1tfW4v08++WT89a9/je22267HbWmAAAECBAgQIECg+wISAN03U4MAAQIECBAgQIAAAQJVFXjttdfit7/9bdbmjjvuGKNGjapq+91p7NRTT430U43l3HPPze6DkKZDshAgQIAAAQIECPS9QFPfb9IWCRAgQIAAAQIECBAgQKC9QJp3/4gjjsh+rrvuuvarPCZAgAABAgQIECBQsYAEQMV0KhIgQIAAAQIECBAgQIAAAQIECBAgQIAAgfwKmAIov2MjMgIECBAgQIAAAQIEakxg7ty5sXbt2m5HvXz58lKdF198MR5//PHS8+KDPfbYo/jQbwIECBAgQIAAAQJlCUgAlMWkEAECBAgQIECAAAECBLoWOOSQQ+L555/vumAnJSZNmhTpZ8OlGjfl3bBNzwkQIECAAAECBOpbwBRA9T2+ekeAAAECBAgQIECAAAECBAgQIECAAAECDSrgCoAGHXjdJkCAAAECBAgQIECg+gKf+cxn4vzzz49Vq1ZljW+++eYxbty4GDBgQKcbW7NmTfzkJz/JyowePTrGjh3baXkrCRAgQIAAAQIECJQjIAFQjpIyBAgQIECAAAECBAgQKEPg4x//eBx++OHx/ve/Px566KFIc/u/9NJLcf3118c222zTYQtLly4tJQDe/e53x5e+9KUOy1pBgAABAgQIECBAoFwBCYBypZQjQIAAAQIECBAgQIBAGQLpDP7f//738elPfzquuOKKuPfee2PMmDHxrW99K04++eQyWlCEAAECBAiUL7By5cqs8Oc///nYYostyq/YxyXT1W1nn312H2/V5ggQkACwDxAgQIAAAQIECBAgQKDKAptuuml87Wtfy6b/Oe2002LBggXxvve9L+6888645pprYtiwYVXeouYIECBAoFEFXnzxxazr//3f/517gtNPPz3S9HgWAgT6TkACoO+sbYkAAQIECBAgQIAAgQYTSNMB/elPf4o0NdCPfvSjmDJlSkydOjVuvPHGeOc739lgGrpLgAABAr0p8MEPfjDe9KY39eYmKm77yiuvjNWrV8fatWsrbkNFAgQqE5AAqMxNLQIECBAgQIAAAQIECJQl8IY3vCF++MMfxvjx42PixInZ1QBHHXVUnHPOOXHZZZdFc3NzWe0oRIAAAQIEOhNIieVdd921syL9tu7qq6/OEgD9FoANE2hggaYG7ruuEyBAgAABAgQIECBAoM8E0o2B09UAhx56aLS1tcVVV10Vb3vb22LWrFl9FoMNESBAgAABAgQINJaABEBjjbfeEiBAgAABAgQIECDQjwI77LBD/PrXv44vf/nLMWjQoPjzn/8cBx54YHzlK1/px6hsmgABAgQIECBAoF4FJADqdWT1iwABAgQIECBAgACBXAo0NTXFRRddFNOnT4899tgjXn31VQmAXI6UoAgQIECAAAECtS8gAVD7Y6gHBAgQIECAAAECBAjUoMC+++4bM2fOzO4LUIPhC5kAAQIECBAgQKAGBNwEuAYGSYgECBAgQIAAAQIECNSnQEtLS6QbI6YbBN9xxx1ZJw844ID67KxeESBAgAABAgQI9LmABECfk9sgAQIECBAgQIAAAQIE1hc47rjjIv1YCBAgQIAAAQIECFRTwBRA1dTUFgECBAgQIECAAAECBAgQIECAAAECBAgQyImABEBOBkIYBAgQIECAAAECBAgQIECAAAECBAgQIECgmgISANXU1BYBAgQIECBAgAABAgQIECBAgAABAgQIEMiJgARATgZCGAQIECBAgAABAgQIECBAgAABAgQIECBAoJoCEgDV1NQWAQIECBAgQIAAAQIECBAgQIAAAQIECBDIiYAEQE4GQhgECBAgQIAAAQIECBAgQIAAAQIECBAgQKCaAhIA1dTUFgECBAgQIECAAAECBAgQIECAAAECBAgQyImABEBOBkIYBAgQIECAAAECBAgQIECAAAECBAgQIECgmgISANXU1BYBAgQIECBAgAABAgQIECBAgAABAgQIEMiJgARATgZCGAQIECBAgAABAgQIECBAgAABAgQIECBAoJoCEgDV1NQWAQIECBAgQIAAAQIECBAgQIAAAQIECBDIiYAEQE4GQhgECBAgQIAAAQIECBAgQIAAAQIECBAgQKCaAhIA1dTUFgECBAgQIECAAAECBAgQIECAAAECBAgQyImABEBOBkIYBAgQIECAAAECBAgQIECAAAECBAgQIECgmgISANXU1BYBAgQIECBAgAABAgQIECBAgAABAgQIEMiJwMCcxCEMAgQIECDQEAJtbW1ZPz/ykY9EU1N+8vApllNPPTUOO+ywhhgHnSRAgAABAgQIECBAgAABAo0gIAHQCKOsjwQIECCQG4FiAuD666/PTUzFQObMmRO/+tWvik/9JkCAAAECBAgQIECAAAECBGpcQAKgxgdQ+AQIECBQmwIXXXRRbq4AeOaZZ+IHP/hBrF27tjYxRU2AAAECBAgQIECAAAECBAhsVEACYKMsXiRAgAABAr0rMGHChNhkk016dyNltj5r1qwsAVBmccUIECBAgAABAgQIECBAgACBGhHIz+TDNQImTAIECBAgQIAAAQIECBAgQIAAAQIECBAgUAsCEgC1MEpiJECAAAECBAgQIECAAAECBAgQIECAAAEC3RSQAOgmmOIECBAgQIAAAQIECBAgQIAAAQIECBAgQKAWBCQAamGUxEiAAAECBAgQIECAAAECBAgQIECAAAECBLop4CbA3QSrdvGFCxfG4sWLY+XKldlPc3NzDBs2LFpbW2P48OGRnlsIECBAgAABAgQIECBAgAABAgQIECBAgEB3BSQAuivWw/LLly+Pm266KaZMmRKzZ8+O9LyjZeDAgTFmzJg48MAD4/jjj49x48bFgAEDOirudQIECBAgQIAAAQIECBAgQIAAAQIECBAgUBIwBVCJoncfLFq0KCZOnBjbbrttnH322TFt2rROD/6naNauXRuzZs2KSZMmZQmAsWPHxl133dW7gWqdAAECBAgQIECAAAECBAgQIECAAAECBOpCwBUAfTCMS5YsiaOPPjoeeeSR0tbSmfxbb7117LDDDjFixIhoaWmJwYMHZwf9V61aFcuWLYsFCxbE/PnzY/Xq1Vm9dMXAhAkT4oorrohzzjmn1JYHBAgQIECAAAECBAgQIECAAAECBAgQIEBgQwEJgA1Fqvx8xYoVMX78+NLB//333z/OO++8OPLII7MD/11t7tVXX40ZM2Zk0wbdcMMNkZ6fe+65sdtuu2VTAnVV33oCBAgQIECAAAECBAgQIECAAAECBAgQaEwBUwD18rjfcsst2XQ/aTOnnHJKTJ8+PfudzvovZxk0aFAcfPDBMXny5Lj99tsjPU/LRRddFOvWrSunCWUIECBAgAABAgQIECBAgAABAgQIECBAoAEFJAB6edAfeOCBbAtp/v5089+mpsrJ002AL7/88qy9NJ3QvHnzejl6zRMgQIAAAQIECBAgQIAAAQIECBAgQIBArQpUfjS6Vnvcx3Hff//92RZPOOGE0tn7PQnhpJNOKlV/4oknSo89IECAAAECBAgQIECAAAECBAgQIECAAAEC7QUkANpr9MLjZ599Nmt1++23r0rrw4cPLyUSXnnllaq0qRECBAgQIECAAAECBAgQIECAAAECBAgQqD8BCYBeHtNddtkl28K0adOqsqU0pVC6EXBa9tlnn6q0qRECBAgQIECAAAECBAgQIECAAAECBAgQqD8BCYBeHtP99tsv28LNN98c9913X4+29tJLL8X555+ftbHFFlvEqFGjetSeygQIECBAgAABAgQIECBAgAABAgQIECBQvwISAL08thdffHE2Zc+qVavixBNPjMmTJ8eaNWu6vdWHHnoojjnmmEi/03LWWWd1uw0VCBAgQIAAAQIECBAgQIAAAQIECBAgQKBxBAY2Tlf7p6dpCqDLLrssLrzwwli6dGl24D49Puyww2LvvffOzuIfOXJktLS0RHNzc6xduzZSsmDZsmWxYMGCmDt3bkydOjVmz55d6kBKBHzxi18sPfeAAAECBAgQIECAAAECBAgQIECAAAECBAhsKCABsKFILzy/4IILIt28d+LEiZFu3Lt8+fL42c9+lv10d3PHHntsTJkyJZqaXLzRXTvlCRAgQIAAAQIECBAgQIAAAQIECBAg0EgCjiL30WifeeaZMX/+/Ljkkktiq6226tZWBw8enE0f9NOf/jTuvvvuSPP/WwgQIECAAAECBAgQIECAAAECBAgQIECAQGcCrgDoTKfK60aMGBGXXnpp9vP000/H9OnTY86cOdl0P2l6oHRlwKBBg2Lo0KHR2toaafqg0aNHx1577ZW9VuVwym7ukUceidtvvz3WrVtXdp2OCqY+pyVNc2QhQIAAAQIECBAgQIAAAQIECBAgQIAAgd4TkADoPdtOW95pp50i/dTCkm5kfNddd1U11Icffriq7WmMAAECBAgQIECAAAECBAgQIECAAAECBNYXkABY38OzjQikmxjvv//+0dbWtpG13Xvpnnvuid///vfZVQ3dq6k0AQIECBAgQIAAAQIECBAgQIAAAQIECHRHQAKgO1pVLLt69epIc/t3d3nxxRezGwmnetttt113q1dUfuzYsZF+qrGkqY5SAqC5ubkazWmDAAECBAgQIECAAAECBAgQIECAAAECBDoQcBPgDmB64+Vbb701jjvuuBg5cmS0tLTEnnvuGaeddlrcf//9ZW/ujDPOiO233z77KbuSggQIECBAgAABAgQIECBAgAABAgQIECDQcAISAH0w5CtWrIjTTz893vve90aaAueFF17IptN5/PHH4/vf/34ceuihcd5555XO7O+DkGyCAAECBAgQIECAAAECBAgQIECAAAECBOpcQAKgDwb4kksuiZtuuqm0pSFDhsSoUaNiwIAB2Wvr1q2Lq666Kvbee++YN29eqZwHBAgQIECAAAECBAgQIECAAAECBAgQIECgUgEJgErlyqz30EMPxTXXXJOVTlP/3HHHHbFs2bJ46qmnYsmSJfG1r30thg0blq1/4okn4vDDD5cEKNNWMQIECBAgQIAAAQIECBAgQIAAAQIECBDoWMBNgDu2qcqab33rW/Haa6/FwIED495774299tqr1G468H/hhRfGBz7wgezeAA8//HA888wzceSRR8a0adOyewWUCntQMwKrVq2KU089NZ599tlcxfz888/nKh7BECBAgAABAgQIECBAgAABAgQIECDQuwISAL3rG4899li2hXRAuP3B//ab3XrrrWPq1KkxYcKEuO+++7IrAMaPH589TtMFWWpL4C9/+UvcdttttRW0aAkQIECAAAECBAgQIECAAAECBAgQqDsBCYBeHtJ0MDgt++23X6dbam1tjbvvvrt09v+DDz4YJ598ctx5552xySabdFrXynwJtLW1ZQFtv/328YUvfCE3wX3jG9+INCWVhQABAgQIECBAgAABAgQIECBAgACBxhCQAOjlcV6zZk22hc0226zLLbW0tGQH/A866KCYO3du/PznP49PfOITce2113ZZV4H8CTQ3N8fo0aNzE9jmm2+em1gEQoAAAQIECBAgQIAAAQIECBAgQIBA7wu4CXAvG7/5zW/OtvDoo4+WtaUtt9wy7rnnnhgxYkRWPt1D4MorryyrrkIECBAgQIAAAQIECBAgQIAAAQIECBAgQKAoIAFQlOil38UEwJQpU2Lx4sVlbWWXXXbJrgRIVwSk5YILLoibbrqprLoKESBAgAABAgQIECBAgAABAgQIECBAgACBJCAB0Mv7Qbr5b1peeOGFSI8XLVpU1hbf/va3R0oaNDU1RZpT/swzz4zPf/7zsW7durLqK0SAAAECBAgQIECAAAECBAgQIECAAAECjS0gAdDL4z9+/Pg46qijsq3ce++9seeee2YH86+++uout/zud787m/9/wIAB2YH/z33uc9n0QF1WVIAAAQIECBAgQIAAAQIECBAgQIAAAQIEGl5AAqAPdoHJkyfHmDFjsi0tWbIkbrzxxpg0aVJZW/7oRz8a119/fQwc+I/7NbsCoCw2hQgQIECAAAECBAgQIECAAAECBAgQINDwAhIAfbAL7LzzzjFjxoyYOHFiDBkyJNviNttsU/aWzzjjjJg1a1YccsghZddRkAABAgQIECBAgAABAgQIECBAgAABAgQaW0ACoI/Gv7m5OdK0Py+99FJMmzYtu7Fvdzb91re+NaZOnRrf+973It0foLW1tTvVlSVAgAABAgQIECBAgAABAgQIECBAgACBBhP4x7wyDdbp/uxumsonHcCvdDnttNMi/VgIECBAgAABAgQIECBAgAABAgQIECBAgEBnAq4A6EzHOgIECBAgQIAAAQIECBAgQIAAAQIECBAgUKMCEgA1OnDCJkCAAAECBAgQIECAAAECBAgQIECAAAECnQlIAHSmYx0BAgQIECBAgAABAgQIECBAgAABAgQIEKhRAQmAGh04YRMgQIAAAQIECBAgQIAAAQIECBAgQIAAgc4EJAA607GOAAECBAgQIECAAAECBAgQIECAAAECBAjUqIAEQI0OnLAJECBAgAABAgQIECBAgAABAgQIECBAgEBnAhIAnelYR4AAAQIECBAgQIAAAQIECBAgQIAAAQIEalRAAqBGB07YBAgQIECAAAECBAgQIECAAAECBAgQIECgMwEJgM50rCNAgAABAgQIECBAgAABAgQIECBAgAABAjUqIAFQowMnbAIECBAgQIAAAQIECBAgQIAAAQIECBAg0JmABEBnOtYRIECAAAECBAgQIECAAAECBAgQIECAAIEaFZAAqNGBEzYBAgQIECBAgAABAgQIECBAgAABAgQIEOhMQAKgMx3rCBAgQIAAAQIECBAgQIAAAQIECBAgQIBAjQoMrNG4hU2AAAECBAgQIECAAIGaE1i4cGEsXrw4Vq5cmf00NzfHsGHDorW1NYYPHx7puYUAAQIECBAgQIBAtQQkAKolqR0CBAgQIECAAAECBAhsILB8+fK46aabYsqUKTF79uxIzztaBg4cGGPGjIkDDzwwjj/++Bg3blwMGDCgo+JeJ0CAAAECBAgQINClgCmAuiRSgAABAgQIECBAgAABAt0TWLRoUUycODG23XbbOPvss2PatGmdHvxPra9duzZmzZoVkyZNyhIAY8eOjbvuuqt7G1aaAAECBAgQIECAQDsBVwC0w/CQAAECBAgQIECAAAECPRVYsmRJHH300fHII4+Umkpn8m+99daxww47xIgRI6KlpSUGDx6cHfRftWpVLFu2LBYsWBDz58+P1atXZ/XSFQMTJkyIK664Is4555xSWx4QIECAAAECBAgQKFdAAqBcKeUIECBAgAABAgQIECDQhcCKFSti/PjxpYP/+++/f5x33nlx5JFHZgf+u6ger776asyYMSObNuiGG27Inp977rmx2267ZVMCdVXfegIECBAgQIAAAQLtBUwB1F7DYwIECBAgQIAAAQIECPRA4JZbbsmm+0lNnHLKKTF9+vTsdzrrv5xl0KBBcfDBB8fkyZPj9ttvj/Q8LRdddFGsW7eunCaUIUCAAAECBAgQIFASkAAoUXhAgAABAgQIECBAgACBngk88MADWQNp/v5089+mpsq/cqWbAF9++eVZe2k6oXnz5vUsOLUJECBAgAABAgQaTqDyT6MNR6XDBAgQIECAAAECBAgQ6Fzg/vvvzwqccMIJpbP3O6/R+dqTTjqpVOCJJ54oPfaAAAECBAgQIECAQDkCEgDlKClDgAABAgQIECBAgACBMgSeffbZrNT2229fRumuiwwfPryUSHjllVe6rqAEAQIECBAgQIAAgXYCEgDtMDwkQIAAAQIECBAgQIBATwR22WWXrPq0adN60kypbppSKN0YOC377LNP6XUPCBAgQIAAAQIECJQjIAFQjpIyBAgQIECAAAECBAgQKENgv/32y0rdfPPNcd9995VRo+MiL730Upx//vlZgS222CJGjRrVcWFrCBAgQIAAAQIECGxEQAJgIyheIkCAAAECBAgQIECAQCUCF198cTZlz6pVq+LEE0+MyZMnx5o1a7rd1EMPPRTHHHNMpN9pOeuss7rdhgoECBAgQIAAAQIEBiIgQIAAAQIECBAgQIAAgeoIpCmALrvssrjwwgtj6dKl2YH79Piwww6LvffeOzuLf+TIkdHS0hLNzc2xdu3aSMmCZcuWxYIFC2Lu3LkxderUmD17dimglAj44he/WHruAQECBAgQIECAAIFyBSQAypVSjgABAgQIECBAgAABAmUIXHDBBZFu3jtx4sRIN+5dvnx5/OxnP8t+yqi+XpFjjz02pkyZEk1NLt5eD8YTAgQIECBAgACBsgR8iiyLSSECBAgQIECAAAECBAiUL3DmmWfG/Pnz45JLLomtttqq/IqFkoMHD86mD/rpT38ad999d6T5/y0ECBAgQIAAAQIEKhFwBUAlauoQIECAAAECBAgQIECgC4ERI0bEpZdemv08/fTTMX369JgzZ0423U+aHihdGTBo0KAYOnRotLa2Rpo+aPTo0bHXXntlr3XRfK+tnjRpUlxzzTWxbt26Hm/j+eefz9p47rnnetyWBggQIECAAAECBLovIAHQfTM1CBAgQIAAAQIECBAg0C2BnXbaKdJPLSwPPPDAevcgqEbMf//736vRjDYIECBAgAABAgS6KSAB0E0wxQkQIECAAAECBAgQINBdgdWrV2dT+3S33osvvpjdRyDV22677bpbvaLy1113XVx88cXR1tZWUf32lb7yla/E97///RgzZkz7lz0mQIAAAQIECBDoIwEJgD6CthkCBAgQIECAAAECBBpL4NZbb410MH3mzJnxt7/9LXbffffYf//946Mf/WgcfPDBZWGcccYZpZsHV+OAfDkbTdMS7bnnnuUU7bJMuhmyhQABAgQIECBAoP8E3AS4/+xtmQABAgQIECBAgACBOhRYsWJFnH766fHe97437rnnnnjhhReys+kff/zx7Gz4Qw89NM4777zSmf11SKBLBAgQIECAAAECORGQAMjJQAiDAAECBAgQIECAAIH6ELjkkkvipptuKnVmyJAhMWrUqBgwYED2Wrq57lVXXRV77713zJs3r1TOAwIECBAgQIAAAQLVFpAAqLao9ggQIECAAAECBAgQaFiBhx56KK655pqs/yNHjow77rgjli1bFk899VQsWbIkvva1r8WwYcOy9U888UQcfvjhkgANu7foOAECBAgQIECg9wUkAHrf2BYIECBAgAABAgQIEGgQgW9961vx2muvxcCBA+Pee++NCRMmRFPTP752pQP/F154YTz22GOx1157ZSLPPPNMHHnkkbFo0aIGEdJNAgQIECBAgACBvhSQAOhLbdsiQIAAAQIECBAgQKCuBdLB/bSceuqppYP8G3Z46623jqlTp8Zhhx2WrUrTAI0fPz7SvQMsBAgQIECAAAECBKopIAFQTU1tESBAgAABAgQIECDQ0AJ/+ctfsv7vt99+nTq0trbG3XffHQcddFBW7sEHH4yTTz45u3qg04pWEiBAgAABAgQIEOiGgARAN7AUJUCAAAECBAgQIECAQGcCa9asyVZvttlmnRXL1rW0tMSdd94Zu+66a/b85z//eXziE5/osp4CBAgQIECAAAECBMoVkAAoV0o5AgQIECBAgAABAgQIdCHw5je/OSvx6KOPdlHyH6u33HLLuOeee2LEiBHZC+keAldeeWVZdRUiQIAAAQIECBAg0JWABEBXQtYTIECAAAECBAgQIECgTIFiAmDKlCmxePHismrtsssu2ZUA6YqAtFxwwQVx0003lVVXIQIECBAgQIAAAQKdCUgAdKZjHQECBAgQIECAAAECBLohkG7+m5YXXnghuxHwokWLyqr99re/PVLSoKmpKdra2uLMM8+Mz3/+87Fu3bqy6itEgAABAgQIECBAYGMCEgAbU/EaAQIECBAgQIAAAQIEKhAYP358HHXUUVnNe++9N/bcc8/sYP7VV1/dZWvvfve749prr40BAwZkB/4/97nPZdMDdVlRAQIECBAgQIAAAQIdCEgAdADjZQIECBAgQIAAAQIECFQiMHny5BgzZkxWdcmSJXHjjTfGpEmTymrqox/9aFx//fUxcODArLwrAMpiU4gAAQIECBAgQKADAQmADmC8TIAAAQIECBAgQIAAgUoEdt5555gxY0ZMnDgxhgwZkjWxzTbblN3UGWecEbNmzYpDDjmk7DoKEiBAgAABAgQIENiYgATAxlS8RoAAAQIECBAgQIAAgR4INDc3R5r256WXXopp06ZlN/btTnNvfetbY+rUqfG9730v0v0BWltbu1NdWQIECBAgQIAAAQKZwD+uK4VBgAABAgQIECBAgAABAlUXSFP5pAP4lS6nnXZapB8LAQIECBAgQIAAgUoEXAFQiZo6BAgQIECAAAECBAgQIECAAAECBAgQIEAg5wISADkfIOERIECAAAECBAgQIECAAAECBAgQIECAAIFKBCQAKlFThwABAgQIECBAgAABAgQIECBAgAABAgQI5FxAAiDnAyQ8AgQIECBAgAABAgQIECBAgAABAgQIECBQiYAEQCVq6hAgQIAAAQIECBAgQIAAAQIECBAgQIAAgZwLSADkfICER4AAAQIECBAgQIAAAQIECBAgQIAAAQIEKhGQAKhETR0CBAgQIECAAAECBAgQIECAAAECBAgQIJBzAQmAnA+Q8AgQIECAAAECBAgQIECAAAECBAgQIECAQCUCEgCVqKlDgAABAgQIECBAgAABAgQIECBAgAABAgRyLiABkPMBEh4BAgQIECBAgAABAgQIECBAgAABAgQIEKhEQAKgEjV1CBAgQIAAAQIECBAgQIAAAQIECBAgQIBAzgUkAHI+QMIjQIAAAQIECBAgQIAAAQIECBAgQIAAAQKVCEgAVKKmDgECBAgQIECAAAECBAgQIECAAAECBAgQyLmABEDOB0h4BAgQIECAAAECBAgQIECAAAECBAgQIECgEgEJgErU1CFAgAABAgQIECBAgAABAgQIECBAgAABAjkXkADI+QAJjwABAgQIECBAgAABAgQIECBAgAABAgQIVCIgAVCJmjoECBAgQIAAAQIECBAgQIAAAQIECBAgQCDnAhIAOR8g4REgQIAAAQIECBAgQIAAAQIECBAgQIAAgUoEJAAqUVOHAAECBAgQIECAAAECBAgQIECAAAECBAjkXEACIOcDJDwCBAgQIECAAAECBAgQIECAAAECBAgQIFCJgARAJWrqECBAgAABAgQIECBAgAABAgQIECBAgACBnAtIAOR8gIRHgAABAgQIECBAgAABAgQIECBAgAABAgQqEZAAqERNHQIECBAgQIAAAQIECBAgQIAAAQIECBAgkHMBCYCcD5DwCBAgQIAAAQIECBAgQIAAAQIECBAgQIBAJQISAJWoqUOAAAECBAgQIECAAAECBAgQIECAAAECBHIuMDDn8QmPAAECBAgQ6COBtWvXxvLly/toa+VtZtCgQdHc3FxeYaUIECBAgAABAgQIECBAgACB9QQkANbj8IQAAQIECDSewJIlS7JOT5s2LVpbW3MFMGDAgLj11lvjPe95T67iEgwBAgQIECBAgAABAgQIEKgFAQmAWhglMRIgQIAAgV4U+Pvf/5613tTUlKuz7desWRPpqoQ//elPEgC9OP6aJkCAAAECBAgQIECAAIH6FZAAqN+x1TMCBAgQINAtgbFjx8bkyZO7Vac3C3/nO9+J7373u725CW0TIECAAAECBAgQIECAAIG6FpAAqOvh1TkCBAgQIECAAAECBAgQ6EuBww8/PGbOnNmXm+zWttatW9et8goTIECgGgKvvPJK1swOO+wQaZrPvC7HHHNMNgVpXuMTF4FKBCQAKlFThwABAgQIECBAgAABAgQIbCCwYsWKuO+++zZ41VMCBAgQSFN7puXll1/ONcY999yT6/gER6ASAQmAStTUIUCAAAECBAgQIECAAAECHQgMHjw47r777g7W9u/Lv//97+Piiy/u3yBsnQCBhhW48847Y+jQobnr/6pVq2LcuHG5i0tABKohIAFQDUVtECBAgAABAgQIECBAgACB/xNI01sMGTIklx4tLS25jEtQBAg0hkB6D8rj+2NTU1NjDIBeNqSAvbshh12nCRAgQIAAAQIECBAgQIAAAQIECBAgQKDeBSQA6n2E9Y8AAQIECBAgQIAAAQIECBAgQIAAAQIEGlJAAqAhh12nCRAgQIAAAQIECBAgQIAAAQIECBAgQKDeBSQA6n2E9Y8AAQIECBAgQIAAAQIECBAgQIAAAQIEGlJAAqAhh12nCRAgQIAAAQIECBAgQIAAAQIECBAgQKDeBSQA6n2E9Y8AAQIECBAgQIAAAQIECBAgQIAAAQIEGlJAAqAhh12nCRAgQIAAAQIECBAgQIAAAQIECBAgQKDeBSQA6n2E9Y8AAQIECBAgQIAAAQIECBAgQIAAAQIEGlJAAqAhh12nCRAgQIAAAQIECBAgQIAAAQIECBAgQKDeBSQA6n2E9Y8AAQIECBAgQIAAAQIECBAgQIAAAQIEGlJAAqAhh12nCRAgQIAAAQIECBAgQIAAAQIECBAgQKDeBSQA6n2E9Y8AAQIECBAgQIAAAQIECBAgQIAAAQIEGlJAAqAhh12nCRAgQIAAAQIECBAgQIAAAQIECBAgQKDeBSQA6n2E9Y8AAQIECBAgQIAAAQIECBAgQIAAAQIEGlJAAqAhh12nCRAgQIAAAQIECBAgQIAAAQIECBAgQKDeBSQA6n2E9Y8AAQIECBAgQIAAAQIECBAgQIAAAQIEGlJAAqAhh12nCRAgQIAAAQIECBAgQIAAAQIECBAgQKDeBSQA6n2E9Y8AAQIECBAgQIAAAQIECBAgQIAAAQIEGlJAAqAhh12nCRAgQIAAAQIECBAgQIAAAQIECBAgQKDeBSQA6n2E9Y8AAQIECBAgQIAAAQIECBAgQIAAAQIEGlJAAqAhh12nCRAgQIAAAQIECBAgQIAAAQIECBAgQKDeBSQA6n2E9Y8AAQIECBAgQIAAAQIECBAgQIAAAQIEGlJgYEP2WqcJECBAgAABAgQIECBAgAABAgQIECBQQwLTpk2L+fPn5zripqamOOKII2LEiBG5jrORgpMAaKTR1lcCBAgQIECAAAECBAgQIECAAAECBGpOYOHChfGOd7yjJuI+6aST4tZbb62JWBshSAmARhhlfSRAgAABAgQIECBAgAABAgQIECBAoGYFli9fnsW+2WabxcEHH5zLfrz44osxc+bMWLp0aS7ja9SgJAAadeT1mwABAgQIECBAgAABAgQIECBAgACBmhLYcsst40tf+lIuY54xY0aWAMhlcA0clJsAN/Dg6zoBAgQIECBAgAABAgQIECBAgAABAgQI1K+ABED9jq2eESBAgAABAgQIECBAgAABAgQIECBAgEADC0gANPDg6zoBAgQIECBAgAABAgQIECBAgAABAgQI1K+ABED9jq2eESBAgAABAgQIECBAgAABAgQIECBAgEADC0gANPDg6zoBAgQIECBAgAABAgQIECBAgAABAgQI1K/AwPrtmp4RIECAAAECtSzwyiuvZOH/8pe/jFWrVuWqKyNHjoxPfvKT0dTkXIpcDYxgCBAgQIAAAQIECBAgQGA9AQmA9Tg8IUCAAAECBPIi8Je//CUL5f7774/0k7fl7W9/exx00EF5C0s8BAgQIECAAAECBAgQIECgJCABUKLwgAABAgQIEMiTwLp167Jw3va2t8WBBx6Ym9Buu+22WLhwYaxZsyY3MQmEAAECBAgQIECAAAECBAhsTEACYGMqXiNAgAABAgRyI7D33nvHaaedlpt40tUIKQFgIUCAAAECBAgQIECAAAECeRcwcW3eR0h8BAgQIECAAAECBAgQIECAAAECBAgQIECgAgEJgArQVCFAgAABAgQIECBAgAABAgQIECBAgAABAnkXkADI+wiJjwABAgQIECBAgAABAgQIECBAgAABAgQIVCDgHgAVoKlCgAABAgQIECBAgAABAgQIECBAgEB9Cbz66qtx/fXX57JTzz33XC7jElT+BSQA8j9GIuxE4MILL4y77767kxJ9v+qVV17p+43aIgECBAgQIECAAAECBAgQIECAQEUCa9euzeqtWbMmPvjBD1bUhkoE8iogAZDXkRFXWQLXXXddLFmypKyyChEgQIAAAQIECBAgQIAAAQIECBDYUCCd+Z+WTTbZJMaNG7fh6lw8X7RoUcyYMSMXsQiitgQkAGprvES7gUBbW1v2yne/+90YMmTIBmv75+kDDzwQ3/zmN/tn47ZKgAABAgQIECBAgAABAgQIECBQkcCgQYPi05/+dEV1e7vStGnTJAB6G7lO25cAqNOBbZRuDRgwIOvqjjvuGK2trbno9pNPPpmLOARBgAABAgQIECBAgAABAgQIECBAgEBjC0gANPb46z0BAgQIECBAgAABAgRqRiBdAbx06dLcxrtixYrcxiYwAgQIECBAoDEFJAAac9z1mgABAgQIECBAgAABAjUncMQRR8R9991Xc3ELmAABAgQIECDQXwISAP0lb7sECBAgQIAAAQIECBAg0C2Bhx9+OCuf7v9VnA60Ww30cuF169bFypUre3krmidAgAABAgQIlC8gAVC+lZIECBAgQIAAgSjegP65556Lp59+Ojciq1atyg6GDR48ODcxpUCamppiu+22y37nKjDBECBQkwLFg/633357bu4B1h5y8eLFcdxxx7V/yWMCBAgQIECAQL8KSAD0K7+NEyBAgAABArUmsGDBgizkf/mXf6m10Pst3o997GNx7bXX9tv2bZgAAQIECBAgQIAAAQKNKiAB0M8jv3DhwkhniaTLRNNPc3NzDBs2LDubZfjw4dnzfg7R5gkQIECAAIF2AqtXr86ebbHFFpGXs+3TlBOLFi3K4tp6663bRdu/D5NV+pwzZ86c/g3E1gnkSMDn/xwNhlAIECBAgAABAg0gIAHQx4O8fPnyuOmmm2LKlCkxe/bsSM87WgYOHBhjxoyJAw88MI4//vgYN25cLue57Ch+rxMgQIAAgXoWuPTSS2PffffNRRfXrl0bBx98cPY5IU2LkZdlxowZ8YlPfCIv4YiDQL8I+PzfL+w2SoAAAQIECBAg8H8CTST6RiCdlTdx4sTYdttt4+yzz45p06Z1evA/RZW+zM+aNSsmTZqUJQDGjh0bd911V98EbCsECBAgQIAAAQIECFQs4PN/xXQqEiBAgAABAgQIVFHAFQBVxOyoqSVLlsTRRx8djzzySKlIunlVukR/hx12iBEjRkRLS0s2jUA66J9u4rds2bJIcwzPnz8/ilMNpCsGJkyYEFdccUWcc845pbY8IECAAAECBAgQIEAgPwI+/+dnLERCgAABAgQIEGh0AQmAXt4DVqxYEePHjy8d/N9///3jvPPOiyOPPDI78N/V5l999dVIl8+naYNuuOGGSM/PPffc2G233bIpgbqqbz0BAgQIECBAgAABAn0n4PN/31nbEgECBAgQIECAQNcCpgDq2qhHJW655ZZsup/UyCmnnBLTp0/Pfqez/stZBg0alM3pO3ny5Ehz+qbnabnooosi3fDPQoAAAQIECBAgQIBAfgR8/s/PWIiEAAECBAgQIEAgwhUAvbwXPPDAA9kW0vz96Sz+pqbKcy7pJsCXX355fPKTn8yuKJg3b17ssssuvdyDiKeeeiruueeeqiQcHnrooSzedCVDNZa2trasmTvuuCObQqkabfa0jccffzxrYunSpZG+AOZl+etf/5qF8sQTT+QqrjTlVVp+97vfxcKFC7PHefrnJz/5SaQbcudhSdOApeXFF1/M1Rg+//zzWVxp38/TPr9mzZosrqlTp2bTqWVPcvTPrbfempsbu6f7zaTlb3/7W67GMMWTlj//+c+5iqv4N+w3v/lNzJ07N4uxv/8p/j1Mv/P0//CZZ57pbxrbJ9DnAj7/r0/eCJ//2/f4lVdeyZ6mqV3z9H7cPsb0PTItL7/8cm5jLE6fm+6lkXfHp59+OrcxvvDCC9lYP/roo7mNMU1/nJYHH3wwm/Ege5Kzf4rTMqfvrMXv1TkLMV577bUspF/84hcxc+bMvIW3Xjx5On7TPjDv3+01Kn/s83/ldr1as/BF0dKLAnvuuWc6Qt32qU99qipbefbZZ7P2Ups///nPq9JmV40cf/zxpW2m7Vbj5/3vf39Xmy1rfeFKiqrEU40+aaM6+wZHjvYB+4B9oP72gWOPPbasv+sKEagHAZ//N/4e5vP/xl38zeNiH7AP2AfsA/W4D/j8n69Ptfk4rbWwp9frUjhgn3Vt++23r0oXhw8fnk0DlM4+LGYnq9JwJ41cfPHFMWrUqCjsup2UKm9Vyu6nM9A/+9nPllehi1KTJk2KX//6112U6tvVySll3EeOHBnbbbdd3268k62l/SWdgfWWt7wlWltbOynZt6vSWSnprJn99tsvNtlkk77deCdbmzNnTnYGyujRozsp1ber0r6VzozZZpttsp++3XrHW1u5cmU8/PDDMWbMmBg6dGjHBft4TTpjLN1IPW/71l/+8pfs/XSPPfboY5GON5emlEv7VnrPSjeoz8uS5tH+05/+lLt967nnnov09z3tWz25sq/azukqnAEDBsTuu+9e7aZ71F6K6QMf+ECP2lCZQC0J+Py//mg1wuf/9Xsckc62TlO3vvnNb95wVW6ep6v/0nfLHXbYITcxtQ8knc2cvlOl+NL3qjwu6WrTFGP6u/vGN74xjyFGXj9Ltcd66aWXIn2G2WeffXJzVX/7+NLjvH6vaB/nggULsqt5k2P67JXH5cknn8yOY731rW/NY3hZTN6/qzM0Pv9Xx7GarQxI+YhqNqit9QXSm2866Hr66afHjTfeuP7KCp796le/ym4gnKqmqXnSgXkLAQIECBAgQIAAAQL5EPD5Px/jIAoCBAgQIECAAIF/CFQ+IT3BsgTS2YFpufnmm+O+++4rq05HhVJm/Pzzz89Wb7HFFg7+dwTldQIECBAgQIAAAQL9JODzfz/B2ywBAgQIECBAgMBGBSQANspSvRfT9Dnp8s90o9MTTzwxJk+eHMUbU3ZnK+kqgmOOOSa7miDVO+uss7pTXVkCBAgQIECAAAECBPpAwOf/PkC2CQIECBAgQIAAgbIFTAFUNlXlBS+//PK48MILSw1svvnmcdhhh8Xee++dncWf5jRsaWmJ5ubmWLt2bZYsSHNlpjnc5s6dG1OnTo3Zs2eX6qdEwN13352reYdLwXlAgAABAgQIECBAoMEFfP5v8B1A9wkQIECAAAECORKQAOijwbjhhhti4sSJPb5xb+Eu2jFlypRIUwBZCBAgQIAAAQIECBDIp4DP//kcF1ERIECAAAECBBpNQAKgD0f8b3/7W3z961+P66+/Pp5//vmytzx48OBIB/4/9KEPxfHHH192PQUJECBAgAABAgQIEOg/AZ//+8/elgkQIECAAAECBP4hIAHQT3vC008/HdOnT485c+ZEmu5n6dKlsXz58ux+AUOHDo3W1tbYZZddYvTo0bHXXntFes1CgAABAgQIECBAgEBtCvj8X5vjJmoCBAgQIECAQK0LSADU+giKnwABAgQIECBAgAABAgQIECBAgAABAgQIbESgaSOveYkAAQIECBAgQIAAAQIECBAgQIAAAQIECBCocQEJgBofQOETIECAAAECBAgQIECAAAECBAgQIECAAIGNCUgAbEzFawQIECBAgAABAgQIECBAgAABAgQIECBAoMYFJABqfACFT4AAAQIECBAgQIAAAQIECBAgQIAAAQIENiYgAbAxFa8RIECAAAECBAgQIECAAAECBAgQIECAAIEaF5AAqPEBFD4BAgQIECBAgAABAgQIECBAgAABAgQIENiYgATAxlS8RoAAAQIECBAgQIAAAQIECBAgQIAAAQIEalxAAqDGB1D4BAgQIECAAAECBAgQIECAAAECBAgQIEBgYwISABtT8RoBAgQIECBAgAABAgQIECBAgAABAgQIEKhxAQmAGh9A4RMgQIAAAQIECBAgQIAAAQIECBAgQIAAgY0JSABsTMVrBAgQIECAAAECBAgQIECAAAECBAgQIECgxgUkAGp8AIVPgAABAgQIECBAgAABAgQIECBAgAABAgQ2JiABsDEVrxEgQIAAAQIECBAgQIAAAQIECBAgQIAAgRoXkACo8QEUPgECBAgQIECAAAECBAgQIECAAAECBAgQ2JiABMDGVLxGgAABAgQIECBAgAABAgQIECBAgAABAgRqXEACoMYHUPgECBAgQIAAAQIECBAgQIAAAQIECBAgQGBjAhIAG1PxGgECBAgQIECAAAECBAgQIECAAAECBAgQqHEBCYAaH0DhEyBAgAABAgQIECBAgAABAgQIECBAgACBjQlIAGxMxWsECBAgQIAAAQIECBAgQIAAAQIECBAgQKDGBQbWePzCJ5A7gb///e+x++67xyabbBLDhw/PXXz1HNCLL74YK1eujG233TaamuQ3+2qsV61aFc8//3y86U1vis0226yvNtvw22lra4u//vWvMXjw4BgxYkTDe/QlwJIlS2L58uXZe016r7f0jcCaNWviueeei//8z/+Mz372s32zUVshQIBABQI77bRTLFu2LEaOHFlBbVV6S8B3hd6S7Vm7L7/8cqTv0Ntss01suummPWtM7aoJpM9dCxcuzI5pbL755lVrV0M9E1i3bl32HfAd73hH/OIXv+hZY2o3lMCAwgGEtobqsc4S6GWB//3f/42jjjqql7eieQIECBAg0JgC+++/f8yYMaMxO6/XBAjkXiAdzHSwLPfDJEACBAjUtMCQIUMi/b2xEChXwBUA5UopR6BMgeJZ/3vssUfcdtttZdZSrBoCJ5xwQsydOzfuvPPOePOb31yNJrVRhsC3v/3tuOqqq+LDH/5wnHfeeWXUUKQaAumqiyOOOCI7u/A3v/lNNZrURpkC//qv/xp//OMf43vf+14ccMABZdZSrKcCt9xyS3bm/1577dXTptQnQIBArwkMGDAga7ulpSVmzpzZa9vRcPcFJkyYEHPmzIk77rgjdtttt+43oEavCKSr+tLf+M9//vNx8skn98o2NNp9gXQs45JLLol3vetd8eUvf7n7DajRKwLz5s2LcePGZVfM9MoGNFq3AhIAdTu0OtbfAs3NzZGSAJa+E0hToaRl5513Zt937NnUP2lzKflln+87+KFDh2YbGzRoEPe+Y8+2VJzqascdd2Tfh/Zbb711trXiwbU+3LRNESBAoNsCaTpKn4u6zdarFdL3s7SMGjXK2PSqdPcaf8Mb3pBV2GqrrYxL9+h6tXTxc1caH+9lvUrdrcaLn4NNedwtNoULAibJthsQIECAAAECBAgQIECAAAECBAgQIECAAIE6FJAAqMNB1SUCBAgQIECAAAECBAgQIECAAAECBAgQICABYB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQJ1KCABUIeDqksECBAgQIAAAQIECBAgQIAAAQIECBAgQEACwD5AgAABAgQIECBAgAABAgQIECBAgAABAgTqUEACoA4HVZcIECBAgAABAgQIECBAgAABAgQIECBAgIAEgH2AAAECBAgQIECAAAECBAgQIECAAAECBAjUoYAEQB0Oqi4RIECAAAECBAgQIECAAAECBAgQIECAAAEJAPsAAQIECBAgQIAAAQIECBAgQIAAAQIECBCoQwEJgDocVF0iQIAAAQIECBAgQIAAAQIECBAgQIAAAQISAPYBAgQIECBAgAABAgQIECBAgAABAgQIECBQhwISAHU4qLpEgAABAgQIECBAgAABAgQIECBAgAABAgQkAOwDBAgQIECAAAECBAgQIECAAAECBAgQIECgDgUkAOpwUHWJAAECBAgQIECAAAECBAgQIECAAAECBAhIANgHCBAgQIAAAQIECBAgQIAAAQIECBAgQIBAHQpIANThoOoSAQIECBAgQIAAAQIECBAgQIAAAQIECBCQALAPEKiyQGtra9Zi8XeVm9dcJwLJfMCAAbH55pt3UsqqagsU9/Vhw4ZVu2ntdSKw2WabxSabbBLcO0HqpVVF8+LvXtqMZjcQKHoX33M2WO0pAQIEciGw6aabRnNzc3ivysVwrBdEcUx8V1iPpd+fFMel+LvfAxJAJlAcj+LnLyz5EBg6dGh2zMO45GM8aimKAW2FpZYCFiuBWhC47777Yuedd47tt9++FsKtmxjnz58fzzzzTBxyyCF106da6MiaNWvi3nvvjaOOOipaWlpqIeS6iXH69Omx5ZZbxq677lo3faqFjjz33HPx6KOPxpFHHlkL4dZNjK+99lrcc8892Xt88Utp3XRORwgQqCuBmTNnZkmA0aNH11W/ar0z6btC+jn00ENrvSt1Ff/y5csjfX8+7rjjspNb6qpzNdyZdevWxd133x3/9E//5ISjnI3j7373u9huu+1ip512yllkwsmzgARAnkdHbAQIECBAgAABAgQIECBAgAABAgQIECBAoEIBUwBVCKcaAQIECBAgQIAAAQIECBAgQIAAAQIECBDIs4AEQJ5HR2wECBAgQIAAAQIECBAgQIAAAQIECBAgQKBCAaO/5ZsAADgNSURBVAmACuFUI0CAAAECBAgQIECAAAECBAgQIECAAAECeRaQAMjz6IiNAAECBAgQIECAAAECBAgQIECAAAECBAhUKCABUCGcagQIECBAgAABAgQIECBAgAABAgQIECBAIM8CEgB5Hh2xESBAgAABAgQIECBAgAABAgQIECBAgACBCgUkACqEU40AAQIECBAgQIAAAQIECBAgQIAAAQIECORZQAIgz6MjNgIECBAgQIAAAQIECBAgQIAAAQIECBAgUKGABECFcKoRIECAAAECBAgQIECAAAECBAgQIECAAIE8C0gA5Hl0xEaAAAECBAgQIECAAAECBAgQIECAAAECBCoUkACoEE41AgQIECBAgAABAgQIECBAgAABAgQIECCQZwEJgDyPjtgIECBAgAABAgQIECBAgAABAgQIECBAgECFAhIAFcKpRoAAAQIECBAgQIAAAQIECBAgQIAAAQIE8iwgAZDn0REbAQIECBAgQIAAAQIECBAgQIAAAQIECBCoUEACoEI41QgQIECAAAECBAgQIECAAAECBAgQIECAQJ4FJADyPDpiI0CAAAECBAgQIECAAAECBAgQIECAAAECFQpIAFQIpxoBAgQIECBAgAABAgQIECBAgAABAgQIEMizgARAnkdHbAQIECBAgAABAgQIECBAgAABAgQIECBAoEIBCYAK4VQjQIAAAQIECBAgQIAAAQIECBAgQIAAAQJ5FpAAyPPoiI0AAQIECBAgQIAAAQIECBAgQIAAAQIECFQoIAFQIZxqBAgQIECAAAECBAgQIECAAAECBAgQIEAgzwISAHkeHbERIECAAAECBAgQIECAAAECBAgQIECAAIEKBSQAKoRTjQABAgQIECBAgAABAgQIECBAgAABAgQI5FlAAiDPoyM2AgQIECBAgAABAgQIECBAgAABAgQIECBQoYAEQIVwqhEgQIAAAQIECBAgQIAAAQIECBAgQIAAgTwLDMxzcGIj0B8CDzzwQBxy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jFrKagNMfEdAMRRecXoi+2qqOEW5+vUzlXvcPvt8v9aychEgUBVI9f1exJnsv89VuzrHnSvUp+tcoj7biUSeaL047pqI/tB1Yx//d955Z/j1r38dnnzyyaEJOuaMdi4y0d8GvzEd4FN4UgPAFK58mz4xgS222KIMcOONN5bjw43EfqaLobpenFednkicIv5k/zzssMPypy/i44ennHLKqJtb7fd/3XXXLdPH9WMfoXEYzf32228PCxYsyNNW6yufMSD/xH4FP/axj4V77rknL3HsguO2227Lu6AZ6yZUt300s277/FRzj7bxJVzxgn+8QBr7fIwvro4vqC76RR/J/7///W/+xEm8mB/9q+8TGW69bvt7TJui/obLs9/mxf+r8UD3ox/9aNh9993LF1x3K+d9991XLtpoo43K8VT7aqo4ZcH6dCSVu32+TytYsQgQGCKQ6vt9qvw+DwGsaYZzhXpgnUvU4zrRqBOtF8ddE62BoeufcMIJYbPNNguf/vSnwwUXXDA0QcecbuciqX4bUsXpKLbJQRTI7hQ0ECBQEcgea4u3z7be/va3V+YOHb3rrrvydDHt7Nmzhyb4vznZneOt7O3redrsh2BIulRxhgQesBljdc/uXi/ds4t1reyiatctvf7668u066yzTiu7I6gtbay3WH/x769//WvbsurEfvvtV6a74oorqosGZjy7EFpuQ/YUSit7eqLnsqfaV6eSe3bXfivrEia3X2yxxVrnnXdez+5bb711WXdZN0Ijrp91q1KmzQ4429Kmqr+2oH06scMOO5QOo/2fnTVrVpn2rLPOatuiVPtqqjhthevDiVTu9vk+rFxFIjCFBMZ6TBpJUny/T6Xf54nsRmOtF+cKE1Huvq5zie42TS5JUS+Ou9LW4M0331yeW8Tz7pGG7P1wrewGsTx91sV0W9JUvw2p4rQVzsRACsSuAgwECFQExnpwGVfJXuCZf1nHL+3zzz+/EuWN0ZdeeqmV3YVa/gBkj4ENSRNnpIozbPABmTlW9/nz57eyPvhL0+xu6mG3MHvcrvW+972vTJf1cz8k3eWXX14ujz/Ozz777JA02ct4ygac7K75ERschqzcJzOuvfbacjuzbn9aWRdK4y5Zin11qrhH5G222aa0P+KII8blftxxx5Uxsn5qW88888ywcebOnVum23jjjYfdV1PU37CZ99nM008/vbRYc801W9mjuMOWsJou2nZ+B6TaV1PFGXYj+mhm1XMi7vb5PqpURSEwBQXGekwaaVJ9v0+V3+eJ7E5jrRfnChNRHn5d5xLDuzQ9N1W9OO5KW5NZ98Gtd77zneW5yEknnTRsBvGcLuuhoEw33HWNVL8NqeIMuyFmDoyABoCBqSoFXVQCYz24jOW55ZZbyhbbeHfvUUcd1cr6nm698sorrawLlFbW33r5hf6hD32o9frrrw+7GaniDBt8QGb24h4vyhct5dF9zpw5uXt8GiBe+L/wwgtb2cuWS/vsZatdFXbccccyXXyi4LrrrmvFE4cnnniiFX+si6c3Yj6j3UncNZMGF2TdcrTi0w/Fkw7ZexBaO++885j+4gXlziHVvjrZ3aNbvNu/cI/7T9wPx2qf9eVZ0seDyOqdOWuvvXYre39AK3tktxWXxbs6Pv/5z5d5Ze+oaGUvFy7Xr46kqr9qzH4cj98F1X0s6xKodfXVV7eyPv5zs+wdIq299967NIv18+c//3nYTanGmch3RKo4wxayT2amcrfP90mFKgaBKSrQyzFpJErx/T5Vfp8nskv1Ui/OFSYi3b6uc4l2j36ZSlkvjrvS12rWXW4r6+41P9eIT4N/+9vfbsWeIeLw1FNPtS666KJWvOO/OFeMT9EO17NBqt+GVHHSS4m4KAU0ACxKbXkNhEAvB5dxg+KXd/Yiz/LLO36JFxeNiy/0eMEue1HwiNufKs6ImfTxwl7djznmmPJHtXCOFz6L8eLzgAMOyC/4ddv02BVO1jd+23qd9RdjnXjiid1C9PX8eNGzsOj1c5999hl221Lsq5PdPcLFRr9ezYv02ct82+xjg1T2HoC2eLERbIkllmibt/rqq7fuuOOOtnU7J1LUX2fMfpyO37kf+MAH2nzihf5Os2WXXbb185//vOsmpNpXU8XpWtA+WZDK3T7fJxWqGASmoECvx6Spvt+nyu/zeHepXuvFucJ4pdvXcy7R7tEvU6nrxXFX+po99dRTh1wXGu56Rbz4P9IT+ql+G1LFSS8l4qIS0ACwqKTlMzACvR5cxg2L/XzH/v2LVt7iIl680PSNb3yjVb2bdySIVHFGyqNfl43HPXuhbWu77bZru8AX7WMre7zwN9b+1uOTGYceemhr5syZQ2JtsMEGrXgX0aAO8VHCYn/s9bNbA0C0SLGvTmb3aBQvLPdqXqTvbACI8eKdPvER3eWWW25I3BVXXLG122675U/AxLSjDSnqb7Q8+mF5vKMpNt4NZxYb+nbdddf8aZ/RyppqX00VZ7TyNr08lbt9vumalD+BqSkwnmPSVN/vU+X3eTx71njqxbnCeKTb13Eu0e7RL1N11IvjrvS1e//997eq78gqzvXiZ+wm6Je//OWYMk3125AqzpgKLVHfCUyLJcp2PgMBAgkEsj7/w9133x0ee+yxsNZaa4Ws65WQXXjqOXKqOD1nPKArvPDCC2HevHnh4YcfDmussUbIuukIb33rW8e1NY888kjIulTJ18+6ywnvete7QnbX8LhiTYWVUu2r3Me+t2SPh4bsEdJ8n8+6qwqbbLJJvt+PPcKbKVPV35sR+3MsmmXds4UHHnggRLP1118/xP/fWSNAzwVOta+mitPzBizCFVK52+cXYaXJigCBCQuk+H6fKr/PE8YeYwDnCmOEaiBZqn09xf+7Bja/L7N03JW+WrL3kYWsMSC/XpFd+M/PRVZaaaWeM0r1/yVVnJ43wAqNCmgAaJRf5gQIECBAgAABAgQIECBAgAABAgQIECBAoB4Bt7XW4yoqAQIECBAgQIAAAQIECBAgQIAAAQIECBBoVEADQKP8MidAgAABAgQIECBAgAABAgQIECBAgAABAvUIaACox1VUAgQIECBAgAABAgQIECBAgAABAgQIECDQqIAGgEb5ZU6AAAECBAgQIECAAAECBAgQIECAAAECBOoR0ABQj6uoBAgQIECAAAECBAgQIECAAAECBAgQIECgUQENAI3yy5wAAQIECBAgQIAAAQIECBAgQIAAAQIECNQjoAGgHldRCRAgQIAAAQIECBAgQIAAAQIECBAgQIBAowIaABrllzkBAgQIECBAgAABAgQIECBAgAABAgQIEKhHQANAPa6iEiBAgAABAgQIECBAgAABAgQIECBAgACBRgU0ADTKL3MCBAgQIECAAAECBAgQIECAAAECBAgQIFCPgAaAelxFJUCAAAECBAgQIECAAAECBAgQIECAAAECjQpoAGiUX+YECBAgQIAAAQIECBAgQIAAAQIECBAgQKAeAQ0A9biKSoAAAQIECBAgQIAAAQIECBAgQIAAAQIEGhXQANAov8wJECBAgAABAgQIECBAgAABAgQIECBAgEA9AhoA6nEVlQABAgQIECBAgAABAgQIECBAgAABAgQINCqgAaBRfpkTIECAAAECBAgQIECAAAECBAgQIECAAIF6BDQA1OMqKgECBAgQIECAAAECBAgQIECAAAECBAgQaFRAA0Cj/DInQIAAAQIECBAgQIAAAQIECBAgQIAAAQL1CGgAqMdVVAIECBAgQIAAAQIECBAgQIAAAQIECBAg0KiABoBG+WVOgAABAgQIECBAgAABAgQIECBAgAABAgTqEdAAUI+rqAQIECBAgAABAgQIECBAgAABAgQIECBAoFEBDQCN8sucAAECBAgQIECAAAECBAgQIECAAAECBAjUI6ABoB5XUQkQIECAAAECBAgQIECAAAECBAgQIECAQKMCGgAa5Zc5AQIECBAgQIAAAQIECBAgQIAAAQIECBCoR0ADQD2uohIgQIAAAQIECBAgQIAAAQIECBAgQIAAgUYFNAA0yi9zAgQIECBAgAABAgQIECBAgAABAgQIECBQj4AGgHpcRSVAgAABAgQIECBAgAABAgQIECBAgAABAo0KaABolF/mBAgQIECAAAECBAgQIECAAAECBAgQIECgHgENAPW4ikqAAAECBAgQIECAAAECBAgQIECAAAECBBoV0ADQKL/MCRAgQIAAAQIECBAgQIAAAQIECBAgQIBAPQIaAOpxFZUAAQIECBAgQIAAAQIECBAgQIAAAQIECDQqoAGgUX6ZEyBAgAABAgQIECBAgAABAgQIECBAgACBegQ0ANTjKioBAgQIECBAgAABAgQIECBAgAABAgQIEGhUQANAo/wyJ0CAAAECBAgQIECAAAECBAgQIECAAAEC9QhoAKjHVVQCBAgQIECAAAECBAgQIECAAAECBAgQINCogAaARvllToAAAQIECBAgQIAAAQIECBAgQIAAAQIE6hHQAFCPq6gECBAgQIAAAQIECBAgQIAAAQIECBAgQKBRAQ0AjfLLnAABAgQIECBAgAABAgQIECBAgAABAgQI1COgAaAeV1EJECBAgAABAgQIECBAgAABAgQIECBAgECjAhoAGuWXOQECBAgQIECAAAECBAgQIECAAAECBAgQqEdAA0A9rqISIECAAAECBAgQIECAAAECBAgQIECAAIFGBTQANMovcwIECBAgQIAAAQIECBAgQIAAAQIECBAgUI+ABoB6XEUlQIAAAQIECBAgQIAAAQIECBAgQIAAAQKNCmgAaJRf5gQIECBAgAABAgQIECBAgAABAgQIECBAoB4BDQD1uIpKgAABAgQIECBAgAABAgQIECBAgAABAgQaFdAA0Ci/zAkQIECAAAECBAgQIECAAAECBAgQIECAQD0CGgDqcRWVAAECBAgQIECAAAECBAgQIECAAAECBAg0KqABoFF+mRMgQIAAAQIECBAgQIAAAQIECBAgQIAAgXoENADU4yoqAQIECBAgQIAAAQIECBAgQIAAAQIECBBoVEADQKP8MidAgAABAgQIECBAgAABAgQIECBAgAABAvUIaACox1VUAgQIECBAgAABAgQIECBAgAABAgQIECDQqIAGgEb5ZU6AAAECBAgQIECAAAECBAgQIECAAAECBOoR0ABQj6uoBAgQGGiBHXbYIay88sphtdVWm9B2jBRn2223zfOI+VT/LrroognlmXLlX/3qV21lK8oZt8tAgAABAgQIECBAYLIIjHTc3ss2jhTH8X8vktISIEAgncD0dKFEIkCAAIHJIvD000+HJ598MkyfPrGfiZHiFMs6zV5++eXOWY1Nz58/P3foLMAqq6zSOcs0AQIECBAgQIAAgYEVKI7NHf87/h/YnVjBCRDoKjCxKztdw1pAgAABAgTGJrDYYouFuXPnlom32GKLcrzpkS233DKccsopZTG++tWvluNGCBAgQIAAAQIECBDoXcDxf+9m1iBAgMBEBDQATETPugQIECAwYYF4AjBnzpwJx6kjwHrrrRfiXzFoACgkfBIgQIAAAQIECBAYn4Dj//G5WYsAAQLjFfAOgPHKWY8AAQIECBAgQIAAAQIECBAgQIAAAQIECPSxgAaAPq4cRSNAgAABAgQIECBAgAABAgQIECBAgAABAuMV0AXQeOWsR4AAgQEWuO+++8LPfvazcMcdd4Qnnngi7+Zmm222CZ/73OfC+uuvP+YtSxWnM8Nnn302HHbYYWHhwoX5oj322CN8+MMf7kyWTz/00EPhJz/5ST6++OKLhyOPPDLMnDlz2LRmEiBAgAABAgQIEJiKAqmO21PF6awDx/+dIqYJECCQTkADQDpLkQgQIDAQAvHC+jHHHBNarVZZ3ptuuinEv/gy3gsvvLCcP9JIqjjD5TFjxozwtre9LRx//PH54j/+8Y/h3nvvDUsvvXRb8ldffTVvtIgNGXE45JBDXPxvEzJBgAABAgQIECAw1QVSHbenijNcfTj+H07FPAIECKQRmJZdAHrzClCamKIQIECAQJ8KHHTQQeVF9fjyrV122SVstdVW4YUXXgjXX3993ggQ76Jfcsklw4svvhimT58e4kX2ziFFnA022CC/qN8tj1deeSV88IMfDPfcc0+e/QEHHJA3UFTLcuihh+aNGXHelltuGW688ca8zNU0KcenTZuWh9too43CXXfdlTK0WAQIECBAgAABAgSSC6Q4bo+FShHH8X/y6hWQAAECYxLQADAmJokIECAw+AJ///vfw8Ybbxxef/31sOyyy+Z3+s+aNattw2JXOgcffHDZ9U5sDHjttdfa0qSKM9oJQMw0PmK82WabhZdffjnEi+/xAn/RFdANN9wQtt9++7ysyy+/fLj77rvDGmus0VbW1BMaAFKLikeAAAECBAgQIFCXQKrj9lRxHP/XVdPiEiBAYGQBLwEe2cdSAgQITBqBo48+Or/4Hzfoe9/7Xui8+B/nH3jggWHPPfeMo12HVHG6ZlBZEN9HcOyxx+Zz4gNr++67b1iwYEF4/vnn83IW7wg455xzar/4XymWUQIECBAgQIAAAQJ9L5DquD1VnLGAOf4fi5I0BAgQ6E3AEwC9eUlNgACBgRSId/GvuOKK4bnnnsv7yH/00UfzPvaH25h58+blLwWOF9c7nwBIFSfmO5Y7gGK6eOF/xx13DNdcc02cDD/4wQ9CfPHvBRdckE/vv//+4bTTTsvH6/7HEwB1C4tPgAABAgQIECCQQiDVcXuqOHGbHP+nqFkxCBAg0LuAJwB6N7MGAQIEBk4g9qMfL/7HYdNNN+168T8uX2eddcLaa68dR4cMqeIMCTzCjHjR/dxzzw0rrLBCnuqoo44qL/7Hk4gTTjhhhLUtIkCAAAECBAgQIDD1BFIdt6eK00sNOP7vRUtaAgQIjC6gAWB0IykIECAw8AL/+te/ym1YbbXVyvFuI93SpIrTLd9u81dZZZVw1lln5YvjXUhxWGqppcJFF12Uv7A4n+EfAgQIECBAgAABAgRygVTH7ani9Fotjv97FZOeAAEC3QU0AHS3sYQAAQKTRuDf//53uS2rrrpqOd5tZPXVVx92Uao4wwYfZebs2bPb+vl/73vfG+KfgQABAgQIECBAgACBdoFUx+2p4rSXbmxTjv/H5iQVAQIERhPQADCakOUECBCYBALLLLNMuRVFV0DljGFGirvsOxelitMZdyzTP/rRj0J8d0Ex3H333SHOMxAgQIAAAQIECBAg0C6Q6rg9VZz20o1tyvH/2JykIkCAwGgCGgBGE7KcAAECk0Bg5ZVXLrfiscceK8e7jVQvtFfTpIpTjTmW8dtvvz0ceeSRedL4OHBRjjgvLjMQIECAAAECBAgQIPCmQHG8HOc4/n/TxRgBAgSmooAGgKlY67aZAIEpJ7D++uuH6dOn59t9//33h1ar1dUgLnv44YeHXZ4qzrDBu8x88cUXwx577BGKpxLOPPPMcNppp+Wp47y4LKYxECBAgAABAgQIECDwhkCq4/ZUcXqpF8f/vWhJS4AAgdEFNACMbiQFAQIEBl5gxowZYbvttsu3I17c/+1vf9t1my655JJQfdlXNWGqONWYo41/85vfDA8++GCeLF7s/8QnPhF22WWX8JnPfCafF5fFNAYCBAgQIECAAAECBN4QSHXcnipOL/Xi+L8XLWkJECAwuoAGgNGNpCBAgMCkEJgzZ065HYcddlh46qmnyuli5JlnngmHH354MTnsZ6o4wwbvmHnZZZeFs88+O58bu/6ZO3dumeLkk08OK664Yj4d08S0ncPLL78c/vKXv5R/Cxcu7EximgABAgQIECBAgMCkFEh13J4qzliQHf+PRUkaAgQI9CagAaA3L6kJECAwsAKzZ88O8S8O8+bNC5tttln4/e9/H55//vnwwgsvhCuvvDJsuumm4R//+EeYNm1a1+1MFadrBv+34Mknnwz77rtvmeyMM84I8Q6kYogX/0855ZRiMk8b16kO8V0Gm2++efk3f/786mLjBAgQIECAAAECBCatQKrj9lRxRoN2/D+akOUECBAYn8C0rK/n7h1Bjy+mtQgQIECgTwXihf5PfvKT4brrritLuNhib7QFF3fHz5o1KyyzzDLh4osvzt8b8Oqrr5Zpi5EUcTbYYINw7733ds1j5513DldddVWeZez65/zzzy+yb/vcddddyy6Ndtppp7who0gQGzrWXXfdYjL873//C0svvXQ53etI0TCy0UYbhbvuuqvX1aUnQIAAAQIECBAgsEgFUhy3xwKniOP4f5FWvcwIECBQCngCoKQwQoAAgckvsOyyy+YX1Y8++uiw0kor5RscL/zHv3hhfO+99w6XXnppWGqppUbESBWnWybxJb/Fxf+VV145nHTSSd2S5i8EnjlzZr48rnP66ad3TWsBAQIECBAgQIAAgakkkOq4PVWcbvaO/7vJmE+AAIGJC3gCYOKGIhAgQGAgBRYsWBDuu+++8Mgjj4Q111wzbLjhhvnd+L1uzHjjjHYHUK/lGCn9brvtlj/18PTTT4/YvdFIMeIyTwCMJmQ5AQIECBAgQIBAvwqM97i9c3vGG8fxf6ekaQIECCwagemLJhu5ECBAgEC/CbzlLW8Jm2yySf43kbKlijORMoy27m233Ra22GKL8gL+aOktJ0CAAAECBAgQIDDZBFIdt6eKU6ev4/86dcUmQGDQBHQBNGg1prwECBAg0JNA7BLo8ccfD1tttVVP60lMgAABAgQIECBAgMDgCTj+H7w6U2ICBOoV0ABQr6/oBAgQINCgwEMPPRTmzJkT9tprr3DwwQc3WBJZEyBAgAABAgQIECBQt4Dj/7qFxSdAYBAFNAAMYq0pMwECBCaRwGuvvRaWXHLJ8u/8889PtnVrr7123vf/eeedF5ZYYome45577rlluWIZDQQIECBAgAABAgQITEzA8f/E/KxNgACBXgW8A6BXMekJECBAILlAfJFYMSxcuLAYTfK53XbbjTvO66+/HqplG3cgKxIgQIAAAQIECBAgUApUj7Ed/5csRggQIFCLwLRWNtQSWVACBAgQIDCCwBVXXBGef/75ISm23HLLsNZaaw2Z38SMhx9+ONx6661Dsp4xY0bYaaedhsw3gwABAgQIECBAgACB4QUc/w/vYi4BAgTqFtAAULew+AQIECBAgAABAgQIECBAgAABAgQIECBAoAEB7wBoAF2WBAgQIECAAAECBAgQIECAAAECBAgQIECgbgENAHULi0+AAAECBAgQIECAAAECBAgQIECAAAECBBoQ0ADQALosCRAgQIAAAQIECBAgQIAAAQIECBAgQIBA3QIaAOoWFp8AAQIECBAgQIAAAQIECBAgQIAAAQIECDQgoAGgAXRZEiBAgAABAgQIECBAgAABAgQIECBAgACBugU0ANQtLD4BAgQIECBAgAABAgQIECBAgAABAgQIEGhAQANAA+iyJECAAAECBAgQIECAAAECBAgQIECAAAECdQtoAKhbWHwCBAgQIECAAAECBAgQIECAAAECBAgQINCAgAaABtBlSYAAAQIECBAgQIAAAQIECBAgQIAAAQIE6hbQAFC3sPgECBAgQIAAAQIECBAgQIAAAQIECBAgQKABAQ0ADaDLkgABAgQIECBAgAABAgQIECBAgAABAgQI1C2gAaBuYfEJECBAgAABAgQIECBAgAABAgQIECBAgEADAhoAGkCXJQECBAgQIECAAAECBAgQIECAAAECBAgQqFtAA0DdwuITIECAAAECBAgQIECAAAECBAgQIECAAIEGBDQANIAuSwIECBAgQIAAAQIECBAgQIAAAQIECBAgULeABoC6hcUnQIAAAQIECBAgQIAAAQIECBAgQIAAAQINCGgAaABdlgQIECBAgAABAgQIECBAgAABAgQIECBAoG4BDQB1C4tPgAABAgQIECBAgAABAgQIECBAgAABAgQaENAA0AC6LAkQIECAAAECBAgQIECAAAECBAgQIECAQN0CGgDqFhafAAECBAgQIECAAAECBAgQIECAAAECBAg0IKABoAF0WRIgQIAAAQIECBAgQIAAAQIECBAgQIAAgboFNADULSw+AQIECBAgQIAAAQIECBAgQIAAAQIECBBoQEADQAPosiRAgAABAgQIECBAgAABAgQIECBAgAABAnULaACoW1h8AgQIECBAgAABAgQIECBAgAABAgQIECDQgIAGgAbQZUmAAAECBAgQIECAAAECBAgQIECAAAECBOoW0ABQt7D4BAgQIECAAAECBAgQIECAAAECBAgQIECgAQENAA2gy5IAAQIECBAgQIAAAQIECBAgQIAAAQIECNQtoAGgbmHxCRAgQIAAAQIECBAgQIAAAQIECBAgQIBAAwIaABpAlyUBAgQIECBAgAABAgQIECBAgAABAgQIEKhbQANA3cLiEyBAgAABAgQIECBAgAABAgQIECBAgACBBgQ0ADSALksCBAgQIECAAAECBAgQIECAAAECBAgQIFC3gAaAuoXFJ0CAAAECBAgQIECAAAECBAgQIECAAAECDQhoAGgAXZYECBAgQIAAAQIECBAgQIAAAQIECBAgQKBuAQ0AdQuLT4AAAQIECBAgQIAAAQIECBAgQIAAAQIEGhDQANAAuiwJECBAgAABAgQIECBAgAABAgQIECBAgEDdAhoA6hYWnwABAgQIECBAgAABAgQIECBAgAABAgQINCCgAaABdFkSIECAAAECBAgQIECAAAECBAgQIECAAIG6BTQA1C0sPgECBAgQIECAAAECBAgQIECAAAECBAgQaEBAA0AD6LIkQIAAAQIECBAgQIAAAQIECBAgQIAAAQJ1C2gAqFtYfAIECBAgQIAAAQIECBAgQIAAAQIECBAg0ICABoAG0GVJgAABAgQIECBAgAABAgQIECBAgAABAgTqFvj/uwdW02SD19UAAAAASUVORK5CYII=" width="768" /></p>
<pre><code>## nyc$GENDER: male
## $breaks
## [1] 80 100 120 140 160 180 200 220 240 260 280 300 320 340
##
## $counts
## [1] 2 19 28 89 96 90 73 41 23 8 3 1 1
##
## $density
## [1] 0.0002109705 0.0020042194 0.0029535865 0.0093881857 0.0101265823
## [6] 0.0094936709 0.0077004219 0.0043248945 0.0024261603 0.0008438819
## [11] 0.0003164557 0.0001054852 0.0001054852
##
## $mids
## [1] 90 110 130 150 170 190 210 230 250 270 290 310 330
##
## $xname
## [1] "dd[x, ]"
##
## $equidist
## [1] TRUE
##
## attr(,"class")
## [1] "histogram"
## ------------------------------------------------------------
## nyc$GENDER: female
## $breaks
## [1] 80 100 120 140 160 180 200 220 240 260 280 300 320
##
## $counts
## [1] 2 11 41 113 122 139 94 58 38 11 3 6
##
## $density
## [1] 0.0001567398 0.0008620690 0.0032131661 0.0088557994 0.0095611285
## [6] 0.0108934169 0.0073667712 0.0045454545 0.0029780564 0.0008620690
## [11] 0.0002351097 0.0004702194
##
## $mids
## [1] 90 110 130 150 170 190 210 230 250 270 290 310
##
## $xname
## [1] "dd[x, ]"
##
## $equidist
## [1] TRUE
##
## attr(,"class")
## [1] "histogram"</code></pre>
<div class="sourceCode" id="cb37"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb37-1"><a href="#cb37-1"></a>psych<span class="op">::</span><span class="kw">describe</span>(nyc<span class="op">$</span>CHOLESTEROLTOTAL)</span></code></pre></div>
<pre><code>## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 1112 185.79 37.68 183 184.18 38.55 95 335 240 0.45 0.28 1.13</code></pre>
<div class="sourceCode" id="cb39"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb39-1"><a href="#cb39-1"></a>femChol <-<span class="st"> </span>nyc <span class="op">%>%</span><span class="st"> </span><span class="kw">filter</span>(GENDER <span class="op">==</span><span class="st"> "female"</span>) </span>
<span id="cb39-2"><a href="#cb39-2"></a>maleChol <-<span class="st"> </span>nyc <span class="op">%>%</span><span class="st"> </span><span class="kw">filter</span>(GENDER <span class="op">==</span><span class="st"> "male"</span>)</span>
<span id="cb39-3"><a href="#cb39-3"></a>psych<span class="op">::</span><span class="kw">describe</span>(femChol<span class="op">$</span>CHOLESTEROLTOTAL)</span></code></pre></div>
<pre><code>## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 638 187.39 37.55 184 185.7 38.55 95 315 220 0.47 0.23 1.49</code></pre>
<div class="sourceCode" id="cb41"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb41-1"><a href="#cb41-1"></a>psych<span class="op">::</span><span class="kw">describe</span>(maleChol<span class="op">$</span>CHOLESTEROLTOTAL)</span></code></pre></div>
<pre><code>## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 474 183.64 37.79 181 182.21 37.06 98 335 237 0.43 0.32 1.74</code></pre>
<div class="sourceCode" id="cb43"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb43-1"><a href="#cb43-1"></a><span class="co">## close enough for the demo</span></span></code></pre></div>
</div>
<div id="t-tests" class="slide section level2">
<h1>T-Tests</h1>
<p>Now to actually do the T-Test: t.test compares the means. If we are comparing two objects, such as two columns, the notation is t.test(varA <strong>,</strong> VarB). If we are comparing some column by some variable (like cholesterol by sex) we would use the tilde:</p>
<div class="sourceCode" id="cb44"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb44-1"><a href="#cb44-1"></a><span class="kw">t.test</span>(nyc<span class="op">$</span>CHOLESTEROLTOTAL <span class="op">~</span><span class="st"> </span>nyc<span class="op">$</span>GENDER)</span></code></pre></div>
<pre><code>##
## Welch Two Sample t-test
##
## data: nyc$CHOLESTEROLTOTAL by nyc$GENDER
## t = -1.6414, df = 1015.7, p-value = 0.101
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -8.2355605 0.7334772
## sample estimates:
## mean in group male mean in group female
## 183.6392 187.3903</code></pre>
<p>In R, if you set var.equal = FALSE, R automatically checks the variances to see if they are equal and “decides” to run the student vs Welch test based on if they are equal or not, so you can leave as False.</p>
<div class="sourceCode" id="cb46"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb46-1"><a href="#cb46-1"></a><span class="kw">t.test</span>(femChol<span class="op">$</span>CHOLESTEROLTOTAL, maleChol<span class="op">$</span>CHOLESTEROLTOTAL, <span class="dt">paired =</span> <span class="ot">FALSE</span>, <span class="dt">alternative =</span> <span class="st">"two.sided"</span>, <span class="dt">conf.level =</span> <span class="fl">0.95</span>, <span class="dt">var.equal =</span> <span class="ot">FALSE</span>)</span></code></pre></div>
<pre><code>##
## Welch Two Sample t-test
##
## data: femChol$CHOLESTEROLTOTAL and maleChol$CHOLESTEROLTOTAL
## t = 1.6414, df = 1015.7, p-value = 0.101
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -0.7334772 8.2355605
## sample estimates:
## mean of x mean of y
## 187.3903 183.6392</code></pre>
<p>Things to note, paired is set to false. Paired would mean they were the same people/subjects. So for example if we weighed people at the start of a test, then put them on a diet and weighed at the end, that would be paired. Here the male and female groups are totally separate people.</p>
<p>The tails “alternative” is two.sided. It could be lesser or greater if we were doing a single tailed test, but this is less common.</p>
<p>We also set variance as equal because the variances were close. A more conservative approach would be to set as false.</p>
</div>
<div id="on-your-own-1" class="slide section level2">
<h1>On Your Own</h1>
<p>Try comparing mean LDL by if a person has diabetes or not. To do this you will need to:</p>
<ol style="list-style-type: decimal">
<li>Collapse Diabetes into two groups</li>
<li>Check that LDL Estimate appears normally distributed</li>
<li>Run a T Test.</li>
</ol>
</div>
<div id="non-parametric-tests-for-comparing-medians" class="slide section level2">
<h1>Non-Parametric Tests for Comparing Medians</h1>
<h3 id="mann-whitney-unpaired-and-wilcoxon-paired">Mann-Whitney (unpaired) and Wilcoxon (paired)</h3>
<p>If we have a small sample under 30 (which in this case we have a large sample) and non-normally distributed data we may need to choose a non-parametric test.</p>
<p><strong>Confusing note:</strong> Both of these are called wilcox.test() in R, and we then set an argument to be paired = TRUE or FALSE.</p>
<p>Remember paired means they are the same subjects before and after, unpaired means they are separate.</p>
<p>Also non-parametric means not normally distributed. Outliers will throw off t-tests and parametric tests.</p>
<div class="sourceCode" id="cb48"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb48-1"><a href="#cb48-1"></a><span class="co">## Because paired = False, technically this is a Mann-Whitney test</span></span>
<span id="cb48-2"><a href="#cb48-2"></a><span class="kw">wilcox.test</span>( nyc<span class="op">$</span>COTININE <span class="op">~</span><span class="st"> </span>nyc<span class="op">$</span>GENDER, <span class="dt">paired =</span> <span class="ot">FALSE</span>)</span></code></pre></div>
<pre><code>##
## Wilcoxon rank sum test with continuity correction
##
## data: nyc$COTININE by nyc$GENDER
## W = 160394, p-value = 0.06218
## alternative hypothesis: true location shift is not equal to 0</code></pre>
<p>If these were before and after data, we could perform the Wilcoxon test by setting paired = TRUE.</p>
</div>
<div id="on-your-own-2" class="slide section level2">
<h1>On Your Own</h1>
<p>Try comparing the means of A1C in diabetics to non-diabetics. What command will you use, and which arguments will it take?</p>
</div>
<div id="correlations" class="slide section level2">
<h1>Correlations</h1>
<h3 id="pearson-r-parametric-spearman-rho-non-parametric-kendalls-tau-non-parametric">Pearson’ R (parametric), Spearman Rho (non-parametric), Kendall’s Tau (non-parametric)</h3>
<p>There are several options: cor(), cor.test() and rcorr(). Cor does not provide a confidence interval or P Value, but can do multiple correlations. Rcorr() requires a matrix and does not calculte Kendall’s Tau.</p>
<p>Note here we are doing cor.test(), but when we made heatmaps we did just cor(). The difference is cor.test provides the 95% confidence intervals and a p value, as well as the pearson’s R or spearman’s Rho, where cor just provides R/Rho.</p>
<div class="sourceCode" id="cb50"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb50-1"><a href="#cb50-1"></a><span class="kw">cor.test</span>(nyc<span class="op">$</span>CHOLESTEROLTOTAL, nyc<span class="op">$</span>SPAGE, <span class="dt">method =</span> <span class="st">"pearson"</span>)</span></code></pre></div>
<pre><code>##
## Pearson's product-moment correlation
##
## data: nyc$CHOLESTEROLTOTAL and nyc$SPAGE
## t = 6.6702, df = 1110, p-value = 4.021e-11
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.1391289 0.2521869
## sample estimates:
## cor
## 0.1963103</code></pre>
<p>We can then square the R result. This gives us an estimate of how much the variability in the outcome is shared by the other correlating variable. This is often expressed as how much variation is accounted for by the other variable.</p>
</div>
<div id="non-parametric-spearmans-rho" class="slide section level2">
<h1>Non-Parametric: Spearman’s Rho</h1>
<div class="sourceCode" id="cb52"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb52-1"><a href="#cb52-1"></a><span class="kw">cor.test</span>(nyc<span class="op">$</span>GLUCOSE, nyc<span class="op">$</span>A1C, <span class="dt">method =</span> <span class="st">"spearman"</span>)</span></code></pre></div>
<pre><code>## Warning in cor.test.default(nyc$GLUCOSE, nyc$A1C, method = "spearman"): Cannot
## compute exact p-value with ties</code></pre>
<pre><code>##
## Spearman's rank correlation rho
##
## data: nyc$GLUCOSE and nyc$A1C
## S = 126116500, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.4496878</code></pre>
</div>
<div id="non-parametric-kendalls-tau" class="slide section level2">
<h1>Non-Parametric: Kendall’s Tau</h1>
<p>Kendall’s Tau is more appropriate for smaller data</p>
</div>
<div id="on-your-own-3" class="slide section level2">
<h1>On Your Own</h1>
<p>Run a correlation of lead to to total mercury. Which test will you choose and why? What results do you get?</p>
</div>
<div id="analysis-of-variance-anova" class="slide section level2">
<h1>Analysis of Variance ANOVA</h1>
<p>A test that assumes normal distribution for assessing difference in means when you have multiple groups. There are multiple ways to do this, and one is to run aov() which does a linear regression on the back end. The result of this then should be summarized or run through ANOVA.</p>
<div class="sourceCode" id="cb55"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb55-1"><a href="#cb55-1"></a>CholDiabAnova <-<span class="st"> </span><span class="kw">aov</span>(nyc<span class="op">$</span>CHOLESTEROLTOTAL <span class="op">~</span><span class="st"> </span>nyc<span class="op">$</span>DX_DBTS)</span>
<span id="cb55-2"><a href="#cb55-2"></a><span class="kw">summary</span>(CholDiabAnova)</span></code></pre></div>
<pre><code>## Df Sum Sq Mean Sq F value Pr(>F)
## nyc$DX_DBTS 2 2479 1240 0.873 0.418
## Residuals 1109 1575020 1420</code></pre>
<div class="sourceCode" id="cb57"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb57-1"><a href="#cb57-1"></a><span class="kw">anova</span>(CholDiabAnova)</span></code></pre></div>
<pre><code>## Analysis of Variance Table
##
## Response: nyc$CHOLESTEROLTOTAL
## Df Sum Sq Mean Sq F value Pr(>F)
## nyc$DX_DBTS 2 2479 1239.7 0.8729 0.418
## Residuals 1109 1575020 1420.2</code></pre>
<p>We often may want to adjust the p value if we have multiple p values. We can use p.adjust and set the method, for example “bonferroni” and “fdr”</p>
<div class="sourceCode" id="cb59"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb59-1"><a href="#cb59-1"></a><span class="kw">p.adjust</span>(.<span class="dv">418</span>, <span class="dt">method=</span><span class="st">"bonferroni"</span>, <span class="dv">3</span>)</span></code></pre></div>
<pre><code>## [1] 1</code></pre>
<div class="sourceCode" id="cb61"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb61-1"><a href="#cb61-1"></a><span class="kw">p.adjust</span>(.<span class="dv">418</span>, <span class="dt">method =</span> <span class="st">"fdr"</span>, <span class="dv">3</span>)</span></code></pre></div>
<pre><code>## [1] 1</code></pre>
</div>
<div id="power-assessment" class="slide section level2">
<h1>Power Assessment</h1>
<p>Assessing power will help readers of your research to know the likelihood of type II error (saying there is not a difference when in fact one exists). Underpowered studies are a major problem in pre-clinical research that limit the replicability of findings. It is best to be transparent about providing a power calculation so that readers will know if results need to be confirmed with larger studies.</p>
<p>Check out the information provided by Stat Methods on using the pwr package for power tests for different common hypothesis tests: <a href="https://www.statmethods.net/stats/power.html" class="uri">https://www.statmethods.net/stats/power.html</a></p>
<div class="sourceCode" id="cb63"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb63-1"><a href="#cb63-1"></a><span class="kw">install.packages</span>(<span class="st">"pwr"</span>, <span class="dt">repos =</span> <span class="st">"http://cran.us.r-project.org"</span>)</span></code></pre></div>
<pre><code>##
## The downloaded binary packages are in
## /var/folders/wh/kxxcb38x3970_qdg14gscpd1k2bqnj/T//RtmpyExycI/downloaded_packages</code></pre>
<div class="sourceCode" id="cb65"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb65-1"><a href="#cb65-1"></a><span class="kw">library</span>(pwr) </span>
<span id="cb65-2"><a href="#cb65-2"></a><span class="kw">pwr.t.test</span>(<span class="dt">n=</span><span class="dv">450</span> , <span class="dt">d =</span><span class="fl">0.1194496</span> , <span class="dt">sig.level =</span><span class="fl">0.05</span>, <span class="dt">type =</span> <span class="st">"two.sample"</span>, <span class="dt">alternative=</span>(<span class="st">"two.sided"</span>))</span></code></pre></div>
<pre><code>##
## Two-sample t test power calculation
##
## n = 450
## d = 0.1194496
## sig.level = 0.05
## power = 0.43254
## alternative = two.sided
##
## NOTE: n is number in *each* group</code></pre>
<div class="sourceCode" id="cb67"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb67-1"><a href="#cb67-1"></a><span class="kw">pwr.t.test</span>( <span class="dt">d =</span> <span class="fl">0.1194496</span> , <span class="dt">sig.level =</span> <span class="fl">0.05</span>, <span class="dt">power =</span> <span class="fl">0.8</span>, <span class="dt">type =</span> <span class="st">"two.sample"</span>, <span class="dt">alternative=</span>(<span class="st">"two.sided"</span>))</span></code></pre></div>
<pre><code>##
## Two-sample t test power calculation
##
## n = 1101.15
## d = 0.1194496
## sig.level = 0.05
## power = 0.8
## alternative = two.sided
##
## NOTE: n is number in *each* group</code></pre>
</div>
<!-- dynamically load mathjax for compatibility with self-contained -->
<script>
(function () {
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML";
document.getElementsByTagName("head")[0].appendChild(script);
})();
</script>
</body>
</html>